feat(browser): auto-commit con 178 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
---
|
||||
name: browser_profile_open
|
||||
kind: function
|
||||
lang: py
|
||||
domain: browser
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "def browser_profile_open(profile_dir: str, url: str | None = None, base_url: str = 'http://127.0.0.1:8771', dry_run: bool = False) -> dict"
|
||||
description: "Lanza Chromium en un perfil del catalogo osint_db y devuelve sus cuentas/secret_refs para que el operador sepa que credenciales usar. Compone browser_profile_show para leer la metadata del perfil (resuelve user_data_dir) y sus cuentas, luego lanza Chromium con --profile-directory via systemd-run --user --scope -- (proceso aislado, en background, para evitar exit-144). Gotcha del entorno: el wrapper /usr/bin/chromium ya inyecta --user-data-dir=$HOME/.config/chromium-cdp via /etc/chromium.d/cdp; por eso solo pasa --user-data-dir explicito cuando el perfil usa un dir distinto del default. Con dry_run=True no lanza nada: devuelve el comando que lanzaria. NUNCA resuelve el secreto: solo expone el secret_ref. Impura (red + lanza proceso). No lanza excepciones: devuelve dict de estado."
|
||||
tags: [browser-profiles, osint, chromium, launcher, multicuenta]
|
||||
uses_functions: [browser_profile_show_py_browser]
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_py_core"
|
||||
imports: []
|
||||
tested: true
|
||||
tests: ["test_dry_run_default_user_data_dir_no_pasa_user_data_dir", "test_dry_run_custom_user_data_dir_pasa_flag_explicito", "test_dry_run_user_data_dir_default_explicito_no_se_pasa", "test_error_perfil_no_existe_propaga_sin_lanzar"]
|
||||
test_file_path: "python/functions/browser/browser_profile_open_test.py"
|
||||
file_path: "python/functions/browser/browser_profile_open.py"
|
||||
params:
|
||||
- name: profile_dir
|
||||
desc: "Nombre del directorio real del perfil Chromium (ej. 'Profile 1', 'osint_01'). Debe existir en el catalogo osint_db."
|
||||
- name: url
|
||||
desc: "URL a abrir al arrancar (ej. 'https://mail.google.com'). Se anade al final del comando. None -> arranca sin URL."
|
||||
- name: base_url
|
||||
desc: "Base del service osint_db. Default http://127.0.0.1:8771."
|
||||
- name: dry_run
|
||||
desc: "Si True NO lanza nada y devuelve el comando (lista de args) que lanzaria. Util para testear sin abrir navegador y para revisar el comando antes de ejecutar."
|
||||
output: "dict de estado. Caso dry_run ok: {status:'ok', profile_dir, cmd: list[str] (argv que lanzaria), accounts: list de {service, identity, secret_ref, role}}. Caso real ok: {status:'ok', profile_dir, launched: True, cmd: list[str], accounts: [...]}. Caso perfil no existe / service caido: {status:'error', error: str} (no lanza navegador). secret_ref es REFERENCIA al secreto, nunca el password."
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join("python", "functions"))
|
||||
from browser.browser_profile_open import browser_profile_open
|
||||
|
||||
# dry_run: ver el comando sin abrir nada
|
||||
preview = browser_profile_open("Profile 1", url="https://mail.google.com", dry_run=True)
|
||||
print(preview["cmd"])
|
||||
# ['systemd-run','--user','--scope','--','chromium',
|
||||
# '--profile-directory=Profile 1','https://mail.google.com']
|
||||
for a in preview["accounts"]:
|
||||
print(a["service"], a["identity"], a["secret_ref"]) # resuelve tu con: pass show ...
|
||||
|
||||
# real: lanza Chromium en el perfil (proceso aislado, no bloquea)
|
||||
res = browser_profile_open("Profile 1", url="https://mail.google.com")
|
||||
print(res["launched"]) # True
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Cuando vayas a operar con una cuenta de un perfil OSINT concreto: abre Chromium en ese
|
||||
perfil con su contexto (cookies/sesiones aislados) y obten de golpe los `secret_ref` de
|
||||
las cuentas para saber que credenciales usar. Usa `dry_run=True` primero para revisar el
|
||||
comando o para testear sin abrir el navegador. Es el ultimo paso del grupo
|
||||
`browser-profiles` tras registrar (`browser_profile_register`) e inspeccionar
|
||||
(`browser_profile_show`).
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Impura**: hace red (lee metadata del service osint_db, que debe estar vivo en
|
||||
`http://127.0.0.1:8771`) y LANZA un proceso. Si el service esta caido o el perfil no
|
||||
existe, propaga `{status:'error', ...}` sin abrir navegador.
|
||||
- **exit-144 si lanzas chromium directo**: en este entorno lanzar chromium como hijo da
|
||||
exit-144. Por eso SIEMPRE se lanza via `systemd-run --user --scope --` (proceso aislado),
|
||||
en background, sin esperar. No bloquea al operador.
|
||||
- **Wrapper chromium-cdp**: `/usr/bin/chromium` ya inyecta
|
||||
`--user-data-dir=$HOME/.config/chromium-cdp` y `--remote-debugging-port=9222` via
|
||||
`/etc/chromium.d/cdp`. Si el `user_data_dir` del perfil ES ese default, la funcion NO
|
||||
pasa `--user-data-dir` (lo hereda el wrapper); si es OTRO directorio, lo pasa explicito.
|
||||
- **secret_ref NUNCA es el password**: la funcion solo expone la REFERENCIA (ej.
|
||||
`"pass show osint/p1/gmail"`). El humano/otra herramienta resuelve el secreto con `pass`.
|
||||
- **dry_run no abre nada**: con `dry_run=True` no se lanza el proceso; util para test y
|
||||
revision. En ese modo el dict NO trae `launched`.
|
||||
- **El codigo HTTP NO indica exito**: el service responde SIEMPRE HTTP 200 con body
|
||||
`{status:ok|error}`; se parsea el body (via browser_profile_show).
|
||||
|
||||
## Notas
|
||||
|
||||
Compone `browser_profile_show_py_browser` (mismo paquete: `from
|
||||
browser.browser_profile_show import browser_profile_show`) para leer metadata + cuentas.
|
||||
El default del wrapper se compara con `os.path.normpath` tras expandir `~`, asi que una
|
||||
fila con `user_data_dir="~/.config/chromium-cdp"` tampoco fuerza el flag. Usa
|
||||
`subprocess.Popen` con `start_new_session=True` y stdout/stderr a DEVNULL para el
|
||||
lanzamiento desacoplado.
|
||||
Reference in New Issue
Block a user