def pre_processor(): s = request.environ.get("beaker.session") user = parse_userdata(s) perms = parse_permissions(s) status = {} captcha = False update = False plugins = False if user["is_authenticated"]: status = PYLOAD.statusServer() info = PYLOAD.getInfoByPlugin("UpdateManager") captcha = PYLOAD.isCaptchaWaiting() # check if update check is available if info: if info["pyload"] == "True": update = info["version"] if info["plugins"] == "True": plugins = True return { "user": user, "status": status, "captcha": captcha, "perms": perms, "url": request.url, "update": update, "plugins": plugins, }
def add_package(): name = request.forms.get("add_name", "New Package").strip() queue = int(request.forms['add_dest']) links = decode(request.forms['add_links']) links = links.split("\n") pw = request.forms.get("add_password", "").strip("\n\r") try: f = request.files['add_file'] if not name or name == "New Package": name = f.name fpath = join(PYLOAD.getConfigValue("general", "download_folder"), "tmp_" + f.filename) destination = open(fpath, 'wb') copyfileobj(f.file, destination) destination.close() links.insert(0, fpath) except: pass name = name.decode("utf8", "ignore") links = map(lambda x: x.strip(), links) links = filter(lambda x: x != "", links) pack = PYLOAD.addPackage(name, links, queue) if pw: pw = pw.decode("utf8", "ignore") data = {"password": pw} PYLOAD.setPackageData(pack, data)
def admin(): # convert to dict user = dict([(name, toDict(y)) for name, y in PYLOAD.getAllUserData().iteritems()]) perms = permlist() for data in user.itervalues(): data["perms"] = {} get_permission(data["perms"], data["permission"]) data["perms"]["admin"] = True if data["role"] is 0 else False s = request.environ.get("beaker.session") if request.environ.get("REQUEST_METHOD", "GET") == "POST": for name in user: if request.POST.get("%s|admin" % name, False): user[name]["role"] = 0 user[name]["perms"]["admin"] = True elif name != s["name"]: user[name]["role"] = 1 user[name]["perms"]["admin"] = False # set all perms to false for perm in perms: user[name]["perms"][perm] = False for perm in request.POST.getall("%s|perms" % name): user[name]["perms"][perm] = True user[name]["permission"] = set_permission(user[name]["perms"]) PYLOAD.setUserPermission(name, user[name]["permission"], user[name]["role"]) return render_to_response("admin.html", {"users": user, "permlist": perms}, [pre_processor])
def link_order(ids): try: pid, pos = ids.split("|") PYLOAD.orderFile(int(pid), int(pos)) return {"response": "success"} except: return HTTPError()
def package_order(ids): try: pid, pos = ids.split("|") PYLOAD.orderPackage(int(pid), int(pos)) return {"response": "success"} except Exception: return HTTPError()
def pre_processor(): s = request.environ.get('beaker.session') user = parse_userdata(s) perms = parse_permissions(s) status = {} captcha = False update = False plugins = False if user["is_authenticated"]: status = PYLOAD.statusServer() info = PYLOAD.getInfoByPlugin("UpdateManager") captcha = PYLOAD.isCaptchaWaiting() # check if update check is available if info: if info["pyload"] == "True": update = info["version"] if info["plugins"] == "True": plugins = True return { "user": user, 'status': status, 'captcha': captcha, 'perms': perms, 'url': request.url, 'update': update, 'plugins': plugins }
def status(): try: status = toDict(PYLOAD.statusServer()) status['captcha'] = PYLOAD.isCaptchaWaiting() return status except: return HTTPError()
def add(request): package = request.POST.get('referer', None) urls = filter(lambda x: x != "", request.POST['urls'].split("\n")) if package: PYLOAD.addPackage(package, urls, 0) else: PYLOAD.generateAndAddPackages(urls, 0) return ""
def save_config(category): for key, value in request.POST.iteritems(): try: section, option = key.split("|") except: continue if category == "general": category = "core" PYLOAD.setConfigValue(section, option, decode(value), category)
def edit_package(): try: id = int(request.forms.get("pack_id")) data = {"name": request.forms.get("pack_name").decode("utf8", "ignore"), "folder": request.forms.get("pack_folder").decode("utf8", "ignore"), "password": request.forms.get("pack_pws").decode("utf8", "ignore")} PYLOAD.setPackageData(id, data) return {"response": "success"} except: return HTTPError()
def packages(): print "/json/packages" try: data = PYLOAD.getQueue() for package in data: package['links'] = [] for file in PYLOAD.get_package_files(package['id']): package['links'].append(PYLOAD.get_file_info(file)) return data except: return HTTPError()
def config(): conf = PYLOAD.getConfig() plugin = PYLOAD.getPluginConfig() conf_menu = [] plugin_menu = [] for entry in sorted(conf.keys()): conf_menu.append((entry, conf[entry].description)) for entry in sorted(plugin.keys()): plugin_menu.append((entry, plugin[entry].description)) accs = PYLOAD.getAccounts(False) for data in accs: if data.trafficleft == -1: data.trafficleft = _("unlimited") elif not data.trafficleft: data.trafficleft = _("not available") else: data.trafficleft = formatSize(data.trafficleft * 1024) if data.validuntil == -1: data.validuntil = _("unlimited") elif not data.validuntil: data.validuntil = _("not available") else: t = time.localtime(data.validuntil) data.validuntil = time.strftime("%d.%m.%Y - %H:%M:%S", t) try: data.options["time"] = data.options["time"][0] except: data.options["time"] = "0:00-0:00" if "limitDL" in data.options: data.options["limitdl"] = data.options["limitDL"][0] else: data.options["limitdl"] = "0" return render_to_response( 'settings.html', { 'conf': { 'plugin': plugin_menu, 'general': conf_menu, 'accs': accs }, 'types': PYLOAD.getAccountTypes() }, [pre_processor])
def set_captcha(): if request.environ.get('REQUEST_METHOD', "GET") == "POST": try: PYLOAD.setCaptchaResult(request.forms["cap_id"], request.forms["cap_result"]) except: pass task = PYLOAD.getCaptchaTask() if task.tid >= 0: src = "data:image/%s;base64,%s" % (task.type, task.data) return {'captcha': True, 'id': task.tid, 'src': src, 'result_type' : task.resultType} else: return {'captcha': False}
def info(): conf = PYLOAD.getConfigDict() extra = os.uname() if hasattr(os, "uname") else tuple() data = {"python": sys.version, "os": " ".join((os.name, sys.platform) + extra), "version": PYLOAD.getServerVersion(), "folder": abspath(PYLOAD_DIR), "config": abspath(""), "download": abspath(conf["general"]["download_folder"]["value"]), "freespace": formatSize(PYLOAD.freeSpace()), "remote": conf["remote"]["port"]["value"], "webif": conf["webinterface"]["port"]["value"], "language": conf["general"]["language"]["value"]} return render_to_response("info.html", data, [pre_processor])
def addcrypted(): package = request.forms.get('referer', 'ClickAndLoad Package') dlc = request.forms['crypted'].replace(" ", "+") dlc_path = join(DL_ROOT, package.replace("/", "").replace("\\", "").replace(":", "") + ".dlc") dlc_file = open(dlc_path, "wb") dlc_file.write(dlc) dlc_file.close() try: PYLOAD.addPackage(package, [dlc_path], 0) except Exception: return HTTPError() else: return "success\r\n"
def edit_package(): try: id = int(request.forms.get("pack_id")) data = { "name": request.forms.get("pack_name").decode("utf8", "ignore"), "folder": request.forms.get("pack_folder").decode("utf8", "ignore"), "password": request.forms.get("pack_pws").decode("utf8", "ignore") } PYLOAD.setPackageData(id, data) return {"response": "success"} except: return HTTPError()
def downloads(): root = PYLOAD.getConfigValue("general", "download_folder") if not isdir(root): return base([_("Download directory not found.")]) data = {"folder": [], "files": []} items = listdir(fs_encode(root)) for item in sorted([fs_decode(x) for x in items]): if isdir(safe_join(root, item)): folder = {"name": item, "path": item, "files": []} files = listdir(safe_join(root, item)) for file in sorted([fs_decode(x) for x in files]): try: if isfile(safe_join(root, item, file)): folder["files"].append(file) except: pass data["folder"].append(folder) elif isfile(join(root, item)): data["files"].append(item) return render_to_response("downloads.html", {"files": data}, [pre_processor])
def flashgot(): if request.environ['HTTP_REFERER'] != "http://localhost:9666/flashgot" and \ request.environ['HTTP_REFERER'] != "http://127.0.0.1:9666/flashgot": return HTTPError() autostart = int(request.forms.get('autostart', 0)) package = request.forms.get('package', None) urls = filter(lambda x: x != "", request.forms['urls'].split("\n")) folder = request.forms.get('dir', None) if package: PYLOAD.addPackage(package, urls, autostart) else: PYLOAD.generateAndAddPackages(urls, autostart) return ""
def downloads(): root = PYLOAD.getConfigValue("general", "download_folder") if not isdir(root): return base([_('Download directory not found.')]) data = {'folder': [], 'files': []} items = listdir(fs_encode(root)) for item in sorted([fs_decode(x) for x in items]): if isdir(safe_join(root, item)): folder = {'name': item, 'path': item, 'files': []} files = listdir(safe_join(root, item)) for file in sorted([fs_decode(x) for x in files]): try: if isfile(safe_join(root, item, file)): folder['files'].append(file) except: pass data['folder'].append(folder) elif isfile(join(root, item)): data['files'].append(item) return render_to_response('downloads.html', {'files': data}, [pre_processor])
def package(id): try: data = toDict(PYLOAD.getPackageData(id)) data["links"] = [toDict(x) for x in data["links"]] for pyfile in data["links"]: if pyfile["status"] == 0: pyfile["icon"] = "status_finished.png" elif pyfile["status"] in (2, 3): pyfile["icon"] = "status_queue.png" elif pyfile["status"] in (9, 1): pyfile["icon"] = "status_offline.png" elif pyfile["status"] == 5: pyfile["icon"] = "status_waiting.png" elif pyfile["status"] == 8: pyfile["icon"] = "status_failed.png" elif pyfile["status"] == 4: pyfile["icon"] = "arrow_right.png" elif pyfile["status"] in (11, 13): pyfile["icon"] = "status_proc.png" else: pyfile["icon"] = "status_downloading.png" tmp = data["links"] tmp.sort(key=get_sort_key) data["links"] = tmp return data except: print_exc() return HTTPError()
def downloads(): root = PYLOAD.getConfigValue("general", "download_folder") if not isdir(root): return base([_('Download directory not found.')]) data = { 'folder': [], 'files': [] } items = listdir(fs_encode(root)) for item in sorted([fs_decode(x) for x in items]): if isdir(safe_join(root, item)): folder = { 'name': item, 'path': item, 'files': [] } files = listdir(safe_join(root, item)) for file in sorted([fs_decode(x) for x in files]): try: if isfile(safe_join(root, item, file)): folder['files'].append(file) except: pass data['folder'].append(folder) elif isfile(join(root, item)): data['files'].append(item) return render_to_response('downloads.html', {'files': data}, [pre_processor])
def call_api(func, args=""): response.headers.replace("Content-type", "application/json") response.headers.append("Cache-Control", "no-cache, must-revalidate") s = request.environ.get('beaker.session') if 'session' in request.POST: s = s.get_by_id(request.POST['session']) if not s or not s.get("authenticated", False): return HTTPError(403, json.dumps("Forbidden")) if not PYLOAD.isAuthorized(func, {"role": s["role"], "permission": s["perms"]}): return HTTPError(401, json.dumps("Unauthorized")) args = args.split("/")[1:] kwargs = {} for x, y in chain(request.GET.iteritems(), request.POST.iteritems()): if x == "session": continue kwargs[x] = unquote(y) try: return callApi(func, *args, **kwargs) except Exception, e: print_exc() return HTTPError(500, json.dumps({"error": e.message, "traceback": format_exc()}))
def load_config(category, section): conf = None if category == "general": conf = PYLOAD.getConfigDict() elif category == "plugin": conf = PYLOAD.getPluginConfigDict() for key, option in conf[section].iteritems(): if key in ("desc", "outline"): continue if ";" in option["type"]: option["list"] = option["type"].split(";") option["value"] = decode(option["value"]) return render_to_response("settings_item.html", {"skey": section, "section": conf[section]})
def addcrypted(): package = request.forms.get('referer', 'ClickAndLoad Package') dlc = request.forms['crypted'].replace(" ", "+") dlc_path = join( DL_ROOT, package.replace("/", "").replace("\\", "").replace(":", "") + ".dlc") dlc_file = open(dlc_path, "wb") dlc_file.write(dlc) dlc_file.close() try: PYLOAD.addPackage(package, [dlc_path], 0) except: return HTTPError() else: return "success\r\n"
def addcrypted2(): package = request.forms.get("source", None) crypted = request.forms["crypted"] jk = request.forms["jk"] crypted = standard_b64decode(unquote(crypted.replace(" ", "+"))) if JS: jk = "%s f()" % jk jk = JS.eval(jk) else: try: jk = re.findall(r"return ('|\")(.+)('|\")", jk)[0][1] except: ## Test for some known js functions to decode if jk.find("dec") > -1 and jk.find("org") > -1: org = re.findall(r"var org = ('|\")([^\"']+)", jk)[0][1] jk = list(org) jk.reverse() jk = "".join(jk) else: print "Could not decrypt key, please install py-spidermonkey or ossp-js" try: Key = unhexlify(jk) except: print "Could not decrypt key, please install py-spidermonkey or ossp-js" return "failed" 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) try: if package: PYLOAD.addPackage(package, result, 0) else: PYLOAD.generateAndAddPackages(result, 0) except: return "failed can't add" else: return "success\r\n"
def get_download(path): path = unquote(path).decode("utf8") #@TODO some files can not be downloaded root = PYLOAD.getConfigValue("general", "download_folder") path = path.replace("..", "") return static_file(fs_encode(path), fs_encode(root))
def config(): conf = PYLOAD.getConfig() plugin = PYLOAD.getPluginConfig() conf_menu = [] plugin_menu = [] for entry in sorted(conf.keys()): conf_menu.append((entry, conf[entry].description)) for entry in sorted(plugin.keys()): plugin_menu.append((entry, plugin[entry].description)) accs = PYLOAD.getAccounts(False) for data in accs: if data.trafficleft == -1: data.trafficleft = _("unlimited") elif not data.trafficleft: data.trafficleft = _("not available") else: data.trafficleft = formatSize(data.trafficleft * 1024) if data.validuntil == -1: data.validuntil = _("unlimited") elif not data.validuntil: data.validuntil = _("not available") else: t = time.localtime(data.validuntil) data.validuntil = time.strftime("%d.%m.%Y - %H:%M:%S", t) try: data.options["time"] = data.options["time"][0] except: data.options["time"] = "0:00-0:00" if "limitDL" in data.options: data.options["limitdl"] = data.options["limitDL"][0] else: data.options["limitdl"] = "0" return render_to_response( "settings.html", {"conf": {"plugin": plugin_menu, "general": conf_menu, "accs": accs}, "types": PYLOAD.getAccountTypes()}, [pre_processor], )
def change_password(): user = request.POST["user_login"] oldpw = request.POST["login_current_password"] newpw = request.POST["login_new_password"] if not PYLOAD.changePassword(user, oldpw, newpw): print "Wrong password" return HTTPError()
def get_download(path): path = unquote(path).decode("utf8") # @TODO some files can not be downloaded root = PYLOAD.getConfigValue("general", "download_folder") path = path.replace("..", "") return static_file(fs_encode(path), fs_encode(root))
def addcrypted2(): package = request.forms.get("source", None) crypted = request.forms["crypted"] jk = request.forms["jk"] crypted = standard_b64decode(unquote(crypted.replace(" ", "+"))) if JS: jk = "%s f()" % jk jk = JS.eval(jk) else: try: jk = re.findall(r"return ('|\")(.+)('|\")", jk)[0][1] except Exception: # Test for some known js functions to decode if jk.find("dec") > -1 and jk.find("org") > -1: org = re.findall(r"var org = ('|\")([^\"']+)", jk)[0][1] jk = list(org) jk.reverse() jk = "".join(jk) else: print "Could not decrypt key, please install py-spidermonkey or ossp-js" try: Key = unhexlify(jk) except Exception: print "Could not decrypt key, please install py-spidermonkey or ossp-js" return "failed" 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) try: if package: PYLOAD.addPackage(package, result, 0) else: PYLOAD.generateAndAddPackages(result, 0) except Exception: return "failed can't add" else: return "success\r\n"
def collector(): queue = PYLOAD.getCollector() queue.sort(key=attrgetter("order")) return render_to_response('queue.html', { 'content': queue, 'target': 0 }, [pre_processor])
def load_config(category, section): conf = None if category == "general": conf = PYLOAD.getConfigDict() elif category == "plugin": conf = PYLOAD.getPluginConfigDict() for key, option in conf[section].iteritems(): if key in ("desc", "outline"): continue if ";" in option["type"]: option["list"] = option["type"].split(";") option["value"] = decode(option["value"]) return render_to_response("settings_item.html", { "skey": section, "section": conf[section] })
def login_post(): user = request.forms.get("username") password = request.forms.get("password") info = PYLOAD.checkAuth(user, password) if not info: return render_to_response("login.html", {"errors": True}, [pre_processor]) set_session(request, info) return redirect("/")
def set_captcha(): if request.environ.get('REQUEST_METHOD', "GET") == "POST": try: PYLOAD.setCaptchaResult(request.forms["cap_id"], request.forms["cap_result"]) except: pass task = PYLOAD.getCaptchaTask() if task.tid >= 0: src = "data:image/%s;base64,%s" % (task.type, task.data) return { 'captcha': True, 'id': task.tid, 'src': src, 'result_type': task.resultType } else: return {'captcha': False}
def home(): try: res = [toDict(x) for x in PYLOAD.statusDownloads()] except: s = request.environ.get("beaker.session") s.delete() return redirect("/login") for link in res: if link["status"] == 12: link["information"] = "%s kB @ %s kB/s" % (link["size"] - link["bleft"], link["speed"]) return render_to_response("home.html", {"res": res}, [pre_processor])
def info(): conf = PYLOAD.getConfigDict() if hasattr(os, "uname"): extra = os.uname() else: extra = tuple() data = { "python": sys.version, "os": " ".join((os.name, sys.platform) + extra), "version": PYLOAD.getServerVersion(), "folder": abspath(PYLOAD_DIR), "config": abspath(""), "download": abspath(conf["general"]["download_folder"]["value"]), "freespace": formatSize(PYLOAD.freeSpace()), "remote": conf["remote"]["port"]["value"], "webif": conf["webinterface"]["port"]["value"], "language": conf["general"]["language"]["value"] } return render_to_response("info.html", data, [pre_processor])
def home(): try: res = [toDict(x) for x in PYLOAD.statusDownloads()] except: s = request.environ.get('beaker.session') s.delete() return redirect("/login") for link in res: if link["status"] == 12: link["information"] = "%s kB @ %s kB/s" % ( link["size"] - link["bleft"], link["speed"]) return render_to_response("home.html", {"res": res}, [pre_processor])
def admin(): # convert to dict user = dict([(name, toDict(y)) for name, y in PYLOAD.getAllUserData().iteritems()]) perms = permlist() for data in user.itervalues(): data["perms"] = {} get_permission(data["perms"], data["permission"]) data["perms"]["admin"] = True if data["role"] is 0 else False s = request.environ.get('beaker.session') if request.environ.get('REQUEST_METHOD', "GET") == "POST": for name in user: if request.POST.get("%s|admin" % name, False): user[name]["role"] = 0 user[name]["perms"]["admin"] = True elif name != s["name"]: user[name]["role"] = 1 user[name]["perms"]["admin"] = False # set all perms to false for perm in perms: user[name]["perms"][perm] = False for perm in request.POST.getall("%s|perms" % name): user[name]["perms"][perm] = True user[name]["permission"] = set_permission(user[name]["perms"]) PYLOAD.setUserPermission(name, user[name]["permission"], user[name]["role"]) return render_to_response("admin.html", { "users": user, "permlist": perms }, [pre_processor])
def update_accounts(): deleted = [] #dont update deleted accs or they will be created again for name, value in request.POST.iteritems(): value = value.strip() if not value: continue tmp, user = name.split(";") plugin, action = tmp.split("|") if (plugin, user) in deleted: continue if action == "password": PYLOAD.updateAccount(plugin, user, value) elif action == "time" and "-" in value: PYLOAD.updateAccount(plugin, user, options={"time": [value]}) elif action == "limitdl" and value.isdigit(): PYLOAD.updateAccount(plugin, user, options={"limitDL": [value]}) elif action == "delete": deleted.append((plugin, user)) PYLOAD.removeAccount(plugin, user)
def update_accounts(): deleted = [] #dont update deleted accs or they will be created again for name, value in request.POST.iteritems(): value = value.strip() if not value: continue tmp, user = name.split(";") plugin, action = tmp.split("|") if (plugin, user) in deleted: continue if action == "password": PYLOAD.updateAccount(plugin, user, value) elif action == "time" and "-" in value: PYLOAD.updateAccount(plugin, user, options={"time": [value]}) elif action == "limitdl" and value.isdigit(): PYLOAD.updateAccount(plugin, user, options={"limitDL": [value]}) elif action == "delete": deleted.append((plugin,user)) PYLOAD.removeAccount(plugin, user)
def login(): response.headers.replace("Content-type", "application/json") response.headers.append("Cache-Control", "no-cache, must-revalidate") user = request.forms.get("username") password = request.forms.get("password") info = PYLOAD.checkAuth(user, password) if not info: return json.dumps(False) s = set_session(request, info) # get the session id by dirty way, documentations seems wrong try: sid = s._headers["cookie_out"].split("=")[1].split(";")[0] return json.dumps(sid) except: return json.dumps(True)
def links(): try: links = [toDict(x) for x in PYLOAD.statusDownloads()] ids = [] for link in links: ids.append(link['fid']) if link['status'] == 12: link['info'] = "%s @ %s/s" % (link['format_eta'], formatSize(link['speed'])) elif link['status'] == 5: link['percent'] = 0 link['size'] = 0 link['bleft'] = 0 link['info'] = _("waiting %s") % link['format_wait'] else: link['info'] = "" data = {'links': links, 'ids': ids} return data except Exception, e: print_exc() return HTTPError()
def add_account(): login = request.POST["account_login"] password = request.POST["account_password"] type = request.POST["account_type"] PYLOAD.updateAccount(type, login, password)
def move_package(dest, id): try: PYLOAD.movePackage(dest, id) return {"response": "success"} except: return HTTPError()
def abort_link(id): try: PYLOAD.stopDownloads([id]) return {"response": "success"} except: return HTTPError()