mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-03-03 15:30:27 +00:00
多用户系统
This commit is contained in:
503
UserSystem.cs
503
UserSystem.cs
@@ -1,23 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace CMLeonOS
|
||||
{
|
||||
public class User
|
||||
{
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public bool IsAdmin { get; set; }
|
||||
}
|
||||
|
||||
public class UserSystem
|
||||
{
|
||||
private string sysDirectory = @"0:\sys";
|
||||
private string adminPasswordFilePath;
|
||||
private bool isPasswordSet = false;
|
||||
private string sysDirectory = @"0:\system";
|
||||
private string userFilePath;
|
||||
private List<User> users;
|
||||
|
||||
public UserSystem()
|
||||
{
|
||||
// 确保sys目录存在
|
||||
EnsureSysDirectoryExists();
|
||||
|
||||
// 设置密码文件路径
|
||||
adminPasswordFilePath = Path.Combine(sysDirectory, "admin_password.txt");
|
||||
// 设置用户文件路径
|
||||
userFilePath = Path.Combine(sysDirectory, "user.dat");
|
||||
|
||||
CheckPasswordStatus();
|
||||
// 加载用户数据
|
||||
LoadUsers();
|
||||
}
|
||||
|
||||
private void EnsureSysDirectoryExists()
|
||||
@@ -35,53 +43,172 @@ namespace CMLeonOS
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckPasswordStatus()
|
||||
private void LoadUsers()
|
||||
{
|
||||
try
|
||||
{
|
||||
isPasswordSet = File.Exists(adminPasswordFilePath);
|
||||
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>();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
isPasswordSet = false;
|
||||
users = new List<User>();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsPasswordSet
|
||||
private void SaveUsers()
|
||||
{
|
||||
get { return isPasswordSet; }
|
||||
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());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error saving users: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public void SetAdminPassword()
|
||||
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 void FirstTimeSetup()
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" First Time Setup");
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine("Please set a password for admin user:");
|
||||
Console.WriteLine("Please set admin username and password:");
|
||||
|
||||
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: ");
|
||||
string password = ReadPassword();
|
||||
|
||||
Console.WriteLine("Please confirm your password:");
|
||||
string confirmPassword = ReadPassword();
|
||||
|
||||
if (password == confirmPassword)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 简单存储密码(实际应用中应使用加密)
|
||||
File.WriteAllText(adminPasswordFilePath, password);
|
||||
Console.WriteLine("Password set successfully!");
|
||||
isPasswordSet = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error setting password: {ex.Message}");
|
||||
}
|
||||
}
|
||||
else
|
||||
while (password != confirmPassword)
|
||||
{
|
||||
Console.WriteLine("Passwords do not match. Please try again.");
|
||||
SetAdminPassword();
|
||||
|
||||
Console.Write("Username: ");
|
||||
username = Console.ReadLine();
|
||||
|
||||
while (string.IsNullOrWhiteSpace(username))
|
||||
{
|
||||
Console.WriteLine("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();
|
||||
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))
|
||||
{
|
||||
Directory.CreateDirectory(userFolderPath);
|
||||
Console.WriteLine($"Created user folder for {username}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"User folder for {username} already exists.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error creating user folder: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,8 +217,8 @@ namespace CMLeonOS
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" System Login");
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine("Username: admin");
|
||||
Console.WriteLine("Password:");
|
||||
Console.WriteLine("Press any key to continue...");
|
||||
Console.ReadKey(true);
|
||||
|
||||
// 检测ALT+Space按键
|
||||
bool useFixMode = false;
|
||||
@@ -142,50 +269,48 @@ namespace CMLeonOS
|
||||
}
|
||||
else
|
||||
{
|
||||
// 正常密码输入
|
||||
string password = "";
|
||||
password += keyInfo.KeyChar;
|
||||
Console.Write("*");
|
||||
// 正常登录流程
|
||||
Console.Write("Username: ");
|
||||
string username = Console.ReadLine();
|
||||
|
||||
while (true)
|
||||
if (string.IsNullOrWhiteSpace(username))
|
||||
{
|
||||
var passKey = Console.ReadKey(true);
|
||||
if (passKey.Key == ConsoleKey.Enter)
|
||||
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())
|
||||
{
|
||||
Console.WriteLine();
|
||||
foundUser = user;
|
||||
break;
|
||||
}
|
||||
else if (passKey.Key == ConsoleKey.Backspace)
|
||||
{
|
||||
if (password.Length > 0)
|
||||
{
|
||||
password = password.Substring(0, password.Length - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
password += passKey.KeyChar;
|
||||
Console.Write("*");
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
if (foundUser == null)
|
||||
{
|
||||
string storedPassword = File.ReadAllText(adminPasswordFilePath);
|
||||
if (password == storedPassword)
|
||||
{
|
||||
Console.WriteLine("Login successful!");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Invalid password. Please try again.");
|
||||
return false;
|
||||
}
|
||||
Console.WriteLine("User not found.");
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
if (foundUser.Password == password)
|
||||
{
|
||||
Console.WriteLine($"Error during login: {ex.Message}");
|
||||
Console.WriteLine("Login successful!");
|
||||
|
||||
// 创建用户文件夹
|
||||
CreateUserFolder(foundUser.Username);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Invalid password. Please try again.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -206,6 +331,202 @@ namespace CMLeonOS
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool AddUser(string args, bool isAdmin)
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine($" Add {(isAdmin ? "Admin" : "User")}");
|
||||
Console.WriteLine("====================================");
|
||||
|
||||
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length < 2)
|
||||
{
|
||||
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())
|
||||
{
|
||||
Console.WriteLine($"Error: User '{username}' already exists.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
User newUser = new User
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundUser == null)
|
||||
{
|
||||
Console.WriteLine($"Error: User '{username}' not found.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查是否是最后一个管理员
|
||||
int adminCount = 0;
|
||||
foreach (User user in users)
|
||||
{
|
||||
if (user.IsAdmin)
|
||||
{
|
||||
adminCount++;
|
||||
}
|
||||
}
|
||||
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
public bool ChangePassword()
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" Change Password");
|
||||
Console.WriteLine("====================================");
|
||||
|
||||
Console.Write("Please enter your current password: ");
|
||||
string currentPassword = ReadPassword();
|
||||
|
||||
// 查找当前登录用户
|
||||
User currentUser = null;
|
||||
foreach (User user in users)
|
||||
{
|
||||
if (user.Username.ToLower() == "current")
|
||||
{
|
||||
currentUser = user;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
currentUser.Password = newPassword;
|
||||
SaveUsers();
|
||||
Console.WriteLine("Password changed successfully!");
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error changing password: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("New passwords do not match.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Logout()
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" User Logout");
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine("Logging out...");
|
||||
Console.WriteLine("Logout successful!");
|
||||
}
|
||||
|
||||
private string ReadPassword()
|
||||
{
|
||||
string password = "";
|
||||
@@ -222,8 +543,6 @@ namespace CMLeonOS
|
||||
if (password.Length > 0)
|
||||
{
|
||||
password = password.Substring(0, password.Length - 1);
|
||||
// 简化退格处理,只修改password字符串
|
||||
// 在Cosmos中,Console.Write("\b \b")可能不被支持
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -234,51 +553,5 @@ namespace CMLeonOS
|
||||
}
|
||||
return password;
|
||||
}
|
||||
|
||||
public bool ChangePassword()
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" Change Password");
|
||||
Console.WriteLine("====================================");
|
||||
|
||||
// 验证当前密码
|
||||
Console.WriteLine("Please enter your current password:");
|
||||
string currentPassword = ReadPassword();
|
||||
|
||||
try
|
||||
{
|
||||
string storedPassword = File.ReadAllText(adminPasswordFilePath);
|
||||
if (currentPassword != storedPassword)
|
||||
{
|
||||
Console.WriteLine("Current password is incorrect.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 设置新密码
|
||||
Console.WriteLine("Please enter your new password:");
|
||||
string newPassword = ReadPassword();
|
||||
|
||||
Console.WriteLine("Please confirm your new password:");
|
||||
string confirmPassword = ReadPassword();
|
||||
|
||||
if (newPassword == confirmPassword)
|
||||
{
|
||||
// 存储新密码
|
||||
File.WriteAllText(adminPasswordFilePath, newPassword);
|
||||
Console.WriteLine("Password changed successfully!");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("New passwords do not match.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error changing password: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user