update server

This commit is contained in:
2026-07-30 15:06:38 +08:00
parent dee13d69d5
commit 692d8dd18a
9 changed files with 189 additions and 479 deletions
+46 -5
View File
@@ -174,6 +174,32 @@ function createApp({
return event.adminToken === adminToken ? null : "B端管理令牌无效";
}
function logRevokeAction({ event, licenseId, success, errCode = null }) {
console.info("[license] revoke", {
time: new Date().toISOString(),
requestId: event.requestId || null,
type: "revokeLicense",
licenseId: licenseId || null,
result: success ? "success" : "failed",
errCode
});
}
function normalizeEventCompat(event) {
if (!event || typeof event !== "object" || Array.isArray(event)) return event;
const type = String(event.type || event.action || "").trim();
const legacyRevokeTypes = new Set(["revoke_license", "licenseRevoke", "revoke"]);
if (!legacyRevokeTypes.has(type) && !(event.action === "revokeLicense" && !event.type)) return event;
console.warn("[license] legacy revoke request mapped", { type: type || null, requestId: event.requestId || null });
return {
...event,
type: "revokeLicense",
licenseId: event.licenseId ?? event.license_id ?? event.id,
reason: event.reason ?? event.revocationReason,
adminToken: event.adminToken ?? event.admin_token ?? event.token
};
}
function signDownload(fileID, expiresAtMs) {
return createHmac("sha256", adminToken).update(`${fileID}\n${expiresAtMs}`).digest("hex");
}
@@ -469,15 +495,30 @@ function createApp({
}
case "revokeLicense": {
const authError = requireAdmin(event);
if (authError) return { success: false, errMsg: authError };
return store.update((database) => {
const record = database.licenses.find((item) => item.licenseId === event.licenseId);
if (!record) return { success: false, errMsg: "许可证不存在" };
const licenseId = String(event.licenseId || "").trim();
if (authError) {
const errCode = authError === "B端管理令牌无效"
? "ADMIN_TOKEN_INVALID"
: "ADMIN_TOKEN_NOT_CONFIGURED";
const result = { success: false, errMsg: authError, errCode };
logRevokeAction({ event, licenseId, success: false, errCode: result.errCode });
return result;
}
if (!licenseId) {
const result = { success: false, errMsg: "licenseId 不能为空", errCode: "LICENSE_ID_REQUIRED" };
logRevokeAction({ event, licenseId, success: false, errCode: result.errCode });
return result;
}
const result = await store.update((database) => {
const record = database.licenses.find((item) => item.licenseId === licenseId);
if (!record) return { success: false, errMsg: "许可证不存在", errCode: "LICENSE_NOT_FOUND" };
record.status = "revoked";
record.revokedAt = new Date().toISOString();
record.revocationReason = String(event.reason || "管理员撤销").trim();
return { success: true, license: publicLicense(record) };
});
logRevokeAction({ event, licenseId, success: result.success, errCode: result.errCode });
return result;
}
case "validateLicense": {
const database = await store.read();
@@ -978,7 +1019,7 @@ function createApp({
const apiHandler = async (req, res) => {
try {
res.json(await dispatch(req.body || {}, req));
res.json(await dispatch(normalizeEventCompat(req.body || {}), req));
} catch (error) {
res.status(400).json({ success: false, errMsg: error.message });
}