Diff for /loncom/interface/createaccount.pm between versions 1.67 and 1.88

version 1.67, 2014/05/30 16:46:03 version 1.88, 2023/11/03 01:12:15
Line 124  sub handler { Line 124  sub handler {
   
         my %domconfig =           my %domconfig = 
             &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);              &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
         my ($cancreate,$statustocreate,$emailusername) =           my ($cancreate,$statustocreate) = 
             &get_creation_controls($domain,$domconfig{'usercreation'});              &get_creation_controls($domain,$domconfig{'usercreation'});
   
         my ($result,$output) =          my ($result,$output) =
Line 146  sub handler { Line 146  sub handler {
             return OK;              return OK;
         }          }
     }      }
     $start_page = &Apache::loncommon::start_page($title,$js);  
   
     my %domconfig =       my %domconfig =
         &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);          &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
     my ($cancreate,$statustocreate,$emailusername) =       my ($cancreate,$statustocreate,$statusforemail,$emailusername,
           $emailoptions,$verification,$emaildomain,$types,$usertypes,$othertitle) =
         &get_creation_controls($domain,$domconfig{'usercreation'});          &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 at this institution ([_1]).',$domdesc).                       &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 />';                       '</span><br /><br />';
         $r->print($output);          $r->print($output);
         &print_footer($r);          &print_footer($r);
Line 178  sub handler { Line 198  sub handler {
                         if (ref($domconfig{'usercreation'}{'cancreate'}{'shibenv'}) eq 'HASH') {                          if (ref($domconfig{'usercreation'}{'cancreate'}{'shibenv'}) eq 'HASH') {
                             my @possfields = ('firstname','middlename','lastname','generation',                              my @possfields = ('firstname','middlename','lastname','generation',
                                               'permanentemail','id');                                                'permanentemail','id');
                             my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);  
                             $shibenv= {};                              $shibenv= {};
                             foreach my $key (keys(%{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}})) {                              foreach my $key (keys(%{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}})) {
                                 if ($key eq 'inststatus') {                                  if ($key eq 'inststatus') {
Line 215  sub handler { Line 234  sub handler {
     my ($output,$nostart,$noend,$redirect);      my ($output,$nostart,$noend,$redirect);
     my $token = $env{'form.token'};      my $token = $env{'form.token'};
     if ($token) {      if ($token) {
         my $usertype = &get_usertype($domain);  
         ($output,$nostart,$noend,$redirect) =           ($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,$cancreate,                                 $domdesc,$lonhost,$include,$start_page,$cancreate,
                                $domconfig{'usercreation'},$usertype);                                 $domconfig{'usercreation'},$types);
         if ($redirect) {          if ($redirect) {
             $r->internal_redirect('/adm/switchserver');              $r->internal_redirect('/adm/switchserver');
             return OK;              return OK;
Line 238  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,
Line 270  sub handler { Line 316  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);
         my $usertype = &get_usertype($domain);          my $usertype = &get_usertype($domain);
           if ($usertype eq '') {
               $usertype = 'default';
           }
         $output = &process_email_request($env{'form.uname'},$domain,$domdesc,          $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'},
                                          $emailusername,$courseid,$usertype);                                           $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;
         my $gotlondes;          if ((grep(/^login$/,@{$cancreate})) && (!grep(/^email$/,@{$cancreate}))) {
         if (grep(/^login$/,@{$cancreate})) {              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);
                 $r->print(&javascript_setforms($now));                  $r->print(&javascript_setforms($now));
                 $gotlondes = 1;  
             }              }
         }          }
         if (grep(/^email$/,@{$cancreate})) {          if (grep(/^email$/,@{$cancreate})) {
             $r->print(&javascript_validmail());              $r->print(&javascript_validmail($condition));
         }          }
         my $usertype = &get_usertype($domain);          my $usertype = &get_usertype($domain);
         $output = &print_username_form($r,$domain,$domdesc,$cancreate,$now,$lonhost,          $output = &print_username_form($r,$domain,$domdesc,$cancreate,$now,$lonhost,
                                        $include,$courseid,$gotlondes,$emailusername,                                         $include,$courseid,$emailusername,
                                        $usertype);                                         $statusforemail,$usernameset,$condition,
                                          $excluded,$usertype,$types,$usertypes,$othertitle);
     }      }
     $r->print($output);      $r->print($output);
     &print_footer($r);      &print_footer($r);
Line 302  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 322  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','crypt','cfirstname','clastname',                        'code','crypt','cfirstname','clastname','g-recaptcha-response',
                       'recaptcha_challenge_field','recaptcha_response_field',                        'recaptcha_challenge_field','recaptcha_response_field',
                       'cmiddlename','cgeneration','cpermanentemail','cid']).                        'cmiddlename','cgeneration','cpermanentemail','cid']).
                   '</form>');                    '</form>');
