File size: 2,570 Bytes
eb846d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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';

// Get all users
export const getUsers = (): IUser[] => {
  try {
    const settings = loadSettings();
    return settings.users || [];
  } catch (error) {
    console.error('Error reading users from settings:', error);
    return [];
  }
};

// Save users to settings
const saveUsers = (users: IUser[]): void => {
  try {
    const settings = loadSettings();
    settings.users = users;
    saveSettings(settings);
  } catch (error) {
    console.error('Error saving users to settings:', error);
  }
};

// Create a new user
export const createUser = async (userData: IUser): Promise<IUser | null> => {
  const users = getUsers();
  
  // Check if username already exists
  if (users.some(user => user.username === userData.username)) {
    return null;
  }
  
  // Hash the password
  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;
};

// Find user by username
export const findUserByUsername = (username: string): IUser | undefined => {
  const users = getUsers();
  return users.find(user => user.username === username);
};

// Verify user password
export const verifyPassword = async (
  plainPassword: string, 
  hashedPassword: string
): Promise<boolean> => {
  return await bcrypt.compare(plainPassword, hashedPassword);
};

// Update user password
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;
  }
  
  // Hash the new password
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(newPassword, salt);
  
  // Update the user's password
  users[userIndex].password = hashedPassword;
  saveUsers(users);
  
  return true;
};

// Initialize with default admin user if no users exist
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');
  }
};