Commit Graph

1044 Commits

Author SHA1 Message Date
Kevin Chung
5c9b3e7070 Add team creation disable configuration (#1802)
* Add ability for admins to disable public team creation
* Closes #1364
2021-02-12 18:26:03 -05:00
Kevin Chung
abdc366bb7 Fix scoreboard identifier to switch between User/Team depending on mode (#1800)
* Fix scoreboard table identifier to switch between User/Team depending on mode
* Closes #1777
2021-02-11 01:11:50 -05:00
Kevin Chung
213c6641d5 Allow time format to be overriden by data attribute (#1801)
* Allow for the `data-time` format to be overridden by `data-time-format` attribute.
* Closes #1776
2021-02-11 00:54:43 -05:00
Kevin Chung
fa7316722e Fix exception occuring on Admin demotion (#1799)
* Fix an exception that occurred when demoting an Admin user
* Fix the response from the above request from returning a list instead of a dict
* Closes #1794
2021-02-09 04:03:04 -05:00
Kevin Chung
0a5a886ac6 Fix issue where page URLs were relative (#1798)
* Fix issue where Page URLs were relative in the navbar
* Closes #1797
2021-02-09 03:03:17 -05:00
Kevin Chung
657bafd9ce Fix typo in FlagEditForm.vue (#1793)
Fix typo in FlagEditForm.vue
Related to #1779
2021-02-04 22:35:03 -05:00
Kevin Chung
3af0b68164 Fix incorrect schema validator (#1790)
* Use right length in Page title validator
2021-01-29 18:48:07 -05:00
Frank
7fe32d7a5d field based schema validation (#1789)
* Clean up Page and Challenges schema validation
2021-01-29 15:09:09 -05:00
Kevin Chung
7f115bf458 Add length error content that is too long (#1787)
* Add length checking to some sensitive fields in Pages and Challenges.
* Works on #1786

This is enough to fix most of the issues but this is really a systemic problem for most of the API endpoints. We should have something that verifies data consistency. Marshmallow is not good enough at this. Pydantic seems like it would be superior here.
2021-01-28 16:55:15 -05:00
Kevin Chung
2e6ce0f695 Add a temporary fix/hack for running scripts in flag editor templates (#1783)
* Works on #1779 
* Adds a temporary hack for re-enabling Javascript snippets in Flag editor templates. 
    * In the future this will probably be separated out into a separate scripts file or something like using web components
2021-01-27 02:58:23 -05:00
dependabot[bot]
566c16a9df Bump highlight.js from 10.3.1 to 10.4.1 (#1753)
* Bump highlight.js from 10.3.1 to 10.4.1

Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 10.3.1 to 10.4.1.
- [Release notes](https://github.com/highlightjs/highlight.js/releases)
- [Changelog](https://github.com/highlightjs/highlight.js/blob/master/CHANGES.md)
- [Commits](https://github.com/highlightjs/highlight.js/compare/10.3.1...10.4.1)

Signed-off-by: dependabot[bot] <support@github.com>

* Run yarn build

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kevin Chung <kchung@ctfd.io>
Co-authored-by: Kevin Chung <kchung@nyu.edu>
2021-01-27 01:21:08 -05:00
dependabot[bot]
cd248dcf4e Bump ini from 1.3.5 to 1.3.7 (#1761)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kevin Chung <kchung@ctfd.io>
2021-01-27 00:12:42 -05:00
Kevin Chung
d3b8d49de8 Bump some Python dependencies (#1784)
* Bump lxml to 4.6.2
* Bump pip-compile to 5.4.0
2021-01-26 23:55:08 -05:00
Khiem Doan
ba0afb5396 Update docker (#1773)
* Install `python3-dev` dependency instead of `python-dev`
2021-01-14 15:48:17 -05:00
Ace Pace
ac04d9049b Speed up docker builds (#1767)
* Copy over `requirements.txt` first in Dockerfile to cache Python dependencies
2021-01-14 15:16:56 -05:00
Kevin Chung
e1991e1696 Fix issue where you can't remove a time set in Configs (#1760)
* Fix issue where config times (start, end, freeze times) could not be removed
2020-12-10 15:47:27 -05:00
Kevin Chung
eabf43f980 Don't allow admins to delete themselves (#1759)
* Don't allow admins to accidentally delete themselves
2020-12-10 13:21:26 -05:00
Kevin Chung
9374c2a0a8 Mark 3.2.1 (#1757)
# 3.2.1 / 2020-12-09

- Fixed an issue where Users could not unlock hints
2020-12-09 14:53:19 -05:00
Kevin Chung
f0c65a47ed Mark 3.2.0 release date in CHANGELOG (#1756)
# 3.2.0 / 2020-12-07

**General**

- Add Team invites.
  - Team invites are links containing a token that allow a user to join a team without knowing the team password
  - Captains can generate invite tokens for their teams
  - Admins can generate Team invite links as well
- Improved Team handling
  - Prevent team joining while already on a team
  - Return 403 instead of 200 for team join/create errors
  - Allow team captains whose teams haven't done anything to disband their team
- Allow for uploading navbar logo, favicon, and index page banner during initial setup
- Fixed issue in teams mode where a user couldn't unlock a hint despite their team having enough points
  - The fix for this is essentially to allow the user's points to go negative
- Imports have been made more stable
  - This is primarily done by killing MySQL processes that are locking metadta
  - This is a subpar approach but it seems to be the only solution to avoid a metadata lock in MySQL. This approach did not appear to be needed under Postgres or SQLite

**API**

- Addition of `POST /api/v1/teams/me/members` to generate invite tokens for teams
- Fixed an issue in `POST /api/v1/awards` where CTFd would 500 when a user could not be found by the provided `user_id`
- `POST /api/v1/unlocks` in teams mode now uses the team's score to determine if a user can purchase a hint
  - Properly check for existing unlocks in teams mode in `POST /api/v1/unlocks`
- `/api/v1/notifications` and `/api/v1/notifications/[notification_id]` now have an html parameter which specifies the rendered content of the notification content

**Themes**

- Add Team Invite icon and Disband Team icon to teams/private.html
- Add teams/invite.html file to handle team joining with invites
- Added syntax highlighting to challenge descriptions, pages, hints, notifications, comments, and markdown editors
  - This is done with `highlight.js` which has been added to `package.json`
- Fix notifications to properly fix/support Markdown and HTML notifications
  - Notifications SQL Model now has an html propery
  - Notifications API schemas now has an html field
- Removed MomentJS (see https://momentjs.com/docs/#/-project-status/) in favor of dayjs
  - dayjs is mostly API compatible with MomentJS. The only major changes were:
    - dayjs always uses browser local time so you don't need to call `.local()`
    - dayjs segments out some MomentJS functionality into plugins which need to be imported in before using those features
- Fixed issue in `challenge.html` where the current attempt count would have a typo
- Fixed issue in `challenge.html` where the max attempts for a challenge would not show if it was set to 1
- Edit donut charts to have easier to read legends and labels
- Make data zoom bars thinner and more transparent
- Add logo, banner, and favicon settings to the setup.html

**Plugins**

- The `auth.register` (`/register`) endpoint now accepts a `?next=` parameter to define where to redirect to after registration
- There is now a `registered_only` decorator to redirect users to `auth.register` (`/register`) instead of `auth.login` (`/login`)
- Don't run `db.create_all()` as much during plugin upgrade or during imports
  - By avoiding this we can let alembic and migrations do more of the table creation work but this means that plugins specifically opt into `app.db.create_all()` and will not implicitly get it through `upgrade()`.
  - This means plugins that run `upgrade()` without a migrations folder (no idea who would do this really) will need to upgrade their code.
- The plugin `upgrade()` function now accepts a `lower` parameter which specifies what lower revision should be used to start from.
  - This is used to support plugin migrations during import so that we can import data directly at the point that the import was taken from
  - `lower="current"` means to use the current revision and `lower=None` would mean to use the absolute base revision (e.g. plugin's first installation)
  - By default this doesn't change `upgrade()` behavior

**Admin Panel**

- Add Favicon uploading to the Admin Panel
- Move Logo uploading to the Theme tab in the Admin Panel
- The challenge left side bar tabs have been rewritten into VueJS components.
  - This fixes a number of issues with the consistency of what data is deleted/edited in the challenge editor
  - This also prevents having to refresh the page in most challenge editing situations
- Fixed a possible bug where the update available alert wouldn't go away on server restart
- Examples for regex flags are now provided
- Wrong submissions has been renamed to Incorrect Submissions
- Graphs in the Admin Statistics page will now scroll with mouse wheel to improve browsing large datasets
- Fixed an issue where Users/Teams could be created with a null password

**Deployment**

- A restart policy set to `always` has been added to nginx in docker-compose
- Rename `requirements.txt` to `requirements.in` and generate `requirements.txt` using `pip-tools` under Python 3.6
- `UPLOAD_PROVIDER` no longer has a default `filesystem` set in config.ini. Instead it is defaulted through `config.py`

**Miscellaneous**

- The `psycopg2` dependency in development.txt has been removed in favor of `psycopg2-binary` which was updated to 2.8.6
- The `moto` dependency in development.txt has been updated to 1.3.16
- Add `pip-tools` to `development.txt`
- Add `import_ctf` and `export_ctf` commands to `manage.py` and deprecate `import.py` and `export.py`
- Override the `MAIL_SERVER` config with the `TESTING_MAIL_SERVER` envvar during tests
- `ping` events in the notification event handler have been fixed to not send duplicates
2020-12-07 17:00:38 -05:00
Kevin Chung
ab4c37b31f Add a lower parameter to the plugin upgrade() function to help importing (#1755)
- The plugin `upgrade()` function now accepts a `lower` parameter which specifies what lower revision should be used to start from.
  - This is used to support plugin migrations during import so that we can import data directly at the point that the import was taken from
  - `lower="current"` means to use the current revision and `lower=None` would mean to use the absolute base revision (e.g. plugin's first installation)
  - By default this doesn't change `upgrade()` behavior
2020-12-06 22:24:37 -05:00
Kevin Chung
ecdb99e2f1 Require passwords on accounts (#1754)
- Fixed an issue where Users/Teams could be created with a null password through the Admin Panel
2020-12-04 18:56:42 -05:00
Kevin Chung
cb5ba26bdb Miscellaneous Fixes (#1752)
* Update CHANGELOG 
* Add `registered_only` decorator
* Make team invites redirect to `/register` if you're unauthed
2020-12-04 14:10:36 -05:00
Kevin Chung
d9975f307c Mark 3.2.0 (#1748)
# 3.2.0 / unreleased

**General**

- Add Team invites.
  - Team invites are links containing a token that allow a user to join a team without knowing the team password
  - Captains can generate invite tokens for their teams
  - Admins can generate Team invite links as well
- Improved Team handling
  - Prevent team joining while already on a team
  - Return 403 instead of 200 for team join/create errors
  - Allow team captains whose teams haven't done anything to disband their team
- Allow for uploading navbar logo, favicon, and index page banner during initial setup
- Fixed issue in teams mode where a user couldn't unlock a hint despite their team having enough points
  - The fix for this is essentially to allow the user's points to go negative
- Imports have been made more stable
  - This is primarily done by killing MySQL processes that are locking metadta
  - This is a subpar approach but it seems to be the only solution to avoid a metadata lock in MySQL. This approach did not appear to be needed under Postgres or SQLite
- Update some migrations to first check if a table already exists.

**API**

- Addition of `POST /api/v1/teams/me/members` to generate invite tokens for teams
- Fixed an issue in `POST /api/v1/awards` where CTFd would 500 when a user could not be found by the provided `user_id`
- `POST /api/v1/unlocks` in teams mode now uses the team's score to determine if a user can purchase a hint
  - Properly check for existing unlocks in teams mode in `POST /api/v1/unlocks`
- `/api/v1/notifications` and `/api/v1/notifications/[notification_id]` now have an html parameter which specifies the rendered content of the notification content

**Themes**

- Added syntax highlighting to challenge descriptions, pages, hints, notifications, comments, and markdown editors
  - This is done with `highlight.js` which has been added to `package.json`
- Fix notifications to properly fix/support Markdown and HTML notifications
  - Notifications SQL Model now has an html propery
  - Notifications API schemas now has an html field
- Removed MomentJS (see https://momentjs.com/docs/#/-project-status/) in favor of dayjs
  - dayjs is mostly API compatible with MomentJS. The only major changes were:
    - dayjs always uses browser local time so you don't need to call `.local()`
    - dayjs segments out some MomentJS functionality into plugins which need to be imported in before using those features
- Fixed issue in `challenge.html` where the current attempt count would have a typo
- Fixed issue in `challenge.html` where the max attempts for a challenge would not show if it was set to 1
- Edit donut charts to have easier to read legends and labels
- Make data zoom bars thinner and more transparent

**Plugins**

- Don't run `db.create_all()` as much during plugin upgrade or during imports
  - By avoiding this we can let alembic and migrations do more of the table creation work but this means that plugins specifically opt into `app.db.create_all()` and will not implicitly get it through `upgrade()`.
  - This means plugins that run `upgrade()` without a migrations folder (no idea who would do this really) will need to upgrade their code.

**Admin Panel**

- Add Favicon uploading to the Admin Panel
- Move Logo uploading to the Theme tab in the Admin Panel
- The challenge left side bar tabs have been rewritten into VueJS components.
  - This fixes a number of issues with the consistency of what data is deleted/edited in the challenge editor
  - This also prevents having to refresh the page in most challenge editing situations
- Fixed a possible bug where the update available alert wouldn't go away on server restart
- Examples for regex flags are now provided
- Wrong submissions has been renamed to Incorrect Submissions
- Graphs in the Admin Statistics page will now scroll with mouse wheel to improve browsing large datasets

**Deployment**

- A restart policy set to `always` has been added to nginx in docker-compose
- Rename `requirements.txt` to `requirements.in` and generate `requirements.txt` using `pip-tools` under Python 3.6
- `UPLOAD_PROVIDER` no longer has a default `filesystem` set in config.ini. Instead it is defaulted through `config.py`

**Miscellaneous**

- The `psycopg2` dependency in development.txt has been removed in favor of `psycopg2-binary` which was updated to 2.8.6
- The `moto` dependency in development.txt has been updated to 1.3.16
- Add `pip-tools` to `development.txt`
- Add `import_ctf` and `export_ctf` commands to `manage.py` and deprecate `import.py` and `export.py`
- Override the `MAIL_SERVER` config with the `TESTING_MAIL_SERVER` envvar during tests
- `ping` events in the notification event handler have been fixed to not send duplicates
2020-12-01 16:09:31 -05:00
Kevin Chung
da4ee4021a Fix issue where a user can't be found for creating an award (#1736)
* Fix issue where a user can't be found for creating an award
2020-11-23 13:10:35 -05:00
Kevin Chung
af1c325371 Improved Team Handling (#1713)
* Prevent team joining while already on a team
* Return 403 instead of 200 for team join/create errors
* Allow team captains whose teams haven't done anything to disband their team
* Closes #1588
2020-11-23 02:35:46 -05:00
Laurent Jalbert-Simard
a4ce27b166 No longer set "filesystem" as UPLOAD_PROVIDER in config.ini (#1728)
* Remove the default `filesystem` setting for `UPLOAD_PROVIDER` in config.ini
  * `filesystem` is still the default via config.py
2020-11-19 14:25:26 -05:00
Kevin Chung
463f117b4a Fix requirements for Python 3.7 because of https://github.com/ericvsmith/dataclasses/pull/161 (#1730)
* Build `requirements.txt` on Python 3.7 to fix an issue with installing dataclasses. 
* Closes #1729 

I tested that this works in Python 3.6, 3.7, and 3.8. A useful project would be to add installing deps to Github Actions. 
I'll subscribe to https://github.com/ericvsmith/dataclasses/pull/161 since this is IMO a bug in dataclasses.
2020-11-19 12:47:15 -05:00
Frank
1883c62cf5 reduce ping events (Fix #1685) (#1699)
Closes #1685
2020-11-18 20:27:48 -05:00
Kevin Chung
44a588869e Increase timeout for update check (#1726)
* Increase timeout for update check from 0.1 seconds to 3 seconds
* Closes #1678
2020-11-18 02:54:15 -05:00
Kevin Chung
9efa102487 Max Attempts improvements in challenge.html (#1725)
* Fixed issue where the current attempt count would have a typo
* Fixed issue where the max attempts for a challenge would not show if it was set to 1
* Works on #1655
2020-11-18 02:34:52 -05:00
Kevin Chung
66ff9c0b91 Add import export commands to manage.py (#1723)
* Add `import_ctf` and `export_ctf` commands to `manage.py`
* Deprecate `import.py` and `export.py`
* Works on #1629
2020-11-16 20:24:42 -05:00
Kevin Chung
1e9c0b43b1 Freeze python dependencies using pip-tools (#1722)
* Rename `requirements.txt` to `requirements.in`
* Generate `requirements.txt` using `pip-tools` under Python 3.6
* Add `pip-tools` to `development.txt`
* Closes #1679
2020-11-16 17:06:01 -05:00
Kevin Chung
a2987f1199 Remove psycopg2 dep and only use psycopg2-binary (#1720)
* Remove `psycopg2` dep and only use `psycopg2-binary`
* Update `psycopg2-binary` to 2.8.6
2020-11-16 11:02:54 -05:00
Kevin Chung
048632788d Add examples for regex flags (#1716)
* Adds examples for regex flags in the flag creation form
2020-11-14 19:02:28 -05:00
Kevin Chung
17db97495e Rewrite the flag creation modal to be in vuejs (#1715)
* Rewrite flag creation modal to VueJS
* Rewrite flag edit modal to VueJS
* Rewrite flag list tab in the Admin Panel challenge page to VueJS
* Closes #1693
2020-11-14 16:17:43 -05:00
Kevin Chung
0ed1a0c659 Set MAIL_SERVER during testing to use the TESTING_MAIL_SERVER envvar (#1709)
* Override the `MAIL_SERVER` config with the `TESTING_MAIL_SERVER` envvar during tests
2020-11-08 22:28:28 -05:00
n01e0
23cef1c755 fix link name (#1698)
Co-authored-by: Kevin Chung <kchung@ctfd.io>
2020-11-08 21:35:16 -05:00
Nir
d0813e7296 Fix docker compose (#1708)
Seems reasonable. Thanks for the PR!
2020-11-08 20:54:57 -05:00
Nicolai Søborg
4c31dc23e8 Fix TemplateAssertionError in forms (#1675)
* Pin Jinja2==2.11.2 to fix a Jinja Assertion error
2020-10-03 15:42:22 -04:00
SpeedX
f331ee79d5 Bump gevent version (#1677)
* Closes #1667
* Updates gevent to 20.9.0
2020-10-01 03:40:52 -04:00
Kevin Chung
ed64b4871d Mark 3.1.1 (#1663)
# 3.1.1 / 2020-09-22

**General**

- Fix notification deliverability when there are multiple tabs open
- Only play notification sounds in the master tab that receives the notification

**Admin Panel**

- Fix issue preventing admins from emailing users through the Admin Panel
- Improve Notification UI
  - Clears notification form after notification submission
  - Add notification to notification list after creation

**Themes**

- Add fix for trying to increment solves when solves are hidden
- Update JS dependencies to fix a transpiliation error preventing optional custom fields from being left empty
  - `@babel/core`, `@babel/preset-env`, `@fortawesome/fontawesome-free`, and `babel-loader` were updated but only `@babel/core` needs to be updated to resolve the transpiliation issue
- Remove `console.log` statements from minified production JS
- Compress notification sound and document the compression command

**Miscellaneous**

- Add the ability to override the sender header of email sent via SMTP with the `MAILSENDER_ADDR` config value
3.1.1
2020-09-22 00:59:49 -04:00
Kevin Chung
1d6138e692 bump @babel/polyfill version to 7.11.5 (#1664)
* Bump @babel/polyfill version to 7.11.5
2020-09-21 19:07:31 -04:00
Kevin Chung
4cd4d0cb92 Add the ability to override the sender header of email via SMTP (#1657)
* Add the ability to override the sender header of email via SMTP with the `MAILSENDER_ADDR` config value
* Closes #1644
2020-09-20 23:54:19 -04:00
Kevin Chung
1be3659996 Fix regression in notification deliverability (#1659)
* Fix regression in notification deliverability. Closes #1641
    * Only master tabs were showing notifications
* Only play the notification sound in the master tab
* Clears notification form after notification submission
* Add notification to admin notification list after creation. Closes #1651 
* Remove `console.log` statements from minified production JS
2020-09-20 03:05:49 -04:00
Kevin Chung
722d45c73b Compress notification sound more (#1625)
* Compress `notification.webm` to save some file size
2020-09-20 02:45:10 -04:00
Kevin Chung
72f9fa75c6 Update @babel/core, @babel/preset-env, @fortawesome/fontawesome-free, and babel-loader to fix a transpiliation error (#1654)
* Update @babel/core, @babel/preset-env, @fortawesome/fontawesome-free, and babel-loader to fix a transpiliation error
* Closes #1653
2020-09-18 01:03:08 -04:00
Kevin Chung
dfe4f004f2 Add fix for trying to increment solves when solves are hidden (#1646)
* Don't attempt to increment solves if solves are hidden.
2020-09-13 02:27:56 -04:00
kreegahbundolo
ba26722407 Fix for email send issue (#1640)
* Fix issue with sending wrong API parameter for email sending in Admin Panel
2020-09-10 00:58:59 -04:00
Kevin Chung
cfde6c99af Fix regression in challenge creation (#1638)
* Closes #1637
3.1.0
2020-09-08 17:34:27 -04:00
Kevin Chung
efab97905b Add info about custom fields to the themes CHANGELOG (#1636)
* Add info about custom fields to the themes CHANGELOG
2020-09-08 16:56:41 -04:00