Line 332  sub print_footer { Line 390  sub print_footer {
   
 sub get_usertype {  sub get_usertype {
     my ($domain) = @_;      my ($domain) = @_;
     my $usertype = 'default';      my $usertype;
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         push(@{$types},'default');          push(@{$types},'default');
Line 369  sub selfenroll_crumbs { Line 427  sub selfenroll_crumbs {
 }  }
   
 sub javascript_setforms {  sub javascript_setforms {
     my ($now,$emailusername,$captcha,$usertype) =  @_;      my ($now,$emailusername,$captcha,$usertype,$recaptchaversion,$usernameset,$condition,$excluded) =  @_;
     my ($setuserinfo,@required,$requiredchk);      my ($setuserinfo,@required,$requiredchk);
     if (ref($emailusername) eq 'HASH') {      if (ref($emailusername) eq 'HASH') {
         if (ref($emailusername->{$usertype}) eq 'HASH') {            if (ref($emailusername->{$usertype}) eq 'HASH') {  
Line 379  sub javascript_setforms { Line 437  sub javascript_setforms {
                 }                  }
                 $setuserinfo .= '                    server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";                  $setuserinfo .= '                    server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
             }              }
             $setuserinfo .= '                    server.elements.type.value=client.elements.type.value;'."\n";               if ($usertype ne '') {
                   $setuserinfo .= '                    server.elements.type.value=client.elements.type.value;'."\n";
               }
         }          }
         if ($captcha eq 'original') {          if ($captcha eq 'original') {
             $setuserinfo .= '                    server.elements.code.value=client.elements.code.value;'."\n".              $setuserinfo .= '                    server.elements.code.value=client.elements.code.value;'."\n".
                             '                    server.elements.crypt.value=client.elements.crypt.value;'."\n";                              '                    server.elements.crypt.value=client.elements.crypt.value;'."\n";
         } elsif ($captcha eq 'recaptcha') {          } elsif ($captcha eq 'recaptcha') {
             $setuserinfo .=               if ($recaptchaversion ne '2') {
                   $setuserinfo .=
                 '                    server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".                  '                    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";                  '                    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) {      if (@required) {
         my $missprompt = &mt('One or more required fields are currently blank.');          my $missprompt = &mt('One or more required fields are currently blank.');
           &js_escape(\$missprompt);
         my $reqstr = join("','",@required);          my $reqstr = join("','",@required);
         $requiredchk = <<"ENDCHK";          $requiredchk = <<"ENDCHK";
                 var requiredfields = new Array('$reqstr');                  var requiredfields = new Array('$reqstr');
Line 431  $requiredchk Line 498  $requiredchk
                 uextkey=client.elements.uextkey.value;                  uextkey=client.elements.uextkey.value;
                 lextkey=client.elements.lextkey.value;                  lextkey=client.elements.lextkey.value;
                 initkeys();                  initkeys();
   
                 server.elements.upass.value                  server.elements.upass.value
                     = crypted(client.elements.upass$now.value);                      = getCrypted(client.elements.upass$now.value);
   
                 client.elements.uname.value='';                  client.elements.uname.value='';
                 client.elements.upass$now.value='';                  client.elements.upass$now.value='';
                 if (context == 'email') {                  if (context == 'email') {
Line 446  $setuserinfo Line 511  $setuserinfo
         }          }
         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,$context) = @_;      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">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 471  sub javascript_checkpass { Line 544  sub javascript_checkpass {
                 return false;                  return false;
             }              }
             if (upass == upasscheck) {              if (upass == upasscheck) {
                   var numrules = $numrules;
                   if (numrules > 0) {
   $intargjs
                   }
                 client.elements.upasscheck$now.value='';                  client.elements.upasscheck$now.value='';
                 if (validate_email(client)) {                  if (validate_email(client)) {
                     send(one,two,'$context');                      send(one,two,'$context');
Line 490  ENDSCRIPT Line 567  ENDSCRIPT
 }  }
   
 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".                    '// <![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(client) {  function validate_email(client) {
     field = client.uname;      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;
     }      }
     return true;      return true;
Line 512  ENDSCRIPT Line 597  ENDSCRIPT
 }  }
   
 sub print_username_form {  sub print_username_form {
     my ($r,$domain,$domdesc,$cancreate,$now,$lonhost,$include,$courseid,$gotlondes,$emailusername,      my ($r,$domain,$domdesc,$cancreate,$now,$lonhost,$include,$courseid,$emailusername,
         $usertype) = @_;          $statusforemail,$usernameset,$condition,$excluded,$usertype,$types,$usertypes,
           $othertitle) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                          unam => 'username',  
                                          udom => 'domain',  
                                          uemail => 'E-mail address in LON-CAPA',  
                                          proc => 'Proceed',  
                                          crac => 'Create account with a username provided by this institution',                                           crac => 'Create account with a username provided by this institution',
                                          clca => 'Create LON-CAPA account',                                           clca => 'Create LON-CAPA account',
                                          type => 'Type in your log-in ID and password to find out.',                                           type => 'Type in your log-in ID and password to find out.',
                                          plse => 'Please provide a password for your new account.',                                           plse => 'Please provide a password for your new account.',
                                          info => 'Please provide user information and 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).',                                           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') {
Line 541  sub print_username_form { Line 624  sub print_username_form {
             }              }
         }          }
         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,$error,$captcha) = &Apache::loncommon::captcha_display('usercreation',$lonhost);              if ($usertype ne '') {
             if ($error) {                  if ((ref($statusforemail) eq 'ARRAY') && (@{$statusforemail} > 0)) {
                 my $helpdesk = '/adm/helpdesk?origurl=%2fadm%2fcreateaccount';                      unless (grep(/^\Q$usertype\E$/,@{$statusforemail})) {
                 if ($courseid ne '') {                          undef($usertype);
                     $helpdesk .= '&courseid='.$courseid;                      }
                 }                  } elsif ($usertype ne 'default') {
                 $output .= '<span class="LC_error">'.                      undef($usertype);
                            &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.',              if (($usertype eq '') && (ref($statusforemail) eq 'ARRAY') && 
                                '<a href="'.$helpdesk.'">','</a>','<a href="javascript:window.location.reload()">');                  (@{$statusforemail} > 0) && (ref($types) eq 'ARRAY') && (@{$types} > 0)) {
                   my @posstypes = @{$types};
                   unless (grep(/^default$/,@posstypes)) {
                       push(@posstypes,'default');
                   }
                   $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 {
                 if (grep(/^login$/,@{$cancreate})) {                  my ($captchaform,$error,$captcha,$recaptchaversion) = 
                     $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 />'.                      &Apache::loncommon::captcha_display('usercreation',$lonhost);
                                $lt{'plse'}.'<br />'.                  if ($error) {
                                $lt{'yopw'}.'<br />';                      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 {                  } else {
                     my $prompt = $lt{'plse'};                      if (grep(/^login$/,@{$cancreate})) {
                     if (ref($emailusername) eq 'HASH') {                          $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 />'.
                         if (ref($emailusername->{$usertype}) eq 'HASH') {                                     $lt{'plse'}.'<br />'.
                             if (keys(%{$emailusername->{$usertype}}) > 0) {                                     $lt{'yopw'}.'<br />';
                                 $prompt = $lt{'info'};                      } 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 />';
                     }                      }
                     $output .= $prompt.'<br />'.                      if ($usertype eq '') {
                                $lt{'yopw'}.'<br />';                          $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 .= &print_dataentry_form($r,$domain,$lonhost,$include,$now,$captchaform,  
                                                  $courseid,$gotlondes,$emailusername,$captcha,  
                                                  $usertype);  
             }              }
             $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 598  sub login_box { Line 740  sub login_box {
                                        $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="" autocomplete="off" />';      my $unameform = '<input type="text" name="uname" size="20" value="" autocomplete="off" />';
     my $upassform = '<input type="password" name="upass'.$now.'" size="20" autocomplete="off" />';      my $upassform = '<input type="password" name="upass'.$now.'" size="20" autocomplete="new-password" />';
     $output .= '<form name="client" method="post" action="" onsubmit="return(send('."'server','client'".'));">'."\n".      $output .= '<form name="client" method="post" action="" onsubmit="return(send('."'server','client'".'));">'."\n".
                &Apache::lonhtmlcommon::start_pick_box()."\n".                 &Apache::lonhtmlcommon::start_pick_box()."\n".
                &Apache::lonhtmlcommon::row_title($titles{$context},                 &Apache::lonhtmlcommon::row_title($titles{$context},
Line 638  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,$emailusername,$courseid,$usertype) = @_;          $server,$settings,$emailusername,$courseid,$usertype,$usernameset,
     my $output;          $condition,$excluded,$hascustom) = @_;
       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 {
             $useremail =~ s/^\s+|\s+$//g;              $useremail =~ s/^\s+|\s+$//g;
             my $uname=&LONCAPA::clean_username($useremail);              my $possuname;
             if ($useremail ne $uname) {              if ($condition ne '') {
                 $output = &invalid_state('badusername',$domdesc,                  if ($usernameset eq 'first') {
                                          $contact_name,$contact_email);                      $possuname = $useremail;
                 return $output;                  }
                   $useremail .= $condition;
               } elsif ($excluded ne '') {
                   if ($useremail =~ /^[^\@]+\Q$excluded\E$/) {
                       $output = &invalid_state('userrules',$domdesc,
                                        $contact_name,$contact_email);
                       return $output;
                   } 
             }              }
             my $uhome = &Apache::lonnet::homeserver($useremail,$domain);              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);                                           $contact_name,$contact_email);
Line 665  sub process_email_request { Line 842  sub process_email_request {
             } else {              } else {
                 my ($captcha_chk,$captcha_error) = &Apache::loncommon::captcha_response('usercreation',$server);                  my ($captcha_chk,$captcha_error) = &Apache::loncommon::captcha_response('usercreation',$server);
                 if ($captcha_chk != 1) {                  if ($captcha_chk != 1) {
                     $output = &invalid_state('captcha',$domdesc,$contact_name,                      $output = '<span class="LC_warning">'.
                                              $contact_email,$captcha_error);                                &mt('Validation of the code you entered failed.').'</span>'.
                                 '<br />'.$captcha_error."\n".'<br /><p>'.
                                  &mt('[_1]Return[_2] to the previous page to try again.',
                                      '<a href="javascript:document.retryemail.submit();">','</a>')."\n".
                                 '<form name="retryemail" action="/adm/createaccount" method="post" />'.
                                 '<input type="hidden" name="domain" value="'.$domain.'" />'."\n";
                       if ($env{'form.courseid'} =~ /^$match_domain\_$match_courseid$/) {
                           $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 (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);                  my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);
                 &call_rulecheck($useremail,$domain,\%alerts,\%rulematch,                  &call_rulecheck($uname,$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}{$useremail}) {                          if ($alerts{'username'}{$domain}{$uname}) {
                             $output = &invalid_state('userrules',$domdesc,                              $output = &invalid_state('userrules',$domdesc,
                                                      $contact_name,$contact_email);                                                       $contact_name,$contact_email);
                             return $output;                              return $output;
                         }                          }
                     }                      }
                 }                  }
                 my $format_msg =                   if ($hascustom) {
                     &guest_format_check($useremail,$domain,$cancreate,                      my $format_msg = 
                                         $settings);                          &guest_format_check($useremail,$domain,$cancreate,
                 if ($format_msg) {                                              $settings,$usertype);
                     $output = &invalid_state('userformat',$domdesc,$contact_name,                      if ($format_msg) {
                                              $contact_email,$format_msg);                          $output = &invalid_state('userformat',$domdesc,$contact_name,
                     return $output;                                                   $contact_email,$format_msg);
                           return $output;
                       }
                 }                  }
             }              }
         }          }
         $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,          $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
                               $contact_email,$courseid,$emailusername,$usertype);                                $contact_email,$courseid,$emailusername,$usertype,
                                 $uname);
     }      }
     return $output;      return $output;
 }  }
