Skip to content

Commit d8d8bc4

Browse files
authored
fix: Process base64 avatar image (calcom#22165)
* fix: process base64 avatar image * better name * more * fix import
1 parent 55cc1ae commit d8d8bc4

6 files changed

Lines changed: 55 additions & 11 deletions

File tree

packages/app-store/_utils/oauth/updateProfilePhotoGoogle.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,34 @@ import { oauth2_v2 } from "@googleapis/oauth2";
22
import type { OAuth2Client } from "googleapis-common";
33

44
import logger from "@calcom/lib/logger";
5+
import { uploadAvatar } from "@calcom/lib/server/avatar";
56
import { UserRepository } from "@calcom/lib/server/repository/user";
7+
import { resizeBase64Image } from "@calcom/lib/server/resizeBase64Image";
68

79
export async function updateProfilePhotoGoogle(oAuth2Client: OAuth2Client, userId: number) {
810
try {
911
const oauth2 = new oauth2_v2.Oauth2({ auth: oAuth2Client });
1012
const userDetails = await oauth2.userinfo.get();
11-
if (userDetails.data?.picture) {
12-
await UserRepository.updateAvatar({ id: userId, avatarUrl: userDetails.data.picture });
13+
const avatarUrl = userDetails.data?.picture;
14+
if (!avatarUrl) {
15+
return;
1316
}
17+
18+
// Handle base64 data
19+
if (
20+
avatarUrl.startsWith("data:image/png;base64,") ||
21+
avatarUrl.startsWith("data:image/jpeg;base64,") ||
22+
avatarUrl.startsWith("data:image/jpg;base64,")
23+
) {
24+
const resizedAvatarUrl = await uploadAvatar({
25+
avatar: await resizeBase64Image(avatarUrl),
26+
userId,
27+
});
28+
await UserRepository.updateAvatar({ id: userId, avatarUrl: resizedAvatarUrl });
29+
return;
30+
}
31+
32+
await UserRepository.updateAvatar({ id: userId, avatarUrl });
1433
} catch (error) {
1534
logger.error("Error updating avatarUrl from google calendar connect", error);
1635
}

packages/app-store/googlecalendar/api/callback.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import type { NextApiRequest, NextApiResponse } from "next";
44

55
import GoogleCalendarService from "@calcom/app-store/googlecalendar/lib/CalendarService";
66
import { renewSelectedCalendarCredentialId } from "@calcom/lib/connectedCalendar";
7-
import { GOOGLE_CALENDAR_SCOPES, WEBAPP_URL, WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants";
7+
import {
8+
GOOGLE_CALENDAR_SCOPES,
9+
SCOPE_USERINFO_PROFILE,
10+
WEBAPP_URL,
11+
WEBAPP_URL_FOR_OAUTH,
12+
} from "@calcom/lib/constants";
813
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
914
import { HttpError } from "@calcom/lib/http-error";
1015
import { defaultHandler } from "@calcom/lib/server/defaultHandler";
@@ -14,6 +19,7 @@ import { Prisma } from "@calcom/prisma/client";
1419

1520
import getInstalledAppPath from "../../_utils/getInstalledAppPath";
1621
import { decodeOAuthState } from "../../_utils/oauth/decodeOAuthState";
22+
import { updateProfilePhotoGoogle } from "../../_utils/oauth/updateProfilePhotoGoogle";
1723
import { getGoogleAppKeys } from "../lib/getGoogleAppKeys";
1824

1925
async function getHandler(req: NextApiRequest, res: NextApiResponse) {
@@ -95,10 +101,9 @@ async function getHandler(req: NextApiRequest, res: NextApiResponse) {
95101
}
96102

97103
// Only attempt to update the user's profile photo if the user has granted the required scope
98-
// TODO: Use the avatarUrl when setting the profile picture
99-
// if (grantedScopes.includes(SCOPE_USERINFO_PROFILE)) {
100-
// await updateProfilePhotoGoogle(oAuth2Client, req.session.user.id);
101-
// }
104+
if (grantedScopes.includes(SCOPE_USERINFO_PROFILE)) {
105+
await updateProfilePhotoGoogle(oAuth2Client, req.session.user.id);
106+
}
102107

103108
const selectedCalendarWhereUnique = {
104109
userId: req.session.user.id,

packages/trpc/server/routers/viewer/me/updateProfile.handler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,12 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions)
152152
}
153153

154154
// if defined AND a base 64 string, upload and update the avatar URL
155-
if (input.avatarUrl && input.avatarUrl.startsWith("data:image/png;base64,")) {
155+
if (
156+
input.avatarUrl &&
157+
(input.avatarUrl.startsWith("data:image/png;base64,") ||
158+
input.avatarUrl.startsWith("data:image/jpeg;base64,") ||
159+
input.avatarUrl.startsWith("data:image/jpg;base64,"))
160+
) {
156161
data.avatarUrl = await uploadAvatar({
157162
avatar: await resizeBase64Image(input.avatarUrl),
158163
userId: user.id,

packages/trpc/server/routers/viewer/organizations/updateUser.handler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,12 @@ export const updateUserHandler = async ({ ctx, input }: UpdateUserOptions) => {
119119
timeZone: input.timeZone,
120120
};
121121

122-
if (input.avatar && input.avatar.startsWith("data:image/png;base64,")) {
122+
if (
123+
input.avatar &&
124+
(input.avatar.startsWith("data:image/png;base64,") ||
125+
input.avatar.startsWith("data:image/jpeg;base64,") ||
126+
input.avatar.startsWith("data:image/jpg;base64,"))
127+
) {
123128
const avatar = await resizeBase64Image(input.avatar);
124129
data.avatarUrl = await uploadAvatar({
125130
avatar,

packages/trpc/server/routers/viewer/teams/create.handler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ export const createHandler = async ({ ctx, input }: CreateOptions) => {
106106
},
107107
});
108108
// Upload logo, create doesn't allow logo removal
109-
if (input.logo && input.logo.startsWith("data:image/png;base64,")) {
109+
if (
110+
input.logo &&
111+
(input.logo.startsWith("data:image/png;base64,") ||
112+
input.logo.startsWith("data:image/jpeg;base64,") ||
113+
input.logo.startsWith("data:image/jpg;base64,"))
114+
) {
110115
const logoUrl = await uploadLogo({
111116
logo: await resizeBase64Image(input.logo),
112117
teamId: createdTeam.id,

packages/trpc/server/routers/viewer/teams/update.handler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => {
7070
rrTimestampBasis: input.rrTimestampBasis,
7171
};
7272

73-
if (input.logo && input.logo.startsWith("data:image/png;base64,")) {
73+
if (
74+
input.logo &&
75+
(input.logo.startsWith("data:image/png;base64,") ||
76+
input.logo.startsWith("data:image/jpeg;base64,") ||
77+
input.logo.startsWith("data:image/jpg;base64,"))
78+
) {
7479
data.logoUrl = await uploadLogo({ teamId: input.id, logo: input.logo });
7580
} else if (typeof input.logo !== "undefined" && !input.logo) {
7681
data.logoUrl = null;

0 commit comments

Comments
 (0)