def api_validation(): # Check if something is running updates = g.mongo.db.preferences.find_one({"_id": "updates"}) if not updates or not updates.get("api_validation") or not updates.get("api_validation", "").startswith("running"): g.mongo.db.preferences.update_one({"_id": "updates"}, { "$set": {"api_validation": "running. Started at: {0}".format( datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))}}, upsert=True) # EVE: # General rate: 30 request / sec # Error rate: 300 requests / 3 minutes (avg. 100/min, 5/3sec = 1.67/sec) # Discord: 120 requests / minute (avg. 2/sec) counter = 0 auth_crest_list = [] api_keys_list = [] for api_group in g.mongo.db.api_keys.find(): try: user_api_list = set() if not api_group.get("keys") and api_group["_id"] == "unassociated": pass else: # Refresh Crest try: auth_crest_list.append([api_group["_id"], True, True]) except KeyError: print("Failed at {0}".format(api_group["_id"])) for api_key_item in api_group["keys"]: user_api_list.add((api_key_item["key_id"], api_key_item["vcode"])) api_keys_list.append([list(user_api_list), False, api_group["_id"], False]) except requests.ConnectionError as e: print("Skipping {0} due to connection error".format(api_group["_id"])) print(e) continue # Run without database cursor connection if not auth_crest_list or not api_keys_list: print("Empty verification lists") for auth_crest_parameters, api_keys_parameters in zip(auth_crest_list, api_keys_list): counter += 1 print("At user {0}".format(counter)) try: auth_crest(*auth_crest_parameters) api_keys(*api_keys_parameters) except KeyError as unknown_error: print(unknown_error) time.sleep(60) print("Finished at user {0}.".format(counter)) print("Forcing forum log outs") for user in g.mongo.db.users.find(): if user.get("email"): try: forum_edit(user, "log_out") time.sleep(1) except requests.ConnectionError as e: print("Failed forum logout for {0}".format(user["_id"])) print(e) continue print("Finished forcing forum log outs for all users") g.mongo.db.preferences.update_one({"_id": "updates"}, { "$set": {"api_validation": datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")}})
def home(): # API Module error_list = [] message = "" if request.method == "POST": if request.form.get("action") == "add": error_list = caches.api_keys([(request.form.get("key_id"), request.form.get("vcode"))]) elif request.form.get("action") == "remove": g.mongo.db.api_keys.update({"_id": session["CharacterOwnerHash"]}, { "$pull": { "keys": {"key_id": int(request.form.get("key_id"))} } }) g.mongo.db.api_keys.update_one({"_id": session["CharacterOwnerHash"]}, { "$push": { "old_keys": { "key_id": int(request.form.get("key_id")), "vcode": request.form.get("vcode"), "delete_time": int(time.time()) } } }) elif request.form.get("action") == "email": pre_user = g.mongo.db.users.find_one({"_id": session["CharacterOwnerHash"]}) g.mongo.db.users.update({"_id": session["CharacterOwnerHash"]}, { "$set": { "email": request.form.get("email", "").strip() } }) forum_edit(pre_user, "email_edit", request.form.get("email", "").strip()) elif request.form.get("action") == "im": g.mongo.db.users.update({"_id": session["CharacterOwnerHash"]}, { "$set": { "im": request.form.get("im", "").strip() } }) elif request.form.get("action") == "mumble": try: mumble_id = int(request.form.get("mumble", "").strip()) except ValueError: pass else: g.mongo.db.users.update({"_id": session["CharacterOwnerHash"]}, { "$set": { "mumble": mumble_id } }) elif request.form.get("action") == "validate": key_validation = set() db_key_doc = g.mongo.db.api_keys.find_one({"_id": session["CharacterOwnerHash"]}) if db_key_doc: for key in db_key_doc["keys"]: key_validation.add((key["key_id"], key["vcode"])) error_list = caches.api_keys(list(key_validation)) if not error_list: message = "All api keys are valid." elif request.form.get("action") == "nsfw": if request.form.get("nsfw") == "True": g.mongo.db.users.update({"_id": session["CharacterOwnerHash"]}, { "$set": { "nsfw": False } }) g.redis.publish("titdev-auth", "&" + request.form.get("discord_id", "") + " nsfw False") flash("NSFW Disabled") else: g.mongo.db.users.update({"_id": session["CharacterOwnerHash"]}, { "$set": { "nsfw": True } }) g.redis.publish("titdev-auth", "&" + request.form.get("discord_id", "") + " nsfw True") flash("NSFW Enabled") # List of roles given_roles = [] for role in g.mongo.db.eve_auth.find(): if session["CharacterOwnerHash"] in role["users"]: given_roles.append(role["_id"]) associated_keys = [] # List of characters db_key_doc = g.mongo.db.api_keys.find_one({"_id": session["CharacterOwnerHash"]}) if db_key_doc: for key in db_key_doc["keys"]: associated_keys.append([key["character_id"], key["character_name"], key["key_id"], key["vcode"], key["cached_str"], key.get("valid", True)]) # User Information db_user_info = g.mongo.db.users.find_one({"_id": session["CharacterOwnerHash"]}) user_info = [db_user_info["_id"], db_user_info["character_name"], db_user_info["corporation_name"], db_user_info["alliance_name"], db_user_info.get("email"), db_user_info.get("mumble"), db_user_info.get("discord_id")] # Images with open("configs/base.json", "r") as base_config_file: base_config = json.load(base_config_file) image_list = [base_config["image_server"] + "/Character/" + str(db_user_info["character_id"]) + "_256.jpg", base_config["image_server"] + "/Corporation/" + str(db_user_info["corporation_id"]) + "_128.png", base_config["image_server"] + "/Alliance/" + str(db_user_info["alliance_id"]) + "_128.png"] access_mask = base_config["access_mask"] # Away from EVE if request.method == "GET": if request.args.get("action") == "enable": g.mongo.db.personals.update({"_id": session["CharacterOwnerHash"], "character_name": db_user_info["character_name"], "character_id": db_user_info["character_id"]}, { "$set": { "corporation_id": db_user_info["corporation_id"], "vacation": request.args.get("text"), "vacation_date": request.args.get("date") } }, upsert=True) elif request.args.get("action") == "disable": g.mongo.db.personals.update({"_id": session["CharacterOwnerHash"], "character_name": db_user_info["character_name"], "character_id": db_user_info["character_id"]}, { "$unset": { "vacation": request.args.get("text"), "vacation_date": request.args.get("date") } }) db_personal = g.mongo.db.personals.find_one({"_id": session["CharacterOwnerHash"], "vacation": {"$exists": True}}) if db_personal: vacation = True vacation_text = db_personal["vacation"] vacation_date = db_personal["vacation_date"] else: vacation = False vacation_text = "" vacation_date = "" keys = request.args.get("keys") if keys: keys = keys.split(",") # Personal Invoices one_month_oid = ObjectId.from_datetime(datetime.datetime.today() - datetime.timedelta(30)) invoice_table = [] for invoice in g.mongo.db.invoices.find({"_id": {"$gt": one_month_oid}, "user": session["CharacterOwnerHash"]}): invoice_status = invoice.get("status", "Not Processed") invoice_timestamp = ObjectId(invoice["_id"]).generation_time.strftime("%Y-%m-%d %H:%M:%S") invoice_color = "" if invoice_status == "Shipping - Completed": invoice_color = "primary" elif invoice_status == "Processing" or invoice_status.startswith("Shipping"): invoice_color = "warning" elif invoice_status in ["Failed", "Rejected"]: invoice_color = "danger" elif invoice_status == "Completed": invoice_color = "success" invoice_table.append([invoice_color, invoice_timestamp, invoice["_id"], invoice["jf_end"], "{:,.02f}".format(invoice["order_total"]), invoice.get("marketeer"), invoice_status]) # Recruitment IDs recruitment_ids = [] application_list = g.mongo.db.applications.find({"owner": session["CharacterOwnerHash"]}) for form in application_list: recruitment_ids.append(form["_id"]) # NSFW nsfw = db_user_info.get("nsfw") return render_template("account.html", error_list=error_list, given_roles=given_roles, associated_keys=associated_keys, user_info=user_info, image_list=image_list, vacation=vacation, vacation_text=vacation_text, keys=keys, access_mask=access_mask, vacation_date=vacation_date, invoice_table=invoice_table, message=message, recruitment_ids=recruitment_ids, nsfw=nsfw)