From 50e58f9e82a9e492e28f9b495afdbe63f402e784 Mon Sep 17 00:00:00 2001 From: Mathias Gruber Date: Fri, 25 Oct 2024 12:28:32 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Only=20highest=20staff=20can=20see?= =?UTF-8?q?=20IPs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/app/users/page.tsx | 4 ++-- app/src/layout/PublicUser.tsx | 16 +++++++++------- app/src/libs/discord.ts | 1 - app/src/server/api/routers/profile.ts | 8 +++++--- app/src/utils/permissions.ts | 4 ++++ 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/src/app/users/page.tsx b/app/src/app/users/page.tsx index 74eb3623..6111c17a 100644 --- a/app/src/app/users/page.tsx +++ b/app/src/app/users/page.tsx @@ -8,7 +8,7 @@ import { BriefcaseBusiness } from "lucide-react"; import Table, { type ColumnDefinitionType } from "@/layout/Table"; import Loader from "@/layout/Loader"; import NavTabs from "@/layout/NavTabs"; -import { canSeeSecretData } from "@/utils/permissions"; +import { canSeeIps } from "@/utils/permissions"; import { ExternalLink } from "lucide-react"; import { api } from "@/utils/api"; import { useInfinitePagination } from "@/libs/pagination"; @@ -77,7 +77,7 @@ export default function Users() { } else if (activeTab === "PvP") { columns.push({ key: "pvpStreak", header: "PvP Streak", type: "string" }); } - if (userData && canSeeSecretData(userData.role)) { + if (userData && canSeeIps(userData.role)) { columns.push({ key: "lastIp", header: "LastIP", type: "string" }); } diff --git a/app/src/layout/PublicUser.tsx b/app/src/layout/PublicUser.tsx index db5a0f02..5ffe0c21 100644 --- a/app/src/layout/PublicUser.tsx +++ b/app/src/layout/PublicUser.tsx @@ -34,7 +34,7 @@ import { } from "lucide-react"; import { updateUserSchema } from "@/validators/user"; import { canChangeUserRole } from "@/utils/permissions"; -import { canSeeSecretData } from "@/utils/permissions"; +import { canSeeSecretData, canSeeIps } from "@/utils/permissions"; import { canModifyUserBadges, canUnstuckVillage } from "@/utils/permissions"; import { api } from "@/utils/api"; import { showMutationToast } from "@/libs/toast"; @@ -308,12 +308,14 @@ const PublicUserComponent: React.FC = ({
Information

Too fast infractions: {profile.movedTooFastCount}

- - Last IP: {profile.lastIp} - + {canSeeIps(userData.role) && ( + + Last IP: {profile.lastIp} + + )}
{profile.deletionAt ? `To be deleted on: ${profile.deletionAt.toLocaleString()}` diff --git a/app/src/libs/discord.ts b/app/src/libs/discord.ts index 7944dccf..4ae7489a 100644 --- a/app/src/libs/discord.ts +++ b/app/src/libs/discord.ts @@ -59,7 +59,6 @@ export const callDiscordTicket = async ( **Username:** ${user.username} **User ID:** ${user.userId} **Role:** ${user.role} - **Last IP:** ${user.lastIp} **Banned**: ${user.isBanned ? "true" : "false"} **Silenced**: ${user.isSilenced ? "true" : "false"} **Federal Status:** ${user.federalStatus} diff --git a/app/src/server/api/routers/profile.ts b/app/src/server/api/routers/profile.ts index e3dda7d1..e2fcb3e8 100644 --- a/app/src/server/api/routers/profile.ts +++ b/app/src/server/api/routers/profile.ts @@ -33,7 +33,7 @@ import { village, battleHistory, } from "@/drizzle/schema"; -import { canSeeSecretData, canDeleteUsers } from "@/utils/permissions"; +import { canSeeSecretData, canDeleteUsers, canSeeIps } from "@/utils/permissions"; import { canChangeContent, canModerateRoles } from "@/utils/permissions"; import { usernameSchema } from "@/validators/register"; import { insertNextQuest } from "@/routers/quests"; @@ -850,9 +850,11 @@ export const profileRouter = createTRPCRouter({ // Hide secrets if (!canSeeSecretData(requester.role)) { user.earnedExperience = 8008; - user.lastIp = "hidden"; user.isBanned = false; } + if (!canSeeIps(requester.role)) { + user.lastIp = "hidden"; + } // Return return { ...user, @@ -1381,7 +1383,7 @@ export const fetchPublicUsers = async ( } // Hide stuff users.filter((u) => !u.lastIp).forEach((u) => (u.lastIp = "Proxied")); - if (!user || !canSeeSecretData(user.role)) { + if (!user || !canSeeIps(user.role)) { users.forEach((u) => (u.lastIp = "hidden")); } // Return diff --git a/app/src/utils/permissions.ts b/app/src/utils/permissions.ts index fe0e232b..afc12b3e 100644 --- a/app/src/utils/permissions.ts +++ b/app/src/utils/permissions.ts @@ -56,6 +56,10 @@ export const canSeeSecretData = (role: UserRole) => { ); }; +export const canSeeIps = (role: UserRole) => { + return ["HEAD_MODERATOR", "CODING-ADMIN", "MODERATOR-ADMIN"].includes(role); +}; + export const canModifyUserBadges = (role: UserRole) => { return ["CODING-ADMIN", "CONTENT-ADMIN", "EVENT", "CONTENT"].includes(role); };