AI Slop Code RIsk Monitor

CTFd/CTFd

CTFs as you need them

13.9 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for CTFd/CTFd, a Python project with 6,873 GitHub stars. SynthScan examined 94,478 lines of code across 746 source files, recording 949 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 13.9 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

13.9
Adjusted Signal
13.9
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
6.9K
Stars
Python
Language
94.5K
Lines of Code
746
Files
949
Pattern Hits
2026-10-12
Scan Date
0.06
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 39.2/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 849 finding(s).

Hallucinated Dependency & Supply Chain Risk 11.0/100 · LOW

Are imports declared and package/API names verified? 57 finding(s).

Agent Over-Engineering Ratio 32.2/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 672 finding(s).

PR Review Velocity Impact 51.2/100 · HIGH

Which changes need focused human review? 949 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 18HIGH 28MEDIUM 52LOW 851

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 949 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers622 hits · 572 pts
SeverityFileLineSnippetContext
LOWtests/test_views.py153def test_pages_routing_and_rendering():CODE
LOWtests/test_views.py181def test_user_can_access_files():CODE
LOWtests/test_views.py276def test_admin_access_files_with_auth_token():CODE
LOWtests/test_views.py351def test_user_can_access_files_with_auth_token():CODE
LOWtests/test_views.py486def test_user_can_access_files_if_view_after_ctf():CODE
LOW⚡tests/test_themes.py18def test_themes_run_in_sandbox():CODE
LOW⚡tests/test_themes.py33def test_themes_cant_access_configpy_attributes():CODE
LOWtests/test_themes.py81def test_that_ctfd_can_be_deployed_in_subdir():CODE
LOWtests/test_themes.py125def test_that_ctfd_subdir_redirects_work():CODE
LOWtests/test_themes.py159def test_that_request_path_hijacking_works_properly():CODE
LOWtests/test_themes.py186def test_theme_fallback_config():CODE
LOWtests/test_themes.py230def test_theme_template_loading_by_prefix():CODE
LOWtests/test_themes.py239def test_theme_template_disallow_loading_admin_templates():CODE
LOWtests/test_config.py19def test_reverse_proxy_config():CODE
LOWtests/test_config.py59def test_server_sent_events_config():CODE
LOWtests/test_config.py74def test_trusted_hosts_config():CODE
LOWtests/test_config.py174def test_preset_admin_token_config():CODE
LOWtests/test_config.py248def test_preset_admin_no_promotion_existing_user():CODE
LOWtests/test_config.py334def test_preset_admin_empty_credentials():CODE
LOWtests/test_plugin_utils.py29def test_register_plugin_asset():CODE
LOWtests/test_plugin_utils.py42def test_register_plugin_assets_directory():CODE
LOWtests/test_plugin_utils.py71def test_admin_override_template():CODE
LOWtests/test_plugin_utils.py85def test_register_plugin_script():CODE
LOWtests/test_plugin_utils.py99def test_register_plugin_stylesheet():CODE
LOWtests/test_plugin_utils.py113def test_register_admin_plugin_script():CODE
LOWtests/test_plugin_utils.py127def test_register_admin_plugin_stylesheet():CODE
LOWtests/test_plugin_utils.py143def test_register_admin_plugin_menu_bar():CODE
LOWtests/test_plugin_utils.py166def test_register_user_page_menu_bar():CODE
LOWtests/test_plugin_utils.py190def test_bypass_csrf_protection():CODE
LOWtests/test_plugin_utils.py202 def bypass_csrf_protection_test_route():CODE
LOWtests/test_plugin_utils.py218def test_challenges_model_access_plugin_class():CODE
LOWtests/helpers.py640def gen_module_audience_access(db, module_id, audience_id):CODE
LOWtests/oauth/test_redirect.py15def test_oauth_not_configured():CODE
LOWtests/oauth/test_redirect.py28def test_oauth_configured_flow():CODE
LOWtests/oauth/test_users.py8def test_num_users_oauth_limit():CODE
LOWtests/cache/test_challenges.py14def test_adding_challenge_clears_cache():CODE
LOWtests/cache/test_challenges.py48def test_deleting_challenge_clears_cache_solves():CODE
LOWtests/cache/test_challenges.py89def test_deleting_solve_clears_cache():CODE
LOWtests/cache/test_cache.py43def test_clear_all_user_sessions():CODE
LOWtests/cache/test_cache.py72def test_cache_subclass_commands():CODE
LOWtests/cache/test_cache.py88def test_redis_cache_subclass_commands():CODE
LOWtests/challenges/test_challenge_types.py8def test_missing_challenge_type():CODE
LOWtests/challenges/test_challenge_logic.py15def test_all_flags_challenge_logic():CODE
LOWtests/challenges/test_challenge_logic.py66def test_all_flags_challenge_logic_teams_mode():CODE
LOWtests/challenges/test_challenge_logic.py145def test_group_flags_challenge_logic_teams_mode():CODE
LOWtests/challenges/test_challenge_logic.py227def test_challenge_default_logic_is_any():CODE
LOWtests/challenges/test_standard_dynamic.py18def test_can_create_standard_dynamic_challenge():CODE
LOWtests/challenges/test_standard_dynamic.py53def test_can_update_standard_dynamic_challenge():CODE
LOWtests/challenges/test_standard_dynamic.py101def test_can_add_requirement_standard_dynamic_challenge():CODE
LOWtests/challenges/test_standard_dynamic.py159def test_can_delete_standard_dynamic_challenge():CODE
LOWtests/challenges/test_standard_dynamic.py193def test_standard_dynamic_challenge_loses_value_properly():CODE
LOWtests/challenges/test_standard_dynamic.py246def test_standard_dynamic_challenge_doesnt_lose_value_on_update():CODE
LOWtests/challenges/test_standard_dynamic.py279def test_standard_dynamic_challenge_value_isnt_affected_by_hidden_users():CODE
LOWtests/challenges/test_standard_dynamic.py339def test_standard_dynamic_challenges_reset():CODE
LOWtests/challenges/test_standard_dynamic.py369def test_standard_dynamic_challenge_linear_loses_value_properly():CODE
LOWtests/challenges/test_standard_dynamic.py421def test_standard_challenges_default_to_static_function():CODE
LOWtests/challenges/test_standard_dynamic.py495def test_standard_dynamic_challenge_update_overrides_manual_value():CODE
LOWtests/challenges/test_standard_dynamic.py593def test_standard_dynamic_challenge_creation_requires_all_parameters():CODE
LOWtests/challenges/test_standard_dynamic.py732def test_dynamic_challenge_update_requires_all_parameters():CODE
LOWtests/challenges/test_ratings.py19def test_ratings_public_config():CODE
562 more matches not shown…
Hallucination Indicators18 hits · 180 pts
SeverityFileLineSnippetContext
CRITICALCTFd/auth.py20from CTFd.utils.helpers import error_for, get_errors, markupCODE
CRITICALCTFd/scoreboard.py9from CTFd.utils.helpers import get_infosCODE
CRITICALCTFd/users.py10from CTFd.utils.helpers import get_errors, get_infosCODE
CRITICALCTFd/teams.py14from CTFd.utils.helpers import get_errors, get_infosCODE
CRITICALCTFd/challenges.py13from CTFd.utils.helpers import get_errors, get_infosCODE
CRITICALCTFd/views.py47from CTFd.utils.helpers import get_errors, get_infos, markupCODE
CRITICALCTFd/constants/plugins.py4from CTFd.utils.helpers import markupCODE
CRITICALCTFd/constants/config.py34 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/constants/config.py40 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/constants/assets.py8from CTFd.utils.helpers import markupCODE
CRITICALCTFd/utils/decorators/__init__.py196 from CTFd.utils.helpers import info_forCODE
CRITICALCTFd/models/__init__.py70 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/models/__init__.py166 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/models/__init__.py173 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/models/__init__.py225 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/models/__init__.py327 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/models/__init__.py1085 from CTFd.utils.helpers import markupCODE
CRITICALCTFd/themes/admin/static/assets/htmlmixed-DvXcbxOJ.js19`);var m=document.activeElement;Kt(h),setTimeout(function(){r.display.lineSpace.removeChild(d),m.focus(),m==i&&n.showPriCODE
Self-Referential Comments51 hits · 168 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_config.py258 # Create a regular user with the same credentials as preset adminCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py22 # Create a challengeCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py73 # Create a challenge with "all" logicCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py89 # Create a team with members using gen_team helperCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py152 # Create a challenge with "group" logicCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py168 # Create a team with members using gen_team helperCOMMENT
MEDIUMtests/challenges/test_challenge_logic.py234 # Create a challenge without specifying logic (should default to "any")COMMENT
MEDIUMtests/challenges/test_standard_dynamic.py474 # Create a user and solve the challengeCOMMENT
MEDIUMtests/challenges/test_ratings.py236 # Create a user and challengeCOMMENT
MEDIUMtests/challenges/test_ratings.py275 # Create a user and challengeCOMMENT
MEDIUMtests/challenges/test_ratings.py355 # Create a user and challengeCOMMENT
MEDIUM⚡tests/users/test_auth.py388 # Create a userCOMMENT
MEDIUM⚡tests/users/test_auth.py792 # Create a user before configuring mail to not send any extra emailsCOMMENT
MEDIUMtests/users/test_auth.py614 # Create a user with change_password=TrueCOMMENT
MEDIUMtests/users/test_auth.py720 # Create a user via API with change_password=TrueCOMMENT
MEDIUMtests/users/test_fields.py227 # Create the fields that we wantCOMMENT
MEDIUMtests/teams/test_fields.py264 # Create a user and team who haven't filled any of their fieldsCOMMENT
MEDIUMtests/teams/test_teams.py163 # Create a team with only one memberCOMMENT
MEDIUMtests/teams/test_teams.py198 # Create a teamCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py481 # Create a challengeCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py615 # Create a challenge and solutionCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py625 # Create a regular userCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py689 # Create a hidden challenge and solutionCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py699 # Create a regular userCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py753 # Create a challenge and solution with state="hidden"COMMENT
MEDIUM⚡tests/api/v1/test_solutions.py763 # Create a regular userCOMMENT
MEDIUM⚡tests/api/v1/test_solutions.py925 # Create a userCOMMENT
MEDIUMtests/api/v1/test_solutions.py533 # Create a challenge and solutionCOMMENT
MEDIUMtests/api/v1/test_solutions.py544 # Create a regular userCOMMENT
MEDIUMtests/api/v1/test_challenges.py380 # Create a user and generate a solve from before the freeze timeCOMMENT
MEDIUMtests/api/v1/test_challenges.py391 # Create a user and generate a solve from after the freeze timeCOMMENT
MEDIUMtests/api/v1/test_challenges.py434 # Create a banned user and generate a solve for the challengeCOMMENT
MEDIUMtests/api/v1/test_challenges.py817 # Create a user and generate a solve from before the freeze timeCOMMENT
MEDIUMtests/api/v1/test_challenges.py828 # Create a user and generate a solve from after the freeze timeCOMMENT
MEDIUMtests/api/v1/test_challenges.py866 # Create a user and generate a solve for the challengeCOMMENT
MEDIUMtests/api/v1/test_challenges.py1480 # Create a challenge and a userCOMMENT
MEDIUMtests/api/v1/test_hints.py103 # Create a challenge and two hints, where hint2 requires hint1 as a prerequisiteCOMMENT
MEDIUMtests/api/v1/test_files.py112 # Create a fake fileCOMMENT
MEDIUMtests/api/v1/test_teams.py873 # Create a user with a teamCOMMENT
MEDIUMtests/api/v1/test_scoreboard.py169 # Create a challengeCOMMENT
MEDIUM…ts/api/v1/challenges/requirements/test_requirements.py78 # Create a new user which will solve the prerequisiteCOMMENT
MEDIUM…ts/api/v1/challenges/requirements/test_requirements.py106 # Create a new user which will solve the prerequisite and hide themCOMMENT
MEDIUM…ts/api/v1/challenges/requirements/test_requirements.py135 # Create a new user which will solve the prerequisite and ban themCOMMENT
MEDIUM…ts/api/v1/challenges/requirements/test_requirements.py241 # Create a new user which will solve the prerequisiteCOMMENT
MEDIUMtests/api/v1/users/test_users.py62 # Create a user with a null password. Use raw SQL to bypass SQLAlchemy validatesCOMMENT
MEDIUMtests/api/v1/teams/test_teams.py36 # Create a user with a null password. Use raw SQL to bypass SQLAlchemy validatesCOMMENT
MEDIUMtests/api/v1/teams/test_teams.py80 # Create a new teamCOMMENT
MEDIUMCTFd/views.py189 # Create an empty index pageCOMMENT
MEDIUMCTFd/utils/security/auth.py50 # Create the preset admin userCOMMENT
MEDIUMCTFd/models/__init__.py789 # Create the team specific secretCOMMENT
MEDIUMCTFd/api/v1/helpers/models.py1# This file is no longer used. If you're importing the function from here please update your importsCOMMENT
Empty Error Handlers28 hits · 140 pts
SeverityFileLineSnippetContext
HIGHpopulate.py285except Exception:CODE
HIGHpopulate.py488except Exception:CODE
HIGHtests/test_themes.py196except OSError:CODE
HIGHtests/test_themes.py26except SecurityError:CODE
HIGHtests/test_themes.py207except TemplateNotFound:CODE
HIGHtests/test_themes.py211except TemplateNotFound:CODE
HIGHtests/test_config.py92except SecurityError:CODE
HIGHtests/test_plugin_utils.py249except zipfile.BadZipfile:CODE
HIGHtests/utils/test_validators.py201except ValidationError:CODE
HIGHtests/teams/test_invites.py23except TeamTokenExpiredException:CODE
HIGHtests/teams/test_invites.py37except TeamTokenInvalidException:CODE
HIGHtests/api/test_tokens.py36except UserTokenExpiredException:CODE
HIGHtests/api/test_tokens.py44except UserNotFoundException:CODE
HIGHCTFd/config.py86except OSError:CODE
HIGHCTFd/admin/__init__.py207except ValueError:CODE
HIGHCTFd/utils/encoding/__init__.py13except UnicodeDecodeError:CODE
HIGHCTFd/utils/encoding/__init__.py22except UnicodeDecodeError:CODE
HIGHCTFd/utils/encoding/__init__.py34except UnicodeDecodeError:CODE
HIGHCTFd/utils/encoding/__init__.py46except UnicodeDecodeError:CODE
HIGHCTFd/utils/updates/__init__.py61except requests.exceptions.RequestException:CODE
HIGHCTFd/utils/updates/__init__.py63except ValueError:CODE
HIGHCTFd/utils/initialization/__init__.py181except IOError:CODE
HIGHCTFd/utils/exports/serializers.py53except ValueError:CODE
HIGHCTFd/utils/exports/serializers.py70except ValueError:CODE
HIGHCTFd/utils/exports/__init__.py376except (json.JSONDecodeError, TypeError):CODE
HIGHCTFd/api/v1/schemas/__init__.py28except KeyError:CODE
HIGHCTFd/api/v1/schemas/__init__.py52except KeyError:CODE
HIGHCTFd/api/v1/schemas/__init__.py97except KeyError:CODE
Deep Nesting76 hits · 74 pts
SeverityFileLineSnippetContext
LOWtests/test_views.py181CODE
LOWtests/test_views.py276CODE
LOWtests/test_views.py351CODE
LOWtests/test_views.py486CODE
LOWtests/helpers.py210CODE
LOWtests/helpers.py250CODE
LOWtests/helpers.py552CODE
LOWtests/challenges/test_standard_dynamic.py193CODE
LOWtests/challenges/test_standard_dynamic.py279CODE
LOWtests/challenges/test_standard_dynamic.py369CODE
LOWtests/challenges/test_standard_dynamic.py495CODE
LOWtests/challenges/test_dynamic.py184CODE
LOWtests/challenges/test_dynamic.py266CODE
LOWtests/challenges/test_dynamic.py354CODE
LOWtests/utils/test_exports.py127CODE
LOWtests/utils/test_uploaders.py178CODE
LOWtests/utils/test_uploaders.py213CODE
LOWtests/utils/test_ctftime.py28CODE
LOWtests/utils/test_ctftime.py53CODE
LOWtests/utils/test_ctftime.py90CODE
LOWtests/utils/test_ctftime.py118CODE
LOWtests/users/test_challenges.py402CODE
LOWtests/users/test_challenges.py591CODE
LOWtests/users/test_auth.py786CODE
LOWtests/users/test_fields.py54CODE
LOWtests/teams/test_fields.py60CODE
LOWtests/api/v1/test_solutions.py609CODE
LOWCTFd/auth.py237CODE
LOWCTFd/auth.py442CODE
LOWCTFd/auth.py547CODE
LOWCTFd/config.py24CODE
LOWCTFd/teams.py191CODE
LOWCTFd/views.py394CODE
LOWCTFd/plugins/challenges/logic.py72CODE
LOWCTFd/admin/__init__.py81CODE
LOWCTFd/admin/__init__.py222CODE
LOWCTFd/utils/__init__.py45CODE
LOWCTFd/utils/config/visibility.py22CODE
LOWCTFd/utils/decorators/__init__.py61CODE
LOWCTFd/utils/decorators/__init__.py195CODE
LOWCTFd/utils/decorators/__init__.py69CODE
LOWCTFd/utils/decorators/__init__.py199CODE
LOWCTFd/utils/decorators/visibility.py16CODE
LOWCTFd/utils/decorators/visibility.py55CODE
LOWCTFd/utils/decorators/visibility.py89CODE
LOWCTFd/utils/decorators/visibility.py18CODE
LOWCTFd/utils/decorators/visibility.py57CODE
LOWCTFd/utils/decorators/visibility.py91CODE
LOWCTFd/utils/plugins/__init__.py53CODE
LOWCTFd/utils/user/__init__.py18CODE
LOWCTFd/utils/updates/__init__.py15CODE
LOWCTFd/utils/initialization/__init__.py205CODE
LOWCTFd/utils/initialization/__init__.py313CODE
LOWCTFd/utils/exports/serializers.py38CODE
LOWCTFd/utils/exports/__init__.py121CODE
LOWCTFd/utils/exports/__init__.py302CODE
LOWCTFd/utils/csv/__init__.py477CODE
LOWCTFd/utils/events/__init__.py81CODE
LOWCTFd/utils/events/__init__.py83CODE
LOWCTFd/utils/helpers/models.py4CODE
16 more matches not shown…
Unused Imports35 hits · 35 pts
SeverityFileLineSnippetContext
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/__init__.py232CODE
LOWCTFd/plugins/dynamic_challenges/decay.py1CODE
LOWCTFd/plugins/challenges/decay.py1CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/constants/config.py6CODE
LOWCTFd/admin/__init__.py21CODE
LOWCTFd/admin/__init__.py22CODE
LOWCTFd/admin/__init__.py23CODE
LOWCTFd/admin/__init__.py24CODE
LOWCTFd/admin/__init__.py25CODE
LOWCTFd/admin/__init__.py26CODE
LOWCTFd/admin/__init__.py27CODE
LOWCTFd/admin/__init__.py28CODE
LOWCTFd/admin/__init__.py29CODE
LOWCTFd/admin/__init__.py30CODE
LOWCTFd/utils/security/signing.py6CODE
LOWCTFd/utils/security/signing.py6CODE
LOWCTFd/utils/security/signing.py6CODE
LOWCTFd/api/v1/statistics/__init__.py8CODE
LOWCTFd/api/v1/statistics/__init__.py9CODE
LOWCTFd/api/v1/statistics/__init__.py10CODE
LOWCTFd/api/v1/statistics/__init__.py11CODE
LOWCTFd/api/v1/statistics/__init__.py12CODE
LOWCTFd/api/v1/statistics/__init__.py13CODE
Redundant / Tautological Comments22 hits · 34 pts
SeverityFileLineSnippetContext
LOWpopulate.py467 # Check if this user has already rated this challengeCOMMENT
LOWtests/test_views.py306 # Set CTF to start in the future (before CTF start scenario)COMMENT
LOW⚡tests/users/test_auth.py381 # Set CTFd to send emailsCOMMENT
LOW⚡tests/users/test_auth.py795 # Set CTFd to send emailsCOMMENT
LOWtests/users/test_auth.py328 # Set CTFd to only allow confirmed users and send emailsCOMMENT
LOWtests/api/v1/user/test_hints.py190 # Set challenges to be visible publiclyCOMMENT
LOWtests/api/v1/user/test_hints.py236 # Set challenges to be visible to only authedCOMMENT
LOWCTFd/auth.py454 # Check if credentials match preset adminCOMMENT
LOWCTFd/auth.py468 # Check if the user submitted an email address or a team nameCOMMENT
LOWCTFd/auth.py604 # Check if we are allowing registration before creating usersCOMMENT
LOWCTFd/views.py266 # Set theme to default and try againCOMMENT
LOWCTFd/plugins/migrations.py66 # Check if the plugin has migraitonsCOMMENT
LOWCTFd/plugins/challenges/logic.py84 # Check if the user's submission is correctCOMMENT
LOWCTFd/admin/users.py90 # Check if the user has an account (team or user)COMMENT
LOWCTFd/utils/security/auth.py41 # Check if user already existsCOMMENT
LOWCTFd/utils/user/__init__.py22 # Check if the session is still validCOMMENT
LOWCTFd/utils/exports/__init__.py182 # Check if the alembic version is from CTFd 1.xCOMMENT
LOWCTFd/api/v1/challenges.py199 # Iterate through the list of challenges, adding to the object whichCOMMENT
LOWCTFd/api/v1/challenges.py1258 # Check if challenge is visible to the userCOMMENT
LOWCTFd/api/v1/challenges.py1265 # Check if user/team has solved this challenge (only allow rating if solved)COMMENT
LOWCTFd/api/v1/challenges.py1351 # Check if challenge is visible to the userCOMMENT
LOWCTFd/api/v1/helpers/request.py39 # Check if the schema is for enums, if so, we just add in the "enum" keyCOMMENT
Over-Commented Block30 hits · 29 pts
SeverityFileLineSnippetContext
LOWrequirements.txt1# This file was autogenerated by uv via the following command:COMMENT
LOWrequirements.txt21boto3==1.35.27COMMENT
LOWrequirements.txt41cmarkgfm==2024.11.20COMMENT
LOWrequirements.txt61flask-caching==2.3.1COMMENT
LOWrequirements.txt81 # geventCOMMENT
LOWrequirements.txt101 # via flask-restxCOMMENT
LOWrequirements.txt121 # ctfdCOMMENT
LOWrequirements.txt141python-dotenv==0.13.0COMMENT
LOWrequirements.txt161s3transfer==0.10.4COMMENT
LOWrequirements.txt181 # via ctfdCOMMENT
LOWtests/utils/test_validators.py161COMMENT
LOWtests/utils/test_events.py221 # "team": None,COMMENT
LOWtests/utils/test_events.py241 # data=saved_event["data"], type="notification", channel="ctf"COMMENT
LOWtests/users/test_challenges.py81# with app.app_context():COMMENT
LOWtests/users/test_challenges.py101# with client.session_transaction() as sess:COMMENT
LOWCTFd/config.ini1# CTFd Configuration FileCOMMENT
LOWCTFd/config.ini21#COMMENT
LOWCTFd/config.ini61# REDIS_URLCOMMENT
LOWCTFd/config.ini101# Comma seperated string containing valid host names for CTFd to respond to. If not specified, COMMENT
LOWCTFd/config.ini161# MAILSENDER_ADDRCOMMENT
LOWCTFd/config.ini181# By default CTFd will automatically detect the correct email provider based on the other settingsCOMMENT
LOWCTFd/config.ini201# AWS secret token used to authenticate to the S3 bucket. Only used under the s3 uploader.COMMENT
LOWCTFd/config.ini221COMMENT
LOWCTFd/config.ini241# See https://werkzeug.palletsprojects.com/en/0.15.x/middleware/proxy_fix/#werkzeug.middleware.proxy_fix.ProxyFix.COMMENT
LOWCTFd/config.ini261# SWAGGER_UICOMMENT
LOWCTFd/config.ini281# Defaults to trueCOMMENT
LOWCTFd/config.ini301# EMAIL_CONFIRMATION_REQUIRE_INTERACTIONCOMMENT
LOWCTFd/config.ini321# PRESET_ADMIN_NAMECOMMENT
LOWCTFd/config.ini341# Configuration values that will be loaded into CTFd and take precedence over database settings.COMMENT
LOWCTFd/utils/validators/__init__.py21 # Remove any leading and trailing C0 control or space from input.COMMENT
Verbosity Indicators20 hits · 27 pts
SeverityFileLineSnippetContext
LOW⚡tests/api/v1/test_solutions.py930 # Step 1: Before solving, user queries the challenge detail endpointCOMMENT
LOW⚡tests/api/v1/test_solutions.py940 # Step 2: Check the challenge solution endpoint - should also return no solution_idCOMMENT
LOW⚡tests/api/v1/test_solutions.py948 # Step 3: User attempts to view the solution directly - should fail (404 for hidden solutions)COMMENT
LOW⚡tests/api/v1/test_solutions.py952 # Step 4: User solves the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py962 # Step 5: After solving, user queries the challenge detail endpoint againCOMMENT
LOW⚡tests/api/v1/test_solutions.py972 # Step 6: User queries the challenge solution endpoint - should now return solution_idCOMMENT
LOW⚡tests/api/v1/test_solutions.py980 # Step 7: User tries to view the solution - should see it but content is locked (not unlocked yet)COMMENT
LOW⚡tests/api/v1/test_solutions.py1004 # Step 9: Verify the unlock was recorded in the databaseCOMMENT
LOW⚡tests/api/v1/test_solutions.py1012 # Step 10: User views the solution again - now they should see the full contentCOMMENT
LOW⚡tests/api/v1/test_solutions.py1023 # Step 12: Create another user who has NOT solved the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py1028 # Step 13: Other user queries the challenge detail endpointCOMMENT
LOW⚡tests/api/v1/test_solutions.py1037 # Step 14: Other user queries the solution endpoint directlyCOMMENT
LOW⚡tests/api/v1/test_solutions.py1046 # Step 15: Other user tries to view the solution directlyCOMMENT
LOW⚡tests/api/v1/test_solutions.py1051 # Step 16: Other user attempts to unlock the solutionCOMMENT
LOW⚡tests/api/v1/test_solutions.py1059 # Step 17: Verify no unlock was recorded for the other userCOMMENT
LOW⚡tests/api/v1/test_solutions.py1065 # Step 18: Other user tries to view the solution againCOMMENT
LOW⚡tests/api/v1/test_solutions.py1083 # Step 19: Other user now solves the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py1093 # Step 20: After solving, other user should now see the solution_idCOMMENT
LOWtests/api/v1/test_solutions.py992 # Step 8: User unlocks the solution via the unlock APICOMMENT
LOWtests/api/v1/test_solutions.py1112 # Step 21: Other user can now view the solution with full contentCOMMENT
Structural Annotation Overuse20 hits · 27 pts
SeverityFileLineSnippetContext
LOW⚡tests/api/v1/test_solutions.py930 # Step 1: Before solving, user queries the challenge detail endpointCOMMENT
LOW⚡tests/api/v1/test_solutions.py940 # Step 2: Check the challenge solution endpoint - should also return no solution_idCOMMENT
LOW⚡tests/api/v1/test_solutions.py948 # Step 3: User attempts to view the solution directly - should fail (404 for hidden solutions)COMMENT
LOW⚡tests/api/v1/test_solutions.py952 # Step 4: User solves the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py962 # Step 5: After solving, user queries the challenge detail endpoint againCOMMENT
LOW⚡tests/api/v1/test_solutions.py972 # Step 6: User queries the challenge solution endpoint - should now return solution_idCOMMENT
LOW⚡tests/api/v1/test_solutions.py980 # Step 7: User tries to view the solution - should see it but content is locked (not unlocked yet)COMMENT
LOW⚡tests/api/v1/test_solutions.py1004 # Step 9: Verify the unlock was recorded in the databaseCOMMENT
LOW⚡tests/api/v1/test_solutions.py1012 # Step 10: User views the solution again - now they should see the full contentCOMMENT
LOW⚡tests/api/v1/test_solutions.py1023 # Step 12: Create another user who has NOT solved the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py1028 # Step 13: Other user queries the challenge detail endpointCOMMENT
LOW⚡tests/api/v1/test_solutions.py1037 # Step 14: Other user queries the solution endpoint directlyCOMMENT
LOW⚡tests/api/v1/test_solutions.py1046 # Step 15: Other user tries to view the solution directlyCOMMENT
LOW⚡tests/api/v1/test_solutions.py1051 # Step 16: Other user attempts to unlock the solutionCOMMENT
LOW⚡tests/api/v1/test_solutions.py1059 # Step 17: Verify no unlock was recorded for the other userCOMMENT
LOW⚡tests/api/v1/test_solutions.py1065 # Step 18: Other user tries to view the solution againCOMMENT
LOW⚡tests/api/v1/test_solutions.py1083 # Step 19: Other user now solves the challengeCOMMENT
LOW⚡tests/api/v1/test_solutions.py1093 # Step 20: After solving, other user should now see the solution_idCOMMENT
LOWtests/api/v1/test_solutions.py992 # Step 8: User unlocks the solution via the unlock APICOMMENT
LOWtests/api/v1/test_solutions.py1112 # Step 21: Other user can now view the solution with full contentCOMMENT
Excessive Try-Catch Wrapping15 hits · 16 pts
SeverityFileLineSnippetContext
LOWpopulate.py285 except Exception:CODE
LOWpopulate.py488 except Exception:CODE
LOWping.py30 except Exception as e:CODE
LOW⚡tests/test_themes.py28 except Exception as e:CODE
LOWtests/api/test_tokens.py38 except Exception as e:CODE
LOWtests/api/test_tokens.py46 except Exception as e:CODE
LOWCTFd/views.py282 except Exception:CODE
LOWCTFd/utils/initialization/__init__.py362 except Exception:CODE
LOWCTFd/utils/exports/__init__.py176 except Exception:CODE
LOWCTFd/utils/exports/__init__.py264 except Exception:CODE
LOWCTFd/utils/exports/__init__.py487 except Exception:CODE
LOWCTFd/utils/sessions/__init__.py87 except Exception:CODE
LOWCTFd/utils/email/providers/smtp.py74 except Exception as e:CODE
LOWCTFd/cli/__init__.py84 except Exception as e:CODE
MEDIUMCTFd/cli/__init__.py81def import_ctf(path, delete_import_on_finish=False):CODE
AI Structural Patterns7 hits · 7 pts
SeverityFileLineSnippetContext
LOWtests/helpers.py129CODE
LOWCTFd/plugins/challenges/__init__.py141CODE
LOWCTFd/utils/__init__.py28CODE
LOWCTFd/utils/challenges/__init__.py131CODE
LOWCTFd/utils/user/__init__.py98CODE
LOWCTFd/utils/user/__init__.py132CODE
LOWCTFd/utils/exports/serializers.py36CODE
Fake / Example Data4 hits · 6 pts
SeverityFileLineSnippetContext
LOW⚡CTFd/utils/security/sanitize.py40 "input": ["name", "type", "value", "placeholder"],CODE
LOW⚡CTFd/utils/security/sanitize.py41 "select": ["name", "value", "placeholder"],CODE
LOW⚡CTFd/utils/security/sanitize.py43 "textarea": ["name", "value", "placeholder"],CODE
LOW…hemes/admin/static/assets/pages/statistics-8IMWcF-M.js1import{_ as A,C as h,c,a as t,t as u,h as m,l as v,F as g,r as f,w as p,j as y,v as I,d as C,o as d,i as S,N as U,$ as kCODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWCTFd/api/v1/helpers/request.py39 # Check if the schema is for enums, if so, we just add in the "enum" keyCOMMENT