예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
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)
예제 #4
0
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))
예제 #5
0
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)
예제 #6
0
    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)
예제 #7
0
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.")
예제 #8
0
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  #
예제 #9
0
 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)
예제 #10
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
예제 #11
0
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:
예제 #12
0
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)
예제 #13
0
파일: main.py 프로젝트: CIRCL/cve-portal
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)
예제 #14
0
 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
예제 #15
0
파일: server.py 프로젝트: CIRCL/cve-portal
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  #
예제 #16
0
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"^&gt; (.+)", 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")
예제 #17
0
 def __init__(self):
     self.__history = []
     self.__max_length = cfg.get("chat_history_length", 100)