#!/usr/bin/perl -w

my $SITY_LOGIN="yanek";
my $SITY_PASS="xxxxxxxxxxx";

# SITY nejde !

#my $proxy = "localhost:3128";
# SendSMS v2.0-alpha by yanek
# $Id: sendsms.pl,v 1.4 2002/02/16 08:27:03 root Exp $

require IO::Socket::INET;
use HTML::TokeParser;
use MIME::Base64;
use MIME::QuotedPrint;
use Cz::Cstocs;

# otevri log
open(LOG,">>sms.log");
#select(LOG); 
$| = 1;

# rozparsuj mail patri
my ($mail,$subject,$email,$name) = &GetTextFromSTDIN;

my $celecislo = $ENV{'EXT'};
my ($zeme,$predvolba,$cislo,$options) = qw(0 0 0 undef);

if ($celecislo =~ /^(\d*)-(\d*)-(\d*)-?(.*)?$/) { 
	($zeme,$predvolba,$cislo,$options) = ($1,$2,$3,$4); 
}

#($zeme,$predvolba,$cislo,$options) = qw(421 905 623114 nofrom); # dragon

my $long = 0;
my $gate = 'unsupported';
#if    (($zeme eq '420') && ($predvolba eq '601')) { $gate = 'eurotel'; } # CZ-Eurotel NMT
#elsif (($zeme eq '420') && ($predvolba eq '602')) { $gate = 'eurotel'; } # CZ-Eurotel GSM
#elsif (($zeme eq '420') && ($predvolba eq '603')) { $gate = 'paegas'; } # CZ-Paegas GSM
#elsif (($zeme eq '420') && ($predvolba eq '604')) { $gate = 'paegas'; } # CZ-Paegas GSM
#elsif (($zeme eq '420') && ($predvolba eq '605')) { $gate = 'paegas'; } # CZ-Paegas GSM
#elsif (($zeme eq '420') && ($predvolba eq '606')) { $gate = 'eurotel'; } # CZ-Eurotel GSM
#elsif (($zeme eq '420') && ($predvolba eq '607')) { $gate = 'eurotel'; } # CZ-Eurotel GSM
if    (($zeme eq '420') && ($predvolba eq '608')) { $gate = 'oskar'; } # CZ-Oskar GSM
elsif (($zeme eq '420') && ($predvolba eq '776')) { $gate = 'oskar'; } # CZ-Oskar GSM
elsif (($zeme eq '420') && ($predvolba eq '777')) { $gate = 'oskar'; } # CZ-Oskar GSM

#elsif (($zeme eq '420') && ($predvolba eq '71')) { $gate = 'unsupported'; $long = 1; } # CZ-??? GSM
#elsif (($zeme eq '420') && ($predvolba eq '72')) { $gate = 'unsupported'; $long = 1; } # CZ-??? GSM
#elsif (($zeme eq '420') && ($predvolba eq '73')) { $gate = 'unsupported'; $long = 1; } # CZ-??? GSM
elsif (($zeme eq '421') && ($predvolba eq '903')) { $gate = 'sity'; $long = 1; } # SK-Eurotel
elsif (($zeme eq '421') && ($predvolba eq '904')) { $gate = 'sity'; $long = 1; } # SK-Eurotel
elsif (($zeme eq '421') && ($predvolba eq '905')) { $gate = 'sity'; $long = 1; } # SK-Globtel
elsif (($zeme eq '421') && ($predvolba eq '907')) { $gate = 'sity'; $long = 1; } # SK-Globtel

&Log("Incoming SMS from: ".$email." / ".$name);
&Log("SMS for: $zeme * $predvolba * $cislo");

$mail =~ s/(\n|\r)+//g;
$subject =~ s/(\n|\r)+//g;

&Log("Subject: ".$subject);

if ($options =~ /nofrom/) {
	$email = '';
}
my $message = &smsstrip($email,$subject,$mail);

&Log("SMS content: ".$message);
&Log("Sending via: ".$gate);

