diff --git a/backend/src/server/lib/schemas.ts b/backend/src/server/lib/schemas.ts
index 9f93eaea0..72ee8eb4f 100644
--- a/backend/src/server/lib/schemas.ts
+++ b/backend/src/server/lib/schemas.ts
@@ -48,3 +48,23 @@ export const SecretNameSchema = BaseSecretNameSchema.refine(
)
.refine((el) => !el.includes(":"), "Secret name cannot contain colon.")
.refine((el) => !el.includes("/"), "Secret name cannot contain forward slash.");
+
+const DefaultOrgSchema = z.object({
+ useDefaultOrg: z.literal(true),
+ organizationName: z.string().trim().optional()
+});
+
+const CustomOrgSchema = z.object({
+ useDefaultOrg: z.literal(false),
+ organizationName: GenericResourceNameSchema
+});
+
+export const OrganizationInputSchema = z.preprocess(
+ (data) => {
+ if (typeof data === "object" && data && "useDefaultOrg" in data === false) {
+ return { ...data, useDefaultOrg: false };
+ }
+ return data;
+ },
+ z.discriminatedUnion("useDefaultOrg", [DefaultOrgSchema, CustomOrgSchema])
+);
diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts
index a71a69c20..cfd6ca84a 100644
--- a/backend/src/server/routes/index.ts
+++ b/backend/src/server/routes/index.ts
@@ -623,6 +623,7 @@ export const registerRoutes = async (
tokenService,
orgDAL,
totpService,
+ orgMembershipDAL,
auditLogService
});
const passwordService = authPaswordServiceFactory({
diff --git a/backend/src/server/routes/v1/sso-router.ts b/backend/src/server/routes/v1/sso-router.ts
index f7a1b973a..5f66a67ca 100644
--- a/backend/src/server/routes/v1/sso-router.ts
+++ b/backend/src/server/routes/v1/sso-router.ts
@@ -23,6 +23,7 @@ import { fetchGithubEmails, fetchGithubUser } from "@app/lib/requests/github";
import { authRateLimit } from "@app/server/config/rateLimiter";
import { AuthMethod } from "@app/services/auth/auth-type";
import { OrgAuthMethod } from "@app/services/org/org-types";
+import { getServerCfg } from "@app/services/super-admin/super-admin-service";
export const registerSsoRouter = async (server: FastifyZodProvider) => {
const appCfg = getConfig();
@@ -342,8 +343,12 @@ export const registerSsoRouter = async (server: FastifyZodProvider) => {
}`
);
}
+
+ const serverCfg = await getServerCfg();
return res.redirect(
- `${appCfg.SITE_URL}/signup/sso?token=${encodeURIComponent(req.passportUser.providerAuthToken)}`
+ `${appCfg.SITE_URL}/signup/sso?token=${encodeURIComponent(req.passportUser.providerAuthToken)}${
+ serverCfg.defaultAuthOrgId ? `&defaultOrgAllowed=true` : ""
+ }`
);
}
});
diff --git a/backend/src/server/routes/v3/signup-router.ts b/backend/src/server/routes/v3/signup-router.ts
index d9196dc88..8c786355d 100644
--- a/backend/src/server/routes/v3/signup-router.ts
+++ b/backend/src/server/routes/v3/signup-router.ts
@@ -4,7 +4,7 @@ import { UsersSchema } from "@app/db/schemas";
import { getConfig } from "@app/lib/config/env";
import { ForbiddenRequestError } from "@app/lib/errors";
import { authRateLimit } from "@app/server/config/rateLimiter";
-import { GenericResourceNameSchema } from "@app/server/lib/schemas";
+import { OrganizationInputSchema } from "@app/server/lib/schemas";
import { getServerCfg } from "@app/services/super-admin/super-admin-service";
import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types";
@@ -88,24 +88,25 @@ export const registerSignupRouter = async (server: FastifyZodProvider) => {
rateLimit: authRateLimit
},
schema: {
- body: z.object({
- email: z.string().trim(),
- firstName: z.string().trim(),
- lastName: z.string().trim().optional(),
- protectedKey: z.string().trim(),
- protectedKeyIV: z.string().trim(),
- protectedKeyTag: z.string().trim(),
- publicKey: z.string().trim(),
- encryptedPrivateKey: z.string().trim(),
- encryptedPrivateKeyIV: z.string().trim(),
- encryptedPrivateKeyTag: z.string().trim(),
- salt: z.string().trim(),
- verifier: z.string().trim(),
- organizationName: GenericResourceNameSchema,
- providerAuthToken: z.string().trim().optional().nullish(),
- attributionSource: z.string().trim().optional(),
- password: z.string()
- }),
+ body: z
+ .object({
+ email: z.string().trim(),
+ firstName: z.string().trim(),
+ lastName: z.string().trim().optional(),
+ protectedKey: z.string().trim(),
+ protectedKeyIV: z.string().trim(),
+ protectedKeyTag: z.string().trim(),
+ publicKey: z.string().trim(),
+ encryptedPrivateKey: z.string().trim(),
+ encryptedPrivateKeyIV: z.string().trim(),
+ encryptedPrivateKeyTag: z.string().trim(),
+ salt: z.string().trim(),
+ verifier: z.string().trim(),
+ providerAuthToken: z.string().trim().optional().nullish(),
+ attributionSource: z.string().trim().optional(),
+ password: z.string()
+ })
+ .and(OrganizationInputSchema),
response: {
200: z.object({
message: z.string(),
diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts
index d1b0a550d..6e45ba7e1 100644
--- a/backend/src/services/auth/auth-login-service.ts
+++ b/backend/src/services/auth/auth-login-service.ts
@@ -2,7 +2,7 @@ import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { Knex } from "knex";
-import { OrgMembershipRole, TUsers, UserDeviceSchema } from "@app/db/schemas";
+import { OrgMembershipRole, OrgMembershipStatus, TableName, TUsers, UserDeviceSchema } from "@app/db/schemas";
import { TAuditLogServiceFactory } from "@app/ee/services/audit-log/audit-log-service";
import { EventType } from "@app/ee/services/audit-log/audit-log-types";
import { isAuthMethodSaml } from "@app/ee/services/permission/permission-fns";
@@ -20,6 +20,8 @@ import { getServerCfg } from "@app/services/super-admin/super-admin-service";
import { TAuthTokenServiceFactory } from "../auth-token/auth-token-service";
import { TokenType } from "../auth-token/auth-token-types";
import { TOrgDALFactory } from "../org/org-dal";
+import { getDefaultOrgMembershipRole } from "../org/org-role-fns";
+import { TOrgMembershipDALFactory } from "../org-membership/org-membership-dal";
import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service";
import { LoginMethod } from "../super-admin/super-admin-types";
import { TTotpServiceFactory } from "../totp/totp-service";
@@ -48,6 +50,7 @@ type TAuthLoginServiceFactoryDep = {
smtpService: TSmtpService;
totpService: Pick
Organization Name @@ -279,7 +282,7 @@ export const UserInfoSSOStep = ({ isRequired className="h-12" maxLength={64} - disabled + isDisabled={forceDefaultOrg} /> {organizationNameError && (
diff --git a/frontend/src/pages/auth/SignUpSsoPage/route.tsx b/frontend/src/pages/auth/SignUpSsoPage/route.tsx index a255efaf6..986735ad0 100644 --- a/frontend/src/pages/auth/SignUpSsoPage/route.tsx +++ b/frontend/src/pages/auth/SignUpSsoPage/route.tsx @@ -5,7 +5,8 @@ import { z } from "zod"; import { SignupSsoPage } from "./SignUpSsoPage"; const SignupSSOPageQueryParamsSchema = z.object({ - token: z.string() + token: z.string(), + defaultOrgAllowed: z.boolean().optional() }); export const Route = createFileRoute("/_restrict-login-signup/signup/sso")({