############################################ ## ## ## WebBBS ## ## by Darryl Burgdorf ## ## (e-mail burgdorf@awsd.com) ## ## ## ## version: 4.33 ## ## last modified: 6/8/00 ## ## copyright (c) 2000 ## ## ## ## latest version is available from ## ## http://awsd.com/scripts/ ## ## ## ############################################ sub Startup { if ($BannedIPsFile && ($BanLevel == 2)) { if ($ResolveIPs) { if (($ENV{'REMOTE_ADDR'} =~ /\d+\.\d+\.\d+\.\d+/) && (!($ENV{'REMOTE_HOST'}) || ($ENV{'REMOTE_HOST'} =~ /\d+\.\d+\.\d+\.\d+/))) { @domainbytes = split(/\./,$ENV{'REMOTE_ADDR'}); $packaddr = pack("C4",@domainbytes); $resolvedip = (gethostbyaddr($packaddr, 2))[0]; unless ($resolvedip =~ /^[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})$/) { $resolvedip = ""; } if ($resolvedip) { $ENV{'REMOTE_HOST'} = $resolvedip; } } } else { $ENV{'REMOTE_HOST'} = ""; } unless ($ENV{'REMOTE_HOST'}) { $ENV{'REMOTE_HOST'} = $ENV{'REMOTE_ADDR'}; } open (BANNED,"$BannedIPsFile"); @bannedips = ; close (BANNED); foreach $bannedip (@bannedips) { chomp ($bannedip); next if (length($bannedip) < 2); if (($ENV{'REMOTE_HOST'} =~ /$bannedip/i) || ($ENV{'REMOTE_ADDR'} =~ /$bannedip/i)) { require $webbbs_read; &Initialize_Data; &Error("9520","9521"); } } } if ($ENV{'QUERY_STRING'} =~ /noframes/i) { $UseFrames = ""; } if ((!($UseFrames) && ($ENV{'QUERY_STRING'} =~ /review=(\d+)/i)) || (!($UseFrames) && ($ENV{'QUERY_STRING'} =~ /rev=(\d+)/i)) || ($ENV{'QUERY_STRING'} =~ /read=(\d+)/i) || ($ENV{'QUERY_STRING'} =~ /form=(\d+)/i)) { require $webbbs_read; } elsif ($ENV{'QUERY_STRING'} =~ /post/i) { require $webbbs_post; } elsif (($ENV{'QUERY_STRING'} =~ /addresslist/i) || ($ENV{'QUERY_STRING'} =~ /delete/i) || ($ENV{'QUERY_STRING'} =~ /reconfigure/i) || ($ENV{'QUERY_STRING'} =~ /search/i) || ($ENV{'QUERY_STRING'} =~ /subscribe/i) || ($ENV{'QUERY_STRING'} =~ /topstats/i)) { require $webbbs_misc; } elsif ($ENV{'QUERY_STRING'} =~ /profile/i) { require $webbbs_profile; } else { require $webbbs_index; } } sub Parse_Form { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs){ ($val1, $val2) = split(/=/, $pair); $val1 =~ tr/+/ /; $val1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val2 =~ tr/+/ /; $val2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val2 =~ s/\cM\n*/\n/g; $val2 =~ s// /g; $val2 =~ s/<([^>]|\n)*>/ /g; $val2 =~ s/\&/\&\;/g; $val2 =~ s/"/\"\;/g; $val2 =~ s//\>\;/g; if (($val1 eq "listitems")) { @listitems = split(/\n/,$val2); } $val2 =~ s/\n/ /g; $val2 =~ s/\s+/ /g; $val2 =~ s/^\s+//g; $val2 =~ s/\s+$//g; if ($FORM{$val1}) { $FORM{$val1} = "$FORM{$val1} $val2"; } else { $FORM{$val1} = $val2; } } } sub Initialize_Data { umask (0111); if ($AdminRun) { $version = "Admin 4.32"; } else { $version = "4.33"; } $time = time; $todaydate = $time; $rebuildflag = 0; unless ($InputColumns) { $InputColumns = 80; } if ($InputColumns < 25) { $InputColumns = 25; } unless ($InputRows) { $InputRows = 15; } if ($InputRows < 5) { $InputRows = 5; } $InputLength = int($InputColumns/2); $TotalMessages = 0; $DisplayedMessages = 0; @messages = (); @sortedmessages = (); @keywordmatches = (); if (($ENV{'QUERY_STRING'} =~ /noframes/i) || ($ENV{'DOCUMENT_URI'} && ($cgiurl !~ /$ENV{'DOCUMENT_URI'}/)) || ($ENV{'QUERY_STRING'} =~ /quickinfo/i)) { $UseFrames = ""; $BBSquery = "?noframes;"; } else { $BBSquery = "?"; } if ($UseFrames) { $BBStarget = " TARGET=\"msgtxt\""; $BBStargetidx = " TARGET=\"msgidx\""; $BBStargettop = " TARGET=\"$BBSFrame\""; $SepPostFormIndex = 1; $SepPostFormRead = 1; } else { $BBStarget = ""; $BBStargetidx = ""; $BBStargettop = ""; } $maillist_link = ""; $maillist_link .= "$maillist_address<\/A>"; if ($AdminRun) { $DestinationURL = $adminurl; } else { $DestinationURL = $cgiurl; } foreach $key (keys %text) { $text{$key} =~ s//$boardname/g; $text{$key} =~ s//$cgiurl/g; $text{$key} =~ s//$maillist_address/g; $text{$key} =~ s//$maillist_link/g; $text{$key} =~ s///g; } if (($ENV{'QUERY_STRING'} =~ /blank/i) || ($UseFrames && !($ENV{'QUERY_STRING'})) || ($UseFrames && ($ENV{'QUERY_STRING'} =~ /moderate=0/i)) || ($UseFrames && ($ENV{'QUERY_STRING'} =~ /review=/i)) || ($UseFrames && ($ENV{'QUERY_STRING'} =~ /rev=/i)) || ($UseFrames && ($ENV{'QUERY_STRING'} =~ /rebuild/i))) { print "Content-type: text/html\n\n"; return; } if ($ArchiveOnly) { $AllowUserPrefs = 0; $UseCookies = 0; } if ($ListBullets) { $ul_dl = "UL"; $li_dd = "LI"; } else { $ul_dl = "DL"; $li_dd = "DD"; } $TableCellStart = ""; $TableInputCellStart = ""; $NavBarStart = "

