diff --git a/smart.cmake b/smart.cmake index 87eb4ed..b16fd43 100644 --- a/smart.cmake +++ b/smart.cmake @@ -25,114 +25,66 @@ $redirected = 0; -$smart_version = '@MARS_NWE_VERSION@'; -$server_id = 'Server: SMArT/Perl/' . $smart_version; +$server_id = 'Server: SMArT/Perl/@MARS_NWE_VERSION@'; do( '@MARS_NWE_INSTALL_FULL_CONFDIR@/smart.conf' ) - or die "Could not load @MARS_NWE_INSTALL_FULL_CONFDIR@/smart.conf: $@ $!"; + or die "Could not load @MARS_NWE_INSTALL_FULL_CONFDIR@/smart.conf: $@ $!"; close( STDERR ); open( STDERR, '>>' . $smart_log_path ) - or die "Could not open $smart_log_path: $!"; - -select( STDERR ); $| = 1; -select( STDOUT ); $| = 1; + or die "Could not open $smart_log_path: $!"; $ENV{HOME} = '@MARS_NWE_INSTALL_FULL_CONFDIR@'; $smart_libexec_dir = '@MARS_NWE_INSTALL_FULL_LIBEXECDIR@'; $smart_libexec_dir =~ s#/*$##; -sub log_timestamp() -{ - my @t = localtime( time() ); - return sprintf( - '%04d-%02d-%02d %02d:%02d:%02d', - $t[5] + 1900, $t[4] + 1, $t[3], - $t[2], $t[1], $t[0] - ); -} - -sub log_msg( $$ ) -{ - my( $level, $msg ) = @_; - print STDERR '[' . log_timestamp() . '] [' . $level . '] [SMArT ' . $smart_version . '] ' . $msg . "\n"; -} - -sub log_info( $ ) -{ - log_msg( 'INFO', $_[0] ); -} - -sub log_error( $ ) -{ - log_msg( 'ERROR', $_[0] ); -} - -log_info( 'starting' ); -log_info( 'loaded configuration from ' . '@MARS_NWE_INSTALL_FULL_CONFDIR@/smart.conf' ); - $l = ; -if( ! defined( $l ) ) -{ - log_error( 'no request line received on stdin' ); - exit( 1 ); -} $l =~ s/[\n\r]//g; -log_info( 'request: ' . $l ); - @c = split( ' ', $l ); if( scalar( @c ) > 2 ) { - while( keys( %h ) < 15 ) # Who would ever want to send more headers??? - { - $l = ; - $l =~ s/[\n\r]//g; - if( $l eq '' ) - { last; } - $n = $l; - $n =~ s/:[^:]*$//g; - $v = $l; - $v =~ s/^[^:]*://g; - $h{$n} = $v; - } + while( keys( %h ) < 15 ) # Who would ever want to send more headers??? + { + $l = ; + $l =~ s/[\n\r]//g; + if( $l eq '' ) + { last; } + $n = $l; + $n =~ s/:[^:]*$//g; + $v = $l; + $v =~ s/^[^:]*://g; + $h{$n} = $v; + } } $c[0] = uc( $c[0] ); if( $h{Authorization} eq '' ) - { error( 401 ); } + { error( 401 ); } else { - @s = split( ' ', $h{Authorization} ); - if( $s[0] ne 'Basic' or length( $h{Authorization} ) > 80 ) # We can't be too careful, can we... - { error( 401 ); } - else - { - $s[1] =~ tr#A-Za-z0-9+/##cd; - $s[1] =~ tr#A-Za-z0-9+/# -_#; - $s[1] = pack( 'c', 32 + 0.75 * length( $s[1] ) ) . $s[1]; - $s[1] = unpack( 'u', $s[1] ); - $s[1] =~ s/[\r\n]//g; - @l = split( ':', $s[1] ); - if( $l[0] ne 'root' ) - { - log_error( 'authentication failed for non-root user ' . $l[0] ); - error( 401 ); - } + @s = split( ' ', $h{Authorization} ); + if( $s[0] ne 'Basic' or length( $h{Authorization} ) > 80 ) # We can't be too careful, can we... + { error( 401 ); } else - { - if( $x = system( $smart_check_login, @l ) ) - { - log_error( 'authentication failed for user root' ); - error( 401 ); - } - } - } + { + $s[1] =~ tr#A-Za-z0-9+/##cd; + $s[1] =~ tr#A-Za-z0-9+/# -_#; + $s[1] = pack( 'c', 32 + 0.75 * length( $s[1] ) ) . $s[1]; + $s[1] = unpack( 'u', $s[1] ); + $s[1] =~ s/[\r\n]//g; + @l = split( ':', $s[1] ); + if( $l[0] ne 'root' ) + { error( 401 ); } + else + { if( $x = system( $smart_check_login, @l ) ) + { error( 401 ); } } + } } if( $c[0] ne 'GET' ) { - error( 501 ); + error( 501 ); } @p = split( '\?', $c[1] ); @@ -142,36 +94,33 @@ $c = substr( shift( @p ), 1 ); @p = split( '&', $p[0] ); foreach $p ( @p ) { - $n = $p; - $n =~ s/=.*//; - $v = $p; - $v =~ s/.*=//; - $v =~ s/\+/ /g; - $v =~ s/%([0-9A-F][0-9A-F])/pack('c',hex($1))/gie; - $p{$n} = $v; + $n = $p; + $n =~ s/=.*//; + $v = $p; + $v =~ s/.*=//; + $v =~ s/\+/ /g; + $v =~ s/%([0-9A-F][0-9A-F])/pack('c',hex($1))/gie; + $p{$n} = $v; } @c = split( '/', $c ); if( $c[0] eq 'apply' ) { - do( $smart_libexec_dir . '/readconfig.pl' ) - or do { log_error( 'could not load readconfig.pl: ' . $@ . ' ' . $! ); error( 500 ); }; - do( $smart_libexec_dir . '/apply.pl' ) - or do { log_error( 'could not load apply.pl: ' . $@ . ' ' . $! ); error( 500 ); }; - handle_request(); - exit; + do( $smart_libexec_dir . '/readconfig.pl' ); + do( $smart_libexec_dir . '/apply.pl' ); + handle_request(); + exit; } elsif( $c[0] eq 'settings' ) { - do( $smart_libexec_dir . '/readconfig.pl' ) - or do { log_error( 'could not load readconfig.pl: ' . $@ . ' ' . $! ); error( 500 ); }; + do( $smart_libexec_dir . '/readconfig.pl' ); } drop_root(); if( $c[0] eq '' ) { - print <SMArT - - + + EOF - exit; + exit; } elsif( $c[0] eq 'static' ) { - do( $smart_libexec_dir . '/static.pl' ) - or do { log_error( 'could not load static.pl: ' . $@ . ' ' . $! ); error( 500 ); }; + do( $smart_libexec_dir . '/static.pl' ); } elsif( $c[0] eq 'settings' ) { - do( $smart_libexec_dir . '/settings.pl' ) - or do { log_error( 'could not load settings.pl: ' . $@ . ' ' . $! ); error( 500 ); }; + do( $smart_libexec_dir . '/settings.pl' ); } else { - log_error( 'unknown path ' . $c[0] ); - error( 500 ); + error( 500 ); } handle_request(); @@ -213,9 +159,9 @@ exit; sub error( $ ) { - if( $_[0] eq '401' ) - { - print < $d[0], uid => $d[2] } ); - } - return( sort( { $a->{"name"} cmp $b->{"name"} } @c ) ); + my( @c, @d, %e ); + + while( @d = getpwent ) + { + unshift( @c, { name => $d[0], uid => $d[2] } ); + } + return( sort( { $a->{"name"} cmp $b->{"name"} } @c ) ); } sub unix_grouplist() { - my( @c, @d, %e ); - - while( @d = getgrent ) - { - unshift( @c, { name => $d[0], gid => $d[2] } ); - } - return( sort( { $a->{"name"} cmp $b->{"name"} } @c ) ); + my( @c, @d, %e ); + + while( @d = getgrent ) + { + unshift( @c, { name => $d[0], gid => $d[2] } ); + } + return( sort( { $a->{"name"} cmp $b->{"name"} } @c ) ); } sub redirect( $ ) { - if( $redirected != 0 ) - { return( 0 ); } - $redirected = 1; - print < ); - close( SFILE ); - - $line =~ s/\/.*//; - return( $line ); + open( SFILE, '<' . $smart_nwclient_path ); + chomp( $line = ); + close( SFILE ); + + $line =~ s/\/.*//; + return( $line ); } sub get_bindery_password { - open( SFILE, '<' . $smart_nwclient_path ); - chomp( $line = ); - close( SFILE ); - - $line =~ s/.* //; - return( $line ); + open( SFILE, '<' . $smart_nwclient_path ); + chomp( $line = ); + close( SFILE ); + + $line =~ s/.* //; + return( $line ); } sub read_property_string { - my @x = split( "\n", `nwbpvalues -c -o $_[0] -t $_[1] -p $_[2] -S $server` ); - my( $i, $s ); - - $i = 5; - while( hex( $x[$i] ) > 0 ) - { - $s .= pack( 'c', hex( $x[$i] ) ); - $i ++; - } - - return( $s ); + my @x = split( "\n", `nwbpvalues -c -o $_[0] -t $_[1] -p $_[2] -S $server` ); + my( $i, $s ); + + $i = 5; + while( hex( $x[$i] ) > 0 ) + { + $s .= pack( 'c', hex( $x[$i] ) ); + $i ++; + } + + return( $s ); } sub read_property_list { - my @x = split( "\n", `nwbpvalues -c -o $_[0] -t $_[1] -p $_[2] -S $server` ); - my( $i, @l ); - - $i = 6; - while( $x[$i] ne '' ) - { - unshift( @l, $x[$i] ); - $i += 2; - } - - return( @l ); + my @x = split( "\n", `nwbpvalues -c -o $_[0] -t $_[1] -p $_[2] -S $server` ); + my( $i, @l ); + + $i = 6; + while( $x[$i] ne '' ) + { + unshift( @l, $x[$i] ); + $i += 2; + } + + return( @l ); } sub write_property_string { - open( FILE, '|' . 'nwbpset -S ' . $server ); - print FILE < = getpwnam( $nonroot_user ); + $< = $> = getpwnam( $nonroot_user ); }