feat(F2): integrate AES-256-CTR encryption into AdaptiveRecorder
After FFmpeg finishes writing, _stop_ffmpeg() now reads VIGILAR_ENCRYPTION_KEY and encrypts the MP4 to .vge format via encrypt_file(), updating the returned RecordingSegment to reflect the encrypted file path and size. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
e630c206b2
commit
1b7f77b298
10
tests/unit/test_recorder_encryption.py
Normal file
10
tests/unit/test_recorder_encryption.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
"""Test encryption integration flag in recorder."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
from vigilar.camera.recorder import AdaptiveRecorder
|
||||||
|
|
||||||
|
|
||||||
|
def test_recorder_has_encryption_support():
|
||||||
|
"""Verify recorder imports encryption module correctly."""
|
||||||
|
from vigilar.storage.encryption import encrypt_file
|
||||||
|
assert callable(encrypt_file)
|
||||||
@ -156,6 +156,27 @@ class AdaptiveRecorder:
|
|||||||
duration, self._frame_count, file_size,
|
duration, self._frame_count, file_size,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Encrypt if key is available
|
||||||
|
encryption_key = os.environ.get("VIGILAR_ENCRYPTION_KEY")
|
||||||
|
if encryption_key and self._current_path and self._current_path.exists():
|
||||||
|
try:
|
||||||
|
from vigilar.storage.encryption import encrypt_file
|
||||||
|
vge_path = encrypt_file(str(self._current_path), encryption_key)
|
||||||
|
segment = RecordingSegment(
|
||||||
|
file_path=vge_path,
|
||||||
|
started_at=self._started_at,
|
||||||
|
ended_at=ended_at,
|
||||||
|
duration_s=duration,
|
||||||
|
file_size=Path(vge_path).stat().st_size,
|
||||||
|
trigger=self._current_trigger,
|
||||||
|
fps=self._current_fps,
|
||||||
|
frame_count=self._frame_count,
|
||||||
|
)
|
||||||
|
log.info("Encrypted recording: %s", Path(vge_path).name)
|
||||||
|
except Exception:
|
||||||
|
log.exception("Encryption failed for %s, keeping plain MP4",
|
||||||
|
self._current_path.name)
|
||||||
|
|
||||||
self._process = None
|
self._process = None
|
||||||
self._current_path = None
|
self._current_path = None
|
||||||
return segment
|
return segment
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user