Diff for /loncom/interface/createaccount.pm between versions 1.1 and 1.17

version 1.1, 2008/02/24 23:23:39 version 1.17, 2008/07/12 14:08:58
Line 35  use Apache::Constants qw(:common); Line 35  use Apache::Constants qw(:common);
 use Apache::lonacc;  use Apache::lonacc;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
   use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonauth;
 use Apache::resetpw;  use Apache::resetpw;
 use Authen::Captcha;  use Authen::Captcha;
 use DynaLoader; # for Crypt::DES version  use DynaLoader; # for Crypt::DES version
 use Crypt::DES;  use Crypt::DES;
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities;
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 49  sub handler { Line 52  sub handler {
     if ($r->header_only) {      if ($r->header_only) {
         return OK;          return OK;
     }      }
     my $domain = &Apache::lonnet::default_login_domain();      
       my $domain;
   
       my $sso_username = $r->subprocess_env->get('REDIRECT_SSOUserUnknown');
       my $sso_domain = $r->subprocess_env->get('REDIRECT_SSOUserDomain');
   
       if ($sso_username ne '' && $sso_domain ne '') {
           $domain = $sso_domain; 
       } else { 
           $domain = &Apache::lonnet::default_login_domain();
       }
     my $domdesc = &Apache::lonnet::domain($domain,'description');      my $domdesc = &Apache::lonnet::domain($domain,'description');
     my $start_page =  
         &Apache::loncommon::start_page('Create a user account in LON-CAPA','',  
                                            {  
                                              'no_inline_link'   => 1,});  
     $r->print($start_page);  
     &Apache::lonhtmlcommon::clear_breadcrumbs();  
     &Apache::lonhtmlcommon::add_breadcrumb  
     ({href=>"/adm/createuser",  
       text=>"New username"});  
     my $contact_name = &mt('LON-CAPA helpdesk');      my $contact_name = &mt('LON-CAPA helpdesk');
     my $contact_email =  $r->dir_config('lonSupportEMail');      my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
       my $contacts =
           &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
                                                    $domain,$origmail);
       my ($contact_email) = split(',',$contacts);
     my $lonhost = $r->dir_config('lonHostID');      my $lonhost = $r->dir_config('lonHostID');
     my $include = $r->dir_config('lonIncludes');      my $include = $r->dir_config('lonIncludes');
       my $start_page;
   
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['token','courseid']);
     &Apache::lonacc::get_posted_cgi($r);      &Apache::lonacc::get_posted_cgi($r);
     &Apache::lonlocal::get_language_handle($r);      &Apache::lonlocal::get_language_handle($r);
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['token']);  
     my $token = $env{'form.token'};      my $handle = &Apache::lonnet::check_for_valid_session($r);
     my $output;      if ($handle ne '') {
     my $cancreate;          $start_page =
               &Apache::loncommon::start_page('Already logged in');
           my $end_page =
               &Apache::loncommon::end_page();
           $r->print($start_page."\n".'<h2>'.&mt('You are already logged in').'</h2>'.
                     '<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]logout[_4].','<a href="/adm/roles">','</a>','<a href="/adm/logout">','</a>').
                     '</p><p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'.$end_page);
          return OK;
       }
       $start_page =
           &Apache::loncommon::start_page('Create a user account in LON-CAPA','',
                                          {'no_inline_link'   => 1,});
       if ($env{'form.phase'} eq 'username_activation') {
           if ($env{'form.udom'} ne '') {
               $domain = $env{'form.udom'};
           }
       }
       my @cancreate;
     my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);      my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
     if (ref($domconfig{'usercreation'}) eq 'HASH') {      if (ref($domconfig{'usercreation'}) eq 'HASH') {
         if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {           if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
             if ($domconfig{'usercreation'}{'cancreate'}{'selfenroll'} ne 'none') {              if (ref($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}) eq 'ARRAY') {
                 $cancreate = $domconfig{'usercreation'}{'cancreate'}{'selfenroll'};                  @cancreate = @{$domconfig{'usercreation'}{'cancreate'}{'selfcreate'}};
               } elsif (($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') &&
                        ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne '')) {
                   @cancreate = ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'});
             }              }
         }          }
     }      }
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Create account'));  
     if (!$cancreate) {      if (@cancreate == 0) {
         $output = &mt('Creation of a new user account using an e-mail address as username or a loginID from your institution is not permitted in the domain: [_1] ([_2])',$domain,$domdesc);          &print_header($r,$start_page);
     } elsif ($token) {            my $output = '<h3>'.&mt('Account creation unavailable').'</h3>'.
         $output = &process_mailtoken($r,$token,$contact_name,$contact_email,$domain,                       '<span class="LC_warning">'.
                                      $domdesc,$lonhost,$include);                       &mt('Creation of a new user account using an e-mail address or an institutional log-in ID as username is not permitted at this institution ([_1]).',$domdesc).'</span><br /><br />';
     } elsif ($env{'form.create_with_email'}) {          $r->print($output);
           $r->print(&Apache::loncommon::end_page());
           return OK;
       }
   
       my $courseid;
       if (defined($env{'form.courseid'})) {
           $courseid = &validate_course($env{'form.courseid'});
       }
   
       if ($sso_username ne '') {
           &print_header($r,$start_page);
           my $msg;
           if (grep(/^sso$/,@cancreate)) {
               $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 />';
               my ($output,$checkfail) = &username_check($sso_username,$domain,
                                                         $domdesc,$courseid,
                                                         $lonhost,$contact_email);
               if ($checkfail) {
                   $msg .= '<h4>'.&mt('Account creation unavailable').'</h4>';
                   if ($checkfail eq 'username') {
                       $msg .= '<span class="LC_warning">'.
                               &mt('A LON-CAPA account may not be created with the username you use.').
                               '</span><br /><br />'.$output;
                   } elsif ($checkfail eq 'authtoken') {
                       $msg .= '<span class="LC_error">'.&mt('Error creating token.').'</span>'.
                               '<br />'.$output;
                   }
                   $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',
                               $contact_name,$contact_email).'<br /><hr />'.
                           &sso_logout_frag($r,$domain);    
   
               } else {
                   $msg .= '<br />'.&mt('To create one, use the table below to provide information about yourself (if appropriate), then click the "Create LON-CAPA account" button.').'<br />'.$output;
               }
           } else {
               $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 />'.
                      &sso_logout_frag($r,$domain);
           }
           $r->print($msg);
           $r->print(&Apache::loncommon::end_page());
           return OK;
       }
   
       my ($output,$nostart,$noend);
       my $token = $env{'form.token'};
       if ($token) {
           ($output,$nostart,$noend) = 
               &process_mailtoken($r,$token,$contact_name,$contact_email,$domain,
                                  $domdesc,$lonhost,$include,$start_page);
           if ($nostart) {
               if ($noend) {
                   return OK;
               } else {
                   $r->print($output);
                   $r->print(&Apache::loncommon::end_page());
                   return OK;
               }
           } else {
               &print_header($r,$start_page);
               $r->print($output);
               $r->print(&Apache::loncommon::end_page());
               return OK;
           }
       }
   
       if ($env{'form.phase'} eq 'username_activation') {
           (my $result,$output,$nostart) = 
               &username_activation($r,$env{'form.uname'},$domain,$domdesc,
                                    $lonhost,$courseid);
           if ($result eq 'ok') {
               if ($nostart) {
                   return OK;
               }
           }
           &print_header($r,$start_page);
           $r->print($output);
           $r->print(&Apache::loncommon::end_page());
           return OK;
       }
   
       &print_header($r,$start_page);
       if ($env{'form.create_with_email'}) {
         $output = &process_email_request($env{'form.useremail'},$domain,$domdesc,          $output = &process_email_request($env{'form.useremail'},$domain,$domdesc,
                                          $contact_name,$contact_email,$cancreate,                                           $contact_name,$contact_email,\@cancreate,
                                          $lonhost,$domconfig{'usercreation'});                                           $lonhost,$domconfig{'usercreation'},
                                            $courseid);
     } elsif ($env{'form.phase'} eq 'username_validation') {      } elsif ($env{'form.phase'} eq 'username_validation') {
         $output = &username_validation($env{'form.uname'},$domain,$domdesc,          $output = &username_validation($env{'form.uname'},$domain,$domdesc,
                                        $contact_name,$contact_email);                                         $contact_name,$contact_email,$courseid,
     } elsif ($env{'form.phase'} eq 'username_activation') {                                         $lonhost);
         (my $result,$output) = &username_activation($env{'form.uname'},      } elsif (!$token) {
                                                     $domain,$domdesc);  
     } else {  
         my $now=time;          my $now=time;
         if ($cancreate eq 'any' || $cancreate eq 'login') {          if (grep(/^login$/,@cancreate)) {
             my $jsh=Apache::File->new($include."/londes.js");              my $jsh=Apache::File->new($include."/londes.js");
             $r->print(<$jsh>);              $r->print(<$jsh>);
             $r->print(&javascript_setforms($now));              $r->print(&javascript_setforms($now));
         }          }
         $output = &print_username_form($domain,$domdesc,$cancreate,$now,$lonhost);           if (grep(/^email$/,@cancreate)) {
               $r->print(&javascript_validmail());
           }
           $output = &print_username_form($domain,$domdesc,\@cancreate,$now,$lonhost,
                                          $courseid); 
     }      }
     $r->print($output);      $r->print($output);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
   sub print_header {
       my ($r,$start_page) = @_;
       $r->print($start_page);
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb
       ({href=>"/adm/createuser",
         text=>"New username"});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Create account'));
       return;
   }
   
   sub validate_course {
       my ($courseid) = @_;
       my ($cdom,$cnum) = ($courseid =~ /^($match_domain)_($match_courseid)$/);
       if (($cdom ne '') && ($cnum ne '')) {
           if (&Apache::lonnet::is_course($cdom,$cnum)) {
               return ($courseid);
           }
       }
       return;
   }
   
 sub javascript_setforms {  sub javascript_setforms {
     my ($now) =  @_;      my ($now) =  @_;
     my $js = <<ENDSCRIPT;      my $js = <<ENDSCRIPT;
Line 134  ENDSCRIPT Line 274  ENDSCRIPT
   
 sub javascript_checkpass {  sub javascript_checkpass {
     my ($now) = @_;      my ($now) = @_;
     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 $js = <<"ENDSCRIPT";      my $js = <<"ENDSCRIPT";
Line 160  ENDSCRIPT Line 300  ENDSCRIPT
     return $js;      return $js;
 }  }
   
   sub javascript_validmail {
       my %lt = &Apache::lonlocal::texthash (
                  email => 'The e-mail address you entered',
                  notv  => 'is not a valid e-mail address',
       );
       my $output =  "\n".'<script type="text/javascript">'."\n".
                     &Apache::lonhtmlcommon::javascript_valid_email()."\n";
       $output .= <<"ENDSCRIPT";
   function validate_email() {
       field = document.createaccount.useremail;
       if (validmail(field) == false) {
           alert("$lt{'email'}: "+field.value+" $lt{'notv'}.");
           return false;
       }
       return true;
   }
   ENDSCRIPT
       $output .= "\n".'</script>'."\n";
       return $output;
   }
   
 sub print_username_form {  sub print_username_form {
     my ($domain,$domdesc,$cancreate,$now,$lonhost) = @_;      my ($domain,$domdesc,$cancreate,$now,$lonhost,$courseid) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                          unam => 'username',                                           unam => 'username',
                                          udom => 'domain',                                           udom => 'domain',
                                          uemail => 'Email address in LON-CAPA',                                           uemail => 'Email address in LON-CAPA',
                                          proc => 'Proceed');                                           proc => 'Proceed');
     my $output;      my $output;
     if ($cancreate eq 'any' || $cancreate eq 'login') {      if (ref($cancreate) eq 'ARRAY') {
         my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);          if (grep(/^login$/,@{$cancreate})) {
         if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {              my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
             $output = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by your institution').'</h3>';              if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {
             $output .= &mt('If you already have a Log-in ID at your institution, you may be able to use it[_1] for LON-CAPA.','<br />').'&nbsp;'.&mt('Type in your Log-in ID and password to find out.').'<br /><br />';                  $output = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by this institution').'</h3>';
             my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();                  $output .= &mt('If you already have a log-in ID at this institution,[_1] you may be able to use it for LON-CAPA.','<br />').'<br /><br />'.&mt('Type in your log-in ID and password to find out.').'<br /><br />';
             my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);                  my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
             my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',                  my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
                                                $lonhost);                  my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',
             $output .= &serverform($logtoken,$lonhost);                                                     $lonhost);
             my $unameform = '<input type="text" name="uname" size="10" value="" />';                  $output .= &serverform($logtoken,$lonhost,undef,$courseid);
             my $upassform = '<input type="password" name="upass'.$now.'" size="10" />';                  my $unameform = '<input type="text" name="uname" size="10" value="" />';
             my $submit_text = &mt('Create LON-CAPA account');                  my $upassform = '<input type="password" name="upass'.$now.'" size="10" />';
             $output .= '<form name="client" method="post" />'."\n".                   my $submit_text = &mt('Create LON-CAPA account');
                        &Apache::lonhtmlcommon::start_pick_box()."\n".                  $output .= '<form name="client" method="post" action="/adm/createaccount">'."\n". 
                        &Apache::lonhtmlcommon::row_title(&mt('Log-in ID'),                             &Apache::lonhtmlcommon::start_pick_box()."\n".
                              &Apache::lonhtmlcommon::row_title(&mt('Log-in ID'),
                                                         'LC_pick_box_title')."\n".                                                          'LC_pick_box_title')."\n".
                        $unameform."\n".                             $unameform."\n".
                        &Apache::lonhtmlcommon::row_closure(1)."\n".                             &Apache::lonhtmlcommon::row_closure(1)."\n".
                        &Apache::lonhtmlcommon::row_title(&mt('Password'),                             &Apache::lonhtmlcommon::row_title(&mt('Password'),
                                                         'LC_pick_box_title')."\n".                                                          'LC_pick_box_title')."\n".
                        $upassform."\n".'<br /><br />'."\n".                             $upassform."\n".'<br /><br />'."\n".
                        '<input type="button" name="username_validation" value="'.                             '<input type="button" name="username_validation" value="'.
                        $submit_text.'" onclick="javascript:send()" />'."\n".                              $submit_text.'" onclick="javascript:send()" />'."\n". 
                        &Apache::lonhtmlcommon::row_closure(1)."\n".                             &Apache::lonhtmlcommon::row_closure(1)."\n".
                        &Apache::lonhtmlcommon::end_pick_box().'<br /><br />'."\n".                             &Apache::lonhtmlcommon::end_pick_box().'<br /><br />'."\n".
                        '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".                             '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".
                        '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".                             '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".
                        '</form></div>';                             '</form></div>';
         }              }
     }          }
     if (($cancreate eq 'any') || ($cancreate eq 'email')) {          if (grep(/^email$/,@{$cancreate})) {
         $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';              $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';
         if ($cancreate eq 'any') {              if (grep(/^login$/,@{$cancreate})) {
             $output .= &mt('Provide your e-mail address to request a LON-CAPA account if you do not have [_1] a log-in ID at your institution.','<br />').'<br /><br />';                  $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 ($cancreate eq 'unofficial') {              } else {
             $output .= '<br />';                  $output .= '<br />';
         }              }
         my $emailform = '<input type="text" name="useremail" size="25" value="" />';              my $emailform = '<input type="text" name="useremail" size="25" value="" />';
         my $captchaform = &create_captcha();              my $captchaform = &create_captcha();
         my $submit_text = &mt('Request LON-CAPA account');              my $submit_text = &mt('Request LON-CAPA account');
         $output .=  '<form name="createaccount" method="post" onsubmit="validate_email();" >'.              $output .=  '<form name="createaccount" method="post" onSubmit="return validate_email()" action="/adm/createaccount">'.
                     &Apache::lonhtmlcommon::start_pick_box()."\n".                          &Apache::lonhtmlcommon::start_pick_box()."\n".
                     &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),                          &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),
                                                      'LC_pick_box_title')."\n".                                                           'LC_pick_box_title')."\n".
                     $emailform."\n".                          $emailform."\n".
                     &Apache::lonhtmlcommon::row_closure(1).                          &Apache::lonhtmlcommon::row_closure(1).
                     &Apache::lonhtmlcommon::row_title(&mt('Validation'),                          &Apache::lonhtmlcommon::row_title(&mt('Validation'),
                                                      'LC_pick_box_title')."\n".                                                           'LC_pick_box_title')."\n".
                     $captchaform."\n".'<br /><br />'.                          $captchaform."\n".'<br /><br />';
                     '<input type="submit" name="create_with_email" value="'.              if ($courseid ne '') {
                     $submit_text.'" />'.                  $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n"; 
                     &Apache::lonhtmlcommon::row_closure(1).              }
                     &Apache::lonhtmlcommon::end_pick_box().'<br /><br /></form>'.              $output .= '<input type="submit" name="create_with_email" value="'. 
                     '</div>';                          $submit_text.'" />'.
                           &Apache::lonhtmlcommon::row_closure(1).
                           &Apache::lonhtmlcommon::end_pick_box().'<br /><br /></form>'.
                           '</div>';
           }
     }      }
     if ($output eq '') {      if ($output eq '') {
         $output = &mt('Creation of a new user account using either an e-mail address or institutional log-in ID as your username is not permitted in the domain: [_1] ([_2])',$domain,$domdesc);          $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);
     } else {      } else {
         $output .= '<div class="LC_clear_float_footer"></div>';          $output .= '<div class="LC_clear_float_footer"></div>';
     }      }
