--- loncom/interface/createaccount.pm 2014/02/19 17:20:32 1.59
+++ loncom/interface/createaccount.pm 2014/05/30 16:46:03 1.67
@@ -4,7 +4,7 @@
# kerberos, or SSO) or an e-mail address. Requests to use an e-mail address as
# username may be processed automatically, or may be queued for approval.
#
-# $Id: createaccount.pm,v 1.59 2014/02/19 17:20:32 raeburn Exp $
+# $Id: createaccount.pm,v 1.67 2014/05/30 16:46:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -59,7 +59,7 @@ sub handler {
my $sso_domain = $r->subprocess_env->get('SSOUserDomain');
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['token','courseid','domain']);
+ ['token','courseid','domain','type']);
&Apache::lonacc::get_posted_cgi($r);
&Apache::lonlocal::get_language_handle($r);
@@ -170,10 +170,38 @@ sub handler {
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 $shibenv;
+ if (($r->dir_config('lonOtherAuthen') eq 'yes') &&
+ ($r->dir_config('lonOtherAuthenType') eq 'Shibboleth')) {
+ if (ref($domconfig{'usercreation'}) eq 'HASH') {
+ if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
+ if (ref($domconfig{'usercreation'}{'cancreate'}{'shibenv'}) eq 'HASH') {
+ my @possfields = ('firstname','middlename','lastname','generation',
+ 'permanentemail','id');
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);
+ $shibenv= {};
+ foreach my $key (keys(%{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}})) {
+ if ($key eq 'inststatus') {
+ if (ref($usertypes) eq 'HASH') {
+ if ($domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key} ne '') {
+ if (exists($usertypes->{$domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key}})) {
+ $shibenv->{$key} = $domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key};
+ }
+ }
+ }
+ } elsif (grep(/^\Q$key\E/,@possfields)) {
+ if ($domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key} ne '') {
+ $shibenv->{$key} = $domconfig{'usercreation'}{'cancreate'}{'shibenv'}{$key};
+ }
+ }
+ }
+ }
+ }
+ }
+ }
$msg .= &username_check($sso_username,$domain,$domdesc,$courseid,
$lonhost,$contact_email,$contact_name,
- $sso_logout,$statustocreate);
+ $sso_logout,$statustocreate,$shibenv);
} 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).''.
@@ -187,10 +215,11 @@ sub handler {
my ($output,$nostart,$noend,$redirect);
my $token = $env{'form.token'};
if ($token) {
+ my $usertype = &get_usertype($domain);
($output,$nostart,$noend,$redirect) =
&process_mailtoken($r,$token,$contact_name,$contact_email,$domain,
$domdesc,$lonhost,$include,$start_page,$cancreate,
- $domconfig{'usercreation'});
+ $domconfig{'usercreation'},$usertype);
if ($redirect) {
$r->internal_redirect('/adm/switchserver');
return OK;
@@ -240,10 +269,11 @@ sub handler {
}
} elsif ($env{'form.create_with_email'}) {
&print_header($r,$start_page,$courseid);
+ my $usertype = &get_usertype($domain);
$output = &process_email_request($env{'form.uname'},$domain,$domdesc,
$contact_name,$contact_email,$cancreate,
$lonhost,$domconfig{'usercreation'},
- $emailusername,$courseid);
+ $emailusername,$courseid,$usertype);
} elsif (!$token) {
&print_header($r,$start_page,$courseid);
my $now=time;
@@ -258,11 +288,13 @@ sub handler {
$gotlondes = 1;
}
}
- if (grep(/^email(|approval)$/,@{$cancreate})) {
+ if (grep(/^email$/,@{$cancreate})) {
$r->print(&javascript_validmail());
}
+ my $usertype = &get_usertype($domain);
$output = &print_username_form($r,$domain,$domdesc,$cancreate,$now,$lonhost,
- $include,$courseid,$gotlondes,$emailusername);
+ $include,$courseid,$gotlondes,$emailusername,
+ $usertype);
}
$r->print($output);
&print_footer($r);
@@ -298,6 +330,21 @@ sub print_footer {
$r->print(&Apache::loncommon::end_page());
}
+sub get_usertype {
+ my ($domain) = @_;
+ my $usertype = 'default';
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);
+ if (ref($types) eq 'ARRAY') {
+ push(@{$types},'default');
+ my $posstype = $env{'form.type'};
+ $posstype =~ s/^\s+|\s$//g;
+ if (grep(/^\Q$posstype\E$/,@{$types})) {
+ $usertype = $posstype;
+ }
+ }
+ return $usertype;
+}
+
sub selfenroll_crumbs {
my ($r,$courseid,$desc) = @_;
&Apache::lonhtmlcommon::add_breadcrumb
@@ -310,7 +357,7 @@ sub selfenroll_crumbs {
}
my $last_crumb;
if ($desc ne '') {
- $last_crumb = &mt('Self-enroll in [_1]',"$desc");
+ $last_crumb = &mt("Self-enroll in [_1]","'$desc'");
} else {
$last_crumb = &mt('Self-enroll');
}
@@ -322,20 +369,51 @@ sub selfenroll_crumbs {
}
sub javascript_setforms {
- my ($now,$emailusername,$captcha) = @_;
- my $setuserinfo;
+ my ($now,$emailusername,$captcha,$usertype) = @_;
+ my ($setuserinfo,@required,$requiredchk);
if (ref($emailusername) eq 'HASH') {
- foreach my $key (sort(keys(%{$emailusername}))) {
- $setuserinfo .= ' server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
+ if (ref($emailusername->{$usertype}) eq 'HASH') {
+ foreach my $key (sort(keys(%{$emailusername->{$usertype}}))) {
+ if ($emailusername->{$usertype}{$key} eq 'required') {
+ push(@required,$key);
+ }
+ $setuserinfo .= ' server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
+ }
+ $setuserinfo .= ' server.elements.type.value=client.elements.type.value;'."\n";
}
if ($captcha eq 'original') {
- $setuserinfo .= ' server.elements.code.value=client.elements.code.value;'."\n".
- ' server.elements.crypt.value=client.elements.crypt.value;'."\n";
+ $setuserinfo .= ' server.elements.code.value=client.elements.code.value;'."\n".
+ ' server.elements.crypt.value=client.elements.crypt.value;'."\n";
} elsif ($captcha eq 'recaptcha') {
- $setuserinfo .= ' server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".
- ' server.elements.recaptcha_response_field.value=client.elements.recaptcha_response_field.value;'."\n";
+ $setuserinfo .=
+ ' server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".
+ ' server.elements.recaptcha_response_field.value=client.elements.recaptcha_response_field.value;'."\n";
}
}
+ if (@required) {
+ my $missprompt = &mt('One or more required fields are currently blank.');
+ my $reqstr = join("','",@required);
+ $requiredchk = <<"ENDCHK";
+ var requiredfields = new Array('$reqstr');
+ missing = 0;
+ for (var i=0; i 0) {
+ alert("$missprompt");
+ return false;
+ }
+
+ENDCHK
+ }
my $js = <
// 'username',
udom => 'domain',
@@ -460,7 +540,7 @@ sub print_username_form {
$domain,'createaccount').'';
}
}
- if (grep(/^email(|approval)$/,@{$cancreate})) {
+ if (grep(/^email$/,@{$cancreate})) {
$output .= '
'.&mt('Create account with an e-mail address as your username').'
';
my ($captchaform,$error,$captcha) = &Apache::loncommon::captcha_display('usercreation',$lonhost);
if ($error) {
@@ -481,10 +561,9 @@ sub print_username_form {
} else {
my $prompt = $lt{'plse'};
if (ref($emailusername) eq 'HASH') {
- foreach my $key (keys(%{$emailusername})) {
- if ($emailusername->{$key}) {
+ if (ref($emailusername->{$usertype}) eq 'HASH') {
+ if (keys(%{$emailusername->{$usertype}}) > 0) {
$prompt = $lt{'info'};
- last;
}
}
}
@@ -492,7 +571,8 @@ sub print_username_form {
$lt{'yopw'}.' ';
}
$output .= &print_dataentry_form($r,$domain,$lonhost,$include,$now,$captchaform,
- $courseid,$gotlondes,$emailusername,$captcha);
+ $courseid,$gotlondes,$emailusername,$captcha,
+ $usertype);
}
$output .= '
';
}
@@ -558,10 +638,10 @@ sub login_box {
sub process_email_request {
my ($useremail,$domain,$domdesc,$contact_name,$contact_email,$cancreate,
- $server,$settings,$emailusername,$courseid) = @_;
+ $server,$settings,$emailusername,$courseid,$usertype) = @_;
my $output;
if (ref($cancreate) eq 'ARRAY') {
- if (!grep(/^email(|approval)$/,@{$cancreate})) {
+ if (!grep(/^email$/,@{$cancreate})) {
$output = &invalid_state('noemails',$domdesc,
$contact_name,$contact_email);
return $output;
@@ -612,7 +692,7 @@ sub process_email_request {
}
}
$output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
- $contact_email,$courseid,$emailusername);
+ $contact_email,$courseid,$emailusername,$usertype);
}
return $output;
}
@@ -632,7 +712,8 @@ sub call_rulecheck {
}
sub send_token {
- my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername) = @_;
+ my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername,
+ $usertype) = @_;
my $msg = '
'.&mt('Account creation status').'
'.
&mt('Thank you for your request to create a new LON-CAPA account.').
'
';
@@ -660,9 +741,14 @@ sub send_token {
'tmpinfo' => $tmpinfo);
if (ref($emailusername) eq 'HASH') {
- foreach my $item (keys(%{$emailusername})) {
- $info{$item} = $env{'form.'.$item};
- $info{$item} =~ s/(`)//g;
+ if (ref($emailusername->{$usertype}) eq 'HASH') {
+ foreach my $item (keys(%{$emailusername->{$usertype}})) {
+ $info{$item} = $env{'form.'.$item};
+ $info{$item} =~ s/(`)//g;
+ }
+ unless ($usertype eq 'default') {
+ $info{'inststatus'} = $usertype;
+ }
}
}
my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');
@@ -698,7 +784,7 @@ sub send_token {
sub process_mailtoken {
my ($r,$token,$contact_name,$contact_email,$domain,$domdesc,$lonhost,
- $include,$start_page,$cancreate,$settings) = @_;
+ $include,$start_page,$cancreate,$settings,$usertype) = @_;
my ($msg,$nostart,$noend,$redirect);
my %data = &Apache::lonnet::tmpget($token);
my $now = time;
@@ -715,36 +801,46 @@ sub process_mailtoken {
if ($now - $data{'time'} < 7200) {
# Check if request should be queued.
if (ref($cancreate) eq 'ARRAY') {
+ my $disposition;
if (grep(/^email$/,@{$cancreate})) {
- my ($result,$output,$uhome) =
- &create_account($r,$domain,$domdesc,\%data);
- if ($result eq 'ok') {
- $msg = $output;
- 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);
- if ($mailresult eq 'ok') {
- $msg .= &mt('An e-mail confirming creation of your new LON-CAPA account has been sent to [_1].',$data{'username'});
- } else {
- $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});
+ if (ref($settings) eq 'HASH') {
+ if (ref($settings->{'cancreate'}) eq 'HASH') {
+ if (ref($settings->{'cancreate'}{'selfcreateprocessing'}) eq 'HASH') {
+ $disposition = $settings->{'cancreate'}{'selfcreateprocessing'}{$usertype};
+ }
}
- $redirect = &start_session($r,$data{'username'},$domain,$uhome,
- $data{'courseid'},$token);
- $nostart = 1;
- $noend = 1;
+ }
+ if ($disposition eq 'approval') {
+ $msg = &store_request($domain,$data{'username'},'approval',\%data,$settings);
+ my $delete = &Apache::lonnet::tmpdel($token);
} else {
- $msg .= &mt('A problem occurred when attempting to create your new LON-CAPA account.')
- .' '.$output;
- if (($contact_name ne '') && ($contact_email ne '')) {
- $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);
+ my ($result,$output,$uhome) =
+ &create_account($r,$domain,$domdesc,\%data);
+ if ($result eq 'ok') {
+ $msg = $output;
+ 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);
+ if ($mailresult eq 'ok') {
+ $msg .= &mt('An e-mail confirming creation of your new LON-CAPA account has been sent to [_1].',$data{'username'});
+ } else {
+ $msg .= &mt('An error occurred when sending e-mail to [_1] confirming creation of your LON-CAPA account.',$data{'username'});
+ }
+ $redirect = &start_session($r,$data{'username'},$domain,$uhome,
+ $data{'courseid'},$token);
+ $nostart = 1;
+ $noend = 1;
+ } else {
+ $msg .= &mt('A problem occurred when attempting to create your new LON-CAPA account.')
+ .' '.$output;
+ if (($contact_name ne '') && ($contact_email ne '')) {
+ $msg .= &mt('Please contact the [_1] ([_2]) for assistance.',$contact_name,$contact_email);
+ }
}
+ my $delete = &Apache::lonnet::tmpdel($token);
}
- my $delete = &Apache::lonnet::tmpdel($token);
- } elsif (grep(/^emailapproval$/,@{$cancreate})) {
- $msg = &store_request($domain,$data{'username'},'approval',\%data,$settings);
- my $delete = &Apache::lonnet::tmpdel($token);
} else {
$msg = &invalid_state('noemails',$domdesc,$contact_name,$contact_email);
}
@@ -789,7 +885,8 @@ sub start_session {
# Stores token to store DES-key and stage during creation session
#
sub print_dataentry_form {
- my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$gotlondes,$emailusername,$captcha) = @_;
+ my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$gotlondes,$emailusername,$captcha,
+ $usertype) = @_;
my ($error,$output);
unless ($gotlondes) {
if (open(my $jsh,"<$include/londes.js")) {
@@ -797,7 +894,7 @@ sub print_dataentry_form {
$r->print($line);
}
close($jsh);
- $output = &javascript_setforms($now,$emailusername,$captcha)."\n";
+ $output = &javascript_setforms($now,$emailusername,$captcha,$usertype)."\n";
$gotlondes = 1;
}
}
@@ -813,8 +910,11 @@ sub print_dataentry_form {
$output .= ''."\n";
}
if (ref($emailusername) eq 'HASH') {
- foreach my $field (sort(keys(%{$emailusername}))) {
- $output .= ''."\n";
+ if (ref($emailusername->{$usertype}) eq 'HASH') {
+ foreach my $field (sort(keys(%{$emailusername->{$usertype}}))) {
+ $output .= ''."\n";
+ }
+ $output .= ''."\n";
}
}
if ($captcha eq 'original') {
@@ -843,11 +943,12 @@ ENDSERVERFORM
my $endclientform = ''."\n".
''."\n".
''."\n".
- '';
+ ''."\n".
+ '
'.&mt('Fields marked [_1]*[_2] are required.','','').'
';
my ($datatable,$rowcount) =
&Apache::loncreateuser::personal_data_display('',$domain,'email','selfcreate',
'','',$now,$captchaform,
- $emailusername);
+ $emailusername,$usertype);
if ($rowcount) {
$output .= '
'.$beginclientform.$datatable.$endclientform;
} else {
@@ -902,7 +1003,12 @@ sub get_creation_controls {
if (ref($usercreation->{'cancreate'}{'emailusername'}) eq 'HASH') {
$emailusername = $usercreation->{'cancreate'}{'emailusername'};
} else {
- $emailusername = {'lastname' => '1', 'firstname' => 1, };
+ $emailusername = {
+ default => {
+ 'lastname' => '1',
+ 'firstname' => 1,
+ },
+ };
}
}
}
@@ -919,7 +1025,7 @@ sub create_account {
my $output;
if (ref($dataref) eq 'HASH') {
my ($username,$encpass,$serverid,$courseid,$id,$firstname,$middlename,$lastname,
- $generation);
+ $generation,$inststatus);
$username = $dataref->{'username'};
$encpass = $dataref->{'upass'};
$serverid = $dataref->{'serverid'};
@@ -929,7 +1035,8 @@ sub create_account {
$middlename = $dataref->{'middlename'};
$lastname = $dataref->{'lastname'};
$generation = $dataref->{'generation'};
-
+ $inststatus = $dataref->{'inststatus'};
+
my $currhome = &Apache::lonnet::homeserver($username,$domain);
unless ($currhome eq 'no_host') {
$output = &mt('User account requested for username: [_1] in domain: [_2] already exists.',$username,$domain);
@@ -967,6 +1074,9 @@ sub create_account {
# Now that the user account exists, retrieve the homeserver, and include it in the output.
my $uhome = &Apache::lonnet::homeserver($username,$domain);
+ unless (($inststatus eq 'default') || ($inststatus eq '')) {
+ &Apache::lonnet::put('environment',{inststatus => $inststatus},$domain,$username);
+ }
$output .= ' '.&mt('Home server: [_1]',$uhome).' '.
&Apache::lonnet::hostname($uhome).'
';
return ('ok',$output,$uhome);
@@ -1087,7 +1197,7 @@ sub login_failure_msg {
sub username_check {
my ($username,$domain,$domdesc,$courseid,$lonhost,$contact_email,
- $contact_name,$sso_logout,$statustocreate) = @_;
+ $contact_name,$sso_logout,$statustocreate,$shibenv) = @_;
my (%rulematch,%inst_results,$checkfail,$rowcount,$editable,$output,$msg,
%alerts,%curr_rules,%got_rules);
&call_rulecheck($username,$domain,\%alerts,\%rulematch,
@@ -1123,6 +1233,13 @@ sub username_check {
}
if (!$checkfail) {
$output = '