]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - info.1.pl
fix ONG; fix update; total reset
[ott/bsta] / info.1.pl
index c1eeda5e3b22942c754538a778f05523fdd606fa..d5c0ec8b85e26e84055c736e595f69a758303f4d 100644 (file)
--- a/info.1.pl
+++ b/info.1.pl
@@ -27,6 +27,8 @@ use Encode ('encode', 'decode');
 
 ###PERL_LIB: use lib /botm/lib/bsta
 use botm_common (
+       'HTTP_STATUS',
+       'http_header_status',
        'read_header_env',
        'read_data_file', 'write_data_file',
        'url_query_decode',
@@ -47,6 +49,7 @@ use bsta_lib (
 ###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_WORDS_PATH:    DATA_WORDS_PATH    = /botm/data/bsta/words/
 
 binmode STDIN,  ':encoding(UTF-8)';
 binmode STDOUT, ':encoding(UTF-8)';
@@ -58,7 +61,7 @@ srand ($time-$$);
 
 my %http;
 my %cgi;
-my %frame_data;
+my %info_data;
 my %next_frame_data;
 my %default;
 my %settings;
@@ -67,13 +70,14 @@ my %state;
 my $method;
 my $frame = '';
 my $attachment = '';
+my $words = '';
 my $password;
 my $password_ok;
 my $access;
 my $show_command;
 my $ongtime;
 my $timer;
-my $frame_data_path;
+my $info_data_path;
 my $next_frame_data_path;
 my $ong_state;
 my $last_frame;
@@ -85,7 +89,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);
@@ -105,13 +109,22 @@ if ($method eq 'POST') {
 if ($cgi{'f'} =~ /^.+$/) {
        $frame = int($&);
 }
+elsif ($cgi{'a'} =~ /^.+$/) {
+       $attachment = int($&);
+}
 elsif ($cgi{'i'} =~ /^.+$/) {
        $attachment = int($&);
 }
+elsif ($cgi{'w'} =~ /^.+$/) {
+       $words = $&;
+}
 elsif ($ENV{'PATH_INFO'} =~ /^\/a(.+)$/) {
        $attachment = int($1);
 }
-elsif ($ENV{'PATH_INFO'} =~ /^\/(.+)$/) {
+elsif ($ENV{'PATH_INFO'} =~ /^\/w(.+)$/) {
+       $words = $1;
+}
+elsif ($ENV{'PATH_INFO'} =~ /^\/f?(.+)$/) {
        $frame = int($1);
 }
 
@@ -126,21 +139,39 @@ $last_frame = int($state{'last'});
 
 $password_ok = ($password eq $settings{'password'});
 
+# comment info, not frame
+if ($words ne '') {
+       $info_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $words);
+       %info_data      = read_data_file($info_data_path);
+       if ($words =~ /^[0-9]+$/) {
+               $frame = int($&);
+               if ($info_data{'posts'} eq '') {
+                       $info_data{'posts'} = 0;
+               }
+       }
+       else {
+               $frame = ($info_data{'frame'} ne '') ? int($info_data{'frame'}) : -1;
+               unless ($password_ok) {
+                       delete($info_data{'password'});
+                       delete($info_data{'key'});
+               }
+       }
+}
 # attachment info, not frame
-if ($attachment ne '') {
-       %frame_data = read_data_file(DATA_ATTACH_PATH().$attachment);
-       $frame = ($frame_data{'frame'} ne '') ? int($frame_data{'frame'}) : -1;
+elsif ($attachment ne '') {
+       %info_data = read_data_file(DATA_ATTACH_PATH().$attachment);
+       $frame = ($info_data{'frame'} ne '') ? int($info_data{'frame'}) : -1;
 }
 # frame info
 elsif ($frame ne '') {
        if ($frame < 0) {
                $frame = $last_frame + $frame +1;
        }
-       $frame_data_path      = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
+       $info_data_path       = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
        $next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
-       %frame_data      = read_data_file($frame_data_path);
+       %info_data       = read_data_file($info_data_path);
        %next_frame_data = read_data_file($next_frame_data_path);
-       %frame_data      = merge_settings(\%default,      \%frame_data);
+       %info_data       = merge_settings(\%default,      \%info_data);
        %next_frame_data = merge_settings(\%default, \%next_frame_data);
        
        $timer   = int($state{'nextong'}) - $time;
@@ -164,11 +195,16 @@ else {
                        $state{'ip3'} = 1;
                }
        }
-       print "Content-type: text/plain\n\n";
+       print "Content-type: text/plain; charset=UTF-8\n\n";
        if ($method eq 'HEAD') {
                exit;
        }
-       write_data_file(\*STDOUT, '', '', \%state);
+       write_data_file(
+               \*STDOUT, \%state, '',
+               0, 0, 0,
+               '>>', 1
+       );
+       
        exit;
 }
 
@@ -182,8 +218,9 @@ if (
        $access = 1;
        
        if (
+               ($words eq '') &&
                ($attachment eq '') &&
-               ($frame_data{'command'} eq '') && (
+               ($info_data{'command'} eq '') && (
                        $password_ok ||
                        ($frame < $last_frame) || (
                                ($ong_state >= STATE->{'ready'}) &&
@@ -191,32 +228,49 @@ if (
                        )
                )
        ) {
-               $frame_data{'command'} = $next_frame_data{'title'};
+               $info_data{'command'} = $next_frame_data{'title'};
        }
 }
 else {
        $access = 0;
-       if ($attachment ne '') {
-               %frame_data = ();
+       if (($attachment ne '') || ($words ne '')) {
+               %info_data = ();
        }
        else {
-               %frame_data = read_data_file(DATA_NOACCESS_PATH());
-               %frame_data = merge_settings(\%default, \%frame_data);
+               %info_data = read_data_file(DATA_NOACCESS_PATH());
+               %info_data = merge_settings(\%default, \%info_data);
        }
 }
 if (
-       ($frame_data{'frame'} eq '') &&
-       ($attachment eq '')
+       ($attachment eq '') &&
+       ($words eq '')
 ) {
-       $frame_data{'frame'} = sprintf($settings{'frame'}, $frame, $frame_data{'ext'});
+       if ($info_data{'frame'} eq '') {
+               $info_data{'frame'} = sprintf($settings{'frame'}, $frame, $info_data{'ext'});
+       }
+       if ($info_data{'page'} eq '') {
+               unless (($access) && ($frame < $last_frame)) {
+                       $info_data{'page'} = '';
+               }
+               elsif ($frame == 0) {
+                       $info_data{'page'} = 'index.htm';
+               }
+               else {
+                       $info_data{'page'} = sprintf($settings{'frame'}, $frame, 'htm');
+               }
+       }
 }
 
-print "Content-type: text/plain\n";
+print "Content-type: text/plain; charset=UTF-8\n";
 if (!$access) {
-       print "Status: 403 Forbidden\n";
+       print http_header_status(HTTP_STATUS->{'forbidden'});
 }
 print "\n";
 if($method eq 'HEAD') {
        exit;
 }
-write_data_file(\*STDOUT, '', '', \%frame_data);
+write_data_file(
+       \*STDOUT, \%info_data, '',
+       0, 0, 0,
+       '>>', 1
+);