I'm using the Web Developer Server Suite - Community Edition pretty much out of the box on WindowsXP. This script worked fine on a LAMP system although I am not sure what Apache modules were loaded. I am beginning to wonder if I am missing some configuration to allow:
if (param('admin') eq "y") ERROR Software error: Undefined subroutine &main::param called at C:/www/vhosts/localhost/ cgi-bin/stafio.pl line 33. SCRIPT #!C:/www/perl/bin/perl.exe use CGI::Carp qw(fatalsToBrowser); # organizational In/Out board # configuration data require 'C:/www/perl/lib/datapath/stafio.ph'; # turn debugging output on and off with parameter #$debugging = (param('debug')) ? 1 : 0; #print header; # Do refresh and css in header as is proper #print start_html(-title=>"Staff In/Out for $Organization", #-style=>{'src'=>"C:/www/Apache22/manual/style/css/manual.css"}, #-head=>meta({-http_equiv=>'refresh',-content=>'60'}) #); # get user information into memory %users = &get_users(); if (param('admin') eq "y") { # admin interface. add/delete users if (param('apswd')) { # got a password. validate it if (param('apswd') eq $AdminPass) { # good password, check for add or delete if (param('userID')) { &put_a_user( param('userID'), param('pswd'), param('name'), param('extension'), param('location'), param('return'), param('email'), param('locstring'), param('aim')); %users = &get_users(); &display_inOut_board( %users ); } else { @val = param('delme'); foreach (@val) { $FILE = "$Datapath/$_.$Ext"; unlink( $FILE ); } %users = &get_users(); &display_inOut_board( %users ); } } else { # report invalid administrative password print <<"EOF" <H1>Invalid Password</H1> The password entered is incorrect. Use your browser's back function to try again. EOF } } else { # put up form to do something, including getting admin password &admin( ); } } else { if (param('userID')) { if (param('pswd')) { # we were sent a password, validate it and change status if (isValidPswd($users{param('userID')}{'pswd'},param('pswd'))) { # change status &put_a_user( param('userID'), $users{param('userID')}{'pswd'}, $users{param('userID')}{'name'}, $users{param('userID')}{'extension'}, param('location'), param('return'), $users{param('userID')}{'email'}, param('locstring'), $users{param('userID')}{'aim'} ); %users = &get_users(); &display_inOut_board( %users ); } else { # report invalid password print <<"EOF" <H1>Invalid Password</H1> The password entered is incorrect. Use your browser's back function to try again. EOF } } elsif (param('newpswd')) { if (param('newpswd2')) { # we've got new password, confirm and rewrite if (isValidPswd($users{param('userID')} {'pswd'},param('oldpswd'))) { # check new passwords match if (param('newpswd') eq param('newpswd2')) { # rewrite user record &put_a_user( param('userID'), param('newpswd'), param('name'), param('extension'), param('location'), param('return'), param('email'), param('aim') ); %users = &get_users(); &display_inOut_board( %users ); } else { # report mismatched new passwords print <<"EOF" <H1>Mismatched New Passwords</H1> The new passwords do not match. Use your browser's back function to try again. EOF } } else { # report invalid password print <<"EOF" <H1>Invalid Password</H1> The old password is incorrect. Use your browser's back function to try again. EOF } } else { # put up form to get a new password for the user &change_password( param('userID'), $users{param('userID')}{'pswd'}, $users{param('userID')}{'name'}, $users{param('userID')}{'extension'}, $users{param('userID')}{'location'}, $users{param('userID')}{'return'}, $users{param('userID')}{'email'}, $users{param('userID')}{'aim'} ); } } else { # no password, just a userID, so we need to put up a form # to let user change location and return &change_status(param('userID'), $users{param('userID')} {'email'}); } } else { &display_inOut_board( %users ); } } #end if (admin)...else print end_html; exit; ### subroutines ### sub admin # administration form, add/delete users { # my( ) = @_; ## Add a user print start_form(-method=>"post", -action=>"stafio.pl"); print <<"EOF"; <INPUT TYPE="hidden" NAME="admin" VALUE="y"> <INPUT TYPE="hidden" NAME="do" VALUE="add"> <TABLE> <TR><TH>Add a User</TH><TD>Admin Password:<INPUT TYPE="password" NAME="apswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> <TR><TD ALIGN=RIGHT>User ID</TD><TD><INPUT TYPE="text" NAME="userID" VALUE="$userID" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>User Name</TD><TD><INPUT TYPE="text" NAME="name" VALUE="$name" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>Phone Extension</TD><TD><INPUT TYPE="text" NAME="extension" VALUE="$extension" SIZE=10></TD></TR> <TR><TD ALIGN=RIGHT>AIM Address</TD><TD><INPUT TYPE="text" NAME="aim" VALUE="$aim" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>Email Address</TD><TD><INPUT TYPE="text" NAME="email" VALUE="$email" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>Password</TD><TD><INPUT TYPE="password" NAME="pswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> <TR><TD ALIGN=RIGHT>Location</TD><TD> <SELECT NAME="location"> EOF foreach( @Locations ) { print "<OPTION> $_\n"; } print <<"EOF"; </SELECT></TD></TR> <TR><TD ALIGN=RIGHT>Other Location Text</TD><TD><INPUT TYPE="text" NAME="locstring" VALUE="" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>Return by</TD><TD><INPUT TYPE="text" NAME="return" VALUE="" SIZE=10></TD></TR> </TABLE> <INPUT TYPE="submit" NAME="submit" VALUE=" OK "> </FORM> EOF ## Delete a user print start_form(-method=>"post", -action=>"stafio.pl"); print <<"EOF"; <INPUT TYPE="hidden" NAME="admin" VALUE="y"> <INPUT TYPE="hidden" NAME="do" VALUE="del"> <TABLE> <TR><TH>Delete</TH><TD>Admin Password:<INPUT TYPE="password" NAME="apswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> EOF foreach $usr ( sort keys %users ) { print <<"EOF"; <tr> <TD><INPUT TYPE=CHECKBOX NAME="delme" VALUE="$usr"></TD><TD> $users{$usr}{'name'}</TD> </tr> EOF } print <<"EOF"; </TABLE> <INPUT TYPE="submit" NAME="submit" VALUE=" OK "> </FORM> EOF } # end admin sub change_password # user gets a form to change password { my ($userID, $pswd, $name, $extension, $location, $return, $email, $aim) = @_; print h1("Change Password"); print start_form(-method=>"post", -action=>"stafio.pl"); print <<"EOF"; <INPUT TYPE="hidden" NAME="userID" VALUE="$userID"> <INPUT TYPE="hidden" NAME="name" VALUE="$name"> <INPUT TYPE="hidden" NAME="extension" VALUE="$extension"> <INPUT TYPE="hidden" NAME="aim" VALUE="$aim"> <INPUT TYPE="hidden" NAME="location" VALUE="$location"> <INPUT TYPE="hidden" NAME="return" VALUE="$return"> <INPUT TYPE="hidden" NAME="email" VALUE="$email"> <TABLE> <TR><TD ALIGN=RIGHT>Old Password</TD><TD><INPUT TYPE="password" NAME="oldpswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> <TR><TD ALIGN=RIGHT>New Password</TD><TD><INPUT TYPE="password" NAME="newpswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> <TR><TD ALIGN=RIGHT>Confirm Password</TD><TD><INPUT TYPE="password" NAME="newpswd2" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> </TABLE> <INPUT TYPE="submit" NAME="submit" VALUE=" OK "> </FORM> EOF } # end change_password sub change_status # user gets form to change location and/or return time { my ($userID, $email) = @_; print h1("Change Status"); print "<a href=\"stafio.pl?userID=$userID&newpswd=1\">Change Password</a>\n"; print start_form(-method=>"post", -action=>"stafio.pl"); print <<"EOF"; <INPUT TYPE="hidden" NAME="userID" VALUE="$userID"> <INPUT TYPE="hidden" NAME="email" VALUE="$email"> <TABLE> <TR><TD ALIGN=RIGHT>User</TD><TD><B>$userID<B></TD></TR> <TR><TD ALIGN=RIGHT>Password</TD><TD><INPUT TYPE="password" NAME="pswd" VALUE="" SIZE=20 MAXLENGTH=20></TD></TR> <TR><TD ALIGN=RIGHT>Location</TD><TD> <SELECT NAME="location"> EOF foreach( @Locations ) { print "<OPTION> $_\n"; } print <<"EOF" </SELECT></TD></TR> <TR><TD ALIGN=RIGHT>Other Location Text</TD><TD><INPUT TYPE="text" NAME="locstring" VALUE="" SIZE=25></TD></TR> <TR><TD ALIGN=RIGHT>Return by</TD><TD><INPUT TYPE="text" NAME="return" VALUE="" SIZE=10></TD></TR> </TABLE> <INPUT TYPE="submit" NAME="submit" VALUE=" OK "> </FORM> EOF } # end change_status sub display_inOut_board # display table of user data { my %users = @_; # # print "<meta http-equiv=\"Refresh\" content=\60\">\n"; # print "</HEAD>\n"; # # print "<center>\n"; print h1("$Organization Staff I/O Board"); # print h1("$Organization"), # h2("In / Out Board" ); print <<"EOF"; <table width="90%"> <tr> <th>Name</th> <th width=12>Extension</th> <th>Location</th> <th>Returning</th> <th>AIM</th> </tr> EOF foreach $usr ( sort keys %users ) { print <<"EOF"; <tr> <td><a href="mailto:$users{$usr}{'email'}">$users{$usr}{'name'}</ a></td> <td align=center>$users{$usr}{'extension'}</td> <td><a href="stafio.pl?userID=$usr">$users{$usr}{'location'}</a></ td> <td align=center>$users{$usr}{'return'}</td> <td align=center>$users{$usr}{'aim'}</td> </tr> EOF } # print "</table>\n"; print "<BR>\n"; print h2("<A HREF=\"http://www.xxxxxxx/\">Staff directory</A>\n"); # print "</center>\n"; } # end display_inOut_board sub get_a_user # retrieve data for one user { my( $file ) = @_; my ($userID, $pswd, $name, $extension, $loc, $time, $email, $aim); $FILE = "$Datapath/$file"; open( IN, "<$FILE" ) || &try_later(1); foreach( <IN> ) { ($userID) = ($file =~ /(.*)\.$Ext/); ($pswd, $name, $extension, $loc, $time, $email, $aim) = split( $Delim, $_ ); } close( IN ); return( $userID, $pswd, $name, $extension, $loc, $time, $email, $aim ); } # end get_a_user sub get_users # get user data into a hash of hashes, keyed on userID { my( %u ) = (); my ( @files, $file, $userID, $pswd, $name, $extension, $loc, $time, $email, $aim ); opendir DATADIR, $Datapath || &try_later(2); @files = grep /$Ext$/, readdir DATADIR; closedir DATADIR; foreach $file (@files) { ( $userID, $pswd, $name, $extension, $loc, $time, $email, $aim ) = &get_a_user( $file ); $u{$userID}{'pswd'} = $pswd; $u{$userID}{'name'} = $name; $u{$userID}{'extension'} = $extension; $u{$userID}{'location'} = $loc; $u{$userID}{'return'} = $time; $u{$userID}{'email'} = $email; $u{$userID}{'aim'} = $aim; } return( %u ); } # end get_users sub isValidPswd # validate password against userID # return 1 (true) if password is valid { my( $u, $p ) = @_; my( $return ) = 0; if ($p eq $BossPass) { $return = 1; } else { $return = ($u eq $p) ? 1 : 0; } return( $return ); } # end isValidPswd sub put_a_user # write new data for one user { my( $userID, $pswd, $name, $extension, $loc, $return, $email, $locstr, $aim ) = @_; $locstr =~ tr/ / /s; $locstr = "unknown" unless (length( $locstr ) > 1); $loc = $locstr if ($loc eq "Other"); $return = " - " unless ($return); $FILE = "$Datapath/$userID.$Ext"; open( OUT, ">$FILE") || &try_later(3); print OUT "$pswd$Delim$name$Delim$extension$Delim$loc$Delim$return $Delim$email$Delim$aim"; close( OUT ); } # end put_a_user sub try_later # minimal error handling { local($errnum) = @_; print h2("Unable to open $FILE for reading: $!") if $errnum == 1; print h2("Unable to find data files: $!") if $errnum == 2; print h2("Unable to open $FILE for writing: $!") if $errnum == 3; print h2("Please try again later."); print end_html; exit; } # end try_later -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/