Bisher sah jede Anfrage alles. Jetzt traegt jede Abfrage eine Besitzerbedingung, und zwar an erster Stelle in der where-Klausel statt als nachtraeglicher Vergleich - so kann sie nicht versehentlich uebersprungen werden. - Lesen: findFirst statt findUnique, immer mit ownerId - Schreiben und Loeschen: updateMany/deleteMany mit ownerId in der where-Klausel. Fremde Datensaetze werden dadurch gar nicht erst getroffen, und die betroffene Zeilenzahl sagt, ob es den Datensatz gab. - Notizen haengen ueber project.ownerId am Besitzer - Beim Verknuepfen eines Projekts wird geprueft, dass die Git-Verbindung dem Aufrufer gehoert - sonst liesse sich eine fremde Verbindung und damit ein fremder Token unterschieben - Fremde IDs liefern 404 statt 403: die Antwort bestaetigt nicht einmal, dass es den Datensatz gibt - Ausgehende Endpunkte (Sync, Verbindungstest, Repo-Liste) zusaetzlich ratenbegrenzt, Basis-URLs gegen den SSRF-Schutz geprueft - Slug und Verbindungsname werden je Besitzer auf Eindeutigkeit geprueft Nachgewiesen: ein zweites Konto erhaelt auf GET, PATCH, DELETE, Notiz anlegen und Sync eines fremden Projekts durchgaengig 404, auf die Admin-Endpunkte 403, und das Zielprojekt bleibt unveraendert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
30 lines
916 B
TypeScript
30 lines
916 B
TypeScript
import type { Metadata } from "next";
|
|
import { ConnectionsManager } from "@/components/ConnectionsManager";
|
|
import { requireUserPage } from "@/lib/auth/guard";
|
|
import { prisma } from "@/lib/db";
|
|
import { connectionSafeSelect } from "@/lib/projects";
|
|
import type { ConnectionWithCount } from "@/types";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Git-Verbindungen",
|
|
description: "GitHub, GitLab und Gitea verbinden.",
|
|
};
|
|
|
|
export default async function ConnectionsPage() {
|
|
const user = await requireUserPage();
|
|
|
|
const connections = await prisma.gitConnection.findMany({
|
|
where: { ownerId: user.id },
|
|
select: { ...connectionSafeSelect, _count: { select: { projects: true } } },
|
|
orderBy: { name: "asc" },
|
|
});
|
|
|
|
return (
|
|
<div className="pt-4">
|
|
<ConnectionsManager connections={connections as unknown as ConnectionWithCount[]} />
|
|
</div>
|
|
);
|
|
}
|