--- loncom/lonnet/perl/lonnet.pm	2004/06/08 22:09:44	1.506
+++ loncom/lonnet/perl/lonnet.pm	2004/06/29 14:56:32	1.516
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.506 2004/06/08 22:09:44 raeburn Exp $
+# $Id: lonnet.pm,v 1.516 2004/06/29 14:56:32 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,7 +38,7 @@ use vars
 qw(%perlvar %hostname %homecache %badServerCache %hostip %iphost %spareid %hostdom 
    %libserv %pr %prp %metacache %packagetab %titlecache %courseresversioncache %resversioncache
    %courselogs %accesshash %userrolehash $processmarker $dumpcount 
-   %coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseresdatacache 
+   %coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseresdatacache 
    %userresdatacache %usectioncache %domaindescription %domain_auth_def %domain_auth_arg_def 
    %domain_lang_def %domain_city %domain_longi %domain_lati $tmpdir);
 
@@ -1395,10 +1395,12 @@ sub flushcourselogs {
         }
         if ($courseidbuffer{$coursehombuf{$crsid}}) {
            $courseidbuffer{$coursehombuf{$crsid}}.='&'.
-			 &escape($crsid).'='.&escape($coursedescrbuf{$crsid});
+			 &escape($crsid).'='.&escape($coursedescrbuf{$crsid}).
+                         '='.&escape($courseinstcodebuf{$crsid});
         } else {
            $courseidbuffer{$coursehombuf{$crsid}}=
-			 &escape($crsid).'='.&escape($coursedescrbuf{$crsid});
+			 &escape($crsid).'='.&escape($coursedescrbuf{$crsid}).
+                         '='.&escape($courseinstcodebuf{$crsid});
         }    
     }
 #
