mirror of
https://github.com/docmost/docmost.git
synced 2025-11-18 15:31:09 +10:00
feat(EE): LDAP integration (#1515)
* LDAP - WIP * WIP * add hasGeneratedPassword * fix jotai atom * - don't require password confirmation for MFA is user has auto generated password (LDAP) - cleanups * fix * reorder * update migration * update default * fix type error
This commit is contained in:
@ -106,6 +106,7 @@ export class AuthService {
|
||||
await this.userRepo.updateUser(
|
||||
{
|
||||
password: newPasswordHash,
|
||||
hasGeneratedPassword: false,
|
||||
},
|
||||
userId,
|
||||
workspaceId,
|
||||
@ -186,6 +187,7 @@ export class AuthService {
|
||||
await this.userRepo.updateUser(
|
||||
{
|
||||
password: newPasswordHash,
|
||||
hasGeneratedPassword: false,
|
||||
},
|
||||
user.id,
|
||||
workspace.id,
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
import { type Kysely, sql } from 'kysely';
|
||||
|
||||
export async function up(db: Kysely<any>): Promise<void> {
|
||||
// switch type to text column since you can't add value to PG types in a transaction
|
||||
await db.schema
|
||||
.alterTable('auth_providers')
|
||||
.alterColumn('type', (col) => col.setDataType('text'))
|
||||
.execute();
|
||||
|
||||
await db.schema.dropType('auth_provider_type').ifExists().execute();
|
||||
|
||||
await db.schema
|
||||
.alterTable('users')
|
||||
.addColumn('has_generated_password', 'boolean', (col) =>
|
||||
col.notNull().defaultTo(false).ifNotExists(),
|
||||
)
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.alterTable('auth_providers')
|
||||
.addColumn('ldap_url', 'varchar', (col) => col)
|
||||
.addColumn('ldap_bind_dn', 'varchar', (col) => col)
|
||||
.addColumn('ldap_bind_password', 'varchar', (col) => col)
|
||||
.addColumn('ldap_base_dn', 'varchar', (col) => col)
|
||||
.addColumn('ldap_user_search_filter', 'varchar', (col) => col)
|
||||
.addColumn('ldap_user_attributes', 'jsonb', (col) =>
|
||||
col.defaultTo(sql`'{}'::jsonb`),
|
||||
)
|
||||
.addColumn('ldap_tls_enabled', 'boolean', (col) => col.defaultTo(false))
|
||||
.addColumn('ldap_tls_ca_cert', 'text', (col) => col)
|
||||
.addColumn('ldap_config', 'jsonb', (col) => col.defaultTo(sql`'{}'::jsonb`))
|
||||
.addColumn('settings', 'jsonb', (col) => col.defaultTo(sql`'{}'::jsonb`))
|
||||
.execute();
|
||||
}
|
||||
|
||||
export async function down(db: Kysely<any>): Promise<void> {
|
||||
await db.schema
|
||||
.alterTable('users')
|
||||
.dropColumn('has_generated_password')
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.alterTable('auth_providers')
|
||||
.dropColumn('ldap_url')
|
||||
.dropColumn('ldap_bind_dn')
|
||||
.dropColumn('ldap_bind_password')
|
||||
.dropColumn('ldap_base_dn')
|
||||
.dropColumn('ldap_user_search_filter')
|
||||
.dropColumn('ldap_user_attributes')
|
||||
.dropColumn('ldap_tls_enabled')
|
||||
.dropColumn('ldap_tls_ca_cert')
|
||||
.dropColumn('ldap_config')
|
||||
.dropColumn('settings')
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.createType('auth_provider_type')
|
||||
.asEnum(['saml', 'oidc', 'google'])
|
||||
.execute();
|
||||
|
||||
await db.deleteFrom('auth_providers').where('type', '=', 'ldap').execute();
|
||||
|
||||
await sql`
|
||||
ALTER TABLE auth_providers
|
||||
ALTER COLUMN type TYPE auth_provider_type
|
||||
USING type::auth_provider_type
|
||||
`.execute(db);
|
||||
}
|
||||
@ -34,6 +34,7 @@ export class UserRepo {
|
||||
'createdAt',
|
||||
'updatedAt',
|
||||
'deletedAt',
|
||||
'hasGeneratedPassword',
|
||||
];
|
||||
|
||||
async findById(
|
||||
|
||||
15
apps/server/src/database/types/db.d.ts
vendored
15
apps/server/src/database/types/db.d.ts
vendored
@ -5,8 +5,6 @@
|
||||
|
||||
import type { ColumnType } from "kysely";
|
||||
|
||||
export type AuthProviderType = "google" | "oidc" | "saml";
|
||||
|
||||
export type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
||||
? ColumnType<S, I | undefined, U>
|
||||
: ColumnType<T, T | undefined, T>;
|
||||
@ -63,13 +61,23 @@ export interface AuthProviders {
|
||||
id: Generated<string>;
|
||||
isEnabled: Generated<boolean>;
|
||||
groupSync: Generated<boolean>;
|
||||
ldapBaseDn: string | null;
|
||||
ldapBindDn: string | null;
|
||||
ldapBindPassword: string | null;
|
||||
ldapTlsCaCert: string | null;
|
||||
ldapTlsEnabled: Generated<boolean | null>;
|
||||
ldapUrl: string | null;
|
||||
ldapUserAttributes: Json | null;
|
||||
ldapUserSearchFilter: string | null;
|
||||
ldapConfig: Json | null;
|
||||
settings: Json | null;
|
||||
name: string;
|
||||
oidcClientId: string | null;
|
||||
oidcClientSecret: string | null;
|
||||
oidcIssuer: string | null;
|
||||
samlCertificate: string | null;
|
||||
samlUrl: string | null;
|
||||
type: AuthProviderType;
|
||||
type: string;
|
||||
updatedAt: Generated<Timestamp>;
|
||||
workspaceId: string;
|
||||
}
|
||||
@ -276,6 +284,7 @@ export interface Users {
|
||||
lastActiveAt: Timestamp | null;
|
||||
lastLoginAt: Timestamp | null;
|
||||
locale: string | null;
|
||||
hasGeneratedPassword: Generated<boolean | null>;
|
||||
name: string | null;
|
||||
password: string | null;
|
||||
role: string | null;
|
||||
|
||||
Submodule apps/server/src/ee updated: 10519eeaa2...505081bb85
Reference in New Issue
Block a user