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/


Reply via email to