Files
fn_registry/python/functions/pipelines/add_contact_dav.md
T
egutierrez 763e06c127 feat(browser): auto-commit con 178 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-20 18:22:23 +02:00

4.2 KiB

name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags params output uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path
add_contact_dav pipeline py pipelines 1.0.0 impure def add_contact_dav(name: str, *, tels=None, emails=None, adrs=None, org='', note='', uid='', base_url=DEFAULT_BASE_URL, username=DEFAULT_USERNAME, collection_path=DEFAULT_COLLECTION, secret_path='dav/xandikos-enmanuel', timeout_s=20.0, verify_tls=True) -> dict One-shot que anade UN contacto a la libreta CardDAV de Enmanuel (Xandikos) en una sola llamada. Compone build_vcard + contact_import_key + pass_get_secret + carddav_put_vcard. Idempotente por uid: re-anadir el mismo contacto sobrescribe, no duplica. La contrasena se resuelve desde pass y nunca se logea.
dav
carddav
vcard
contact
contacts
pipelines
name desc
name Nombre completo del contacto (FN del vCard). Obligatorio.
name desc
tels Telefono(s). Acepta lista, string suelto o None.
name desc
emails Email(s). Acepta lista, string suelto o None.
name desc
adrs Direccion(es). Acepta lista, string suelto o None.
name desc
org Organizacion (ORG). Vacio = se omite.
name desc
note Nota libre (NOTE). Vacio = se omite.
name desc
uid UID explicito del vCard. Vacio => se calcula con contact_import_key (telefono > email > nombre) para idempotencia.
name desc
base_url URL base del servidor DAV. Default = libreta CardDAV de Enmanuel.
name desc
username Usuario HTTP Basic. Default = enmanuel.
name desc
collection_path Ruta de la coleccion CardDAV destino.
name desc
secret_path Ruta del secreto en pass cuya primera linea es la contrasena CardDAV.
name desc
timeout_s Timeout del PUT en segundos. Default 20.0.
name desc
verify_tls Si True (default) verifica el certificado TLS. No desactivar fuera de pruebas.
dict. Exito: {status:'ok', http_status:int, url:str, uid:str}. Error (sin lanzar): {status:'error', error:str, uid:str, http_status:int|None}. Si la pass no se encuentra, devuelve error sin tocar la red.
build_vcard_py_core
contact_import_key_py_core
carddav_put_vcard_py_infra
pass_get_secret_py_infra
false error_go_core
false
python/functions/pipelines/add_contact_dav.py

Ejemplo

# Anadir un contacto en una sola llamada (uid determinista por telefono):
./fn run add_contact_dav --name "Juan Perez" --tel +34600111222 --email juan@example.com --org "ACME"

# Multi-valor: --tel y --email son repetibles -> se serializan como listas.
./fn run add_contact_dav --name "Maria Lopez" \
  --tel +34611000111 --tel +34922000222 \
  --email maria@example.com --email m.lopez@work.com \
  --note "Conocida del evento OSINT"

Salida (JSON): {"status": "ok", "http_status": 201, "url": "https://dav-.../enmanuel/contacts/addressbook/v1-<hash>.vcf", "uid": "v1-<hash>"}.

Cuando usarla

Usala cuando quieras dar de alta o actualizar UN contacto en la libreta CardDAV de Enmanuel sin montar el flujo a mano (serializar vCard, sacar la pass, PUT). Si re-ejecutas con el mismo telefono/email (o el mismo --uid), el contacto se sobrescribe en vez de duplicarse. Para importar muchos contactos de golpe, este pipeline no es lo idoneo: llamalo en bucle o construye un pipeline batch.

Gotchas

  • Escritura remota real: hace un HTTP PUT contra el servidor DAV. No es un dry-run. Cada llamada con status:'ok' ha creado/actualizado un recurso real.
  • Idempotencia por uid: si no pasas --uid, el UID se deriva de forma determinista (telefono > email > nombre). Mismo telefono/email = mismo recurso = sobrescritura. Distinto telefono pero mismo nombre = recurso distinto.
  • Secreto desde pass, nunca hardcode: la contrasena se lee de pass show dav/xandikos-enmanuel (configurable con secret_path). Nunca se logea ni aparece en el dict de retorno. Si pass falla o la entry no existe, devuelve {status:'error'} sin tocar la red.
  • verify_tls: por defecto verifica el certificado TLS. --no-verify-tls solo para pruebas controladas; nunca contra el servidor real de produccion.