#!/usr/bin/perl # Michael Tartaglia # 13 Mar 2002 # ASSIGNMENT 9 - Simple Guestbook: Takes entered data # from guestbook.html and stores it onto # guestbook.txt for viewing use CGI ":standard"; use Fcntl ":flock"; require template; my $fileName = "guestbook.txt"; # EXTERNAL FILE my $readOnly = 1; # PERMISSION LEVEL 1 unless (param('read') == 1) { # unless read-only print redirect ("../guestbook.html") and die if (param('name') eq "" && param('mesg') eq ""); $readOnly = 0; } # OPEN GUESTBOOK ENTRY LOG open(BOOK, "<$fileName"); flock(BOOK, LOCK_EX); my @lines = ; flock(BOOK, LOCK_UN); close(BOOK); my $fileContent = join("|", @lines); # IF NOT READ ONLY, WRITE THE ENTERED DATA if (!$readOnly) { my $name = noHTML(param('name')); # NAME OF USER my $mesg = noHTML(param('mesg')); # MESSAGE FROM USER my $date = scalar(localtime()); # TIME OF ENTRY my $from = $ENV{"REMOTE_ADDR"}; # IP ADDR OF ENTRY my $toSave = "$name\t$mesg\t$date\t$from\n"; # FORMAT TO SAVE IN FILE push(@lines, $toSave); open(BOOK, ">>$fileName"); flock(BOOK, LOCK_EX); print BOOK "$toSave"; flock(BOOK, LOCK_UN); close(BOOK); } # PRINT OUT GUESTBOOK, WITH SPECIAL MESSAGE IF USER IS # MAKING A SECOND ENTRY FROM THE SAME COMPUTER template::startHTML("Program # 6", "Simple Guestbook"); print "Welcome back!

" if ($fileContent =~ /$ENV{"REMOTE_ADDR"}/ ); print "\n\t"; while ($lines[0] ne "") { my $cur = pop(@lines); my ($splitName, $splitMesg, $splitDate, $splitLoc) = split(/\t/,$cur); print "\n\t ", "\n\t ", "\n\t \n\t "; } print "\n\t
$splitName writes:$splitMesg
", "Posted: $splitDate

", "
\n\t
", "\n\tClick here to ", "make another entry!\n\n"; template::endHTML(); # SUBROUTINE THAT FILTERS ALL HTML OUT OF A STRING sub noHTML { $_[0] =~ s/<(B|b)(R|r)>/ /g if ($_[0] =~ /<(B|b)(R|r)>/); $_[0] =~ s/<.*?>//g; #removes tags, "
" = " " $_[0] =~ s/(\n)|(\t)/ /g; #removes \n and \t chars $_[0] =~ s/(^| )\s+/$1/g; #condenses multiple spaces $_[0] =~ s/(^|[.!?])(\s*)(\w)/$1$2\u$3/g; #caplitalizes first letter # of every sentence return $_[0]; }