diff --git a/src/app/organization/organizationSubvaultsAddController.js b/src/app/organization/organizationSubvaultsAddController.js
new file mode 100644
index 0000000000..f1255d2135
--- /dev/null
+++ b/src/app/organization/organizationSubvaultsAddController.js
@@ -0,0 +1,18 @@
+angular
+ .module('bit.organization')
+
+ .controller('organizationSubvaultsAddController', function ($scope, $state, $uibModalInstance, apiService, cipherService,
+ $analytics) {
+ $scope.submit = function (model) {
+ var subvault = cipherService.encryptSubvault(model, $state.params.orgId);
+ $scope.submitPromise = apiService.subvaults.post({ orgId: $state.params.orgId }, subvault, function (response) {
+ $analytics.eventTrack('Created Subvault');
+ var decSubvault = cipherService.decryptSubvault(response, $state.params.orgId, true);
+ $uibModalInstance.close(decSubvault);
+ }).$promise;
+ };
+
+ $scope.close = function () {
+ $uibModalInstance.dismiss('cancel');
+ };
+ });
diff --git a/src/app/organization/organizationSubvaultsController.js b/src/app/organization/organizationSubvaultsController.js
index 199c9b15bf..4876d90cac 100644
--- a/src/app/organization/organizationSubvaultsController.js
+++ b/src/app/organization/organizationSubvaultsController.js
@@ -1,25 +1,41 @@
angular
.module('bit.organization')
- .controller('organizationSubvaultsController', function ($scope, $state, apiService) {
+ .controller('organizationSubvaultsController', function ($scope, $state, apiService, $uibModal, cipherService) {
$scope.subvaults = [];
$scope.loading = true;
$scope.$on('$viewContentLoaded', function () {
loadList();
});
+ $scope.add = function () {
+ var modal = $uibModal.open({
+ animation: true,
+ templateUrl: 'app/organization/views/organizationSubvaultsAdd.html',
+ controller: 'organizationSubvaultsAddController'
+ });
+
+ modal.result.then(function (subvault) {
+ $scope.subvaults.push(subvault);
+ });
+ };
+
+ $scope.delete = function (subvault) {
+ if (!confirm('Are you sure you want to delete this subvault (' + subvault.name + ')?')) {
+ return;
+ }
+
+ apiService.subvaults.del({ orgId: $state.params.orgId, id: subvault.id }, function () {
+ var index = $scope.subvaults.indexOf(subvault);
+ if (index > -1) {
+ $scope.subvaults.splice(index, 1);
+ }
+ });
+ };
+
function loadList() {
apiService.subvaults.listOrganization({ orgId: $state.params.orgId }, function (list) {
- var subvaults = [];
-
- for (var i = 0; i < list.Data.length; i++) {
- subvaults.push({
- id: list.Data[i].Id,
- name: list.Data[i].Name
- });
- }
-
- $scope.subvaults = subvaults;
+ $scope.subvaults = cipherService.decryptSubvaults(list.Data, $state.params.orgId, true);
$scope.loading = false;
});
}
diff --git a/src/app/organization/views/organizationSubvaults.html b/src/app/organization/views/organizationSubvaults.html
index b55bfd73dd..d5584ae3e9 100644
--- a/src/app/organization/views/organizationSubvaults.html
+++ b/src/app/organization/views/organizationSubvaults.html
@@ -9,20 +9,20 @@
-
-
+
+
Loading...
-
+
No subvaults.
-
+
@@ -32,13 +32,14 @@
-
-
- |
{{subvault.name}}
|
diff --git a/src/app/organization/views/organizationSubvaultsAdd.html b/src/app/organization/views/organizationSubvaultsAdd.html
new file mode 100644
index 0000000000..9ecfc87a07
--- /dev/null
+++ b/src/app/organization/views/organizationSubvaultsAdd.html
@@ -0,0 +1,28 @@
+
+
+
\ No newline at end of file
diff --git a/src/app/services/apiService.js b/src/app/services/apiService.js
index 52a61887b7..6366f3804a 100644
--- a/src/app/services/apiService.js
+++ b/src/app/services/apiService.js
@@ -29,15 +29,6 @@
del: { url: _apiUri + '/ciphers/:id/delete', method: 'POST', params: { id: '@id' } }
});
- _service.subvaults = $resource(_apiUri + '/subvaults/:id', {}, {
- get: { method: 'GET', params: { id: '@id' } },
- list: { method: 'GET', params: {} },
- listOrganization: { url: _apiUri + '/subvaults/organization/:orgId', method: 'GET', params: { orgId: '@orgId' } },
- post: { method: 'POST', params: {} },
- put: { method: 'POST', params: { id: '@id' } },
- del: { url: _apiUri + '/subvaults/:id/delete', method: 'POST', params: { id: '@id' } }
- });
-
_service.organizations = $resource(_apiUri + '/organizations/:id', {}, {
get: { method: 'GET', params: { id: '@id' } },
getExtended: { url: _apiUri + '/organizations/:id/extended', method: 'GET', params: { id: '@id' } },
@@ -56,6 +47,15 @@
del: { url: _apiUri + '/organizations/:orgId/users/:id/delete', method: 'POST', params: { id: '@id', orgId: '@orgId' } }
});
+ _service.subvaults = $resource(_apiUri + '/organizations/:orgId/subvaults/:id', {}, {
+ get: { method: 'GET', params: { id: '@id', orgId: '@orgId' } },
+ listMe: { url: _apiUri + '/subvaults', method: 'GET', params: {} },
+ listOrganization: { method: 'GET', params: { orgId: '@orgId' } },
+ post: { method: 'POST', params: { orgId: '@orgId' } },
+ put: { method: 'POST', params: { id: '@id', orgId: '@orgId' } },
+ del: { url: _apiUri + '/organizations/:orgId/subvaults/:id/delete', method: 'POST', params: { id: '@id', orgId: '@orgId' } }
+ });
+
_service.accounts = $resource(_apiUri + '/accounts', {}, {
register: { url: _apiUri + '/accounts/register', method: 'POST', params: {} },
emailToken: { url: _apiUri + '/accounts/email-token', method: 'POST', params: {} },
diff --git a/src/app/services/cipherService.js b/src/app/services/cipherService.js
index 638827f924..dedf481092 100644
--- a/src/app/services/cipherService.js
+++ b/src/app/services/cipherService.js
@@ -61,21 +61,6 @@ angular
username: decryptProperty(encryptedCipher.Data.Username, key, true)
};
- try {
- login.name = cryptoService.decrypt(encryptedCipher.Data.Name, key);
- }
- catch (err) {
- login.name = '[error: cannot decrypt]';
- }
-
- try {
- login.username = encryptedCipher.Data.Username && encryptedCipher.Data.Username !== '' ?
- cryptoService.decrypt(encryptedCipher.Data.Username, key) : null;
- }
- catch (err) {
- login.username = '[error: cannot decrypt]';
- }
-
return login;
};
@@ -109,6 +94,31 @@ angular
};
};
+ _service.decryptSubvaults = function (encryptedSubvaults, orgId, catchError) {
+ if (!encryptedSubvaults) throw "encryptedSubvaults is undefined or null";
+
+ var unencryptedSubvaults = [];
+ for (var i = 0; i < encryptedSubvaults.length; i++) {
+ unencryptedSubvaults.push(_service.decryptSubvault(encryptedSubvaults[i], orgId, catchError));
+ }
+
+ return unencryptedSubvaults;
+ };
+
+ _service.decryptSubvault = function (encryptedSubvault, orgId, catchError) {
+ if (!encryptedSubvault) throw "encryptedSubvault is undefined or null";
+
+ catchError = catchError === true ? true : false;
+ orgId = orgId || encryptedSubvault.OrganizationId;
+ var key = cryptoService.getOrgKey(orgId);
+
+ return {
+ id: encryptedSubvault.Id,
+ name: catchError ? decryptProperty(encryptedSubvault.Name, key, false) :
+ cryptoService.decrypt(encryptedSubvault.Name, key)
+ };
+ };
+
function decryptProperty(property, key, checkEmpty) {
if (checkEmpty && (!property || property === '')) {
return null;
@@ -172,5 +182,25 @@ angular
};
};
+ _service.encryptSubvaults = function (unencryptedSubvaults, orgId) {
+ if (!unencryptedSubvaults) throw "unencryptedSubvaults is undefined or null";
+
+ var encryptedSubvaults = [];
+ for (var i = 0; i < unencryptedSubvaults.length; i++) {
+ encryptedSubvaults.push(_service.encryptSubvault(unencryptedSubvaults[i], orgId));
+ }
+
+ return encryptedSubvaults;
+ };
+
+ _service.encryptSubvault = function (unencryptedSubvault, orgId) {
+ if (!unencryptedSubvault) throw "unencryptedSubvault is undefined or null";
+
+ return {
+ id: unencryptedSubvault.id,
+ name: cryptoService.encrypt(unencryptedSubvault.name, cryptoService.getOrgKey(orgId))
+ };
+ };
+
return _service;
});
diff --git a/src/index.html b/src/index.html
index 91c2c140cb..0f366e4370 100644
--- a/src/index.html
+++ b/src/index.html
@@ -125,6 +125,7 @@
+