version 1.909, 2007/08/31 12:33:29
|
version 1.917, 2007/10/01 23:53:44
|
Line 320 sub convert_and_load_session_env {
|
Line 320 sub convert_and_load_session_env {
|
my ($lonidsdir,$handle)=@_; |
my ($lonidsdir,$handle)=@_; |
my @profile; |
my @profile; |
{ |
{ |
open(my $idf,"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
if (!$opened) { |
|
return 0; |
|
} |
flock($idf,LOCK_SH); |
flock($idf,LOCK_SH); |
@profile=<$idf>; |
@profile=<$idf>; |
close($idf); |
close($idf); |
Line 359 sub transfer_profile_to_env {
|
Line 362 sub transfer_profile_to_env {
|
|
|
my $convert; |
my $convert; |
{ |
{ |
open(my $idf,"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
if (!$opened) { |
|
return; |
|
} |
flock($idf,LOCK_SH); |
flock($idf,LOCK_SH); |
if (tie(my %disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
if (tie(my %disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
Line 391 sub transfer_profile_to_env {
|
Line 397 sub transfer_profile_to_env {
|
} |
} |
} |
} |
|
|
|
# ---------------------------------------------------- Check for valid session |
|
sub check_for_valid_session { |
|
my ($r) = @_; |
|
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
|
my $lonid=$cookies{'lonID'}; |
|
return undef if (!$lonid); |
|
|
|
my $handle=&LONCAPA::clean_handle($lonid->value); |
|
my $lonidsdir=$r->dir_config('lonIDsDir'); |
|
return undef if (!-e "$lonidsdir/$handle.id"); |
|
|
|
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
return undef if (!$opened); |
|
|
|
flock($idf,LOCK_SH); |
|
my %disk_env; |
|
if (!tie(%disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
|
&GDBM_READER(),0640)) { |
|
return undef; |
|
} |
|
|
|
if (!defined($disk_env{'user.name'}) |
|
|| !defined($disk_env{'user.domain'})) { |
|
return undef; |
|
} |
|
return $handle; |
|
} |
|
|
sub timed_flock { |
sub timed_flock { |
my ($file,$lock_type) = @_; |
my ($file,$lock_type) = @_; |
my $failed=0; |
my $failed=0; |
Line 425 sub appenv {
|
Line 459 sub appenv {
|
$env{$key}=$newenv{$key}; |
$env{$key}=$newenv{$key}; |
} |
} |
} |
} |
open(my $env_file,$env{'user.environment'}); |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
if (&timed_flock($env_file,LOCK_EX) |
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
&& |
&& |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
Line 446 sub delenv {
|
Line 481 sub delenv {
|
"Attempt to delete from environment ".$delthis); |
"Attempt to delete from environment ".$delthis); |
return 'error'; |
return 'error'; |
} |
} |
open(my $env_file,$env{'user.environment'}); |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
if (&timed_flock($env_file,LOCK_EX) |
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
&& |
&& |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
foreach my $key (keys(%disk_env)) { |
foreach my $key (keys(%disk_env)) { |
if ($key=~/^$delthis/) { |
if ($key=~/^$delthis/) { |
delete($env{$key}); |
delete($env{$key}); |
delete($disk_env{$key}); |
delete($disk_env{$key}); |
} |
} |
} |
} |
untie(%disk_env); |
untie(%disk_env); |
} |
} |
Line 582 sub compare_server_load {
|
Line 618 sub compare_server_load {
|
} |
} |
return ($spare_server,$lowest_load); |
return ($spare_server,$lowest_load); |
} |
} |
|
|
|
# --------------------------- ask offload servers if user already has a session |
|
sub find_existing_session { |
|
my ($udom,$uname) = @_; |
|
foreach my $try_server (@{ $spareid{'primary'} }, |
|
@{ $spareid{'default'} }) { |
|
return $try_server if (&has_user_session($try_server, $udom, $uname)); |
|
} |
|
return; |
|
} |
|
|
|
# -------------------------------- ask if server already has a session for user |
|
sub has_user_session { |
|
my ($lonid,$udom,$uname) = @_; |
|
my $result = &reply(join(':','userhassession', |
|
map {&escape($_)} ($udom,$uname)),$lonid); |
|
return 1 if ($result eq 'ok'); |
|
|
|
return 0; |
|
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
|
|
sub changepass { |
sub changepass { |
Line 906 sub usersearch {
|
Line 963 sub usersearch {
|
if (&host_domain($tryserver) eq $dom) { |
if (&host_domain($tryserver) eq $dom) { |
my $host=&hostname($tryserver); |
my $host=&hostname($tryserver); |
my $queryid= |
my $queryid= |
&reply("querysend:".&escape($query).':'.&escape($dom).':'. |
&reply("querysend:".&escape($query).':'. |
&escape($srch->{'srchby'}).'%%'. |
&escape($srch->{'srchby'}).':'. |
&escape($srch->{'srchtype'}).':'. |
&escape($srch->{'srchtype'}).':'. |
&escape($srch->{'srchterm'}),$tryserver); |
&escape($srch->{'srchterm'}),$tryserver); |
if ($queryid !~/^\Q$host\E\_/) { |
if ($queryid !~/^\Q$host\E\_/) { |
Line 924 sub usersearch {
|
Line 981 sub usersearch {
|
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
&logthis('usersrch error: '.$reply.' for '.$dom.' - searching for : '.$srch->{'srchterm'}.' by '.$srch->{'srchby'}.' ('.$srch->{'srchtype'}.') - maxtries: '.$maxtries.' tries: '.$tries); |
&logthis('usersrch error: '.$reply.' for '.$dom.' - searching for : '.$srch->{'srchterm'}.' by '.$srch->{'srchby'}.' ('.$srch->{'srchtype'}.') - maxtries: '.$maxtries.' tries: '.$tries); |
} else { |
} else { |
my @matches = split(/&/,$reply); |
my @matches; |
|
if ($reply =~ /\n/) { |
|
@matches = split(/\n/,$reply); |
|
} else { |
|
@matches = split(/\&/,$reply); |
|
} |
foreach my $match (@matches) { |
foreach my $match (@matches) { |
my @items = split(/:/,$match); |
|
my ($uname,$udom,%userhash); |
my ($uname,$udom,%userhash); |
foreach my $entry (@items) { |
foreach my $entry (split(/:/,$match)) { |
my ($key,$value) = split(/=/,$entry); |
my ($key,$value) = |
$key = &unescape($key); |
map {&unescape($_);} split(/=/,$entry); |
$value = &unescape($value); |
|
$userhash{$key} = $value; |
$userhash{$key} = $value; |
if ($key eq 'username') { |
if ($key eq 'username') { |
$uname = $value; |
$uname = $value; |
} elsif ($key eq 'domain') { |
} elsif ($key eq 'domain') { |
$udom = $value; |
$udom = $value; |
} |
} |
} |
} |
$results{$uname.':'.$udom} = \%userhash; |
$results{$uname.':'.$udom} = \%userhash; |
} |
} |
Line 947 sub usersearch {
|
Line 1007 sub usersearch {
|
return %results; |
return %results; |
} |
} |
|
|
|
sub get_instuser { |
|
my ($udom,$uname,$id) = @_; |
|
my $homeserver = &domain($udom,'primary'); |
|
my ($outcome,%results); |
|
if ($homeserver ne '') { |
|
my $queryid=&reply("querysend:getinstuser:".&escape($uname).':'. |
|
&escape($id).':'.&escape($udom),$homeserver); |
|
my $host=&hostname($homeserver); |
|
if ($queryid !~/^\Q$host\E\_/) { |
|
&logthis('get_instuser 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') { |
|
if ($response eq 'unavailable') { |
|
$outcome = $response; |
|
} else { |
|
$outcome = 'ok'; |
|
my @matches = split(/\n/,$response); |
|
foreach my $match (@matches) { |
|
my ($key,$value) = split(/=/,$match); |
|
$results{&unescape($key)} = &thaw_unescape($value); |
|
} |
|
} |
|
} |
|
} |
|
my %userinfo; |
|
if (ref($results{$uname}) eq 'HASH') { |
|
%userinfo = %{$results{$uname}}; |
|
} |
|
return ($outcome,%userinfo); |
|
} |
|
|
|
sub inst_rulecheck { |
|
my ($udom,$uname,$rules) = @_; |
|
my %returnhash; |
|
if ($udom ne '') { |
|
if (ref($rules) eq 'ARRAY') { |
|
@{$rules} = map {&escape($_);} (@{$rules}); |
|
my $rulestr = join(':',@{$rules}); |
|
my $homeserver=&domain($udom,'primary'); |
|
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
|
my $response=&unescape(&reply('instrulecheck:'.&escape($udom).':'. |
|
&escape($uname).':'.$rulestr, |
|
$homeserver)); |
|
if ($response ne 'refused') { |
|
my @pairs=split(/\&/,$response); |
|
foreach my $item (@pairs) { |
|
my ($key,$value)=split(/=/,$item,2); |
|
$key = &unescape($key); |
|
next if ($key =~ /^error: 2 /); |
|
$returnhash{$key}=&thaw_unescape($value); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return %returnhash; |
|
} |
|
|
|
sub inst_userrules { |
|
my ($udom) = @_; |
|
my (%ruleshash,@ruleorder); |
|
if ($udom ne '') { |
|
my $homeserver=&domain($udom,'primary'); |
|
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
|
my $response=&reply('instuserrules:'.&escape($udom), |
|
$homeserver); |
|
if (($response ne 'refused') && ($response ne 'error') && |
|
($response ne 'no_such_host')) { |
|
my ($hashitems,$orderitems) = split(/:/,$response); |
|
my @pairs=split(/\&/,$hashitems); |
|
foreach my $item (@pairs) { |
|
my ($key,$value)=split(/=/,$item,2); |
|
$key = &unescape($key); |
|
next if ($key =~ /^error: 2 /); |
|
$ruleshash{$key}=&thaw_unescape($value); |
|
} |
|
my @esc_order = split(/\&/,$orderitems); |
|
foreach my $item (@esc_order) { |
|
push(@ruleorder,&unescape($item)); |
|
} |
|
} |
|
} |
|
} |
|
return (\%ruleshash,\@ruleorder); |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 1223 sub do_cache_new {
|
Line 1377 sub do_cache_new {
|
$time=600; |
$time=600; |
} |
} |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
if (!($memcache->set($id,$setvalue,$time))) { |
my $result = $memcache->set($id,$setvalue,$time); |
|
if (! $result) { |
&logthis("caching of id -> $id failed"); |
&logthis("caching of id -> $id failed"); |
|
$memcache->disconnect_all(); |
} |
} |
# need to make a copy of $value |
# need to make a copy of $value |
#&make_room($id,$value,$debug); |
#&make_room($id,$value,$debug); |
Line 7733 sub hreflocation {
|
Line 7889 sub hreflocation {
|
$file=~s-^/home/httpd/lonUsers/($match_domain)/./././($match_name)/userfiles/ |
$file=~s-^/home/httpd/lonUsers/($match_domain)/./././($match_name)/userfiles/ |
-/uploaded/$1/$2/-x; |
-/uploaded/$1/$2/-x; |
} |
} |
|
if ($file=~ m{^/userfiles/}) { |
|
$file =~ s{^/userfiles/}{/uploaded/}; |
|
} |
return $file; |
return $file; |
} |
} |
|
|