my $key;

if ($gate eq 'oskar') { $key = &getkeyfromoskar; } 
elsif ($gate eq 'sity') { $key = &getkeyfromsity; }
else { $key = 'unknown'; }

&Log("KEY for gate ($gate): ".$key);

if ($gate eq 'oskar') {
    &Log("Sending");
    &send_to_oskar($key,$cislo,$message);	
    &Log("Sended");
}
elsif ($gate eq 'sity') {
    &Log("Sending");
    &send_to_sity($key,$zeme,$predvolba,$cislo,$message);
    &Log("Sended");
}
else
{
    &Log("Send unsupported!");
	#TODO: bounceback to irc
}
&Log("Exit");
close(LOG);
exit;

# ====
# SUBS
# ====

sub Log {
    my $co = shift;
    print LOG "[".localtime()."] [".$$."] ".$co."\n";    
#    print STDERR "[".localtime()."] [".$$."] ".$co."\n";    
}

sub GetTextFromSTDIN {
	my $body = 1;
	my ($text,$subject,$email,$name) = qw();
	while (<STDIN>) {
		if ($body) {
			if (/subject: (.*)/i) {	$subject = $1; chomp($subject); &Log('SUBJECT: '.$subject); }
			if (/from: (.*)/i) {	
				&Log('FROM: '.$1);
				($name,$email) = &_extract_name($1);
				&Log('   |-- email: '.$email);
				&Log('   `-- name: '.$name);				
			}
			if (/^\n$/) { $body = 0; }
		} else {
			s/\r?\n//g;
			$text .= &plainize($_);
			&Log('BODY: '.$_);			
		}
	}
    return ($text,$subject,$email,$name);
}

sub getkeyfromoskar {
    my $status = `lynx --source http://sms.oskarmobil.cz/s_main.php3?locale=cz > /tmp/sms.$$`;
	my $p = HTML::TokeParser->new("/tmp/sms.$$");
    while (my $token = $p->get_tag("input")) {
        my $name = $token->[1]{name} || "-";
        my $value = $token->[1]{value} || "-";
        if ($name eq "ppp") { 
    		unlink("/tmp/sms.$$");
			return $value; 
		}
    }
    return "-";
}

sub send_to_oskar {
	$ppp = &norm(shift);
	$cislo = &norm(shift);
	$message = &norm(shift);
	$socket = IO::Socket::INET->new('sms.oskarmobil.cz:80') or die "neni";
	$socket->autoflush(1);	
	$data = 'ppp='.$ppp.'&number='.$cislo.'&message='.$message.'&predcisli=0'.$predvolba;
	$delka = length($data);
	$header  = "POST http://sms.oskarmobil.cz/send.php3 HTTP/1.1\n";
	$header .= "Host: sms.oskarmobil.cz\n";
	$header .= "Accept: application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\n";
	$header .= "Accept-Encoding: gzip, deflate\n";
	$header .= "Accept-Language: cs,cz;q=0.5\n";
	$header .= "Content-Length: ".$delka."\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\n";
	$header .= "Pragma: no-cache\n";
	$header .= "Referer: http://sms.oskarmobil.cz/s_main.php3?locale=cz\n";
	$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; MSNATLAS01.CZ)\n";
	$header .= "\n" . $data . "\n";	
	print $socket $header;
	$line = <$socket>;
	if ($line =~ /HTTP\/\d.\d (\d*) (.*)/) {
		return(1) if $1 == 200;
	} 
}

sub refresh_sity {
    my $out;
    my $socket = IO::Socket::INET->new(($proxy ? $proxy : 'www.sity.sk:80')) or die "neni";
    $socket->autoflush(1);

    my $header  = "GET http://www.sity.sk/pls/sity/home HTTP/1.0\n";
	$header .= "Host: www.sity.sk\n";
	$header .= "Accept: application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\n";
	$header .= "Accept-Language: cs,cz;q=0.5\n";
	$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; MSNATLAS01.CZ)\n";
	$header .= "\n";

    print $socket $header;
    my $daata;
