def get_token(self) -> str: SHL.info(f"Returning access token.") if not self.token: self.token = str(uuid.uuid4()) self.expire_at = datetime.utcnow() + timedelta( seconds=cfg.get("token_expire_seconds", 86400)) self.__save_newest_data() if self.expire_at < datetime.utcnow(): self.token = str(uuid.uuid4()) self.expire_at = datetime.utcnow() + timedelta( seconds=cfg.get("token_expire_seconds", 86400)) self.__save_newest_data() return self.token
def gen_new_token(self) -> str: SHL.info(f"Generating new access token.") self.token = str(uuid.uuid4()) self.expire_at = datetime.utcnow() + timedelta( seconds=cfg.get("token_expire_seconds", 86400)) self.__save_newest_data() return self.token
def determine_ip(): if request.headers.get("X-Forwarded-For", request.remote_addr) == cfg.get("own_ip"): return request.headers.get( "X-Auth-For", request.headers.get("X-Forwarded-For", request.remote_addr)) return request.headers.get("X-Forwarded-For", request.remote_addr)
def run(): port = cfg.get("port", 5000) start_args = [x.strip().lower() for x in sys.argv] if "--port" in start_args: try: port = int(sys.argv[sys.argv.index("--port") + 1]) except IndexError: pass except ValueError: sys.exit( f'Invalid port "{sys.argv[sys.argv.index("--port") + 1]}"') port = os.environ.get("FLASKPORT", port) if "--cfg-debug" in start_args: cfg.reload(debug=True) SHL.output("Starting up.") SHL.output(f"Using port: {port}") socketio.run(app, host='0.0.0.0', port=int(port))
def run(): port = cfg.get("port", 5000) start_args = [x.strip().lower() for x in sys.argv] if "-port" in start_args: try: port = int(sys.argv[sys.argv.index("-port") + 1]) except IndexError: pass except ValueError: raise RuntimeError( f'{red}Invalid port "{sys.argv[sys.argv.index("-port") + 1]}"{white}' ) if "--cfg-debug" in start_args: cfg.reload(debug=True) SHL.output("Starting up.") SHL.info(f"Using port: {port}") app.run(host='0.0.0.0', port=port)
def __init__(self): SHL.info(f"Loading login info.") try: with open(LOGIN_INFO, 'r', encoding="utf-8") as fh: data = json.load(fh) except FileNotFoundError: if production_mode: raise RuntimeError( f"{red}login.json not found. " f"Authentication of some sort is required in production mode.{white}" ) SHL.error("Login info not found. Using dummy user.") return except json.JSONDecodeError: if production_mode: raise RuntimeError( f"{red}login.json is not valid. " f"Authentication of some sort is required in production mode.{white}" ) SHL.error("Login info not found. Using dummy user.") return SHL.info(f"Setting user data.") self.username = str(data.get("user", "dummy")) self.password = str(data.get("pass", "dummy")) self.token = data.get("token", None) self.expire_at = datetime.utcnow() + timedelta( seconds=cfg.get("token_expire_seconds", 86400)) self.use_2fa = bool(data.get("use2fa", False)) self.token_2fa = data.get("token_2fa", None) self.token_2fa_temp = None self.temp_token = None self.temp_token_expire_at = datetime.utcnow() + timedelta(seconds=30) if self.use_2fa and self.token_2fa: self.pyotp_session = pyotp.TOTP(self.token_2fa)
async def assign_active_member(*args): SHL.info("Fetching last messages.") guild = await client.fetch_guild(cfg.get("guild_id")) SHL.debug(f"Guild: {guild}") # Remove all "active" members SHL.info("Remove active role from all users.") for role in cfg.get("apply_roles"): role = guild.get_role(role) async for member in guild.fetch_members(): if role not in member.roles: continue SHL.debug(f"Remove {role} from {member}") try: await member.remove_roles(role) except: SHL.debug(f"Failed for {member}") # Find new active members channels = await guild.fetch_channels() announcement_channel = await client.fetch_channel( cfg.get("announce_channel")) log_channel = await client.fetch_channel(cfg.get("log_channel")) users = {} before = datetime.now() after = datetime.now() - timedelta(days=31) with open(os.path.join(CONTENT_PATH, "unsubs.json"), "r") as fh: unsubs = json.load(fh)["unsub_ids"] SHL.debug(f"{len(unsubs)} users unsubbed.") for channel in channels: if not isinstance(channel, discord.TextChannel): continue if channel.id in cfg.get("exclude_channels"): continue SHL.debug(f"Fetching {channel.name}") async for message in channel.history(limit=None, before=before, after=after): uid = message.author.id if uid in unsubs: # filter opt-out user continue if uid in users: users[uid].count += 1 else: users[uid] = UserStat(message.author) sorted_list = sorted( [x for x in users.values() if x.count >= cfg.get("needed_messages")], key=lambda item: item.count, reverse=True) SHL.debug(f"{len(sorted_list)} users sent enough messages.") log_embed = InfoEmbed(title="Aktivste User - Log") for stat in sorted_list: # active user try: member = await guild.fetch_member(stat.user_obj.id) except: # if user left or got banned continue SHL.debug(f"Apply roles for {member}") log_embed.description += f"{member.mention} : {stat.count} Nachrichten.\n" for role in cfg.get("apply_roles"): assign_role = discord_fetch(guild.roles, id=role) try: await member.add_roles(assign_role) except: SHL.debug(f"Failed for {stat.user_obj}") break await log_channel.send(embed=log_embed) announcement = InfoEmbed( title="Aktivste User", description="Für die Auswahl der Stammmitglieder.\n" "Nachrichtenanzahl im letzten Monat.") for stat in sorted_list[:3]: # most active user member = await guild.fetch_member(stat.user_obj.id) announcement.description += f"{member.mention} : {stat.count} Nachrichten.\n" await announcement_channel.send(embed=announcement) await log_channel.send(embed=announcement) SHL.info("Done.")
app = Flask(__name__) app.register_blueprint(main_blueprint) app.register_blueprint(notif_blueprint, url_prefix='/notif') app.register_blueprint(user_blueprint, url_prefix='/user') # Login_manager (session) login_manager = LoginManager(app) login_manager.session_protection = 'strong' login_manager.anonymous_user = models.AnonymousUser mail.init_app(app) manager = Manager(app) bootstrap = Bootstrap(app) app.config['SECRET_KEY'] = cfg.get("Secret", "wtf_secret_key") # app.config['SERVER_NAME'] = "www.circl.lu:443" # app.config['APPLICATION_ROOT'] = '/cve-portal' # app.config['WTF_CSRF_ENABLED'] = True # SMTP email config # app.config['MAIL_SERVER'] = cfg.get('SMTP', 'server') app.config['MAIL_PORT'] = cfg.get('SMTP', 'port') app.config['MAIL_USE_TLS'] = cfg.get('SMTP', 'tls') app.config['DEFAULT_MAIL_SENDER'] = cfg.get('SMTP', 'sender') # Super Admin # app.config['PORTAL_ADMIN'] = cfg.get('ADMIN', 'mail') # MONGO #
def add_message(self, msg: Union[Message, Embed], username: str = "all"): if cfg.get("save_chat_history", True): self.__history.append(HistoryEntry(msg, username)) if len(self.__history) > self.__max_length: self.__history.pop(0)
def __init__(self, upload_dict): self.max_age = cfg.get('uploads_max_age', 172800) self.check_cooldown = cfg.get('uploads_check_cooldown', 43200) self.runCheck = False self.upload_dict = upload_dict
import sys from utils import Console, white, cfg, red SHL = Console("SettingsInit") start_args = [x.strip().lower() for x in sys.argv] login_disabled = cfg.get("logindisabled", False) # default from cfg if "-disablelogin" in start_args: # overwrite by parameter login_disabled = True if login_disabled: SHL.info(f"Disabled authentication.") debug_mode = cfg.get("debug_enabled", False) # default from cfg if "-debug" in start_args: # overwrite by parameter debug_mode = True if debug_mode: SHL.info(f"Enabled debug_mode.") unittest_mode = False if "-unittest" in start_args: SHL.info(f"Enabled unittest mode.") unittest_mode = True debug_mode = False cfg.load_unittest_config() production_mode = False if "-prod" in start_args:
def admin_home(): newform = form_class.RegistrationForm() updateform = form_class.UpdateUserForm() deleteform = form_class.DeleteUserForm() if deleteform.validate_on_submit(): if deleteform.id.data != '1': user = models.User.query.filter_by(id=deleteform.id.data).first() models.db.session.delete(user) models.db.session.commit() flash('User successfully deleted', 'success') syslog.syslog( syslog.LOG_CRIT, "Admin: " + current_user.email + " deleted User: "******"Sorry but you just can't delete this admin.", 'danger') syslog.syslog(syslog.LOG_ALERT, "User wanted to delete admin" + current_user.email) return redirect(url_for('main.admin_home')) elif newform.validate_on_submit(): ki = gpg.import_keys(newform.pgp.data) if not ki.fingerprints: fingerp = "--- NO VALID PGP ---" else: fingerp = ki.fingerprints[0] user = models.User(email=escape(newform.email.data), name=escape(newform.name.data), affiliation=escape(newform.affiliation.data), pgp=newform.pgp.data, password=newform.password.data, fingerprint=fingerp) models.db.session.add(user) models.db.session.commit() syslog.syslog( syslog.LOG_WARNING, "Admin: " + current_user.email + " created User: "******"--- NO VALID PGP ---" else: fingerp = ki.fingerprints[0] user = models.User.query.filter_by(id=updateform.id.data).first() user.name = escape(updateform.name.data) user.affiliation = escape(updateform.affiliation.data) user.fingerprint = fingerp user.pgp = updateform.pgp.data if updateform.id.data != '1': listemail = [] for user in models.User.query.all(): listemail.append(user.email) if updateform.email.data not in listemail or updateform.email.data == models.User.query.filter_by( id=updateform.id.data).first().email: user.email = escape(updateform.email.data) user.confirmed = updateform.confirmed.data user.role = models.Role.query.get(updateform.role.data) else: syslog.syslog( syslog.LOG_ERR, "Admin: " + current_user.email + " Tried to assign existing email to user: "******"Admin: " + current_user.email + " Tried to remove right of Admin: " + user.email) models.db.session.add(user) models.db.session.commit() syslog.syslog( syslog.LOG_WARNING, "Admin: " + current_user.email + " updated User: "******"admin_home.html", newform=newform, updateform=updateform, deleteform=deleteform)
def admin_home(): newform = form_class.RegistrationForm() updateform = form_class.UpdateUserForm() deleteform = form_class.DeleteUserForm() if deleteform.validate_on_submit(): if deleteform.id.data != '1': user = models.User.query.filter_by(id=deleteform.id.data).first() models.db.session.delete(user) models.db.session.commit() flash('User successfully deleted', 'success') syslog.syslog(syslog.LOG_CRIT, "Admin: " + current_user.email + " deleted User: "******"Sorry but you just can't delete this admin.", 'danger') syslog.syslog(syslog.LOG_ALERT, "User wanted to delete admin" + current_user.email) return redirect(url_for('main.admin_home')) elif newform.validate_on_submit(): ki = gpg.import_keys(newform.pgp.data) if not ki.fingerprints: fingerp = "--- NO VALID PGP ---" else: fingerp = ki.fingerprints[0] user = models.User(email=escape(newform.email.data), name=escape(newform.name.data), affiliation=escape(newform.affiliation.data), pgp=newform.pgp.data, password=newform.password.data, fingerprint=fingerp) models.db.session.add(user) models.db.session.commit() syslog.syslog(syslog.LOG_WARNING, "Admin: " + current_user.email + " created User: "******"--- NO VALID PGP ---" else: fingerp = ki.fingerprints[0] user = models.User.query.filter_by(id=updateform.id.data).first() user.name = escape(updateform.name.data) user.affiliation = escape(updateform.affiliation.data) user.fingerprint = fingerp user.pgp = updateform.pgp.data if updateform.id.data != '1': listemail = [] for user in models.User.query.all(): listemail.append(user.email) if updateform.email.data not in listemail or updateform.email.data == models.User.query.filter_by( id=updateform.id.data).first().email: user.email = escape(updateform.email.data) user.confirmed = updateform.confirmed.data user.role = models.Role.query.get(updateform.role.data) else: syslog.syslog(syslog.LOG_ERR, "Admin: " + current_user.email + " Tried to assign existing email to user: "******"Admin: " + current_user.email + " Tried to remove right of Admin: " + user.email) models.db.session.add(user) models.db.session.commit() syslog.syslog(syslog.LOG_WARNING, "Admin: " + current_user.email + " updated User: "******"admin_home.html", newform=newform, updateform=updateform, deleteform=deleteform)
def check_cooldown(self, sid) -> bool: if not cfg.get("message_cooldown", True): return False if float(time.time() - self.user_cooldowns.get(sid, 0)) <= 0.4: return True return False
special_image_regex = compile(r"\.gifv$", IGNORECASE) audio_regex = compile(r".+\.(?:mp3|wav|ogg)$", IGNORECASE) video_regex = compile(r".+\.(?:mp4|ogg|webm)$", IGNORECASE) newline_html_regex = compile(r'[\n\r]') code_regex = compile(r"(```)(.+?|[\r\n]+?)(```)", MULTILINE) quote_regex = compile(r"^> (.+)", MULTILINE) # Startup parameters start_args = [x.strip().lower() for x in sys.argv] dummy_user = False if "-dummyuser" in start_args: SHL.output(f"{red}Adding Dummy User{white}") dummy_user = True debug_mode = cfg.get("debug_enabled", False) if "-debug" in start_args: debug_mode = True if debug_mode: SHL.output(f"{red}Enabled debug_mode.{white}") from .commands import handle_command from .sockets import emit_status # TODO: dafuq is this, send help from . import routes # checking and creating upload dir if not os.path.exists(app.config['UPLOAD_FOLDER']): os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) SHL.output(f"Upload folder was not present, created upload folder.", "Upload")
def __init__(self): self.__history = [] self.__max_length = cfg.get("chat_history_length", 100)