[LON-CAPA-cvs] cvs: loncom /interface createaccount.pm
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Wed, 14 May 2008 20:05:08 -0000
This is a MIME encoded message
--raeburn1210795508
Content-Type: text/plain
raeburn Wed May 14 16:05:08 2008 EDT
Modified files:
/loncom/interface createaccount.pm
Log:
- selfcreation auth types are now stored as an array, instead of a single-valued scalar.
- if a user successfully authenticates via SSO, but a LON-CAPA account is lacking for the username used to authenticate, user can create an account, if selfcreation is allowed for the 'sso' auth type.
--raeburn1210795508
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20080514160508.txt"
Index: loncom/interface/createaccount.pm
diff -u loncom/interface/createaccount.pm:1.4 loncom/interface/createaccount.pm:1.5
--- loncom/interface/createaccount.pm:1.4 Mon Mar 24 01:15:14 2008
+++ loncom/interface/createaccount.pm Wed May 14 16:05:07 2008
@@ -3,7 +3,7 @@
# institutional log-in ID (institutional authentication required - localauth
# or kerberos) or an e-mail address.
#
-# $Id: createaccount.pm,v 1.4 2008/03/24 05:15:14 raeburn Exp $
+# $Id: createaccount.pm,v 1.5 2008/05/14 20:05:07 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -50,8 +50,17 @@
if ($r->header_only) {
return OK;
}
+
+ my $domain;
- my $domain = &Apache::lonnet::default_login_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 $contact_name = &mt('LON-CAPA helpdesk');
my $contact_email = $r->dir_config('lonSupportEMail');
@@ -82,17 +91,20 @@
$domain = $env{'form.udom'};
}
}
- my $cancreate;
+ my @cancreate;
my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
if (ref($domconfig{'usercreation'}) eq 'HASH') {
if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
- if ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') {
- $cancreate = $domconfig{'usercreation'}{'cancreate'}{'selfcreate'};
+ if (ref($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}) eq 'ARRAY') {
+ @cancreate = @{$domconfig{'usercreation'}{'cancreate'}{'selfcreate'}};
+ } elsif (($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') &&
+ ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne '')) {
+ @cancreate = ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'});
}
}
}
- if (!$cancreate) {
+ if (@cancreate == 0) {
&print_header($r,$start_page);
my $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);
$r->print($output);
@@ -100,6 +112,30 @@
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 ($output,$msg);
+ if (grep(/^sso$/,@cancreate)) {
+ $msg = &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);
+ if ($checkfail) {
+ $msg .= &mt('A LON-CAPA account may not be created with the username you use.');
+ } 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.');
+ }
+ } else {
+ $msg = &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.");
+ }
+ $r->print('<h4>'.$msg.'</h4>'.$output);
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
+ }
+
my ($output,$nostart,$noend);
my $token = $env{'form.token'};
if ($token) {
@@ -122,11 +158,6 @@
}
}
- my $courseid;
- if (defined($env{'form.courseid'})) {
- $courseid = &validate_course($env{'form.courseid'});
- }
-
if ($env{'form.phase'} eq 'username_activation') {
(my $result,$output,$nostart) =
&username_activation($r,$env{'form.uname'},$domain,$domdesc,
@@ -145,7 +176,7 @@
&print_header($r,$start_page);
if ($env{'form.create_with_email'}) {
$output = &process_email_request($env{'form.useremail'},$domain,$domdesc,
- $contact_name,$contact_email,$cancreate,
+ $contact_name,$contact_email,\@cancreate,
$lonhost,$domconfig{'usercreation'},
$courseid);
} elsif ($env{'form.phase'} eq 'username_validation') {
@@ -153,12 +184,12 @@
$contact_name,$contact_email,$courseid);
} elsif (!$token) {
my $now=time;
- if ($cancreate eq 'any' || $cancreate eq 'login') {
+ if (grep(/^login$/,@cancreate)) {
my $jsh=Apache::File->new($include."/londes.js");
$r->print(<$jsh>);
$r->print(&javascript_setforms($now));
}
- $output = &print_username_form($domain,$domdesc,$cancreate,$now,$lonhost,
+ $output = &print_username_form($domain,$domdesc,\@cancreate,$now,$lonhost,
$courseid);
}
$r->print($output);
@@ -248,64 +279,66 @@
uemail => 'Email address in LON-CAPA',
proc => 'Proceed');
my $output;
- if ($cancreate eq 'any' || $cancreate eq 'login') {
- my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
- if ((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth')) {
- $output = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by your institution').'</h3>';
- $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 />').' '.&mt('Type in your Log-in ID and password to find out.').'<br /><br />';
- my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
- my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
- my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',
- $lonhost);
- $output .= &serverform($logtoken,$lonhost,undef,$courseid);
- my $unameform = '<input type="text" name="uname" size="10" value="" />';
- my $upassform = '<input type="password" name="upass'.$now.'" size="10" />';
- my $submit_text = &mt('Create LON-CAPA account');
- $output .= '<form name="client" method="post" action="/adm/createaccount">'."\n".
- &Apache::lonhtmlcommon::start_pick_box()."\n".
- &Apache::lonhtmlcommon::row_title(&mt('Log-in ID'),
+ if (ref($cancreate) eq 'ARRAY') {
+ 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 = '<div class="LC_left_float"><h3>'.&mt('Create account with a username provided by your institution').'</h3>';
+ $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 />').' '.&mt('Type in your Log-in ID and password to find out.').'<br /><br />';
+ my ($lkey,$ukey) = &Apache::lonpreferences::des_keys();
+ my ($lextkey,$uextkey) = &getkeys($lkey,$ukey);
+ my $logtoken=Apache::lonnet::reply('tmpput:'.$ukey.$lkey.'&createaccount',
+ $lonhost);
+ $output .= &serverform($logtoken,$lonhost,undef,$courseid);
+ my $unameform = '<input type="text" name="uname" size="10" value="" />';
+ my $upassform = '<input type="password" name="upass'.$now.'" size="10" />';
+ my $submit_text = &mt('Create LON-CAPA account');
+ $output .= '<form name="client" method="post" action="/adm/createaccount">'."\n".
+ &Apache::lonhtmlcommon::start_pick_box()."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('Log-in ID'),
'LC_pick_box_title')."\n".
- $unameform."\n".
- &Apache::lonhtmlcommon::row_closure(1)."\n".
- &Apache::lonhtmlcommon::row_title(&mt('Password'),
+ $unameform."\n".
+ &Apache::lonhtmlcommon::row_closure(1)."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('Password'),
'LC_pick_box_title')."\n".
- $upassform."\n".'<br /><br />'."\n".
- '<input type="button" name="username_validation" value="'.
- $submit_text.'" onclick="javascript:send()" />'."\n".
- &Apache::lonhtmlcommon::row_closure(1)."\n".
- &Apache::lonhtmlcommon::end_pick_box().'<br /><br />'."\n".
- '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".
- '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".
- '</form></div>';
- }
- }
- if (($cancreate eq 'any') || ($cancreate eq 'email')) {
- $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';
- if ($cancreate eq 'any') {
- $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 />';
- } elsif ($cancreate eq 'unofficial') {
- $output .= '<br />';
- }
- my $emailform = '<input type="text" name="useremail" size="25" value="" />';
- my $captchaform = &create_captcha();
- my $submit_text = &mt('Request LON-CAPA account');
- $output .= '<form name="createaccount" method="post" onsubmit="validate_email();" action="/adm/createaccount">'.
- &Apache::lonhtmlcommon::start_pick_box()."\n".
- &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),
- 'LC_pick_box_title')."\n".
- $emailform."\n".
- &Apache::lonhtmlcommon::row_closure(1).
- &Apache::lonhtmlcommon::row_title(&mt('Validation'),
- 'LC_pick_box_title')."\n".
- $captchaform."\n".'<br /><br />';
- if ($courseid ne '') {
- $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";
+ $upassform."\n".'<br /><br />'."\n".
+ '<input type="button" name="username_validation" value="'.
+ $submit_text.'" onclick="javascript:send()" />'."\n".
+ &Apache::lonhtmlcommon::row_closure(1)."\n".
+ &Apache::lonhtmlcommon::end_pick_box().'<br /><br />'."\n".
+ '<input type="hidden" name="lextkey" value="'.$lextkey.'">'."\n".
+ '<input type="hidden" name="uextkey" value="'.$uextkey.'">'."\n".
+ '</form></div>';
+ }
+ }
+ if (grep(/^email$/,@{$cancreate})) {
+ $output .= '<div class="LC_left_float"><h3>'.&mt('Create account with an e-mail address as your username').'</h3>';
+ 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 />';
+ } else {
+ $output .= '<br />';
+ }
+ my $emailform = '<input type="text" name="useremail" size="25" value="" />';
+ my $captchaform = &create_captcha();
+ my $submit_text = &mt('Request LON-CAPA account');
+ $output .= '<form name="createaccount" method="post" onsubmit="validate_email();" action="/adm/createaccount">'.
+ &Apache::lonhtmlcommon::start_pick_box()."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('E-mail address'),
+ 'LC_pick_box_title')."\n".
+ $emailform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::row_title(&mt('Validation'),
+ 'LC_pick_box_title')."\n".
+ $captchaform."\n".'<br /><br />';
+ if ($courseid ne '') {
+ $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";
+ }
+ $output .= '<input type="submit" name="create_with_email" value="'.
+ $submit_text.'" />'.
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::end_pick_box().'<br /><br /></form>'.
+ '</div>';
}
- $output .= '<input type="submit" name="create_with_email" value="'.
- $submit_text.'" />'.
- &Apache::lonhtmlcommon::row_closure(1).
- &Apache::lonhtmlcommon::end_pick_box().'<br /><br /></form>'.
- '</div>';
}
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);
@@ -320,71 +353,73 @@
$server,$settings,$courseid) = @_;
my $useremail = $env{'form.useremail'};
my $output;
- if ($cancreate ne 'any' && $cancreate ne 'email') {
- $output = &invalid_state('noemails',$domdesc,
- $contact_name,$contact_email);
- return $output;
- } elsif ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) {
- $output = &invalid_state('baduseremail',$domdesc,
- $contact_name,$contact_email);
- return $output;
- } else {
- my $uhome = &Apache::lonnet::homeserver($useremail,$domain);
- if ($uhome ne 'no_host') {
- $output = &invalid_state('existinguser',$domdesc,
+ if (ref($cancreate) eq 'ARRAY') {
+ if (!grep(/^email$/,@{$cancreate})) {
+ $output = &invalid_state('noemails',$domdesc,
+ $contact_name,$contact_email);
+ return $output;
+ } elsif ($useremail !~ /^[^\@]+\@[^\@]+\.[^\@\.]+$/) {
+ $output = &invalid_state('baduseremail',$domdesc,
$contact_name,$contact_email);
return $output;
} else {
- my $code = $env{'form.code'};
- my $md5sum = $env{'form.crypt'};
- my %captcha_params = &captcha_settings();
- my $captcha = Authen::Captcha->new(
- 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});
+ my $uhome = &Apache::lonnet::homeserver($useremail,$domain);
+ if ($uhome ne 'no_host') {
+ $output = &invalid_state('existinguser',$domdesc,
+ $contact_name,$contact_email);
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;
+ } else {
+ my $code = $env{'form.code'};
+ my $md5sum = $env{'form.crypt'};
+ my %captcha_params = &captcha_settings();
+ my $captcha = Authen::Captcha->new(
+ 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;
+ }
+ 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 =
- &guest_format_check($useremail,$domain,$cancreate,
- $settings);
- if ($format_msg) {
- $output = &invalid_state('userformat',$domdesc,$contact_name,
- $contact_email,$format_msg);
- return $output;
+ my $format_msg =
+ &guest_format_check($useremail,$domain,$cancreate,
+ $settings);
+ if ($format_msg) {
+ $output = &invalid_state('userformat',$domdesc,$contact_name,
+ $contact_email,$format_msg);
+ return $output;
+ }
}
}
}
- }
- $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
+ $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
$contact_email,$courseid);
+ }
return $output;
}
@@ -650,7 +685,7 @@
$authok = 'non_authorized';
}
if ($authok eq 'authorized') {
- $output = &username_check($username,$domain,$domdesc,$courseid);
+ ($output,undef) = &username_check($username,$domain,$domdesc,$courseid);
} else {
$output = &mt('Not authenticated').' '.&mt('Please check the username and password');
}
@@ -670,14 +705,17 @@
if (ref($alerts{'username'}) eq 'HASH') {
if (ref($alerts{'username'}{$domain}) eq 'HASH') {
if ($alerts{'username'}{$domain}{$username}) {
- my $userchkmsg;
+ my ($userchkmsg,$checkfail);
if (ref($curr_rules{$domain}) eq 'HASH') {
$userchkmsg =
&Apache::loncommon::instrule_disallow_msg('username',$domdesc,1).
&Apache::loncommon::user_rule_formats($domain,$domdesc,
$curr_rules{$domain}{'username'},'username');
+ if ($userchkmsg) {
+ $checkfail = 1;
+ }
}
- return $userchkmsg;
+ return ($userchkmsg,$checkfail);
}
}
}
@@ -694,7 +732,7 @@
}
$output .= '<input type="submit" name="newaccount" value="'.
$submit_text.'" /></form>';
- return $output;
+ return ($output,'');
}
sub username_activation {
@@ -896,8 +934,10 @@
if ($format_match) {
($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 />';
- if ($cancreate eq 'any' || $cancreate eq 'login') {
- $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 (ref($cancreate) eq 'ARRAY') {
+ 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;
--raeburn1210795508--