|
import fs from 'fs'; |
|
import path from 'path'; |
|
import bcrypt from 'bcryptjs'; |
|
import { IUser, McpSettings } from '../types/index.js'; |
|
import { loadSettings, saveSettings } from '../config/index.js'; |
|
|
|
|
|
export const getUsers = (): IUser[] => { |
|
try { |
|
const settings = loadSettings(); |
|
return settings.users || []; |
|
} catch (error) { |
|
console.error('Error reading users from settings:', error); |
|
return []; |
|
} |
|
}; |
|
|
|
|
|
const saveUsers = (users: IUser[]): void => { |
|
try { |
|
const settings = loadSettings(); |
|
settings.users = users; |
|
saveSettings(settings); |
|
} catch (error) { |
|
console.error('Error saving users to settings:', error); |
|
} |
|
}; |
|
|
|
|
|
export const createUser = async (userData: IUser): Promise<IUser | null> => { |
|
const users = getUsers(); |
|
|
|
|
|
if (users.some(user => user.username === userData.username)) { |
|
return null; |
|
} |
|
|
|
|
|
const salt = await bcrypt.genSalt(10); |
|
const hashedPassword = await bcrypt.hash(userData.password, salt); |
|
|
|
const newUser = { |
|
username: userData.username, |
|
password: hashedPassword, |
|
isAdmin: userData.isAdmin || false |
|
}; |
|
|
|
users.push(newUser); |
|
saveUsers(users); |
|
|
|
return newUser; |
|
}; |
|
|
|
|
|
export const findUserByUsername = (username: string): IUser | undefined => { |
|
const users = getUsers(); |
|
return users.find(user => user.username === username); |
|
}; |
|
|
|
|
|
export const verifyPassword = async ( |
|
plainPassword: string, |
|
hashedPassword: string |
|
): Promise<boolean> => { |
|
return await bcrypt.compare(plainPassword, hashedPassword); |
|
}; |
|
|
|
|
|
export const updateUserPassword = async ( |
|
username: string, |
|
newPassword: string |
|
): Promise<boolean> => { |
|
const users = getUsers(); |
|
const userIndex = users.findIndex(user => user.username === username); |
|
|
|
if (userIndex === -1) { |
|
return false; |
|
} |
|
|
|
|
|
const salt = await bcrypt.genSalt(10); |
|
const hashedPassword = await bcrypt.hash(newPassword, salt); |
|
|
|
|
|
users[userIndex].password = hashedPassword; |
|
saveUsers(users); |
|
|
|
return true; |
|
}; |
|
|
|
|
|
export const initializeDefaultUser = async (): Promise<void> => { |
|
const users = getUsers(); |
|
|
|
if (users.length === 0) { |
|
await createUser({ |
|
username: 'admin', |
|
password: 'admin123', |
|
isAdmin: true |
|
}); |
|
console.log('Default admin user created'); |
|
} |
|
}; |