# -*- coding: utf-8 -*-
"""
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see .
@author: RaNaN
"""
import re
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from threading import Thread
from cgi import FieldStorage
from os.path import abspath, dirname, join
from urllib import unquote
from base64 import standard_b64decode
from binascii import unhexlify
try:
from Crypto.Cipher import AES
except:
pass
try:
from module.common import JsEngine
except ImportError:
import sys
sys.path.append(join(abspath(dirname(__file__)), "..", ".."))
from module.common import JsEngine
js = JsEngine.JsEngine()
core = None
class CNLServer(Thread):
def __init__(self):
Thread.__init__(self)
self.setDaemon(True)
self.stop = False
self.stopped = False
def run(self):
server_address = ('127.0.0.1', 9666)
try:
httpd = HTTPServer(server_address, CNLHandler)
except:
self.stopped = True
return
self.stopped = False
while self.keep_running():
httpd.handle_request()
self.stopped = True
def keep_running(self):
return not self.stop
class CNLHandler(BaseHTTPRequestHandler):
#def log_message(self, *args):
# pass
def add_package(self, name, urls, queue=0):
print "name", name
print "urls", urls
print "queue", queue
def get_post(self, name, default=""):
if self.post.has_key(name):
return self.post[name]
else:
return default
def start_response(self, string):
self.send_response(200)
self.send_header("Content-Length", len(string))
self.send_header("Content-Language", "de")
self.send_header("Vary", "Accept-Language, Cookie")
self.send_header("Cache-Control", "no-cache, must-revalidate")
self.send_header("Content-type", "text/html")
self.end_headers()
def do_GET(self):
path = self.path.strip("/").lower()
#self.wfile.write(path+"\n")
self.map = [ (r"add$", self.add),
(r"addcrypted$", self.addcrypted),
(r"addcrypted2$", self.addcrypted2),
(r"flashgot", self.flashgot),
(r"crossdomain\.xml", self.crossdomain),
(r"checkSupportForUrl", self.checksupport),
(r"jdcheck.js", self.jdcheck),
(r"", self.flash) ]
func = None
for r, f in self.map:
if re.match(r"(flash(got)?/?)?"+r, path):
func = f
break
if func:
try:
resp = func()
if not resp: resp = "success"
resp += "\r\n"
self.start_response(resp)
self.wfile.write(resp)
except Exception,e :
self.send_error(500, str(e))
else:
self.send_error(404, "Not Found")
def do_POST(self):
form = FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],
})
self.post = {}
for name in form.keys():
self.post[name] = form[name].value
return self.do_GET()
def flash(self):
return "JDownloader"
def add(self):
package = self.get_post('referer', 'ClickAndLoad Package')
urls = filter(lambda x: x != "", self.get_post('urls').split("\n"))
self.add_package(package, urls, 0)
def addcrypted(self):
package = self.get_post('referer', 'ClickAndLoad Package')
dlc = self.get_post('crypted').replace(" ", "+")
core.upload_container(package, dlc)
def addcrypted2(self):
package = self.get_post("source", "ClickAndLoad Package")
crypted = self.get_post("crypted")
jk = self.get_post("jk")
crypted = standard_b64decode(unquote(crypted.replace(" ", "+")))
jk = "%s f()" % jk
jk = js.eval(jk)
Key = unhexlify(jk)
IV = Key
obj = AES.new(Key, AES.MODE_CBC, IV)
result = obj.decrypt(crypted).replace("\x00", "").replace("\r","").split("\n")
result = filter(lambda x: x != "", result)
self.add_package(package, result, 0)
def flashgot(self):
autostart = int(self.get_post('autostart', 0))
package = self.get_post('package', "FlashGot")
urls = filter(lambda x: x != "", self.get_post('urls').split("\n"))
self.add_package(package, urls, autostart)
def crossdomain(self):
rep = "\n"
rep += "\n"
rep += "\n"
rep += "\n"
rep += ""
return rep
def checksupport(self):
pass
def jdcheck(self):
rep = "jdownloader=true;\n"
rep += "var version='10629';\n"
return rep
if __name__ == "__main__":
import xmlrpclib
from module import InitHomeDir
from module.ConfigParser import ConfigParser
config = ConfigParser()
ssl = ""
if config.get("ssl", "activated"):
ssl = "s"
server_url = "http%s://%s:%s@%s:%s/" % (
ssl,
config.username,
config.password,
config.get("remote", "listenaddr"),
config.get("remote", "port")
)
core = xmlrpclib.ServerProxy(server_url, allow_none=True)
s = CNLServer()
s.start()
while not s.stopped:
try:
s.join(1)
except KeyboardInterrupt:
s.stop = True
s.stopped = True
print "quiting.."