[LON-CAPA-cvs] cvs: loncom /auth migrateuser.pm switchserver.pm /lonnet/perl lonnet.pm

albertel lon-capa-cvs@mail.lon-capa.org
Tue, 25 Oct 2005 19:14:33 -0000


albertel		Tue Oct 25 15:14:33 2005 EDT

  Modified files:              
    /loncom/auth	migrateuser.pm switchserver.pm 
    /loncom/lonnet/perl	lonnet.pm 
  Log:
  - migrateuser checks the input data more carefully
  - tmpput and tmpget now have lonnet implementations
  
  
  
Index: loncom/auth/migrateuser.pm
diff -u loncom/auth/migrateuser.pm:1.1 loncom/auth/migrateuser.pm:1.2
--- loncom/auth/migrateuser.pm:1.1	Mon Oct 24 17:32:42 2005
+++ loncom/auth/migrateuser.pm	Tue Oct 25 15:14:32 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Starts a user off based of an existing token.
 #
-# $Id: migrateuser.pm,v 1.1 2005/10/24 21:32:42 albertel Exp $
+# $Id: migrateuser.pm,v 1.2 2005/10/25 19:14:32 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,7 +26,7 @@
 # http://www.lon-capa.org/
 #
 
-package Apache::startuser;
+package Apache::migrateuser;
 
 use strict;
 use Apache::Constants qw(:common :http :methods);
@@ -34,13 +34,13 @@
 use Apache::lonnet;
 
 sub goto_login {
-  my ($r) = @_;
-  &Apache::loncommon::content_type($r,'text/html');
-  $r->send_http_header;
-  $r->print(<<TOLOGIN);
+    my ($r) = @_;
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->send_http_header;
+    $r->print(<<TOLOGIN);
 <html>
   <head>
-    <meta http-equiv="refresh" content="10;url=/adm/login" />
+    <meta http-equiv="refresh" content="0;url=/adm/login" />
     <title>Going to login</title>
   </head>
   <body>
@@ -52,31 +52,38 @@
   </body>
 </html>
 TOLOGIN
-    return '';
+    return OK;
 }
 
+
 sub handler {
     my ($r) = @_;
     
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['token']);
-    my $data = &Apache::lonnet::reply('tmpget:'.$env{'form.token'},
-				      $Apache::lonnet::perlvar{'lonHostID'});
-    my ($ip,$udom,$uname,$role) = split('&',$data);
-
-    if ($ip ne $ENV{'REMOTE_ADDR'} && $ip ne '127.0.0.1') {
-	#error or invalid token
-	&goto_login($r);
+    my %data = &Apache::lonnet::tmpget($env{'form.token'});
+
+    if ($data{'ip'} ne $ENV{'REMOTE_ADDR'} || !defined($data{'username'}) ||
+	!defined($data{'domain'}) ) {
+	return &goto_login($r);
+    }
+
+    &Apache::lonnet::logthis("Allowing access for $data{'username'}\@$data{'domain'} to $data{'role'}");
+    my $home=&Apache::lonnet::homeserver($data{'username'},$data{'domain'});
+    if ($home =~ /(con_lost|no_such_host)/) { return &goto_login($r); }
+
+    if (!defined($data{'role'})) {
+	&Apache::lonauth::success($r,$data{'username'},$data{'domain'},
+				  $home,'/adm/roles');
 	return OK;
     }
 
-    &Apache::lonnet::logthis("Allowing access for $uname\@$udom to $role");
-    my $home=&Apache::lonnet::homeserver($uname,$udom);
-    my $cookie=&Apache::lonauth::success($r,$uname,$udom,$home,'noredirect');
+    my $cookie=&Apache::lonauth::success($r,$data{'username'},$data{'domain'},
+					 $home,'noredirect');
     $r->header_out('Set-cookie',"lonID=$cookie; path=/");
     &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'),
 					     $cookie);
     $env{'form.selectrole'}='1';
-    $env{'form.'.$role}='1';
+    $env{'form.'.$data{'role'}}='1';
     return &Apache::lonroles::handler($r);
 }
 
Index: loncom/auth/switchserver.pm
diff -u loncom/auth/switchserver.pm:1.2 loncom/auth/switchserver.pm:1.3
--- loncom/auth/switchserver.pm:1.2	Mon Oct 24 17:35:16 2005
+++ loncom/auth/switchserver.pm	Tue Oct 25 15:14:32 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Switch Servers Handler
 #
-# $Id: switchserver.pm,v 1.2 2005/10/24 21:35:16 albertel Exp $
+# $Id: switchserver.pm,v 1.3 2005/10/25 19:14:32 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -87,7 +87,12 @@
     $windowinfo.=&Apache::lonnavmaps::close();
 # ---------------------------------------------------------------- Get handover
 
-    my $token = &Apache::lonnet::reply('tmpput:'.join('&',$ENV{'REMOTE_ADDR'},$env{'user.domain'},$env{'user.name'},$env{'form.role'}),$env{'form.otherserver'});
+    my %info=('ip'       => $ENV{'REMOTE_ADDR'},
+	      'domain'   => $env{'user.domain'},
+	      'username' => $env{'user.name'},
+	      'role'     => $env{'form.role'},
+	      'server'   => $r->dir_config('lonHostID'));
+    my $token = &Apache::lonnet::tmpput(\%info,$env{'form.otherserver'});
     my $switch='<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url=http://'.$switch_to.'/adm/migrateuser?token='.$token.'">';
     my $bodytag=&Apache::loncommon::bodytag('Switching Server ...');
 # --------------------------------------------------------------- Screen Output
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.666 loncom/lonnet/perl/lonnet.pm:1.667
--- loncom/lonnet/perl/lonnet.pm:1.666	Tue Oct 18 17:29:35 2005
+++ loncom/lonnet/perl/lonnet.pm	Tue Oct 25 15:14:33 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.666 2005/10/18 21:29:35 albertel Exp $
+# $Id: lonnet.pm,v 1.667 2005/10/25 19:14:33 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2955,6 +2955,29 @@
    return %returnhash;
 }
 
+# ------------------------------------------------------------ tmpput interface
+sub tmpput {
+    my ($storehash,$server)=@_;
+    my $items='';
+    foreach (keys(%$storehash)) {
+	$items.=&escape($_).'='.&freeze_escape($$storehash{$_}).'&';
+    }
+    $items=~s/\&$//;
+    return &reply("tmpput:$items",$server);
+}
+
+# ------------------------------------------------------------ tmpget interface
+sub tmpget {
+    my ($token)=@_;
+    my $rep=&reply("tmpget:$token",$perlvar{'lonHostID'});
+    my %returnhash;
+    foreach my $item (split(/\&/,$rep)) {
+	my ($key,$value)=split(/=/,$item);
+	$returnhash{&unescape($key)}=&thaw_unescape($value);
+    }
+    return %returnhash;
+}
+
 # ---------------------------------------------- Custom access rule evaluation
 
 sub customaccess {