--- loncom/interface/lonuserutils.pm 2024/01/05 04:09:47 1.184.4.10.2.7
+++ loncom/interface/lonuserutils.pm 2018/03/23 01:01:21 1.194
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Utility functions for managing LON-CAPA user accounts
#
-# $Id: lonuserutils.pm,v 1.184.4.10.2.7 2024/01/05 04:09:47 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.194 2018/03/23 01:01:21 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -103,7 +103,7 @@ sub modifystudent {
sub modifyuserrole {
my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass,
$first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role,
- $end,$start,$checkid,$inststatus,$emptyok) = @_;
+ $end,$start,$checkid,$inststatus) = @_;
my ($scope,$userresult,$authresult,$roleresult,$idresult);
if ($setting eq 'course' || $context eq 'course') {
$scope = '/'.$cid;
@@ -134,25 +134,6 @@ sub modifyuserrole {
generation => $gene,
id => $uid,
);
-
- # When "Update ID in user's course(s)" and "Force change of existing ID"
- # checkboxes both checked, prevent replacement of name information
- # in classlist.db file(s) for the user's course(s) with blank(s),
- # in the case where the uploaded csv file was without column(s) for
- # the particular field. Fields are: First Name, Middle Names/Initials,
- # Last Name (or the composite: Last Name, First Names), and Generation.
-
- my %emptyallowed;
- if ((ref($emptyok) eq 'HASH') && (keys(%{$emptyok}) > 0)) {
- %emptyallowed = %{$emptyok};
- }
- foreach my $field (keys(%userupdate)) {
- if ($userupdate{$field} eq '') {
- unless ($emptyallowed{$field}) {
- delete($userupdate{$field});
- }
- }
- }
$idresult = &propagate_id_change($uname,$udom,\%userupdate);
}
}
@@ -457,7 +438,7 @@ sub javascript_validations {
} elsif ($context eq 'domain') {
$setsection_call = 'setCourse()';
$setsections_js = &dc_setcourse_js($param{'formname'},$mode,
- $context,$showcredits,$domain);
+ $context,$showcredits);
}
$finish = " var checkSec = $setsection_call\n".
" if (checkSec == 'ok') {\n".
@@ -529,7 +510,7 @@ END
";
} elsif ($mode eq 'modifycourse') {
$auth_checks .= "
- if ((current.argfield !== null) && (current.argfield !== undefined) && (current.argfield !== '') && (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '')) {
+ if (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') {
";
}
if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
@@ -550,27 +531,22 @@ END
/* regexp here to check for non \d \. in credits */
END
} else {
- my ($numrules,$intargjs) =
- &Apache::loncommon::passwd_validation_js('vf.elements[current.argfield].value',$domain);
$auth_checks .= (<
' - .'' .'
'; @@ -4206,42 +4154,19 @@ sub upfile_drop_add { $fieldstype{$field.'_choice'} = 'scalar'; } &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype); - my ($cid,$crstype,$setting,$crsdom,$crsnum,$oldcrsuserdoms,%emptyok); + my ($cid,$crstype,$setting,$crsdom); if ($context eq 'domain') { $setting = $env{'form.roleaction'}; - if (exists($fields{'names'})) { - map { $emptyok{$_} = 1; } ('lastname','firstname','middlename'); - } else { - if (exists($fields{'lname'})) { - $emptyok{'lastname'} = 1; - } - if (exists($fields{'fname'})) { - $emptyok{'firstname'} = 1; - } - if (exists($fields{'mname'})) { - $emptyok{'middlename'} = 1; - } - } - if (exists($fields{'gen'})) { - $emptyok{'generation'} = 1; - } } if ($env{'request.course.id'} ne '') { $cid = $env{'request.course.id'}; $crstype = &Apache::loncommon::course_type(); $crsdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - $crsnum = $env{'course.'.$env{'request.course.id'}.'.num'}; } elsif ($setting eq 'course') { if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) { $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'}; $crstype = &Apache::loncommon::course_type($cid); $crsdom = $env{'form.dcdomain'}; - $crsnum = $env{'form.dccourse'}; - if (exists($env{'course.'.$cid.'.internal.userdomains'})) { - $oldcrsuserdoms = 1; - } - my %coursedesc = &Apache::lonnet::coursedescription($cid,{ one_time => 1 }); - $env{'course.'.$cid.'.internal.userdomains'} = $coursedesc{'internal.userdomains'}; } } my ($startdate,$enddate) = &get_dates_from_form(); @@ -4252,7 +4177,47 @@ sub upfile_drop_add { my $defdom=$env{'request.role.domain'}; my $domain; if ($env{'form.defaultdomain'} ne '') { - $domain = $env{'form.defaultdomain'}; + if (($context eq 'course') || ($setting eq 'course')) { + if ($env{'form.defaultdomain'} eq $crsdom) { + $domain = $env{'form.defaultdomain'}; + } else { + if (&Apache::lonnet::will_trust('enroll',$crsdom,$env{'form.defaultdomain'})) { + $domain = $env{'form.defaultdomain'}; + } else { + $r->print(''.&mt('Error').': '. + &mt('Enrollment of users not permitted for specified default domain: [_1].', + &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).''); + return 'untrusted'; + } + } + } elsif ($context eq 'author') { + if ($env{'form.defaultdomain'} eq $defdom) { + $domain = $env{'form.defaultdomain'}; + } else { + if ((&Apache::lonnet::will_trust('othcoau',$defdom,$env{'form.defaultdomain'})) && + (&Apache::lonnet::will_trust('coaurem',$env{'form.defaultdomain'},$defdom))) { + $domain = $env{'form.defaultdomain'}; + } else { + $r->print(''.&mt('Error').': '. + &mt('Addition of users not permitted for specified default domain: [_1].', + &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).''); + return 'untrusted'; + } + } + } elsif (($context eq 'domain') && ($setting eq 'domain')) { + if ($env{'form.defaultdomain'} eq $defdom) { + $domain = $env{'form.defaultdomain'}; + } else { + if (&Apache::lonnet::will_trust('domroles',$defdom,$env{'form.defaultdomain'})) { + $domain = $env{'form.defaultdomain'}; + } else { + $r->print(''.&mt('Error').': '. + &mt('Addition of users not permitted for specified default domain: [_1].', + &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).''); + return 'untrusted'; + } + } + } } else { $domain = $defdom; } @@ -4264,7 +4229,6 @@ sub upfile_drop_add { if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').': '. &mt('Invalid home server specified').'
'); - $r->print(&Apache::loncommon::end_page()); return 'invalidhome'; } } @@ -4275,7 +4239,6 @@ sub upfile_drop_add { } my $amode = ''; my $genpwd = ''; - my @genpwdfail; if ($env{'form.login'} eq 'krb') { $amode='krb'; $amode.=$env{'form.krbver'}; @@ -4284,14 +4247,14 @@ sub upfile_drop_add { $amode='internal'; if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) { $genpwd=$env{'form.intarg'}; - @genpwdfail = - &Apache::loncommon::check_passwd_rules($domain,$genpwd); } } elsif ($env{'form.login'} eq 'loc') { $amode='localauth'; if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) { $genpwd=$env{'form.locarg'}; } + } elsif ($env{'form.login'} eq 'lti') { + $amode='lti'; } if ($amode =~ /^krb/) { if (! defined($genpwd) || $genpwd eq '') { @@ -4364,6 +4327,7 @@ sub upfile_drop_add { \@statuses,\@poss_roles); &gather_userinfo($context,'view',\%userlist,$indexhash,\%info, \%cstr_roles,$permission); + } } } @@ -4441,9 +4405,9 @@ sub upfile_drop_add { my $newuserdom = $env{'request.role.domain'}; map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes); # Get new users list - my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname, - %showpasswdrules,$haspasswdmap); + my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname); my $counter = -1; + my (%willtrust,%trustchecked); foreach my $line (@userdata) { $counter ++; my @secs; @@ -4491,6 +4455,28 @@ sub upfile_drop_add { '"'.$entries{$fields{'domain'}}.'"', $fname,$mname,$lname,$gen); next; + } elsif ($entries{$fields{'domain'}} ne $domain) { + my $possdom = $entries{$fields{'domain'}}; + if ($context eq 'course' || $setting eq 'course') { + unless ($trustchecked{$possdom}) { + $willtrust{$possdom} = &Apache::lonnet::will_trust('enroll',$domain,$possdom); + $trustchecked{$possdom} = 1; + } + } elsif ($context eq 'author') { + unless ($trustchecked{$possdom}) { + $willtrust{$possdom} = &Apache::lonnet::will_trust('othcoau',$domain,$possdom); + } + if ($willtrust{$possdom}) { + $willtrust{$possdom} = &Apache::lonnet::will_trust('coaurem',$possdom,$domain); + } + } + unless ($willtrust{$possdom}) { + $disallow{$counter} = + &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]', + '"'.$possdom.'"', + $fname,$mname,$lname,$gen); + next; + } } my $username = $entries{$fields{'username'}}; my $userdomain = $entries{$fields{'domain'}}; @@ -4570,43 +4556,11 @@ sub upfile_drop_add { } } # determine user password - my $password; - my $passwdfromfile; + my $password = $genpwd; if (defined($fields{'ipwd'})) { if ($entries{$fields{'ipwd'}}) { $password=$entries{$fields{'ipwd'}}; - $passwdfromfile = 1; - if ($env{'form.login'} eq 'int') { - my $uhome=&Apache::lonnet::homeserver($username,$userdomain); - if (($uhome eq 'no_host') || ($changeauth)) { - my @brokepwdrules = - &Apache::loncommon::check_passwd_rules($domain,$password); - if (@brokepwdrules) { - $disallow{$counter} = &mt('[_1]: Password included in file for this user did not meet requirements.', - ''.$username.''); - map { $showpasswdrules{$_} = 1; } @brokepwdrules; - next; - } - } - } - } - } - unless ($passwdfromfile) { - if ($env{'form.login'} eq 'int') { - if (@genpwdfail) { - my $uhome=&Apache::lonnet::homeserver($username,$userdomain); - if (($uhome eq 'no_host') || ($changeauth)) { - $disallow{$counter} = &mt('[_1]: No specific password in file for this user; default password did not meet requirements', - ''.$username.''); - unless ($haspasswdmap) { - map { $showpasswdrules{$_} = 1; } @genpwdfail; - $haspasswdmap = 1; - } - } - next; - } } - $password = $genpwd; } # determine user role my $role = ''; @@ -4675,7 +4629,7 @@ sub upfile_drop_add { &mt('The user does not already exist, and you may not create a new user in a different domain.'); next; } else { - unless ($password || $env{'form.login'} eq 'loc') { + unless (($password ne '') || ($env{'form.login'} eq 'loc') || ($env{'form.login'} eq 'lti')) { $disallow{$counter} = &mt('[_1]: This is a new user but no default password was provided, and the authentication type requires one.', ''.$username.''); @@ -4878,16 +4832,6 @@ sub upfile_drop_add { my (%userres,%authres,%roleres,%idres); my $singlesec = ''; if ($role eq 'st') { - if (($context eq 'domain') && ($changeauth eq 'Yes') && (!$newuser)) { - if ((&Apache::lonnet::allowed('mau',$userdomain)) && - (&Apache::lonnet::homeserver($username,$userdomain) ne 'no_host')) { - if ((($amode =~ /^krb4|krb5|internal$/) && $password ne '') || - ($amode eq 'localauth')) { - $authresult = - &Apache::lonnet::modifyuserauth($userdomain,$username,$amode,$password); - } - } - } my $sec; if (ref($userinfo{$i}{'sections'}) eq 'ARRAY') { if (@secs > 0) { @@ -4929,16 +4873,16 @@ sub upfile_drop_add { } } } - } - if (!$multiple) { - ($userresult,$authresult,$roleresult,$idresult) = - &modifyuserrole($context,$setting, - $changeauth,$cid,$userdomain,$username, - $id,$amode,$password,$fname, - $mname,$lname,$gen,$singlesec, - $env{'form.forceid'},$desiredhost, - $email,$role,$enddate,$startdate, - $checkid,$inststatus,\%emptyok); + if (!$multiple) { + ($userresult,$authresult,$roleresult,$idresult) = + &modifyuserrole($context,$setting, + $changeauth,$cid,$userdomain,$username, + $id,$amode,$password,$fname, + $mname,$lname,$gen,$singlesec, + $env{'form.forceid'},$desiredhost, + $email,$role,$enddate,$startdate, + $checkid,$inststatus); + } } } if ($multiple) { @@ -4960,13 +4904,6 @@ sub upfile_drop_add { } # end of loop $r->print(''); &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - if (($context eq 'domain') && ($setting eq 'course')) { - unless ($oldcrsuserdoms) { - if (exists($env{'course.'.$cid.'.internal.userdomains'})) { - delete($env{'course.'.$cid.'.internal.userdomains'}); - } - } - } } # Flush the course logs so reverse user roles immediately updated $r->register_cleanup(\&Apache::lonnet::flushcourselogs); @@ -4986,7 +4923,6 @@ sub upfile_drop_add { $counts{'auth'})."\n"); } $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules)); - $r->print(&passwdrule_alerts($domain,\%showpasswdrules)); ##################################### # Display list of students to drop # ##################################### @@ -5056,42 +4992,6 @@ sub print_namespacing_alerts { } } -sub passwdrule_alerts { - my ($domain,$passwdrules) = @_; - my $warning; - if (ref($passwdrules) eq 'HASH') { - my %showrules = %{$passwdrules}; - if (keys(%showrules)) { - my %passwdconf = &Apache::lonnet::get_passwdconf($domain); - $warning = ''.&mt('Password requirement(s) unmet for one or more users:').'