Commit 9835cecb authored by Patricio Bruna's avatar Patricio Bruna

Every function now works with BatchRequest

parent d7e9b763
...@@ -163,6 +163,19 @@ zimbraApi.getAllAccounts(callback, query_object); ...@@ -163,6 +163,19 @@ zimbraApi.getAllAccounts(callback, query_object);
``` ```
## Batch Request Functions ## Batch Request Functions
With `BatchRequest` you can ask Zimbra to run multiple requests in just one call, and get
the result in just one answer.
Every function here works for `BatchRequest` if you do not pass a `callback`. For example:
```javascript
var allAccounts = zimbraApi.getAllAccounts();
var allDomains = zimbraApi.getAllDomains();
zimbraApi.makeBatchRequest([allAccounts, allDomains], callback);
// Object {SearchDirectoryResponse: Array[2], _jsns: "urn:zimbra"}
// SearchDirectoryResponse[0].account, SearchDirectoryResponse[1].domain
```
### Count Accounts for several Domains ### Count Accounts for several Domains
Pass an array of domains ids or names and you get back an array of `countAccounts` responses Pass an array of domains ids or names and you get back an array of `countAccounts` responses
......
...@@ -98,21 +98,21 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -98,21 +98,21 @@ return /******/ (function(modules) { // webpackBootstrap
function Error(err) { function Error(err) {
(0, _classCallCheck3.default)(this, Error); (0, _classCallCheck3.default)(this, Error);
this.code = err.Fault.Code.Value; this.code = err.Fault ? err.Fault.Code.Value : err.status;
this.extra = this.getErrorInfo(err.Fault); this.extra = this.getErrorInfo(err);
} }
(0, _createClass3.default)(Error, [{ (0, _createClass3.default)(Error, [{
key: 'getErrorInfo', key: 'getErrorInfo',
value: function getErrorInfo(fault) { value: function getErrorInfo(err) {
if (fault && fault.Detail) { if (err && err.Fault) {
return { return {
'code': fault.Detail.Error.Code, 'code': err.Fault.Detail.Error.Code,
'reason': fault.Reason.Text, 'reason': err.Fault.Reason.Text,
'trace': fault.Detail.Error.Trace 'trace': err.Fault.Detail.Error.Trace
}; };
} else { } else {
return {}; return { 'code': err.status, 'reason': err.statusText };
} }
} }
}]); }]);
...@@ -241,17 +241,17 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -241,17 +241,17 @@ return /******/ (function(modules) { // webpackBootstrap
value: function performRequest(request_data) { value: function performRequest(request_data) {
var _this = this; var _this = this;
var batch = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; // return request_data for BatchRequest if no callback present
if (typeof request_data.callback !== 'function') return request_data;
if (this.client.token) { if (this.client.token) {
if (batch) return this.makeBatchRequest(request_data.requests, request_data.callback); if (request_data.batch) return this.makeBatchRequest(request_data.requests, request_data.callback);
this.makeRequest(request_data); this.makeRequest(request_data);
} else { } else {
(function () { (function () {
var that = _this; var that = _this;
var getCallback = function getCallback(err, response) { var getCallback = function getCallback(err, response) {
if (err) return this.handleError(err); if (err) return this.handleError(err);
if (batch) return that.makeBatchRequest(request_data.requests, request_data.callback); if (request_data.batch) return that.makeBatchRequest(request_data.requests, request_data.callback);
that.makeRequest(request_data); that.makeRequest(request_data);
}; };
_this.login(getCallback); _this.login(getCallback);
...@@ -262,7 +262,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -262,7 +262,7 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'parseBatchResponse', key: 'parseBatchResponse',
value: function parseBatchResponse(data, callback) { value: function parseBatchResponse(data, callback) {
var response_object = data.options.response.BatchResponse; var response_object = data.options.response.BatchResponse;
callback(null, response_object); return callback(null, response_object);
} }
}, { }, {
key: 'parseCountAccountResponse', key: 'parseCountAccountResponse',
...@@ -276,7 +276,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -276,7 +276,7 @@ return /******/ (function(modules) { // webpackBootstrap
value: function parseGrantsResponse(data, request_data, callback) { value: function parseGrantsResponse(data, request_data, callback) {
var result = {}; var result = {};
var response_object = data.get().GetGrantsResponse; var response_object = data.get().GetGrantsResponse;
callback(null, response_object); return callback(null, response_object);
} }
}, { }, {
key: 'parseResponse', key: 'parseResponse',
...@@ -337,7 +337,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -337,7 +337,7 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseResponse; request_data.parse_response = this.parseResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'remove', key: 'remove',
...@@ -346,19 +346,16 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -346,19 +346,16 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'modify', key: 'modify',
value: function modify(resource, resource_data, callback) { value: function modify(resource, resource_data, callback) {
var forBatch = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
var request_data = this.buildRequestData('Modify' + resource, callback); var request_data = this.buildRequestData('Modify' + resource, callback);
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseResponse; request_data.parse_response = this.parseResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
}, { }, {
key: 'get', key: 'get',
...@@ -371,7 +368,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -371,7 +368,7 @@ return /******/ (function(modules) { // webpackBootstrap
'by': this.dictionary.byIdOrName(resource_identifier), 'by': this.dictionary.byIdOrName(resource_identifier),
'_content': resource_identifier '_content': resource_identifier
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'getAll', key: 'getAll',
...@@ -379,7 +376,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -379,7 +376,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('GetAll' + resource + 's', callback); var request_data = this.buildRequestData('GetAll' + resource + 's', callback);
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Grant a right on a target to an individual or group grantee. // Grant a right on a target to an individual or group grantee.
...@@ -392,8 +389,6 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -392,8 +389,6 @@ return /******/ (function(modules) { // webpackBootstrap
}, { }, {
key: 'grantRight', key: 'grantRight',
value: function grantRight(target_data, grantee_data, right_name, callback) { value: function grantRight(target_data, grantee_data, right_name, callback) {
var forBatch = arguments.length <= 4 || arguments[4] === undefined ? false : arguments[4];
var request_data = this.buildRequestData('GrantRight', callback); var request_data = this.buildRequestData('GrantRight', callback);
var _dictionary$buildTarg = this.dictionary.buildTargetGrantee(target_data, grantee_data); var _dictionary$buildTarg = this.dictionary.buildTargetGrantee(target_data, grantee_data);
...@@ -407,8 +402,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -407,8 +402,7 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
request_data.params.params.right = { '_content': right_name }; request_data.params.params.right = { '_content': right_name };
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
// Specific functions // Specific functions
...@@ -419,7 +413,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -419,7 +413,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('AddAccountAlias', callback); var request_data = this.buildRequestData('AddAccountAlias', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { 'id': account_id, 'alias': alias }; request_data.params.params = { 'id': account_id, 'alias': alias };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Add New members tos distributionlists // Add New members tos distributionlists
...@@ -431,12 +425,12 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -431,12 +425,12 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('AddDistributionListMember', callback); var request_data = this.buildRequestData('AddDistributionListMember', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) }; request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) };
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'getAccount', key: 'getAccount',
value: function getAccount(identifier, callback) { value: function getAccount(identifier, callback) {
this.get('Account', identifier, callback); return this.get('Account', identifier, callback);
} }
// attributes debe ser un arreglo de objetos: // attributes debe ser un arreglo de objetos:
...@@ -450,34 +444,34 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -450,34 +444,34 @@ return /******/ (function(modules) { // webpackBootstrap
value: function createAccount(name, password, attributes, callback) { value: function createAccount(name, password, attributes, callback) {
var resource_data = this.buildResourceData(name, attributes); var resource_data = this.buildResourceData(name, attributes);
resource_data.password = { '_content': password }; resource_data.password = { '_content': password };
this.create('Account', resource_data, callback); return this.create('Account', resource_data, callback);
} }
}, { }, {
key: 'getCos', key: 'getCos',
value: function getCos(identifier, callback) { value: function getCos(identifier, callback) {
this.get('Cos', identifier, callback); return this.get('Cos', identifier, callback);
} }
}, { }, {
key: 'getDomain', key: 'getDomain',
value: function getDomain(identifier, callback) { value: function getDomain(identifier, callback) {
this.get('Domain', identifier, callback); return this.get('Domain', identifier, callback);
} }
}, { }, {
key: 'createDomain', key: 'createDomain',
value: function createDomain(name, attributes, callback) { value: function createDomain(name, attributes, callback) {
var resource_data = this.buildResourceData(name, attributes); var resource_data = this.buildResourceData(name, attributes);
this.create('Domain', resource_data, callback); return this.create('Domain', resource_data, callback);
} }
}, { }, {
key: 'getDistributionList', key: 'getDistributionList',
value: function getDistributionList(identifier, callback) { value: function getDistributionList(identifier, callback) {
this.get('DistributionList', identifier, callback); return this.get('DistributionList', identifier, callback);
} }
}, { }, {
key: 'createDistributionList', key: 'createDistributionList',
value: function createDistributionList(name, attributes, callback) { value: function createDistributionList(name, attributes, callback) {
var resource_data = this.buildResourceData(name, attributes); var resource_data = this.buildResourceData(name, attributes);
this.create('DistributionList', resource_data, callback); return this.create('DistributionList', resource_data, callback);
} }
}, { }, {
key: 'getAllDomains', key: 'getAllDomains',
...@@ -485,7 +479,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -485,7 +479,7 @@ return /******/ (function(modules) { // webpackBootstrap
var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
query_object.types = 'domains'; query_object.types = 'domains';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
}, { }, {
key: 'getAllAccounts', key: 'getAllAccounts',
...@@ -493,7 +487,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -493,7 +487,7 @@ return /******/ (function(modules) { // webpackBootstrap
var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
query_object.types = 'accounts'; query_object.types = 'accounts';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
}, { }, {
key: 'getAllDistributionLists', key: 'getAllDistributionLists',
...@@ -501,7 +495,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -501,7 +495,7 @@ return /******/ (function(modules) { // webpackBootstrap
var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
query_object.types = 'distributionlists'; query_object.types = 'distributionlists';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
}, { }, {
key: 'getAllAliases', key: 'getAllAliases',
...@@ -509,7 +503,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -509,7 +503,7 @@ return /******/ (function(modules) { // webpackBootstrap
var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var query_object = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
query_object.types = 'aliases'; query_object.types = 'aliases';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
}, { }, {
key: 'getAllCos', key: 'getAllCos',
...@@ -517,7 +511,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -517,7 +511,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('GetAllCos', callback); var request_data = this.buildRequestData('GetAllCos', callback);
request_data.resource = 'Cos'; request_data.resource = 'Cos';
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Returns all grants on the specified target entry, or all grants granted to the specified grantee entry. // Returns all grants on the specified target entry, or all grants granted to the specified grantee entry.
...@@ -530,8 +524,6 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -530,8 +524,6 @@ return /******/ (function(modules) { // webpackBootstrap
}, { }, {
key: 'getGrants', key: 'getGrants',
value: function getGrants(target_data, grantee_data, callback) { value: function getGrants(target_data, grantee_data, callback) {
var forBatch = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
var _dictionary$buildTarg3 = this.dictionary.buildTargetGrantee(target_data, grantee_data); var _dictionary$buildTarg3 = this.dictionary.buildTargetGrantee(target_data, grantee_data);
var _dictionary$buildTarg4 = (0, _slicedToArray3.default)(_dictionary$buildTarg3, 2); var _dictionary$buildTarg4 = (0, _slicedToArray3.default)(_dictionary$buildTarg3, 2);
...@@ -544,8 +536,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -544,8 +536,7 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
// Get current logged account information // Get current logged account information
...@@ -559,7 +550,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -559,7 +550,7 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.parse_response = function (data, _, callback) { request_data.parse_response = function (data, _, callback) {
return callback(null, data.response[0].GetInfoResponse); return callback(null, data.response[0].GetInfoResponse);
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Modify Account // Modify Account
...@@ -567,13 +558,11 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -567,13 +558,11 @@ return /******/ (function(modules) { // webpackBootstrap
}, { }, {
key: 'modifyAccount', key: 'modifyAccount',
value: function modifyAccount(zimbra_id, attributes, callback) { value: function modifyAccount(zimbra_id, attributes, callback) {
var forBatch = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
var resource_data = { var resource_data = {
id: zimbra_id, id: zimbra_id,
a: this.dictionary.attributesToArray(attributes) a: this.dictionary.attributesToArray(attributes)
}; };
return this.modify('Account', resource_data, callback, forBatch); return this.modify('Account', resource_data, callback);
} }
// Modify Domain // Modify Domain
...@@ -606,7 +595,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -606,7 +595,7 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'removeAccount', key: 'removeAccount',
value: function removeAccount(zimbra_id, callback) { value: function removeAccount(zimbra_id, callback) {
var resource_data = { id: zimbra_id }; var resource_data = { id: zimbra_id };
this.remove('Account', resource_data, callback); return this.remove('Account', resource_data, callback);
} }
// Remove Account Alias // Remove Account Alias
...@@ -617,7 +606,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -617,7 +606,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('RemoveAccountAlias', callback); var request_data = this.buildRequestData('RemoveAccountAlias', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { 'id': account_id, 'alias': alias }; request_data.params.params = { 'id': account_id, 'alias': alias };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Remove Account // Remove Account
...@@ -626,7 +615,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -626,7 +615,7 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'removeDomain', key: 'removeDomain',
value: function removeDomain(zimbra_id, callback) { value: function removeDomain(zimbra_id, callback) {
var resource_data = { id: zimbra_id }; var resource_data = { id: zimbra_id };
this.remove('Domain', resource_data, callback); return this.remove('Domain', resource_data, callback);
} }
// Remove DL // Remove DL
...@@ -647,7 +636,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -647,7 +636,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('RemoveDistributionListMember', callback); var request_data = this.buildRequestData('RemoveDistributionListMember', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) }; request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) };
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'revokeRight', key: 'revokeRight',
...@@ -664,7 +653,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -664,7 +653,7 @@ return /******/ (function(modules) { // webpackBootstrap
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
request_data.params.params.right = { '_content': right_name }; request_data.params.params.right = { '_content': right_name };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Search the Directory // Search the Directory
...@@ -689,7 +678,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -689,7 +678,7 @@ return /******/ (function(modules) { // webpackBootstrap
var request_data = this.buildRequestData('SearchDirectory', callback); var request_data = this.buildRequestData('SearchDirectory', callback);
request_data.params.params = search_object; request_data.params.params = search_object;
request_data.parse_response = this.parseSearchResponse; request_data.parse_response = this.parseSearchResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Fucking ugly code to make it better // TODO: Fucking ugly code to make it better
...@@ -705,7 +694,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -705,7 +694,7 @@ return /******/ (function(modules) { // webpackBootstrap
'by': this.dictionary.byIdOrName(domain_idenfitier), 'by': this.dictionary.byIdOrName(domain_idenfitier),
'_content': domain_idenfitier '_content': domain_idenfitier
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Fix this ugly FCKing Code // TODO: Fix this ugly FCKing Code
...@@ -728,15 +717,11 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -728,15 +717,11 @@ return /******/ (function(modules) { // webpackBootstrap
}; };
request_data.requests = []; request_data.requests = [];
domains_ids.forEach(function (domain_id) { domains_ids.forEach(function (domain_id) {
var request = _this2.buildRequestData('CountAccount', callback); var request = _this2.countAccounts(domain_id);
request.parse_response = _this2.parseCountAccountResponse;
request.params.params.domain = {
'by': _this2.dictionary.byIdOrName(domain_id),
'_content': domain_id
};
request_data.requests.push(request); request_data.requests.push(request);
}); });
this.performRequest(request_data, true); request_data.batch = true;
return this.performRequest(request_data);
} }
// TODO: TO ugly // TODO: TO ugly
...@@ -760,7 +745,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -760,7 +745,7 @@ return /******/ (function(modules) { // webpackBootstrap
return callback(null, {}); return callback(null, {});
} }
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Ugly // TODO: Ugly
...@@ -779,7 +764,7 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -779,7 +764,7 @@ return /******/ (function(modules) { // webpackBootstrap
}; };
return callback(null, result); return callback(null, result);
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
}, { }, {
key: 'token', key: 'token',
...@@ -13479,14 +13464,15 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -13479,14 +13464,15 @@ return /******/ (function(modules) { // webpackBootstrap
value: function addAdmin(account_id, callback) { value: function addAdmin(account_id, callback) {
var request_data = {}; var request_data = {};
var grantee_data = { 'type': 'usr', 'identifier': account_id }; var grantee_data = { 'type': 'usr', 'identifier': account_id };
var modifyAccountRequest = this.api.modifyAccount(account_id, { zimbraIsDelegatedAdminAccount: 'TRUE' }, callback, true); var modifyAccountRequest = this.api.modifyAccount(account_id, { zimbraIsDelegatedAdminAccount: 'TRUE' });
var grantRightRequest = this.grantRight(grantee_data, this.domainAdminRights, callback, true); var grantRightRequest = this.grantRight(grantee_data, this.domainAdminRights);
request_data.requests = [modifyAccountRequest, grantRightRequest]; request_data.requests = [modifyAccountRequest, grantRightRequest];
request_data.batch = true;
request_data.callback = function (err, data) { request_data.callback = function (err, data) {
if (err) return callback(err); if (err) return callback(err);
callback(null, data.GrantRightResponse); callback(null, data.GrantRightResponse);
}; };
this.api.performRequest(request_data, true); this.api.performRequest(request_data);
} }
// TODO: Fix this fucking ugly code // TODO: Fix this fucking ugly code
...@@ -13495,21 +13481,9 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -13495,21 +13481,9 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'getAdmins', key: 'getAdmins',
value: function getAdmins(callback) { value: function getAdmins(callback) {
var that = this; var that = this;
this.getAdminsIdsFromGrants(function (e, d) { var admins_ids = this.getAdminsIdsFromGrants();
if (e) return callback(e); var query = this.makeAdminIdsQuery(admins_ids);
if (d.length < 1) return callback(null, []); return this.api.getAllAccounts(callback, { query: query });
var query = "(|";
d.forEach(function (id) {
var zimbra_id = '(zimbraId=' + id + ')';
query += zimbra_id;
});
query += ")";
that.api.getAllAccounts(function (e, d) {
if (e) return callback(e);
if (d.total > 0) return callback(null, d.account);
return callback(null, []);
}, { query: query });
});
} }
// Return the ZimbraId if the grantee have the domainAdminRights right // Return the ZimbraId if the grantee have the domainAdminRights right
...@@ -13517,15 +13491,14 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -13517,15 +13491,14 @@ return /******/ (function(modules) { // webpackBootstrap
}, { }, {
key: 'getAdminsIdsFromGrants', key: 'getAdminsIdsFromGrants',
value: function getAdminsIdsFromGrants(callback) { value: function getAdminsIdsFromGrants() {
var _this2 = this;
var ids = []; var ids = [];
this.getACLs(function (err, data) { this.parseACL(this.attrs.zimbraACE).forEach(function (grantee) {
if (err) return callback(err); if (grantee.right === _this2.domainAdminRights) ids.push(grantee.id);
data.forEach(function (grant) {
if (grant.isDomainAdminGrant()) ids.push(grant.granteeId);
});
return callback(null, ids);
}); });
return ids;
} }
}, { }, {
key: 'getAllDistributionLists', key: 'getAllDistributionLists',
...@@ -13549,6 +13522,17 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -13549,6 +13522,17 @@ return /******/ (function(modules) { // webpackBootstrap
return callback(null, d); return callback(null, d);
}); });
} }
}, {
key: 'makeAdminIdsQuery',
value: function makeAdminIdsQuery(ids) {
var query = "(|";
ids.forEach(function (id) {
var zimbra_id = '(zimbraId=' + id + ')';
query += zimbra_id;
});
query += ")";
return query;
}
}, { }, {
key: 'maxAccountsByCos', key: 'maxAccountsByCos',
value: function maxAccountsByCos() { value: function maxAccountsByCos() {
...@@ -13864,10 +13848,12 @@ return /******/ (function(modules) { // webpackBootstrap ...@@ -13864,10 +13848,12 @@ return /******/ (function(modules) { // webpackBootstrap
key: "parseACL", key: "parseACL",
value: function parseACL(acls) { value: function parseACL(acls) {
var elements = [].concat.apply([], [acls]); var elements = [].concat.apply([], [acls]);
var grantees = {}; var grantees = [];
elements.forEach(function (el) { // Filter to remove undefined
grantee_data = el.split(/ /); // http://stackoverflow.com/questions/28607451/removing-undefined-values-from-array
grantees[grantee_data[0]] = { type: grantee_data[1], right: grantee_data[2] }; elements.filter(Boolean).forEach(function (el) {
var grantee_data = el.split(/ /);
grantees.push({ id: grantee_data[0], type: grantee_data[1], right: grantee_data[2] });
}); });
return grantees; return grantees;
} }
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -6,19 +6,19 @@ import Dictionary from './utils/dictionary.js'; ...@@ -6,19 +6,19 @@ import Dictionary from './utils/dictionary.js';
class Error { class Error {
constructor(err) { constructor(err) {
this.code = err.Fault.Code.Value; this.code = err.Fault ? err.Fault.Code.Value : err.status;
this.extra = this.getErrorInfo(err.Fault); this.extra = this.getErrorInfo(err);
} }
getErrorInfo(fault) { getErrorInfo(err) {
if (fault && fault.Detail) { if (err && err.Fault) {
return { return {
'code': fault.Detail.Error.Code, 'code': err.Fault.Detail.Error.Code,
'reason': fault.Reason.Text, 'reason': err.Fault.Reason.Text,
'trace': fault.Detail.Error.Trace 'trace': err.Fault.Detail.Error.Trace
} };
} else { } else {
return {}; return { 'code': err.status, 'reason': err.statusText };
} }
} }
...@@ -105,8 +105,8 @@ export default class ZimbraAdminApi { ...@@ -105,8 +105,8 @@ export default class ZimbraAdminApi {
let request = null; let request = null;
this.client.getRequest(options, (err, req) => { this.client.getRequest(options, (err, req) => {
if (err) return error(err); if (err) return error(err);
request = req; request = req;
}); });
return request; return request;
} }
...@@ -139,15 +139,17 @@ export default class ZimbraAdminApi { ...@@ -139,15 +139,17 @@ export default class ZimbraAdminApi {
}); });
} }
performRequest(request_data, batch = false) { performRequest(request_data) {
// return request_data for BatchRequest if no callback present
if (typeof request_data.callback !== 'function') return request_data;
if (this.client.token) { if (this.client.token) {
if (batch) return this.makeBatchRequest(request_data.requests, request_data.callback); if (request_data.batch) return this.makeBatchRequest(request_data.requests, request_data.callback);
this.makeRequest(request_data); this.makeRequest(request_data);
} else { } else {
const that = this; const that = this;
let getCallback = function(err, response){ let getCallback = function(err, response){
if (err) return this.handleError(err); if (err) return this.handleError(err);
if (batch) return that.makeBatchRequest(request_data.requests, request_data.callback); if (request_data.batch) return that.makeBatchRequest(request_data.requests, request_data.callback);
that.makeRequest(request_data); that.makeRequest(request_data);
}; };
this.login(getCallback); this.login(getCallback);
...@@ -156,7 +158,7 @@ export default class ZimbraAdminApi { ...@@ -156,7 +158,7 @@ export default class ZimbraAdminApi {
parseBatchResponse(data, callback) { parseBatchResponse(data, callback) {
const response_object = data.options.response.BatchResponse; const response_object = data.options.response.BatchResponse;
callback(null, response_object); return callback(null, response_object);
} }
parseCountAccountResponse(data, request_data, callback) { parseCountAccountResponse(data, request_data, callback) {
...@@ -168,7 +170,7 @@ export default class ZimbraAdminApi { ...@@ -168,7 +170,7 @@ export default class ZimbraAdminApi {
parseGrantsResponse(data, request_data, callback) { parseGrantsResponse(data, request_data, callback) {
const result = {}; const result = {};
const response_object = data.get().GetGrantsResponse; const response_object = data.get().GetGrantsResponse;
callback(null, response_object); return callback(null, response_object);
} }
parseResponse(data, request_data, callback) { parseResponse(data, request_data, callback) {
...@@ -222,7 +224,7 @@ export default class ZimbraAdminApi { ...@@ -222,7 +224,7 @@ export default class ZimbraAdminApi {
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseResponse; request_data.parse_response = this.parseResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
this.performRequest(request_data); return this.performRequest(request_data);
} }
remove(resource, resource_data, callback){ remove(resource, resource_data, callback){
...@@ -230,17 +232,16 @@ export default class ZimbraAdminApi { ...@@ -230,17 +232,16 @@ export default class ZimbraAdminApi {
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
this.performRequest(request_data); return this.performRequest(request_data);
} }
modify(resource, resource_data, callback, forBatch = false){ modify(resource, resource_data, callback){
const request_data = this.buildRequestData(`Modify${resource}`, callback); const request_data = this.buildRequestData(`Modify${resource}`, callback);
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseResponse; request_data.parse_response = this.parseResponse;
request_data.params.params = resource_data; request_data.params.params = resource_data;
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
get(resource, resource_identifier, callback){ get(resource, resource_identifier, callback){
...@@ -252,14 +253,14 @@ export default class ZimbraAdminApi { ...@@ -252,14 +253,14 @@ export default class ZimbraAdminApi {
'by': this.dictionary.byIdOrName(resource_identifier), 'by': this.dictionary.byIdOrName(resource_identifier),
'_content': resource_identifier '_content': resource_identifier
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
getAll(resource, callback) { getAll(resource, callback) {
const request_data = this.buildRequestData(`GetAll${resource}s`, callback); const request_data = this.buildRequestData(`GetAll${resource}s`, callback);
request_data.resource = resource; request_data.resource = resource;
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Grant a right on a target to an individual or group grantee. // Grant a right on a target to an individual or group grantee.
...@@ -268,15 +269,14 @@ export default class ZimbraAdminApi { ...@@ -268,15 +269,14 @@ export default class ZimbraAdminApi {
// type: (account|cos|dl|domain), // type: (account|cos|dl|domain),
// identifier: (name or zimbraId) // identifier: (name or zimbraId)
// } // }
grantRight(target_data, grantee_data, right_name, callback, forBatch = false) { grantRight(target_data, grantee_data, right_name, callback) {
const request_data = this.buildRequestData('GrantRight', callback); const request_data = this.buildRequestData('GrantRight', callback);
const [target, grantee] = this.dictionary.buildTargetGrantee(target_data, grantee_data); const [target, grantee] = this.dictionary.buildTargetGrantee(target_data, grantee_data);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
request_data.params.params.right = { '_content': right_name }; request_data.params.params.right = { '_content': right_name };
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
// Specific functions // Specific functions
...@@ -285,7 +285,7 @@ export default class ZimbraAdminApi { ...@@ -285,7 +285,7 @@ export default class ZimbraAdminApi {
const request_data = this.buildRequestData('AddAccountAlias', callback); const request_data = this.buildRequestData('AddAccountAlias', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { 'id': account_id, 'alias': alias }; request_data.params.params = { 'id': account_id, 'alias': alias };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Add New members tos distributionlists // Add New members tos distributionlists
...@@ -294,11 +294,11 @@ export default class ZimbraAdminApi { ...@@ -294,11 +294,11 @@ export default class ZimbraAdminApi {
const request_data = this.buildRequestData('AddDistributionListMember', callback); const request_data = this.buildRequestData('AddDistributionListMember', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) }; request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) };
this.performRequest(request_data); return this.performRequest(request_data);
} }
getAccount(identifier, callback) { getAccount(identifier, callback) {
this.get('Account', identifier, callback); return this.get('Account', identifier, callback);
} }
// attributes debe ser un arreglo de objetos: // attributes debe ser un arreglo de objetos:
...@@ -309,57 +309,57 @@ export default class ZimbraAdminApi { ...@@ -309,57 +309,57 @@ export default class ZimbraAdminApi {
createAccount(name, password, attributes, callback) { createAccount(name, password, attributes, callback) {
const resource_data = this.buildResourceData(name, attributes); const resource_data = this.buildResourceData(name, attributes);
resource_data.password = { '_content': password }; resource_data.password = { '_content': password };
this.create('Account', resource_data, callback); return this.create('Account', resource_data, callback);
} }
getCos(identifier, callback) { getCos(identifier, callback) {
this.get('Cos', identifier, callback); return this.get('Cos', identifier, callback);
} }
getDomain(identifier, callback) { getDomain(identifier, callback) {
this.get('Domain', identifier, callback); return this.get('Domain', identifier, callback);
} }
createDomain(name, attributes, callback) { createDomain(name, attributes, callback) {
const resource_data = this.buildResourceData(name, attributes); const resource_data = this.buildResourceData(name, attributes);
this.create('Domain', resource_data, callback); return this.create('Domain', resource_data, callback);
} }
getDistributionList(identifier, callback) { getDistributionList(identifier, callback) {
this.get('DistributionList', identifier, callback); return this.get('DistributionList', identifier, callback);
} }
createDistributionList(name, attributes, callback) { createDistributionList(name, attributes, callback) {
const resource_data = this.buildResourceData(name, attributes); const resource_data = this.buildResourceData(name, attributes);
this.create('DistributionList', resource_data, callback); return this.create('DistributionList', resource_data, callback);
} }
getAllDomains(callback, query_object = {}) { getAllDomains(callback, query_object = {}) {
query_object.types = 'domains'; query_object.types = 'domains';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
getAllAccounts(callback, query_object = {}) { getAllAccounts(callback, query_object = {}) {
query_object.types = 'accounts'; query_object.types = 'accounts';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
getAllDistributionLists(callback, query_object = {}) { getAllDistributionLists(callback, query_object = {}) {
query_object.types = 'distributionlists'; query_object.types = 'distributionlists';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
getAllAliases(callback, query_object = {}) { getAllAliases(callback, query_object = {}) {
query_object.types = 'aliases'; query_object.types = 'aliases';
this.directorySearch(query_object, callback); return this.directorySearch(query_object, callback);
} }
getAllCos(callback) { getAllCos(callback) {
const request_data = this.buildRequestData('GetAllCos', callback); const request_data = this.buildRequestData('GetAllCos', callback);
request_data.resource = 'Cos'; request_data.resource = 'Cos';
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Returns all grants on the specified target entry, or all grants granted to the specified grantee entry. // Returns all grants on the specified target entry, or all grants granted to the specified grantee entry.
...@@ -368,15 +368,14 @@ export default class ZimbraAdminApi { ...@@ -368,15 +368,14 @@ export default class ZimbraAdminApi {
// type: (account|cos|dl|domain), // type: (account|cos|dl|domain),
// identifier: (name or zimbraId) // identifier: (name or zimbraId)
// } // }
getGrants(target_data, grantee_data, callback, forBatch = false) { getGrants(target_data, grantee_data, callback) {
const [target, grantee] = this.dictionary.buildTargetGrantee(target_data, grantee_data); const [target, grantee] = this.dictionary.buildTargetGrantee(target_data, grantee_data);
const request_data = this.buildRequestData('GetGrants', callback); const request_data = this.buildRequestData('GetGrants', callback);
request_data.resource = 'Grant'; request_data.resource = 'Grant';
request_data.parse_response = this.parseAllResponse; request_data.parse_response = this.parseAllResponse;
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
if (forBatch) return request_data; return this.performRequest(request_data);
this.performRequest(request_data);
} }
// Get current logged account information // Get current logged account information
...@@ -387,16 +386,16 @@ export default class ZimbraAdminApi { ...@@ -387,16 +386,16 @@ export default class ZimbraAdminApi {
request_data.parse_response = function(data, _, callback){ request_data.parse_response = function(data, _, callback){
return callback(null, data.response[0].GetInfoResponse); return callback(null, data.response[0].GetInfoResponse);
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Modify Account // Modify Account
modifyAccount(zimbra_id, attributes, callback, forBatch = false) { modifyAccount(zimbra_id, attributes, callback) {
let resource_data = { let resource_data = {
id: zimbra_id, id: zimbra_id,
a: this.dictionary.attributesToArray(attributes) a: this.dictionary.attributesToArray(attributes)
}; };
return this.modify('Account', resource_data, callback, forBatch); return this.modify('Account', resource_data, callback);
} }
// Modify Domain // Modify Domain
...@@ -420,7 +419,7 @@ export default class ZimbraAdminApi { ...@@ -420,7 +419,7 @@ export default class ZimbraAdminApi {
// Remove Account // Remove Account
removeAccount(zimbra_id, callback) { removeAccount(zimbra_id, callback) {
let resource_data = { id: zimbra_id }; let resource_data = { id: zimbra_id };
this.remove('Account', resource_data, callback); return this.remove('Account', resource_data, callback);
} }
// Remove Account Alias // Remove Account Alias
...@@ -428,13 +427,13 @@ export default class ZimbraAdminApi { ...@@ -428,13 +427,13 @@ export default class ZimbraAdminApi {
const request_data = this.buildRequestData('RemoveAccountAlias', callback); const request_data = this.buildRequestData('RemoveAccountAlias', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { 'id': account_id, 'alias': alias }; request_data.params.params = { 'id': account_id, 'alias': alias };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Remove Account // Remove Account
removeDomain(zimbra_id, callback) { removeDomain(zimbra_id, callback) {
let resource_data = { id: zimbra_id }; let resource_data = { id: zimbra_id };
this.remove('Domain', resource_data, callback); return this.remove('Domain', resource_data, callback);
} }
// Remove DL // Remove DL
...@@ -449,7 +448,7 @@ export default class ZimbraAdminApi { ...@@ -449,7 +448,7 @@ export default class ZimbraAdminApi {
const request_data = this.buildRequestData('RemoveDistributionListMember', callback); const request_data = this.buildRequestData('RemoveDistributionListMember', callback);
request_data.parse_response = this.parseEmptyResponse; request_data.parse_response = this.parseEmptyResponse;
request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) }; request_data.params.params = { id: dl_id, dlm: this.dictionary.convertToZimbraArray(members) };
this.performRequest(request_data); return this.performRequest(request_data);
} }
revokeRight(target_data, grantee_data, right_name, callback) { revokeRight(target_data, grantee_data, right_name, callback) {
...@@ -459,7 +458,7 @@ export default class ZimbraAdminApi { ...@@ -459,7 +458,7 @@ export default class ZimbraAdminApi {
request_data.params.params.grantee = grantee; request_data.params.params.grantee = grantee;
request_data.params.params.target = target; request_data.params.params.target = target;
request_data.params.params.right = { '_content': right_name }; request_data.params.params.right = { '_content': right_name };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// Search the Directory // Search the Directory
...@@ -481,7 +480,7 @@ export default class ZimbraAdminApi { ...@@ -481,7 +480,7 @@ export default class ZimbraAdminApi {
const request_data = this.buildRequestData(`SearchDirectory`, callback); const request_data = this.buildRequestData(`SearchDirectory`, callback);
request_data.params.params = search_object; request_data.params.params = search_object;
request_data.parse_response = this.parseSearchResponse; request_data.parse_response = this.parseSearchResponse;
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Fucking ugly code to make it better // TODO: Fucking ugly code to make it better
...@@ -494,7 +493,7 @@ export default class ZimbraAdminApi { ...@@ -494,7 +493,7 @@ export default class ZimbraAdminApi {
'by': this.dictionary.byIdOrName(domain_idenfitier), 'by': this.dictionary.byIdOrName(domain_idenfitier),
'_content': domain_idenfitier '_content': domain_idenfitier
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Fix this ugly FCKing Code // TODO: Fix this ugly FCKing Code
...@@ -512,15 +511,11 @@ export default class ZimbraAdminApi { ...@@ -512,15 +511,11 @@ export default class ZimbraAdminApi {
}; };
request_data.requests = []; request_data.requests = [];
domains_ids.forEach((domain_id) => { domains_ids.forEach((domain_id) => {
const request = this.buildRequestData(`CountAccount`, callback); const request = this.countAccounts(domain_id);
request.parse_response = this.parseCountAccountResponse;
request.params.params.domain = {
'by': this.dictionary.byIdOrName(domain_id),
'_content': domain_id
};
request_data.requests.push(request); request_data.requests.push(request);
}); });
this.performRequest(request_data, true); request_data.batch = true;
return this.performRequest(request_data);
} }
// TODO: TO ugly // TODO: TO ugly
...@@ -541,7 +536,7 @@ export default class ZimbraAdminApi { ...@@ -541,7 +536,7 @@ export default class ZimbraAdminApi {
return callback(null, {}); return callback(null, {});
} }
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
// TODO: Ugly // TODO: Ugly
...@@ -557,7 +552,7 @@ export default class ZimbraAdminApi { ...@@ -557,7 +552,7 @@ export default class ZimbraAdminApi {
}; };
return callback(null, result); return callback(null, result);
}; };
this.performRequest(request_data); return this.performRequest(request_data);
} }
} }
......
...@@ -13,47 +13,33 @@ export default class Domain extends Zimbra { ...@@ -13,47 +13,33 @@ export default class Domain extends Zimbra {
addAdmin(account_id, callback) { addAdmin(account_id, callback) {
const request_data = {}; const request_data = {};
const grantee_data = { 'type': 'usr', 'identifier': account_id }; const grantee_data = { 'type': 'usr', 'identifier': account_id };
let modifyAccountRequest = this.api.modifyAccount(account_id, { zimbraIsDelegatedAdminAccount: 'TRUE' }, callback, true); const modifyAccountRequest = this.api.modifyAccount(account_id, { zimbraIsDelegatedAdminAccount: 'TRUE' });
const grantRightRequest = this.grantRight(grantee_data, this.domainAdminRights, callback, true); const grantRightRequest = this.grantRight(grantee_data, this.domainAdminRights);
request_data.requests = [modifyAccountRequest, grantRightRequest]; request_data.requests = [modifyAccountRequest, grantRightRequest];
request_data.batch = true;
request_data.callback = function(err, data) { request_data.callback = function(err, data) {
if (err) return callback(err); if (err) return callback(err);
callback(null, data.GrantRightResponse); callback(null, data.GrantRightResponse);
}; };
this.api.performRequest(request_data, true); this.api.performRequest(request_data);
} }
// TODO: Fix this fucking ugly code // TODO: Fix this fucking ugly code
getAdmins(callback) { getAdmins(callback) {
const that = this; const that = this;
this.getAdminsIdsFromGrants(function(e,d){ const admins_ids = this.getAdminsIdsFromGrants();
if (e) return callback(e); const query = this.makeAdminIdsQuery(admins_ids);
if (d.length < 1) return callback(null, []); return this.api.getAllAccounts(callback, {query: query});
let query = "(|";
d.forEach((id) => {
const zimbra_id = `(zimbraId=${id})`;
query += zimbra_id;
});
query += ")";
that.api.getAllAccounts(function(e,d){
if (e) return callback(e);
if (d.total > 0) return callback(null, d.account);
return callback(null, []);
}, {query: query});
});
} }
// Return the ZimbraId if the grantee have the domainAdminRights right // Return the ZimbraId if the grantee have the domainAdminRights right
// Grant.right_name() == domainAdminRights // Grant.right_name() == domainAdminRights
getAdminsIdsFromGrants(callback) { getAdminsIdsFromGrants() {
const ids = []; const ids = [];
this.getACLs(function(err, data){ this.parseACL(this.attrs.zimbraACE).forEach((grantee) => {
if (err) return callback(err); if (grantee.right === this.domainAdminRights) ids.push(grantee.id);
data.forEach((grant) => {
if (grant.isDomainAdminGrant()) ids.push(grant.granteeId);
});
return callback(null, ids);
}); });
return ids;
} }
getAllDistributionLists(callback) { getAllDistributionLists(callback) {
...@@ -76,6 +62,16 @@ export default class Domain extends Zimbra { ...@@ -76,6 +62,16 @@ export default class Domain extends Zimbra {
}); });
} }
makeAdminIdsQuery(ids) {
let query = "(|";
ids.forEach((id) => {
const zimbra_id = `(zimbraId=${id})`;
query += zimbra_id;
});
query += ")";
return query;
}
maxAccountsByCos() { maxAccountsByCos() {
const results = {}; const results = {};
if (typeof this.attrs.zimbraDomainCOSMaxAccounts === 'undefined') return null; if (typeof this.attrs.zimbraDomainCOSMaxAccounts === 'undefined') return null;
......
...@@ -34,10 +34,12 @@ export default class Zimbra { ...@@ -34,10 +34,12 @@ export default class Zimbra {
parseACL(acls) { parseACL(acls) {
const elements = [].concat.apply([], [acls]); const elements = [].concat.apply([], [acls]);
const grantees = {}; const grantees = [];
elements.forEach((el) => { // Filter to remove undefined
grantee_data = el.split(/ /); // http://stackoverflow.com/questions/28607451/removing-undefined-values-from-array
grantees[grantee_data[0]] = {type: grantee_data[1], right: grantee_data[2]}; elements.filter(Boolean).forEach((el) => {
const grantee_data = el.split(/ /);
grantees.push({id: grantee_data[0], type: grantee_data[1], right: grantee_data[2]});
}); });
return grantees; return grantees;
} }
......
...@@ -8,63 +8,9 @@ ...@@ -8,63 +8,9 @@
'password':'12345678' 'password':'12345678'
}; };
function loadFixture(fixtureName) {
var req = new XMLHttpRequest();
req.open('GET', 'fixtures/' + fixtureName + '.json', false);
req.send(null);
if (req.status === 200) {
return JSON.parse(req.responseText);
} else {
return null;
}
}
describe('Basic tests', function() { describe('Basic tests', function() {
this.timeout(5000); this.timeout(5000);
it('should return error object when timeout', function() {
let api = new ZimbraAdminApi({
'url': 'http://localhost',
'user': 'user',
'password':'pass'});
api.login(null, function(err){
let error = api.handleError(err);
expect(error.constructor.name).to.equal('Error');
expect(error.title).to.equal('timeout');
});
});
it('return error if wrong validation', function(done) {
var auth_data2 = JSON.parse(JSON.stringify(auth_data));
auth_data2.password = 'abc';
let api = new ZimbraAdminApi(auth_data2);
let callback = function(err, response) {
let error = api.handleError(err);
expect(error.constructor.name).to.equal('Error');
expect(error.extra.code).to.equal('account.AUTH_FAILED');
done();
};
api.login(callback);
});
it('return token if ok validation', function(done) {
let api = new ZimbraAdminApi(auth_data);
let callback = function(err, response) {
if (err) return console.error(err);
expect(api.client.token).to.exist;
done();
};
api.login(callback);
});
it('should delete the password after authentication', function(done) {
let api = new ZimbraAdminApi(auth_data);
let callback = function(err, response) {
expect(api.secret).not.to.exist;
expect(api.password).not.to.exist;
done();
}
api.login(callback);
});
it('should get all domains', function(done) { it('should get all domains', function(done) {
let api = new ZimbraAdminApi(auth_data); let api = new ZimbraAdminApi(auth_data);
...@@ -471,8 +417,9 @@ ...@@ -471,8 +417,9 @@
if (err) console.error(err); if (err) console.error(err);
let domain = data; let domain = data;
domain.getAdmins(function(e, d){ domain.getAdmins(function(e, d){
expect(d.length).to.be.above(1); if (e) return console.error(e);
expect(d[0].constructor.name).to.be.equal('Account'); expect(d.account.length).to.be.above(1);
expect(d.account[0].constructor.name).to.be.equal('Account');
done(); done();
}); });
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment