version 1.1056.2.9, 2010/11/11 20:56:04
|
version 1.1056.4.11, 2010/10/01 14:26:07
|
Line 76 use HTTP::Date;
|
Line 76 use HTTP::Date;
|
use Image::Magick; |
use Image::Magick; |
|
|
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
$_64bit %env %protocol); |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease); |
|
|
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
Line 196 sub get_server_timezone {
|
Line 196 sub get_server_timezone {
|
} |
} |
|
|
sub get_server_loncaparev { |
sub get_server_loncaparev { |
my ($dom,$lonhost) = @_; |
my ($dom,$lonhost,$ignore_cache,$caller) = @_; |
if (defined($lonhost)) { |
if (defined($lonhost)) { |
if (!defined(&hostname($lonhost))) { |
if (!defined(&hostname($lonhost))) { |
undef($lonhost); |
undef($lonhost); |
Line 211 sub get_server_loncaparev {
|
Line 211 sub get_server_loncaparev {
|
} |
} |
} |
} |
if (defined($lonhost)) { |
if (defined($lonhost)) { |
my $cachetime = 24*3600; |
my $cachetime = 12*3600; |
my ($loncaparev,$cached)=&is_cached_new('serverloncaparev',$lonhost); |
if (!$ignore_cache) { |
|
my ($loncaparev,$cached)=&is_cached_new('serverloncaparev',$lonhost); |
|
if (defined($cached)) { |
|
return $loncaparev; |
|
} |
|
} |
|
my ($answer,$loncaparev); |
|
my @ids=¤t_machine_ids(); |
|
if (grep(/^\Q$lonhost\E$/,@ids)) { |
|
$answer = $perlvar{'lonVersion'}; |
|
if ($answer =~ /^[\'\"]?([\w.\-]+)[\'\"]?$/) { |
|
$loncaparev = $1; |
|
} |
|
} else { |
|
$answer = &reply('serverloncaparev',$lonhost); |
|
if (($answer eq 'unknown_cmd') || ($answer eq 'con_lost')) { |
|
if ($caller eq 'loncron') { |
|
my $ua=new LWP::UserAgent; |
|
$ua->timeout(4); |
|
my $protocol = $protocol{$lonhost}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my $url = $protocol.'://'.&hostname($lonhost).'/adm/about.html'; |
|
my $request=new HTTP::Request('GET',$url); |
|
my $response=$ua->request($request); |
|
unless ($response->is_error()) { |
|
my $content = $response->content; |
|
if ($content =~ /<p>VERSION\:\s*([\w.\-]+)<\/p>/) { |
|
$loncaparev = $1; |
|
} |
|
} |
|
} else { |
|
$loncaparev = $loncaparevs{$lonhost}; |
|
} |
|
} elsif ($answer =~ /^[\'\"]?([\w.\-]+)[\'\"]?$/) { |
|
$loncaparev = $1; |
|
} |
|
} |
|
return &do_cache_new('serverloncaparev',$lonhost,$loncaparev,$cachetime); |
|
} |
|
} |
|
|
|
sub get_server_homeID { |
|
my ($hostname,$ignore_cache,$caller) = @_; |
|
unless ($ignore_cache) { |
|
my ($serverhomeID,$cached)=&is_cached_new('serverhomeID',$hostname); |
if (defined($cached)) { |
if (defined($cached)) { |
return $loncaparev; |
return $serverhomeID; |
} else { |
} |
my $loncaparev = &reply('serverloncaparev',$lonhost); |
} |
return &do_cache_new('serverloncaparev',$lonhost,$loncaparev,$cachetime); |
my $cachetime = 12*3600; |
|
my $serverhomeID; |
|
if ($caller eq 'loncron') { |
|
my @machine_ids = &machine_ids($hostname); |
|
foreach my $id (@machine_ids) { |
|
my $response = &reply('serverhomeID',$id); |
|
unless (($response eq 'unknown_cmd') || ($response eq 'con_lost')) { |
|
$serverhomeID = $response; |
|
last; |
|
} |
|
} |
|
if ($serverhomeID eq '') { |
|
$serverhomeID = $machine_ids[-1]; |
} |
} |
|
} else { |
|
$serverhomeID = $serverhomeIDs{$hostname}; |
} |
} |
|
return &do_cache_new('serverhomeID',$hostname,$serverhomeID,$cachetime); |
} |
} |
|
|
# -------------------------------------------------- Non-critical communication |
# -------------------------------------------------- Non-critical communication |
Line 697 sub spareserver {
|
Line 756 sub spareserver {
|
if ($userloadpercent !~ /\d/) { $userloadpercent=0; } |
if ($userloadpercent !~ /\d/) { $userloadpercent=0; } |
my $lowest_load=($loadpercent > $userloadpercent) ? $loadpercent |
my $lowest_load=($loadpercent > $userloadpercent) ? $loadpercent |
: $userloadpercent; |
: $userloadpercent; |
|
my ($uint_dom,$remotesessions); |
|
if ($env{'user.domain'}) { |
|
my $uprimary_id = &Apache::lonnet::domain($env{'user.domain'},'primary'); |
|
$uint_dom = &Apache::lonnet::internet_dom($uprimary_id); |
|
my %udomdefaults = &Apache::lonnet::get_domain_defaults($env{'user.domain'}); |
|
$remotesessions = $udomdefaults{'remotesessions'}; |
|
} |
foreach my $try_server (@{ $spareid{'primary'} }) { |
foreach my $try_server (@{ $spareid{'primary'} }) { |
|
if ($uint_dom) { |
|
next unless (&spare_can_host($env{'user.domain'},$uint_dom, |
|
$remotesessions,$try_server)); |
|
} |
($spare_server, $lowest_load) = |
($spare_server, $lowest_load) = |
&compare_server_load($try_server, $spare_server, $lowest_load); |
&compare_server_load($try_server, $spare_server, $lowest_load); |
} |
} |
Line 707 sub spareserver {
|
Line 776 sub spareserver {
|
|
|
if (!$found_server) { |
if (!$found_server) { |
foreach my $try_server (@{ $spareid{'default'} }) { |
foreach my $try_server (@{ $spareid{'default'} }) { |
|
if ($uint_dom) { |
|
next unless (&spare_can_host($env{'user.domain'},$uint_dom, |
|
$remotesessions,$try_server)); |
|
} |
($spare_server, $lowest_load) = |
($spare_server, $lowest_load) = |
&compare_server_load($try_server, $spare_server, $lowest_load); |
&compare_server_load($try_server, $spare_server, $lowest_load); |
} |
} |
Line 719 sub spareserver {
|
Line 792 sub spareserver {
|
} |
} |
if (defined($spare_server)) { |
if (defined($spare_server)) { |
my $hostname = &hostname($spare_server); |
my $hostname = &hostname($spare_server); |
if (defined($hostname)) { |
if (defined($hostname)) { |
$spare_server = $protocol.'://'.$hostname; |
$spare_server = $protocol.'://'.$hostname; |
} |
} |
} |
} |
Line 734 sub compare_server_load {
|
Line 807 sub compare_server_load {
|
my $userloadans = &reply('userload',$try_server); |
my $userloadans = &reply('userload',$try_server); |
|
|
if ($loadans !~ /\d/ && $userloadans !~ /\d/) { |
if ($loadans !~ /\d/ && $userloadans !~ /\d/) { |
next; #didn't get a number from the server |
return; #didn't get a number from the server |
} |
} |
|
|
my $load; |
my $load; |
Line 777 sub has_user_session {
|
Line 850 sub has_user_session {
|
return 0; |
return 0; |
} |
} |
|
|
|
# --------- determine least loaded server in a user's domain which allows login |
|
|
|
sub choose_server { |
|
my ($udom) = @_; |
|
my %domconfhash = &Apache::loncommon::get_domainconf($udom); |
|
my %servers = &get_servers($udom); |
|
my $lowest_load = 30000; |
|
my ($login_host,$hostname); |
|
foreach my $lonhost (keys(%servers)) { |
|
my $loginvia = $domconfhash{$udom.'.login.loginvia_'.$lonhost}; |
|
if ($loginvia eq '') { |
|
($login_host, $lowest_load) = |
|
&compare_server_load($lonhost, $login_host, $lowest_load); |
|
} |
|
} |
|
if ($login_host ne '') { |
|
$hostname = $servers{$login_host}; |
|
} |
|
return ($login_host,$hostname); |
|
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
|
|
sub changepass { |
sub changepass { |
Line 835 sub queryauthenticate {
|
Line 929 sub queryauthenticate {
|
# --------- Try to authenticate user from domain's lib servers (first this one) |
# --------- Try to authenticate user from domain's lib servers (first this one) |
|
|
sub authenticate { |
sub authenticate { |
my ($uname,$upass,$udom,$checkdefauth)=@_; |
my ($uname,$upass,$udom,$checkdefauth,$clientcancheckhost)=@_; |
$upass=&escape($upass); |
$upass=&escape($upass); |
$uname= &LONCAPA::clean_username($uname); |
$uname= &LONCAPA::clean_username($uname); |
my $uhome=&homeserver($uname,$udom,1); |
my $uhome=&homeserver($uname,$udom,1); |
Line 858 sub authenticate {
|
Line 952 sub authenticate {
|
return 'no_host'; |
return 'no_host'; |
} |
} |
} |
} |
my $answer=reply("encrypt:auth:$udom:$uname:$upass:$checkdefauth",$uhome); |
my $answer=reply("encrypt:auth:$udom:$uname:$upass:$checkdefauth:$clientcancheckhost",$uhome); |
if ($answer eq 'authorized') { |
if ($answer eq 'authorized') { |
if ($newhome) { |
if ($newhome) { |
&logthis("User $uname at $udom authorized by $uhome, but needs account"); |
&logthis("User $uname at $udom authorized by $uhome, but needs account"); |
Line 876 sub authenticate {
|
Line 970 sub authenticate {
|
return 'no_host'; |
return 'no_host'; |
} |
} |
|
|
|
sub can_host_session { |
|
my ($udom,$lonhost,$remoterev,$remotesessions,$hostedsessions) = @_; |
|
my $canhost = 1; |
|
my $host_idn = &Apache::lonnet::internet_dom($lonhost); |
|
if (ref($remotesessions) eq 'HASH') { |
|
if (ref($remotesessions->{'excludedomain'}) eq 'ARRAY') { |
|
if (grep(/^\Q$host_idn\E$/,@{$remotesessions->{'excludedomain'}})) { |
|
$canhost = 0; |
|
} else { |
|
$canhost = 1; |
|
} |
|
} |
|
if (ref($remotesessions->{'includedomain'}) eq 'ARRAY') { |
|
if (grep(/^\Q$host_idn\E$/,@{$remotesessions->{'includedomain'}})) { |
|
$canhost = 1; |
|
} else { |
|
$canhost = 0; |
|
} |
|
} |
|
if ($canhost) { |
|
if ($remotesessions->{'version'} ne '') { |
|
my ($reqmajor,$reqminor) = ($remotesessions->{'version'} =~ /^(\d+)\.(\d+)$/); |
|
if ($reqmajor ne '' && $reqminor ne '') { |
|
if ($remoterev =~ /^\'?(\d+)\.(\d+)/) { |
|
my $major = $1; |
|
my $minor = $2; |
|
if (($major < $reqmajor ) || |
|
(($major == $reqmajor) && ($minor < $reqminor))) { |
|
$canhost = 0; |
|
} |
|
} else { |
|
$canhost = 0; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($canhost) { |
|
if (ref($hostedsessions) eq 'HASH') { |
|
if (ref($hostedsessions->{'excludedomain'}) eq 'ARRAY') { |
|
if (grep(/^\Q$udom\E$/,@{$hostedsessions->{'excludedomain'}})) { |
|
$canhost = 0; |
|
} else { |
|
$canhost = 1; |
|
} |
|
} |
|
if (ref($hostedsessions->{'includedomain'}) eq 'ARRAY') { |
|
if (grep(/^\Q$udom\E$/,@{$hostedsessions->{'includedomain'}})) { |
|
$canhost = 1; |
|
} else { |
|
$canhost = 0; |
|
} |
|
} |
|
} |
|
} |
|
return $canhost; |
|
} |
|
|
|
sub spare_can_host { |
|
my ($udom,$uint_dom,$remotesessions,$try_server)=@_; |
|
my $canhost=1; |
|
my @intdoms; |
|
my $internet_names = &Apache::lonnet::get_internet_names($try_server); |
|
if (ref($internet_names) eq 'ARRAY') { |
|
@intdoms = @{$internet_names}; |
|
} |
|
unless (grep(/^\Q$uint_dom\E$/,@intdoms)) { |
|
my $serverhomeID = &Apache::lonnet::get_server_homeID($try_server); |
|
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
|
my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom); |
|
my $remoterev = &Apache::lonnet::get_server_loncaparev(undef,$try_server); |
|
$canhost = &can_host_session($udom,$try_server,$remoterev, |
|
$remotesessions, |
|
$defdomdefaults{'hostedsessions'}); |
|
} |
|
return $canhost; |
|
} |
|
|
# ---------------------- Find the homebase for a user from domain's lib servers |
# ---------------------- Find the homebase for a user from domain's lib servers |
|
|
my %homecache; |
my %homecache; |
Line 1352 sub get_domain_defaults {
|
Line 1524 sub get_domain_defaults {
|
my %domconfig = |
my %domconfig = |
&Apache::lonnet::get_dom('configuration',['defaults','quotas', |
&Apache::lonnet::get_dom('configuration',['defaults','quotas', |
'requestcourses','inststatus', |
'requestcourses','inststatus', |
'coursedefaults'],$domain); |
'coursedefaults','usersessions'],$domain); |
if (ref($domconfig{'defaults'}) eq 'HASH') { |
if (ref($domconfig{'defaults'}) eq 'HASH') { |
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'}; |
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'}; |
$domdefaults{'auth_def'} = $domconfig{'defaults'}{'auth_def'}; |
$domdefaults{'auth_def'} = $domconfig{'defaults'}{'auth_def'}; |
Line 1392 sub get_domain_defaults {
|
Line 1564 sub get_domain_defaults {
|
$domdefaults{$item} = $domconfig{'coursedefaults'}{$item}; |
$domdefaults{$item} = $domconfig{'coursedefaults'}{$item}; |
} |
} |
} |
} |
|
if (ref($domconfig{'usersessions'}) eq 'HASH') { |
|
if (ref($domconfig{'usersessions'}{'remote'}) eq 'HASH') { |
|
$domdefaults{'remotesessions'} = $domconfig{'usersessions'}{'remote'}; |
|
} |
|
if (ref($domconfig{'usersessions'}{'hosted'}) eq 'HASH') { |
|
$domdefaults{'hostedsessions'} = $domconfig{'usersessions'}{'hosted'}; |
|
} |
|
} |
&Apache::lonnet::do_cache_new('domdefaults',$domain,\%domdefaults, |
&Apache::lonnet::do_cache_new('domdefaults',$domain,\%domdefaults, |
$cachetime); |
$cachetime); |
return %domdefaults; |
return %domdefaults; |
Line 2880 sub get_my_roles {
|
Line 3060 sub get_my_roles {
|
unless (defined($uname)) { $uname=$env{'user.name'}; } |
unless (defined($uname)) { $uname=$env{'user.name'}; } |
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
my (%dumphash,%nothide); |
my (%dumphash,%nothide); |
if ($context eq 'userroles') { |
if ($context eq 'userroles') { |
my $extra = &freeze_escape({'skipcheck' => 1}); |
my $extra = &freeze_escape({'skipcheck' => 1}); |
%dumphash = &dump('roles',$udom,$uname,'.',undef,$extra); |
%dumphash = &dump('roles',$udom,$uname,'.',undef,$extra); |
} else { |
} else { |
Line 3869 sub coursedescription {
|
Line 4049 sub coursedescription {
|
return %returnhash; |
return %returnhash; |
} |
} |
|
|
|
sub update_released_required { |
|
my ($needsrelease,$cdom,$cnum,$chome,$cid) = @_; |
|
if ($cdom eq '' || $cnum eq '' || $chome eq '' || $cid eq '') { |
|
$cid = $env{'request.course.id'}; |
|
$cdom = $env{'course.'.$cid.'.domain'}; |
|
$cnum = $env{'course.'.$cid.'.num'}; |
|
$chome = $env{'course.'.$cid.'.home'}; |
|
} |
|
if ($needsrelease) { |
|
my %curr_reqd_hash = &userenvironment($cdom,$cnum,'internal.releaserequired'); |
|
my $needsupdate; |
|
if ($curr_reqd_hash{'internal.releaserequired'} eq '') { |
|
$needsupdate = 1; |
|
} else { |
|
my ($currmajor,$currminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); |
|
my ($needsmajor,$needsminor) = split(/\./,$needsrelease); |
|
if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) { |
|
$needsupdate = 1; |
|
} |
|
} |
|
if ($needsupdate) { |
|
my %needshash = ( |
|
'internal.releaserequired' => $needsrelease, |
|
); |
|
my $putresult = &put('environment',\%needshash,$cdom,$cnum); |
|
if ($putresult eq 'ok') { |
|
&appenv({'course.'.$cid.'.internal.releaserequired' => $needsrelease}); |
|
my %crsinfo = &courseiddump($cdom,'.',1,'.','.',$cnum,undef,undef,'.'); |
|
if (ref($crsinfo{$cid}) eq 'HASH') { |
|
$crsinfo{$cid}{'releaserequired'} = $needsrelease; |
|
&courseidput($cdom,\%crsinfo,$chome,'notime'); |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
# -------------------------------------------------See if a user is privileged |
# -------------------------------------------------See if a user is privileged |
|
|
sub privileged { |
sub privileged { |
Line 3908 sub rolesinit {
|
Line 4126 sub rolesinit {
|
my ($domain,$username,$authhost)=@_; |
my ($domain,$username,$authhost)=@_; |
my $now=time; |
my $now=time; |
my %userroles = ('user.login.time' => $now); |
my %userroles = ('user.login.time' => $now); |
my $rolesdump=reply("dump:$domain:$username:roles",$authhost); |
my $extra = &freeze_escape({'skipcheck' => 1}); |
|
my $rolesdump=reply("dump:$domain:$username:roles:.::$extra",$authhost); |
if (($rolesdump eq 'con_lost') || ($rolesdump eq '') || |
if (($rolesdump eq 'con_lost') || ($rolesdump eq '') || |
($rolesdump =~ /^error:/)) { |
($rolesdump =~ /^error:/)) { |
return \%userroles; |
return \%userroles; |
} |
} |
my %allroles=(); |
my %allroles=(); |
Line 4059 sub set_userprivs {
|
Line 4278 sub set_userprivs {
|
foreach my $group (keys(%{$$allgroups{$area}})) { |
foreach my $group (keys(%{$$allgroups{$area}})) { |
my $spec = $trole.'.'.$extendedarea; |
my $spec = $trole.'.'.$extendedarea; |
$grouproles{$spec.'.'.$area.'/'.$group} = |
$grouproles{$spec.'.'.$area.'/'.$group} = |
$$allgroups{$area}{$group}; |
$$allgroups{$area}{$group}; |
} |
} |
} |
} |
} |
} |
Line 4177 sub role_status {
|
Line 4396 sub role_status {
|
} |
} |
|
|
sub check_adhoc_privs { |
sub check_adhoc_privs { |
my ($cdom,$cnum,$then,$refresh,$now,$checkrole,$caller) = @_; |
my ($cdom,$cnum,$then,$refresh,$now,$checkrole) = @_; |
my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; |
my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; |
if ($env{$cckey}) { |
if ($env{$cckey}) { |
my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); |
my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); |
&role_status($cckey,$then,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); |
&role_status($cckey,$then,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); |
unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) { |
unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) { |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller); |
&set_adhoc_privileges($cdom,$cnum,$checkrole); |
} |
} |
} else { |
} else { |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller); |
&set_adhoc_privileges($cdom,$cnum,$checkrole); |
} |
} |
} |
} |
|
|
sub set_adhoc_privileges { |
sub set_adhoc_privileges { |
# role can be cc or ca |
# role can be cc or ca |
my ($dcdom,$pickedcourse,$role,$caller) = @_; |
my ($dcdom,$pickedcourse,$role) = @_; |
my $area = '/'.$dcdom.'/'.$pickedcourse; |
my $area = '/'.$dcdom.'/'.$pickedcourse; |
my $spec = $role.'.'.$area; |
my $spec = $role.'.'.$area; |
my %userroles = &set_arearole($role,$area,'','',$env{'user.domain'}, |
my %userroles = &set_arearole($role,$area,'','',$env{'user.domain'}, |
Line 4202 sub set_adhoc_privileges {
|
Line 4421 sub set_adhoc_privileges {
|
my ($author,$adv)= &set_userprivs(\%userroles,\%ccrole); |
my ($author,$adv)= &set_userprivs(\%userroles,\%ccrole); |
&appenv(\%userroles,[$role,'cm']); |
&appenv(\%userroles,[$role,'cm']); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
unless ($caller eq 'constructaccess' && $env{'request.course.id'}) { |
&appenv( {'request.role' => $spec, |
&appenv( {'request.role' => $spec, |
'request.role.domain' => $dcdom, |
'request.role.domain' => $dcdom, |
'request.course.sec' => '' |
'request.course.sec' => '' |
} |
} |
); |
); |
my $tadv=0; |
my $tadv=0; |
if (&allowed('adv') eq 'F') { $tadv=1; } |
if (&allowed('adv') eq 'F') { $tadv=1; } |
&appenv({'request.role.adv' => $tadv}); |
&appenv({'request.role.adv' => $tadv}); |
|
} |
|
} |
} |
|
|
# --------------------------------------------------------------- get interface |
# --------------------------------------------------------------- get interface |
Line 4814 sub is_portfolio_file {
|
Line 5031 sub is_portfolio_file {
|
} |
} |
|
|
sub usertools_access { |
sub usertools_access { |
my ($uname,$udom,$tool,$action,$context) = @_; |
my ($uname,$udom,$tool,$action,$context,$userenvref,$domdefref,$is_advref) = @_; |
my ($access,%tools); |
my ($access,%tools); |
if ($context eq '') { |
if ($context eq '') { |
$context = 'tools'; |
$context = 'tools'; |
Line 4856 sub usertools_access {
|
Line 5073 sub usertools_access {
|
$toolstatus = $env{'environment.'.$context.'.'.$tool}; |
$toolstatus = $env{'environment.'.$context.'.'.$tool}; |
$inststatus = $env{'environment.inststatus'}; |
$inststatus = $env{'environment.inststatus'}; |
} else { |
} else { |
my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool,'inststatus'); |
if (ref($userenvref) eq 'HASH') { |
$toolstatus = $userenv{$context.'.'.$tool}; |
$toolstatus = $userenvref->{$context.'.'.$tool}; |
$inststatus = $userenv{'inststatus'}; |
$inststatus = $userenvref->{'inststatus'}; |
|
} else { |
|
my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool,'inststatus'); |
|
$toolstatus = $userenv{$context.'.'.$tool}; |
|
$inststatus = $userenv{'inststatus'}; |
|
} |
} |
} |
|
|
if ($toolstatus ne '') { |
if ($toolstatus ne '') { |
Line 4870 sub usertools_access {
|
Line 5092 sub usertools_access {
|
return $access; |
return $access; |
} |
} |
|
|
my $is_adv = &is_advanced_user($udom,$uname); |
my ($is_adv,%domdef); |
my %domdef = &get_domain_defaults($udom); |
if (ref($is_advref) eq 'HASH') { |
|
$is_adv = $is_advref->{'is_adv'}; |
|
} else { |
|
$is_adv = &is_advanced_user($udom,$uname); |
|
} |
|
if (ref($domdefref) eq 'HASH') { |
|
%domdef = %{$domdefref}; |
|
} else { |
|
%domdef = &get_domain_defaults($udom); |
|
} |
if (ref($domdef{$tool}) eq 'HASH') { |
if (ref($domdef{$tool}) eq 'HASH') { |
if ($is_adv) { |
if ($is_adv) { |
if ($domdef{$tool}{'_LC_adv'} ne '') { |
if ($domdef{$tool}{'_LC_adv'} ne '') { |
Line 4947 sub is_advanced_user {
|
Line 5178 sub is_advanced_user {
|
my ($udom,$uname) = @_; |
my ($udom,$uname) = @_; |
if ($udom ne '' && $uname ne '') { |
if ($udom ne '' && $uname ne '') { |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { |
return $env{'user.adv'}; |
return $env{'user.adv'}; |
} |
} |
} |
} |
my %roleshash = &get_my_roles($uname,$udom,'userroles',undef,undef,undef,1); |
my %roleshash = &get_my_roles($uname,$udom,'userroles',undef,undef,undef,1); |
Line 6590 sub modifyuser {
|
Line 6821 sub modifyuser {
|
} |
} |
&logthis('Call to modify user '.$udom.', '.$uname.', '.$uid.', '. |
&logthis('Call to modify user '.$udom.', '.$uname.', '.$uid.', '. |
$umode.', '.$first.', '.$middle.', '. |
$umode.', '.$first.', '.$middle.', '. |
$last.', '.$gene.'(forceid: '.$forceid.'; candelete: '.$showcandelete.')'. |
$last.', '.$gene.'(forceid: '.$forceid.'; candelete: '.$showcandelete.')'. |
(defined($desiredhome) ? ' desiredhome = '.$desiredhome : |
(defined($desiredhome) ? ' desiredhome = '.$desiredhome : |
' desiredhome not specified'). |
' desiredhome not specified'). |
' by '.$env{'user.name'}.' at '.$env{'user.domain'}. |
' by '.$env{'user.name'}.' at '.$env{'user.domain'}. |
Line 6662 sub modifyuser {
|
Line 6893 sub modifyuser {
|
# |
# |
# If name, email and/or uid are blank (e.g., because an uploaded file |
# If name, email and/or uid are blank (e.g., because an uploaded file |
# of users did not contain them), do not overwrite existing values |
# of users did not contain them), do not overwrite existing values |
# unless field is in $candelete array ref. |
# unless field is in $candelete array ref. |
# |
# |
|
|
my @fields = ('firstname','middlename','lastname','generation', |
my @fields = ('firstname','middlename','lastname','generation', |
'permanentemail','id'); |
'permanentemail','id'); |
my %newvalues; |
my %newvalues; |
Line 6676 sub modifyuser {
|
Line 6908 sub modifyuser {
|
$names{$field} = $middle; |
$names{$field} = $middle; |
} elsif ($field eq 'lastname') { |
} elsif ($field eq 'lastname') { |
$names{$field} = $last; |
$names{$field} = $last; |
} elsif ($field eq 'generation') { |
} elsif ($field eq 'generation') { |
$names{$field} = $gene; |
$names{$field} = $gene; |
} elsif ($field eq 'permanentemail') { |
} elsif ($field eq 'permanentemail') { |
$names{$field} = $email; |
$names{$field} = $email; |
Line 6686 sub modifyuser {
|
Line 6918 sub modifyuser {
|
} |
} |
} |
} |
} |
} |
|
|
if ($first) { $names{'firstname'} = $first; } |
if ($first) { $names{'firstname'} = $first; } |
if (defined($middle)) { $names{'middlename'} = $middle; } |
if (defined($middle)) { $names{'middlename'} = $middle; } |
if ($last) { $names{'lastname'} = $last; } |
if ($last) { $names{'lastname'} = $last; } |
Line 6713 sub modifyuser {
|
Line 6944 sub modifyuser {
|
} |
} |
my $logmsg = $udom.', '.$uname.', '.$uid.', '. |
my $logmsg = $udom.', '.$uname.', '.$uid.', '. |
$umode.', '.$first.', '.$middle.', '. |
$umode.', '.$first.', '.$middle.', '. |
$last.', '.$gene.', '.$email.', '.$inststatus; |
$last.', '.$gene.', '.$email.', '.$inststatus; |
if ($env{'user.name'} ne '' && $env{'user.domain'}) { |
if ($env{'user.name'} ne '' && $env{'user.domain'}) { |
$logmsg .= ' by '.$env{'user.name'}.' at '.$env{'user.domain'}; |
$logmsg .= ' by '.$env{'user.name'}.' at '.$env{'user.domain'}; |
} else { |
} else { |
Line 8416 sub metadata {
|
Line 8647 sub metadata {
|
} |
} |
} |
} |
} else { |
} else { |
|
|
if (defined($token->[2]->{'name'})) { |
if (defined($token->[2]->{'name'})) { |
$unikey.='_'.$token->[2]->{'name'}; |
$unikey.='_'.$token->[2]->{'name'}; |
} |
} |
Line 9766 sub get_dns {
|
Line 9996 sub get_dns {
|
my %libserv; |
my %libserv; |
my $loaded; |
my $loaded; |
my %name_to_host; |
my %name_to_host; |
|
my %internetdom; |
|
|
sub parse_hosts_tab { |
sub parse_hosts_tab { |
my ($file) = @_; |
my ($file) = @_; |
Line 9773 sub get_dns {
|
Line 10004 sub get_dns {
|
next if ($configline =~ /^(\#|\s*$ )/x); |
next if ($configline =~ /^(\#|\s*$ )/x); |
next if ($configline =~ /^\^/); |
next if ($configline =~ /^\^/); |
chomp($configline); |
chomp($configline); |
my ($id,$domain,$role,$name,$protocol)=split(/:/,$configline); |
my ($id,$domain,$role,$name,$protocol,$intdom)=split(/:/,$configline); |
$name=~s/\s//g; |
$name=~s/\s//g; |
if ($id && $domain && $role && $name) { |
if ($id && $domain && $role && $name) { |
$hostname{$id}=$name; |
$hostname{$id}=$name; |
Line 9789 sub get_dns {
|
Line 10020 sub get_dns {
|
} else { |
} else { |
$protocol{$id} = 'http'; |
$protocol{$id} = 'http'; |
} |
} |
|
if (defined($intdom)) { |
|
$internetdom{$id} = $intdom; |
|
} |
} |
} |
} |
} |
} |
} |
Line 9850 sub get_dns {
|
Line 10084 sub get_dns {
|
return %libserv; |
return %libserv; |
} |
} |
|
|
|
sub unique_library { |
|
#2x reverse removes all hostnames that appear more than once |
|
my %unique = reverse &all_library(); |
|
return reverse %unique; |
|
} |
|
|
sub get_servers { |
sub get_servers { |
&load_hosts_tab() if (!$loaded); |
&load_hosts_tab() if (!$loaded); |
|
|
Line 9873 sub get_dns {
|
Line 10113 sub get_dns {
|
return %result; |
return %result; |
} |
} |
|
|
|
sub get_unique_servers { |
|
my %unique = reverse &get_servers(@_); |
|
return reverse %unique; |
|
} |
|
|
sub host_domain { |
sub host_domain { |
&load_hosts_tab() if (!$loaded); |
&load_hosts_tab() if (!$loaded); |
|
|
Line 9887 sub get_dns {
|
Line 10132 sub get_dns {
|
my @uniq = grep(!$seen{$_}++, values(%hostdom)); |
my @uniq = grep(!$seen{$_}++, values(%hostdom)); |
return @uniq; |
return @uniq; |
} |
} |
|
|
|
sub internet_dom { |
|
&load_hosts_tab() if (!$loaded); |
|
|
|
my ($lonid) = @_; |
|
return $internetdom{$lonid}; |
|
} |
} |
} |
|
|
{ |
{ |
Line 10004 sub get_dns {
|
Line 10256 sub get_dns {
|
return undef; |
return undef; |
} |
} |
|
|
|
sub get_internet_names { |
|
my ($lonid) = @_; |
|
return if ($lonid eq ''); |
|
my ($idnref,$cached)= |
|
&Apache::lonnet::is_cached_new('internetnames',$lonid); |
|
if ($cached) { |
|
return $idnref; |
|
} |
|
my $ip = &get_host_ip($lonid); |
|
my @hosts = &get_hosts_from_ip($ip); |
|
my %iphost = &get_iphost(); |
|
my (@idns,%seen); |
|
foreach my $id (@hosts) { |
|
my $dom = &host_domain($id); |
|
my $prim_id = &domain($dom,'primary'); |
|
my $prim_ip = &get_host_ip($prim_id); |
|
next if ($seen{$prim_ip}); |
|
if (ref($iphost{$prim_ip}) eq 'ARRAY') { |
|
foreach my $id (@{$iphost{$prim_ip}}) { |
|
my $intdom = &internet_dom($id); |
|
unless (grep(/^\Q$intdom\E$/,@idns)) { |
|
push(@idns,$intdom); |
|
} |
|
} |
|
} |
|
$seen{$prim_ip} = 1; |
|
} |
|
return &Apache::lonnet::do_cache_new('internetnames',$lonid,\@idns,12*60*60); |
|
} |
|
|
|
} |
|
|
|
sub all_loncaparevs { |
|
return qw(1.1 1.2 1.3 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10); |
} |
} |
|
|
BEGIN { |
BEGIN { |
Line 10081 BEGIN {
|
Line 10367 BEGIN {
|
close($config); |
close($config); |
} |
} |
|
|
|
# ---------------------------------------------------------- Read loncaparev table |
|
{ |
|
if (-e "$perlvar{'lonTabDir'}/loncaparevs.tab") { |
|
if (open(my $config,"<$perlvar{'lonTabDir'}/loncaparevs.tab")) { |
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($hostid,$loncaparev)=split(/:/,$configline); |
|
$loncaparevs{$hostid}=$loncaparev; |
|
} |
|
close($config); |
|
} |
|
} |
|
} |
|
|
|
# ---------------------------------------------------------- Read serverhostID table |
|
{ |
|
if (-e "$perlvar{'lonTabDir'}/serverhomeIDs.tab") { |
|
if (open(my $config,"<$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { |
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($name,$id)=split(/:/,$configline); |
|
$serverhomeIDs{$name}=$id; |
|
} |
|
close($config); |
|
} |
|
} |
|
} |
|
|
|
{ |
|
my $file = $Apache::lonnet::perlvar{'lonTabDir'}.'/releaseslist.xml'; |
|
if (-e $file) { |
|
my $parser = HTML::LCParser->new($file); |
|
while (my $token = $parser->get_token()) { |
|
if ($token->[0] eq 'S') { |
|
my $item = $token->[1]; |
|
my $name = $token->[2]{'name'}; |
|
my $value = $token->[2]{'value'}; |
|
if ($item ne '' && $name ne '' && $value ne '') { |
|
my $release = $parser->get_text(); |
|
$release =~ s/(^\s*|\s*$ )//gx; |
|
$needsrelease{$item.':'.$name.':'.$value} = $release; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
# ------------- set up temporary directory |
# ------------- set up temporary directory |
{ |
{ |
$tmpdir = $perlvar{'lonDaemons'}.'/tmp/'; |
$tmpdir = $perlvar{'lonDaemons'}.'/tmp/'; |
Line 10311 authentication scheme
|
Line 10644 authentication scheme
|
|
|
=item * |
=item * |
X<authenticate()> |
X<authenticate()> |
B<authenticate($uname,$upass,$udom)>: try to |
B<authenticate($uname,$upass,$udom,$checkdefauth,$clientcancheckhost)>: try to |
authenticate user from domain's lib servers (first use the current |
authenticate user from domain's lib servers (first use the current |
one). C<$upass> should be the users password. |
one). C<$upass> should be the users password. |
|
$checkdefauth is optional (value is 1 if a check should be made to |
|
authenticate user using default authentication method, and allow |
|
account creation if username does not have account in the domain). |
|
$clientcancheckhost is optional (value is 1 if checking whether the |
|
server can host will occur on the client side in lonauth.pm). |
|
|
=item * |
=item * |
X<homeserver()> |
X<homeserver()> |
Line 10441 modifyuser($udom,$uname,$uid,$umode,$upa
|
Line 10779 modifyuser($udom,$uname,$uid,$umode,$upa
|
will update user information (firstname,middlename,lastname,generation, |
will update user information (firstname,middlename,lastname,generation, |
permanentemail), and if forceid is true, student/employee ID also. |
permanentemail), and if forceid is true, student/employee ID also. |
A user's institutional affiliation(s) can also be updated. |
A user's institutional affiliation(s) can also be updated. |
User information fields will not be overwritten with empty entries |
User information fields will not be overwritten with empty entries |
unless the field is included in the $candelete array reference. |
unless the field is included in the $candelete array reference. |
This array is included when a single user is modified via "Manage Users", |
This array is included when a single user is modified via "Manage Users", |
or when Autoupdate.pl is run by cron in a domain. |
or when Autoupdate.pl is run by cron in a domain. |