]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - viewer.1.pl
input validation; goto form; show version; 2 words password
[ott/bsta] / viewer.1.pl
index 280a0f9423057468cb4d6f455284bc4661103bcb..c7d74d9d4edb1401940671026c30cab5fe9a085f 100644 (file)
@@ -29,7 +29,6 @@ use Encode ('encode', 'decode');
 use botm_common (
        'HTTP_STATUS',
        'read_header_env',
-       'read_data_file', 'write_data_file',
        'url_query_decode',
        'join_path',
        'open_encoded', '_x_encoded',
@@ -41,8 +40,13 @@ use bsta_lib (
        'fail_method', 'fail_content_type', 'redirect',
        'get_remote_addr', 'get_frame', 'get_password',
        'merge_settings',
-       'print_viewer_page', 'write_index', 'write_static_goto',
-       'ong'
+       'print_viewer_page',
+       'write_index', 'write_static_goto', 'write_static_viewer_page',
+       'ong',
+       'read_frame_data', 'read_default', 'read_noaccess',
+       'read_words_list', 'read_settings', 'read_story', 'read_goto',
+       'read_state', 'write_state',
+       'get_page_file'
 );
 
 ###PERL_PATH_SEPARATOR:     PATH_SEPARATOR     = /
@@ -50,14 +54,7 @@ use bsta_lib (
 ###PERL_CGI_PATH:           CGI_PATH           = /bsta/
 ###PERL_CGI_VIEWER_PATH:    CGI_VIEWER_PATH    = /bsta/v
 
-###PERL_DATA_PATH:          DATA_PATH          = /botm/data/bsta/
-###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
-###PERL_DATA_LIST_PATH:     DATA_LIST_PATH     = /botm/data/bsta/list
-###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_DATA_WORDS_PATH:    DATA_WORDS_PATH    = /botm/data/bsta/words/
 
 ###PERL_WWW_PATH:           WWW_PATH           = /botm/www/
 
@@ -83,7 +80,6 @@ my %words_data;
 
 my $method;
 my $frame;
-my $frame_data_path;
 my $prev_frame_data_path;
 my $next_frame_data_path;
 my $password;
@@ -95,6 +91,7 @@ my $timer_unlocked;
 my $fh;
 my $show_command;
 my $ongtime;
+my $goto;
 my $text_mode;
 my $words_page;
 my $words_data_path;
@@ -130,12 +127,11 @@ $IP = get_remote_addr();
 $frame = get_frame(\%cgi);
 $password = get_password(\%cgi);
 
-%settings  = read_data_file(DATA_SETTINGS_PATH());
-%default   = read_data_file(DATA_DEFAULT_PATH());
+%settings  = read_settings();
+%default   = read_default();
 
 if ($frame >= 0) {
-       $frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
-       %frame_data= read_data_file($frame_data_path);
+       %frame_data= read_frame_data($frame);
 }
 
 $password_ok = ($password eq $settings{'password'});
@@ -144,14 +140,13 @@ $password_ok = ($password eq $settings{'password'});
 if (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
        if (flock($fh, 2)) {
                
-               %state = read_data_file($fh);
+               %state = read_state($fh);
                
                if ($frame < 0) {
                        $frame = int($state{'last'}) + $frame +1;
                        if ($frame >= 0) {
                                $force_redirect = 1;
-                               $frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
-                               %frame_data = read_data_file($frame_data_path);
+                               %frame_data = read_frame_data($frame);
                        }
                }
                
@@ -178,18 +173,30 @@ if (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                                elsif ($state{'ip3'} eq '') {
                                        $new_state{'ip3'} = $IP;
                                        $new_state{'state'} = STATE->{'ready'};
-                                       write_static_goto(\%new_state, \%settings, '');
                                }
                                else {
                                        $new_state{'state'} = STATE->{'ready'};
+                               }
+                               if ($new_state{'state'} == STATE->{'ready'}) {
                                        write_static_goto(\%new_state, \%settings, '');
+                                       write_static_viewer_page(
+                                               $frame-1,
+                                               \%new_state,
+                                               \%settings,
+                                               \%default,
+                                               '', # frame data
+                                               '', # prev frame data
+                                               \%frame_data, # next frame data,
+                                               '' # words data
+                                       );
                                }
-                               write_data_file($fh, \%new_state);
+                               write_state($fh, \%new_state);
                        }
                }
                elsif (
                        (int($state{'state'}) == STATE->{'inactive'}) &&
-                       ($frame == 1)
+                       ($frame == 1) &&
+                       (!$password_ok)
                ) {
                        # ready to activate?
                        # NOTE: at this point frame 0 is already ONGed.
@@ -197,8 +204,8 @@ if (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                        my $ong_time = int($settings{'firstongtime'});
                        my $r;
                        
-                       %story     = read_data_file(DATA_STORY_PATH());
-                       %goto_list = read_data_file(DATA_LIST_PATH());
+                       %story     = read_story();
+                       %goto_list = read_goto();
                        
                        if (
                                (int($story{'state'}) == INTF_STATE->{'>|'} ) &&
@@ -235,7 +242,7 @@ if (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                                        $r = write_static_goto(\%state, \%settings, \%goto_list);
                                }
                                if ($r) {
-                                       $r = write_data_file($fh, \%state);
+                                       $r = write_state($fh, \%state);
                                }
                                unless ($r) {
                                        # FAILED ONG! Story as if it was inactive!
@@ -269,16 +276,7 @@ if ($access) {
                        exit redirect($method, CGI_PATH(), HTTP_STATUS->{'see_other'});
                }
                elsif ($frame < int($state{'last'})) {
-                       my $page_file;
-                       if ($frame_data{'page'} ne '') {
-                               $page_file = $frame_data{'page'};
-                       }
-                       else {
-                               $page_file = sprintf(
-                                       $settings{'frame'},
-                                       $frame, 'htm'
-                               );
-                       }
+                       my $page_file = get_page_file($frame, \%frame_data, \%settings);
                        if (_x_encoded('-f',
                                join_path(PATH_SEPARATOR(), WWW_PATH() , $page_file)
                        )) {
@@ -296,6 +294,7 @@ if ($access) {
                        {'path' => $frame}
                );
                unless ($no_cgi) {
+                       delete $cgi{'f'}; # to avoid infinite loop
                        $redirect_url = merge_url(
                                {'path' => $redirect_url},
                                {'query' => \%cgi}
@@ -305,20 +304,17 @@ if ($access) {
        }
        
        if ($frame > 0) {
-               $prev_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-1);
-               %prev_frame_data = read_data_file($prev_frame_data_path);
+               %prev_frame_data = read_frame_data($frame-1, \%default);
        }
-       $next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
-       %next_frame_data = read_data_file($next_frame_data_path);
-       
-       %frame_data      = merge_settings(\%default,      \%frame_data);
-       %prev_frame_data = merge_settings(\%default, \%prev_frame_data);
-       %next_frame_data = merge_settings(\%default, \%next_frame_data);
+       else {
+               %prev_frame_data = %default;
+       }
+       %next_frame_data = read_frame_data($frame+1, \%default);
+       %frame_data      = merge_settings(\%default, \%frame_data);
 }
 else {
        # replace frame data with fail state replacement
-       %frame_data = read_data_file(DATA_NOACCESS_PATH());
-       %frame_data = merge_settings(\%default, \%frame_data);
+       %frame_data = read_noaccess(\%default);
 }
 
 $timer   = int($state{'nextong'}) - $time;
@@ -349,14 +345,11 @@ if($text_mode > TEXT_MODE->{'words'}) {
        $text_mode = TEXT_MODE->{'normal'};
 }
 $words_page = int($cgi{'i'});
+$goto = int($cgi{'g'});
 
-$words_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $frame);
-%words_data = read_data_file(
-       $words_data_path, # file
-       '', # encoding
-       0,  # no header
-       ($text_mode != TEXT_MODE->{'words'}), # header only
-       1,  # as list
+%words_data = read_words_list(
+       $frame,
+       ($text_mode != TEXT_MODE->{'words'})
 );
 
 if (!$access) {
@@ -379,7 +372,8 @@ print_viewer_page (
                'static'        => 0,
                'show_command'  => $show_command,
                'text_mode'     => $text_mode,
-               'words_page'    => $words_page
+               'words_page'    => $words_page,
+               'goto'          => $goto
        },
        \%state,
        \%settings,