Files
CMLeonOS/System/UserSystem.cs
2026-02-05 01:43:30 +08:00

750 lines
26 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using Sys = Cosmos.System;
using CMLeonOS.Logger;
namespace CMLeonOS
{
public class User
{
public string Username { get; set; }
public string Password { get; set; }
public bool IsAdmin { get; set; }
public string Hostname { get; set; }
}
public class UserSystem
{
private string sysDirectory = @"0:\system";
private string userFilePath;
private List<User> users;
public bool fixmode = Kernel.FixMode;
private User currentLoggedInUser;
private static CMLeonOS.Logger.Logger _logger = CMLeonOS.Logger.Logger.Instance;
public void ShowError(string error)
{
_logger.Error("UserSystem", error);
}
public void ShowSuccess(string message)
{
_logger.Success("UserSystem", message);
}
public static string HashPasswordSha256(string password)
{
Sha256 sha256 = new Sha256();
byte[] passwordBytesUnhashed = Encoding.Unicode.GetBytes(password);
sha256.AddData(passwordBytesUnhashed, 0, (uint)passwordBytesUnhashed.Length);
return Convert.ToBase64String(sha256.GetHash());
}
public UserSystem()
{
EnsureSysDirectoryExists();
userFilePath = Path.Combine(sysDirectory, "user.dat");
currentLoggedInUser = null;
LoadUsers();
LoadHostname();
_logger.Success("UserSystem", "User system initialized successfully");
}
private void EnsureSysDirectoryExists()
{
try
{
if (!Directory.Exists(sysDirectory))
{
Directory.CreateDirectory(sysDirectory);
}
}
catch
{
// 忽略目录创建错误
}
}
private void LoadHostname()
{
string hostnameFilePath = Path.Combine(sysDirectory, "hostname.dat");
try
{
if (File.Exists(hostnameFilePath))
{
string hostname = File.ReadAllText(hostnameFilePath);
if (!string.IsNullOrWhiteSpace(hostname))
{
if (users.Count > 0)
{
users[0].Hostname = hostname;
}
}
}
}
catch
{
}
}
private void SaveHostname()
{
string hostnameFilePath = Path.Combine(sysDirectory, "hostname.dat");
try
{
if (users.Count > 0)
{
string hostname = users[0].Hostname;
File.WriteAllText(hostnameFilePath, hostname);
}
}
catch (Exception ex)
{
ShowError($"Error saving hostname: {ex.Message}");
}
}
public string GetHostname()
{
if (users.Count > 0)
{
return users[0].Hostname;
}
return "Not set";
}
public void SetHostname(string hostname)
{
if (string.IsNullOrWhiteSpace(hostname))
{
ShowError("Hostname cannot be empty");
return;
}
if (users.Count > 0)
{
users[0].Hostname = hostname;
SaveHostname();
ShowSuccess($"Hostname set to: {hostname}");
}
else
{
ShowError("No users found. Please create a user first.");
}
}
public void ProcessHostnameCommand(string args)
{
if (string.IsNullOrEmpty(args))
{
ShowError("Usage: hostname <new_hostname>");
return;
}
SetHostname(args);
}
private void LoadUsers()
{
try
{
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",
Hostname = parts.Length >= 4 ? parts[3].Trim() : ""
};
users.Add(user);
}
}
// Note: Passwords are stored as SHA256 hashes in the file
// When comparing passwords during login, hash the input password first
}
else
{
users = new List<User>();
}
}
catch
{
users = new List<User>();
}
}
private void SaveUsers()
{
try
{
List<string> lines = new List<string>();
foreach (User user in users)
{
// 使用SHA256加密密ç <C3A7>
string hashedPassword = HashPasswordSha256(user.Password);
string line = $"{user.Username}|{hashedPassword}|{(user.IsAdmin ? "admin" : "user")}|{user.Hostname}";
lines.Add(line);
}
File.WriteAllLines(userFilePath, lines.ToArray());
}
catch (Exception ex)
{
ShowError($"Error saving users: {ex.Message}");
}
}
public bool HasUsers
{
get { return users.Count > 0; }
}
public bool IsAdminSet
{
get
{
foreach (User user in users)
{
if (user.IsAdmin)
{
return true;
}
}
return false;
}
}
public string CurrentUsername
{
get
{
if (currentLoggedInUser != null)
{
return currentLoggedInUser.Username;
}
return "Not logged in";
}
}
public bool CurrentUserIsAdmin
{
get
{
if (currentLoggedInUser != null)
{
return currentLoggedInUser.IsAdmin;
}
return false;
}
}
public void FirstTimeSetup()
{
_logger.Info("UserSystem", "Starting first time setup");
Console.WriteLine("====================================");
Console.WriteLine(" First Time Setup");
Console.WriteLine("====================================");
Console.WriteLine("Please set admin username and password:");
Console.Write("Username: ");
string username = Console.ReadLine();
while (string.IsNullOrWhiteSpace(username))
{
ShowError("Username cannot be empty.");
Console.Write("Username: ");
username = Console.ReadLine();
}
Console.WriteLine("Password: ");
string password = ReadPassword();
Console.WriteLine("Please confirm your password:");
string confirmPassword = ReadPassword();
while (password != confirmPassword)
{
ShowError("Passwords do not match. Please try again.");
Console.Write("Username: ");
username = Console.ReadLine();
while (string.IsNullOrWhiteSpace(username))
{
ShowError("Username cannot be empty.");
Console.Write("Username: ");
username = Console.ReadLine();
}
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();
ShowSuccess("Admin user created successfully!");
_logger.Info("UserSystem", $"Admin user '{username}' created");
Console.WriteLine();
Console.WriteLine("Please set system hostname:");
Console.Write("Hostname: ");
string hostname = Console.ReadLine();
while (string.IsNullOrWhiteSpace(hostname))
{
ShowError("Hostname cannot be empty.");
Console.Write("Hostname: ");
hostname = Console.ReadLine();
}
if (users.Count > 0)
{
users[0].Hostname = hostname;
SaveHostname();
ShowSuccess($"Hostname set to: {hostname}");
_logger.Info("UserSystem", $"Hostname set to: {hostname}");
}
Console.WriteLine();
Console.WriteLine("System will restart in 3 seconds...");
Console.WriteLine("Please wait...");
Console.WriteLine();
for (int i = 3; i > 0; i--)
{
Console.Write($"\rRestarting in {i} seconds... ");
Thread.Sleep(1000);
}
Console.WriteLine("\rRestarting now!");
Sys.Power.Reboot();
}
catch (Exception ex)
{
_logger.Error("UserSystem", $"Error creating admin user: {ex.Message}");
ShowError($"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);
// 检查用户æ‡ä»¶å¤¹æ˜¯å<C2AF>¦å­˜åœ¨
if (!Directory.Exists(userFolderPath))
{
Directory.CreateDirectory(userFolderPath);
Console.WriteLine($"Created user folder for {username}.");
}
else
{
Console.WriteLine($"User folder for {username} already exists.");
}
}
catch (Exception ex)
{
ShowError($"Error creating user folder: {ex.Message}");
}
}
public bool Login()
{
_logger.Info("UserSystem", "Starting login process");
Console.WriteLine("====================================");
Console.WriteLine(" System Login");
Console.WriteLine("====================================");
// Console.ReadKey(true);
// 检æµALT+Space按键
bool useFixMode = false;
ConsoleKeyInfo keyInfo;
try
{
if (fixmode == true) {
keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.Spacebar && (keyInfo.Modifiers & ConsoleModifiers.Alt) != 0)
{
// 检æµåˆ°ALT+Space,è¿å…¥ä¿®å¤<C3A5>模å¼<C3A5>
useFixMode = true;
Console.WriteLine();
Console.WriteLine("Fix Mode Activated");
_logger.Warning("UserSystem", "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!");
_logger.Info("UserSystem", "Fix mode enabled with correct code");
}
else
{
Console.WriteLine("Invalid fix code. Exiting fix mode.");
_logger.Warning("UserSystem", "Invalid fix code provided");
useFixMode = false;
}
}
}
else
{
// 正常登录æµ<C3A6>ç¨
Console.Write("Username: ");
string username = Console.ReadLine();
if (string.IsNullOrWhiteSpace(username))
{
ShowError("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())
{
foundUser = user;
break;
}
}
if (foundUser == null)
{
ShowError("User not found.");
_logger.Warning("UserSystem", $"Login failed: User '{username}' not found");
return false;
}
// 使用SHA256加密输入的密ç <C3A7>å<EFBFBD>Žæ¯”较
string hashedInputPassword = HashPasswordSha256(password);
// Console.WriteLine($"Hashed Input Password: {hashedInputPassword}");
// Console.WriteLine($"Stored Password: {foundUser.Password}");
if (foundUser.Password != hashedInputPassword)
{
ShowError("Invalid password.");
_logger.Warning("UserSystem", $"Login failed: Invalid password for user '{username}'");
return false;
}
ShowSuccess("Login successful!");
_logger.Info("UserSystem", $"User '{username}' logged in successfully");
Console.Beep();
// 设置当å‰<C3A5>登录用户
currentLoggedInUser = foundUser;
// 创建用户文件夹
CreateUserFolder(foundUser.Username);
return true;
}
}
catch
{
// 妿žœè¯»å<C2BB>按键失败,使用普通登录
ShowError("Error reading key input. Using normal login.");
_logger.Error("UserSystem", "Error reading key input during login");
return false;
}
// 妿žœä½¿ç”¨äº†ä¿®å¤<C3A5>模å¼<C3A5>,返åžtrue
if (useFixMode)
{
_logger.Info("UserSystem", "Login bypassed via fix mode");
return true;
}
return false;
}
public bool AddUser(string args, bool isAdmin)
{
_logger.Info("UserSystem", $"Starting to add {(isAdmin ? "admin" : "user")}");
Console.WriteLine("====================================");
Console.WriteLine($" Add {(isAdmin ? "Admin" : "User")}");
Console.WriteLine("====================================");
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2)
{
ShowError("Error: Please specify username and password");
ShowError($"Usage: user add {(isAdmin ? "admin" : "user")} <username> <password>");
return false;
}
string username = parts[0];
string password = parts[1];
// 检查用户å<C2B7><C3A5>是å<C2AF>¦å·²å­˜åœ¨
foreach (User user in users)
{
if (user.Username.ToLower() == username.ToLower())
{
ShowError($"Error: User '{username}' already exists.");
_logger.Warning("UserSystem", $"Add user failed: User '{username}' already exists");
return false;
}
}
try
{
User newUser = new User
{
Username = username,
Password = HashPasswordSha256(password),
IsAdmin = isAdmin
};
users.Add(newUser);
SaveUsers();
// 创建用户文件夹
CreateUserFolder(username);
ShowSuccess($"{(isAdmin ? "Admin" : "User")} '{username}' created successfully!");
ShowSuccess("You shall restart the system to apply the changes.");
_logger.Info("UserSystem", $"{(isAdmin ? "Admin" : "User")} '{username}' created successfully");
return true;
}
catch (Exception ex)
{
_logger.Error("UserSystem", $"Error adding user: {ex.Message}");
ShowError($"Error adding user: {ex.Message}");
return false;
}
}
public bool DeleteUser(string username)
{
_logger.Info("UserSystem", $"Starting to delete user '{username}'");
Console.WriteLine("====================================");
Console.WriteLine(" Delete User");
Console.WriteLine("====================================");
if (string.IsNullOrWhiteSpace(username))
{
ShowError("Error: Please specify username");
ShowError("Usage: user delete <username>");
return false;
}
// 查找用户
User foundUser = null;
foreach (User user in users)
{
if (user.Username.ToLower() == username.ToLower())
{
foundUser = user;
break;
}
}
if (foundUser == null)
{
ShowError($"Error: User '{username}' not found.");
_logger.Warning("UserSystem", $"Delete user failed: User '{username}' not found");
return false;
}
// 检查是å<C2AF>¦æ˜¯æœ€å<E282AC>Žä¸€ä¸ªç®¡ç<C2A1>†å˜
int adminCount = 0;
foreach (User user in users)
{
if (user.IsAdmin)
{
adminCount++;
}
}
if (foundUser.IsAdmin && adminCount <= 1)
{
ShowError("Error: Cannot delete the last admin user.");
_logger.Warning("UserSystem", "Delete user failed: Cannot delete the last admin user");
return false;
}
try
{
users.Remove(foundUser);
SaveUsers();
ShowSuccess($"User '{username}' deleted successfully!");
_logger.Info("UserSystem", $"User '{username}' deleted successfully");
return true;
}
catch (Exception ex)
{
_logger.Error("UserSystem", $"Error deleting user: {ex.Message}");
ShowError($"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}");
}
}
public bool ChangePassword()
{
Console.WriteLine("====================================");
Console.WriteLine(" Change Password");
Console.WriteLine("====================================");
Console.Write("Please enter your current password: ");
string currentPassword = ReadPassword();
// 检查是å<C2AF>¦æœ‰ç”¨æˆ·ç™»å½•
if (currentLoggedInUser == null)
{
ShowError("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
{
currentLoggedInUser.Password = newPassword;
SaveUsers();
ShowSuccess("Password changed successfully!");
return true;
}
catch (Exception ex)
{
ShowError($"Error changing password: {ex.Message}");
return false;
}
}
else
{
ShowError("New passwords do not match.");
return false;
}
}
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);
int cursorLeft = Console.CursorLeft;
int cursorTop = Console.CursorTop;
if (cursorLeft > 0)
{
Console.SetCursorPosition(cursorLeft - 1, cursorTop);
Console.Write(" ");
Console.SetCursorPosition(cursorLeft - 1, cursorTop);
}
}
}
else
{
password += keyInfo.KeyChar;
Console.Write("*");
}
}
return password;
}
}
}