/
kremls
/
python-course-junior
Обзор
Документация
Войти
/
kremls
/
python-course-junior
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
02-lessons/day-003/task.py
143 строки
3 KB
kremls
done day-004
16 май 2026, 15:30
16 май 2026, 15:30
9681412
Код
Авторство
О чём код?
ALLOWED_SEVERITIES = {"LOW", "MEDIUM", "HIGH", "CRITICAL"} def normalize_string(value: object, max_length: int = 200) -> str: if not isinstance(value, str): return "" return value.strip()[:max_length] def normalize_line(value: object) -> int: if not isinstance(value, int): return 0 if value < 1: return 0 return value def normalize_severity(value: object) -> str: if not isinstance(value, str): return "LOW" normalized = value.strip().upper() if normalized in ALLOWED_SEVERITIES: return normalized return "LOW" def normalize_finding(raw_finding: dict) -> dict: return { "file": normalize_string(raw_finding.get("file")), "line": normalize_line(raw_finding.get("line")), "rule_id": normalize_string(raw_finding.get("rule_id")), "severity": normalize_severity(raw_finding.get("severity")), } def create_finding(file: str, line: int, rule_id: str, severity: str) -> dict: return normalize_finding({ "file": file, "line": line, "rule_id": rule_id, "severity": severity, }) def deduplicate_findings(findings: list[dict]) -> list[dict]: seen = set() result = [] for finding in findings: identity = ( finding["file"], finding["line"], finding["rule_id"], ) if identity in seen: continue seen.add(identity) result.append(finding) return result def normalize_findings(raw_findings: list[dict]) -> list[dict]: normalized = [] for raw_finding in raw_findings: if not isinstance(raw_finding, dict): continue normalized.append(normalize_finding(raw_finding)) return deduplicate_findings(normalized) def count_by_severity(findings: list[dict]) -> dict: stats = { "LOW": 0, "MEDIUM": 0, "HIGH": 0, "CRITICAL": 0, } for finding in findings: severity = normalize_severity(finding.get("severity")) stats[severity] += 1 return stats def get_unique_rule_ids(findings: list[dict]) -> set[str]: result = set() for finding in findings: rule_id = normalize_string(finding.get("rule_id")) if rule_id: result.add(rule_id) return result def main(): raw_findings = [ create_finding("app.py", 11, "SQL_INJECTION", "HIGH"), create_finding("app.py", 12, "LOG_FORGING", "MEDIUM"), create_finding("app.py", 14, "DUPLICATE", "LOW"), create_finding("app.py", 15, "XSS", "HIGH"), create_finding("app.py", 11, "SQL_INJECTION", "HIGH"), {"file": " bad.py ", "line": -10, "rule_id": " SSRF ", "severity": "critical"}, "invalid finding", None, ] findings = normalize_findings(raw_findings) print("High risk findings:") for finding in findings: if finding.get("severity") in {"HIGH", "CRITICAL"}: print(finding) print("Total findings:") print(len(findings)) print("Unique rule ids:") print(get_unique_rule_ids(findings)) print("Stats by severity:") print(count_by_severity(findings)) print("Normalized and deduplicated findings:") print(findings) if __name__ == "__main__": main()