fix: Hide SAML/OIDC login button if no sso connection exists (Self hosted instance) (#10903)
Co-authored-by: zomars <zomars@me.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com>pull/11769/head^2
parent
d8f6400add
commit
b5cf4e50a9
|
@ -15,11 +15,12 @@ import { SAMLLogin } from "@calcom/features/auth/SAMLLogin";
|
|||
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { isSAMLLoginEnabled, samlProductID, samlTenantID } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { WEBAPP_URL, WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { WEBAPP_URL, WEBSITE_URL, HOSTED_CAL_FEATURES } from "@calcom/lib/constants";
|
||||
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Alert, Button, EmailField, PasswordField } from "@calcom/ui";
|
||||
import { ArrowLeft, Lock } from "@calcom/ui/components/icon";
|
||||
|
||||
|
@ -160,6 +161,16 @@ export default function Login({
|
|||
else setErrorMessage(errorMessages[res.error] || t("something_went_wrong"));
|
||||
};
|
||||
|
||||
const { data, isLoading } = trpc.viewer.public.ssoConnections.useQuery(undefined, {
|
||||
onError: (err) => {
|
||||
setErrorMessage(err.message);
|
||||
},
|
||||
});
|
||||
|
||||
const displaySSOLogin = HOSTED_CAL_FEATURES
|
||||
? true
|
||||
: isSAMLLoginEnabled && !isLoading && data?.connectionExists;
|
||||
|
||||
return (
|
||||
<div
|
||||
style={
|
||||
|
@ -232,7 +243,7 @@ export default function Login({
|
|||
</form>
|
||||
{!twoFactorRequired && (
|
||||
<>
|
||||
{(isGoogleLoginEnabled || isSAMLLoginEnabled) && <hr className="border-subtle my-8" />}
|
||||
{(isGoogleLoginEnabled || displaySSOLogin) && <hr className="border-subtle my-8" />}
|
||||
<div className="space-y-3">
|
||||
{isGoogleLoginEnabled && (
|
||||
<Button
|
||||
|
@ -247,7 +258,7 @@ export default function Login({
|
|||
{t("signin_with_google")}
|
||||
</Button>
|
||||
)}
|
||||
{isSAMLLoginEnabled && (
|
||||
{displaySSOLogin && (
|
||||
<SAMLLogin
|
||||
samlTenantID={samlTenantID}
|
||||
samlProductID={samlProductID}
|
||||
|
|
|
@ -15,7 +15,8 @@ test("Should display SAML Login button", async ({ page }) => {
|
|||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip(!IS_SAML_LOGIN_ENABLED, "It should only run if SAML Login is installed");
|
||||
|
||||
await page.goto(`/auth/login`);
|
||||
|
||||
await expect(page.locator(`[data-testid=saml]`)).toBeVisible();
|
||||
// TODO: Fix this later
|
||||
// Button is visible only if there is a SAML connection exists (self-hosted)
|
||||
// await page.goto(`/auth/login`);
|
||||
// await expect(page.locator(`[data-testid=saml]`)).toBeVisible();
|
||||
});
|
||||
|
|
|
@ -49,4 +49,11 @@ export const publicViewerRouter = router({
|
|||
const handler = await importHandler(namespaced("event"), () => import("./event.handler"));
|
||||
return handler(opts);
|
||||
}),
|
||||
ssoConnections: publicProcedure.query(async () => {
|
||||
const handler = await importHandler(
|
||||
namespaced("ssoConnections"),
|
||||
() => import("./ssoConnections.handler")
|
||||
);
|
||||
return handler();
|
||||
}),
|
||||
});
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
import jackson from "@calcom/features/ee/sso/lib/jackson";
|
||||
import { samlProductID, samlTenantID } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { HOSTED_CAL_FEATURES } from "@calcom/lib/constants";
|
||||
|
||||
import { TRPCError } from "@trpc/server";
|
||||
|
||||
export const handler = async () => {
|
||||
try {
|
||||
if (HOSTED_CAL_FEATURES) {
|
||||
return {
|
||||
connectionExists: null,
|
||||
};
|
||||
}
|
||||
|
||||
const { connectionController } = await jackson();
|
||||
|
||||
const connections = await connectionController.getConnections({
|
||||
tenant: samlTenantID,
|
||||
product: samlProductID,
|
||||
});
|
||||
|
||||
return {
|
||||
connectionExists: connections.length > 0,
|
||||
};
|
||||
} catch (err) {
|
||||
console.error("Error getting SSO connections", err);
|
||||
throw new TRPCError({ code: "BAD_REQUEST", message: "Fetching SSO connections failed." });
|
||||
}
|
||||
};
|
||||
|
||||
export default handler;
|
Loading…
Reference in New Issue