Diff for /loncom/interface/createaccount.pm between versions 1.37.2.6 and 1.87

version 1.37.2.6, 2010/12/02 22:51:27 version 1.87, 2022/10/18 23:28:00
Line 1 Line 1
 # The LearningOnline Network  # The LearningOnline Network
 # Allow visitors to create a user account with the username being either an   # Allow visitors to create a user account with the username being either an 
 # institutional log-in ID (institutional authentication required - localauth  # institutional log-in ID (institutional authentication required - localauth,
 #  or kerberos) or an e-mail address.  # kerberos, or SSO) or an e-mail address. Requests to use an e-mail address as
   # username may be processed automatically, or may be queued for approval.
 #  #
 # $Id$  # $Id$
 #  #
Line 39  use Apache::lonhtmlcommon; Line 40  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonauth;  use Apache::lonauth;
 use Apache::resetpw;  use Apache::resetpw;
 use Captcha::reCAPTCHA;  
 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);
Line 55  sub handler { Line 55  sub handler {
   
     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']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['token','courseid','domain','type']);
     &Apache::lonacc::get_posted_cgi($r);      &Apache::lonacc::get_posted_cgi($r);
     &Apache::lonlocal::get_language_handle($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'});
         if (defined($env{'form.courseid'})) {          unless ($domain) {
             if (&validate_course($env{'form.courseid'})) {              if ($env{'form.phase'} =~ /^username_(activation|validation)$/) {
                 if ($env{'form.courseid'} =~ /^($match_domain)_($match_courseid)$/) {                  if (($env{'form.udom'} =~ /^$match_domain$/) &&
                     $domain = $1;                       (&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();
             }              }
         }          }
     }      }
Line 92  sub handler { Line 102  sub handler {
         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]log out[_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;
     }      }
   
     my ($js,$courseid,$title);      my ($js,$courseid,$title);
     if (defined($env{'form.courseid'})) {      $courseid = Apache::lonnet::is_course($env{'form.courseid'});
         $courseid = &validate_course($env{'form.courseid'});  
     }  
     if ($courseid ne '') {      if ($courseid ne '') {
         $js = &catreturn_js();          $js = &catreturn_js();
         $title = 'Self-enroll in a LON-CAPA course';          $title = 'Self-enroll in a LON-CAPA course';
Line 122  sub handler { Line 131  sub handler {
             &username_validation($r,$env{'form.uname'},$domain,$domdesc,              &username_validation($r,$env{'form.uname'},$domain,$domdesc,
                                  $contact_name,$contact_email,$courseid,                                   $contact_name,$contact_email,$courseid,
                                  $lonhost,$statustocreate);                                   $lonhost,$statustocreate);
         if ($result eq 'existingaccount') {          if ($result eq 'redirect') {
               $r->internal_redirect('/adm/switchserver');
               return OK;
           } elsif ($result eq 'existingaccount') {
             $r->print($output);              $r->print($output);
             &print_footer($r);              &print_footer($r);
             return OK;              return OK;
         } else {          } else {
             $start_page =               $start_page = &Apache::loncommon::start_page($title,$js); 
                 &Apache::loncommon::start_page($title,$js,  
                                                {'no_inline_link'   => 1,});  
             &print_header($r,$start_page,$courseid);              &print_header($r,$start_page,$courseid);
             $r->print($output);              $r->print($output);
             &print_footer($r);                  &print_footer($r);    
             return OK;              return OK;
         }          }
     }      }
     $start_page =  
         &Apache::loncommon::start_page($title,$js,  
                                        {'no_inline_link'   => 1,});  
   
     my %domconfig =       my %domconfig =
         &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);          &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
     my ($cancreate,$statustocreate) = &get_creation_controls($domain,$domconfig{'usercreation'});      my ($cancreate,$statustocreate,$statusforemail,$emailusername,
           $emailoptions,$verification,$emaildomain,$types,$usertypes,$othertitle) =
           &get_creation_controls($domain,$domconfig{'usercreation'});
       my ($additems,$pagetitle);
       if (ref($cancreate) eq 'ARRAY') {
           unless (($env{'form.token'}) || ($sso_username ne '') || ($env{'form.phase'}) ||
                   ($env{'form.create_with_email'})) {
               if ((grep(/^email$/,@{$cancreate})) && (ref($statusforemail) eq 'ARRAY')) {
                   my $usertype = &get_usertype($domain);
                   if ((($usertype eq '') || (!grep(/^\Q$usertype\E$/,@{$statusforemail}))) && 
                       (@{$statusforemail} > 0)) {
                       $js .= &setelements_js($statusforemail,$types,$usertypes,$othertitle);
                       $additems = {'add_entries' => { 'onload' => "setElements();"} };
                       if ((@{$cancreate} == 1) && (@{$statusforemail} > 0)) {
                           $pagetitle = 'Select affiliation';
                       }
                   } else {
                       $js .= &username_js();
                   }
               }
           }
       }
       $start_page = &Apache::loncommon::start_page($title,$js,$additems);
     if (@{$cancreate} == 0) {      if (@{$cancreate} == 0) {
         &print_header($r,$start_page,$courseid);          &print_header($r,$start_page,$courseid,$pagetitle);
         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 for the GCI WebCenter.').'</span><br /><br />';                       &mt('Creation of a new user account using an institutional log-in ID or e-mail verification is not permitted for: [_1].',$domdesc).
                        '</span><br /><br />';
         $r->print($output);          $r->print($output);
         &print_footer($r);          &print_footer($r);
         return OK;          return OK;
Line 160  sub handler { Line 190  sub handler {
         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 />';
               my $shibenv;
               if (($r->dir_config('lonOtherAuthen') eq 'yes') && 
                   ($r->dir_config('lonOtherAuthenType') eq 'Shibboleth')) {
                   if (ref($domconfig{'usercreation'}) eq 'HASH') {
                       if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
                           if (ref($domconfig{'usercreation'}{'cancreate'}{'shibenv'}) eq 'HASH') {
                               my @possfields = ('firstname','middlename','lastname','generation',
                                                 'permanentemail','id');
                               $shibenv= {};
                               foreach my $key (keys(%{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}})) {
                                   if ($key eq 'inststatus') {
                                       if (ref($usertypes) eq 'HASH') {
                                           if ($domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key} ne '') {
                                               if (exists($usertypes->{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key}})) {
                                                   $shibenv->{$key} = $domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key};
                                                }
                                           }
                                       }
                                   } elsif (grep(/^\Q$key\E/,@possfields)) {
                                       if ($domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key} ne '') {
                                           $shibenv->{$key} = $domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key};
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
             $msg .= &username_check($sso_username,$domain,$domdesc,$courseid,               $msg .= &username_check($sso_username,$domain,$domdesc,$courseid, 
                                     $lonhost,$contact_email,$contact_name,                                      $lonhost,$contact_email,$contact_name,
                                     $sso_logout,$statustocreate);                                      $sso_logout,$statustocreate,$shibenv);
         } 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 />'.
Line 174  sub handler { Line 231  sub handler {
         return OK;          return OK;
     }      }
   
     my ($output,$nostart,$noend);      my ($output,$nostart,$noend,$redirect);
     my $token = $env{'form.token'};      my $token = $env{'form.token'};
     if ($token) {      if ($token) {
         ($output,$nostart,$noend) =           ($output,$nostart,$noend,$redirect) = 
             &process_mailtoken($r,$token,$contact_name,$contact_email,$domain,              &process_mailtoken($r,$token,$contact_name,$contact_email,$domain,
                                $domdesc,$lonhost,$include,$start_page);                                 $domdesc,$lonhost,$include,$start_page,$cancreate,
         if ($nostart) {                                 $domconfig{'usercreation'},$types);
           if ($redirect) {
               $r->internal_redirect('/adm/switchserver');
               return OK;
           } elsif ($nostart) {
             if ($noend) {              if ($noend) {
                 return OK;                  return OK;
             } else {              } else {
Line 195  sub handler { Line 256  sub handler {
             return OK;              return OK;
         }          }
     }      }
       my ($usernameset,$condition,$excluded,$hascustom);
       if ((grep(/^email$/,@{$cancreate})) && (($env{'form.create_with_email'}) ||
                                               ((!$token) && ($env{'form.phase'} eq '')))) {
           my $usertype = &get_usertype($domain);
           if ($usertype eq '') {
               $usertype = 'default';
           }
           if (ref($verification) eq 'HASH') {
               if ($verification->{$usertype} =~ /^(free|first)$/) {
                   $usernameset = $verification->{$usertype};
               }
           }
           if (ref($emailoptions) eq 'HASH') {
               if ($emailoptions->{$usertype} =~ /^(inst|noninst)$/) {
                   my $chosen = $1;
                   if (ref($emaildomain) eq 'HASH') {
                       if (ref($emaildomain->{$usertype}) eq 'HASH') {
                           if ($chosen eq 'inst') {
                               $condition = $emaildomain->{$usertype}->{$chosen};
                           } else {
                               $excluded = $emaildomain->{$usertype}->{$chosen};
                           }
                       }
                   }
               } elsif ($emailoptions->{$usertype} eq 'custom') {
                   $hascustom = 1;
               }
           }
       }
     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 'redirect') {
               $r->internal_redirect('/adm/switchserver');
               return OK; 
           } elsif ($result eq 'ok') {
             if ($nostart) {              if ($nostart) {
                 return OK;                  return OK;
             }              }
Line 223  sub handler { Line 315  sub handler {
         }          }
     } elsif ($env{'form.create_with_email'}) {      } elsif ($env{'form.create_with_email'}) {
         &print_header($r,$start_page,$courseid);          &print_header($r,$start_page,$courseid);
         $output = &process_email_request($env{'form.useremail'},$domain,$domdesc,          my $usertype = &get_usertype($domain);
           if ($usertype eq '') {
               $usertype = 'default';
           }
           $output = &process_email_request($env{'form.uname'},$domain,$domdesc,
                                          $contact_name,$contact_email,$cancreate,                                           $contact_name,$contact_email,$cancreate,
                                          $lonhost,$domconfig{'usercreation'},                                           $lonhost,$domconfig{'usercreation'},
                                          $courseid);                                           $emailusername,$courseid,$usertype,
                                            $usernameset,$condition,$excluded,$hascustom);
     } elsif (!$token) {      } elsif (!$token) {
         &print_header($r,$start_page,$courseid);          &print_header($r,$start_page,$courseid,$pagetitle);
         my $now=time;          my $now=time;
         if (grep(/^login$/,@{$cancreate})) {          if ((grep(/^login$/,@{$cancreate})) && (!grep(/^email$/,@{$cancreate}))) {
             my $jsh=Apache::File->new($include."/londes.js");              if (open(my $jsh,"<","$include/londes.js")) {
             $r->print(<$jsh>);                  while(my $line = <$jsh>) {
             $r->print(&javascript_setforms($now));                      $r->print($line);
                   }
                   close($jsh);
                   $r->print(&javascript_setforms($now));
               }
         }          }
         if (grep(/^email$/,@{$cancreate})) {          if (grep(/^email$/,@{$cancreate})) {
             $r->print(&javascript_validmail());              $r->print(&javascript_validmail($condition));
         }          }
         $output = &print_username_form($domain,$domdesc,$cancreate,$now,$lonhost,          my $usertype = &get_usertype($domain);
                                        $courseid);          $output = &print_username_form($r,$domain,$domdesc,$cancreate,$now,$lonhost,
                                          $include,$courseid,$emailusername,
                                          $statusforemail,$usernameset,$condition,
                                          $excluded,$usertype,$types,$usertypes,$othertitle);
     }      }
     $r->print($output);      $r->print($output);
     &print_footer($r);      &print_footer($r);
Line 247  sub handler { Line 351  sub handler {
 }  }
   
 sub print_header {  sub print_header {
     my ($r,$start_page,$courseid) = @_;      my ($r,$start_page,$courseid,$pagetitle) = @_;
     $r->print($start_page);      $r->print($start_page);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
       my $url = '/adm/createaccount';
       if ($pagetitle eq '') {
           $pagetitle = 'New username';
       }
     if ($courseid ne '') {      if ($courseid ne '') {
         my %coursehash = &Apache::lonnet::coursedescription($courseid);          my %coursehash = &Apache::lonnet::coursedescription($courseid);
         &selfenroll_crumbs($r,$courseid,$coursehash{'description'});          &selfenroll_crumbs($r,$courseid,$coursehash{'description'});
     }      }
       if ($env{'form.reportedtype'}) {
           &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>$url,
             text=>"Select affiliation"});
       }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"/adm/createuser",      ({href=>$url,
       text=>"New username"});        text=>$pagetitle});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Create account'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Create account'));
     return;      return;
 }  }
Line 267  sub print_footer { Line 380  sub print_footer {
         $r->print('<form name="backupcrumbs" method="post" action="">'.          $r->print('<form name="backupcrumbs" method="post" action="">'.
                   &Apache::lonhtmlcommon::echo_form_input(['backto','logtoken',                    &Apache::lonhtmlcommon::echo_form_input(['backto','logtoken',
                       'token','serverid','uname','upass','phase','create_with_email',                        'token','serverid','uname','upass','phase','create_with_email',
                       'code','useremail','crypt','cfirstname','clastname',                        'code','crypt','cfirstname','clastname','g-recaptcha-response',
                         'recaptcha_challenge_field','recaptcha_response_field',
                       'cmiddlename','cgeneration','cpermanentemail','cid']).                        'cmiddlename','cgeneration','cpermanentemail','cid']).
                   '</form>');                    '</form>');
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
   sub get_usertype {
       my ($domain) = @_;
       my $usertype;
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);
       if (ref($types) eq 'ARRAY') {
           push(@{$types},'default');
           my $posstype = $env{'form.type'};
           $posstype =~ s/^\s+|\s$//g;
           if (grep(/^\Q$posstype\E$/,@{$types})) {
               $usertype = $posstype;
           }
       }
       return $usertype;
   }
   
 sub selfenroll_crumbs {  sub selfenroll_crumbs {
     my ($r,$courseid,$desc) = @_;      my ($r,$courseid,$desc) = @_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 286  sub selfenroll_crumbs { Line 415  sub selfenroll_crumbs {
     }      }
     my $last_crumb;      my $last_crumb;
     if ($desc ne '') {      if ($desc ne '') {
         $last_crumb = &mt('Self-enroll in [_1]','<span class="LC_cusr_emph">'.$desc.'</span>');          $last_crumb = &mt("Self-enroll in [_1]","'$desc'");
     } else {      } else {
         $last_crumb = &mt('Self-enroll');          $last_crumb = &mt('Self-enroll');
     }      }
Line 297  sub selfenroll_crumbs { Line 426  sub selfenroll_crumbs {
     return;      return;
 }  }
   
 sub validate_course {  sub javascript_setforms {
     my ($courseid) = @_;      my ($now,$emailusername,$captcha,$usertype,$recaptchaversion,$usernameset,$condition,$excluded) =  @_;
     my ($cdom,$cnum) = ($courseid =~ /^($match_domain)_($match_courseid)$/);      my ($setuserinfo,@required,$requiredchk);
     if (($cdom ne '') && ($cnum ne '')) {      if (ref($emailusername) eq 'HASH') {
         if (&Apache::lonnet::is_course($cdom,$cnum)) {          if (ref($emailusername->{$usertype}) eq 'HASH') {  
             return ($courseid);              foreach my $key (sort(keys(%{$emailusername->{$usertype}}))) {
                   if ($emailusername->{$usertype}{$key} eq 'required') {
                       push(@required,$key); 
                   }
                   $setuserinfo .= '                    server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
               }
               if ($usertype ne '') {
                   $setuserinfo .= '                    server.elements.type.value=client.elements.type.value;'."\n";
               }
         }          }
     }          if ($captcha eq 'original') {
     return;              $setuserinfo .= '                    server.elements.code.value=client.elements.code.value;'."\n".
 }                              '                    server.elements.crypt.value=client.elements.crypt.value;'."\n";
           } elsif ($captcha eq 'recaptcha') {
               if ($recaptchaversion ne '2') {
                   $setuserinfo .=
                   '                    server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".
                   '                    server.elements.recaptcha_response_field.value=client.elements.recaptcha_response_field.value;'."\n";
               }
           }
           if ($usernameset eq 'free') {
               $setuserinfo .=
                   '                    server.elements.username.value=client.elements.username.value;'."\n";
           }
       }
       if (@required) {
           my $missprompt = &mt('One or more required fields are currently blank.');
           &js_escape(\$missprompt);
           my $reqstr = join("','",@required);
           $requiredchk = <<"ENDCHK";
                   var requiredfields = new Array('$reqstr');
                   missing = 0; 
                   for (var i=0; i<requiredfields.length; i++) {
                       try {
                           eval("client.elements."+requiredfields[i]+".value");
                       }
                       catch(err) {
                           continue;
                       }
                       if (eval("client.elements."+requiredfields[i]+".value") == '') {
                           missing ++;
                       }
                   }
                   if (missing > 0) {
                       alert("$missprompt");
                       return false;
                   }
   
 sub javascript_setforms {  ENDCHK
     my ($now) =  @_;      }
     my $js = <<ENDSCRIPT;      my $js = <<ENDSCRIPT;
  <script type="text/javascript" language="JavaScript">  <script type="text/javascript">
     function send() {  // <![CDATA[
         this.document.server.elements.uname.value = this.document.client.elements.uname.value;      function send(one,two,context) {
         this.document.server.elements.udom.value = this.document.client.elements.udom.value;          var server;
         uextkey=this.document.client.elements.uextkey.value;          var client;
         lextkey=this.document.client.elements.lextkey.value;          if (document.forms[one]) {
         initkeys();              server = document.forms[one];
               if (document.forms[two]) {
         this.document.server.elements.upass.value                  client = document.forms[two];
             = crypted(this.document.client.elements.upass$now.value);  $requiredchk
                   server.elements.uname.value = client.elements.uname.value;
         this.document.client.elements.uname.value='';                  server.elements.udom.value = client.elements.udom.value;
         this.document.client.elements.upass$now.value='';  
                   uextkey=client.elements.uextkey.value;
         this.document.server.submit();                  lextkey=client.elements.lextkey.value;
                   initkeys();
                   server.elements.upass.value
                       = getCrypted(client.elements.upass$now.value);
                   client.elements.uname.value='';
                   client.elements.upass$now.value='';
                   if (context == 'email') {
   $setuserinfo
                       client.elements.upasscheck$now.value='';
                   }
                   server.submit();
               }
           }
         return false;          return false;
     }      }
  </script>  
   // ]]>
   </script>
 ENDSCRIPT  ENDSCRIPT
       if (($captcha eq 'recaptcha') && ($recaptchaversion eq '2')) {
           $js .= "\n".'<script src="https://www.google.com/recaptcha/api.js"></script>'."\n";
       }
     return $js;      return $js;
 }  }
   
 sub javascript_checkpass {  sub javascript_checkpass {
     my ($now) = @_;      my ($now,$context,$domain) = @_;
     my $nopass = &mt('You must enter a password.');      my $nopass = &mt('You must enter a password.');
     my $mismatchpass = &mt('The passwords you entered did not match.').'\\n'.      my $mismatchpass = &mt('The passwords you entered did not match.')."\n".
                        &mt('Please try again.');                          &mt('Please try again.'); 
       my ($numrules,$intargjs) =
           &Apache::loncommon::passwd_validation_js('upass',$domain);
       &js_escape(\$nopass);
       &js_escape(\$mismatchpass);
     my $js = <<"ENDSCRIPT";      my $js = <<"ENDSCRIPT";
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript">
     function checkpass() {  // <![CDATA[
         var upass = this.document.client.elements.upass$now.value;      function checkpass(one,two) {
         var upasscheck = this.document.client.elements.upasscheck$now.value;          var client;
         if (upass == '') {          if (document.forms[two]) {
             alert("$nopass");              client = document.forms[two]; 
             return false;              var upass = client.elements.upass$now.value;
         }              var upasscheck = client.elements.upasscheck$now.value;
         if (upass == upasscheck) {              if (upass == '') {
             this.document.client.elements.upasscheck$now.value='';                  alert("$nopass");
             send();                  return false;
             return false;              }
         } else {              if (upass == upasscheck) {
             alert("$mismatchpass");                  var numrules = $numrules;
             return false;                  if (numrules > 0) {
   $intargjs
                   }
                   client.elements.upasscheck$now.value='';
                   if (validate_email(client)) {
                       send(one,two,'$context');
                   } 
                   return false;
               } else {
                   alert("$mismatchpass");
                   return false;
               }
         }          }
           return false; 
     }      }
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     return $js;      return $js;
 }  }
   
 sub javascript_validmail {  sub javascript_validmail {
     my %lt = &Apache::lonlocal::texthash (      my ($condition) = @_;
       my %js_lt = &Apache::lonlocal::texthash (
                email => 'The e-mail address you entered',                 email => 'The e-mail address you entered',
                notv  => 'is not a valid e-mail address',                 notv  => 'is not a valid e-mail address',
                  avae  => 'A valid e-mail address is not formed when the value you entered is combined with the required domain',
     );      );
     my $output =  "\n".'<script type="text/javascript">'."\n".      my $output =  "\n".'<script type="text/javascript">'."\n".
                     '// <![CDATA['."\n".
                   &Apache::lonhtmlcommon::javascript_valid_email()."\n";                    &Apache::lonhtmlcommon::javascript_valid_email()."\n";
       &js_escape(\%js_lt);
     $output .= <<"ENDSCRIPT";      $output .= <<"ENDSCRIPT";
 function validate_email() {  function validate_email(client) {
     field = document.createaccount.useremail;      field = client.uname;
     if (validmail(field) == false) {      var condition = '$condition';
         alert("$lt{'email'}: "+field.value+" $lt{'notv'}.");      if (validmail(field,condition) == false) {
           if ((condition != undefined) && (condition != '')) {
               alert("$js_lt{'avae'}: "+condition);
           } else {
               alert("$js_lt{'email'}: "+field.value+" $js_lt{'notv'}.");
           }
         return false;          return false;
     } else {  
        var emailaddr = field.value;  
        var lcemail = emailaddr.toLowerCase();  
        if (emailaddr != lcemail) {  
            field.value = lcemail;  
            alert("WebCenter usernames are all lower case.\\nAccordingly your username will be "+lcemail+" once activated.");  
        }  
     }      }
     return true;      return true;
 }  }
 ENDSCRIPT  ENDSCRIPT
     $output .= "\n".'</script>'."\n";      $output .= "\n".'// ]]>'."\n".'</script>'."\n";
     return $output;      return $output;
 }  }
   
 sub print_username_form {  sub print_username_form {
     my ($domain,$domdesc,$cancreate,$now,$lonhost,$courseid) = @_;      my ($r,$domain,$domdesc,$cancreate,$now,$lonhost,$include,$courseid,$emailusername,
     my %lt = &Apache::lonlocal::texthash(          $statusforemail,$usernameset,$condition,$excluded,$usertype,$types,$usertypes,
                                          unam => 'username',          $othertitle) = @_;
                                          udom => 'domain',      my %lt = &Apache::lonlocal::texthash (
                                          uemail => 'E-mail address in LON-CAPA',                                           crac => 'Create account with a username provided by this institution',
                                          proc => 'Proceed');                                           clca => 'Create LON-CAPA account',
                                            type => 'Type in your log-in ID and password to find out.',
                                            plse => 'Please provide a password for your new account.',
                                            info => 'Please provide user information and a password for your new account.',
                                            yopw => 'Your password will be encrypted when sent (and stored).',
                                            crae => 'Create account using e-mail address verification',
                                            );
     my $output;      my $output;
     if (ref($cancreate) eq 'ARRAY') {      if (ref($cancreate) eq 'ARRAY') {
         if (grep(/^login$/,@{$cancreate})) {          if (grep(/^login$/,@{$cancreate})) {
             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>'.$lt{'crac'}.'</h3>';
                 my $submit_text = &mt('Create LON-CAPA account');                  $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 />').
                 $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 />';                             '<br /><br />'.
                 $output .= &login_box($now,$lonhost,$courseid,$submit_text,                             $lt{'type'}.
                              '<br /><br />';
                   $output .= &login_box($now,$lonhost,$courseid,$lt{'clca'},
                                       $domain,'createaccount').'</div>';                                        $domain,'createaccount').'</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>'.$lt{'crae'}.'</h3>';
             my $captchaform = &create_recaptcha();              if ($usertype ne '') {
             if ($captchaform) {                  if ((ref($statusforemail) eq 'ARRAY') && (@{$statusforemail} > 0)) {
                 my $submit_text = &mt('Request LON-CAPA account');                      unless (grep(/^\Q$usertype\E$/,@{$statusforemail})) {
                 my $emailform = '<input type="text" name="useremail" size="25" value="" />';                          undef($usertype);
                 if (grep(/^login$/,@{$cancreate})) {                      }
                     $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 />';                  } elsif ($usertype ne 'default') {
                 } else {                      undef($usertype);
                     $output .= '<br />';  
                 }                  }
                 $output .=  '<form name="createaccount" method="post" onSubmit="return validate_email()" action="/adm/createaccount">'.              }
                             &Apache::lonhtmlcommon::start_pick_box()."\n".              if (($usertype eq '') && (ref($statusforemail) eq 'ARRAY') && 
                             &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),                  (@{$statusforemail} > 0) && (ref($types) eq 'ARRAY') && (@{$types} > 0)) {
                                                              'LC_pick_box_title')."\n".                  my @posstypes = @{$types};
                             $emailform."\n".                  unless (grep(/^default$/,@posstypes)) {
                             &Apache::lonhtmlcommon::row_closure(1).                      push(@posstypes,'default');
                             &Apache::lonhtmlcommon::row_title(&mt('Validation'),  
                                                              'LC_pick_box_title')."\n".  
                             $captchaform."\n".  
                             &mt('If either word is hard to read, [_1] will replace them.','<image src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />').'<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 .= '<p>'.&mt('Choose your affiliation at [_1]',$domdesc).'</p>'."\n".
                              '<form name="reportstatus" id="LC_reportstatus" action="/adm/createaccount" method="post" '.
                              'onsubmit="return checkVerification();"><p>';
                   foreach my $type (@posstypes) {
                       my $name;
                       if ($type eq 'default') {
                           $name = $othertitle;
                       } else {
                           $name = $type;
                           if (ref($usertypes) eq 'HASH') {
                               if (exists($usertypes->{$type})) {
                                   $name = $usertypes->{$type};
                               }
                           }
                       }
                       my $checked;
                       if ($env{'form.type'} eq $type) {
                           $checked = ' checked="checked"';
                       }
                       $output .= '<label><input type="radio" name="type" value="'.$type.'"'.$checked.' />'.
                                  $name.'</label>'.('&nbsp;'x2);
                   }
                   if ($env{'form.courseid'} =~ /^$match_domain\_$match_courseid$/) {
                       $output .= "\n".'<input type="hidden" name="courseid" value="'.$env{'form.courseid'}.'" />';
                   }
                   $output .= '</p>'."\n".'<p><input type="submit" name="reportedtype" value="'.&mt('Submit').'" /></p></form>';
             } else {              } else {
                 my $helpdesk = '/adm/helpdesk?origurl=%2fadm%2fcreateaccount';                  my ($captchaform,$error,$captcha,$recaptchaversion) = 
                 if ($courseid ne '') {                      &Apache::loncommon::captcha_display('usercreation',$lonhost);
                     $helpdesk .= '&courseid='.$courseid;                  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 use of an e-mail address to request a LON-CAPA account.','<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 {
                       if (grep(/^login$/,@{$cancreate})) {
                           $output .= &mt('If you do not have a log-in ID at your institution, [_1]provide your e-mail address to request a LON-CAPA account.','<br />').'<br /><br />'.
                                      $lt{'plse'}.'<br />'.
                                      $lt{'yopw'}.'<br />';
                       } else {
                           my $prompt = $lt{'plse'};
                           if (ref($emailusername) eq 'HASH') {
                               if (ref($emailusername->{$usertype}) eq 'HASH') {
                                   if (keys(%{$emailusername->{$usertype}}) > 0) {
                                       $prompt = $lt{'info'};
                                   }
                               }
                           }
                           $output .= $prompt.'<br />'.
                                      $lt{'yopw'}.'<br />';
                       }
                       if ($usertype eq '') {
                           $usertype = 'default';
                       } elsif (ref($usertypes) eq 'HASH') {
                           my $usertitle;
                           if ($usertype eq 'default') {
                               $usertitle = $othertitle;
                           } elsif (exists($usertypes->{$usertype})) {
                               $usertitle = $usertypes->{$usertype};
                           }
                           if ($usertitle ne '') {
                               $output .= &mt('Self-reported affiliation: [_1]',
                                              '<span style="font-style: italic;">'.$usertitle.'</span>').
                                          '<br />';
                           }
                       }
                       $output .= &print_dataentry_form($r,$domain,$lonhost,$include,$now,$captchaform,
                                                        $courseid,$emailusername,$captcha,$usertype,
                                                        $recaptchaversion,$usernameset,$condition,$excluded);
                 }                  }
                 $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()">');  
             }              }
             $output .= '</div>';              $output .= '</div>';
         }          }
     }      }
     if ($output eq '') {      if ($output eq '') {
         $output = &mt('Creation of a new LON-CAPA user account using an e-mail address or an institutional log-in ID as your username is not permitted at [_1].',$domdesc);          $output = &mt('Creation of a new LON-CAPA user account using an institutional log-in ID or verification by e-mail is not permitted at [_1].',$domdesc);
     } else {      } else {
         $output .= '<div class="LC_clear_float_footer"></div>';          $output .= '<div class="LC_clear_float_footer"></div>';
     }      }
Line 467  sub login_box { Line 734  sub login_box {
                                               createaccount => 'Log-in ID',                                                createaccount => 'Log-in ID',
                                               selfenroll    => 'Username',                                                selfenroll    => 'Username',
                                             );                                              );
     my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();      my ($lkey,$ukey) = &Apache::loncommon::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);
     $output = &serverform($logtoken,$lonhost,undef,$courseid,$context);      $output = &serverform($logtoken,$lonhost,undef,$courseid,$context);
     my $unameform = '<input type="text" name="uname" size="20" value="" />';      my $unameform = '<input type="text" name="uname" size="20" value="" autocomplete="off" />';
     my $upassform = '<input type="password" name="upass'.$now.'" size="20" />';      my $upassform = '<input type="password" name="upass'.$now.'" size="20" autocomplete="new-password" />';
     $output .= '<form name="client" method="post" onsubmit="return(send());">'."\n".      $output .= '<form name="client" method="post" action="" onsubmit="return(send('."'server','client'".'));">'."\n".
                '<input type="hidden" name="udom" value="'.$domain.'" />'.  
                &Apache::lonhtmlcommon::start_pick_box()."\n".                 &Apache::lonhtmlcommon::start_pick_box()."\n".
                &Apache::lonhtmlcommon::row_title($titles{$context},                 &Apache::lonhtmlcommon::row_title($titles{$context},
                                                  'LC_pick_box_title')."\n".                                                   'LC_pick_box_title')."\n".
Line 484  sub login_box { Line 750  sub login_box {
                &Apache::lonhtmlcommon::row_title(&mt('Password'),                 &Apache::lonhtmlcommon::row_title(&mt('Password'),
                                                 'LC_pick_box_title')."\n".                                                  'LC_pick_box_title')."\n".
                $upassform;                 $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).      $output .= &Apache::lonhtmlcommon::row_closure(1).
                &Apache::lonhtmlcommon::row_title().                 &Apache::lonhtmlcommon::row_title().
                '<br /><input type="submit" name="username_validation" value="'.                 '<br /><input type="submit" name="username_validation" value="'.
Line 504  sub login_box { Line 780  sub login_box {
   
 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,$emailusername,$courseid,$usertype,$usernameset,
     $useremail = lc($env{'form.useremail'});          $condition,$excluded,$hascustom) = @_;
     my $output;      my ($output,$uname);
     if (ref($cancreate) eq 'ARRAY') {      if (ref($cancreate) eq 'ARRAY') {
         if (!grep(/^email$/,@{$cancreate})) {          if (!grep(/^email$/,@{$cancreate})) {
             $output = &invalid_state('noemails',$domdesc,              $output = &invalid_state('noemails',$domdesc,
                                      $contact_name,$contact_email);                                       $contact_name,$contact_email);
             return $output;              return $output;
         } elsif ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) {          } elsif ((($condition ne '') && ($useremail !~ /^[^\@]+$/)) ||
                    (($condition eq '') && ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/))) {
             $output = &invalid_state('baduseremail',$domdesc,              $output = &invalid_state('baduseremail',$domdesc,
                                      $contact_name,$contact_email);                                       $contact_name,$contact_email);
             return $output;              return $output;
         } else {          } else {
             my $uhome = &Apache::lonnet::homeserver($useremail,$domain);              $useremail =~ s/^\s+|\s+$//g;
               my $possuname;
               if ($condition ne '') {
                   if ($usernameset eq 'first') {
                       $possuname = $useremail;
                   }
                   $useremail .= $condition;
               } elsif ($excluded ne '') {
                   if ($useremail =~ /^[^\@]+\Q$excluded\E$/) {
                       $output = &invalid_state('userrules',$domdesc,
                                        $contact_name,$contact_email);
                       return $output;
                   } 
               }
               if (($usernameset eq 'free') && ($env{'form.username'} ne '')) {
                   $possuname = $env{'form.username'};
               } elsif (($usernameset eq 'first') && ($condition eq '')) {
                   if ($condition eq '') {
                       ($possuname) = ($useremail =~ /^([^\@]+)\@/);
                   }
               }
               if ($possuname ne '') {
                   $possuname  =~ s/^\s+|\s+$//g;
                   if ($possuname ne '') {
                       $uname=&LONCAPA::clean_username($possuname);
                       if ($uname ne $possuname) {
                           $output = &invalid_state('badusername',$domdesc,
                                                    $contact_name,$contact_email);
                           return $output;
                       }
                   }
               }
               if ($possuname eq '') {
                   $uname=&LONCAPA::clean_username($useremail);
                   if ($useremail ne $uname) {
                       $output = &invalid_state('badusername',$domdesc,
                                                $contact_name,$contact_email);
                       return $output;
                   }
               }
               my $uhome = &Apache::lonnet::homeserver($uname,$domain);
             if ($uhome ne 'no_host') {              if ($uhome ne 'no_host') {
                 $output = &invalid_state('existinguser',$domdesc,                  $output = &invalid_state('existinguser',$domdesc,
                                          $contact_name,$contact_email,'',$useremail);                                           $contact_name,$contact_email);
                 return $output;                  return $output;
             } else {              } else {
                  my $captcha = Captcha::reCAPTCHA->new;                  my ($captcha_chk,$captcha_error) = &Apache::loncommon::captcha_response('usercreation',$server);
                  my $captcha_result =                  if ($captcha_chk != 1) {
                      $captcha->check_answer(                      $output = '<span class="LC_warning">'.
                                             'PRIVATEKEY',                                &mt('Validation of the code you entered failed.').'</span>'.
                                             $ENV{'REMOTE_ADDR'},                                '<br />'.$captcha_error."\n".'<br /><p>'.
                                             $env{'form.recaptcha_challenge_field'},                                 &mt('[_1]Return[_2] to the previous page to try again.',
                                             $env{'form.recaptcha_response_field'},                                     '<a href="javascript:document.retryemail.submit();">','</a>')."\n".
                                            );                                '<form name="retryemail" action="/adm/createaccount" method="post" />'.
                 if (!$captcha_result->{is_valid}) {                                '<input type="hidden" name="domain" value="'.$domain.'" />'."\n";
                     $output = &invalid_state('captcha',$domdesc,$contact_name,                      if ($env{'form.courseid'} =~ /^$match_domain\_$match_courseid$/) {
                                              $contact_email);                          $output .= '<input type="hidden" name="courseid" value="'.$env{'form.courseid'}.'" />'."\n";
                       }
                       if ($env{'form.type'}) {
                           my $usertype = &get_usertype($domain);
                           if ($usertype ne '') {
                               $output .= '<input type="hidden" name="type" value="'.$usertype.'" />'."\n".
                                          '<input type="hidden" name="reportedtype" value="'.&mt('Submit').'" />'."\n";
                           }
                       }
                       $output .= '</form></p>';
                     return $output;                      return $output;
                 }                  }
                 my $uhome=&Apache::lonnet::homeserver($useremail,$domain);                  my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);
                 if ($uhome eq 'no_host') {                  &call_rulecheck($uname,$domain,\%alerts,\%rulematch,
                     my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);                                  \%inst_results,\%curr_rules,\%got_rules,'username');
                     &call_rulecheck($useremail,$domain,\%alerts,\%rulematch,                  if (ref($alerts{'username'}) eq 'HASH') {
                                     \%inst_results,\%curr_rules,%got_rules,'username');                      if (ref($alerts{'username'}{$domain}) eq 'HASH') {
                     if (ref($alerts{'username'}) eq 'HASH') {                          if ($alerts{'username'}{$domain}{$uname}) {
                         if (ref($alerts{'username'}{$domain}) eq 'HASH') {                              $output = &invalid_state('userrules',$domdesc,
                             if ($alerts{'username'}{$domain}{$useremail}) {                                                       $contact_name,$contact_email);
                                 $output = &invalid_state('userrules',$domdesc,                              return $output;
                                                          $contact_name,$contact_email);  
                                 return $output;  
                             }  
                         }                          }
                     }                      }
                   }
                   if ($hascustom) {
                     my $format_msg =                       my $format_msg = 
                         &guest_format_check($useremail,$domain,$cancreate,                          &guest_format_check($useremail,$domain,$cancreate,
                                             $settings);                                              $settings,$usertype);
                     if ($format_msg) {                      if ($format_msg) {
                         $output = &invalid_state('userformat',$domdesc,$contact_name,                          $output = &invalid_state('userformat',$domdesc,$contact_name,
                                                  $contact_email,$format_msg);                                                   $contact_email,$format_msg);
Line 563  sub process_email_request { Line 887  sub process_email_request {
             }              }
         }          }
         $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,          $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
                           $contact_email,$courseid);                                $contact_email,$courseid,$emailusername,$usertype,
                                 $uname);
     }      }
     return $output;      return $output;
 }  }
Line 583  sub call_rulecheck { Line 908  sub call_rulecheck {
 }  }
   
 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,$emailusername,
           $usertype,$uname) = @_;
     my $msg = '<h3>'.&mt('Account creation status').'</h3>'.      my $msg = '<h3>'.&mt('Account creation status').'</h3>'.
               &mt('Thank you for your request to create a new LON-CAPA account.').                &mt('Thank you for your request to create a new LON-CAPA account.').
               '<br /><br />';                '<br /><br />';
     my $now = time;      my $now = time;
     my %info = ('ip'         => $ENV{'REMOTE_ADDR'},      $env{'form.logtoken'} =~ s/(`)//g;
                 'time'       => $now,      if ($env{'form.logtoken'}) {
                 'domain'     => $domain,          my $logtoken = $env{'form.logtoken'};
                 'username'   => $email,          my $earlyout;
                 'courseid'   => $courseid);          my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$server);
     my $token = &Apache::lonnet::tmpput(\%info,$server);          if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
     if ($token !~ /^error/ && $token ne 'no_such_host') {              $msg = &mt('Information needed to process your request is missing, inaccessible or expired.')
         my $esc_token = &escape($token);                    .'<br /><p>'.&mt('[_1]Return[_2] to the previous page to try again.',
         my $showtime = localtime(time);                                     '<a href="javascript:document.retryemail.submit();">','</a>');
         my $mailmsg = &mt('A request was submitted on [_1] for creation of a GCI WebCenter account.',$showtime)." \n".              $earlyout = 1;
              &mt('To complete this process please open a web browser and enter the following URL in the address/location box: [_1]',          } else {
                  "\n\n".&Apache::lonnet::absolute_url().'/adm/createaccount?token='.$esc_token);              my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$server);
         my $result = &Apache::resetpw::send_mail($domdesc,$email,$mailmsg,$contact_name,              unless ($reply eq 'ok') {
                                                  $contact_email);                  $msg .= &mt('Request could not be processed.');
         if ($result eq 'ok') {              }
             $msg .= &mt('A message has been sent to the e-mail address you provided.').'<br />'.&mt('The message includes the web address for the link you will use to complete the account creation process.').'<br />'.&mt("The link included in the message will be valid for the next [_1]two[_2] hours.",'<b>','</b>');          }
   # Check if the password entered by the user satisfies domain's requirements
           my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
           my ($min,$max,@chars);
           $min = $Apache::lonnet::passwdmin;
           if (ref($passwdconf{'chars'}) eq 'ARRAY') {
               if ($passwdconf{'min'} =~ /^\d+$/) {
                   if ($passwdconf{'min'} > $min) {
                       $min = $passwdconf{'min'};
                   }
               }
               if ($passwdconf{'max'} =~ /^\d+$/) {
                   $max = $passwdconf{'max'};
               }
               @chars = @{$passwdconf{'chars'}};
           }
           my $encpass = $env{'form.upass'};
           if ($encpass eq '') {
               $msg = &mt('Password retrieved was blank.').
                      '<br /><p>'.&mt('[_1]Return[_2] to the previous page to try again.',
                                      '<a href="javascript:document.retryemail.submit();">','</a>');
               $earlyout = 1;
           } else {
   # Split the logtoken to retrieve the DES key and decrypt the encypted password
               my ($key,$caller)=split(/&/,$tmpinfo);
               if ($caller eq 'createaccount') {
                   my $plainpass = &Apache::loncommon::des_decrypt($key,$encpass);
                   if (($min > 0) || ($max ne '') || (@chars > 0)) {
                       my $warning = &Apache::loncommon::check_passwd_rules($domain,$plainpass);
                       if ($warning) {
                           $msg = $warning.
                                  '<p>'.&mt('[_1]Return[_2] to the previous page to try again.',
                                            '<a href="javascript:document.retryemail.submit();">','</a>');
                           $earlyout = 1;
                       }
                   }
               }
           }
           if ($earlyout) {
               $msg .= '<form name="retryemail" action="/adm/createaccount" method="post" />'.
                       '<input type="hidden" name="domain" value="'.$domain.'" />'."\n";
               if ($env{'form.courseid'} =~ /^$match_domain\_$match_courseid$/) {
                   $msg .= '<input type="hidden" name="courseid" value="'.$env{'form.courseid'}.'" />'."\n";
               }
               if ($env{'form.type'}) {
                   my $usertype = &get_usertype($domain);
                   if ($usertype ne '') {
                       $msg .= '<input type="hidden" name="type" value="'.$usertype.'" />'.
                               '<input type="hidden" name="reportedtype" value="'.&mt('Submit').'" />'."\n";
                   }
               }
               $msg .= '</form></p>';
               return $msg;
           }
           my $ip = &Apache::lonnet::get_requestor_ip();
           my %info = ('ip'         => $ip,
                       'time'       => $now,
                       'domain'     => $domain,
                       'username'   => $email,
                       'courseid'   => $courseid,
                       'upass'      => $env{'form.upass'},
                       'serverid'   => $env{'form.serverid'},
                       'tmpinfo'    => $tmpinfo);
           if ($uname ne '') {
               $info{'username'} = $uname;
               $info{'email'} = $email;
           }
           if (ref($emailusername) eq 'HASH') {
               if (ref($emailusername->{$usertype}) eq 'HASH') {
                   foreach my $item (keys(%{$emailusername->{$usertype}})) {
                       $info{$item} = $env{'form.'.$item};
                       $info{$item} =~ s/(`)//g;
                   }
               }
           }
           if ($usertype ne '') {
              $info{'usertype'} = $usertype;
           }
           my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');
           if ($token !~ /^error/ && $token ne 'no_such_host') {
               my $esc_token = &escape($token);
               my $showtime = localtime(time);
               my $mailmsg = &mt('A request was submitted on [_1] for creation of a LON-CAPA account at the following institution: [_2].',$showtime,$domdesc).' '.
                             &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);
               my $result = &Apache::resetpw::send_mail($domdesc,$email,$mailmsg,$contact_name,
                                                        $contact_email);
               if ($result eq 'ok') {
                   $msg .= &mt('A message has been sent to the e-mail address you provided.').'<br />'.
                           &mt('The message includes the web address for the link you will use to complete the account creation process.').'<br />'.
                           &mt("The link included in the message will be valid for the next [_1]two[_2] hours.",'<b>','</b>');
               } else {
                   $msg .= '<span class="LC_error">'.
                           &mt('An error occurred when sending a message to the e-mail address you provided.').'</span><br />'.
                           ' '.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);
               }
         } else {          } else {
             $msg .= '<span class="LC_error">'.              $msg .= '<span class="LC_error">'.
                     &mt('An error occurred when sending a message to the e-mail address you provided.').'</span><br />'.                      &mt('An error occurred creating a token required for the account creation process.').'</span><br />'.
                     ' '.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);                      ' '.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);
         }          }
     } else {      } else {
         $msg .= '<span class="LC_error">'.          $msg .=  $msg = &mt('Information needed to process your request is missing, inaccessible or expired.')
                 &mt('An error occurred creating a token required for the account creation process.').'</span><br />'.                  .'<br />'.&mt('Return to the previous page to try again.');
                 ' '.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);  
     }      }
     return $msg;      return $msg;
 }  }
   
 sub process_mailtoken {  sub process_mailtoken {
     my ($r,$token,$contact_name,$contact_email,$domain,$domdesc,$lonhost,      my ($r,$token,$contact_name,$contact_email,$domain,$domdesc,$lonhost,
         $include,$start_page) = @_;          $include,$start_page,$cancreate,$settings,$types) = @_;
     my ($msg,$nostart,$noend);      my ($msg,$nostart,$noend,$redirect);
     my %data = &Apache::lonnet::tmpget($token);      my %data = &Apache::lonnet::tmpget($token);
     my $now = time;      my $now = time;
     if (keys(%data) == 0) {      if (keys(%data) == 0) {
         $msg = &mt('Sorry, the URL you provided to complete creation of a new LON-CAPA account was invalid.')          $msg = &mt('Sorry, the URL you provided to complete creation of a new LON-CAPA account was invalid.')
                .' '.&mt('Either the token included in the URL has been deleted or the URL you provided was invalid.')                 .' '.&mt('Either the token included in the URL has been deleted or the URL you provided was invalid.')
                .' '.&mt('Please submit a [_1]new request[_2] for account creation and follow the new link page included in the e-mail that will be sent to you.','<a href="/adm/createaccount">','</a>');                 .' '.&mt('Please submit a [_1]new request[_2] for account creation and follow the new link page included in the e-mail that will be sent to you.',
                           '<a href="/adm/createaccount">','</a>');
         return $msg;          return $msg;
     }      }
     if (($data{'time'} =~ /^\d+$/) &&      if (($data{'time'} =~ /^\d+$/) &&
         ($data{'domain'} ne '') &&          ($data{'domain'} ne '') &&
         ($data{'username'}  =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/)) {          ((($data{'email'} =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) && ($data{'username'} =~ /^$match_username$/)) ||
             ($data{'username'}  =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/))) {
         if ($now - $data{'time'} < 7200) {          if ($now - $data{'time'} < 7200) {
             if ($env{'form.phase'} eq 'createaccount') {  # Check if request should be queued.
                 my ($result,$output) = &create_account($r,$domain,$lonhost,              if (ref($cancreate) eq 'ARRAY') {
                                                        $data{'username'},$domdesc);                  my ($disposition,$usertype);
                 if ($result eq 'ok') {                  if (grep(/^email$/,@{$cancreate})) {
                     $msg = $output;                       if (exists($data{'usertype'})) {
                     my $shownow = &Apache::lonlocal::locallocaltime($now);                          $usertype = $data{'usertype'};
                     my $mailmsg = &mt('A GCI WebCenter account has been created [_1] from IP address: [_2].  If you did not perform this action or authorize it, please contact the [_3] ([_4]).',$shownow,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n";                          my @posstypes;
                     my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},                          if (ref($types) eq 'ARRAY') {
                                                                  $mailmsg,$contact_name,                              @posstypes = @{$types};
                                                                  $contact_email);                              if (@posstypes) {
                     if ($mailresult eq 'ok') {                                  unless (grep(/^default$/,@posstypes)) {
                         $msg .= &mt('An e-mail confirming creation of your new LON-CAPA account has been sent to [_1].',$data{'username'});                                      push(@posstypes,'default');
                                   }
                               }
                               if (grep(/\Q$usertype\E/,@posstypes)) {
                                   unless ($usertype eq 'default') {
                                       $data{'inststatus'} = $usertype;
                                   }
                               } else {
                                   $disposition = 'approval';
                               }
                           }
                           delete($data{'usertype'});
                       }
                       if (ref($settings) eq 'HASH') {
                           if (ref($settings->{'cancreate'}) eq 'HASH') {
                               if (ref($settings->{'cancreate'}{'selfcreateprocessing'}) eq 'HASH') {
                                   if ($usertype ne '') {
                                       $disposition = $settings->{'cancreate'}{'selfcreateprocessing'}{$usertype};
                                       unless ($disposition =~ /^(approval|automatic)$/) {
                                           $disposition = 'approval';
                                       }
                                   }
                               }
                           }
                       }
                       if ($disposition eq 'approval') {
                           $msg = &store_request($domain,$data{'username'},'approval',\%data,$settings);
                           my $delete = &Apache::lonnet::tmpdel($token);
                     } else {                      } else {
                         $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});                          my ($result,$output,$uhome) = 
                               &create_account($r,$domain,$domdesc,\%data);
                           if ($result eq 'ok') {
                               $msg = $output;
                               my $ip = &Apache::lonnet::get_requestor_ip();
                               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,$ip,$contact_name,$contact_email)."\n";
                               my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},
                                                                           $mailmsg,$contact_name,
                                                                           $contact_email);
                               if ($mailresult eq 'ok') {
                                   $msg .= &mt('An e-mail confirming creation of your new LON-CAPA account has been sent to [_1].',$data{'username'});
                               } else {
                                   $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});
                               }
                               $redirect = &start_session($r,$data{'username'},$domain,$uhome,
                                                          $data{'courseid'},$token);
                               $nostart = 1;
                               $noend = 1;
                           } else {
                               $msg .= &mt('A problem occurred when attempting to create your new LON-CAPA account.')
                                      .'<br />'.$output;
                               if (($contact_name ne '') && ($contact_email ne '')) {
                                   $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);
                               }
                           }
                           my $delete = &Apache::lonnet::tmpdel($token);
                     }                      }
                     my %form = &start_session($r,$data{'username'},$domain,   
                                               $lonhost,$data{'courseid'},  
                                               $token);  
                     $nostart = 1;  
                     $noend = 1;  
                 } else {                  } else {
                     $msg .= &mt('A problem occurred when attempting to create your new LON-CAPA account.')                      $msg = &invalid_state('noemails',$domdesc,$contact_name,$contact_email);
                            .'<br />'.$output  
 #                           .&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,'<a href="mailto:'.$contact_email.'">'.$contact_email.'</a>');  
                            .&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);  
                 }                  }
                 my $delete = &Apache::lonnet::tmpdel($token);  
             } else {              } else {
                 $msg .= &mt('Please provide user information and a password for your new account.').'<br />'.&mt('Your password, which must contain at least seven characters, will be sent to the LON-CAPA server in an encrypted form.').'<br />';                  $msg = &invalid_state('noemails',$domdesc,$contact_name,$contact_email);
                 $msg .= &print_dataentry_form($r,$domain,$lonhost,$include,$token,$now,$data{'username'},$start_page);  
                 $nostart = 1;  
             }              }
         } else {          } else {
             $msg = &mt('Sorry, the token generated when you requested creation of an account has expired.')              $msg = &mt('Sorry, the token generated when you requested creation of an account has expired.')
Line 673  sub process_mailtoken { Line 1138  sub process_mailtoken {
         $msg .= &mt('Sorry, the URL generated when you requested creation of an account contained incomplete information.')          $msg .= &mt('Sorry, the URL generated when you requested creation of an account contained incomplete information.')
                .' '.&mt('Please submit a [_1]new request[_2] for account creation and follow the new link included in the e-mail that will be sent to you.','<a href="/adm/createaccount">','</a>');                 .' '.&mt('Please submit a [_1]new request[_2] for account creation and follow the new link included in the e-mail that will be sent to you.','<a href="/adm/createaccount">','</a>');
     }      }
     return ($msg,$nostart,$noend);      return ($msg,$nostart,$noend,$redirect);
 }  }
   
 sub start_session {  sub start_session {
     my ($r,$username,$domain,$lonhost,$courseid,$token) = @_;      my ($r,$username,$domain,$uhome,$courseid,$token) = @_;
     my %form = (      my ($is_balancer) = &Apache::lonnet::check_loadbalancing($username,$domain);
                 uname => $username,      if ($is_balancer) {
                 udom  => $domain,          Apache::lonauth::success($r, $username, $domain, $uhome,
                );              'noredirect', undef, {});
     my $firsturl = '/adm/roles';  
     if (defined($courseid)) {          Apache::lonnet::tmpdel($token) if $token;
         $courseid = &validate_course($courseid);  
         if ($courseid ne '') {          return 'redirect';
             $form{'courseid'} = $courseid;  
             $firsturl = '/adm/selfenroll?courseid='.$courseid;  
         }  
     }  
     if ($r->dir_config('lonBalancer') eq 'yes') {  
         &Apache::lonauth::success($r,$form{'uname'},$form{'udom'},  
                                   $lonhost,'noredirect',undef,\%form);  
         if ($token ne '') {   
             my $delete = &Apache::lonnet::tmpdel($token);  
         }  
         $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,$now,$captchaform,$courseid,$emailusername,$captcha,
           $usertype,$recaptchaversion,$usernameset,$condition,$excluded) = @_;
     my ($error,$output);      my ($error,$output);
     &print_header($r,$start_page);      if (open(my $jsh,"<","$include/londes.js")) {
     if (open(my $jsh,"<$include/londes.js")) {  
         while(my $line = <$jsh>) {          while(my $line = <$jsh>) {
             $r->print($line);              $r->print($line);
         }          }
         close($jsh);          close($jsh);
         $output .= &javascript_setforms($now)."\n".&javascript_checkpass($now);          $output = &javascript_setforms($now,$emailusername,$captcha,$usertype,$recaptchaversion,
         my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();                                         $usernameset,$condition,$excluded).
                     "\n".&javascript_checkpass($now,'email',$domain);
           my ($lkey,$ukey) = &Apache::loncommon::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 $formtag = '<form name="server" method="post" target="_top" action="/adm/createaccount">';          my $showsubmit = 1;
         my ($datatable,$rowcount) =          my $serverform =
             &Apache::loncreateuser::personal_data_display($username,$domain,              '<form name="createaccount" method="post" target="_top" action="/adm/createaccount">';
                                                           'email','selfcreate');          if ($courseid ne '') {
         if ($rowcount) {              $serverform .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";
             $output .= '<div class="LC_left_float">'.$formtag.$datatable;          }
         } else {          if (ref($emailusername) eq 'HASH') {
             $output .= $formtag;              if (ref($emailusername->{$usertype}) eq 'HASH') {
                   foreach my $field (sort(keys(%{$emailusername->{$usertype}}))) {
                       $serverform .= '<input type="hidden" name="'.$field.'" value="" />'."\n";
                   }
               }
           }
           if ($captcha eq 'original') {
               $serverform .= '
      <input type="hidden" name="crypt" value="" />
      <input type="hidden" name="code" value="" />
   ';
           } elsif ($captcha eq 'recaptcha') {
               if ($recaptchaversion eq '2') {
                   $serverform .= &Apache::lonhtmlcommon::start_pick_box().
                                  &Apache::lonhtmlcommon::row_title(&mt('Validation').'<b>*</b>',
                                                                    'LC_pick_box_title',
                                                                    'LC_oddrow_value')."\n".
                                                                    $captchaform.
                                  &Apache::lonhtmlcommon::row_closure(1)."\n".
                                  &Apache::lonhtmlcommon::row_title()."\n".
                                  '<br /><input type="button" name="createaccount" value="'.
                                  &mt('Create account').'" onclick="checkpass('."'createaccount','newemail'".')" />'.
                                  &Apache::lonhtmlcommon::row_closure(1)."\n".
                                  &Apache::lonhtmlcommon::end_pick_box();
                   undef($captchaform);
                   undef($showsubmit);
               } else {
                   $serverform .= '
      <input type="hidden" name="recaptcha_challenge_field" value="" />
      <input type="hidden" name="recaptcha_response_field" value="" />
   ';
               }
           }
           if ($usertype ne '') {
               $serverform .= '<input type="hidden" name="type" value="'.
                              &HTML::Entities::encode($usertype,'\'<>"&').'" />'."\n";
         }          }
         $output .= <<"ENDSERVERFORM";          if ($usernameset eq 'free') {
               $serverform .= '<input type="hidden" name="username" value="" />'."\n"; 
           }
           $serverform .= <<"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="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="udom" value="" />
    <input type="hidden" name="phase" value="createaccount" />     <input type="hidden" name="phase" value="createaccount" />
      <input type="hidden" name="create_with_email" value="1" />
   </form>    </form>
 ENDSERVERFORM  ENDSERVERFORM
         if ($rowcount) {          my $beginclientform = '<form name="newemail" method="post" action="" '.
             $output .= '</div>'.                                'onsubmit="return checkpass('."'createaccount','newemail'".');">'."\n";
                        '<div class="LC_left_float">';          my $endclientform;
           unless ($showsubmit) {
               if ($usertype ne '') {
                   $endclientform = '<input type="hidden" name="type" value="'.
                                    &HTML::Entities::encode($usertype,'\'<>"&').'" />'."\n";
               }
         }          }
         my $upassone = '<input type="password" name="upass'.$now.'" size="10" />';          $endclientform .= '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".
         my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="10" />';                            '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".
         my $submit_text = &mt('Create LON-CAPA account');                            '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".
         $output .= '<h3>'.&mt('Login Data').'</h3>'."\n".                            '</form>'."\n";
                    '<form name="client" method="post" '.          my ($datatable,$rowcount) =
                    'onsubmit="return checkpass();">'."\n".              &Apache::loncreateuser::personal_data_display('',$domain,'email','selfcreate',
                    &Apache::lonhtmlcommon::start_pick_box()."\n".                                                            '','',$now,$captchaform,
                    &Apache::lonhtmlcommon::row_title(&mt('Username'),                                                            $emailusername,$usertype,
                                                      'LC_pick_box_title',                                                            $usernameset,$condition,$excluded,
                                                      'LC_oddrow_value')."\n".                                                            $showsubmit);
                    $username."\n".  
                    &Apache::lonhtmlcommon::row_closure(1)."\n".  
                    &Apache::lonhtmlcommon::row_title(&mt('Password'),  
                                                     'LC_pick_box_title',  
                                                     'LC_oddrow_value')."\n".  
                    $upassone."\n".  
                    &Apache::lonhtmlcommon::row_closure(1)."\n".  
                    &Apache::lonhtmlcommon::row_title(&mt('Confirm password'),  
                                                      'LC_pick_box_title',  
                                                      '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::end_pick_box()."\n".  
                    '<input type="hidden" name="uname" value="'.$username.'" />'."\n".  
                    '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".  
                    '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".  
                    '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".  
                    '</form>';  
         if ($rowcount) {          if ($rowcount) {
             $output .= '</div>'."\n".              $output .= '<div class="LC_left_float">'.$beginclientform.$datatable.$endclientform.'</div>'."\n".
                        '<div class="LC_clear_float_footer"></div>'."\n";                         '<div class="LC_clear_float_footer"></div>'."\n";
           } else {
               $output .= $beginclientform.$endclientform;
         }          }
           $output .= $serverform.
                      '<p class="LC_info">'.
                      &mt('Fields marked [_1]*[_2] are required.','<b>','</b>').
                      '</p>';
     } 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 {  sub get_creation_controls {
     my ($domain,$usercreation) = @_;      my ($domain,$usercreation) = @_;
     my (@cancreate,@statustocreate);      my (@cancreate,@statustocreate,@statusforemail,$emailusername,$processing,
           $emailoptions,$verification,$emaildomain,$othertitle,$usertypes,$types);
     if (ref($usercreation) eq 'HASH') {      if (ref($usercreation) eq 'HASH') {
         if (ref($usercreation->{'cancreate'}) eq 'HASH') {          if (ref($usercreation->{'cancreate'}) eq 'HASH') {
               ($othertitle,$usertypes,$types) =
                   &Apache::loncommon::sorted_inst_types($domain);
             if (ref($usercreation->{'cancreate'}{'statustocreate'}) eq 'ARRAY') {              if (ref($usercreation->{'cancreate'}{'statustocreate'}) eq 'ARRAY') {
                 @statustocreate = @{$usercreation->{'cancreate'}{'statustocreate'}};                  @statustocreate = @{$usercreation->{'cancreate'}{'statustocreate'}};
                   if (@statustocreate == 0) {
                       if (ref($types) eq 'ARRAY') {
                           if (@{$types} == 0) {
                               @statustocreate = ('default');
                           }
                       } else {
                           @statustocreate = ('default');
                       }
                   }
             } else {              } else {
                 @statustocreate = ('default');                  @statustocreate = ('default');
                 my ($othertitle,$usertypes,$types) =  
                     &Apache::loncommon::sorted_inst_types($domain);  
                 if (ref($types) eq 'ARRAY') {                  if (ref($types) eq 'ARRAY') {
                     push(@statustocreate,@{$types});                      push(@statustocreate,@{$types});
                 }                  }
Line 805  sub get_creation_controls { Line 1309  sub get_creation_controls {
                      ($usercreation->{'cancreate'}{'selfcreate'} ne '')) {                       ($usercreation->{'cancreate'}{'selfcreate'} ne '')) {
                 @cancreate = ($usercreation->{'cancreate'}{'selfcreate'});                  @cancreate = ($usercreation->{'cancreate'}{'selfcreate'});
             }              }
               if (grep(/^email$/,@cancreate)) {
                   if (ref($usercreation->{'cancreate'}{'selfcreateprocessing'}) eq 'HASH') {
                       $processing = $usercreation->{'cancreate'}{'selfcreateprocessing'};
                   }
                   if (ref($usercreation->{'cancreate'}{'emailoptions'}) eq 'HASH') {
                       $emailoptions = $usercreation->{'cancreate'}{'emailoptions'};
                   }
                   if (ref($usercreation->{'cancreate'}{'emailverified'}) eq 'HASH') {
                       $verification = $usercreation->{'cancreate'}{'emailverified'};
                   }
                   if (ref($usercreation->{'cancreate'}{'emaildomain'}) eq 'HASH') {
                       $emaildomain = $usercreation->{'cancreate'}{'emaildomain'};
                   }
                   if (ref($processing)) {
                       my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
                       my @emailtypes;
                       if (ref($domdefaults{'inststatusguest'}) eq 'ARRAY') {
                           @statusforemail = @{$domdefaults{'inststatusguest'}};
                           unless (@statusforemail) {
                               my @okcreate;
                               foreach my $poss (@cancreate) {
                                   unless ($poss eq 'email') {
                                        push(@okcreate,$poss);
                                   }
                               }
                               @cancreate = @okcreate;
                           }
                       }
                   }  
               }
               if (ref($usercreation->{'cancreate'}{'emailusername'}) eq 'HASH') {
                   $emailusername = $usercreation->{'cancreate'}{'emailusername'};
               } else {
                   $emailusername = {
                                       default =>  {
                                                      'lastname' => '1',
                                                      'firstname' => 1,
                                                   },
                                    };
               }
         }          }
     }      }
     return (\@cancreate,\@statustocreate);      return (\@cancreate,\@statustocreate,\@statusforemail,$emailusername,
               $emailoptions,$verification,$emaildomain,$types,$usertypes,$othertitle);
 }  }
   
 sub create_account {  sub create_account {
     my ($r,$domain,$lonhost,$username,$domdesc) = @_;      my ($r,$domain,$domdesc,$dataref) = @_;
     my ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},      my $error    = '<span class="LC_error">'.&mt('Error:').' ';
                                                           $env{'form.serverid'});       my $end      = '</span><br /><br />';
     # Error messages      my $rtnlink  = '<a href="javascript:history.back();">'.
     my $error     = '<span class="LC_error">'.&mt('Error:').' ';  
     my $end       = '</span><br /><br />';  
     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') {      my $output;
         if ($env{'form.courseid'} ne '') {      if (ref($dataref) eq 'HASH') {
             my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);          my ($username,$encpass,$serverid,$courseid,$id,$firstname,$middlename,$lastname,
             if ($result eq 'fail') {              $generation,$inststatus,$permanentemail);
                 $output = $error.&mt('Invalid ID format').$end.          $username   = $dataref->{'username'};
                           $userchkmsg.$rtnlink;          $encpass    = $dataref->{'upass'};
                 return ('fail',$output);          $serverid   = $dataref->{'serverid'};
           $courseid   = $dataref->{'courseid'};
           $id         = $dataref->{'id'};
           $firstname  = $dataref->{'firstname'};
           $middlename = $dataref->{'middlename'};
           $lastname   = $dataref->{'lastname'};
           $generation = $dataref->{'generation'};
           $inststatus = $dataref->{'inststatus'};
   
           if ($dataref->{'email'} ne '') {
               $permanentemail = $dataref->{'email'};
           } else {
               $permanentemail = $dataref->{'username'};
           }
           my $currhome = &Apache::lonnet::homeserver($username,$domain);
           unless ($currhome eq 'no_host') {
               $output = &mt('User account requested for username: [_1] in domain: [_2] already exists.',$username,$domain);
               return ('fail',$error.$output.$end.$rtnlink);
           }
   
   # Split the logtoken to retrieve the DES key and decrypt the encypted password
   
           my ($key,$caller)=split(/&/,$dataref->{'tmpinfo'});
           if ($caller eq 'createaccount') {
               my $upass;
               if ($encpass eq '') {
                   $output = &mt('Password retrieved was blank.');
                   return ('fail',$error.$output.$end.$rtnlink);
               } else {
                   $upass = &Apache::loncommon::des_decrypt($key,$encpass);
               }
   
   # See if we are allowed to use the proposed student/employee ID,
   # as per domain rules; if not, student/employee will be left blank.
   
               if ($id ne '') {
                   my ($result,$userchkmsg) = &check_id($username,$domain,$id,$domdesc,'email');
                   if ($result eq 'fail') {
                       $output = $error.&mt('Invalid ID format').$end.
                                 $userchkmsg;
                       undef($id);
                   }
             }              }
   
   # Create an internally authenticated account with password $upass
   # if the user account does not already exist.
   # Assign student/employee id, first name, last name, etc.
   
               my $result =
                   &Apache::lonnet::modifyuser($domain,$username,$id,
                                               'internal',$upass,$firstname,$middlename,
                                               $lastname,$generation,undef,undef,$permanentemail);
               $output = &mt('Generating user: [_1]',$result);
   
   # Now that the user account exists, retrieve the homeserver, and include it in the output.
   
               my $uhome = &Apache::lonnet::homeserver($username,$domain);
               unless (($inststatus eq 'default') || ($inststatus eq '')) {
                   &Apache::lonnet::put('environment',{inststatus => $inststatus},$domain,$username);
               }
               $output .= '<br />'.&mt('Home Server').": $uhome ".
                          &Apache::lonnet::hostname($uhome).'<br /><br />';
               return ('ok',$output,$uhome);
           } else {
               $output = &mt('Unable to retrieve your account creation information - unexpected context');
               undef($encpass);
               return ('fail',$error.$output.$end.$rtnlink);
         }          }
     } else {      } else {
           $output = &mt('Unable to retrieve information for your account request.');
         return ('fail',$error.$output.$end.$rtnlink);          return ('fail',$error.$output.$end.$rtnlink);
     }      }
     # Call modifyuser  
     my $result =   
         &Apache::lonnet::modifyuser($domain,$username,$env{'form.cid'},  
                                     'internal',$upass,$env{'form.cfirstname'},  
                                     $env{'form.cmiddlename'},$env{'form.clastname'},  
                                     $env{'form.cgeneration'},undef,undef,$username);  
     $output = &mt('Generating user: [_1]',$result);  
     my $uhome = &Apache::lonnet::homeserver($username,$domain);  
     $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.  
               &Apache::lonnet::hostname($uhome).'<br /><br />';  
     return ('ok',$output);  
 }  }
   
 sub username_validation {  sub username_validation {
     my ($r,$username,$domain,$domdesc,$contact_name,$contact_email,$courseid,      my ($r,$username,$domain,$domdesc,$contact_name,$contact_email,$courseid,
         $lonhost,$statustocreate) = @_;          $lonhost,$statustocreate) = @_;
     my ($retrieved,$output,$upass);  # $r: request object
   # $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 if user came to username_validation via self-enroll link,
   #             passed to start_session()
   # $lonhost: LON-CAPA lonHostID
   # $statustocreate: -> inststatus in username_check ('faculty', 'staff', 'student', ...)
    
   #
   # Sanitize incoming username and domain
   #
     $username= &LONCAPA::clean_username($username);      $username= &LONCAPA::clean_username($username);
     $domain = &LONCAPA::clean_domain($domain);      $domain = &LONCAPA::clean_domain($domain);
   
   #
   # Check if LON-CAPA account already exists for $username:$domain
   #
     my $uhome = &Apache::lonnet::homeserver($username,$domain);      my $uhome = &Apache::lonnet::homeserver($username,$domain);
   
     ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},      my $output;
                                                        $env{'form.serverid'});  
     if ($retrieved ne 'ok') {  # Retrieve DES key from server using logtoken
    
       my $tmpinfo=Apache::lonnet::reply('tmpget:'.$env{'form.logtoken'},$env{'form.serverid'});
       if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
           $output = &mt('Information needed to verify your login information is missing, inaccessible or expired.')
                    .'<br />'.&mt('You may need to reload the previous page to obtain a new token.');
           return ('fail',$output);
       } else {
           my $reply = &Apache::lonnet::reply('tmpdel:'.$env{'form.logtoken'},$env{'form.serverid'});
           unless ($reply eq 'ok') {
               $output = &mt('Session could not be opened.');
               return ('fail',$output); 
           }
       }
   
   # Split the logtoken to retrieve the DES key and decrypt the encypted password
   
       my ($key,$caller)=split(/&/,$tmpinfo);
       my $upass;
       if ($caller eq 'createaccount') {
           $upass = &Apache::loncommon::des_decrypt($key,$env{'form.upass'});
       } else {
           $output = &mt('Unable to retrieve your log-in information - unexpected context');
         return ('fail',$output);          return ('fail',$output);
     }      }
     if ($uhome ne 'no_host') {      if ($uhome ne 'no_host') {
         my $result = &Apache::lonnet::authenticate($username,$upass,$domain);          my $result = &Apache::lonnet::authenticate($username,$upass,$domain);
         if ($result ne 'no_host') {           if ($result ne 'no_host') { 
             my %form = &start_session($r,$username,$domain,$lonhost,$courseid);              my $redirect = &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.');              if ($redirect) {
                   return ($redirect);
               }
               $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);              return ('existingaccount',$output);
         } else {          } else {
             $output = &login_failure_msg($courseid);              $output = &login_failure_msg($courseid);
Line 872  sub username_validation { Line 1511  sub username_validation {
         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);
         if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {          if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) && ($domdefaults{'auth_arg_def'} ne '')) || 
                ($domdefaults{'auth_def'} eq 'localauth')) {
             my $checkdefauth = 1;              my $checkdefauth = 1;
             $authok =               $authok = 
                 &Apache::lonnet::reply("encrypt:auth:$domain:$username:$upass:$checkdefauth",$primlibserv);                  &Apache::lonnet::reply("encrypt:auth:$domain:$username:$upass:$checkdefauth",$primlibserv);
Line 908  sub login_failure_msg { Line 1548  sub login_failure_msg {
   
 sub username_check {  sub username_check {
     my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,      my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,
         $contact_name,$sso_logout,$statustocreate) = @_;          $contact_name,$sso_logout,$statustocreate,$shibenv) = @_;
     my (%rulematch,%inst_results,$checkfail,$rowcount,$editable,$output,$msg,      my (%rulematch,%inst_results,$checkfail,$rowcount,$editable,$output,$msg,
         %alerts,%curr_rules,%got_rules);          %alerts,%curr_rules,%got_rules);
     &call_rulecheck($username,$domain,\%alerts,\%rulematch,      &call_rulecheck($username,$domain,\%alerts,\%rulematch,
                     \%inst_results,\%curr_rules,%got_rules,'username');                      \%inst_results,\%curr_rules,\%got_rules,'username');
     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 944  sub username_check { Line 1584  sub username_check {
     }      }
     if (!$checkfail) {      if (!$checkfail) {
         $output = '<form method="post" action="/adm/createaccount">';          $output = '<form method="post" action="/adm/createaccount">';
           if (ref($shibenv) eq 'HASH') {
               foreach my $key (keys(%{$shibenv})) {
                   if ($ENV{$shibenv->{$key}} ne '') {
                       $inst_results{$username.':'.$domain}{$key} = $ENV{$shibenv->{$key}};
                   }
               }
           }
         (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',
                                                          $inst_results{$username.':'.$domain});                                                           $inst_results{$username.':'.$domain});
Line 954  sub username_check { Line 1601  sub username_check {
                     '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".                      '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".
                     '<input type="hidden" name="phase" value="username_activation" />';                      '<input type="hidden" name="phase" value="username_activation" />';
         my $now = time;          my $now = time;
         my %info = ('ip'         => $ENV{'REMOTE_ADDR'},          my $ip = &Apache::lonnet::get_requestor_ip();
           my %info = ('ip'         => $ip,
                     '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 969  sub username_check { Line 1617  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 995  sub username_check { Line 1643  sub username_check {
         if ($rowcount) {          if ($rowcount) {
             if ($editable) {              if ($editable) {
                 if ($courseid ne '') {                   if ($courseid ne '') { 
                     $msg = '<h4>'.&mt('User information').'</h4>';                      $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 />';                  $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 {
Line 1016  sub username_check { Line 1664  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 1042  sub username_activation { Line 1690  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.courseid'} ne '') {          if ($env{'form.courseid'} ne '') {
             my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);              my $id = $env{'form.cid'}; 
               my ($result,$userchkmsg) = &check_id($username,$domain,$id,$domdesc,'institutional');
             if ($result eq 'fail') {              if ($result eq 'fail') {
                 $output = $error.&mt('Invalid ID format').$end.                  $output = $error.&mt('Invalid ID format').$end.
                           $userchkmsg.$rtnlink;                            $userchkmsg.$rtnlink;
Line 1059  sub username_activation { Line 1713  sub username_activation {
         # Call modifyuser          # Call modifyuser
         my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts,%info);          my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts,%info);
         &call_rulecheck($username,$domain,\%alerts,\%rulematch,          &call_rulecheck($username,$domain,\%alerts,\%rulematch,
                         \%inst_results,\%curr_rules,%got_rules);                          \%inst_results,\%curr_rules,\%got_rules);
         my @userinfo = ('firstname','middlename','lastname','generation',          my @userinfo = ('firstname','middlename','lastname','generation',
                         'permanentemail','id');                          'permanentemail','id');
         my %canmodify =           my %canmodify = 
Line 1086  sub username_activation { Line 1740  sub username_activation {
         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');
             my $nostart = 1;              my $nostart = 1;
             return ('ok',$output,$nostart);              my $response = 'ok';
               my $redirect = &start_session($r,$username,$domain,$uhome,$courseid);
               if ($redirect) {
                   $response = $redirect;
               }
               return ($response,$output,$nostart);
         } else {          } else {
             $output = &mt('Account creation failed for username: [_1] in domain: [_2].',$username,$domain).'<br /><span class="LC_error">'.&mt('Error: [_1]',$result).'</span>';              $output = &mt('Account creation failed for username: [_1] in domain: [_2].',$username,$domain).'<br /><span class="LC_error">'.&mt('Error: [_1]',$result).'</span>';
             return ('fail',$output);              return ('fail',$output);
Line 1100  sub username_activation { Line 1759  sub username_activation {
 }  }
   
 sub check_id {  sub check_id {
     my ($username,$domain,$domdesc) = @_;      my ($username,$domain,$id,$domdesc,$usernametype) = @_;
     # Check ID format      # Check student/employee ID format
       # Is proposed student/employee ID acceptable according to domain's 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}} = (
                                             'newuser' => 1,                                              'newuser' => 1,
                                             'id' => $env{'form.cid'},                                              'id' => $id,
                                            );                                             );
     &Apache::loncommon::user_rule_check(\%checkhash,\%checks,\%alerts,      &Apache::loncommon::user_rule_check(\%checkhash,\%checks,\%alerts,
                                         \%rulematch,\%inst_results,\%curr_rules);                                          \%rulematch,\%inst_results,\%curr_rules);
Line 1115  sub check_id { Line 1776  sub check_id {
             if ($alerts{'id'}{$domain}{$env{'form.cid'}}) {              if ($alerts{'id'}{$domain}{$env{'form.cid'}}) {
                 my $userchkmsg;                  my $userchkmsg;
                 if (ref($curr_rules{$domain}) eq 'HASH') {                  if (ref($curr_rules{$domain}) eq 'HASH') {
                     $userchkmsg  =                      if ($usernametype eq 'email') {
                         &Apache::loncommon::instrule_disallow_msg('id',                          $userchkmsg = &mt('A student/employee ID has not been set because the value suggested matched the format used for institutional users in the domain, and you are using an e-mail address as username, not an institutional username.');
                                                            $domdesc,1).                      } else {
                         &Apache::loncommon::user_rule_formats($domain,                          $userchkmsg =
                               $domdesc,$curr_rules{$domain}{'id'},'id');                              &Apache::loncommon::instrule_disallow_msg('id',
                                                                         $domdesc,1).
                               &Apache::loncommon::user_rule_formats($domain,
                                   $domdesc,$curr_rules{$domain}{'id'},'id');
                       }
                 }                  }
                 return ('fail',$userchkmsg);                  return ('fail',$userchkmsg);
             }              }
Line 1129  sub check_id { Line 1794  sub check_id {
 }  }
   
 sub invalid_state {  sub invalid_state {
     my ($error,$domdesc,$contact_name,$contact_email,$msgtext,$useremail) = @_;      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 'badusername') {
           $msg .= &mt('The e-mail address you provided contains characters which prevent its use as a username in LON-CAPA.');
     } elsif ($error eq 'existinguser') {      } elsif ($error eq 'existinguser') {
         my $uname = &HTML::Entities::encode($useremail);          $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.').'</span><br /><br /><span class="LC_warning">'.&mt('You can either:').'<ul>'.  
                 '<li>'.&mt('Return to the [_1]log-in page[_2] and enter your password.','<a href="/adm/login?username='.$uname.'">','</a>').'</li>'.  
                 '<li>'.&mt('or, if you do not remember your password, visit the "[_1]Forgot your password?[_2]" page.','<a href="/adm/resetpw?uname='.$uname.'&useremail='.$uname.'&referrer=createaccount">','</a>').  
                 '</li></ul>';  
     } elsif ($error eq 'userrules') {      } elsif ($error eq 'userrules') {
         $msg .= &mt('Username rules 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') {  
         $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.');
       } elsif ($error eq 'emailfail') {
           $msg .= &mt('Creation of a new user account with verification by e-mail is not permitted with the e-mail address you provided');
     }      }
     $msg .= '</span>';      $msg .= '</span>';
     if ($msgtext) {      if ($msgtext) {
Line 1159  sub invalid_state { Line 1822  sub invalid_state {
 sub linkto_email_help {  sub linkto_email_help {
     my ($contact_email,$domdesc,$error) = @_;      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','&<>"');
         my $href = '/adm/helpdesk?origurl='.$escuri;          $href .= '?origurl='.$escuri;
         if ($error eq 'existinguser') {          if ($error eq 'existinguser') {
             my $escemail = &HTML::Entities::encode($env{'form.useremail'});              my $escemail = &HTML::Entities::encode($env{'form.useremail'});
             $href .= '&useremail='.$escemail.'&useraccount='.$escemail;              $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 />';          $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_recaptcha {  
     my $captcha = Captcha::reCAPTCHA->new;  
     return $captcha->get_options_setter({theme => 'white'})."\n".  
            $captcha->get_html('PUBLICKEY'); # generate public key for IP  
                                             # from http://recaptcha.net/  
 }  
   
 sub getkeys {  sub getkeys {
     my ($lkey,$ukey) = @_;      my ($lkey,$ukey) = @_;
     my $lextkey=hex($lkey);      my $lextkey=hex($lkey);
Line 1216  ENDSERVERFORM Line 1873  ENDSERVERFORM
     return $output;      return $output;
 }  }
   
 sub process_credentials {  sub store_request {
     my ($logtoken,$lonhost) = @_;      my ($dom,$username,$val,$dataref,$settings) = @_;
     my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);      my $output;
     my ($retrieved,$output,$upass);      my $domconfiguser = &Apache::lonnet::get_domainconfiguser($dom);
     if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {      my $key = &escape($username);
         $output = &mt('Information needed to verify your login information is missing, inaccessible or expired.')      my $now = time();
                  .'<br />'.&mt('You may need to reload the previous page to obtain a new token.');      if (&Apache::lonnet::put('usernamequeue', { $key.'_'.$val => $now },
         return ($retrieved,$output,$upass);                                $dom,$domconfiguser) eq 'ok') {
     } else {          if (ref($dataref) eq 'HASH') {
         my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$lonhost);              my $logtoken = $dataref->{'tmpinfo'};
         if ($reply eq 'ok') {              my $serverid = $dataref->{'serverid'}; 
             $retrieved = 'ok';              if ($logtoken && $serverid) {
         } else {                  my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$serverid);
             $output = &mt('Session could not be opened.');                  unless (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
                       my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$serverid);
                       if ($reply eq 'ok') {
                           my ($key,$caller)=split(/&/,$tmpinfo);
                           $dataref->{'key'} = $key;
                           undef($dataref->{'tmpinfo'});
                           undef($dataref->{'serverid'});
                       }
                   }
               }
         }          }
     }          my %userrequest = ( $username => $dataref );
     my ($key,$caller)=split(/&/,$tmpinfo);          $userrequest{$username}{timestamp} = $now;
     if ($caller eq 'createaccount') {          $userrequest{$username}{status} = $val;
         $upass = &Apache::lonpreferences::des_decrypt($key,$env{'form.upass'});          my $notifylist;
           if (ref($settings) eq 'HASH') {
               if (ref($settings->{'cancreate'}) eq 'HASH') {
                   if (ref($settings->{'cancreate'}{'notify'}) eq 'HASH') {
                       my $notifylist = $settings->{'cancreate'}{'notify'}{'approval'};
                       if ($notifylist) {
                           my $sender = $domconfiguser.':'.$dom;
                           my $domdesc = &Apache::lonnet::domain($dom,'description');
                           my $fullname;
                           if (ref($dataref) eq 'HASH') {
                               if ($dataref->{'firstname'}) {
                                   $fullname = $dataref->{'firstname'};
                               }
                               if ($dataref->{'lastname'}) {
                                   $fullname .= ' '.$dataref->{'lastname'};
                               }
                               $fullname =~ s/^\s+|\s+$//g; 
                           }
                           &Apache::loncoursequeueadmin::send_selfserve_notification($notifylist,
                                                        "$fullname ($username)",
                                                        undef,$domdesc,$now,'usernamereq',$sender);
                       }
                   }
               }
           }
           my $userresult =
               &Apache::lonnet::put('nohist_requestedusernames',\%userrequest,$dom,$domconfiguser);
           $output = '<p class="LC_info">'.
                     &mt('Your request for a LON-CAPA account has been submitted for approval.').
                     '</p>'.
                     '<p class="LC_info">'.
                     &mt('An e-mail will be sent to [_1] when your request has been reviewed by an administrator and action has been taken.',$username).
                     '</p>';
     } else {      } else {
         $output = &mt('Unable to retrieve your log-in information - unexpected context');          $output = '<span class="LC_error">'.
                     &mt('An error occurred when attempting to save your request for a LON-CAPA account.');
                     '</span>';
     }      }
     return ($retrieved,$output,$upass);      return $output;
 }  }
   
 sub guest_format_check {  sub guest_format_check {
     my ($useremail,$domain,$cancreate,$settings) = @_;      my ($useremail,$domain,$cancreate,$settings,$usertype) = @_;
     my ($login,$format_match,$format_msg,@user_rules);      my ($login,$format_match,$format_msg,@user_rules);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{'email_rule'}) eq 'ARRAY') {          if (ref($settings->{'email_rule'}) eq 'ARRAY') {
             push(@user_rules,@{$settings->{'email_rule'}});              push(@user_rules,@{$settings->{'email_rule'}});
           } elsif (ref($settings->{'email_rule'}) eq 'HASH') {
               if (ref($settings->{'email_rule'}->{$usertype}) eq 'ARRAY') {
                   push(@user_rules,@{$settings->{'email_rule'}->{$usertype}});
               }
         }          }
     }      }
     if (@user_rules > 0) {      if (@user_rules > 0) {
Line 1264  sub guest_format_check { Line 1968  sub guest_format_check {
     }      }
     if ($format_match) {      if ($format_match) {
         ($login) = ($useremail =~ /^([^\@]+)\@/);          ($login) = ($useremail =~ /^([^\@]+)\@/);
         $format_msg = '<br />'.&mt("Your e-mail address uses the same internet domain as your institution's LON-CAPA service.").'<br />'.&mt('Creation of a LON-CAPA account with this type of e-mail address as username is not permitted.').'<br />';          $format_msg = '<br />'.
                         &mt("Your e-mail address uses the same internet domain as your institution's LON-CAPA service.").'<br />'.
                         &mt('Creation of a LON-CAPA account with this type of e-mail address as username is not permitted.').'<br />';
         if (ref($cancreate) eq 'ARRAY') {          if (ref($cancreate) eq 'ARRAY') {
             if (grep(/^login$/,@{$cancreate})) {              if (grep(/^login$/,@{$cancreate})) {
                 $format_msg .= &mt('You should request creation of a LON-CAPA account for a log-in ID of "[_1]" at your institution instead.',$login).'<br />';                   $format_msg .= &mt('You should request creation of a LON-CAPA account for a log-in ID of "[_1]" at your institution instead.',$login).'<br />'; 
Line 1280  sub sso_logout_frag { Line 1986  sub sso_logout_frag {
     if (defined($r->dir_config('lonSSOUserLogoutMessageFile_'.$domain))) {      if (defined($r->dir_config('lonSSOUserLogoutMessageFile_'.$domain))) {
         my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile_'.$domain);          my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile_'.$domain);
         if (-e $msgfile) {          if (-e $msgfile) {
             open(my $fh,"<$msgfile");              open(my $fh,"<",$msgfile);
             $endsessionmsg = join('',<$fh>);              $endsessionmsg = join('',<$fh>);
             close($fh);              close($fh);
         }          }
     } elsif (defined($r->dir_config('lonSSOUserLogoutMessageFile'))) {      } elsif (defined($r->dir_config('lonSSOUserLogoutMessageFile'))) {
         my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile');          my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile');
         if (-e $msgfile) {               if (-e $msgfile) {     
             open(my $fh,"<$msgfile");              open(my $fh,"<",$msgfile);
             $endsessionmsg = join('',<$fh>);              $endsessionmsg = join('',<$fh>);
             close($fh);              close($fh);
         }          }
Line 1298  sub sso_logout_frag { Line 2004  sub sso_logout_frag {
 sub catreturn_js {  sub catreturn_js {
     return  <<"ENDSCRIPT";      return  <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function ToSelfenroll(formname) {  function ToSelfenroll(formname) {
     var formidx = getFormByName(formname);      var formidx = getFormByName(formname);
     if (formidx > -1) {      if (formidx > -1) {
Line 1346  function getFormByName(item) { Line 2052  function getFormByName(item) {
     }      }
     return -1;      return -1;
 }  }
   // ]]>
   </script>
   ENDSCRIPT
   
   }
   
   sub setelements_js {
       my ($statusforemail,$types,$usertypes,$othertitle) = @_;
       my ($posstypes,$posstypesnames,$availabletypes);
       if ((ref($statusforemail) eq 'ARRAY') && (ref($types) eq 'ARRAY') && 
           (ref($usertypes) eq 'HASH')) {
           $posstypes = join("','",@{$types},'default');
           $posstypesnames = join("','",(map {$usertypes->{$_};} @{$types}),$othertitle);
           $availabletypes = join("','", @{$statusforemail});
       }
       return  <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   
   function setElements() {
       if (document.getElementById('LC_reportstatus')) {
           var reportnum = document.reportstatus.type.length;
           if ((reportnum != 'undefined') && (typeof(document.reportstatus.type) != 'undefined')) {
               for (var i=0; i<reportnum; i++) {
                   document.reportstatus.type[i].checked = false;
               }
           }
       }
   }
   
   function checkVerification() {
       var curr;
       var cancreate = false;
       var reportnum = document.reportstatus.type.length;
       if ((reportnum == 'undefined') && (typeof(document.reportstatus.type) != 'undefined')) {
           curr = document.reportstatus.type.value; 
       } else if (document.reportstatus.type.length) {
           for (var i=0; i<document.reportstatus.type.length; i++) {
               if (document.reportstatus.type[i].checked) {
                   curr = document.reportstatus.type[i].value;
                   break;
               }
           }
       }
       var types = Array('$posstypes');
       var names = Array('$posstypesnames');
       var available = Array('$availabletypes');
       if (available.length) {
           for (var i=0; i<available.length; i++) {
               if (curr == available[i]) {
                   cancreate = true;   
                   break;
               }
           }
       }
       if (types.length > 0) {
           for (var j=0; j<types.length; j++) {
               if (curr == types[j]) {
                   if (!cancreate) {
                       alert('Creation of an account via verification by e-mail unavailable for user type: "'+names[j]+'"');
                       setElements();
                   }
                   break;
               }
           }
       }
       if (cancreate) {
           return true;
       } else {
           return false;
       }
   }
   
   // ]]>
   </script>
   ENDSCRIPT
   
   }
   
   sub username_js {
       return  <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   
   function toggleUsernameDisp(caller,divid) {
       if (document.getElementById(divid)) {
           if (caller.checked) {
               if (caller.value == '1') {
                   document.getElementById(divid).style.display = 'none';
               } else {
                   document.getElementById(divid).style.display = 'inline';
               }
           }
       }
   }
   // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
   

Removed from v.1.37.2.6  
changed lines
  Added in v.1.87


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.