def testJF(): data = request.get_json() tempjf = tempJF(data["jfHost"]) try: tempjf.authenticate(data["jfUser"], data["jfPassword"]) tempjf.getUsers(public=False) return resp() except: return resp(False)
def modifyConfig(): log.info("Config modification requested") data = request.get_json() temp_config = RawConfigParser(comment_prefixes="/", allow_no_value=True) temp_config.read(config_path) for section in data: if section in temp_config: for item in data[section]: if item in temp_config[section]: temp_config[section][item] = data[section][item] data[section][item] = True log.debug(f"{section}/{item} modified") else: data[section][item] = False log.debug(f"{section}/{item} does not exist in config") with open(config_path, "w") as config_file: temp_config.write(config_file) log.debug("Config written") log.info('Restarting...') try: p = psutil.Process(os.getpid()) for handler in p.open_files() + p.connections(): os.close(handler.fd) except: pass python = sys.executable os.execl(python, python, *sys.argv) return resp()
def modifyConfig(): global config log.info("Config modification requested") data = request.get_json() temp_config = configparser.RawConfigParser(comment_prefixes="/", allow_no_value=True) temp_config.read(str(config_path.resolve())) for section in data: if section in temp_config and 'restart-program' not in section: for item in data[section]: temp_config[section][item] = data[section][item] data[section][item] = True log.debug(f"{section}/{item} modified") with open(config_path, "w") as config_file: temp_config.write(config_file) config.trigger_reload() log.info("Config written.") if 'restart-program' in data: if data['restart-program']: log.info('Restarting...') try: proc = psutil.Process(os.getpid()) for handler in proc.open_files() + proc.connections(): os.close(handler.fd) except Exception as e: log.error(f'Failed restart: {type(e).__name__}') python = sys.executable os.execl(python, python, *sys.argv) return resp()
def deleteInvite(): code = request.get_json()["code"] invites = dict(data_store.invites) if code in invites: del data_store.invites[code] log.info(f"Invite deleted: {code}") return resp()
def modifyUsers(): data = request.get_json() log.debug("Email list modification requested") for key in data: uid = jf.getUsers(key, public=False)["Id"] data_store.emails[uid] = data[key] log.debug(f'Email for user "{key}" modified') return resp()
def setNotify(): data = request.get_json() change = False for code in data: for key in data[code]: if key in ["notify-expiry", "notify-creation"]: inv = data_store.invites[code] if config.getboolean("ui", "jellyfin_login"): address = data_store.emails[g.user.id] else: address = config["ui"]["email"] if "notify" not in inv: inv["notify"] = {} if address not in inv["notify"]: inv["notify"][address] = {} inv["notify"][address][key] = data[code][key] log.debug(f"{code}: Notification settings changed") change = True if change: data_store.invites[code] = inv return resp() return resp(success=False)
def setDefaults(): data = request.get_json() username = data["username"] log.debug(f"Storing default settings from user {username}") try: user = jf.getUsers(username=username, public=False) except Jellyfin.UserNotFoundError: log.error(f"Storing defaults failed: Couldn't find user {username}") return resp(False) uid = user["Id"] policy = user["Policy"] data_store.user_template = policy if data["homescreen"]: configuration = user["Configuration"] try: displayprefs = jf.getDisplayPreferences(uid) data_store.user_configuration = configuration data_store.user_displayprefs = displayprefs except: log.error("Storing defaults failed: " + "couldn't store homescreen layout") return resp(False) return resp()
def generateInvite(): current_time = datetime.datetime.now() data = request.get_json() delta = datetime.timedelta(days=int(data["days"]), hours=int(data["hours"]), minutes=int(data["minutes"])) invite_code = secrets.token_urlsafe(16) invite = {} invite["created"] = format_datetime(current_time) if data["multiple-uses"]: if data["no-limit"]: invite["no-limit"] = True else: invite["remaining-uses"] = int(data["remaining-uses"]) else: invite["remaining-uses"] = 1 log.debug(f"Creating new invite: {invite_code}") valid_till = current_time + delta invite["valid_till"] = valid_till.strftime("%Y-%m-%dT%H:%M:%S.%f") if "email" in data and config.getboolean("invite_emails", "enabled"): address = data["email"] invite["email"] = address log.info(f"Sending invite to {address}") method = config["email"]["method"] if method == "mailgun": from jellyfin_accounts.email import Mailgun email = Mailgun(address) elif method == "smtp": from jellyfin_accounts.email import Smtp email = Smtp(address) email.construct_invite({"expiry": valid_till, "code": invite_code}) response = email.send() if response is False or type(response) != bool: invite["email"] = f"Failed to send to {address}" if config.getboolean("notifications", "enabled"): if "notify-creation" in data: invite["notify-creation"] = data["notify-creation"] if "notify-expiry" in data: invite["notify-expiry"] = data["notify-expiry"] data_store.invites[invite_code] = invite log.info(f"New invite created: {invite_code}") return resp()
def newUser(): data = request.get_json() log.debug("Attempted newUser") if checkInvite(data["code"]): validation = validator().validate(data["password"]) valid = True for criterion in validation: if validation[criterion] is False: valid = False if valid: log.debug("User password valid") try: user = jf.newUser(data["username"], data["password"]) except Jellyfin.UserExistsError: error = f'User already exists named {data["username"]}' log.debug(error) return jsonify({"error": error}) except: return jsonify({"error": "Unknown error"}) invites = dict(data_store.invites) checkInvite(data["code"], used=True, username=data["username"]) if (config.getboolean("notifications", "enabled") and "notify" in invites[data["code"]]): for address in invites[data["code"]]["notify"]: if "notify-creation" in invites[ data["code"]]["notify"][address]: if invites[data["code"]]["notify"][address][ "notify-creation"]: method = config["email"]["method"] if method == "mailgun": email = Mailgun(address) elif method == "smtp": email = Smtp(address) if email.construct_created({ "code": data["code"], "username": data["username"], "created": datetime.datetime.now(), }): threading.Thread(target=email.send).start() if user.status_code == 200: try: policy = data_store.user_template if policy != {}: jf.setPolicy(user.json()["Id"], policy) else: log.debug("user policy was blank") except: log.error("Failed to set new user policy") try: configuration = data_store.user_configuration displayprefs = data_store.user_displayprefs if configuration != {} and displayprefs != {}: if jf.setConfiguration(user.json()["Id"], configuration): jf.setDisplayPreferences(user.json()["Id"], displayprefs) log.debug("Set homescreen layout.") else: log.debug( "user configuration and/or displayprefs were blank" ) except: log.error("Failed to set new user homescreen layout") if config.getboolean("password_resets", "enabled"): data_store.emails[user.json()["Id"]] = data["email"] log.debug("Email address stored") log.info("New user created") else: log.error(f"New user creation failed: {user.status_code}") return resp(False) else: log.debug("User password invalid") return jsonify(validation) else: log.debug("Attempted newUser unauthorized") return resp(False, code=401)