Loading .npmrc 0 → 100644 +1 −0 Original line number Diff line number Diff line @sc07:registry=https://sc07.dev/api/v4/packages/npm/ package-lock.json +10 −0 Original line number Diff line number Diff line Loading @@ -7730,6 +7730,15 @@ "resolved": "packages/server", "link": true }, "node_modules/@sc07/shadow": { "version": "1.0.0", "resolved": "https://sc07.dev/api/v4/projects/19/packages/npm/@sc07/shadow/-/@sc07/shadow-1.0.0.tgz", "integrity": "sha1-HYzTj3MYIKMxurj5kYGV8Ie3Dhs=", "dependencies": { "eventemitter3": "^5.0.1", "redis": "^4.6.15" } }, "node_modules/@sentry-internal/browser-utils": { "version": "8.48.0", "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.48.0.tgz", Loading Loading @@ -19952,6 +19961,7 @@ "dependencies": { "@prisma/client": "^6.2.1", "@sc07-canvas/lib": "^1.0.0", "@sc07/shadow": "^1.0.0", "@sentry/node": "^8.47.0", "@socket.io/redis-adapter": "^8.3.0", "altcha-lib": "^1.2.0", packages/server/package.json +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ "dependencies": { "@prisma/client": "^6.2.1", "@sc07-canvas/lib": "^1.0.0", "@sc07/shadow": "^1.0.0", "@sentry/node": "^8.47.0", "@socket.io/redis-adapter": "^8.3.0", "altcha-lib": "^1.2.0", Loading packages/server/src/api/mod/instances.ts +19 −27 Original line number Diff line number Diff line import { ModerationController } from "../../controllers/ModerationController"; import { getLogger } from "../../lib/Logger"; import { AuditLog } from "../../models/AuditLog"; import { Instance, InstanceNotBanned, InstanceNotFound, } from "../../models/Instance"; import { User } from "../../models/User"; import { Router } from "../lib/router"; const Logger = getLogger("HTTP/ADMIN"); Loading Loading @@ -121,20 +120,17 @@ export class InstancesEndpoints extends Router { privateNote = req.body.privateNote; } const hasExistingBan = await instance.getBan(); const user = (await User.fromAuthSession(req.session.user!))!; const ban = await instance.ban(expires, publicNote, privateNote); const auditLog = await AuditLog.Factory(user.sub) .doing(hasExistingBan ? "BAN_UPDATE" : "BAN_CREATE") .reason(req.header("X-Audit") || null) .withComment( hasExistingBan ? `Updated ban for ${instance.hostname}` : `Created a ban for ${instance.hostname}` ) .withBan(ban) .create(); const { ban, auditLog } = await ModerationController.get().upsertInstanceBan( { sub: req.session.user!.user.sub }, instance, expires, publicNote, privateNote, { reason: req.header("x-audit"), } ); res.json({ success: true, Loading Loading @@ -170,7 +166,13 @@ export class InstancesEndpoints extends Router { } try { await instance.unban(); const { auditLog } = await ModerationController.get().deleteInstanceBan( { sub: req.session.user!.user.sub }, instance, { reason: req.header("x-audit") } ); res.json({ success: true, auditLog }); } catch (e) { if (e instanceof InstanceNotBanned) { res.status(404).json({ success: false, error: "instance not banned" }); Loading @@ -180,16 +182,6 @@ export class InstancesEndpoints extends Router { ); res.status(500).json({ success: false, error: "Internal error" }); } return; } const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(user.sub) .doing("BAN_DELETE") .reason(req.header("X-Audit") || null) .withComment(`Deleted ban for ${instance.hostname}`) .create(); res.json({ success: true, auditLog }); } } packages/server/src/api/mod/users.ts +18 −60 Original line number Diff line number Diff line import { Prisma } from "@prisma/client"; import { CaptchaController } from "../../controllers/CaptchaController"; import { ModerationController } from "../../controllers/ModerationController"; import { SocketController } from "../../controllers/SocketController"; import { getLogger } from "../../lib/Logger"; import { prisma } from "../../lib/prisma"; import { AuditLog } from "../../models/AuditLog"; import { User, UserNotBanned, UserNotFound } from "../../models/User"; import { Router } from "../lib/router"; Loading Loading @@ -281,44 +281,14 @@ export class UsersEndpoints extends Router { privateNote = req.body.privateNote; } const existingBan = user.getBan(); const ban = await user.ban(expires, publicNote, privateNote); let shouldNotifyUser = false; if (existingBan) { if (existingBan.expires.getTime() !== ban.expiresAt.getTime()) { shouldNotifyUser = true; } } else { shouldNotifyUser = true; } if (shouldNotifyUser) { user.notify({ is: "modal", action: "moderation", dismissable: true, message_key: "banned", metadata: { until: expires.toISOString(), }, }); } user.updateStanding(); const adminUser = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(adminUser.sub) .doing(existingBan ? "BAN_UPDATE" : "BAN_CREATE") .reason(req.header("X-Audit") || null) .withComment( existingBan ? `Updated ban on ${user.sub}` : `Created a ban for ${user.sub}` ) .withBan(ban) .create(); const { auditLog } = await ModerationController.get().upsertUserBan( { sub: req.session.user!.user.sub }, user, expires, publicNote, privateNote, { reason: req.header("x-audit") } ); res.json({ success: true, auditLog }); } Loading Loading @@ -350,7 +320,15 @@ export class UsersEndpoints extends Router { } try { await user.unban(); const auditLog = await ModerationController.get().deleteUserBan( { sub: req.session.user!.user.sub }, user, { reason: req.header("x-audit"), } ); res.json({ success: true, auditLog }); } catch (e) { if (e instanceof UserNotBanned) { res.status(404).json({ success: false, error: "User is not banned" }); Loading @@ -362,26 +340,6 @@ export class UsersEndpoints extends Router { } return; } user.notify({ is: "modal", action: "moderation", dismissable: true, message_key: "unbanned", metadata: {}, }); await user.update(true); user.updateStanding(); const adminUser = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(adminUser.sub) .doing("BAN_DELETE") .reason(req.header("X-Audit") || null) .withComment(`Deleted ban for ${user.sub}`) .create(); res.json({ success: true, auditLog }); } /** Loading Loading
.npmrc 0 → 100644 +1 −0 Original line number Diff line number Diff line @sc07:registry=https://sc07.dev/api/v4/packages/npm/
package-lock.json +10 −0 Original line number Diff line number Diff line Loading @@ -7730,6 +7730,15 @@ "resolved": "packages/server", "link": true }, "node_modules/@sc07/shadow": { "version": "1.0.0", "resolved": "https://sc07.dev/api/v4/projects/19/packages/npm/@sc07/shadow/-/@sc07/shadow-1.0.0.tgz", "integrity": "sha1-HYzTj3MYIKMxurj5kYGV8Ie3Dhs=", "dependencies": { "eventemitter3": "^5.0.1", "redis": "^4.6.15" } }, "node_modules/@sentry-internal/browser-utils": { "version": "8.48.0", "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.48.0.tgz", Loading Loading @@ -19952,6 +19961,7 @@ "dependencies": { "@prisma/client": "^6.2.1", "@sc07-canvas/lib": "^1.0.0", "@sc07/shadow": "^1.0.0", "@sentry/node": "^8.47.0", "@socket.io/redis-adapter": "^8.3.0", "altcha-lib": "^1.2.0",
packages/server/package.json +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ "dependencies": { "@prisma/client": "^6.2.1", "@sc07-canvas/lib": "^1.0.0", "@sc07/shadow": "^1.0.0", "@sentry/node": "^8.47.0", "@socket.io/redis-adapter": "^8.3.0", "altcha-lib": "^1.2.0", Loading
packages/server/src/api/mod/instances.ts +19 −27 Original line number Diff line number Diff line import { ModerationController } from "../../controllers/ModerationController"; import { getLogger } from "../../lib/Logger"; import { AuditLog } from "../../models/AuditLog"; import { Instance, InstanceNotBanned, InstanceNotFound, } from "../../models/Instance"; import { User } from "../../models/User"; import { Router } from "../lib/router"; const Logger = getLogger("HTTP/ADMIN"); Loading Loading @@ -121,20 +120,17 @@ export class InstancesEndpoints extends Router { privateNote = req.body.privateNote; } const hasExistingBan = await instance.getBan(); const user = (await User.fromAuthSession(req.session.user!))!; const ban = await instance.ban(expires, publicNote, privateNote); const auditLog = await AuditLog.Factory(user.sub) .doing(hasExistingBan ? "BAN_UPDATE" : "BAN_CREATE") .reason(req.header("X-Audit") || null) .withComment( hasExistingBan ? `Updated ban for ${instance.hostname}` : `Created a ban for ${instance.hostname}` ) .withBan(ban) .create(); const { ban, auditLog } = await ModerationController.get().upsertInstanceBan( { sub: req.session.user!.user.sub }, instance, expires, publicNote, privateNote, { reason: req.header("x-audit"), } ); res.json({ success: true, Loading Loading @@ -170,7 +166,13 @@ export class InstancesEndpoints extends Router { } try { await instance.unban(); const { auditLog } = await ModerationController.get().deleteInstanceBan( { sub: req.session.user!.user.sub }, instance, { reason: req.header("x-audit") } ); res.json({ success: true, auditLog }); } catch (e) { if (e instanceof InstanceNotBanned) { res.status(404).json({ success: false, error: "instance not banned" }); Loading @@ -180,16 +182,6 @@ export class InstancesEndpoints extends Router { ); res.status(500).json({ success: false, error: "Internal error" }); } return; } const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(user.sub) .doing("BAN_DELETE") .reason(req.header("X-Audit") || null) .withComment(`Deleted ban for ${instance.hostname}`) .create(); res.json({ success: true, auditLog }); } }
packages/server/src/api/mod/users.ts +18 −60 Original line number Diff line number Diff line import { Prisma } from "@prisma/client"; import { CaptchaController } from "../../controllers/CaptchaController"; import { ModerationController } from "../../controllers/ModerationController"; import { SocketController } from "../../controllers/SocketController"; import { getLogger } from "../../lib/Logger"; import { prisma } from "../../lib/prisma"; import { AuditLog } from "../../models/AuditLog"; import { User, UserNotBanned, UserNotFound } from "../../models/User"; import { Router } from "../lib/router"; Loading Loading @@ -281,44 +281,14 @@ export class UsersEndpoints extends Router { privateNote = req.body.privateNote; } const existingBan = user.getBan(); const ban = await user.ban(expires, publicNote, privateNote); let shouldNotifyUser = false; if (existingBan) { if (existingBan.expires.getTime() !== ban.expiresAt.getTime()) { shouldNotifyUser = true; } } else { shouldNotifyUser = true; } if (shouldNotifyUser) { user.notify({ is: "modal", action: "moderation", dismissable: true, message_key: "banned", metadata: { until: expires.toISOString(), }, }); } user.updateStanding(); const adminUser = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(adminUser.sub) .doing(existingBan ? "BAN_UPDATE" : "BAN_CREATE") .reason(req.header("X-Audit") || null) .withComment( existingBan ? `Updated ban on ${user.sub}` : `Created a ban for ${user.sub}` ) .withBan(ban) .create(); const { auditLog } = await ModerationController.get().upsertUserBan( { sub: req.session.user!.user.sub }, user, expires, publicNote, privateNote, { reason: req.header("x-audit") } ); res.json({ success: true, auditLog }); } Loading Loading @@ -350,7 +320,15 @@ export class UsersEndpoints extends Router { } try { await user.unban(); const auditLog = await ModerationController.get().deleteUserBan( { sub: req.session.user!.user.sub }, user, { reason: req.header("x-audit"), } ); res.json({ success: true, auditLog }); } catch (e) { if (e instanceof UserNotBanned) { res.status(404).json({ success: false, error: "User is not banned" }); Loading @@ -362,26 +340,6 @@ export class UsersEndpoints extends Router { } return; } user.notify({ is: "modal", action: "moderation", dismissable: true, message_key: "unbanned", metadata: {}, }); await user.update(true); user.updateStanding(); const adminUser = (await User.fromAuthSession(req.session.user!))!; const auditLog = await AuditLog.Factory(adminUser.sub) .doing("BAN_DELETE") .reason(req.header("X-Audit") || null) .withComment(`Deleted ban for ${user.sub}`) .create(); res.json({ success: true, auditLog }); } /** Loading