()
| 513 | |
| 514 | @app.route('/api/tg/export_report', methods=['GET']) |
| 515 | def tg_export_report(): |
| 516 | denied = require_authenticated_download("tg_export_report", limit=20, window=60) |
| 517 | if denied: |
| 518 | return denied |
| 519 | target = request.args.get('target') |
| 520 | if not target: |
| 521 | return "Target mancante", 400 |
| 522 | safe_id = "".join(c for c in str(target) if c.isalnum() or c in ('_', '-')) |
| 523 | log_file = f"TG_Monitor_{safe_id}.txt" |
| 524 | if not os.path.exists(log_file): |
| 525 | return "Nessun dato di monitoraggio trovato", 404 |
| 526 | |
| 527 | with open(log_file, "r", encoding="utf-8") as f: |
| 528 | lines = f.readlines() |
| 529 | |
| 530 | rg = ReportGenerator() |
| 531 | pdf = FPDF() |
| 532 | rg._pdf_cover(pdf, f"Telegram Intelligence: {target}", "CScorza Report") |
| 533 | rg._pdf_notes_page(pdf, "Note Tab Telegram (Pagina 2)", [ |
| 534 | "Log monitoraggio online/offline e cambi profilo.", |
| 535 | "La timeline non sostituisce prove forensi definitive." |
| 536 | ]) |
| 537 | pdf.add_page() |
| 538 | rows = [] |
| 539 | for idx, line in enumerate(lines, start=1): |
| 540 | rows.append((f"Evento {idx:03d}", line.strip())) |
| 541 | rg._pdf_table(pdf, "Timeline eventi", rows[:350]) |
| 542 | rg._pdf_footer_credentials(pdf, getattr(core, "creds", {})) |
| 543 | |
| 544 | return send_file(io.BytesIO(pdf.output()), mimetype='application/pdf', as_attachment=True, download_name=f"Intelligence_Report_{safe_id}.pdf") |
| 545 | |
| 546 | import zipfile |
| 547 |
nothing calls this directly
no test coverage detected