Cover V05, I03
Article
Figure 1
Figure 2
Figure 3
Figure 4
Listing 1
Listing 2
Listing 3
Listing 4
Listing 5
Listing 6
Listing 7
Listing 8
Sidebar 1

mar96.tar


Listing 2: The complete GUI program

#!/usr/local/bin/perl

# Generate a GUI via your Web Browser
#
# Author : Arthur Donkers
#          Le Reseau netwerksystemen BV
#          Burg. F. van Ankenweg 5
#          NL-9991 AM Middelstum
#          The Netherlands
#          arthur@reseau.nl

use Socket;

%chartab = (
'20' => ' ',
'21' => '!',
'22' => '\"',
'23' => '#',
'24' => '\$',
'25' => '%',
'26' => '\&',
'2B' => '+',
'2F' => '/'
);

sub	create_socket {

local( $sockaddr, $port, $proto, $me, $junk );

$sockaddr = 'S n a4 x8';

($junk, $junk, $port)  = getservbyname( "ontime", "tcp" );
($junk, $junk, $proto) = getprotobyname( $protoname );

$me = pack($sockaddr, &AF_INET, 1308, "\0\0\0\0");

socket( SOCK, &AF_INET, &SOCK_STREAM, $proto ) || die "socket : $!";
bind(SOCK, $me) || die "bind : $!";
}

sub	wait_connect {

listen( SOCK, 1 ) || die "listen : $!";

($addr = accept(CLIENT, SOCK)) || die "accept : $!";
}

sub	do_req {

local($request, $command, $url, $script, $arglist, $contents, $junk);
local( %extras, @postargs, $decoded, $i );

$request = <CLIENT>;
chop $request;

print LOGFILE "$request\n";

($command, $url) = split( /\s+/, $request );
($junk, $script, $arglist) = split( /\//, $url, 3 );


while( <CLIENT> ) {
last if ( /^\s+$/ );

chop;

print LOGFILE "$_\n";

if( /^Authorization:/ ) {
($junk, $extras{'authscheme'}, $extras{'authkey'}) =
split( /\s+/, $_, 3 );
}

if( /^Content-length:/ ) {
($junk, $extras{'contentlength'}) =
split( /\s+/, $_, 2 );
}

}

if( $command eq "GET" ) {
if( $script ne "" ) {
&do_script( $script, %extras );
}
else {
&do_script( "isps.pl", %extras );
}
}
elsif( $command eq "POST" ) {
$contents = <CLIENT>;
chop $contents;
print LOGFILE "$contents\n";
@postargs = split /\&/, $contents;
$i = 0;
foreach $arg (@postargs) {
$arg =~ tr/\+/ /;
$arg =~ s/\%(..)/$chartab{$1}/eg;
}
}

}

sub	do_script {

local( $script, %extras ) = @_;

if( need_authorisation( $script ) ) {
if( exists $extras{'authkey'} ) {
$good = check_authorisation( $script, $extras{'authkey'} );

if( $good ) {
select(CLIENT);
do $script;
select(STDOUT);
}
else {
&show_error( "Authorisation for $script failed\n" );
}
}
else {
&get_authorisation( "$script" );
}
}
else {
select(CLIENT);
do $script;
select(STDOUT);
}

}

sub	get_authorisation {

local( $script ) = @_;
local( $curdate );

open CURDATE, "date|";
$curdate = <CURDATE>;
close CURDATE;

print CLIENT <<EOHTML
HTTP/1.0 401 Unauthorized to access the document
Date: $curdate
Content-Type: text/html
Last-Modified: $curdate
WWW-Authenticate: Basic realm=$script

EOHTML
;

}

sub	check_authorisation {

local( $script, $key ) = @_;
local( $decoded, $user, $passwd, $crypted, $a, $b, $salt );

&decode( $key, \$decoded );
($user, $passwd) = split( /\:/, $decoded, 2 );

open AUTHLIST, "<authdb";

while( <AUTHLIST> ) {

chomp;
($a, $b) = split( /\:/, $_, 2 );

if( $a eq $script ) {
if( $b =~ /\,/ ) {
$found = grep( $_ eq $user, split( /\,/, $b ) );
}
else {
$found = $b;
}

return 0 if( $found ne $user );
last;
}
}
close AUTHLIST;

open PASSWD, "<passwd";
while( <PASSWD> ) {
chomp;
($a, $b) = split( /\:/, $_, 2 );
last if( $a eq $user );
}
close PASSWD;

chomp $passwd;
$crypted = crypt $passwd, $b;

return 1 if( $crypted eq $b );

return 0;

}

sub	need_authorisation {

local( $script ) = @_;
local( $authscript );

if( open AUTHLIST, "<authdb" ) {
while( <AUTHLIST> ) {
last if( /^\s*$/ );
chop;
chop;
($authscript, $users) = split( /\:/, $_, 2 );
if( $authscript eq $script ) {
return 1;
}
}
close AUTHLIST;
}
else {
&show_error( "cannot open need_auth, error $!\n" );
}

return 0;
}

sub	show_error {

local( $errmsg );

print STDOUT $errmsg;
}

sub	decode {

local( $input, $output ) = @_;

open DECODE, "decode $input|";
$$output = <DECODE>;
close DECODE;
}

# Start here
&create_socket( );

while( 1 ) {
&wait_connect( );
select(CLIENT);$|=1;
open LOGFILE, ">>reseaud.log";
&do_req( );
close LOGFILE;
close CLIENT;
}

# End of file