#    open(FEEHAOUT,">/tmp/sms.$$-stage-1");
    while (<$socket>) {
#    my $a = $_;
#    chomp($a);
#    &Log($_);
#		if ($daata) {
       s/\r?\n//g;
       &Log($_);
	        if (/^Set-Cookie: SITY=(.*)$/) {
		   $out = $1;
		}
#	    	print FEEHAOUT $_;
#		} else {
#	    	if (/^\r$/) {
#				$daata = 1;
#	    	}
#		}
    }
#    close(FEEHAOUT);
    close($socket);
    return ($out ? $out : "SITY");
}

sub getkeyfromsity {
    my $cookie = &refresh_sity;
    my $out;
    my $socket = IO::Socket::INET->new(($proxy ? $proxy : 'www.sity.sk:80')) or die "neni";
    $socket->autoflush(1);

#    $data = 'checkbox='.$ppp.'&number='.$zeme.$predvolba.$cislo.'&text='.$message.'&operator='.$zeme.$predvolba;
    my $data = #'ASERVICE=0&CMD=run&SERVICE=0&NAME='.$SITY_LOGIN.'&PASSWD='.$SITY_PASS;
               "NAME=".$SITY_LOGIN."&PASSWD=".$SITY_PASS."&ASERVICE=0&CMD=u_pages.SITY_LOGIN&SERVICE=0&x=51&y=11";
#  <FORM name="myform" action="/pls/sity/u_registrate2.login1" method="POST" target="root">
#  <input TYPE="hidden" name="ASERVICE" value="0">
#  <input TYPE="hidden" name="CMD" value="run">
#  <input TYPE="hidden" name="SERVICE" value="0">

#  <input TYPE="text" name="NAME" SIZE="8" STYLE="width: 100" value="" tabindex=1>
#  <input TYPE="password" name="PASSWD" SIZE="8" STYLE="width: 100" value="" tabindex=2>
    my $delka = length($data);
    
    my $header  = "POST http://www.sity.sk/pls/sity/u_registrate2.login1 HTTP/1.1\n";
	$header .= "Host: www.sity.sk\n";
	$header .= "Accept: application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\n";
	$header .= "Accept-Encoding: gzip, deflate\n";
	$header .= "Accept-Language: cs,cz;q=0.5\n";
	$header .= "Content-Length: ".$delka."\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\n";
	$header .= "Pragma: no-cache\n";
	$header .= "Cookie: SITY=$cookie\n";
    $header .= "Referer: http://www.sity.sk/static/homepage.html\n";
	$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; MSNATLAS01.CZ)\n";
	$header .= "\n" . $data . "\n";

    print $socket $header;
    my $daata;
#    open(FEEHAOUT,">/tmp/sms.$$-stage-2");
    while (<$socket>) {
#		if ($daata) {
       s/\r?\n//g;
       &Log($_);
	        if (/^Set-Cookie: SITY=(.*)$/) {
		   $out = $1;
		}
#	    	print FEEHAOUT $_;
#		} else {
#	    	if (/^\r$/) {
#				$daata = 1;
#	    	}
#		}
    }
#    close(FEEHAOUT);
    close($socket);
    return ($out ? $out : "-");
}

