Autarch/web/routes/steganography.py
DigiJ 2322f69516 v2.2.0 — Full arsenal expansion: 16 new security modules
Add WiFi Audit, API Fuzzer, Cloud Scanner, Threat Intel, Log Correlator,
Steganography, Anti-Forensics, BLE Scanner, Forensics, RFID/NFC, Malware
Sandbox, Password Toolkit, Web Scanner, Report Engine, Net Mapper, and
C2 Framework. Each module includes CLI interface, Flask routes, and web
UI template. Also includes Go DNS server source + binary, IP Capture
service, SYN Flood, Gone Fishing mail server, and hack hijack modules
from v2.0 work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 05:20:39 -08:00

97 lines
3.5 KiB
Python

"""Steganography routes."""
import os
import base64
from flask import Blueprint, request, jsonify, render_template, current_app
from web.routes.auth_routes import login_required
steganography_bp = Blueprint('steganography', __name__, url_prefix='/stego')
def _get_mgr():
from modules.steganography import get_stego_manager
return get_stego_manager()
@steganography_bp.route('/')
@login_required
def index():
return render_template('steganography.html')
@steganography_bp.route('/capabilities')
@login_required
def capabilities():
return jsonify(_get_mgr().get_capabilities())
@steganography_bp.route('/capacity', methods=['POST'])
@login_required
def capacity():
data = request.get_json(silent=True) or {}
return jsonify(_get_mgr().capacity(data.get('file', '')))
@steganography_bp.route('/hide', methods=['POST'])
@login_required
def hide():
mgr = _get_mgr()
# Support file upload or path-based
if request.content_type and 'multipart' in request.content_type:
carrier = request.files.get('carrier')
if not carrier:
return jsonify({'ok': False, 'error': 'No carrier file'})
upload_dir = current_app.config.get('UPLOAD_FOLDER', '/tmp')
carrier_path = os.path.join(upload_dir, carrier.filename)
carrier.save(carrier_path)
message = request.form.get('message', '')
password = request.form.get('password') or None
output_path = os.path.join(upload_dir, f'stego_{carrier.filename}')
result = mgr.hide(carrier_path, message.encode(), output_path, password)
else:
data = request.get_json(silent=True) or {}
carrier_path = data.get('carrier', '')
message = data.get('message', '')
password = data.get('password') or None
output = data.get('output')
result = mgr.hide(carrier_path, message.encode(), output, password)
return jsonify(result)
@steganography_bp.route('/extract', methods=['POST'])
@login_required
def extract():
data = request.get_json(silent=True) or {}
result = _get_mgr().extract(data.get('file', ''), data.get('password'))
if result.get('ok') and 'data' in result:
try:
result['text'] = result['data'].decode('utf-8')
except (UnicodeDecodeError, AttributeError):
result['base64'] = base64.b64encode(result['data']).decode()
del result['data'] # Don't send raw bytes in JSON
return jsonify(result)
@steganography_bp.route('/detect', methods=['POST'])
@login_required
def detect():
data = request.get_json(silent=True) or {}
return jsonify(_get_mgr().detect(data.get('file', '')))
@steganography_bp.route('/whitespace/hide', methods=['POST'])
@login_required
def whitespace_hide():
data = request.get_json(silent=True) or {}
from modules.steganography import DocumentStego
result = DocumentStego.hide_whitespace(
data.get('text', ''), data.get('message', '').encode(),
data.get('password')
)
return jsonify(result)
@steganography_bp.route('/whitespace/extract', methods=['POST'])
@login_required
def whitespace_extract():
data = request.get_json(silent=True) or {}
from modules.steganography import DocumentStego
result = DocumentStego.extract_whitespace(data.get('text', ''), data.get('password'))
if result.get('ok') and 'data' in result:
try:
result['text'] = result['data'].decode('utf-8')
except (UnicodeDecodeError, AttributeError):
result['base64'] = base64.b64encode(result['data']).decode()
del result['data']
return jsonify(result)