* Allows for configuration to be specified via `config.ini` instead of direct Python manipulation
* Adds type hints to `config.py` to make it clearer what each variable expects
* Adds support for looking up countries by IP address.
* Shows country and flag for a user/team's IP addresses in the admin panel
* Adds support for `GEOIP_DATABASE_PATH` in config.py
* Closes#1115
* Paginate only the `/api/v1/users`, `/api/v1/teams`, and `/api/v1/submissions` endpoints.
* Add a `PaginatedAPIListSuccessResponse` class with a customized `apidoc` method to hack in the pagination scheme
* Works on #1318
* Convert Challenge plugin static methods into class methods
* Copy the create, read, update, attempt, solve, fail methods into the BaseChallenge class so that they can be re-used between challenge plugins
* Adds Enums for visibility configs for better reusability. Old tests will continue to use the static values but new ones should use the enum values.
* Closes#929
* Switches from Plotly to echarts. Saves file space and allows for more flexibility in graphing types.
* Changes colorHash slightly to change color output for demo data.
* Closes#1433
* Closes#1332
* Pages by default now strip script tags and other potential XSS vectors
* lxml and html5lib are now pinned dependencies
* Challenge plugins rewritten to allow for better re-useability of template content and allow more control from the theme side
* Adds `window.init.theme_settings` which is a JSON blob that's passed by CTFd and configurable from the Admin Panel
* Adds `config.html` which should be a form which can be loaded into the Admin Panel and able to emit a JSON blob which can be used as `window.init.theme_settings`.
* Closes#1329
* The top scoreboard endpoint `/api/v1/scoreboard/top/<count>` is now more performant (3x) due to better response generation
In local testing I went from 3.5s to 1.2s.
* Improve response times of `/api/v1/scoreboard` significantly by avoiding hitting the database to get every team member's score
* Fix issue where a hidden/banned user's score could be revealed as a member of a team
From tests I was able to cut this down from 11s to 0.5s. This endpoint also will still be heavily cached which should improve performance for a lot of users.
* Replace user facing pagination with Flask SQLAlchemy Pagination objects
* Closes#1353
I think this is a big improvement but I feel like this is harder to create a theme construct around.