chore: Update EWS package (#16950)

* Update ews package

* Hide exchange version if using NTLM

* Remove instance of gzip

* Update yarn.lock file

* Updated yarn.lock

* Update yarn.lock

* Update yarn.lock

* Update yarn.lock (again)

* chore: Increase readability of [number] indexes by using find

* chore: Async not needed

* fix: Move 'use client' to appropriate file

* refactor

* install deasync directly as dev dependency

* fix type error

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
This commit is contained in:
Joe Au-Yeung
2024-10-10 15:48:58 +01:00
committed by GitHub
co-authored by Peer Richelsen Keith Williams Alex van Andel Benny Joo
parent 99caae8665
commit c8e8800647
11 changed files with 1371 additions and 154 deletions
@@ -1,5 +1,5 @@
import { withAppDirSsr } from "app/WithAppDirSsr";
import { PageProps } from "app/_types";
import type { PageProps } from "app/_types";
import { _generateMetadata } from "app/_utils";
import { WithLayout } from "app/layoutHOC";
import type { GetServerSidePropsResult } from "next";
+2
View File
@@ -1,3 +1,5 @@
"use client";
import { DefaultSeo } from "next-seo";
import { Inter } from "next/font/google";
import localFont from "next/font/local";
@@ -14,6 +14,8 @@ import type { RouterOutputs } from "@calcom/trpc";
import { getTemporaryOrgRedirect } from "@lib/getTemporaryOrgRedirect";
import { ssrInit } from "@server/lib/ssr";
const paramsSchema = z.object({
type: z.string().transform((s) => slugify(s)),
slug: z.string().transform((s) => slugify(s)),
@@ -23,17 +25,12 @@ const paramsSchema = z.object({
// 1. Check if team exists, to show 404
// 2. If rescheduling, get the booking details
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
const session = await getServerSession(context);
const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(context.params);
const {
rescheduleUid,
duration: queryDuration,
isInstantMeeting: queryIsInstantMeeting,
email,
} = context.query;
const { ssrInit } = await import("@server/lib/ssr");
const { req, params, query } = context;
const session = await getServerSession({ req });
const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(params);
const { rescheduleUid, isInstantMeeting: queryIsInstantMeeting, email } = query;
const ssr = await ssrInit(context);
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req, context.params?.orgSlug);
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req, params?.orgSlug);
const isOrgContext = currentOrgDomain && isValidOrgDomain;
if (!isOrgContext) {
+1
View File
@@ -173,6 +173,7 @@
"@types/uuid": "8.3.1",
"autoprefixer": "^10.4.12",
"copy-webpack-plugin": "^11.0.0",
"deasync": "^0.1.30",
"detect-port": "^1.3.0",
"env-cmd": "^10.1.0",
"module-alias": "^2.2.2",
@@ -1,5 +1,3 @@
"use client";
import withEmbedSsr from "@lib/withEmbedSsr";
import { getServerSideProps as _getServerSideProps } from ".";
@@ -1,5 +1,3 @@
"use client";
import PageWrapper from "@components/PageWrapper";
import type { PageProps as TeamTypePageProps } from "~/team/type-view";
@@ -204,7 +204,6 @@ export default class ExchangeCalendarService implements Calendar {
if (this.payload.authenticationMethod === ExchangeAuthentication.NTLM) {
const xhr: XhrApi = new XhrApi({
rejectUnauthorized: false,
gzip: this.payload.useCompression,
}).useNtlmAuthentication(this.payload.username, this.payload.password);
service.XHRApi = xhr;
}
@@ -8,7 +8,7 @@
"dependencies": {
"@calcom/lib": "*",
"@calcom/prisma": "*",
"@ewsjs/xhr": "^1.4.4",
"@ewsjs/xhr": "^3.1.2",
"ews-javascript-api": "^0.11.0"
},
"devDependencies": {
@@ -6,7 +6,7 @@ import { Toaster } from "react-hot-toast";
import z from "zod";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Alert, Button, EmailField, Form, PasswordField, SelectField, Switch, TextField } from "@calcom/ui";
import { Alert, Button, EmailField, Form, PasswordField, SelectField, TextField } from "@calcom/ui";
import { ExchangeAuthentication, ExchangeVersion } from "../../enums";
@@ -36,11 +36,12 @@ export default function ExchangeSetup() {
const [errorMessage, setErrorMessage] = useState("");
const form = useForm<IFormData>({
defaultValues: {
authenticationMethod: ExchangeAuthentication.STANDARD,
authenticationMethod: ExchangeAuthentication.NTLM,
exchangeVersion: ExchangeVersion.Exchange2016,
},
resolver: zodResolver(schema),
});
const authenticationMethod = form.watch("authenticationMethod");
const authenticationMethods = [
{ value: ExchangeAuthentication.STANDARD, label: t("exchange_authentication_standard") },
{ value: ExchangeAuthentication.NTLM, label: t("exchange_authentication_ntlm") },
@@ -115,44 +116,49 @@ export default function ExchangeSetup() {
<Controller
name="authenticationMethod"
control={form.control}
render={({ field: { onChange } }) => (
<SelectField
label={t("exchange_authentication")}
options={authenticationMethods}
defaultValue={authenticationMethods[0]}
onChange={async (authentication) => {
if (authentication) {
onChange(authentication.value);
form.setValue("authenticationMethod", authentication.value);
}
}}
/>
)}
/>
<Controller
name="exchangeVersion"
control={form.control}
render={({ field: { onChange } }) => (
<SelectField
label={t("exchange_version")}
options={exchangeVersions}
defaultValue={exchangeVersions[7]}
onChange={async (version) => {
onChange(version?.value);
if (version) {
form.setValue("exchangeVersion", version.value);
}
}}
/>
)}
/>
<Switch
label={t("exchange_compression")}
name="useCompression"
onCheckedChange={async (alt) => {
form.setValue("useCompression", alt);
render={({ field: { onChange } }) => {
const ntlmAuthenticationMethod = authenticationMethods.find(
(method) => method.value === ExchangeAuthentication.NTLM
);
return (
<SelectField
label={t("exchange_authentication")}
options={authenticationMethods}
defaultValue={ntlmAuthenticationMethod}
onChange={(authentication) => {
if (authentication) {
onChange(authentication.value);
form.setValue("authenticationMethod", authentication.value);
}
}}
/>
);
}}
/>
{authenticationMethod === ExchangeAuthentication.STANDARD ? (
<Controller
name="exchangeVersion"
control={form.control}
render={({ field: { onChange } }) => {
const exchangeVersion2016 = exchangeVersions.find(
(exchangeVersion) => exchangeVersion.value === ExchangeVersion.Exchange2016
);
return (
<SelectField
label={t("exchange_version")}
options={exchangeVersions}
defaultValue={exchangeVersion2016}
onChange={(version) => {
onChange(version?.value);
if (version) {
form.setValue("exchangeVersion", version.value);
}
}}
/>
);
}}
/>
) : null}
</fieldset>
{errorMessage && <Alert severity="error" title={errorMessage} className="my-4" />}
<div className="mt-4 flex justify-end space-x-2 rtl:space-x-reverse">
+56 -55
View File
@@ -570,60 +570,60 @@ enum BookingStatus {
}
model Booking {
id Int @id @default(autoincrement())
uid String @unique
id Int @id @default(autoincrement())
uid String @unique
// (optional) UID based on slot start/end time & email against duplicates
idempotencyKey String? @unique
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
userId Int?
idempotencyKey String? @unique
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
userId Int?
// User's email at the time of booking
/// @zod.email()
userPrimaryEmail String?
references BookingReference[]
eventType EventType? @relation(fields: [eventTypeId], references: [id])
eventTypeId Int?
title String
description String?
customInputs Json?
userPrimaryEmail String?
references BookingReference[]
eventType EventType? @relation(fields: [eventTypeId], references: [id])
eventTypeId Int?
title String
description String?
customInputs Json?
/// @zod.custom(imports.bookingResponses)
responses Json?
startTime DateTime
endTime DateTime
attendees Attendee[]
location String?
createdAt DateTime @default(now())
updatedAt DateTime?
status BookingStatus @default(ACCEPTED)
paid Boolean @default(false)
payment Payment[]
destinationCalendar DestinationCalendar? @relation(fields: [destinationCalendarId], references: [id])
destinationCalendarId Int?
cancellationReason String?
rejectionReason String?
dynamicEventSlugRef String?
dynamicGroupSlugRef String?
rescheduled Boolean?
fromReschedule String?
recurringEventId String?
smsReminderNumber String?
workflowReminders WorkflowReminder[]
scheduledJobs String[] // scheduledJobs is deprecated, please use scheduledTriggers instead
seatsReferences BookingSeat[]
responses Json?
startTime DateTime
endTime DateTime
attendees Attendee[]
location String?
createdAt DateTime @default(now())
updatedAt DateTime?
status BookingStatus @default(ACCEPTED)
paid Boolean @default(false)
payment Payment[]
destinationCalendar DestinationCalendar? @relation(fields: [destinationCalendarId], references: [id])
destinationCalendarId Int?
cancellationReason String?
rejectionReason String?
dynamicEventSlugRef String?
dynamicGroupSlugRef String?
rescheduled Boolean?
fromReschedule String?
recurringEventId String?
smsReminderNumber String?
workflowReminders WorkflowReminder[]
scheduledJobs String[] // scheduledJobs is deprecated, please use scheduledTriggers instead
seatsReferences BookingSeat[]
/// @zod.custom(imports.bookingMetadataSchema)
metadata Json?
isRecorded Boolean @default(false)
iCalUID String? @default("")
iCalSequence Int @default(0)
instantMeetingToken InstantMeetingToken?
rating Int?
ratingFeedback String?
noShowHost Boolean? @default(false)
scheduledTriggers WebhookScheduledTriggers[]
oneTimePassword String? @unique @default(uuid())
metadata Json?
isRecorded Boolean @default(false)
iCalUID String? @default("")
iCalSequence Int @default(0)
instantMeetingToken InstantMeetingToken?
rating Int?
ratingFeedback String?
noShowHost Boolean? @default(false)
scheduledTriggers WebhookScheduledTriggers[]
oneTimePassword String? @unique @default(uuid())
/// @zod.email()
cancelledBy String?
cancelledBy String?
/// @zod.email()
rescheduledBy String?
rescheduledBy String?
routedFromRoutingFormReponse App_RoutingForms_FormResponse?
@@index([eventTypeId])
@@ -935,15 +935,16 @@ model App_RoutingForms_Form {
}
model App_RoutingForms_FormResponse {
id Int @id @default(autoincrement())
formFillerId String @default(cuid())
form App_RoutingForms_Form @relation(fields: [formId], references: [id], onDelete: Cascade)
formId String
response Json
createdAt DateTime @default(now())
routedToBookingUid String? @unique
id Int @id @default(autoincrement())
formFillerId String @default(cuid())
form App_RoutingForms_Form @relation(fields: [formId], references: [id], onDelete: Cascade)
formId String
response Json
createdAt DateTime @default(now())
routedToBookingUid String? @unique
// We should not cascade delete the booking, because we want to keep the form response even if the routedToBooking is deleted
routedToBooking Booking? @relation(fields: [routedToBookingUid], references: [uid])
routedToBooking Booking? @relation(fields: [routedToBookingUid], references: [uid])
@@unique([formFillerId, formId])
@@index([formFillerId])
@@index([formId])
+1259 -44
View File
File diff suppressed because it is too large Load Diff