@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
140 lines (139 loc) • 6.62 kB
JavaScript
"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: {},
});
}
});
}
}