Hi dude! I have an orrible trouble with this poor cgi: is a client <br> pop3 web based gateway.The function "connetti()" never been called and <br> i don't know why!!The functions in the bottom of the script
<br> load,save,restore the state of the session by save the <br> user,pass,host,id in a file.if you try to execute the script all stop <br> when you click on the submit button.<br> I hope there is a good soul who help me.
<br> <p>There is the code: <br> </p><p>#!/usr/bin/perl -w <br> </p><p>use Mail::POP3Client; <br> use CGI qw(:all); <br> #use CGIBook::Error; <br> #use HTML::Template; <br> </p><p>local $MAX_FILES = 1000; <br> local $DATA_DIR = 'usr/lib/cgi-bin';
<br> </p><p>my $q = new CGI; <br> my $this_script_name = 'popGem.cgi'; <br> my $id = get_id($q); <br> my $action = ( $q->param("action") ) || 'start'; <br> </p><p>if ( $action eq "start") {
<br> </p><p>start($q,$id); <br> </p><div id="qhide_40094" style="display: block;" class="qt">} <br> <br></div>if ( $action eq "connetti" ) { <br> <p>connetti($q,$id); <br> </p><div id="qhide_40095" style="display: block;" class="qt">
} <br> <br></div>sub start { <br> my ($q ,$id) = @_; <br> print <br> $q-> header(), <br> $q-> start_html(-title => "PopGem pop3 web based reader"), <br> $q-> start_form(-action => $this_script_name ,-method =>
<br> "post"), <br> $q-> table( <br> {-border => "1"}, <br> $q->caption("PopGem pop3 web based reader!"), <br> $q->Tr(
<br> $q-> th("Nome Utente:"), <br> $q-> th( textfield(-name => "user_name",-size => "30") ) <br> ), <br> $q-> Tr(
<br> $q-> th("Password:"), <br> $q-> th( password_field(-name => "password",-size => "30") ) <br> ), <br> $q-> Tr(
<br> $q-> th("Nome Server:"), <br> $q-> th( textfield(-name => "domain_name",-size => "30") ) <br> ), <br> $q-> Tr(
<br> $q-> th({-rowspan => "2"}, <br> $q-> submit(-value => "connetti") ) <br> ), <br> $q->hidden(
<br> -name => "id", <br> -default => $id, <br> -override => 1 <br> ), <br> $q->hidden( <br> -name => "action",
<br> -default => "connetti", <br> -override => 1 <br> ) <br> ), <br> $q-> end_form(), <br> $q-> end_html();
<br> save_state($q); <br> <div id="qhide_40096" style="display: block;" class="qt">} <br> <br></div>sub connetti { <br> <p>my ($q,$id) = @_; <br> my $user_name = param('user_name'); <br> my $password = param('password');
<br> my $domain_name = param('domani_name'); <br> #per ogni messaggio che è presente nella mailbox stampo una riga di <br> una tabella <br> #con le informazioni utili: mittente,oggetto,ecc... <br> </p><p>my $pop = new Mail::POP3Client ( USER => $user_name,
<br> PASSWORD => $password, <br> HOST => $domain_name, <br> AUTH_MODE => 'PASS' ); <br> </p>
<p>for ($i = 1; $i <= $pop->Count(); $i++) { <br> </p><p>foreach my $message ( $pop->Head($i) ){ <br> </p><p>my $date = ($message =~ /^Date:\s+/i); <br> my $from = ($message =~ /^From:\s+/i); <br> my $to = ($message =~ /^To:\s+/i);
<br> my $subject = ($message =~ /^Subject:\s+/i); <br> print $q-> header(), <br> $q-> start_html(-title => "Ecco i messaggi"), <br> $q-> table( <br> {-border => "1"},
<br> $q->caption("Informazioni del messaggio $i:"), <br> $q->Tr( <br> $q-> th("Date:"), <br> $q-> th("From:"),
<br> $q-> th("To:"), <br> $q-> th("Subject:") <br> ), <br> $q->Tr( <br> $q-> th("$date"),
<br> $q-> th("$from"), <br> $q-> th("$to"), <br> $q-> th("$subject") <br> ) <br> ),
<br> $q-> end_html(); <br> $q-> save_state($q); <br> </p><div id="qhide_40097" style="display: block;" class="qt">} <br> } <br> } <br> <br></div>sub get_id { <br> my $q = shift; <br> my $id;
<br> <p> my $unsafe_id = $q->param( "id" ) || ''; <br> $unsafe_id =~ s/[^\dA-Fa-f]//g; <br> </p><p> if ( $unsafe_id =~ /^(.+)$/ ) { <br> $id = $1; <br> load_state( $q, $id );
<br> } <br> else { <br> $id = unique_id( ); <br> $q->param( -name => "id", -value => $id ); <br> } <br> </p><p> return $id; <br> </p><div id="qhide_40098" style="display: block;" class="qt">
} <br> <br></div># Loads the current CGI object's default parameters from the saved <br> state <br> sub load_state { <br> my( $q, $id ) = @_; <br> my $saved = get_state( $id ) or return; <br> <p> foreach ( $saved->param ) {
<br> $q->param( $_ => $saved->param($_) ) unless defined $q- <br> </p><div id="qhide_40099" style="display: block;" class="qt">>param($_); <br> } <br> } <br> <br></div># Reads a saved CGI object from disk and returns its params as a hash
<br> ref <br> sub get_state { <br> my $id = shift; <br> my $session = session_filename( $id ); <br> local *FILE; <br> <p> -e $session or return; <br> open FILE, $session or die "Cannot open $session: $!";
<br> my $q_saved = new CGI( \*FILE ) or <br> error( $q, "Unable to restore saved state." ); <br> close FILE; <br> </p><p> return $q_saved; <br> </p><div id="qhide_40100" style="display: block;" class="qt">
} <br> <br></div># Saves the current CGI object to disk <br> sub save_state { <br> my $q = shift; <br> my $session = session_filename( $id ); <br> local( *FILE, *DIR ); <br> <p> # Avoid DoS attacks by limiting the number of data files
<br> my $num_files = 0; <br> opendir DIR, $DATA_DIR; <br> $num_files++ while readdir DIR; <br> closedir DIR; <br> </p><p> # Compare the file count against the max <br> if ( $num_files > $MAX_FILES ) {
<br> error( $q, "We cannot save your request because the directory <br> " . <br> "is full. Please try again later" ); <br> } <br> </p><p> # Save the current CGI object to disk
<br> open FILE, ">> $session" or return die "Cannot write to $session: <br> $!"; <br> $q->save( \*FILE ); <br> close FILE; <br> </p><div id="qhide_40101" style="display: block;" class="qt">
} <br> <br></div># Separated from other code in case this changes in the future <br> sub session_filename { <br> my $id = shift; <br> return "/$DATA_DIR/$id"; <br> <div id="qhide_40102" style="display: block;" class="qt">
} <br> <br></div>sub unique_id { <br> # Use Apache's mod_unique_id if available <br> return $ENV{UNIQUE_ID} if exists $ENV{UNIQUE_ID}; <br> <p> require Digest::MD5; <br> </p><p> my $md5 = new Digest::MD5;
<br> my $remote = $ENV{REMOTE_ADDR} . $ENV{REMOTE_PORT}; <br> </p> # Note this is intended to be unique, and not unguessable <br> # It should not be used for generating keys to sensitive data <br> my $id = $md5->md5_base64( time, $$, $remote );
<br> $id =~ tr|+/=|-_.|; # Make non-word chars URL-friendly <br> return $id;<br>}<br>