version 1.76, 2006/02/10 09:51:27
|
version 1.80, 2007/04/03 17:51:45
|
Line 102 the database.
|
Line 102 the database.
|
use strict; |
use strict; |
|
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
use LONCAPA::lonmetadata(); |
use LONCAPA::lonmetadata(); |
|
|
Line 116 use Tie::RefHash;
|
Line 117 use Tie::RefHash;
|
use DBI; |
use DBI; |
use File::Find; |
use File::Find; |
use localenroll; |
use localenroll; |
|
use GDBM_File; |
|
use Storable qw(thaw); |
|
|
######################################################## |
######################################################## |
######################################################## |
######################################################## |
Line 422 sub make_new_child {
|
Line 425 sub make_new_child {
|
} else { |
} else { |
$result=&courselog($path,$command); |
$result=&courselog($path,$command); |
} |
} |
|
$result = &escape($result); |
} else { |
} else { |
&logthis('Unable to do log query: '.$uname.'@'.$udom); |
&logthis('Unable to do log query: '.$uname.'@'.$udom); |
$result='no_such_file'; |
$result='no_such_file'; |
Line 470 sub make_new_child {
|
Line 474 sub make_new_child {
|
} else { |
} else { |
$result = 'success'; |
$result = 'success'; |
} |
} |
|
} elsif (($query eq 'portfolio_metadata') || |
|
($query eq 'portfolio_access')) { |
|
$result = &portfolio_table_update($query,$arg1,$arg2, |
|
$arg3); |
} else { |
} else { |
# Do an sql query |
# Do an sql query |
$result = &do_sql_query($query,$arg1,$arg2,$searchdomain); |
$result = &do_sql_query($query,$arg1,$arg2,$searchdomain); |
Line 631 sub do_sql_query {
|
Line 639 sub do_sql_query {
|
} # End of &do_sql_query |
} # End of &do_sql_query |
|
|
} # End of scoping curly braces for &process_file and &do_sql_query |
} # End of scoping curly braces for &process_file and &do_sql_query |
|
|
|
sub portfolio_table_update { |
|
my ($query,$arg1,$arg2,$arg3) = @_; |
|
my %tablenames = ( |
|
'portfolio' => 'portfolio_metadata', |
|
'access' => 'portfolio_access', |
|
'addedfields' => 'portfolio_addedfields', |
|
); |
|
my $result = 'ok'; |
|
my $tablechk = &check_table($query); |
|
if ($tablechk == 0) { |
|
my $request = |
|
&LONCAPA::lonmetadata::create_metadata_storage($query,$query); |
|
$dbh->do($request); |
|
if ($dbh->err) { |
|
&logthis("create $query". |
|
" ERROR: ".$dbh->errstr); |
|
$result = 'error'; |
|
} |
|
} |
|
if ($result eq 'ok') { |
|
my ($uname,$udom,$group) = split(/:/,&unescape($arg1)); |
|
my $file_name = &unescape($arg2); |
|
my $action = $arg3; |
|
my $is_course = 0; |
|
if ($group ne '') { |
|
$is_course = 1; |
|
} |
|
my $urlstart = '/uploaded/'.$udom.'/'.$uname; |
|
my $pathstart = &propath($udom,$uname).'/userfiles'; |
|
my ($fullpath,$url); |
|
if ($is_course) { |
|
$fullpath = $pathstart.'/groups/'.$group.'/portfolio'. |
|
$file_name; |
|
$url = $urlstart.'/groups/'.$group.'/portfolio'.$file_name; |
|
} else { |
|
$fullpath = $pathstart.'/portfolio'.$file_name; |
|
$url = $urlstart.'/portfolio'.$file_name; |
|
} |
|
if ($query eq 'portfolio_metadata') { |
|
if ($action eq 'delete') { |
|
my %loghash = &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef,\%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group,'update'); |
|
} elsif (-e $fullpath.'.meta') { |
|
my %loghash = &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef,\%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group,'update'); |
|
if (keys(%loghash) > 0) { |
|
&portfolio_logging(%loghash); |
|
} |
|
} |
|
} elsif ($query eq 'portfolio_access') { |
|
my %access = &get_access_hash($uname,$udom,$group.$file_name); |
|
my %loghash = |
|
&LONCAPA::lonmetadata::process_portfolio_access_data($dbh,undef, |
|
\%tablenames,$url,$fullpath,\%access,'update'); |
|
if (keys(%loghash) > 0) { |
|
&portfolio_logging(%loghash); |
|
} else { |
|
my $available = 0; |
|
foreach my $key (keys(%access)) { |
|
my ($num,$scope,$end,$start) = |
|
($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); |
|
if ($scope eq 'public' || $scope eq 'guest') { |
|
$available = 1; |
|
last; |
|
} |
|
} |
|
if ($available) { |
|
# Retrieve current values |
|
my $condition = 'url='.$dbh->quote("$url"); |
|
my ($error,$row) = |
|
&LONCAPA::lonmetadata::lookup_metadata($dbh,$condition,undef, |
|
'portfolio_metadata'); |
|
if (!$error) { |
|
if (!(ref($row->[0]) eq 'ARRAY')) { |
|
my %loghash = |
|
&LONCAPA::lonmetadata::process_portfolio_metadata($dbh,undef, |
|
\%tablenames,$url,$fullpath,$is_course,$udom,$uname,$group); |
|
if (keys(%loghash) > 0) { |
|
&portfolio_logging(%loghash); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub get_access_hash { |
|
my ($uname,$udom,$file) = @_; |
|
my $hashref = &tie_user_hash($udom,$uname,'file_permissions', |
|
&GDBM_READER()); |
|
my %curr_perms; |
|
my %access; |
|
if ($hashref) { |
|
while (my ($key,$value) = each(%$hashref)) { |
|
$key = &unescape($key); |
|
next if ($key =~ /^error: 2 /); |
|
$curr_perms{$key}=&thaw_unescape($value); |
|
} |
|
if (!&untie_user_hash($hashref)) { |
|
&logthis("error: ".($!+0)." untie (GDBM) Failed"); |
|
} |
|
} else { |
|
&logthis("error: ".($!+0)." tie (GDBM) Failed"); |
|
} |
|
if (keys(%curr_perms) > 0) { |
|
if (ref($curr_perms{$file."\0".'accesscontrol'}) eq 'HASH') { |
|
foreach my $acl (keys(%{$curr_perms{$file."\0".'accesscontrol'}})) { |
|
$access{$acl} = $curr_perms{$file."\0".$acl}; |
|
} |
|
} |
|
} |
|
return %access; |
|
} |
|
|
|
sub thaw_unescape { |
|
my ($value)=@_; |
|
if ($value =~ /^__FROZEN__/) { |
|
substr($value,0,10,undef); |
|
$value=&unescape($value); |
|
return &thaw($value); |
|
} |
|
return &unescape($value); |
|
} |
|
|
|
########################################### |
|
sub check_table { |
|
my ($table_id) = @_; |
|
my $sth=$dbh->prepare('SHOW TABLES'); |
|
$sth->execute(); |
|
my $aref = $sth->fetchall_arrayref; |
|
$sth->finish(); |
|
if ($sth->err()) { |
|
&logthis("fetchall_arrayref after SHOW TABLES". |
|
" ERROR: ".$sth->errstr); |
|
return undef; |
|
} |
|
my $result = 0; |
|
foreach my $table (@{$aref}) { |
|
if ($table->[0] eq $table_id) { |
|
$result = 1; |
|
last; |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
########################################### |
|
|
|
sub portfolio_logging { |
|
my (%portlog) = @_; |
|
foreach my $key (keys(%portlog)) { |
|
if (ref($portlog{$key}) eq 'HASH') { |
|
foreach my $item (keys(%{$portlog{$key}})) { |
|
&logthis($portlog{$key}{$item}); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
######################################################## |
######################################################## |
######################################################## |
######################################################## |
|
|
Line 728 sub reply {
|
Line 898 sub reply {
|
|
|
=pod |
=pod |
|
|
=item &escape |
|
|
|
Escape special characters in a string. |
|
|
|
Inputs: string to escape |
|
|
|
Returns: The input string with special characters escaped. |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
|
sub escape { |
|
my $str=shift; |
|
$str =~ s/(\W)/"%".unpack('H2',$1)/eg; |
|
return $str; |
|
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item &unescape |
|
|
|
Unescape special characters in a string. |
|
|
|
Inputs: string to unescape |
|
|
|
Returns: The input string with special characters unescaped. |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
|
sub unescape { |
|
my $str=shift; |
|
$str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
|
return $str; |
|
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item &ishome |
=item &ishome |
|
|
Determine if the current machine is the home server for a user. |
Determine if the current machine is the home server for a user. |
Line 928 sub userlog {
|
Line 1052 sub userlog {
|
{ $include=0; } |
{ $include=0; } |
if (($filters{'end'}) && ($timestamp>$filters{'end'})) |
if (($filters{'end'}) && ($timestamp>$filters{'end'})) |
{ $include=0; } |
{ $include=0; } |
|
if (($filters{'action'} eq 'Role') && ($log !~/^Role/)) |
|
{ $include=0; } |
if (($filters{'action'} eq 'log') && ($log!~/^Log/)) { $include=0; } |
if (($filters{'action'} eq 'log') && ($log!~/^Log/)) { $include=0; } |
if (($filters{'action'} eq 'check') && ($log!~/^Check/)) |
if (($filters{'action'} eq 'check') && ($log!~/^Check/)) |
{ $include=0; } |
{ $include=0; } |
if ($include) { |
if ($include) { |
push(@results,$timestamp.':'.$log); |
push(@results,$timestamp.':'.$host.':'.&escape($log)); |
} |
} |
} |
} |
close IN; |
close IN; |