Good idea thanks! ----- Original Message ----- >From: "Dan Muey" <[EMAIL PROTECTED]> >To: "Mr. Horace Franklin Jr." <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> >Sent: Friday, March 07, 2003 10:37 AM > Subject: RE: CG I Script [guestbook.cgi] > > > > > > > > I tired to run the script below on my host server > > and it would not run. The server cannot find Taintcheck or > > Timefuncs. I uploaded these pm file to the server. What did > You don't simply upload the pm files they have to be instsalled > On the server. > > Perl -MCPAN -e shell > > CPAN> Install Whatever > > > I'd recommend visiting cpan.org to learn about how this is done. It really > quite simple and fast. > > Dmuey > > > I do wrong? Is Apache the problem? > > > > SERVER INFORMATION: > > Path to Perl: /usr/local/bin/perl > > Path to Sendmail: /usr/sbin/sendmail > > Path to home directory: /home/horace-f > > Path to Date: /bin/date > > What Operating System are we using? RedHat Linux > > What Web Server Software is running on the server? Apache 1.3 > > > > SCRIPT: > > #!/usr/bin/perl -wT > > ##################### > > # guestbook.cgi # > > ##################### > > > > $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; > > ## $ENV{'SHELL'} = '/bin/sh'; > > $ENV{'ENV'} = ''; > > $ENV{'IFS'} = ''; > > > > use lib '/home/horace-f/perl_lib'; > > > > use Taintcheck; > > use Timefuncs; > > use CGI; > > use strict; > > use vars qw($__START__ $CGI $GUESTBOOK); > > > > #################################### > > # Paths Guestbook CGI & HTML files # > > #################################### > > > > $CGI = "guestbook.cgi"; > > $GUESTBOOK= "/home/horace-f/public_html/guestbook.txt"; > > > > eval { main() }; $__START__ = __LINE__; > > > > if ($@) { > > chomp($@); > > > > $@ =~ s/\(eval\) line (\d+)/${CGI} . " line " . ($__START__-$1-1)/e; > > $@ =~ s/( at ).*( line )/$1${CGI}$2/; > > > > my $error_message = $@; > > > > print <<ERR > > Content-type: text/html > > <html> > > <head><title>Error</title></head> > > <body> > > <h1>Error</h1><br>\n > > <code>$error_message</code> > > </body> > > </html> > > ERR > > > > } > > > > exit(0); > > > > ############ > > # MAIN # > > ############ > > > > sub main { > > my $q = new CGI; > > > > if ($q->param()) { > > add_entry($q); > > } > > else { > > display_guestbook($q); > > } > > } > > > > ##################################################### > > # subroutines > > # > > # in: CGI object > > # > > # out: > > # > > # Description: > > # > > # Reads the guestbook file & prints it as html > > # > > ##################################################### > > > > sub display_guestbook { > > my $q = shift; > > my ($html,$e,$num_entries,$entries,$cookie,$thanks); > > > > $html = $q->header . $q->start_html("My Guestbook"); > > > > $html .= $q->h1("Guestbook"); > > > > open (GB, "<$GUESTBOOK") || die "Unable to read guestbook > > file " . "'$GUESTBOOK' (error: $!). " . "Please try again > > later, or contact " . "the webmaster of this site for assistance"; > > > > ######################################## > > # get a read lock on the guestbook # > > ######################################## > > > > lock_filehandle(\*GB, 'R'); > > > > #################################### > > # read and process the entries # > > #################################### > > > > while (!eof(GB)) { > > my $e = new CGI(\*GB); > > $num_entries++; > > $entries .= draw_guestbook_entry($e); > > > > ############################################### > > # Here's where things get 'spooky': If the user has signed # > > # the guestbook, she'll have a cookie set that will tell us # > > # when she signed it. > > # > > ############################################### > > > > if ($e->param('cookie') == $q->cookie('sg_signed_at')) { > > $thanks = "<p>Hello, <b>" . $e->param('name') . > > "</b>! Thanks for signing my guestbook on " . > > date_string($e->param('cookie')) . "</p>\n"; > > } > > } > > > > close (GB); > > > > ################################################ > > # Insert the count of entries, and the entries themselves, into # > > # the html page > > # > > ################################################# > > > > if ($num_entries) { > > $html .= "<p>Signed $num_entries time" . > > (($num_entries > 1) && ("s")); > > $html .= " · Last signed " . > > date_string( (file_stats( $GUESTBOOK ))[0] ); > > $html .= $thanks if $thanks; > > $html .= $entries . "</p>; > > } > > else { > > $html .= "<h3>No entries!</h3><hr>"; > > } > > > > $html .= &entry_form($q); > > $html .= $q->end_html; > > > > print $html; > > } > > > > ############################################### > > # in: CGI object > > # > > # out: > > # > > # Description: > > # > > # Adds entry to guestbook file, then prints guestbook html # > > # Also sets a cookie with the current time > > # > > ############################################### > > > > sub add_entry { > > my $q = shift; > > my ($name,$email,$homepage,$msg,$entry,$url,$cookie); > > > > $url = $q->url; > > > > ########################################### > > # it's often easier to access parameters than cookies, # > > # so save the value here first > > # > > ########################################### > > > > $q->param('cookie', time); > > > > ################################################ > > # then create a cookie, which we'll put in the outgoing # > > # http header > > # > > ################################################ > > > > $cookie = $q->cookie( -name=>'sg_signed_at', > > -value=>$q->param('cookie') ); > > untaint_params($q); > > > > ############################################# > > # write the submission to the guestbook # > > ############################################# > > > > open (GB, ">>$GUESTBOOK") || die "Unable to write to > > guestbook (error: $!). " . "Please try again later, or > > contact the webmaster " . "of this site for assistance"; > > > > ######################################### > > # get a write lock on the guestbook # > > ######################################### > > > > lock_filehandle(\*GB, 'W'); > > > > $q->save(\*GB); > > > > ################################################### > > # closing automatically removes the file lock > > # > > ################################################### > > > > close GB; > > > > ######################################################## > > # say thanks, with a link back to the questbook > > # > > # here's where the cookie actually gets set on the > > # > > # user's computer > > # > > ######################################################## > > > > print $q->header( -cookie=>$cookie ), > > $q->start_html("Thanks"), > > $q->h1("Thanks!"), > > $q->h3("Your message has been added to my guestbook."), > > $q->p, > > $q->a({href=>$q->url}, "Go back to the guestbook"), > > $q->end_html; > > } > > > > ########################################### > > # in: guestbook entry # > > # out: guestbook entry in html format # > > # description: # > > # Format a guestbook entry as html # > > ########################################### > > > > sub draw_guestbook_entry { > > my $entry = shift; > > my $author; > > > > ################################################## > > # import the params into a namespace, for easy > > # > > # interpolation below. > > # > > ################################################## > > > > $entry->import_names('E'); > > > > ################################################## > > # include email & homepage links, if present > > # > > ################################################## > > > > $author = $E::name; > > if ($E::email =~ /(.*?)@((.*?)\.)+.*/) { > > $author = qq|<a href="mailto:$E::email">$E::name</a>|; > > } > > > > if ($E::homepage) { > > > > ###################################################### > > # make sure the homepage url begins with http:// > > # > > ###################################################### > > > > $E::homepage =~ s|^(http://)*(.*)$|http://$2|; > > $author .= qq| (<a href="$E::homepage">$E::homepage</a>)|; > > } > > return <<ENTRY; > > <p><b>$author</b> > > <br/>$E::message</p> > > <hr/> > > ENTRY > > > > } > > > > sub entry_form { > > my $q = shift; > > my $url = $q->url; > > > > my $form = <<E_FORM; > > <h3>Sign My Guestbook:</h3> > > <form action="$url" method="post"> > > <p><b>Name</b>: <input type="text" name="name"/></p> > > <p><b>E-mail</b>: <input type="text" name="email"/></p> > > <p><b>Homepage</b>: <input type="text" name="homepage"/></p> > > <p><b>Message</b>:</p> <p><textarea cols="30" rows="6" > > wrap="virtual" name="message"></p> <p>Type your message here. > > </textarea> <input type="submit"></p> </form> E_FORM > > > > $form; > > } > > > > ############################################################## > > ######### > > # lock_filehandle > > > > # > > # in: filehandle > > > > # > > # out: > > > > # > > # description: flock()s a filehandle, for concurrency-safe > > access # > > ############################################################## > > ######### > > > > sub lock_filehandle { > > my $fh = shift; > > my $lock = shift; > > > > use Fcntl qw(:flock); > > > > my $lock_code; > > > > if ($lock =~ /^r/i) { > > $lock_code = LOCK_SH; > > } elsif ($lock =~ /^w/i) { > > $lock_code = LOCK_EX; > > } else { > > $lock_code = LOCK_UN; > > } > > > > ######################### > > # give it two tries # > > ######################### > > > > unless (flock ($fh, $lock_code | LOCK_NB)) { > > unless (flock($fh, $lock_code)) { > > die "flock: could not get $lock lock on $GUESTBOOK"; > > } > > } > > > > return 1; > > } > > > > > > > > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]