From: John Graham-C. <jgr...@us...> - 2005-04-07 19:55:35
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21537/UI Modified Files: HTML.pm HTTP.pm Log Message: More work on v0.23.0 (Multi-user Support) Add account association and allow different users to log in. Users can be associated with specific accounts when POPFile is in multi-user mode. Currently every user has a blank password. Also cloning of per-bucket parameters is not working. Would love to have volunteers to do the following: 1. Test out the new functionality for account association 2. Write code to do per-bucket parameter cloning (see Bayes.pm TODO) 3. Write code to set/reset user passwords. --- Classifer/Bayes.pm: Add functions for handling account creation and deletion and mapping of accounts to users. Add new message called CREAT used to pass a child generated session to the parent. Proxy/Proxy.pm Proxy/POP3.pm: Add code for handling users associated with accounts and use it in the POP3 module to lookup users dynamically when they are logged in. UI/HTML.pm: Update UI to be able to handle different users using the cookie and changes to the History API. Add code to the users_page to handle account association on a per user basis. UI/HTTP.pm: Add url_decode_ and decode form parameters. POPFile/MQ.pm: Comment the CREAT message. POPFile/History.pm: Make history mechanism aware of different users so that different users get a different view of the history. skins/default/user_page.thtml: Add code for handling account association. languages/English.msg: Additional strings needed for the account handling. --- Once this is all working we can start to fix the test suite and nail down the v0.23.0 release. Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.347 retrieving revision 1.348 diff -C2 -d -r1.347 -r1.348 *** HTML.pm 16 Mar 2005 20:52:31 -0000 1.347 --- HTML.pm 7 Apr 2005 19:54:49 -0000 1.348 *************** *** 200,207 **** my ( $self ) = @_; - # Get a query session with the History object - - $self->{q__} = $self->history_()->start_query(); - # Ensure that the messages subdirectory exists --- 200,203 ---- *************** *** 244,251 **** foreach my $session (keys %{$self->{sessions__}}) { $self->classifier_()->release_session_key( $session ); } - $self->history_()->stop_query( $self->{q__} ); - $self->SUPER::stop(); } --- 240,246 ---- foreach my $session (keys %{$self->{sessions__}}) { $self->classifier_()->release_session_key( $session ); + $self->history_()->stop_query( $self->{sessions__}{$session}{q} ); } $self->SUPER::stop(); } *************** *** 359,362 **** --- 354,358 ---- $self->{sessions__}{$session}{search} = ''; $self->{sessions__}{$session}{negate} = ''; + $self->{sessions__}{$session}{q} = $self->history_()->start_query( $session ); return $session; *************** *** 453,456 **** --- 449,466 ---- } + # In single user mode get the administrator key + + if ( !defined( $session ) && + $self->global_config_( 'single_user' ) ) { + $session = $self->classifier_()->get_administrator_session_key(); + $self->{sessions__}{$session}{lastused} = time; + $self->{sessions__}{$session}{user} = 1; + $self->{sessions__}{$session}{sort} = ''; + $self->{sessions__}{$session}{filter} = ''; + $self->{sessions__}{$session}{search} = ''; + $self->{sessions__}{$session}{negate} = ''; + $self->{sessions__}{$session}{q} = $self->history_()->start_query( $session ); + } + # See if there are any form parameters and if there are parse them # into the %form hash *************** *** 606,610 **** # If we don't have a valid session key, then insist that the user # log in, or check the username and password for validity, if they ! # are valid then create the session now if ( !defined( $session ) ) { --- 616,621 ---- # If we don't have a valid session key, then insist that the user # log in, or check the username and password for validity, if they ! # are valid then create the session now. In single user mode get ! # the key if ( !defined( $session ) ) { *************** *** 613,616 **** --- 624,628 ---- $self->http_redirect_( $client, '/', $session ); } + return 1; } *************** *** 716,721 **** } ! &{$method}( $self, $client, ! $self->load_template__( $template, $url, $session ), $template, $url, $session ); return 1; --- 728,739 ---- } ! # No logout button in single user mode ! ! my $templ = $self->load_template__( $template, $url, $session ); ! if ( $self->global_config_( 'single_user' ) ) { ! $templ->param( 'Header_If_SingleUser' => 1 ); ! } ! ! &{$method}( $self, $client, $templ, $template, $url, $session ); return 1; *************** *** 1319,1322 **** --- 1337,1347 ---- $page, $session ); + # Handle single user mode + + if ( defined( $self->{form_}{usermode} ) ) { + $self->global_config_( 'single_user', $self->{form_}{singleuser} ); + } + $templ->param( 'Users_If_Single' => $self->global_config_( 'single_user' ) ); + # Handle user creation *************** *** 1368,1371 **** --- 1393,1425 ---- } + # Handle adding an account to a user + + if ( defined( $self->{form_}{addaccount} ) ) { + if ( ( $self->{form_}{newaccount} ne '' ) && + ( $self->{form_}{newaccount} =~ /^.+:.+$/ ) ) { + my $id = $self->classifier_()->get_user_id( $session, $self->{form_}{editname} ); + my $result = $self->classifier_()->add_account( $session, $id, 'pop3', $self->{form_}{newaccount} ); + if ( $result == -1 ) { + $self->error_message__( $templ, $self->{language__}{Users_Duplicate_Account} ); + } else { + if ( $result == 0 ) { + $self->error_message__( $templ, $self->{language__}{Users_Failed_Account} ); + } + } + } else { + $self->error_message__( $templ, $self->{language__}{Users_Bad_Account} ); + } + } + + # Handle removing accounts for a user + + if ( defined( $self->{form_}{delete} ) ) { + foreach my $key (keys %{$self->{form_}}) { + if ( $key =~ /^remove_(.+)/ ) { + $self->classifier_()->remove_account( $session, 'pop3', $1 ); + } + } + } + my $users = $self->classifier_()->get_user_list( $session ); *************** *** 1411,1414 **** --- 1465,1484 ---- $templ->param( 'Users_If_Editing_User' => 1 ); $templ->param( 'Users_Edit_User_Name' => $self->{form_}{editname} ); + + # Handle POP3 account association + + my @accounts = $self->classifier_()->get_accounts( $session, $id ); + + $templ->param( 'Users_If_Accounts' => ( $#accounts > -1 ) ); + if ( $#accounts > -1 ) { + my @account_data; + for my $account (@accounts) { + my %row_data; + $account =~ s/[^:]+://; + $row_data{Account} = $account; + push( @account_data, \%row_data ); + } + $templ->param( 'Users_Loop_Accounts' => \@account_data ); + } } *************** *** 2361,2368 **** my $dots = 0; my @nav_data; ! while ( $i < $self->history_()->get_query_size( $self->{q__} ) ) { my %row_data; if ( ( $i == 0 ) || ! ( ( $i + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) >= $self->history_()->get_query_size( $self->{q__} ) ) || ( ( ( $i - 2 * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) <= $start_message ) && ( ( $i + 2 * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) >= $start_message ) ) ) { --- 2431,2439 ---- my $dots = 0; my @nav_data; ! my $q = $self->{sessions__}{$session}{q}; ! while ( $i < $self->history_()->get_query_size( $q ) ) { my %row_data; if ( ( $i == 0 ) || ! ( ( $i + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) >= $self->history_()->get_query_size( $q ) ) || ( ( ( $i - 2 * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) <= $start_message ) && ( ( $i + 2 * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) >= $start_message ) ) ) { *************** *** 2390,2394 **** $templ->param( 'History_Navigator_Loop' => \@nav_data ); ! if ( $start_message < ( $self->history_()->get_query_size( $self->{q__} ) - $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) ) { $templ->param( 'History_Navigator_If_Next' => 1 ); $templ->param( 'History_Navigator_Next' => $start_message + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ); --- 2461,2465 ---- $templ->param( 'History_Navigator_Loop' => \@nav_data ); ! if ( $start_message < ( $self->history_()->get_query_size( $q ) - $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ) ) { $templ->param( 'History_Navigator_If_Next' => 1 ); $templ->param( 'History_Navigator_Next' => $start_message + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) ); *************** *** 2538,2542 **** my $destination = ( $self->{form_}{jumptopage} - 1 ) * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ); ! my $maximum = $self->history_()->get_query_size( $self->{q__} ); if ( $destination <= $maximum && $destination > 0 ) { --- 2609,2614 ---- my $destination = ( $self->{form_}{jumptopage} - 1 ) * $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ); ! my $q = $self->{sessions__}{$session}{q}; ! my $maximum = $self->history_()->get_query_size( $q ); if ( $destination <= $maximum && $destination > 0 ) { *************** *** 2682,2693 **** } # Handle clearing the history files, there are two options here, # clear the current page or clear all the files in the cache if ( defined( $self->{form_}{clearall} ) ) { ! $self->history_()->delete_query( $self->{q__} ); } ! $self->history_()->set_query( $self->{q__}, $self->{form_}{filter}, $self->{form_}{search}, --- 2754,2767 ---- } + my $q = $self->{sessions__}{$session}{q}; + # Handle clearing the history files, there are two options here, # clear the current page or clear all the files in the cache if ( defined( $self->{form_}{clearall} ) ) { ! $self->history_()->delete_query( $q ); } ! $self->history_()->set_query( $q, $self->{form_}{filter}, $self->{form_}{search}, *************** *** 2709,2713 **** $templ->param( 'History_Field_Sort' => $self->{form_}{sort} ); $templ->param( 'History_Field_Filter' => $self->{form_}{filter} ); ! $templ->param( 'History_If_MultiPage' => $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) <= $self->history_()->get_query_size( $self->{q__} ) ); my @buckets = $self->classifier_()->get_buckets( $session ); --- 2783,2787 ---- $templ->param( 'History_Field_Sort' => $self->{form_}{sort} ); $templ->param( 'History_Field_Filter' => $self->{form_}{filter} ); ! $templ->param( 'History_If_MultiPage' => $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) <= $self->history_()->get_query_size( $q ) ); my @buckets = $self->classifier_()->get_buckets( $session ); *************** *** 2739,2743 **** $templ->param( 'History_Field_Not' => ($self->{form_}{negate} ne '')?'checked':'' ); ! my $c = $self->history_()->get_query_size( $self->{q__} ); if ( $c > 0 ) { $templ->param( 'History_If_Some_Messages' => 1 ); --- 2813,2817 ---- $templ->param( 'History_Field_Not' => ($self->{form_}{negate} ne '')?'checked':'' ); ! my $c = $self->history_()->get_query_size( $q ); if ( $c > 0 ) { $templ->param( 'History_If_Some_Messages' => 1 ); *************** *** 2756,2760 **** my $stop_message = $start_message + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) - 1; ! $stop_message = $self->history_()->get_query_size( $self->{q__} ) - 1 if ( $stop_message >= $self->history_()->get_query_size( $self->{q__} ) ); $self->set_history_navigator__( $templ, $start_message, $stop_message, $session ); --- 2830,2834 ---- my $stop_message = $start_message + $self->user_config_( $self->{sessions__}{$session}{user}, 'page_size' ) - 1; ! $stop_message = $self->history_()->get_query_size( $q ) - 1 if ( $stop_message >= $self->history_()->get_query_size( $q ) ); $self->set_history_navigator__( $templ, $start_message, $stop_message, $session ); *************** *** 2807,2811 **** my @rows = $self->history_()->get_query_rows( ! $self->{q__}, $start_message+1, $stop_message - $start_message + 1 ); --- 2881,2885 ---- my @rows = $self->history_()->get_query_rows( ! $q, $start_message+1, $stop_message - $start_message + 1 ); Index: HTTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTTP.pm,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** HTTP.pm 15 Feb 2005 04:23:53 -0000 1.29 --- HTTP.pm 7 Apr 2005 19:54:53 -0000 1.30 *************** *** 316,320 **** while ( $arguments =~ m/\G(.*?)=(.*?)(&|\r|\n|$)/g ) { ! my $arg = $1; my $need_array = defined( $self->{form_}{$arg} ); --- 316,320 ---- while ( $arguments =~ m/\G(.*?)=(.*?)(&|\r|\n|$)/g ) { ! my $arg = $self->url_decode_( $1 ); my $need_array = defined( $self->{form_}{$arg} ); *************** *** 363,366 **** --- 363,385 ---- # ---------------------------------------------------------------------------- # + # url_decode_ + # + # $text Text to decode from URL safety + # + # Decode text in a URL + # + # ---------------------------------------------------------------------------- + sub url_decode_ + { + my ( $self, $text ) = @_; + + $text =~ s/\+/ /; + $text =~ s/(%([A-F0-9][A-F0-9]))/chr(hex($2))/eg; + + return $text; + } + + # ---------------------------------------------------------------------------- + # # http_error_ - Output a standard HTTP error message # |