#!/usr/bin/env python
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4

"""
This program is under license GPL2 (see LICENSE file)

- Changes by Michele Baldessari <michele@pupazzo.org>

Original Autors: 
    Riccardo Attilio Galli  <riccardo@sideralis.net>
    Federico Emanuele Galli <federico@sideralis.net>
    
"""

__version__ = '1.0 beta4'

import cookielib, urllib, urllib2, sys
import socket, time, getpass
from optparse import OptionParser

class HTMLParserError(Exception): 
    pass

class UserPasswordError(Exception): 
    pass

def send_sms(user, pw, text, number):
    cookieJar = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
    opener.addheaders = [("User-agent","Mozilla/5.0 (compatible)")]
    urllib2.install_opener(opener)
    
    BASE1      = "http://www.190.it/190/trilogy/jsp/"
    LOGIN      = BASE1 + "login.do"
    COMMIT     = BASE1 + "md.do?method=commit"
    REFERER    = BASE1 + "common/ty_header_multiframe.jsp?ty_from_ru=1"
    TOSMSPAGE1 = BASE1 + "common/ty_iPage.jsp?retURL=http%3A%2F%2Fwww.areaprivati.190.it%2F190%2Ftrilogy%2Fjsp%2Fdispatcher.do%3Fty_key%3Dfsms_hp"

    BASE2      = "http://www.areaprivati.190.it/190/"
    PREPARE    = BASE2 + "fsms/prepare.do"
    FAIDATE    = BASE2 + "trilogy/jsp/homePage.do?tabName=Fai+da+te+privati"
    SEND       = BASE2 + "fsms/send.do"
    TOSMSPAGE2 = BASE2 + "trilogy/jsp/programView.do?ty_nocache=true&pageTypeId=9604&channelId=-8663&programId=9361&ty_key=fsms_hp"
    
    postData = urllib.urlencode({'username':user, 'password':pw, 'login_button.x':5, 'login_button.y':5})
    req = urllib2.Request(LOGIN, postData)
    req.add_header("Referer", REFERER)
    fp = urllib2.urlopen(req)
    if fp.read().find('registrazione')!=-1:
        raise UserPasswordError('Wrong user or password')
    fp.close()
    
    urllib2.urlopen(COMMIT)
    urllib2.urlopen(FAIDATE)
    
    urllib2.urlopen(TOSMSPAGE1)
    urllib2.urlopen(TOSMSPAGE2)
    
    data = cookieJar._cookies['.190.it']['/']['BV_IDS'].value
    ENGINE, SESSION = data.split(':') 
    postData = urllib.urlencode({'pageTypeId':9604, 'programId':9361, 'channelId':-8663, 
        'BV_SessionID':SESSION,'BV_EngineID':ENGINE, 'receiverNumber':number, 'message':text,
        'x':53,'y':9})
    req = urllib2.Request(PREPARE, postData)
    fp = urllib2.urlopen(req)
    
    postData = urllib.urlencode({'x':0, 'y':0})
    req = urllib2.Request(SEND, postData)
    fp = urllib2.urlopen(req)
    
    time.sleep(0.5)

if __name__ == '__main__':
    socket.setdefaulttimeout(8.0)
    
    usage = "Usage: %s [options] sms-text" % (sys.argv[0])
    parser = OptionParser(usage=usage, version=('%s %s' % (sys.argv[0], __version__)))
    parser.add_option("-u", "--username", dest="user", default='',
                      help="Registered username")
    parser.add_option("-p", "--password", dest="password", default='',
                      help="Password")
    parser.add_option("-n", "--number", dest="number", default='',
                      help="Telephone number")
    
    options, args = parser.parse_args()
    user, password, number = options.user, options.password, options.number
    if user and number and len(args) > 0:
        pass
    else:
        parser.print_help()
        sys.exit(-1)

    if len(password) < 1:
        password = getpass.getpass("Password :")
    
    text = ' '.join(args)
    try:
        start = time.time()
        send_sms(user, password, text, number)
        print '...sent in %.2f seconds' % (time.time()-start)
    except HTMLParserError:
        print >> sys.stderr, "Error while sending SMS"
        sys.exit(10)
    except UserPasswordError:
        print >> sys.stderr, "Error: user or password not correct"
        sys.exit(20)
    except socket.error:
        print >> sys.stderr, "Error while setting up the connection"
        sys.exit(30)
