version 1.195, 2019/04/29 22:19:24
|
version 1.204, 2019/09/11 14:20:38
|
Line 438 sub javascript_validations {
|
Line 438 sub javascript_validations {
|
} elsif ($context eq 'domain') { |
} elsif ($context eq 'domain') { |
$setsection_call = 'setCourse()'; |
$setsection_call = 'setCourse()'; |
$setsections_js = &dc_setcourse_js($param{'formname'},$mode, |
$setsections_js = &dc_setcourse_js($param{'formname'},$mode, |
$context,$showcredits); |
$context,$showcredits,$domain); |
} |
} |
$finish = " var checkSec = $setsection_call\n". |
$finish = " var checkSec = $setsection_call\n". |
" if (checkSec == 'ok') {\n". |
" if (checkSec == 'ok') {\n". |
Line 531 END
|
Line 531 END
|
/* regexp here to check for non \d \. in credits */ |
/* regexp here to check for non \d \. in credits */ |
END |
END |
} else { |
} else { |
|
my ($numrules,$intargjs) = |
|
&passwd_validation_js('vf.elements[current.argfield].value',$domain); |
$auth_checks .= (<<END); |
$auth_checks .= (<<END); |
foundatype=1; |
foundatype=1; |
if (current.argfield == null || current.argfield == '') { |
if (current.argfield == null || current.argfield == '') { |
|
// The login radiobutton checked does not have an associated textbox |
|
} else if (vf.elements[current.argfield].value == '') { |
var alertmsg = ''; |
var alertmsg = ''; |
switch (current.radiovalue) { |
switch (current.radiovalue) { |
case 'krb': |
case 'krb': |
alertmsg = '$alert{'krb'}'; |
alertmsg = '$alert{'krb'}'; |
break; |
break; |
case 'loc': |
case 'loc': |
case 'fsys': |
case 'int': |
alertmsg = '$alert{'ipass'}'; |
alertmsg = '$alert{'ipass'}'; |
break; |
break; |
case 'fsys': |
case 'fsys': |
alertmsg = ''; |
alertmsg = '$alert{'ipass'}'; |
break; |
break; |
case 'lti': |
case 'lti': |
default: |
default: |
Line 554 END
|
Line 558 END
|
alert(alertmsg); |
alert(alertmsg); |
return; |
return; |
} |
} |
|
} else if (current.radiovalue == 'int') { |
|
if ($numrules > 0) { |
|
$intargjs |
|
} |
} |
} |
END |
END |
} |
} |
Line 642 END
|
Line 650 END
|
$section_checks.$authheader; |
$section_checks.$authheader; |
return $result; |
return $result; |
} |
} |
|
|
|
sub passwd_validation_js { |
|
my ($currpasswdval,$domain) = @_; |
|
my %passwdconf = &Apache::lonnet::get_passwdconf($domain); |
|
my ($min,$max,@chars,$numrules,$intargjs,%alert); |
|
$numrules = 0; |
|
$min = $Apache::lonnet::passwdmin; |
|
if (ref($passwdconf{'chars'}) eq 'ARRAY') { |
|
if ($passwdconf{'min'} =~ /^\d+$/) { |
|
if ($passwdconf{'min'} > $min) { |
|
$min = $passwdconf{'min'}; |
|
} |
|
} |
|
if ($passwdconf{'max'} =~ /^\d+$/) { |
|
$max = $passwdconf{'max'}; |
|
$numrules ++; |
|
} |
|
@chars = @{$passwdconf{'chars'}}; |
|
if (@chars) { |
|
$numrules ++; |
|
} |
|
} |
|
if ($min > 0) { |
|
$numrules ++; |
|
} |
|
if (($min > 0) || ($max ne '') || (@chars > 0)) { |
|
my $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n'; |
|
if ($min) { |
|
$alert{'min'} = &mt('minimum [quant,_1,character]',$min).'\n'; |
|
} |
|
if ($max) { |
|
$alert{'max'} = &mt('maximum [quant,_1,character]',$max).'\n'; |
|
} |
|
my (@charalerts,@charrules); |
|
if (@chars) { |
|
if (grep(/^uc$/,@chars)) { |
|
push(@charalerts,&mt('contain at least one upper case letter')); |
|
push(@charrules,'uc'); |
|
} |
|
if (grep(/^lc$/,@chars)) { |
|
push(@charalerts,&mt('contain at least one lower case letter')); |
|
push(@charrules,'lc'); |
|
} |
|
if (grep(/^num$/,@chars)) { |
|
push(@charalerts,&mt('contain at least one number')); |
|
push(@charrules,'num'); |
|
} |
|
if (grep(/^spec$/,@chars)) { |
|
push(@charalerts,&mt('contain at least one non-alphanumeric')); |
|
push(@charrules,'spec'); |
|
} |
|
} |
|
$intargjs = qq| var rulesmsg = '';\n|. |
|
qq| var currpwval = $currpasswdval;\n|; |
|
if ($min) { |
|
$intargjs .= qq| |
|
if (currpwval.length < $min) { |
|
rulesmsg += ' - $alert{min}'; |
|
} |
|
|; |
|
} |
|
if ($max) { |
|
$intargjs .= qq| |
|
if (currpwval.length > $max) { |
|
rulesmsg += ' - $alert{max}'; |
|
} |
|
|; |
|
} |
|
if (@chars > 0) { |
|
my $charrulestr = '"'.join('","',@charrules).'"'; |
|
my $charalertstr = '"'.join('","',@charalerts).'"'; |
|
$intargjs .= qq| var brokerules = new Array();\n|. |
|
qq| var charrules = new Array($charrulestr);\n|. |
|
qq| var charalerts = new Array($charalertstr);\n|; |
|
my %rules; |
|
map { $rules{$_} = 1; } @chars; |
|
if ($rules{'uc'}) { |
|
$intargjs .= qq| |
|
var ucRegExp = /[A-Z]/; |
|
if (!ucRegExp.test(currpwval)) { |
|
brokerules.push('uc'); |
|
} |
|
|; |
|
} |
|
if ($rules{'lc'}) { |
|
$intargjs .= qq| |
|
var lcRegExp = /[a-z]/; |
|
if (!lcRegExp.test(currpwval)) { |
|
brokerules.push('lc'); |
|
} |
|
|; |
|
} |
|
if ($rules{'num'}) { |
|
$intargjs .= qq| |
|
var numRegExp = /[0-9]/; |
|
if (!numRegExp.test(currpwval)) { |
|
brokerules.push('num'); |
|
} |
|
|; |
|
} |
|
if ($rules{'spec'}) { |
|
$intargjs .= q| |
|
var specRegExp = /[!"#$%&'()*+,\-.\/:;<=>?@[\\^\]_`{\|}~]/; |
|
if (!specRegExp.test(currpwval)) { |
|
brokerules.push('spec'); |
|
} |
|
|; |
|
} |
|
$intargjs .= qq| |
|
if (brokerules.length > 0) { |
|
for (var i=0; i<brokerules.length; i++) { |
|
for (var j=0; j<charrules.length; j++) { |
|
if (brokerules[i] == charrules[j]) { |
|
rulesmsg += ' - '+charalerts[j]+'\\n'; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
|; |
|
} |
|
$intargjs .= qq| |
|
if (rulesmsg != '') { |
|
rulesmsg = '$alertmsg'+rulesmsg; |
|
alert(rulesmsg); |
|
return false; |
|
} |
|
|; |
|
} |
|
return ($numrules,$intargjs); |
|
} |
|
|
############################################################### |
############################################################### |
############################################################### |
############################################################### |
sub upload_manager_javascript_forward_associate { |
sub upload_manager_javascript_forward_associate { |
Line 2295 sub build_user_record {
|
Line 2435 sub build_user_record {
|
|
|
sub courses_selector { |
sub courses_selector { |
my ($cdom,$formname) = @_; |
my ($cdom,$formname) = @_; |
my %coursecodes = (); |
|
my %codes = (); |
my %codes = (); |
my @codetitles = (); |
my @codetitles = (); |
my %cat_titles = (); |
my %cat_titles = (); |
Line 2308 sub courses_selector {
|
Line 2447 sub courses_selector {
|
my $jscript = ''; |
my $jscript = ''; |
|
|
my $totcodes = 0; |
my $totcodes = 0; |
$totcodes = |
my $instcats = &Apache::lonnet::get_dom_instcats($cdom); |
&Apache::courseclassifier::retrieve_instcodes(\%coursecodes, |
if (ref($instcats) eq 'HASH') { |
$cdom,$totcodes); |
if ((ref($instcats->{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') && |
if ($totcodes > 0) { |
(ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) { |
$format_reply = |
%codes = %{$instcats->{'codes'}}; |
&Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes, |
@codetitles = @{$instcats->{'codetitles'}}; |
\%codes,\@codetitles,\%cat_titles,\%cat_order); |
%cat_titles = %{$instcats->{'cat_titles'}}; |
if ($format_reply eq 'ok') { |
%cat_order = %{$instcats->{'cat_order'}}; |
|
$totcodes = scalar(keys(%codes)); |
my $numtypes = @codetitles; |
my $numtypes = @codetitles; |
&Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); |
&Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); |
my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles); |
my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles); |
Line 4113 sub print_first_users_upload_form {
|
Line 4253 sub print_first_users_upload_form {
|
.&Apache::lonhtmlcommon::end_pick_box(); |
.&Apache::lonhtmlcommon::end_pick_box(); |
|
|
$str .= '<p>' |
$str .= '<p>' |
.'<input type="submit" name="fileupload" value="'.&mt('Next').'"' |
.'<input type="button" name="fileupload" value="'.&mt('Next').'"' |
.' onclick="javascript:checkUpload(this.form);" />' |
.' onclick="javascript:checkUpload(this.form);" />' |
.'</p>'; |
.'</p>'; |
|
|
Line 4239 sub upfile_drop_add {
|
Line 4379 sub upfile_drop_add {
|
} |
} |
my $amode = ''; |
my $amode = ''; |
my $genpwd = ''; |
my $genpwd = ''; |
|
my @genpwdfail; |
if ($env{'form.login'} eq 'krb') { |
if ($env{'form.login'} eq 'krb') { |
$amode='krb'; |
$amode='krb'; |
$amode.=$env{'form.krbver'}; |
$amode.=$env{'form.krbver'}; |
Line 4247 sub upfile_drop_add {
|
Line 4388 sub upfile_drop_add {
|
$amode='internal'; |
$amode='internal'; |
if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) { |
if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) { |
$genpwd=$env{'form.intarg'}; |
$genpwd=$env{'form.intarg'}; |
|
@genpwdfail = |
|
&Apache::loncommon::check_passwd_rules($domain,$genpwd); |
} |
} |
} elsif ($env{'form.login'} eq 'loc') { |
} elsif ($env{'form.login'} eq 'loc') { |
$amode='localauth'; |
$amode='localauth'; |
Line 4327 sub upfile_drop_add {
|
Line 4470 sub upfile_drop_add {
|
\@statuses,\@poss_roles); |
\@statuses,\@poss_roles); |
&gather_userinfo($context,'view',\%userlist,$indexhash,\%info, |
&gather_userinfo($context,'view',\%userlist,$indexhash,\%info, |
\%cstr_roles,$permission); |
\%cstr_roles,$permission); |
|
|
} |
} |
} |
} |
} |
} |
Line 4405 sub upfile_drop_add {
|
Line 4547 sub upfile_drop_add {
|
my $newuserdom = $env{'request.role.domain'}; |
my $newuserdom = $env{'request.role.domain'}; |
map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes); |
map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes); |
# Get new users list |
# Get new users list |
my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname); |
my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname, |
|
%showpasswdrules,$haspasswdmap); |
my $counter = -1; |
my $counter = -1; |
my (%willtrust,%trustchecked); |
my (%willtrust,%trustchecked); |
foreach my $line (@userdata) { |
foreach my $line (@userdata) { |
Line 4556 sub upfile_drop_add {
|
Line 4699 sub upfile_drop_add {
|
} |
} |
} |
} |
# determine user password |
# determine user password |
my $password = $genpwd; |
my $password; |
|
my $passwdfromfile; |
if (defined($fields{'ipwd'})) { |
if (defined($fields{'ipwd'})) { |
if ($entries{$fields{'ipwd'}}) { |
if ($entries{$fields{'ipwd'}}) { |
$password=$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.', |
|
'<b>'.$username.'</b>'); |
|
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', |
|
'<b>'.$username.'</b>'); |
|
unless ($haspasswdmap) { |
|
map { $showpasswdrules{$_} = 1; } @genpwdfail; |
|
$haspasswdmap = 1; |
|
} |
|
} |
|
next; |
|
} |
|
} |
|
$password = $genpwd; |
|
} |
# determine user role |
# determine user role |
my $role = ''; |
my $role = ''; |
if (defined($fields{'role'})) { |
if (defined($fields{'role'})) { |
Line 4873 sub upfile_drop_add {
|
Line 5048 sub upfile_drop_add {
|
} |
} |
} |
} |
} |
} |
if (!$multiple) { |
} |
($userresult,$authresult,$roleresult,$idresult) = |
if (!$multiple) { |
&modifyuserrole($context,$setting, |
($userresult,$authresult,$roleresult,$idresult) = |
$changeauth,$cid,$userdomain,$username, |
&modifyuserrole($context,$setting, |
$id,$amode,$password,$fname, |
$changeauth,$cid,$userdomain,$username, |
$mname,$lname,$gen,$singlesec, |
$id,$amode,$password,$fname, |
$env{'form.forceid'},$desiredhost, |
$mname,$lname,$gen,$singlesec, |
$email,$role,$enddate,$startdate, |
$env{'form.forceid'},$desiredhost, |
$checkid,$inststatus); |
$email,$role,$enddate,$startdate, |
} |
$checkid,$inststatus); |
} |
} |
} |
} |
if ($multiple) { |
if ($multiple) { |
Line 4923 sub upfile_drop_add {
|
Line 5098 sub upfile_drop_add {
|
$counts{'auth'})."</p>\n"); |
$counts{'auth'})."</p>\n"); |
} |
} |
$r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules)); |
$r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules)); |
|
$r->print(&passwdrule_alerts($domain,\%showpasswdrules)); |
##################################### |
##################################### |
# Display list of students to drop # |
# Display list of students to drop # |
##################################### |
##################################### |
Line 4992 sub print_namespacing_alerts {
|
Line 5168 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 = '<b>'.&mt('Password requirement(s) unmet for one or more users:').'</b><ul>'; |
|
if ($showrules{'min'}) { |
|
$warning .= '<li>'.&mt('minimum [quant,_1,character]',$passwdconf{'min'}).'</li>'; |
|
} |
|
if ($showrules{'max'}) { |
|
$warning .= '<li>'.&mt('maximum [quant,_1,character]',$passwdconf{'max'}).'</li>'; |
|
} |
|
if ($showrules{'uc'}) { |
|
$warning .= '<li>'.&mt('contain at least one upper case letter').'</li>'; |
|
} |
|
if ($showrules{'lc'}) { |
|
$warning .= '<li>'.&mt('contain at least one lower case letter').'</li>'; |
|
} |
|
if ($showrules{'num'}) { |
|
$warning .= '<li>'.&mt('contain at least one number').'</li>'; |
|
} |
|
if ($showrules{'spec'}) { |
|
$warning .= '<li>'.&mt('contain at least one non-alphanumeric').'</li>'; |
|
} |
|
$warning .= '</ul>'; |
|
} |
|
} |
|
return $warning; |
|
} |
|
|
sub user_change_result { |
sub user_change_result { |
my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc, |
my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc, |
$username,$userdomain,$userchg) = @_; |
$username,$userdomain,$userchg) = @_; |
Line 5876 sub can_change_internalpass {
|
Line 6084 sub can_change_internalpass {
|
unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) { |
unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) { |
my ($cnum,$cdom) = &get_course_identity(); |
my ($cnum,$cdom) = &get_course_identity(); |
if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) { |
if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) { |
my $noupdate; |
my @userstatuses = ('default'); |
|
my %userenv = &Apache::lonnet::userenvironment($udom,$uname,'inststatus'); |
|
if ($userenv{'inststatus'} ne '') { |
|
@userstatuses = split(/:/,$userenv{'inststatus'}); |
|
} |
|
my $noupdate = 1; |
|
my %passwdconf = &Apache::lonnet::get_passwdconf($cdom); |
|
if (ref($passwdconf{'crsownerchg'}) eq 'HASH') { |
|
if (ref($passwdconf{'crsownerchg'}{'for'}) eq 'ARRAY') { |
|
foreach my $status (@userstatuses) { |
|
if (grep(/^\Q$status\E$/,@{$passwdconf{'crsownerchg'}{'for'}})) { |
|
undef($noupdate); |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
if ($noupdate) { |
|
return; |
|
} |
my %owned = &Apache::lonnet::courseiddump($cdom,'.',1,'.', |
my %owned = &Apache::lonnet::courseiddump($cdom,'.',1,'.', |
$env{'user.name'}.':'.$env{'user.domain'}, |
$env{'user.name'}.':'.$env{'user.domain'}, |
undef,undef,undef,'.'); |
undef,undef,undef,'.'); |
Line 6129 sub get_course_identity {
|
Line 6356 sub get_course_identity {
|
} |
} |
|
|
sub dc_setcourse_js { |
sub dc_setcourse_js { |
my ($formname,$mode,$context,$showcredits) = @_; |
my ($formname,$mode,$context,$showcredits,$domain) = @_; |
my ($dc_setcourse_code,$authen_check); |
my ($dc_setcourse_code,$authen_check); |
my $cctext = &Apache::lonnet::plaintext('cc'); |
my $cctext = &Apache::lonnet::plaintext('cc'); |
my $cotext = &Apache::lonnet::plaintext('co'); |
my $cotext = &Apache::lonnet::plaintext('co'); |
Line 6138 sub dc_setcourse_js {
|
Line 6365 sub dc_setcourse_js {
|
if ($mode eq 'upload') { |
if ($mode eq 'upload') { |
$role = 'courserole'; |
$role = 'courserole'; |
} else { |
} else { |
$authen_check = &verify_authen($formname,$context); |
$authen_check = &verify_authen($formname,$context,$domain); |
} |
} |
$dc_setcourse_code = (<<"SCRIPTTOP"); |
$dc_setcourse_code = (<<"SCRIPTTOP"); |
$authen_check |
$authen_check |
Line 6282 ENDSCRIPT
|
Line 6509 ENDSCRIPT
|
} |
} |
|
|
sub verify_authen { |
sub verify_authen { |
my ($formname,$context) = @_; |
my ($formname,$context,$domain) = @_; |
my %alerts = &authcheck_alerts(); |
my %alerts = &authcheck_alerts(); |
my $finish = "return 'ok';"; |
my $finish = "return 'ok';"; |
if ($context eq 'author') { |
if ($context eq 'author') { |
$finish = "document.$formname.submit();"; |
$finish = "document.$formname.submit();"; |
} |
} |
|
my ($numrules,$intargjs) = |
|
&passwd_validation_js('argpicked',$domain); |
my $outcome = <<"ENDSCRIPT"; |
my $outcome = <<"ENDSCRIPT"; |
|
|
function auth_check() { |
function auth_check() { |
Line 6321 function auth_check() {
|
Line 6550 function auth_check() {
|
break; |
break; |
case 'int': |
case 'int': |
alertmsg = '$alerts{'ipass'}'; |
alertmsg = '$alerts{'ipass'}'; |
|
break; |
case 'fsys': |
case 'fsys': |
alertmsg = '$alerts{'ipass'}'; |
alertmsg = '$alerts{'ipass'}'; |
break; |
break; |
Line 6334 function auth_check() {
|
Line 6564 function auth_check() {
|
alert(alertmsg); |
alert(alertmsg); |
return; |
return; |
} |
} |
|
} else if (logintype == 'int') { |
|
var numrules = $numrules; |
|
if (numrules > 0) { |
|
$intargjs |
|
} |
} |
} |
$finish |
$finish |
} |
} |