--- loncom/interface/createaccount.pm 2008/07/10 00:18:05 1.15 +++ 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.15 2008/07/10 00:18:05 raeburn Exp $ +# $Id: createaccount.pm,v 1.19 2008/07/13 17:57:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -114,7 +114,7 @@ sub handler { &print_header($r,$start_page); my $output = '

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

'. ''. - &mt('Creation of a new user account using an e-mail address or an institutional log-in ID as username is not permitted in the domain: [_1] ([_2]).',$domain,$domdesc).'

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

'; $r->print($output); $r->print(&Apache::loncommon::end_page()); return OK; @@ -127,31 +127,20 @@ sub handler { if ($sso_username ne '') { &print_header($r,$start_page); - my ($output,$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 in this domain.").'

'; - ($output, my $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.').''; - } elsif ($checkfail eq 'authtoken') { - $msg .= ''.&mt('Error creating token.').''; - } - $msg .= '

'. - &mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email); - } 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.'); - } + &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.").'
'; + + $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 in this domain, and you are not permitted to create one.").'

'.&mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email); + $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; } - $r->print($msg.'
'.$output); + $r->print($msg); $r->print(&Apache::loncommon::end_page()); return OK; } @@ -191,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"); @@ -328,8 +324,8 @@ sub print_username_form { if (grep(/^login$/,@{$cancreate})) { my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) { - $output = '

'.&mt('Create account with a username provided by your institution').'

'; - $output .= &mt('If you already have a log-in ID at your institution,[_1] you may be able to use it for LON-CAPA.','
').'

'.&mt('Type in your log-in ID and password to find out.').'

'; + $output = '

'.&mt('Create account with a username provided by this institution').'

'; + $output .= &mt('If you already have a log-in ID at this institution,[_1] you may be able to use it for LON-CAPA.','
').'

'.&mt('Type in your log-in ID and password to find out.').'

'; my ($lkey,$ukey) = &Apache::lonpreferences::des_keys(); my ($lextkey,$uextkey) = &getkeys($lkey,$ukey); my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount', @@ -386,7 +382,7 @@ sub print_username_form { } } if ($output eq '') { - $output = &mt('Creation of a new user account using an e-mail address or an 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 { $output .= ''; } @@ -482,7 +478,7 @@ sub send_token { my $token = &Apache::lonnet::tmpput(\%info,$server); if ($token !~ /^error/ && $token ne 'no_such_host') { 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' .' URL in the address/location box: [_1]' ,&Apache::lonnet::absolute_url().'/adm/createaccount?token='.$esc_token); @@ -524,8 +520,8 @@ sub process_mailtoken { $data{'username'},$domdesc); if ($result eq 'ok') { $msg = $output; - my $shownow = localtime($now); - 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,$shownow,$ENV{'REMOTE_ADDR'},$contact_name,$contact_email)."\n"; + 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 $mailresult = &Apache::resetpw::send_mail($domdesc,$data{'email'}, $mailmsg,$contact_name, $contact_email); @@ -579,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'}, @@ -718,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); @@ -744,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 }; @@ -768,47 +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 = - &Apache::loncommon::instrule_disallow_msg('username',$domdesc,1). + $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 { @@ -911,15 +950,15 @@ sub invalid_state { if ($error eq 'baduseremail') { $msg = &mt('The e-mail address you provided does not appear to be a valid address.'); } 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') { - $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') { - $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') { $msg = &mt('Validation of the code your entered failed.'); } 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 .= ''; if ($msgtext) { @@ -934,9 +973,9 @@ sub linkto_email_help { my $msg; if ($contact_email ne '') { my $escuri = &HTML::Entities::encode('/adm/createaccount','&<>"'); - $msg .= '
'.&mt('You may wish to contact the [_1]LON-CAPA helpdesk[_2] for the [_3] domain.','','',$domdesc); + $msg .= '
'.&mt('You may wish to contact the [_1]LON-CAPA helpdesk[_2] for [_3].','','',$domdesc).'
'; } else { - $msg .= '
'.&mt('You may wish to send an e-mail to the server administrator: [_1] for the [_2] domain.',$Apache::lonnet::perlvar{'AdminEmail'},$domdesc); + $msg .= '
'.&mt('You may wish to send an e-mail to the server administrator: [_1] for [_2].',$Apache::lonnet::perlvar{'AdminEmail'},$domdesc).'
'; } return $msg; } @@ -1050,4 +1089,25 @@ sub guest_format_check { 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;