2 # This is a module with functions for HTML output.
4 # I separate it from the main STUMP stuff because these functions are
5 # bulky and not very interesting.
10 use CGI qw/escapeHTML/;
13 my $title = pop( @_ );
15 "Content-Type: text/html\n\n
21 print "<B> You are operating in demonstration mode. User actions will have no effect.</B><HR>\n";
27 print "\n<HR>Thank you for using <A HREF=$STUMP_URL>STUMP Robomoderator</A>.
29 Click <A HREF=$base_address>here</A> to return to WebSTUMP. -->
33 # prints a link to help
34 # accepts topic id and topic name.
37 my $topic_name = pop( @_ );
38 my $topic = pop( @_ );
40 #&print_image( "help.gif", "" );
42 print "<A HREF=$base_address?action=help&topic=$topic TARGET=new>Click here for help on $topic_name</A>\n";
46 # prints image and an alt text
48 sub print_image { # image_file, alt_text
52 print "<IMG SRC=$base_address_for_files/images/$file ALT=\"$alt\" ALIGN=BOTTOMP>\n";
55 # prints the welcome page and login screen.
56 sub html_welcome_page {
57 &begin_html( "Welcome to WebSTUMP" );
61 "Welcome to WebSTUMP, the moderators' front end for <A
62 HREF=http://www.algebra.com/~ichudov/stump>STUMP</A> users -- USENET newsgroup
63 moderators. Only authorized users are allowed to log into this
68 my $motd_file = "$webstump_home/config/motd";
70 if( -f $motd_file && -r $motd_file ){
71 open( MOTD, $motd_file );
72 print "<B>Message of the Day:</B><BR><PRE>\n";
73 print while( <MOTD> );
79 Newsgroups Status:<BR>
82 for( sort @newsgroups_array ) {
85 my $count = &get_article_count( $_ );
87 print " <A HREF=$base_address?action=login_screen\&newsgroup=$_>$_</A>";
88 &print_image( "smiley.gif", "" ) if $count;
92 print "<TD>$count messages in queue<BR></TD>";
93 # print "<TD><A HREF=$base_address?action=init_request_newsgroup_creation\&newsgroup=$_>Request creation</A></TD>\n";
97 print "<HR>Note: click on the newsgroup to login in as moderator.
98 <!-- Click on 'Request Creation' to ask a sysadmin at a specific domain
99 to carry your newsgroup. -->\n<HR>
100 <A HREF=$base_address?action=admin_login>Click here to administer this WebSTUMP installation</A>
105 # prints the login screen for newsgroup.
106 sub html_login_screen {
107 my $newsgroup = $request{'newsgroup'} || &error( "newsgroup not defined" );
109 my $count = &get_article_count( $newsgroup );
113 &begin_html( "$count articles in queue for $newsgroup" );
115 &begin_html( "Empty Queue for $newsgroup" );
119 " Welcome to the Moderation Center for $newsgroup. Please bookmark
123 my $color = "", $end_color = "";
126 $color = "<font color=red>";
127 $end_color = "<font color=black>";
131 "<FORM METHOD=$request_method action=$base_address>
132 <INPUT NAME=action VALUE=moderation_screen TYPE=hidden>
135 &print_image( "new_tiny2.gif", "new" ) if $count;
137 print " articles available)<BR> $end_color
138 Login: <INPUT NAME=moderator VALUE=\"\" SIZE=20>
140 Password: <INPUT NAME=password TYPE=password VALUE=\"\" SIZE=20>
142 <INPUT TYPE=submit VALUE=\"Proceed with Login\">
143 <INPUT TYPE=reset VALUE=\"Reset\">
144 <INPUT NAME=newsgroup VALUE=\"$newsgroup\" TYPE=hidden>
146 Please log into $newsgroup. You can only log in if you know your login id
147 and know the secret password. You should not give your password to any
148 unauthorized user. Your login id and password are NOT case sentitive,
150 for example, \"xyzzy\" and \"XyZZY\" are equally valid.<P>
154 # Log in as \"admin\" if you want to
156 # <LI> edit filtering lists.";
158 # &link_to_help( "filter-lists", "Filter Lists" );
161 # <LI> add/delete users or change their passwords.
162 # <LI> First Time Users: You have to log in as admin and add a moderator user
163 # who will be able to moderate the newsgroup. Then log in again as that
164 # user. If you are a new user, you have to have your admin password assigned to
165 # you by the administrator.
172 # prints the login screen for newsgroup.
173 sub admin_login_screen {
174 &begin_html( "Administrative login" );
178 Attention: this page is only for the maintainer of the whole WebSTUMP
179 installation. Please return to the main page if you are not the maintainer
180 of this installation. <HR>
184 "<FORM METHOD=$request_method action=$base_address>
185 <INPUT NAME=action VALUE=webstump_admin_screen TYPE=hidden>
186 Password: <INPUT NAME=password TYPE=password VALUE=\"\" SIZE=20>
188 <INPUT TYPE=submit VALUE=\"Proceed with Login\">
189 <INPUT TYPE=reset VALUE=\"Reset\">
196 # main moderation page -- single-article version
197 sub html_moderate_article {
198 my $newsgroup = &required_parameter( 'newsgroup' );
199 my $moderator = $request{'moderator'};
200 my $password = $request{'password'};
201 my $file = shift @_ || &required_parameter('file');
203 &begin_html( "Main Moderation Screen: $newsgroup" );
206 &read_rejection_reasons;
208 my $dir = "$queues_dir/$newsgroup";
210 if( -d "$dir/$file" && open( TEXT_FILES, "$dir/$file/text.files.lst" ) ) {
212 print "<HR>\n" if &print_article_warning( $file );
217 while( $filename = <TEXT_FILES> ) {
218 open( ARTICLE, "$dir/$file/$filename" );
220 $embolden= m/^(?:from|subject)\s*\:/i;
224 $_= "<strong>$_</strong>" if $embolden;
226 $inhead= 0 unless m/\S/;
232 print "\n</PRE>\n\n";
234 &print_images( $newsgroup, "$dir/$file", $file);
237 print "This message ($dir/$file) no longer exists -- maybe it was " .
238 "approved or rejected by another moderator.";
242 <FORM NAME=decision METHOD=$request_method action=$base_address>
246 <INPUT NAME=action VALUE=approval_decision TYPE=hidden>";
247 &html_print_credentials;
248 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=approve>Approve\n";
249 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=skip>Leave\n";
250 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=leave>Back of queue\n";
251 foreach (@short_rejection_reasons) {
252 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=\"reject $_\">Reject \u$_\n";
255 print "<BR> <BR> Comment (to poster, in rejection message): <INPUT NAME=comment VALUE=\"\" SIZE=80><BR>";
258 <INPUT TYPE=radio NAME=poster_decision VALUE=nothing CHECKED>Don't change poster's status</INPUT>
259 <INPUT TYPE=radio NAME=poster_decision VALUE=preapprove
260 >White-list poster</INPUT>
261 <INPUT TYPE=radio NAME=poster_decision VALUE=suspicious>
262 Add poster to watch list</INPUT>
266 NOTE: Decisions to watchlist and whitelist posters can be reversed by
267 editing the respective lists of whitelisted and watchlisted posters.
270 &link_to_help( "filter-lists", "automatic filtering and filter lists, blacklisting and preapproved threads." );
274 <INPUT TYPE=radio NAME=next_screen VALUE=single CHECKED>
275 Review ONE article in next screen
276 <INPUT TYPE=radio NAME=next_screen VALUE=multiple>
277 Review multiple articles in next screen
280 <INPUT TYPE=submit VALUE=\"Submit\">
281 <INPUT TYPE=submit NAME=skip_submit VALUE=\"Skip\">
282 <INPUT TYPE=reset VALUE=\"Reset\">
286 print "<FORM METHOD=$request_method action=$base_address>";
287 &html_print_credentials;
288 print "<INPUT NAME=action VALUE=moderator_admin TYPE=hidden>
289 <INPUT TYPE=submit VALUE=\"Go to Management Page Instead of Moderating This Post\">
291 print "<BR><A HREF=$base_address?action=change_password&newsgroup=$newsgroup&" .
292 "moderator=$moderator&password=$password>Change Password</A>";
298 # WebSTUMP administrative screen
299 sub webstump_admin_screen {
301 &verify_admin_password;
303 my $password = $request{'password'};
305 &begin_html( "WebSTUMP Administration" );
307 <FORM METHOD=$request_method action=$base_address>
308 <INPUT NAME=action VALUE=admin_add_newsgroup TYPE=hidden>
309 <INPUT NAME=password VALUE=\"$password\" TYPE=hidden>\n";
314 Create a new newsgroup on the server:<BR>
316 Newsgroup:<BR> <INPUT NAME=newsgroup_name VALUE=\"\" SIZE=50><BR>
317 Address to send approved/rejected messages <BR>
318 <INPUT NAME=newsgroup_approved_address VALUE=\"\" SIZE=30><BR>
319 Admin Password For this group:<BR> <INPUT NAME=newsgroup_password VALUE=\"\" SIZE=10><BR>
320 <INPUT TYPE=submit VALUE=\"Submit\">
321 <INPUT TYPE=reset VALUE=\"Reset\"><HR>
324 print "</FORM>\n\n<PRE>\n";
329 # WebSTUMP "add newsgroup" function
330 sub admin_add_newsgroup {
332 &verify_admin_password;
334 my $newsgroup = &required_parameter( 'newsgroup_name' );
336 $newsgroup =~ s/\///g;
337 $newsgroup = &untaint( $newsgroup );
339 my $address = &required_parameter( 'newsgroup_approved_address' );
340 my $password = &required_parameter( 'newsgroup_password' );
342 &user_error( "Newsgroup $newsgroup already exists" )
343 if defined $newsgroups_index{$newsgroup};
345 &user_error( "Password may only contain letters and digits" )
346 if( ! ($password =~ /^[a-zA-Z0-9]+$/ ) );
348 &begin_html( "WebSTUMP Administration: Newsgroup created" );
352 print "Adding $newsgroup to $webstump_home/config/newsgroups.lst...";
353 mkdir "$webstump_home/queues/$newsgroup", 0755;
356 $dir = "$webstump_home/config/newsgroups/$newsgroup";
358 print "Creating $dir...";
362 print "Creating files in $dir...";
364 &append_to_file( "$dir/address.txt", "$address\n" );
365 &append_to_file( "$dir/moderators", "ADMIN \U$password\n" );
366 &append_to_file( "$dir/rejection-reasons",
367 "offtopic::a blatantly offtopic article, spam
368 harassing::message of harassing content
369 charter::message poorly formatted
382 $web_subdir = pop( @_ );
384 $newsgroup = pop( @_ );
386 opendir( SUBDIR, $subdir );
390 while( $_ = readdir( SUBDIR ) ) {
391 my $file = "$subdir/$_";
392 next if( ! -f $file || ! -r $file );
393 my $extension = $file;
394 $extension =~ s/^.*\.//;
395 $extension = "\L$extension";
397 if( $extension eq "gif" || $extension eq "jpg" || $extension eq "jpeg" ) {
398 print "<CENTER> <IMG SRC=$base_address_for_files/queues/$newsgroup/$web_subdir/$_></CENTER><HR>\n";
402 $filename =~ s/^.*\///;
403 next if $filename eq "skeleton.skeleton"
404 || $filename eq "headers.txt"
405 || $filename eq "full_message.txt"
406 || $filename eq "text.files.lst"
407 || $filename eq "stump-prolog.txt"
408 || $filename eq "stump-warning.txt"
409 || $filename =~ /msg-.*\.doc/;
411 &print_image( "no_image.gif", "security warning" );
412 print "<B>Non-image attachment:</B><CODE>$filename</CODE> NOT SHOWN for security reasons.<BR>\n";
418 # prints warning if there is warning stored about the article
419 sub print_article_warning { # short-subdir
420 my $file = pop( @_ );
422 my $warning_file = &article_file_name( $file ) . "/stump-warning.txt";
424 if( -r $warning_file ) {
425 open( WARNING, $warning_file );
426 while ($warning = <WARNING>) {
427 next unless $warning =~ m/\S/;
428 $warning =~ s/\&/&/g;
429 $warning =~ s/</</g;
430 $warning =~ s/>/>/g;
431 &print_image( "star.gif", "warning" );
432 print "<FONT COLOR=red>$warning</FONT><br>\n";
441 sub get_queue_list ($) {
442 my ($newsgroup) = @_;
443 my $dir = "$queues_dir/$newsgroup";
446 opendir(QUEUED, $dir) or &error("could not open directory $dir");
450 my $subdir= scalar readdir(QUEUED);
451 last unless defined $subdir;
453 my $subpath= "$dir/$subdir";
454 next if $subdir =~ /^\.+/;
455 next unless -d $subpath;
457 if (!stat "$subpath/stump-warning.txt") {
458 $!==&ENOENT or die "$subpath $!";
461 $sortkey= (stat _)[9];
463 $sortkeys{$subdir}= $sortkey;
466 my @articles= sort { $sortkeys{$a} <=> $sortkeys{$b} } keys %sortkeys;
467 return ($dir, @articles);
470 # main moderation page -- multiple-articles version
471 sub html_moderation_screen {
472 my $newsgroup = &required_parameter( 'newsgroup' );
473 my $moderator = $request{'moderator'};
474 my $password = $request{'password'};
477 if( $request{'next_screen'} eq 'single' ) {
478 # we show a single article if the user so requested.
479 # just get the first article from the queue if any, otherwise show
480 # an empty main screen.
482 my ($dir, @articles)= get_queue_list($newsgroup);
485 for ($i=0; $i<@articles; $i++) {
486 my $subdir= shift @articles;
487 push @articles, $subdir;
488 last if $request{"decision_$subdir"};
491 while( $subdir = shift @articles ) {
492 if( -d "$dir/$subdir" && !($subdir =~ /^\.+/)
493 && open( PROLOG, "$dir/$subdir/stump-prolog.txt" ) ) {
494 &html_moderate_article( $subdir );
499 # otherwise just show the moderator an empty main screen.
502 &begin_html( "Main Moderation Screen: $newsgroup" );
503 print "Welcome to the main moderation screen. Its main purpose is to
504 help you process most messages extremely quickly. For every message, it
505 presents you who sent it, as well as the first three non-blank lines.
506 For those messages where the decision is obvious, simply select your
507 decision (approve/reject etc) and click submit. For those messages which
508 you would like to review in more details, do not select anything and
509 use Review/Comment function from this screen or from a subsequent screen.
510 Remember that if you do not make any decision, the article would stay in the
513 &read_rejection_reasons;
515 my ($dir, @articles)= get_queue_list($newsgroup);
518 <FORM METHOD=$request_method action=$base_address>
519 <INPUT NAME=action VALUE=approval_decision TYPE=hidden>";
520 &html_print_credentials;
522 print "<HR> <INPUT TYPE=submit VALUE=Submit>
523 <INPUT TYPE=reset VALUE=Reset>
526 my $file, $subject = "No Subject", $from = "From nobody";
527 my $form_not_empty = "";
528 my $article_count = 0;
530 while( ($subdir = shift @articles) && $article_count++ < 40 ) {
532 if( -d "$dir/$subdir" && !($subdir =~ /^\.+/)
533 && open( PROLOG, "$dir/$subdir/stump-prolog.txt" ) ) {
536 if( /^Real-Subject: /i ) {
540 s/^Real-Subject: //g;
541 $subject = substr( $_, 0, 50 );
542 } elsif( /^From: /i ){
546 $from = substr( $_, 0, 50 );
552 print "<HR><B>$from: $subject</B>(";
553 print "<A HREF=$base_address?action=moderate_article&newsgroup=$newsgroup&" .
554 "moderator=$moderator&password=$password&file=$subdir>Review/Comment/Whitelist</A>)<BR>\n";
555 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=approve>Approve\n";
556 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=skip>Leave\n";
557 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=leave>Back of queue\n";
558 foreach (@short_rejection_reasons) {
559 print "<INPUT TYPE=radio NAME=\"decision_$file\" VALUE=\"reject $_\">Reject \u$_\n";
564 &print_article_warning( $file );
570 while( ($_ = <PROLOG>) && $i < 5 ) {
577 print "] " . substr( $_, 0, 75 ) . "\n";
583 $form_not_empty = "yes";
585 $article_count += &print_images( $newsgroup, "$dir/$subdir", $subdir );
589 if( $form_not_empty ) {
590 print "<HR> <INPUT TYPE=submit VALUE=Submit>
591 <INPUT TYPE=reset VALUE=Reset>
596 No articles present in the queue
597 <INPUT TYPE=submit VALUE=Refresh>
601 print "<A HREF=$base_address?action=change_password&newsgroup=$newsgroup&" .
602 "moderator=$moderator&password=$password>Change Password</A>";
606 print "<FORM METHOD=$request_method action=$base_address>";
607 &html_print_credentials;
608 print "<INPUT NAME=action VALUE=moderator_admin TYPE=hidden>
609 <INPUT TYPE=submit VALUE=\"Management\">
615 # prints hidden fields -- credentials
616 sub html_print_credentials {
617 my $newsgroup = $request{'newsgroup'};
618 my $moderator = $request{'moderator'};
619 my $password = $request{'password'};
622 <INPUT NAME=newsgroup VALUE=\"$newsgroup\" TYPE=hidden>
623 <INPUT NAME=moderator VALUE=\"$moderator\" TYPE=hidden>
624 <INPUT NAME=password VALUE=\"$password\" TYPE=hidden>\n";
630 my ($forwards, $gotr, $callback) = @_;
631 my $dir= "$webstump_home/..";
632 opendir LOGSDIR, "$dir" or die "$dir $!";
637 m/^errs\.(\d+)(?:\.gz$)$/ ? $1 :
642 sort { $num->($a) <=> $num->($b) }
643 grep { defined $num->($_) }
646 my $file= "$dir/$leaf";
647 if ($file =~ m/\.gz$/) {
648 open LOGFILE, "zcat $file |" or die "zcat $file $!";
650 open LOGFILE, "< $file" or die "$file $!";
653 my $tgot= $callback->();
655 $$gotr= $tgot if $tgot > $$gotr;
658 $!=0; $?=0; close LOGFILE or die "$file $? $!";
661 closedir LOGSDIR or die "$dir $!";
664 sub html_search_logs {
665 &begin_html("Search logs for $request{'newsgroup'}");
669 if ($request{'download_logs'}) {
670 print "<h2>Complete log download</h2>\n";
672 } elsif ($request{'messagenum'} =~ m/^\s*(\d+)\s*$/) {
676 print "<h2>Log entry for single message $reqnum</h2>\n";
678 print "<h2>Log lookup - bad reference</h2>
679 Please supply the numerical reference as found in the \"recent activity\"
680 log or message headers. Reference numbers consist entirely of digits,
681 and are often quoted in message headers in [square brackets].<p>
686 if ($mod_log_access < $min) {
687 print "Not permitted [$mod_log_access<$min]. Consult administrator.\n";
693 &scanlogs($forwards, \$sofar, sub {
694 return 0 unless chomp;
695 return 0 unless m/^DECISION: /;
696 my @vals = split / \| /, $';
697 return 0 unless @vals >= 5;
699 my ($group,$dir,$act,$reason,$timet) = @vals;
700 my $date= $timet ? (strftime "%Y-%m-%d %H:%M:%S GMT", gmtime $timet)
702 return 0 unless $group eq $request{'newsgroup'};
703 return 0 unless $subj =~ m,/(\d+)$,;
705 return 0 if defined($reqnum) and $treqnum ne $reqnum;
706 print "<table rules=all><tr><th>Date<th>Reference<th>Disposal<th>Reason</tr>\n"
708 print "<tr>", (map { "<td>".escapeHTML($_) }
709 $date,$treqnum,$act,$reason);
711 return defined($reqnum) ? 2 : 1;
714 print "</table>" if $sofar;
717 print "Reference not found.".
718 " (Perhaps message has expired, or is still in the queue?)";
723 # newsgroup admin page
724 sub html_newsgroup_management {
725 &begin_html( "Administer $request{'newsgroup'}" );
727 print "All usernames and passwords are not case sensitive.\n";
728 print "<HR>Use this form to add new moderators or change passwords:<BR>
729 <FORM METHOD=$request_method action=$base_address>
730 <INPUT NAME=action VALUE=add_user TYPE=hidden>";
731 &html_print_credentials;
733 Username: <INPUT NAME=user VALUE=\"\" SIZE=20>
735 Password: <INPUT NAME=new_password VALUE=\"\" SIZE=20>
737 <INPUT TYPE=submit VALUE=\"Add/Change\">
738 <INPUT TYPE=reset VALUE=Reset>
742 print "<HR>Use this form to delete moderators:<BR>
743 <FORM METHOD=$request_method action=$base_address>
744 <INPUT NAME=action VALUE=delete_user TYPE=hidden>";
745 &html_print_credentials;
747 Username: <INPUT NAME=user VALUE=\"\" SIZE=20>
749 <INPUT TYPE=submit VALUE=\"Delete Moderator\">
750 <INPUT TYPE=reset VALUE=Reset>
753 <FORM METHOD=$request_method action=$base_address>
754 <INPUT NAME=action VALUE=edit_list TYPE=hidden>";
755 &html_print_credentials;
757 Configuration List: <SELECT NAME=list_to_edit>
759 <OPTION VALUE=good.posters.list>Good Posters List
760 <OPTION VALUE=watch.posters.list>Suspicious Posters List
761 <OPTION VALUE=watch.words.list>Suspicious Words List
764 <INPUT TYPE=submit VALUE=\"Edit\">
765 <INPUT TYPE=reset VALUE=Reset>";
767 &link_to_help( "filter-lists", "filtering lists" );
771 if ($mod_log_access) {
773 Use this form to search logs of past moderation decisions:
775 <form method=$request_method action=$base_address>
776 <input name=action value=search_logs type=hidden>";
778 &html_print_credentials;
781 Reference number: <input name=messagenum size=30>
782 <input type=submit value=\"Lookup\">";
785 <input type=submit value=\"Download all logs\" name=\"download_logs\">"
786 if $mod_log_access >= 2;
788 print "</form><hr>\n";
793 List of current moderators:<P>
797 foreach (keys %moderators) {
803 print "<HR><FORM METHOD=$request_method action=$base_address>";
804 &html_print_credentials;
805 print "<INPUT NAME=action VALUE=moderation_screen TYPE=hidden>
806 <INPUT TYPE=submit VALUE=\"Go to moderation screen\">
814 sub edit_configuration_list {
816 my $list_to_edit = &required_parameter( 'list_to_edit' );
818 $list_to_edit = &check_config_list( $list_to_edit );
820 my $list_file = &full_config_file_name( $list_to_edit );
822 my $list_content = "";
824 if( open( LIST, $list_file ) ) {
825 $list_content .= $_ while( <LIST> );
829 $list_content =~ s/\&/&/g;
830 $list_content =~ s/</</g;
831 $list_content =~ s/>/>/g;
833 &begin_html( "Edit $list_to_edit" );
836 " <FORM METHOD=$request_method action=$base_address>
837 <INPUT NAME=action VALUE=set_config_list TYPE=hidden>
838 <INPUT NAME=list_to_edit VALUE=$list_to_edit TYPE=hidden>";
839 &html_print_credentials;
840 &link_to_help( $list_to_edit, "$list_to_edit" );
843 <TEXTAREA NAME=list rows=20 COLS=50>
844 $list_content</TEXTAREA>
847 <INPUT TYPE=submit VALUE=\"Set\">
854 # password change page
855 sub html_change_password{
856 &begin_html( "Change Password" );
858 print "All usernames and passwords are not case sensitive.\n";
859 print "<HR>Use this form to change your password:<BR>
860 <FORM METHOD=$request_method action=$base_address>
861 <INPUT NAME=action VALUE=validate_change_password TYPE=hidden>";
862 &html_print_credentials;
865 New Password: <INPUT NAME=new_password VALUE=\"\" SIZE=20>
867 <INPUT TYPE=submit VALUE=Submit>
868 <INPUT TYPE=reset VALUE=Reset>
876 # newsgroup creation form
877 sub init_request_newsgroup_creation{
878 my $newsgroup = &required_parameter( 'newsgroup' );
880 &begin_html( "Request Creation of $newsgroup" );
882 print "This page helps you ask the system administrator of your domain
883 to create <B>$newsgroup</B> on your server. Type in your domain name and
884 click SUBMIT. An email will be sent to news\@domain and usenet\@domain
885 and postmaster\@domain
886 asking them to create your newsgroup. Please do NOT abuse this system.
887 NOTE: You can give the URL of this page to your group readers so that
888 they could request creation of their newsgroups by themselves.\n";
891 <FORM METHOD=$request_method action=$base_address>
892 <INPUT NAME=action VALUE=complete_newsgroup_creation_request TYPE=hidden>\n";
893 &html_print_credentials;
896 Domain Name ONLY: <INPUT NAME=domain_name VALUE=\"\" SIZE=40>
898 <INPUT TYPE=submit VALUE=Submit>
899 <INPUT TYPE=reset VALUE=Reset>
907 # newsgroup creation completion
908 sub complete_newsgroup_creation_request{
909 my $newsgroup = &required_parameter( 'newsgroup' );
910 my $domain_name = &required_parameter( 'domain_name' );
912 if( !($domain_name =~ /(^[a-zA-Z0-9\.-_]+$)/) ) {
913 &user_error( "invalid domain name" );
919 my $request = "To: news\@$domain_name, usenet\@$domain_name, postmaster\@$domain_name
920 Subject: Please create $newsgroup (Moderated)
921 From: devnull\@algebra.com ($newsgroup Moderator)
922 Organization: stump.algebra.com
924 Dear News Administrator:
926 A user of $domain_name has requested that you create a newsgroup
928 $newsgroup (Moderated)
930 on your server. $newsgroup
931 is a legitimately created moderated newsgroup that is available worldwide.
933 Thank you very much for your help and cooperation.
937 - Moderator of $newsgroup.
941 &email_message( $request, "news\@$domain_name" );
942 &email_message( $request, "usenet\@$domain_name" );
943 &email_message( $request, "postmaster\@$domain_name" );
945 &begin_html( "Request to create $newsgroup sent" );
947 print "The following request has been sent:<HR><PRE>\n";
949 print "$request</PRE>\n";
956 my $topic_name = &required_parameter( "topic" );
958 $topic_name =~ s/\///g;
959 $topic_name =~ s/\.\.//g;
960 $topic_name = &untaint( $topic_name );
962 my $file = "$webstump_home/doc/help/$topic_name.html";
964 &error( "Topic $topic_name not found in $file." )
967 open( FILE, "$file" );
969 $help .= $_ while( <FILE> );
972 $help =~ s/##/$base_address?action=help&topic=/g;
974 &begin_html( "$topic_name" );