Annotation of capa/capa51/Discuss/Ver1.3/capadiscuss, revision 1.1

1.1     ! albertel    1: #!/usr/ucb/perl
        !             2: #
        !             3: # CAPA Discussion Forum
        !             4: # version 1.3
        !             5: #
        !             6: # Michigan State University
        !             7: # Department of Physics and Astronomy
        !             8: #
        !             9: # Ryan J. Shaltry
        !            10: # tech4@msue.msu.edu
        !            11: 
        !            12: print "Content-type: text/html\n\n";
        !            13: 
        !            14: use Benchmark;
        !            15: $BenchmarkT0 = new Benchmark;
        !            16: #require "capadiscuss.setup";
        !            17: require "../capadiscuss_html";
        !            18: 
        !            19: ################################################
        !            20: ## Configuration - Change these appropriately ##
        !            21: ################################################
        !            22: $discussurl = "capadiscuss";
        !            23: $capasbin = "/capa-bin";
        !            24: use Cwd;
        !            25: $capabin = cwd();
        !            26: @capabinparts = split /\//, $capabin;
        !            27: $capabin = join "/", @capabinparts[0..$#capabinparts-1];
        !            28: 
        !            29: # capadiscuss.setup
        !            30: $debug = 0;
        !            31: ################################################
        !            32: ## End Configuration ###########################
        !            33: ################################################
        !            34: 
        !            35: &form_info;
        !            36: 
        !            37: $yp = "19";
        !            38: $validadmin = "unchecked";
        !            39: 
        !            40:   # define variables
        !            41:   $class    = $form{'CLASS'};
        !            42:   $snum     = $form{'SNUM'};
        !            43:   $capaid   = $form{'CAPAID'};
        !            44:   $setid    = $form{'SETID'};
        !            45:   $action   = $form{'ACTION'};
        !            46:   $file     = $form{'FILE'};
        !            47:   $probnum  = $form{'PROBNUM'};
        !            48:   $replynum = $form{'REPLYNUM'};
        !            49:   $psetid   = $form{'PSETID'};
        !            50: if ($snum eq "A12345678") {$debug=1;}
        !            51: if ($snum eq "a12345678") {$debug=1;}
        !            52:   if($psetid eq "") { $psetid = $setid; }
        !            53: if ($debug) {print "GetTeacherInfo<BR>";$BenchmarkTa = new Benchmark;}
        !            54:   &GetTeacherInfo;
        !            55: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !            56: 
        !            57:   # check for valid studentnumber/capaid
        !            58: if ($debug) {print "ValidateUser<BR>";$BenchmarkTa = new Benchmark;}
        !            59:   &ValidateUser;
        !            60: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !            61: 
        !            62:   # grab username from student number
        !            63: if ($debug) {print "UserInfo<BR>";$BenchmarkTa = new Benchmark;}
        !            64:   &UserInfo($snum);
        !            65: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !            66: 
        !            67: if ($debug) {print "GetDateTime<BR>";$BenchmarkTa = new Benchmark;}
        !            68:   &GetDateTime;
        !            69: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !            70: 
        !            71: if ($debug) {print $action . "<BR>";$BenchmarkTa = new Benchmark;}
        !            72:   # call appropriate sr
        !            73:   if($action eq "newset"                   ) { &NewSet;                }
        !            74:   if($action eq "viewset" || $action eq "" ) { &ViewSet;               }
        !            75:   if($action eq "viewproblem"              ) { &ViewProblem;           }
        !            76:   if($action eq "post"                     ) { &Post;                  }
        !            77:   if($action eq "postsubmit"               ) { &PostSubmit;            }
        !            78:   if($action eq "delmsgpre"                ) { &DelMsgPre;             }
        !            79:   if($action eq "delmsg"                   ) { &DelMsg;                }
        !            80:   if($action eq "hidemsgpre"               ) { &HideMsgPre;            }
        !            81:   if($action eq "hidemsg"                  ) { &HideMsg;               }
        !            82:   if($action eq "unhidemsgpre"             ) { &UnHideMsgPre;          }
        !            83:   if($action eq "unhidemsg"                ) { &UnHideMsg;             }
        !            84: 
        !            85:   if($action eq "admin"                    ) { &AdminMain;             }
        !            86:   if($action eq "adminusersearch"          ) { &AdminUserSearch;       }
        !            87:   if($action eq "adminusersearchsubmit"    ) { &AdminUserSearchSubmit; }
        !            88: 
        !            89:   if($action eq "viewinfofile"             ) { &ViewInfoFile;          }
        !            90: 
        !            91:   if($action eq "topmsg"                   ) { &TopMsg("top");        }
        !            92:   if($action eq "untopmsg"                 ) { &TopMsg("");            }
        !            93: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !            94: 
        !            95: $BenchmarkT1 = new Benchmark;
        !            96: if($debug) { print "<BR>",timestr(timediff($BenchmarkT1,$BenchmarkT0)),"\n";}
        !            97: 
        !            98: exit;
        !            99: 
        !           100: #######################
        !           101: ## Begin Subroutines ##
        !           102: #######################
        !           103: 
        !           104: sub NewSet {
        !           105:   &Log("NewSet");
        !           106: 
        !           107:   if($setid <= $psetid) {   #grab capaid
        !           108:     if ($debug) {print "ViewSet<BR>";$BenchmarkTa = new Benchmark;}
        !           109:     @allcapaid = `allcapaid -s $setid -e $setid -stu $snum -c $capadir/$class -i`;
        !           110: 
        !           111:     $capaid = $allcapaid[2];
        !           112:     chop $capaid;
        !           113:     chop $capaid;
        !           114:     &ViewSet;
        !           115: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !           116:     return;
        !           117:   }
        !           118: 
        !           119:   opendir(DDIR,"$capadir/$class/discussion");
        !           120:     @sets = grep(/[0-9]/,sort(readdir(DDIR)));
        !           121:   closedir(DDIR);
        !           122: 
        !           123:   $pdset = "<select name=\"SETID\">\n";
        !           124:   foreach $setnum(@sets) {
        !           125:     $selected = "";
        !           126:     if($setnum eq $setid) { $selected = "selected"; }
        !           127:     $pdset .= "<option value=\"$setnum\" $selected>$setnum\n";
        !           128:   }
        !           129:   $pdset .= "</select>\n";
        !           130: 
        !           131:   &NewSetHTML;
        !           132:   #exit;
        !           133: }
        !           134: 
        !           135: sub ViewSet {
        !           136:   if ($debug) {print "InsideViewSet<BR>";$BenchmarkTa = new Benchmark;}
        !           137:   &Log("ViewSet");
        !           138:   &CheckAdmin;
        !           139:   $adminbutton = "";
        !           140:   if($validadmin eq "yes") {
        !           141:     $adminbutton = &AdminButtonHTML;
        !           142:   }
        !           143: 
        !           144:   $capasbin = "$capasbin/$teachdir/capasbin";
        !           145:   &SetJumpBox;
        !           146:   opendir(FORUM,"$capadir/$class/discussion/$setid");
        !           147:     @dir = sort(readdir(FORUM));
        !           148:   closedir(FORUM);
        !           149: 
        !           150:   @infofiles = grep(/.info/,@dir);
        !           151:   $infostring = "";
        !           152:   $backfunction = "viewset";
        !           153:   foreach $infofile(@infofiles) {
        !           154:     $infodesc = $infofile;
        !           155:     $infodesc =~ s/.info//g;
        !           156:     $infodesc =~ s/_/ /g;
        !           157:     $infostring .= &InfoButtonHTML;
        !           158:   }
        !           159: 
        !           160:   foreach $i(@dir) {
        !           161:     $probnum = &RemZero(substr($i,0,6));
        !           162:     $found[$probnum]++;
        !           163:   }
        !           164:   $maxprobs = &MaxProbs($setid);
        !           165: 
        !           166:   # split table (if more than 15 problems)
        !           167:   $bigtable = "no";
        !           168:   if($maxprobs > 5) {
        !           169:     $bigtable = "yes";
        !           170:     $col1size = int ($maxprobs / 2);
        !           171:     $col2size = $maxprobs - $col1size;
        !           172:     if($col1size < $col2size) {
        !           173:       $t = $col1size;
        !           174:       $col1size = $col2size;
        !           175:       $col2size = $t;
        !           176:     }
        !           177:   }
        !           178: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>2",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !           179:   &ViewSetTitleHTML;
        !           180: 
        !           181:   if($bigtable eq "no") { &ViewSetTopSmallHTML; }
        !           182:   else                  { &ViewSetTopBigHTML; }
        !           183: 
        !           184:   $col = 1;
        !           185:   for($probnum=1; $probnum<=$maxprobs; $probnum++) {
        !           186:     if($col eq "1" && $probnum > $col1size && $bigtable eq "yes") {
        !           187:       $col = 2;
        !           188:       &ViewSetEndColHTML;
        !           189:       &ViewSetTopSmallHTML;
        !           190:     }
        !           191:     if($found[$probnum] ne "") {
        !           192:       opendir(MSG,"$capadir/$class/discussion/$setid");
        !           193:         @msgs = grep(/.msg/,sort(readdir(MSG)));
        !           194:       closedir(MSG);
        !           195:       foreach $msg(@msgs) {
        !           196:         if(&RemZero(substr($msg,0,6)) eq $probnum) {
        !           197:           push(@good,$msg);
        !           198:         }
        !           199:       }
        !           200: 
        !           201:       &OpenMsg("$capadir/$class/discussion/$setid/$good[$#good]");
        !           202:       $lastpost = "$date at $time";
        !           203:       $posts = $found[$probnum];
        !           204:     }
        !           205:     else {
        !           206:       $lastpost = "--";
        !           207:       $posts = "0"; }
        !           208:     &ViewSetGutsHTML;
        !           209:   }
        !           210:   &ViewSetBotHTML;
        !           211: if($debug) {$BenchmarkTb = new Benchmark;print "<BR>3",timestr(timediff($BenchmarkTb,$BenchmarkTa)),"\n";}
        !           212:   #exit;
        !           213: }
        !           214: 
        !           215: sub ViewProblem {
        !           216:   &Log("ViewProblem");
        !           217: 
        !           218:   # check if user is administrator (for admin button)
        !           219:   &CheckAdmin;
        !           220:   if($validadmin eq "yes") {
        !           221:     $adminbutton = &AdminButtonHTML;
        !           222:   }
        !           223:   else {
        !           224:     $adminbutton = "";
        !           225:   }
        !           226: 
        !           227:   opendir (MSGS,"$capadir/$class/discussion/$setid");
        !           228:     @msgs = sort(readdir(MSGS));
        !           229:   closedir(MSGS);
        !           230: 
        !           231:   # search for top message
        !           232:   @top = grep (/top/, @msgs);
        !           233:   $topmsg = "";
        !           234: #  print "$#top";
        !           235:   if($#top ne "0") {
        !           236:     $pnum = &AddZero($probnum);
        !           237:     foreach $entry(@top) {
        !           238:       $find = $entry =~ s/\A$pnum/$pnum/o;
        !           239:       if($find eq "1") {
        !           240:         $topmsg = $entry;
        !           241:         @msgs = grep(!/$topmsg/,@msgs);
        !           242:         unshift(@msgs,$topmsg);
        !           243:         print "$topmsg";
        !           244:       }
        !           245:     }
        !           246:   }
        !           247: 
        !           248:   $msgfind = "no";
        !           249:   $msgcount = 0;
        !           250: 
        !           251:   $capasbin = "$capasbin/$teachdir/capasbin";
        !           252: 
        !           253:   foreach $i(@msgs) {
        !           254:     $pn = &RemZero(substr($i,0,6));
        !           255:     if($pn eq $probnum) {
        !           256:       $msgcount++;
        !           257:       $msgfind = "yes";
        !           258:       &OpenMsg("$capadir/$class/discussion/$setid/$i");
        !           259: 
        !           260:       if($status eq "hidden" && $validadmin ne "yes") {
        !           261:         $msgcount--;
        !           262:         $msgfind = "no";
        !           263:       }
        !           264: 
        !           265:       if($msgcount eq "1") {
        !           266:         $postbutton = &ReplyButtonHTML;
        !           267:         &ProblemJumpBox;
        !           268:         &ViewProblemTopHTML;
        !           269:       }
        !           270: 
        !           271:       ($token1,$token2) = split(/\|/,$poster);
        !           272:       chop $token2;
        !           273:       if($token1 eq "Anonymous") {
        !           274:          if($validadmin eq "yes") {
        !           275:            $poster = "$token2 (anonymously)";
        !           276:          }
        !           277:          else {
        !           278:            $poster = "$token1";
        !           279:            $email = "";
        !           280:          }
        !           281:       }
        !           282:       $topfind = grep(/-top.msg/,$i);
        !           283:       if($validadmin eq "yes") {
        !           284:         $file = "$i";
        !           285:         $delbutton = &DelButtonHTML;
        !           286:         $hidebutton = &HideButtonHTML;
        !           287:         $topbutton = &TopButtonHTML;
        !           288:         if($topfind eq "1") { $topbutton = &UnTopButtonHTML; }
        !           289:       }
        !           290:       $subjectbgcolor = "#92D1D0";
        !           291:       if($topfind eq "1") { $subjectbgcolor = "blue"; }
        !           292:       $messagenote = "";
        !           293:       if($validadmin eq "yes" || $status eq "public") {
        !           294:         if($status eq "hidden") {
        !           295:           $subjectbgcolor = "red";
        !           296:           $hidebutton = &UnHideButtonHTML;
        !           297:           $messagenote = "Hidden by $hiddenuser on $hiddendate at $hiddentime from $hiddenaddr";
        !           298:         }
        !           299: 	$message =~ s/</&lt;/g;
        !           300: 	$message =~ s/>/&gt;/g;
        !           301:         &ViewProblemGutsHTML;
        !           302:       }
        !           303:     }
        !           304:   }
        !           305: 
        !           306:   if($msgfind eq "no") {
        !           307:     $postbutton = &PostNewButtonHTML;
        !           308:     &ProblemJumpBox;
        !           309:     &ViewProblemTopHTML;
        !           310:     &ViewProblemNoneHTML;
        !           311:     &ViewProblemBotHTML;
        !           312:   } else {
        !           313:     &ViewProblemBotHTML;
        !           314:   }
        !           315:   
        !           316:   #exit;
        !           317: }
        !           318: 
        !           319: sub ViewInfoFile {
        !           320:   open(INFOFILE,"$capadir/$class/discussion/$setid/$file");
        !           321:     @file = <INFOFILE>;
        !           322:   closedir(INFOFILE);
        !           323: 
        !           324:   print "<html><head></head><body bgcolor=\"#ffffff\">";
        !           325:   $backfunction = $form{'BACKFUNCTION'};
        !           326:   &InfoBackButtonHTML;
        !           327:   foreach $line(@file) {
        !           328:     print "$line";
        !           329:   }
        !           330: 
        !           331:   #exit;
        !           332: }
        !           333: 
        !           334: sub Post {
        !           335:   local(@msgs,$pn,$msg);
        !           336: 
        !           337:   # grab last message in thread
        !           338:   opendir(MSGS,"$capadir/$class/discussion/$setid");
        !           339:     @msgs = grep(/.msg/,sort(readdir(MSGS)));
        !           340:   closedir(MSGS); 
        !           341: 
        !           342:   foreach $msg(@msgs) {
        !           343:     $pn = &RemZero(substr($msg,0,6));
        !           344:     if($pn eq $probnum) {
        !           345:       $lastfile = $msg;
        !           346:     }
        !           347:   }
        !           348: 
        !           349:   $PostType = "New Message";
        !           350:   if($lastfile ne "") {
        !           351:     &OpenMsg("$capadir/$class/discussion/$setid/$lastfile");
        !           352:     if($status eq "public" || $validadmin eq "yes") {
        !           353:       ($poster,$rposter) = split(/\|/,$poster);
        !           354:       $inreplyto = &InReplyToHTML;
        !           355:       $PostType = "Reply";
        !           356:     }
        !           357:   }
        !           358: 
        !           359:   &PostHTML;
        !           360:   #exit;
        !           361: }
        !           362: 
        !           363: sub PostSubmit {
        !           364:   local($message,$subject,$date);
        !           365: 
        !           366:   $message = $form{'message'};
        !           367:   $subject = $form{'subject'};
        !           368:   
        !           369:   if($message eq "" || $subject eq "") { &MFPostReplyHTML; }
        !           370: 
        !           371:   &Log("Post");
        !           372: 
        !           373:   # find last message in thread
        !           374:   opendir(FORUM,"$capadir/$class/discussion/$setid");
        !           375:     @dir = sort(readdir(FORUM));
        !           376:   closedir(FORUM);
        !           377: 
        !           378:   $probnum = &AddZero($probnum);
        !           379:   $replynum = "000000";
        !           380:   foreach $msg(@dir) {
        !           381:     if(substr($msg,0,6) eq $probnum) {
        !           382:         $replynum = &AddZero(&RemZero(substr($msg,7,6)) + 1);
        !           383:     }
        !           384:   }
        !           385: 
        !           386:   $date = substr($RunonDate,0,4) . $yp . substr($RunonDate,4,2);
        !           387:   &WriteMsg("$capadir/$class/discussion/$setid/$probnum-$replynum-$date-000000.msg");
        !           388: 
        !           389:   $probnum = &RemZero($probnum);
        !           390:   &PostDoneHTML;
        !           391:   #exit;
        !           392: }
        !           393: 
        !           394: sub DelMsgPre {
        !           395:   &CheckAdmin('kill');
        !           396:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
        !           397:   &DelMsgPreHTML;
        !           398:   #exit;
        !           399: }
        !           400: 
        !           401: sub DelMsg {
        !           402:   &CheckAdmin('kill');
        !           403:   unlink("$capadir/$class/discussion/$setid/$file");
        !           404:   &DelMsgDoneHTML;
        !           405:   #exit;
        !           406: }
        !           407: 
        !           408: sub HideMsgPre {
        !           409:   &CheckAdmin('kill');
        !           410:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
        !           411:   &HideMsgPreHTML;
        !           412:   #exit;
        !           413: }
        !           414: 
        !           415: sub HideMsg {
        !           416:   &CheckAdmin('kill');
        !           417:   open(MSG,"$capadir/$class/discussion/$setid/$file");
        !           418:     @msg = <MSG>;
        !           419:   close(MSG);
        !           420: 
        !           421:   unlink("$capadir/$class/discussion/$setid/$file");
        !           422: 
        !           423:   open(MSG,">$capadir/$class/discussion/$setid/$file");
        !           424:     for($i=0;$i<=5;$i++) {
        !           425:       print MSG "$msg[$i]";
        !           426:     }
        !           427:     print MSG "hidden|$username|$HyphenDate|$Time|$ENV{'REMOTE_ADDR'}\n";
        !           428:   close(MSG);
        !           429: 
        !           430:   &HideMsgDoneHTML;
        !           431: }
        !           432: 
        !           433: sub UnHideMsgPre {
        !           434:   &CheckAdmin('kill');
        !           435:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
        !           436:   &UnHideMsgPreHTML;
        !           437:   #exit;
        !           438: }
        !           439: 
        !           440: sub UnHideMsg {
        !           441:   &CheckAdmin('kill');
        !           442:   open(MSG,"$capadir/$class/discussion/$setid/$file");
        !           443:     @msg = <MSG>;
        !           444:   close(MSG);
        !           445: 
        !           446:   unlink("$capadir/$class/discussion/$setid/$file");
        !           447: 
        !           448:   open(MSG,">$capadir/$class/discussion/$setid/$file");
        !           449:     for($i=0;$i<=5;$i++) {
        !           450:       print MSG "$msg[$i]";
        !           451:     }
        !           452:     print MSG "public||||}\n";
        !           453:   close(MSG);
        !           454: 
        !           455:   &UnHideMsgDoneHTML;
        !           456: }
        !           457: 
        !           458: 
        !           459: sub TopMsg {
        !           460:   &CheckAdmin('kill');
        !           461: 
        !           462:   $ext = shift(@_);
        !           463:   
        !           464:   open(MSG,"$capadir/$class/discussion/$setid/$file");
        !           465:     @msg = <MSG>;
        !           466:   close(MSG);
        !           467:   
        !           468:   unlink("$capadir/$class/discussion/$setid/$file");
        !           469:   
        !           470:   ($filename, $extension) = split(/\./,$file);
        !           471:   $filename = "$filename-$ext.msg";
        !           472:   open(MSG,">$capadir/$class/discussion/$setid/$filename");
        !           473:     for($i=0;$i<=6;$i++) {
        !           474:       print MSG "$msg[$i]";
        !           475:     }
        !           476:   close(MSG);
        !           477:   
        !           478:   if($ext eq "") {
        !           479:     $function = "restored to its original position in the thread.";
        !           480:   }
        !           481:   else {
        !           482:     $function = "moved to the top of the thread list.";
        !           483:   }
        !           484: 
        !           485:   &TopMsgDoneHTML;
        !           486: }
        !           487: 
        !           488: ###############################
        !           489: ## Administrator Subroutines ##
        !           490: ###############################
        !           491: 
        !           492: sub AdminMain {
        !           493:   &CheckAdmin('kill');
        !           494:   &AdminMainHTML;
        !           495:   #exit;
        !           496: }
        !           497: 
        !           498: 
        !           499: sub AdminUserSearch {
        !           500:   &CheckAdmin('kill');
        !           501:   &AdminUserSearchHTML;
        !           502:   #exit;
        !           503: }
        !           504: 
        !           505: 
        !           506: sub AdminUserSearchSubmit {
        !           507:   local($sname,$semail,$saction,$sset,$sprob,$sdate,$stime);
        !           508:   &CheckAdmin('kill');
        !           509: 
        !           510:   $query = $form{'usersearch'};
        !           511:   open(LOG,"$capadir/$class/discussion/logs/access.log");
        !           512:     @log = <LOG>;
        !           513:   close(LOG);
        !           514: 
        !           515:   @linematches = grep /$query/, @log;
        !           516:   
        !           517:   foreach $line(@linematches) { print $line; }
        !           518: 
        !           519:   #exit;
        !           520: }
        !           521: 
        !           522: ######################
        !           523: ## Misc Subroutines ##
        !           524: ######################
        !           525: 
        !           526: sub OpenMsg {
        !           527:   local($filename,$statusl);
        !           528: 
        !           529:   $filename = shift(@_);
        !           530:   
        !           531:   open (MSG,"$filename");
        !           532:     @msg = <MSG>;
        !           533:   close(MSG);
        !           534: 
        !           535:   $poster   = $msg[0];
        !           536:   $date     = $msg[1];
        !           537:   $time     = $msg[2];
        !           538:   $subject  = $msg[3];
        !           539:   $email    = $msg[4];
        !           540:   $message  = $msg[5];
        !           541:   $statusl  = $msg[6];
        !           542: 
        !           543:   ($status, $hiddenuser, $hiddendate, $hiddentime, $hiddenaddr) = split(/\|/,$statusl);
        !           544: }
        !           545: 
        !           546: sub WriteMsg {
        !           547:   local($filename,$message);
        !           548: 
        !           549:   $filename = shift(@_);
        !           550:   # add sr to grab e-mail address of user
        !           551: 
        !           552:   $message = $form{'message'};
        !           553:   $message =~ s/\n\r\n/<p>/g;
        !           554:   $message =~ s/\n/<br>/g;
        !           555: 
        !           556:   # check if posted anonymously
        !           557:   if($form{'ANONYMOUS'} eq "yes") {
        !           558:     $username = "Anonymous|$username";
        !           559:   }
        !           560: 
        !           561:   open (MSG,">$filename");
        !           562:     print MSG "$username\n";
        !           563:     print MSG "$HyphenDate\n";
        !           564:     print MSG "$Time\n";
        !           565:     print MSG "$subject\n";
        !           566:     print MSG "$email\n";
        !           567:     print MSG "$message\n";
        !           568:     print MSG "public||||\n";
        !           569:   close(MSG);
        !           570: }
        !           571: 
        !           572: sub GetTeacherInfo {
        !           573:   local($capa5dir,$classname,$tdir,@classconf);
        !           574: 
        !           575:   # open/read class.conf file
        !           576:   open (CLASSCONF,"$capabin/class.conf");
        !           577:     @classconf = <CLASSCONF>;
        !           578:   close(CLASSCONF);
        !           579: 
        !           580:   $found eq "no";
        !           581:   foreach $line(@classconf) {
        !           582:     ($classname,$capa5dir,$tdir) = split(/[\t\ ]+/,$line);
        !           583:     if($classname eq $class) {
        !           584:       $teachdir = $tdir;
        !           585:       $capadir  = $capa5dir;
        !           586:       $found    = "yes";
        !           587:       $cgidirurl = join "/", $capasbin,$teachdir;
        !           588:     }
        !           589:   }
        !           590:   if($found eq "no") { &InvalidVarsHTML; }
        !           591: }
        !           592: 
        !           593: sub CheckAdmin {
        !           594:   local($asection,@adminsections,$line,@capaconfig,$command,$value,
        !           595:         $adminsection,@classl,$course,$coursenum,$section,$stunum,$a);
        !           596: 
        !           597:   $mode = shift(@_);
        !           598: 
        !           599:   if ($validadmin eq "unchecked") {
        !           600:     $validadmin = "no";
        !           601:     
        !           602:     # open 'capa.config' file (for admin section read)
        !           603:     open(CAPACONFIG,"$capadir/$class/capa.config");
        !           604:     @capaconfig = <CAPACONFIG>;
        !           605:     close(CAPACONFIG);
        !           606:     foreach $line(@capaconfig) {
        !           607:       chop $line;
        !           608:       ($command,$value) = split(/\ =\ /,$line);
        !           609:       if($command eq "admin_section") {
        !           610: 	$adminsection = $value;
        !           611: 	last;
        !           612:       }
        !           613:     }
        !           614:     @adminsections = split(/\,/,$adminsection);
        !           615:     for ($asection=0; $asection <= $#adminsections; $asection++) {
        !           616:       $adminsections[$asection]=&RemZero($adminsections[$asection])
        !           617:     }
        !           618:     # open 'classl' file
        !           619:     open(CLASSL,"$capadir/$class/classl");
        !           620:     @classl = <CLASSL>;
        !           621:     close(CLASSL);
        !           622:     
        !           623:     $snum =~ tr/a-z/A-Z/;
        !           624:     LINE: foreach $line(@classl) {
        !           625:       ($course,$coursenum,$section,$stunum,$a) = split(/\ +/,$line);
        !           626:       $stunum =~ tr/a-z/A-Z/;
        !           627:       if ( $stunum ne $snum ) { next LINE;}
        !           628:       $section = &RemZero($section);
        !           629:       foreach $asection(@adminsections) {
        !           630: 	if($section eq $asection ) {
        !           631: 	  $validadmin = "yes";
        !           632: 	  last LINE;
        !           633: 	}
        !           634:       }
        !           635:     }
        !           636:   }
        !           637:   if($validadmin eq "no" && $mode eq "kill") { &NotAdminHTML; }
        !           638: }
        !           639: 
        !           640: sub ValidateUser {
        !           641:   local(@allcapaid,@classl,$line);
        !           642: 
        !           643:   open (CLASSL,"$capadir/$class/classl");
        !           644:     @classl = <CLASSL>;
        !           645:   close(CLASSL);
        !           646: 
        !           647:   $valid = "no";
        !           648:   foreach $line(@classl) {
        !           649:     if(substr($line,15,8) eq substr($snum,1,8)) {
        !           650:       $valid = yes;
        !           651:     }
        !           652:   }
        !           653:   if($valid eq "no") { &InvalidVarsHTML; }
        !           654: 
        !           655:   # check w/ allcapaid program
        !           656:   @allcapaid = `allcapaid -s $setid -e $setid -stu $snum -c $capadir/$class -i`;
        !           657: 
        !           658:   chop $allcapaid[2];
        !           659:   chop $allcapaid[2];
        !           660:   if($allcapaid[2] ne $capaid) {
        !           661:     if($action ne "newset") { &BadPassHTML; }
        !           662:     #&NewSet;
        !           663:   }
        !           664: }
        !           665: 
        !           666: sub UserInfo {
        !           667:   local($line,@classl,$last,$first,$middle);
        !           668: 
        !           669:   open (CLASSL,"$capadir/$class/classl");
        !           670:     @classl = <CLASSL>;
        !           671:   close(CLASSL);
        !           672: 
        !           673:   foreach $line(@classl) {
        !           674:     if(substr($line,15,8) eq substr($snum,1,8)) {
        !           675:       $username = substr($line,24,36);
        !           676:       $email    = substr($line,60,45);
        !           677:     }
        !           678:   }
        !           679:   ($last, $first, $middle) = split(/\ +/,$username);
        !           680: 
        !           681:   chop $last;
        !           682:   $username = "$first $last";
        !           683:   $email    =~ s/\ //g;
        !           684:   chop $email;
        !           685: }
        !           686: 
        !           687: sub MaxProbs {
        !           688:   open (SETRECORD,"$capadir/$class/records/set$setid.db");
        !           689:   $setrecord = <SETRECORD>;
        !           690:   close(SETRECORD);
        !           691:   chop $setrecord;
        !           692:   return $setrecord;
        !           693: }
        !           694: 
        !           695: sub ProblemJumpBox {
        !           696:   $pdprob = "<select name=\"PROBNUM\">\n";
        !           697:   for($jumpnum=1;$jumpnum<=&MaxProbs;$jumpnum++) {
        !           698:     $selected = "";
        !           699:     if($jumpnum eq $probnum) { $selected = " selected"; }
        !           700:     $pdprob .= "  <option value=$jumpnum$selected>$jumpnum\n";
        !           701:   }
        !           702:   $pdprob .= "</select>";
        !           703: }
        !           704: 
        !           705: sub SetJumpBox {
        !           706:   opendir(DDIR,"$capadir/$class/discussion");
        !           707:     @sets = grep(/[0-9]/,sort(readdir(DDIR)));
        !           708:   closedir(DDIR);
        !           709: 
        !           710:   $pdset = "<select name=\"SETID\">\n";
        !           711:   foreach $set(@sets) {
        !           712:     $selected = "";
        !           713:     if($set eq $setid) { $selected = " selected"; }
        !           714:     $pdset .= "  <option value=\"$set\"$selected>$set\n";
        !           715:   }
        !           716:   $pdset .= "</select>";
        !           717: }
        !           718: 
        !           719: sub AddZero {
        !           720:   $string = shift(@_);
        !           721:   
        !           722:   while(length($string) < 6) {
        !           723:     $string = "0$string";
        !           724:   }
        !           725:   return $string;
        !           726: }
        !           727: 
        !           728: sub RemZero {
        !           729:   $string = shift(@_);
        !           730:   $string =~ s/^0*//g;
        !           731:   return $string;
        !           732: }
        !           733: 
        !           734: sub FormatDate {
        !           735:   $string = shift(@_);
        !           736:   
        !           737:   $month = substr($string,0,2);
        !           738:   $day   = substr($string,2,2);
        !           739:   $year  = substr($string,4,4);
        !           740: 
        !           741:   $string = "$month-$day-$year";
        !           742: 
        !           743:   return $string;
        !           744: }
        !           745: 
        !           746: ####################
        !           747: ## Get SubRoutine ##
        !           748: ####################
        !           749: sub form_info {
        !           750:   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
        !           751: 
        !           752:   # Split the name-value pairs
        !           753:   @pairs = split(/&/, $buffer);
        !           754: 
        !           755:   foreach $pair (@pairs) {
        !           756:      ($name, $value) = split(/=/, $pair);
        !           757: 
        !           758:      # Un-Webify plus signs and %-encoding
        !           759:      $value =~ tr/+/ /;
        !           760:      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        !           761:      $value =~ s/<!--(.|\n)*-->//g;
        !           762: 
        !           763:      if ($allow_html != 1) {
        !           764:         $value =~ s/<([^>]|\n)*>//g;
        !           765:      }
        !           766:      $form{$name} = $value;
        !           767:   }
        !           768: }
        !           769: 
        !           770: ##################
        !           771: ## Date/Time sr ##
        !           772: ##################
        !           773: sub GetDateTime  {
        !           774:   ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime (time);
        !           775:   $mon++;
        !           776: 
        !           777:   if ($hour < 12) {
        !           778:   $AMPM = "AM";
        !           779:   }
        !           780: 
        !           781:   if ($hour > 12) {
        !           782:   $hour = $hour - 12;
        !           783:     $AMPM = "PM";
        !           784:   }  	
        !           785:   if ($hour == 12) {
        !           786:     $AMPM = "PM";
        !           787:   }  	
        !           788: 	
        !           789:   if ($hour == 0) {
        !           790:     $hour = "12";
        !           791:   }
        !           792: 
        !           793:   $min = sprintf ("%2d", $min);
        !           794:   $min =~tr/ /0/;
        !           795:   $mon = sprintf ("%2d", $mon);
        !           796:   $mon =~tr/ /0/;
        !           797:   $mday = sprintf ("%2d", $mday);
        !           798:   $mday =~tr/ /0/;
        !           799:   $HyphenDate = ("$mon" . "-" . "$mday" . "-" . "$year");
        !           800:   $RunonDate = ("$mon$mday$year");
        !           801:   $Time = ("$hour" . ":" . "$min" . " " . "$AMPM");
        !           802: }
        !           803: 
        !           804: ########################
        !           805: ## Logging Subroutine ##
        !           806: ########################
        !           807: sub Log {
        !           808:   $logmsg = shift(@_);
        !           809:   
        !           810:   &GetDateTime;
        !           811: 
        !           812:   &Lock("lock.file");
        !           813:   open(LOG,">>$capadir/$class/discussion/logs/access.log");
        !           814:     print LOG "$snum|$capaid|$username|$email|$logmsg|$setid|$probnum|$HyphenDate|$Time\n";
        !           815:   close(LOG);
        !           816:   &Unlock("lock.file");
        !           817: }
        !           818: 
        !           819: ############################
        !           820: ## Lock/Unlock Subroutine ##
        !           821: ############################
        !           822: sub Lock {
        !           823:   local ($lockname) = @_;
        !           824:   local ($endtime);
        !           825:   $endtime = 15;
        !           826:   $endtime = time + $endtime;
        !           827:   
        !           828:   while (-e $lockname && time < $endtime) {
        !           829:     open (LOCKFILE, ">$lockname");
        !           830:   }
        !           831:   
        !           832: sub Unlock {
        !           833:   local ($lockname) = @_;
        !           834:   close (LOCKFILE);
        !           835:   unlink ($lockname);
        !           836:   }
        !           837: }
        !           838: 
        !           839: 
        !           840: ######################
        !           841: ## HTML Subroutines ##
        !           842: ######################
        !           843: 
        !           844: ## CapaDiscuss HTML Subroutines
        !           845: 
        !           846: # capadiscuss_html
        !           847: 
        !           848: ## end capadiscuss

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>