remove providerSettings firebaseRepository + minor refactor
This commit is contained in:
parent
ab23c10006
commit
8592d1c4ed
@ -1,83 +0,0 @@
|
||||
const { collection, doc, getDoc, getDocs, setDoc, deleteDoc, query, where } = require('firebase/firestore');
|
||||
const { getFirestoreInstance: getFirestore } = require('../../services/firebaseClient');
|
||||
const { createEncryptedConverter } = require('../firestoreConverter');
|
||||
|
||||
// Create encrypted converter for provider settings
|
||||
const providerSettingsConverter = createEncryptedConverter([
|
||||
'api_key', // Encrypt API keys
|
||||
'selected_llm_model', // Encrypt model selections for privacy
|
||||
'selected_stt_model'
|
||||
]);
|
||||
|
||||
function providerSettingsCol() {
|
||||
const db = getFirestore();
|
||||
return collection(db, 'provider_settings').withConverter(providerSettingsConverter);
|
||||
}
|
||||
|
||||
async function getByProvider(uid, provider) {
|
||||
try {
|
||||
const docRef = doc(providerSettingsCol(), `${uid}_${provider}`);
|
||||
const docSnap = await getDoc(docRef);
|
||||
return docSnap.exists() ? { id: docSnap.id, ...docSnap.data() } : null;
|
||||
} catch (error) {
|
||||
console.error('[ProviderSettings Firebase] Error getting provider settings:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function getAllByUid(uid) {
|
||||
try {
|
||||
const q = query(providerSettingsCol(), where('uid', '==', uid));
|
||||
const querySnapshot = await getDocs(q);
|
||||
return querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
|
||||
} catch (error) {
|
||||
console.error('[ProviderSettings Firebase] Error getting all provider settings:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function upsert(uid, provider, settings) {
|
||||
try {
|
||||
const docRef = doc(providerSettingsCol(), `${uid}_${provider}`);
|
||||
await setDoc(docRef, settings, { merge: true });
|
||||
return { changes: 1 };
|
||||
} catch (error) {
|
||||
console.error('[ProviderSettings Firebase] Error upserting provider settings:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function remove(uid, provider) {
|
||||
try {
|
||||
const docRef = doc(providerSettingsCol(), `${uid}_${provider}`);
|
||||
await deleteDoc(docRef);
|
||||
return { changes: 1 };
|
||||
} catch (error) {
|
||||
console.error('[ProviderSettings Firebase] Error removing provider settings:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function removeAllByUid(uid) {
|
||||
try {
|
||||
const settings = await getAllByUid(uid);
|
||||
const deletePromises = settings.map(setting => {
|
||||
const docRef = doc(providerSettingsCol(), setting.id);
|
||||
return deleteDoc(docRef);
|
||||
});
|
||||
|
||||
await Promise.all(deletePromises);
|
||||
return { changes: settings.length };
|
||||
} catch (error) {
|
||||
console.error('[ProviderSettings Firebase] Error removing all provider settings:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getByProvider,
|
||||
getAllByUid,
|
||||
upsert,
|
||||
remove,
|
||||
removeAllByUid
|
||||
};
|
@ -1,4 +1,3 @@
|
||||
const firebaseRepository = require('./firebase.repository');
|
||||
const sqliteRepository = require('./sqlite.repository');
|
||||
|
||||
let authService = null;
|
||||
@ -8,12 +7,7 @@ function setAuthService(service) {
|
||||
}
|
||||
|
||||
function getBaseRepository() {
|
||||
if (!authService) {
|
||||
throw new Error('AuthService not set for providerSettings repository');
|
||||
}
|
||||
|
||||
const user = authService.getCurrentUser();
|
||||
return user.isLoggedIn ? firebaseRepository : sqliteRepository;
|
||||
return sqliteRepository;
|
||||
}
|
||||
|
||||
const providerSettingsRepositoryAdapter = {
|
||||
|
@ -72,7 +72,7 @@ class AuthService {
|
||||
// ** Initialize encryption key for the logged-in user if permissions are already granted **
|
||||
if (process.platform === 'darwin' && !(await permissionService.checkKeychainCompleted(this.currentUserId))) {
|
||||
console.warn('[AuthService] Keychain permission not yet completed for this user. Deferring key initialization.');
|
||||
} else if (process.platform === 'darwin') {
|
||||
} else {
|
||||
await encryptionService.initializeKey(user.uid);
|
||||
}
|
||||
|
||||
@ -113,12 +113,7 @@ class AuthService {
|
||||
// End active sessions for the local/default user as well.
|
||||
await sessionRepository.endAllActiveSessions();
|
||||
|
||||
// ** Initialize encryption key for the default/local user if permissions are already granted **
|
||||
if (process.platform === 'darwin' && !(await permissionService.checkKeychainCompleted(this.currentUserId))) {
|
||||
console.warn('[AuthService] Keychain permission not yet completed for default user. Deferring key initialization.');
|
||||
} else if (process.platform === 'darwin') {
|
||||
await encryptionService.initializeKey(this.currentUserId);
|
||||
}
|
||||
encryptionService.resetSessionKey();
|
||||
}
|
||||
this.broadcastUserState();
|
||||
|
||||
|
@ -76,6 +76,10 @@ async function initializeKey(userId) {
|
||||
}
|
||||
}
|
||||
|
||||
function resetSessionKey() {
|
||||
sessionKey = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a given text using AES-256-GCM.
|
||||
* @param {string} text The text to encrypt.
|
||||
@ -149,8 +153,23 @@ function decrypt(encryptedText) {
|
||||
}
|
||||
}
|
||||
|
||||
function looksEncrypted(str) {
|
||||
if (!str || typeof str !== 'string') return false;
|
||||
// Base64 chars + optional '=' padding
|
||||
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(str)) return false;
|
||||
try {
|
||||
const buf = Buffer.from(str, 'base64');
|
||||
// Our AES-GCM cipher text must be at least 32 bytes (IV 16 + TAG 16)
|
||||
return buf.length >= 32;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
initializeKey,
|
||||
resetSessionKey,
|
||||
encrypt,
|
||||
decrypt,
|
||||
looksEncrypted,
|
||||
};
|
@ -6,23 +6,7 @@ const { PROVIDERS, getProviderClass } = require('../ai/factory');
|
||||
const encryptionService = require('./encryptionService');
|
||||
const providerSettingsRepository = require('../repositories/providerSettings');
|
||||
const userModelSelectionsRepository = require('../repositories/userModelSelections');
|
||||
|
||||
// Import authService directly (singleton)
|
||||
const authService = require('./authService');
|
||||
const permissionService = require('./permissionService');
|
||||
|
||||
function looksEncrypted(str) {
|
||||
if (!str || typeof str !== 'string') return false;
|
||||
// Base64 chars + optional '=' padding
|
||||
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(str)) return false;
|
||||
try {
|
||||
const buf = Buffer.from(str, 'base64');
|
||||
// Our AES-GCM cipher text must be at least 32 bytes (IV 16 + TAG 16)
|
||||
return buf.length >= 32;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ModelStateService extends EventEmitter {
|
||||
constructor() {
|
||||
@ -223,7 +207,7 @@ class ModelStateService extends EventEmitter {
|
||||
// Conditionally initialize encryption if old encrypted keys are detected
|
||||
try {
|
||||
const rows = await providerSettingsRepository.getRawApiKeysByUid();
|
||||
if (rows.some(r => looksEncrypted(r.api_key))) {
|
||||
if (rows.some(r => encryptionService.looksEncrypted(r.api_key))) {
|
||||
console.log('[ModelStateService] Encrypted keys detected, initializing encryption...');
|
||||
await encryptionService.initializeKey(userId);
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user