Skip to content

Commit 22c1323

Browse files
authored
2.3.0 (CTFd#1248)
2.3.0 / 2020-02-17 ================== **General** * During setup, admins can register their email address with the CTFd LLC newsletter for news and updates * Fix editting hints from the admin panel * Allow admins to insert HTML code directly into the header and footer (end of body tag) of pages. This replaces and supercedes the custom CSS feature. * The `views.custom_css` route has been removed. * Admins can now customize the content of outgoing emails and inject certain variables into email content. * The `manage.py` script can now manipulate the CTFd Configs table via the `get_config` and `set_config` commands. (e.g. `python manage.py get_config ctf_theme` and `python manage.py set_config ctf_theme core`) **Themes** * Themes should now reference the `theme_header` and `theme_footer` configs instead of the `views.custom_css` endpoint to allow for user customizations. See the `base.html` file of the core theme. **Plugins** * Make `ezq` functions available to `CTFd.js` under `CTFd.ui.ezq` **Miscellaneous** * Python imports sorted with `isort` and import order enforced * Black formatter running on a majority of Python code
1 parent 354954b commit 22c1323

File tree

197 files changed

+3254
-1581
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

197 files changed

+3254
-1581
lines changed

CHANGELOG.md

+22
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1+
2.3.0 / 2020-02-17
2+
==================
3+
4+
**General**
5+
* During setup, admins can register their email address with the CTFd LLC newsletter for news and updates
6+
* Fix editting hints from the admin panel
7+
* Allow admins to insert HTML code directly into the header and footer (end of body tag) of pages. This replaces and supercedes the custom CSS feature.
8+
* The `views.custom_css` route has been removed.
9+
* Admins can now customize the content of outgoing emails and inject certain variables into email content.
10+
* The `manage.py` script can now manipulate the CTFd Configs table via the `get_config` and `set_config` commands. (e.g. `python manage.py get_config ctf_theme` and `python manage.py set_config ctf_theme core`)
11+
12+
**Themes**
13+
* Themes should now reference the `theme_header` and `theme_footer` configs instead of the `views.custom_css` endpoint to allow for user customizations. See the `base.html` file of the core theme.
14+
15+
**Plugins**
16+
* Make `ezq` functions available to `CTFd.js` under `CTFd.ui.ezq`
17+
18+
**Miscellaneous**
19+
* Python imports sorted with `isort` and import order enforced
20+
* Black formatter running on a majority of Python code
21+
22+
123
2.2.3 / 2020-01-21
224
==================
325

CTFd/__init__.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
1-
import sys
1+
import datetime
22
import os
3-
3+
import sys
44
from distutils.version import StrictVersion
5+
56
from flask import Flask, Request
67
from flask_migrate import upgrade
7-
from werkzeug.utils import cached_property
8-
from werkzeug.middleware.proxy_fix import ProxyFix
98
from jinja2 import FileSystemLoader
109
from jinja2.sandbox import SandboxedEnvironment
1110
from six.moves import input
11+
from werkzeug.middleware.proxy_fix import ProxyFix
12+
from werkzeug.utils import cached_property
1213

1314
from CTFd import utils
14-
from CTFd.utils.migrations import migrations, create_database, stamp_latest_revision
15-
from CTFd.utils.sessions import CachingSessionInterface
16-
from CTFd.utils.updates import update_check
15+
from CTFd.plugins import init_plugins
16+
from CTFd.utils.crypto import sha256
1717
from CTFd.utils.initialization import (
18+
init_events,
19+
init_logs,
1820
init_request_processors,
1921
init_template_filters,
2022
init_template_globals,
21-
init_logs,
22-
init_events,
2323
)
24-
from CTFd.utils.crypto import sha256
25-
from CTFd.plugins import init_plugins
26-
import datetime
24+
from CTFd.utils.migrations import create_database, migrations, stamp_latest_revision
25+
from CTFd.utils.sessions import CachingSessionInterface
26+
from CTFd.utils.updates import update_check
2727

2828
# Hack to support Unicode in Python 2 properly
2929
if sys.version_info[0] < 3:
3030
reload(sys) # noqa: F821
3131
sys.setdefaultencoding("utf-8")
3232

33-
__version__ = "2.2.3"
33+
__version__ = "2.3.0"
3434

3535

3636
class CTFdRequest(Request):

CTFd/admin/__init__.py

+27-30
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,51 @@
1+
import csv
2+
import datetime
3+
import os
4+
5+
import six
6+
from flask import Blueprint, abort
7+
from flask import current_app as app
18
from flask import (
2-
current_app as app,
3-
render_template,
4-
request,
59
redirect,
6-
url_for,
7-
Blueprint,
8-
abort,
10+
render_template,
911
render_template_string,
12+
request,
1013
send_file,
14+
url_for,
1115
)
1216

13-
from CTFd.utils.decorators import admins_only
14-
from CTFd.utils.user import is_admin
15-
from CTFd.utils.security.auth import logout_user
16-
from CTFd.utils import config as ctf_config, get_config, set_config
1717
from CTFd.cache import cache, clear_config
18-
from CTFd.utils.helpers import get_errors
19-
from CTFd.utils.exports import (
20-
export_ctf as export_ctf_util,
21-
import_ctf as import_ctf_util,
22-
)
2318
from CTFd.models import (
24-
db,
25-
get_class_by_tablename,
26-
Users,
27-
Teams,
19+
Awards,
2820
Configs,
29-
Submissions,
3021
Solves,
31-
Awards,
32-
Unlocks,
22+
Submissions,
23+
Teams,
3324
Tracking,
25+
Unlocks,
26+
Users,
27+
db,
28+
get_class_by_tablename,
3429
)
35-
import datetime
36-
import os
37-
import six
38-
import csv
39-
30+
from CTFd.utils import config as ctf_config
31+
from CTFd.utils import get_config, set_config
32+
from CTFd.utils.decorators import admins_only
33+
from CTFd.utils.exports import export_ctf as export_ctf_util
34+
from CTFd.utils.exports import import_ctf as import_ctf_util
35+
from CTFd.utils.helpers import get_errors
36+
from CTFd.utils.security.auth import logout_user
37+
from CTFd.utils.user import is_admin
4038

4139
admin = Blueprint("admin", __name__)
4240

43-
4441
from CTFd.admin import challenges # noqa: F401
42+
from CTFd.admin import notifications # noqa: F401
4543
from CTFd.admin import pages # noqa: F401
4644
from CTFd.admin import scoreboard # noqa: F401
4745
from CTFd.admin import statistics # noqa: F401
46+
from CTFd.admin import submissions # noqa: F401
4847
from CTFd.admin import teams # noqa: F401
4948
from CTFd.admin import users # noqa: F401
50-
from CTFd.admin import submissions # noqa: F401
51-
from CTFd.admin import notifications # noqa: F401
5249

5350

5451
@admin.route("/admin", methods=["GET"])

CTFd/admin/challenges.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
from flask import current_app as app, render_template, render_template_string, url_for
2-
from CTFd.utils.decorators import admins_only
3-
from CTFd.utils import binary_type
4-
from CTFd.models import Solves, Challenges, Flags
5-
from CTFd.plugins.challenges import get_chal_class
6-
from CTFd.admin import admin
71
import os
2+
83
import six
4+
from flask import current_app as app
5+
from flask import render_template, render_template_string, url_for
6+
7+
from CTFd.admin import admin
8+
from CTFd.models import Challenges, Flags, Solves
9+
from CTFd.plugins.challenges import get_chal_class
10+
from CTFd.utils import binary_type
11+
from CTFd.utils.decorators import admins_only
912

1013

1114
@admin.route("/admin/challenges")

CTFd/admin/notifications.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from flask import render_template
2-
from CTFd.utils.decorators import admins_only
3-
from CTFd.models import Notifications
2+
43
from CTFd.admin import admin
4+
from CTFd.models import Notifications
5+
from CTFd.utils.decorators import admins_only
56

67

78
@admin.route("/admin/notifications")

CTFd/admin/pages.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from flask import render_template, request
2-
from CTFd.utils.decorators import admins_only
2+
3+
from CTFd.admin import admin
34
from CTFd.models import Pages
45
from CTFd.schemas.pages import PageSchema
56
from CTFd.utils import markdown
6-
from CTFd.admin import admin
7+
from CTFd.utils.decorators import admins_only
78

89

910
@admin.route("/admin/pages")

CTFd/admin/scoreboard.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from flask import render_template
2-
from CTFd.utils.decorators import admins_only
2+
33
from CTFd.admin import admin
44
from CTFd.scoreboard import get_standings
5+
from CTFd.utils.decorators import admins_only
56

67

78
@admin.route("/admin/scoreboard")

CTFd/admin/statistics.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from flask import render_template
2+
3+
from CTFd.admin import admin
4+
from CTFd.models import Challenges, Fails, Solves, Teams, Tracking, Users, db
25
from CTFd.utils.decorators import admins_only
3-
from CTFd.utils.updates import update_check
46
from CTFd.utils.modes import get_model
5-
from CTFd.models import db, Solves, Challenges, Fails, Tracking, Teams, Users
6-
from CTFd.admin import admin
7+
from CTFd.utils.updates import update_check
78

89

910
@admin.route("/admin/statistics", methods=["GET"])

CTFd/admin/submissions.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from flask import render_template, request
2-
from CTFd.utils.decorators import admins_only
2+
3+
from CTFd.admin import admin
34
from CTFd.models import Challenges, Submissions
5+
from CTFd.utils.decorators import admins_only
46
from CTFd.utils.modes import get_model
5-
from CTFd.admin import admin
67

78

89
@admin.route("/admin/submissions", defaults={"submission_type": None})

CTFd/admin/teams.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from flask import render_template, request
2-
from CTFd.utils.decorators import admins_only
3-
from CTFd.models import db, Teams, Challenges, Tracking
2+
from sqlalchemy.sql import not_
3+
44
from CTFd.admin import admin
5+
from CTFd.models import Challenges, Teams, Tracking, db
6+
from CTFd.utils.decorators import admins_only
57
from CTFd.utils.helpers import get_errors
68

7-
from sqlalchemy.sql import not_
8-
99

1010
@admin.route("/admin/teams")
1111
@admins_only

CTFd/admin/users.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from flask import render_template, request
2+
from sqlalchemy.sql import not_
3+
4+
from CTFd.admin import admin
5+
from CTFd.models import Challenges, Tracking, Users, db
26
from CTFd.utils import get_config
37
from CTFd.utils.decorators import admins_only
4-
from CTFd.utils.modes import TEAMS_MODE
5-
from CTFd.models import db, Users, Challenges, Tracking
6-
from CTFd.admin import admin
78
from CTFd.utils.helpers import get_errors
8-
9-
from sqlalchemy.sql import not_
9+
from CTFd.utils.modes import TEAMS_MODE
1010

1111

1212
@admin.route("/admin/users")

CTFd/api/__init__.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
from flask import Blueprint, current_app
22
from flask_restplus import Api
3-
from CTFd.api.v1.challenges import challenges_namespace
43

5-
from CTFd.api.v1.teams import teams_namespace
6-
from CTFd.api.v1.users import users_namespace
7-
from CTFd.api.v1.scoreboard import scoreboard_namespace
8-
from CTFd.api.v1.statistics import statistics_namespace
9-
from CTFd.api.v1.submissions import submissions_namespace
10-
from CTFd.api.v1.tags import tags_namespace
114
from CTFd.api.v1.awards import awards_namespace
12-
from CTFd.api.v1.hints import hints_namespace
13-
from CTFd.api.v1.flags import flags_namespace
14-
from CTFd.api.v1.files import files_namespace
5+
from CTFd.api.v1.challenges import challenges_namespace
156
from CTFd.api.v1.config import configs_namespace
7+
from CTFd.api.v1.files import files_namespace
8+
from CTFd.api.v1.flags import flags_namespace
9+
from CTFd.api.v1.hints import hints_namespace
1610
from CTFd.api.v1.notifications import notifications_namespace
1711
from CTFd.api.v1.pages import pages_namespace
18-
from CTFd.api.v1.unlocks import unlocks_namespace
12+
from CTFd.api.v1.scoreboard import scoreboard_namespace
13+
from CTFd.api.v1.statistics import statistics_namespace
14+
from CTFd.api.v1.submissions import submissions_namespace
15+
from CTFd.api.v1.tags import tags_namespace
16+
from CTFd.api.v1.teams import teams_namespace
1917
from CTFd.api.v1.tokens import tokens_namespace
18+
from CTFd.api.v1.unlocks import unlocks_namespace
19+
from CTFd.api.v1.users import users_namespace
2020

2121
api = Blueprint("api", __name__, url_prefix="/api/v1")
2222
CTFd_API_v1 = Api(api, version="v1", doc=current_app.config.get("SWAGGER_UI"))

CTFd/api/v1/awards.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from flask import request
22
from flask_restplus import Namespace, Resource
3+
34
from CTFd.cache import clear_standings
4-
from CTFd.models import db, Awards
5+
from CTFd.models import Awards, db
56
from CTFd.schemas.awards import AwardSchema
67
from CTFd.utils.decorators import admins_only
78

CTFd/api/v1/challenges.py

+22-33
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,37 @@
1-
from flask import request, abort, url_for
1+
import datetime
2+
3+
from flask import abort, request, url_for
24
from flask_restplus import Namespace, Resource
3-
from CTFd.models import (
4-
db,
5-
Challenges,
6-
HintUnlocks,
7-
Tags,
8-
Hints,
9-
Flags,
10-
Solves,
11-
Fails,
12-
ChallengeFiles as ChallengeFilesModel,
5+
from sqlalchemy.sql import and_
6+
7+
from CTFd.cache import clear_standings
8+
from CTFd.models import ChallengeFiles as ChallengeFilesModel
9+
from CTFd.models import Challenges, Fails, Flags, Hints, HintUnlocks, Solves, Tags, db
10+
from CTFd.plugins.challenges import CHALLENGE_CLASSES, get_chal_class
11+
from CTFd.schemas.flags import FlagSchema
12+
from CTFd.schemas.hints import HintSchema
13+
from CTFd.schemas.tags import TagSchema
14+
from CTFd.utils import config, get_config
15+
from CTFd.utils import user as current_user
16+
from CTFd.utils.config.visibility import (
17+
accounts_visible,
18+
challenges_visible,
19+
scores_visible,
1320
)
14-
from CTFd.plugins.challenges import CHALLENGE_CLASSES
15-
from CTFd.utils.dates import isoformat
21+
from CTFd.utils.dates import ctf_ended, ctf_paused, ctftime, isoformat, unix_time_to_utc
1622
from CTFd.utils.decorators import (
23+
admins_only,
1724
during_ctf_time_only,
1825
require_verified_emails,
19-
admins_only,
2026
)
2127
from CTFd.utils.decorators.visibility import (
2228
check_challenge_visibility,
2329
check_score_visibility,
2430
)
25-
from CTFd.cache import clear_standings
26-
from CTFd.utils.config.visibility import (
27-
scores_visible,
28-
accounts_visible,
29-
challenges_visible,
30-
)
31-
from CTFd.utils.user import is_admin, authed
32-
from CTFd.utils.modes import get_model, generate_account_url
33-
from CTFd.schemas.tags import TagSchema
34-
from CTFd.schemas.hints import HintSchema
35-
from CTFd.schemas.flags import FlagSchema
36-
from CTFd.utils import config, get_config
37-
from CTFd.utils import user as current_user
38-
from CTFd.utils.user import get_current_team
39-
from CTFd.utils.user import get_current_user
40-
from CTFd.plugins.challenges import get_chal_class
41-
from CTFd.utils.dates import ctf_ended, ctf_paused, ctftime, unix_time_to_utc
4231
from CTFd.utils.logging import log
32+
from CTFd.utils.modes import generate_account_url, get_model
4333
from CTFd.utils.security.signing import serialize
44-
from sqlalchemy.sql import and_
45-
import datetime
34+
from CTFd.utils.user import authed, get_current_team, get_current_user, is_admin
4635

4736
challenges_namespace = Namespace(
4837
"challenges", description="Endpoint to retrieve Challenges"

0 commit comments

Comments
 (0)