diff --git a/Kernel.cs b/Kernel.cs index 0877ade..6a331bc 100644 --- a/Kernel.cs +++ b/Kernel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using System.IO; @@ -19,7 +19,8 @@ namespace CMLeonOS protected override void BeforeRun() { - Console.Clear(); + // Console.Clear(); + Console.WriteLine(@"-------------------------------------------------"); Console.WriteLine(@" ____ __ __ _ ___ ____ "); Console.WriteLine(@" / ___| \/ | | ___ ___ _ __ / _ \/ ___| "); Console.WriteLine(@" | | | |\/| | | / _ \/ _ \| '_ \| | | \___ \ "); @@ -44,54 +45,46 @@ namespace CMLeonOS var fs_type = fs.GetFileSystemType(@"0:\"); Console.WriteLine("File System Type: " + fs_type); - // 删除默认示例文件和文件夹 - try + // 检查并创建system文件夹 + string systemFolderPath = @"0:\system"; + if (!System.IO.Directory.Exists(systemFolderPath)) { - // 删除示例文件 - if (System.IO.File.Exists(@"0:\example.txt")) - { - System.IO.File.Delete(@"0:\example.txt"); - Console.WriteLine("Deleted example.txt"); - } - - // 删除示例文件夹 - if (System.IO.Directory.Exists(@"0:\example")) - { - System.IO.Directory.Delete(@"0:\example", true); - Console.WriteLine("Deleted example directory"); - } - } - catch (Exception ex) - { - Console.WriteLine($"Error deleting example files: {ex.Message}"); + System.IO.Directory.CreateDirectory(systemFolderPath); + Console.WriteLine("Created system folder."); } // 初始化用户系统 userSystem = new UserSystem(); - // 第一次启动,设置管理员密码 - if (!userSystem.IsPasswordSet) + // 循环直到登录成功或退出 + while (true) { - userSystem.SetAdminPassword(); - } - // 后续启动,需要登录 - else - { - // 循环直到登录成功 - while (!userSystem.Login()) + // 第一次启动,设置管理员账户 + if (!userSystem.HasUsers) { - // 登录失败,继续尝试 + userSystem.FirstTimeSetup(); + } + // 后续启动,需要登录 + else + { + // 循环直到登录成功 + while (!userSystem.Login()) + { + // 登录失败,继续尝试 + } + + // 登录成功后,初始化Shell + shell = new Shell(); + + // 检查并执行启动脚本 + ExecuteStartupScript(); + + // 运行Shell(用户可以输入exit退出) + shell.Run(); + + // 如果用户输入了exit,Shell.Run()会返回,继续循环 } } - - // 登录成功后,初始化Shell - shell = new Shell(); - - // 检查并执行启动脚本 - ExecuteStartupScript(); - - // 系统启动完成,蜂鸣器响一声 - Console.Beep(); } catch (Exception ex) { @@ -101,7 +94,7 @@ namespace CMLeonOS private void ExecuteStartupScript() { - string startupFilePath = @"0:\sys\startup.cm"; + string startupFilePath = @"0:\system\startup.cm"; try { diff --git a/Shell.cs b/Shell.cs index 6cff7e5..e33e644 100644 --- a/Shell.cs +++ b/Shell.cs @@ -21,6 +21,7 @@ namespace CMLeonOS public void Run() { + bool shouldExit = false; while (true) { // 显示当前文件夹路径作为提示符(彩色) @@ -30,6 +31,15 @@ namespace CMLeonOS Console.Write($"{currentPath} | /"); Console.ForegroundColor = originalColor; var input = Console.ReadLine(); + + // 检查是否为退出命令 + if (input != null && input.ToLower().Trim() == "exit") + { + Console.WriteLine("Exiting system..."); + shouldExit = true; + break; + } + commandHistory.Add(input); var parts = input.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (parts.Length > 0) @@ -38,6 +48,12 @@ namespace CMLeonOS var args = parts.Length > 1 ? string.Join(" ", parts, 1, parts.Length - 1) : ""; ProcessCommand(command, args); } + + // 如果需要退出,返回到登录页面 + if (shouldExit) + { + return; + } } } @@ -94,7 +110,6 @@ namespace CMLeonOS Console.WriteLine(" rmdir - Remove directory"); Console.WriteLine(" cat - Display file content"); Console.WriteLine(" echo > - Write text to file"); - Console.WriteLine(" cpass - Change password"); Console.WriteLine(" head - Display first lines of file"); Console.WriteLine(" Usage: head "); Console.WriteLine(" tail - Display last lines of file"); @@ -104,6 +119,14 @@ namespace CMLeonOS Console.WriteLine(" mv - Move/rename file"); Console.WriteLine(" touch - Create empty file"); Console.WriteLine(" find - Find file"); + Console.WriteLine(" getdisk - Show disk information"); + Console.WriteLine(" user - User management"); + Console.WriteLine(" user add admin - Add admin user"); + Console.WriteLine(" user add user - Add regular user"); + Console.WriteLine(" user delete - Delete user"); + Console.WriteLine(" user list - List all users"); + Console.WriteLine(" logout - Logout current user"); + Console.WriteLine(" cpass - Change password"); Console.WriteLine(" version - Show OS version"); Console.WriteLine(" about - Show about information"); Console.WriteLine(" help - Show this help message"); @@ -164,7 +187,7 @@ namespace CMLeonOS else { // 检查是否在sys文件夹中(修复模式下绕过检测) - bool isInSysFolder = (args.Contains(@"\sys\") || args.Contains(@"/sys/")) && !fixMode; + bool isInSysFolder = (args.Contains(@"\system\") || args.Contains(@"/sys/")) && !fixMode; if (isInSysFolder) { @@ -203,7 +226,7 @@ namespace CMLeonOS else { // 检查是否在sys文件夹中(修复模式下绕过检测) - bool isInSysFolder = (args.Contains(@"\sys\") || args.Contains(@"/sys/")) && !fixMode; + bool isInSysFolder = (args.Contains(@"\system\") || args.Contains(@"/sys/")) && !fixMode; if (isInSysFolder) { @@ -233,9 +256,6 @@ namespace CMLeonOS Console.WriteLine("CMLeonOS Test Project"); Console.WriteLine("By LeonOS 2 Developement Team"); break; - case "cpass": - userSystem.ChangePassword(); - break; case "head": HeadFile(args); break; @@ -257,6 +277,18 @@ namespace CMLeonOS case "find": FindFile(args); break; + case "getdisk": + GetDiskInfo(); + break; + case "user": + ProcessUserCommand(args); + break; + case "logout": + userSystem.Logout(); + break; + case "cpass": + userSystem.ChangePassword(); + break; default: Console.WriteLine($"Unknown command: {command}"); break; @@ -805,5 +837,108 @@ namespace CMLeonOS Console.WriteLine($"Error finding file: {ex.Message}"); } } + + private void GetDiskInfo() + { + Console.WriteLine("===================================="); + Console.WriteLine(" Disk Information"); + Console.WriteLine("===================================="); + + try + { + // 使用VFSManager获取所有磁盘 + var disks = Sys.FileSystem.VFS.VFSManager.GetDisks(); + + if (disks == null || disks.Count == 0) + { + Console.WriteLine("No disks found."); + return; + } + + Console.WriteLine($"Total Disks: {disks.Count}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error getting disk info: {ex.Message}"); + } + } + + private string FormatBytes(long bytes) + { + string[] units = { "B", "KB", "MB", "GB", "TB" }; + int unitIndex = 0; + double size = bytes; + + while (size >= 1024 && unitIndex < units.Length - 1) + { + size /= 1024; + unitIndex++; + } + + return $"{size:F2} {units[unitIndex]}"; + } + + private void ProcessUserCommand(string args) + { + if (string.IsNullOrEmpty(args)) + { + Console.WriteLine("Error: Please specify a user command"); + Console.WriteLine("Usage: user [args]"); + Console.WriteLine(" user add admin - Add admin user"); + Console.WriteLine(" user add user - Add regular user"); + Console.WriteLine(" user delete - Delete user"); + Console.WriteLine(" user list - List all users"); + return; + } + + string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length < 1) + { + Console.WriteLine("Error: Please specify a user command"); + Console.WriteLine("Usage: user [args]"); + return; + } + + string subCommand = parts[0].ToLower(); + + if (subCommand == "add") + { + if (parts.Length < 4) + { + Console.WriteLine("Error: Please specify user type and username and password"); + Console.WriteLine("Usage: user add admin "); + Console.WriteLine("Usage: user add user "); + return; + } + + string userType = parts[1].ToLower(); + string username = parts[2]; + string password = parts[3]; + bool isAdmin = userType == "admin"; + + userSystem.AddUser($"{username} {password}", isAdmin); + } + else if (subCommand == "delete") + { + if (parts.Length < 2) + { + Console.WriteLine("Error: Please specify username"); + Console.WriteLine("Usage: user delete "); + return; + } + + string username = parts[1]; + userSystem.DeleteUser(username); + } + else if (subCommand == "list") + { + userSystem.ListUsers(); + } + else + { + Console.WriteLine($"Error: Unknown user command '{subCommand}'"); + Console.WriteLine("Available commands: add, delete, list"); + } + } } } \ No newline at end of file diff --git a/UserSystem.cs b/UserSystem.cs index 544ccd3..eef294d 100644 --- a/UserSystem.cs +++ b/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 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(); + + 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(); + } } catch { - isPasswordSet = false; + users = new List(); } } - public bool IsPasswordSet + private void SaveUsers() { - get { return isPasswordSet; } + try + { + List lines = new List(); + 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")} "); + 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 "); + 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; - } - } } -} \ No newline at end of file +}