227 lines · 9.2 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { MAX_IN_LIST } from "~/server/db";
import { notFoundError } from "~/server/errors";
import { limitBrowse, limitWrite } from "~/server/limits";
import { assertNotArchived, hasPermission, requireRepoAccess } from "~/server/repos";
import { advisoryCounts, canManageAdvisories } from "~/server/security/advisories";
import {
  codeAlertCounts,
  listCodeAlerts,
  listSarifUploads,
  loadCodeAlert,
  pullCodeAlerts,
  setCodeAlertDismissed,
} from "~/server/security/code-scanning";
import { listDependencies } from "~/server/security/dependencies";
import { loadSecurityPolicy } from "~/server/security/policy";
import { bypassPushBlock, loadPushBlock } from "~/server/security/push-protection";
import { enqueueSecurity } from "~/server/security/queue";
import { listSecretAlerts, secretAlertCounts, setSecretAlertState } from "~/server/security/secret-alerts";
import { loadSecuritySettings, saveSecuritySettings } from "~/server/security/settings";
import { loadSignatures } from "~/server/security/signatures";
import { loadPull } from "~/server/pulls";
import { branchSha, listRefs } from "~/server/git/refs";
import { repoRef } from "~/lib/validation";

const page = z.number().int().min(1).max(1000).default(1);
const sha = z.string().regex(/^[0-9a-f]{40}$/);
const MAX_VERIFY_ON_VIEW = 20;

export const getSecurityOverview = createServerFn({ method: "GET" })
  .middleware([viewerMiddleware])
  .validator(repoRef)
  .handler(async ({ data, context }) => {
    await limitBrowse(context.viewer);
    const { repo, permission } = await requireRepoAccess(data.owner, data.repo, context.viewer, "read");
    const canWrite = hasPermission(permission, "write");
    const [settings, policy, advisories] = await Promise.all([
      loadSecuritySettings(repo.id),