--- loncom/lonnet/perl/lonnet.pm 2010/09/27 01:41:33 1.1056.4.10 +++ loncom/lonnet/perl/lonnet.pm 2010/07/06 18:36:56 1.1072 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1056.4.10 2010/09/27 01:41:33 raeburn Exp $ +# $Id: lonnet.pm,v 1.1072 2010/07/06 18:36:56 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -76,7 +76,7 @@ use HTTP::Date; use Image::Magick; use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir - $_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease); + $_64bit %env %protocol); my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, %userrolehash, $processmarker, $dumpcount, %coursedombuf, @@ -196,7 +196,7 @@ sub get_server_timezone { } sub get_server_loncaparev { - my ($dom,$lonhost,$ignore_cache,$caller) = @_; + my ($dom,$lonhost) = @_; if (defined($lonhost)) { if (!defined(&hostname($lonhost))) { undef($lonhost); @@ -211,74 +211,15 @@ sub get_server_loncaparev { } } if (defined($lonhost)) { - my $cachetime = 12*3600; - 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 =~ /
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);
+ my $cachetime = 24*3600;
+ my ($loncaparev,$cached)=&is_cached_new('serverloncaparev',$lonhost);
if (defined($cached)) {
- return $serverhomeID;
- }
- }
- 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];
+ return $loncaparev;
+ } else {
+ my $loncaparev = &reply('serverloncaparev',$lonhost);
+ return &do_cache_new('serverloncaparev',$lonhost,$loncaparev,$cachetime);
}
- } else {
- $serverhomeID = $serverhomeIDs{$hostname};
}
- return &do_cache_new('serverhomeID',$hostname,$serverhomeID,$cachetime);
}
# -------------------------------------------------- Non-critical communication
@@ -724,30 +665,6 @@ sub userload {
return $userloadpercent;
}
-# ------------------------------------------ Fight off request when overloaded
-
-sub overloaderror {
- my ($r,$checkserver)=@_;
- unless ($checkserver) { $checkserver=$perlvar{'lonHostID'}; }
- my $loadavg;
- if ($checkserver eq $perlvar{'lonHostID'}) {
- open(my $loadfile,'/proc/loadavg');
- $loadavg=<$loadfile>;
- $loadavg =~ s/\s.*//g;
- $loadavg = 100*$loadavg/$perlvar{'lonLoadLim'};
- close($loadfile);
- } else {
- $loadavg=&reply('load',$checkserver);
- }
- my $overload=$loadavg-100;
- if ($overload>0) {
- $r->err_headers_out->{'Retry-After'}=$overload;
- $r->log_error('Overload of '.$overload.' on '.$checkserver);
- return 413;
- }
- return '';
-}
-
# ------------------------------ Find server with least workload from spare.tab
sub spareserver {
@@ -756,18 +673,8 @@ sub spareserver {
if ($userloadpercent !~ /\d/) { $userloadpercent=0; }
my $lowest_load=($loadpercent > $userloadpercent) ? $loadpercent
: $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'} }) {
- if ($uint_dom) {
- next unless (&spare_can_host($env{'user.domain'},$uint_dom,
- $remotesessions,$try_server));
- }
($spare_server, $lowest_load) =
&compare_server_load($try_server, $spare_server, $lowest_load);
}
@@ -776,10 +683,6 @@ sub spareserver {
if (!$found_server) {
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) =
&compare_server_load($try_server, $spare_server, $lowest_load);
}
@@ -792,7 +695,7 @@ sub spareserver {
}
if (defined($spare_server)) {
my $hostname = &hostname($spare_server);
- if (defined($hostname)) {
+ if (defined($hostname)) {
$spare_server = $protocol.'://'.$hostname;
}
}
@@ -807,7 +710,7 @@ sub compare_server_load {
my $userloadans = &reply('userload',$try_server);
if ($loadans !~ /\d/ && $userloadans !~ /\d/) {
- return; #didn't get a number from the server
+ return; #didn't get a number from the server
}
my $load;
@@ -850,27 +753,6 @@ sub has_user_session {
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
sub changepass {
@@ -929,7 +811,7 @@ sub queryauthenticate {
# --------- Try to authenticate user from domain's lib servers (first this one)
sub authenticate {
- my ($uname,$upass,$udom,$checkdefauth,$clientcancheckhost)=@_;
+ my ($uname,$upass,$udom,$checkdefauth)=@_;
$upass=&escape($upass);
$uname= &LONCAPA::clean_username($uname);
my $uhome=&homeserver($uname,$udom,1);
@@ -952,7 +834,7 @@ sub authenticate {
return 'no_host';
}
}
- my $answer=reply("encrypt:auth:$udom:$uname:$upass:$checkdefauth:$clientcancheckhost",$uhome);
+ my $answer=reply("encrypt:auth:$udom:$uname:$upass:$checkdefauth",$uhome);
if ($answer eq 'authorized') {
if ($newhome) {
&logthis("User $uname at $udom authorized by $uhome, but needs account");
@@ -970,84 +852,6 @@ sub authenticate {
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
my %homecache;
@@ -1524,7 +1328,7 @@ sub get_domain_defaults {
my %domconfig =
&Apache::lonnet::get_dom('configuration',['defaults','quotas',
'requestcourses','inststatus',
- 'coursedefaults','usersessions'],$domain);
+ 'coursedefaults'],$domain);
if (ref($domconfig{'defaults'}) eq 'HASH') {
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'};
$domdefaults{'auth_def'} = $domconfig{'defaults'}{'auth_def'};
@@ -1564,14 +1368,6 @@ sub get_domain_defaults {
$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,
$cachetime);
return %domdefaults;
@@ -1757,8 +1553,7 @@ sub getsection {
# If there is a role which has expired, return it.
#
$courseid = &courseid_to_courseurl($courseid);
- my $extra = &freeze_escape({'skipcheck' => 1});
- my %roleshash = &dump('roles',$udom,$unam,$courseid,undef,$extra);
+ my %roleshash = &dump('roles',$udom,$unam,$courseid);
foreach my $key (keys(%roleshash)) {
next if ($key !~/^\Q$courseid\E(?:\/)*(\w+)*\_st$/);
my $section=$1;
@@ -3061,8 +2856,7 @@ sub get_my_roles {
unless (defined($udom)) { $udom=$env{'user.domain'}; }
my (%dumphash,%nothide);
if ($context eq 'userroles') {
- my $extra = &freeze_escape({'skipcheck' => 1});
- %dumphash = &dump('roles',$udom,$uname,'.',undef,$extra);
+ %dumphash = &dump('roles',$udom,$uname);
} else {
%dumphash=
&dump('nohist_userroles',$udom,$uname);
@@ -3390,7 +3184,7 @@ sub get_domain_roles {
return %personnel;
}
-# ----------------------------------------------------------- Check out an item
+# ----------------------------------------------------------- Interval timing
sub get_first_access {
my ($type,$argsymb)=@_;
@@ -3426,91 +3220,6 @@ sub set_first_access {
return 'already_set';
}
-sub checkout {
- my ($symb,$tuname,$tudom,$tcrsid)=@_;
- my $now=time;
- my $lonhost=$perlvar{'lonHostID'};
- my $infostr=&escape(
- 'CHECKOUTTOKEN&'.
- $tuname.'&'.
- $tudom.'&'.
- $tcrsid.'&'.
- $symb.'&'.
- $now.'&'.$ENV{'REMOTE_ADDR'});
- my $token=&reply('tmpput:'.$infostr,$lonhost);
- if ($token=~/^error\:/) {
- &logthis("WARNING: ".
- "Checkout tmpput failed ".$tudom.' - '.$tuname.' - '.$symb.
- "");
- return '';
- }
-
- $token=~s/^(\d+)\_.*\_(\d+)$/$1\*$2\*$lonhost/;
- $token=~tr/a-z/A-Z/;
-
- my %infohash=('resource.0.outtoken' => $token,
- 'resource.0.checkouttime' => $now,
- 'resource.0.outremote' => $ENV{'REMOTE_ADDR'});
-
- unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {
- return '';
- } else {
- &logthis("WARNING: ".
- "Checkout cstore failed ".$tudom.' - '.$tuname.' - '.$symb.
- "");
- }
-
- if (&log($tudom,$tuname,&homeserver($tuname,$tudom),
- &escape('Checkout '.$infostr.' - '.
- $token)) ne 'ok') {
- return '';
- } else {
- &logthis("WARNING: ".
- "Checkout log failed ".$tudom.' - '.$tuname.' - '.$symb.
- "");
- }
- return $token;
-}
-
-# ------------------------------------------------------------ Check in an item
-
-sub checkin {
- my $token=shift;
- my $now=time;
- my ($ta,$tb,$lonhost)=split(/\*/,$token);
- $lonhost=~tr/A-Z/a-z/;
- my $dtoken=$ta.'_'.&hostname($lonhost).'_'.$tb;
- $dtoken=~s/\W/\_/g;
- my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)=
- split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost)));
-
- unless (($tuname) && ($tudom)) {
- &logthis('Check in '.$token.' ('.$dtoken.') failed');
- return '';
- }
-
- unless (&allowed('mgr',$tcrsid)) {
- &logthis('Check in '.$token.' ('.$dtoken.') unauthorized: '.
- $env{'user.name'}.' - '.$env{'user.domain'});
- return '';
- }
-
- my %infohash=('resource.0.intoken' => $token,
- 'resource.0.checkintime' => $now,
- 'resource.0.inremote' => $ENV{'REMOTE_ADDR'});
-
- unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {
- return '';
- }
-
- if (&log($tudom,$tuname,&homeserver($tuname,$tudom),
- &escape('Checkin - '.$token)) ne 'ok') {
- return '';
- }
-
- return ($symb,$tuname,$tudom,$tcrsid);
-}
-
# --------------------------------------------- Set Expire Date for Spreadsheet
sub expirespread {
@@ -4049,44 +3758,6 @@ sub coursedescription {
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
sub privileged {
@@ -4126,10 +3797,9 @@ sub rolesinit {
my ($domain,$username,$authhost)=@_;
my $now=time;
my %userroles = ('user.login.time' => $now);
- my $extra = &freeze_escape({'skipcheck' => 1});
- my $rolesdump=reply("dump:$domain:$username:roles:.::$extra",$authhost);
+ my $rolesdump=reply("dump:$domain:$username:roles",$authhost);
if (($rolesdump eq 'con_lost') || ($rolesdump eq '') ||
- ($rolesdump =~ /^error:/)) {
+ ($rolesdump =~ /^error:/)) {
return \%userroles;
}
my %allroles=();
@@ -4255,7 +3925,7 @@ sub set_userprivs {
my $adv=0;
my %grouproles = ();
if (keys(%{$allgroups}) > 0) {
- my @groupkeys;
+ my @groupkeys;
foreach my $role (keys(%{$allroles})) {
push(@groupkeys,$role);
}
@@ -4331,7 +4001,7 @@ sub role_status {
my %userroles = (
'user.role.'.$$role.'.'.$$where => $$tstart.'.'.$$tend
);
- @rolecodes = ('cm');
+ @rolecodes = ('cm');
my $spec=$$role.'.'.$$where;
my ($tdummy,$tdomain,$trest)=split(/\//,$$where);
if ($$role =~ /^cr\//) {
@@ -4348,7 +4018,7 @@ sub role_status {
my %course_roles = &get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active'],['cc','co','in','ta','ep','ad','st','cr'],[$tdomain],1);
if (keys(%course_roles) > 0) {
my ($tnum) = ($trest =~ /^($match_courseid)/);
- if ($tdomain ne '' && $tnum ne '') {
+ if ($tdomain ne '' && $tnum ne '') {
foreach my $key (keys(%course_roles)) {
if ($key =~ /^\Q$tnum\E:\Q$tdomain\E:([^:]+):?([^:]*)/) {
my $crsrole = $1;
@@ -4477,7 +4147,7 @@ sub del {
# -------------------------------------------------------------- dump interface
sub dump {
- my ($namespace,$udomain,$uname,$regexp,$range,$extra)=@_;
+ my ($namespace,$udomain,$uname,$regexp,$range)=@_;
if (!$udomain) { $udomain=$env{'user.domain'}; }
if (!$uname) { $uname=$env{'user.name'}; }
my $uhome=&homeserver($uname,$udomain);
@@ -4486,7 +4156,7 @@ sub dump {
} else {
$regexp='.';
}
- my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range:$extra",$uhome);
+ my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome);
my @pairs=split(/\&/,$rep);
my %returnhash=();
foreach my $item (@pairs) {
@@ -5031,7 +4701,7 @@ sub is_portfolio_file {
}
sub usertools_access {
- my ($uname,$udom,$tool,$action,$context,$userenvref,$domdefref,$is_advref) = @_;
+ my ($uname,$udom,$tool,$action,$context) = @_;
my ($access,%tools);
if ($context eq '') {
$context = 'tools';
@@ -5073,14 +4743,9 @@ sub usertools_access {
$toolstatus = $env{'environment.'.$context.'.'.$tool};
$inststatus = $env{'environment.inststatus'};
} else {
- if (ref($userenvref) eq 'HASH') {
- $toolstatus = $userenvref->{$context.'.'.$tool};
- $inststatus = $userenvref->{'inststatus'};
- } else {
- my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool,'inststatus');
- $toolstatus = $userenv{$context.'.'.$tool};
- $inststatus = $userenv{'inststatus'};
- }
+ my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool,'inststatus');
+ $toolstatus = $userenv{$context.'.'.$tool};
+ $inststatus = $userenv{'inststatus'};
}
if ($toolstatus ne '') {
@@ -5092,17 +4757,8 @@ sub usertools_access {
return $access;
}
- my ($is_adv,%domdef);
- 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);
- }
+ my $is_adv = &is_advanced_user($udom,$uname);
+ my %domdef = &get_domain_defaults($udom);
if (ref($domdef{$tool}) eq 'HASH') {
if ($is_adv) {
if ($domdef{$tool}{'_LC_adv'} ne '') {
@@ -5176,11 +4832,6 @@ sub is_course_owner {
sub is_advanced_user {
my ($udom,$uname) = @_;
- if ($udom ne '' && $uname ne '') {
- if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) {
- return $env{'user.adv'};
- }
- }
my %roleshash = &get_my_roles($uname,$udom,'userroles',undef,undef,undef,1);
my %allroles;
my $is_adv;
@@ -5903,7 +5554,8 @@ sub update_allusers_table {
'generation='.&escape($names->{'generation'}).'%%'.
'permanentemail='.&escape($names->{'permanentemail'}).'%%'.
'id='.&escape($names->{'id'}),$homeserver);
- return;
+ my $reply = &get_query_reply($queryid);
+ return $reply;
}
# ------- Request retrieval of institutional classlists for course(s)
@@ -6466,8 +6118,7 @@ sub get_users_groups {
} else {
$grouplist = '';
my $courseurl = &courseid_to_courseurl($courseid);
- my $extra = &freeze_escape({'skipcheck' => 1});
- my %roleshash = &dump('roles',$udom,$uname,$courseurl,undef,$extra);
+ my %roleshash = &dump('roles',$udom,$uname,$courseurl);
my $access_end = $env{'course.'.$courseid.
'.default_enrollment_end_date'};
my $now = time;
@@ -6821,16 +6472,12 @@ sub modifyuser {
}
&logthis('Call to modify user '.$udom.', '.$uname.', '.$uid.', '.
$umode.', '.$first.', '.$middle.', '.
- $last.', '.$gene.'(forceid: '.$forceid.'; candelete: '.$showcandelete.')'.
+ $last.', '.$gene.'(forceid: '.$forceid.'; candelete: '.$showcandelete.')'.
(defined($desiredhome) ? ' desiredhome = '.$desiredhome :
' desiredhome not specified').
' by '.$env{'user.name'}.' at '.$env{'user.domain'}.
' in domain '.$env{'request.role.domain'});
my $uhome=&homeserver($uname,$udom,'true');
- my $newuser;
- if ($uhome eq 'no_host') {
- $newuser = 1;
- }
# ----------------------------------------------------------------- Create User
if (($uhome eq 'no_host') &&
(($umode && $upass) || ($umode eq 'localauth'))) {
@@ -6883,12 +6530,11 @@ sub modifyuser {
['firstname','middlename','lastname','generation','id',
'permanentemail','inststatus'],
$udom,$uname);
- my (%names,%oldnames);
+ my %names;
if ($tmp[0] =~ m/^error:.*/) {
%names=();
} else {
%names = @tmp;
- %oldnames = %names;
}
#
# If name, email and/or uid are blank (e.g., because an uploaded file
@@ -6942,37 +6588,18 @@ sub modifyuser {
}
}
}
- my $logmsg = $udom.', '.$uname.', '.$uid.', '.
+ my $reply = &put('environment', \%names, $udom,$uname);
+ if ($reply ne 'ok') { return 'error: '.$reply; }
+ my $sqlresult = &update_allusers_table($uname,$udom,\%names);
+ &devalidate_cache_new('namescache',$uname.':'.$udom);
+ my $logmsg = 'Success modifying user '.$udom.', '.$uname.', '.$uid.', '.
$umode.', '.$first.', '.$middle.', '.
- $last.', '.$gene.', '.$email.', '.$inststatus;
+ $last.', '.$gene.', '.$email.', '.$inststatus;
if ($env{'user.name'} ne '' && $env{'user.domain'}) {
$logmsg .= ' by '.$env{'user.name'}.' at '.$env{'user.domain'};
} else {
$logmsg .= ' during self creation';
}
- my $changed;
- if ($newuser) {
- $changed = 1;
- } else {
- foreach my $field (@fields) {
- if ($names{$field} ne $oldnames{$field}) {
- $changed = 1;
- last;
- }
- }
- }
- unless ($changed) {
- $logmsg = 'No changes in user information needed for: '.$logmsg;
- &logthis($logmsg);
- return 'ok';
- }
- my $reply = &put('environment', \%names, $udom,$uname);
- if ($reply ne 'ok') {
- return 'error: '.$reply;
- }
- my $sqlresult = &update_allusers_table($uname,$udom,\%names);
- &devalidate_cache_new('namescache',$uname.':'.$udom);
- $logmsg = 'Success modifying user '.$logmsg;
&logthis($logmsg);
return 'ok';
}
@@ -8505,6 +8132,7 @@ sub add_prefix_and_part {
# ---------------------------------------------------------------- Get metadata
my %metaentry;
+my %importedpartids;
sub metadata {
my ($uri,$what,$liburi,$prefix,$depthcount)=@_;
$uri=&declutter($uri);
@@ -8531,6 +8159,10 @@ sub metadata {
if (defined($cached)) { return $result->{':'.$what}; }
}
{
+# Imported parts would go here
+ my %importedids=();
+ my @origfileimportpartids=();
+ my $importedparts=0;
#
# Is this a recursive call for a library?
#
@@ -8614,27 +8246,55 @@ sub metadata {
# This is not a package - some other kind of start tag
#
my $entry=$token->[1];
- my $unikey;
- if ($entry eq 'import') {
- $unikey='';
- } else {
- $unikey=$entry;
- }
- $unikey.=&add_prefix_and_part($prefix,$token->[2]->{'part'});
-
- if (defined($token->[2]->{'id'})) {
- $unikey.='_'.$token->[2]->{'id'};
- }
+ my $unikey='';
if ($entry eq 'import') {
#
# Importing a library here
#
+ my $location=$parser->get_text('/import');
+ my $dir=$filename;
+ $dir=~s|[^/]*$||;
+ $location=&filelocation($dir,$location);
+
+ my $importmode=$token->[2]->{'importmode'};
+ if ($importmode eq 'problem') {
+# Import as problem/response
+ $unikey=&add_prefix_and_part($prefix,$token->[2]->{'part'});
+ } elsif ($importmode eq 'part') {
+# Import as part(s)
+ $importedparts=1;
+# We need to get the original file and the imported file to get the part order correct
+# Good news: we do not need to worry about nested libraries, since parts cannot be nested
+# Load and inspect original file
+ if ($#origfileimportpartids<0) {
+ undef(%importedpartids);
+ my $origfilelocation=$perlvar{'lonDocRoot'}.&clutter($uri);
+ my $origfile=&getfile($origfilelocation);
+ @origfileimportpartids=($origfile=~/<(part|import)[^>]*id\s*=\s*[\"\']([^\"\']+)[\"\'][^>]*>/gs);
+ }
+
+# Load and inspect imported file
+ my $impfile=&getfile($location);
+ my @impfilepartids=($impfile=~/