Remove more logs
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
* Two-file architecture:
|
||||
* 1. Load nostr.bundle.js (official nostr-tools bundle)
|
||||
* 2. Load nostr-lite.js (this file - NOSTR_LOGIN_LITE library with CSS-only themes)
|
||||
* Generated on: 2025-11-14T18:31:40.699Z
|
||||
* Generated on: 2025-11-14T18:40:05.334Z
|
||||
*/
|
||||
|
||||
// Verify dependencies are loaded
|
||||
@@ -436,7 +436,7 @@ class Modal {
|
||||
modalContent.appendChild(modalHeader);
|
||||
// Add version element in bottom-right corner aligned with modal body
|
||||
const versionElement = document.createElement('div');
|
||||
versionElement.textContent = 'v0.1.11';
|
||||
versionElement.textContent = 'v0.1.12';
|
||||
versionElement.style.cssText = `
|
||||
position: absolute;
|
||||
bottom: 8px;
|
||||
@@ -2898,7 +2898,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
async init(options = {}) {
|
||||
console.log('NOSTR_LOGIN_LITE: Initializing with options:', options);
|
||||
// console.log('NOSTR_LOGIN_LITE: Initializing with options:', options);
|
||||
|
||||
this.options = {
|
||||
theme: 'default',
|
||||
@@ -2946,12 +2946,12 @@ class NostrLite {
|
||||
|
||||
// Create modal during init (matching original git architecture)
|
||||
this.modal = new Modal(this.options);
|
||||
console.log('NOSTR_LOGIN_LITE: Modal created during init');
|
||||
// console.log('NOSTR_LOGIN_LITE: Modal created during init');
|
||||
|
||||
// Initialize floating tab if enabled
|
||||
if (this.options.floatingTab.enabled) {
|
||||
this.floatingTab = new FloatingTab(this.modal, this.options.floatingTab);
|
||||
console.log('NOSTR_LOGIN_LITE: Floating tab initialized');
|
||||
// console.log('NOSTR_LOGIN_LITE: Floating tab initialized');
|
||||
}
|
||||
|
||||
// Attempt to restore authentication state if persistence is enabled (AFTER facade is ready)
|
||||
@@ -2963,7 +2963,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
this.initialized = true;
|
||||
console.log('NOSTR_LOGIN_LITE: Initialization complete');
|
||||
// console.log('NOSTR_LOGIN_LITE: Initialization complete');
|
||||
|
||||
return this;
|
||||
}
|
||||
@@ -3098,7 +3098,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
launch(startScreen = 'login') {
|
||||
console.log('NOSTR_LOGIN_LITE: Launching with screen:', startScreen);
|
||||
// console.log('NOSTR_LOGIN_LITE: Launching with screen:', startScreen);
|
||||
|
||||
if (this.modal) {
|
||||
this.modal.open({ startScreen });
|
||||
@@ -3110,18 +3110,14 @@ class NostrLite {
|
||||
// Attempt to restore authentication state
|
||||
async _attemptAuthRestore() {
|
||||
try {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: === _attemptAuthRestore START ===');
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: hasExtension:', this.hasExtension);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: facadeInstalled:', this.facadeInstalled);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: window.nostr:', window.nostr?.constructor?.name);
|
||||
|
||||
|
||||
if (this.hasExtension) {
|
||||
// EXTENSION MODE: Use custom extension persistence logic
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Extension mode - using extension-specific restore');
|
||||
|
||||
const restoredAuth = await this._attemptExtensionRestore();
|
||||
|
||||
if (restoredAuth) {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ✅ Extension auth restored successfully!');
|
||||
return restoredAuth;
|
||||
} else {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ❌ Extension auth could not be restored');
|
||||
@@ -3133,14 +3129,11 @@ class NostrLite {
|
||||
const restoredAuth = await window.nostr.restoreAuthState();
|
||||
|
||||
if (restoredAuth) {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ✅ Facade auth restored successfully!');
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Method:', restoredAuth.method);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Pubkey:', restoredAuth.pubkey);
|
||||
|
||||
|
||||
// CRITICAL FIX: Activate facade resilience system for non-extension methods
|
||||
// Extensions like nos2x can override our facade after page refresh
|
||||
if (restoredAuth.method === 'local' || restoredAuth.method === 'nip46') {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: 🛡️ Activating facade resilience system for page refresh');
|
||||
this._activateResilienceProtection(restoredAuth.method);
|
||||
}
|
||||
|
||||
@@ -3272,7 +3265,7 @@ class NostrLite {
|
||||
|
||||
// Show prompt for NIP-46 reconnection
|
||||
_showReconnectionPrompt(authData) {
|
||||
console.log('NOSTR_LOGIN_LITE: Showing reconnection prompt for NIP-46');
|
||||
|
||||
|
||||
// Dispatch event that UI can listen to
|
||||
if (typeof window !== 'undefined') {
|
||||
@@ -3417,8 +3410,7 @@ class AuthManager {
|
||||
// Save authentication state using unified plaintext approach
|
||||
async saveAuthState(authData) {
|
||||
try {
|
||||
// console.log('🔐 AuthManager: Saving auth state with plaintext storage');
|
||||
console.warn('🔐 SECURITY: Private key will be stored unencrypted for maximum usability');
|
||||
|
||||
|
||||
const authState = {
|
||||
method: authData.method,
|
||||
@@ -3434,15 +3426,14 @@ class AuthManager {
|
||||
hasGetPublicKey: typeof authData.extension?.getPublicKey === 'function',
|
||||
hasSignEvent: typeof authData.extension?.signEvent === 'function'
|
||||
};
|
||||
// console.log('🔐 AuthManager: Extension method - storing verification data only');
|
||||
|
||||
break;
|
||||
|
||||
case 'local':
|
||||
// UNIFIED PLAINTEXT: Store secret key directly for maximum compatibility
|
||||
if (authData.secret) {
|
||||
authState.secret = authData.secret;
|
||||
// console.log('🔐 AuthManager: Local method - storing secret key in plaintext');
|
||||
console.warn('🔐 SECURITY: Secret key stored unencrypted for developer convenience');
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -3454,7 +3445,7 @@ class AuthManager {
|
||||
relays: authData.signer.relays,
|
||||
// Don't store secret - user will need to reconnect
|
||||
};
|
||||
// console.log('🔐 AuthManager: NIP-46 method - storing connection parameters');
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -3480,11 +3471,10 @@ class AuthManager {
|
||||
// Restore authentication state on page load
|
||||
async restoreAuthState() {
|
||||
try {
|
||||
console.log('🔍 AuthManager: === restoreAuthState START ===');
|
||||
console.log('🔍 AuthManager: storageKey:', this.storageKey);
|
||||
|
||||
|
||||
const stored = this.storage.getItem(this.storageKey);
|
||||
console.log('🔍 AuthManager: Storage raw value:', stored);
|
||||
|
||||
|
||||
if (!stored) {
|
||||
console.log('🔍 AuthManager: ❌ No stored auth state found');
|
||||
@@ -3492,10 +3482,7 @@ class AuthManager {
|
||||
}
|
||||
|
||||
const authState = JSON.parse(stored);
|
||||
console.log('🔍 AuthManager: ✅ Parsed stored auth state:', authState);
|
||||
console.log('🔍 AuthManager: Method:', authState.method);
|
||||
console.log('🔍 AuthManager: Timestamp:', authState.timestamp);
|
||||
console.log('🔍 AuthManager: Age (ms):', Date.now() - authState.timestamp);
|
||||
|
||||
|
||||
// Check if stored state is too old (24 hours for most methods, 1 hour for extensions)
|
||||
const maxAge = authState.method === 'extension' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;
|
||||
@@ -3507,27 +3494,26 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Auth state not expired, attempting restore for method:', authState.method);
|
||||
|
||||
let result;
|
||||
switch (authState.method) {
|
||||
case 'extension':
|
||||
console.log('🔍 AuthManager: Calling _restoreExtensionAuth...');
|
||||
|
||||
result = await this._restoreExtensionAuth(authState);
|
||||
break;
|
||||
|
||||
case 'local':
|
||||
console.log('🔍 AuthManager: Calling _restoreLocalAuth...');
|
||||
|
||||
result = await this._restoreLocalAuth(authState);
|
||||
break;
|
||||
|
||||
case 'nip46':
|
||||
console.log('🔍 AuthManager: Calling _restoreNip46Auth...');
|
||||
|
||||
result = await this._restoreNip46Auth(authState);
|
||||
break;
|
||||
|
||||
case 'readonly':
|
||||
console.log('🔍 AuthManager: Calling _restoreReadonlyAuth...');
|
||||
|
||||
result = await this._restoreReadonlyAuth(authState);
|
||||
break;
|
||||
|
||||
@@ -3536,8 +3522,6 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: Restore method result:', result);
|
||||
console.log('🔍 AuthManager: === restoreAuthState END ===');
|
||||
return result;
|
||||
|
||||
} catch (error) {
|
||||
@@ -3563,19 +3547,14 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension found:', extension.constructor?.name);
|
||||
|
||||
|
||||
try {
|
||||
// Verify extension still works and has same pubkey
|
||||
const currentPubkey = await extension.getPublicKey();
|
||||
if (currentPubkey !== authState.pubkey) {
|
||||
console.log('🔍 AuthManager: ❌ Extension pubkey changed, not restoring');
|
||||
console.log('🔍 AuthManager: Expected:', authState.pubkey);
|
||||
console.log('🔍 AuthManager: Got:', currentPubkey);
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension auth restored successfully');
|
||||
|
||||
|
||||
return {
|
||||
method: 'extension',
|
||||
pubkey: authState.pubkey,
|
||||
@@ -3583,16 +3562,14 @@ class AuthManager {
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.log('🔍 AuthManager: ❌ Extension verification failed:', error);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Smart extension waiting system - polls multiple locations for extensions
|
||||
async _waitForExtension(authState, maxWaitMs = 3000) {
|
||||
console.log('🔍 AuthManager: === _waitForExtension START ===');
|
||||
console.log('🔍 AuthManager: maxWaitMs:', maxWaitMs);
|
||||
console.log('🔍 AuthManager: Looking for extension with constructor:', authState.extensionVerification?.constructor);
|
||||
|
||||
|
||||
const startTime = Date.now();
|
||||
const pollInterval = 100; // Check every 100ms
|
||||
@@ -3610,13 +3587,13 @@ class AuthManager {
|
||||
];
|
||||
|
||||
while (Date.now() - startTime < maxWaitMs) {
|
||||
console.log('🔍 AuthManager: Polling for extensions... (elapsed:', Date.now() - startTime, 'ms)');
|
||||
|
||||
|
||||
// If our facade is currently installed and blocking, temporarily remove it
|
||||
let facadeRemoved = false;
|
||||
let originalNostr = null;
|
||||
if (window.nostr?.constructor?.name === 'WindowNostr') {
|
||||
console.log('🔍 AuthManager: Temporarily removing our facade to check for real extensions');
|
||||
|
||||
originalNostr = window.nostr;
|
||||
window.nostr = window.nostr.existingNostr || undefined;
|
||||
facadeRemoved = true;
|
||||
@@ -3627,21 +3604,21 @@ class AuthManager {
|
||||
for (const location of extensionLocations) {
|
||||
try {
|
||||
const extension = location.getter();
|
||||
console.log('🔍 AuthManager: Checking', location.path, ':', !!extension, extension?.constructor?.name);
|
||||
|
||||
|
||||
if (this._isValidExtensionForRestore(extension, authState)) {
|
||||
console.log('🔍 AuthManager: ✅ Found matching extension at', location.path);
|
||||
|
||||
|
||||
// Restore facade if we removed it
|
||||
if (facadeRemoved && originalNostr) {
|
||||
console.log('🔍 AuthManager: Restoring facade after finding extension');
|
||||
|
||||
window.nostr = originalNostr;
|
||||
}
|
||||
|
||||
return extension;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('🔍 AuthManager: Error checking', location.path, ':', error.message);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3702,31 +3679,27 @@ class AuthManager {
|
||||
}
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension validation passed for:', constructorName);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async _restoreLocalAuth(authState) {
|
||||
// console.log('🔐 AuthManager: === _restoreLocalAuth (Unified Plaintext) ===');
|
||||
|
||||
// Check for legacy encrypted format first
|
||||
|
||||
if (authState.encrypted) {
|
||||
// console.log('🔐 AuthManager: Detected LEGACY encrypted format - migrating to plaintext');
|
||||
console.warn('🔐 SECURITY: Converting from encrypted to plaintext storage for compatibility');
|
||||
|
||||
|
||||
// Try to decrypt legacy format
|
||||
const sessionPassword = sessionStorage.getItem('nostr_session_key');
|
||||
if (!sessionPassword) {
|
||||
// console.log('🔐 AuthManager: Legacy session password not found - user must re-login');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
console.warn('🔐 AuthManager: Legacy encryption system no longer supported - user must re-login');
|
||||
|
||||
this.clearAuthState(); // Clear legacy format
|
||||
return null;
|
||||
} catch (error) {
|
||||
console.error('🔐 AuthManager: Legacy decryption failed:', error);
|
||||
|
||||
this.clearAuthState(); // Clear corrupted legacy format
|
||||
return null;
|
||||
}
|
||||
@@ -3734,12 +3707,11 @@ class AuthManager {
|
||||
|
||||
// NEW UNIFIED PLAINTEXT FORMAT
|
||||
if (!authState.secret) {
|
||||
// console.log('🔐 AuthManager: No secret found in plaintext format');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// console.log('🔐 AuthManager: ✅ Local auth restored from plaintext storage');
|
||||
console.warn('🔐 SECURITY: Secret key was stored unencrypted');
|
||||
|
||||
|
||||
return {
|
||||
method: 'local',
|
||||
@@ -3750,14 +3722,14 @@ class AuthManager {
|
||||
|
||||
async _restoreNip46Auth(authState) {
|
||||
if (!authState.nip46) {
|
||||
// console.log('🔐 AuthManager: No NIP-46 data found');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// For NIP-46, we can't automatically restore the connection
|
||||
// because it requires the user to re-authenticate with the remote signer
|
||||
// Instead, we return the connection parameters so the UI can prompt for reconnection
|
||||
// console.log('🔐 AuthManager: NIP-46 connection data found, requires user reconnection');
|
||||
|
||||
return {
|
||||
method: 'nip46',
|
||||
pubkey: authState.pubkey,
|
||||
@@ -3767,7 +3739,7 @@ class AuthManager {
|
||||
}
|
||||
|
||||
async _restoreReadonlyAuth(authState) {
|
||||
// console.log('🔐 AuthManager: Read-only auth restored successfully');
|
||||
|
||||
return {
|
||||
method: 'readonly',
|
||||
pubkey: authState.pubkey
|
||||
@@ -3779,7 +3751,7 @@ class AuthManager {
|
||||
this.storage.removeItem(this.storageKey);
|
||||
sessionStorage.removeItem('nostr_session_key'); // Clear legacy session key
|
||||
this.currentAuthState = null;
|
||||
// console.log('🔐 AuthManager: Auth state cleared from unified storage');
|
||||
|
||||
}
|
||||
|
||||
// Check if we have valid stored auth
|
||||
@@ -3822,8 +3794,8 @@ function getGlobalAuthManager() {
|
||||
// **UNIFIED GLOBAL FUNCTION**: Set authentication state (works for all methods)
|
||||
function setAuthState(authData, options = {}) {
|
||||
try {
|
||||
// console.log('🌐 setAuthState: Setting global auth state for method:', authData.method);
|
||||
console.warn('🔐 SECURITY: Using unified plaintext storage for maximum compatibility');
|
||||
|
||||
|
||||
|
||||
// Store in memory
|
||||
globalAuthState = authData;
|
||||
@@ -3832,7 +3804,7 @@ function setAuthState(authData, options = {}) {
|
||||
const authManager = new AuthManager(options);
|
||||
authManager.saveAuthState(authData);
|
||||
|
||||
// console.log('🌐 setAuthState: Auth state saved successfully');
|
||||
|
||||
} catch (error) {
|
||||
console.error('🌐 setAuthState: Failed to save auth state:', error);
|
||||
throw error;
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.1.11
|
||||
0.1.12
|
||||
|
||||
120
src/build.js
120
src/build.js
@@ -887,7 +887,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
async init(options = {}) {
|
||||
console.log('NOSTR_LOGIN_LITE: Initializing with options:', options);
|
||||
// console.log('NOSTR_LOGIN_LITE: Initializing with options:', options);
|
||||
|
||||
this.options = {
|
||||
theme: 'default',
|
||||
@@ -935,12 +935,12 @@ class NostrLite {
|
||||
|
||||
// Create modal during init (matching original git architecture)
|
||||
this.modal = new Modal(this.options);
|
||||
console.log('NOSTR_LOGIN_LITE: Modal created during init');
|
||||
// console.log('NOSTR_LOGIN_LITE: Modal created during init');
|
||||
|
||||
// Initialize floating tab if enabled
|
||||
if (this.options.floatingTab.enabled) {
|
||||
this.floatingTab = new FloatingTab(this.modal, this.options.floatingTab);
|
||||
console.log('NOSTR_LOGIN_LITE: Floating tab initialized');
|
||||
// console.log('NOSTR_LOGIN_LITE: Floating tab initialized');
|
||||
}
|
||||
|
||||
// Attempt to restore authentication state if persistence is enabled (AFTER facade is ready)
|
||||
@@ -952,7 +952,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
this.initialized = true;
|
||||
console.log('NOSTR_LOGIN_LITE: Initialization complete');
|
||||
// console.log('NOSTR_LOGIN_LITE: Initialization complete');
|
||||
|
||||
return this;
|
||||
}
|
||||
@@ -1087,7 +1087,7 @@ class NostrLite {
|
||||
}
|
||||
|
||||
launch(startScreen = 'login') {
|
||||
console.log('NOSTR_LOGIN_LITE: Launching with screen:', startScreen);
|
||||
// console.log('NOSTR_LOGIN_LITE: Launching with screen:', startScreen);
|
||||
|
||||
if (this.modal) {
|
||||
this.modal.open({ startScreen });
|
||||
@@ -1099,18 +1099,14 @@ class NostrLite {
|
||||
// Attempt to restore authentication state
|
||||
async _attemptAuthRestore() {
|
||||
try {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: === _attemptAuthRestore START ===');
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: hasExtension:', this.hasExtension);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: facadeInstalled:', this.facadeInstalled);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: window.nostr:', window.nostr?.constructor?.name);
|
||||
|
||||
|
||||
if (this.hasExtension) {
|
||||
// EXTENSION MODE: Use custom extension persistence logic
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Extension mode - using extension-specific restore');
|
||||
|
||||
const restoredAuth = await this._attemptExtensionRestore();
|
||||
|
||||
if (restoredAuth) {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ✅ Extension auth restored successfully!');
|
||||
return restoredAuth;
|
||||
} else {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ❌ Extension auth could not be restored');
|
||||
@@ -1122,14 +1118,11 @@ class NostrLite {
|
||||
const restoredAuth = await window.nostr.restoreAuthState();
|
||||
|
||||
if (restoredAuth) {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: ✅ Facade auth restored successfully!');
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Method:', restoredAuth.method);
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: Pubkey:', restoredAuth.pubkey);
|
||||
|
||||
|
||||
// CRITICAL FIX: Activate facade resilience system for non-extension methods
|
||||
// Extensions like nos2x can override our facade after page refresh
|
||||
if (restoredAuth.method === 'local' || restoredAuth.method === 'nip46') {
|
||||
console.log('🔍 NOSTR_LOGIN_LITE: 🛡️ Activating facade resilience system for page refresh');
|
||||
this._activateResilienceProtection(restoredAuth.method);
|
||||
}
|
||||
|
||||
@@ -1261,7 +1254,7 @@ class NostrLite {
|
||||
|
||||
// Show prompt for NIP-46 reconnection
|
||||
_showReconnectionPrompt(authData) {
|
||||
console.log('NOSTR_LOGIN_LITE: Showing reconnection prompt for NIP-46');
|
||||
|
||||
|
||||
// Dispatch event that UI can listen to
|
||||
if (typeof window !== 'undefined') {
|
||||
@@ -1406,8 +1399,7 @@ class AuthManager {
|
||||
// Save authentication state using unified plaintext approach
|
||||
async saveAuthState(authData) {
|
||||
try {
|
||||
// console.log('🔐 AuthManager: Saving auth state with plaintext storage');
|
||||
console.warn('🔐 SECURITY: Private key will be stored unencrypted for maximum usability');
|
||||
|
||||
|
||||
const authState = {
|
||||
method: authData.method,
|
||||
@@ -1423,15 +1415,14 @@ class AuthManager {
|
||||
hasGetPublicKey: typeof authData.extension?.getPublicKey === 'function',
|
||||
hasSignEvent: typeof authData.extension?.signEvent === 'function'
|
||||
};
|
||||
// console.log('🔐 AuthManager: Extension method - storing verification data only');
|
||||
|
||||
break;
|
||||
|
||||
case 'local':
|
||||
// UNIFIED PLAINTEXT: Store secret key directly for maximum compatibility
|
||||
if (authData.secret) {
|
||||
authState.secret = authData.secret;
|
||||
// console.log('🔐 AuthManager: Local method - storing secret key in plaintext');
|
||||
console.warn('🔐 SECURITY: Secret key stored unencrypted for developer convenience');
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1443,7 +1434,7 @@ class AuthManager {
|
||||
relays: authData.signer.relays,
|
||||
// Don't store secret - user will need to reconnect
|
||||
};
|
||||
// console.log('🔐 AuthManager: NIP-46 method - storing connection parameters');
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1469,11 +1460,10 @@ class AuthManager {
|
||||
// Restore authentication state on page load
|
||||
async restoreAuthState() {
|
||||
try {
|
||||
console.log('🔍 AuthManager: === restoreAuthState START ===');
|
||||
console.log('🔍 AuthManager: storageKey:', this.storageKey);
|
||||
|
||||
|
||||
const stored = this.storage.getItem(this.storageKey);
|
||||
console.log('🔍 AuthManager: Storage raw value:', stored);
|
||||
|
||||
|
||||
if (!stored) {
|
||||
console.log('🔍 AuthManager: ❌ No stored auth state found');
|
||||
@@ -1481,10 +1471,7 @@ class AuthManager {
|
||||
}
|
||||
|
||||
const authState = JSON.parse(stored);
|
||||
console.log('🔍 AuthManager: ✅ Parsed stored auth state:', authState);
|
||||
console.log('🔍 AuthManager: Method:', authState.method);
|
||||
console.log('🔍 AuthManager: Timestamp:', authState.timestamp);
|
||||
console.log('🔍 AuthManager: Age (ms):', Date.now() - authState.timestamp);
|
||||
|
||||
|
||||
// Check if stored state is too old (24 hours for most methods, 1 hour for extensions)
|
||||
const maxAge = authState.method === 'extension' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;
|
||||
@@ -1496,27 +1483,26 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Auth state not expired, attempting restore for method:', authState.method);
|
||||
|
||||
let result;
|
||||
switch (authState.method) {
|
||||
case 'extension':
|
||||
console.log('🔍 AuthManager: Calling _restoreExtensionAuth...');
|
||||
|
||||
result = await this._restoreExtensionAuth(authState);
|
||||
break;
|
||||
|
||||
case 'local':
|
||||
console.log('🔍 AuthManager: Calling _restoreLocalAuth...');
|
||||
|
||||
result = await this._restoreLocalAuth(authState);
|
||||
break;
|
||||
|
||||
case 'nip46':
|
||||
console.log('🔍 AuthManager: Calling _restoreNip46Auth...');
|
||||
|
||||
result = await this._restoreNip46Auth(authState);
|
||||
break;
|
||||
|
||||
case 'readonly':
|
||||
console.log('🔍 AuthManager: Calling _restoreReadonlyAuth...');
|
||||
|
||||
result = await this._restoreReadonlyAuth(authState);
|
||||
break;
|
||||
|
||||
@@ -1525,8 +1511,6 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: Restore method result:', result);
|
||||
console.log('🔍 AuthManager: === restoreAuthState END ===');
|
||||
return result;
|
||||
|
||||
} catch (error) {
|
||||
@@ -1552,19 +1536,14 @@ class AuthManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension found:', extension.constructor?.name);
|
||||
|
||||
|
||||
try {
|
||||
// Verify extension still works and has same pubkey
|
||||
const currentPubkey = await extension.getPublicKey();
|
||||
if (currentPubkey !== authState.pubkey) {
|
||||
console.log('🔍 AuthManager: ❌ Extension pubkey changed, not restoring');
|
||||
console.log('🔍 AuthManager: Expected:', authState.pubkey);
|
||||
console.log('🔍 AuthManager: Got:', currentPubkey);
|
||||
return null;
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension auth restored successfully');
|
||||
|
||||
|
||||
return {
|
||||
method: 'extension',
|
||||
pubkey: authState.pubkey,
|
||||
@@ -1572,16 +1551,14 @@ class AuthManager {
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.log('🔍 AuthManager: ❌ Extension verification failed:', error);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Smart extension waiting system - polls multiple locations for extensions
|
||||
async _waitForExtension(authState, maxWaitMs = 3000) {
|
||||
console.log('🔍 AuthManager: === _waitForExtension START ===');
|
||||
console.log('🔍 AuthManager: maxWaitMs:', maxWaitMs);
|
||||
console.log('🔍 AuthManager: Looking for extension with constructor:', authState.extensionVerification?.constructor);
|
||||
|
||||
|
||||
const startTime = Date.now();
|
||||
const pollInterval = 100; // Check every 100ms
|
||||
@@ -1599,13 +1576,13 @@ class AuthManager {
|
||||
];
|
||||
|
||||
while (Date.now() - startTime < maxWaitMs) {
|
||||
console.log('🔍 AuthManager: Polling for extensions... (elapsed:', Date.now() - startTime, 'ms)');
|
||||
|
||||
|
||||
// If our facade is currently installed and blocking, temporarily remove it
|
||||
let facadeRemoved = false;
|
||||
let originalNostr = null;
|
||||
if (window.nostr?.constructor?.name === 'WindowNostr') {
|
||||
console.log('🔍 AuthManager: Temporarily removing our facade to check for real extensions');
|
||||
|
||||
originalNostr = window.nostr;
|
||||
window.nostr = window.nostr.existingNostr || undefined;
|
||||
facadeRemoved = true;
|
||||
@@ -1616,21 +1593,21 @@ class AuthManager {
|
||||
for (const location of extensionLocations) {
|
||||
try {
|
||||
const extension = location.getter();
|
||||
console.log('🔍 AuthManager: Checking', location.path, ':', !!extension, extension?.constructor?.name);
|
||||
|
||||
|
||||
if (this._isValidExtensionForRestore(extension, authState)) {
|
||||
console.log('🔍 AuthManager: ✅ Found matching extension at', location.path);
|
||||
|
||||
|
||||
// Restore facade if we removed it
|
||||
if (facadeRemoved && originalNostr) {
|
||||
console.log('🔍 AuthManager: Restoring facade after finding extension');
|
||||
|
||||
window.nostr = originalNostr;
|
||||
}
|
||||
|
||||
return extension;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('🔍 AuthManager: Error checking', location.path, ':', error.message);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1691,31 +1668,27 @@ class AuthManager {
|
||||
}
|
||||
}
|
||||
|
||||
console.log('🔍 AuthManager: ✅ Extension validation passed for:', constructorName);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async _restoreLocalAuth(authState) {
|
||||
// console.log('🔐 AuthManager: === _restoreLocalAuth (Unified Plaintext) ===');
|
||||
|
||||
// Check for legacy encrypted format first
|
||||
|
||||
if (authState.encrypted) {
|
||||
// console.log('🔐 AuthManager: Detected LEGACY encrypted format - migrating to plaintext');
|
||||
console.warn('🔐 SECURITY: Converting from encrypted to plaintext storage for compatibility');
|
||||
|
||||
|
||||
// Try to decrypt legacy format
|
||||
const sessionPassword = sessionStorage.getItem('nostr_session_key');
|
||||
if (!sessionPassword) {
|
||||
// console.log('🔐 AuthManager: Legacy session password not found - user must re-login');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
console.warn('🔐 AuthManager: Legacy encryption system no longer supported - user must re-login');
|
||||
|
||||
this.clearAuthState(); // Clear legacy format
|
||||
return null;
|
||||
} catch (error) {
|
||||
console.error('🔐 AuthManager: Legacy decryption failed:', error);
|
||||
|
||||
this.clearAuthState(); // Clear corrupted legacy format
|
||||
return null;
|
||||
}
|
||||
@@ -1723,12 +1696,11 @@ class AuthManager {
|
||||
|
||||
// NEW UNIFIED PLAINTEXT FORMAT
|
||||
if (!authState.secret) {
|
||||
// console.log('🔐 AuthManager: No secret found in plaintext format');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// console.log('🔐 AuthManager: ✅ Local auth restored from plaintext storage');
|
||||
console.warn('🔐 SECURITY: Secret key was stored unencrypted');
|
||||
|
||||
|
||||
return {
|
||||
method: 'local',
|
||||
@@ -1739,14 +1711,14 @@ class AuthManager {
|
||||
|
||||
async _restoreNip46Auth(authState) {
|
||||
if (!authState.nip46) {
|
||||
// console.log('🔐 AuthManager: No NIP-46 data found');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// For NIP-46, we can't automatically restore the connection
|
||||
// because it requires the user to re-authenticate with the remote signer
|
||||
// Instead, we return the connection parameters so the UI can prompt for reconnection
|
||||
// console.log('🔐 AuthManager: NIP-46 connection data found, requires user reconnection');
|
||||
|
||||
return {
|
||||
method: 'nip46',
|
||||
pubkey: authState.pubkey,
|
||||
@@ -1756,7 +1728,7 @@ class AuthManager {
|
||||
}
|
||||
|
||||
async _restoreReadonlyAuth(authState) {
|
||||
// console.log('🔐 AuthManager: Read-only auth restored successfully');
|
||||
|
||||
return {
|
||||
method: 'readonly',
|
||||
pubkey: authState.pubkey
|
||||
@@ -1768,7 +1740,7 @@ class AuthManager {
|
||||
this.storage.removeItem(this.storageKey);
|
||||
sessionStorage.removeItem('nostr_session_key'); // Clear legacy session key
|
||||
this.currentAuthState = null;
|
||||
// console.log('🔐 AuthManager: Auth state cleared from unified storage');
|
||||
|
||||
}
|
||||
|
||||
// Check if we have valid stored auth
|
||||
@@ -1811,8 +1783,8 @@ function getGlobalAuthManager() {
|
||||
// **UNIFIED GLOBAL FUNCTION**: Set authentication state (works for all methods)
|
||||
function setAuthState(authData, options = {}) {
|
||||
try {
|
||||
// console.log('🌐 setAuthState: Setting global auth state for method:', authData.method);
|
||||
console.warn('🔐 SECURITY: Using unified plaintext storage for maximum compatibility');
|
||||
|
||||
|
||||
|
||||
// Store in memory
|
||||
globalAuthState = authData;
|
||||
@@ -1821,7 +1793,7 @@ function setAuthState(authData, options = {}) {
|
||||
const authManager = new AuthManager(options);
|
||||
authManager.saveAuthState(authData);
|
||||
|
||||
// console.log('🌐 setAuthState: Auth state saved successfully');
|
||||
|
||||
} catch (error) {
|
||||
console.error('🌐 setAuthState: Failed to save auth state:', error);
|
||||
throw error;
|
||||
|
||||
Reference in New Issue
Block a user