Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fd4a47f
update .gitignore
CodFrm Apr 13, 2026
519e45b
feat(similarity): scaffold admin similarity dashboard route + menu
CodFrm Apr 14, 2026
d5e6d9e
feat(similarity): add frontend similarity API service client
CodFrm Apr 14, 2026
4ac68c3
feat(similarity): add zh-CN translations for Phase 3 admin panel
CodFrm Apr 14, 2026
b977170
feat(similarity): implement PairsTable tab
CodFrm Apr 14, 2026
6a8d525
feat(similarity): implement SuspectsTable tab
CodFrm Apr 14, 2026
5fc30af
fix(similarity): integrity_score 0 rendering and consolidate antd imp…
CodFrm Apr 14, 2026
5dedecb
feat(similarity): implement integrity review queue tab
CodFrm Apr 14, 2026
2249164
fix(similarity): use non-deprecated Drawer props (size/destroyOnHidden)
CodFrm Apr 14, 2026
8606147
fix(similarity): destroy ResolveReviewModal form on close to prevent …
CodFrm Apr 14, 2026
20a2f7c
feat(similarity): add removePairWhitelistByID API client method
CodFrm Apr 14, 2026
db34b60
feat(similarity): implement whitelist management tabs
CodFrm Apr 14, 2026
59d57b9
feat(similarity): add admin pair detail page with Monaco diff viewer
CodFrm Apr 14, 2026
d02c123
feat(similarity): add semi-public pair evidence page
CodFrm Apr 14, 2026
8e038be
fix(similarity): use Alert.title instead of deprecated message prop
CodFrm Apr 14, 2026
183f844
fix(similarity): use real CSS class for diff highlights and correct b…
CodFrm Apr 14, 2026
d0ac8a0
feat(similarity): show integrity rejection alert on script publish/up…
CodFrm Apr 14, 2026
3dc4eb8
feat(similarity): add Phase 3 translations for all supported locales
CodFrm Apr 14, 2026
9e8574e
feat(similarity): Phase 4 backfill control panel + stop-fp refresh
CodFrm Apr 14, 2026
b570ceb
fix(similarity): flag deleted scripts in pair list with toggle filter
CodFrm Apr 15, 2026
d0a6b7c
feat(similarity): show signal descriptions in integrity review table
CodFrm Apr 16, 2026
33667a4
refactor(similarity): move SIGNAL_DESCRIPTIONS hardcoded Chinese stri…
CodFrm Apr 16, 2026
ad30922
feat(i18n): add missing Phase 4 similarity keys to all non-zh-CN locales
CodFrm Apr 16, 2026
600c29e
style: fix prettier formatting in IntegrityReviewTable
CodFrm Apr 16, 2026
a9a840c
refactor: extract PairDetailClient and CodeDiffViewer to shared compo…
CodFrm Apr 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,6 @@ next-env.d.ts
/public/assets/prismjs/*

.claude

.omc
CLAUDE.md

120 changes: 119 additions & 1 deletion public/locales/de-DE/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
"scores": "Bewertungsverwaltung",
"scripts": "Skriptverwaltung",
"system_config": "Systemkonfiguration",
"users": "Benutzerverwaltung"
"users": "Benutzerverwaltung",
"similarity": "Similarity Detection"
},
"no_permission": "Sie haben keine Administratorberechtigung für den Zugriff auf diese Seite.",
"oauth_apps": {
Expand Down Expand Up @@ -211,6 +212,111 @@
"title": "Benutzerverwaltung",
"unban_confirm": "Möchten Sie diesen Benutzer wirklich entsperren?",
"unban_success": "Benutzer erfolgreich entsperrt"
},
"similarity": {
"tab_pairs": "Pairs",
"tab_suspects": "Suspects",
"tab_integrity_reviews": "Integrity Reviews",
"tab_pair_whitelist": "Pair Whitelist",
Comment on lines +216 to +220
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New similarity UI references additional translation keys (e.g. tab_backfill, backfill.*, script_deleted, filter_exclude_deleted) that are not present in this locale file. Add these keys here to avoid missing-message fallbacks at runtime.

Copilot uses AI. Check for mistakes.
"tab_integrity_whitelist": "Integrity Exemptions",
"col_id": "ID",
"col_script_a": "Script A",
"col_script_b": "Script B",
"col_jaccard": "Jaccard",
"col_common": "Common Fingerprints",
"col_earlier": "Earlier Side",
"col_status": "Status",
"col_integrity": "Integrity Score",
"col_actions": "Actions",
"col_script": "Script",
"col_max_jaccard": "Max Jaccard",
"col_coverage": "External Coverage",
"col_pair_count": "Pair Count",
"col_detected_at": "Detected At",
"col_score": "Score",
"col_createtime": "Created",
"col_reason": "Reason",
"col_added_by": "Added By",
"status_pending": "Pending",
"status_whitelisted": "Whitelisted",
"status_resolved": "Resolved",
"review_pending": "Pending",
"review_ok": "OK",
"review_violated": "Violation",
"action_detail": "Details",
"action_resolve": "Resolve",
"action_whitelist": "Whitelist",
"action_remove": "Remove",
"confirm_remove_whitelist": "Remove this whitelist entry?",
"msg_removed": "Removed",
"modal_add_int_whitelist": "Add Integrity Exemption",
"label_script_id": "Script ID",
"label_reason": "Reason",
"btn_add": "Add",
"modal_resolve_title": "Mark Integrity Review",
"label_decision": "Decision",
"label_note": "Note",
"decision_ok": "OK",
"decision_violated": "Violation",
"msg_review_resolved": "Marked successfully",
"msg_whitelisted": "Added to whitelist",
"drawer_review_detail": "Integrity Review Details",
"label_score": "Total Score",
"label_sub_scores": "Category Scores",
"label_hit_signals": "Hit Signals",
"label_jaccard": "Jaccard",
"label_common": "Common Fingerprints",
"label_earlier": "Earlier Side",
"label_detected_at": "Detected At",
"label_script_a": "Script A",
"label_script_b": "Script B",
"label_code_diff": "Code Diff",
"script_deleted": "Gelöscht",
"filter_exclude_deleted": "Paare mit gelöschten Skripten ausblenden",
"tab_backfill": "Nachfüllung & Neuscan",
"backfill": {
"help_title": "Historische Skript-Nachfüllung",
"help_body": "Nach der Bereitstellung des Systems werden nur neu veröffentlichte oder aktualisierte Skripte automatisch auf Ähnlichkeit gescannt. Um historische Skripte einzubeziehen, lösen Sie eine manuelle Nachfüllung aus. Die Nachfüllung sendet für jedes Skript eine Scan-Nachricht, die asynchron verarbeitet wird. Sie können diese Seite während des Vorgangs sicher verlassen.",
"status_title": "Nachfüllungsstatus",
"label_running": "Status",
"label_total": "Gesamt",
"label_cursor": "Cursor",
"label_progress": "Fortschritt",
"label_started_at": "Gestartet am",
"label_finished_at": "Beendet am",
"state_running": "Läuft",
"state_idle": "Inaktiv",
"btn_start": "Nachfüllung starten",
"btn_restart": "Von Anfang neu starten",
"btn_refresh": "Status aktualisieren",
"confirm_start_title": "Nachfüllung starten?",
"confirm_start_body": "Scan-Nachrichten werden ab der letzten Cursor-Position fortgesetzt.",
"confirm_restart_title": "Nachfüllung von Anfang neu starten?",
"confirm_restart_body": "Der Cursor wird auf 0 zurückgesetzt und alle Skripte werden erneut gescannt. Dies ist normalerweise nur bei der Erstbereitstellung oder nach Aktualisierung der Stop-FP-Liste erforderlich.",
"msg_started": "Nachfüllungsaufgabe gestartet",
"manual_scan_title": "Einzelnes Skript manuell scannen",
"manual_scan_placeholder": "Skript-ID eingeben",
"btn_manual_scan": "Scan senden",
"msg_manual_scan_published": "Scan-Nachricht veröffentlicht",
"stop_fp_title": "Stop-Fingerprint Aktualisierung",
"stop_fp_warn_title": "Manuelles Auslösen normalerweise nicht nötig",
"stop_fp_warn_body": "Die Stop-FP-Liste wird automatisch stündlich aktualisiert. Nur einmal nach Abschluss der vollständigen Nachfüllung manuell auslösen, damit Jaccard-Berechnungen Template-Code herausfiltern.",
"btn_stop_fp_refresh": "Jetzt aktualisieren",
"msg_stop_fp_refreshed": "Stop-Fingerprint-Satz aktualisiert"
},
"signal_desc": {
"avg_line_length": "Durchschnittliche Zeilenlänge zu hoch (Code möglicherweise in wenige lange Zeilen komprimiert)",
"max_line_length": "Maximale Zeilenlänge zu hoch (enthält extrem lange Zeilen)",
"whitespace_ratio": "Leerzeichenanteil zu niedrig (Code fehlt normale Einrückung)",
"comment_ratio": "Kommentaranteil zu niedrig (Code hat fast keine Kommentare)",
"single_char_ident_ratio": "Anteil einstelliger Bezeichner zu hoch (Variablennamen auf einzelne Zeichen verkürzt)",
"hex_ident_ratio": "Anteil hexadezimaler Bezeichner zu hoch (verwendet _0x-verschleierte Variablennamen)",
"large_string_array": "Großes String-Array erkannt (typisch für Verschleierungswerkzeuge)",
"dean_edwards_packer": "Dean Edwards Packer erkannt",
"aa_encode": "AAEncode-Kodierung erkannt",
"jj_encode": "JJEncode-Kodierung erkannt",
"eval_density": "eval/dynamische Ausführungsdichte zu hoch"
}
}
},
"auth": {
Expand Down Expand Up @@ -1841,5 +1947,17 @@
},
"utils": {
"time_format": "DD.MM.YYYY"
},
"similarity": {
"evidence": {
"disclaimer_title": "Preliminary Finding, Not a Final Verdict",
"disclaimer_body": "This page shows automatically detected similar-code evidence. It is informational only. Please do not draw definitive conclusions about the author from this data."
}
},
"errors": {
"integrity_rejected": {
"title": "Code Failed Integrity Check",
"help": "If this is a false positive, please apply for an exemption via the admin contact listed in the site FAQ."
}
}
}
120 changes: 119 additions & 1 deletion public/locales/en-US/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@
"scores": "Score Management",
"scripts": "Script Management",
"system_config": "System Config",
"users": "User Management"
"users": "User Management",
"similarity": "Similarity Detection"
},
"no_permission": "You do not have admin permission to access this page.",
"oauth_apps": {
Expand Down Expand Up @@ -250,6 +251,111 @@
"title": "User Management",
"unban_confirm": "Are you sure you want to unban this user?",
"unban_success": "User unbanned successfully"
},
"similarity": {
"tab_pairs": "Pairs",
"tab_suspects": "Suspects",
"tab_integrity_reviews": "Integrity Reviews",
"tab_pair_whitelist": "Pair Whitelist",
Comment on lines +255 to +259
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New similarity UI references additional translation keys (e.g. tab_backfill, backfill.*, script_deleted, filter_exclude_deleted) that are not present in this locale file. Add these keys here to avoid missing-message fallbacks at runtime.

Copilot uses AI. Check for mistakes.
"tab_integrity_whitelist": "Integrity Exemptions",
"col_id": "ID",
"col_script_a": "Script A",
"col_script_b": "Script B",
"col_jaccard": "Jaccard",
"col_common": "Common Fingerprints",
"col_earlier": "Earlier Side",
"col_status": "Status",
"col_integrity": "Integrity Score",
"col_actions": "Actions",
"col_script": "Script",
"col_max_jaccard": "Max Jaccard",
"col_coverage": "External Coverage",
"col_pair_count": "Pair Count",
"col_detected_at": "Detected At",
"col_score": "Score",
"col_createtime": "Created",
"col_reason": "Reason",
"col_added_by": "Added By",
"status_pending": "Pending",
"status_whitelisted": "Whitelisted",
"status_resolved": "Resolved",
"review_pending": "Pending",
"review_ok": "OK",
"review_violated": "Violation",
"action_detail": "Details",
"action_resolve": "Resolve",
"action_whitelist": "Whitelist",
"action_remove": "Remove",
"confirm_remove_whitelist": "Remove this whitelist entry?",
"msg_removed": "Removed",
"modal_add_int_whitelist": "Add Integrity Exemption",
"label_script_id": "Script ID",
"label_reason": "Reason",
"btn_add": "Add",
"modal_resolve_title": "Mark Integrity Review",
"label_decision": "Decision",
"label_note": "Note",
"decision_ok": "OK",
"decision_violated": "Violation",
"msg_review_resolved": "Marked successfully",
"msg_whitelisted": "Added to whitelist",
"drawer_review_detail": "Integrity Review Details",
"label_score": "Total Score",
"label_sub_scores": "Category Scores",
"label_hit_signals": "Hit Signals",
"label_jaccard": "Jaccard",
"label_common": "Common Fingerprints",
"label_earlier": "Earlier Side",
"label_detected_at": "Detected At",
"label_script_a": "Script A",
"label_script_b": "Script B",
"label_code_diff": "Code Diff",
"script_deleted": "Deleted",
"filter_exclude_deleted": "Hide pairs with deleted scripts",
"tab_backfill": "Backfill & Rescan",
"backfill": {
"help_title": "Historical Script Backfill",
"help_body": "After the system is deployed, only newly published or updated scripts are automatically scanned for similarity. To include historical scripts in comparisons, trigger a manual backfill. The backfill sends a scan message for each script, processed asynchronously by background consumers. You can safely leave this page during the process.",
"status_title": "Backfill Status",
"label_running": "Status",
"label_total": "Total",
"label_cursor": "Cursor",
"label_progress": "Progress",
"label_started_at": "Started At",
"label_finished_at": "Finished At",
"state_running": "Running",
"state_idle": "Idle",
"btn_start": "Start Backfill",
"btn_restart": "Restart from Beginning",
"btn_refresh": "Refresh Status",
"confirm_start_title": "Start backfill?",
"confirm_start_body": "This will continue sending scan messages from the last cursor position.",
"confirm_restart_title": "Restart backfill from beginning?",
"confirm_restart_body": "The cursor will reset to 0, and all scripts in the database will be re-scanned. This is usually only needed on initial deployment or after refreshing the stop-fp list.",
"msg_started": "Backfill task started",
"manual_scan_title": "Manually Rescan Single Script",
"manual_scan_placeholder": "Enter script ID",
"btn_manual_scan": "Send Scan",
"msg_manual_scan_published": "Scan message published",
"stop_fp_title": "Stop-fingerprint Refresh",
"stop_fp_warn_title": "Manual trigger usually not needed",
"stop_fp_warn_body": "The stop-fp list is refreshed automatically every hour by a scheduled task. Only trigger manually once after completing the initial full backfill (step 8 in §8.5), so Jaccard calculations filter out common template code.",
"btn_stop_fp_refresh": "Refresh Now",
"msg_stop_fp_refreshed": "Stop-fingerprint set refreshed"
},
"signal_desc": {
"avg_line_length": "Average line length too high (code may be compressed into few long lines)",
"max_line_length": "Maximum line length too high (contains extremely long lines)",
"whitespace_ratio": "Whitespace ratio too low (code lacks normal spacing and indentation)",
"comment_ratio": "Comment ratio too low (code has almost no comments)",
"single_char_ident_ratio": "Single-character identifier ratio too high (variable names shortened to single characters)",
"hex_ident_ratio": "Hex identifier ratio too high (uses _0x prefixed obfuscated variable names)",
"large_string_array": "Large string array detected (common in obfuscation tool string tables)",
"dean_edwards_packer": "Dean Edwards packer detected",
"aa_encode": "AAEncode encoding detected",
"jj_encode": "JJEncode encoding detected",
"eval_density": "eval/dynamic execution call density too high"
}
}
},
"auth": {
Expand Down Expand Up @@ -1883,5 +1989,17 @@
},
"utils": {
"time_format": "YYYY-MM-DD"
},
"similarity": {
"evidence": {
"disclaimer_title": "Preliminary Finding, Not a Final Verdict",
"disclaimer_body": "This page shows automatically detected similar-code evidence. It is informational only. Please do not draw definitive conclusions about the author from this data."
}
},
"errors": {
"integrity_rejected": {
"title": "Code Failed Integrity Check",
"help": "If this is a false positive, please apply for an exemption via the admin contact listed in the site FAQ."
}
}
}
Loading