Commit a4bb8913 authored by Grant's avatar Grant
Browse files

add shadow support

parent d76a1b53
Loading
Loading
Loading
Loading

.npmrc

0 → 100644
+1 −0
Original line number Diff line number Diff line
@sc07:registry=https://sc07.dev/api/v4/packages/npm/
+10 −0
Original line number Diff line number Diff line
@@ -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",
@@ -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",
+1 −0
Original line number Diff line number Diff line
@@ -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",
+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");
@@ -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,
@@ -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" });
@@ -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 });
  }
}
+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";

@@ -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 });
  }
@@ -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" });
@@ -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