def link_order(ids): try: pid, pos = ids.split("|") PYLOAD.orderFile(int(pid), int(pos)) return {"response": "success"} except Exception: return HTTPError()
def status(): try: status = toDict(PYLOAD.statusServer()) status['captcha'] = PYLOAD.isCaptchaWaiting() return status except Exception: return HTTPError()
def package_order(ids): try: pid, pos = ids.split("|") PYLOAD.orderPackage(int(pid), int(pos)) return {"response": "success"} except Exception: return bottle.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 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) with open(fpath, 'wb') as destination: shutil.copyfileobj(f.file, destination) links.insert(0, fpath) except Exception: 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 save_config(category): for key, value in request.POST.iteritems(): try: section, option = key.split("|") except Exception: continue if category == "general": category = "core" PYLOAD.setConfigValue(section, option, decode(value), category)
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 config(): conf = PYLOAD.getConfig() plugin = PYLOAD.getPluginConfig() conf_menu = [] plugin_menu = [] for entry in sorted(conf.keys()): conf_menu.append((entry, conf[entry].description)) last_name = None for entry in sorted(plugin.keys()): desc = plugin[entry].description name, none, type = desc.partition("_") if type in PYLOAD.core.pluginManager.TYPES: if name == last_name or len([a for a, b in plugin.iteritems() if b.description.startswith(name + "_")]) > 1: desc = name + " (" + type.title() + ")" else: desc = name last_name = name plugin_menu.append((entry, desc)) 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) 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 Exception: 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 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 Exception: 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 Exception: return HTTPError()
def addcrypted(): package = bottle.request.forms.get('referer', 'ClickNLoad Package') dlc = bottle.request.forms['crypted'].replace(" ", "+") dlc_path = os.path.join(DL_ROOT, package.replace("/", "").replace("\\", "").replace(":", "") + ".dlc") with open(dlc_path, "wb") as dlc_file: dlc_file.write(dlc) try: PYLOAD.addPackage(package, [dlc_path], 0) except Exception: return bottle.HTTPError() else: return "success\r\n"
def addcrypted(): package = request.forms.get('referer', 'ClickNLoad Package') dlc = request.forms['crypted'].replace(" ", "+") dlc_path = join(DL_ROOT, package.replace("/", "").replace("\\", "").replace(":", "") + ".dlc") with open(dlc_path, "wb") as dlc_file: dlc_file.write(dlc) try: PYLOAD.addPackage(package, [dlc_path], 0) except Exception: return HTTPError() else: return "success\r\n"
def set_captcha(): if request.environ.get('REQUEST_METHOD', "GET") == "POST": try: PYLOAD.setCaptchaResult(request.forms['cap_id'], request.forms['cap_result']) except Exception: 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" : os.path.abspath(PYLOAD_DIR), "config": os.path.abspath(""), "download" : os.path.abspath(conf['general']['download_folder']['value']), "freespace": formatSize(PYLOAD.freeSpace()), "remote" : conf['remote']['port']['value'], "webif" : conf['webui']['port']['value'], "language" : conf['general']['language']['value']} return render_to_response("info.html", data, [pre_processor])
def flashgot(): if request.environ['HTTP_REFERER'] not in ("http://localhost:9666/flashgot", "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 flashgot(): if bottle.request.environ['HTTP_REFERER'] not in ("http://localhost:9666/flashgot", "http://127.0.0.1:9666/flashgot"): return bottle.HTTPError() autostart = int(bottle.request.forms.get('autostart', 0)) package = bottle.request.forms.get('package', None) urls = filter(lambda x: x != "", bottle.request.forms['urls'].split("\n")) folder = bottle.request.forms.get('dir', None) if package: PYLOAD.addPackage(package, urls, autostart) else: PYLOAD.generateAndAddPackages(urls, autostart) return ""
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 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 Exception: traceback.print_exc() return HTTPError()
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: traceback.print_exc() return HTTPError(500, json.dumps({"error": e.message, "traceback": traceback.format_exc()}))
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(fs_join(root, item)): folder = { 'name': item, 'path': item, 'files': [] } files = listdir(fs_join(root, item)) for file in sorted([fs_decode(x) for x in files]): try: if isfile(fs_join(root, item, file)): folder['files'].append(file) except Exception: 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 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 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 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 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 home(): try: res = [toDict(x) for x in PYLOAD.statusDownloads()] except Exception: 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 home(): try: res = [toDict(x) for x in PYLOAD.statusDownloads()] except Exception: 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 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 Exception: 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: traceback.print_exc() return HTTPError()
def logs(item=-1): s = request.environ.get('beaker.session') perpage = s.get('perpage', 34) reversed = s.get('reversed', False) warning = "" conf = PYLOAD.getConfigValue("log", "file_log") if not conf: warning = "Warning: File log is disabled, see settings page." perpage_p = ((20, 20), (34, 34), (40, 40), (100, 100), (0, 'all')) fro = None if request.environ.get('REQUEST_METHOD', "GET") == "POST": try: fro = datetime.strptime(request.forms['from'], '%d.%m.%Y %H:%M:%S') except Exception: pass try: perpage = int(request.forms['perpage']) s['perpage'] = perpage reversed = bool(request.forms.get('reversed', False)) s['reversed'] = reversed except Exception: pass s.save() try: item = int(item) except Exception: pass log = PYLOAD.getLog() if not perpage: item = 0 if item < 1 or type(item) is not int: item = 1 if len(log) - perpage + 1 < 1 else len(log) - perpage + 1 if type(fro) is datetime: # we will search for datetime item = -1 data = [] counter = 0 perpagecheck = 0 for l in log: counter += 1 if counter >= item: try: date, time, level, message = l.decode("utf8", "ignore").split(" ", 3) dtime = datetime.strptime(date + ' ' + time, '%d.%m.%Y %H:%M:%S') except Exception: dtime = None date = '?' time = ' ' level = '?' message = l if item == -1 and dtime is not None and fro <= dtime: item = counter # found our datetime if item >= 0: data.append({'line': counter, 'date': date + " " + time, 'level': level, 'message': message}) perpagecheck += 1 if fro is None and dtime is not None: # if fro not set set it to first showed line fro = dtime if perpagecheck >= perpage > 0: break if fro is None: # still not set, empty log? fro = datetime.now() if reversed: data.reverse() return render_to_response('logs.html', {'warning': warning, 'log': data, 'from': fro.strftime('%d.%m.%Y %H:%M:%S'), 'reversed': reversed, 'perpage': perpage, 'perpage_p': sorted(perpage_p), 'iprev': 1 if item - perpage < 1 else item - perpage, 'inext': (item + perpage) if item + perpage < len(log) else item}, [pre_processor])
def add_account(): login = request.POST['account_login'] password = request.POST['account_password'] type = request.POST['account_type'] PYLOAD.updateAccount(type, login, password)
def collector(): queue = PYLOAD.getCollector() queue.sort(key=attrgetter("order")) return render_to_response('queue.html', {'content': queue, 'target': 0}, [pre_processor])