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