accept org invite. return state for login
This commit is contained in:
parent
0b875fc6f7
commit
9f1ab6f961
|
@ -3,6 +3,7 @@ angular
|
||||||
|
|
||||||
.controller('accountsLoginController', function ($scope, $rootScope, $cookies, apiService, cryptoService, authService,
|
.controller('accountsLoginController', function ($scope, $rootScope, $cookies, apiService, cryptoService, authService,
|
||||||
$state, appSettings, $analytics) {
|
$state, appSettings, $analytics) {
|
||||||
|
var returnState = $state.params.returnState;
|
||||||
var rememberedEmail = $cookies.get(appSettings.rememberedEmailCookieName);
|
var rememberedEmail = $cookies.get(appSettings.rememberedEmailCookieName);
|
||||||
if (rememberedEmail) {
|
if (rememberedEmail) {
|
||||||
$scope.model = {
|
$scope.model = {
|
||||||
|
@ -36,11 +37,11 @@ angular
|
||||||
masterPassword = model.masterPassword;
|
masterPassword = model.masterPassword;
|
||||||
|
|
||||||
$analytics.eventTrack('Logged In To Two-step');
|
$analytics.eventTrack('Logged In To Two-step');
|
||||||
$state.go('frontend.login.twoFactor');
|
$state.go('frontend.login.twoFactor', { returnState: returnState });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$analytics.eventTrack('Logged In');
|
$analytics.eventTrack('Logged In');
|
||||||
$state.go('backend.user.vault');
|
loggedInGo();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -51,7 +52,16 @@ angular
|
||||||
|
|
||||||
$scope.twoFactorPromise.then(function () {
|
$scope.twoFactorPromise.then(function () {
|
||||||
$analytics.eventTrack('Logged In From Two-step');
|
$analytics.eventTrack('Logged In From Two-step');
|
||||||
$state.go('backend.user.vault');
|
loggedInGo();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function loggedInGo() {
|
||||||
|
if (returnState) {
|
||||||
|
$state.go(returnState.name, returnState.params);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$state.go('backend.user.vault');
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
angular
|
||||||
|
.module('bit.accounts')
|
||||||
|
|
||||||
|
.controller('accountsOrganizationAcceptController', function ($scope, $state, apiService, authService, toastr) {
|
||||||
|
$scope.state = {
|
||||||
|
name: $state.current.name,
|
||||||
|
params: $state.params
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!$state.params.organizationId || !$state.params.organizationUserId || !$state.params.token) {
|
||||||
|
$state.go('frontend.login.info').then(function () {
|
||||||
|
toastr.error('Invalid parameters.');
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.$on('$viewContentLoaded', function () {
|
||||||
|
if (authService.isAuthenticated()) {
|
||||||
|
$scope.accepting = true;
|
||||||
|
apiService.organizationUsers.accept(
|
||||||
|
{
|
||||||
|
orgId: $state.params.organizationId,
|
||||||
|
id: $state.params.organizationUserId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token: $state.params.token
|
||||||
|
}, function () {
|
||||||
|
$state.go('backend.user.vault', null, { location: 'replace' }).then(function () {
|
||||||
|
toastr.success('You can access this organization once an administrator confirms your membership.' +
|
||||||
|
' We\'ll send an email when that happens.', 'Invite Accepted');
|
||||||
|
});
|
||||||
|
}, function () {
|
||||||
|
$state.go('backend.user.vault', null, { location: 'replace' }).then(function () {
|
||||||
|
toastr.error('Unable to accept invitation.', 'Error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$scope.loading = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.submit = function (model) {
|
||||||
|
|
||||||
|
};
|
||||||
|
});
|
|
@ -1,9 +1,11 @@
|
||||||
angular
|
angular
|
||||||
.module('bit.accounts')
|
.module('bit.accounts')
|
||||||
|
|
||||||
.controller('accountsRegisterController', function ($scope, $location, apiService, cryptoService, validationService, $analytics) {
|
.controller('accountsRegisterController', function ($scope, $location, apiService, cryptoService, validationService,
|
||||||
|
$analytics, $state) {
|
||||||
var params = $location.search();
|
var params = $location.search();
|
||||||
|
|
||||||
|
$scope.returnState = $state.params.returnState;
|
||||||
$scope.success = false;
|
$scope.success = false;
|
||||||
$scope.model = {
|
$scope.model = {
|
||||||
email: params.email
|
email: params.email
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<div class="login-box">
|
||||||
|
<div class="login-logo">
|
||||||
|
<i class="fa fa-shield"></i> <b>bit</b>warden
|
||||||
|
</div>
|
||||||
|
<div class="login-box-body">
|
||||||
|
<div ng-show="loading">
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
|
<div ng-show="accepting">
|
||||||
|
Accepting invitation...
|
||||||
|
</div>
|
||||||
|
<div ng-show="!loading && !accepting">
|
||||||
|
<p class="login-box-msg">Join Organization</p>
|
||||||
|
<p>
|
||||||
|
You've been invited to join the ____ organization. To accept the invitation, you need to log in or
|
||||||
|
create a new bitwarden account.
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<p><a ui-sref="frontend.login.info({returnState: state})" class="btn btn-primary btn-block btn-flat">Log In</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<p><a ui-sref="frontend.register({returnState: state})" class="btn btn-primary btn-block btn-flat">Create Account</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -9,7 +9,7 @@
|
||||||
<h4>Account Created!</h4>
|
<h4>Account Created!</h4>
|
||||||
<p>You may now log in to your new account.</p>
|
<p>You may now log in to your new account.</p>
|
||||||
</div>
|
</div>
|
||||||
<a ui-sref="frontend.login.info">Ready to log in?</a>
|
<a ui-sref="frontend.login.info({returnState: returnState})">Ready to log in?</a>
|
||||||
</div>
|
</div>
|
||||||
<form name="registerForm" ng-submit="registerForm.$valid && register(registerForm)" ng-show="!success"
|
<form name="registerForm" ng-submit="registerForm.$valid && register(registerForm)" ng-show="!success"
|
||||||
api-form="registerPromise">
|
api-form="registerPromise">
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-7">
|
<div class="col-xs-7">
|
||||||
<a ui-sref="frontend.login.info">Already have an account?</a>
|
<a ui-sref="frontend.login.info({returnState: returnState})">Already have an account?</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-5">
|
<div class="col-xs-5">
|
||||||
<button type="submit" class="btn btn-primary btn-block btn-flat" ng-disabled="registerForm.$loading">
|
<button type="submit" class="btn btn-primary btn-block btn-flat" ng-disabled="registerForm.$loading">
|
||||||
|
|
|
@ -149,6 +149,9 @@ angular
|
||||||
.state('frontend.login', {
|
.state('frontend.login', {
|
||||||
templateUrl: 'app/accounts/views/accountsLogin.html',
|
templateUrl: 'app/accounts/views/accountsLogin.html',
|
||||||
controller: 'accountsLoginController',
|
controller: 'accountsLoginController',
|
||||||
|
params: {
|
||||||
|
returnState: null
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
bodyClass: 'login-page'
|
bodyClass: 'login-page'
|
||||||
}
|
}
|
||||||
|
@ -197,21 +200,38 @@ angular
|
||||||
url: '^/register',
|
url: '^/register',
|
||||||
templateUrl: 'app/accounts/views/accountsRegister.html',
|
templateUrl: 'app/accounts/views/accountsRegister.html',
|
||||||
controller: 'accountsRegisterController',
|
controller: 'accountsRegisterController',
|
||||||
|
params: {
|
||||||
|
returnState: null
|
||||||
|
},
|
||||||
data: {
|
data: {
|
||||||
pageTitle: 'Register',
|
pageTitle: 'Register',
|
||||||
bodyClass: 'register-page'
|
bodyClass: 'register-page'
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.state('frontend.organizationAccept', {
|
||||||
|
url: '^/accept-organization?organizationId&organizationUserId&token',
|
||||||
|
templateUrl: 'app/accounts/views/accountsOrganizationAccept.html',
|
||||||
|
controller: 'accountsOrganizationAcceptController',
|
||||||
|
data: {
|
||||||
|
pageTitle: 'Accept Organization Invite',
|
||||||
|
bodyClass: 'login-page',
|
||||||
|
skipAuthorize: true
|
||||||
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.run(function ($rootScope, authService, $state) {
|
.run(function ($rootScope, authService, $state) {
|
||||||
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
|
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
|
||||||
if (!toState.data || !toState.data.authorize) {
|
if (!toState.data || !toState.data.authorize) {
|
||||||
if (authService.isAuthenticated()) {
|
if (toState.data && toState.data.skipAuthorize) {
|
||||||
event.preventDefault();
|
return;
|
||||||
$state.go('backend.user.vault');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
if (!authService.isAuthenticated()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
$state.go('backend.user.vault');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!authService.isAuthenticated()) {
|
if (!authService.isAuthenticated()) {
|
||||||
|
|
|
@ -108,6 +108,7 @@
|
||||||
<script src="app/accounts/accountsRegisterController.js"></script>
|
<script src="app/accounts/accountsRegisterController.js"></script>
|
||||||
<script src="app/accounts/accountsPasswordHintController.js"></script>
|
<script src="app/accounts/accountsPasswordHintController.js"></script>
|
||||||
<script src="app/accounts/accountsRecoverController.js"></script>
|
<script src="app/accounts/accountsRecoverController.js"></script>
|
||||||
|
<script src="app/accounts/accountsOrganizationAcceptController.js"></script>
|
||||||
|
|
||||||
<script src="app/vault/vaultModule.js"></script>
|
<script src="app/vault/vaultModule.js"></script>
|
||||||
<script src="app/vault/vaultController.js"></script>
|
<script src="app/vault/vaultController.js"></script>
|
||||||
|
|
Loading…
Reference in New Issue