UNPKG

@enonic/mock-xp

Version:

Mock Enonic XP API JavaScript Library

389 lines (388 loc) 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Auth = void 0; var tslib_1 = require("tslib"); var fnv1a_1 = tslib_1.__importDefault(require("fnv1a")); var getIn_1 = require("@enonic/js-utils/object/getIn"); var setIn_1 = require("@enonic/js-utils/object/setIn"); var Group_1 = require("./auth/Group"); var Role_1 = require("./auth/Role"); var User_1 = require("./auth/User"); var UserWithProfile_1 = require("./auth/UserWithProfile"); var isGroupKey_1 = require("./auth/isGroupKey"); var isRoleKey_1 = require("./auth/isRoleKey"); var isUserKey_1 = require("./auth/isUserKey"); var Auth = (function () { function Auth(_a) { var server = _a.server; this.log = server.log; this.server = server; this.systemRepoConnection = server.systemRepoConnection; } Auth.base36Hash = function (string) { return (0, fnv1a_1.default)(string).toString(36); }; Auth.prototype._getUserNodeByName = function (_a) { var name = _a.name, _b = _a.idProvider, idProvider = _b === void 0 ? 'system' : _b; return this.systemRepoConnection._getSingle("/identity/".concat(idProvider, "/users/").concat(name)); }; Auth.prototype.addMembers = function (_a) { var members = _a.members, principalKey = _a.principalKey; if ((0, isGroupKey_1.isGroupKey)(principalKey)) { var _b = tslib_1.__read(principalKey.split(':'), 3), _type = _b[0], idProvider = _b[1], name_1 = _b[2]; var groupNode = this.systemRepoConnection.modify({ key: "/identity/".concat(idProvider, "/groups/").concat(name_1), editor: function (groupNode) { var currentMembersArray = groupNode['member'] ? Array.isArray(groupNode['member']) ? groupNode['member'] : [groupNode['member']] : []; groupNode['member'] = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(currentMembersArray), false), tslib_1.__read(members), false); return groupNode; } }); return Group_1.Group.fromNode(groupNode); } if ((0, isRoleKey_1.isRoleKey)(principalKey)) { var _c = tslib_1.__read(principalKey.split(':'), 2), _type = _c[0], name_2 = _c[1]; var RoleNode = this.systemRepoConnection.modify({ key: "/identity/roles/".concat(name_2), editor: function (roleNode) { var currentMembersArray = roleNode['member'] ? Array.isArray(roleNode['member']) ? roleNode['member'] : [roleNode['member']] : []; roleNode['member'] = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(currentMembersArray), false), tslib_1.__read(members), false); return roleNode; } }); return Role_1.Role.fromNode(RoleNode); } if ((0, isUserKey_1.isUserKey)(principalKey)) { throw new Error("addMembers(): Cannot add members to users! UserKey: ".concat(principalKey)); } throw new Error("addMembers(): Principal key ".concat(principalKey, " is neither GroupKey nor RoleKey!")); }; Auth.prototype.createGroup = function (_a) { var description = _a.description, displayName = _a.displayName, idProvider = _a.idProvider, _b = _a.members, members = _b === void 0 ? [] : _b, name = _a.name; var groupNode = this.systemRepoConnection.create({ _name: name, _parentPath: "/identity/".concat(idProvider, "/groups"), description: description, displayName: displayName, member: members, principalType: 'GROUP', userStoreKey: idProvider, }); return Group_1.Group.fromNode(groupNode); }; Auth.prototype.createRole = function (_a) { var name = _a.name, displayName = _a.displayName, description = _a.description, _b = _a.members, members = _b === void 0 ? [] : _b; var roleNode = this.systemRepoConnection.create({ _name: name, _parentPath: '/identity/roles', description: description, displayName: displayName, member: members, principalType: 'ROLE', }); return Role_1.Role.fromNode(roleNode); }; Auth.prototype.createUser = function (_a) { var name = _a.name, displayName = _a.displayName, _b = _a.idProvider, idProvider = _b === void 0 ? 'system' : _b, _c = _a.email, email = _c === void 0 ? '' : _c, _d = _a.password, password = _d === void 0 ? '' : _d, _e = _a.profile, profile = _e === void 0 ? {} : _e; var createParams = { _name: name, _parentPath: "/identity/".concat(idProvider, "/users"), authenticationHash: Auth.base36Hash(password), displayName: displayName, email: email, login: name, principalType: 'USER', profile: profile, userStoreKey: idProvider, }; var userNode = this.systemRepoConnection.create(createParams); return new User_1.User({ displayName: displayName, key: "user:".concat(idProvider, ":").concat(name), idProvider: idProvider, email: email, login: name, modifiedTime: userNode._ts }); }; Auth.prototype.getGroupByName = function (_a) { var name = _a.name, _b = _a.idProvider, idProvider = _b === void 0 ? 'system' : _b; var groupNode = this.systemRepoConnection._getSingle("/identity/".concat(idProvider, "/groups/").concat(name)); if (!groupNode) { throw new Error("Group with name:".concat(name, " not found!")); } return Group_1.Group.fromNode(groupNode); }; ; Auth.prototype.getMembers = function (_a) { var _this = this; var principalKey = _a.principalKey; if ((0, isGroupKey_1.isGroupKey)(principalKey)) { var _b = tslib_1.__read(principalKey.split(':'), 3), _type = _b[0], idProvider = _b[1], name_3 = _b[2]; var group = this.getGroupByName({ name: name_3, idProvider: idProvider }); var memberKeys = group.getMemberKeys(); return memberKeys.map(function (memberKey) { return _this.getPrincipal(memberKey); }).filter(function (x) { return x; }); } if ((0, isRoleKey_1.isRoleKey)(principalKey)) { var _c = tslib_1.__read(principalKey.split(':'), 2), _type = _c[0], name_4 = _c[1]; var role = this.getRoleByName({ name: name_4 }); var memberKeys = role.getMemberKeys(); return memberKeys.map(function (memberKey) { return _this.getPrincipal(memberKey); }).filter(function (x) { return x; }); } if ((0, isUserKey_1.isUserKey)(principalKey)) { throw new Error("getMembers(): Users doesn't have members! UserKey: ".concat(principalKey)); } throw new Error("getMembers(): Principal key ".concat(principalKey, " is neither GroupKey nor RoleKey!")); }; Auth.prototype.getMemberships = function (_a) { var _this = this; var principalKey = _a.principalKey; if ((0, isGroupKey_1.isGroupKey)(principalKey) || (0, isUserKey_1.isUserKey)(principalKey)) { var allGroupsAndRolesRes = this.systemRepoConnection.query({ count: -1, query: { boolean: { must: [{ in: { field: 'principalType', values: ['GROUP', 'ROLE'] }, }, { in: { field: 'member', values: [principalKey] } }] } } }); return allGroupsAndRolesRes.hits.map(function (_a) { var id = _a.id; var groupOrRoleNode = _this.systemRepoConnection._getSingle(id); if (groupOrRoleNode['principalType'] === 'GROUP') { return Group_1.Group.fromNode(groupOrRoleNode); } if (groupOrRoleNode['principalType'] === 'ROLE') { return Role_1.Role.fromNode(groupOrRoleNode); } }); } if ((0, isRoleKey_1.isRoleKey)(principalKey)) { throw new Error("getMemberships(): Roles aren't members! RoleKey: ".concat(principalKey)); } throw new Error("getMemberships(): Principal key ".concat(principalKey, " is neither GroupKey nor UserKey!")); }; Auth.prototype.getPrincipal = function (principalKey) { var principalKeyParts = principalKey.split(':'); var _a = tslib_1.__read(principalKeyParts, 3), type = _a[0], two = _a[1], three = _a[2]; if (type === 'user') { return this.getUserByName({ name: three, idProvider: two }); } if (type === 'group') { return this.getGroupByName({ name: three, idProvider: two }); } if (type === 'role') { return this.getRoleByName({ name: two }); } throw new Error("Principal type ".concat(type, " unsupported!")); }; Auth.prototype.getProfile = function (_a) { var key = _a.key, scope = _a.scope; var _b = tslib_1.__read(key.split(':'), 3), _type = _b[0], idProvider = _b[1], name = _b[2]; var userNode = this._getUserNodeByName({ name: name, idProvider: idProvider, }); if (!userNode) { throw new Error("User not found: ".concat(key, "!")); } if (userNode.profile) { if (scope) { var profile = (0, getIn_1.getIn)(userNode.profile, scope); if (profile) { return profile; } return null; } return userNode.profile; } return null; }; Auth.prototype.getRoleByName = function (_a) { var name = _a.name; var roleNode = this.systemRepoConnection._getSingle("/identity/roles/".concat(name)); if (!roleNode) { throw new Error("Role with name:".concat(name, " not found!")); } return Role_1.Role.fromNode(roleNode); }; Auth.prototype.getUser = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.includeProfile, includeProfile = _c === void 0 ? false : _c; if (this.server.userKey) { return this.getUserByUserKey({ includeProfile: includeProfile, userKey: this.server.userKey, }); } return null; }; Auth.prototype.getUserByName = function (_a) { var name = _a.name, _b = _a.idProvider, idProvider = _b === void 0 ? 'system' : _b, _c = _a.includeProfile, includeProfile = _c === void 0 ? false : _c; var userNode = this._getUserNodeByName({ idProvider: idProvider, name: name }); if (!userNode) { throw new Error("User not found: user:".concat(idProvider, ":").concat(name, "!")); } var params = { displayName: userNode.displayName, key: "user:".concat(idProvider, ":").concat(name), idProvider: idProvider, email: userNode.email || '', login: name, modifiedTime: userNode._ts }; if (includeProfile) { params.profile = userNode.profile; return new UserWithProfile_1.UserWithProfile(params); } return new User_1.User(params); }; Auth.prototype.getUserByUserKey = function (_a) { var userKey = _a.userKey, _b = _a.includeProfile, includeProfile = _b === void 0 ? false : _b; var _c = tslib_1.__read(userKey.split(':'), 3), _type = _c[0], idProvider = _c[1], name = _c[2]; return this.getUserByName({ name: name, idProvider: idProvider, includeProfile: includeProfile, }); }; Auth.prototype.login = function (_a) { var user = _a.user, _b = _a.password, password = _b === void 0 ? '' : _b, _c = _a.idProvider, idProvider = _c === void 0 ? 'system' : _c; var userNode = this._getUserNodeByName({ idProvider: idProvider, name: user }); if (!userNode) { this.server.log.debug("User not found: user:".concat(idProvider, ":").concat(user, "!")); return { authenticated: false, message: 'Access Denied', }; } var authenticated = Auth.base36Hash(password) === userNode.authenticationHash; if (authenticated) { var userKey = "user:".concat(idProvider, ":").concat(user); this.server.userKey = userKey; return { authenticated: authenticated, message: '', user: new User_1.User({ displayName: userNode.displayName, key: userKey, idProvider: idProvider, email: userNode.email || '', login: user, modifiedTime: userNode._ts }) }; } this.server.log.debug("Wrong password for user:".concat(idProvider, ":").concat(user, "!")); return { authenticated: authenticated, message: 'Access Denied', }; }; Auth.prototype.logout = function () { this.server.userKey = undefined; }; Auth.prototype.modifyProfile = function (_a) { var key = _a.key, scope = _a.scope, editor = _a.editor; var _b = tslib_1.__read(key.split(':'), 3), _type = _b[0], idProvider = _b[1], name = _b[2]; var userNode = this._getUserNodeByName({ idProvider: idProvider, name: name }); if (!userNode) { throw new Error("User not found: ".concat(key, "!")); } if (!userNode.profile) { userNode.profile = {}; } var profile; if (scope) { (0, setIn_1.setIn)(userNode.profile, scope, {}); var nested = (0, getIn_1.getIn)(userNode.profile, scope); profile = editor(nested); } else { profile = editor(userNode.profile); } this.systemRepoConnection.modify({ key: "/identity/".concat(idProvider, "/users/").concat(name), editor: function (_node) { return userNode; } }); return profile; }; Auth.prototype.removeMembers = function (_a) { var members = _a.members, principalKey = _a.principalKey; if ((0, isGroupKey_1.isGroupKey)(principalKey)) { var _b = tslib_1.__read(principalKey.split(':'), 3), _type = _b[0], idProvider = _b[1], name_5 = _b[2]; var groupNode = this.systemRepoConnection.modify({ key: "/identity/".concat(idProvider, "/groups/").concat(name_5), editor: function (groupNode) { var currentMembersArray = groupNode['member'] ? Array.isArray(groupNode['member']) ? groupNode['member'] : [groupNode['member']] : []; groupNode['member'] = currentMembersArray.filter(function (member) { return !members.includes(member); }); return groupNode; } }); return Group_1.Group.fromNode(groupNode); } if ((0, isRoleKey_1.isRoleKey)(principalKey)) { var _c = tslib_1.__read(principalKey.split(':'), 2), _type = _c[0], name_6 = _c[1]; var roleNode = this.systemRepoConnection.modify({ key: "/identity/roles/".concat(name_6), editor: function (roleNode) { var currentMembersArray = roleNode['member'] ? Array.isArray(roleNode['member']) ? roleNode['member'] : [roleNode['member']] : []; roleNode['member'] = currentMembersArray.filter(function (member) { return !members.includes(member); }); return roleNode; } }); return Role_1.Role.fromNode(roleNode); } if ((0, isUserKey_1.isUserKey)(principalKey)) { throw new Error("removeMembers(): Users doesn't have members! UserKey: ".concat(principalKey)); } throw new Error("removeMembers(): Principal key ".concat(principalKey, " is neither GroupKey nor RoleKey!")); }; return Auth; }()); exports.Auth = Auth;