mirror of
https://github.com/akyaiy/GoSally-mvp.git
synced 2026-01-03 20:12:25 +00:00
Compare commits
3 Commits
bed0471cc4
...
f0c591f325
| Author | SHA1 | Date | |
|---|---|---|---|
| f0c591f325 | |||
| 36ee320c45 | |||
| ee6fd205d5 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -13,5 +13,5 @@ Taskfile.yml
|
|||||||
config.yaml
|
config.yaml
|
||||||
|
|
||||||
# Garbage
|
# Garbage
|
||||||
com/_Access/GetMasterAccess.lua
|
com/_*
|
||||||
com/_Zones/GetZoneInfo.lua
|
com/test.lua
|
||||||
14
Makefile
14
Makefile
@@ -31,13 +31,13 @@ build:
|
|||||||
@# @echo "CGO_LDFLAGS is: '$(CGO_LDFLAGS)'"
|
@# @echo "CGO_LDFLAGS is: '$(CGO_LDFLAGS)'"
|
||||||
@# CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)"
|
@# CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)"
|
||||||
@go build -trimpath -ldflags "-w -s $(LDFLAGS)" -o $(BIN_DIR)/$(APP_NAME) ./
|
@go build -trimpath -ldflags "-w -s $(LDFLAGS)" -o $(BIN_DIR)/$(APP_NAME) ./
|
||||||
@if ! command -v upx >/dev/null 2>&1; then \
|
# @if ! command -v upx >/dev/null 2>&1; then \
|
||||||
echo "upx not found, skipping compression."; \
|
# echo "upx not found, skipping compression."; \
|
||||||
elif upx -t $(BIN_DIR)/$(APP_NAME) >/dev/null 2>&1; then \
|
# elif upx -t $(BIN_DIR)/$(APP_NAME) >/dev/null 2>&1; then \
|
||||||
echo "$(BIN_DIR)/$(APP_NAME) already compressed, skipping."; \
|
# echo "$(BIN_DIR)/$(APP_NAME) already compressed, skipping."; \
|
||||||
else \
|
# else \
|
||||||
upx $(BIN_DIR)/$(APP_NAME) >/dev/null 2>&1 || true; \
|
# upx $(BIN_DIR)/$(APP_NAME) >/dev/null 2>&1 || true; \
|
||||||
fi
|
# fi
|
||||||
|
|
||||||
run: build
|
run: build
|
||||||
@echo "Running!"
|
@echo "Running!"
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
-- com/DeleteUnit.lua
|
|
||||||
|
|
||||||
---@diagnostic disable: redefined-local
|
|
||||||
local db = require("internal.database.sqlite").connect("db/user-database.db", {log = true})
|
|
||||||
local log = require("internal.log")
|
|
||||||
local session = require("internal.session")
|
|
||||||
local crypt = require("internal.crypt.bcrypt")
|
|
||||||
local jwt = require("internal.crypt.jwt")
|
|
||||||
local sha256 = require("internal.crypt.sha256")
|
|
||||||
|
|
||||||
local params = session.request.params.get()
|
|
||||||
local token = session.request.headers.get("authorization")
|
|
||||||
|
|
||||||
local function close_db()
|
|
||||||
if db then
|
|
||||||
db:close()
|
|
||||||
db = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function error_response(message, code, data)
|
|
||||||
session.response.error = {
|
|
||||||
code = code or nil,
|
|
||||||
message = message,
|
|
||||||
data = data or nil
|
|
||||||
}
|
|
||||||
close_db()
|
|
||||||
end
|
|
||||||
|
|
||||||
if not token or type(token) ~= "string" then
|
|
||||||
return error_response("Access denied")
|
|
||||||
end
|
|
||||||
|
|
||||||
local prefix = "Bearer "
|
|
||||||
if token:sub(1, #prefix) ~= prefix then
|
|
||||||
return error_response("Invalid Authorization scheme")
|
|
||||||
end
|
|
||||||
|
|
||||||
local access_token = token:sub(#prefix + 1)
|
|
||||||
|
|
||||||
local err, data = jwt.decode(access_token, { secret = require("_config").token() })
|
|
||||||
|
|
||||||
if err or not data then
|
|
||||||
session.response.error = {
|
|
||||||
message = err
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- if data.session_uuid ~= session.id then
|
|
||||||
-- return error_response("Access denied")
|
|
||||||
-- end
|
|
||||||
|
|
||||||
-- if data.key ~= sha256.sum(session.request.address .. session.id .. session.request.headers.get("user-agent", "noagent")) then
|
|
||||||
-- return error_response("Access denied")
|
|
||||||
-- end
|
|
||||||
|
|
||||||
if not params then
|
|
||||||
return error_response("no params provided")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (params.username and params.email and params.password) then
|
|
||||||
return error_response("no username/email/password provided")
|
|
||||||
end
|
|
||||||
|
|
||||||
local existing, err = db:query(
|
|
||||||
"SELECT password FROM users WHERE email = ? AND username = ? AND deleted = 0 LIMIT 1",
|
|
||||||
{
|
|
||||||
params.email,
|
|
||||||
params.username
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Password fetch failed: " .. tostring(err))
|
|
||||||
return error_response("Database query failed: " .. tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
if not existing or #existing == 0 then
|
|
||||||
return error_response("Unit not found")
|
|
||||||
end
|
|
||||||
|
|
||||||
local hashed_password = existing[1].password
|
|
||||||
|
|
||||||
local ok = crypt.compare(hashed_password, params.password)
|
|
||||||
if not ok then
|
|
||||||
log.warn("Wrong password attempt for: " .. params.username)
|
|
||||||
return error_response("Invalid password")
|
|
||||||
end
|
|
||||||
|
|
||||||
local ctx, err = db:exec(
|
|
||||||
[[
|
|
||||||
UPDATE users
|
|
||||||
SET deleted = 1,
|
|
||||||
deleted_at = CURRENT_TIMESTAMP
|
|
||||||
WHERE email = ? AND username = ? AND deleted = 0
|
|
||||||
]],
|
|
||||||
{ params.email, params.username }
|
|
||||||
)
|
|
||||||
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Soft delete failed: " .. tostring(err))
|
|
||||||
return error_response("Soft delete failed: " .. tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
local res, err = ctx:wait()
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Soft delete confirmation failed: " .. tostring(err))
|
|
||||||
return error_response("Soft delete confirmation failed: " .. tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
session.response.result = {
|
|
||||||
rows_affected = res,
|
|
||||||
message = "Unit soft-deleted successfully"
|
|
||||||
}
|
|
||||||
|
|
||||||
log.info("user " .. params.username .. " soft-deleted successfully")
|
|
||||||
|
|
||||||
close_db()
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
-- com/GetAccess
|
|
||||||
|
|
||||||
---@diagnostic disable: redefined-local
|
|
||||||
local db = require("internal.database.sqlite").connect("db/user-database.db", {log = true})
|
|
||||||
local log = require("internal.log")
|
|
||||||
local session = require("internal.session")
|
|
||||||
local crypt = require("internal.crypt.bcrypt")
|
|
||||||
local jwt = require("internal.crypt.jwt")
|
|
||||||
local sha256 = require("internal.crypt.sha256")
|
|
||||||
|
|
||||||
local params = session.request.params.get()
|
|
||||||
local secret = require("_config").token()
|
|
||||||
|
|
||||||
local function close_db()
|
|
||||||
if db then
|
|
||||||
db:close()
|
|
||||||
db = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function error_response(message, code, data)
|
|
||||||
session.response.error = {
|
|
||||||
code = code or nil,
|
|
||||||
message = message,
|
|
||||||
data = data or nil
|
|
||||||
}
|
|
||||||
close_db()
|
|
||||||
end
|
|
||||||
|
|
||||||
if not params then
|
|
||||||
return error_response("No params provided")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (params.username and params.email and params.password) then
|
|
||||||
return error_response("Missing username, email or password")
|
|
||||||
end
|
|
||||||
|
|
||||||
local unit, err = db:query(
|
|
||||||
"SELECT id, username, email, password, created_at FROM users WHERE email = ? AND username = ? AND deleted = 0 LIMIT 1",
|
|
||||||
{
|
|
||||||
params.email,
|
|
||||||
params.username
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if err then
|
|
||||||
log.error("DB query error: " .. tostring(err))
|
|
||||||
return error_response("Database query failed")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not unit or #unit == 0 then
|
|
||||||
return error_response("Unit not found")
|
|
||||||
end
|
|
||||||
|
|
||||||
unit = unit[1]
|
|
||||||
|
|
||||||
local ok = crypt.compare(unit.password, params.password)
|
|
||||||
if not ok then
|
|
||||||
log.warn("Login failed: wrong password for " .. params.username)
|
|
||||||
return error_response("Invalid password")
|
|
||||||
end
|
|
||||||
|
|
||||||
local token = jwt.encode({
|
|
||||||
secret = secret,
|
|
||||||
payload = { session_uuid = session.id,
|
|
||||||
admin_user = params.username,
|
|
||||||
key = sha256.sum(session.request.address .. session.id .. session.request.headers.get("user-agent", "noagent"))
|
|
||||||
},
|
|
||||||
expires_in = 3600
|
|
||||||
})
|
|
||||||
|
|
||||||
session.response.result = {
|
|
||||||
access_token = token
|
|
||||||
}
|
|
||||||
|
|
||||||
close_db()
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
-- com/PutNewUnit.lua
|
|
||||||
|
|
||||||
---@diagnostic disable: redefined-local
|
|
||||||
local db = require("internal.database.sqlite").connect("db/user-database.db", {log = true})
|
|
||||||
local log = require("internal.log")
|
|
||||||
local session = require("internal.session")
|
|
||||||
local crypt = require("internal.crypt.bcrypt")
|
|
||||||
local jwt = require("internal.crypt.jwt")
|
|
||||||
local sha256 = require("internal.crypt.sha256")
|
|
||||||
|
|
||||||
local params = session.request.params.get()
|
|
||||||
local token = session.request.headers.get("authorization")
|
|
||||||
|
|
||||||
local function close_db()
|
|
||||||
if db then
|
|
||||||
db:close()
|
|
||||||
db = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function error_response(message, code, data)
|
|
||||||
session.response.error = {
|
|
||||||
code = code or nil,
|
|
||||||
message = message,
|
|
||||||
data = data or nil
|
|
||||||
}
|
|
||||||
close_db()
|
|
||||||
end
|
|
||||||
|
|
||||||
if not token or type(token) ~= "string" then
|
|
||||||
return error_response("Access denied")
|
|
||||||
end
|
|
||||||
|
|
||||||
local prefix = "Bearer "
|
|
||||||
if token:sub(1, #prefix) ~= prefix then
|
|
||||||
return error_response("Invalid Authorization scheme")
|
|
||||||
end
|
|
||||||
|
|
||||||
local access_token = token:sub(#prefix + 1)
|
|
||||||
|
|
||||||
local err, data = jwt.decode(access_token, { secret = require("_config").token() })
|
|
||||||
|
|
||||||
if err or not data then
|
|
||||||
session.response.error = {
|
|
||||||
message = err
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if data.session_uuid ~= session.id then
|
|
||||||
return error_response("Access denied")
|
|
||||||
end
|
|
||||||
|
|
||||||
if data.key ~= sha256.sum(session.request.address .. session.id .. session.request.headers.get("user-agent", "noagent")) then
|
|
||||||
return error_response("Access denied")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not params then
|
|
||||||
return error_response("no params provided")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (params.username and params.email and params.password) then
|
|
||||||
return error_response("no username/email/password provided")
|
|
||||||
end
|
|
||||||
|
|
||||||
local hashPass = crypt.generate(params.password, crypt.DefaultCost)
|
|
||||||
|
|
||||||
local existing, err = db:query("SELECT 1 FROM users WHERE deleted = 0 AND (email = ? OR username = ?) LIMIT 1", {
|
|
||||||
params.email,
|
|
||||||
params.username
|
|
||||||
})
|
|
||||||
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Email check failed: "..tostring(err))
|
|
||||||
return error_response("Database check failed: "..tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
if existing and #existing > 0 then
|
|
||||||
return error_response("Unit already exists")
|
|
||||||
end
|
|
||||||
|
|
||||||
local ctx, err = db:exec(
|
|
||||||
"INSERT INTO users (username, email, password, first_name, last_name, phone_number) VALUES (?, ?, ?, ?, ?, ?)",
|
|
||||||
{
|
|
||||||
params.username,
|
|
||||||
params.email,
|
|
||||||
hashPass,
|
|
||||||
params.first_name or "",
|
|
||||||
params.last_name or "",
|
|
||||||
params.phone_number or ""
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Insert failed: "..tostring(err))
|
|
||||||
return error_response("Insert failed: "..tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
local res, err = ctx:wait()
|
|
||||||
if err ~= nil then
|
|
||||||
log.error("Insert confirmation failed: "..tostring(err))
|
|
||||||
return error_response("Insert confirmation failed: "..tostring(err))
|
|
||||||
end
|
|
||||||
|
|
||||||
session.response.result = {
|
|
||||||
rows_affected = res,
|
|
||||||
message = "Unit created successfully"
|
|
||||||
}
|
|
||||||
|
|
||||||
close_db()
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
---@diagnostic disable: redefined-local
|
|
||||||
local db = require("internal.database-sqlite").connect("db/test.db", {log = true})
|
|
||||||
local log = require("internal.log")
|
|
||||||
local session = require("internal.session")
|
|
||||||
|
|
||||||
if not (session.request.params.name and session.request.params.email) then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32602,
|
|
||||||
message = "Name and email are required"
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local existing, err = db:query("SELECT 1 FROM users WHERE email = ? LIMIT 1", {
|
|
||||||
session.request.params.email
|
|
||||||
})
|
|
||||||
if err ~= nil then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32603,
|
|
||||||
message = "Database check failed: "..tostring(err)
|
|
||||||
}
|
|
||||||
log.error("Email check failed: "..tostring(err))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if existing and #existing > 0 then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32604,
|
|
||||||
message = "Email already exists"
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local ctx, err = db:exec(
|
|
||||||
"INSERT INTO users (name, email) VALUES (?, ?)",
|
|
||||||
{
|
|
||||||
session.request.params.name,
|
|
||||||
session.request.params.email
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if err ~= nil then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32605,
|
|
||||||
message = "Insert failed: "..tostring(err)
|
|
||||||
}
|
|
||||||
log.error("Insert failed: "..tostring(err))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local res, err = ctx:wait()
|
|
||||||
if err ~= nil then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32606,
|
|
||||||
message = "Insert confirmation failed: "..tostring(err)
|
|
||||||
}
|
|
||||||
log.error("Insert confirmation failed: "..tostring(err))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
session.response.result = {
|
|
||||||
success = true,
|
|
||||||
rows_affected = res,
|
|
||||||
message = "User created successfully"
|
|
||||||
}
|
|
||||||
|
|
||||||
db:close()
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
local session = require("internal.session")
|
|
||||||
local net = require("internal.net")
|
|
||||||
|
|
||||||
local reqAddr
|
|
||||||
local logReq = true
|
|
||||||
|
|
||||||
if session.request.params and session.request.params.url then
|
|
||||||
reqAddr = session.request.params.url
|
|
||||||
else
|
|
||||||
session.response.error = {
|
|
||||||
code = -32602,
|
|
||||||
message = "no url provided"
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local resp = net.http.get_request(logReq, reqAddr)
|
|
||||||
if resp then
|
|
||||||
session.response.result.answer = {
|
|
||||||
status = resp.status,
|
|
||||||
body = resp.body
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
session.response.error = {
|
|
||||||
data = "error while requesting"
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
local session = require("internal.session")
|
|
||||||
local net = require("internal.net")
|
|
||||||
local log = require("internal.log")
|
|
||||||
|
|
||||||
local reqAddr
|
|
||||||
local logReq = true
|
|
||||||
local payload
|
|
||||||
|
|
||||||
log.debug(session.request.params)
|
|
||||||
|
|
||||||
if not (session.request.params and session.request.params.url) then
|
|
||||||
session.response.error = {
|
|
||||||
code = -32602,
|
|
||||||
message = "no url or payload provided"
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
reqAddr = session.request.params.url
|
|
||||||
payload = session.request.params.payload
|
|
||||||
|
|
||||||
local resp = net.http.post_request(logReq, reqAddr, "application/json", payload)
|
|
||||||
if resp then
|
|
||||||
session.response.result.answer = {
|
|
||||||
status = resp.status,
|
|
||||||
body = resp.body
|
|
||||||
}
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
session.response.error = {
|
|
||||||
data = "error while requesting"
|
|
||||||
}
|
|
||||||
44
com/test.lua
44
com/test.lua
@@ -1,44 +0,0 @@
|
|||||||
local sha256 = require("internal.crypt.sha256")
|
|
||||||
local log = require("internal.log")
|
|
||||||
local session = require("internal.session")
|
|
||||||
|
|
||||||
-- local secret = require("_config").token()
|
|
||||||
|
|
||||||
-- local token = jwt.encode({
|
|
||||||
-- secret = secret,
|
|
||||||
-- payload = { session_uuid = session.id },
|
|
||||||
-- expires_in = 3600
|
|
||||||
-- })
|
|
||||||
|
|
||||||
-- local err, data = jwt.decode(token, { secret = secret })
|
|
||||||
|
|
||||||
-- if not err then
|
|
||||||
-- session.response.result = {
|
|
||||||
-- token = token
|
|
||||||
-- }
|
|
||||||
-- return
|
|
||||||
-- end
|
|
||||||
|
|
||||||
-- session.response.error = {
|
|
||||||
-- message = "not sigma"
|
|
||||||
-- }
|
|
||||||
-- local array = session.request.params.get("array", "oops")
|
|
||||||
-- function s()
|
|
||||||
-- session.throw_error("dqdqwdqwdqiwhodiwqohdq", 10)
|
|
||||||
-- end
|
|
||||||
-- s()
|
|
||||||
|
|
||||||
-- session.response.__script_data.result = {
|
|
||||||
-- data = {
|
|
||||||
-- sewf = 1
|
|
||||||
-- },
|
|
||||||
-- 2
|
|
||||||
-- }
|
|
||||||
session.response.set_error()
|
|
||||||
--session.response.send_error({1})
|
|
||||||
-- session.response.set()
|
|
||||||
-- session.response.__script_data.result = {
|
|
||||||
-- status = "ok"
|
|
||||||
-- }
|
|
||||||
session.response.set(1)
|
|
||||||
log.event("popi")
|
|
||||||
Binary file not shown.
Binary file not shown.
BIN
db/root.db
BIN
db/root.db
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -37,7 +37,9 @@ func NewError(code int, message string, data any, id *json.RawMessage) *RPCRespo
|
|||||||
Error = map[string]any{
|
Error = map[string]any{
|
||||||
"code": code,
|
"code": code,
|
||||||
"message": message,
|
"message": message,
|
||||||
"data": data,
|
}
|
||||||
|
if data != nil {
|
||||||
|
Error["data"] = data
|
||||||
}
|
}
|
||||||
|
|
||||||
return &RPCResponse{
|
return &RPCResponse{
|
||||||
|
|||||||
@@ -186,11 +186,6 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest,
|
|||||||
L.SetField(scriptDataTable, "result", resTable)
|
L.SetField(scriptDataTable, "result", resTable)
|
||||||
L.SetField(outTable, "send", L.NewFunction(func(L *lua.LState) int {
|
L.SetField(outTable, "send", L.NewFunction(func(L *lua.LState) int {
|
||||||
res := L.Get(1)
|
res := L.Get(1)
|
||||||
if res == lua.LNil {
|
|
||||||
__exit = 0
|
|
||||||
L.RaiseError("__successfull")
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
resFTable := scriptDataTable.RawGetString("result")
|
resFTable := scriptDataTable.RawGetString("result")
|
||||||
if resPTable, ok := res.(*lua.LTable); ok {
|
if resPTable, ok := res.(*lua.LTable); ok {
|
||||||
|
|||||||
Reference in New Issue
Block a user