--- loncom/interface/lonuserutils.pm 2010/09/20 00:21:08 1.125 +++ loncom/interface/lonuserutils.pm 2011/01/05 18:42:53 1.134 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.125 2010/09/20 00:21:08 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.134 2011/01/05 18:42:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,7 +47,8 @@ sub modifystudent { # this one. If $csec is defined, drop them from all other sections of # this course and add them to section $csec my ($cnum,$cdom) = &get_course_identity($courseid); - my %roles = &Apache::lonnet::dump('roles',$udom,$unam); + my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); + my %roles = &Apache::lonnet::dump('roles',$udom,$unam,'.',undef,$extra); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i); @@ -533,6 +534,7 @@ END if (message!='') { message+='\\n'; } + message+='$alert{'section'}'; } if (foundemail==0) { if (message!='') { @@ -587,28 +589,43 @@ END ############################################################### sub upload_manager_javascript_forward_associate { my ($can_assign) = @_; - my $auth_update; + my ($auth_update,$numbuttons,$argreset); if (ref($can_assign) eq 'HASH') { - if (keys(%{$can_assign}) > 1) { + if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) { + $argreset .= " vf.krbarg.value='';\n"; + $numbuttons ++ ; + } + if ($can_assign->{'int'}) { + $argreset .= " vf.intarg.value='';\n"; + $numbuttons ++; + } + if ($can_assign->{'loc'}) { + $argreset .= " vf.locarg.value='';\n"; + $numbuttons ++; + } + if (!$can_assign->{'int'}) { + my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.\n'). + &mt('Your current role does not have rights to create users with that authentication type.'); + $auth_update = <<"END"; + // Currently the initial password field is only supported for internal auth + // (see bug 6368). + if (nw==9) { + eval('vf.f'+tf+'.selectedIndex=0;') + alert('$warning'); + } +END + } elsif ($numbuttons > 1) { $auth_update = <<"END"; // If we set the password, make the password form below correspond to // the new value. if (nw==9) { changed_radio('int',document.studentform); set_auth_radio_buttons('int',document.studentform); +$argreset + } + END } - if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) { - $auth_update .= " vf.krbarg.value='';\n"; - } - if ($can_assign->{'int'}) { - $auth_update .= " vf.intarg.value='';\n"; - } - if ($can_assign->{'loc'}) { - $auth_update .= " vf.locarg.value='';\n"; - } - $auth_update .= " - }\n"; } return(<<ENDPICK); @@ -706,28 +723,44 @@ ENDPICK ############################################################### sub upload_manager_javascript_reverse_associate { my ($can_assign) = @_; - my $auth_update; + my ($auth_update,$numbuttons,$argreset); if (ref($can_assign) eq 'HASH') { - if (keys(%{$can_assign}) > 1) { + if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) { + $argreset .= " vf.krbarg.value='';\n"; + $numbuttons ++ ; + } + if ($can_assign->{'int'}) { + $argreset .= " vf.intarg.value='';\n"; + $numbuttons ++; + } + if ($can_assign->{'loc'}) { + $argreset .= " vf.locarg.value='';\n"; + $numbuttons ++; + } + if (!$can_assign->{'int'}) { + my $warning = &mt('You may not specify an initial password, as this is only available when new users use LON-CAPA internal authentication.\n'). + &mt('Your current role does not have rights to create users with that authentication type.'); + $auth_update = <<"END"; + // Currently the initial password field is only supported for internal auth + // (see bug 6368). + if (tf==8 && nw!=0) { + eval('vf.f'+tf+'.selectedIndex=0;') + alert('$warning'); + } +END + } elsif ($numbuttons > 1) { $auth_update = <<"END"; // initial password specified, pick internal authentication if (tf==8 && nw!=0) { changed_radio('int',document.studentform); set_auth_radio_buttons('int',document.studentform); +$argreset + } + END } - if ($can_assign->{'krb'}) { - $auth_update .= " vf.krbarg.value='';\n"; - } - if ($can_assign->{'int'}) { - $auth_update .= " vf.intarg.value='';\n"; - } - if ($can_assign->{'loc'}) { - $auth_update .= " vf.locarg.value='';\n"; - } - $auth_update .= " - }\n"; } + return(<<ENDPICK); function verify(vf,sec_caller) { var founduname=0; @@ -735,6 +768,7 @@ function verify(vf,sec_caller) { var foundname=0; var foundid=0; var foundsec=0; + var foundemail=0; var foundrole=0; var founddomain=0; var foundinststatus=0; @@ -746,11 +780,12 @@ function verify(vf,sec_caller) { if (i==6 && tw!=0) { foundid=1; } if (i==7 && tw!=0) { foundsec=1; } if (i==8 && tw!=0) { foundpwd=1; } - if (i==9 && tw!=0) { foundrole=1; } - if (i==10 && tw!=0) { founddomain=1; } - if (i==13 && tw!=0) { foundinstatus=1; } + if (i==9 && tw!=0) { foundemail=1; } + if (i==10 && tw!=0) { foundrole=1; } + if (i==11 && tw!=0) { founddomain=1; } + if (i==12 && tw!=0) { foundinstatus=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain,foundinststatus); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); } function flip(vf,tf) { @@ -3971,6 +4006,7 @@ sub upfile_drop_add { my @secs; my %entries=&Apache::loncommon::record_sep($line); # Determine user name + $entries{$fields{'username'}} =~ s/^\s+|\s+$//g; unless (($entries{$fields{'username'}} eq '') || (!defined($entries{$fields{'username'}}))) { my ($fname, $mname, $lname,$gen) = ('','','',''); @@ -3991,13 +4027,20 @@ sub upfile_drop_add { $gen=$entries{$fields{'gen'}}; } } + if ($entries{$fields{'username'}} ne &LONCAPA::clean_username($entries{$fields{'username'}})) { + my $nowhitespace; + if ($entries{$fields{'username'}} =~ /\s/) { + $nowhitespace = ' - '.&mt('usernames may not contain spaces.'); + } $r->print('<br />'. &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', - '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen)); + '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen). + $nowhitespace); next; } else { + $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g; if ($entries{$fields{'domain'}} ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}. @@ -4056,6 +4099,7 @@ sub upfile_drop_add { # determine email address my $email=''; if (defined($fields{'email'})) { + $entries{$fields{'email'}} =~ s/^\s+|\s+$//g; if (defined($entries{$fields{'email'}})) { $email=$entries{$fields{'email'}}; unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } @@ -4102,7 +4146,7 @@ sub upfile_drop_add { $role = $defaultrole; } # Clean up whitespace - foreach (\$id,\$fname,\$mname,\$lname,\$gen) { + foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) { $$_ =~ s/(\s+$|^\s+)//g; } # check against rules @@ -4146,7 +4190,7 @@ sub upfile_drop_add { unless ($cancreate{$usertype}) { my $showtype = $longtypes{$usertype}; $r->print('<br />'. - &mt("[_1]: The user does not exist, and you are not permitted to create users of type: $showtype.",'<b>'.$username.'</b>')); + &mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype)); next; } } else { @@ -4299,7 +4343,7 @@ sub upfile_drop_add { } } # end of foreach (@userdata) # Flush the course logs so reverse user roles immediately updated - $r->register_cleanup(\&Apache::lonnet::flushcourselogs()); + $r->register_cleanup(\&Apache::lonnet::flushcourselogs); $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}). "</p>\n"); if ($counts{'role'} > 0) { @@ -4791,7 +4835,7 @@ sub update_user_list { $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); } # Flush the course logs so reverse user roles immediately updated - &Apache::lonnet::flushcourselogs(); + $r->register_cleanup(\&Apache::lonnet::flushcourselogs); } if ($env{'form.makedatesdefault'}) { if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') { @@ -5227,18 +5271,40 @@ sub can_modify_userinfo { } sub check_usertype { - my ($dom,$uname,$rules) = @_; + my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_; my $usertype; - if (ref($rules) eq 'HASH') { - my @user_rules = keys(%{$rules}); - if (@user_rules > 0) { - my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules); - if (keys(%rule_check) > 0) { - $usertype = 'unofficial'; - foreach my $item (keys(%rule_check)) { - if ($rule_check{$item}) { - $usertype = 'official'; - last; + if ((ref($got_rules) eq 'HASH') && (ref($curr_rules) eq 'HASH')) { + if (!$got_rules->{$dom}) { + my %domconfig = &Apache::lonnet::get_dom('configuration', + ['usercreation'],$dom); + if (ref($domconfig{'usercreation'}) eq 'HASH') { + foreach my $item ('username','id') { + if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { + $curr_rules->{$dom}{$item} = + $domconfig{'usercreation'}{$item.'_rule'}; + } + } + } + $got_rules->{$dom} = 1; + } + if (ref($rules) eq 'HASH') { + my @user_rules; + if (ref($curr_rules->{$dom}{'username'}) eq 'ARRAY') { + foreach my $rule (keys(%{$rules})) { + if (grep(/^\Q$rule\E/,@{$curr_rules->{$dom}{'username'}})) { + push(@user_rules,$rule); + } + } + } + if (@user_rules > 0) { + my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules); + if (keys(%rule_check) > 0) { + $usertype = 'unofficial'; + foreach my $item (keys(%rule_check)) { + if ($rule_check{$item}) { + $usertype = 'official'; + last; + } } } }