+16









Carina Wollendorfer
GitHub
Alex van Andel
sajanlamsal
CarinaWolli
alannnc
Leo Giovanetti
Peer Richelsen
Hariom Balhara
Udit Takkar
Nitin Panghal
Omar López
Peer Richelsen
Shivam Kalra
Richard Poelderl
Crowdin Bot
Joe Au-Yeung
Nafees Nazik
Chiranjeev Vishnoi
Denzil Samuel
Syed Ali Shahbaz
nitinpanghal
Ahmad
Annlee Fores
Keith Williams
Vijay
68bd877c5b
Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: sajanlamsal <saznlamsal@gmail.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: alannnc <alannnc@gmail.com> Co-authored-by: Leo Giovanetti <hello@leog.me> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Nitin Panghal <nitin.panghal@unthinkable.co> Co-authored-by: Omar López <zomars@me.com> Co-authored-by: Peer Richelsen <peer@cal.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Shivam Kalra <shivamkalra98@gmail.com> Co-authored-by: Richard Poelderl <richard.poelderl@gmail.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: Nafees Nazik <84864519+G3root@users.noreply.github.com> Co-authored-by: Chiranjeev Vishnoi <66114276+Chiranjeev-droid@users.noreply.github.com> Co-authored-by: Denzil Samuel <71846487+samueldenzil@users.noreply.github.com> Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com> Co-authored-by: nitinpanghal <43965732+nitinpanghal@users.noreply.github.com> Co-authored-by: Ahmad <57593864+Ahmadkashif@users.noreply.github.com> Co-authored-by: Annlee Fores <annleefores@gmail.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Vijay <vijayraghav22@gmail.com>
79 lines
1.9 KiB
TypeScript
79 lines
1.9 KiB
TypeScript
import { randomBytes } from "crypto";
|
|
|
|
import dayjs from "@calcom/dayjs";
|
|
import { prisma } from "@calcom/prisma";
|
|
import type { AccessScope } from "@calcom/prisma/enums";
|
|
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
|
|
|
|
import { TRPCError } from "@trpc/server";
|
|
|
|
import type { TGenerateAuthCodeInputSchema } from "./generateAuthCode.schema";
|
|
|
|
type AddClientOptions = {
|
|
ctx: {
|
|
user: NonNullable<TrpcSessionUser>;
|
|
};
|
|
input: TGenerateAuthCodeInputSchema;
|
|
};
|
|
|
|
export const generateAuthCodeHandler = async ({ ctx, input }: AddClientOptions) => {
|
|
const { clientId, scopes, teamSlug } = input;
|
|
const client = await prisma.oAuthClient.findFirst({
|
|
where: {
|
|
clientId,
|
|
},
|
|
select: {
|
|
clientId: true,
|
|
redirectUri: true,
|
|
name: true,
|
|
},
|
|
});
|
|
|
|
if (!client) {
|
|
throw new TRPCError({ code: "UNAUTHORIZED", message: "Client ID not valid" });
|
|
}
|
|
const authorizationCode = generateAuthorizationCode();
|
|
|
|
const team = teamSlug
|
|
? await prisma.team.findFirst({
|
|
where: {
|
|
slug: teamSlug,
|
|
members: {
|
|
some: {
|
|
userId: ctx.user.id,
|
|
role: {
|
|
in: ["OWNER", "ADMIN"],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
: undefined;
|
|
|
|
if (teamSlug && !team) {
|
|
throw new TRPCError({ code: "UNAUTHORIZED" });
|
|
}
|
|
|
|
await prisma.accessCode.create({
|
|
data: {
|
|
code: authorizationCode,
|
|
clientId,
|
|
userId: !teamSlug ? ctx.user.id : undefined,
|
|
teamId: team ? team.id : undefined,
|
|
expiresAt: dayjs().add(10, "minutes").toDate(),
|
|
scopes: scopes as [AccessScope],
|
|
},
|
|
});
|
|
return { client, authorizationCode };
|
|
};
|
|
|
|
function generateAuthorizationCode() {
|
|
const randomBytesValue = randomBytes(40);
|
|
const authorizationCode = randomBytesValue
|
|
.toString("base64")
|
|
.replace(/=/g, "")
|
|
.replace(/\+/g, "-")
|
|
.replace(/\//g, "_");
|
|
return authorizationCode;
|
|
}
|