Line 234  sub print_username_form { Line 400  sub print_username_form {
   
 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) = @_;          $server,$settings,$courseid) = @_;
     my $useremail = $env{'form.useremail'};      my $useremail = $env{'form.useremail'};
     my $output;      my $output;
     if ($cancreate ne 'any' && $cancreate ne 'email') {      if (ref($cancreate) eq 'ARRAY') {
         $output = &invalid_state('noemails',$domdesc,          if (!grep(/^email$/,@{$cancreate})) {
                                  $contact_name,$contact_email);              $output = &invalid_state('noemails',$domdesc,
         return $output;                                       $contact_name,$contact_email);
     } elsif ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) {              return $output;
         $output = &invalid_state('baduseremail',$domdesc,          } elsif ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) {
                                  $contact_name,$contact_email);              $output = &invalid_state('baduseremail',$domdesc,
         return $output;  
     } else {  
         my $uhome = &Apache::lonnet::homeserver($useremail,$domain);  
         if ($uhome ne 'no_host') {  
             $output = &invalid_state('existinguser',$domdesc,  
                                      $contact_name,$contact_email);                                       $contact_name,$contact_email);
             return $output;              return $output;
         } else {          } else {
             my $code = $env{'form.code'};              my $uhome = &Apache::lonnet::homeserver($useremail,$domain);
             my $md5sum = $env{'form.crypt'};              if ($uhome ne 'no_host') {
             my %captcha_params = &captcha_settings();                  $output = &invalid_state('existinguser',$domdesc,
             my $captcha = Authen::Captcha->new(                                           $contact_name,$contact_email);
                               output_folder => $captcha_params{'output_dir'},  
                               data_folder   => $captcha_params{'db_dir'},  
                              );  
             my $captcha_chk = $captcha->check_code($code,$md5sum);  
             my %captcha_hash = (  
                               0       => 'Code not checked (file error)',  
                               -1      => 'Failed: code expired',  
                               -2      => 'Failed: invalid code (not in database)',  
                               -3      => 'Failed: invalid code (code does not match crypt)',  
                                );  
             if ($captcha_chk != 1) {  
                 $output = &invalid_state('captcha',$domdesc,$contact_name,  
                                          $contact_email,$captcha_hash{$captcha_chk});  
                 return $output;                  return $output;
             }              } else {
             my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);                  my $code = $env{'form.code'};
             my $uhome=&Apache::lonnet::homeserver($useremail,$domain);                  my $md5sum = $env{'form.crypt'};
             if ($uhome eq 'no_host') {                  my %captcha_params = &captcha_settings();
                 my $checkhash;                  my $captcha = Authen::Captcha->new(
                 my $checks = { 'username' => 1 };                                    output_folder => $captcha_params{'output_dir'},
                 $checkhash->{$useremail.':'.$domain} = { 'newuser' => 1, };                                    data_folder   => $captcha_params{'db_dir'},
                 &Apache::loncommon::user_rule_check($checkhash,$checks,                                   );
                       \%alerts,\%rulematch,\%inst_results,\%curr_rules,                  my $captcha_chk = $captcha->check_code($code,$md5sum);
                       \%got_rules);                  my %captcha_hash = (
                 if (ref($alerts{'useremail'}) eq 'HASH') {                                    0       => 'Code not checked (file error)',
                     if (ref($alerts{'useremail'}{$domain}) eq 'HASH') {                                    -1      => 'Failed: code expired',
                         if ($alerts{'username'}{$domain}{$useremail}) {                                    -2      => 'Failed: invalid code (not in database)',
                             $output = &invalid_state('userrules',$domdesc,                                    -3      => 'Failed: invalid code (code does not match crypt)',
                                                      $contact_name,$contact_email);                                     );
                             return $output;                  if ($captcha_chk != 1) {
                       $output = &invalid_state('captcha',$domdesc,$contact_name,
                                                $contact_email,$captcha_hash{$captcha_chk});
                       return $output;
                   }
                   my (%rulematch,%inst_results,%curr_rules,%got_rules,%alerts);
                   my $uhome=&Apache::lonnet::homeserver($useremail,$domain);
                   if ($uhome eq 'no_host') {
                       my $checkhash;
                       my $checks = { 'username' => 1 };
                       $checkhash->{$useremail.':'.$domain} = { 'newuser' => 1, };
                       &Apache::loncommon::user_rule_check($checkhash,$checks,
                             \%alerts,\%rulematch,\%inst_results,\%curr_rules,
                             \%got_rules);
                       if (ref($alerts{'useremail'}) eq 'HASH') {
                           if (ref($alerts{'useremail'}{$domain}) eq 'HASH') {
                               if ($alerts{'username'}{$domain}{$useremail}) {
                                   $output = &invalid_state('userrules',$domdesc,
                                                            $contact_name,$contact_email);
                                   return $output;
                               }
                         }                          }
                     }                      }
                 }                      my $format_msg = 
                 my $format_msg =                           &guest_format_check($useremail,$domain,$cancreate,
                     &guest_format_check($useremail,$domain,$cancreate,                                              $settings);
                                         $settings);                      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);                          return $output;
                     return $output;                      }
                 }                  }
             }              }
         }          }
           $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
                             $contact_email,$courseid);
     }      }
     $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,  
                           $contact_email);  
     return $output;      return $output;
 }  }
   
 sub send_token {  sub send_token {
     my ($domain,$email,$server,$domdesc,$contact_name,$contact_email) = @_;      my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid) = @_;
     my $msg = &mt('Thank you for your request to create a new LON-CAPA account.').'<br /><br />';      my $msg = '<h3>'.&mt('Account creation status').'</h3>'.
                 &mt('Thank you for your request to create a new LON-CAPA account.').
                 '<br /><br />';
     my $now = time;      my $now = time;
     my %info = ('ip'         => $ENV{'REMOTE_ADDR'},      my %info = ('ip'         => $ENV{'REMOTE_ADDR'},
                 'time'       => $now,                  'time'       => $now,
                 'domain'     => $domain,                  'domain'     => $domain,
                 'username'   => $email);                  'username'   => $email,
                   'courseid'   => $courseid);
     my $token = &Apache::lonnet::tmpput(\%info,$server);      my $token = &Apache::lonnet::tmpput(\%info,$server);
     if ($token !~ /^error/ && $token ne 'no_such_host') {      if ($token !~ /^error/ && $token ne 'no_such_host') {
         my $esc_token = &escape($token);          my $esc_token = &escape($token);
         my $mailmsg = &mt('A request was submitted on [_1] for creation of a LON-CAPA account in the [_2] domain.',localtime(time),$domdesc).' '.          my $mailmsg = &mt('A request was submitted on [_1] for creation of a LON-CAPA account at the following institution: [_2].',localtime(time),$domdesc).' '.
              &mt('To complete this process please open a web browser and enter the following ".               &mt('To complete this process please open a web browser and enter the following'
              "URL in the address/location box: ').&Apache::lonnet::absolute_url()."/adm/createaccount?token=$esc_token";                  .' 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,          my $result = &Apache::resetpw::send_mail($domdesc,$email,$mailmsg,$contact_name,
                                                  $contact_email);                                                   $contact_email);
         if ($result eq 'ok') {          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>');              $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 {          } else {
             $msg .= &mt('An error occurred when sending a message to the e-mail address you provided. Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);              $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 .= &mt('An error occurred creating a token required for the account creation process. Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);          $msg .= '<span class="LC_error">'.
                   &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);
     }      }
     return $msg;      return $msg;
 }  }
   
 sub process_mailtoken {  sub process_mailtoken {
     my ($r,$token,$contact_name,$contact_email,$domain,$domdesc,$lonhost,$include) = @_;      my ($r,$token,$contact_name,$contact_email,$domain,$domdesc,$lonhost,
     my $msg;          $include,$start_page) = @_;
       my ($msg,$nostart,$noend);
     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.  Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a <a href="/adm/createaccount">new request</a> for account creation and follow the link to the new URL included in the e-mail that will be sent to you.');          $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('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{'username'}  =~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/)) {
         my $reqtime = localtime($data{'time'});  
         if ($now - $data{'time'} < 7200) {          if ($now - $data{'time'} < 7200) {
             if ($env{'form.phase'} eq 'createaccount') {              if ($env{'form.phase'} eq 'createaccount') {
                 my ($result,$output) = &create_account($r,$domain,$lonhost,$token,                  my ($result,$output) = &create_account($r,$domain,$lonhost,
                                                        $data{'username'},$domdesc);                                                         $data{'username'},$domdesc);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     $msg = $output;                       $msg = $output; 
                     my $delete = &Apache::lonnet::tmpdel($token);                      my $shownow = &Apache::lonlocal::locallocaltime($now);
                     my $now = localtime(time);                      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 in the [_1] domain has been created [_2] from IP address: [_3].  If you did not perform this action or authorize it, please contact the [_4] ([_5]).',$domdesc,$now,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n";  
                     my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},                      my $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'},
                                                                  $mailmsg,$contact_name,                                                                   $mailmsg,$contact_name,
                                                                  $contact_email);                                                                   $contact_email);
Line 362  sub process_mailtoken { Line 539  sub process_mailtoken {
                     } else {                      } else {
                         $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});                          $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});
                     }                      }
                     $msg .= '<br /><br />'.&mt('<a href="/adm/login">Go to the login page</a>.');                      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').'<br />'.$output.&mt('Please contact the [_1] - (<a href="mailto:[_2]">[_2]</a>) for assistance.',$contact_name,$contact_email);                      $msg .= &mt('A problem occurred when attempting to create your new LON-CAPA account.')
                              .'<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 {
                 $r->print(&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 .= &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 />';
                 &print_dataentry_form($r,$domain,$lonhost,$include,$token,$now,$data{'username'});                  $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. Please submit a <a href="/adm/createaccount">new request</a>, and follow the link to the web page included in the new e-mail that will be sent to you, to allow you to create the account.');              $msg = &mt('Sorry, the token generated when you requested creation of an account has expired.')
                     .' '.&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>');
               }
       } else {
           $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>');
       }
       return ($msg,$nostart,$noend);
   }
   
   sub start_session {
       my ($r,$username,$domain,$lonhost,$courseid,$token) = @_;
       my %form = (
                   uname => $username,
                   udom  => $domain,
                  );
       my $firsturl = '/adm/roles';
       if (defined($courseid)) {
           $courseid = &validate_course($courseid);
           if ($courseid ne '') {
               $form{'courseid'} = $courseid;
               $firsturl = '/adm/selfenroll?cid='.$courseid;
         }          }
       }
       if ($r->dir_config('lonBalancer') eq 'yes') {
           &Apache::lonauth::success($r,$form{'uname'},$form{'udom'},
                                     $lonhost,'noredirect',undef,\%form);
           my $delete = &Apache::lonnet::tmpdel($token);
           $r->internal_redirect('/adm/switchserver');
     } else {      } else {
         $msg .= &mt('Sorry, the URL generated when you requested creation of an accountcontained incomplete information. Please submit a <a href="/adm/createaccount">new request</a> for creation of an account, and use the new URL that will be sent to your e-mail address to complete the process.');          &Apache::lonauth::success($r,$form{'uname'},$form{'udom'},
                                     $lonhost,$firsturl,undef,\%form);
     }      }
     return $msg;      return %form;
 }  }
   
   
 sub print_dataentry_form {  sub print_dataentry_form {
     my ($r,$domain,$lonhost,$include,$mailtoken,$now,$username) = @_;      my ($r,$domain,$lonhost,$include,$mailtoken,$now,$username,$start_page) = @_;
     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);
         $r->print(&javascript_setforms($now)."\n".&javascript_checkpass($now));          $output .= &javascript_setforms($now)."\n".&javascript_checkpass($now);
         my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();          my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
         my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);          my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
         my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',          my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',
