UNPKG

@openinc/parse-server-opendash

Version:
140 lines (139 loc) 6.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.init = init; const __1 = require(".."); const config_1 = require("../features/config"); const settings_1 = require("../features/user/settings"); const transformLogin_1 = require("../helper/transformLogin"); const types_1 = require("../types"); async function init() { (0, __1.beforeSaveHook)(Parse.User, async (request) => { const user = request.object; const tenant = user.get("tenant"); const tenantId = tenant?.id; user.set("email", (0, transformLogin_1.transformLogin)(user.get("email"))); user.set("username", (0, transformLogin_1.transformLogin)(user.get("username"))); if (tenant) { await tenant.fetch({ useMasterKey: true }); } user.set("tenantBanned", !!user.get("tenantBanned")); user.set("tenantVerified", !!tenant && !!user.get("tenantVerified")); if (!!tenant && !!user.get("emailVerified") && !user.get("tenantVerified")) { const email = user.get("email"); const domains = await new Parse.Query(types_1.TenantTrustedDomain) .equalTo("tenant", tenant) .find({ useMasterKey: true }); for (const domain of domains) { if (email?.endsWith("@" + domain.get("host"))) { user.set("tenantVerified", true); } } } user.set("tenantGlobal", !!tenant && !!user.get("tenantGlobal")); if (tenant && request.original?.get("tenant")?.id !== tenant?.id) { user.set("tenantGlobal", !!tenant.get("interactWithOtherTenants")); } user.set("tenantAdmin", !!user.get("tenantVerified") && !!user.get("tenantAdmin")); user.set("tenantChanged", !!user.get("tenantChanged")); if (user.get("tenantChanged")) { user.set("tenantChanged", false); if (!request.context) { request.context = {}; } // @ts-ignore request.context.tenantChanged = true; } user.setACL(new Parse.ACL({ ...(tenantId && { [`role:od-tenant-user-${tenantId}`]: { read: true }, [`role:od-tenant-admin-${tenantId}`]: { read: true, write: true }, }), ...(user.get("tenantGlobal") && { "role:od-tenant-global-visible": { read: true }, }), ...(user.id && { [user.id]: { read: true }, }), "role:od-admin": { read: true, write: true }, })); }); (0, __1.afterSaveHook)(Parse.User, async (request) => { const object = request.object; const original = request.original; const tenant = object.get("tenant"); if (tenant) { await tenant.fetch({ useMasterKey: true }); } const tenantId = object.get("tenant")?.id; const prevTenantId = original?.get("tenant")?.id; const tenantBanned = !!object.get("tenantBanned"); const isTenant = !!tenantId && !tenantBanned; const wasTenant = !!prevTenantId; const isAdmin = isTenant && !!object.get("tenantAdmin"); const wasAdmin = !!original?.get("tenantAdmin"); const isVerified = isTenant && !!object.get("tenantVerified"); const wasVerified = wasTenant && !!object.get("tenantVerified"); const isGlobal = isVerified && !!object.get("tenantGlobal"); const changedTenant = isTenant !== wasTenant || tenantId !== prevTenantId; const changedAdmin = isAdmin !== wasAdmin; const changedVerified = isVerified !== wasVerified; const changedContext = !!request.context?.tenantChanged; if (changedTenant || changedAdmin || changedVerified || changedContext) { await (0, __1.ensureUserRole)(object, `od-user`, isTenant); await (0, __1.ensureUserRole)(object, `od-tenant-user`, isTenant); await (0, __1.ensureUserRole)(object, `od-tenant-verified`, isVerified); await (0, __1.ensureUserRole)(object, `od-tenant-admin`, isAdmin); await (0, __1.ensureUserRole)(object, `od-tenant-global-visible`, isGlobal); if (tenantId) { await (0, __1.ensureUserRole)(object, `od-tenant-user-${tenantId}`, true); await (0, __1.ensureUserRole)(object, `od-tenant-admin-${tenantId}`, isAdmin); } if (wasTenant && tenantId !== prevTenantId) { await (0, __1.ensureUserRole)(object, `od-tenant-user-${prevTenantId}`, false); await (0, __1.ensureUserRole)(object, `od-tenant-admin-${prevTenantId}`, false); } } if (!original) { await (0, settings_1.ensureSettings)(object); } }); const verificationEmailCache = {}; if (config_1.ConfigInstance.getInstance().getBoolean("AUTH_VERIFY_TENANT")) { (0, __1.afterSaveHook)(Parse.User, async (request) => { const object = request.object; const original = request.original; const tenant = object.get("tenant"); if (tenant && !original && object.get("tenantVerified") === false) { const admins = await new Parse.Query(Parse.User) .equalTo("tenant", tenant) .equalTo("tenantAdmin", true) .findAll({ useMasterKey: true }); for (const admin of admins) { await (0, __1.sendTemplateEmail)({ template: "openinc-auth-tenant-verification-request", subject: "Ein neuer Nutzer muss verifiziert werden", to: admin.get("email"), fallback: "Ein neuer Nutzer muss verifiziert werden", data: {}, }); } } if (!verificationEmailCache[object.id] && tenant && original?.get("tenantVerified") === false && object.get("tenantVerified") === true) { const email = object.get("email"); verificationEmailCache[object.id] = true; await (0, __1.sendTemplateEmail)({ template: "openinc-auth-tenant-verification", subject: "Dein Account wurde verifiziert", to: email, fallback: "Account wurde verifiziert", data: {}, }); } }); } }