webodex.pl
#!/usr/local/bin/perl #make sure you change the above line if you need #to - ask your system administrator ############################################################################## # COPYRIGHT NOTICE # # Copyright 1999 Russell Flowers All Rights Reserved. # # # # webodex.pl is shareware. By using this code you agree to indemnify # # Russell Flowers from any liability that # # might arise from it's use. # # # # Selling the code for this program without prior written consent is # # expressly forbidden. In other words, please ask first before you try and # # make money off of my program. # # # #Feel free to redistribute this script. In all cases copyright and header # #must remain intact. # ############################################################################## #a little configuration, please... # set multiuser = 1 to let multiple persons keep databases # set multiuser = 0 if only you will use it $multiuser = 1; # This is the URL of the script $scriptpath='/cgi-bin/webodex.pl'; # This is the datapath to the directory where # the data files are kept. Remember, it is a directory, # not a file. Leave off the ending slash (/) $filepath='/news/webodex'; # address of your server's mail program # if not sure, ask your sys-admin $mailprog='/var/qmail/bin/qmail-inject'; # name of header and footer files # if you don't want them, leave them blank, as in: # $header = ''; # $footer = ''; # else, specify a file name. the script looks in # whatever directory you specified in $filepath $header = '/news/webodex/header.html'; $footer = '/news/webodex/footer.html'; # That's all the configuration. ################################################# %alpha = ('ABC','A B C','DEF','D E F','GHI','G H I','JKL','J K L','MN','Mc M N','OPQ','O P Q','RST','R S T','UVW','U V W','XYZ','X Y Z','all','All_____________________'); read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); # Split the data @pairs= split( /&/, $buffer ); foreach $pair( @pairs ) { #Create associated list. ( $label, $value )= split( /=/, $pair ); #parse out the value identities. ( Matt's ) $value=~ tr/+/ /; $value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value=~ s/<!--(.|\n)*-->//g; #no html stuff $value=~ s/<([^>]|\n)*>//g; #Associate pairs to DATA. $DATA{ $label }= $value; } ################################## # # If we have multiple users, # we need to find the correct file # for the username entered # if ($multiuser) { if (not($DATA{'user'} and $DATA{'password'})){&get_user; exit;} else{ $user = lc($DATA{'user'}); $password =lc($DATA{'password'}); $user =~ tr/a-z_0-9//cd; $password =~ tr/a-z_0-9//cd; } } else { $user = 'webodex'; } ################################## # # Check to see if the file already # exists. If so, load it in and # get the password (1st record) # If there is no file, create it # $file = "$filepath/dexfile-$user.dat"; if (-e $file) { open (FILE,$file); @records = <FILE>; close (FILE); chomp(@records); $password = shift(@records); if ($password ne $DATA{'password'}){&reject; exit;} } else { &create; exit; } if ($DATA{'function'} eq 'New'){&create; exit;} elsif ($DATA{'delete'} eq 'Yes'){ @todelete = split(/\|/,$records[$DATA{'record'}]); &header; open (FILE,">$file"); print FILE "$password\n"; foreach $record (@records){ if ($record ne $records[$DATA{'record'}]){print FILE "$record\n";} } close (FILE); $deleted = $todelete[0]; #&header; print "<b>$deleted</b> is deleted!\n"; &print_top; &print_alpha; &print_bottom; exit; } elsif ($DATA{'function'} eq 'Add'){&add_form;exit;} elsif ($DATA{'function'} eq 'Add Record'){&add_record;} elsif ($DATA{'function'} eq 'Display'){&list_records;} elsif ($DATA{'function'} eq 'Search'){&search;} elsif ($DATA{'function'} eq 'Edit'){&edit;} elsif ($DATA{'function'} eq 'Send'){&send_note;} elsif ($DATA{'function'} eq 'Browse'){&browse;} elsif ($DATA{'function'} eq 'Make Changes'){&update_record;} elsif ($DATA{'function'} eq 'Delete'){ &header; $temp = join('<br>',split(/\|/,$records[$DATA{'list'}])); print "Delete this record? <p> $temp\n"; print "<form method=post action=$scriptpath>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "<input type=hidden name=record value=\"$DATA{'list'}\">\n"; print "<input type=submit value=Yes name=delete>&nbsp;<input type=submit value=No name=delete>\n"; exit; } elsif ($DATA{'function'} eq 'Help'){&help;} ######################################## # # If the script doesn't find anything # to do, just print a standard display else{ &header; &print_top; &print_alpha; &print_bottom;} ###################################### # # Below is all subroutines # ###################################### sub print_top{ print "<html><head><title>Web-o-dex</title></head>\n"; print "<body bgcolor=pink>\n"; print "<form method=post action=\"$scriptpath\">\n"; print "<table border=1 cellpadding=2 cellspacing=2>\n"; print "<tr><th>Web-O-Dex</th></tr><tr><td>\n"; print "<table border=0 cellpadding=4 cellspacing=0>\n"; print "<tr valign=top><td rowspan=5>\n"; } # end print_top sub print_alpha{ print "<select name=list size=9>\n"; foreach $key (sort(keys(%alpha))){ print "<option value=$key>$alpha{$key}\n"; } print "</select>\n"; print "<input type=hidden name=level value=alpha>\n"; } sub print_bottom{ print "</td>\n"; print "<td><input type=submit value=\"Display\" name=function></td></tr>\n"; print "<tr><td><input type=submit value=\"Edit\" name=function></td></tr>\n"; print "<tr><td><input type=submit value=\"Add\" name=function></td></tr>\n"; print "<tr><td><input type=submit value=\"Delete\" name=function></td></tr>\n"; print "<tr><td><input type=submit value=\"Browse\" name=function></td></tr>\n"; print "<tr><td colspan=2 align=center><p><input type=text length=20 name=searchfor>&nbsp;<input type=submit value=\"Search\" name=function></td></tr>\n"; print "<tr><td colspan=2>Email a quick note:<br><textarea cols=24 rows=6 name=note wrap=hard></textarea>&nbsp;<input type=submit value=\"Send\" name=function></td></tr>\n"; print "<tr><td colspan=2><center><input type=submit value=\"Help\" name=function></td></tr>\n"; print "</table></td></tr></table>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "</form>\n"; print "<p><center><font size=-2>Powered by <a href=http://web-works.hypermart.net>Web Works</a></font></center><p>\n"; if ($footer){ open (FOOTER,"$filepath/$footer"); while (<FOOTER>){ print $_;} close (FOOTER); } print "</body></html>\n"; } # end print_bottom sub get_user{ &header; print "<h1 align=center>Login Webodex User</h1>\n"; print "<form method=post action=$scriptpath>\n"; print "User: <input type=text maxlength=30 length=20 name=user><p>\n"; print "Password: <input type=password maxlenght=30 length=20 name=password><p>\n"; print "<input type=submit value=Login></form>\n"; } # end get_user sub reject{ &header; print "<h1 align=center>Sorry!</h1>\n"; print "Either you made a mistake typing the password, or you do not have a <b>Web-o-Dex</b> account.\n"; print "Use your browser's <b>back</b> button to re-enter the password, or press \"New\" to create a new account.<p>\n"; print "<form method=post action=$scripturl>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "<input type=submit name=function value=New>\n"; } # end reject sub create{ $file = "$filepath/news/webodex/dexfile-$user.dat"; if (-e $file){ &header; print "<h2 align=center>Account in Use</h2>\n"; print "The account, <code><b>$user</b></code>, is in use already.\n"; print "Try picking another user name.<p>\n"; print "<form method=post action=$scriptpath>\n"; print "User: <input type=text maxlength=30 length=20 name=user><p>\n"; print "Password: <input type=password maxlenght=30 length=20 name=password><p>\n"; print "<input type=submit value=New></form>\n";} else{ open (FILE,">$file"); #flock FILE,2; print FILE "$password\n"; close (FILE); &header; &print_top; &print_alpha; &print_bottom; } } # end create sub add_form{ &header; print "<h1 align=center>Add a Record</h1>\n"; print "<form method=post action=$scriptpath>\n"; print "<table border=0 cellspacing=4 cellpadding=4>\n"; print "<tr><td>Name:</td><td><input type=text maxlength=50 size=20 name=name></td></tr>\n"; print "<tr><td>Address 1:</td><td><input type=text maxlength=50 size=20 name=addr1></td></tr>\n"; print "<tr><td>Address 2:</td><td><input type=text maxlength=50 size=20 name=addr2></td></tr>\n"; print "<tr><td>City, State, Zip:</td><td><input type=text maxlength=50 size=20 name=addr3></td></tr>\n"; print "<tr><td>Email:</td><td><input type=text maxlength=50 size=20 name=email></td></tr>\n"; print "<tr><td>Home Phone:</td><td><input type=text maxlength=20 size=16 name=phone></td></tr>\n"; print "<tr><td>Work Phone:</td><td><input type=text maxlength=20 size=16 name=work></td></tr>\n"; print "<tr><td>Fax Phone:</td><td><input type=text maxlength=20 size=16 name=fax></td></tr>\n"; print "<tr><td>Web Site:</td><td><input type=text maxlength=70 size=30 name=website></td></tr></table>\n"; print "<input type=hidden name=level value=multiple>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "<input type=submit value=\"Add Record\" name=function>&nbsp;<input type=reset value=\"Clear Form\"></form>\n"; print "</body></form>\n"; } # end add_form sub list_records{ %found = (); $count = 0; if ($DATA{'list'} eq 'all'){ foreach $record (@records){ ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$record); $found{"$count"} = $name; $count++; } &header; &print_top; print "<select name=list size=9>\n"; @all = keys(%found); foreach $key (@all){ print "<option name=list value=$key>$found{$key}\n"; } print "<option name=list value=all>All_____________________\n"; print "</select>\n"; print "<input type=hidden name=level value=multiple>\n"; &print_bottom; exit; } elsif ($DATA{'level'} eq 'alpha'){ ##### Prints out all names in a category, e.g. ABC or MN foreach $record (@records){ ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$record); ($junk,$lastname,@junk) = split(/ /,$name); $firstchar = uc(substr($lastname,0,1)); if (index($DATA{'list'},$firstchar,0) >= 0){ $found{"$count"} = $name; } $count++; } &header; &print_top; print "<select name=list size=9>\n"; @all = keys(%found); foreach $key (@all){ print "<option name=list value=$key>$found{$key}\n"; } print "<option name=list value=all>All_____________________\n"; print "</select>\n"; print "<input type=hidden name=level value=multiple>\n"; &print_bottom; exit; } elsif ($DATA{'level'} eq 'multiple'){ #### finds the record listed and displays all the info in it ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$records[$DATA{'list'}]); &header; &print_top; print "<select name=list size=9>\n"; print "<option name=list value=$DATA{'list'}>$name\n"; print "<option name=list value=$DATA{'list'}>$addr1\n"; print "<option name=list value=$DATA{'list'}>$addr2\n"; print "<option name=list value=$DATA{'list'}>$addr3\n"; print "<option name=list value=$DATA{'list'}>$email\n"; print "<option name=list value=$DATA{'list'}>Home Phone: $phone\n"; print "<option name=list value=$DATA{'list'}>Work Phone: $work\n"; print "<option name=list value=$DATA{'list'}>Fax: $fax\n"; print "<option name=list value=$DATA{'list'}>URL: $website\n"; print "<option name=list value=all>All_____________________\n"; print "</select>\n"; print "<input type=hidden name=recnum value=$DATA{'list'}>\n"; print "<input type=hidden name=level value=single>\n"; &print_bottom; exit; } else{ &header; &print_top; &print_alpha; &print_bottom; } } # end list_records sub add_record{ open (FILE,">>$file"); print FILE join('|', $DATA{'name'}, $DATA{'addr1'}, $DATA{'addr2'}, $DATA{'addr3'}, $DATA{'email'}, $DATA{'phone'}, $DATA{'work'}, $DATA{'fax'}, $DATA{'website'}); print FILE "\n"; close (FILE); &header; print "<b>$DATA{'name'}</b> has been added.<p>\n"; &print_top; &print_alpha; &print_bottom; } # end add_record sub search{ $term = lc($DATA{'searchfor'}); %found = (); $count = 0; foreach $record (@records){ if (index(lc($record),$term) >=0 ){ ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$record); $found{"$count"} = $name; } $count++; } &header; &print_top; print "<select name=list size=9>\n"; @all = keys(%found); foreach $key (@all){ print "<option name=list value=$key>$found{$key}\n"; } print "<option name=list value=all>All_____________________\n"; print "</select>\n"; print "<input type=hidden name=level value=multiple>\n"; &print_bottom; } # end search sub browse{ if (not($DATA{'recnum'})){$DATA{'recnum'} = $DATA{'list'}} ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$records[$DATA{'recnum'}]); if (substr(lc($website),0,7) eq 'http://'){ print "HTTP/1.0 302 Temporary Redirection\r\n" if $ENV{PERLXS} eq "PerlIS"; print "Content-type: text/html\n"; print ("Location: $website\n\n"); } else { &list_records; } } # end browse sub edit{ if (not($DATA{'recnum'})){$DATA{'recnum'} = $DATA{'list'}} ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$records[$DATA{'recnum'}]); &header; print "<h1 align=center>Edit a Record</h1>\n"; print "<form method=post action=$scriptpath>\n"; print "<table border=0 cellspacing=4 cellpadding=4>\n"; print "<tr><td>Name:</td><td><input type=text maxlength=50 size=20 name=name value=\"$name\"></td></tr>\n"; print "<tr><td>Address 1:</td><td><input type=text maxlength=50 size=20 name=addr1 value=\"$addr1\"></td></tr>\n"; print "<tr><td>Address 2:</td><td><input type=text maxlength=50 size=20 name=addr2 value=\"$addr2\"></td></tr>\n"; print "<tr><td>City, State, Zip:</td><td><input type=text maxlength=50 size=20 name=addr3 value=\"$addr3\"></td></tr>\n"; print "<tr><td>Email:</td><td><input type=text maxlength=50 size=20 name=email value=\"$email\"></td></tr>\n"; print "<tr><td>Home Phone:</td><td><input type=text maxlength=20 size=16 name=phone value=\"$phone\"></td></tr>\n"; print "<tr><td>Work Phone:</td><td><input type=text maxlength=20 size=16 name=work value=\"$work\"></td></tr>\n"; print "<tr><td>Fax Phone:</td><td><input type=text maxlength=20 size=16 name=fax value=\"$fax\"></td></tr>\n"; print "<tr><td>Web Site:</td><td><input type=text maxlength=70 size=30 name=website value=\"$website\"></td></tr></table>\n"; print "<input type=hidden name=recnum value=$DATA{'recnum'}>\n"; print "<input type=hidden name=level value=multiple>\n"; print "<input type=hidden name=list value=$DATA{'recnum'}>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "<input type=submit value=\"Make Changes\" name=function>&nbsp;<input type=reset value=\"Void Changes\"></form>\n"; print "</body></form>\n"; } # end edit sub send_note{ if (not($DATA{'recnum'})){$DATA{'recnum'} = $DATA{'list'}} ($name,$addr1,$addr2,$addr3,$email,$phone,$work,$fax,$website)=split(/\|/,$records[$DATA{'recnum'}]); if ($email){ open( MAIL, "|$mailprog" )|| die "can't open sendmail notify: $email: $!\n"; print MAIL "To: $email\n"; print MAIL "Subject:A quick note...\n"; print MAIL "From: $user\n\n"; print MAIL " $DATA{'note'}\n\n"; close (MAIL); &header; print "Mail has been sent to $name &lt; $email &gt;<p>\n"; &print_top; &print_alpha; &print_bottom; } else { &header; print "No e-mail address specified.<p>\n"; &print_top; &print_alpha; &print_bottom; } } sub update_record{ $records[$DATA{'recnum'}] = join('|',$DATA{'name'},$DATA{'addr1'},$DATA{'addr2'},$DATA{'addr3'},$DATA{'email'},$DATA{'phone'},$DATA{'work'},$DATA{'fax'},$DATA{'website'}); open (FILE,">$file"); #flock FILE,2 print FILE "$password\n"; foreach $record (@records){ print FILE "$record\n"; } close FILE; &list_records; } sub help{ &header; print "<h2 align=center>Help</h2><blockquote>\n"; print "<input type=reset value=Display> Highlighting an item in the window and clicking this button\n"; print "will display more information. If an alpha index is highlighted (e.g. G H I) and\n"; print "<b>Display</b> is clicked, it will show all your contacts whose last names begin\n"; print "with those letters. Clicking on a particular name in that list will pull up that\n"; print "contact's full record. If you get lost, clicking on <b>Display</b> a few times\n"; print "will typically bring you back to the alphabetic index. Under most circumstances,\n"; print "you can choose <i>All</i> to display all records.<p>\n"; print "<input type=reset value=Edit> Allows you to edit the current record. The record\n"; print "is either highlighted among a list of contacts, or it's the contact in the display.<p>\n"; print "<input type=reset value=Add> Click this button to add a new contact.<P>\n"; print "<input type=reset value=Delete> Deletes the highlighted contact, or the contact\n"; print "currently displayed. Asks Yes or No for confirmation.<p>\n"; print "<input type=reset value=Browse> If the selected/displayed contact has a URL,\n"; print "<b>Browse</b> will direct your browser toward that address.<p>\n"; print "<input type=reset value=Search> Type in a term (part of a name, address or what have you)\n"; print "and <b>Search</b> will return a list of files that contain that term.<p>\n"; print "<input type=reset value=Send> Type a note in the text box. If the selected/displayed\n"; print "contact has an e-mail address, the note will be immediately sent. Note: the <b>From</b>\n"; print "field in the recipient's email will read something like <b><i>user\@this.server.com</i></b>\n"; print "where <i>user</i> is the user name you have selected. If you are the only user, it will read\n"; print "<i>webodex</i>. The subject always reads &quot;A quick note...&quot;\n"; print "<p></blockquote><center>\n"; print "<form method=post value=$scriptpath>\n"; print "<input type=hidden name=user value=$user>\n"; print "<input type=hidden name=password value=$password>\n"; print "<input type=submit name=function value=Done></center></body></html>\n"; } # end help sub header{ print "Content-type: text/html\n\n"; print "<html><head><title>Web-o-Dex</title></head><body bgcolor=#ffffff>\n"; if ($header){ open (HEADER,"$filepath/$header"); while (<HEADER>){ print $_;} close (HEADER); } } # end header