--- loncom/interface/createaccount.pm 2008/07/12 14:08:58 1.17 +++ loncom/interface/createaccount.pm 2008/07/13 17:57:58 1.19 @@ -3,7 +3,7 @@ # institutional log-in ID (institutional authentication required - localauth # or kerberos) or an e-mail address. # -# $Id: createaccount.pm,v 1.17 2008/07/12 14:08:58 raeburn Exp $ +# $Id: createaccount.pm,v 1.19 2008/07/13 17:57:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -127,34 +127,18 @@ sub handler { if ($sso_username ne '') { &print_header($r,$start_page); - my $msg; + my ($msg,$sso_logout); + $sso_logout = &sso_logout_frag($r,$domain); if (grep(/^sso$/,@cancreate)) { $msg = '

'.&mt('Account creation').'

'. &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.").'
'; - my ($output,$checkfail) = &username_check($sso_username,$domain, - $domdesc,$courseid, - $lonhost,$contact_email); - if ($checkfail) { - $msg .= '

'.&mt('Account creation unavailable').'

'; - if ($checkfail eq 'username') { - $msg .= ''. - &mt('A LON-CAPA account may not be created with the username you use.'). - '

'.$output; - } elsif ($checkfail eq 'authtoken') { - $msg .= ''.&mt('Error creating token.').''. - '
'.$output; - } - $msg .= &mt('Please contact the [_1] ([_2]) for assistance.', - $contact_name,$contact_email).'

'. - &sso_logout_frag($r,$domain); - } else { - $msg .= '
'.&mt('To create one, use the table below to provide information about yourself (if appropriate), then click the "Create LON-CAPA account" button.').'
'.$output; - } + $msg .= &username_check($sso_username,$domain,$domdesc,$courseid, + $lonhost,$contact_email,$contact_name,$sso_logout); } else { $msg = '

'.&mt('Account creation unavailable').'

'. ''.&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.").'

'.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email).'
'. - &sso_logout_frag($r,$domain); + $sso_logout; } $r->print($msg); $r->print(&Apache::loncommon::end_page()); @@ -196,19 +180,26 @@ sub handler { $r->print($output); $r->print(&Apache::loncommon::end_page()); return OK; - } - - &print_header($r,$start_page); - if ($env{'form.create_with_email'}) { + } elsif ($env{'form.phase'} eq 'username_validation') { + (my $result,$output) = + &username_validation($r,$env{'form.uname'},$domain,$domdesc, + $contact_name,$contact_email,$courseid, + $lonhost); + if ($result eq 'existingaccount') { + $r->print($output); + $r->print(&Apache::loncommon::end_page()); + return OK; + } else { + &print_header($r,$start_page); + } + } elsif ($env{'form.create_with_email'}) { + &print_header($r,$start_page); $output = &process_email_request($env{'form.useremail'},$domain,$domdesc, $contact_name,$contact_email,\@cancreate, $lonhost,$domconfig{'usercreation'}, $courseid); - } elsif ($env{'form.phase'} eq 'username_validation') { - $output = &username_validation($env{'form.uname'},$domain,$domdesc, - $contact_name,$contact_email,$courseid, - $lonhost); } elsif (!$token) { + &print_header($r,$start_page); my $now=time; if (grep(/^login$/,@cancreate)) { my $jsh=Apache::File->new($include."/londes.js"); @@ -584,7 +575,9 @@ sub start_session { 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); + if ($token ne '') { + my $delete = &Apache::lonnet::tmpdel($token); + } $r->internal_redirect('/adm/switchserver'); } else { &Apache::lonauth::success($r,$form{'uname'},$form{'udom'}, @@ -723,21 +716,32 @@ sub create_account { } sub username_validation { - my ($username,$domain,$domdesc,$contact_name,$contact_email,$courseid,$lonhost) = @_; + my ($r,$username,$domain,$domdesc,$contact_name,$contact_email,$courseid, + $lonhost) = @_; my ($retrieved,$output,$upass); $username= &LONCAPA::clean_username($username); $domain = &LONCAPA::clean_domain($domain); my $uhome = &Apache::lonnet::homeserver($username,$domain); - if ($uhome ne 'no_host') { - $output = &invalid_state('existinguser',$domdesc, - $contact_name,$contact_email); - return $output; - } ($retrieved,$output,$upass) = &process_credentials($env{'form.logtoken'}, $env{'form.serverid'}); - if ($retrieved eq 'ok') { + if ($retrieved ne 'ok') { + return ('fail',$output); + } + if ($uhome ne 'no_host') { + my $result = &Apache::lonnet::authenticate($username,$upass,$domain); + if ($result ne 'no_host') { + my %form = &start_session($r,$username,$domain,$lonhost,$courseid); + $output = '

