]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - frame.1.pl
oldlogs is an external tool now.
[ott/bsta] / frame.1.pl
index c6f87ae9cc9db4dc955cd86680b738104802d33d..a0a81fd8acb11d352a285d193cd23a4cb312bec4 100644 (file)
@@ -5,7 +5,7 @@
 #
 # The frame interface
 #
-# Copyright (C) 2016, 2023  Balthasar Szczepański
+# Copyright (C) 2016, 2023, 2024  Balthasar Szczepański
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Affero General Public License as
@@ -27,30 +27,28 @@ use Encode ('encode', 'decode');
 
 ###PERL_LIB: use lib /botm/lib/bsta
 use botm_common (
+       'HTTP_STATUS',
        'read_header_env',
        'url_query_decode',
-       'read_data_file',
        'join_path',
-       'merge_url'
+       'merge_url',
+       'open_encoded', 'stat_encoded',
+       'http_header_line', 'http_header_content_length', 'http_header_content_disposition'
 );
 use bsta_lib (
        'STATE', 'INTF_STATE',
        'fail_method', 'fail_content_type', 'fail_open_file', 'fail_500', 'redirect',
        'get_frame', 'get_password',
-       'merge_settings'
+       'merge_settings',
+       'get_frame_file',
+       'read_frame_data', 'read_default', 'read_noaccess',
+       'read_settings', 'read_state', 'read_story'
 );
 
 ###PERL_PATH_SEPARATOR:     PATH_SEPARATOR     = /
 
 ###PERL_CGI_PATH:           CGI_PATH           = /bsta/
-
 ###PERL_DATA_PATH:          DATA_PATH          = /botm/data/bsta
-###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
-###PERL_DATA_NOACCESS_PATH: DATA_NOACCESS_PATH = /botm/data/bsta/noaccess
-###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
-###PERL_DATA_STATE_PATH:    DATA_STATE_PATH    = /botm/data/bsta/state
-###PERL_DATA_STORY_PATH:    DATA_STORY_PATH    = /botm/data/bsta/story
-
 ###PERL_WWW_PATH:           WWW_PATH           = /botm/www/1190/bsta/
 
 binmode STDIN,  ':encoding(UTF-8)';
@@ -74,9 +72,8 @@ my $password;
 my $password_ok;
 my $IP;
 my $access;
-my $frame_indirect;
+my $try_onged;
 my $frame_path;
-my $frame_data_path;
 my $frame_file;
 my $fh;
 my $buffer;
@@ -91,7 +88,7 @@ if ($ENV{'REQUEST_METHOD'} =~ /^(HEAD|GET|POST)$/) {
        $method = $1;
 }
 else{
-       exit fail_method($ENV{'REQUEST_METHOD'}, 'GET, POST, HEAD');
+       exit fail_method($ENV{'REQUEST_METHOD'}, ['GET', 'POST', 'HEAD']);
 }
 
 %http = read_header_env(\%ENV);
@@ -111,9 +108,9 @@ if ($method eq 'POST') {
 $frame    = get_frame(\%cgi);
 $password = get_password(\%cgi);
 
-%settings  = read_data_file(DATA_SETTINGS_PATH());
-%default   = read_data_file(DATA_DEFAULT_PATH());
-%state     = read_data_file(DATA_STATE_PATH());
+%settings  = read_settings();
+%default   = read_default();
+%state     = read_state();
 
 $ong_state  = int($state{'state'});
 $last_frame = int($state{'last'});
@@ -138,7 +135,7 @@ elsif (
        ($ong_state == STATE->{'inactive'}) &&
        ($frame == 0)
 ) {
-       my %story = read_data_file(DATA_STORY_PATH());
+       my %story = read_story();
        if (
                (int($story{'pass'}) == 1) &&
                (int($story{'state'}) == INTF_STATE->{'>|'})
@@ -147,7 +144,7 @@ elsif (
        }
 }
 
-$frame_indirect = !(
+$try_onged = (
        (!$access) || (
                ($frame <= $last_frame) &&
                ($ong_state > STATE->{'inactive'})
@@ -155,39 +152,28 @@ $frame_indirect = !(
 );
 
 if ($access) {
-       $frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
-       %frame_data = read_data_file($frame_data_path);
-       %frame_data = merge_settings(\%default, \%frame_data);
+       %frame_data = read_frame_data($frame, \%default);
 }
 else {
-       %frame_data = read_data_file(DATA_NOACCESS_PATH());
-       %frame_data = merge_settings(\%default, \%frame_data);
-}
-if ($frame_data{'frame'} ne '') {
-       $frame_file = $frame_data{'frame'};
-}
-else {
-       $frame_file = sprintf(
-               $settings{'frame'},
-               $frame, $frame_data{'ext'}
-       );
+       %frame_data = read_noaccess(\%default);
 }
+$frame_file = get_frame_file($frame, \%frame_data, \%settings);
 
-unless ($frame_indirect) {
+if ($try_onged) {
        $frame_path = join_path(PATH_SEPARATOR(), WWW_PATH(), $frame_file);
-       $r = open($fh, '<' , encode('locale_fs', $frame_path));
+       $r = open_encoded($fh, '<' , $frame_path);
        if ($r) {
                close($r);
                $frame_path = merge_url(
                        {'path' => CGI_PATH()},
                        {'path' => $frame_file}
                );
-               exit redirect ($method, $frame_path, 303);
+               exit redirect ($method, $frame_path, HTTP_STATUS->{'see_other'});
        }
 }
 unless ($r) {
        $frame_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame_file);
-       $r = open($fh, '<' , encode('locale_fs', $frame_path));
+       $r = open_encoded($fh, '<' , $frame_path);
        unless ($r) {
                exit fail_open_file($method, 'image file', $frame_file);
        }
@@ -197,10 +183,15 @@ unless (binmode($fh)) {
        exit fail_500("Can't switch file to binary mode.");
 }
 
-if (my @file_info = stat($frame_path)){
-       print 'Content-length: '.$file_info[7]."\n";
+if (my @file_info = stat_encoded($frame_path)){
+       print http_header_content_length($file_info[7]);
+}
+if ($frame_data{'content-type'} ne '') {
+       print http_header_line('content-type', $frame_data{'content-type'});
+}
+if ($frame_file ne '') {
+       print http_header_content_disposition('inline', $frame_file);
 }
-print 'Content-type: '.$frame_data{'content-type'}."\n";
 unless (binmode STDOUT) {
        close($fh);
        exit fail_500("Can't switch output to binary mode.");