You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Auditoría de seguridad del CLI identificó varios puntos de mejora en validación de inputs, manejo de errores y operaciones de archivo. No hay vulnerabilidades críticas, pero hay gaps que deben cerrarse antes de release.
Motivation
Un CLI que maneja credenciales y procesa archivos del usuario debe seguir las mejores prácticas de seguridad. Estos fixes previenen crashes inesperados, posibles SSRF, y pérdida accidental de datos por sobreescritura de archivos.
Audit Findings
Lo que ya está bien (no requiere cambios)
✅ Credenciales almacenadas con permisos 0o600 + doble chmod
✅ API keys siempre maskeadas en output (maskApiKey())
✅ Errores no filtran stack traces, paths internos ni API keys
✅ Input interactivo en login con raw mode (sin echo)
✅ Dependencias mínimas y sin vulnerabilidades conocidas
✅ Environment variables manejadas correctamente
Issues a remediar
#
Severidad
Issue
Ubicación
1
Media
JSON.parse() sin try/catch en --metadata
convert.ts:40, steps/run.ts:40
2
Media-Baja
Webhook URL sin validación de formato
convert.ts:39, steps/run.ts:39
3
Baja
types export -o sobreescribe archivos sin aviso
types/export.ts:33
4
Best practice
No hay validación de existencia de archivo antes de readFileSync
convert.ts, identify.ts, steps/run.ts
5
Best practice
Error handling repetido sin base command
todos los commands
Acceptance Criteria
--metadata '{"invalid' muestra error claro en vez de crash con stack trace
--webhook-url valida formato URL antes de enviar al SDK
types export -o file.json advierte si el archivo ya existe (flag --force para sobreescribir)
Archivos inexistentes como source muestran error descriptivo antes de llamar al SDK
Validaciones centralizadas en helpers reutilizables
exportfunctionvalidateUrl(value: string,flagName: string): string{try{consturl=newURL(value)if(!['http:','https:'].includes(url.protocol)){thrownewError(`${flagName} must use http or https protocol`)}returnurl.toString()}catch(error){if(errorinstanceofTypeError){thrownewError(`Invalid URL in ${flagName}: ${value}`)}throwerror}}
3. Protección contra sobreescritura de archivos
Archivo: src/commands/types/export.ts
// Agregar flag --forcestaticflags={output: Flags.string({char: 'o',description: 'Output file path'}),force: Flags.boolean({description: 'Overwrite existing file',default: false}),}// Antes de escribir:if(flags.output){if(!flags.force&&existsSync(flags.output)){thrownewError(`File already exists: ${flags.output}. Use --force to overwrite.`)}writeFileSync(flags.output, ...)}
exportfunctionvalidateSource(source: string): {isUrl: boolean}{constisUrl=source.startsWith('http://')||source.startsWith('https://')if(!isUrl){if(!existsSync(source)){thrownewError(`File not found: ${source}`)}// Opcional: verificar que es archivo, no directorioif(statSync(source).isDirectory()){thrownewError(`Expected a file, got a directory: ${source}`)}}return{isUrl}}
Description
Auditoría de seguridad del CLI identificó varios puntos de mejora en validación de inputs, manejo de errores y operaciones de archivo. No hay vulnerabilidades críticas, pero hay gaps que deben cerrarse antes de release.
Motivation
Un CLI que maneja credenciales y procesa archivos del usuario debe seguir las mejores prácticas de seguridad. Estos fixes previenen crashes inesperados, posibles SSRF, y pérdida accidental de datos por sobreescritura de archivos.
Audit Findings
Lo que ya está bien (no requiere cambios)
maskApiKey())Issues a remediar
JSON.parse()sin try/catch en--metadataconvert.ts:40,steps/run.ts:40convert.ts:39,steps/run.ts:39types export -osobreescribe archivos sin avisotypes/export.ts:33readFileSyncconvert.ts,identify.ts,steps/run.tsAcceptance Criteria
--metadata '{"invalid'muestra error claro en vez de crash con stack trace--webhook-urlvalida formato URL antes de enviar al SDKtypes export -o file.jsonadvierte si el archivo ya existe (flag--forcepara sobreescribir)Technical Approach
1. Validación de JSON metadata
Archivos:
src/commands/convert.ts,src/commands/steps/run.tsHelper en
src/validators.ts:2. Validación de webhook URL
Archivos:
src/commands/convert.ts,src/commands/steps/run.ts3. Protección contra sobreescritura de archivos
Archivo:
src/commands/types/export.ts4. Validación de existencia de archivo source
Archivos:
src/commands/convert.ts,src/commands/identify.ts,src/commands/steps/run.ts5. Módulo de validación centralizado
Crear
src/validators.tscon todos los helpers:Affected Components
src/validators.ts(nuevo): Módulo centralizado de validaciónsrc/commands/convert.ts: Validar metadata, webhook URL, source filesrc/commands/identify.ts: Validar source filesrc/commands/steps/run.ts: Validar metadata, webhook URL, source filesrc/commands/types/export.ts: Flag--forcey check de sobreescrituraImplementation Checklist
src/validators.tsconparseJsonFlag(),validateUrl(),validateSource()parseJsonFlag()en convert.ts y steps/run.tsvalidateUrl()para--webhook-urlen convert.ts y steps/run.tsvalidateSource()en convert.ts, identify.ts y steps/run.ts--forceflag a types/export.ts con check de existenciasrc/validators.tsTesting Strategy
validators.ts: cada función con inputs válidos e inválidosconvert file.pdf --type inv --metadata '{"bad'→ error JSON claroconvert file.pdf --type inv --webhook-url not-a-url→ error URLconvert nonexistent.pdf --type inv→ "File not found: nonexistent.pdf"types export code -o existing-file.json→ error de sobreescrituratypes export code -o existing-file.json --force→ éxitoDependencies
URL,existsSync,statSyncdel stdlib de NodeConsiderations
types export -oque ahora requiere--forcepara sobreescribir. Aceptable en v0.1.0outputError()para mantener JSON en stderr (coherente con issue feat: human-friendly terminal output with auto-detect TTY and --json flag #8)Definition of Done
🤖 Generated with Claude Code