Hi dude! I have an orrible trouble with this poor cgi: is a client <br> pop3 web based gateway.The function &quot;connetti()&quot; never been called and <br> i don&#39;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 &nbsp;= &#39;usr/lib/cgi-bin&#39;; 
<br> </p><p>my $q = new CGI; <br> my $this_script_name = &#39;popGem.cgi&#39;; <br> my $id = get_id($q); <br> my $action = ( $q-&gt;param(&quot;action&quot;) ) || &#39;start&#39;; <br> </p><p>if ( $action eq &quot;start&quot;) { 
<br> </p><p>start($q,$id); <br> </p><div id="qhide_40094" style="display: block;" class="qt">} <br> <br></div>if ( $action eq &quot;connetti&quot; ) { <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> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; header(), <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; start_html(-title =&gt; &quot;PopGem pop3 web based reader&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; start_form(-action =&gt; $this_script_name ,-method =&gt; 
<br> &quot;post&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; table( <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{-border =&gt; &quot;1&quot;}, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;caption(&quot;PopGem pop3 web based reader!&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;Tr( 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;Nome Utente:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th( textfield(-name =&gt; &quot;user_name&quot;,-size =&gt; &quot;30&quot;) ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; Tr( 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;Password:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th( password_field(-name =&gt; &quot;password&quot;,-size =&gt; &quot;30&quot;) ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; Tr( 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;Nome Server:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th( textfield(-name =&gt; &quot;domain_name&quot;,-size =&gt; &quot;30&quot;) ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; Tr( 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th({-rowspan =&gt; &quot;2&quot;}, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; submit(-value =&gt; &quot;connetti&quot;) ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;hidden( 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -name &nbsp; &nbsp; =&gt; &quot;id&quot;, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -default &nbsp;=&gt; $id, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -override =&gt; 1 <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;hidden( <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -name &nbsp; &nbsp; =&gt; &quot;action&quot;, 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -default &nbsp;=&gt; &quot;connetti&quot;, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -override =&gt; 1 <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; end_form(), <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; end_html(); 
<br> &nbsp; &nbsp; &nbsp; &nbsp; 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 &nbsp; = param(&#39;user_name&#39;); <br> my $password &nbsp; &nbsp;= param(&#39;password&#39;); 
<br> my $domain_name = param(&#39;domani_name&#39;); <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 &nbsp; &nbsp; &nbsp; &nbsp; =&gt; $user_name, 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PASSWORD &nbsp; &nbsp; =&gt; $password, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HOST &nbsp; &nbsp; &nbsp; &nbsp; =&gt; $domain_name, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AUTH_MODE &nbsp; &nbsp;=&gt; &#39;PASS&#39; ); <br> </p>
<p>for ($i = 1; $i &lt;= $pop-&gt;Count(); $i++) { <br> </p><p>foreach my $message ( $pop-&gt;Head($i) ){ <br> </p><p>my $date &nbsp; &nbsp;= ($message =~ /^Date:\s+/i); <br> my $from &nbsp; &nbsp;= ($message =~ /^From:\s+/i); <br> my $to &nbsp; &nbsp; &nbsp;= ($message =~ /^To:\s+/i); 
<br> my $subject = ($message =~ /^Subject:\s+/i); <br> print &nbsp; &nbsp; &nbsp;$q-&gt; header(), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$q-&gt; start_html(-title =&gt; &quot;Ecco i messaggi&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$q-&gt; table( <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{-border =&gt; &quot;1&quot;}, 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;caption(&quot;Informazioni del messaggio $i:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;Tr( <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;Date:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;From:&quot;), 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;To:&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;Subject:&quot;) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;Tr( <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;$date&quot;), 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;$from&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;$to&quot;), <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; th(&quot;$subject&quot;) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ), 
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$q-&gt; end_html(); <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt; save_state($q); <br> </p><div id="qhide_40097" style="display: block;" class="qt">} <br> } <br> } <br> <br></div>sub get_id { <br> &nbsp; &nbsp; my $q = shift; <br> &nbsp; &nbsp; my $id; 
<br> <p>&nbsp; &nbsp; my $unsafe_id = $q-&gt;param( &quot;id&quot; ) || &#39;&#39;; <br> &nbsp; &nbsp; $unsafe_id =~ s/[^\dA-Fa-f]//g; <br> </p><p>&nbsp; &nbsp; if ( $unsafe_id =~ /^(.+)$/ ) { <br> &nbsp; &nbsp; &nbsp; &nbsp; $id = $1; <br> &nbsp; &nbsp; &nbsp; &nbsp; load_state( $q, $id ); 
<br> &nbsp; &nbsp; } <br> &nbsp; &nbsp; else { <br> &nbsp; &nbsp; &nbsp; &nbsp; $id = unique_id( &nbsp;); <br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;param( -name =&gt; &quot;id&quot;, -value =&gt; $id ); <br> &nbsp; &nbsp; } <br> </p><p>&nbsp; &nbsp; return $id; <br> </p><div id="qhide_40098" style="display: block;" class="qt">
} <br> <br></div># Loads the current CGI object&#39;s default parameters from the saved <br> state <br> sub load_state { <br> &nbsp; &nbsp; my( $q, $id ) = @_; <br> &nbsp; &nbsp; my $saved = get_state( $id ) or return; <br> <p>&nbsp; &nbsp; foreach ( $saved-&gt;param ) { 
<br> &nbsp; &nbsp; &nbsp; &nbsp; $q-&gt;param( $_ =&gt; $saved-&gt;param($_) ) unless defined $q- <br> </p><div id="qhide_40099" style="display: block;" class="qt">&gt;param($_); <br> &nbsp; &nbsp; } <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> &nbsp; &nbsp; my $id = shift; <br> &nbsp; &nbsp; my $session = session_filename( $id ); <br> &nbsp; &nbsp; local *FILE; <br> <p>&nbsp; &nbsp; -e $session or return; <br> &nbsp; &nbsp; open FILE, $session or die &quot;Cannot open $session: $!&quot;; 
<br> &nbsp; &nbsp; my $q_saved = new CGI( \*FILE ) or <br> &nbsp; &nbsp; &nbsp; &nbsp; error( $q, &quot;Unable to restore saved state.&quot; ); <br> &nbsp; &nbsp; close FILE; <br> </p><p>&nbsp; &nbsp; 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> &nbsp; &nbsp; my $q = shift; <br> &nbsp; &nbsp; my $session = session_filename( $id ); <br> &nbsp; &nbsp; local( *FILE, *DIR ); <br> <p>&nbsp; &nbsp; # Avoid DoS attacks by limiting the number of data files 
<br> &nbsp; &nbsp; my $num_files = 0; <br> &nbsp; &nbsp; opendir DIR, $DATA_DIR; <br> &nbsp; &nbsp; $num_files++ while readdir DIR; <br> &nbsp; &nbsp; closedir DIR; <br> </p><p>&nbsp; &nbsp; # Compare the file count against the max <br> &nbsp; &nbsp; if ( $num_files &gt; $MAX_FILES ) { 
<br> &nbsp; &nbsp; &nbsp; &nbsp; error( $q, &quot;We cannot save your request because the directory <br> &quot; . <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;is full. Please try again later&quot; ); <br> &nbsp; &nbsp; } <br> </p><p>&nbsp; &nbsp; # Save the current CGI object to disk 
<br> &nbsp; &nbsp; open FILE, &quot;&gt;&gt; $session&quot; or return die &quot;Cannot write to $session: <br> $!&quot;; <br> &nbsp; &nbsp; $q-&gt;save( \*FILE ); <br> &nbsp; &nbsp; 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> &nbsp; &nbsp; my $id = shift; <br> &nbsp; &nbsp; return &quot;/$DATA_DIR/$id&quot;; <br> <div id="qhide_40102" style="display: block;" class="qt">
} <br> <br></div>sub unique_id { <br> &nbsp; &nbsp; # Use Apache&#39;s mod_unique_id if available <br> &nbsp; &nbsp; return $ENV{UNIQUE_ID} if exists $ENV{UNIQUE_ID}; <br> <p>&nbsp; &nbsp; require Digest::MD5; <br> </p><p>&nbsp; &nbsp; my $md5 = new Digest::MD5; 
<br> &nbsp; &nbsp; my $remote = $ENV{REMOTE_ADDR} . $ENV{REMOTE_PORT}; <br> </p>&nbsp; &nbsp; # Note this is intended to be unique, and not unguessable <br> &nbsp; &nbsp; # It should not be used for generating keys to sensitive data <br> &nbsp; &nbsp; my $id = $md5-&gt;md5_base64( time, $$, $remote ); 
<br> &nbsp; &nbsp; $id =~ tr|+/=|-_.|; &nbsp;# Make non-word chars URL-friendly <br> &nbsp; &nbsp; return $id;<br>}<br>