diff --git a/src/app/constants.js b/src/app/constants.js
index f1cdae3bb1..77dffe75ea 100644
--- a/src/app/constants.js
+++ b/src/app/constants.js
@@ -77,6 +77,7 @@ angular.module('bit')
description: 'Verification codes will be emailed to you.',
enabled: false,
active: true,
+ free: true,
image: 'gmail.png',
displayOrder: 4,
priority: 0
diff --git a/src/app/global/premiumRequiredController.js b/src/app/global/premiumRequiredController.js
new file mode 100644
index 0000000000..6d64ee16fc
--- /dev/null
+++ b/src/app/global/premiumRequiredController.js
@@ -0,0 +1,17 @@
+angular
+ .module('bit.global')
+
+ .controller('premiumRequiredController', function ($scope, $state, $uibModalInstance, $analytics) {
+ $analytics.eventTrack('premiumRequiredController', { category: 'Modal' });
+
+ $scope.go = function () {
+ $analytics.eventTrack('Get Premium');
+ $state.go('backend.user.settingsPremium').then(function () {
+ $scope.close();
+ });
+ };
+
+ $scope.close = function () {
+ $uibModalInstance.dismiss('close');
+ };
+ });
diff --git a/src/app/settings/settingsTwoStepController.js b/src/app/settings/settingsTwoStepController.js
index 4ca68d108c..2cc753a5a0 100644
--- a/src/app/settings/settingsTwoStepController.js
+++ b/src/app/settings/settingsTwoStepController.js
@@ -2,23 +2,40 @@
.module('bit.settings')
.controller('settingsTwoStepController', function ($scope, apiService, toastr, $analytics, constants,
- $filter, $uibModal) {
+ $filter, $uibModal, authService) {
$scope.providers = constants.twoFactorProviderInfo;
+ $scope.premium = true;
- apiService.twoFactor.list({}, function (response) {
- for (var i = 0; i < response.Data.length; i++) {
- if (!response.Data[i].Enabled) {
- continue;
- }
+ authService.getUserProfile().then(function (profile) {
+ $scope.premium = profile.premium;
+ return apiService.twoFactor.list({}).$promise;
+ }).then(function (response) {
+ if (response.Data) {
+ for (var i = 0; i < response.Data.length; i++) {
+ if (!response.Data[i].Enabled) {
+ continue;
+ }
- var provider = $filter('filter')($scope.providers, { type: response.Data[i].Type });
- if (provider.length) {
- provider[0].enabled = true;
+ var provider = $filter('filter')($scope.providers, { type: response.Data[i].Type });
+ if (provider.length) {
+ provider[0].enabled = true;
+ }
}
}
+
+ return;
});
$scope.edit = function (provider) {
+ if (!$scope.premium && !provider.free) {
+ $uibModal.open({
+ animation: true,
+ templateUrl: 'app/views/premiumRequired.html',
+ controller: 'premiumRequiredController'
+ });
+ return;
+ }
+
if (provider.type === constants.twoFactorProvider.authenticator) {
typeName = 'Authenticator';
}
diff --git a/src/app/settings/views/settingsPremium.html b/src/app/settings/views/settingsPremium.html
index 2845ff1f63..633128f541 100644
--- a/src/app/settings/views/settingsPremium.html
+++ b/src/app/settings/views/settingsPremium.html
@@ -11,7 +11,7 @@
-
- 1 GB of encrypted file storage
+ 1 GB of encrypted file storage.
-
diff --git a/src/app/settings/views/settingsTwoStep.html b/src/app/settings/views/settingsTwoStep.html
index b930ff97d7..a26e405ee4 100644
--- a/src/app/settings/views/settingsTwoStep.html
+++ b/src/app/settings/views/settingsTwoStep.html
@@ -25,14 +25,17 @@
-
+
+
+
|
{{::provider.name}}
+ PREMIUM
{{::provider.description}}
|
-
{{provider.enabled ? 'Enabled' : 'Disabled'}}
diff --git a/src/app/vault/vaultController.js b/src/app/vault/vaultController.js
index 3e03652105..dde646c4d4 100644
--- a/src/app/vault/vaultController.js
+++ b/src/app/vault/vaultController.js
@@ -200,22 +200,35 @@
};
$scope.attachments = function (login) {
- if (!cryptoService.getEncKey()) {
- toastr.error('You cannot use this feature until you update your encryption key.', 'Feature Unavailable');
- return;
- }
-
- var addModel = $uibModal.open({
- animation: true,
- templateUrl: 'app/vault/views/vaultAttachments.html',
- controller: 'vaultAttachmentsController',
- resolve: {
- loginId: function () { return login.id; }
+ authService.getUserProfile().then(function (profile) {
+ return profile.premium;
+ }).then(function (isPremium) {
+ if (!isPremium) {
+ $uibModal.open({
+ animation: true,
+ templateUrl: 'app/views/premiumRequired.html',
+ controller: 'premiumRequiredController'
+ });
+ return;
}
- });
- addModel.result.then(function (data) {
+ if (!cryptoService.getEncKey()) {
+ toastr.error('You cannot use this feature until you update your encryption key.', 'Feature Unavailable');
+ return;
+ }
+ var addModel = $uibModal.open({
+ animation: true,
+ templateUrl: 'app/vault/views/vaultAttachments.html',
+ controller: 'vaultAttachmentsController',
+ resolve: {
+ loginId: function () { return login.id; }
+ }
+ });
+
+ addModel.result.then(function (data) {
+
+ });
});
};
diff --git a/src/app/views/premiumRequired.html b/src/app/views/premiumRequired.html
new file mode 100644
index 0000000000..38939f064c
--- /dev/null
+++ b/src/app/views/premiumRequired.html
@@ -0,0 +1,36 @@
+
+
+ This features requires a premium membership. Sign up for premium and get:
+
+ -
+
+ 1 GB of encrypted file storage.
+
+ -
+
+ Additional two-step login options such as YubiKey, FIDO U2F, and Duo.
+
+ -
+
+ TOTP verification code (2FA) generator for logins in your vault.
+
+ -
+
+ Priority customer support.
+
+ -
+
+ All future premium features. More coming soon!
+
+
+ All for just {{10 | currency:"$":0}} /year.
+
+
\ No newline at end of file
diff --git a/src/index.html b/src/index.html
index 68884a6cad..21b2aad84c 100644
--- a/src/index.html
+++ b/src/index.html
@@ -143,6 +143,7 @@
+
diff --git a/src/less/vault.less b/src/less/vault.less
index 49bc7f31ab..13123b2fec 100644
--- a/src/less/vault.less
+++ b/src/less/vault.less
@@ -261,6 +261,7 @@ form .btn .loading-icon {
}
/* Forms */
+
.form-control {
border-radius: 0 !important;
}
@@ -353,11 +354,6 @@ form .btn .loading-icon {
vertical-align: middle !important;
}
-.table td .label {
- font-size: 85%;
- font-weight: normal;
-}
-
.box-header.with-border + .box-body .table > tbody > tr:first-child > td {
border-top: 0;
}
@@ -623,3 +619,8 @@ h1, h2, h3, h4, h5, h6 {
border: none;
}
}
+
+.label-full {
+ font-size: 85%;
+ font-weight: normal;
+}
|