Skip to content

Commit 9c143b4

Browse files
committed
auth/sso: make it possible to have one SSO for every account
1 parent 5477499 commit 9c143b4

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

src/packages/server/auth/sso/check-required-sso.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,18 @@ export function getEmailDomain(email: string): string {
3939
return email.trim().toLowerCase().split("@")[1];
4040
}
4141

42+
/**
43+
* This checks if the email's domain is either exactly the ssoDomain or a subdomain.
44+
* E.g. for "foo.edu", an email "[email protected]" is covered as well.
45+
*
46+
* Special case: an sso domain "*" covers all domains. This is kind of a complete "take over",
47+
* because all accounts on that instance of CoCalc have to go through that SSO mechanism.
48+
* Note: In that case, it makes no sense to have more than one SSO mechanism configured.
49+
*/
4250
export function emailBelongsToDomain(
4351
emailDomain: string,
44-
ssoDomain: string
52+
ssoDomain: string,
4553
): boolean {
54+
if (ssoDomain === "*") return true;
4655
return emailDomain === ssoDomain || emailDomain.endsWith(`.${ssoDomain}`);
4756
}

src/packages/server/auth/sso/passport-login.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,27 @@ import Cookies from "cookies";
2222
import * as _ from "lodash";
2323
import { isEmpty } from "lodash";
2424

25+
import { REMEMBER_ME_COOKIE_NAME } from "@cocalc/backend/auth/cookie-names";
2526
import base_path from "@cocalc/backend/base-path";
2627
import getLogger from "@cocalc/backend/logger";
2728
import { set_email_address_verified } from "@cocalc/database/postgres/account-queries";
2829
import type { PostgreSQL } from "@cocalc/database/postgres/types";
29-
import { legacyManageApiKey } from "@cocalc/server/api/manage";
30-
import generateHash from "@cocalc/server/auth/hash";
31-
import { REMEMBER_ME_COOKIE_NAME } from "@cocalc/backend/auth/cookie-names";
32-
import { createRememberMeCookie } from "@cocalc/server/auth/remember-me";
33-
import { sanitizeID } from "@cocalc/server/auth/sso/sanitize-id";
34-
import { sanitizeProfile } from "@cocalc/server/auth/sso/sanitize-profile";
3530
import {
3631
PassportLoginLocals,
3732
PassportLoginOpts,
3833
PassportStrategyDB,
3934
} from "@cocalc/database/settings/auth-sso-types";
35+
import getEmailAddress from "@cocalc/server/accounts/get-email-address";
36+
import isBanned from "@cocalc/server/accounts/is-banned";
37+
import { legacyManageApiKey } from "@cocalc/server/api/manage";
38+
import generateHash from "@cocalc/server/auth/hash";
39+
import { createRememberMeCookie } from "@cocalc/server/auth/remember-me";
40+
import { sanitizeID } from "@cocalc/server/auth/sso/sanitize-id";
41+
import { sanitizeProfile } from "@cocalc/server/auth/sso/sanitize-profile";
4042
import { callback2 as cb2 } from "@cocalc/util/async-utils";
4143
import { HELP_EMAIL } from "@cocalc/util/theme";
42-
import getEmailAddress from "../../accounts/get-email-address";
4344
import { emailBelongsToDomain, getEmailDomain } from "./check-required-sso";
4445
import { SSO_API_KEY_COOKIE_NAME } from "./consts";
45-
import isBanned from "@cocalc/server/accounts/is-banned";
4646

4747
const logger = getLogger("server:auth:sso:passport-login");
4848

@@ -248,7 +248,7 @@ export class PassportLogin {
248248
}
249249

250250
// similar to the above, for a specific email address
251-
private checkEmailExclusiveSSO(email_address): boolean {
251+
private checkEmailExclusiveSSO(email_address: string): boolean {
252252
const emailDomain = getEmailDomain(email_address.toLocaleLowerCase());
253253
for (const strategyName in this.opts.passports) {
254254
const strategy = this.opts.passports[strategyName];

0 commit comments

Comments
 (0)