@@ -1472,6 +1474,8 @@ sub courselog {
        $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
     $coursedescrbuf{$ENV{'request.course.id'}}=
        $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+    $courseinstcodebuf{$ENV{'request.course.id'}}=
+       $ENV{'course.'.$ENV{'request.course.id'}.'.internal.coursecode'};
     if (defined $courselogs{$ENV{'request.course.id'}}) {
 	$courselogs{$ENV{'request.course.id'}}.='&'.$what;
     } else {
@@ -1615,11 +1619,11 @@ sub courseidput {
 }
 
 sub courseiddump {
-    my ($domfilter,$descfilter,$sincefilter,$hostid)=@_;
+    my ($domfilter,$descfilter,$sincefilter,$hostidflag,$hostidref)=@_;
     my %returnhash=();
     unless ($domfilter) { $domfilter=''; }
     foreach my $tryserver (keys %libserv) {
-        if (($hostid && $tryserver eq $hostid) || (!$hostid)) {
+        if ( ($hostidflag == 1 && grep/^$tryserver$/,@{$hostidref}) || (!defined($hostidflag)) ) {
 	    if ((!$domfilter) || ($hostdom{$tryserver} eq $domfilter)) {
 	        foreach (
                  split(/\&/,&reply('courseiddump:'.$hostdom{$tryserver}.':'.
@@ -1627,7 +1631,7 @@ sub courseiddump {
                                $tryserver))) {
 		    my ($key,$value)=split(/\=/,$_);
                     if (($key) && ($value)) {
-		        $returnhash{&unescape($key)}=&unescape($value);
+		        $returnhash{&unescape($key)}=$value;
                     }
                 }
             }
@@ -3054,14 +3058,20 @@ sub log_query {
     return get_query_reply($queryid);
 }
 
-# ------- Request retrieval of institutional classlists from course homerserver
+# ------- Request retrieval of institutional classlists for course(s)
 
 sub fetch_enrollment_query {
-    my ($homeserver,$dom,$affiliatesref,$replyref) = @_;
+    my ($context,$affiliatesref,$replyref,$dom,$cnum) = @_;
+    my $homeserver;
+    if ($context eq 'automated') {
+        $homeserver = $perlvar{'lonHostID'};
+    } else {
+        $homeserver = &homeserver($cnum,$dom);
+    }
     my $host=$hostname{$homeserver};
     my $cmd = '';
     foreach (keys %{$affiliatesref}) {
-        $cmd .= $_.'='.join(",",@{$$affiliatesref{$_}}).'%%'; 
+        $cmd .= $_.'='.join(",",@{$$affiliatesref{$_}}).'%%';
     }
     $cmd =~ s/%%$//;
     $cmd = &escape($cmd);
@@ -3070,8 +3080,13 @@ sub fetch_enrollment_query {
     unless ($queryid=~/^\Q$host\E\_/) { return 'error: '.$queryid; }
     my $reply = &get_query_reply($queryid);
     unless ( ($reply =~/^timeout/) || ($reply =~/^error/) ) {
-        unless ($homeserver eq $perlvar{'lonHostID'}) {
-            my @responses = split/:/,$reply;
+        my @responses = split/:/,$reply;
+        if ($homeserver eq $perlvar{'lonHostID'}) {
+            foreach (@responses) {
+                my ($key,$value) = split/=/,$_;
+                $$replyref{$key} = $value;
+            }
+        } else {
             my $pathname = $perlvar{'lonDaemons'}.'/tmp';
             foreach (@responses) {
                 my ($key,$value) = split/=/,$_;
@@ -3143,15 +3158,17 @@ sub userlog_query {
 #--------- Call auto-enrollment subs in localenroll.pm for homeserver for course 
 
 sub auto_run {
-    my $homeserver = shift;
-    my $response = &reply('autorun',$homeserver);
+    my ($cnum,$cdom) = @_;
+    my $homeserver = &homeserver($cnum,$cdom);
+    my $response = &reply('autorun:'.$cdom,$homeserver);
     return $response;
 }
                                                                                    
 sub auto_get_sections {
-    my ($homeserver,$coursecode) = @_;
+    my ($cnum,$cdom,$inst_coursecode) = @_;
+    my $homeserver = &homeserver($cnum,$cdom);
     my @secs = ();
-    my $response=&unescape(&reply('autogetsections:'.$coursecode,$homeserver));
+    my $response=&unescape(&reply('autogetsections:'.$inst_coursecode.':'.$cdom,$homeserver));
     unless ($response eq 'refused') {
         @secs = split/:/,$response;
     }
@@ -3159,22 +3176,25 @@ sub auto_get_sections {
 }
                                                                                    
 sub auto_new_course {
-    my ($homeserver,$course_id,$owner) = @_;
-    my $response=&unescape(&reply('autonewcourse:'.$course_id.':'.$owner,$homeserver));
+    my ($cnum,$cdom,$inst_course_id,$owner) = @_;
+    my $homeserver = &homeserver($cnum,$cdom);
+    my $response=&unescape(&reply('autonewcourse:'.$inst_course_id.':'.$owner.':'.$cdom,$homeserver));
     return $response;
 }
                                                                                    
 sub auto_validate_courseID {
-    my ($homeserver,$course_id) = @_;
-    my $response=&unescape(&reply('autovalidatecourse:'.$course_id,$homeserver));
+    my ($cnum,$cdom,$inst_course_id) = @_;
+    my $homeserver = &homeserver($cnum,$cdom);
+    my $response=&unescape(&reply('autovalidatecourse:'.$inst_course_id.':'.$cdom,$homeserver));
     return $response;
 }
                                                                                    
 sub auto_create_password {
-    my ($homeserver,$authparam) = @_;
+    my ($cnum,$cdom,$authparam) = @_;
+    my $homeserver = &homeserver($cnum,$cdom); 
     my $create_passwd = 0;
     my $authchk = '';
-    my $response=&unescape(&reply('autocreatepassword:'.$authparam,$homeserver));
+    my $response=&unescape(&reply('autocreatepassword:'.$authparam.':'.$cdom,$homeserver));
     if ($response eq 'refused') {
         $authchk = 'refused';
     } else {
@@ -3373,7 +3393,7 @@ sub modifyuser {
 
 sub modifystudent {
     my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec,
-        $end,$start,$forceid,$desiredhome,$email,$type,$cid)=@_;
+        $end,$start,$forceid,$desiredhome,$email,$type,$locktype,$cid)=@_;
     if (!$cid) {
 	unless ($cid=$ENV{'request.course.id'}) {
 	    return 'not_in_class';
@@ -3388,13 +3408,12 @@ sub modifystudent {
     # students environment
     $uid = undef if (!$forceid);
     $reply = &modify_student_enrollment($udom,$uname,$uid,$first,$middle,$last,
-					$gene,$usec,$end,$start,$type,$cid);
+					$gene,$usec,$end,$start,$type,$locktype,$cid);
     return $reply;
 }
 
 sub modify_student_enrollment {
-    my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type,
-	$cid) = @_;
+    my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type,$locktype,$cid) = @_;
     my ($cdom,$cnum,$chome);
     if (!$cid) {
 	unless ($cid=$ENV{'request.course.id'}) {
@@ -3440,7 +3459,7 @@ sub modify_student_enrollment {
                                                            $first,$middle);
     my $reply=cput('classlist',
 		   {"$uname:$udom" => 
-			join(':',$end,$start,$uid,$usec,$fullname,$type) },
+			join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype) },
 		   $cdom,$cnum);
     unless (($reply eq 'ok') || ($reply eq 'delayed')) {
 	return 'error: '.$reply;
@@ -3476,7 +3495,7 @@ sub writecoursepref {
 # ---------------------------------------------------------- Make/modify course
 
 sub createcourse {
-    my ($udom,$description,$url,$course_server,$nonstandard)=@_;
+    my ($udom,$description,$url,$course_server,$nonstandard,$inst_code)=@_;
     $url=&declutter($url);
     my $cid='';
     unless (&allowed('ccc',$udom)) {
@@ -3509,9 +3528,9 @@ sub createcourse {
 	return 'error: no such course';
     }
 # ----------------------------------------------------------------- Course made
-# log existance
-    &courseidput($udom,&escape($udom.'_'.$uname).'='.&escape($description),
-                 $uhome);
+# log existence
+    &courseidput($udom,&escape($udom.'_'.$uname).'='.&escape($description).
+                 '='.&escape($inst_code),$uhome);
     &flushcourselogs();
 # set toplevel url
     my $topurl=$url;
@@ -3564,6 +3583,39 @@ sub revokecustomrole {
            $deleteflag);
 }
 
+
+# ------------------------------------------------------------ Portfolio Director Lister
+sub portfoliolist {
+#FIXME us the ls: command instead please
+#FIXME uhome should never be an argument to any lonnet functions
+    # returns listing of contents of user's /userfiles/portfolio/ directory
+    # 
+    my ($udom,$uname,$uhome);
+    $uname=$ENV{'user.name'};
+    $udom=$ENV{'user.domain'};
+    $uhome=$ENV{'user.home'};
+    my $listing = &reply('portls:'.$uname.':'.$udom, $uhome);
+    return $listing;
+}
+
+sub portfoliomanage {
+
+#FIXME please user the existing remove userfile function instead and
+#add a userfilerename functions.
+#FIXME uhome should never be an argument to any lonnet functions
+
+    # handles deleting and renaming files in user's userfiles/portfolio/ directory
+    # 
+    my ($filename, $fileaction, $filenewname) = @_;
+    my ($udom, $uname, $uhome);
+    $uname=$ENV{'user.name'};
+    $udom=$ENV{'user.domain'};
+    $uhome=$ENV{'user.home'};
+    my $listing = reply('portfoliomanage:'.$uname.':'.$udom.':'.$filename.':'.$fileaction.':'.$filenewname, $uhome);
+    return $listing;
+}
+
+
 # ------------------------------------------------------------ Directory lister
 
 sub dirlist {
@@ -4359,7 +4411,10 @@ sub symblist {
 # --------------------------------------------------------------- Verify a symb
 
 sub symbverify {
-    my ($symb,$thisfn)=@_;
+    my ($symb,$thisurl)=@_;
+    my $thisfn=$thisurl;
+# wrapper not part of symbs
+    $thisfn=~s/^\/adm\/wrapper//;
     $thisfn=&declutter($thisfn);
 # direct jump to resource in page or to a sequence - will construct own symbs
     if ($thisfn=~/\.(page|sequence)$/) { return 1; }
@@ -4369,6 +4424,7 @@ sub symbverify {
     unless ($url eq $thisfn) { return 0; }
 
     $symb=&symbclean($symb);
+    $thisurl=&deversion($thisurl);
     $thisfn=&deversion($thisfn);
 
     my %bighash;
@@ -4376,9 +4432,9 @@ sub symbverify {
 
     if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                             &GDBM_READER(),0640)) {
-        my $ids=$bighash{'ids_'.&clutter($thisfn)};
+        my $ids=$bighash{'ids_'.&clutter($thisurl)};
         unless ($ids) { 
-           $ids=$bighash{'ids_/'.$thisfn};
+           $ids=$bighash{'ids_/'.$thisurl};
         }
         if ($ids) {
 # ------------------------------------------------------------------- Has ID(s)
@@ -4407,6 +4463,9 @@ sub symbclean {
 # remove version from URL
     $symb=~s/\.(\d+)\.(\w+)$/\.$2/;
 
+# remove wrapper
+
+    $symb=~s/(\_\_\_\d+\_\_\_)adm\/wrapper\/(res\/)*/$1/;
     return $symb;
 }
 
@@ -4962,7 +5021,7 @@ sub declutter {
 
 sub clutter {
     my $thisfn='/'.&declutter(shift);
-    unless ($thisfn=~/^\/(uploaded|adm|userfiles|ext|raw|priv)\//) { 
+    unless ($thisfn=~/^\/(uploaded|adm|userfiles|ext|raw|priv|public)\//) { 
        $thisfn='/res'.$thisfn; 
     }
     return $thisfn;