# Issue #003: Administración avanzada de cookies del perfil **Tipo**: Enhancement **Prioridad**: Media **Estado**: Pendiente ## Descripción Mejorar las capacidades de gestión de cookies persistentes en perfiles de navegador, permitiendo importar/exportar y gestionar cookies antes y después del lanzamiento del navegador. ## Funcionalidad deseada ### Gestión de cookies en runtime (ya implementado parcialmente) - ✅ `GetCookies()` - Obtener cookies de URLs específicas - ✅ `SetCookie()` - Establecer cookies individuales - ✅ `ClearCookies()` - Limpiar todas las cookies ### Nuevas funcionalidades necesarias #### Importar/Exportar - Exportar todas las cookies del perfil a archivo JSON - Importar cookies desde archivo JSON - Formato compatible con extensiones de Chrome (EditThisCookie, etc.) - Soportar formato Netscape (cookies.txt) #### Gestión offline de perfiles - Leer cookies del perfil sin lanzar navegador - Modificar cookies del perfil en disco - Copiar cookies entre perfiles - Backup/restore de cookies #### Filtrado y búsqueda - Listar todas las cookies del perfil actual - Filtrar cookies por dominio - Filtrar cookies por nombre - Buscar cookies por patrón #### Configuración previa al lanzamiento - Establecer cookies iniciales antes de lanzar navegador - Cargar cookies desde archivo al inicio - Configurar cookies de sesión específicas ## Implementación técnica ### Archivos sugeridos - `pkg/browser/profile_cookies.go` - Gestión avanzada - `pkg/browser/cookie_import_export.go` - I/O de archivos ### API propuesta ```go // === Gestión en runtime === // GetAllCookies obtiene todas las cookies del navegador actual func (b *Browser) GetAllCookies(ctx context.Context) ([]*Cookie, error) // FilterCookies obtiene cookies que coinciden con filtros func (b *Browser) FilterCookies(ctx context.Context, filter CookieFilter) ([]*Cookie, error) type CookieFilter struct { Domain string // Filtrar por dominio (ej: ".example.com") Name string // Filtrar por nombre exacto Pattern string // Regex para nombre o valor } // === Import/Export === // ExportCookies exporta cookies a archivo JSON func (b *Browser) ExportCookies(ctx context.Context, filepath string, format CookieFormat) error // ImportCookies importa cookies desde archivo func (b *Browser) ImportCookies(ctx context.Context, filepath string, format CookieFormat) error type CookieFormat string const ( CookieFormatJSON CookieFormat = "json" // JSON estándar CookieFormatNetscape CookieFormat = "netscape" // cookies.txt CookieFormatChrome CookieFormat = "chrome" // Formato EditThisCookie ) // === Gestión offline de perfiles === // Profile representa un perfil de navegador type Profile struct { Name string Path string } // ListProfiles lista todos los perfiles disponibles func ListProfiles() ([]Profile, error) // GetProfileCookies lee cookies de un perfil sin lanzar navegador func GetProfileCookies(profilePath string) ([]*Cookie, error) // SetProfileCookies escribe cookies en un perfil sin lanzar navegador func SetProfileCookies(profilePath string, cookies []*Cookie) error // CopyProfileCookies copia cookies entre perfiles func CopyProfileCookies(srcProfile, dstProfile string) error // === Configuración inicial === // LaunchWithCookies lanza navegador con cookies precargadas func LaunchWithCookies(ctx context.Context, config *Config, cookiesFile string) (*Browser, error) // Config.InitialCookies - campo para establecer cookies al inicio type Config struct { // ... campos existentes ... InitialCookies []*Cookie // Cookies a establecer al lanzar CookiesFile string // Archivo de cookies a cargar } ``` ### Formato JSON de cookies ```json [ { "name": "session_id", "value": "abc123", "domain": ".example.com", "path": "/", "expires": 1735689600, "httpOnly": true, "secure": true, "sameSite": "Lax" } ] ``` ### Ubicación de cookies en perfil Chrome ``` ~/.navegator/profiles// ├── Cookies # Base de datos SQLite con cookies ├── Cookies-journal # Journal de transacciones └── ... ``` ## Casos de uso ### Caso 1: Migrar sesión entre perfiles ```go // Exportar cookies del perfil A browserA.ExportCookies(ctx, "session.json", CookieFormatJSON) // Importar en perfil B browserB.ImportCookies(ctx, "session.json", CookieFormatJSON) ``` ### Caso 2: Backup de sesión autenticada ```go // Guardar estado de sesión actual b.ExportCookies(ctx, "backup_session.json", CookieFormatJSON) // Restaurar más tarde b2.ImportCookies(ctx, "backup_session.json", CookieFormatJSON) ``` ### Caso 3: Lanzar con sesión precargada ```go config := browser.DefaultConfig() config.CookiesFile = "authenticated_session.json" b, _ := browser.Launch(ctx, config) // Ya está autenticado al iniciar ``` ### Caso 4: Sincronizar cookies entre máquinas ```go // Máquina A - exportar GetProfileCookies("~/.navegator/profiles/main").Export("cookies.json") // Máquina B - importar SetProfileCookies("~/.navegator/profiles/main", LoadCookies("cookies.json")) ``` ## Consideraciones de seguridad ⚠️ **Importante**: Las cookies pueden contener tokens de sesión y datos sensibles - Advertir al usuario sobre seguridad de archivos exportados - Opción para encriptar archivos de cookies - No guardar cookies de sesión por defecto - Limpiar cookies sensibles en exports ## Referencias - CDP Network.getCookies: https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-getCookies - CDP Storage.getCookies: https://chromedevtools.github.io/devtools-protocol/tot/Storage/#method-getCookies - Chrome Cookies DB: SQLite format - Netscape cookies.txt: http://fileformats.archiveteam.org/wiki/Netscape_cookies.txt