diff --git a/.dockerignore b/.dockerignore index 5ef7a65b4..7937a735f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,3 +15,5 @@ CTFd/uploads/**/* **/node_modules **/*.pyc **/__pycache__ +.venv* +venv* \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6d3387012..026123068 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ __pycache__/ # Distribution / packaging .Python env/ +venv* +.venv* build/ develop-eggs/ dist/ diff --git a/.prettierignore b/.prettierignore index ba40c14ae..00d79fc65 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,3 +8,6 @@ CTFd/themes/**/vendor/ *.svg *.mp3 *.webm +.pytest_cache +venv* +.venv* diff --git a/CTFd/auth.py b/CTFd/auth.py index c6454cdaa..cb1baa376 100644 --- a/CTFd/auth.py +++ b/CTFd/auth.py @@ -1,7 +1,7 @@ import base64 import requests -from flask import Blueprint +from flask import Blueprint, abort from flask import current_app as app from flask import redirect, render_template, request, session, url_for from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired @@ -510,6 +510,16 @@ def oauth_redirect(): team = Teams.query.filter_by(oauth_id=team_id).first() if team is None: + num_teams_limit = int(get_config("num_teams", default=0)) + num_teams = Teams.query.filter_by( + banned=False, hidden=False + ).count() + if num_teams_limit and num_teams >= num_teams_limit: + abort( + 403, + description=f"Reached the maximum number of teams ({num_teams_limit}). Please join an existing team.", + ) + team = Teams(name=team_name, oauth_id=team_id, captain_id=user.id) db.session.add(team) db.session.commit() diff --git a/CTFd/forms/config.py b/CTFd/forms/config.py index 51ba3d563..618322fc1 100644 --- a/CTFd/forms/config.py +++ b/CTFd/forms/config.py @@ -43,6 +43,9 @@ class AccountSettingsForm(BaseForm): widget=NumberInput(min=0), description="Amount of users per team (Teams mode only)", ) + num_teams = IntegerField( + widget=NumberInput(min=0), description="Max number of teams (Teams mode only)", + ) verify_emails = SelectField( "Verify Emails", description="Control whether users must confirm their email addresses before playing", diff --git a/CTFd/teams.py b/CTFd/teams.py index 1b99d6afb..945974451 100644 --- a/CTFd/teams.py +++ b/CTFd/teams.py @@ -197,6 +197,14 @@ def new(): description="Team creation is currently disabled. Please join an existing team.", ) + num_teams_limit = int(get_config("num_teams", default=0)) + num_teams = Teams.query.filter_by(banned=False, hidden=False).count() + if num_teams_limit and num_teams >= num_teams_limit: + abort( + 403, + description=f"Reached the maximum number of teams ({num_teams_limit}). Please join an existing team.", + ) + user = get_current_user_attrs() if user.team_id: errors.append("You are already in a team. You cannot join another.") diff --git a/CTFd/themes/admin/templates/configs/accounts.html b/CTFd/themes/admin/templates/configs/accounts.html index e870ec2bb..4f855220a 100644 --- a/CTFd/themes/admin/templates/configs/accounts.html +++ b/CTFd/themes/admin/templates/configs/accounts.html @@ -38,6 +38,14 @@ +