GitFOSS
ed60d5e (parent 2192114)12/18/2023, 2:52:45 AM
.ts
TypeScript
(application/typescript)
// 3rd-party
import type { ReqHandler } from "@ethicdevs/react-monolith";

import { GitServer } from "@ethicdevs/fastify-git-server";
import { AppRoute, AppRouteParams } from "../routes.defs";
import { makeGitServerService } from "../services/gitServer";

const onSSHAuth: ReqHandler<AppRouteParams, AppRoute.SSH_AUTH> = async (
  request,
  reply
) => {
  const gitService = makeGitServerService({
    request,
    cryptoService: request.cryptoService,
  });

  request.body =
    typeof request.body === "string" ? JSON.parse(request.body) : request.body;

  const { command, repoSlug, username, publicKey } = request.body;

  const result = await gitService.repositoryResolver(
    repoSlug.replace(/\.git$/, "")
  );

  let { authMode, gitRepositoryDir } = result;
  gitRepositoryDir = gitRepositoryDir.toString().endsWith(".git")
    ? gitRepositoryDir
    : `${gitRepositoryDir}.git`;

  if (
    authMode === GitServer.AuthMode.NEVER ||
    (authMode === GitServer.AuthMode.PUSH_ONLY &&
      command !== "git-receive-pack") // push
  ) {
    reply.status(200).send({
      success: true,
      authMode,
      command,
      gitRepositoryDir,
    });
    return;
  }

  const isAuthorizationValid = await gitService.authorizationResolver(
    repoSlug.replace(/\.git$/, "") + ".pub",
    {
      username,
      password: publicKey,
    }
  );

  reply.status(isAuthorizationValid ? 200 : 403).send({
    success: isAuthorizationValid,
    authMode,
    command,
    gitRepositoryDir,
  });
};

export const SSHAuthController = {
  onSSHAuth,
};