Diff for /loncom/interface/createaccount.pm between versions 1.18 and 1.57

version 1.18, 2008/07/13 00:51:31 version 1.57, 2014/01/30 12:15:06
Line 39  use Apache::lonhtmlcommon; Line 39  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonauth;  use Apache::lonauth;
 use Apache::resetpw;  use Apache::resetpw;
 use Authen::Captcha;  
 use DynaLoader; # for Crypt::DES version  use DynaLoader; # for Crypt::DES version
 use Crypt::DES;  use Crypt::DES;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use HTML::Entities;  use HTML::Entities;
   
   #TODO this module needs documentation
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
Line 52  sub handler { Line 53  sub handler {
     if ($r->header_only) {      if ($r->header_only) {
         return OK;          return OK;
     }      }
       
     my $domain;      my $domain;
   
     my $sso_username = $r->subprocess_env->get('REDIRECT_SSOUserUnknown');      my $sso_username = $r->subprocess_env->get('SSOUserUnknown');
     my $sso_domain = $r->subprocess_env->get('REDIRECT_SSOUserDomain');      my $sso_domain = $r->subprocess_env->get('SSOUserDomain');
   
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['token','courseid','domain']);
       &Apache::lonacc::get_posted_cgi($r);
       &Apache::lonlocal::get_language_handle($r);
   
     if ($sso_username ne '' && $sso_domain ne '') {      if ($sso_username ne '' && $sso_domain ne '') {
         $domain = $sso_domain;           $domain = $sso_domain; 
     } else {       } else {
         $domain = &Apache::lonnet::default_login_domain();          ($domain, undef) = Apache::lonnet::is_course($env{'form.courseid'});
           unless ($domain) {
               if ($env{'form.phase'} =~ /^username_(activation|validation)$/) {
                   if (($env{'form.udom'} =~ /^$match_domain$/) &&
                       (&Apache::lonnet::domain($env{'form.udom'}) ne '')) {
                       $domain = $env{'form.udom'};
                   } else {
                       $domain = &Apache::lonnet::default_login_domain();
                   }
               } elsif (($env{'form.phase'} eq '') &&
                        ($env{'form.domain'} =~ /^$match_domain$/) &&
                        (&Apache::lonnet::domain($env{'form.domain'}) ne '')) {
                   $domain = $env{'form.domain'};
               } else {
                   $domain = &Apache::lonnet::default_login_domain();
               }
           }
     }      }
     my $domdesc = &Apache::lonnet::domain($domain,'description');      my $domdesc = &Apache::lonnet::domain($domain,'description');
     my $contact_name = &mt('LON-CAPA helpdesk');      my $contact_name = &mt('LON-CAPA helpdesk');
Line 74  sub handler { Line 96  sub handler {
     my $include = $r->dir_config('lonIncludes');      my $include = $r->dir_config('lonIncludes');
     my $start_page;      my $start_page;
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['token','courseid']);  
     &Apache::lonacc::get_posted_cgi($r);  
     &Apache::lonlocal::get_language_handle($r);  
   
     my $handle = &Apache::lonnet::check_for_valid_session($r);      my $handle = &Apache::lonnet::check_for_valid_session($r);
     if ($handle ne '') {      if (($handle ne '') && ($handle !~ /^publicuser_\d+$/)) {
         $start_page =          $start_page =
             &Apache::loncommon::start_page('Already logged in');              &Apache::loncommon::start_page('Already logged in');
         my $end_page =          my $end_page =
             &Apache::loncommon::end_page();              &Apache::loncommon::end_page();
         $r->print($start_page."\n".'<h2>'.&mt('You are already logged in').'</h2>'.          $r->print($start_page."\n".'<h2>'.&mt('You are already logged in').'</h2>'.
                   '<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]logout[_4].','<a href="/adm/roles">','</a>','<a href="/adm/logout">','</a>').                    '<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].','<a href="/adm/roles">','</a>','<a href="/adm/logout">','</a>').
                   '</p><p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'.$end_page);                    '</p><p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'.$end_page);
        return OK;          return OK;
     }      }
     $start_page =  
         &Apache::loncommon::start_page('Create a user account in LON-CAPA','',      my ($js,$courseid,$title);
                                        {'no_inline_link'   => 1,});      $courseid = Apache::lonnet::is_course($env{'form.courseid'});
     if ($env{'form.phase'} eq 'username_activation') {      if ($courseid ne '') {
           $js = &catreturn_js();
           $title = 'Self-enroll in a LON-CAPA course';
       } else {
           $title = 'Create a user account in LON-CAPA';
       }
       if ($env{'form.phase'} eq 'selfenroll_login') {
           $title = 'Self-enroll in a LON-CAPA course';
         if ($env{'form.udom'} ne '') {          if ($env{'form.udom'} ne '') {
             $domain = $env{'form.udom'};              $domain = $env{'form.udom'};
         }          }
     }  
     my @cancreate;          my %domconfig = 
     my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);              &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
     if (ref($domconfig{'usercreation'}) eq 'HASH') {          my ($cancreate,$statustocreate) = 
         if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {              &get_creation_controls($domain,$domconfig{'usercreation'});
             if (ref($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}) eq 'ARRAY') {  
                 @cancreate = @{$domconfig{'usercreation'}{'cancreate'}{'selfcreate'}};          my ($result,$output) =
             } elsif (($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') &&              &username_validation($r,$env{'form.uname'},$domain,$domdesc,
                      ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne '')) {                                   $contact_name,$contact_email,$courseid,
                 @cancreate = ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'});                                   $lonhost,$statustocreate);
             }          if ($result eq 'existingaccount') {
               $r->print($output);
               &print_footer($r);
               return OK;
           } else {
               $start_page = &Apache::loncommon::start_page($title,$js); 
               &print_header($r,$start_page,$courseid);
               $r->print($output);
               &print_footer($r);    
               return OK;
         }          }
     }      }
       $start_page = &Apache::loncommon::start_page($title,$js);
   
     if (@cancreate == 0) {      my %domconfig = 
         &print_header($r,$start_page);          &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
       my ($cancreate,$statustocreate) = &get_creation_controls($domain,$domconfig{'usercreation'});
       if (@{$cancreate} == 0) {
           &print_header($r,$start_page,$courseid);
         my $output = '<h3>'.&mt('Account creation unavailable').'</h3>'.          my $output = '<h3>'.&mt('Account creation unavailable').'</h3>'.
                      '<span class="LC_warning">'.                       '<span class="LC_warning">'.
                      &mt('Creation of a new user account using an e-mail address or an institutional log-in ID as username is not permitted at this institution ([_1]).',$domdesc).'</span><br /><br />';                       &mt('Creation of a new user account using an e-mail address or an institutional log-in ID as username is not permitted at this institution ([_1]).',$domdesc).'</span><br /><br />';
         $r->print($output);          $r->print($output);
         $r->print(&Apache::loncommon::end_page());          &print_footer($r);
         return OK;          return OK;
     }      }
   
     my $courseid;  
     if (defined($env{'form.courseid'})) {  
         $courseid = &validate_course($env{'form.courseid'});  
     }  
   
     if ($sso_username ne '') {      if ($sso_username ne '') {
         &print_header($r,$start_page);          &print_header($r,$start_page,$courseid);
         my ($msg,$sso_logout);          my ($msg,$sso_logout);
         $sso_logout = &sso_logout_frag($r,$domain);          $sso_logout = &sso_logout_frag($r,$domain);
         if (grep(/^sso$/,@cancreate)) {          if (grep(/^sso$/,@{$cancreate})) {
             $msg = '<h3>'.&mt('Account creation').'</h3>'.              $msg = '<h3>'.&mt('Account creation').'</h3>'.
                    &mt("Although your username and password were authenticated by your institution's Single Sign On system, you do not currently have a LON-CAPA account at this institution.").'<br />';                     &mt("Although your username and password were authenticated by your institution's Single Sign On system, you do not currently have a LON-CAPA account at this institution.").'<br />';
   
             $msg .= &username_check($sso_username,$domain,$domdesc,$courseid,               $msg .= &username_check($sso_username,$domain,$domdesc,$courseid, 
                                     $lonhost,$contact_email,$contact_name,$sso_logout);                                      $lonhost,$contact_email,$contact_name,
                                       $sso_logout,$statustocreate);
         } else {          } else {
             $msg = '<h3>'.&mt('Account creation unavailable').'</h3>'.              $msg = '<h3>'.&mt('Account creation unavailable').'</h3>'.
                    '<span class="LC_warning">'.&mt("Although your username and password were authenticated by your institution's Single Sign On system, you do not currently have a LON-CAPA account at this institution, and you are not permitted to create one.").'</span><br /><br />'.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email).'<hr />'.                     '<span class="LC_warning">'.&mt("Although your username and password were authenticated by your institution's Single Sign On system, you do not currently have a LON-CAPA account at this institution, and you are not permitted to create one.").'</span><br /><br />'.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email).'<hr />'.
                    $sso_logout;                     $sso_logout;
         }          }
         $r->print($msg);          $r->print($msg);
         $r->print(&Apache::loncommon::end_page());          &print_footer($r);
         return OK;          return OK;
     }      }
   
