#!/usr/bin/env python

import httplib
import StringIO
import base64

try:
    import sqlite3 as sqlite
except:
    import sqlite

class RC4:
    def __init__(self, key = None):
        self.state = range(256)
        self.x = self.y = 0

        if key is not None:
            self.init(key)

    def init(self, key):
        for i in range(256):
            self.x = (ord(key[i % len(key)]) + self.state[i] + self.x) & 0xFF
            self.state[i], self.state[self.x] = self.state[self.x], self.state[i]
        self.x = 0

    def crypt(self, input):
        output = [None] * len(input)
        for i in xrange(len(input)):
            self.x = (self.x + 1) & 0xFF
            self.y = (self.state[self.x] + self.y) & 0xFF
            self.state[self.x], self.state[self.y] = self.state[self.y], self.state[self.x]
            r = self.state[(self.state[self.x] + self.state[self.y]) & 0xFF]
            output[i] = chr(ord(input[i]) ^ r)
        return ''.join(output)

conexion_sqlite = sqlite.connect("your-notfreedom.db")
cursor_sqlite = conexion_sqlite.cursor()
try:
    cursor_sqlite.execute("create table ips (ip varchar(20) primary key, servidor varchar(100))")
    conexion_sqlite.commit()
except:
    pass
print "Buscando IPs en %s" % ("www.resolution.de")
conexion_servidor_yf = httplib.HTTPConnection("www.resolution.de")
try:
    #www.resolution.de/freedom-servers-04071776.cgi
    #www.resolution.de/freedom-servers-19283746.cgi
    conexion_servidor_yf.request("GET", "/freedom-servers-19283746.cgi")
    for ip in StringIO.StringIO(conexion_servidor_yf.getresponse().read()):
        try:
            cursor_sqlite.execute("insert into ips (ip, servidor) values ('%s', '%s')" % (ip.strip(), "www.resolution.de"))
            conexion_sqlite.commit()
        except:
            pass	
except:
    pass
conexion_servidor_yf.close()
for numero_servidor_yf in range(100):
    url_servidor_yf = "ems%02d.your-freedom.de" % (numero_servidor_yf)
    print "Buscando IPs en %s" % (url_servidor_yf)
    conexion_servidor_yf = httplib.HTTPConnection(url_servidor_yf)
    try:
        conexion_servidor_yf.request("GET", "/info.txt")
        for linea_info_txt in StringIO.StringIO(conexion_servidor_yf.getresponse().read()):
            if linea_info_txt[:3] == "IP:":
                try:
                    cursor_sqlite.execute("insert into ips (ip, servidor) values ('%s', '%s')" % (linea_info_txt[3:].strip(), url_servidor_yf.strip()))
                    conexion_sqlite.commit()
                except:
                    pass
            if linea_info_txt[:len("AlternativeServerKey:")] == "AlternativeServerKey:":
                server_key = linea_info_txt.split(":")[1].strip()
                rc4 = RC4(server_key + "Go stuff yourself!")
            if linea_info_txt[:len("CGIRelayKey:")] == "CGIRelayKey:":
                server_key = linea_info_txt.split(":")[1].strip()
                rc4_cgi = RC4(server_key + "Go stuff yourself!")
            if linea_info_txt[:len("Alternative:")] == "Alternative:":
                for ip_yf in linea_info_txt.split(":")[1].split(";"):
                    try:
                        cursor_sqlite.execute("insert into ips (ip, servidor) values ('%s', '%s')" % (ip_yf.strip(), url_servidor_yf.strip()))
                        conexion_sqlite.commit()
                    except:
                        pass
            if linea_info_txt[:len("AlternativeServer:")] == "AlternativeServer:":
                server = linea_info_txt.split(":")[1].strip()
                for ip_yf in rc4.crypt(base64.b64decode(server)).split(":")[0].split(";"):
                    try:
                        cursor_sqlite.execute("insert into ips (ip, servidor) values ('%s', '%s')" % (ip_yf.strip(), url_servidor_yf.strip()))
                        conexion_sqlite.commit()
                    except:
                        pass
            if linea_info_txt[:len("CGIRelay:")] == "CGIRelay:":
                server = linea_info_txt.split(":")[1].strip()
                for ip_yf in rc4_cgi.crypt(base64.b64decode(server)).split(":")[0].split(";"):
                    try:
                        print ip_yf
                        #cursor_sqlite.execute("insert into ips (ip, servidor) values ('%s', '%s')" % (ip_yf.strip(), url_servidor_yf.strip()))
                        #conexion_sqlite.commit()
                    except:
                        pass
    except:
        pass
    conexion_servidor_yf.close()
iptables_yf = file("your-notfreedom.sh", "w")
cursor_sqlite.execute("select * from ips")
for ip_yf in cursor_sqlite.fetchall():
    iptables_yf.write("iptables -A FORWARD -d %s -j REJECT\n" % (ip_yf[0]))
iptables_yf.close()
cursor_sqlite.close()
conexion_sqlite.close()
print "Listo..."