Line 413  sub print_dataentry_form { Line 628  sub print_dataentry_form {
                            id             => '15',                             id             => '15',
                           );                            );
         my $genhelp=&Apache::loncommon::help_open_topic('Generation');          my $genhelp=&Apache::loncommon::help_open_topic('Generation');
         $output = '<div class="LC_left_float"><h3>'.$lt{'pd'}.'</h3>'.          $output .= '<div class="LC_left_float"><h3>'.$lt{'pd'}.'</h3>'.
                   '<form name="server" method="post" target="_top">'.                    '<form name="server" method="post" target="_top" action="/adm/createaccount">'.
                   &Apache::lonhtmlcommon::start_pick_box();                    &Apache::lonhtmlcommon::start_pick_box();
         foreach my $item (@userinfo) {          foreach my $item (@userinfo) {
             my $rowtitle = $lt{$item};              my $rowtitle = $lt{$item};
Line 466  ENDSERVERFORM Line 681  ENDSERVERFORM
                    '<form name="buttonform">'."\n".                     '<form name="buttonform">'."\n".
                    '<input type="button" name="createaccount" value="'.                     '<input type="button" name="createaccount" value="'.
                    $submit_text.'" onclick="javascript:checkpass();" /></form></div>';                     $submit_text.'" onclick="javascript:checkpass();" /></form></div>';
         $r->print($output);  
     } else {      } else {
         $error = &mt('Could not load javascript file [_1]','londes.js');          $output = &mt('Could not load javascript file [_1]','<tt>londes.js</tt>');
         $r->print($error);  
     }      }
     return;      return $output;
 }  }
   
 sub create_account {  sub create_account {
     my ($r,$domain,$lonhost,$logtoken,$username,$domdesc) = @_;      my ($r,$domain,$lonhost,$username,$domdesc) = @_;
     my ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},      my ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'},
                                                           $env{'form.serverid'});                                                             $env{'form.serverid'}); 
     # Error messages      # Error messages
     my $error     = '<span class="LC_error">'.&mt('Error').': ';      my $error     = '<span class="LC_error">'.&mt('Error:').' ';
     my $end       = '</span><br /><br />';      my $end       = '</span><br /><br />';
     my $rtnlink   = '<a href="javascript:history.back();" />'.      my $rtnlink   = '<a href="javascript:history.back();" />'.
                     &mt('Return to previous page').'</a>'.                      &mt('Return to previous page').'</a>'.