Line 156  sub handler { Line 190  sub handler {
                 return OK;                  return OK;
             } else {              } else {
                 $r->print($output);                  $r->print($output);
                 $r->print(&Apache::loncommon::end_page());                  &print_footer($r);
                 return OK;                  return OK;
             }              }
         } else {          } else {
             &print_header($r,$start_page);              &print_header($r,$start_page,$courseid);
             $r->print($output);              $r->print($output);
             $r->print(&Apache::loncommon::end_page());              &print_footer($r);
             return OK;              return OK;
         }          }
     }      }
Line 170  sub handler { Line 204  sub handler {
     if ($env{'form.phase'} eq 'username_activation') {      if ($env{'form.phase'} eq 'username_activation') {
         (my $result,$output,$nostart) =           (my $result,$output,$nostart) = 
             &username_activation($r,$env{'form.uname'},$domain,$domdesc,              &username_activation($r,$env{'form.uname'},$domain,$domdesc,
                                  $lonhost,$courseid);                                   $courseid);
         if ($result eq 'ok') {          if ($result eq 'ok') {
             if ($nostart) {              if ($nostart) {
                 return OK;                  return OK;
             }              }
         }          }
         &print_header($r,$start_page);          &print_header($r,$start_page,$courseid);
         $r->print($output);          $r->print($output);
         $r->print(&Apache::loncommon::end_page());          &print_footer($r);
         return OK;          return OK;
     }      } elsif ($env{'form.phase'} eq 'username_validation') { 
           (my $result,$output) = 
     &print_header($r,$start_page);              &username_validation($r,$env{'form.uname'},$domain,$domdesc,
     if ($env{'form.create_with_email'}) {                                   $contact_name,$contact_email,$courseid,
                                    $lonhost,$statustocreate);
           if ($result eq 'existingaccount') {
               $r->print($output);
               &print_footer($r);
               return OK;
           } else {
               &print_header($r,$start_page,$courseid);
           }
       } elsif ($env{'form.create_with_email'}) {
           &print_header($r,$start_page,$courseid);
         $output = &process_email_request($env{'form.useremail'},$domain,$domdesc,          $output = &process_email_request($env{'form.useremail'},$domain,$domdesc,
                                          $contact_name,$contact_email,\@cancreate,                                           $contact_name,$contact_email,$cancreate,
                                          $lonhost,$domconfig{'usercreation'},                                           $lonhost,$domconfig{'usercreation'},
                                          $courseid);                                           $courseid);
     } elsif ($env{'form.phase'} eq 'username_validation') {  
         $output = &username_validation($env{'form.uname'},$domain,$domdesc,  
                                        $contact_name,$contact_email,$courseid,  
                                        $lonhost);  
     } elsif (!$token) {      } elsif (!$token) {
           &print_header($r,$start_page,$courseid);
         my $now=time;          my $now=time;
         if (grep(/^login$/,@cancreate)) {          if (grep(/^login$/,@{$cancreate})) {
             my $jsh=Apache::File->new($include."/londes.js");              my $jsh=Apache::File->new($include."/londes.js");
             $r->print(<$jsh>);              $r->print(<$jsh>);
             $r->print(&javascript_setforms($now));              $r->print(&javascript_setforms($now));
         }          }
         if (grep(/^email$/,@cancreate)) {          if (grep(/^email$/,@{$cancreate})) {
             $r->print(&javascript_validmail());              $r->print(&javascript_validmail());
         }          }
         $output = &print_username_form($domain,$domdesc,\@cancreate,$now,$lonhost,          $output = &print_username_form($domain,$domdesc,$cancreate,$now,$lonhost,
                                        $courseid);                                          $courseid);
     }      }
     $r->print($output);      $r->print($output);
     $r->print(&Apache::loncommon::end_page());      &print_footer($r);
     return OK;      return OK;
 }  }
   
 sub print_header {  sub print_header {
     my ($r,$start_page) = @_;      my ($r,$start_page,$courseid) = @_;
     $r->print($start_page);      $r->print($start_page);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
       if ($courseid ne '') {
           my %coursehash = &Apache::lonnet::coursedescription($courseid);
           &selfenroll_crumbs($r,$courseid,$coursehash{'description'});
       }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"/adm/createuser",      ({href=>"/adm/createuser",
       text=>"New username"});        text=>"New username"});
