@enonic/mock-xp
Version:
Mock Enonic XP API JavaScript Library
389 lines (388 loc) • 17.5 kB
JavaScript
"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;