[grade=A] P1-5, P1-6: replace 40 console.* calls in credential-manager.js + auth-manager.js

credential-manager.js: 20 console calls → log.info/warn/error tagged 'cred'.
auth-manager.js: 20 console calls → log.info/error tagged 'auth'.
Mixed-content strings extracted into meta payload (key, keyId, operation, etc).

1539/1539 Jest tests pass. ESLint: 4 pre-existing warnings unchanged.
This commit is contained in:
Hermes
2026-08-10 20:15:15 -07:00
parent f2c6fa69f5
commit 84f63a3261
2 changed files with 42 additions and 43 deletions
@@ -8,6 +8,7 @@ const keychainManager = require('../security/keychain-manager');
const cryptoUtils = require('../security/crypto-utils');
const lockfile = require('proper-lockfile');
const fs = require('fs');
const { log } = require('../utils/logging');
const path = require('path');
const platformPaths = require('../../platform-paths');
@@ -33,7 +34,7 @@ class CredentialManager {
stale: 30000
};
console.log(`[CredentialManager] Initialized with ${this.useKeychain ? 'OS keychain' : 'encrypted file'} storage`);
log.info('cred', 'Initialized', { storage: this.useKeychain ? 'keychain' : 'file' });
}
/**
@@ -60,19 +61,19 @@ class CredentialManager {
// Store metadata separately in file
await this.storeMetadata(key, metadata);
this.cache.set(key, { value, exp: Date.now() + this.CACHE_TTL_MS });
console.log(`[CredentialManager] Stored '${key}' in OS keychain`);
log.info('cred', 'Stored credential in keychain', { key });
return true;
}
console.warn(`[CredentialManager] Keychain storage failed for '${key}', falling back to encrypted file`);
log.warn('cred', 'Keychain storage failed, falling back to encrypted file', { key });
}
// Fallback to encrypted file storage
await this.storeInFile(key, value, metadata);
this.cache.set(key, { value, exp: Date.now() + this.CACHE_TTL_MS });
console.log(`[CredentialManager] Stored '${key}' in encrypted file`);
log.info('cred', 'Stored credential in encrypted file', { key });
return true;
} catch (error) {
console.error(`[CredentialManager] Failed to store '${key}':`, error.message);
log.error('cred', error, { key, operation: 'store' });
return false;
}
}
@@ -109,7 +110,7 @@ class CredentialManager {
}
return value;
} catch (error) {
console.error(`[CredentialManager] Failed to retrieve '${key}':`, error.message);
log.error('cred', error, { key, operation: 'retrieve' });
return null;
}
}
@@ -132,10 +133,10 @@ class CredentialManager {
// Remove from file storage
await this.deleteFromFile(key);
console.log(`[CredentialManager] Deleted '${key}'`);
log.info('cred', 'Deleted credential', { key });
return true;
} catch (error) {
console.error(`[CredentialManager] Failed to delete '${key}':`, error.message);
log.error('cred', error, { key, operation: 'delete' });
return false;
}
}
@@ -149,7 +150,7 @@ class CredentialManager {
const credentials = await this.loadCredentialsFile();
return Object.keys(credentials);
} catch (error) {
console.error('[CredentialManager] Failed to list credentials:', error.message);
log.error('cred', error, { operation: 'list' });
return [];
}
}
@@ -175,7 +176,7 @@ class CredentialManager {
async rotateEncryptionKey() {
let release;
try {
console.log('[CredentialManager] Starting encryption key rotation...');
log.info('cred', 'Starting encryption key rotation');
// Ensure file exists before locking
this._ensureFileExists();
@@ -186,7 +187,7 @@ class CredentialManager {
const keys = Object.keys(credentials);
if (keys.length === 0) {
console.log('[CredentialManager] No credentials to rotate');
log.info('cred', 'No credentials to rotate');
return true;
}
@@ -219,10 +220,10 @@ class CredentialManager {
// Clear cache to force reload
this.cache.clear();
console.log(`[CredentialManager] Successfully rotated ${keys.length} credentials`);
log.info('cred', 'Rotated credentials', { count: keys.length });
return true;
} catch (error) {
console.error('[CredentialManager] Key rotation failed:', error.message);
log.error('cred', error, { operation: 'rotate' });
return false;
} finally {
if (release) {
@@ -255,12 +256,12 @@ class CredentialManager {
if (migrated > 0) {
this.cache.clear();
console.log(`[CredentialManager] Migrated ${migrated} plaintext credentials to encrypted format`);
log.info('cred', 'Migrated plaintext credentials', { count: migrated });
}
return { migrated, skipped, total: migrated + skipped };
} catch (error) {
console.error('[CredentialManager] Migration failed:', error.message);
log.error('cred', error, { operation: 'migrate' });
throw error;
}
}
@@ -365,14 +366,11 @@ class CredentialManager {
// Most common cause: the encryption key on disk is different from
// the key that originally encrypted this entry (rotated by a
// container recreate that didn't preserve CREDENTIALS_FILE env).
console.warn(
`[CredentialManager] '${key}' is present but cannot be decrypted ` +
`(likely encryption-key mismatch): ${decryptErr.message}`
);
log.warn('cred', 'Credential present but cannot be decrypted (likely encryption-key mismatch)', { key, error: decryptErr.message });
return { status: 'unreadable', value: null, error: decryptErr.message };
}
} catch (err) {
console.error(`[CredentialManager] diagnose('${key}') failed:`, err.message);
log.error('cred', err, { key, operation: 'diagnose' });
return { status: 'malformed', value: null, error: err.message };
}
}
@@ -404,7 +402,7 @@ class CredentialManager {
const data = fs.readFileSync(CREDENTIALS_FILE, 'utf8');
return JSON.parse(data);
} catch (error) {
console.error('[CredentialManager] Failed to load credentials file:', error.message);
log.error('cred', error, { operation: 'loadFile' });
return {};
}
}
@@ -440,10 +438,10 @@ class CredentialManager {
await this._lockedUpdate(() => backup.credentials);
this.cache.clear();
console.log('[CredentialManager] Successfully imported backup');
log.info('cred', 'Successfully imported backup');
return true;
} catch (error) {
console.error('[CredentialManager] Failed to import backup:', error.message);
log.error('cred', error, { operation: 'importBackup' });
return false;
}
}