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