Line 221  sub print_header { Line 266  sub print_header {
     return;      return;
 }  }
   
 sub validate_course {  sub print_footer {
     my ($courseid) = @_;      my ($r) = @_;
     my ($cdom,$cnum) = ($courseid =~ /^($match_domain)_($match_courseid)$/);      if ($env{'form.courseid'} ne '') {
     if (($cdom ne '') && ($cnum ne '')) {          $r->print('<form name="backupcrumbs" method="post" action="">'.
         if (&Apache::lonnet::is_course($cdom,$cnum)) {                    &Apache::lonhtmlcommon::echo_form_input(['backto','logtoken',
             return ($courseid);                        'token','serverid','uname','upass','phase','create_with_email',
         }                        'code','useremail','crypt','cfirstname','clastname',
                         'cmiddlename','cgeneration','cpermanentemail','cid']).
                     '</form>');
     }      }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub selfenroll_crumbs {
       my ($r,$courseid,$desc) = @_;
       &Apache::lonhtmlcommon::add_breadcrumb
            ({href=>"javascript:ToCatalog('backupcrumbs','')",
              text=>"Course/Community Catalog"});
       if ($env{'form.coursenum'} ne '') {
           &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:ToCatalog('backupcrumbs','details')",
               text=>"Course details"});
       }
       my $last_crumb;
       if ($desc ne '') {
           $last_crumb = &mt('Self-enroll in [_1]',"<span class='LC_cusr_emph'>$desc</span>");
       } else {
           $last_crumb = &mt('Self-enroll');
       }
       &Apache::lonhtmlcommon::add_breadcrumb
                      ({href=>"javascript:ToSelfenroll('backupcrumbs')",
                        text=>$last_crumb,
                        no_mt=>"1"});
     return;      return;
 }  }
   
 sub javascript_setforms {  sub javascript_setforms {
     my ($now) =  @_;      my ($now) =  @_;
     my $js = <<ENDSCRIPT;      my $js = <<ENDSCRIPT;
  <script language="JavaScript">   <script type="text/javascript" language="JavaScript">
     function send() {      function send() {
         this.document.server.elements.uname.value = this.document.client.elements.uname.value;          this.document.server.elements.uname.value = this.document.client.elements.uname.value;
           this.document.server.elements.udom.value = this.document.client.elements.udom.value;
         uextkey=this.document.client.elements.uextkey.value;          uextkey=this.document.client.elements.uextkey.value;
         lextkey=this.document.client.elements.lextkey.value;          lextkey=this.document.client.elements.lextkey.value;
         initkeys();          initkeys();
Line 268  sub javascript_checkpass { Line 339  sub javascript_checkpass {
         var upasscheck = this.document.client.elements.upasscheck$now.value;          var upasscheck = this.document.client.elements.upasscheck$now.value;
         if (upass == '') {          if (upass == '') {
             alert("$nopass");              alert("$nopass");
             return;              return false;
         }          }
         if (upass == upasscheck) {          if (upass == upasscheck) {
             this.document.client.elements.upasscheck$now.value='';              this.document.client.elements.upasscheck$now.value='';
             send();              send();
             return;              return false;
         } else {          } else {
             alert("$mismatchpass");              alert("$mismatchpass");
             return;              return false;
         }           }
     }      }
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
Line 310  sub print_username_form { Line 381  sub print_username_form {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                          unam => 'username',                                           unam => 'username',
                                          udom => 'domain',                                           udom => 'domain',
                                          uemail => 'Email address in LON-CAPA',                                           uemail => 'E-mail address in LON-CAPA',
                                          proc => 'Proceed');                                           proc => 'Proceed');
     my $output;      my $output;
     if (ref($cancreate) eq 'ARRAY') {      if (ref($cancreate) eq 'ARRAY') {
Line 318  sub print_username_form { Line 389  sub print_username_form {
             my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);              my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
             if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {              if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {
                 $output = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by this institution').'</h3>';                  $output = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by this institution').'</h3>';
                 $output .= &mt('If you already have a log-in ID at this institution,[_1] you may be able to use it for LON-CAPA.','<br />').'<br /><br />'.&mt('Type in your log-in ID and password to find out.').'<br /><br />';  
                 my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();  
                 my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);  
                 my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',  
                                                    $lonhost);  
                 $output .= &serverform($logtoken,$lonhost,undef,$courseid);  
                 my $unameform = '<input type="text" name="uname" size="10" value="" />';  
                 my $upassform = '<input type="password" name="upass'.$now.'" size="10" />';  
                 my $submit_text = &mt('Create LON-CAPA account');                  my $submit_text = &mt('Create LON-CAPA account');
                 $output .= '<form name="client" method="post" action="/adm/createaccount">'."\n".                   $output .= &mt('If you already have a log-in ID at this institution,[_1] you may be able to use it for LON-CAPA.','<br />').'<br /><br />'.&mt('Type in your log-in ID and password to find out.').'<br /><br />';
                            &Apache::lonhtmlcommon::start_pick_box()."\n".                  $output .= &login_box($now,$lonhost,$courseid,$submit_text,
                            &Apache::lonhtmlcommon::row_title(&mt('Log-in ID'),                                        $domain,'createaccount').'</div>';
                                                         'LC_pick_box_title')."\n".  
                            $unameform."\n".  
                            &Apache::lonhtmlcommon::row_closure(1)."\n".  
                            &Apache::lonhtmlcommon::row_title(&mt('Password'),  
                                                         'LC_pick_box_title')."\n".  
                            $upassform."\n".'<br /><br />'."\n".  
                            '<input type="button" name="username_validation" value="'.  
                            $submit_text.'" onclick="javascript:send()" />'."\n".   
                            &Apache::lonhtmlcommon::row_closure(1)."\n".  
                            &Apache::lonhtmlcommon::end_pick_box().'<br /><br />'."\n".  
                            '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".  
                            '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".  
                            '</form></div>';  
             }              }
         }          }
         if (grep(/^email$/,@{$cancreate})) {          if (grep(/^email$/,@{$cancreate})) {
             $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';              $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';
             if (grep(/^login$/,@{$cancreate})) {              my ($captchaform,$error) = &Apache::loncommon::captcha_display('usercreation',$lonhost);
                 $output .= &mt('Provide your e-mail address to request a LON-CAPA account,[_1] if you do not have a log-in ID at your institution.','<br />').'<br /><br />';              if ($error) {
                   my $helpdesk = '/adm/helpdesk?origurl=%2fadm%2fcreateaccount';
                   if ($courseid ne '') {
                       $helpdesk .= '&courseid='.$courseid;
                   }
                   $output .= '<span class="LC_error">'.&mt('An error occurred generating the validation code[_1] required for an e-mail address to be used as username.','<br />').'</span><br /><br />'.&mt('[_1]Contact the helpdesk[_2] or [_3]reload[_2] the page and try again.','<a href="'.$helpdesk.'">','</a>','<a href="javascript:window.location.reload()">');
             } else {              } else {
                 $output .= '<br />';                  my $submit_text = &mt('Request LON-CAPA account');
             }                  my $emailform = '<input type="text" name="useremail" size="25" value="" />';
             my $emailform = '<input type="text" name="useremail" size="25" value="" />';                  if (grep(/^login$/,@{$cancreate})) {
             my $captchaform = &create_captcha();                      $output .= &mt('Provide your e-mail address to request a LON-CAPA account,[_1] if you do not have a log-in ID at your institution.','<br />').'<br /><br />';
             my $submit_text = &mt('Request LON-CAPA account');                  } else {
             $output .=  '<form name="createaccount" method="post" onSubmit="return validate_email()" action="/adm/createaccount">'.                      $output .= '<br />';
                         &Apache::lonhtmlcommon::start_pick_box()."\n".                  }
                         &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),                  $output .=  '<form name="createaccount" method="post" onsubmit="return validate_email()" action="/adm/createaccount">'.
                                                          'LC_pick_box_title')."\n".                              &Apache::lonhtmlcommon::start_pick_box()."\n".
                         $emailform."\n".                              &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),
                         &Apache::lonhtmlcommon::row_closure(1).                                                                'LC_pick_box_title')."\n".
                         &Apache::lonhtmlcommon::row_title(&mt('Validation'),                              $emailform."\n";
                                                          'LC_pick_box_title')."\n".                  if ($captchaform) {
                         $captchaform."\n".'<br /><br />';                      $output .= &Apache::lonhtmlcommon::row_closure(1).
             if ($courseid ne '') {                                 &Apache::lonhtmlcommon::row_title(&mt('Validation'),
                 $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";                                                                    'LC_pick_box_title')."\n".
                                  $captchaform."\n".'<br /><br />';
                   }
                   if ($courseid ne '') {
                       $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n"; 
                   }
                   $output .=  &Apache::lonhtmlcommon::row_closure(1).
                               &Apache::lonhtmlcommon::row_title().'<br />'.
                               '<input type="submit" name="create_with_email" value="'. 
                               $submit_text.'" />'.
                               &Apache::lonhtmlcommon::row_closure(1).
                               &Apache::lonhtmlcommon::end_pick_box().'<br /><br />';
                   if ($courseid ne '') {
                       $output .= &Apache::lonhtmlcommon::echo_form_input(['courseid']);
                   }
                   $output .= '</form>';
             }              }
             $output .= '<input type="submit" name="create_with_email" value="'.               $output .= '</div>';
                         $submit_text.'" />'.  
                         &Apache::lonhtmlcommon::row_closure(1).  
                         &Apache::lonhtmlcommon::end_pick_box().'<br /><br /></form>'.  
                         '</div>';  
         }          }
     }      }
     if ($output eq '') {      if ($output eq '') {
Line 382  sub print_username_form { Line 448  sub print_username_form {
     return $output;      return $output;
 }  }
   
   sub login_box {
       my ($now,$lonhost,$courseid,$submit_text,$domain,$context) = @_;
       my $output;
       my %titles = &Apache::lonlocal::texthash(
                                                 createaccount => 'Log-in ID',
                                                 selfenroll    => 'Username',
                                               );
       my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
       my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
       my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount:createaccount',
                                          $lonhost);
       $output = &serverform($logtoken,$lonhost,undef,$courseid,$context);
       my $unameform = '<input type="text" name="uname" size="20" value="" />';
       my $upassform = '<input type="password" name="upass'.$now.'" size="20" />';
       $output .= '<form name="client" method="post" action="" onsubmit="return(send());">'."\n".
                  &Apache::lonhtmlcommon::start_pick_box()."\n".
                  &Apache::lonhtmlcommon::row_title($titles{$context},
                                                    'LC_pick_box_title')."\n".
                  $unameform."\n".
                  &Apache::lonhtmlcommon::row_closure(1)."\n".
                  &Apache::lonhtmlcommon::row_title(&mt('Password'),
                                                   'LC_pick_box_title')."\n".
                  $upassform;
       if ($context eq 'selfenroll') {
           my $udomform = '<input type="text" name="udom" size="10" value="'.
                           $domain.'" />';
           $output .= &Apache::lonhtmlcommon::row_closure(1)."\n".
                      &Apache::lonhtmlcommon::row_title(&mt('Domain'),
                                                        'LC_pick_box_title')."\n".
                      $udomform."\n";
       } else {
           $output .= '<input type="hidden" name="udom" value="'.$domain.'" />';
       }
       $output .= &Apache::lonhtmlcommon::row_closure(1).
                  &Apache::lonhtmlcommon::row_title().
                  '<br /><input type="submit" name="username_validation" value="'.
                  $submit_text.'" />'."\n";
       if ($context eq 'selfenroll') {
           $output .= '<br /><br /><table width="100%"><tr><td align="right">'.
                      '<span class="LC_fontsize_medium">'.
                      '<a href="/adm/resetpw">'.&mt('Forgot password?').'</a>'.
                      '</span></td></tr></table>'."\n";
       }
       $output .= &Apache::lonhtmlcommon::row_closure(1)."\n".
                  &Apache::lonhtmlcommon::end_pick_box().'<br />'."\n";
       $output .= '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".
                  '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".
                  '</form>';
       return $output;
   }
   
 sub process_email_request {  sub process_email_request {
     my ($useremail,$domain,$domdesc,$contact_name,$contact_email,$cancreate,      my ($useremail,$domain,$domdesc,$contact_name,$contact_email,$cancreate,
         $server,$settings,$courseid) = @_;          $server,$settings,$courseid) = @_;
     my $useremail = $env{'form.useremail'};      $useremail = $env{'form.useremail'};
     my $output;      my $output;
     if (ref($cancreate) eq 'ARRAY') {      if (ref($cancreate) eq 'ARRAY') {
         if (!grep(/^email$/,@{$cancreate})) {          if (!grep(/^email$/,@{$cancreate})) {
Line 403  sub process_email_request { Line 520  sub process_email_request {
                                          $contact_name,$contact_email);                                           $contact_name,$contact_email);
                 return $output;                  return $output;
             } else {              } else {
                 my $code = $env{'form.code'};                  my ($captcha_chk,$captcha_error) = &Apache::loncommon::captcha_response('usercreation',$server);
                 my $md5sum = $env{'form.crypt'};  
                 my %captcha_params = &captcha_settings();  
                 my $captcha = Authen::Captcha->new(  
                                   output_folder => $captcha_params{'output_dir'},  
                                   data_folder   => $captcha_params{'db_dir'},  
                                  );  
                 my $captcha_chk = $captcha->check_code($code,$md5sum);  
                 my %captcha_hash = (  
                                   0       => 'Code not checked (file error)',  
                                   -1      => 'Failed: code expired',  
                                   -2      => 'Failed: invalid code (not in database)',  
                                   -3      => 'Failed: invalid code (code does not match crypt)',  
                                    );  
                 if ($captcha_chk != 1) {                  if ($captcha_chk != 1) {
                     $output = &invalid_state('captcha',$domdesc,$contact_name,                      $output = &invalid_state('captcha',$domdesc,$contact_name,
                                              $contact_email,$captcha_hash{$captcha_chk});                                               $contact_email,$captcha_error);
                     return $output;                      return $output;
                 }                  }
                 my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);  
                 my $uhome=&Apache::lonnet::homeserver($useremail,$domain);                  my $uhome=&Apache::lonnet::homeserver($useremail,$domain);
                 if ($uhome eq 'no_host') {                  if ($uhome eq 'no_host') {
                     my $checkhash;                      my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);
                     my $checks = { 'username' => 1 };                      &call_rulecheck($useremail,$domain,\%alerts,\%rulematch,
                     $checkhash->{$useremail.':'.$domain} = { 'newuser' => 1, };                                      \%inst_results,\%curr_rules,\%got_rules,'username');
                     &Apache::loncommon::user_rule_check($checkhash,$checks,                      if (ref($alerts{'username'}) eq 'HASH') {
                           \%alerts,\%rulematch,\%inst_results,\%curr_rules,                          if (ref($alerts{'username'}{$domain}) eq 'HASH') {
                           \%got_rules);  
                     if (ref($alerts{'useremail'}) eq 'HASH') {  
                         if (ref($alerts{'useremail'}{$domain}) eq 'HASH') {  
                             if ($alerts{'username'}{$domain}{$useremail}) {                              if ($alerts{'username'}{$domain}{$useremail}) {
                                 $output = &invalid_state('userrules',$domdesc,                                  $output = &invalid_state('userrules',$domdesc,
                                                          $contact_name,$contact_email);                                                           $contact_name,$contact_email);
Line 457  sub process_email_request { Line 557  sub process_email_request {
     return $output;      return $output;
 }  }
   
   sub call_rulecheck {
       my ($uname,$udom,$alerts,$rulematch,$inst_results,$curr_rules,
           $got_rules,$tocheck) = @_;
       my ($checkhash,$checks);
       $checkhash->{$uname.':'.$udom} = { 'newuser' => 1, };
       if ($tocheck eq 'username') {
           $checks = { 'username' => 1 };
       }
       &Apache::loncommon::user_rule_check($checkhash,$checks,
              $alerts,$rulematch,$inst_results,$curr_rules,
              $got_rules);
       return;
   }
   
 sub send_token {  sub send_token {
     my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid) = @_;      my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid) = @_;
     my $msg = '<h3>'.&mt('Account creation status').'</h3>'.      my $msg = '<h3>'.&mt('Account creation status').'</h3>'.
Line 468  sub send_token { Line 582  sub send_token {
                 'domain'     => $domain,                  'domain'     => $domain,
                 'username'   => $email,                  'username'   => $email,
                 'courseid'   => $courseid);                  'courseid'   => $courseid);
     my $token = &Apache::lonnet::tmpput(\%info,$server);      my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');
     if ($token !~ /^error/ && $token ne 'no_such_host') {      if ($token !~ /^error/ && $token ne 'no_such_host') {
         my $esc_token = &escape($token);          my $esc_token = &escape($token);
         my $mailmsg = &mt('A request was submitted on [_1] for creation of a LON-CAPA account at the following institution: [_2].',localtime(time),$domdesc).' '.          my $showtime = localtime(time);
              &mt('To complete this process please open a web browser and enter the following'          my $mailmsg = &mt('A request was submitted on [_1] for creation of a LON-CAPA account at the following institution: [_2].',$showtime,$domdesc).' '.
                 .' URL in the address/location box: [_1]'               &mt('To complete this process please open a web browser and enter the following URL in the address/location box: [_1]',
                 ,&Apache::lonnet::absolute_url().'/adm/createaccount?token='.$esc_token);                   &Apache::lonnet::absolute_url().'/adm/createaccount?token='.$esc_token);
         my $result = &Apache::resetpw::send_mail($domdesc,$email,$mailmsg,$contact_name,          my $result = &Apache::resetpw::send_mail($domdesc,$email,$mailmsg,$contact_name,
                                                  $contact_email);                                                   $contact_email);
         if ($result eq 'ok') {          if ($result eq 'ok') {
Line 509  sub process_mailtoken { Line 623  sub process_mailtoken {
         ($data{'username'}  =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/)) {          ($data{'username'}  =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/)) {
         if ($now - $data{'time'} < 7200) {          if ($now - $data{'time'} < 7200) {
             if ($env{'form.phase'} eq 'createaccount') {              if ($env{'form.phase'} eq 'createaccount') {
                 my ($result,$output) = &create_account($r,$domain,$lonhost,                  my ($result,$output,$uhome) = 
                                                        $data{'username'},$domdesc);                      &create_account($r,$domain,$data{'username'},$domdesc);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     $msg = $output;                       $msg = $output; 
                     my $shownow = &Apache::lonlocal::locallocaltime($now);                      my $shownow = &Apache::lonlocal::locallocaltime($now);
                     my $mailmsg = &mt('A LON-CAPA account for the institution: [_1] has been created [_2] from IP address: [_3].  If you did not perform this action or authorize it, please contact the [_4] ([_5]).',$domdesc,$shownow,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n";                      my $mailmsg = &mt('A LON-CAPA account for the institution: [_1] has been created [_2] from IP address: [_3]. If you did not perform this action or authorize it, please contact the [_4] ([_5]).',$domdesc,$shownow,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n";
                     my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},                      my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},
                                                                  $mailmsg,$contact_name,                                                                   $mailmsg,$contact_name,
                                                                  $contact_email);                                                                   $contact_email);
Line 523  sub process_mailtoken { Line 637  sub process_mailtoken {
                     } else {                      } else {
                         $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});                          $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});
                     }                      }
                     my %form = &start_session($r,$data{'username'},$domain,                       &start_session($r,$data{'username'},$domain,$uhome,
                                               $lonhost,$data{'courseid'},                                     $data{'courseid'},$token);
                                               $token);  
                     $nostart = 1;                      $nostart = 1;
                     $noend = 1;                      $noend = 1;
                 } else {                  } else {
Line 552  sub process_mailtoken { Line 665  sub process_mailtoken {
 }  }
   
 sub start_session {  sub start_session {
     my ($r,$username,$domain,$lonhost,$courseid,$token) = @_;      my ($r,$username,$domain,$uhome,$courseid,$token) = @_;
     my %form = (  
                 uname => $username,  
                 udom  => $domain,  
                );  
     my $firsturl = '/adm/roles';  
     if (defined($courseid)) {  
         $courseid = &validate_course($courseid);  
         if ($courseid ne '') {  
             $form{'courseid'} = $courseid;  
             $firsturl = '/adm/selfenroll?cid='.$courseid;  
         }  
     }  
     if ($r->dir_config('lonBalancer') eq 'yes') {      if ($r->dir_config('lonBalancer') eq 'yes') {
         &Apache::lonauth::success($r,$form{'uname'},$form{'udom'},          Apache::lonauth::success($r, $username, $domain, $uhome,
                                   $lonhost,'noredirect',undef,\%form);              'noredirect', undef, {});
         my $delete = &Apache::lonnet::tmpdel($token);  
           Apache::lonnet::tmpdel($token) if $token;
   
         $r->internal_redirect('/adm/switchserver');          $r->internal_redirect('/adm/switchserver');
     } else {      } else {
         &Apache::lonauth::success($r,$form{'uname'},$form{'udom'},          $courseid = Apache::lonnet::is_course($courseid); 
                                   $lonhost,$firsturl,undef,\%form);  
           Apache::lonauth::success($r, $username, $domain, $uhome,
               ($courseid ? "/adm/selfenroll?courseid=$courseid" : '/adm/roles'),
               undef, {}); 
     }      }
     return %form;  
 }  
   
       return;
   }
   
   #
   # The screen that the user gets to create his or her account
   # Desired username, desired password, etc
   # Stores token to store DES-key and stage during creation session
   #
 sub print_dataentry_form {  sub print_dataentry_form {
     my ($r,$domain,$lonhost,$include,$mailtoken,$now,$username,$start_page) = @_;      my ($r,$domain,$lonhost,$include,$mailtoken,$now,$username,$start_page) = @_;
     my ($error,$output);      my ($error,$output);
Line 590  sub print_dataentry_form { Line 702  sub print_dataentry_form {
         $output .= &javascript_setforms($now)."\n".&javascript_checkpass($now);          $output .= &javascript_setforms($now)."\n".&javascript_checkpass($now);
         my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();          my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
         my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);          my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
         my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',          my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount:createaccount',
                                            $lonhost);                                             $lonhost);
         my @userinfo = ('firstname','middlename','lastname','generation','id',          my $formtag = '<form name="server" method="post" target="_top" action="/adm/createaccount">';
                         'permanentemail');          my ($datatable,$rowcount) =
         my %lt=&Apache::lonlocal::texthash(              &Apache::loncreateuser::personal_data_display($username,$domain,
                     'pd'             => "Personal Data",                                                            'email','selfcreate');
                     'firstname'      => "First Name",          if ($rowcount) {
                     'middlename'     => "Middle Name",              $output .= '<div class="LC_left_float">'.$formtag.$datatable;
                     'lastname'       => "Last Name",          } else {
                     'generation'     => "Generation",              $output .= $formtag;
                     'permanentemail' => "Permanent e-mail address",  
                     'id'             => "ID/Student Number",  
                     'lg'             => "Login Data"  
         );  
         my %textboxsize = (  
                            firstname      => '15',  
                            middlename     => '15',  
                            lastname       => '15',  
                            generation     => '5',  
                            id             => '15',  
                           );  
         my $genhelp=&Apache::loncommon::help_open_topic('Generation');  
         $output .= '<div class="LC_left_float"><h3>'.$lt{'pd'}.'</h3>'.  
                   '<form name="server" method="post" target="_top" action="/adm/createaccount">'.  
                   &Apache::lonhtmlcommon::start_pick_box();  
         foreach my $item (@userinfo) {  
             my $rowtitle = $lt{$item};  
             if ($item eq 'generation') {  
                 $rowtitle = $genhelp.$rowtitle;  
             }  
             $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";  
             if ($item eq 'permanentemail') {  
                 $output .= $username;  
             } else {  
                 $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';  
             }  
             $output .= &Apache::lonhtmlcommon::row_closure(1);  
         }          }
         $output .= &Apache::lonhtmlcommon::end_pick_box();  
         $output .= <<"ENDSERVERFORM";          $output .= <<"ENDSERVERFORM";
    <input type="hidden" name="logtoken" value="$logtoken" />     <input type="hidden" name="logtoken" value="$logtoken" />
    <input type="hidden" name="token" value="$mailtoken" />     <input type="hidden" name="token" value="$mailtoken" />
    <input type="hidden" name="serverid" value="$lonhost" />     <input type="hidden" name="serverid" value="$lonhost" />
    <input type="hidden" name="uname" value="" />     <input type="hidden" name="uname" value="" />
    <input type="hidden" name="upass" value="" />     <input type="hidden" name="upass" value="" />
      <input type="hidden" name="udom" value="" />
    <input type="hidden" name="phase" value="createaccount" />     <input type="hidden" name="phase" value="createaccount" />
   </form></div>    </form>
 ENDSERVERFORM  ENDSERVERFORM
           if ($rowcount) {
               $output .= '</div>'.
                          '<div class="LC_left_float">';
           }
         my $upassone = '<input type="password" name="upass'.$now.'" size="10" />';          my $upassone = '<input type="password" name="upass'.$now.'" size="10" />';
         my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="10" />';          my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="10" />';
         my $submit_text = &mt('Create LON-CAPA account');          my $submit_text = &mt('Create LON-CAPA account');
         $output .= '<div class="LC_left_float"><h3>'.$lt{'lg'}.'</h3>'."\n".          $output .= '<h3>'.&mt('Login Data').'</h3>'."\n".
                    '<form name="client" method="post" />'."\n".                     '<form name="client" method="post" action="" '.
                      'onsubmit="return checkpass();">'."\n".
                    &Apache::lonhtmlcommon::start_pick_box()."\n".                     &Apache::lonhtmlcommon::start_pick_box()."\n".
                    &Apache::lonhtmlcommon::row_title(&mt('Username'),                     &Apache::lonhtmlcommon::row_title(&mt('Username'),
                                                     'LC_pick_box_title')."\n".                                                       'LC_pick_box_title',
                                                        'LC_oddrow_value')."\n".
                    $username."\n".                     $username."\n".
                    &Apache::lonhtmlcommon::row_closure(1)."\n".                     &Apache::lonhtmlcommon::row_closure(1)."\n".
                    &Apache::lonhtmlcommon::row_title(&mt('Password'),                     &Apache::lonhtmlcommon::row_title(&mt('Password'),
                                                     'LC_pick_box_title')."\n".                                                      'LC_pick_box_title',
                                                       'LC_oddrow_value')."\n".
                    $upassone."\n".                     $upassone."\n".
                    &Apache::lonhtmlcommon::row_closure(1)."\n".                     &Apache::lonhtmlcommon::row_closure(1)."\n".
                    &Apache::lonhtmlcommon::row_title(&mt('Confirm password'),                     &Apache::lonhtmlcommon::row_title(&mt('Confirm password'),
                                                 'LC_pick_box_title')."\n".                                                       'LC_pick_box_title',
                    $upasstwo."\n".                                                       'LC_oddrow_value')."\n".
                      $upasstwo.
                      &Apache::lonhtmlcommon::row_closure(1)."\n".
                      &Apache::lonhtmlcommon::row_title()."\n".
                      '<br /><input type="submit" name="createaccount" value="'.
                      $submit_text.'" />'.
                    &Apache::lonhtmlcommon::row_closure(1)."\n".                     &Apache::lonhtmlcommon::row_closure(1)."\n".
                    &Apache::lonhtmlcommon::end_pick_box()."\n".                     &Apache::lonhtmlcommon::end_pick_box()."\n".
                    '<input type="hidden" name="uname" value="'.$username.'">'."\n".                     '<input type="hidden" name="uname" value="'.$username.'" />'."\n".
                    '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".                     '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".
                    '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".                     '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".
                    '</form></div>'."\n".                     '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".
                    '<div class="LC_clear_float_footer"><br /><br />'."\n".                     '</form>';
                    '<form name="buttonform">'."\n".          if ($rowcount) {
                    '<input type="button" name="createaccount" value="'.              $output .= '</div>'."\n".
                    $submit_text.'" onclick="javascript:checkpass();" /></form></div>';                         '<div class="LC_clear_float_footer"></div>'."\n";
           }
     } else {      } else {
         $output = &mt('Could not load javascript file [_1]','<tt>londes.js</tt>');          $output = &mt('Could not load javascript file [_1]','<tt>londes.js</tt>');
     }      }
     return $output;      return $output;
 }  }
   
   #
   # Retrieve rules for generating accounts from domain configuration
   # Can the user make a new account or just self-enroll?
   
   sub get_creation_controls {
       my ($domain,$usercreation) = @_;
       my (@cancreate,@statustocreate);
       if (ref($usercreation) eq 'HASH') {
           if (ref($usercreation->{'cancreate'}) eq 'HASH') {
               if (ref($usercreation->{'cancreate'}{'statustocreate'}) eq 'ARRAY') {
                   @statustocreate = @{$usercreation->{'cancreate'}{'statustocreate'}};
                   if (@statustocreate == 0) {
                       my ($othertitle,$usertypes,$types) =
                           &Apache::loncommon::sorted_inst_types($domain);
                       if (ref($types) eq 'ARRAY') {
                           if (@{$types} == 0) {
                               @statustocreate = ('default');
                           }
                       } else {
                           @statustocreate = ('default');
                       }
                   }
               } else {
                   @statustocreate = ('default');
                   my ($othertitle,$usertypes,$types) =
                       &Apache::loncommon::sorted_inst_types($domain);
                   if (ref($types) eq 'ARRAY') {
                       push(@statustocreate,@{$types});
                   }
               }
               if (ref($usercreation->{'cancreate'}{'selfcreate'}) eq 'ARRAY') {
                   @cancreate = @{$usercreation->{'cancreate'}{'selfcreate'}};
               } elsif (($usercreation->{'cancreate'}{'selfcreate'} ne 'none') &&
                        ($usercreation->{'cancreate'}{'selfcreate'} ne '')) {
                   @cancreate = ($usercreation->{'cancreate'}{'selfcreate'});
               }
           }
       }
       return (\@cancreate,\@statustocreate);
   }
   
 sub create_account {  sub create_account {
     my ($r,$domain,$lonhost,$username,$domdesc) = @_;      my ($r,$domain,$username,$domdesc) = @_;
   # Get the token info
     my ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},      my ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},
                                                           $env{'form.serverid'});                                                             $env{'form.serverid'}); 
   # $retrieved is 'ok' if things worked
   # $output is user error output
   # $upass is the decrypted password
     # Error messages      # Error messages
     my $error     = '<span class="LC_error">'.&mt('Error:').' ';      my $error     = '<span class="LC_error">'.&mt('Error:').' ';
     my $end       = '</span><br /><br />';      my $end       = '</span><br /><br />';
     my $rtnlink   = '<a href="javascript:history.back();" />'.      my $rtnlink   = '<a href="javascript:history.back();">'.
                     &mt('Return to previous page').'</a>'.                      &mt('Return to previous page').'</a>'.
                     &Apache::loncommon::end_page();                      &Apache::loncommon::end_page();
     if ($retrieved eq 'ok') {      if ($retrieved eq 'ok') {
         if ($env{'form.cid'} ne '') {          if ($env{'form.courseid'} ne '') {
   # See if we are allowed to use this username per domain rules (number of characters, etc)
             my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);              my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);
             if ($result eq 'fail') {              if ($result eq 'fail') {
                 $output = $error.&mt('Invalid ID format').$end.                  $output = $error.&mt('Invalid ID format').$end.
Line 693  sub create_account { Line 837  sub create_account {
     } else {      } else {
         return ('fail',$error.$output.$end.$rtnlink);          return ('fail',$error.$output.$end.$rtnlink);
     }      }
     # Call modifyuser      # Yes! We can do this. Valid token, valid username format
       # Create an internally authenticated account with password $upass 
       # if the account does not exist yet
       # Assign student/staff number $env{'form.cid'}, first name, last name, etc
     my $result =       my $result = 
         &Apache::lonnet::modifyuser($domain,$username,$env{'form.cid'},          &Apache::lonnet::modifyuser($domain,$username,$env{'form.cid'},
                                     'internal',$upass,$env{'form.cfirstname'},                                      'internal',$upass,$env{'form.cfirstname'},
                                     $env{'form.cmiddlename'},$env{'form.clastname'},                                      $env{'form.cmiddlename'},$env{'form.clastname'},
                                     $env{'form.cgeneration'},undef,undef,$username);                                      $env{'form.cgeneration'},undef,undef,$username);
     $output = &mt('Generating user: [_1]',$result);      $output = &mt('Generating user: [_1]',$result);
       # Now that the user exists, we can have a homeserver
     my $uhome = &Apache::lonnet::homeserver($username,$domain);      my $uhome = &Apache::lonnet::homeserver($username,$domain);
     $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.      $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.
               &Apache::lonnet::hostname($uhome).'<br /><br />';                &Apache::lonnet::hostname($uhome).'<br /><br />';
     return ('ok',$output);      return ('ok',$output,$uhome);
 }  }
   
 sub username_validation {  sub username_validation {
     my ($username,$domain,$domdesc,$contact_name,$contact_email,$courseid,$lonhost) = @_;      my ($r,$username,$domain,$domdesc,$contact_name,$contact_email,$courseid,
           $lonhost,$statustocreate) = @_;
   # $username,$domain: for the user who needs to be validated
   # $domdesc: full name of the domain (for error messages)
   # $contact_name, $contact_email: name and email for user assistance (for error messages in &username_check
   # $courseid: ID of the course that the user should be validated for, goes into start_session
   # $statustocreate: -> inststatus in username_check ('faculty', 'staff', 'student', ...)
    
     my ($retrieved,$output,$upass);      my ($retrieved,$output,$upass);
   
     $username= &LONCAPA::clean_username($username);      $username= &LONCAPA::clean_username($username);
     $domain = &LONCAPA::clean_domain($domain);      $domain = &LONCAPA::clean_domain($domain);
     my $uhome = &Apache::lonnet::homeserver($username,$domain);      my $uhome = &Apache::lonnet::homeserver($username,$domain);
   
     if ($uhome ne 'no_host') {  
         $output = &invalid_state('existinguser',$domdesc,  
                                  $contact_name,$contact_email);  
         return $output;  
     }  
     ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},      ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},
                                                        $env{'form.serverid'});                                                         $env{'form.serverid'});
     if ($retrieved eq 'ok') {      if ($retrieved ne 'ok') {
           return ('fail',$output);
       }
       if ($uhome ne 'no_host') {
           my $result = &Apache::lonnet::authenticate($username,$upass,$domain);
           if ($result ne 'no_host') { 
               &start_session($r,$username,$domain,$uhome,$courseid);
               $output = '<br /><br />'.&mt('A LON-CAPA account already exists for username [_1] at this institution ([_2]).','<tt>'.$username.'</tt>',$domdesc).'<br />'.&mt('The password entered was also correct so you have been logged in.');
               return ('existingaccount',$output);
           } else {
               $output = &login_failure_msg($courseid);
           }
       } else {
         my $primlibserv = &Apache::lonnet::domain($domain,'primary');          my $primlibserv = &Apache::lonnet::domain($domain,'primary');
         my $authok;          my $authok;
         my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);          my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
Line 734  sub username_validation { Line 896  sub username_validation {
         }          }
         if ($authok eq 'authorized') {          if ($authok eq 'authorized') {
             $output = &username_check($username,$domain,$domdesc,$courseid,$lonhost,              $output = &username_check($username,$domain,$domdesc,$courseid,$lonhost,
                                       $contact_email,$contact_name);                                        $contact_email,$contact_name,undef,
                                         $statustocreate);
         } else {          } else {
             $output = '<div class="LC_warning">'              $output = &login_failure_msg($courseid);
                      .&mt('Username and/or password could not be authenticated.')  
                      .'</div>'  
                      .&mt('Please check the username and password.');   
         }          }
     }      }
       return ('ok',$output);
   }
   
   sub login_failure_msg {
       my ($courseid) = @_;
       my $url;
       if ($courseid ne '') {
           $url = "/adm/selfenroll?courseid=".$courseid;
       } else {
           $url = "/adm/createaccount";
       }
       my $output = '<h4>'.&mt('Authentication failed').'</h4><div class="LC_warning">'.
                    &mt('Username and/or password could not be authenticated.').
                    '</div>'.
                    &mt('Please check the username and password.').'<br /><br />';
                    '<a href="'.$url.'">'.&mt('Try again').'</a>';
     return $output;      return $output;
 }  }
   
 sub username_check {  sub username_check {
     my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,$contact_name,      my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,
         $sso_logout) = @_;          $contact_name,$sso_logout,$statustocreate) = @_;
     my (%rulematch,%inst_results,$newuser,$checkfail,$rowcount,$editable,$output,$msg,      my (%rulematch,%inst_results,$checkfail,$rowcount,$editable,$output,$msg,
         %alerts,%curr_rules,%got_rules);          %alerts,%curr_rules,%got_rules);
     $newuser = 1;      &call_rulecheck($username,$domain,\%alerts,\%rulematch,
     my $checkhash;                      \%inst_results,\%curr_rules,\%got_rules,'username');
     my $checks = { 'username' => 1 };  
     $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser };  
     &Apache::loncommon::user_rule_check($checkhash,$checks,\%alerts,\%rulematch,  
                                         \%inst_results,\%curr_rules,\%got_rules);  
     if (ref($alerts{'username'}) eq 'HASH') {      if (ref($alerts{'username'}) eq 'HASH') {
         if (ref($alerts{'username'}{$domain}) eq 'HASH') {          if (ref($alerts{'username'}{$domain}) eq 'HASH') {
             if ($alerts{'username'}{$domain}{$username}) {              if ($alerts{'username'}{$domain}{$username}) {
Line 771  sub username_check { Line 943  sub username_check {
         }          }
     }      }
     if (!$checkfail) {      if (!$checkfail) {
           if (ref($statustocreate) eq 'ARRAY') {
               $checkfail = 'inststatus';
               if (ref($inst_results{$username.':'.$domain}{inststatus}) eq 'ARRAY') {
                   foreach my $inststatus (@{$inst_results{$username.':'.$domain}{inststatus}}) {
                       if (grep(/^\Q$inststatus\E$/,@{$statustocreate})) {
                           undef($checkfail);
                           last;
                       }
                   }
               } elsif (grep(/^default$/,@{$statustocreate})) {
                   undef($checkfail);
               }
           }
       }
       if (!$checkfail) {
         $output = '<form method="post" action="/adm/createaccount">';          $output = '<form method="post" action="/adm/createaccount">';
         (my $datatable,$rowcount,$editable) =           (my $datatable,$rowcount,$editable) = 
             &Apache::loncreateuser::personal_data_display($username,$domain,1,'selfcreate',              &Apache::loncreateuser::personal_data_display($username,$domain,1,'selfcreate',
Line 786  sub username_check { Line 973  sub username_check {
                     'time'       => $now,                      'time'       => $now,
                     'domain'     => $domain,                      'domain'     => $domain,
                     'username'   => $username);                      'username'   => $username);
         my $authtoken = &Apache::lonnet::tmpput(\%info,$lonhost);          my $authtoken = &Apache::lonnet::tmpput(\%info,$lonhost,'createaccount');
         if ($authtoken !~ /^error/ && $authtoken ne 'no_such_host') {          if ($authtoken !~ /^error/ && $authtoken ne 'no_such_host') {
             $output .= '<input type="hidden" name="authtoken" value="'.&HTML::Entities::encode($authtoken,'&<>"').'" />';              $output .= '<input type="hidden" name="authtoken" value="'.&HTML::Entities::encode($authtoken,'&<>"').'" />';
         } else {          } else {
Line 797  sub username_check { Line 984  sub username_check {
         }          }
     }      }
     if ($checkfail) {       if ($checkfail) { 
         $msg = '<h4>'.&mt('Account creation unavailable').'</h4>';          $msg = '<br /><h4>'.&mt('Account creation unavailable').'</h4>';
         if ($checkfail eq 'username') {          if ($checkfail eq 'username') {
             $msg .= '<span class="LC_warning">'.              $msg .= '<span class="LC_warning">'.
                      &mt('A LON-CAPA account may not be created with the username you use.').                       &mt('A LON-CAPA account may not be created with the username you use.').
Line 805  sub username_check { Line 992  sub username_check {
         } elsif ($checkfail eq 'authtoken') {          } elsif ($checkfail eq 'authtoken') {
             $msg .= '<span class="LC_error">'.&mt('Error creating token.').'</span>'.              $msg .= '<span class="LC_error">'.&mt('Error creating token.').'</span>'.
                     '<br />'.$output;                      '<br />'.$output;
           } elsif ($checkfail eq 'inststatus') {
               $msg .= '<span class="LC_warning">'.
                        &mt('You are not permitted to create a LON-CAPA account.').
                        '</span><br /><br />'.$output;
         }          }
         $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',          $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',
                 $contact_name,$contact_email).'<br /><hr />'.                  $contact_name,$contact_email).'<br /><hr />'.
Line 818  sub username_check { Line 1009  sub username_check {
                    &mt('Create LON-CAPA account').'" /></form>';                     &mt('Create LON-CAPA account').'" /></form>';
         if ($rowcount) {          if ($rowcount) {
             if ($editable) {              if ($editable) {
                 $msg = &mt('To create one, use the table below to provide information about yourself, then click the [_1]Create LON-CAPA account[_2] button.','<span class="LC_cusr_emph">','</span>').'<br />';                  if ($courseid ne '') { 
                       $msg = '<br /><h4>'.&mt('User information').'</h4>';
                   }
                   $msg .= &mt('To create one, use the table below to provide information about yourself, then click the [_1]Create LON-CAPA account[_2] button.','<span class="LC_cusr_emph">','</span>').'<br />';
             } else {              } else {
                  $msg = &mt('A user account will be created with information displayed in the table below, when you click the [_1]Create LON-CAPA account[_2] button.','<span class="LC_cusr_emph">','</span>').'<br />';                   if ($courseid ne '') {
                        $msg = '<h4>'.&mt('Review user information').'</h4>';
                    }
                    $msg .= &mt('A user account will be created with information displayed in the table below, when you click the [_1]Create LON-CAPA account[_2] button.','<span class="LC_cusr_emph">','</span>').'<br />';
             }              }
         } else {          } else {
             $msg = '<br />'.&mt('Confirm that you wish to create an account.');              if ($courseid ne '') {
                   $msg = '<h4>'.&mt('Confirmation').'</h4>';
               }
               $msg .= &mt('Confirm that you wish to create an account.');
         }          }
         $msg .= $output;          $msg .= $output;
     }      }
Line 831  sub username_check { Line 1031  sub username_check {
 }  }
   
 sub username_activation {  sub username_activation {
     my ($r,$username,$domain,$domdesc,$lonhost,$courseid) = @_;      my ($r,$username,$domain,$domdesc,$courseid) = @_;
     my $output;      my $output;
     my $error     = '<span class="LC_error">'.&mt('Error:').' ';      my $error     = '<span class="LC_error">'.&mt('Error:').' ';
     my $end       = '</span><br /><br />';      my $end       = '</span><br /><br />';
     my $rtnlink   = '<a href="javascript:history.back();" />'.      my $rtnlink   = '<a href="javascript:history.back();">'.
                     &mt('Return to previous page').'</a>'.                      &mt('Return to previous page').'</a>'.
                     &Apache::loncommon::end_page();                      &Apache::loncommon::end_page();
     my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);      my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
Line 857  sub username_activation { Line 1057  sub username_activation {
         $output = &mt('Sorry, your authentication has expired.');          $output = &mt('Sorry, your authentication has expired.');
     }      }
     if ($earlyout ne '') {      if ($earlyout ne '') {
         $output .= '<br />'.&mt('Please [_1]start again[_2].','<a href="/adm/createaccount">','</a>');          my $link = '/adm/createaccount';
           if (&Apache::lonnet::domain($domain) ne '') {
               $link .= "?domain=$domain"; 
           }
           $output .= '<br />'.&mt('Please [_1]start again[_2].',
                                   '<a href="'.$link.'">','</a>');
         return($earlyout,$output);          return($earlyout,$output);
     }      }
     if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) &&       if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) && 
          ($domdefaults{'auth_arg_def'} ne '')) ||            ($domdefaults{'auth_arg_def'} ne '')) || 
         ($domdefaults{'auth_def'} eq 'localauth')) {          ($domdefaults{'auth_def'} eq 'localauth')) {
         if ($env{'form.cid'} ne '') {          if ($env{'form.courseid'} ne '') {
             my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);              my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);
             if ($result eq 'fail') {              if ($result eq 'fail') {
                 $output = $error.&mt('Invalid ID format').$end.                  $output = $error.&mt('Invalid ID format').$end.
Line 872  sub username_activation { Line 1077  sub username_activation {
             }              }
         }          }
         # Call modifyuser          # Call modifyuser
           my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts,%info);
           &call_rulecheck($username,$domain,\%alerts,\%rulematch,
                           \%inst_results,\%curr_rules,\%got_rules);
           my @userinfo = ('firstname','middlename','lastname','generation',
                           'permanentemail','id');
           my %canmodify = 
               &Apache::loncreateuser::selfcreate_canmodify('selfcreate',$domain,
                                                            \@userinfo,\%inst_results);
           foreach my $item (@userinfo) {
               if ($canmodify{$item}) {
                   $info{$item} = $env{'form.c'.$item};
               } else {
                   $info{$item} = $inst_results{$username.':'.$domain}{$item}; 
               }
           }
           if (ref($inst_results{$username.':'.$domain}{'inststatus'}) eq 'ARRAY') {
               my @inststatuses = @{$inst_results{$username.':'.$domain}{'inststatus'}};
               $info{'inststatus'} = join(':',map { &escape($_); } @inststatuses);
           }
         my $result =          my $result =
             &Apache::lonnet::modifyuser($domain,$username,$env{'form.cid'},              &Apache::lonnet::modifyuser($domain,$username,$env{'form.cid'},
                           $domdefaults{'auth_def'},                            $domdefaults{'auth_def'},
                           $domdefaults{'auth_arg_def'},$env{'form.cfirstname'},                            $domdefaults{'auth_arg_def'},$info{'firstname'},
                           $env{'form.cmiddlename'},$env{'form.clastname'},                            $info{'middlename'},$info{'lastname'},
                           $env{'form.cgeneration'},undef,undef,                            $info{'generation'},undef,undef,
                           $env{'form.cpermanentemail'});                            $info{'permanentemail'},$info{'inststatus'});
         if ($result eq 'ok') {          if ($result eq 'ok') {
             my $delete = &Apache::lonnet::tmpdel($env{'form.authtoken'});              my $delete = &Apache::lonnet::tmpdel($env{'form.authtoken'});
             $output = &mt('A LON-CAPA account has been created for username: [_1] in domain: [_2].',$username,$domain);              $output = &mt('A LON-CAPA account has been created for username: [_1] in domain: [_2].',$username,$domain);
             my %form = &start_session($r,$username,$domain,$lonhost,$courseid);              my $uhome=&Apache::lonnet::homeserver($username,$domain,'true');
               &start_session($r,$username,$domain,$uhome,$courseid);
             my $nostart = 1;              my $nostart = 1;
             return ('ok',$output,$nostart);              return ('ok',$output,$nostart);
         } else {          } else {
Line 898  sub username_activation { Line 1123  sub username_activation {
 sub check_id {  sub check_id {
     my ($username,$domain,$domdesc) = @_;      my ($username,$domain,$domdesc) = @_;
     # Check ID format      # Check ID format
       # Is $username in an okay format for $domain 
       # (right number of characters, special characters, etc - follow domain rules)?
       # $domdesc is just used for user error messages
     my (%alerts,%rulematch,%inst_results,%curr_rules,%checkhash);      my (%alerts,%rulematch,%inst_results,%curr_rules,%checkhash);
     my %checks = ('id' => 1);      my %checks = ('id' => 1);
     %{$checkhash{$username.':'.$domain}} = (      %{$checkhash{$username.':'.$domain}} = (
Line 928  sub invalid_state { Line 1156  sub invalid_state {
     my ($error,$domdesc,$contact_name,$contact_email,$msgtext) = @_;      my ($error,$domdesc,$contact_name,$contact_email,$msgtext) = @_;
     my $msg = '<h3>'.&mt('Account creation unavailable').'</h3><span class="LC_error">';      my $msg = '<h3>'.&mt('Account creation unavailable').'</h3><span class="LC_error">';
     if ($error eq 'baduseremail') {      if ($error eq 'baduseremail') {
         $msg = &mt('The e-mail address you provided does not appear to be a valid address.');          $msg .= &mt('The e-mail address you provided does not appear to be a valid address.');
     } elsif ($error eq 'existinguser') {      } elsif ($error eq 'existinguser') {
         $msg = &mt('The e-mail address you provided is already in use as a username in LON-CAPA at this institution.');          $msg .= &mt('The e-mail address you provided is already in use as a username in LON-CAPA at this institution.');
     } elsif ($error eq 'userrules') {      } elsif ($error eq 'userrules') {
         $msg = &mt('Username rules for this LON-CAPA at this institution do not allow the e-mail address you provided to be used as a username.');          $msg .= &mt('Username rules at this institution do not allow the e-mail address you provided to be used as a username.');
     } elsif ($error eq 'userformat') {      } elsif ($error eq 'userformat') {
         $msg = &mt('The e-mail address you provided may not be used as a username at this LON-CAPA institution.');          $msg .= &mt('The e-mail address you provided may not be used as a username at this LON-CAPA institution.');
     } elsif ($error eq 'captcha') {      } elsif ($error eq 'captcha') {
         $msg = &mt('Validation of the code your entered failed.');          $msg .= &mt('Validation of the code you entered failed.');
     } elsif ($error eq 'noemails') {      } elsif ($error eq 'noemails') {
         $msg = &mt('Creation of a new user account using an e-mail address as username is not permitted at this LON-CAPA institution.');          $msg .= &mt('Creation of a new user account using an e-mail address as username is not permitted at this LON-CAPA institution.');
     }      }
     $msg .= '</span>';      $msg .= '</span>';
     if ($msgtext) {      if ($msgtext) {
         $msg .= '<br />'.$msgtext;          $msg .= '<br />'.$msgtext;
     }      }
     $msg .= &linkto_email_help($contact_email,$domdesc);      $msg .= &linkto_email_help($contact_email,$domdesc,$error);
     return $msg;      return $msg;
 }  }
   
 sub linkto_email_help {  sub linkto_email_help {
     my ($contact_email,$domdesc) = @_;      my ($contact_email,$domdesc,$error) = @_;
     my $msg;      my $msg;
       my $href = '/adm/helpdesk';
     if ($contact_email ne '') {      if ($contact_email ne '') {
         my $escuri = &HTML::Entities::encode('/adm/createaccount','&<>"');          my $escuri = &HTML::Entities::encode('/adm/createaccount','&<>"');
         $msg .= '<br />'.&mt('You may wish to contact the [_1]LON-CAPA helpdesk[_2] for [_3].','<a href="/adm/helpdesk?origurl='.$escuri.'">','</a>',$domdesc).'<br />';          $href .= '?origurl='.$escuri;
           if ($error eq 'existinguser') {
               my $escemail = &HTML::Entities::encode($env{'form.useremail'});
               $href .= '&useremail='.$escemail.'&useraccount='.$escemail;
           }
           $msg .= '<br />'.&mt('You may wish to contact the [_1]LON-CAPA helpdesk[_2] for [_3].','<a href="'.$href.'">','</a>',$domdesc).'<br />';
     } else {      } else {
         $msg .= '<br />'.&mt('You may wish to send an e-mail to the server administrator: [_1] for [_2].',$Apache::lonnet::perlvar{'AdminEmail'},$domdesc).'<br />';          $msg .= '<br />'.&mt('You may wish to send an e-mail to the server administrator: [_1] for [_2].',$Apache::lonnet::perlvar{'AdmEMail'},$domdesc).'<br />';
     }      }
     return $msg;      return $msg;
 }  }
   
 sub create_captcha {  
     my ($output_dir,$db_dir) = @_;  
     my %captcha_params = &captcha_settings();  
     my $captcha = Authen::Captcha->new(  
                                        output_folder => $captcha_params{'output_dir'},  
                                        data_folder   => $captcha_params{'db_dir'},  
                                       );  
     my $md5sum = $captcha->generate_code($captcha_params{'numchars'});  
     my $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".  
                  &mt('Type in the letters/numbers shown below').'&nbsp;'.  
                  '<input type="text" size="5" name="code" value="" /><br />'.  
                  '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png">';  
     return $output;  
 }  
   
 sub captcha_settings {  
     my %captcha_params = (   
                            output_dir     => $Apache::lonnet::perlvar{'lonCaptchaDir'},  
                            www_output_dir => "/captchaspool",  
                            db_dir         => $Apache::lonnet::perlvar{'lonCaptchaDb'},  
                            numchars       => '5',  
                          );  
     return %captcha_params;  
 }  
   
 sub getkeys {  sub getkeys {
     my ($lkey,$ukey) = @_;      my ($lkey,$ukey) = @_;
     my $lextkey=hex($lkey);      my $lextkey=hex($lkey);
Line 996  sub getkeys { Line 1205  sub getkeys {
 }  }
   
 sub serverform {  sub serverform {
     my ($logtoken,$lonhost,$mailtoken,$courseid) = @_;      my ($logtoken,$lonhost,$mailtoken,$courseid,$context) = @_;
     my $output .= <<ENDSERVERFORM;      my $phase = 'username_validation';
   <form name="server" method="post" target="_top">      my $catalog_elements;
       if ($context eq 'selfenroll') {
           $phase = 'selfenroll_login';
       }
       if ($courseid ne '') {
           $catalog_elements = &Apache::lonhtmlcommon::echo_form_input(['courseid','phase']);
       } 
       my $output = <<ENDSERVERFORM;
     <form name="server" method="post" action="/adm/createaccount">
    <input type="hidden" name="logtoken" value="$logtoken" />     <input type="hidden" name="logtoken" value="$logtoken" />
    <input type="hidden" name="token" value="$mailtoken" />     <input type="hidden" name="token" value="$mailtoken" />
    <input type="hidden" name="serverid" value="$lonhost" />     <input type="hidden" name="serverid" value="$lonhost" />
    <input type="hidden" name="uname" value="" />     <input type="hidden" name="uname" value="" />
    <input type="hidden" name="upass" value="" />     <input type="hidden" name="upass" value="" />
    <input type="hidden" name="phase" value="username_validation" />     <input type="hidden" name="udom" value="" />
      <input type="hidden" name="phase" value="$phase" />
    <input type="hidden" name="courseid" value="$courseid" />     <input type="hidden" name="courseid" value="$courseid" />
      $catalog_elements
   </form>    </form>
 ENDSERVERFORM  ENDSERVERFORM
     return $output;      return $output;
 }  }
   
 sub process_credentials {  sub process_credentials {
   #
   # Fetches the information from the logtoken via tmpget
   # Token contains the DES-key and the stage of the process (would only be "createaccount")
   # $lonhost in this routine is *not* necessarily the machine that this runs on,
   # but $env{'form.serverid'}, the machine that issued the token. 
   #
     my ($logtoken,$lonhost) = @_;      my ($logtoken,$lonhost) = @_;
     my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);      my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);
     my ($retrieved,$output,$upass);      my ($retrieved,$output,$upass);
Line 1033  sub process_credentials { Line 1258  sub process_credentials {
     } else {      } else {
         $output = &mt('Unable to retrieve your log-in information - unexpected context');          $output = &mt('Unable to retrieve your log-in information - unexpected context');
     }      }
   # $retrieved is 'ok' if retrieved okay
   # $output is screen output for the user
   # $upass is $env{'form.upass'}, decrypted with the DES-key, if stage was 'createaccount'
   
     return ($retrieved,$output,$upass);      return ($retrieved,$output,$upass);
 }  }
   
Line 1090  sub sso_logout_frag { Line 1319  sub sso_logout_frag {
     return $endsessionmsg;      return $endsessionmsg;
 }  }
   
   sub catreturn_js {
       return  <<"ENDSCRIPT";
   <script type="text/javascript">
   
   function ToSelfenroll(formname) {
       var formidx = getFormByName(formname);
       if (formidx > -1) {
           document.forms[formidx].action = '/adm/selfenroll';
           numidx = getIndexByName(formidx,'phase');
           if (numidx > -1) {
               document.forms[formidx].elements[numidx].value = '';   
           }
           numidx = getIndexByName(formidx,'context');
           if (numidx > -1) {
               document.forms[formidx].elements[numidx].value = '';
           }
       }
       document.forms[formidx].submit();
   }
   
   function ToCatalog(formname,caller) {
       var formidx = getFormByName(formname);
       if (formidx > -1) {
           document.forms[formidx].action = '/adm/coursecatalog';
           numidx = getIndexByName(formidx,'coursenum');
           if (numidx > -1) {
               if (caller != 'details') {
                   document.forms[formidx].elements[numidx].value = '';
               }
           }
       }
       document.forms[formidx].submit();
   }
   
   function getIndexByName(formidx,item) {
       for (var i=0;i<document.forms[formidx].elements.length;i++) {
           if (document.forms[formidx].elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
   function getFormByName(item) {
       for (var i=0; i<document.forms.length; i++) {
           if (document.forms[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
   </script>
   ENDSCRIPT
   
   }
   
 1;  1;

Removed from v.1.18  
changed lines
  Added in v.1.57


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.