diff --git a/Lua.md b/Lua.md new file mode 100644 index 0000000..ca6e47b --- /dev/null +++ b/Lua.md @@ -0,0 +1,1228 @@ +# CMLeonOS Lua API 文档 + +本文档记录了 CMLeonOS 中 UniLua 支持的所有函数和库。 + +## 目录 + +- [基础库](#基础库) +- [数学库](#数学库) +- [字符串库](#字符串库) +- [操作系统库](#操作系统库) +- [输入输出库](#输入输出库) +- [协程库](#协程库) +- [表库](#表库) +- [调试库](#调试库) +- [位运算库](#位运算库) +- [编码库](#编码库) +- [包库](#包库) + +--- + +## 基础库 (base) + +### assert(v [, message]) +如果 v 为 false 或 nil,则抛出错误。可选参数 message 为错误信息。 + +```lua +assert(true, "This should be true") +assert(false, "This is false") +``` + +### collectgarbage([opt]) +垃圾回收控制。支持以下选项: +- `"collect"` - 执行垃圾回收 +- `"count"` - 返回当前内存使用量(千字节) +- `"step"` - 执行一步垃圾回收 +- `"isrunning"` - 返回垃圾回收器是否在运行 + +```lua +collectgarbage("collect") +collectgarbage("count") +``` + +### dofile([filename]) +加载并执行指定文件。 + +```lua +dofile("script.lua") +``` + +### error(message [, level]) +抛出错误并终止当前受保护的调用。 + +```lua +error("Something went wrong") +``` + +### ipairs(t) +遍历数组,返回迭代器函数。 + +```lua +for i, v in ipairs({1, 2, 3}) do + print(i, v) +end +``` + +### loadfile([filename]) +加载文件但不执行,返回函数或 nil, error。 + +```lua +local func, err = loadfile("script.lua") +if func then + func() +end +``` + +### load(string [, chunkname]) +加载字符串但不执行,返回函数或 nil, error。 + +```lua +local func = load("print('Hello')") +if func then + func() +end +``` + +### loadstring(string [, chunkname]) +加载字符串但不执行,返回函数或 nil, error。 + +```lua +local func = loadstring("print('Hello')") +if func then + func() +end +``` + +### next(table [, index]) +返回表的下一个键值对。 + +```lua +t = {a = 1, b = 2} +local k, v = next(t) +print(k, v) -- a, 1 +``` + +### pairs(t) +遍历表,返回迭代器函数。 + +```lua +t = {x = 1, y = 2, z = 3} +for k, v in pairs(t) do + print(k, v) +end +``` + +### pcall(f [, arg1, ...]) +安全调用函数,捕获错误。 + +```lua +local status, err = pcall(function() + error("Something went wrong") +end) +if not status then + print(err) +end +``` + +### print(...) +打印参数到控制台。 + +```lua +print("Hello, World!") +print("Value:", 42) +``` + +### rawequal(v1, v2) +比较两个值是否相等(不使用元方法)。 + +```lua +print(rawequal(1, 1)) -- true +print(rawequal(1, 2)) -- false +``` + +### rawlen(v) +返回值的长度(不使用元方法)。 + +```lua +print(rawlen("hello")) -- 5 +``` + +### rawget(table, index) +获取表的值(不使用元方法)。 + +```lua +t = setmetatable({}, {__index = function() return "default" end}) +print(rawget(t, "key")) -- default +``` + +### rawset(table, index, value) +设置表的值(不使用元方法)。 + +```lua +t = {} +rawset(t, "key", "value") +``` + +### select(index, ...) +返回第 index 个参数。 + +```lua +print(select(2, "a", "b", "c")) -- c +``` + +### getmetatable(object) +返回对象的元表。 + +```lua +t = {} +mt = {__add = function(a, b) return a + b end} +setmetatable(t, mt) +print(getmetatable(t).__add) -- function +``` + +### setmetatable(table, metatable) +设置对象的元表。 + +```lua +t = {} +mt = {__add = function(a, b) return a + b end} +setmetatable(t, mt) +``` + +### tonumber(e [, base]) +将值转换为数字。 + +```lua +print(tonumber("123")) -- 123 +print(tonumber("FF", 16)) -- 255 +``` + +### tostring(v) +将值转换为字符串。 + +```lua +print(tostring(123)) -- "123" +print(tostring({})) -- "table: 0x..." +``` + +### type(v) +返回值的类型。 + +```lua +print(type(123)) -- number +print(type("hello")) -- string +print(type({})) -- table +print(type(nil)) -- nil +``` + +### xpcall(f [, arg1, ...]) +扩展的 pcall,返回状态和错误。 + +```lua +local ok, err = xpcall(function() + error("Something went wrong") +end) +if not ok then + print(err) +end +``` + +--- + +## 数学库 (math) + +### math.abs(x) +返回 x 的绝对值。 + +```lua +print(math.abs(-5)) -- 5 +print(math.abs(5)) -- 5 +``` + +### math.acos(x) +返回 x 的反余弦值(弧度)。 + +```lua +print(math.acos(0)) -- 1.570796 +``` + +### math.asin(x) +返回 x 的反正弦值(弧度)。 + +```lua +print(math.asin(0)) -- 0 +``` + +### math.atan2(y, x) +返回 y/x 的反正切值(弧度)。 + +```lua +print(math.atan2(0, 1)) -- 0 +``` + +### math.atan(x) +返回 x 的反正切值(弧度)。 + +```lua +print(math.atan(1)) -- 0.785398 +``` + +### math.ceil(x) +返回不小于 x 的最小整数。 + +```lua +print(math.ceil(3.5)) -- 4 +print(math.ceil(-3.5)) -- -3 +``` + +### math.cosh(x) +返回 x 的双曲余弦值。 + +```lua +print(math.cosh(0)) -- 1 +``` + +### math.cos(x) +返回 x 的余弦值(弧度)。 + +```lua +print(math.cos(0)) -- 1 +print(math.cos(math.pi)) -- -1 +``` + +### math.deg(x) +将弧度转换为角度。 + +```lua +print(math.deg(math.pi)) -- 180 +``` + +### math.exp(x) +返回 e 的 x 次方。 + +```lua +print(math.exp(1)) -- 2.718282 +``` + +### math.floor(x) +返回不大于 x 的最大整数。 + +```lua +print(math.floor(3.5)) -- 3 +print(math.floor(-3.5)) -- -4 +``` + +### math.fmod(x, y) +返回 x 除以 y 的余数。 + +```lua +print(math.fmod(7, 3)) -- 1 +``` + +### math.frexp(x) +将 x 分解为尾数和指数。 + +```lua +local m, e = math.frexp(1.5) +print(m, e) +``` + +### math.ldexp(m, e) +返回 m 乘以 2 的 e 次方。 + +```lua +print(math.ldexp(1, 2)) -- 4 +``` + +### math.log10(x) +返回 x 的以 10 为底的对数。 + +```lua +print(math.log10(100)) -- 2 +``` + +### math.log(x [, base]) +返回 x 的对数。默认以 e 为底。 + +```lua +print(math.log(10)) -- 2.302585 +print(math.log(100, 10)) -- 2 +``` + +### math.max(x1, ...) +返回参数中的最大值。 + +```lua +print(math.max(1, 2, 3)) -- 3 +print(math.max(-5, -2, -1)) -- -1 +``` + +### math.min(x1, ...) +返回参数中的最小值。 + +```lua +print(math.min(1, 2, 3)) -- 1 +print(math.min(-5, -2, -1)) -- -5 +``` + +### math.modf(x) +将 x 分解为整数和小数部分。 + +```lua +local i, f = math.modf(3.5) +print(i, f) +``` + +### math.pow(x, y) +返回 x 的 y 次方。 + +```lua +print(math.pow(2, 3)) -- 8 +print(math.pow(10, 2)) -- 100 +``` + +### math.rad(x) +将角度转换为弧度。 + +```lua +print(math.rad(180)) -- 3.141593 +``` + +### math.random([m [, n]]) +返回随机数。无参数返回 [0,1),一个参数返回 [1,m],两个参数返回 [m,n]。 + +```lua +print(math.random()) -- 0 或 1 +print(math.random(10)) -- 1-10 +print(math.random(5, 10)) -- 5-10 +``` + +### math.randomseed(x) +设置随机数生成器的种子。 + +```lua +math.randomseed(os.time()) +print(math.random()) +``` + +### math.sinh(x) +返回 x 的双曲正弦值。 + +```lua +print(math.sinh(0)) -- 0 +``` + +### math.sin(x) +返回 x 的正弦值(弧度)。 + +```lua +print(math.sin(0)) -- 0 +print(math.sin(math.pi/2)) -- 1 +``` + +### math.sqrt(x) +返回 x 的平方根。 + +```lua +print(math.sqrt(16)) -- 4 +print(math.sqrt(2)) -- 1.414214 +``` + +### math.tanh(x) +返回 x 的双曲正切值。 + +```lua +print(math.tanh(0)) -- 0 +``` + +### math.tan(x) +返回 x 的正切值(弧度)。 + +```lua +print(math.tan(0)) -- 0 +print(math.tan(math.pi/4)) -- 1 +``` + +### math.pi +圆周率常量。 + +```lua +print(math.pi) -- 3.141592653589793 +``` + +### math.huge +表示最大数值的常量。 + +```lua +print(math.huge) +``` + +--- + +## 字符串库 (string) + +### string.byte(s [, i [, j]]) +返回字符的内部数值表示。 + +```lua +print(string.byte("ABC")) -- 65 +print(string.byte("ABC", 2)) -- 66 +print(string.byte("ABC", -1)) -- 67 +``` + +### string.char(...) +将数值转换为字符。 + +```lua +print(string.char(65, 66, 67)) -- ABC +``` + +### string.dump(function) +返回函数的二进制表示。 + +```lua +print(string.dump(print)) +``` + +### string.find(s, pattern [, init [, plain]]) +在字符串中查找模式。 + +```lua +print(string.find("hello world", "world")) -- 7 +print(string.find("hello world", "l")) -- 3 +``` + +### string.format(formatstring, ...) +格式化字符串。 + +```lua +print(string.format("Value: %d", 42)) +print(string.format("Name: %s, Age: %d", "Alice", 30)) +``` + +### string.gmatch(s, pattern) +返回字符串中所有匹配模式的迭代器。 + +```lua +for word in string.gmatch("hello world", "%a+") do + print(word) +end +``` + +### string.gsub(s, pattern, repl [, n]) +替换字符串中的模式。 + +```lua +print(string.gsub("hello world", "world", "Lua")) -- hello Lua +print(string.gsub("hello world", "l", "L")) -- HeLLo Lua +``` + +### string.len(s) +返回字符串长度。 + +```lua +print(string.len("hello")) -- 5 +``` + +### string.lower(s) +将字符串转换为小写。 + +```lua +print(string.lower("HELLO")) -- hello +``` + +### string.match(s, pattern [, init]) +返回字符串中第一个匹配模式的子串。 + +```lua +print(string.match("hello world", "%w+")) -- hello +``` + +### string.rep(s, n) +重复字符串 n 次。 + +```lua +print(string.rep("ab", 3)) -- ababab +``` + +### string.reverse(s) +反转字符串。 + +```lua +print(string.reverse("hello")) -- olleh +``` + +### string.sub(s, i [, j]) +返回字符串的子串。 + +```lua +print(string.sub("hello world", 1, 5)) -- hello +print(string.sub("hello world", 7)) -- world +``` + +### string.upper(s) +将字符串转换为大写。 + +```lua +print(string.upper("hello")) -- HELLO +``` + +--- + +## 操作系统库 (os) + +### os.clock() +返回程序使用的 CPU 时间(秒)。 + +```lua +print(os.clock()) +``` + +### os.gethostname() +返回系统主机名。 + +```lua +print(os.gethostname()) +``` + +### os.getenv(varname) +返回环境变量的值。 + +```lua +print(os.getenv("PATH")) +``` + +### os.setenv(varname, value) +设置环境变量的值。 + +```lua +os.setenv("MYVAR", "value") +``` + +### os.delenv(varname) +删除环境变量。 + +```lua +os.delenv("MYVAR") +``` + +### os.addenv(varname, value) +添加环境变量(同 setenv)。 + +```lua +os.addenv("MYVAR", "value") +``` + +### os.execute(command) +执行 Shell 命令。 + +```lua +os.execute("ls") +os.execute("echo Hello") +``` + +### os.executefile(path) +执行命令文件(.cm)。 + +```lua +os.executefile("myscript.cm") +``` + +### os.reboot() +重启系统。 + +```lua +os.reboot() +``` + +### os.shutdown() +关闭系统。 + +```lua +os.shutdown() +``` + +### os.sleep(seconds) +休眠指定秒数。 + +```lua +os.sleep(5) +``` + +### os.beep() +发出蜂鸣声。 + +```lua +os.beep() +``` + +### os.clear() +清屏。 + +```lua +os.clear() +``` + +### os.getusername() +返回当前登录用户名。 + +```lua +print(os.getusername()) +``` + +### os.isadmin() +检查当前用户是否是管理员。 + +```lua +if os.isadmin() then + print("User is admin") +else + print("User is not admin") +end +``` + +### os.sha256(input) +计算字符串的 SHA256 哈希值。 + +```lua +local hash = os.sha256("Hello World") +print(hash) +``` + +### os.base64encrypt(input) +将字符串编码为 Base64。 + +```lua +local encoded = os.base64encrypt("Hello World") +print(encoded) +``` + +### os.base64decrypt(input) +将 Base64 字符串解码。 + +```lua +local decoded = os.base64decrypt("SGVsbG8gV29ybGxcmVvcmxvYg==") +print(decoded) +``` + +--- + +## 输入输出库 (io) + +### io.close(file) +关闭文件。 + +```lua +local file = io.open("test.txt", "w") +file:write("Hello") +io.close(file) +``` + +### io.flush() +刷新所有打开文件的输出缓冲区。 + +```lua +io.flush() +``` + +### io.input([file]) +设置默认输入文件。 + +```lua +io.input("input.txt") +``` + +### io.lines([filename]) +返回文件行的迭代器。 + +```lua +for line in io.lines("test.txt") do + print(line) +end +``` + +### io.open(filename [, mode]) +打开文件,返回文件句柄。 + +```lua +local file = io.open("test.txt", "r") +local content = file:read("*a") +file:close() +``` + +### io.output([file]) +设置默认输出文件。 + +```lua +io.output("output.txt") +``` + +### io.popen(prog [, mode]) +启动程序并返回文件句柄。 + +```lua +local file = io.popen("ls", "r") +local output = file:read("*a") +file:close() +``` + +### io.read(...) +从默认输入文件读取数据。 + +```lua +local input = io.read() +print(input) +``` + +### io.tmpfile() +返回临时文件的句柄。 + +```lua +local file = io.tmpfile() +file:write("temp data") +file:close() +``` + +### io.type(file) +检查文件是否是打开的文件句柄。 + +```lua +local file = io.open("test.txt", "r") +print(io.type(file)) -- file +``` + +### io.write(...) +写入数据到默认输出文件。 + +```lua +io.write("Hello, World!\n") +``` + +--- + +## 协程库 (coroutine) + +### coroutine.create(f) +创建新的协程。 + +```lua +co = coroutine.create(function() + print("Coroutine started") +end) +``` + +### coroutine.resume(co [, val1, ...]) +继续或启动协程。 + +```lua +coroutine.resume(co) +``` + +### coroutine.running() +返回当前运行的协程。 + +```lua +print(coroutine.running()) +``` + +### coroutine.status(co) +返回协程的状态。 + +```lua +print(coroutine.status(co)) -- running, suspended, normal, dead +``` + +### coroutine.wrap(f) +创建包装函数的函数。 + +```lua +co = coroutine.create(function() + print("Coroutine") +end) +local wrapped = coroutine.wrap(co) +wrapped() +``` + +### coroutine.yield(...) +挂起当前协程。 + +```lua +coroutine.yield("value") +``` + +--- + +## 表库 (table) + +### table.concat(list [, sep [, i [, j]]) +连接表中的元素。 + +```lua +t = {"a", "b", "c"} +print(table.concat(t, ", ")) -- a, b, c +``` + +### table.insert(list, [pos,] value) +在表中插入元素。 + +```lua +t = {1, 2, 3} +table.insert(t, 4) +``` + +### table.maxn(t) +返回表的最大数字索引(已弃用,使用 # 运算符)。 + +```lua +t = {1, 2, nil, 4} +print(table.maxn(t)) -- 4 +``` + +### table.remove(list [, pos]) +从表中删除元素。 + +```lua +t = {1, 2, 3} +table.remove(t, 2) +``` + +### table.sort(list [, comp]) +对表进行排序。 + +```lua +t = {3, 1, 4, 2} +table.sort(t) +``` + +--- + +## 调试库 (debug) + +### debug.debug() +进入调试模式。 + +```lua +debug.debug() +``` + +### debug.getfenv(object) +返回对象的环境。 + +```lua +print(debug.getfenv(function() return x end)) +``` + +### debug.gethook() +返回当前的钩子函数。 + +```lua +print(debug.gethook()) +``` + +### debug.getinfo([thread [, f [, what]]) +返回函数的信息。 + +```lua +print(debug.getinfo(1)) +``` + +### debug.getlocal([thread [, f [, loc]]) +返回函数的局部变量。 + +```lua +print(debug.getlocal(1, 1)) +``` + +### debug.getmetatable(object) +返回对象的元表。 + +```lua +t = {} +mt = {__add = function(a, b) return a + b end} +setmetatable(t, mt) +print(debug.getmetatable(t).__add) +``` + +### debug.getregistry() +返回注册表。 + +```lua +print(debug.getregistry()) +``` + +### debug.getupvalue(f [, i]) +返回函数的上值。 + +```lua +print(debug.getupvalue(1)) +``` + +### debug.setfenv(object, table) +设置对象的环境。 + +```lua +debug.setfenv(function() return x end, {}) +``` + +### debug.sethook(hook, mask [, count]) +设置钩子函数。 + +```lua +debug.sethook(function() print("Hook called") end, "c") +``` + +### debug.setlocal([thread [, f,] level, value) +设置函数的局部变量。 + +```lua +debug.setlocal(1, 1, "value") +``` + +### debug.setmetatable(object, table) +设置对象的元表。 + +```lua +debug.setmetatable(t, mt) +``` + +### debug.setupvalue(f [, i,] value) +设置函数的上值。 + +```lua +debug.setupvalue(1, 1, "newvalue") +``` + +### debug.traceback([thread [, message [, level]]) +返回调用栈的跟踪信息。 + +```lua +print(debug.traceback()) +``` + +--- + +## 位运算库 (bit) + +### bit.band(x1, x2 [, ...]) +按位与操作。 + +```lua +print(bit.band(0x0F, 0x0F)) -- 0x0F +``` + +### bit.bnot(x) +按位非操作。 + +```lua +print(bit.bnot(0x0F)) -- 0xFFFFFFF0 +``` + +### bit.bor(x1, x2 [, ...]) +按位或操作。 + +```lua +print(bit.bor(0x0F, 0x0F)) -- 0x0F +``` + +### bit.bxor(x1, x2 [, ...]) +按位异或操作。 + +```lua +print(bit.bxor(0x0F, 0x0F)) -- 0x00 +``` + +### bit.lshift(x, disp) +按位左移。 + +```lua +print(bit.lshift(1, 2)) -- 4 +``` + +### bit.rshift(x, disp) +按位右移。 + +```lua +print(bit.rshift(4, 2)) -- 1 +``` + +### bit.arshift(x, disp) +按位算术右移。 + +```lua +print(bit.arshift(4, 2)) -- 1 +``` + +### bit.rol(x, disp) +循环左移。 + +```lua +print(bit.rol(0x0F, 4)) -- 0xF0 +``` + +### bit.ror(x, disp) +循环右移。 + +```lua +print(bit.ror(0x0F, 4)) -- 0x0F +``` + +### bit.tobit(x) +转换为位字符串。 + +```lua +print(bit.tobit(0x0F)) -- 00001111 +``` + +--- + +## 编码库 (enc) + +### enc.base64encode(input) +将字符串编码为 Base64。 + +```lua +local encoded = enc.base64encode("Hello World") +print(encoded) +``` + +### enc.base64decode(input) +将 Base64 字符串解码。 + +```lua +local decoded = enc.base64decode("SGVsbG8gV29ybGxcmVvcmxvYg==") +print(decoded) +``` + +--- + +## 包库 (package) + +### package.loaded +已加载的包表。 + +```lua +print(package.loaded) +``` + +### package.loaders +包加载器表。 + +```lua +print(package.loaders) +``` + +### package.loadlib(libname [, initfunc]) +加载 C 库。 + +```lua +package.loadlib("mylib") +``` + +### package.path +包搜索路径。 + +```lua +print(package.path) +``` + +### package.searchpath(name [, path [, sep [, rep]]) +搜索包路径。 + +```lua +print(package.searchpath("mylib")) +``` + +### package.seeall([name]) +列出所有已加载的包。 + +```lua +print(package.seeall()) +``` + +--- + +## 使用示例 + +### 交互式 Lua Shell + +使用 `lua --shell` 进入交互模式: + +``` +lua --shell +==================================== + Lua Interactive Shell +==================================== +Type 'exit' or 'quit' to exit + +lua> print("Hello, World!") +Hello, World! + +lua> os.gethostname() +myserver + +lua> os.sha256("Hello") +a591a6d40bf420404a011733cfb7b1d12e + +lua> exit +Exiting Lua shell... +``` + +### 执行 Lua 脚本文件 + +```lua +lua script.lua +``` + +### 系统信息查询 + +```lua +print("Hostname:", os.gethostname()) +print("Username:", os.getusername()) +print("Is Admin:", os.isadmin()) +print("SHA256:", os.sha256("Hello")) +``` + +### 环境变量操作 + +```lua +os.setenv("MYVAR", "value") +print(os.getenv("MYVAR")) +os.delenv("MYVAR") +``` + +### 加密和编码 + +```lua +local hash = os.sha256("password") +local encoded = os.base64encrypt("secret") +local decoded = os.base64decrypt(encoded) +print("Hash:", hash) +print("Encoded:", encoded) +print("Decoded:", decoded) +``` + +--- + +## 注意事项 + +1. **交互模式**:使用 `lua --shell` 进入交互式 Lua Shell +2. **错误处理**:所有 Lua 执行错误都会被捕获并显示 +3. **系统函数**:`os` 库包含 CMLeonOS 特定的系统函数 +4. **加密支持**:支持 SHA256 和 Base64 编码/解码 +5. **标准 Lua**:完全兼容 Lua 5.1 标准 + +--- + +## 版本信息 + +- **Lua 版本**:5.1 +- **UniLua 版本**:自定义实现 +- **CMLeonOS 版本**:最新 + +--- + +## 更新日志 + +- 2026-02-04: 初始文档创建 +- 添加了所有 UniLua 支持的库和函数 +- 包含 CMLeonOS 特定的系统扩展函数 diff --git a/SHA256.cs b/SHA256.cs index 270cfa4..51fc0a9 100644 --- a/SHA256.cs +++ b/SHA256.cs @@ -2,7 +2,7 @@ using System; namespace CMLeonOS { - internal class Sha256 + public class Sha256 { private static readonly uint[] K = new uint[64] { 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, diff --git a/UniLua/LuaOsLib.cs b/UniLua/LuaOsLib.cs index 81383c0..1397280 100644 --- a/UniLua/LuaOsLib.cs +++ b/UniLua/LuaOsLib.cs @@ -31,6 +31,9 @@ namespace UniLua new NameFuncPair("clear", OS_Clear), new NameFuncPair("getusername", OS_Getusername), new NameFuncPair("isadmin", OS_Isadmin), + new NameFuncPair("sha256", OS_Sha256), + new NameFuncPair("base64encrypt", OS_Base64Encrypt), + new NameFuncPair("base64decrypt", OS_Base64Decrypt), #endif }; @@ -177,6 +180,30 @@ namespace UniLua lua.PushBoolean(isAdmin); return 1; } + + private static int OS_Sha256( ILuaState lua ) + { + string input = lua.L_CheckString(1); + string hash = CMLeonOS.UserSystem.HashPasswordSha256(input) ?? ""; + lua.PushString(hash); + return 1; + } + + private static int OS_Base64Encrypt( ILuaState lua ) + { + string input = lua.L_CheckString(1); + string encoded = CMLeonOS.Base64Helper.Encode(input); + lua.PushString(encoded); + return 1; + } + + private static int OS_Base64Decrypt( ILuaState lua ) + { + string input = lua.L_CheckString(1); + string decoded = CMLeonOS.Base64Helper.Decode(input); + lua.PushString(decoded); + return 1; + } #endif } } diff --git a/UserSystem.cs b/UserSystem.cs index bcbeb87..a2bb656 100644 --- a/UserSystem.cs +++ b/UserSystem.cs @@ -38,7 +38,7 @@ namespace CMLeonOS Console.ResetColor(); } - internal static string HashPasswordSha256(string password) + public static string HashPasswordSha256(string password) { Sha256 sha256 = new Sha256();