UNPKG

couchbase

Version:

The official Couchbase Node.js Client Library.

674 lines (673 loc) 23.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserManager = exports.Group = exports.UserAndMetadata = exports.User = exports.RoleAndOrigin = exports.RoleAndDescription = exports.Role = exports.Origin = void 0; const bindingutilities_1 = require("./bindingutilities"); const observability_1 = require("./observability"); const observabilityhandler_1 = require("./observabilityhandler"); const observabilitytypes_1 = require("./observabilitytypes"); const utilities_1 = require("./utilities"); /** * Contains information about an origin for a role. * * @category Management */ class Origin { /** * @internal */ constructor(data) { this.type = data.type; this.name = data.name; } /** * @internal */ static _fromCppData(data) { return new Origin({ type: data.type, name: data.name, }); } } exports.Origin = Origin; /** * Contains information about a role. * * @category Management */ class Role { /** * @internal */ constructor(data) { this.name = data.name; this.bucket = data.bucket; this.scope = data.scope; this.collection = data.collection; } /** * @internal */ static _fromCppData(data) { return new Role({ name: data.name, bucket: data.bucket, scope: data.scope, collection: data.collection, }); } /** * @internal */ static _toCppData(data) { return { name: data.name, bucket: data.bucket, scope: data.scope, collection: data.collection, }; } } exports.Role = Role; /** * Contains information about a role along with its description. * * @category Management */ class RoleAndDescription extends Role { /** * @internal */ constructor(data) { super(data); this.displayName = data.displayName; this.description = data.description; } /** * @internal */ static _fromCppData(data) { const role = Role._fromCppData(data); return new RoleAndDescription({ ...role, displayName: data.name, description: data.description, }); } } exports.RoleAndDescription = RoleAndDescription; /** * Contains information about a role along with its origin. * * @category Management */ class RoleAndOrigin extends Role { /** * @internal */ constructor(data) { super(data); this.origins = data.origins; } /** * @internal */ static _fromCppData(data) { const origins = data.origins.map((origin) => Origin._fromCppData(origin)); return new RoleAndOrigin({ ...Role._fromCppData({ name: data.name, bucket: data.bucket, scope: data.scope, collection: data.collection, }), origins, }); } } exports.RoleAndOrigin = RoleAndOrigin; /** * Contains information about a user. * * @category Management */ class User { /** * @internal */ constructor(data) { this.username = data.username; this.displayName = data.displayName; this.groups = data.groups; this.roles = data.roles; } /** * @internal */ static _fromCppData(data) { return new User({ username: data.username, displayName: data.display_name, groups: data.groups, roles: data.roles.map((role) => Role._fromCppData(role)), password: undefined, }); } /** * @internal */ static _toCppData(data) { const roles = []; if (data.roles) { data.roles.forEach((role) => { if (typeof role === 'string') { roles.push({ name: role, }); } else { roles.push(Role._toCppData(role)); } }); } return { username: data.username, display_name: data.displayName, groups: data.groups ? data.groups : [], roles: roles, password: data.password, }; } } exports.User = User; /** * Contains information about a user along with some additional meta-data * about that user. * * @category Management */ class UserAndMetadata extends User { /** * Same as {@link effectiveRoles}, which already contains the roles * including their origins. * * @deprecated Use {@link effectiveRoles} instead. */ get effectiveRolesAndOrigins() { return this.effectiveRoles; } /** * @internal */ constructor(data) { super(data); this.domain = data.domain; this.effectiveRoles = data.effectiveRoles; this.passwordChanged = data.passwordChanged; this.externalGroups = data.externalGroups; } /** * @internal */ static _fromCppData(data) { const user = User._fromCppData({ username: data.username, display_name: data.display_name, groups: data.groups, roles: data.roles, password: data.password, }); const effectiveRoles = data.effective_roles.map((erole) => RoleAndOrigin._fromCppData(erole)); return new UserAndMetadata({ ...user, domain: (0, bindingutilities_1.authDomainFromCpp)(data.domain), effectiveRoles: effectiveRoles, effectiveRolesAndOrigins: effectiveRoles, passwordChanged: data.password_changed ? new Date(data.password_changed) : undefined, externalGroups: data.external_groups, }); } } exports.UserAndMetadata = UserAndMetadata; /** * Contains information about a group. * * @category Management */ class Group { /** * @internal */ constructor(data) { this.name = data.name; this.description = data.description; this.roles = data.roles; this.ldapGroupReference = data.ldapGroupReference; } /** * @internal */ static _fromCppData(data) { return new Group({ name: data.name, description: data.description || '', roles: data.roles.map((role) => Role._fromCppData(role)), ldapGroupReference: data.ldap_group_reference, }); } /** * @internal */ static _toCppData(data) { const roles = []; if (data.roles) { data.roles.forEach((role) => { if (typeof role === 'string') { roles.push({ name: role, }); } else { roles.push(Role._toCppData(role)); } }); } return { name: data.name, description: data.description, roles: roles, ldap_group_reference: data.ldapGroupReference, }; } } exports.Group = Group; /** * UserManager is an interface which enables the management of users, * groups and roles for the cluster. * * @category Management */ class UserManager { /** * @internal */ constructor(cluster) { this._cluster = cluster; } /** * @internal */ get observabilityInstruments() { return this._cluster.observabilityInstruments; } /** * Returns a specific user by their username. * * @param username The username of the user to fetch. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async getUser(username, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.UserGet, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const cppDomain = (0, bindingutilities_1.authDomainToCpp)(options.domainName || 'local'); const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, resp] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementUserGet.bind(this._cluster.conn), { username: username, domain: cppDomain, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); return UserAndMetadata._fromCppData(resp.user); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Returns a list of all existing users. * * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async getAllUsers(options, callback) { if (options instanceof Function) { callback = arguments[0]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.UserGetAll, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const cppDomain = (0, bindingutilities_1.authDomainToCpp)(options.domainName || 'local'); const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, resp] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementUserGetAll.bind(this._cluster.conn), { domain: cppDomain, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); return resp.users.map((user) => UserAndMetadata._fromCppData(user)); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Creates or updates an existing user. * * @param user The user to update. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async upsertUser(user, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.UserUpsert, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const cppDomain = (0, bindingutilities_1.authDomainToCpp)(options.domainName || 'local'); const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, _] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementUserUpsert.bind(this._cluster.conn), { user: User._toCppData(user), domain: cppDomain, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Change password for the currently authenticatd user. * * @param newPassword The new password to be applied. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async changePassword(newPassword, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.ChangePassword, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, _] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementChangePassword.bind(this._cluster.conn), { newPassword: newPassword, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Drops an existing user. * * @param username The username of the user to drop. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async dropUser(username, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.UserDrop, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const cppDomain = (0, bindingutilities_1.authDomainToCpp)(options.domainName || 'local'); const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, _] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementUserDrop.bind(this._cluster.conn), { username: username, domain: cppDomain, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Returns a list of roles available on the server. * * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async getRoles(options, callback) { if (options instanceof Function) { callback = arguments[0]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.RoleGetAll, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, resp] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementRoleGetAll.bind(this._cluster.conn), { timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); return resp.roles.map((role) => Role._fromCppData(role)); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Returns a group by it's name. * * @param groupName The name of the group to retrieve. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async getGroup(groupName, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.GroupGet, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, resp] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementGroupGet.bind(this._cluster.conn), { name: groupName, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); return Group._fromCppData(resp.group); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Returns a list of all existing groups. * * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async getAllGroups(options, callback) { if (options instanceof Function) { callback = arguments[0]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.GroupGetAll, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, resp] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementGroupGetAll.bind(this._cluster.conn), { timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); return resp.groups.map((group) => Group._fromCppData(group)); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Creates or updates an existing group. * * @param group The group to update. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async upsertGroup(group, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.GroupUpsert, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, _] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementGroupUpsert.bind(this._cluster.conn), { group: Group._toCppData(group), timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } /** * Drops an existing group. * * @param groupName The name of the group to drop. * @param options Optional parameters for this operation. * @param callback A node-style callback to be invoked after execution. */ async dropGroup(groupName, options, callback) { if (options instanceof Function) { callback = arguments[1]; options = undefined; } if (!options) { options = {}; } const obsReqHandler = new observabilityhandler_1.ObservableRequestHandler(observabilitytypes_1.UserMgmtOp.GroupDrop, this.observabilityInstruments, options === null || options === void 0 ? void 0 : options.parentSpan); obsReqHandler.setRequestHttpAttributes(); try { const timeout = options.timeout || this._cluster.managementTimeout; return utilities_1.PromiseHelper.wrapAsync(async () => { const [err, _] = await (0, observability_1.wrapObservableBindingCall)(this._cluster.conn.managementGroupDrop.bind(this._cluster.conn), { name: groupName, timeout: timeout, }, obsReqHandler); if (err) { obsReqHandler.endWithError(err); throw err; } obsReqHandler.end(); }, callback); } catch (err) { obsReqHandler.endWithError(err); throw err; } } } exports.UserManager = UserManager;