--- loncom/auth/lonauth.pm 2005/04/07 06:56:21 1.66 +++ loncom/auth/lonauth.pm 2005/11/10 19:19:08 1.71 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.66 2005/04/07 06:56:21 albertel Exp $ +# $Id: lonauth.pm,v 1.71 2005/11/10 19:19:08 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,6 +40,7 @@ use Apache::lonnet; use Apache::lonmenu(); use Fcntl qw(:flock); use Apache::lonlocal; +use POSIX qw(mktime); my %FORM; @@ -49,27 +50,47 @@ sub success { my ($r, $username, $domain, $authhost,$lowerurl) = @_; my $lonids=$r->dir_config('lonIDsDir'); + my $public=($username eq 'public' && $domain eq 'public'); + # See if old ID present, if so, remove - my $filename; - opendir(DIR,$lonids); - while ($filename=readdir(DIR)) { - if ($filename=~/^$username\_\d+\_$domain\_$authhost\.id$/) { - unlink($lonids.'/'.$filename); - } - } - closedir(DIR); + my ($filename,$cookie,$userroles); + my $now=time; -# Give them a new cookie + if ($public) { + my $max_public=100; + my $oldest; + my $oldest_time=0; + for(my $next=1;$next<=$max_public;$next++) { + if (-e $lonids."/publicuser_$next.id") { + my $mtime=(stat($lonids."/publicuser_$next.id"))[9]; + if ($mtime<$oldest_time || !$oldest_time) { + $oldest_time=$mtime; + $oldest=$next; + } + } else { + $cookie="publicuser_$next"; + last; + } + } + if (!$cookie) { $cookie="publicuser_$oldest"; } + } else { + opendir(DIR,$lonids); + while ($filename=readdir(DIR)) { + if ($filename=~/^$username\_\d+\_$domain\_$authhost\.id$/) { + unlink($lonids.'/'.$filename); + } + } + closedir(DIR); - my $cookie; - my $now=time; - $cookie="$username\_$now\_$domain\_$authhost"; +# Give them a new cookie + $cookie="$username\_$now\_$domain\_$authhost"; + # Initialize roles - my $userroles=Apache::lonnet::rolesinit($domain,$username,$authhost); - + $userroles=Apache::lonnet::rolesinit($domain,$username,$authhost); + } # ------------------------------------ Check browser type and MathML capability my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, @@ -132,12 +153,28 @@ sub success { print $idf "browser.localpath=$FORM{'localpath'}\n"; print $idf "browser.localres=$FORM{'localres'}\n"; } + print $idf "server.domain=".$r->dir_config('lonDefDomain')."\n"; + my $timezone='UTC'; + my $timediff=POSIX::mktime(localtime())-POSIX::mktime(gmtime()); + if ($timediff) { + my $hours=int($timediff/3600); + my $minutes=abs(int(($timediff-$hours*3600)/60)); + my $sign="+"; + if ($timediff<0) { + $sign="-"; + } + $timezone.=$sign.abs($hours).':'.substr("0$minutes",-2); + } + print $idf "server.timezone=$timezone\n"; print $idf "request.course.fn=\n"; print $idf "request.course.uri=\n"; print $idf "request.course.sec=\n"; print $idf "request.role=cm\n"; print $idf "request.role.adv=$env{'user.adv'}\n"; print $idf "request.host=$ENV{'REMOTE_ADDR'}\n"; + if ($public) { + print $idf "environment.remote=off\n"; + } if ($FORM{'interface'}) { $FORM{'interface'}=~s/\W//gs; print $idf "browser.interface=$FORM{'interface'}\n"; @@ -172,6 +209,8 @@ sub success { # ------------------------------------------------------------ Get cookie ready + if ($public or $lowerurl eq 'noredirect') { return $cookie; } + $cookie="lonID=$cookie; path=/"; # -------------------------------------------------------- Menu script and info my $windowinfo=&Apache::lonmenu::open($clientos); @@ -340,7 +379,7 @@ ENDFAILED $FORM{$name}=$value; } - if ((!$FORM{'uname'}) || (!$FORM{'upass'}) || (!$FORM{'udom'})) { + if ((!$FORM{'uname'}) || (!$FORM{'upass0'}) || (!$FORM{'udom'})) { failed($r,'Username, password and domain need to be specified.'); return OK; } @@ -381,14 +420,17 @@ ENDFAILED else { $cipher=new DES $keybin; } + my $upass=''; + for (my $i=0;$i<=2;$i++) { + my $chunk= + $cipher->decrypt(unpack("a8",pack("H16",substr($FORM{'upass'.$i},0,16)))); - my $upass=$cipher->decrypt( - unpack("a8",pack("H16",substr($FORM{'upass'},0,16)))); + $chunk.= + $cipher->decrypt(unpack("a8",pack("H16",substr($FORM{'upass'.$i},16,16)))); - $upass.=$cipher->decrypt( - unpack("a8",pack("H16",substr($FORM{'upass'},16,16)))); - - $upass=substr($upass,1,ord(substr($upass,0,1))); + $chunk=substr($chunk,1,ord(substr($chunk,0,1))); + $upass.=$chunk; + } # ---------------------------------------------------------------- Authenticate my $authhost=Apache::lonnet::authenticate($FORM{'uname'},