--- loncom/lonnet/perl/lonnet.pm 2009/08/15 00:25:53 1.1017 +++ loncom/lonnet/perl/lonnet.pm 2009/09/13 03:13:38 1.1027 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1017 2009/08/15 00:25:53 raeburn Exp $ +# $Id: lonnet.pm,v 1.1027 2009/09/13 03:13:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -92,6 +92,7 @@ use Time::HiRes qw( gettimeofday tv_inte use Cache::Memcached; use Digest::MD5; use Math::Random; +use File::MMagic; use LONCAPA qw(:DEFAULT :match); use LONCAPA::Configuration; @@ -958,44 +959,21 @@ sub idput { } } -# ------------------------------------------------ dump from domain db files - +# ------------------------------dump from db file owned by domainconfig user sub dump_dom { - my ($namespace,$udom,$uhome,$regexp,$range)=@_; + my ($namespace,$udom,$regexp,$range)=@_; if (!$udom) { $udom=$env{'user.domain'}; - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } else { - undef($uhome); - } - } else { - if (!$uhome) { - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } - } } my %returnhash; - if ($udom && $uhome && ($uhome ne 'no_host')) { - if ($regexp) { - $regexp=&escape($regexp); - } else { - $regexp='.'; - } - my $rep=&reply("dumpdom:$udom:$namespace:$regexp:$range",$uhome); - my @pairs=split(/\&/,$rep); - foreach my $item (@pairs) { - my ($key,$value)=split(/=/,$item,2); - $key = &unescape($key); - next if ($key =~ /^error: 2 /); - $returnhash{$key}=&thaw_unescape($value); - } + if ($udom) { + my $uname = &get_domainconfiguser($udom); + %returnhash = &dump($namespace,$udom,$uname,$regexp,$range); } return %returnhash; } -# ------------------------------------------- get items from domain db files +# ------------------------------------------ get items from domain db files sub get_dom { my ($namespace,$storearr,$udom,$uhome)=@_; @@ -1069,70 +1047,40 @@ sub put_dom { } } -# -------------------------------------- newput for items in domain db files - +# --------------------- newput for items in db file owned by domainconfig user sub newput_dom { - my ($namespace,$storehash,$udom,$uhome) = @_; + my ($namespace,$storehash,$udom) = @_; my $result; if (!$udom) { $udom=$env{'user.domain'}; - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } else { - undef($uhome); - } - } else { - if (!$uhome) { - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } - } } - if ($udom && $uhome && ($uhome ne 'no_host')) { - my $items=''; - if (ref($storehash) eq 'HASH') { - foreach my $key (keys(%$storehash)) { - $items.=&escape($key).'='.&freeze_escape($$storehash{$key}).'&'; - } - $items=~s/\&$//; - $result = &reply("newputdom:$udom:$namespace:$items",$uhome); - } - } else { - &logthis("put_dom failed - no homeserver and/or domain"); + if ($udom) { + my $uname = &get_domainconfiguser($udom); + $result = &newput($namespace,$storehash,$udom,$uname); } return $result; } +# --------------------- delete for items in db file owned by domainconfig user sub del_dom { - my ($namespace,$storearr,$udom,$uhome)=@_; + my ($namespace,$storearr,$udom)=@_; if (ref($storearr) eq 'ARRAY') { - my $items=''; - foreach my $item (@$storearr) { - $items.=&escape($item).'&'; - } - $items=~s/\&$//; if (!$udom) { $udom=$env{'user.domain'}; - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } else { - undef($uhome); - } - } else { - if (!$uhome) { - if (defined(&domain($udom,'primary'))) { - $uhome=&domain($udom,'primary'); - } - } } - if ($udom && $uhome && ($uhome ne 'no_host')) { - return &reply("deldom:$udom:$namespace:$items",$uhome); - } else { - &logthis("del_dom failed - no homeserver and/or domain"); + if ($udom) { + my $uname = &get_domainconfiguser($udom); + return &del($namespace,$storearr,$udom,$uname); } } } +# ----------------------------------construct domainconfig user for a domain +sub get_domainconfiguser { + my ($udom) = @_; + return $udom.'-domainconfig'; +} + sub retrieve_inst_usertypes { my ($udom) = @_; my (%returnhash,@order); @@ -2112,9 +2060,13 @@ sub process_coursefile { print $fh $env{'form.'.$source}; close($fh); if ($parser eq 'parse') { - my $parse_result = &extract_embedded_items($filepath.'/'.$fname,$allfiles,$codebase); - unless ($parse_result eq 'ok') { - &logthis('Failed to parse '.$filepath.'/'.$fname.' for embedded media: '.$parse_result); + my $mm = new File::MMagic; + my $mime_type = $mm->checktype_filename($filepath.'/'.$fname); + if ($mime_type eq 'text/html') { + my $parse_result = &extract_embedded_items($filepath.'/'.$fname,$allfiles,$codebase); + unless ($parse_result eq 'ok') { + &logthis('Failed to parse '.$filepath.'/'.$fname.' for embedded media: '.$parse_result); + } } } $fetchresult= &reply('fetchuserfile:'.$docudom.'/'.$docuname.'/'.$file, @@ -2356,11 +2308,15 @@ sub finishuserfileupload { } } if ($parser eq 'parse') { - my $parse_result = &extract_embedded_items($filepath.'/'.$file,$allfiles, - $codebase); - unless ($parse_result eq 'ok') { - &logthis('Failed to parse '.$filepath.$file. - ' for embedded media: '.$parse_result); + my $mm = new File::MMagic; + my $mime_type = $mm->checktype_filename($filepath.'/'.$file); + if ($mime_type eq 'text/html') { + my $parse_result = &extract_embedded_items($filepath.'/'.$file, + $allfiles,$codebase); + unless ($parse_result eq 'ok') { + &logthis('Failed to parse '.$filepath.$file. + ' for embedded media: '.$parse_result); + } } } if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { @@ -3146,10 +3102,10 @@ sub dcmaildump { sub get_domain_roles { my ($dom,$roles,$startdate,$enddate)=@_; - if (undef($startdate) || $startdate eq '') { + if ((!defined($startdate)) || ($startdate eq '')) { $startdate = '.'; } - if (undef($enddate) || $enddate eq '') { + if ((!defined($enddate)) || ($enddate eq '')) { $enddate = '.'; } my $rolelist; @@ -4772,7 +4728,7 @@ sub usertools_access { $toolstatus = $env{'environment.'.$context.'.'.$tool}; $inststatus = $env{'environment.inststatus'}; } else { - my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool); + my %userenv = &userenvironment($udom,$uname,$context.'.'.$tool,'inststatus'); $toolstatus = $userenv{$context.'.'.$tool}; $inststatus = $userenv{'inststatus'}; } @@ -5657,7 +5613,8 @@ sub auto_validate_instcode { } my $response=&unescape(&reply('autovalidateinstcode:'.$cdom.':'. &escape($instcode).':'.&escape($owner),$homeserver)); - return $response; + my ($outcome,$description) = map { &unescape($_); } split('&',$response,2); + return ($outcome,$description); } sub auto_create_password { @@ -5774,6 +5731,13 @@ sub auto_instcode_format { push(@homeservers,$tryserver); } } + } elsif ($caller eq 'requests') { + if ($codedom =~ /^$match_domain$/) { + my $chome = &domain($codedom,'primary'); + unless ($chome eq 'no_host') { + push(@homeservers,$chome); + } + } } else { push(@homeservers,&homeserver($caller,$codedom)); } @@ -5874,13 +5838,37 @@ sub auto_possible_instcodes { sub auto_courserequest_checks { my ($dom) = @_; - my %validations; + my ($homeserver,%validations); + if ($dom =~ /^$match_domain$/) { + $homeserver = &domain($dom,'primary'); + } + unless ($homeserver eq 'no_host') { + my $response=&reply('autocrsreqchecks:'.$dom,$homeserver); + unless ($response =~ /(con_lost|error|no_such_host|refused)/) { + my @items = split(/&/,$response); + foreach my $item (@items) { + my ($key,$value) = split('=',$item); + $validations{&unescape($key)} = &thaw_unescape($value); + } + } + } return %validations; } sub auto_courserequest_validation { - my ($dom,$details,$inststatuses,$message) = @_; - return 'pending'; + my ($dom,$owner,$crstype,$inststatuslist,$instcode,$instseclist) = @_; + my ($homeserver,$response); + if ($dom =~ /^$match_domain$/) { + $homeserver = &domain($dom,'primary'); + } + unless ($homeserver eq 'no_host') { + + $response=&unescape(&reply('autocrsreqvalidation:'.$dom.':'.&escape($owner). + ':'.&escape($crstype).':'.&escape($inststatuslist). + ':'.&escape($instcode).':'.&escape($instseclist), + $homeserver)); + } + return $response; } sub auto_validate_class_sec { @@ -6071,10 +6059,27 @@ sub assignrole { my $cwosec=$url; $cwosec=~s/^\/($match_domain)\/($match_courseid)\/.*/$1\/$2/; unless (&allowed('ccr',$cwosec)) { - &logthis('Refused custom assignrole: '. - $udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start.' by '. - $env{'user.name'}.' at '.$env{'user.domain'}); - return 'refused'; + my $refused = 1; + if ($context eq 'requestcourses') { + if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) { + if ($role =~ m{^cr/($match_domain)/($match_username)/([^/]+)$}) { + if (($1 eq $env{'user.domain'}) && ($2 eq $env{'user.name'})) { + my ($cdom,$cnum) = ($cwosec =~ m{^/?($match_domain)/($match_courseid)$}); + my %crsenv = &userenvironment($cdom,$cnum,('internal.courseowner')); + if ($crsenv{'internal.courseowner'} eq + $env{'user.name'}.':'.$env{'user.domain'}) { + $refused = ''; + } + } + } + } + } + if ($refused) { + &logthis('Refused custom assignrole: '. + $udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start. + ' by '.$env{'user.name'}.' at '.$env{'user.domain'}); + return 'refused'; + } } $mrole='cr'; } elsif ($role =~ /^gr\//) { @@ -6103,8 +6108,9 @@ sub assignrole { if (($selfenroll == 1) && ($role eq 'st') && ($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { $refused = ''; } elsif ($context eq 'requestcourses') { - if (($role eq 'cc') && ($env{'user.name'} ne '' && $env{'user.domain'} ne '')) { - my ($cdom,$cnum) = ($cwosec =~ m{^/($match_domain)/($match_courseid)$}); + my @possroles = ('st','ta','ep','in','cc'); + if ((grep(/^\Q$role\E$/,@possroles)) && ($env{'user.name'} ne '' && $env{'user.domain'} ne '')) { + my ($cdom,$cnum) = ($cwosec =~ m{^/?($match_domain)/($match_courseid)$}); my %crsenv = &userenvironment($cdom,$cnum,('internal.courseowner')); if ($crsenv{'internal.courseowner'} eq $env{'user.name'}.':'.$env{'user.domain'}) {