#!/usr/bin/perl

use CGI::Thin;
use CGI::Thin::Cookies;

sub gen_uuid($;$) {
	my $n = shift;
	my $c = shift;
	my $o = '';

	if ($c) {
		for(1..$n) {
			$o .= (($ch = int(rand(36))) > 9 ? chr(ord('a') + $ch - 10) : $ch);
		}
	} else {
		for(1..$n) {
			$o .= int(rand(10));
		}
	}
	
	if ($o =~ /(f.ck|sh.t|cr.p)/) {
		return gen_uuid($n, $c);
	}
	return $o;
}

my $doctype = qq{<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">};

@hosts = (
	["irc.surrealchat.net", "http://java.surrealchat.net"]
);

#@hosts = (
#	["nascent.surrealchat.net", "http://www.surrealchat.net"],
#	["frontier.surrealchat.net", "http://frontier.surrealchat.net/scnet"]
#);

%cgi = &Parse_CGI();
%cook = &Parse_Cookies();

if($nick = $cgi{'nick'}) {
	print &Set_Cookie(NAME=>'nick', VALUE=>$nick, DOMAIN=>'.surrealchat.net', EXPIRE=>'never');
}

if($password = $cgi{'password'} and $cgi{'savepass'}) {
	print &Set_Cookie(NAME=>'password', VALUE=>$password, DOMAIN=>'.surrealchat.net', EXPIRE=>'never');
}

my $userkey;
if(!($userkey = $cook{'key'}) or length($cook{'key'}) > 5 or $cook{'key'} =~ /(f.ck|sh.t|cr.p)/ ) {
	$userkey = gen_uuid(5, 1);
	print &Set_Cookie(NAME=>'key', VALUE=>$userkey, DOMAIN=>'.surrealchat.net', EXPIRE=>'never');
}

$password = $cook{'password'} unless $password;

# The following tests (and inside the else) are for broken browsers/'firewalls'
# that break the HTTP_REFERER. Example: 'badly' configured Norton Internet Security
# We use $referer for the GECOS field so that java portals may be identified

if($cgi{'pokemon'}) {
	our $pokemon = 1;
	$cgi{'chan'} = 'PokemonCrater';
	$cgi{'ref'} = 'http://www.pokemoncrater.com/';
}

if(defined($cgi{'ref'}) and !(($cgi{'ref'} eq '') or ($cgi{'ref'} =~ /^\s+$/))) {
	$referer = $cgi{'ref'};
} else {
	if (defined($ENV{HTTP_REFERER}) and !(($ENV{HTTP_REFERER} eq '') or ($ENV{HTTP_REFERER} =~ /^\s+$/))) {
		$referer = $ENV{HTTP_REFERER};
	}
	else {
		$referer = 'Unknown portal (broken browser)';
	}
	$cgi{'ref'} = $referer;
}

if(defined($cgi{'css'})) {
	$css = $cgi{'css'};
} else {
	$css = '/default.css';
}

if(defined($cgi{'chanlist'})) {
	$chanlist = $cgi{'chanlist'};
} else {
	$chanlist = 1;
}

$nick = $cgi{guestnick} if !$nick and $cgi{guestnick};

unless($nick =~ /^[][a-zA-Z`\\\|{}_][][a-zA-Z0-9`\\\|{}_-]*$/) {
	if($nick) {
		$msg = "<p>Erroneous nickname - nicknames must start with a letter and cannot contain spaces or certain punctuation.</p><p>Please enter a different nickname:</p>";
	} else {
		$cgi{guestnick} = 'Guest'.gen_uuid(5);
		$msg = "<p>Please enter a nickname:</p>";
	}
	$nick = $cook{'nick'} unless $nick;
	
	CHAT: print qq{Content-type: text/html

$doctype

<html><head>
<title>}.($pokemon ? 'PokemonCrater' : 'SurrealChat.net').qq{ Java Chat</title>
<script>var nocollapse=0</script>
<link rel="stylesheet" href="$css">
</head><body class="plain">
<div class="nmmain">};

if($pokemon) {
	print qq{
	<p style="color:red;font-weight:bold;">NOTICE:</p>
	<p>If PokemonCrater won\'t let you log in, the people in the chat room DON\'T KNOW why it\'s not working and WE CAN\'T DO ANYTHING. We don\'t know how long it will take either. Sorry.</p>
<form method="POST" action="/javaiframe2.cgi" target="pkmn_applet"
onSubmit="javascript:window.open('about:blank', 'pkmn_applet', 'menubar=no,location=no,resizable=no,scrollbars=no,status=yes,width=725,height=500');">};
}
else {
	print qq{<form method="POST" action="/javaiframe2.cgi">};
}
print qq{
$msg
<p>
};
foreach $k (keys(%cgi)) {
	next if $k eq 'nick';
	print qq{<input type="hidden" name="}.$k.qq{" value="}.$cgi{$k}.qq{">\n};
}
print qq{
<input type="text" name="nick" value="$nick">
<input type="submit" value="Enter"></p>
<p style="font-size: small">Note: If a Java Security window comes up, you need to click "Run"</p>
<div class="dropdown"
onmouseover="document.getElementById('advanced').style.display = 'block'"
onmouseout="if(!nocollapse) document.getElementById('advanced').style.display = 'none'">
<hr>
<p class="moreoptions">More options &raquo;</p>
<div id="advanced" class="dropdownitem">
<p>
NickServ password: <input type="password" name="password" value="$password"
onfocus="nocollapse=1;">
</p>
<p>
<input type="checkbox" value="1" checked="0" name="savepass" id="savepass"
onfocus="nocollapse=1;">
<label for="savepass">Remember password on this computer</label>
</p>
<p><input type="submit" value="Enter"></p>
</p>
</div>
</div>
</div>
</form>
</div></body></html>};

	exit;
}

$width = ($cgi{'w'} or 725);
$height = ($cgi{'h'} or 500);

push @commands, "/NS SID $nick $password" if $password;
push @commands, '/join #CraterTrades' if $pokemon;
#if(ref($cgi{'chan'})) {
#	my $x = $cgi{'chan'};

if($cgi{'chan'}) {
	foreach my $c (split(/,/, $cgi{'chan'})) {
		push @commands, '/join #' . $c;
	}
}

#}
#else {
#	push @commands, '/join #' . $cgi{'chan'};
#}

$ca = $cgi{'ca'};
$cb = $cgi{'cb'};
$cc = $cgi{'cc'};
$smil = $cgi{'smil'};

$r = int(rand(@hosts));

my $commands;
for(my $i=1; $i <= @commands; $i++) {
	my $v = $commands[$i-1];
	$commands .= qq{<param name="command$i" value="$v">\n};
}
print qq{Content-type: text/html

<html>
<head>
<title>SurrealChat.net</title>
</head>
<!-- smil = $smil -->
<body class="applet" style="margin: 0; padding: 0;">

<applet name="applet" class="applet" style="margin: 0; padding: 0;"
	codebase="${hosts[$r][1]}/pjirc-2.2.1/" code="IRCApplet.class"
	archive="irc.jar,pixx.jar,descbot.jar,alias.jar" width="$width" height="$height">

<param name="CABINETS" value="irc.cab,securedirc.cab,pixx.cab,descbot.cab,alias.cab">

<param name="plugin1" value="adnd.DescBot">
<param name="plugin2" value="adnd.Alias">

<param name="alias:key1" value="kb">
<param name="alias:command1_1" value="/CS KB \$chan \$-">

<param name="nick" value="$nick">
<param name="alternatenick" value="$nick-">
<param name="name" value="$referer">
<param name="userid" value="java-$userkey">
<param name="useidentserver" value="false">
<param name="host" value="${hosts[$r][0]}">
<param name="port" value="6668">
<param name="gui" value="pixx">

<param name="authorizedcommandlist" value="all-server-connect">
<param name="allowdccchat" value="false">
<param name="allowdccfile" value="false">
} . ($pokemon ? q{<param name="authorizedjoinlist" value="none+#pokemoncrater+#cratertrades+#help+#services">} : '') . qq{

<param name="coding" value="2">

<param name="pixx:styleselector" value="true">
<param name="pixx:setfontonstyle" value="true">
<param name="pixx:highlightnick" value="true">
<param name='pixx:nickfield' value='true'>
<param name='pixx:configurepopup' value='true'>
<param name='pixx:popupmenustring1' value='Whois'>
<param name='pixx:popupmenustring2' value='Query'>
<param name='pixx:popupmenustring3' value='Ban'>
<param name='pixx:popupmenustring4' value='Kick'>
<param name='pixx:popupmenustring5' value='Kick + Ban'>
<param name='pixx:popupmenustring6' value='--'>
<param name='pixx:popupmenustring7' value='Op'>
<param name='pixx:popupmenustring8' value='DeOp'>
<param name='pixx:popupmenustring9' value='Voice'>
<param name='pixx:popupmenustring10' value='DeVoice'>
<param name='pixx:popupmenustring11' value='--'>
<param name='pixx:popupmenustring12' value='Ping'>
<param name='pixx:popupmenustring13' value='Version'>
<param name='pixx:popupmenustring14' value='Time'>
<param name='pixx:popupmenustring15' value='Finger'>
<param name='pixx:popupmenucommand1_1' value='/Whois %1 %1'>
<param name='pixx:popupmenucommand2_1' value='/Query %1'>
<param name='pixx:popupmenucommand3_1' value='/CS BAN %2 %1'>
<param name='pixx:popupmenucommand4_1' value='/CS KICK %2 %1'>
<param name='pixx:popupmenucommand5_1' value='/CS KICKBAN %2 %1'>
<param name='pixx:popupmenucommand6_1' value=''>
<param name='pixx:popupmenucommand7_1' value='/CS OP %2 %1'>
<param name='pixx:popupmenucommand8_1' value='/CS DEOP %2 %1'>
<param name='pixx:popupmenucommand9_1' value='/CS VOICE %2 %1'>
<param name='pixx:popupmenucommand10_1' value='/CS DEVOICE %2 %1'>
<param name='pixx:popupmenucommand11_1' value=''>
<param name='pixx:popupmenucommand12_1' value='/CTCP PING %1'>
<param name='pixx:popupmenucommand13_1' value='/CTCP VERSION %1'>
<param name='pixx:popupmenucommand14_1' value='/CTCP TIME %1'>
<param name='pixx:popupmenucommand15_1' value='/CTCP FINGER %1'>

$commands
}.
($smil ? qq{
<param name="style:bitmapsmileys" value="true">
<param name="style:smiley1"  value="[4th] smileys/4thjuly.gif">
<param name="style:smiley2"  value="[ankh] smileys/ankh.gif">
<param name="style:smiley3"  value="[apple] smileys/apple.gif">
<param name="style:smiley4"  value="[balloon] smileys/balloon.gif">
<param name="style:smiley5"  value="[bomb] smileys/bomb.gif">
<param name="style:smiley6"  value="[butterfly] smileys/butterfly.gif">
<param name="style:smiley7"  value="[campfire] smileys/campfire.gif">
<param name="style:smiley8"  value="[canada] smileys/Canada.gif">
<param name="style:smiley9"  value="[candle] smileys/candle.gif">
<param name="style:smiley10" value="[car] smileys/car.gif">
<param name="style:smiley11" value="[castle] smileys/castle.gif">
<param name="style:smiley12" value="[cat-profile] smileys/cat-profile.gif">
<param name="style:smiley13" value="<3 smileys/heart.gif">
<param name="style:smiley14" value="[computer] smileys/computer.gif">
<param name="style:smiley15" value="[easterbasket] smileys/easterbasket.gif">
<param name="style:smiley16" value="[easteregg] smileys/easteregg.gif">
<param name="style:smiley17" value="[female] smileys/female.gif">
<param name="style:smiley18" value="[flower] smileys/flower.gif">
<param name="style:smiley19" value="[france] smileys/France.gif">
<param name="style:smiley20" value="[frown] smileys/frown.gif">
<param name="style:smiley21" value="[Have-A-Day] smileys/have-a-day.gif">
<param name="style:smiley22" value="[HotAirBalloon] smileys/hotairballoon.gif">
<param name="style:smiley23" value="[house] smileys/house.gif">
<param name="style:smiley24" value="[island] smileys/island.gif">
<param name="style:smiley25" value="[JackOLantern] smileys/jackolantern.gif">
<param name="style:smiley26" value="[japan] smileys/Japan.gif">
<param name="style:smiley27" value="[Jewish] smileys/Jewish.gif">
<param name="style:smiley28" value="[ladybug] smileys/ladybug.gif">
<param name="style:smiley29" value="[lightning] smileys/lightning.gif">
<param name="style:smiley30" value="[Male] smileys/male.gif">
<param name="style:smiley31" value="[moon] smileys/moon.gif">
<param name="style:smiley32" value="[muslim] smileys/Muslim.gif">
<param name="style:smiley33" value="[newyears] smileys/newyears.gif">
<param name="style:smiley34" value="[Om] smileys/Om.gif">
<param name="style:smiley35" value="[Pagan] smileys/Pagan.gif">
<param name="style:smiley36" value="[peace] smileys/peace.gif">
<param name="style:smiley37" value="[planet] smileys/planet.gif">
<param name="style:smiley38" value="[PrideFlag] smileys/prideflag.gif">
<param name="style:smiley39" value="[Rainbow] smileys/rainbow.gif">
<param name="style:smiley40" value="[SailBoat] smileys/sailboat.gif">
<param name="style:smiley41" value="[School] smileys/school.gif">
<param name="style:smiley42" value="[Shamrock] smileys/shamrock.gif">
<param name="style:smiley43" value="[Smiley] smileys/smiley.gif">
<param name="style:smiley44" value="[SnowMan] smileys/snowman.gif">
<param name="style:smiley45" value="[Spade] smileys/spade.gif">
<param name="style:smiley46" value="[Star] smileys/star.gif">
<param name="style:smiley47" value="[StockDown] smileys/stockdown.gif">
<param name="style:smiley48" value="[StockUp] smileys/stockup.gif">
<param name="style:smiley49" value="[StupidTurkey] smileys/stupidturkey.gif">
<param name="style:smiley50" value="[Sun] smileys/sun.gif">
<param name="style:smiley51" value="[SunGlasses] smileys/sunglasses.gif">
<param name="style:smiley52" value="[Swords] smileys/swords.gif">
<param name="style:smiley53" value="[TeddyBear] smileys/teddybear.gif">
<param name="style:smiley54" value="[Theatre] smileys/theatre.gif">
<param name="style:smiley55" value="[UFO] smileys/ufo.gif">
<param name="style:smiley56" value="[UK] smileys/UK.gif">
<param name="style:smiley57" value="[Umbrella] smileys/umbrella.gif">
<param name="style:smiley58" value="[Baseball] smileys/USbaseball.gif">
<param name="style:smiley59" value="[Flag] smileys/usflag.gif">
<param name="style:smiley60" value="[Football] smileys/USfootball.gif">
<param name="style:smiley61" value="[Soccer] smileys/USsoccer.gif">
<param name="style:smiley62" value="[XmasTree] smileys/xmastree.gif">
<param name="style:smiley63" value="[YinYang] smileys/yinyang.gif">
<param name="style:smiley64" value=":) img/sourire.gif">
<param name="style:smiley65" value=":-) img/sourire.gif">
<param name="style:smiley66" value=":-D img/content.gif">
<param name="style:smiley67" value=":d img/content.gif">
<param name="style:smiley68" value=":-O img/OH-2.gif">
<param name="style:smiley69" value=":o img/OH-1.gif">
<param name="style:smiley70" value=":-P img/langue.gif">
<param name="style:smiley71" value=":p img/langue.gif">
<param name="style:smiley72" value=";-) img/clin-oeuil.gif">
<param name="style:smiley73" value=";) img/clin-oeuil.gif">
<param name="style:smiley74" value=":-( img/triste.gif">
<param name="style:smiley75" value=":( img/triste.gif">
<param name="style:smiley76" value=":-| img/OH-3.gif">
<param name="style:smiley77" value=":| img/OH-3.gif">
<param name="style:smiley78" value=":'( img/pleure.gif">
<param name="style:smiley79" value=":$ img/rouge.gif">
<param name="style:smiley80" value=":-$ img/argh.gif">
<param name="style:smiley81" value="(H) img/cool.gif">
<param name="style:smiley82" value="(h) img/cool.gif">
<param name="style:smiley83" value=":-@ img/enerve1.gif">
<param name="style:smiley84" value=":@ img/enerve2.gif">
<param name="style:smiley85" value=":-S img/roll-eyes.gif">
<param name="style:smiley86" value=":s img/roll-eyes.gif">
<param name="style:smiley87" value="\}i\{ img/ange.gif">
<param name="style:smiley88" value="<B img/coeur.gif">
<param name="style:smiley89" value="@\}- img/fleur.gif">
} : '' ).
qq{
<param name="pixx:timestamp" value="true">
<param name="pixx:highlight" value="true">
<param name="pixx:highlightnick" value="true">
<param name="pixx:nickfield" value="true">
<param name="pixx:styleselector" value="true">
<param name="pixx:setfontonstyle" value="true">
}.
( $ca ? qq{<param name="pixx:color1" value="$ca">} : '').
( $cb ? qq{<param name="pixx:color5" value="$cb">} : '').
( $cc ? qq{<param name="pixx:color6" value="$cc">} : '').
qq{
</applet>
</body>
</html>
};
