1
0
Fork 0

fix(missions): enforce access control on dashboard and intel mission queries

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jason Fraley 2026-09-10 16:13:55 -04:00
parent 486fdca2a0
commit 0fa6d9abb5
4 changed files with 27 additions and 0 deletions

View file

@ -2,6 +2,7 @@ import config from "@payload-config";
import { getPayload } from "payload"; import { getPayload } from "payload";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
import { headers as nextHeaders } from "next/headers";
import type { Faction, Media, Mission } from "@/payload-types"; import type { Faction, Media, Mission } from "@/payload-types";
import { RichText } from "@payloadcms/richtext-lexical/react"; import { RichText } from "@payloadcms/richtext-lexical/react";
import { ClientDate } from "@/components/frontend/ClientDate"; import { ClientDate } from "@/components/frontend/ClientDate";
@ -37,6 +38,10 @@ const factionTypeColors: Record<string, string> = {
export default async function CampaignDetailPage({ params }: CampaignDetailPageProps) { export default async function CampaignDetailPage({ params }: CampaignDetailPageProps) {
const { id } = await params; const { id } = await params;
const payload = await getPayload({ config }); const payload = await getPayload({ config });
const { user } = await payload.auth({
headers: await nextHeaders(),
canSetHeaders: false,
});
const campaign = await payload const campaign = await payload
.findByID({ .findByID({
@ -81,6 +86,8 @@ export default async function CampaignDetailPage({ params }: CampaignDetailPageP
sort: "-classification.startDateTime", sort: "-classification.startDateTime",
limit: 100, limit: 100,
depth: 1, depth: 1,
user,
overrideAccess: false,
select: { select: {
name: true, name: true,
codeName: true, codeName: true,

View file

@ -1,5 +1,6 @@
import config from "@payload-config"; import config from "@payload-config";
import { getPayload } from "payload"; import { getPayload } from "payload";
import { headers as nextHeaders } from "next/headers";
import { ShieldIcon } from "lucide-react"; import { ShieldIcon } from "lucide-react";
import { CampaignCard } from "@/components/frontend/intelligence/CampaignCard"; import { CampaignCard } from "@/components/frontend/intelligence/CampaignCard";
import { CreateCampaignDialog } from "@/components/frontend/intelligence/CreateCampaignDialog"; import { CreateCampaignDialog } from "@/components/frontend/intelligence/CreateCampaignDialog";
@ -12,6 +13,10 @@ export const metadata = {
export default async function CampaignsPage() { export default async function CampaignsPage() {
const payload = await getPayload({ config }); const payload = await getPayload({ config });
const { user } = await payload.auth({
headers: await nextHeaders(),
canSetHeaders: false,
});
const campaignsRes = await payload.find({ const campaignsRes = await payload.find({
collection: "campaigns", collection: "campaigns",
@ -49,6 +54,8 @@ export default async function CampaignsPage() {
where: { "classification.campaign": { equals: campaign.id } }, where: { "classification.campaign": { equals: campaign.id } },
depth: 0, depth: 0,
limit: 100, limit: 100,
user,
overrideAccess: false,
select: { select: {
missionRoles: true, missionRoles: true,
classification: true, classification: true,

View file

@ -2,6 +2,7 @@ import config from "@payload-config";
import { getPayload } from "payload"; import { getPayload } from "payload";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
import { headers as nextHeaders } from "next/headers";
import type { BankAccount, Campaign, Faction, Media, Mission, Resource } from "@/payload-types"; import type { BankAccount, Campaign, Faction, Media, Mission, Resource } from "@/payload-types";
import { RichText } from "@payloadcms/richtext-lexical/react"; import { RichText } from "@payloadcms/richtext-lexical/react";
import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext"; import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext";
@ -72,6 +73,10 @@ function relationshipTone(value: number): { bar: string; text: string; label: st
export default async function FactionDetailPage({ params }: FactionDetailPageProps) { export default async function FactionDetailPage({ params }: FactionDetailPageProps) {
const { id } = await params; const { id } = await params;
const payload = await getPayload({ config }); const payload = await getPayload({ config });
const { user } = await payload.auth({
headers: await nextHeaders(),
canSetHeaders: false,
});
const faction = await payload const faction = await payload
.findByID({ .findByID({
@ -126,6 +131,8 @@ export default async function FactionDetailPage({ params }: FactionDetailPagePro
sort: "-classification.startDateTime", sort: "-classification.startDateTime",
limit: 100, limit: 100,
depth: 1, depth: 1,
user,
overrideAccess: false,
select: { select: {
name: true, name: true,
codeName: true, codeName: true,

View file

@ -74,6 +74,8 @@ export default async function HomePage() {
sort: "classification.startDateTime", sort: "classification.startDateTime",
limit: 5, limit: 5,
depth: 2, depth: 2,
user,
overrideAccess: false,
}) })
.catch(() => ({ docs: [] })); .catch(() => ({ docs: [] }));
@ -89,6 +91,8 @@ export default async function HomePage() {
sort: "-classification.startDateTime", sort: "-classification.startDateTime",
limit: 1, limit: 1,
depth: 2, depth: 2,
user,
overrideAccess: false,
}) })
.catch(() => ({ docs: [] })); .catch(() => ({ docs: [] }));
briefingMission = completedRes.docs[0] ?? null; briefingMission = completedRes.docs[0] ?? null;
@ -185,6 +189,8 @@ export default async function HomePage() {
.find({ .find({
collection: "missions", collection: "missions",
limit: 0, limit: 0,
user,
overrideAccess: false,
}) })
.catch(() => ({ totalDocs: 0 })), .catch(() => ({ totalDocs: 0 })),
payload.find({ payload.find({