"; $NavBarStart .= ""; $NavBarEnd = "

\n"; $navbar = ""; $printbar = 0; $CreditLink = "

$boardname $text{'9000'} "; unless ($admin_name) { $admin_name = $maillist_address; } if ($admin_name) { $CreditLink .= "$text{'9001'} "; if ($maillist_address) { $CreditLink .= ""; } $CreditLink .= "$admin_name"; if ($maillist_address) { $CreditLink .= ""; } $CreditLink .= " "; } $CreditLink .= "$text{'9002'} "; $CreditLink .= ""; $CreditLink .= "WebBBS $version.\n"; print "Content-type: text/html\n"; use Fcntl; use AnyDBM_File; if ($AdminRun) { unless ($UseLocking) { &MasterLockOpen; } &LockOpen (DBLOCK,"$dir/dblock.txt"); &MessageDBMWrite; if ($DisplayViews) { &LockOpen (COUNTLOCK,"$dir/countlock.txt"); unless ($NoCountLock) { &CountDBMWrite; } } } else { &MessageDBMRead; } @messages = (keys %MessageList); $TotalMessages = @messages; @sortedmessages = (sort {$a<=>$b} @messages); @messages = (); $lastmessage = $sortedmessages[@sortedmessages-1]; if ($FORM{'ListTimeB'} && $FORM{'ListType'} && !($AllowUserPrefs)) { $FORM{'ListTimeA'}=$FORM{'ListTimeB'}=""; $FORM{'ListType'}=$FORM{'ListSize'}=""; } if ($FORM{'ListTimeB'}) { $FORM{'ListTimeA'} = int($FORM{'ListTimeA'}); if ($FORM{'ListTimeA'} < 1) { $FORM{'ListTimeA'} = 1; } $FORM{'ListTime'} = "$FORM{'ListTimeA'} $FORM{'ListTimeB'}"; } if ($FORM{'ListSize'} eq "New") { $FORM{'ListTime'} = "New Only"; } $email = ""; $FORM{'email'} =~ s/\s//g; unless ($FORM{'email'} =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|,|;/ || $FORM{'email'} !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/) { $email = "$FORM{'email'}"; } if (length($email) > 100) { $email = ""; } $name = ""; if ($LockRemoteUser && $ENV{'REMOTE_USER'}) { $name = $ENV{'REMOTE_USER'}; } else { if ($FORM{'name'}) { $name = "$FORM{'name'}"; } $name = substr($name,0,$MaxInputLength); } $FORM{'url'} =~ s/\&\;/\&/g; $FORM{'url'} =~ s/\s//g; $FORM{'imageurl'} =~ s/\&\;/\&/g; $FORM{'imageurl'} =~ s/\s//g; unless ($FORM{'url'} =~ /\*|(\.\.)|(^\.)|(\/\/\.)/ || $FORM{'url'} !~ /.*\:\/\/.*\..*/) { $message_url = "$FORM{'url'}"; if ($FORM{'url_title'}) { $message_url_title = "$FORM{'url_title'}"; } else { $message_url_title = "$FORM{'url'}"; } } unless ($FORM{'imageurl'} =~ /\*|(\.\.)|(^\.)|(\/\/\.)/ || $FORM{'imageurl'} !~ /.*\:\/\/.*\..*/ || $FORM{'imageurl'} =~ /script:/) { $image_url = "$FORM{'imageurl'}"; } if (length($message_url) > 250) { $message_url = ""; } if (length($image_url) > 250) { $image_url = ""; } if ($UseCookies) { if ($AdminRun) { &SetAdminCookieData; } else { &SetCookieData; } } unless ($FORM{'ListTime'}) { $FORM{'ListTime'} = $DefaultTime; } unless ($FORM{'ListTime'}) { $FORM{'ListTime'} = "2 $text{'0062'}"; } unless ($FORM{'ListType'}) { if (!($AdminRun) && ($ENV{'HTTP_USER_AGENT'} =~ /Lynx/i )) { $FORM{'ListType'} = "Compressed"; } else { $FORM{'ListType'} = $DefaultType; } } unless ($FORM{'ListType'}) { $FORM{'ListType'} = "Chronologically"; } if ((($FORM{'ListType'} =~ /Guestbook/) || ($FORM{'ListType'} =~ /Compress/)) && ($IndexEntryLines eq "news")) { $IndexEntryLines = 2; } unless ($DateConfig) { $DateConfig = "%DY%, %dy% %MO% %YR%, at %hr%:%mn% %am%"; } unless ($NewOpenCode || $NewCloseCode) { $NewOpenCode = "NEW:"; } unless ($AdminOpenCode || $AdminCloseCode) { $AdminOpenCode = "ADMIN!"; } unless ($AutoQuoteChar) { $AutoQuoteChar = ":"; } $FormCount = 0; } sub PrintDate { unless ($_[0] =~ /^\d+$/) { return $_[0]; } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]+($HourOffset*3600)); if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } $hour24 = $hour; if ($hour24 < 10) { $hour24 = "0$hour24"; } $ampm = "a.m."; if ($hour eq 12) { $ampm = "p.m."; } if ($hour eq 0) { $hour = "12"; } if ($hour > 12) { $hour = ($hour - 12); $ampm = "p.m."; } $month = $months[$mon]; $mon ++; $yearlong = $year+1900; if ($year > 99) { $year = $year-100; } if ($year < 10) { $year = "0$year"; } $wday = $days[$wday]; $datestring = $DateConfig; $datestring =~ s/%mo%/$mon/g; $datestring =~ s/%MO%/$month/g; $datestring =~ s/%dy%/$mday/g; $datestring =~ s/%DY%/$wday/g; $datestring =~ s/%yr%/$year/g; $datestring =~ s/%YR%/$yearlong/g; $datestring =~ s/%am%/$ampm/g; $datestring =~ s/%sc%/$sec/g; $datestring =~ s/%mn%/$min/g; $datestring =~ s/%hr%/$hour/g; $datestring =~ s/%HR%/$hour24/g; return $datestring; } sub ThreadList { local (@threadresponses); local (@reversethread); local ($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = ""; ($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = split(/\|/,$MessageList{$_[0]}); &PrintMessageDesc($_[0]); if ($IndexEntryLines eq "news") { $indexspacer .= "      "; } else { print "<$ul_dl>\n"; } @threadresponses = split(/ /,$next); if ($FORM{'ListType'} eq "By Threads, Reversed") { @reversethread = reverse(@threadresponses); @threadresponses = @reversethread; } $lastresponse = ""; foreach $threadresponse (@threadresponses) { next unless ($threadresponse > $_[0]); next if ($threadresponse eq $lastresponse); if (($MessageList{$threadresponse}>0) && !($DontUse{$threadresponse})) { &ThreadList($threadresponse); $lastresponse = $threadresponse; } } if ($IndexEntryLines eq "news") { $indexspacer =~ s/      $//; } else { print "\n"; } $already{$_[0]} = 1; } sub PrintMessageDesc { local ($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = ""; ($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = split(/\|/,$MessageList{$_[0]}); $sub =~ s/&pipe;/\|/g; $poster =~ s/&pipe;/\|/g; if ($IndexEntryLines eq "news") { print "$TableCellStart"; print "$indexspacer"; if ($AdminRun) { if ($DeleteSelect) { print " "; } $ToBeDeleted .= " $_[0]"; } if ($admin eq "AdminPost") { print "$AdminOpenCode "; } if (($Cookies{'lastmessage'} && ($Cookies{'lastmessage'} < $_[0])) || ($newcount{$_[0]} > 0)) { print "$NewOpenCode "; } unless ($messagenumber == $_[0]) { print ""; } print "$sub"; unless ($messagenumber == $_[0]) { print ""; } if (($CountList{$_[0]} > 0) && ($DisplayViews == 1)) { unless (($FORM{'ListType'} =~ /Compress/) || ($FORM{'ListType'} =~ /Guestbook-Style, Thread/)) { print " ($text{'1010'}: $CountList{$_[0]})"; } } if (($Cookies{'lastmessage'} && ($Cookies{'lastmessage'} < $_[0])) || ($newcount{$_[0]} > 0)) { print " $NewCloseCode"; } if ($admin eq "AdminPost") { print " $AdminCloseCode"; } print "$TableCellStart"; print "$poster "; if ($DisplayIPs && $ip) { print " ($ip) "; } print "$TableCellStart",&PrintDate($date); print "\n"; } else { print "<$li_dd>"; if ($AdminRun) { if ($DeleteSelect) { print " "; } $ToBeDeleted .= " $_[0]"; } print ""; if ($admin eq "AdminPost") { print "$AdminOpenCode "; } if (($Cookies{'lastmessage'} && ($Cookies{'lastmessage'} < $_[0])) || ($newcount{$_[0]} > 0)) { print "$NewOpenCode "; } unless ($messagenumber == $_[0]) { print ""; } print "$sub"; unless ($messagenumber == $_[0]) { print ""; } print ""; if (($CountList{$_[0]} > 0) && ($DisplayViews == 1)) { unless (($FORM{'ListType'} =~ /Compress/) || ($FORM{'ListType'} =~ /Guestbook-Style, Thread/)) { print " ($text{'1010'}: $CountList{$_[0]})"; } } if ($IndexEntryLines == 1) { print " -- "; } else { print "
"; } print "$poster "; if ($DisplayIPs && $ip) { print " ($ip) "; } print "-- ",&PrintDate($date); if (($Cookies{'lastmessage'} && ($Cookies{'lastmessage'} < $_[0])) || ($newcount{$_[0]} > 0)) { print " $NewCloseCode"; } if ($admin eq "AdminPost") { print " $AdminCloseCode"; } print "\n"; } } sub PrintGuestbookDesc { unless ($NotFirstEntry) { print "$GuestbookSpacer"; $NotFirstEntry = 1; } $messagenumber = $_[0]; local($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = ""; ($date,$sub,$poster,$prev,$next,$count,$admin,$ip) = split(/\|/,$MessageList{$messagenumber}); if ($DisplayViews) { unless ($CountList{$messagenumber}) { $CountList{$messagenumber} = 0; } $CountList{$messagenumber}++; } $subdir = "bbs".int($messagenumber/1000); open (FILE,"$dir/$subdir/$messagenumber") || return; @message = ; close (FILE); $startup = 0; $admin=$subject=$poster=$email=$date=$image_url=$linkname=$linkurl=""; foreach $line (@message) { if ($line =~ /^SUBJECT>(.*)/i) { $subject = $1; } elsif ($line =~ /^ADMIN>AdminPost/i) { $admin = "AdminPost"; } elsif ($line =~ /^ADMIN>/i) { next; } elsif ($line =~ /^POSTER>(.*)/i) { $poster = $1; } elsif ($line =~ /^EMAIL>(.*)/i) { $email = $1; } elsif ($line =~ /^DATE>(.*)/i) { $date = $1; } elsif ($line =~ /^EMAILNOTICES>/i) { next; } elsif ($line =~ /^IP_ADDRESS>(.*)/i) { $ipaddress = $1; } elsif ($line =~ /^/i) { $SSIFile = $SSIRootDir.$2; open (SSIFILE,"<$SSIFile"); while () { print "$_"; } close (SSIFILE); } elsif (!($AdminRun) && ($line =~ //i)) { &insertadvert($1); } else { print "$line"; } } } } sub Header2 { local ($refresh) = @_; if (($refresh eq "refresh") || !($UseFrames)) { if ($AdminRun) { $navbar = $NavBarStart; if ($FORM{'delete'} =~ /tmp/) { $navbar .= " "; print "$boardname\n"; } } } sub Footer { local ($footer_file,$footer_type,$refresh) = @_; if ($RefreshTime && (($refresh eq "refreshalways") || (($refresh eq "refresh") && !($UseFrames)))) { print "\n

$text{'0150'}\n\n"; } elsif ($navbar && !$refresh) { print "$navbar"; } if ($footer_type eq "credits") { print "$CreditLink"; } if (!($SkipHF) && $footer_file) { open (FOOTER,"$footer_file"); @footer =