'.&mt('A LON-CAPA account already exists for username [_1] at this institution ([_2]).',''.$username.'',$domdesc).'
'.&mt('The password entered was also correct so you have been logged in.'); + return ('existingaccount',$output); + } else { + $output = '
'. + &mt('Username and/or password could not be authenticated.'). + '
'. + &mt('Please check the username and password.'); + } + } else { my $primlibserv = &Apache::lonnet::domain($domain,'primary'); my $authok; my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); @@ -749,21 +753,23 @@ sub username_validation { $authok = 'non_authorized'; } if ($authok eq 'authorized') { - ($output,undef) = &username_check($username,$domain,$domdesc, - $courseid,$lonhost,$contact_email); + $output = &username_check($username,$domain,$domdesc,$courseid,$lonhost, + $contact_email,$contact_name); } else { - $output = '
' - .&mt('Username and/or password could not be authenticated.') - .'
' - .&mt('Please check the username and password.'); + $output = '
'. + &mt('Username and/or password could not be authenticated.'). + '
'. + &mt('Please check the username and password.'); } } - return $output; + return ('ok',$output); } sub username_check { - my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email) = @_; - my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules); + my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,$contact_name, + $sso_logout) = @_; + my (%rulematch,%inst_results,$newuser,$checkfail,$rowcount,$editable,$output,$msg, + %alerts,%curr_rules,%got_rules); $newuser = 1; my $checkhash; my $checks = { 'username' => 1 }; @@ -773,48 +779,75 @@ sub username_check { 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 = + $output = &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); + $checkfail = 'username'; } } } - my $submit_text = &mt('Create LON-CAPA account'); - my $output = '
'. - &Apache::loncreateuser::personal_data_display($username,$domain,1, - undef,$inst_results{$username.':'.$domain}). - '

'."\n". - ''."\n". - ''; - 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 .= ''; + if (!$checkfail) { + $output = ''; + (my $datatable,$rowcount,$editable) = + &Apache::loncreateuser::personal_data_display($username,$domain,1,'selfcreate', + $inst_results{$username.':'.$domain}); + if ($rowcount > 0) { + $output .= $datatable; + } + $output .= '

'."\n". + ''."\n". + ''; + 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 .= ''; + } else { + $output = &mt('An error occurred when storing a token').'
'. + &mt('You will not be able to proceed to the next stage of account creation'). + &linkto_email_help($contact_email,$domdesc); + $checkfail = 'authtoken'; + } + } + if ($checkfail) { + $msg = '

'.&mt('Account creation unavailable').'

'; + if ($checkfail eq 'username') { + $msg .= ''. + &mt('A LON-CAPA account may not be created with the username you use.'). + '

'.$output; + } elsif ($checkfail eq 'authtoken') { + $msg .= ''.&mt('Error creating token.').''. + '
'.$output; + } + $msg .= &mt('Please contact the [_1] ([_2]) for assistance.', + $contact_name,$contact_email).'

'. + $sso_logout; + &Apache::lonnet::logthis("ERROR: failure type of '$checkfail' when performing username check to create account for authenticated user: $username, in domain $domain"); } else { - $output = &mt('An error occurred when storing a token').'
'. - &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 .= ''; - } - $output .= '
'; - return ($output,''); + if ($courseid ne '') { + $output .= ''; + } + $output .= ''; + if ($rowcount) { + if ($editable) { + $msg = &mt('To create one, use the table below to provide information about yourself, then click the [_1]Create LON-CAPA account[_2] button.','','').'
'; + } else { + $msg = &mt('A user account will be created with information displayed in the table below, when you click the [_1]Create LON-CAPA account[_2] button.','','').'
'; + } + } else { + $msg = '
'.&mt('Confirm that you wish to create an account.'); + } + $msg .= $output; + } + return $msg; } sub username_activation {