Mail hosting made simple
This report summarizes scanner evidence for modoboa/modoboa, a Python project with 3,543 GitHub stars. SynthScan examined 112,461 lines of code across 843 source files, recording 984 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 11.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.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 831 finding(s).
Are imports declared and package/API names verified? 90 finding(s).
Are wrappers, guards, and repeated structures necessary? 829 finding(s).
Which changes need focused human review? 984 finding(s).
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.
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.
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.
The scanner identified 984 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/ldapsync/lib.py | 192 | def import_accounts_from_ldap(config): | CODE |
| LOW | modoboa/ldapsync/lib.py | 257 | def _check_dovecot_conf_value(name, value): | CODE |
| LOW | modoboa/ldapsync/lib.py | 265 | def update_dovecot_config_file(config): | CODE |
| LOW | modoboa/ldapsync/tests.py | 37 | def test_username_with_dn_metacharacters_is_escaped(self): | CODE |
| LOW | modoboa/ldapsync/tests.py | 97 | def test_invalid_conf_file_path(self): | CODE |
| LOW | modoboa/rspamd/tests.py | 85 | def test_job_domain_without_key(self): | CODE |
| LOW | modoboa/rspamd/api/v2/serializers.py | 45 | def validate_selector_map_path(self, value): | CODE |
| LOW | modoboa/calendars/rights.py | 30 | def get_effective_access_rules(): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1505 | def test_events_do_not_expose_share_url(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1514 | def test_get_events_of_calendar_no_longer_shared(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1520 | def test_get_events_of_calendar_of_inactive_owner(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1527 | def test_write_events_of_read_only_shared_calendar(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1760 | def test_shared_calendar_of_inactive_owner(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1766 | def test_shared_calendar_of_disabled_domain(self): | CODE |
| LOW⚡ | modoboa/calendars/tests.py | 1771 | def test_calendars_of_other_users_are_not_returned(self): | CODE |
| LOW | modoboa/calendars/tests.py | 89 | def test_rights_file_generation(self): | CODE |
| LOW | modoboa/calendars/tests.py | 129 | def test_rights_file_rule_deletion(self): | CODE |
| LOW | modoboa/calendars/tests.py | 149 | def test_rights_file_calendar_creation(self): | CODE |
| LOW | modoboa/calendars/tests.py | 163 | def test_rights_file_shares_match_api(self): | CODE |
| LOW | modoboa/calendars/tests.py | 204 | def test_rights_file_ignores_inactive_grantee(self): | CODE |
| LOW | modoboa/calendars/tests.py | 225 | def test_rights_file_sections_are_unique(self): | CODE |
| LOW | modoboa/calendars/tests.py | 262 | def test_rights_file_not_rewritten_when_unchanged(self): | CODE |
| LOW | modoboa/calendars/tests.py | 274 | def test_rights_file_generation_with_admin(self): | CODE |
| LOW | modoboa/calendars/tests.py | 350 | def test_shared_with_me_write_access(self): | CODE |
| LOW | modoboa/calendars/tests.py | 359 | def test_shared_with_me_ignores_rules_without_read_access(self): | CODE |
| LOW | modoboa/calendars/tests.py | 372 | def test_shared_with_me_ignores_inactive_owner(self): | CODE |
| LOW | modoboa/calendars/tests.py | 382 | def test_calendar_shared_with_me_display_settings(self): | CODE |
| LOW | modoboa/calendars/tests.py | 408 | def test_calendar_shared_with_me_invalid_color(self): | CODE |
| LOW | modoboa/calendars/tests.py | 420 | def test_calendar_shared_with_me_write_access_is_read_only(self): | CODE |
| LOW | modoboa/calendars/tests.py | 432 | def test_calendar_not_shared_with_me_display_settings(self): | CODE |
| LOW | modoboa/calendars/tests.py | 459 | def test_create_calendar_rejects_rights_injection(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 481 | def test_create_calendar_rejects_radicale_forbidden_characters(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 491 | def test_create_calendar_with_existing_name(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 511 | def test_rename_calendar_with_existing_name(self, cal_mock, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 528 | def test_create_calendar_invalid_color(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 539 | def test_new_calendar_does_not_reuse_path_of_renamed_one(self): | CODE |
| LOW | modoboa/calendars/tests.py | 552 | def test_calendar_name_validator(self): | CODE |
| LOW | modoboa/calendars/tests.py | 651 | def test_create_calendar_with_existing_name(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 670 | def test_create_calendar_rejects_unowned_domain(self, client_mock): | CODE |
| LOW | modoboa/calendars/tests.py | 763 | def test_get_accessrules_scoped_to_calendar(self): | CODE |
| LOW | modoboa/calendars/tests.py | 778 | def test_get_accessrules_calendar_not_owned(self): | CODE |
| LOW | modoboa/calendars/tests.py | 798 | def test_create_accessrule_simple_user(self): | CODE |
| LOW | modoboa/calendars/tests.py | 811 | def test_create_accessrule_read_write(self): | CODE |
| LOW | modoboa/calendars/tests.py | 824 | def test_create_accessrule_without_access(self): | CODE |
| LOW | modoboa/calendars/tests.py | 838 | def test_create_accessrule_write_only(self): | CODE |
| LOW | modoboa/calendars/tests.py | 852 | def test_create_accessrule_own_mailbox(self): | CODE |
| LOW | modoboa/calendars/tests.py | 861 | def test_create_accessrule_inactive_account(self): | CODE |
| LOW | modoboa/calendars/tests.py | 872 | def test_create_accessrule_admin_other_domain(self): | CODE |
| LOW | modoboa/calendars/tests.py | 885 | def test_create_accessrule_duplicate(self): | CODE |
| LOW | modoboa/calendars/tests.py | 894 | def test_create_accessrule_denied_mailbox(self): | CODE |
| LOW | modoboa/calendars/tests.py | 905 | def test_create_accessrule_mailbox_not_found(self): | CODE |
| LOW | modoboa/calendars/tests.py | 919 | def test_create_accessrule_denied_calendar(self): | CODE |
| LOW | modoboa/calendars/tests.py | 933 | def test_create_accessrule_calendar_in_body_ignored(self): | CODE |
| LOW | modoboa/calendars/tests.py | 949 | def test_update_accessrule_denied_calendar(self): | CODE |
| LOW | modoboa/calendars/tests.py | 969 | def test_rights_generation_excludes_forged_rule(self): | CODE |
| LOW | modoboa/calendars/tests.py | 1016 | def test_update_accessrule_remove_read(self): | CODE |
| LOW | modoboa/calendars/tests.py | 1033 | def test_partial_update_accessrule(self): | CODE |
| LOW | modoboa/calendars/tests.py | 1046 | def test_update_existing_write_only_rule(self): | CODE |
| LOW | modoboa/calendars/tests.py | 1070 | def test_update_accessrule_permission(self): | CODE |
| LOW | modoboa/calendars/tests.py | 1086 | def test_update_accessrule_display_settings_ignored(self): | CODE |
| 703 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | modoboa/ldapsync/tests.py | 132 | except ldap.NO_SUCH_OBJECT: | CODE |
| HIGH | modoboa/rspamd/jobs.py | 54 | except FileNotFoundError: | CODE |
| HIGH | modoboa/policyd/core.py | 247 | except asyncio.IncompleteReadError: | CODE |
| HIGH | modoboa/policyd/tests.py | 98 | except FileNotFoundError: | CODE |
| HIGH | modoboa/imap_migration/auth_backends.py | 116 | except core_models.User.DoesNotExist: | CODE |
| HIGH | modoboa/transport/backends.py | 25 | except forms.ValidationError: | CODE |
| HIGH | modoboa/core/models.py | 258 | except ObjectAccess.DoesNotExist: | CODE |
| HIGH | modoboa/core/models.py | 391 | except User.DoesNotExist: | CODE |
| HIGH | modoboa/core/extensions.py | 219 | except ImportError: | CODE |
| HIGH | modoboa/core/tests/test_ldap.py | 45 | except exceptions.InternalError: | CODE |
| HIGH | …oboa/core/management/commands/generate_postfix_maps.py | 161 | except OSError: | CODE |
| HIGH | modoboa/amavis/lib.py | 332 | except Users.DoesNotExist: | CODE |
| HIGH | modoboa/amavis/utils.py | 68 | except (TypeError, UnicodeDecodeError): | CODE |
| HIGH | modoboa/contacts/lib/carddav.py | 140 | except ImportError: | CODE |
| HIGH | …doboa/admin/management/commands/subcommands/_repair.py | 183 | except ImportError: | CODE |
| HIGH | modoboa/admin/api/v2/serializers.py | 169 | except core_models.User.DoesNotExist: | CODE |
| HIGH | modoboa/webmail/models.py | 153 | except FileNotFoundError: | CODE |
| HIGH | modoboa/webmail/models.py | 98 | except dovecot.DoveadmError: | CODE |
| HIGH | modoboa/webmail/viewsets.py | 728 | except (ImapError, WebmailInternalError): | CODE |
| HIGH | modoboa/webmail/viewsets.py | 740 | except ImapError: | CODE |
| HIGH | modoboa/webmail/viewsets.py | 630 | except forms.ValidationError: | CODE |
| HIGH | …bmail/management/commands/purge_webmail_legacy_data.py | 60 | except OSError: | CODE |
| HIGH | modoboa/webmail/lib/fetch_parser.py | 276 | except UnicodeDecodeError: | CODE |
| HIGH | modoboa/webmail/lib/attachments.py | 225 | except OSError: | CODE |
| HIGH | modoboa/webmail/lib/imapheader.py | 58 | except UnicodeDecodeError: | CODE |
| HIGH | modoboa/webmail/lib/sendmail.py | 145 | except WebmailInternalError: | CODE |
| HIGH | modoboa/webmail/lib/imaputils.py | 1543 | except (ImapError, OSError): | CODE |
| HIGH | modoboa/webmail/lib/imaputils.py | 575 | except (ImapError, OSError): | CODE |
| HIGH | modoboa/webmail/lib/imaputils.py | 580 | except (IMAP4Error, OSError): | CODE |
| HIGH | modoboa/webmail/lib/imapemail.py | 82 | except Exception: | CODE |
| HIGH | modoboa/webmail/lib/imapemail.py | 158 | except AttributeError: | CODE |
| HIGH | modoboa/webmail/lib/imapemail.py | 484 | except AttributeError: | CODE |
| HIGH | modoboa/dnstools/models.py | 74 | except AttributeError: | CODE |
| HIGH | modoboa/lib/authbackends.py | 146 | except ImportError: | CODE |
| HIGH | modoboa/lib/authbackends.py | 56 | except User.DoesNotExist: | CODE |
| HIGH | modoboa/lib/authbackends.py | 118 | except User.DoesNotExist: | CODE |
| HIGH | modoboa/lib/permissions.py | 263 | except ObjectAccess.DoesNotExist: | CODE |
| HIGH | modoboa/maillog/management/commands/logparser.py | 629 | except OSError: | CODE |
| HIGH | test_project/test_project/settings.py | 131 | except ImportError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | modoboa/calendars/models.py | 8 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/calendars/tests.py | 16 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/core/password_validation.py | 3 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/core/api/v1/serializers.py | 6 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/admin/lib.py | 14 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/admin/models/alias.py | 7 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/admin/models/domain.py | 7 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/admin/api/v1/serializers.py | 6 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/admin/api/v2/serializers.py | 7 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/webmail/lib/utils.py | 20 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/lib/validators.py | 5 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL⚡ | modoboa/lib/tests/test_validators.py | 3 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/relaydomains/lib.py | 3 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | modoboa/relaydomains/api/v1/serializers.py | 5 | from django.core.exceptions import ValidationError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/ldapsync/apps.py | 8 | CODE | |
| LOW | modoboa/rspamd/apps.py | 29 | CODE | |
| LOW | modoboa/calendars/apps.py | 13 | CODE | |
| LOW | modoboa/policyd/apps.py | 13 | CODE | |
| LOW | modoboa/imap_migration/apps.py | 34 | CODE | |
| LOW | modoboa/transport/apps.py | 8 | CODE | |
| LOW | modoboa/core/apps.py | 37 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 3 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 11 | CODE | |
| LOW | modoboa/core/password_hashers/__init__.py | 11 | CODE | |
| LOW | modoboa/core/password_hashers/base.py | 10 | CODE | |
| LOW | modoboa/core/password_hashers/base.py | 11 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/core/views/__init__.py | 3 | CODE | |
| LOW | modoboa/amavis/apps.py | 14 | CODE | |
| LOW | modoboa/amavis/apps.py | 15 | CODE | |
| LOW | modoboa/amavis/checks/__init__.py | 2 | CODE | |
| LOW | modoboa/contacts/apps.py | 10 | CODE | |
| LOW | modoboa/admin/apps.py | 17 | CODE | |
| LOW | modoboa/admin/apps.py | 17 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 3 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 4 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 4 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 4 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 5 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 6 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 7 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 8 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 8 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 8 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 8 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 9 | CODE | |
| LOW | modoboa/admin/models/__init__.py | 9 | CODE | |
| LOW | modoboa/limits/apps.py | 31 | CODE | |
| LOW | modoboa/webmail/apps.py | 18 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 1 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 1 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 1 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 6 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 6 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 6 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 6 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 7 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 7 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 7 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 7 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 7 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 14 | CODE | |
| LOW | modoboa/webmail/lib/__init__.py | 15 | CODE | |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/ldapsync/lib.py | 192 | CODE | |
| LOW | modoboa/rspamd/jobs.py | 36 | CODE | |
| LOW | modoboa/rspamd/api/v2/serializers.py | 10 | CODE | |
| LOW | modoboa/imap_migration/api/v2/serializers.py | 109 | CODE | |
| LOW | modoboa/transport/backends.py | 31 | CODE | |
| LOW | modoboa/core/password_hashers/utils.py | 17 | CODE | |
| LOW | modoboa/core/api/v2/serializers.py | 205 | CODE | |
| LOW | modoboa/amavis/lib.py | 182 | CODE | |
| LOW | modoboa/amavis/sql_connector.py | 82 | CODE | |
| LOW | modoboa/amavis/viewsets.py | 157 | CODE | |
| LOW | modoboa/amavis/serializers.py | 36 | CODE | |
| LOW | modoboa/contacts/lib/carddav.py | 346 | CODE | |
| LOW | modoboa/contacts/lib/carddav.py | 382 | CODE | |
| LOW | modoboa/admin/dns_checker.py | 123 | CODE | |
| LOW | modoboa/admin/lib.py | 219 | CODE | |
| LOW | modoboa/admin/lib.py | 288 | CODE | |
| LOW | modoboa/admin/lib.py | 375 | CODE | |
| LOW | modoboa/admin/handlers.py | 312 | CODE | |
| LOW | …doboa/admin/management/commands/subcommands/_import.py | 45 | CODE | |
| LOW | …doboa/admin/management/commands/subcommands/_import.py | 84 | CODE | |
| LOW | …doboa/admin/management/commands/subcommands/_repair.py | 42 | CODE | |
| LOW | modoboa/admin/models/alias.py | 184 | CODE | |
| LOW | modoboa/sievefilters/rfc6266.py | 57 | CODE | |
| LOW | modoboa/sievefilters/api/v2/serializers.py | 69 | CODE | |
| LOW | modoboa/sievefilters/api/v2/serializers.py | 127 | CODE | |
| LOW | modoboa/webmail/mocks.py | 18 | CODE | |
| LOW | modoboa/webmail/mocks.py | 63 | CODE | |
| LOW | modoboa/webmail/tests/test_fetch_parser.py | 11 | CODE | |
| LOW | modoboa/webmail/lib/fetch_parser.py | 179 | CODE | |
| LOW | modoboa/webmail/lib/fetch_parser.py | 284 | CODE | |
| LOW | modoboa/webmail/lib/rfc6266.py | 57 | CODE | |
| LOW | modoboa/webmail/lib/utils.py | 135 | CODE | |
| LOW | modoboa/webmail/lib/imaputils.py | 113 | CODE | |
| LOW | modoboa/webmail/lib/imaputils.py | 314 | CODE | |
| LOW | modoboa/webmail/lib/imapemail.py | 199 | CODE | |
| LOW | modoboa/parameters/tools.py | 104 | CODE | |
| LOW | modoboa/lib/email_utils.py | 132 | CODE | |
| LOW | modoboa/lib/imap_utf7.py | 96 | CODE | |
| LOW | modoboa/pdfcredentials/api/v2/serializers.py | 72 | CODE | |
| LOW | modoboa/pdfcredentials/api/v2/tests.py | 49 | CODE | |
| LOW | modoboa/pdfcredentials/api/v2/tests.py | 68 | CODE | |
| LOW | modoboa/dmarc/lib.py | 169 | CODE | |
| LOW | modoboa/dmarc/lib.py | 295 | CODE | |
| LOW | modoboa/maillog/management/commands/logparser.py | 365 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | modoboa/rspamd/apps.py | 0 | load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings. | STRING |
| HIGH | modoboa/imap_migration/apps.py | 0 | load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings. | STRING |
| HIGH | modoboa/core/apps.py | 0 | load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings. | STRING |
| HIGH | modoboa/pdfcredentials/apps.py | 0 | load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/imap_migration/auth_backends.py | 77 | # Check if old addresses must be converted | COMMENT |
| LOW | modoboa/core/tests/test_core.py | 223 | # Check if same hostname is not added more than once | COMMENT |
| LOW | modoboa/admin/tests/test_alias_targets.py | 48 | # Check if local domain is still allowed | COMMENT |
| LOW | modoboa/admin/models/domain.py | 288 | # Check if domain's limit for domain admins is not reached yet | COMMENT |
| LOW | modoboa/admin/api/v2/tests.py | 490 | # Check if self alias has been created | COMMENT |
| LOW | modoboa/admin/api/v2/tests.py | 617 | # Check if self alias has been deleted | COMMENT |
| LOW | modoboa/admin/api/v2/tests.py | 700 | # Check if self aliases have been deleted | COMMENT |
| LOW | modoboa/admin/api/v2/tests.py | 834 | # Check if self alias has been updated | COMMENT |
| LOW | modoboa/limits/tests/test_domain_limits.py | 112 | # Check if defined limit can't be exceeded | COMMENT |
| LOW | modoboa/webmail/lib/fetch_parser.py | 200 | # Check if we are parsing a list of mime part or a | COMMENT |
| LOW | modoboa/webmail/lib/fetch_parser.py | 221 | # Check if previous element was a mime part. If so, we are | COMMENT |
| LOW | modoboa/pdfcredentials/api/v2/tests.py | 75 | # Check if link is present in listing page | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/rspamd/jobs.py | 116 | def update_rspamd_maps(domain_ids: list[int]) -> None: | CODE |
| LOW | modoboa/core/models.py | 134 | def set_password(self, raw_value: str, curvalue: str | None = None) -> None: | CODE |
| LOW | modoboa/core/views/__init__.py | 14 | __all__ = [ | CODE |
| LOW | modoboa/admin/models/__init__.py | 11 | __all__ = [ | CODE |
| LOW | modoboa/webmail/lib/__init__.py | 17 | __all__ = [ | CODE |
| LOW | modoboa/webmail/lib/imapheader.py | 14 | __all__ = [ | CODE |
| LOW | modoboa/webmail/lib/utils.py | 405 | def _set_flowed(msg) -> None: | CODE |
| LOW | modoboa/webmail/lib/sendmail.py | 42 | def set_send_error(sched_msg: models.ScheduledMessage, error: str) -> None: | CODE |
| LOW | modoboa/webmail/lib/imaputils.py | 1030 | def _set_unseen_counters(self, mailboxes: list, compute: bool = True) -> None: | CODE |
| LOW | modoboa/parameters/tools.py | 237 | def set_values(self, values: dict, app: str | None = None) -> None: | CODE |
| LOW | modoboa/lib/imap_utf7.py | 169 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/policyd/core.py | 275 | except Exception: | CODE |
| LOW | modoboa/policyd/core.py | 330 | except Exception: | CODE |
| LOW | modoboa/core/context_processors.py | 17 | except Exception: | CODE |
| LOW | modoboa/core/management/commands/load_initial_data.py | 98 | except Exception as e: | CODE |
| LOW | modoboa/webmail/jobs.py | 27 | except Exception: | CODE |
| LOW | modoboa/webmail/lib/imapemail.py | 82 | except Exception: | CODE |
| LOW | …tials/management/commands/reencrypt_pdf_credentials.py | 40 | except Exception as exc: | CODE |
| MEDIUM | modoboa/dmarc/lib.py | 228 | print("Error: the attachment does not match the mimetype") | CODE |
| MEDIUM | modoboa/maillog/lib.py | 20 | print("Error: failed to convert date and time", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/core/management/commands/load_initial_data.py | 201 | # policy = create_user_and_policy("@{0}".format(dom.name)) | COMMENT |
| LOW | modoboa/amavis/models.py | 1 | # This is an auto-generated Django model module. | COMMENT |
| LOW | modoboa/contacts/lib/carddav.py | 1 | # vim: set ts=4 sw=4 expandtab sts=4: | COMMENT |
| LOW | modoboa/admin/tests/test_export.py | 101 | COMMENT | |
| LOW | modoboa/admin/tests/test_export.py | 121 | COMMENT | |
| LOW | modoboa/admin/tests/test_export.py | 141 | COMMENT | |
| LOW | frontend/vite.config.js | 1 | // Plugins | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/autoconfig/tests.py | 37 | resp = self.client.post(url, {"EmailAddress": "test@test.com"}) | CODE |
| LOW | modoboa/sievefilters/mocks.py | 31 | if anyof (header :contains "From" "user@example.com") { | CODE |
| LOW | modoboa/sievefilters/api/v2/tests.py | 261 | email_filter = "user@example.com" | CODE |
| LOW | modoboa/webmail/tests/test_modifiers.py | 13 | b'From: "John Doe" <john@example.test>\r\n' | CODE |
| LOW | modoboa/webmail/tests/test_recipients.py | 20 | ("John Doe <john@example.test>", '"John Doe" <john@example.test>'), | CODE |
| LOW | frontend/src/components/webmail/ComposeEmailForm.vue | 558 | // Without the quotes of the name: "John Doe" <john@example.com> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | modoboa/amavis/tests/test_handlers.py | 33 | # Create a domain alias | COMMENT |
| MEDIUM | modoboa/admin/api/v2/tests.py | 905 | # Create an alias for another user | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | doc-ng/rest_api.md | 42 | Authorization: Token <YOUR_TOKEN> | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modoboa/calendars/mocks.py | 111 | CODE | |
| LOW | modoboa/webmail/tests/test_fetch_parser.py | 29 | CODE | |
| LOW | modoboa/parameters/tools.py | 71 | CODE |