backendless-console-sdk
Version:
Backendless Console SDK for Node.js and browser
377 lines (367 loc) • 16.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _sortBy2 = _interopRequireDefault(require("lodash/sortBy"));
var _totalRows = _interopRequireDefault(require("./utils/total-rows"));
var _securityUrlBuilder = require("./security-url-builder");
var _security = require("./constants/security");
var _urls = _interopRequireDefault(require("./urls"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var emptyResponse = {
data: []
};
var sortEntitiesByName = function sortEntitiesByName(response) {
response.data = (0, _sortBy2["default"])(response.data, 'name');
return response;
};
var castArray = function castArray(items) {
return Array.isArray(items) ? items : [items];
};
var transformOwnerResponse = function transformOwnerResponse(response) {
return {
data: [{
permissions: response
}]
};
};
var transformRolesResponse = function transformRolesResponse(response) {
return {
data: response
};
};
var transformUsersResponse = function transformUsersResponse(response) {
return {
data: response
};
};
var transformColumnsResponse = function transformColumnsResponse(response) {
return {
data: response.map(function (item) {
return {
name: item.roleName,
roleId: item.roleId,
permissions: item.permissions
};
})
};
};
/**
* Transforms
* [{operationName, operationId, roles: [{roleId, roleName, access}, ...]}, ...]
* into
* { data: [ { roleId, name, permissions: [{operation, access}, ..] }] }
*
* @param {Array} response
* @returns {{data: Array}}
*/
var transformAclRolesResponse = function transformAclRolesResponse(response) {
var rolesMap = {};
response.forEach(function (operation) {
operation.roles.forEach(function (role) {
if (!rolesMap[role.roleId]) {
rolesMap[role.roleId] = {
roleId: role.roleId,
name: role.roleName,
permissions: []
};
}
rolesMap[role.roleId].permissions.push({
operation: operation.operationName,
access: role.access
});
});
});
return transformRolesResponse(Object.keys(rolesMap).map(function (roleId) {
return rolesMap[roleId];
}));
};
/**
* Here is the situation :
*
* for users the response is { data: [ { permissions: [{operation, access}, ..] }] }
* for roles the response is [ {permissions: [{operation, access}, ...]} ]
* for owner the response is [{ operation, access }, ...]
*
* for acl roles the response is absolute EVIL in absolutely CRAZY form :
* [{operationName, operationId, [roles: [{roleId, roleName, access}]]}]
*
*
* Since, we want to store, handle and render all permissions using the same set of classes/components
* we need to have the response to be the same for all policies :
*
* { data: [ { permissions: [{operation, access}, ..] }] }
*
* This method does exactly this
*
* @param {*} response
* @returns {{data: Array.<{permissions: Array}>}}
*/
var alignGetResponseShape = function alignGetResponseShape(response) {
if (response.data) {
return response; //a normal response, nothing to do here
}
var empty = !response.length;
var columnsResponse = !empty && !!response[0].permissions && !!response[0].permissions[0].columnId;
var rolesResponse = !empty && !!response[0].permissions;
var aclRolesResponse = !empty && !!response[0].operationId;
var usersResponse = !empty && !!response[0].userId;
return empty && emptyResponse || columnsResponse && transformColumnsResponse(response) || rolesResponse && transformRolesResponse(response) || aclRolesResponse && transformAclRolesResponse(response) || usersResponse && transformUsersResponse(response) || transformOwnerResponse(response);
};
var enrichPermissions = function enrichPermissions(result) {
var _result$data$;
var columnsResponse = !!((_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && (_result$data$ = _result$data$.permissions[0]) !== null && _result$data$ !== void 0 && _result$data$.columnId);
result.data.forEach(function (item) {
item.permissions = toPermissionsMap(item.permissions, columnsResponse);
});
return result;
};
var enrichEntities = function enrichEntities(result) {
result.data.forEach(function (item) {
item.id = item.userId || item.roleId || 'owner';
});
return result;
};
/**
* For owner the response is 'GRANT_INHERIT'
* for roles acl the response is complete GET response
* for all other types the response is array of objects with two fields {operation, access}
* possibly wrapped into 'permissions' field.. ︻デ═一
*
* We want to cast all these responses to the following structure
*
* {
* [policyItemId]: {
* [operation] : {access},
* ...
* },
* ...
* }
*/
var alignModifyResponseShape = function alignModifyResponseShape(appId, policy, policyItemId, service, serviceItemId, serviceItemName, objectId, operation) {
return function (response) {
if (!response) {
return {};
}
var isOwnerPolicy = policy === _security.PermissionPolicies.OWNER;
var isRolesPolicy = policy === _security.PermissionPolicies.ROLES;
var isColumnsPolicy = policy === _security.PermissionPolicies.COLUMNS;
var isObjectACL = objectId !== _security.ALL_OBJECTS;
var result = {};
if (isOwnerPolicy) {
result.owner = (0, _defineProperty2["default"])({}, operation, response);
} else if (isObjectACL && isRolesPolicy) {
response.forEach(function (operation) {
operation.roles.forEach(function (role) {
result[role.roleId] = result[role.roleId] || {};
result[role.roleId][operation.operationName] = role.access;
});
});
} else if (isColumnsPolicy) {
return response;
} else {
if (response.permissions) {
response = response.permissions;
}
var permissions = result[policyItemId] = {};
response.forEach(function (permission) {
return permissions[permission.operation] = permission.access;
});
}
return result;
};
};
/**
* Converts permissions object to permissions map where key is operation and value is access
* E.q.
* [{operation: 'Update', access: 'Grant}, {operation: 'Find', access: 'Deny'}]
* =>
* {Update: 'Grant', Find: 'Deny'}
* @param permissions
* @param columnsResponse
* @returns {{}}
*/
var toPermissionsMap = function toPermissionsMap(permissions, columnsResponse) {
var map = {};
if (permissions) {
permissions.forEach(function (permission) {
if (columnsResponse) {
map[permission.columnId] = permission.access;
} else {
map[permission.operation] = permission.access;
}
});
}
return map;
};
//TODO it will be removed when the server will be ready (CONSOLE-307)
var normalizeRolePropsNames = function normalizeRolePropsNames(role) {
return _objectSpread({
id: role.roleId,
name: role.rolename
}, role);
};
//TODO it will be removed when the server will be ready (CONSOLE-307)
var normalizeRolesPropsNames = function normalizeRolesPropsNames(roles) {
return roles.map(normalizeRolePropsNames);
};
//TODO it will be removed when the server will be ready to provide this info (CONSOLE-307)
var enrichRolesProps = function enrichRolesProps(roles) {
return roles.map(function (role) {
return _objectSpread({
system: _security.SYSTEM_ROLES.includes(role.name)
}, role);
});
};
var _default = function _default(req) {
var loadPermissions = function loadPermissions(appId, policy, service, serviceItemId, serviceItemName, objectId) {
var filterParams = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
var identityColumnName = arguments.length > 7 ? arguments[7] : undefined;
var url = (0, _securityUrlBuilder.buildGetUrl)(appId, policy, service, serviceItemId, serviceItemName, objectId, filterParams);
var addTotalRows = function addTotalRows(response) {
if (policy === _security.PermissionPolicies.USERS) {
filterParams.identity = filterParams.identity || filterParams.name;
var usersCountReq = req.get(_urls["default"].dataTable(appId, 'Users')).query({
where: filterParams.identity ? "".concat(identityColumnName, " like '%").concat(filterParams.identity, "%'") : undefined
});
return (0, _totalRows["default"])(req).getFor(usersCountReq).then(function (totalRows) {
return _objectSpread(_objectSpread({}, response), {}, {
totalRows: totalRows
});
});
}
return response;
};
return req.get(url).then(alignGetResponseShape) //transform all policies responses to the same shape with 'data' prop
.then(enrichPermissions) //transform permissions array into permissions map
.then(enrichEntities) //transform users and roles entities to the shape with 'id' property
.then(addTotalRows) //resolve totalRows property
.then(sortEntitiesByName);
};
var setPermission = function setPermission(appId, policy, policyItemId, service, serviceItemId, serviceItemName, objectId, permission) {
var isOwnerPolicy = policy === _security.PermissionPolicies.OWNER;
var isColumnPolicy = policy === _security.PermissionPolicies.COLUMNS;
var isObjectACL = objectId !== _security.ALL_OBJECTS;
//for owner and object acl the body should contain just {access, permission} object
//for all other cases it must be wrapped into an array and object :
//{ permissions: [{access,permission}, ...] }
var body = isOwnerPolicy || isColumnPolicy || isObjectACL ? permission : {
permissions: castArray(permission)
};
var url = (0, _securityUrlBuilder.buildPutUrl)(appId, policy, service, serviceItemId, serviceItemName, objectId, policyItemId, permission);
return req.put(url, body).then(alignModifyResponseShape(appId, policy, policyItemId, service, serviceItemId, serviceItemName, objectId, permission));
};
var dropPermissions = function dropPermissions() {
var url = _securityUrlBuilder.buildDeleteUrl.apply(void 0, arguments);
return req["delete"](url).then(alignModifyResponseShape.apply(void 0, arguments));
};
var searchDataACLUsers = function searchDataACLUsers(appId, tableName, objectId, query) {
return req.get("".concat(_urls["default"].security(appId), "/data/").concat(tableName, "/objectAcl/").concat(objectId, "/users/search/").concat(query)).then(function (result) {
return {
data: result
};
}).then(enrichPermissions).then(enrichEntities).then(sortEntitiesByName);
};
var loadRoles = function loadRoles(appId) {
return req.get(_urls["default"].securityRoles(appId)).then(normalizeRolesPropsNames) //TODO it will be removed when the server will be ready (CONSOLE-307)
.then(enrichRolesProps);
}; //TODO it will be removed when the server will be ready (CONSOLE-307)
var createRole = function createRole(appId, name) {
return req.put("".concat(_urls["default"].securityRoles(appId), "/").concat(encodeURIComponent(name))).then(normalizeRolePropsNames);
};
var deleteRole = function deleteRole(appId, id) {
return req["delete"]("".concat(_urls["default"].securityRoles(appId), "/").concat(id));
};
var loadRolePermissions = function loadRolePermissions(appId, id) {
return req.get("".concat(_urls["default"].securityRoles(appId), "/permissions/").concat(id));
};
var setRolePermission = function setRolePermission(appId, id, permission) {
return req.put("".concat(_urls["default"].securityRoles(appId), "/permissions/").concat(id), permission);
};
var loadColumnPermissions = function loadColumnPermissions(appId, tableId) {
return req.get("".concat(_urls["default"].security(appId), "/data/").concat(tableId, "/columns/permissions"));
};
var loadAuditLogs = function loadAuditLogs(appId) {
return req.get("".concat(_urls["default"].security(appId), "/audit-logs"));
};
var deleteAuditLogs = function deleteAuditLogs(appId) {
return req["delete"]("".concat(_urls["default"].security(appId), "/audit-logs"));
};
var downloadAuditLogs = function downloadAuditLogs(appId, fromDate, toDate) {
return req.get("".concat(_urls["default"].security(appId), "/audit-logs/download")).query({
fromDate: fromDate,
toDate: toDate
});
};
var activatePanicMode = function activatePanicMode(appId, settings) {
return req.put("".concat(_urls["default"].appConsole(appId), "/panic/enable"), settings);
};
var deactivatePanicMode = function deactivatePanicMode(appId, settings) {
return req.put("".concat(_urls["default"].appConsole(appId), "/panic/disable"), settings);
};
var loadUsers = function loadUsers(appId, _ref) {
var identityOrUserId = _ref.identityOrUserId,
offset = _ref.offset,
pageSize = _ref.pageSize,
sortBy = _ref.sortBy;
return req.get("".concat(_urls["default"].appConsole(appId), "/user/sessions/users")).query({
identityOrUserId: identityOrUserId,
offset: offset,
pageSize: pageSize,
sortBy: sortBy
});
};
var loadUsersWithSessions = function loadUsersWithSessions(appId, _ref2) {
var cursor = _ref2.cursor,
pageSize = _ref2.pageSize;
return req.get("".concat(_urls["default"].appConsole(appId), "/user/sessions/users-with-sessions")).query({
pageSize: pageSize,
cursor: cursor
});
};
var loadUserSessions = function loadUserSessions(appId, userId, _ref3) {
var cursor = _ref3.cursor,
pageSize = _ref3.pageSize;
return req.get("".concat(_urls["default"].appConsole(appId), "/user/sessions/").concat(userId)).query({
pageSize: pageSize,
cursor: cursor
});
};
var logoutUserSessions = function logoutUserSessions(appId, userId) {
return req.put("".concat(_urls["default"].appConsole(appId), "/user/sessions/logout"), userId);
};
var activateHIPAACompliance = function activateHIPAACompliance(appId) {
return req.put("".concat(_urls["default"].appConsole(appId), "/compliance/hipaa/enable"));
};
var deactivateHIPAACompliance = function deactivateHIPAACompliance(appId) {
return req.put("".concat(_urls["default"].appConsole(appId), "/compliance/hipaa/disable"));
};
return {
loadRoles: loadRoles,
createRole: createRole,
deleteRole: deleteRole,
loadRolePermissions: loadRolePermissions,
loadPermissions: loadPermissions,
setRolePermission: setRolePermission,
setPermission: setPermission,
dropPermissions: dropPermissions,
searchDataACLUsers: searchDataACLUsers,
loadColumnPermissions: loadColumnPermissions,
loadAuditLogs: loadAuditLogs,
deleteAuditLogs: deleteAuditLogs,
downloadAuditLogs: downloadAuditLogs,
activatePanicMode: activatePanicMode,
deactivatePanicMode: deactivatePanicMode,
loadUsers: loadUsers,
loadUsersWithSessions: loadUsersWithSessions,
loadUserSessions: loadUserSessions,
logoutUserSessions: logoutUserSessions,
activateHIPAACompliance: activateHIPAACompliance,
deactivateHIPAACompliance: deactivateHIPAACompliance
};
};
exports["default"] = _default;