version 1.891, 2007/06/18 22:49:57
|
version 1.906, 2007/08/10 23:02:36
|
Line 856 sub is_domainimage {
|
Line 856 sub is_domainimage {
|
return; |
return; |
} |
} |
|
|
|
sub inst_directory_query { |
|
my ($srch) = @_; |
|
my $udom = $srch->{'srchdomain'}; |
|
my %results; |
|
my $homeserver = &domain($udom,'primary'); |
|
if ($homeserver ne '') { |
|
my $queryid=&reply("querysend:instdirsearch:". |
|
&escape($srch->{'srchby'}).':'. |
|
&escape($srch->{'srchterm'}).':'. |
|
&escape($srch->{'srchtype'}),$homeserver); |
|
my $host=&hostname($homeserver); |
|
if ($queryid !~/^\Q$host\E\_/) { |
|
&logthis('instituional directory search invalid queryid: '.$queryid.' for host: '.$homeserver.'in domain '.$udom); |
|
return; |
|
} |
|
my $response = &get_query_reply($queryid); |
|
my $maxtries = 5; |
|
my $tries = 1; |
|
while (($response=~/^timeout/) && ($tries < $maxtries)) { |
|
$response = &get_query_reply($queryid); |
|
$tries ++; |
|
} |
|
|
|
if (!&error($response) && $response ne 'refused') { |
|
my @matches = split(/\n/,$response); |
|
foreach my $match (@matches) { |
|
my ($key,$value) = split(/=/,$match); |
|
$results{&unescape($key).':'.$udom} = &thaw_unescape($value); |
|
} |
|
} |
|
} |
|
return %results; |
|
} |
|
|
|
sub usersearch { |
|
my ($srch) = @_; |
|
my $dom = $srch->{'srchdomain'}; |
|
my %results; |
|
my %libserv = &all_library(); |
|
my $query = 'usersearch'; |
|
foreach my $tryserver (keys(%libserv)) { |
|
if (&host_domain($tryserver) eq $dom) { |
|
my $host=&hostname($tryserver); |
|
my $queryid= |
|
&reply("querysend:".&escape($query).':'.&escape($dom).':'. |
|
&escape($srch->{'srchby'}).'%%'. |
|
&escape($srch->{'srchtype'}).':'. |
|
&escape($srch->{'srchterm'}),$tryserver); |
|
if ($queryid !~/^\Q$host\E\_/) { |
|
&logthis('usersearch: invalid queryid: '.$queryid.' for host: '.$host.'in domain '.$dom.' and server: '.$tryserver); |
|
next; |
|
} |
|
my $reply = &get_query_reply($queryid); |
|
my $maxtries = 1; |
|
my $tries = 1; |
|
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
|
$reply = &get_query_reply($queryid); |
|
$tries ++; |
|
} |
|
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
|
&logthis('usersrch error: '.$reply.' for '.$dom.' - searching for : '.$srch->{'srchterm'}.' by '.$srch->{'srchby'}.' ('.$srch->{'srchtype'}.') - maxtries: '.$maxtries.' tries: '.$tries); |
|
} else { |
|
my @matches = split(/&/,$reply); |
|
foreach my $match (@matches) { |
|
my @items = split(/:/,$match); |
|
my ($uname,$udom,%userhash); |
|
foreach my $entry (@items) { |
|
my ($key,$value) = split(/=/,$entry); |
|
$key = &unescape($key); |
|
$value = &unescape($value); |
|
$userhash{$key} = $value; |
|
if ($key eq 'username') { |
|
$uname = $value; |
|
} elsif ($key eq 'domain') { |
|
$udom = $value; |
|
} |
|
} |
|
$results{$uname.':'.$udom} = \%userhash; |
|
} |
|
} |
|
} |
|
} |
|
return %results; |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 1396 sub ssi {
|
Line 1481 sub ssi {
|
my $request; |
my $request; |
|
|
$form{'no_update_last_known'}=1; |
$form{'no_update_last_known'}=1; |
|
&Apache::lonenc::check_encrypt(\$fn); |
if (%form) { |
if (%form) { |
$request=new HTTP::Request('POST',&absolute_url().$fn); |
$request=new HTTP::Request('POST',&absolute_url().$fn); |
$request->content(join('&',map { &escape($_).'='.&escape($form{$_}) } keys %form)); |
$request->content(join('&',map { &escape($_).'='.&escape($form{$_}) } keys %form)); |
Line 2008 sub flushcourselogs {
|
Line 2093 sub flushcourselogs {
|
# |
# |
my %domrolebuffer = (); |
my %domrolebuffer = (); |
foreach my $entry (keys %domainrolehash) { |
foreach my $entry (keys %domainrolehash) { |
my ($role,$uname,$udom,$runame,$rudom,$rsec)=split/:/,$entry; |
my ($role,$uname,$udom,$runame,$rudom,$rsec)=split(/:/,$entry); |
if ($domrolebuffer{$rudom}) { |
if ($domrolebuffer{$rudom}) { |
$domrolebuffer{$rudom}.='&'.&escape($entry). |
$domrolebuffer{$rudom}.='&'.&escape($entry). |
'='.&escape($domainrolehash{$entry}); |
'='.&escape($domainrolehash{$entry}); |
Line 2113 sub userrolelog {
|
Line 2198 sub userrolelog {
|
{$trole.':'.$username.':'.$domain.':'.$runame.':'.$rudom.':'.$rsec} |
{$trole.':'.$username.':'.$domain.':'.$runame.':'.$rudom.':'.$rsec} |
=$tend.':'.$tstart; |
=$tend.':'.$tstart; |
} |
} |
|
if (($env{'request.role'} =~ /dc\./) && |
|
(($trole=~/^au/) || ($trole=~/^in/) || |
|
($trole=~/^cc/) || ($trole=~/^ep/) || |
|
($trole=~/^cr/) || ($trole=~/^ta/))) { |
|
$userrolehash |
|
{$trole.':'.$username.':'.$domain.':'.$env{'user.name'}.':'.$env{'user.domain'}.':'} |
|
=$tend.':'.$tstart; |
|
} |
if (($trole=~/^dc/) || ($trole=~/^ad/) || |
if (($trole=~/^dc/) || ($trole=~/^ad/) || |
($trole=~/^li/) || ($trole=~/^li/) || |
($trole=~/^li/) || ($trole=~/^li/) || |
($trole=~/^au/) || ($trole=~/^dg/) || |
($trole=~/^au/) || ($trole=~/^dg/) || |
Line 3804 sub customaccess {
|
Line 3897 sub customaccess {
|
$ucrs = &LONCAPA::clean_username($ucrs); |
$ucrs = &LONCAPA::clean_username($ucrs); |
my $access=0; |
my $access=0; |
foreach my $right (split(/\s*\,\s*/,&metadata($uri,'rule_rights'))) { |
foreach my $right (split(/\s*\,\s*/,&metadata($uri,'rule_rights'))) { |
my ($effect,$realm,$role)=split(/\:/,$right); |
my ($effect,$realm,$role,$type)=split(/\:/,$right); |
if ($role) { |
if ($type eq 'user') { |
if ($role ne $urole) { next; } |
foreach my $scope (split(/\s*\,\s*/,$realm)) { |
} |
my ($tdom,$tuname)=split(m{/},$scope); |
foreach my $scope (split(/\s*\,\s*/,$realm)) { |
if ($tdom) { |
my ($tdom,$tcrs,$tsec)=split(/\_/,$scope); |
if ($tdom ne $env{'user.domain'}) { next; } |
if ($tdom) { |
} |
if ($tdom ne $udom) { next; } |
if ($tuname) { |
} |
if ($tuname ne $env{'user.name'}) { next; } |
if ($tcrs) { |
} |
if ($tcrs ne $ucrs) { next; } |
$access=($effect eq 'allow'); |
} |
last; |
if ($tsec) { |
} |
if ($tsec ne $usec) { next; } |
} else { |
} |
if ($role) { |
$access=($effect eq 'allow'); |
if ($role ne $urole) { next; } |
last; |
} |
} |
foreach my $scope (split(/\s*\,\s*/,$realm)) { |
if ($realm eq '' && $role eq '') { |
my ($tdom,$tcrs,$tsec)=split(/\_/,$scope); |
$access=($effect eq 'allow'); |
if ($tdom) { |
|
if ($tdom ne $udom) { next; } |
|
} |
|
if ($tcrs) { |
|
if ($tcrs ne $ucrs) { next; } |
|
} |
|
if ($tsec) { |
|
if ($tsec ne $usec) { next; } |
|
} |
|
$access=($effect eq 'allow'); |
|
last; |
|
} |
|
if ($realm eq '' && $role eq '') { |
|
$access=($effect eq 'allow'); |
|
} |
} |
} |
} |
} |
return $access; |
return $access; |
Line 4352 sub update_portfolio_table {
|
Line 4459 sub update_portfolio_table {
|
return $reply; |
return $reply; |
} |
} |
|
|
|
# -------------------------- Update MySQL allusers table |
|
|
|
sub update_allusers_table { |
|
my ($uname,$udom,$names) = @_; |
|
my $homeserver = &homeserver($uname,$udom); |
|
my $queryid= |
|
&reply('querysend:allusers:'.&escape($uname).':'.&escape($udom).':'. |
|
'lastname='.&escape($names->{'lastname'}).'%%'. |
|
'firstname='.&escape($names->{'firstname'}).'%%'. |
|
'middlename='.&escape($names->{'middlename'}).'%%'. |
|
'generation='.&escape($names->{'generation'}).'%%'. |
|
'permanentemail='.&escape($names->{'permanentemail'}).'%%'. |
|
'id='.&escape($names->{'id'}),$homeserver); |
|
my $reply = &get_query_reply($queryid); |
|
return $reply; |
|
} |
|
|
# ------- Request retrieval of institutional classlists for course(s) |
# ------- Request retrieval of institutional classlists for course(s) |
|
|
sub fetch_enrollment_query { |
sub fetch_enrollment_query { |
Line 4386 sub fetch_enrollment_query {
|
Line 4510 sub fetch_enrollment_query {
|
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
&logthis('fetch_enrollment_query error: '.$reply.' for '.$dom.' '.$env{'user.name'}.' for '.$queryid.' context: '.$context.' '.$cnum.' maxtries: '.$maxtries.' tries: '.$tries); |
&logthis('fetch_enrollment_query error: '.$reply.' for '.$dom.' '.$env{'user.name'}.' for '.$queryid.' context: '.$context.' '.$cnum.' maxtries: '.$maxtries.' tries: '.$tries); |
} else { |
} else { |
my @responses = split/:/,$reply; |
my @responses = split(/:/,$reply); |
if ($homeserver eq $perlvar{'lonHostID'}) { |
if ($homeserver eq $perlvar{'lonHostID'}) { |
foreach my $line (@responses) { |
foreach my $line (@responses) { |
my ($key,$value) = split(/=/,$line,2); |
my ($key,$value) = split(/=/,$line,2); |
Line 4429 sub get_query_reply {
|
Line 4553 sub get_query_reply {
|
sleep 2; |
sleep 2; |
if (-e $replyfile.'.end') { |
if (-e $replyfile.'.end') { |
if (open(my $fh,$replyfile)) { |
if (open(my $fh,$replyfile)) { |
$reply.=<$fh>; |
$reply = join('',<$fh>); |
close($fh); |
close($fh); |
} else { return 'error: reply_file_error'; } |
} else { return 'error: reply_file_error'; } |
return &unescape($reply); |
return &unescape($reply); |
} |
} |
Line 4496 sub auto_get_sections {
|
Line 4620 sub auto_get_sections {
|
my @secs = (); |
my @secs = (); |
my $response=&unescape(&reply('autogetsections:'.$inst_coursecode.':'.$cdom,$homeserver)); |
my $response=&unescape(&reply('autogetsections:'.$inst_coursecode.':'.$cdom,$homeserver)); |
unless ($response eq 'refused') { |
unless ($response eq 'refused') { |
@secs = split/:/,$response; |
@secs = split(/:/,$response); |
} |
} |
return @secs; |
return @secs; |
} |
} |
Line 4535 sub auto_create_password {
|
Line 4659 sub auto_create_password {
|
if ($response eq 'refused') { |
if ($response eq 'refused') { |
$authchk = 'refused'; |
$authchk = 'refused'; |
} else { |
} else { |
($authparam,$create_passwd,$authchk) = split/:/,$response; |
($authparam,$create_passwd,$authchk) = split(/:/,$response); |
} |
} |
} |
} |
return ($authparam,$create_passwd,$authchk); |
return ($authparam,$create_passwd,$authchk); |
Line 4643 sub auto_instcode_format {
|
Line 4767 sub auto_instcode_format {
|
$response=&reply('autoinstcodeformat:'.$codedom.':'.$courses,$server); |
$response=&reply('autoinstcodeformat:'.$codedom.':'.$courses,$server); |
if ($response !~ /(con_lost|error|no_such_host|refused)/) { |
if ($response !~ /(con_lost|error|no_such_host|refused)/) { |
my ($codes_str,$codetitles_str,$cat_titles_str,$cat_order_str) = |
my ($codes_str,$codetitles_str,$cat_titles_str,$cat_order_str) = |
split/:/,$response; |
split(/:/,$response); |
%{$codes} = (%{$codes},&str2hash($codes_str)); |
%{$codes} = (%{$codes},&str2hash($codes_str)); |
push(@{$codetitles},&str2array($codetitles_str)); |
push(@{$codetitles},&str2array($codetitles_str)); |
%{$cat_titles} = (%{$cat_titles},&str2hash($cat_titles_str)); |
%{$cat_titles} = (%{$cat_titles},&str2hash($cat_titles_str)); |
Line 5023 sub modifyuser {
|
Line 5147 sub modifyuser {
|
} |
} |
# -------------------------------------------------------------- Add names, etc |
# -------------------------------------------------------------- Add names, etc |
my @tmp=&get('environment', |
my @tmp=&get('environment', |
['firstname','middlename','lastname','generation'], |
['firstname','middlename','lastname','generation','id', |
|
'permanentemail'], |
$udom,$uname); |
$udom,$uname); |
my %names; |
my %names; |
if ($tmp[0] =~ m/^error:.*/) { |
if ($tmp[0] =~ m/^error:.*/) { |
Line 5045 sub modifyuser {
|
Line 5170 sub modifyuser {
|
$names{'critnotification'} = $email; |
$names{'critnotification'} = $email; |
$names{'permanentemail'} = $email; } |
$names{'permanentemail'} = $email; } |
} |
} |
|
if ($uid) { $names{'id'} = $uid; } |
my $reply = &put('environment', \%names, $udom,$uname); |
my $reply = &put('environment', \%names, $udom,$uname); |
if ($reply ne 'ok') { return 'error: '.$reply; } |
if ($reply ne 'ok') { return 'error: '.$reply; } |
|
my $sqlresult = &update_allusers_table($uname,$udom,\%names); |
&devalidate_cache_new('namescache',$uname.':'.$udom); |
&devalidate_cache_new('namescache',$uname.':'.$udom); |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
$umode.', '.$first.', '.$middle.', '. |
$umode.', '.$first.', '.$middle.', '. |
Line 6190 sub EXT {
|
Line 6317 sub EXT {
|
my ($map) = &decode_symb($symbparm); |
my ($map) = &decode_symb($symbparm); |
return &symbread($map); |
return &symbread($map); |
} |
} |
|
if ($space eq 'filename') { |
|
if ($symbparm) { |
|
return &clutter((&decode_symb($symbparm))[2]); |
|
} |
|
return &hreflocation('',$env{'request.filename'}); |
|
} |
|
|
my ($section, $group, @groups); |
my ($section, $group, @groups); |
my ($courselevelm,$courselevel); |
my ($courselevelm,$courselevel); |
Line 7084 sub getCODE {
|
Line 7217 sub getCODE {
|
sub rndseed { |
sub rndseed { |
my ($symb,$courseid,$domain,$username)=@_; |
my ($symb,$courseid,$domain,$username)=@_; |
my ($wsymb,$wcourseid,$wdomain,$wusername)=&whichuser(); |
my ($wsymb,$wcourseid,$wdomain,$wusername)=&whichuser(); |
if (!$symb) { |
if (!defined($symb)) { |
unless ($symb=$wsymb) { return time; } |
unless ($symb=$wsymb) { return time; } |
} |
} |
if (!$courseid) { $courseid=$wcourseid; } |
if (!$courseid) { $courseid=$wcourseid; } |
Line 7870 sub get_dns {
|
Line 8003 sub get_dns {
|
} |
} |
|
|
sub reset_hosts_info { |
sub reset_hosts_info { |
|
&purge_remembered(); |
&reset_domain_info(); |
&reset_domain_info(); |
&reset_hosts_ip_info(); |
&reset_hosts_ip_info(); |
|
undef(%name_to_host); |
undef(%hostname); |
undef(%hostname); |
undef(%hostdom); |
undef(%hostdom); |
undef(%libserv); |
undef(%libserv); |
Line 7963 sub get_dns {
|
Line 8098 sub get_dns {
|
my %name_to_ip; |
my %name_to_ip; |
my %lonid_to_ip; |
my %lonid_to_ip; |
|
|
my %valid_ip; |
|
sub valid_ip { |
|
my ($ip) = @_; |
|
if (exists($iphost{$ip}) || exists($valid_ip{$ip})) { |
|
return 1; |
|
} |
|
my $name = gethostbyip($ip); |
|
my $lonid = &hostname($name); |
|
if (defined($lonid)) { |
|
$valid_ip{$ip} = $lonid; |
|
return 1; |
|
} |
|
my %iphosts = &get_iphost(); |
|
if (ref($iphost{$ip})) { |
|
return 1; |
|
} |
|
} |
|
|
|
sub get_hosts_from_ip { |
sub get_hosts_from_ip { |
my ($ip) = @_; |
my ($ip) = @_; |
my %iphosts = &get_iphost(); |
my %iphosts = &get_iphost(); |
Line 8012 sub get_dns {
|
Line 8129 sub get_dns {
|
|
|
sub get_iphost { |
sub get_iphost { |
my ($ignore_cache) = @_; |
my ($ignore_cache) = @_; |
|
|
if (!$ignore_cache) { |
if (!$ignore_cache) { |
if (%iphost) { |
if (%iphost) { |
return %iphost; |
return %iphost; |
Line 8025 sub get_dns {
|
Line 8143 sub get_dns {
|
return %iphost; |
return %iphost; |
} |
} |
} |
} |
|
|
|
# get yesterday's info for fallback |
|
my %old_name_to_ip; |
|
my ($ip_info,$cached)= |
|
&Apache::lonnet::is_cached_new('iphost','iphost'); |
|
if ($cached) { |
|
%old_name_to_ip = %{$ip_info->[1]}; |
|
} |
|
|
my %name_to_host = &all_names(); |
my %name_to_host = &all_names(); |
foreach my $name (keys(%name_to_host)) { |
foreach my $name (keys(%name_to_host)) { |
my $ip; |
my $ip; |
if (!exists($name_to_ip{$name})) { |
if (!exists($name_to_ip{$name})) { |
$ip = gethostbyname($name); |
$ip = gethostbyname($name); |
if (!$ip || length($ip) ne 4) { |
if (!$ip || length($ip) ne 4) { |
&logthis("Skipping name $name no IP found"); |
if (defined($old_name_to_ip{$name})) { |
next; |
$ip = $old_name_to_ip{$name}; |
|
&logthis("Can't find $name defaulting to old $ip"); |
|
} else { |
|
&logthis("Name $name no IP found"); |
|
next; |
|
} |
|
} else { |
|
$ip=inet_ntoa($ip); |
} |
} |
$ip=inet_ntoa($ip); |
|
$name_to_ip{$name} = $ip; |
$name_to_ip{$name} = $ip; |
} else { |
} else { |
$ip = $name_to_ip{$name}; |
$ip = $name_to_ip{$name}; |
Line 8046 sub get_dns {
|
Line 8179 sub get_dns {
|
} |
} |
&Apache::lonnet::do_cache_new('iphost','iphost', |
&Apache::lonnet::do_cache_new('iphost','iphost', |
[\%iphost,\%name_to_ip,\%lonid_to_ip], |
[\%iphost,\%name_to_ip,\%lonid_to_ip], |
24*60*60); |
48*60*60); |
|
|
return %iphost; |
return %iphost; |
} |
} |
Line 8435 explanation of a user role term
|
Line 8568 explanation of a user role term
|
get_my_roles($uname,$udom,$context,$types,$roles,$roledoms) : |
get_my_roles($uname,$udom,$context,$types,$roles,$roledoms) : |
All arguments are optional. Returns a hash of a roles, either for |
All arguments are optional. Returns a hash of a roles, either for |
co-author/assistant author roles for a user's Construction Space |
co-author/assistant author roles for a user's Construction Space |
(default), or if $context is 'user', roles for the user himself, |
(default), or if $context is 'userroles', roles for the user himself, |
In the hash, keys are set to colon-sparated $uname,$udom,and $role, |
In the hash, keys are set to colon-sparated $uname,$udom,and $role, |
and value is set to colon-separated start and end times for the role. |
and value is set to colon-separated start and end times for the role. |
If no username and domain are specified, will default to current |
If no username and domain are specified, will default to current |