Line 713  sub call_rulecheck { Line 909  sub call_rulecheck {
   
 sub send_token {  sub send_token {
     my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername,      my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername,
         $usertype) = @_;          $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 />';
Line 721  sub send_token { Line 917  sub send_token {
     $env{'form.logtoken'} =~ s/(`)//g;      $env{'form.logtoken'} =~ s/(`)//g;
     if ($env{'form.logtoken'}) {      if ($env{'form.logtoken'}) {
         my $logtoken = $env{'form.logtoken'};          my $logtoken = $env{'form.logtoken'};
           my $earlyout;
         my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$server);          my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$server);
         if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {          if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
             $msg = &mt('Information needed to process your request is missing, inaccessible or expired.')              $msg = &mt('Information needed to process your request is missing, inaccessible or expired.')
                   .'<br />'.&mt('Return to the previous page to try again.');                    .'<br /><p>'.&mt('[_1]Return[_2] to the previous page to try again.',
                                      '<a href="javascript:document.retryemail.submit();">','</a>');
               $earlyout = 1;
         } else {          } else {
             my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$server);              my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$server);
             unless ($reply eq 'ok') {              unless ($reply eq 'ok') {
                 $msg .= &mt('Request could not be processed.');                  $msg .= &mt('Request could not be processed.');
             }              }
         }          }
         my %info = ('ip'         => $ENV{'REMOTE_ADDR'},  # 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,                      'time'       => $now,
                     'domain'     => $domain,                      'domain'     => $domain,
                     'username'   => $email,                      'username'   => $email,
Line 739  sub send_token { Line 992  sub send_token {
                     'upass'      => $env{'form.upass'},                      'upass'      => $env{'form.upass'},
                     'serverid'   => $env{'form.serverid'},                      'serverid'   => $env{'form.serverid'},
                     'tmpinfo'    => $tmpinfo);                      'tmpinfo'    => $tmpinfo);
           if ($uname ne '') {
               $info{'username'} = $uname;
               $info{'email'} = $email;
           }
         if (ref($emailusername) eq 'HASH') {          if (ref($emailusername) eq 'HASH') {
             if (ref($emailusername->{$usertype}) eq 'HASH') {              if (ref($emailusername->{$usertype}) eq 'HASH') {
                 foreach my $item (keys(%{$emailusername->{$usertype}})) {                  foreach my $item (keys(%{$emailusername->{$usertype}})) {
                     $info{$item} = $env{'form.'.$item};                      $info{$item} = $env{'form.'.$item};
                     $info{$item} =~ s/(`)//g;                      $info{$item} =~ s/(`)//g;
                 }                  }
                 unless ($usertype eq 'default') {  
                     $info{'inststatus'} = $usertype;  
                 }  
             }              }
         }          }
           if ($usertype ne '') {
              $info{'usertype'} = $usertype;
           }
         my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');          my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');
         if ($token !~ /^error/ && $token ne 'no_such_host') {          if ($token !~ /^error/ && $token ne 'no_such_host') {
             my $esc_token = &escape($token);              my $esc_token = &escape($token);
Line 784  sub send_token { Line 1040  sub send_token {
   
 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,$cancreate,$settings,$usertype) = @_;          $include,$start_page,$cancreate,$settings,$types) = @_;
     my ($msg,$nostart,$noend,$redirect);      my ($msg,$nostart,$noend,$redirect);
     my %data = &Apache::lonnet::tmpget($token);      my %data = &Apache::lonnet::tmpget($token);
     my $now = time;      my $now = time;
Line 797  sub process_mailtoken { Line 1053  sub process_mailtoken {
     }      }
     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) {
 # Check if request should be queued.  # Check if request should be queued.
             if (ref($cancreate) eq 'ARRAY') {              if (ref($cancreate) eq 'ARRAY') {
                 my $disposition;                  my ($disposition,$usertype);
                 if (grep(/^email$/,@{$cancreate})) {                  if (grep(/^email$/,@{$cancreate})) {
                       if (exists($data{'usertype'})) {
                           $usertype = $data{'usertype'};
                           my @posstypes;
                           if (ref($types) eq 'ARRAY') {
                               @posstypes = @{$types};
                               if (@posstypes) {
                                   unless (grep(/^default$/,@posstypes)) {
                                       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) eq 'HASH') {
                         if (ref($settings->{'cancreate'}) eq 'HASH') {                          if (ref($settings->{'cancreate'}) eq 'HASH') {
                             if (ref($settings->{'cancreate'}{'selfcreateprocessing'}) eq 'HASH') {                              if (ref($settings->{'cancreate'}{'selfcreateprocessing'}) eq 'HASH') {
                                 $disposition = $settings->{'cancreate'}{'selfcreateprocessing'}{$usertype};                                   if ($usertype ne '') {
                                       $disposition = $settings->{'cancreate'}{'selfcreateprocessing'}{$usertype};
                                       unless ($disposition =~ /^(approval|automatic)$/) {
                                           $disposition = 'approval';
                                       }
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 818  sub process_mailtoken { Line 1100  sub process_mailtoken {
                             &create_account($r,$domain,$domdesc,\%data);                              &create_account($r,$domain,$domdesc,\%data);
                         if ($result eq 'ok') {                          if ($result eq 'ok') {
                             $msg = $output;                              $msg = $output;
                               my $ip = &Apache::lonnet::get_requestor_ip();
                             my $shownow = &Apache::lonlocal::locallocaltime($now);                              my $shownow = &Apache::lonlocal::locallocaltime($now);
                             my $mailmsg = &mt('A LON-CAPA account for the institution: [_1] has been created [_2] from IP address: [_3]. If you did not perform this action or authorize it, please contact the [_4] ([_5]).',$domdesc,$shownow,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n";                              my $mailmsg = &mt('A LON-CAPA account for the institution: [_1] has been created [_2] from IP address: [_3]. If you did not perform this action or authorize it, please contact the [_4] ([_5]).',$domdesc,$shownow,$ip,$contact_name,$contact_email)."\n";
                             my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},                              my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},
                                                                         $mailmsg,$contact_name,                                                                          $mailmsg,$contact_name,
                                                                         $contact_email);                                                                          $contact_email);
Line 860  sub process_mailtoken { Line 1143  sub process_mailtoken {
   
 sub start_session {  sub start_session {
     my ($r,$username,$domain,$uhome,$courseid,$token) = @_;      my ($r,$username,$domain,$uhome,$courseid,$token) = @_;
       my ($is_balancer) = &Apache::lonnet::check_loadbalancing($username,$domain);
     if ($r->dir_config('lonBalancer') eq 'yes') {      if ($is_balancer) {
         Apache::lonauth::success($r, $username, $domain, $uhome,          Apache::lonauth::success($r, $username, $domain, $uhome,
             'noredirect', undef, {});              'noredirect', undef, {});
   
Line 875  sub start_session { Line 1158  sub start_session {
             ($courseid ? "/adm/selfenroll?courseid=$courseid" : '/adm/roles'),              ($courseid ? "/adm/selfenroll?courseid=$courseid" : '/adm/roles'),
             undef, {});               undef, {}); 
     }      }
   
     return;      return;
 }  }
   
Line 885  sub start_session { Line 1167  sub start_session {
 # Stores token to store DES-key and stage during creation session  # Stores token to store DES-key and stage during creation session
 #  #
 sub print_dataentry_form {  sub print_dataentry_form {
     my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$gotlondes,$emailusername,$captcha,      my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$emailusername,$captcha,
         $usertype) = @_;          $usertype,$recaptchaversion,$usernameset,$condition,$excluded) = @_;
     my ($error,$output);      my ($error,$output);
     unless ($gotlondes) {      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,$emailusername,$captcha,$usertype,$recaptchaversion,
             $output = &javascript_setforms($now,$emailusername,$captcha,$usertype)."\n";                                         $usernameset,$condition,$excluded).
             $gotlondes = 1;                    "\n".&javascript_checkpass($now,'email',$domain);
         }  
     }  
     if ($gotlondes) {  
         $output .= &javascript_checkpass($now,'email');  
         my ($lkey,$ukey) = &Apache::loncommon::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:createaccount',          my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount:createaccount',
                                            $lonhost);                                             $lonhost);
         $output .=          my $showsubmit = 1;
           my $serverform =
             '<form name="createaccount" method="post" target="_top" action="/adm/createaccount">';              '<form name="createaccount" method="post" target="_top" action="/adm/createaccount">';
         if ($courseid ne '') {          if ($courseid ne '') {
             $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";              $serverform .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";
         }          }
         if (ref($emailusername) eq 'HASH') {          if (ref($emailusername) eq 'HASH') {
             if (ref($emailusername->{$usertype}) eq 'HASH') {              if (ref($emailusername->{$usertype}) eq 'HASH') {
                 foreach my $field (sort(keys(%{$emailusername->{$usertype}}))) {                  foreach my $field (sort(keys(%{$emailusername->{$usertype}}))) {
                     $output .= '<input type="hidden" name="'.$field.'" value="" />'."\n";                      $serverform .= '<input type="hidden" name="'.$field.'" value="" />'."\n";
                 }                  }
                 $output .= '<input type="hidden" name="type" value="" />'."\n";  
             }              }
         }          }
         if ($captcha eq 'original') {          if ($captcha eq 'original') {
             $output .= '              $serverform .= '
    <input type="hidden" name="crypt" value="" />     <input type="hidden" name="crypt" value="" />
    <input type="hidden" name="code" value="" />     <input type="hidden" name="code" value="" />
 ';  ';
         } elsif ($captcha eq 'recaptcha') {          } elsif ($captcha eq 'recaptcha') {
             $output .= '              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_challenge_field" value="" />
    <input type="hidden" name="recaptcha_response_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="serverid" value="$lonhost" />     <input type="hidden" name="serverid" value="$lonhost" />
    <input type="hidden" name="uname" value="" />     <input type="hidden" name="uname" value="" />
Line 940  sub print_dataentry_form { Line 1241  sub print_dataentry_form {
 ENDSERVERFORM  ENDSERVERFORM
         my $beginclientform = '<form name="newemail" method="post" action="" '.          my $beginclientform = '<form name="newemail" method="post" action="" '.
                               'onsubmit="return checkpass('."'createaccount','newemail'".');">'."\n";                                'onsubmit="return checkpass('."'createaccount','newemail'".');">'."\n";
         my $endclientform = '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".          my $endclientform;
                             '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".          unless ($showsubmit) {
                             '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".              if ($usertype ne '') {
                             '</form>'."\n".                  $endclientform = '<input type="hidden" name="type" value="'.
                             '<p class="LC_info">'.&mt('Fields marked [_1]*[_2] are required.','<b>','</b>').'</p>';                                   &HTML::Entities::encode($usertype,'\'<>"&').'" />'."\n";
               }
           }
           $endclientform .= '<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>'."\n";
         my ($datatable,$rowcount) =          my ($datatable,$rowcount) =
             &Apache::loncreateuser::personal_data_display('',$domain,'email','selfcreate',              &Apache::loncreateuser::personal_data_display('',$domain,'email','selfcreate',
                                                           '','',$now,$captchaform,                                                            '','','',$now,$captchaform,
                                                           $emailusername,$usertype);                                                            $emailusername,$usertype,
                                                             $usernameset,$condition,$excluded,
                                                             $showsubmit);
         if ($rowcount) {          if ($rowcount) {
             $output .= '<div class="LC_left_float">'.$beginclientform.$datatable.$endclientform;              $output .= '<div class="LC_left_float">'.$beginclientform.$datatable.$endclientform.'</div>'."\n".
                          '<div class="LC_clear_float_footer"></div>'."\n";
         } else {          } else {
             $output .= $beginclientform.$endclientform;              $output .= $beginclientform.$endclientform;
         }          }
         if ($rowcount) {          $output .= $serverform.
             $output .= '</div>'."\n".                     '<p class="LC_info">'.
                        '<div class="LC_clear_float_footer"></div>'."\n";                     &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>');
     }      }
Line 970  ENDSERVERFORM Line 1280  ENDSERVERFORM
   
 sub get_creation_controls {  sub get_creation_controls {
     my ($domain,$usercreation) = @_;      my ($domain,$usercreation) = @_;
     my (@cancreate,@statustocreate,$emailusername);      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 (@statustocreate == 0) {
                     my ($othertitle,$usertypes,$types) =  
                         &Apache::loncommon::sorted_inst_types($domain);  
                     if (ref($types) eq 'ARRAY') {                      if (ref($types) eq 'ARRAY') {
                         if (@{$types} == 0) {                          if (@{$types} == 0) {
                             @statustocreate = ('default');                              @statustocreate = ('default');
Line 988  sub get_creation_controls { Line 1299  sub get_creation_controls {
                 }                  }
             } 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 1000  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') {              if (ref($usercreation->{'cancreate'}{'emailusername'}) eq 'HASH') {
                 $emailusername = $usercreation->{'cancreate'}{'emailusername'};                  $emailusername = $usercreation->{'cancreate'}{'emailusername'};
             } else {              } else {
Line 1012  sub get_creation_controls { Line 1351  sub get_creation_controls {
             }              }
         }          }
     }      }
     return (\@cancreate,\@statustocreate,$emailusername);      return (\@cancreate,\@statustocreate,\@statusforemail,$emailusername,
               $emailoptions,$verification,$emaildomain,$types,$usertypes,$othertitle);
 }  }
   
 sub create_account {  sub create_account {
Line 1025  sub create_account { Line 1365  sub create_account {
     my $output;      my $output;
     if (ref($dataref) eq 'HASH') {      if (ref($dataref) eq 'HASH') {
         my ($username,$encpass,$serverid,$courseid,$id,$firstname,$middlename,$lastname,          my ($username,$encpass,$serverid,$courseid,$id,$firstname,$middlename,$lastname,
             $generation,$inststatus);              $generation,$inststatus,$permanentemail);
         $username   = $dataref->{'username'};          $username   = $dataref->{'username'};
         $encpass    = $dataref->{'upass'};          $encpass    = $dataref->{'upass'};
         $serverid   = $dataref->{'serverid'};          $serverid   = $dataref->{'serverid'};
Line 1037  sub create_account { Line 1377  sub create_account {
         $generation = $dataref->{'generation'};          $generation = $dataref->{'generation'};
         $inststatus = $dataref->{'inststatus'};          $inststatus = $dataref->{'inststatus'};
   
           if ($dataref->{'email'} ne '') {
               $permanentemail = $dataref->{'email'};
           } else {
               $permanentemail = $dataref->{'username'};
           }
         my $currhome = &Apache::lonnet::homeserver($username,$domain);          my $currhome = &Apache::lonnet::homeserver($username,$domain);
         unless ($currhome eq 'no_host') {          unless ($currhome eq 'no_host') {
             $output = &mt('User account requested for username: [_1] in domain: [_2] already exists.',$username,$domain);              $output = &mt('User account requested for username: [_1] in domain: [_2] already exists.',$username,$domain);
Line 1047  sub create_account { Line 1392  sub create_account {
   
         my ($key,$caller)=split(/&/,$dataref->{'tmpinfo'});          my ($key,$caller)=split(/&/,$dataref->{'tmpinfo'});
         if ($caller eq 'createaccount') {          if ($caller eq 'createaccount') {
             my $upass = &Apache::loncommon::des_decrypt($key,$encpass);              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,  # See if we are allowed to use the proposed student/employee ID,
 # as per domain rules; if not, student/employee will be left blank.  # as per domain rules; if not, student/employee will be left blank.
Line 1068  sub create_account { Line 1419  sub create_account {
             my $result =              my $result =
                 &Apache::lonnet::modifyuser($domain,$username,$id,                  &Apache::lonnet::modifyuser($domain,$username,$id,
                                             'internal',$upass,$firstname,$middlename,                                              'internal',$upass,$firstname,$middlename,
                                             $lastname,$generation,undef,undef,$username);                                              $lastname,$generation,undef,undef,$permanentemail);
             $output = &mt('Generating user: [_1]',$result);              $output = &mt('Generating user: [_1]',$result);
   
 # Now that the user account exists, retrieve the homeserver, and include it in the output.  # Now that the user account exists, retrieve the homeserver, and include it in the output.
Line 1077  sub create_account { Line 1428  sub create_account {
             unless (($inststatus eq 'default') || ($inststatus eq '')) {              unless (($inststatus eq 'default') || ($inststatus eq '')) {
                 &Apache::lonnet::put('environment',{inststatus => $inststatus},$domain,$username);                  &Apache::lonnet::put('environment',{inststatus => $inststatus},$domain,$username);
             }              }
             $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.              $output .= '<br />'.&mt('Home Server').": $uhome ".
                        &Apache::lonnet::hostname($uhome).'<br /><br />';                         &Apache::lonnet::hostname($uhome).'<br /><br />';
             return ('ok',$output,$uhome);              return ('ok',$output,$uhome);
         } else {          } else {
Line 1250  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);
Line 1454  sub invalid_state { Line 1806  sub invalid_state {
         $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 1590  sub store_request { Line 1942  sub store_request {
 }  }
   
 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 1630  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 1698  function getFormByName(item) { Line 2054  function getFormByName(item) {
 }  }
 // ]]>  // ]]>
 </script>  </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>
 ENDSCRIPT  ENDSCRIPT
   
 }  }

Removed from v.1.67  
changed lines
  Added in v.1.88


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.