Files
CMLeonOS/UserSystem.cs

558 lines
18 KiB
C#
Raw Normal View History

2026-01-30 21:55:35 +08:00
using System;
2026-01-31 19:14:13 +08:00
using System.Collections.Generic;
2026-01-30 21:55:35 +08:00
using System.IO;
namespace CMLeonOS
{
2026-01-31 19:14:13 +08:00
public class User
{
public string Username { get; set; }
public string Password { get; set; }
public bool IsAdmin { get; set; }
}
2026-01-30 21:55:35 +08:00
public class UserSystem
{
2026-01-31 19:14:13 +08:00
private string sysDirectory = @"0:\system";
private string userFilePath;
private List<User> users;
2026-01-30 21:55:35 +08:00
public UserSystem()
{
2026-01-30 23:36:08 +08:00
EnsureSysDirectoryExists();
2026-01-31 19:14:13 +08:00
// 设置用户文件路径
userFilePath = Path.Combine(sysDirectory, "user.dat");
2026-01-30 23:36:08 +08:00
2026-01-31 19:14:13 +08:00
// 加载用户数据
LoadUsers();
2026-01-30 21:55:35 +08:00
}
2026-01-30 23:36:08 +08:00
private void EnsureSysDirectoryExists()
{
try
{
if (!Directory.Exists(sysDirectory))
{
Directory.CreateDirectory(sysDirectory);
}
}
catch
{
// 忽略目录创建错误
}
}
2026-01-31 19:14:13 +08:00
private void LoadUsers()
2026-01-30 21:55:35 +08:00
{
try
{
2026-01-31 19:14:13 +08:00
if (File.Exists(userFilePath))
{
string[] lines = File.ReadAllLines(userFilePath);
users = new List<User>();
foreach (string line in lines)
{
if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#"))
{
continue;
}
string[] parts = line.Split('|');
if (parts.Length >= 2)
{
User user = new User
{
Username = parts[0].Trim(),
Password = parts[1].Trim(),
IsAdmin = parts.Length >= 3 && parts[2].Trim().ToLower() == "admin"
};
users.Add(user);
}
}
}
else
{
users = new List<User>();
}
2026-01-30 21:55:35 +08:00
}
catch
{
2026-01-31 19:14:13 +08:00
users = new List<User>();
}
}
private void SaveUsers()
{
try
{
List<string> lines = new List<string>();
foreach (User user in users)
{
string line = $"{user.Username}|{user.Password}|{(user.IsAdmin ? "admin" : "user")}";
lines.Add(line);
}
File.WriteAllLines(userFilePath, lines.ToArray());
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
catch (Exception ex)
{
Console.WriteLine($"Error saving users: {ex.Message}");
}
}
public bool HasUsers
{
get { return users.Count > 0; }
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
public bool IsAdminSet
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
get
{
foreach (User user in users)
{
if (user.IsAdmin)
{
return true;
}
}
return false;
}
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
public void FirstTimeSetup()
2026-01-30 21:55:35 +08:00
{
Console.WriteLine("====================================");
Console.WriteLine(" First Time Setup");
Console.WriteLine("====================================");
2026-01-31 19:14:13 +08:00
Console.WriteLine("Please set admin username and password:");
2026-01-30 21:55:35 +08:00
2026-01-31 19:14:13 +08:00
Console.Write("Username: ");
string username = Console.ReadLine();
while (string.IsNullOrWhiteSpace(username))
{
Console.WriteLine("Username cannot be empty.");
Console.Write("Username: ");
username = Console.ReadLine();
}
Console.WriteLine("Password: ");
2026-01-30 21:55:35 +08:00
string password = ReadPassword();
Console.WriteLine("Please confirm your password:");
string confirmPassword = ReadPassword();
2026-01-31 19:14:13 +08:00
while (password != confirmPassword)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("Passwords do not match. Please try again.");
Console.Write("Username: ");
username = Console.ReadLine();
while (string.IsNullOrWhiteSpace(username))
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("Username cannot be empty.");
Console.Write("Username: ");
username = Console.ReadLine();
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
Console.WriteLine("Password: ");
password = ReadPassword();
Console.WriteLine("Please confirm your password:");
confirmPassword = ReadPassword();
}
try
{
User adminUser = new User
{
Username = username,
Password = password,
IsAdmin = true
};
users.Add(adminUser);
SaveUsers();
Console.WriteLine("Admin user created successfully!");
// 创建用户文件夹
CreateUserFolder(username);
}
catch (Exception ex)
{
Console.WriteLine($"Error creating admin user: {ex.Message}");
}
}
private void CreateUserFolder(string username)
{
try
{
Console.WriteLine($"Creating user folder for {username}...");
// 在user文件夹下创建用户文件夹
string userFolderPath = Path.Combine(@"0:\user", username);
// 检查用户文件夹是否存在
if (!Directory.Exists(userFolderPath))
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Directory.CreateDirectory(userFolderPath);
Console.WriteLine($"Created user folder for {username}.");
}
else
{
Console.WriteLine($"User folder for {username} already exists.");
2026-01-30 21:55:35 +08:00
}
}
2026-01-31 19:14:13 +08:00
catch (Exception ex)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine($"Error creating user folder: {ex.Message}");
2026-01-30 21:55:35 +08:00
}
}
public bool Login()
{
Console.WriteLine("====================================");
Console.WriteLine(" System Login");
Console.WriteLine("====================================");
2026-01-31 19:14:13 +08:00
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
2026-01-30 21:55:35 +08:00
2026-01-30 23:36:08 +08:00
// 检测ALT+Space按键
bool useFixMode = false;
ConsoleKeyInfo keyInfo;
2026-01-30 21:55:35 +08:00
try
{
2026-01-30 23:36:08 +08:00
keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.Spacebar && (keyInfo.Modifiers & ConsoleModifiers.Alt) != 0)
2026-01-30 21:55:35 +08:00
{
2026-01-30 23:36:08 +08:00
// 检测到ALT+Space进入修复模式
useFixMode = true;
Console.WriteLine();
Console.WriteLine("Fix Mode Activated");
Console.Write("Enter fix code: ");
string fixCode = "";
while (true)
{
var codeKey = Console.ReadKey(true);
if (codeKey.Key == ConsoleKey.Enter)
{
Console.WriteLine();
break;
}
else if (codeKey.Key == ConsoleKey.Backspace)
{
if (fixCode.Length > 0)
{
fixCode = fixCode.Substring(0, fixCode.Length - 1);
}
}
else
{
fixCode += codeKey.KeyChar;
Console.Write(codeKey.KeyChar);
}
}
if (fixCode == "FixMyComputer")
{
Console.WriteLine("Fix mode enabled!");
}
else
{
Console.WriteLine("Invalid fix code. Exiting fix mode.");
useFixMode = false;
}
2026-01-30 21:55:35 +08:00
}
else
{
2026-01-31 19:14:13 +08:00
// 正常登录流程
Console.Write("Username: ");
string username = Console.ReadLine();
2026-01-30 23:36:08 +08:00
2026-01-31 19:14:13 +08:00
if (string.IsNullOrWhiteSpace(username))
2026-01-30 23:36:08 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("Username cannot be empty.");
return false;
}
Console.Write("Password: ");
string password = ReadPassword();
// 查找用户
User foundUser = null;
foreach (User user in users)
{
if (user.Username.ToLower() == username.ToLower())
2026-01-30 23:36:08 +08:00
{
2026-01-31 19:14:13 +08:00
foundUser = user;
2026-01-30 23:36:08 +08:00
break;
}
}
2026-01-31 19:14:13 +08:00
if (foundUser == null)
2026-01-30 23:36:08 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("User not found.");
return false;
2026-01-30 23:36:08 +08:00
}
2026-01-31 19:14:13 +08:00
if (foundUser.Password == password)
2026-01-30 23:36:08 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("Login successful!");
// 创建用户文件夹
CreateUserFolder(foundUser.Username);
return true;
}
else
{
Console.WriteLine("Invalid password. Please try again.");
2026-01-30 23:36:08 +08:00
return false;
}
2026-01-30 21:55:35 +08:00
}
}
2026-01-30 23:36:08 +08:00
catch
2026-01-30 21:55:35 +08:00
{
2026-01-30 23:36:08 +08:00
// 如果读取按键失败,使用普通登录
Console.WriteLine("Error reading key input. Using normal login.");
2026-01-30 21:55:35 +08:00
return false;
}
2026-01-30 23:36:08 +08:00
// 如果使用了修复模式返回true
if (useFixMode)
{
return true;
}
return false;
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
public bool AddUser(string args, bool isAdmin)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("====================================");
Console.WriteLine($" Add {(isAdmin ? "Admin" : "User")}");
Console.WriteLine("====================================");
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("Error: Please specify username and password");
Console.WriteLine($"Usage: user add {(isAdmin ? "admin" : "user")} <username> <password>");
return false;
}
string username = parts[0];
string password = parts[1];
// 检查用户名是否已存在
foreach (User user in users)
{
if (user.Username.ToLower() == username.ToLower())
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine($"Error: User '{username}' already exists.");
return false;
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
}
try
{
User newUser = new User
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Username = username,
Password = password,
IsAdmin = isAdmin
};
users.Add(newUser);
SaveUsers();
// 创建用户文件夹
CreateUserFolder(username);
Console.WriteLine($"{(isAdmin ? "Admin" : "User")} '{username}' created successfully!");
Console.WriteLine("You shall restart the system to apply the changes.");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error adding user: {ex.Message}");
return false;
}
}
public bool DeleteUser(string username)
{
Console.WriteLine("====================================");
Console.WriteLine(" Delete User");
Console.WriteLine("====================================");
if (string.IsNullOrWhiteSpace(username))
{
Console.WriteLine("Error: Please specify username");
Console.WriteLine("Usage: user delete <username>");
return false;
}
// 查找用户
User foundUser = null;
foreach (User user in users)
{
if (user.Username.ToLower() == username.ToLower())
{
foundUser = user;
break;
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
}
if (foundUser == null)
{
Console.WriteLine($"Error: User '{username}' not found.");
return false;
}
// 检查是否是最后一个管理员
int adminCount = 0;
foreach (User user in users)
{
if (user.IsAdmin)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
adminCount++;
2026-01-30 21:55:35 +08:00
}
}
2026-01-31 19:14:13 +08:00
if (foundUser.IsAdmin && adminCount <= 1)
{
Console.WriteLine("Error: Cannot delete the last admin user.");
return false;
}
try
{
users.Remove(foundUser);
SaveUsers();
Console.WriteLine($"User '{username}' deleted successfully!");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error deleting user: {ex.Message}");
return false;
}
}
public void ListUsers()
{
Console.WriteLine("====================================");
Console.WriteLine(" User List");
Console.WriteLine("====================================");
if (users.Count == 0)
{
Console.WriteLine("No users found.");
return;
}
Console.WriteLine();
foreach (User user in users)
{
string userType = user.IsAdmin ? "[ADMIN]" : "[USER]";
Console.WriteLine($"{userType} {user.Username}");
}
2026-01-30 21:55:35 +08:00
}
public bool ChangePassword()
{
Console.WriteLine("====================================");
Console.WriteLine(" Change Password");
Console.WriteLine("====================================");
2026-01-31 19:14:13 +08:00
Console.Write("Please enter your current password: ");
2026-01-30 21:55:35 +08:00
string currentPassword = ReadPassword();
2026-01-31 19:14:13 +08:00
// 查找当前登录用户
User currentUser = null;
foreach (User user in users)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
if (user.Username.ToLower() == "current")
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
currentUser = user;
break;
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
}
if (currentUser == null)
{
Console.WriteLine("Error: No user logged in.");
return false;
}
Console.Write("Please enter your new password: ");
string newPassword = ReadPassword();
Console.WriteLine("Please confirm your new password: ");
string confirmPassword = ReadPassword();
if (newPassword == confirmPassword)
{
try
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
currentUser.Password = newPassword;
SaveUsers();
2026-01-30 21:55:35 +08:00
Console.WriteLine("Password changed successfully!");
return true;
}
2026-01-31 19:14:13 +08:00
catch (Exception ex)
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine($"Error changing password: {ex.Message}");
2026-01-30 21:55:35 +08:00
return false;
}
}
2026-01-31 19:14:13 +08:00
else
2026-01-30 21:55:35 +08:00
{
2026-01-31 19:14:13 +08:00
Console.WriteLine("New passwords do not match.");
2026-01-30 21:55:35 +08:00
return false;
}
}
2026-01-31 19:14:13 +08:00
public void Logout()
{
Console.WriteLine("====================================");
Console.WriteLine(" User Logout");
Console.WriteLine("====================================");
Console.WriteLine("Logging out...");
Console.WriteLine("Logout successful!");
}
private string ReadPassword()
{
string password = "";
while (true)
{
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.Enter)
{
Console.WriteLine();
break;
}
else if (keyInfo.Key == ConsoleKey.Backspace)
{
if (password.Length > 0)
{
password = password.Substring(0, password.Length - 1);
}
}
else
{
password += keyInfo.KeyChar;
Console.Write("*");
}
}
return password;
}
2026-01-30 21:55:35 +08:00
}
2026-01-31 19:14:13 +08:00
}