Skip to content

Commit d5695a0

Browse files
authored
Merge pull request #445 from zitadel/qa
Promote qa to prod: iframe options, fix middleware for edge runtime
2 parents 8205b4d + 41fb472 commit d5695a0

File tree

52 files changed

+359
-189
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+359
-189
lines changed

.github/workflows/docker.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ on:
44
push:
55
branches:
66
- main
7+
- qa
78
workflow_dispatch:
89

910
permissions:
@@ -41,7 +42,7 @@ jobs:
4142
- name: Set up Docker Buildx
4243
uses: docker/setup-buildx-action@v3
4344
with:
44-
driver-opts: 'image=moby/buildkit:v0.11.6'
45+
driver: docker-container
4546

4647
- name: Login Public
4748
uses: docker/login-action@v3

apps/login/constants/csp.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const DEFAULT_CSP =
2+
"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com; connect-src 'self'; child-src; style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; img-src 'self' https://vercel.com;";

apps/login/mock/initial-stubs/zitadel.settings.v2.SettingsService.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
"data": {}
77
}
88
},
9+
{
10+
"service": "zitadel.settings.v2.SettingsService",
11+
"method": "GetSecuritySettings",
12+
"out": {
13+
"data": {}
14+
}
15+
},
916
{
1017
"service": "zitadel.settings.v2.SettingsService",
1118
"method": "GetLegalAndSupportSettings",

apps/login/next.config.mjs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import createNextIntlPlugin from "next-intl/plugin";
2+
import { DEFAULT_CSP } from "./constants/csp.js";
23

34
const withNextIntl = createNextIntlPlugin();
45

@@ -29,9 +30,9 @@ const secureHeaders = [
2930
// script-src va.vercel-scripts.com for analytics/vercel scripts
3031
{
3132
key: "Content-Security-Policy",
32-
value:
33-
"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://va.vercel-scripts.com; connect-src 'self'; child-src; style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; img-src 'self' https://vercel.com;",
33+
value: `${DEFAULT_CSP} frame-ancestors 'none'`,
3434
},
35+
{ key: "X-Frame-Options", value: "deny" },
3536
];
3637

3738
const imageRemotePatterns = [

apps/login/src/app/(login)/accounts/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { DynamicTheme } from "@/components/dynamic-theme";
22
import { SessionsList } from "@/components/sessions-list";
33
import { getAllSessionCookieIds } from "@/lib/cookies";
4-
import { getServiceUrlFromHeaders } from "@/lib/service";
4+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
55
import {
66
getBrandingSettings,
77
getDefaultOrg,

apps/login/src/app/(login)/authenticator/set/page.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DynamicTheme } from "@/components/dynamic-theme";
55
import { SignInWithIdp } from "@/components/sign-in-with-idp";
66
import { UserAvatar } from "@/components/user-avatar";
77
import { getSessionCookieById } from "@/lib/cookies";
8-
import { getServiceUrlFromHeaders } from "@/lib/service";
8+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
99
import { loadMostRecentSession } from "@/lib/session";
1010
import {
1111
getActiveIdentityProviders,
@@ -33,8 +33,8 @@ export default async function Page(props: {
3333
const { serviceUrl } = getServiceUrlFromHeaders(_headers);
3434

3535
const sessionWithData = sessionId
36-
? await loadSessionById(serviceUrl, sessionId, organization)
37-
: await loadSessionByLoginname(serviceUrl, loginName, organization);
36+
? await loadSessionById(sessionId, organization)
37+
: await loadSessionByLoginname(loginName, organization);
3838

3939
async function getAuthMethodsAndUser(
4040
serviceUrl: string,
@@ -67,7 +67,6 @@ export default async function Page(props: {
6767
}
6868

6969
async function loadSessionByLoginname(
70-
host: string,
7170
loginName?: string,
7271
organization?: string,
7372
) {
@@ -82,11 +81,7 @@ export default async function Page(props: {
8281
});
8382
}
8483

85-
async function loadSessionById(
86-
host: string,
87-
sessionId: string,
88-
organization?: string,
89-
) {
84+
async function loadSessionById(sessionId: string, organization?: string) {
9085
const recent = await getSessionCookieById({ sessionId, organization });
9186
return getSession({
9287
serviceUrl,

apps/login/src/app/(login)/device/consent/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ConsentScreen } from "@/components/consent";
22
import { DynamicTheme } from "@/components/dynamic-theme";
3-
import { getServiceUrlFromHeaders } from "@/lib/service";
3+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
44
import {
55
getBrandingSettings,
66
getDefaultOrg,

apps/login/src/app/(login)/device/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { DeviceCodeForm } from "@/components/device-code-form";
22
import { DynamicTheme } from "@/components/dynamic-theme";
3-
import { getServiceUrlFromHeaders } from "@/lib/service";
3+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
44
import { getBrandingSettings, getDefaultOrg } from "@/lib/zitadel";
55
import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb";
66
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/idp/[provider]/failure/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert, AlertType } from "@/components/alert";
22
import { ChooseAuthenticatorToLogin } from "@/components/choose-authenticator-to-login";
33
import { DynamicTheme } from "@/components/dynamic-theme";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import {
77
getBrandingSettings,
88
getLoginSettings,

apps/login/src/app/(login)/idp/[provider]/success/page.tsx

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { linkingFailed } from "@/components/idps/pages/linking-failed";
44
import { linkingSuccess } from "@/components/idps/pages/linking-success";
55
import { loginFailed } from "@/components/idps/pages/login-failed";
66
import { loginSuccess } from "@/components/idps/pages/login-success";
7-
import { idpTypeToIdentityProviderType } from "@/lib/idp";
8-
import { getServiceUrlFromHeaders } from "@/lib/service";
7+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
98
import {
109
addHuman,
1110
addIDPLink,
@@ -16,10 +15,13 @@ import {
1615
listUsers,
1716
retrieveIDPIntent,
1817
} from "@/lib/zitadel";
19-
import { create } from "@zitadel/client";
18+
import { ConnectError, create } from "@zitadel/client";
2019
import { AutoLinkingOption } from "@zitadel/proto/zitadel/idp/v2/idp_pb";
2120
import { OrganizationSchema } from "@zitadel/proto/zitadel/object/v2/object_pb";
22-
import { AddHumanUserRequestSchema } from "@zitadel/proto/zitadel/user/v2/user_service_pb";
21+
import {
22+
AddHumanUserRequest,
23+
AddHumanUserRequestSchema,
24+
} from "@zitadel/proto/zitadel/user/v2/user_service_pb";
2325
import { getLocale, getTranslations } from "next-intl/server";
2426
import { headers } from "next/headers";
2527

@@ -83,8 +85,6 @@ export default async function Page(props: {
8385
throw new Error("IDP not found");
8486
}
8587

86-
const providerType = idpTypeToIdentityProviderType(idp.type);
87-
8888
if (link) {
8989
if (!options?.isLinkingAllowed) {
9090
// linking was probably disallowed since the invitation was created
@@ -205,20 +205,42 @@ export default async function Page(props: {
205205
}
206206
}
207207

208-
if (addHumanUser && orgToRegisterOn) {
209-
const organizationSchema = create(OrganizationSchema, {
210-
org: { case: "orgId", value: orgToRegisterOn },
211-
});
208+
if (addHumanUser) {
209+
let addHumanUserWithOrganization: AddHumanUserRequest;
210+
if (orgToRegisterOn) {
211+
const organizationSchema = create(OrganizationSchema, {
212+
org: { case: "orgId", value: orgToRegisterOn },
213+
});
212214

213-
const addHumanUserWithOrganization = create(AddHumanUserRequestSchema, {
214-
...addHumanUser,
215-
organization: organizationSchema,
216-
});
215+
addHumanUserWithOrganization = create(AddHumanUserRequestSchema, {
216+
...addHumanUser,
217+
organization: organizationSchema,
218+
});
219+
} else {
220+
addHumanUserWithOrganization = create(
221+
AddHumanUserRequestSchema,
222+
addHumanUser,
223+
);
224+
}
217225

218-
newUser = await addHuman({
219-
serviceUrl,
220-
request: addHumanUserWithOrganization,
221-
});
226+
try {
227+
newUser = await addHuman({
228+
serviceUrl,
229+
request: addHumanUserWithOrganization,
230+
});
231+
} catch (error: unknown) {
232+
console.error(
233+
"An error occurred while creating the user:",
234+
error,
235+
addHumanUser,
236+
);
237+
return loginFailed(
238+
branding,
239+
(error as ConnectError).message
240+
? (error as ConnectError).message
241+
: "Could not create user",
242+
);
243+
}
222244
}
223245

224246
if (newUser) {

apps/login/src/app/(login)/idp/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { DynamicTheme } from "@/components/dynamic-theme";
22
import { SignInWithIdp } from "@/components/sign-in-with-idp";
3-
import { getServiceUrlFromHeaders } from "@/lib/service";
3+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
44
import { getActiveIdentityProviders, getBrandingSettings } from "@/lib/zitadel";
55
import { getLocale, getTranslations } from "next-intl/server";
66
import { headers } from "next/headers";

apps/login/src/app/(login)/invite/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Alert, AlertType } from "@/components/alert";
22
import { DynamicTheme } from "@/components/dynamic-theme";
33
import { InviteForm } from "@/components/invite-form";
4-
import { getServiceUrlFromHeaders } from "@/lib/service";
4+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
55
import {
66
getBrandingSettings,
77
getDefaultOrg,

apps/login/src/app/(login)/invite/success/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert, AlertType } from "@/components/alert";
22
import { Button, ButtonVariants } from "@/components/button";
33
import { DynamicTheme } from "@/components/dynamic-theme";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { getBrandingSettings, getDefaultOrg, getUserByID } from "@/lib/zitadel";
77
import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb";
88
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/loginname/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { DynamicTheme } from "@/components/dynamic-theme";
22
import { SignInWithIdp } from "@/components/sign-in-with-idp";
33
import { UsernameForm } from "@/components/username-form";
4-
import { getServiceUrlFromHeaders } from "@/lib/service";
4+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
55
import {
66
getActiveIdentityProviders,
77
getBrandingSettings,

apps/login/src/app/(login)/mfa/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ChooseSecondFactor } from "@/components/choose-second-factor";
44
import { DynamicTheme } from "@/components/dynamic-theme";
55
import { UserAvatar } from "@/components/user-avatar";
66
import { getSessionCookieById } from "@/lib/cookies";
7-
import { getServiceUrlFromHeaders } from "@/lib/service";
7+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
88
import { loadMostRecentSession } from "@/lib/session";
99
import {
1010
getBrandingSettings,

apps/login/src/app/(login)/mfa/set/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ChooseSecondFactorToSetup } from "@/components/choose-second-factor-to-
44
import { DynamicTheme } from "@/components/dynamic-theme";
55
import { UserAvatar } from "@/components/user-avatar";
66
import { getSessionCookieById } from "@/lib/cookies";
7-
import { getServiceUrlFromHeaders } from "@/lib/service";
7+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
88
import { loadMostRecentSession } from "@/lib/session";
99
import {
1010
getBrandingSettings,

apps/login/src/app/(login)/otp/[method]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DynamicTheme } from "@/components/dynamic-theme";
33
import { LoginOTP } from "@/components/login-otp";
44
import { UserAvatar } from "@/components/user-avatar";
55
import { getSessionCookieById } from "@/lib/cookies";
6-
import { getServiceUrlFromHeaders } from "@/lib/service";
6+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
77
import { loadMostRecentSession } from "@/lib/session";
88
import {
99
getBrandingSettings,

apps/login/src/app/(login)/otp/[method]/set/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Button, ButtonVariants } from "@/components/button";
44
import { DynamicTheme } from "@/components/dynamic-theme";
55
import { TotpRegister } from "@/components/totp-register";
66
import { UserAvatar } from "@/components/user-avatar";
7-
import { getServiceUrlFromHeaders } from "@/lib/service";
7+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
88
import { loadMostRecentSession } from "@/lib/session";
99
import {
1010
addOTPEmail,

apps/login/src/app/(login)/passkey/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DynamicTheme } from "@/components/dynamic-theme";
33
import { LoginPasskey } from "@/components/login-passkey";
44
import { UserAvatar } from "@/components/user-avatar";
55
import { getSessionCookieById } from "@/lib/cookies";
6-
import { getServiceUrlFromHeaders } from "@/lib/service";
6+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
77
import { loadMostRecentSession } from "@/lib/session";
88
import { getBrandingSettings, getSession } from "@/lib/zitadel";
99
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/passkey/set/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert, AlertType } from "@/components/alert";
22
import { DynamicTheme } from "@/components/dynamic-theme";
33
import { RegisterPasskey } from "@/components/register-passkey";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { loadMostRecentSession } from "@/lib/session";
77
import { getBrandingSettings } from "@/lib/zitadel";
88
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/password/change/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert } from "@/components/alert";
22
import { ChangePasswordForm } from "@/components/change-password-form";
33
import { DynamicTheme } from "@/components/dynamic-theme";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { loadMostRecentSession } from "@/lib/session";
77
import {
88
getBrandingSettings,

apps/login/src/app/(login)/password/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert } from "@/components/alert";
22
import { DynamicTheme } from "@/components/dynamic-theme";
33
import { PasswordForm } from "@/components/password-form";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { loadMostRecentSession } from "@/lib/session";
77
import {
88
getBrandingSettings,

apps/login/src/app/(login)/password/set/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert, AlertType } from "@/components/alert";
22
import { DynamicTheme } from "@/components/dynamic-theme";
33
import { SetPasswordForm } from "@/components/set-password-form";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { loadMostRecentSession } from "@/lib/session";
77
import {
88
getBrandingSettings,

apps/login/src/app/(login)/register/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { DynamicTheme } from "@/components/dynamic-theme";
22
import { RegisterForm } from "@/components/register-form";
3-
import { getServiceUrlFromHeaders } from "@/lib/service";
3+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
44
import {
55
getBrandingSettings,
66
getDefaultOrg,

apps/login/src/app/(login)/register/password/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { DynamicTheme } from "@/components/dynamic-theme";
22
import { SetRegisterPasswordForm } from "@/components/set-register-password-form";
3-
import { getServiceUrlFromHeaders } from "@/lib/service";
3+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
44
import {
55
getBrandingSettings,
66
getDefaultOrg,

apps/login/src/app/(login)/signedin/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
getSessionCookieById,
88
} from "@/lib/cookies";
99
import { completeDeviceAuthorization } from "@/lib/server/device";
10-
import { getServiceUrlFromHeaders } from "@/lib/service";
10+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
1111
import { loadMostRecentSession } from "@/lib/session";
1212
import {
1313
getBrandingSettings,

apps/login/src/app/(login)/u2f/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DynamicTheme } from "@/components/dynamic-theme";
33
import { LoginPasskey } from "@/components/login-passkey";
44
import { UserAvatar } from "@/components/user-avatar";
55
import { getSessionCookieById } from "@/lib/cookies";
6-
import { getServiceUrlFromHeaders } from "@/lib/service";
6+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
77
import { loadMostRecentSession } from "@/lib/session";
88
import { getBrandingSettings, getSession } from "@/lib/zitadel";
99
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/u2f/set/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert } from "@/components/alert";
22
import { DynamicTheme } from "@/components/dynamic-theme";
33
import { RegisterU2f } from "@/components/register-u2f";
44
import { UserAvatar } from "@/components/user-avatar";
5-
import { getServiceUrlFromHeaders } from "@/lib/service";
5+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
66
import { loadMostRecentSession } from "@/lib/session";
77
import { getBrandingSettings } from "@/lib/zitadel";
88
import { getLocale, getTranslations } from "next-intl/server";

apps/login/src/app/(login)/verify/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { UserAvatar } from "@/components/user-avatar";
44
import { VerifyForm } from "@/components/verify-form";
55
import { VerifyRedirectButton } from "@/components/verify-redirect-button";
66
import { sendEmailCode } from "@/lib/server/verify";
7-
import { getServiceUrlFromHeaders } from "@/lib/service";
7+
import { getServiceUrlFromHeaders } from "@/lib/service-url";
88
import { loadMostRecentSession } from "@/lib/session";
99
import {
1010
getBrandingSettings,

0 commit comments

Comments
 (0)