Line 502  sub create_account { Line 715  sub create_account {
                                     'internal',$upass,$env{'form.cfirstname'},                                      'internal',$upass,$env{'form.cfirstname'},
                                     $env{'form.cmiddlename'},$env{'form.clastname'},                                      $env{'form.cmiddlename'},$env{'form.clastname'},
                                     $env{'form.cgeneration'},undef,undef,$username);                                      $env{'form.cgeneration'},undef,undef,$username);
     $output = &mt('Generating user').': '.$result;      $output = &mt('Generating user: [_1]',$result);
     my $uhome = &Apache::lonnet::homeserver($username,$domain);      my $uhome = &Apache::lonnet::homeserver($username,$domain);
     $output .= '<br />'.&mt('Home server').': '.$uhome.' '.      $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.
               &Apache::lonnet::hostname($uhome).'<br /><br />';                &Apache::lonnet::hostname($uhome).'<br /><br />';
     return ('ok',$output);      return ('ok',$output);
 }  }
   
 sub username_validation {  sub username_validation {
     my ($username,$domain,$domdesc,$contact_name,$contact_email) = @_;      my ($username,$domain,$domdesc,$contact_name,$contact_email,$courseid,$lonhost) = @_;
     my ($retrieved,$output,$upass);      my ($retrieved,$output,$upass);
   
     $username= &LONCAPA::clean_username($username);      $username= &LONCAPA::clean_username($username);
Line 536  sub username_validation { Line 749  sub username_validation {
             $authok = 'non_authorized';              $authok = 'non_authorized';
         }          }
         if ($authok eq 'authorized') {          if ($authok eq 'authorized') {
             my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules);              ($output,undef) = &username_check($username,$domain,$domdesc,
             $newuser = 1;                                                $courseid,$lonhost,$contact_email); 
             my $checkhash;          } else {
             my $checks = { 'username' => 1 };              $output = '<div class="LC_warning">'
             $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser };                       .&mt('Username and/or password could not be authenticated.')
             &Apache::loncommon::user_rule_check($checkhash,$checks,                       .'</div>'
                 \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);                       .&mt('Please check the username and password.'); 
             if (ref($alerts{'username'}) eq 'HASH') {          }
                 if (ref($alerts{'username'}{$domain}) eq 'HASH') {      }
                     if ($alerts{'username'}{$domain}{$username}) {      return $output;
                         my $userchkmsg;  }
                         if (ref($curr_rules{$domain}) eq 'HASH') {  
                             $userchkmsg =  sub username_check {
                                 &Apache::loncommon::instrule_disallow_msg('username',      my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email) = @_;
                                                                           $domdesc,1).      my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules);
                             &Apache::loncommon::user_rule_formats($domain,      $newuser = 1;
                                 $domdesc,$curr_rules{$domain}{'username'},      my $checkhash;
                                 'username');      my $checks = { 'username' => 1 };
                         }      $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser };
                         return $userchkmsg;       &Apache::loncommon::user_rule_check($checkhash,$checks,\%alerts,\%rulematch,
                                           \%inst_results,\%curr_rules,\%got_rules);
       if (ref($alerts{'username'}) eq 'HASH') {
           if (ref($alerts{'username'}{$domain}) eq 'HASH') {
               if ($alerts{'username'}{$domain}{$username}) {
                   my ($userchkmsg,$checkfail);
                   if (ref($curr_rules{$domain}) eq 'HASH') {
                       $userchkmsg =
                           &Apache::loncommon::instrule_disallow_msg('username',$domdesc,1,
                                                                     'selfcreate').
                           &Apache::loncommon::user_rule_formats($domain,$domdesc,
                                   $curr_rules{$domain}{'username'},'username');
                       if ($userchkmsg) {
                           $checkfail = 'username';
                     }                      }
                 }                  }
                   return ($userchkmsg,$checkfail);
             }              }
             my $submit_text = &mt('Create LON-CAPA account');  
             $output =  
                 '<form method="post">'.  
                 &Apache::loncreateuser::personal_data_display($username,$domain,1,  
                                        undef,$inst_results{$username.':'.$domain}).  
                 '<br /><br /><input type="hidden" name="uname" value="'.$username.'" />'.  
                 '<input type="hidden" name="phase" value="username_activation" />'.  
                 '<input type="submit" name="newaccount" value="'.  
                 $submit_text.'" /></form>';  
         } else {  
             $output = &mt('Not authenticated').' '.&mt('Please check the username and password');   
         }          }
     }      }
     return $output;      my $submit_text = &mt('Create LON-CAPA account');
       my $output = '<form method="post" action="/adm/createaccount">'.
                    &Apache::loncreateuser::personal_data_display($username,$domain,1,
                                       undef,$inst_results{$username.':'.$domain}).
                   '<br /><br /><input type="hidden" name="uname" value="'.$username.'" />'."\n".
                   '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".
                   '<input type="hidden" name="phase" value="username_activation" />';
       my $now = time;
       my %info = ('ip'         => $ENV{'REMOTE_ADDR'},
                   'time'       => $now,
                   'domain'     => $domain,
                   'username'   => $username);
       my $authtoken = &Apache::lonnet::tmpput(\%info,$lonhost);
       if ($authtoken !~ /^error/ && $authtoken ne 'no_such_host') {
           $output .= '<input type="hidden" name="authtoken" value="'.&HTML::Entities::encode($authtoken,'&<>"').'" />';
       } else {
           $output = &mt('An error occurred when storing a token').'<br />'.
                     &mt('You will not be able to proceed to the next stage of account creation').
                     &linkto_email_help($contact_email,$domdesc);
           return($output,'authtoken');
       }
       if ($courseid ne '') {
           $output .= '<input type="hidden" name="courseid" value="'.$courseid.'" />';
       }
       $output .= '<input type="submit" name="newaccount" value="'.
                  $submit_text.'" /></form>';
       return ($output,'');
 }  }
   
 sub username_activation {  sub username_activation {
     my ($username,$domain,$domdesc) = @_;      my ($r,$username,$domain,$domdesc,$lonhost,$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);
     if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {      my %data = &Apache::lonnet::tmpget($env{'form.authtoken'});
       my $now = time;
       my $earlyout;
       my $timeout = 300;
       if (keys(%data) == 0) {
           $output = &mt('Sorry, your authentication has expired.');
           $earlyout = 'fail';
       }
       if (($data{'time'} !~ /^\d+$/) ||
           ($data{'domain'} ne $domain) || 
           ($data{'username'} ne $username)) {
           $earlyout = 'fail';
           $output = &mt('The credentials you provided could not be verified.');   
       } elsif ($now - $data{'time'} > $timeout) {
           $earlyout = 'fail';
           $output = &mt('Sorry, your authentication has expired.');
       }
       if ($earlyout ne '') {
           $output .= '<br />'.&mt('Please [_1]start again[_2].','<a href="/adm/createaccount">','</a>');
           return($earlyout,$output);
       }
       if ((($domdefaults{'auth_def'} =~/^krb(4|5)$/) && 
            ($domdefaults{'auth_arg_def'} ne '')) || 
           ($domdefaults{'auth_def'} eq 'localauth')) {
         if ($env{'form.cid'} ne '') {          if ($env{'form.cid'} ne '') {
             my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);              my ($result,$userchkmsg) = &check_id($username,$domain,$domdesc);
             if ($result eq 'fail') {              if ($result eq 'fail') {
Line 601  sub username_activation { Line 866  sub username_activation {
                           $env{'form.cmiddlename'},$env{'form.clastname'},                            $env{'form.cmiddlename'},$env{'form.clastname'},
                           $env{'form.cgeneration'},undef,undef,                            $env{'form.cgeneration'},undef,undef,
                           $env{'form.cpermanentemail'});                            $env{'form.cpermanentemail'});
         $output = &mt('Generating user').': '.$result;          if ($result eq 'ok') {
         my $uhome = &Apache::lonnet::homeserver($username,$domain);              my $delete = &Apache::lonnet::tmpdel($env{'form.authtoken'});
         $output .= '<br />'.&mt('Home server').': '.$uhome.' '.              $output = &mt('A LON-CAPA account has been created for username: [_1] in domain: [_2].',$username,$domain);
                    &Apache::lonnet::hostname($uhome).'<br /><br />';              my %form = &start_session($r,$username,$domain,$lonhost,$courseid);
         return ('ok',$output);              my $nostart = 1;
               return ('ok',$output,$nostart);
           } else {
               $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);
           }
     } else {      } else {
         $output = &mt("User account creation is not available for the current default authentication type.\n");          $output = &mt('User account creation is not available for the current default authentication type.')."\n";
         return('fail',$output);          return('fail',$output);
     }      }
 }  }
Line 643  sub check_id { Line 913  sub check_id {
   
 sub invalid_state {  sub invalid_state {
     my ($error,$domdesc,$contact_name,$contact_email,$msgtext) = @_;      my ($error,$domdesc,$contact_name,$contact_email,$msgtext) = @_;
     my $msg;      my $msg = '<h3>'.&mt('Account creation unavailable').'</h3><span class="LC_error">';
     if ($error eq 'baduseremail') {      if ($error eq 'baduseremail') {
         $msg = &mt('The e-mail address you provided does not appear to be a valid address.');          $msg = &mt('The e-mail address you provided does not appear to be a valid address.');
     } elsif ($error eq 'existinguser') {      } elsif ($error eq 'existinguser') {
         $msg = &mt('The e-mail address you provided is already in use as a username in this LON-CAPA domain.');          $msg = &mt('The e-mail address you provided is already in use as a username in LON-CAPA at this institution.');
     } elsif ($error eq 'userrules') {      } elsif ($error eq 'userrules') {
         $msg = &mt('Username rules for this LON-CAPA domain do not allow the e-mail address you provided to be used as a username.');          $msg = &mt('Username rules for this LON-CAPA at this institution do not allow the e-mail address you provided to be used as a username.');
     } elsif ($error eq 'userformat') {      } elsif ($error eq 'userformat') {
         $msg = &mt('The e-mail address you provided may not be used as a username in this LON-CAPA domain.');          $msg = &mt('The e-mail address you provided may not be used as a username at this LON-CAPA institution.');
     } elsif ($error eq 'captcha') {      } elsif ($error eq 'captcha') {
         $msg = &mt('Validation of the code your entered failed.');          $msg = &mt('Validation of the code your 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 in this LON-CAPA domain.');          $msg = &mt('Creation of a new user account using an e-mail address as username is not permitted at this LON-CAPA institution.');
     }      }
       $msg .= '</span>';
     if ($msgtext) {      if ($msgtext) {
         $msg .= '<br />'.$msgtext;          $msg .= '<br />'.$msgtext;
     }      }
       $msg .= &linkto_email_help($contact_email,$domdesc);
       return $msg;
   }
   
   sub linkto_email_help {
       my ($contact_email,$domdesc) = @_;
       my $msg;
     if ($contact_email ne '') {      if ($contact_email ne '') {
         my $escuri = &HTML::Entities::encode('/adm/createaccount','&<>"');          my $escuri = &HTML::Entities::encode('/adm/createaccount','&<>"');
         $msg .= '<br />'.&mt(' You may wish to contact the <a href="/adm/helpdesk?origurl=[_1]">LON-CAPA helpdesk</a> for the [_2] domain.',$escuri,$domdesc);          $msg .= '<br />'.&mt('You may wish to contact the [_1]LON-CAPA helpdesk[_2] for [_3].','<a href="/adm/helpdesk?origurl='.$escuri.'">','</a>',$domdesc).'<br />';
     } else {      } else {
         $msg .= '<br />'.&mt(' You may wish to send an e-mail to the server administrator: [_1] for the [_2] domain.',$Apache::lonnet::perlvar{'AdminEmail'},$domdesc);          $msg .= '<br />'.&mt('You may wish to send an e-mail to the server administrator: [_1] for [_2].',$Apache::lonnet::perlvar{'AdminEmail'},$domdesc).'<br />';
     }      }
     return $msg;      return $msg;
 }  }
Line 686  sub create_captcha { Line 964  sub create_captcha {
   
 sub captcha_settings {  sub captcha_settings {
     my %captcha_params = (       my %captcha_params = ( 
                            output_dir     => "/home/httpd/html/captcha",                             output_dir     => $Apache::lonnet::perlvar{'lonCaptchaDir'},
                            www_output_dir => "/captcha",                             www_output_dir => "/captchaspool",
                            db_dir         => "/home/www/captchadb",                             db_dir         => $Apache::lonnet::perlvar{'lonCaptchaDb'},
                            numchars       => '5',                             numchars       => '5',
                          );                           );
     return %captcha_params;      return %captcha_params;
Line 705  sub getkeys { Line 983  sub getkeys {
 }  }
   
 sub serverform {  sub serverform {
     my ($logtoken,$lonhost,$mailtoken) = @_;      my ($logtoken,$lonhost,$mailtoken,$courseid) = @_;
     my $output .= <<ENDSERVERFORM;      my $output .= <<ENDSERVERFORM;
   <form name="server" method="post" target="_top">    <form name="server" method="post" target="_top">
    <input type="hidden" name="logtoken" value="$logtoken" />     <input type="hidden" name="logtoken" value="$logtoken" />
Line 714  sub serverform { Line 992  sub serverform {
    <input type="hidden" name="uname" value="" />     <input type="hidden" name="uname" value="" />
    <input type="hidden" name="upass" value="" />     <input type="hidden" name="upass" value="" />
    <input type="hidden" name="phase" value="username_validation" />     <input type="hidden" name="phase" value="username_validation" />
      <input type="hidden" name="courseid" value="$courseid" />
   </form>    </form>
 ENDSERVERFORM  ENDSERVERFORM
     return $output;      return $output;
Line 724  sub process_credentials { Line 1003  sub process_credentials {
     my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);      my $tmpinfo=Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);
     my ($retrieved,$output,$upass);      my ($retrieved,$output,$upass);
     if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {      if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
         $output = &mt('Information needed to retrieve your log-in information is missing, inaccessible or expired.').'<br />'.&mt('You may need to reload the previous page to obtain a new token.');          $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 ($retrieved,$output,$upass);           return ($retrieved,$output,$upass); 
     } else {      } else {
         my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$lonhost);          my $reply = &Apache::lonnet::reply('tmpdel:'.$logtoken,$lonhost);
Line 754  sub guest_format_check { Line 1034  sub guest_format_check {
     if (@user_rules > 0) {      if (@user_rules > 0) {
         my %rule_check =           my %rule_check = 
             &Apache::lonnet::inst_rulecheck($domain,$useremail,undef,              &Apache::lonnet::inst_rulecheck($domain,$useremail,undef,
                                             'selfenroll',\@user_rules);                                              'selfcreate',\@user_rules);
         if (keys(%rule_check) > 0) {          if (keys(%rule_check) > 0) {
             foreach my $item (keys(%rule_check)) {              foreach my $item (keys(%rule_check)) {
                 if ($rule_check{$item}) {                  if ($rule_check{$item}) {
Line 767  sub guest_format_check { Line 1047  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 ($cancreate eq 'any' || $cancreate eq 'login') {          if (ref($cancreate) eq 'ARRAY') {
             $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 />';               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 />'; 
               }
         }          }
     }      }
     return $format_msg;      return $format_msg;
 }  }
   
   sub sso_logout_frag {
       my ($r,$domain) = @_;
       my $endsessionmsg;
       if (defined($r->dir_config('lonSSOUserLogoutMessageFile_'.$domain))) {
           my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile_'.$domain);
           if (-e $msgfile) {
               open(my $fh,"<$msgfile");
               $endsessionmsg = join('',<$fh>);
               close($fh);
           }
       } elsif (defined($r->dir_config('lonSSOUserLogoutMessageFile'))) {
           my $msgfile = $r->dir_config('lonSSOUserLogoutMessageFile');
           if (-e $msgfile) {     
               open(my $fh,"<$msgfile");
               $endsessionmsg = join('',<$fh>);
               close($fh);
           }
       }
       return $endsessionmsg;
   }
   
 1;  1;

Removed from v.1.1  
changed lines
  Added in v.1.17


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.