Freedec: Secure Document & Cryptographic Recovery Service
🇪🇸 Leer en Español (Guía Completa para Principiantes) | 🇬🇧 Read in English (Complete Beginner-Friendly Guide)
🇪🇸 Español: Guía Completa de la Aplicación Freedec
Bienvenido a la documentación oficial de Freedec.
📑 Índice de Contenidos (Español)
- ¿Qué es Freedec y qué problema resuelve?
- Requisitos Previos del Sistema
- Entorno de Pruebas Rápido (Staging Sandbox sin tocar tu proyecto)
- Las 4 Opciones de Instalación en un Proyecto Existente
- Guía Paso a Paso de Integración (Línea por Línea)
- Cómo Funciona y Cómo se Usa la Web GUI (Navegador)
- Endpoints de la API REST (para Desarrolladores y cURL)
- Configuración de MEDIA en Producción (Nginx y Apache)
- Resolución de Problemas Frecuentes (FAQ / Troubleshooting)
1. ¿Qué es Freedec y qué problema resuelve?
Compartir documentos de alta confidencialidad (contratos, auditorías, informes forenses) mediante contraseñas estáticas compartidas o canales tradicionales expone la información a filtraciones, ataques de fuerza bruta y permanencia innecesaria de archivos en los servidores.
Freedec resuelve esto mediante una arquitectura criptográfica DEK multi-usuario, autorización dinámica por Enlace Mágico / OTP temporal y destrucción física irreversible al primer consumo (Burn-After-Read):
- Arquitectura Criptográfica DEK Multi-Usuario con Sobres Digitales (
user_envelopes):- Al registrar un documento, el sistema genera una Clave Maestra de Datos simétrica única (DEK) usando
Fernet.generate_key(). - El archivo original se cifra una sola vez con esta DEK y se almacena en disco con extensión
.enc. - Para cada correo autorizado en
allowed_emails, se genera un secreto individual (user_secret), se cifra la DEK con este secreto y se protege el secreto con la clave de servidor (settings.FREEDEC_FERNET_KEY). - No existen contraseñas estáticas globales compartidas.
- Al registrar un documento, el sistema genera una Clave Maestra de Datos simétrica única (DEK) usando
- Autorización Dinámica y Prueba de Posesión en Tiempo Real:
- El destinatario solicita el acceso subiendo su copia del archivo
.ence indicando su correo electrónico. - El sistema genera un token de un solo uso de alta entropía (
secrets.token_urlsafe(32)) y un código OTP numérico de 6 dígitos con expiración estricta a 15 minutos. - En la base de datos solo se almacena el hash SHA-256 del token (Zero-Knowledge).
- El enlace directo (
https://dominio/freedec/consumir/?t={token}) y el código OTP se envían de forma exclusiva a la bandeja de entrada del usuario verificado.
- El destinatario solicita el acceso subiendo su copia del archivo
- Descifrado al Vuelo y Política de Destrucción (Burn Policy):
- Al hacer clic en el Enlace Mágico o ingresar el OTP, el sistema abre el sobre digital del usuario, recupera la DEK y entrega el archivo original descifrado.
- Modo 'Con que solo acceda uno' (FIRST_ACCESS): El archivo cifrado
.encen disco se elimina de forma física e irreversible (document.encrypted_file.delete(save=False)) tras el primer consumo de cualquiera de los usuarios autorizados. - Modo 'Cuando accedan todos' (ALL_RECIPIENTS): Cada destinatario autorizado dispone de una única descarga. El archivo físico se preserva en disco hasta que todos los destinatarios autorizados hayan descargado su copia, momento en el cual se destruye físicamente de forma definitiva.
- El registro en base de datos se marca
is_consumed = True, guardando la auditoría de consumos.
- Gestión de Accesos Posteriores:
- Si otro usuario autorizado intenta solicitar o descifrar un documento ya consumido, el sistema no produce errores 500 ni fuga datos. En su lugar, le envía automáticamente un correo con asunto
[Freedec] Archivo ya retirado: {nombre_documento}informando: "El documento '{nombre_documento}' ya fue retirado por {consumed_by} el {consumed_at}. Solicite una copia directamente a esa dirección."
- Si otro usuario autorizado intenta solicitar o descifrar un documento ya consumido, el sistema no produce errores 500 ni fuga datos. En su lugar, le envía automáticamente un correo con asunto
- Acceso Administrativo Preservado (Audit Bypass):
- El personal administrativo autorizado en Django Admin puede descargar una copia original descifrada para fines de auditoría o contingencia usando la clave de servidor sin destruir el archivo en disco ni marcarlo como consumido, registrando el evento como
admin_inspeccion_preservada.
- El personal administrativo autorizado en Django Admin puede descargar una copia original descifrada para fines de auditoría o contingencia usando la clave de servidor sin destruir el archivo en disco ni marcarlo como consumido, registrando el evento como
- Detección de Hash Idéntico y Reactivación de Documentos:
- Detección en tiempo real en Django Admin: Al seleccionar un archivo en el formulario de alta, el navegador calcula su hash SHA-256 en cliente (WebCrypto API) y consulta el endpoint
check-file-hash/. Si el archivo ya existía previamente, muestra un aviso inmediato con enlace directo al registro existente. - Reapertura directa y prevención de duplicados: Si se envía el formulario con un archivo idéntico, Freedec redirige automáticamente al registro ya existente en lugar de crear duplicados en la base de datos.
- Reactivación y re-cifrado seguro: El administrador puede volver a subir el archivo original tanto desde el alta como desde el formulario de edición (
reupload_file). El sistema genera una nueva DEK, re-cifra el archivo en disco, restablece el estado de consumo (is_consumed=False,consumed_recipients=[]) y genera nuevos sobres digitales. - Reemplazo exclusivo de destinatarios: Al reactivar, la lista activa de destinatarios autorizados (
allowed_emailsyuser_envelopes) se actualiza para incluir únicamente los nuevos correos, dejando de tener acceso los anteriores. - Aviso proactivo de accesos pendientes: Si se intenta reactivar un documento que aún no ha finalizado (con destinatarios pendientes de acceder), el sistema advierte en tiempo real con un banner de alerta y un botón para reincorporar a los pendientes automáticamente a la lista para no revocar su acceso.
- Preservación exhaustiva de la trazabilidad: Todo el historial anterior de accesos, descargas y auditoría se mantiene intacto en
DocumentAccessLog, registrándose un nuevo eventoreactivacion_documentoque detalla los destinatarios previos reemplazados y los nuevos habilitados.
- Detección en tiempo real en Django Admin: Al seleccionar un archivo en el formulario de alta, el navegador calcula su hash SHA-256 en cliente (WebCrypto API) y consulta el endpoint
2. Requisitos Previos del Sistema
- Python 3.11 o 3.12 (
python3 --version). - Poetry (Gestor moderno de dependencias en Python):
curl -sSL https://install.python-poetry.org | python3 -
3. Entorno de Pruebas Rápido (Staging Sandbox)
El repositorio incluye un entorno de prueba autónomo preconfigurado listo para funcionar.
Paso 1: Clonar e Instalar Dependencias
git clone https://github.com/jrubioh1/Freedec.git
cd Freedec
poetry install
Paso 2: Inicializar la Base de Datos de Prueba
poetry run python manage.py setup_staging
Crea la base de datos local SQLite, el usuario administrador admin con contraseña admin123 y el archivo de prueba sample_document.pdf.
Paso 3: Arrancar el Servidor
poetry run python manage.py runserver 8000
Paso 4: Probar la Interfaz Gráfica en tu Navegador
- Portal de Solicitud de Acceso: http://127.0.0.1:8000/freedec/
- Portal de Consumo y Descarga (Burn-After-Read): http://127.0.0.1:8000/freedec/consumir/
- Panel de Administrador (Django Admin): Inicia sesión en http://127.0.0.1:8000/admin/ (usuario
admin, contraseñaadmin123) para registrar y cifrar documentos desde Documentos Cifrados -> Añadir.
Paso 5: Probar el Flujo Automatizado por CLI (Opcional)
En otra terminal distinta, ejecuta:
poetry run python scripts/demo_flow.py
4. Las 4 Opciones de Instalación en un Proyecto Existente
Si ya tienes un proyecto Django funcionando, puedes incorporar freedec de cualquiera de estas 4 maneras:
Opción 1: Copiar la carpeta freedec/ a tu proyecto (La más directa)
- ¿Qué se copia?: ÚNICAMENTE la carpeta
freedec/. - ¿Qué NO se copia?: NO copies
config/nimanage.py(tu proyecto ya tiene los suyos propios). - Dependencias:
poetry add cryptography djangorestframework
Opción 2: Como dependencia Git con Poetry
poetry add git+https://github.com/jrubioh1/Freedec.git
Opción 3: Como submódulo Git
git submodule add https://github.com/jrubioh1/Freedec.git apps/freedec
Opción 4: Como paquete editable local
poetry add --editable /ruta/a/Freedec/
5. Guía Paso a Paso de Integración (Línea por Línea)
Paso 1: Generar la Clave Maestra del Servidor (FREEDEC_FERNET_KEY)
Ejecuta en tu terminal:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
Paso 2: Configurar tu settings.py
Añade las siguientes configuraciones en tu proyecto:
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
# 1. Añadir 'rest_framework' y 'freedec.apps.FreedecConfig' a INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Freedec y dependencias:
'rest_framework',
'freedec.apps.FreedecConfig',
]
# 2. Clave maestra Fernet del servidor (Reversible solo para el backend y staff autorizado)
FREEDEC_FERNET_KEY = os.environ.get(
"FREEDEC_FERNET_KEY",
"Pega_Aqui_La_Clave_Generada_En_El_Paso_1=="
)
# 3. Tamaño máximo de archivo (50 MB por defecto)
FREEDEC_MAX_FILE_SIZE = 50 * 1024 * 1024
# 4. Configurar almacenamiento MEDIA
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# 5. Configurar correo electrónico (SMTP en producción)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'no-reply@tudominio.com'
# 6. Throttling de seguridad en DRF
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['rest_framework.throttling.AnonRateThrottle'],
'DEFAULT_THROTTLE_RATES': {'anon': '10/minute'},
}
Paso 3: Editar tu archivo urls.py principal
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('freedec/', include('freedec.urls', namespace='freedec')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Paso 4: Ejecutar Migraciones
poetry run python manage.py migrate
6. Cómo Funciona y Cómo se Usa la Web GUI
A. Panel de Administración (Django Admin - http://localhost:8000/admin/)
- Inicia sesión en
/admin/con una cuenta de staff/superusuario. - Entra a Documentos Cifrados -> Añadir Documento Cifrado.
- Selecciona tu documento en formato admitido (PDF, LibreOffice .odt/.ods o Microsoft Office .docx/.xlsx).
- Introduce las direcciones de correo autorizadas con el control dinámico
➕ Añadir otro correo. - Pulsa Guardar.
- Resultado:
- El sistema genera la DEK, cifra el binario una sola vez y construye los sobres digitales individuales (
user_envelopes). - La vista muestra la insignia de estado (
🟢 Activo (Listo para consumo)). - Se habilita el botón
📥 .encpara descargar el archivo cifrado y distribuirlo libremente. - Se habilita el botón
🔓 Original (Admin)para realizar una descarga administrativa descifrada sin destruir el archivo en disco ni marcarlo como consumido (Audit Bypass).
- El sistema genera la DEK, cifra el binario una sola vez y construye los sobres digitales individuales (
B. Portal Público de Solicitud de Acceso (http://localhost:8000/freedec/)
- El usuario final o destinatario accede a
http://localhost:8000/freedec/(o/freedec/solicitar/). - Sube su copia del archivo
.enc(o el documento de control). - Introduce su correo electrónico registrado.
- Pulsa Solicitar Enlace de Acceso y OTP.
- Resultado:
- La web muestra una respuesta genérica neutra (mitigación anti-enumeración de usuarios y archivos).
- Si el archivo y correo coinciden con un documento activo:
- Se genera un token de un solo uso y un código OTP de 6 dígitos con expiración estricta de 15 minutos.
- Se despacha de forma automática un correo electrónico con el Magic Link (
https://dominio/freedec/consumir/?t={token}) y el código OTP. - Se audita el evento con
action="solicitud_acceso".
- Si el documento ya había sido consumido:
- No se fugan datos. Se envía un correo informándole que el archivo ya fue retirado por
consumed_byenconsumed_at. - Se audita con
action="intento_post_consumo".
- No se fugan datos. Se envía un correo informándole que el archivo ya fue retirado por
C. Portal de Consumo y Descarga Destructiva (Burn-After-Read) (http://localhost:8000/freedec/consumir/)
- El usuario hace clic en el Enlace Mágico recibido en su correo (
?t=...) o accede a/freedec/consumir/e introduce su código OTP de 6 dígitos y correo electrónico. - Resultado Inmediato:
- El sistema valida la vigencia del token/código (no expirado y no usado).
- Abre el sobre digital del usuario para extraer la DEK y descifra el binario original en memoria.
- Se inicia la descarga inmediata del archivo original en el navegador (
documento.pdf,contrato.docx, etc.). - Destrucción Física en Servidor: El archivo
.encen disco es eliminado definitivamente medianteencrypted_file.delete(save=False). - El estado en base de datos se actualiza:
is_consumed = True,consumed_by = email,consumed_at = timezone.now(). - El token se marca como
is_used = True. - Se audita con
action="descifrado_completado_burn".
D. Descifrado por Terminal (Línea de Comandos CLI)
Para administradores, scripts o recuperación fuera de banda:
# Consumo y destrucción vía Magic Link token:
poetry run python manage.py decrypt_document ruta/archivo.enc --token "TOKEN_URLSAFE"
# Consumo y destrucción vía código OTP:
poetry run python manage.py decrypt_document ruta/archivo.enc --otp "123456" --email "usuario@empresa.com"
# Descarga administrativa preservada (Audit Bypass, sin destruir el archivo):
poetry run python manage.py decrypt_document ruta/archivo.enc --admin
E. Eliminación Administrativa de Documentos
# Listar documentos existentes y su estado de consumo (🟢 Activo / 🔥 Consumido):
poetry run python manage.py delete_document --list
# Eliminar un documento específico:
poetry run python manage.py delete_document balance_anual.pdf
# Eliminar todos los registros y archivos físicos (.enc):
poetry run python manage.py delete_document --all
7. Endpoints de la API REST
1. Solicitud Pública de Acceso (POST /freedec/public/request-access/)
- Headers: Sin autenticación (
AnonRateThrottle). - Form-Data:
file: Archivo cifrado.enco documento de control.email: Dirección de correo electrónico del destinatario.
curl -X POST http://127.0.0.1:8000/freedec/public/request-access/ \
-F "file=@contrato.pdf.enc" \
-F "email=auditor@empresa.com"
- Respuesta Exitosa / Neutra (
HTTP 200 OK):
{
"status": "processed",
"message": "Si el archivo y el correo electrónico coinciden con un documento activo y autorizado, se ha enviado un enlace de acceso y un código OTP a su bandeja de entrada."
}
2. Consumo y Descarga Directa por Magic Link (GET /freedec/api/public/consume/?t=...)
- Query Param:
t(token URL-safe recibido en el correo). - Respuesta: Binario original en
HTTP 200 OKcon cabeceraContent-Disposition: attachment; filename="documento.pdf". - Efecto colateral: Destrucción física del binario en disco en el servidor (Burn-After-Read).
curl -OJ "http://127.0.0.1:8000/freedec/api/public/consume/?t=TOKEN_URLSAFE"
3. Consumo y Descarga por Código OTP (POST /freedec/api/public/consume/)
- Headers:
Content-Type: application/json - JSON Body:
{
"otp_code": "123456",
"email": "auditor@empresa.com"
}
curl -X POST http://127.0.0.1:8000/freedec/api/public/consume/ \
-H "Content-Type: application/json" \
-d '{"otp_code": "123456", "email": "auditor@empresa.com"}' \
--output documento_descifrado.pdf
8. Configuración de MEDIA en Producción (Nginx y Apache)
Opción A: Configuración en Nginx
server {
listen 443 ssl http2;
server_name tudominio.com;
location /media/ {
alias /var/www/tu_proyecto/media/;
autoindex off;
add_header X-Content-Type-Options "nosniff";
default_type application/octet-stream;
location ~* \.(php|py|sh|pl|cgi|exe)$ { deny all; }
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Opción B: Configuración en Apache (httpd con mod_wsgi)
<VirtualHost *:443>
ServerName tudominio.com
Alias /media/ /var/www/tu_proyecto/media/
<Directory /var/www/tu_proyecto/media>
Options -Indexes -FollowSymLinks
AllowOverride None
Require all granted
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
<FilesMatch "\.(php|py|sh|pl|cgi|exe)$">
Require all denied
</FilesMatch>
ForceType application/octet-stream
</Directory>
WSGIScriptAlias / /var/www/tu_proyecto/config/wsgi.py
</VirtualHost>
9. Resolución de Problemas Frecuentes (FAQ)
¿Qué ocurre si un enlace expira?
Los enlaces y códigos OTP tienen una vigencia estricta de 15 minutos. Si el usuario no realiza la descarga en ese intervalo, el token queda invalidado y deberá solicitar uno nuevo introduciendo nuevamente su archivo y correo en el portal.
¿Se puede recuperar un archivo una vez consumido?
No. La política Burn-After-Read elimina físicamente los bytes del archivo cifrado de disco (save=False). Por motivos de seguridad y privacidad, el usuario que intente descargarlo posteriormente recibirá una notificación indicándole quién retiró el documento para que le solicite una copia directamente.
🇬🇧 English: Complete Freedec Guide
Welcome to the official Freedec documentation.
📑 Table of Contents (English)
- What is Freedec and what problem does it solve?
- System Prerequisites
- Quick Staging Sandbox
- Installation Options
- Step-by-Step Integration Guide
- Web GUI Usage & Lifecycle
- REST API Endpoints
- Production MEDIA Configuration (Nginx & Apache)
- FAQ & Security Operations
1. What is Freedec and what problem does it solve?
Sharing sensitive files using static passwords or conventional channels creates vulnerability windows: credentials can be leaked, files remain indefinitely on servers, and authorized recipients risk unauthorized third-party access.
Freedec resolves this using a Multi-User DEK Envelope architecture, dynamic Proof-of-Possession via 15-minute Magic Link / OTP, and irreversible physical deletion upon first download (Burn-After-Read):
- Multi-User Data Encryption Key (DEK) Architecture:
- Each document is encrypted once using a symmetric Data Encryption Key (
Fernet.generate_key()). - Individual digital envelopes (
user_envelopes) are constructed for every email inallowed_emails: the DEK is encrypted with a unique random user secret, and that secret is wrapped with the server master key (settings.FREEDEC_FERNET_KEY). - Eliminates static shared passwords.
- Each document is encrypted once using a symmetric Data Encryption Key (
- Dynamic Real-Time Proof-of-Possession:
- Recipients request access by submitting the
.encfile and their email. - Generates a 32-byte URL-safe token and a 6-digit OTP code with strict 15-minute expiration.
- Only the SHA-256 hash of the token is persisted in the database (Zero-Knowledge).
- Direct Magic Links (
/freedec/consumir/?t={token}) and OTP codes are delivered exclusively to the verified inbox.
- Recipients request access by submitting the
- Burn-After-Read & Configurable Destruction Policy:
- 'Burn on First Access' (FIRST_ACCESS): As soon as the first authorized recipient downloads the document, the physical
.encfile is permanently deleted from storage (document.encrypted_file.delete(save=False)). - 'Burn When All Have Accessed' (ALL_RECIPIENTS): Each authorized recipient receives exactly one download. The encrypted file is preserved on disk until all authorized recipients have claimed their copy, after which physical destruction is executed.
- The database record is updated to
is_consumed = True, logging full access audit records.
- 'Burn on First Access' (FIRST_ACCESS): As soon as the first authorized recipient downloads the document, the physical
- Post-Consumption Management:
- Subsequent access requests automatically email the requester with subject
[Freedec] Archivo ya retirado: {document_name}stating that the document '{document_name}' was already claimed by{consumed_by}on{consumed_at}and directing them to ask that person for a copy.
- Subsequent access requests automatically email the requester with subject
- Non-Destructive Administrative Access (Audit Bypass):
- Authenticated staff in Django Admin can download the decrypted original document using the server key without destroying the file and without setting
is_consumed = True, loggingadmin_inspeccion_preservada.
- Authenticated staff in Django Admin can download the decrypted original document using the server key without destroying the file and without setting
- Identical Hash Detection and Document Reactivation:
- Real-time browser detection: Selecting a file in the Django Admin upload form triggers an immediate client-side SHA-256 computation (WebCrypto API) against
check-file-hash/. If the file was previously uploaded, a direct link notice to the existing record is displayed. - Direct redirect & duplicate prevention: Submitting an identical file automatically redirects to the existing document record instead of creating redundant rows.
- Secure reactivation & re-encryption: Administrators can reactivate consumed files directly from the change view (
reupload_file) or by submitting the file again. Freedec generates a new DEK, re-encrypts the file in storage, resets consumption flags (is_consumed=False,consumed_recipients=[]), and generates fresh user envelopes. - Exclusive recipient assignment: Upon reactivation, the active recipient list (
allowed_emailsanduser_envelopes) contains only the newly specified recipients. Previous recipients no longer have active access. - Proactive pending access warnings: If reactivating a document that has not yet completed (recipients are still pending download), the system flashes a real-time warning banner with the list of pending recipients and a one-click button to re-add them to the recipient list so their access is not revoked.
- Comprehensive audit preservation: All prior access logs and history remain completely intact in
DocumentAccessLog, and a newreactivacion_documentoevent is logged detailing previous replaced recipients and newly enabled ones.
- Real-time browser detection: Selecting a file in the Django Admin upload form triggers an immediate client-side SHA-256 computation (WebCrypto API) against
2. System Prerequisites
- Python 3.11 or 3.12 (
python3 --version). - Poetry Package Manager:
curl -sSL https://install.python-poetry.org | python3 -
3. Quick Staging Sandbox
git clone https://github.com/jrubioh1/Freedec.git
cd Freedec
poetry install
poetry run python manage.py setup_staging
poetry run python manage.py runserver 8000
- Request Access: http://127.0.0.1:8000/freedec/
- Consume Document (Burn-After-Read): http://127.0.0.1:8000/freedec/consumir/
- Django Admin: http://127.0.0.1:8000/admin/ (
admin/admin123)
4. Installation Options
- Option 1: Copy
freedec/into your project and addcryptography+djangorestframework. - Option 2: Add via Git with Poetry:
poetry add git+https://github.com/jrubioh1/Freedec.git. - Option 3: Add as Git submodule:
git submodule add https://github.com/jrubioh1/Freedec.git apps/freedec.
5. Step-by-Step Integration Guide
- Generate Master Server Key:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
- Add to
settings.py:INSTALLED_APPS += ['rest_framework', 'freedec.apps.FreedecConfig'] FREEDEC_FERNET_KEY = os.environ.get("FREEDEC_FERNET_KEY", "YOUR_KEY==") FREEDEC_MAX_FILE_SIZE = 50 * 1024 * 1024 MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media'
- Mount URLs in
urls.py:path('freedec/', include('freedec.urls', namespace='freedec')),
- Run migrations:
poetry run python manage.py migrate
6. Web GUI Usage & Lifecycle
- Django Admin Upload: Staff uploads the document and specifies allowed emails. DEK and user envelopes are created automatically.
- Public Request: The recipient uploads the
.encfile and enters their email at/freedec/. Receives a 15-minute Magic Link and OTP. - Burn-After-Read Download: Clicking the Magic Link or submitting the OTP downloads the original document and immediately deletes the
.encfile from disk. - Preserved Admin Download: Staff can click
🔓 Original (Admin)in Django Admin to download a decrypted copy without destroying the file.
7. REST API Endpoints
1. Request Access (POST /freedec/public/request-access/)
curl -X POST http://127.0.0.1:8000/freedec/public/request-access/ \
-F "file=@contract.pdf.enc" \
-F "email=auditor@corp.com"
2. Direct Magic Link Consumption (GET /freedec/api/public/consume/?t=...)
curl -OJ "http://127.0.0.1:8000/freedec/api/public/consume/?t=TOKEN_URLSAFE"
3. OTP Code Consumption (POST /freedec/api/public/consume/)
curl -X POST http://127.0.0.1:8000/freedec/api/public/consume/ \
-H "Content-Type: application/json" \
-d '{"otp_code": "123456", "email": "auditor@corp.com"}' \
--output original_document.pdf
8. Production MEDIA Configuration (Nginx & Apache)
In production (DEBUG = False), web servers like Nginx or Apache must serve /media/ directly from disk storage with autoindex off and script execution blocked.
9. FAQ & Security Operations
- What happens if a Magic Link expires? All tokens strictly expire after 15 minutes. The user must request access again.
- Can a consumed file be recovered? No. Burn-after-read physically deletes the binary file from disk.
Release files for freedec 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| freedec-1.1.0.tar.gz | 99.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| freedec-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 213.0 kB
Release files / freedec-1.1.0.tar.gz
| Download URL | freedec-1.1.0.tar.gz |
|---|---|
| Size | 99.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0e998723d2927c6b314d7ec2f3322c6fff41d01fe3a4cbcb2073ad118db36658
|
|
BLAKE2b-256 checksum How to use checksums |
273fa2642fd8b75c65f0d08846d47844c12cbc61aeee1fc6ea30a68ed1c6ced8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.3 CPython/3.14.7 Linux/7.2.6-gentoo-dist-hardened
|
Release files / freedec-1.1.0-py3-none-any.whl
| Download URL | freedec-1.1.0-py3-none-any.whl |
|---|---|
| Size | 114.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
01e49161df02afb3198c067574c84172516cae4707659645072381fe83f72904
|
|
BLAKE2b-256 checksum How to use checksums |
0e0c87aa840c5dbdaa5b5522f4b181661fc0e589a24ffa2605afdb2ebdf10d9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.3 CPython/3.14.7 Linux/7.2.6-gentoo-dist-hardened
|