sub send_to_sity {
	my $ppp = &norm(shift);
	my $zeme = &norm(shift);
	my $predvolba = &norm(shift);
	my $cislo = &norm(shift);
	my $message = &norm(shift);

#	$socket = IO::Socket::INET->new('192.168.1.26:81') or die "neni";
	my $socket = IO::Socket::INET->new(($proxy ? $proxy : 'www.sity.sk:80')) or die "neni";
	$socket->autoflush(1);
	
	$data = 'number='.$zeme.$predvolba.$cislo.'&chars=0&message='.$message.'&submit=Odosla%2A+SMS';
	$data = "MSGTEXT=".$message."&ADDR=0".$predvolba.$cislo."&DETAIL=&SMSMsgLen=480&SMSCount=&BT.y=0&BT.x=0";
        &Log($data);
	$delka = length($data);

	$header  = "POST http://www.sity.sk/pls/sity/!u_sms.send_sms HTTP/1.1\n";
	#$header  = "POST /cgi-bin/info.cgi HTTP/1.0\n";
	$header .= "Host: www.sity.sk\n";
	$header .= "Accept: application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\n";
	$header .= "Accept-Encoding: gzip, deflate\n";
	$header .= "Accept-Language: cs,cz;q=0.5\n";
	$header .= "Content-Length: ".$delka."\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\n";
	$header .= "Pragma: no-cache\n";
	$header .= "Referer: http://www.sity.sk/pls/sity/!u_sms.home\n";
	$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; MSNATLAS01.CZ)\n";
	$header .= "Cookie: SITY=$ppp\n";
	$header .= "\n" . $data . "\n";
	
	print $socket $header;
	while (<$socket>) {
#	$line = <$socket>;
     my $a = $_;
  chomp($a);
	    &Log($a);
	    if (/bola odoslan/) {
	       $ret = 1;
	    }
	    if ($line =~ /HTTP\/\d.\d (\d*) (.*)/) {
		$a = 1; #return(1);
	    } else {
		$a = 0; #return(0);
	    }
	}
	return $ret;
}


sub norm { # 'hell%o+there' => 'hello%25o%20there'
	my $in = shift;
    my $x;
    $in =~ s/%([0-9a-fA-F][0-9a-fA-F])/
	         $x = uc($1);
                 $x eq "2F" || $x eq "25" ? "%$x" :
                                            pack("c", hex($x));
              /eg;
    $in =~ s/([\0-\x2f\x7f-\xff])/sprintf("%%%02X",ord($1))/eg;
	$in =~ tr/ /+/;
	return $in;
}

sub _extract_name
{
    local $my = shift || '';
    chomp($my);
	if ($my =~ /\"(.*)\" \<(.*)\>/) {
		$name=$1;
		$email=$2;
	} elsif ($my =~ /\<(.*)\>/) {
		$email=$1;
	} else {
		$email=$my;
	}
    return (&plainize($name),$email);
}

sub smsstrip {
	my $from = shift;
	my $subject  = shift;
	my $mail = shift;
	
	my $message;
	my $t1 = substr($subject,0,30);
	my $t2;
	my $t3 = ( $from ? "F:$from; " : "" );

	if ($t1) {
		$t2 = 154 - length($t1) - length($t3);
		$message = $t3."S:". substr($subject,0,30)."; B:".substr($mail,0,$t2);
	} else {
		$t2 = 160 - length($t3);
		$message = substr($mail,0,$t2).$t3;
	}
	return $message;
}

sub plainize {
   my $text = shift;
   my @decodedo;
   foreach my $prijem (split(/ /,$text)) {
      my $decoded;
#      if ($prijem =~ /^=\?.*\?.\?.*?=$/) {
   my @b = split(/\?/,$prijem);
      if ($b[2] eq "B") { $decoded = decode_base64($b[3]); }
   elsif ($b[2] eq "Q") { $decoded = decode_qp($b[3]); }
                   else { $decoded = $prijem; }
   if ($b[1] =~ /iso-8859-2/gi) { my $prevod = new Cz::Cstocs 'il2', 'ascii'; $decoded = &$prevod($decoded); }
   if ($b[1] =~ /iso-8859-1/gi) { my $prevod = new Cz::Cstocs 'il1', 'ascii'; $decoded = &$prevod($decoded); }
#  if ($b[1] =~ /CP1250/gi)     { my $prevod = new Cz::Cstocs 'il1', 'ascii'; $decoded .= &$prevod($decoded); }
#   else { $decoded .= $prijem; }
   push(@decodedo,$decoded);
#      } else {
#	 $decodedo .= $;
#      }
	 
   }
   return join(" ",@decodedo);
}


