mirror of
https://github.com/bitwarden/web
synced 2025-12-15 07:43:16 +00:00
5 lines
129 KiB
JavaScript
5 lines
129 KiB
JavaScript
angular.module("bit",["ui.router","ngMessages","angular-jwt","ui.bootstrap.showErrors","toastr","angulartics","angulartics.google.analytics","angular-stripe","credit-cards","bit.directives","bit.filters","bit.services","bit.global","bit.accounts","bit.vault","bit.settings","bit.tools","bit.organization"]),angular.module("bit").constant("appSettings",{apiUri:"https://api.bitwarden.com",identityUri:"https://identity.bitwarden.com",version:"1.10.2",environment:"Production"}),angular.module("bit.accounts",["ui.bootstrap","ngCookies"]),angular.module("bit.directives",[]),angular.module("bit.filters",[]),angular.module("bit.global",[]),angular.module("bit.organization",["ui.bootstrap"]),angular.module("bit.services",["ngResource","ngStorage","angular-jwt"]),angular.module("bit.settings",["ui.bootstrap","toastr"]),angular.module("bit.tools",["ui.bootstrap","toastr"]),angular.module("bit.vault",["ui.bootstrap","ngclipboard"]),angular.module("bit").factory("apiInterceptor",["$injector","$q","toastr",function(e,t,n){return{request:function(e){return e},response:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){n.warning("Your login session has expired.","Logged out")})),o||t.when(o)},responseError:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){n.warning("Your login session has expired.","Logged out")})),t.reject(o)}}}]),angular.module("bit").config(["$stateProvider","$urlRouterProvider","$httpProvider","jwtInterceptorProvider","jwtOptionsProvider","$uibTooltipProvider","toastrConfig","$locationProvider","$qProvider","stripeProvider",function(e,t,n,o,a,r,i,l,s,c){s.errorOnUnhandledRejections(!1),l.hashPrefix(""),a.config({urlParam:"access_token3",whiteListedDomains:["api.bitwarden.com","preview-api.bitwarden.com","localhost","192.168.1.8"]});var d;o.tokenGetter=["options","appSettings","tokenService","authService",function(e,t,n,o){if(0===e.url.indexOf(t.apiUri)){if(d)return d;var a=n.getToken();if(a)return n.tokenNeedsRefresh(a)?d=o.refreshAccessToken().then(function(e){return d=null,e||a}):a}}],c.setPublishableKey("pk_live_bpN0P37nMxrMQkcaHXtAybJk"),angular.extend(i,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),r.options({popupDelay:600,appendToBody:!0}),n.defaults.headers.post&&(n.defaults.headers.post={}),n.defaults.headers.post["Content-Type"]="text/plain; charset=utf-8",n.interceptors.push("apiInterceptor"),n.interceptors.push("jwtInterceptor"),t.otherwise("/"),e.state("backend",{templateUrl:"app/views/backendLayout.html",abstract:!0,data:{authorize:!0}}).state("backend.user",{templateUrl:"app/views/userLayout.html",abstract:!0}).state("backend.user.vault",{url:"^/vault",templateUrl:"app/vault/views/vault.html",controller:"vaultController",data:{pageTitle:"My Vault"},params:{refreshFromServer:!1}}).state("backend.user.shared",{url:"^/shared",templateUrl:"app/vault/views/vaultShared.html",controller:"vaultSharedController",data:{pageTitle:"Shared"}}).state("backend.user.settings",{url:"^/settings",templateUrl:"app/settings/views/settings.html",controller:"settingsController",data:{pageTitle:"Settings"}}).state("backend.user.settingsDomains",{url:"^/settings/domains",templateUrl:"app/settings/views/settingsDomains.html",controller:"settingsDomainsController",data:{pageTitle:"Domain Settings"}}).state("backend.user.settingsCreateOrg",{url:"^/settings/create-organization",templateUrl:"app/settings/views/settingsCreateOrganization.html",controller:"settingsCreateOrganizationController",data:{pageTitle:"Create Organization"}}).state("backend.user.tools",{url:"^/tools",templateUrl:"app/tools/views/tools.html",controller:"toolsController",data:{pageTitle:"Tools"}}).state("backend.user.apps",{url:"^/apps",templateUrl:"app/views/apps.html",controller:"appsController",data:{pageTitle:"Get the Apps"}}).state("backend.org",{templateUrl:"app/views/organizationLayout.html",abstract:!0}).state("backend.org.dashboard",{url:"^/organization/:orgId",templateUrl:"app/organization/views/organizationDashboard.html",controller:"organizationDashboardController",data:{pageTitle:"Organization Dashboard"}}).state("backend.org.people",{url:"/organization/:orgId/people",templateUrl:"app/organization/views/organizationPeople.html",controller:"organizationPeopleController",data:{pageTitle:"Organization People"}}).state("backend.org.collections",{url:"/organization/:orgId/collections",templateUrl:"app/organization/views/organizationCollections.html",controller:"organizationCollectionsController",data:{pageTitle:"Organization Collections"}}).state("backend.org.settings",{url:"/organization/:orgId/settings",templateUrl:"app/organization/views/organizationSettings.html",controller:"organizationSettingsController",data:{pageTitle:"Organization Settings"}}).state("backend.org.billing",{url:"/organization/:orgId/billing",templateUrl:"app/organization/views/organizationBilling.html",controller:"organizationBillingController",data:{pageTitle:"Organization Billing"}}).state("backend.org.vault",{url:"/organization/:orgId/vault",templateUrl:"app/organization/views/organizationVault.html",controller:"organizationVaultController",data:{pageTitle:"Organization Vault"}}).state("backend.org.groups",{url:"/organization/:orgId/groups",templateUrl:"app/organization/views/organizationGroups.html",controller:"organizationGroupsController",data:{pageTitle:"Organization Groups"}}).state("frontend",{templateUrl:"app/views/frontendLayout.html",abstract:!0,data:{authorize:!1}}).state("frontend.login",{templateUrl:"app/accounts/views/accountsLogin.html",controller:"accountsLoginController",params:{returnState:null,email:null},data:{bodyClass:"login-page"}}).state("frontend.login.info",{url:"^/?org",templateUrl:"app/accounts/views/accountsLoginInfo.html",data:{pageTitle:"Log In"}}).state("frontend.login.twoFactor",{url:"^/two-factor",templateUrl:"app/accounts/views/accountsLoginTwoFactor.html",data:{pageTitle:"Log In (Two Factor)",authorizeTwoFactor:!0}}).state("frontend.logout",{url:"^/logout",controller:"accountsLogoutController",data:{authorize:!0}}).state("frontend.passwordHint",{url:"^/password-hint",templateUrl:"app/accounts/views/accountsPasswordHint.html",controller:"accountsPasswordHintController",data:{pageTitle:"Master Password Hint",bodyClass:"login-page"}}).state("frontend.recover",{url:"^/recover",templateUrl:"app/accounts/views/accountsRecover.html",controller:"accountsRecoverController",data:{pageTitle:"Recover Account",bodyClass:"login-page"}}).state("frontend.register",{url:"^/register?org",templateUrl:"app/accounts/views/accountsRegister.html",controller:"accountsRegisterController",params:{returnState:null,email:null},data:{pageTitle:"Register",bodyClass:"register-page"}}).state("frontend.organizationAccept",{url:"^/accept-organization?organizationId&organizationUserId&token&email&organizationName",templateUrl:"app/accounts/views/accountsOrganizationAccept.html",controller:"accountsOrganizationAcceptController",data:{pageTitle:"Accept Organization Invite",bodyClass:"login-page",skipAuthorize:!0}})}]).run(["$rootScope","authService","$state",function(e,t,n){e.$on("$stateChangeSuccess",function(){$("html, body").animate({scrollTop:0},200)}),e.$on("$stateChangeStart",function(o,a,r){if(!a.data||!a.data.authorize){if(a.data&&a.data.skipAuthorize)return;if(!t.isAuthenticated())return;return o.preventDefault(),void n.go("backend.user.vault")}if(!t.isAuthenticated())return o.preventDefault(),t.logOut(),void n.go("frontend.login.info");a.name.indexOf("backend.org.")>-1&&r.orgId&&(e.vaultLogins=e.vaultFolders=null,t.getUserProfile().then(function(e){var t=e.organizations;t&&r.orgId in t&&2===t[r.orgId].status&&2!==t[r.orgId].type||(o.preventDefault(),n.go("backend.user.vault"))}))})}]),angular.module("bit").constant("constants",{rememberedEmailCookieName:"bit.rememberedEmail",encType:{AesCbc256_B64:0,AesCbc128_HmacSha256_B64:1,AesCbc256_HmacSha256_B64:2,Rsa2048_OaepSha256_B64:3,Rsa2048_OaepSha1_B64:4},orgUserType:{owner:0,admin:1,user:2},orgUserStatus:{invited:0,accepted:1,confirmed:2},plans:{free:{basePrice:0,noAdditionalSeats:!0,noPayment:!0,upgradeSortOrder:-1},personal:{basePrice:1,annualBasePrice:12,baseSeats:5,seatPrice:1,annualSeatPrice:12,maxAdditionalSeats:5,annualPlanType:"personalAnnually",upgradeSortOrder:1},teams:{basePrice:5,annualBasePrice:60,monthlyBasePrice:8,baseSeats:5,seatPrice:2,annualSeatPrice:24,monthlySeatPrice:2.5,monthPlanType:"teamsMonthly",annualPlanType:"teamsAnnually",upgradeSortOrder:2}}}),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","constants","$analytics",function(e,t,n,o,a,r,i,l,s){function c(){d?i.go(d.name,d.params):i.go("backend.user.vault")}e.state=i;var d;d=!i.params.returnState&&i.params.org?{name:"backend.user.settingsCreateOrg",params:{plan:i.params.org}}:i.params.returnState;var u=n.get(l.rememberedEmailCookieName);(u||i.params.email)&&(e.model={email:i.params.email?i.params.email:u,rememberEmail:null!==u});var p,g;e.login=function(t){e.loginPromise=r.logIn(t.email,t.masterPassword),e.loginPromise.then(function(e){if(t.rememberEmail){var o=new Date;o.setFullYear(o.getFullYear()+10),n.put(l.rememberedEmailCookieName,t.email,{expires:o})}else n.remove(l.rememberedEmailCookieName);e&&e.length>0?(p=t.email,g=t.masterPassword,s.eventTrack("Logged In To Two-step"),i.go("frontend.login.twoFactor",{returnState:d})):(s.eventTrack("Logged In"),c())})},e.twoFactor=function(t){e.twoFactorPromise=r.logIn(p,g,t.code,0),e.twoFactorPromise.then(function(){s.eventTrack("Logged In From Two-step"),c()})}}]),angular.module("bit.accounts").controller("accountsLogoutController",["$scope","authService","$state","$analytics",function(e,t,n,o){t.logOut(),o.eventTrack("Logged Out"),n.go("frontend.login.info")}]),angular.module("bit.accounts").controller("accountsOrganizationAcceptController",["$scope","$state","apiService","authService","toastr","$analytics",function(e,t,n,o,a,r){if(e.state={name:t.current.name,params:t.params},!(t.params.organizationId&&t.params.organizationUserId&&t.params.token&&t.params.email&&t.params.organizationName))return void t.go("frontend.login.info").then(function(){a.error("Invalid parameters.")});e.$on("$viewContentLoaded",function(){o.isAuthenticated()?(e.accepting=!0,n.organizationUsers.accept({orgId:t.params.organizationId,id:t.params.organizationUserId},{token:t.params.token},function(){r.eventTrack("Accepted Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){a.success("You can access this organization once an administrator confirms your membership. We'll send an email when that happens.","Invite Accepted",{timeOut:1e4})})},function(){r.eventTrack("Failed To Accept Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){a.error("Unable to accept invitation.","Error")})})):e.loading=!1}),e.submit=function(e){}}]),angular.module("bit.accounts").controller("accountsPasswordHintController",["$scope","$rootScope","apiService","$analytics",function(e,t,n,o){e.success=!1,e.submit=function(t){e.submitPromise=n.accounts.postPasswordHint({email:t.email},function(){o.eventTrack("Requested Password Hint"),e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRecoverController",["$scope","apiService","cryptoService","$analytics",function(e,t,n,o){e.success=!1,e.submit=function(a){var r=a.email.toLowerCase(),i=n.makeKey(a.masterPassword,r),l={email:r,masterPasswordHash:n.hashPassword(a.masterPassword,i),recoveryCode:a.code.replace(/\s/g,"").toLowerCase()};e.submitPromise=t.accounts.postTwoFactorRecover(l,function(){o.eventTrack("Recovered 2FA"),e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRegisterController",["$scope","$location","apiService","cryptoService","validationService","$analytics","$state",function(e,t,n,o,a,r,i){var l=t.search(),s=i.params;e.createOrg=s.org,!s.returnState&&s.org?e.returnState={name:"backend.user.settingsCreateOrg",params:{plan:i.params.org}}:e.returnState=s.returnState,e.success=!1,e.model={email:l.email?l.email:s.email},e.readOnlyEmail=null!==s.email,e.registerPromise=null,e.register=function(t){var i=!1;if(e.model.masterPassword.length<8&&(a.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),i=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(a.addError(t,"ConfirmMasterPassword","Master password confirmation does not match.",!0),i=!0),!i){var l=e.model.email.toLowerCase(),s=o.makeKey(e.model.masterPassword,l);e.registerPromise=o.makeKeyPair(s).then(function(t){var a={name:e.model.name,email:l,masterPasswordHash:o.hashPassword(e.model.masterPassword,s),masterPasswordHint:e.model.masterPasswordHint,keys:{publicKey:t.publicKey,encryptedPrivateKey:t.privateKeyEnc}};return n.accounts.register(a).$promise},function(e){return a.addError(t,null,"Problem generating keys.",!0),!1}).then(function(t){!1!==t&&(e.success=!0,r.eventTrack("Registered"))})}}}]),angular.module("bit.directives").directive("apiField",function(){var e=function(e,t,n,o){function a(){return o.$setValidity("api",!0),!0}function r(){o.$setValidity("api",!1)}o.$registerApiError=r,o.$validators.apiValidate=a};return{require:"ngModel",restrict:"A",compile:function(t,n){if(!n.name||""===n.name)throw"api-field element does not have a valid name attribute";return e}}}),angular.module("bit.directives").directive("apiForm",["$rootScope","validationService",function(e,t){function n(e,n,o){o&&o.then&&(e.$errors=null,e.$loading=!0,o.then(function(t){e.$loading=!1},function(o){e.$loading=!1,t.addErrors(e,o),n.$broadcast("show-errors-check-validity"),$("html, body").animate({scrollTop:0},200)}))}return{require:"form",restrict:"A",link:function(e,t,o,a){var r=o.apiForm||null;void 0!==r&&e.$watch(r,n.bind(null,a,e))}}}]),angular.module("bit.directives").directive("letterAvatar",function(){function e(e){var t=0,n=0;for(n=0;n<e.length;n++)t=e.charCodeAt(n)+((t<<5)-t);var o="#";for(n=0;n<3;n++){o+=("00"+(t>>8*n&255).toString(16)).substr(-2)}return o}function t(e,t){var n=e.split(" ");if(n&&n.length>1){for(var o="",a=0;a<t;a++)o+=n[a].substr(0,1);return o}return null}function n(e,t,n){return angular.element("<svg></svg>").attr({xmlns:"http://www.w3.org/2000/svg","pointer-events":"none",width:e,height:t}).css({"background-color":n,width:e+"px",height:t+"px"})}function o(e,t,n,o,a){return angular.element('<text text-anchor="middle"></text>').attr({y:"50%",x:"50%",dy:"0.35em","pointer-events":"auto",fill:t,"font-family":n}).text(e).css({"font-weight":o,"font-size":a+"px"})}return{restrict:"AE",replace:!0,scope:{data:"@"},link:function(a,r,i){function l(){var i=null,l=a.data.toUpperCase();s.charCount>1&&(i=t(l,s.charCount)),i||(i=l.substr(0,s.charCount));var c=o(i,s.textColor,s.fontFamily,s.fontWeight,s.fontSize),d=s.bgColor?s.bgColor:e(l),u=n(s.width,s.height,d);u.append(c);var p=angular.element("<div>").append(u).html(),g=window.btoa(unescape(encodeURIComponent(p))),m="data:image/svg+xml;base64,"+g,f=angular.element("<img>").attr({src:m,title:a.data});"true"===s.round&&f.css("border-radius","50%"),"true"===s.border&&f.css("border",s.borderStyle),s.class&&f.addClass(s.class),"true"===s.dynamic?(r.empty(),r.append(f)):r.replaceWith(f)}var s={charCount:i.charcount||2,data:i.data,textColor:i.textcolor||"#ffffff",bgColor:i.bgcolor,height:i.avheight||45,width:i.avwidth||45,fontSize:i.fontsize||20,fontWeight:i.fontweight||300,fontFamily:i.fontfamily||"Open Sans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif",round:i.round||"true",dynamic:i.dynamic||"true",class:i.avclass||"",border:i.avborder||"false",borderStyle:i.borderstyle||"3px solid white"};"true"===s.dynamic?a.$watch("data",function(){l()}):l()}}}),angular.module("bit.directives").directive("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(n,o,a,r){t.getUserProfile().then(function(t){r.$parsers.unshift(function(n){if(n){var o=e.makeKey(n,t.email),a=o.keyB64===e.getKey().keyB64;return r.$setValidity("masterPassword",a),a?n:void 0}}),r.$formatters.unshift(function(n){if(n){var o=e.makeKey(n,t.email),a=o.keyB64===e.getKey().keyB64;return r.$setValidity("masterPassword",a),n}})})}}}]),angular.module("bit.directives").directive("pageTitle",["$rootScope","$timeout","appSettings",function(e,t,n){return{link:function(n,o){var a=function(e,n,a,r,i){var l="bitwarden Password Manager";n.data&&n.data.pageTitle&&(l=n.data.pageTitle+" - bitwarden Password Manager"),t(function(){o.text(l)})};e.$on("$stateChangeStart",a)}}}]),angular.module("bit.directives").directive("passwordMeter",function(){return{template:'<div class="progress {{outerClass}}"><div class="progress-bar progress-bar-{{valueClass}}" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="100" ng-style="{width : ( value + \'%\' ) }"><span class="sr-only">{{value}}%</span></div></div>',restrict:"A",scope:{password:"=passwordMeter",username:"=passwordMeterUsername",outerClass:"@?"},link:function(e){var t=function(e,t){if(!t||t===e)return 0;var n=t.length;return e&&""!==e&&(-1!==e.indexOf(t)&&(n-=15),-1!==t.indexOf(e)&&(n-=e.length)),t.length>0&&t.length<=4?n+=t.length:t.length>=5&&t.length<=7?n+=6:t.length>=8&&t.length<=15?n+=12:t.length>=16&&(n+=18),t.match(/[a-z]/)&&(n+=1),t.match(/[A-Z]/)&&(n+=5),t.match(/\d/)&&(n+=5),t.match(/.*\d.*\d.*\d/)&&(n+=5),t.match(/[!,@,#,$,%,^,&,*,?,_,~]/)&&(n+=5),t.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)&&(n+=5),t.match(/(?=.*[a-z])(?=.*[A-Z])/)&&(n+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)&&(n+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)&&(n+=2),n=Math.round(2*n),Math.max(0,Math.min(100,n))},n=function(e){switch(Math.round(e/33)){case 0:case 1:return"danger";case 2:return"warning";case 3:return"success"}},o=function(e){e.value=t(e.username,e.password),e.valueClass=n(e.value)};e.$watch("password",function(){o(e)}),e.$watch("username",function(){o(e)})}}}),angular.module("bit.directives").directive("passwordViewer",function(){return{restrict:"A",link:function(e,t,n){var o=n.passwordViewer;o&&(t.onclick=function(e){},t.on("click",function(e){var n=$(o);n&&"password"===n.attr("type")?(t.removeClass("fa-eye").addClass("fa-eye-slash"),n.attr("type","text")):n&&"text"===n.attr("type")&&(t.removeClass("fa-eye-slash").addClass("fa-eye"),n.attr("type","password"))}))}}}),angular.module("bit.filters").filter("enumLabelClass",function(){return function(e,t){if("number"!=typeof e)return e.toString();var n;switch(t){case"OrgUserStatus":switch(e){case 0:n="label-default";break;case 1:n="label-warning";break;case 2:default:n="label-success"}break;default:n="label-default"}return n}}),angular.module("bit.filters").filter("enumName",function(){return function(e,t){if("number"!=typeof e)return e.toString();var n;switch(t){case"OrgUserStatus":switch(e){case 0:n="Invited";break;case 1:n="Accepted";break;case 2:default:n="Confirmed"}break;case"OrgUserType":switch(e){case 0:n="Owner";break;case 1:n="Admin";break;case 2:default:n="User"}break;default:n=e.toString()}return n}}),angular.module("bit.global").controller("appsController",["$scope","$state",function(e,t){}]),angular.module("bit.global").controller("mainController",["$scope","$state","authService","appSettings","toastr","$window","$document",function(e,t,n,o,a,r,i){var l=this;l.bodyClass="",l.searchVaultText=null,l.version=o.version,e.currentYear=(new Date).getFullYear(),e.$on("$viewContentLoaded",function(){n.getUserProfile().then(function(e){l.userProfile=e}),$.AdminLTE&&($.AdminLTE.layout&&($.AdminLTE.layout.fix(),$.AdminLTE.layout.fixSidebar()),$.AdminLTE.pushMenu&&$.AdminLTE.pushMenu.expandOnHover(),$(document).off("click",".sidebar li a"))}),e.$on("$stateChangeSuccess",function(e,t,n,o,a){if(l.searchVaultText=null,t.data.bodyClass)return void(l.bodyClass=t.data.bodyClass);l.bodyClass=""}),e.addLogin=function(){e.$broadcast("vaultAddLogin")},e.addFolder=function(){e.$broadcast("vaultAddFolder")},e.addOrganizationLogin=function(){e.$broadcast("organizationVaultAddLogin")},e.addOrganizationCollection=function(){e.$broadcast("organizationCollectionsAdd")},e.inviteOrganizationUser=function(){e.$broadcast("organizationPeopleInvite")};var s,c,d,u={scrollbarWidth:function(){if(!s){var e=$("body");e.addClass("bit-position-body-scrollbar-measure"),s=r.innerWidth-e[0].clientWidth,s=isFinite(s)?s:0,e.removeClass("bit-position-body-scrollbar-measure")}return s},scrollbarInfo:function(){return{width:u.scrollbarWidth(),visible:i.height()>$(r).height()}}};$(window).on("show.bs.dropdown",function(e){var t=d=$(e.target),n=t.data("appendTo");if(!n)return!0;c=t.find(".dropdown-menu"),$(n).append(c.detach());var o=t.offset(),a={display:"block",top:o.top+t.outerHeight()};if(c.hasClass("dropdown-menu-right")){var i=u.scrollbarInfo(),l=0;i.visible&&i.width&&(l=i.width),a.right=r.innerWidth-l-(o.left+t.prop("offsetWidth"))+"px",a.left="auto"}else a.left=o.left+"px",a.right="auto";c.css(a)}),$(window).on("hide.bs.dropdown",function(e){if(!c)return!0;$(e.target).append(c.detach()),c.hide(),c=null,d=null}),e.$on("removeAppendedDropdownMenu",function(e,t){if(!c&&!d)return!0;d.append(c.detach()),c.hide(),c=null,d=null})}]),angular.module("bit.global").controller("sideNavController",["$scope","$state","authService","toastr","$analytics",function(e,t,n,o,a){e.$state=t,e.params=t.params,e.orgs=[],e.name="",n.getUserProfile().then(function(n){if(e.name=n.extended&&n.extended.name?n.extended.name:n.email,n.organizations)if(t.includes("backend.org")&&t.params.orgId in n.organizations)e.orgProfile=n.organizations[t.params.orgId];else{var o=[];for(var a in n.organizations)n.organizations.hasOwnProperty(a)&&(n.organizations[a].enabled||n.organizations[a].type<2)&&o.push(n.organizations[a]);e.orgs=o}}),e.viewOrganization=function(e){if(2===e.type)return void o.error("You cannot manage this organization.");a.eventTrack("View Organization From Side Nav"),t.go("backend.org.dashboard",{orgId:e.id})},e.searchVault=function(){t.go("backend.user.vault")},e.searchOrganizationVault=function(){t.go("backend.org.vault",{orgId:t.params.orgId})},e.isOrgOwner=function(e){return e&&0===e.type}}]),angular.module("bit.global").controller("topNavController",["$scope",function(e){}]),angular.module("bit.organization").controller("organizationBillingAdjustSeatsController",["$scope","$state","$uibModalInstance","apiService","$analytics","toastr","add",function(e,t,n,o,a,r,i){a.eventTrack("organizationBillingAdjustSeatsController",{category:"Modal"}),e.add=i,e.seatAdjustment=0,e.submit=function(){var l={seatAdjustment:e.seatAdjustment};i||(l.seatAdjustment*=-1),e.submitPromise=o.organizations.putSeat({id:t.params.orgId},l).$promise.then(function(t){i?(a.eventTrack("Added Seats"),r.success("You have added "+e.seatAdjustment+" seats.")):(a.eventTrack("Removed Seats"),r.success("You have removed "+e.seatAdjustment+" seats.")),n.close()})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingChangePaymentController",["$scope","$state","$uibModalInstance","apiService","stripe","$analytics","toastr","existingPaymentMethod",function(e,t,n,o,a,r,i,l){r.eventTrack("organizationBillingChangePaymentController",{category:"Modal"}),e.existingPaymentMethod=l,e.submit=function(){e.submitPromise=a.card.createToken(e.card).then(function(e){var n={paymentToken:e.id};return o.organizations.putPayment({id:t.params.orgId},n).$promise}).then(function(t){e.card=null,l?(r.eventTrack("Changed Payment Method"),i.success("You have changed your payment method.")):(r.eventTrack("Added Payment Method"),i.success("You have added a payment method.")),n.close()})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingChangePlanController",["$scope","$state","apiService","$uibModalInstance","toastr","$analytics",function(e,t,n,o,a,r){r.eventTrack("organizationBillingChangePlanController",{category:"Modal"}),e.submit=function(){},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingController",["$scope","apiService","$state","$uibModal","toastr","$analytics",function(e,t,n,o,a,r){function i(){t.organizations.getBilling({id:n.params.orgId},function(t){e.loading=!1,e.noSubscription=0===t.PlanType;var n=0;if(e.plan={name:t.Plan,type:t.PlanType,seats:t.Seats},e.subscription=null,t.Subscription&&(e.subscription={trialEndDate:t.Subscription.TrialEndDate,cancelledDate:t.Subscription.CancelledDate,status:t.Subscription.Status,cancelled:"cancelled"===t.Subscription.Status,markedForCancel:"active"===t.Subscription.Status&&t.Subscription.CancelledDate}),e.nextInvoice=null,t.UpcomingInvoice&&(e.nextInvoice={date:t.UpcomingInvoice.Date,amount:t.UpcomingInvoice.Amount}),t.Subscription&&t.Subscription.Items)for(e.subscription.items=[],n=0;n<t.Subscription.Items.length;n++)e.subscription.items.push({amount:t.Subscription.Items[n].Amount,name:t.Subscription.Items[n].Name,interval:t.Subscription.Items[n].Interval,qty:t.Subscription.Items[n].Quantity});e.paymentSource=null,t.PaymentSource&&(e.paymentSource={type:t.PaymentSource.Type,description:t.PaymentSource.Description,cardBrand:t.PaymentSource.CardBrand});var o=[];for(n=0;n<t.Charges.length;n++)o.push({date:t.Charges[n].CreatedDate,paymentSource:t.Charges[n].PaymentSource?t.Charges[n].PaymentSource.Description:"-",amount:t.Charges[n].Amount,status:t.Charges[n].Status,failureMessage:t.Charges[n].FailureMessage,refunded:t.Charges[n].Refunded,partiallyRefunded:t.Charges[n].PartiallyRefunded,refundedAmount:t.Charges[n].RefundedAmount,invoiceId:t.Charges[n].InvoiceId});e.charges=o})}e.charges=[],e.paymentSource=null,e.plan=null,e.subscription=null,e.loading=!0,e.$on("$viewContentLoaded",function(){i()}),e.changePayment=function(){o.open({animation:!0,templateUrl:"app/organization/views/organizationBillingChangePayment.html",controller:"organizationBillingChangePaymentController",resolve:{existingPaymentMethod:function(){return e.paymentSource?e.paymentSource.description:null}}}).result.then(function(){i()})},e.changePlan=function(){o.open({animation:!0,templateUrl:"app/organization/views/organizationBillingChangePlan.html",controller:"organizationBillingChangePlanController",resolve:{plan:function(){return e.plan}}}).result.then(function(){i()})},e.adjustSeats=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationBillingAdjustSeats.html",controller:"organizationBillingAdjustSeatsController",resolve:{add:function(){return e}}}).result.then(function(){i()})},e.cancel=function(){confirm("Are you sure you want to cancel? All users will lose access to the organization at the end of this billing cycle.")&&t.organizations.putCancel({id:n.params.orgId},{}).$promise.then(function(e){r.eventTrack("Canceled Plan"),a.success("Organization subscription has been canceled."),i()})},e.reinstate=function(){confirm("Are you sure you want to remove the cancellation request and reinstate this organization?")&&t.organizations.putReinstate({id:n.params.orgId},{}).$promise.then(function(e){r.eventTrack("Reinstated Plan"),a.success("Organization cancellation request has been removed."),i()})}}]),angular.module("bit.organization").controller("organizationCollectionsAddController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics",function(e,t,n,o,a,r){r.eventTrack("organizationCollectionsAddController",{category:"Modal"}),e.submit=function(i){var l=a.encryptCollection(i,t.params.orgId);e.submitPromise=o.collections.post({orgId:t.params.orgId},l,function(e){r.eventTrack("Created Collection");var o=a.decryptCollection(e,t.params.orgId,!0);n.close(o)}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationCollectionsController",["$scope","$state","apiService","$uibModal","cipherService","$filter","toastr","$analytics",function(e,t,n,o,a,r,i,l){function s(){n.collections.listOrganization({orgId:t.params.orgId},function(n){e.collections=a.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1})}e.collections=[],e.loading=!0,e.$on("$viewContentLoaded",function(){s()}),e.$on("organizationCollectionsAdd",function(t,n){e.add()}),e.add=function(){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsAdd.html",controller:"organizationCollectionsAddController"}).result.then(function(t){e.collections.push(t)})},e.edit=function(t){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsEdit.html",controller:"organizationCollectionsEditController",resolve:{id:function(){return t.id}}}).result.then(function(t){var n=r("filter")(e.collections,{id:t.id},!0);n&&n.length>0&&(n[0].name=t.name)})},e.users=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsUsers.html",controller:"organizationCollectionsUsersController",size:"lg",resolve:{collection:function(){return e}}}).result.then(function(){})},e.groups=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsGroups.html",controller:"organizationCollectionsGroupsController",resolve:{collection:function(){return e}}}).result.then(function(){})},e.delete=function(o){confirm("Are you sure you want to delete this collection ("+o.name+")?")&&n.collections.del({orgId:t.params.orgId,id:o.id},function(){var t=e.collections.indexOf(o);t>-1&&e.collections.splice(t,1),l.eventTrack("Deleted Collection"),i.success(o.name+" has been deleted.","Collection Deleted")},function(){i.error(o.name+" was not able to be deleted.","Error")})}}]),angular.module("bit.organization").controller("organizationCollectionsEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","id",function(e,t,n,o,a,r,i){r.eventTrack("organizationCollectionsEditController",{category:"Modal"}),e.collection={},n.opened.then(function(){o.collections.get({orgId:t.params.orgId,id:i},function(t){e.collection=a.decryptCollection(t)})}),e.submit=function(i){var l=a.encryptCollection(i,t.params.orgId);e.submitPromise=o.collections.put({orgId:t.params.orgId},l,function(e){r.eventTrack("Edited Collection");var o=a.decryptCollection(e,t.params.orgId,!0);n.close(o)}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationCollectionsGroupsController",["$scope","$state","$uibModalInstance","collection","$analytics",function(e,t,n,o,a){a.eventTrack("organizationCollectionsGroupsController",{category:"Modal"}),e.collection=o,e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationCollectionsUsersController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","collection","toastr",function(e,t,n,o,a,r,i,l){r.eventTrack("organizationCollectionsUsersController",{category:"Modal"}),e.loading=!0,e.collection=i,e.users=[],n.opened.then(function(){e.loading=!1,o.collectionUsers.listCollection({orgId:t.params.orgId,collectionId:i.id},function(t){if(t&&t.Data.length){for(var n=[],o=0;o<t.Data.length;o++)n.push({id:t.Data[o].Id,userId:t.Data[o].UserId,name:t.Data[o].Name,email:t.Data[o].Email,type:t.Data[o].Type,status:t.Data[o].Status,readOnly:t.Data[o].ReadOnly,accessAll:t.Data[o].AccessAll});e.users=n}})}),e.remove=function(n){confirm("Are you sure you want to remove this user ("+n.email+") from this collection ("+i.name+")?")&&o.collectionUsers.del({orgId:t.params.orgId,id:n.id},null,function(){l.success(n.email+" has been removed.","User Removed"),r.eventTrack("Removed User From Collection");var t=e.users.indexOf(n)
|
|
;t>-1&&e.users.splice(t,1)},function(){l.error("Unable to remove user.","Error")})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationDashboardController",["$scope","authService","$state",function(e,t,n){e.$on("$viewContentLoaded",function(){t.getUserProfile().then(function(t){t.organizations&&(e.orgProfile=t.organizations[n.params.orgId])})})}]),angular.module("bit.organization").controller("organizationDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,a,r,i,l){l.eventTrack("organizationDeleteController",{category:"Modal"}),e.submit=function(){var s={masterPasswordHash:a.hashPassword(e.masterPassword)};e.submitPromise=n.organizations.del({id:t.params.orgId},s,function(){o.dismiss("cancel"),r.removeProfileOrganization(t.params.orgId),l.eventTrack("Deleted Organization"),t.go("backend.user.vault").then(function(){i.success("This organization and all associated data has been deleted.","Organization Deleted")})}).$promise},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationGroupsController",["$scope","$state",function(e,t){}]),angular.module("bit.organization").controller("organizationPeopleController",["$scope","$state","$uibModal","cryptoService","apiService","toastr","$analytics",function(e,t,n,o,a,r,i){function l(){a.organizationUsers.list({orgId:t.params.orgId},function(t){for(var n=[],o=0;o<t.Data.length;o++){var a={id:t.Data[o].Id,userId:t.Data[o].UserId,name:t.Data[o].Name,email:t.Data[o].Email,status:t.Data[o].Status,type:t.Data[o].Type,accessAll:t.Data[o].AccessAll};n.push(a)}e.users=n})}e.users=[],e.$on("$viewContentLoaded",function(){l()}),e.reinvite=function(e){a.organizationUsers.reinvite({orgId:t.params.orgId,id:e.id},null,function(){i.eventTrack("Reinvited User"),r.success(e.email+" has been invited again.","User Invited")},function(){r.error("Unable to invite user.","Error")})},e.delete=function(n){confirm("Are you sure you want to remove this user ("+n.email+")?")&&a.organizationUsers.del({orgId:t.params.orgId,id:n.id},null,function(){i.eventTrack("Deleted User"),r.success(n.email+" has been removed.","User Removed");var t=e.users.indexOf(n);t>-1&&e.users.splice(t,1)},function(){r.error("Unable to remove user.","Error")})},e.confirm=function(e){a.users.getPublicKey({id:e.userId},function(n){var l=o.getOrgKey(t.params.orgId);if(!l)return void r.error("Unable to confirm user.","Error");var s=o.rsaEncrypt(l.key,n.PublicKey);a.organizationUsers.confirm({orgId:t.params.orgId,id:e.id},{key:s},function(){e.status=2,i.eventTrack("Confirmed User"),r.success(e.email+" has been confirmed.","User Confirmed")},function(){r.error("Unable to confirm user.","Error")})},function(){r.error("Unable to confirm user.","Error")})},e.$on("organizationPeopleInvite",function(t,n){e.invite()}),e.invite=function(){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleInvite.html",controller:"organizationPeopleInviteController"}).result.then(function(){l()})},e.edit=function(e){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleEdit.html",controller:"organizationPeopleEditController",resolve:{id:function(){return e}}}).result.then(function(){l()})}}]),angular.module("bit.organization").controller("organizationPeopleEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","id","$analytics",function(e,t,n,o,a,r,i){i.eventTrack("organizationPeopleEditController",{category:"Modal"}),e.loading=!0,e.collections=[],e.selectedCollections={},n.opened.then(function(){o.collections.listOrganization({orgId:t.params.orgId},function(n){e.collections=a.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1}),o.organizationUsers.get({orgId:t.params.orgId,id:r},function(t){var n={};if(t&&t.Collections)for(var o=0;o<t.Collections.Data.length;o++)n[t.Collections.Data[o].Id]={collectionId:t.Collections.Data[o].Id,readOnly:t.Collections.Data[o].ReadOnly};e.email=t.Email,e.type=t.Type,e.accessAll=t.AccessAll,e.selectedCollections=n})}),e.toggleCollectionSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.collections.length;o++)n[e.collections[o].id]={collectionId:e.collections[o].id,readOnly:e.collections[o].id in e.selectedCollections&&e.selectedCollections[e.collections[o].id].readOnly};e.selectedCollections=n},e.toggleCollectionSelection=function(t){t in e.selectedCollections?delete e.selectedCollections[t]:e.selectedCollections[t]={collectionId:t,readOnly:!1}},e.toggleCollectionReadOnlySelection=function(t){t in e.selectedCollections&&(e.selectedCollections[t].readOnly=!e.selectedCollections[t].readOnly)},e.collectionSelected=function(t){return t.id in e.selectedCollections},e.allSelected=function(){return Object.keys(e.selectedCollections).length===e.collections.length},e.submitPromise=null,e.submit=function(a){var l=[];if(!e.accessAll)for(var s in e.selectedCollections)e.selectedCollections.hasOwnProperty(s)&&l.push(e.selectedCollections[s]);e.submitPromise=o.organizationUsers.put({orgId:t.params.orgId,id:r},{type:e.type,collections:l,accessAll:e.accessAll},function(){i.eventTrack("Edited User"),n.close()}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationPeopleInviteController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics",function(e,t,n,o,a,r){r.eventTrack("organizationPeopleInviteController",{category:"Modal"}),e.loading=!0,e.collections=[],e.selectedCollections={},e.model={type:"User"},n.opened.then(function(){o.collections.listOrganization({orgId:t.params.orgId},function(n){e.collections=a.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1})}),e.toggleCollectionSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.collections.length;o++)n[e.collections[o].id]={collectionId:e.collections[o].id,readOnly:e.collections[o].id in e.selectedCollections&&e.selectedCollections[e.collections[o].id].readOnly};e.selectedCollections=n},e.toggleCollectionSelection=function(t){t in e.selectedCollections?delete e.selectedCollections[t]:e.selectedCollections[t]={collectionId:t,readOnly:!1}},e.toggleCollectionReadOnlySelection=function(t){t in e.selectedCollections&&(e.selectedCollections[t].readOnly=!e.selectedCollections[t].readOnly)},e.collectionSelected=function(t){return t.id in e.selectedCollections},e.allSelected=function(){return Object.keys(e.selectedCollections).length===e.collections.length},e.submitPromise=null,e.submit=function(a){var i=[];if(!a.accessAll)for(var l in e.selectedCollections)e.selectedCollections.hasOwnProperty(l)&&i.push(e.selectedCollections[l]);e.submitPromise=o.organizationUsers.invite({orgId:t.params.orgId},{email:a.email,type:a.type,collections:i,accessAll:a.accessAll},function(){r.eventTrack("Invited User"),n.close()}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationSettingsController",["$scope","$state","apiService","toastr","authService","$uibModal","$analytics",function(e,t,n,o,a,r,i){e.model={},e.$on("$viewContentLoaded",function(){n.organizations.get({id:t.params.orgId},function(t){e.model={name:t.Name,billingEmail:t.BillingEmail,businessName:t.BusinessName}})}),e.generalSave=function(){e.generalPromise=n.organizations.put({id:t.params.orgId},e.model,function(e){a.updateProfileOrganization(e).then(function(e){i.eventTrack("Updated Organization Settings"),o.success("Organization has been updated.","Success!")})}).$promise},e.delete=function(){r.open({animation:!0,templateUrl:"app/organization/views/organizationDelete.html",controller:"organizationDeleteController"})}}]),angular.module("bit.vault").controller("organizationVaultAddLoginController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","$analytics","orgId",function(e,t,n,o,a,r,i,l){function s(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}i.eventTrack("organizationVaultAddLoginController",{category:"Modal"}),e.login={},e.hideFolders=e.hideFavorite=!0,e.savePromise=null,e.save=function(o){o.organizationId=l;var r=a.encryptLogin(o);e.savePromise=t.logins.postAdmin(r,function(e){i.eventTrack("Created Organization Login");var t=a.decryptLogin(e);n.close(t)}).$promise},e.generatePassword=function(){e.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(i.eventTrack("Generated Password From Add"),e.login.password=r.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),s(e)},e.clipboardError=function(e,t){t&&s(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.close=function(){n.dismiss("close")}}]),angular.module("bit.organization").controller("organizationVaultController",["$scope","apiService","cipherService","$analytics","$q","$state","$localStorage","$uibModal","$filter",function(e,t,n,o,a,r,i,l,s){e.logins=[],e.collections=[],e.loading=!0,e.$on("$viewContentLoaded",function(){var o=t.collections.listOrganization({orgId:r.params.orgId},function(t){for(var o=([{id:null,name:"Unassigned",collapsed:i.collapsedOrgCollections&&"unassigned"in i.collapsedOrgCollections}]),a=0;a<t.Data.length;a++){var r=n.decryptCollection(t.Data[a],null,!0);r.collapsed=i.collapsedOrgCollections&&r.id in i.collapsedOrgCollections,o.push(r)}e.collections=o}).$promise,l=t.ciphers.listOrganizationDetails({organizationId:r.params.orgId},function(t){for(var o=[],a=0;a<t.Data.length;a++)if(1===t.Data[a].Type){var r=n.decryptLoginPreview(t.Data[a]);o.push(r)}e.logins=o}).$promise;a.all([o,l]).then(function(){e.loading=!1})}),e.filterByCollection=function(e){return function(t){return t.collectionIds&&t.collectionIds.length?t.collectionIds.indexOf(e.id)>-1:null===e.id}},e.collectionSort=function(e){return e.id?e.name.toLowerCase():""},e.collapseExpand=function(e){i.collapsedOrgCollections||(i.collapsedOrgCollections={});var t=e.id||"unassigned";t in i.collapsedOrgCollections?delete i.collapsedOrgCollections[t]:i.collapsedOrgCollections[t]=!0},e.editLogin=function(t){l.open({animation:!0,templateUrl:"app/vault/views/vaultEditLogin.html",controller:"organizationVaultEditLoginController",resolve:{loginId:function(){return t.id}}}).result.then(function(n){if("edit"===n.action)t.name=n.data.name,t.username=n.data.username;else if("delete"===n.action){var o=e.logins.indexOf(t);o>-1&&e.logins.splice(o,1)}})},e.$on("organizationVaultAddLogin",function(t,n){e.addLogin()}),e.addLogin=function(){l.open({animation:!0,templateUrl:"app/vault/views/vaultAddLogin.html",controller:"organizationVaultAddLoginController",resolve:{orgId:function(){return r.params.orgId}}}).result.then(function(t){e.logins.push(t)})},e.editCollections=function(t){l.open({animation:!0,templateUrl:"app/organization/views/organizationVaultLoginCollections.html",controller:"organizationVaultLoginCollectionsController",resolve:{cipher:function(){return t},collections:function(){return e.collections}}}).result.then(function(e){e.collectionIds&&(t.collectionIds=e.collectionIds)})},e.removeLogin=function(e,n){if(confirm("Are you sure you want to remove this login ("+e.name+") from the collection ("+n.name+") ?")){for(var a={collectionIds:[]},r=0;r<e.collectionIds.length;r++)e.collectionIds[r]!==n.id&&a.collectionIds.push(e.collectionIds[r]);t.ciphers.putCollections({id:e.id},a).$promise.then(function(t){o.eventTrack("Removed Login From Collection"),e.collectionIds=a.collectionIds})}},e.deleteLogin=function(n){confirm("Are you sure you want to delete this login ("+n.name+")?")&&t.ciphers.delAdmin({id:n.id},function(){o.eventTrack("Deleted Login");var t=e.logins.indexOf(n);t>-1&&e.logins.splice(t,1)})}}]),angular.module("bit.vault").controller("organizationVaultEditLoginController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","loginId","$analytics",function(e,t,n,o,a,r,i,l){function s(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("organizationVaultEditLoginController",{category:"Modal"}),e.login={},e.hideFolders=e.hideFavorite=!0,t.logins.getAdmin({id:i},function(t){e.login=a.decryptLogin(t)}),e.save=function(o){var r=a.encryptLogin(o);e.savePromise=t.logins.putAdmin({id:i},r,function(e){l.eventTrack("Edited Organization Login");var t=a.decryptLogin(e);n.close({action:"edit",data:t})}).$promise},e.generatePassword=function(){e.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Edit"),e.login.password=r.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),s(e)},e.clipboardError=function(e,t){t&&s(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.delete=function(){confirm("Are you sure you want to delete this login ("+e.login.name+")?")&&t.ciphers.delAdmin({id:e.login.id},function(){l.eventTrack("Deleted Organization Login From Edit"),n.close({action:"delete",data:e.login.id})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationVaultLoginCollectionsController",["$scope","apiService","$uibModalInstance","cipherService","cipher","$analytics","collections",function(e,t,n,o,a,r,i){r.eventTrack("organizationVaultLoginCollectionsController",{category:"Modal"}),e.cipher={},e.collections=[],e.selectedCollections={},n.opened.then(function(){for(var t=[],n=0;n<i.length;n++)i[n].id&&t.push(i[n]);e.collections=t,e.cipher=a;var o={};if(e.cipher.collectionIds)for(n=0;n<e.cipher.collectionIds.length;n++)o[e.cipher.collectionIds[n]]=!0;e.selectedCollections=o}),e.toggleCollectionSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.collections.length;o++)n[e.collections[o].id]=!0;e.selectedCollections=n},e.toggleCollectionSelection=function(t){t in e.selectedCollections?delete e.selectedCollections[t]:e.selectedCollections[t]=!0},e.collectionSelected=function(t){return t.id in e.selectedCollections},e.allSelected=function(){return Object.keys(e.selectedCollections).length===e.collections.length},e.submit=function(){var o={collectionIds:[]};for(var i in e.selectedCollections)e.selectedCollections.hasOwnProperty(i)&&o.collectionIds.push(i);e.submitPromise=t.ciphers.putCollectionsAdmin({id:a.id},o).$promise.then(function(e){r.eventTrack("Edited Login Collections"),n.close({action:"collectionsEdit",collectionIds:o.collectionIds})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.services").factory("apiService",["$resource","tokenService","appSettings","$httpParamSerializer",function(e,t,n,o){function a(e){return o(e)}var r={},i=n.apiUri,l=n.identityUri;return r.logins=e(i+"/logins/:id",{},{get:{method:"GET",params:{id:"@id"}},getAdmin:{url:i+"/logins/:id/admin",method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},postAdmin:{url:i+"/logins/admin",method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},putAdmin:{url:i+"/logins/:id/admin",method:"POST",params:{id:"@id"}},del:{url:i+"/logins/:id/delete",method:"POST",params:{id:"@id"}}}),r.folders=e(i+"/folders/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:i+"/folders/:id/delete",method:"POST",params:{id:"@id"}}}),r.ciphers=e(i+"/ciphers/:id",{},{get:{method:"GET",params:{id:"@id"}},getDetails:{url:i+"/ciphers/:id/details",method:"GET",params:{id:"@id"}},list:{method:"GET",params:{includeFolders:!1,includeShared:!0}},listDetails:{url:i+"/ciphers/details",method:"GET",params:{}},listOrganizationDetails:{url:i+"/ciphers/organization-details",method:"GET",params:{}},import:{url:i+"/ciphers/import",method:"POST",params:{}},favorite:{url:i+"/ciphers/:id/favorite",method:"POST",params:{id:"@id"}},putPartial:{url:i+"/ciphers/:id/partial",method:"POST",params:{id:"@id"}},putShare:{url:i+"/ciphers/:id/share",method:"POST",params:{id:"@id"}},putCollections:{url:i+"/ciphers/:id/collections",method:"POST",params:{id:"@id"}},putCollectionsAdmin:{url:i+"/ciphers/:id/collections-admin",method:"POST",params:{id:"@id"}},del:{url:i+"/ciphers/:id/delete",method:"POST",params:{id:"@id"}},delAdmin:{url:i+"/ciphers/:id/delete-admin",method:"POST",params:{id:"@id"}}}),r.organizations=e(i+"/organizations/:id",{},{get:{method:"GET",params:{id:"@id"}},getBilling:{url:i+"/organizations/:id/billing",method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},putPayment:{url:i+"/organizations/:id/payment",method:"POST",params:{id:"@id"}},putSeat:{url:i+"/organizations/:id/seat",method:"POST",params:{id:"@id"}},putUpgrade:{url:i+"/organizations/:id/upgrade",method:"POST",params:{id:"@id"}},putCancel:{url:i+"/organizations/:id/cancel",method:"POST",params:{id:"@id"}},putReinstate:{url:i+"/organizations/:id/reinstate",method:"POST",params:{id:"@id"}},postLeave:{url:i+"/organizations/:id/leave",method:"POST",params:{id:"@id"}},del:{url:i+"/organizations/:id/delete",method:"POST",params:{id:"@id"}}}),r.organizationUsers=e(i+"/organizations/:orgId/users/:id",{},{get:{method:"GET",params:{id:"@id",orgId:"@orgId"}},list:{method:"GET",params:{orgId:"@orgId"}},invite:{url:i+"/organizations/:orgId/users/invite",method:"POST",params:{orgId:"@orgId"}},reinvite:{url:i+"/organizations/:orgId/users/:id/reinvite",method:"POST",params:{id:"@id",orgId:"@orgId"}},accept:{url:i+"/organizations/:orgId/users/:id/accept",method:"POST",params:{id:"@id",orgId:"@orgId"}},confirm:{url:i+"/organizations/:orgId/users/:id/confirm",method:"POST",params:{id:"@id",orgId:"@orgId"}},put:{method:"POST",params:{id:"@id",orgId:"@orgId"}},del:{url:i+"/organizations/:orgId/users/:id/delete",method:"POST",params:{id:"@id",orgId:"@orgId"}}}),r.collections=e(i+"/organizations/:orgId/collections/:id",{},{get:{method:"GET",params:{id:"@id",orgId:"@orgId"}},listMe:{url:i+"/collections",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:i+"/organizations/:orgId/collections/:id/delete",method:"POST",params:{id:"@id",orgId:"@orgId"}}}),r.collectionUsers=e(i+"/organizations/:orgId/collectionUsers/:id",{},{listCollection:{url:i+"/organizations/:orgId/collectionUsers/:collectionId",method:"GET",params:{collectionId:"@collectionId",orgId:"@orgId"}},del:{url:i+"/organizations/:orgId/collectionUsers/:id/delete",method:"POST",params:{id:"@id",orgId:"@orgId"}}}),r.accounts=e(i+"/accounts",{},{register:{url:i+"/accounts/register",method:"POST",params:{}},emailToken:{url:i+"/accounts/email-token",method:"POST",params:{}},email:{url:i+"/accounts/email",method:"POST",params:{}},putPassword:{url:i+"/accounts/password",method:"POST",params:{}},getProfile:{url:i+"/accounts/profile",method:"GET",params:{}},putProfile:{url:i+"/accounts/profile",method:"POST",params:{}},getDomains:{url:i+"/accounts/domains",method:"GET",params:{}},putDomains:{url:i+"/accounts/domains",method:"POST",params:{}},getTwoFactor:{url:i+"/accounts/two-factor",method:"GET",params:{}},putTwoFactor:{url:i+"/accounts/two-factor",method:"POST",params:{}},postTwoFactorRecover:{url:i+"/accounts/two-factor-recover",method:"POST",params:{}},postPasswordHint:{url:i+"/accounts/password-hint",method:"POST",params:{}},putSecurityStamp:{url:i+"/accounts/security-stamp",method:"POST",params:{}},putKeys:{url:i+"/accounts/keys",method:"POST",params:{}},import:{url:i+"/accounts/import",method:"POST",params:{}},postDelete:{url:i+"/accounts/delete",method:"POST",params:{}}}),r.settings=e(i+"/settings",{},{getDomains:{url:i+"/settings/domains",method:"GET",params:{}},putDomains:{url:i+"/settings/domains",method:"POST",params:{}}}),r.users=e(i+"/users/:id",{},{getPublicKey:{url:i+"/users/:id/public-key",method:"GET",params:{id:"@id"}}}),r.identity=e(l+"/connect",{},{token:{url:l+"/connect/token",method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8"},transformRequest:a,skipAuthorization:!0,params:{}}}),r}]),angular.module("bit.services").factory("authService",["cryptoService","apiService","tokenService","$q","jwtHelper","$rootScope",function(e,t,n,o,a,r){var i={},l=null;i.logIn=function(a,r,l,s){a=a.toLowerCase();var c=e.makeKey(r,a),d={username:a,password:e.hashPassword(r,c),grant_type:"password",scope:"api offline_access",client_id:"web"};l&&void 0!==s&&null!==s&&(d.twoFactorToken=l.replace(" ",""),d.twoFactorProvider=s);var u=o.defer();return t.identity.token(d).$promise.then(function(t){if(t&&t.access_token)return n.setToken(t.access_token),n.setRefreshToken(t.refresh_token),e.setKey(c),t.PrivateKey?(e.setPrivateKey(t.PrivateKey,c),!0):e.makeKeyPair(c)}).then(function(n){if(!0!==n)return e.setPrivateKey(n.privateKeyEnc,c),t.accounts.putKeys({publicKey:n.publicKey,encryptedPrivateKey:n.privateKeyEnc}).$promise}).then(function(){return i.setUserProfile()}).then(function(){u.resolve()},function(e){i.logOut(),400===e.status&&e.data.TwoFactorProviders&&e.data.TwoFactorProviders.length?u.resolve(e.data.TwoFactorProviders):u.reject(e)}),u.promise},i.logOut=function(){n.clearToken(),n.clearRefreshToken(),e.clearKeys(),r.vaultFolders=r.vaultLogins=null,l=null},i.getUserProfile=function(){if(!l)return i.setUserProfile();var e=o.defer();return e.resolve(l),e.promise};var s=null;return i.setUserProfile=function(){if(s&&0===s.promise.$$state.status)return s.promise;s=o.defer();var r=n.getToken();if(!r)return s.reject(),s.promise;var i=a.decodeToken(r);return t.accounts.getProfile({},function(t){if(l={id:i.name,email:i.email,extended:{name:t.Name,twoFactorEnabled:t.TwoFactorEnabled,culture:t.Culture}},t.Organizations){for(var n={},o=0;o<t.Organizations.length;o++)n[t.Organizations[o].Id]={id:t.Organizations[o].Id,name:t.Organizations[o].Name,key:t.Organizations[o].Key,status:t.Organizations[o].Status,type:t.Organizations[o].Type,enabled:t.Organizations[o].Enabled};l.organizations=n,e.setOrgKeys(n),s.resolve(l)}},function(){s.reject()}),s.promise},i.addProfileOrganizationOwner=function(t,n){return i.getUserProfile().then(function(o){if(o){o.organizations||(o.organizations={});var a={id:t.Id,name:t.Name,key:n,status:2,type:0,enabled:!0};o.organizations[a.id]=a,l=o,e.addOrgKey(a.id,a.key)}})},i.removeProfileOrganization=function(t){return i.getUserProfile().then(function(n){n&&(n.organizations&&n.organizations.hasOwnProperty(t)&&(delete n.organizations[t],l=n),e.clearOrgKey(t))})},i.updateProfileOrganization=function(e){return i.getUserProfile().then(function(t){t&&t.organizations&&e.Id in t.organizations&&(t.organizations[e.Id].name=e.Name,l=t)})},i.isAuthenticated=function(){return null!==n.getToken()},i.refreshAccessToken=function(){var e=n.getRefreshToken();return e?t.identity.token({grant_type:"refresh_token",client_id:"web",refresh_token:e}).$promise.then(function(e){return n.setToken(e.access_token),n.setRefreshToken(e.refresh_token),e.access_token}):null},i}]),angular.module("bit.services").factory("cipherService",["cryptoService","apiService",function(e,t){var n={};return n.decryptLogins=function(e){if(!e)throw"encryptedLogins is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(n.decryptLogin(e[o]));return t},n.decryptLogin=function(t){if(!t)throw"encryptedLogin is undefined or null";var n=null;return t.OrganizationId&&(n=e.getOrgKey(t.OrganizationId)),{id:t.Id,organizationId:t.OrganizationId,collectionIds:t.CollectionIds||[],type:1,folderId:t.FolderId,favorite:t.Favorite,edit:t.Edit,name:e.decrypt(t.Name,n),uri:t.Uri&&""!==t.Uri?e.decrypt(t.Uri,n):null,username:t.Username&&""!==t.Username?e.decrypt(t.Username,n):null,password:t.Password&&""!==t.Password?e.decrypt(t.Password,n):null,notes:t.Notes&&""!==t.Notes?e.decrypt(t.Notes,n):null}},n.decryptLoginPreview=function(t){if(!t)throw"encryptedCipher is undefined or null";var o=null;return t.OrganizationId&&(o=e.getOrgKey(t.OrganizationId)),{id:t.Id,organizationId:t.OrganizationId,collectionIds:t.CollectionIds||[],folderId:t.FolderId,favorite:t.Favorite,edit:t.Edit,name:n.decryptProperty(t.Data.Name,o,!1),username:n.decryptProperty(t.Data.Username,o,!0)}},n.decryptFolders=function(e){if(!e)throw"encryptedFolders is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(n.decryptFolder(e[o]));return t},n.decryptFolder=function(t){if(!t)throw"encryptedFolder is undefined or null";return{id:t.Id,name:e.decrypt(t.Name)}},n.decryptFolderPreview=function(e){if(!e)throw"encryptedFolder is undefined or null";return{id:e.Id,name:n.decryptProperty(e.Name,null,!1)}},n.decryptCollections=function(e,t,o){if(!e)throw"encryptedCollections is undefined or null";for(var a=[],r=0;r<e.length;r++)a.push(n.decryptCollection(e[r],t,o));return a},n.decryptCollection=function(t,o,a){if(!t)throw"encryptedCollection is undefined or null";a=!0===a,o=o||t.OrganizationId;var r=e.getOrgKey(o);return{id:t.Id,name:a?n.decryptProperty(t.Name,r,!1):e.decrypt(t.Name,r)}},n.decryptProperty=function(t,n,o){if(o&&(!t||""===t))return null;try{t=e.decrypt(t,n)}catch(e){t=null}return t||"[error: cannot decrypt]"},n.encryptLogins=function(e,t){if(!e)throw"unencryptedLogins is undefined or null";for(var o=[],a=0;a<e.length;a++)o.push(n.encryptLogin(e[a],t));return o},n.encryptLogin=function(t,n){if(!t)throw"unencryptedLogin is undefined or null";return t.organizationId&&(n=n||e.getOrgKey(t.organizationId)),{id:t.id,type:1,organizationId:t.organizationId||null,folderId:""===t.folderId?null:t.folderId,favorite:null!==t.favorite&&t.favorite,uri:t.uri&&""!==t.uri?e.encrypt(t.uri,n):null,name:e.encrypt(t.name,n),username:t.username&&""!==t.username?e.encrypt(t.username,n):null,password:t.password&&""!==t.password?e.encrypt(t.password,n):null,notes:t.notes&&""!==t.notes?e.encrypt(t.notes,n):null}},n.encryptFolders=function(e,t){if(!e)throw"unencryptedFolders is undefined or null";for(var o=[],a=0;a<e.length;a++)o.push(n.encryptFolder(e[a],t));return o},n.encryptFolder=function(t,n){if(!t)throw"unencryptedFolder is undefined or null";return{id:t.id,name:e.encrypt(t.name,n)}},n.encryptCollections=function(e,t){if(!e)throw"unencryptedCollections is undefined or null";for(var o=[],a=0;a<e.length;a++)o.push(n.encryptCollection(e[a],t));return o},n.encryptCollection=function(t,n){if(!t)throw"unencryptedCollection is undefined or null";return{id:t.id,name:e.encrypt(t.name,e.getOrgKey(n))}},n}]),angular.module("bit.services").factory("cryptoService",["$sessionStorage","constants","$q",function(e,t,n){function o(e,t,n,o){var a=forge.hmac.create();a.start("sha256",n),a.update(t+e);var r=a.digest();return o?forge.util.encode64(r.getBytes()):r.getBytes()}function a(e,t,n){var o=forge.hmac.create();return o.start("sha256",e),o.update(t),t=o.digest().getBytes(),o.start(null,null),o.update(n),n=o.digest().getBytes(),t===n}function r(e,n,o){if(n&&(e=forge.util.decode64(e)),!e)throw"Must provide keyBytes";var a=forge.util.createBuffer(e);if(!a||0===a.length())throw"Couldn't make buffer";var r=a.length();if(null===o||void 0===o)if(32===r)o=t.encType.AesCbc256_B64;else{if(64!==r)throw"Unable to determine encType.";o=t.encType.AesCbc256_HmacSha256_B64}if(this.key=e,this.keyB64=forge.util.encode64(e),this.encType=o,o===t.encType.AesCbc256_B64&&32===r)this.encKey=e,this.macKey=null;else if(o===t.encType.AesCbc128_HmacSha256_B64&&32===r)this.encKey=a.getBytes(16),this.macKey=a.getBytes(16);else{if(o!==t.encType.AesCbc256_HmacSha256_B64||64!==r)throw"Unsupported encType/key length.";this.encKey=a.getBytes(32),this.macKey=a.getBytes(32)}}var l,s,c,d,u,p={};return p.setKey=function(t){l=t,e.key=l.keyB64},p.setPrivateKey=function(t,n){try{var o=p.decrypt(t,n,"raw");e.privateKey=forge.util.encode64(o),d=forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(o))}catch(e){console.log("Cannot set private key. Decryption failed.")}},p.setOrgKeys=function(t,n){if(t&&0!==Object.keys(t).length){p.clearOrgKeys();var o={},a={},l=!1;for(var s in t)if(t.hasOwnProperty(s))try{var c=p.rsaDecrypt(t[s].key,n),d=new r(c);a[s]=d,o[s]=d.keyB64,l=!0}catch(e){console.log("Cannot set org key "+i+". Decryption failed.")}l?e.orgKeys=o:a=null}},p.addOrgKey=function(t,n,o){(c=p.getOrgKeys())||(c={});var a=e.orgKeys;a||(a={});try{var i=p.rsaDecrypt(n,o),l=new r(i);c[t]=l,a[t]=l.keyB64}catch(e){c=null,console.log("Cannot set org key. Decryption failed.")}e.orgKeys=a},p.getKey=function(){if(!l&&e.key&&(l=new r(e.key,!0)),!l)throw"key unavailable";return l},p.getPrivateKey=function(t){if(t=t||"native",d){if("raw"===t){var n=forge.pki.privateKeyToAsn1(d),o=forge.pki.wrapRsaPrivateKey(n);return forge.asn1.toDer(o).getBytes()}return d}if(e.privateKey){var a=forge.util.decode64(e.privateKey);if(d=forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(a)),"raw"===t)return a}return d},p.getPublicKey=function(){if(u)return u;var e=p.getPrivateKey();return e?u=forge.pki.setRsaPublicKey(e.n,e.e):null},p.getOrgKeys=function(){if(c)return c;if(e.orgKeys){var t={},n=!1;for(var o in e.orgKeys)e.orgKeys.hasOwnProperty(o)&&(t[o]=new r(e.orgKeys[o],!0),n=!0);n&&(c=t)}return c},p.getOrgKey=function(e){var t=p.getOrgKeys();return t&&e in t?t[e]:null},p.clearKey=function(){l=null,s=null,delete e.key},p.clearKeyPair=function(){d=null,u=null,delete e.privateKey},p.clearOrgKeys=function(){c=null,delete e.orgKeys},p.clearOrgKey=function(t){c.hasOwnProperty(t)&&delete c[t],e.orgKeys.hasOwnProperty(t)&&delete e.orgKeys[t]},p.clearKeys=function(){p.clearKey(),p.clearKeyPair(),p.clearOrgKeys()},p.makeKey=function(e,t){return new r(forge.pbkdf2(forge.util.encodeUtf8(e),forge.util.encodeUtf8(t),5e3,32,"sha256"))},p.makeKeyPair=function(e){var t=n.defer();return forge.pki.rsa.generateKeyPair({bits:2048,workers:2},function(n,o){if(n)return void t.reject(n);var a=forge.pki.privateKeyToAsn1(o.privateKey),r=forge.pki.wrapRsaPrivateKey(a),i=forge.asn1.toDer(r).getBytes(),l=p.encrypt(i,e,"raw"),s=forge.pki.publicKeyToAsn1(o.publicKey),c=forge.asn1.toDer(s).getBytes();t.resolve({publicKey:forge.util.encode64(c),privateKeyEnc:l})}),t.promise},p.makeShareKeyCt=function(){return p.rsaEncrypt(forge.random.getBytesSync(64))},p.hashPassword=function(e,t){if(t||(t=p.getKey()),!e||!t)throw"Invalid parameters.";var n=forge.pbkdf2(t.key,forge.util.encodeUtf8(e),1,32,"sha256");return forge.util.encode64(n)},p.encrypt=function(e,n,a){if(!(n=n||p.getKey()))throw"Encryption key unavailable.";a=a||"utf8";var r=forge.util.createBuffer(e,a),i=forge.random.getBytesSync(16),l=forge.cipher.createCipher("AES-CBC",n.encKey);l.start({iv:i}),l.update(r),l.finish();var s=forge.util.encode64(i),c=l.output.getBytes(),d=forge.util.encode64(c),u=s+"|"+d;if(n.macKey){u=u+"|"+o(c,i,n.macKey,!0)}return n.encType===t.encType.AesCbc256_B64?u:n.encType+"."+u},p.rsaEncrypt=function(e,n){if(!(n=n||p.getPublicKey()))throw"Public key unavailable.";if("string"==typeof n){var o=forge.util.decode64(n);n=forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(o))}var a=n.encrypt(e,"RSA-OAEP",{md:forge.md.sha1.create()});return t.encType.Rsa2048_OaepSha1_B64+"."+forge.util.encode64(a)},p.decrypt=function(e,n,i){n=n||p.getKey();var l,c,d=e.split(".");if(2===d.length)try{l=parseInt(d[0]),c=d[1].split("|")}catch(e){return null}else c=e.split("|"),l=3===c.length?t.encType.AesCbc128_HmacSha256_B64:t.encType.AesCbc256_B64;if(l===t.encType.AesCbc128_HmacSha256_B64&&n.encType===t.encType.AesCbc256_B64&&(s=s||new r(n.key,!1,t.encType.AesCbc128_HmacSha256_B64),n=s),l!==n.encType)throw"encType unavailable.";switch(l){case t.encType.AesCbc128_HmacSha256_B64:case t.encType.AesCbc256_HmacSha256_B64:if(3!==c.length)return null;break;case t.encType.AesCbc256_B64:if(2!==c.length)return null;break;default:return null}var u=forge.util.decode64(c[0]),g=forge.util.decode64(c[1]);if(n.macKey&&c.length>2){
|
|
var m=forge.util.decode64(c[2]),f=o(g,u,n.macKey,!1);if(!a(n.macKey,m,f))return console.error("MAC failed."),null}var h=forge.util.createBuffer(g),v=forge.cipher.createDecipher("AES-CBC",n.encKey);return v.start({iv:u}),v.update(h),v.finish(),i=i||"utf8","utf8"===i?v.output.toString("utf8"):v.output.getBytes()},p.rsaDecrypt=function(e,n){if(!(n=n||p.getPrivateKey()))throw"Private key unavailable.";var o,a,r=e.split(".");if(1===r.length)o=t.encType.Rsa2048_OaepSha256_B64,a=r[0];else if(2===r.length)try{o=parseInt(r[0]),a=r[1]}catch(e){return null}var i,l=forge.util.decode64(a);if(o===t.encType.Rsa2048_OaepSha256_B64)i=forge.md.sha256.create();else{if(o!==t.encType.Rsa2048_OaepSha1_B64)throw"encType unavailable.";i=forge.md.sha1.create()}return n.decrypt(l,"RSA-OAEP",{md:i})},p}]),angular.module("bit.services").factory("importService",function(){function e(e,t){if(!e||""===e)return!1;e=e.trim().toLowerCase();for(var n=0;n<t.length;n++)if(e===t[n])return!0;return!1}function t(e){return e=e.toLowerCase().trim(),!e.startsWith("http")&&e.indexOf(".")>=0&&(e="http://"+e),n(e)}function n(e){return e.length>1e3?e.substring(0,1e3):e}function o(e){if(e.errors&&e.errors.length)for(var t=0;t<e.errors.length;t++)console.warn("Error parsing row "+e.errors[t].row+": "+e.errors[t].message)}function a(e,t,n){if("string"==typeof e)t(e);else{var o=new FileReader;o.readAsText(e,"utf-8"),o.onload=function(e){t(e.target.result)},o.onerror=function(e){n()}}}function r(e,t,n){a(e,function(e){t($.parseXML(e))},n)}function i(e,t,a){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,t){var o=a.length,l=r.length,s=e.folder&&""!==e.folder,c=s;if(s)for(var d=0;d<a.length;d++)if(a[d].name===e.folder){c=!1,o=d;break}if(r.push({favorite:!(!e.favorite||""===e.favorite||"0"===e.favorite),uri:e.uri&&""!==e.uri?n(e.uri):null,username:e.username&&""!==e.username?e.username:null,password:e.password&&""!==e.password?e.password:null,notes:e.notes&&""!==e.notes?e.notes:null,name:e.name&&""!==e.name?e.name:"--"}),c&&a.push({name:e.folder}),s){var u={key:l,value:o};i.push(u)}}),t(a,r,i)}})}function l(e,t,a){function r(e){var o=[],a=[],r=[];angular.forEach(e,function(e,t){var i=o.length,l=a.length,s=e.grouping&&""!==e.grouping&&"(none)"!==e.grouping,c=s;if(s)for(var d=0;d<o.length;d++)if(o[d].name===e.grouping){c=!1,i=d;break}if(a.push({favorite:"1"===e.fav,uri:e.url&&""!==e.url?n(e.url):null,username:e.username&&""!==e.username?e.username:null,password:e.password&&""!==e.password?e.password:null,notes:e.extra&&""!==e.extra?e.extra:null,name:e.name&&""!==e.name?e.name:"--"}),c&&o.push({name:e.grouping}),s){var u={key:l,value:i};r.push(u)}}),t(o,a,r)}if("string"!=typeof e&&e.type&&"text/html"===e.type){var i=new FileReader;i.readAsText(e,"utf-8"),i.onload=function(e){var t,n,o=$(e.target.result),i=o.find("pre");if(1===i.length)t=i.text().trim(),n=Papa.parse(t,{header:!0,encoding:"UTF-8"}),r(n.data);else{for(var l=!1,s=0;s<o.length;s++)if("pre"===o[s].tagName.toLowerCase()){l=!0,t=o[s].outerText.trim(),n=Papa.parse(t,{header:!0,encoding:"UTF-8"}),r(n.data);break}l||a()}},i.onerror=function(e){a()}}else Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),r(e.data)},beforeFirstChunk:function(e){return e.replace(/^\s+/,"")}})}function s(e,t,o){function a(e){var a=$(e),r=a.find("database");if(r.length){var p=r.find("> label");if(p.length)for(d=0;d<p.length;d++){var g=$(p[d]);c[g.attr("id")]=i.length,i.push({name:g.attr("name")})}var m=r.find("> card");if(m.length)for(d=0;d<m.length;d++){var f=$(m[d]);if("true"!==f.attr("template")){var h={favorite:!1,uri:null,username:null,password:null,notes:"",name:f.attr("title")},v=f.find("> field");for(u=0;u<v.length;u++){var y=$(v[u]),w=y.text(),b=y.attr("type"),C=y.attr("name");w&&""!==w&&("login"===b?h.username=w:"password"===b?h.password=w:"notes"===b?h.notes+=w+"\n":"weblogin"===b||"website"===b?h.uri=n(w):h.notes+=C+": "+w+"\n")}var S=f.find("> notes");for(u=0;u<S.length;u++)h.notes+=$(S[u]).text()+"\n";if(""===h.notes&&(h.notes=null),l.push(h),p=f.find("> label_id"),p.length){var k=$(p[0]).text(),P=c[k];null!==k&&""!==k&&null!==P&&s.push({key:l.length-1,value:P})}}}t(i,l,s)}else o()}var i=[],l=[],s=[],c=[],d=0,u=0;r(e,a,o)}function c(e,t,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[],l=[],s=0,c=0;for(s=0;s<e.data.length;s++){var d=e.data[s];if(0!==s){var u=a.length,p=r.length,g=d[1]&&""!==d[1],m=g;if(g)for(c=0;c<a.length;c++)if(a[c].name===d[1]){m=!1,u=c;break}var f={favorite:!1,uri:null,username:d[2]&&""!==d[2]?d[2]:null,password:d[3]&&""!==d[3]?d[3]:null,notes:null,name:d[0]&&""!==d[0]?d[0]:"--"};if(l.length)for(c=4;c<d.length;c++){var h=d[c];if(h&&""!==h){var v=l[c-4];"url"===v.toLowerCase()||"uri"===v.toLowerCase()?f.uri=n(h):(null===f.notes&&(f.notes=""),f.notes+=v+": "+h+"\n")}}r.push(f),m&&a.push({name:d[1]}),g&&i.push({key:p,value:u})}else for(c=4;c<d.length;c++)l.push(d[c])}t(a,r,i)}})}function d(e,t,o){function a(e){var n=$(e),a=n.find("Root");if(a.length){var r=a.find("> Group");r.length&&(i($(r[0]),!0,""),t(l,s,c))}else o()}function i(e,t,o){var a=l.length,r=o;t||(""!==r&&(r+=" > "),r+=e.find("> Name").text(),l.push({name:r}));var d=e.find("> Entry");if(d.length)for(var u=0;u<d.length;u++){for(var p=$(d[u]),g=s.length,m={favorite:!1,uri:null,username:null,password:null,notes:null,name:null},f=p.find("> String"),h=0;h<f.length;h++){var v=$(f[h]),y=v.find("> Key").text(),w=v.find("> Value").text();if(""!==w)switch(y){case"URL":m.uri=n(w);break;case"UserName":m.username=w;break;case"Password":m.password=w;break;case"Title":m.name=w;break;case"Notes":m.notes=null===m.notes?w+"\n":m.notes+w+"\n";break;default:m.notes=null===m.notes?y+": "+w+"\n":m.notes+y+": "+w+"\n"}}null===m.name&&(m.name="--"),s.push(m),t||c.push({key:g,value:a})}var b=e.find("> Group");if(b.length)for(var C=0;C<b.length;C++)i($(b[C]),!1,r)}var l=[],s=[],c=[];r(e,a,o)}function u(e,n,a){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,n){e.Group=e.Group.startsWith("Root/")?e.Group.replace("Root/",""):e.Group;var o=e.Group&&""!==e.Group?e.Group.split("/").join(" > "):null,l=a.length,s=r.length,c=null!==o,d=c,u=0;if(c)for(u=0;u<a.length;u++)if(a[u].name===o){d=!1,l=u;break}var p={favorite:!1,uri:e.URL&&""!==e.URL?t(e.URL):null,username:e.Username&&""!==e.Username?e.Username:null,password:e.Password&&""!==e.Password?e.Password:null,notes:e.Notes&&""!==e.Notes?e.Notes:null,name:e.Title&&""!==e.Title?e.Title:"--"};if(e.Title&&r.push(p),d&&a.push({name:o}),c){var g={key:s,value:l};i.push(g)}}),n(a,r,i)}})}function p(e,n,o){function r(e,t,n,o,a){for(var r=0;r<e.length;r++){var i=e[r];i[o]&&""!==i[o]&&(!t.username&&i[n]&&"username"===i[n]?t.username=i[o]:!t.password&&i[n]&&"password"===i[n]?t.password=i[o]:i[a]&&i[o]&&(null===t.notes?t.notes="":t.notes+="\n",t.notes+=i[a]+": "+i[o].toString().split("\\r\\n").join("\n").split("\\n").join("\n")))}}function i(e){var o=e.split(/(?:\r\n|\r|\n)/);for(d=0;d<o.length;d++){var a=o[d];if(a.length&&"{"===a[0]){var i=JSON.parse(a),u={favorite:!(!i.openContents||!i.openContents.faveIndex),uri:i.location&&""!==i.location?t(i.location):null,username:null,password:null,notes:null,name:i.title&&""!==i.title?i.title:"--"};if(i.secureContents&&(i.secureContents.notesPlain&&""!==i.secureContents.notesPlain&&(u.notes=i.secureContents.notesPlain.split("\\r\\n").join("\n").split("\\n").join("\n")),i.secureContents.fields&&r(i.secureContents.fields,u,"designation","value","name"),i.secureContents.sections))for(var p=0;p<i.secureContents.sections.length;p++)i.secureContents.sections[p].fields&&r(i.secureContents.sections[p].fields,u,"n","v","t");s.push(u)}}n(l,s,c)}var l=[],s=[],c=[],d=0;a(e,i,o)}function g(e,n,a){var r=[],i=[],l=[];Papa.parse(e,{encoding:"UTF-8",header:!0,complete:function(e){o(e);for(var a=0;a<e.data.length;a++){var s=e.data[a];if(s.title){var c={favorite:!1,uri:null,username:null,password:null,notes:s.notesPlain&&""!==s.notesPlain?s.notesPlain:"",name:s.title&&""!==s.title?s.title:"--"};for(var d in s)if(s.hasOwnProperty(d)){if(null===s[d]||""===s[d])continue;if(c.password||"password"!==d)if(c.username||"username"!==d)if(c.uri||"urls"!==d)"ainfo"===d||"autosubmit"===d||"notesPlain"===d||"ps"===d||"scope"===d||"tags"===d||"title"===d||"uuid"===d||d.startsWith("section:")||(""!==c.notes&&(c.notes+="\n"),c.notes+=d+": "+s[d]);else{var u=s[d].split(/(?:\r\n|\r|\n)/);c.uri=t(u[0]);for(var p=1;p<u.length;p++)""!==c.notes&&(c.notes+="\n"),c.notes+="url "+(p+1)+": "+u[p]}else c.username=s[d];else c.password=s[d]}""===c.notes&&(c.notes=null),i.push(c)}}n(r,i,l)}})}function m(e,t,a){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,t){r.push({favorite:!1,uri:e.url&&""!==e.url?n(e.url):null,username:e.username&&""!==e.username?e.username:null,password:e.password&&""!==e.password?e.password:null,notes:null,name:e.name&&""!==e.name?e.name:"--"})}),t(a,r,i)}})}function f(e,t,o){function a(e){var t="--";try{if(e&&""!==e){var n=document.createElement("a");n.href=e,n.hostname&&(t=n.hostname)}}catch(e){}return t}function i(e){for(var o=$(e),r=o.find("entry"),i=0;i<r.length;i++){var d=$(r[i]);if(d){var u=d.attr("host"),p=d.attr("user"),g=d.attr("password");s.push({favorite:!1,uri:u&&""!==u?n(u):null,username:p&&""!==p?p:null,password:g&&""!==g?g:null,notes:null,name:a(u)})}}t(l,s,c)}var l=[],s=[],c=[];if(!e.type||"text/xml"!==e.type)return void o("Only .xml exports are supported.");r(e,i,o)}function h(e,t,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,t){5===e.length&&r.push({favorite:!1,uri:e[3]&&""!==e[3]?n(e[3]):null,username:e[1]&&""!==e[1]?e[1]:null,password:e[2]&&""!==e[2]?e[2]:null,notes:e[4]&&""!==e[4]?e[4]:null,name:e[0]&&""!==e[0]?e[0]:"--"})}),t(a,r,i)}})}function v(e,t,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,t){if(e.length>=6){var o=a.length,l=r.length,s=e[0]&&""!==e[0],c=s,d=0;if(s)for(d=0;d<a.length;d++)if(a[d].name===e[0]){c=!1,o=d;break}var u={favorite:!1,uri:e[4]&&""!==e[4]?n(e[4]):null,username:e[2]&&""!==e[2]?e[2]:null,password:e[3]&&""!==e[3]?e[3]:null,notes:e[5]&&""!==e[5]?e[5]:null,name:e[1]&&""!==e[1]?e[1]:"--"};if(e.length>6)for(null===u.notes?u.notes="":u.notes+="\n",d=6;d<e.length;d+=2){var p=e[d],g=e[d+1];u.notes+=p+": "+g+"\n"}if(r.push(u),c&&a.push({name:e[0]}),s){var m={key:l,value:o};i.push(m)}}}),t(a,r,i)}})}function y(e,t,o){function a(e){var a=$(e),r=a.find("PasswordManager");if(r.length){var d=r.find("> record");if(d.length)for(var u=0;u<d.length;u++){var p=$(d[u]),g=p.find("> Account-Name"),m=g.length?$(g):null,f=p.find("> User-Id"),h=f.length?$(f):null,v=p.find("> Password"),y=v.length?$(v):null,w=p.find("> URL"),b=w.length?$(w):null,C=p.find("> Notes"),S=C.length?$(C):null,k=p.find("> Category"),P=k.length?$(k):null,I=P?P.text():null,T=i.length,z=l.length,O=I&&""!==I&&"Unfiled"!==I,E=O;if(O)for(c=0;c<i.length;c++)if(i[c].name===I){E=!1,T=c;break}var x={favorite:!1,uri:b&&""!==b.text()?n(b.text()):null,username:h&&""!==h.text()?h.text():null,password:y&&""!==y.text()?y.text():null,notes:S&&""!==S.text()?S.text():null,name:m&&""!==m.text()?m.text():"--"},A="";for(c=1;c<=10;c++)A+="> Attribute-"+c,c<10&&(A+=", ");var L=p.find(A);if(L.length)for(c=0;c<L.length;c++){var U=$(L[c]),D=U.prop("tagName"),F=U.text();F&&""!==F&&"null"!==F&&(null===x.notes?x.notes="":x.notes+="\n",x.notes+=D+": "+F)}if(l.push(x),E&&i.push({name:I}),O){var M={key:z,value:T};s.push(M)}}t(i,l,s)}else o()}var i=[],l=[],s=[],c=0;r(e,a,o)}function w(e,t,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var a=[],r=[],i=[],l=0;l<e.data.length;l++){var s=e.data[l];if(!(s.length<2)&&(0!==l||"Title"!==s[0])){var c=s[s.length-1],d={name:s[0],favorite:!1,uri:null,password:null,username:null,notes:c&&""!==c?c:null};if(s.length>2&&s.length%2==0)for(var u=0;u<s.length-2;u+=2){var p=s[u+2];if(p&&""!==p){var g=s[u+1],m=g.toLowerCase();"url"!==m||d.uri?"username"!==m&&"email"!==m||d.username?"password"!==m||d.password?d.notes=null===d.notes?g+": "+p:d.notes+"\n"+g+": "+p:d.password=p:d.username=p:d.uri=n(p)}}r.push(d)}}t(a,r,i)}})}function b(e,t,o){function a(e){var a=$(e),r=a.find("passwordsafe");if(r.length){var d=r.attr("delimiter"),u=r.find("> entry");if(u.length)for(var p=0;p<u.length;p++){var g=$(u[p]),m=g.find("> title"),f=m.length?$(m):null,h=g.find("> username"),v=h.length?$(h):null,y=g.find("> email"),w=y.length?$(y):null,b=w?w.text():null,C=g.find("> password"),S=C.length?$(C):null,k=g.find("> url"),P=k.length?$(k):null,I=g.find("> notes"),T=I.length?$(I):null,z=T?T.text().split(d).join("\n"):null,O=g.find("> group"),E=O.length?$(O):null,x=E?E.text().split(".").join(" > "):null,A=i.length,L=l.length,U=x&&""!==x,D=U;if(U)for(c=0;c<i.length;c++)if(i[c].name===x){D=!1,A=c;break}var F={favorite:!1,uri:P&&""!==P.text()?n(P.text()):null,username:v&&""!==v.text()?v.text():null,password:S&&""!==S.text()?S.text():null,notes:T&&""!==z?z:null,name:f&&""!==f.text()?f.text():"--"};if(!F.username&&b&&""!==b?F.username=b:b&&""!==b&&(F.notes=null===F.notes?"Email: "+b:F.notes+"\nEmail: "+b),l.push(F),D&&i.push({name:x}),U){var M={key:L,value:A};s.push(M)}}t(i,l,s)}else o()}var i=[],l=[],s=[],c=0;r(e,a,o)}function C(e,n,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var a=[],r=[],i=[],l=0;l<e.data.length;l++){var s=!1,c=e.data[l];if(c.length&&1!==c.length){var d={name:c[0]&&""!==c[0]?c[0]:"--",favorite:!1,uri:null,password:null,username:null,notes:null};if(2===c.length)d.uri=t(c[1]);else if(3===c.length)d.uri=t(c[1]),d.username=c[2];else if(4===c.length)""===c[2]&&""===c[3]?(d.username=c[1],d.notes=c[2]+"\n"+c[3]):(d.username=c[2],d.notes=c[1]+"\n"+c[3]);else if(5===c.length)d.uri=t(c[1]),d.username=c[2],d.password=c[3],d.notes=c[4];else if(6===c.length)""===c[2]?(d.username=c[3],d.notes=c[5]):(d.username=c[2],d.notes=c[3]+"\n"+c[5]),d.uri=t(c[1]),d.password=c[4];else if(7===c.length)""===c[2]?(d.username=c[3],d.notes=c[4]+"\n"+c[6]):(d.username=c[2],d.notes=c[3]+"\n"+c[4]+"\n"+c[6]),d.uri=t(c[1]),d.password=c[5];else{d.notes="";for(var u=1;u<c.length;u++)if(d.notes=d.notes+c[u]+"\n","NO_TYPE"===c[u]){s=!0;break}}s||(""===d.username&&(d.username=null),""===d.password&&(d.password=null),""===d.notes&&(d.notes=null),""===d.uri&&(d.uri=null),r.push(d))}}n(a,r,i)}})}function S(e,t,o){function a(e,t,n){var o=e.find('> Groups > Group[ID="'+t+'"]');if(o.length){n&&""!==n&&(n=" > "+n),n=o.attr("Name")+n;return a(e,o.attr("ParentID"),n)}return n}function i(e){var r=$(e),i=r.find("root > Database");if(i.length){var u=i.find("> Logins > Login");if(u.length)for(var p=0;p<u.length;p++){var g=$(u[p]),m=g.attr("Name"),f=g.attr("Password"),h=g.attr("ID"),v=null,y=null,w=null,b=null,C=null;if(h&&""!==h){var S=i.find('> Accounts > Account > LoginLinks > Login[SourceLoginID="'+h+'"]');if(S.length){var k=S.parent().parent();k.length&&(v=k.attr("Name"),y=k.attr("Link"),b=k.attr("ParentID"),(w=k.attr("Comments"))&&(w=w.split("/n").join("\n")))}}b&&""!==b&&(C=a(i,b,""));var P=l.length,I=s.length,T=C&&""!==C,z=T;if(T)for(d=0;d<l.length;d++)if(l[d].name===C){z=!1,P=d;break}var O={favorite:!1,uri:y&&""!==y?n(y):null,username:m&&""!==m?m:null,password:f&&""!==f?f:null,notes:w&&""!==w?w:null,name:v&&""!==v?v:"--"};if(s.push(O),z&&l.push({name:C}),T){var E={key:I,value:P};c.push(E)}}t(l,s,c)}else o()}var l=[],s=[],c=[],d=0;r(e,i,o)}function k(e,t,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var a=[],r=[],i=[];angular.forEach(e.data,function(e,t){if(e.length>=3){var o=a.length,l=r.length,s=e[0]&&""!==e[0]&&"Unassigned"!==e[0],c=s,d=0;if(s)for(d=0;d<a.length;d++)if(a[d].name===e[0]){c=!1,o=d;break}var u={favorite:!1,uri:null,username:null,password:null,notes:"",name:e[2]&&""!==e[2]?e[2]:null};if("Web Logins"===e[1])u.uri=e[4]&&""!==e[4]?n(e[4]):null,u.username=e[5]&&""!==e[5]?e[5]:null,u.password=e[6]&&""!==e[6]?e[6]:null,u.notes=e[3]&&""!==e[3]?e[3].split("\\n").join("\n"):null;else if(e.length>3)for(var p=3;p<e.length;p++)e[p]&&""!==e[p]&&(""!==u.notes&&(u.notes=u.notes+"\n"),u.notes=u.notes+e[p]);if(e[1]&&""!==e[1]&&"Web Logins"!==e[1]&&(u.name=e[1]+": "+u.name),""===u.notes&&(u.notes=null),r.push(u),c&&a.push({name:e[0]}),s){var g={key:l,value:o};i.push(g)}}}),t(a,r,i)}})}function P(e,t,a){var r=[],i=[],l=[],s=["kind","autologin","favorite","hexcolor","protectedwithpassword","subdomainonly","type","tk_export_version","note","title","document_content"];Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),angular.forEach(e.data,function(e,t){var o={favorite:!(!e.favorite||"true"!==e.favorite.toLowerCase()),uri:e.url&&""!==e.url?n(e.url):null,username:e.login&&""!==e.login?e.login:null,password:e.password&&""!==e.password?e.password:null,notes:e.memo&&""!==e.memo?e.memo:null,name:e.name&&""!==e.name?e.name:"--"};if("login"!==e.kind){o.name=e.title&&""!==e.title?e.title:"--",o.notes=e.note&&""!==e.note?e.note:null,o.notes||(o.notes=e.document_content&&""!==e.document_content?e.document_content:null);for(var a in e)e.hasOwnProperty(a)&&s.indexOf(a.toLowerCase())<0&&e[a]&&""!==e[a]&&(o.notes?o.notes+="\n":o.notes="",o.notes+=a+": "+e[a])}i.push(o)}),t(r,i,l)}})}function I(t,o,r){function i(t){var a=$(t),r=a.find("textarea"),i=r&&r.length?r.val():null,d=i?JSON.parse(i):null;if(d&&d.length)for(var u=0;u<d.length;u++){var p=d[u],g={favorite:!1,uri:null,username:null,password:null,notes:"",name:p.label&&""!==p.label?p.label.split(" ")[0]:"--"};if(p.data&&p.data.notes&&""!==p.data.notes&&(g.notes=p.data.notes.split("\\n").join("\n")),p.currentVersion&&p.currentVersion.fields)for(var m in p.currentVersion.fields)if(p.currentVersion.fields.hasOwnProperty(m)){var f=p.currentVersion.fields[m],h=f.actionType.toLowerCase();switch(h){case"password":g.password=f.value;break;case"email":case"username":case"user":case"name":g.username=f.value;break;case"url":g.uri=n(f.value);break;default:!g.username&&e(f.label,F)?g.username=f.value:!g.password&&e(f.label,D)?g.password=f.value:(g.notes&&""!==g.notes&&(g.notes=g.notes+"\n"),g.notes=g.notes+f.label+": "+f.value)}}""===g.notes&&(g.notes=null),s.push(g)}o(l,s,c)}var l=[],s=[],c=[];a(t,i,r)}function T(e,n,o){function r(e){var o=JSON.parse(e);if(o&&o.accounts)for(c=0;c<o.accounts.length;c++){var a=o.accounts[c],r={favorite:a.is_favorite&&!0===a.is_favorite,uri:a.domain&&""!==a.domain?t(a.domain):null,username:a.username&&""!==a.username?a.username:null,password:a.password&&""!==a.password?a.password:null,notes:null,name:a.label&&""!==a.label?a.label:a.domain};a.email&&""!==a.email&&(r.username&&""!==r.username?r.notes=a.email:r.username=a.email),r.name&&""!==r.name||(r.name="--"),l.push(r)}n(i,l,s)}var i=[],l=[],s=[],c=0;a(e,r,o)}function z(n,o,r){function i(n){var a=$(n.split("­").join("").split("<WBR>").join("")),r=a.find("table.nobr");if(r.length)for(var i=0;i<r.length;i++){var d=$(r[i]),u={favorite:!1,uri:null,username:null,password:null,notes:"",name:d.find("span.caption").text()},p=d.find(".subcaption").text();p&&""!==p&&(u.uri=t(p));var g=[];if($.each(d.find("table td:not(.subcaption)"),function(e,t){$(t).find("br").replaceWith("\n");var n=$(t).text();""!==n&&g.push(n.split("\\n").join("\n"))}),g.length&&g.length%2==0)for(var m=0;m<g.length;m+=2){var f=g[m],h=g[m+1];!u.password&&e(f.replace(":",""),D)?u.password=h:!u.username&&e(f.replace(":",""),F)?u.username=h:(""!==u.notes&&(u.notes=u.notes+"\n"),u.notes=u.notes+f+" "+h)}u.notes&&""!==u.notes||(u.notes=null),u.name&&""!==u.name||(u.name="--"),s.push(u)}o(l,s,c)}var l=[],s=[],c=[];a(n,i,r)}function O(e,t,a){function r(e){var t=document.createElement("a");return t.href=e,t.hostname.startsWith("www.")?t.hostname.replace("www.",""):t.hostname}var i=[],l=[],s=[];Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),angular.forEach(e.data,function(e,t){l.push({favorite:!1,uri:e.url&&""!==e.url?n(e.url):null,username:e.username&&""!==e.username?e.username:null,password:e.password&&""!==e.password?e.password:null,notes:e.notes&&""!==e.notes?e.notes:null,name:e.url&&""!==e.url?r(e.url):"--"})}),t(i,l,s)}})}function E(n,a,r){Papa.parse(n,{encoding:"UTF-8",complete:function(n){o(n);for(var r=[],i=[],l=[],s=0;s<n.data.length;s++){var c=n.data[s];if(!(c.length<2)){var d=c[c.length-1],u={name:c[0],favorite:!1,uri:null,password:null,username:null,notes:d&&""!==d?d:null};if(c.length>2&&c.length%2==0)for(var p=0;p<c.length-2;p+=2){var g=c[p+2],m=c[p+1];if(m&&""!==m&&g&&""!==g){m.toLowerCase();!u.uri&&e(m,M)?u.uri=t(g):!u.username&&e(m,F)?u.username=g:!u.password&&e(m,D)?u.password=g:(u.notes?u.notes+="\n":u.notes="",u.notes+=m+": "+g)}}i.push(u)}}a(r,i,l)}})}function x(e,n,o){function r(e){var o=JSON.parse(e);if(o&&o.length)for(c=0;c<o.length;c++){var a=o[c],r={favorite:!1,uri:a.login_url&&""!==a.login_url?t(a.login_url):null,username:null,password:null,notes:"",name:a.name&&""!==a.name?a.name:"--"};if(a.identifiers){a.identifiers.notes&&""!==a.identifiers.notes&&(r.notes=a.identifiers.notes.split("\\r\\n").join("\n").split("\\n").join("\n"));for(var d in a.identifiers)if(a.identifiers.hasOwnProperty(d)){var u=a.identifiers[d];if("notes"===d||""===u||null===u)continue;"username"===d?r.username=u:"password"===d?r.password=u:(""!==r.notes&&(r.notes+="\n"),r.notes+=d+": "+u)}""===r.notes&&(r.notes=null),l.push(r)}}n(i,l,s)}var i=[],l=[],s=[],c=0;a(e,r,o)}function A(e,n,a){function r(e,t){if(e&&""!==e)for(var n=e.split(/(?:\r\n|\r|\n)/),o=0;o<n.length;o++){var a=n[o],r=a.indexOf(":");if(!(r<0)){var i=a.substring(0,r),l=a.length>r?a.substring(r+1):null;if(i&&""!==i&&l&&""!==l&&"SecretType"!==i){var s=i.toLowerCase();"user name"===s?t.username=l:"password"===s?t.password=l:(""!==t.notes&&(t.notes+="\n"),t.notes+=i+": "+l)}}}}Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var a=[],i=[],l=[];angular.forEach(e.data,function(e,n){var o=e.ChamberName,s=a.length,c=i.length,d=o&&""!==o,u=d,p=0;if(d)for(p=0;p<a.length;p++)if(a[p].name===o){u=!1,s=p;break}var g={favorite:!(!e.Favorite||"1"!==e.Favorite),uri:e["Secret URL"]&&""!==e["Secret URL"]?t(e["Secret URL"]):null,username:null,password:null,notes:e.Notes&&""!==e.Notes?e.Notes:"",name:e["Secret Name"]&&""!==e["Secret Name"]?e["Secret Name"]:"--"};if(r(e.SecretData,g),r(e.CustomData,g),""===g.notes&&(g.notes=null),e["Secret Name"]&&i.push(g),u&&a.push({name:o}),d){var m={key:c,value:s};l.push(m)}}),n(a,i,l)}})}function L(e,n,a){Papa.parse(e,{encoding:"UTF-8",complete:function(e){function a(e,t,n){for(var o=e;o<t.length-3;o++)t[o]&&""!==t[o]&&(n.notes?""!==n.notes&&(n.notes+="\n"):n.notes="",n.notes+=t[o])}o(e);for(var r=[],i=[],l=[],s=1;s<e.data.length;s++)if(!(e.data[s].length<3)){var c=e.data[s],d=c[e.data.length-1],u=c[e.data.length-2],p=c[0],g=r.length,m=i.length,f=d&&""!==d&&"Unfiled"!==d,h=f,v=0;if(f)for(v=0;v<r.length;v++)if(r[v].name===d){h=!1,g=v;break}var y={favorite:!1,uri:null,username:null,password:null,notes:u,name:c[1]&&""!==c[1]?c[1]:"--"};if("Web Logins"===p||"Servers"===p||"Email Accounts"===p?(y.uri=c[4]&&""!==c[4]?t(c[4]):null,y.username=c[2]&&""!==c[2]?c[2]:null,y.password=c[3]&&""!==c[3]?c[3]:null,a(5,c,y)):c.length>2&&a(2,c,y),y.name&&"--"!==y.name&&"Web Logins"!==p&&"Servers"!==p&&"Email Accounts"!==p&&(y.name=p+": "+y.name),""===y.notes&&(y.notes=null),i.push(y),h&&r.push({name:d}),f){var w={key:m,value:g};l.push(w)}}n(r,i,l)}})}var U={};U.import=function(e,t,n,o){if(!t)return void o();switch(e){case"bitwardencsv":i(t,n,o);break;case"lastpass":l(t,n,o);break;case"safeincloudxml":s(t,n,o);break;case"keepass2xml":d(t,n,o);break;case"keepassxcsv":u(t,n,o);break;case"padlockcsv":c(t,n,o);break;case"1password1pif":p(t,n,o);break;case"1password6wincsv":g(t,n,o);break;case"chromecsv":m(t,n,o);break;case"firefoxpasswordexportercsvxml":f(t,n,o);break;case"upmcsv":h(t,n,o);break;case"keepercsv":v(t,n,o);break;case"passworddragonxml":y(t,n,o);break;case"enpasscsv":w(t,n,o);break;case"pwsafexml":b(t,n,o);break;case"dashlanecsv":C(t,n,o);break;case"stickypasswordxml":S(t,n,o);break;case"msecurecsv":k(t,n,o);break;case"truekeycsv":P(t,n,o);break;case"clipperzhtml":I(t,n,o);break;case"avirajson":T(t,n,o);break;case"roboformhtml":z(t,n,o);break;case"saferpasscsv":O(t,n,o);break;case"ascendocsv":E(t,n,o);break;case"passwordbossjson":x(t,n,o);break;case"zohovaultcsv":A(t,n,o);break;case"splashidcsv":L(t,n,o);break;default:o()}};var D=["password","pass word","passphrase","pass phrase","pass","code","code word","codeword","secret","secret word","key","keyword","key word","keyphrase","key phrase","form_pw","wppassword","pin","pwd","pw","pword","passwd","p","serial","serial#","license key","reg #","passwort"],F=["user","name","user name","username","login name","email","e-mail","id","userid","user id","login","form_loginname","wpname","mail","loginid","login id","log","first name","last name","card#","account #","member","member #","nom","benutzername"],M=["url","hyper link","hyperlink","link","host","hostname","host name","server","address","hyper ref","href","web","website","web site","site","web-site","ort","adresse"];return U}),angular.module("bit.services").factory("passwordService",function(){function e(t,n){var o=0,a=n-t,r=Math.ceil(Math.log2(a));if(r>53)throw new Exception("We cannot generate numbers larger than 53 bits.");var i=Math.ceil(r/8),l=Math.pow(2,r)-1,s=new Uint8Array(i);window.crypto.getRandomValues(s);for(var c=8*(i-1),d=0;d<i;d++)o+=s[d]*Math.pow(2,c),c-=8;return o&=l,o>=a?e(t,n):t+o}var t={};return t.generatePassword=function(t){var n={length:10,ambiguous:!1,number:!0,minNumber:1,uppercase:!0,minUppercase:1,lowercase:!0,minLowercase:1,special:!1,minSpecial:1},o=angular.extend({},n,t);o.uppercase&&o.minUppercase<0&&(o.minUppercase=1),o.lowercase&&o.minLowercase<0&&(o.minLowercase=1),o.number&&o.minNumber<0&&(o.minNumber=1),o.special&&o.minSpecial<0&&(o.minSpecial=1),(!o.length||o.length<1)&&(o.length=10);var a=o.minUppercase+o.minLowercase+o.minNumber+o.minSpecial;o.length<a&&(o.length=a);var r=[];if(o.lowercase&&o.minLowercase>0)for(var i=0;i<o.minLowercase;i++)r.push("l");if(o.uppercase&&o.minUppercase>0)for(var l=0;l<o.minUppercase;l++)r.push("u");if(o.number&&o.minNumber>0)for(var s=0;s<o.minNumber;s++)r.push("n");if(o.special&&o.minSpecial>0)for(var c=0;c<o.minSpecial;c++)r.push("s");for(;r.length<o.length;)r.push("a");r.sort(function(){return 2*e(0,1)-1});var d="",u="abcdefghijkmnopqrstuvwxyz";o.ambiguous&&(u+="l"),o.lowercase&&(d+=u);var p="ABCDEFGHIJKLMNPQRSTUVWXYZ";o.ambiguous&&(p+="O"),o.uppercase&&(d+=p);var g="23456789";o.ambiguous&&(g+="01"),o.number&&(d+=g);o.special&&(d+="!@#$%^&*");for(var m="",f=0;f<o.length;f++){var h;switch(r[f]){case"l":h=u;break;case"u":h=p;break;case"n":h=g;break;case"s":h="!@#$%^&*";break;case"a":h=d}var v=e(0,h.length-1);m+=h.charAt(v)}return m},t}),angular.module("bit.services").factory("tokenService",["$sessionStorage","jwtHelper",function(e,t){var n={},o=null,a=null;return n.setToken=function(t){e.accessToken=t,o=t},n.getToken=function(){return o||(o=e.accessToken),o||null},n.clearToken=function(){o=null,delete e.accessToken},n.setRefreshToken=function(t){e.refreshToken=t,a=t},n.getRefreshToken=function(){return a||(a=e.refreshToken),a||null},n.clearRefreshToken=function(){a=null,delete e.refreshToken},n.tokenSecondsRemaining=function(e,n){var o=t.getTokenExpirationDate(e);if(n=n||0,null===o)return 0;var a=o.valueOf()-((new Date).valueOf()+1e3*n);return Math.round(a/1e3)},n.tokenNeedsRefresh=function(e,t){return t=t||5,n.tokenSecondsRemaining(e)<60*t},n}]),angular.module("bit.services").factory("validationService",function(){var e={};return e.addErrors=function(t,n){var o=n.data;if(t.$errors=[],!o||!angular.isObject(o))return void t.$errors.push("An unexpected error has occured.");if(o&&o.ErrorModel&&(o=o.ErrorModel),!o.ValidationErrors)return void(o.Message?t.$errors.push(o.Message):t.$errors.push("An unexpected error has occured."));for(var a in o.ValidationErrors)if(o.ValidationErrors.hasOwnProperty(a))for(var r=0;r<o.ValidationErrors[a].length;r++)e.addError(t,a,o.ValidationErrors[a][r])},e.addError=function(e,t,n,o){!o&&e.$errors||(e.$errors=[]);for(var a=!0,r=0;r<e.$errors.length;r++)if(e.$errors[r]===n){a=!1;break}a&&e.$errors.push(n),t&&""!==t&&e[t]&&e[t].$registerApiError&&e[t].$registerApiError()},e}),angular.module("bit.vault").controller("settingsAddEditEquivalentDomainController",["$scope","$uibModalInstance","$analytics","domainIndex","domains",function(e,t,n,o,a){n.eventTrack("settingsAddEditEquivalentDomainController",{category:"Modal"}),e.domains=a,e.index=o,e.submit=function(a){n.eventTrack((o?"Edited":"Added")+" Equivalent Domain"),t.close({domains:e.domains,index:o})},e.close=function(){t.dismiss("close")}}]),angular.module("bit.settings").controller("settingsChangeEmailController",["$scope","$state","apiService","$uibModalInstance","cryptoService","cipherService","authService","$q","toastr","$analytics",function(e,t,n,o,a,r,i,l,s,c){c.eventTrack("settingsChangeEmailController",{category:"Modal"});var d,u,p;e.token=function(t){d=a.hashPassword(t.masterPassword);var o=t.newEmail.toLowerCase(),r={newEmail:o,masterPasswordHash:d};e.tokenPromise=n.accounts.emailToken(r,function(){p=a.makeKey(t.masterPassword,o),u=a.hashPassword(t.masterPassword,p),e.tokenSent=!0}).$promise},e.confirm=function(g){e.processing=!0;var m=[],f=n.logins.list({},function(e){for(var t=[],n=0;n<e.Data.length;n++)e.Data[n].OrganizationId||t.push(e.Data[n]);var o=r.decryptLogins(t);m=r.encryptLogins(o,p)}).$promise,h=[],v=n.folders.list({},function(e){var t=r.decryptFolders(e.Data);h=r.encryptFolders(t,p)}).$promise,y=a.getPrivateKey("raw"),w=null;y&&(w=a.encrypt(y,p,"raw")),l.all([f,v]).then(function(){var a={token:g.token,newEmail:g.newEmail.toLowerCase(),masterPasswordHash:d,newMasterPasswordHash:u,data:{ciphers:m,folders:h,privateKey:w}};e.confirmPromise=n.accounts.email(a,function(){o.dismiss("cancel"),c.eventTrack("Changed Email"),i.logOut(),t.go("frontend.login.info").then(function(){s.success("Please log back in.","Email Changed")})},function(){o.dismiss("cancel"),s.error("Something went wrong.","Oh No!")}).$promise})},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsChangePasswordController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","cipherService","validationService","$q","toastr","$analytics",function(e,t,n,o,a,r,i,l,s,c,d){d.eventTrack("settingsChangePasswordController",{category:"Modal"}),e.save=function(u,p){var g=!1;e.model.newMasterPassword.length<8&&(l.addError(p,"NewMasterPasswordHash","Master password must be at least 8 characters long.",!0),g=!0),e.model.newMasterPassword!==e.model.confirmNewMasterPassword&&(l.addError(p,"ConfirmNewMasterPasswordHash","New master password confirmation does not match.",!0),g=!0),g||(e.processing=!0,r.getUserProfile().then(function(e){return a.makeKey(u.newMasterPassword,e.email.toLowerCase())}).then(function(l){var p=[],g=n.logins.list({},function(e){for(var t=[],n=0;n<e.Data.length;n++)e.Data[n].OrganizationId||t.push(e.Data[n]);var o=i.decryptLogins(t);p=i.encryptLogins(o,l)}).$promise,m=[],f=n.folders.list({},function(e){var t=i.decryptFolders(e.Data);m=i.encryptFolders(t,l)}).$promise,h=a.getPrivateKey("raw"),v=null;h&&(v=a.encrypt(h,l,"raw")),s.all([g,f]).then(function(){var i={masterPasswordHash:a.hashPassword(u.masterPassword),newMasterPasswordHash:a.hashPassword(u.newMasterPassword,l),data:{ciphers:p,folders:m,privateKey:v}};e.savePromise=n.accounts.putPassword(i,function(){o.dismiss("cancel"),r.logOut(),d.eventTrack("Changed Password"),t.go("frontend.login.info").then(function(){c.success("Please log back in.","Master Password Changed")})},function(){o.dismiss("cancel"),c.error("Something went wrong.","Oh No!")}).$promise})}))},
|
|
e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsController",["$scope","$state","$uibModal","apiService","toastr","authService",function(e,t,n,o,a,r){function i(){$("html, body").animate({scrollTop:0},200)}e.model={profile:{},twoFactorEnabled:!1,email:null},e.$on("$viewContentLoaded",function(){o.accounts.getProfile({},function(t){if(e.model={profile:{name:t.Name,masterPasswordHint:t.MasterPasswordHint,culture:t.Culture},email:t.Email,twoFactorEnabled:t.TwoFactorEnabled},t.Organizations){for(var n=[],o=0;o<t.Organizations.length;o++)2===t.Organizations[o].Status&&n.push({id:t.Organizations[o].Id,name:t.Organizations[o].Name,status:t.Organizations[o].Status,type:t.Organizations[o].Type,enabled:t.Organizations[o].Enabled});e.model.organizations=n}})}),e.generalSave=function(){e.generalPromise=o.accounts.putProfile({},e.model.profile,function(e){r.setUserProfile(e).then(function(e){a.success("Account has been updated.","Success!")})}).$promise},e.passwordHintSave=function(){e.passwordHintPromise=o.accounts.putProfile({},e.model.profile,function(e){r.setUserProfile(e).then(function(e){a.success("Account has been updated.","Success!")})}).$promise},e.changePassword=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsChangePassword.html",controller:"settingsChangePasswordController"})},e.changeEmail=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsChangeEmail.html",controller:"settingsChangeEmailController"})},e.viewOrganization=function(e){if(2===e.type)return i(),void a.error("You cannot manage this organization.");t.go("backend.org.dashboard",{orgId:e.id})},e.leaveOrganization=function(t){confirm("Are you sure you want to leave this organization ("+t.name+")?")&&o.organizations.postLeave({id:t.id},{},function(n){r.refreshAccessToken().then(function(){var n=e.model.organizations.indexOf(t);n>-1&&e.model.organizations.splice(n,1),a.success("You have left the organization."),i()})},function(e){a.error("Unable to leave this organization."),i()})},e.twoFactor=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsTwoFactor.html",controller:"settingsTwoFactorController"}).result.then(function(t){null!==t&&(e.model.twoFactorEnabled=t)})},e.sessions=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsSessions.html",controller:"settingsSessionsController"})},e.delete=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsDelete.html",controller:"settingsDeleteController"})}}]),angular.module("bit.settings").controller("settingsCreateOrganizationController",["$scope","$state","apiService","cryptoService","toastr","$analytics","authService","stripe","constants",function(e,t,n,o,a,r,i,l,s){e.plans=s.plans,e.model={plan:"free",additionalSeats:0,interval:"year",ownedBusiness:!1},e.totalPrice=function(){return"month"===e.model.interval?(e.model.additionalSeats||0)*e.plans[e.model.plan].monthlySeatPrice+e.plans[e.model.plan].monthlyBasePrice:(e.model.additionalSeats||0)*e.plans[e.model.plan].annualSeatPrice+e.plans[e.model.plan].annualBasePrice},e.changedPlan=function(){e.plans[e.model.plan].hasOwnProperty("monthPlanType")&&(e.model.interval="year")},e.changedBusiness=function(){e.model.ownedBusiness&&(e.model.plan="teams")},e.submit=function(s){function c(t){e.model.card=null,r.eventTrack("Created Organization"),i.addProfileOrganizationOwner(t,u),i.refreshAccessToken().then(function(){d(t.Id)},function(){d(t.Id)})}function d(e){t.go("backend.org.dashboard",{orgId:e}).then(function(){a.success("Your new organization is ready to go!","Organization Created")})}var u=o.makeShareKeyCt();if("free"===s.plan){var p={name:s.name,planType:s.plan,key:u,billingEmail:s.billingEmail};e.submitPromise=n.organizations.post(p).$promise.then(c)}else e.submitPromise=l.card.createToken(s.card).then(function(t){var o={name:s.name,planType:"month"===s.interval?e.plans[s.plan].monthPlanType:e.plans[s.plan].annualPlanType,key:u,paymentToken:t.id,additionalSeats:s.additionalSeats,billingEmail:s.billingEmail,businessName:s.ownedBusiness?s.businessName:null};return n.organizations.post(o).$promise}).then(c)}}]),angular.module("bit.settings").controller("settingsDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,a,r,i,l){l.eventTrack("settingsDeleteController",{category:"Modal"}),e.submit=function(s){var c={masterPasswordHash:a.hashPassword(s.masterPassword)};e.submitPromise=n.accounts.postDelete(c,function(){o.dismiss("cancel"),r.logOut(),l.eventTrack("Deleted Account"),t.go("frontend.login.info").then(function(){i.success("Your account has been closed and all associated data has been deleted.","Account Deleted")})}).$promise},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsDomainsController",["$scope","$state","apiService","toastr","$analytics","$uibModal",function(e,t,n,o,a,r){e.globalEquivalentDomains=[],e.equivalentDomains=[],n.settings.getDomains({},function(t){var n;if(t.EquivalentDomains)for(n=0;n<t.EquivalentDomains.length;n++)e.equivalentDomains.push(t.EquivalentDomains[n].join(", "));if(t.GlobalEquivalentDomains)for(n=0;n<t.GlobalEquivalentDomains.length;n++)e.globalEquivalentDomains.push({domains:t.GlobalEquivalentDomains[n].Domains.join(", "),excluded:t.GlobalEquivalentDomains[n].Excluded,key:t.GlobalEquivalentDomains[n].Type})}),e.toggleExclude=function(e){e.excluded=!e.excluded},e.customize=function(t){t.excluded=!0,e.equivalentDomains.push(t.domains)},e.delete=function(t){e.equivalentDomains.splice(t,1),e.$emit("removeAppendedDropdownMenu")},e.addEdit=function(t){r.open({animation:!0,templateUrl:"app/settings/views/settingsAddEditEquivalentDomain.html",controller:"settingsAddEditEquivalentDomainController",resolve:{domainIndex:function(){return t},domains:function(){return null!==t?e.equivalentDomains[t]:null}}}).result.then(function(t){t.domains&&(t.domains=t.domains.split(" ").join("").split(",").join(", ")),null!==t.index?e.equivalentDomains[t.index]=t.domains:e.equivalentDomains.push(t.domains)})},e.saveGlobal=function(){e.globalPromise=i()},e.saveCustom=function(){e.customPromise=i()};var i=function(){for(var t={ExcludedGlobalEquivalentDomains:[],EquivalentDomains:[]},r=0;r<e.globalEquivalentDomains.length;r++)e.globalEquivalentDomains[r].excluded&&t.ExcludedGlobalEquivalentDomains.push(e.globalEquivalentDomains[r].key);for(r=0;r<e.equivalentDomains.length;r++)t.EquivalentDomains.push(e.equivalentDomains[r].split(" ").join("").split(","));return t.EquivalentDomains.length||(t.EquivalentDomains=null),t.ExcludedGlobalEquivalentDomains.length||(t.ExcludedGlobalEquivalentDomains=null),n.settings.putDomains(t,function(e){a.eventTrack("Saved Equivalent Domains"),o.success("Domains have been updated.","Success!")}).$promise}}]),angular.module("bit.settings").controller("settingsSessionsController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,a,r,i,l){l.eventTrack("settingsSessionsController",{category:"Modal"}),e.submit=function(s){var c={masterPasswordHash:a.hashPassword(s.masterPassword)};e.submitPromise=n.accounts.putSecurityStamp(c,function(){o.dismiss("cancel"),r.logOut(),l.eventTrack("Deauthorized Sessions"),t.go("frontend.login.info").then(function(){i.success("Please log back in.","All Sessions Deauthorized")})}).$promise},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsTwoFactorController",["$scope","apiService","$uibModalInstance","cryptoService","authService","$q","toastr","$analytics",function(e,t,n,o,a,r,i,l){function s(e){return e?e.replace(/(.{4})/g,"$1 ").trim().toUpperCase():null}function c(t){var n=t.AuthenticatorKey;e.twoFactorModel={enabled:t.TwoFactorEnabled,key:s(n),recovery:s(t.TwoFactorRecoveryCode),qr:"https://chart.googleapis.com/chart?chs=120x120&chld=L|0&cht=qr&chl=otpauth://totp/"+u+":"+encodeURIComponent(p.email)+"%3Fsecret="+encodeURIComponent(n)+"%26issuer="+u}}l.eventTrack("settingsTwoFactorController",{category:"Modal"});var d,u="bitwarden",p=null;a.getUserProfile().then(function(t){p=t,e.account=p.email,e.enabled=function(){return p.extended&&p.extended.twoFactorEnabled}}),e.auth=function(n){d=o.hashPassword(n.masterPassword),e.authPromise=t.accounts.getTwoFactor({masterPasswordHash:d,provider:0},function(e){c(e)}).$promise},e.update=function(n){var o=e.twoFactorModel.enabled;if(!o||confirm("Are you sure you want to disable two-step login?")){var a={enabled:!o,token:n.token.replace(" ",""),masterPasswordHash:d};e.updatePromise=t.accounts.putTwoFactor({},a,function(t){t.TwoFactorEnabled?(l.eventTrack("Enabled Two-step Login"),i.success("Two-step login has been enabled."),p.extended&&(p.extended.twoFactorEnabled=!0),c(t),$("#token").blur(),n.token=null):(l.eventTrack("Disabled Two-step Login"),i.success("Two-step login has been disabled."),p.extended&&(p.extended.twoFactorEnabled=!1),e.close())}).$promise}},e.print=function(e){l.eventTrack("Print Recovery Code");var t=window.open();t.document.write('<div style="font-size: 18px; text-align: center;"><p>bitwarden two-step login recovery code:</p><pre>'+e+"</pre>"),t.print(),t.close()},e.close=function(){n.close(p.extended?p.extended.twoFactorEnabled:null)}}]),angular.module("bit.tools").controller("toolsController",["$scope","$uibModal","apiService","toastr","authService",function(e,t,n,o,a){e.import=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsImport.html",controller:"toolsImportController"})},e.export=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsExport.html",controller:"toolsExportController"})}}]),angular.module("bit.tools").controller("toolsExportController",["$scope","apiService","authService","$uibModalInstance","cryptoService","cipherService","$q","toastr","$analytics",function(e,t,n,o,a,r,i,l,s){function c(){var e=new Date;return"bitwarden_export_"+e.getFullYear()+d(e.getMonth()+1,2)+d(e.getDate(),2)+d(e.getHours(),2)+d(e.getMinutes(),2)+d(e.getSeconds(),2)+".csv"}function d(e,t,n){return n=n||"0",e+="",e.length>=t?e:new Array(t-e.length+1).join(n)+e}s.eventTrack("toolsExportController",{category:"Modal"}),e.export=function(n){e.startedExport=!0;var o=[],a=[],d=t.folders.list({},function(e){a=r.decryptFolders(e.Data)}).$promise,u=t.logins.list({},function(e){o=r.decryptLogins(e.Data)}).$promise;i.all([d,u]).then(function(){if(!o.length)return l.error("Nothing to export.","Error!"),void e.close();for(var t={},n=0;n<a.length;n++)t[a[n].id]=a[n];try{var r=[];for(n=0;n<o.length;n++){var i={name:o[n].name,uri:o[n].uri,username:o[n].username,password:o[n].password,notes:o[n].notes,folder:o[n].folderId&&o[n].folderId in t?t[o[n].folderId].name:null,favorite:o[n].favorite?1:null};r.push(i)}var d=Papa.unparse(r),u=new Blob([d]);if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveBlob(u,c());else{var p=window.document.createElement("a");p.href=window.URL.createObjectURL(u,{type:"text/plain"}),p.download=c(),document.body.appendChild(p),p.click(),document.body.removeChild(p)}s.eventTrack("Exported Data"),l.success("Your data has been exported. Check your browser's downloads folder.","Success!"),e.close()}catch(t){l.error("Something went wrong. Please try again.","Error!"),e.close()}},function(){l.error("Something went wrong. Please try again.","Error!"),e.close()})},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.tools").controller("toolsImportController",["$scope","$state","apiService","$uibModalInstance","cryptoService","cipherService","toastr","importService","$analytics","$sce","validationService",function(e,t,n,o,a,r,i,l,s,c,d){function u(a,l,c){if(!a.length&&!l.length)return void g("Nothing was imported.");if(l.length){var d=Math.floor(l.length/2),u=l.length-1;if(p(l[0])&&p(l[d])&&p(l[u]))return void g("CSV data is not formatted correctly. Please check your import file and try again.")}n.ciphers.import({folders:r.encryptFolders(a),logins:r.encryptLogins(l),folderRelationships:c},function(){o.dismiss("cancel"),t.go("backend.user.vault",{refreshFromServer:!0}).then(function(){s.eventTrack("Imported Data",{label:e.model.source}),i.success("Data has been successfully imported into your vault.","Import Success")})},g)}function p(e){return!(null!==e.name&&"--"!==e.name||null!==e.password&&""!==e.password)}function g(t){if(s.eventTrack("Import Data Failed",{label:e.model.source}),o.dismiss("cancel"),t){var n=t.data;if(!n||!n.ValidationErrors)return n&&n.Message?void i.error(n.Message):void i.error(t);var a="";for(var r in n.ValidationErrors)if(n.ValidationErrors.hasOwnProperty(r))for(var l=0;l<n.ValidationErrors[r].length;l++)a+=r+": "+n.ValidationErrors[r][l]+" ";if(""!==a)return void i.error(a)}i.error("Something went wrong. Try again.","Oh No!")}s.eventTrack("toolsImportController",{category:"Modal"}),e.model={source:""},e.source={},e.options=[{id:"bitwardencsv",name:"bitwarden (csv)",instructions:c.trustAsHtml('Export using the web vault (vault.bitwarden.com). Log into the web vault and navigate to "Tools" > "Export".')},{id:"lastpass",name:"LastPass (csv)",instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-lastpass/">https://help.bitwarden.com/getting-started/import-from-lastpass/</a>')},{id:"chromecsv",name:"Chrome (csv)",instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-chrome/">https://help.bitwarden.com/getting-started/import-from-chrome/</a>')},{id:"firefoxpasswordexportercsvxml",name:"Firefox Password Exporter (xml)",instructions:c.trustAsHtml('Use the <a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/password-exporter/">Password Exporter</a> addon for FireFox to export your passwords to a XML file. After installing the addon, type <code>about:addons</code> in your FireFox navigation bar. Locate the Password Exporter addon and click the "Options" button. In the dialog that pops up, click the "Export Passwords" button to save the XML file.')},{id:"keepass2xml",name:"KeePass 2 (xml)",instructions:c.trustAsHtml('Using the KeePass 2 desktop application, navigate to "File" > "Export" and select the KeePass XML (2.x) option.')},{id:"keepassxcsv",name:"KeePassX (csv)",instructions:c.trustAsHtml('Using the KeePassX desktop application, navigate to "Database" > "Export to CSV file" and save the CSV file.')},{id:"dashlanecsv",name:"Dashlane (csv)",instructions:c.trustAsHtml('Using the Dashlane desktop application, navigate to "File" > "Export" > "Unsecured archive (readable) in CSV format" and save the CSV file.')},{id:"1password1pif",name:"1Password (1pif)",instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-1password/">https://help.bitwarden.com/getting-started/import-from-1password/</a>')},{id:"1password6wincsv",name:"1Password 6 Windows (csv)",instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-1password/">https://help.bitwarden.com/getting-started/import-from-1password/</a>')},{id:"roboformhtml",name:"RoboForm (html)",instructions:c.trustAsHtml('Using the RoboForm Editor desktop application, navigate to "RoboForm" (top left) > "Print List" > "Logins". When the following print dialog pops up click on the "Save" button and save the HTML file.')},{id:"keepercsv",name:"Keeper (csv)",instructions:c.trustAsHtml('Log into the Keeper web vault (keepersecurity.com/vault). Navigate to "Backup" (top right) and find the "Export to Text File" option. Click "Export Now" to save the TXT/CSV file.')},{id:"enpasscsv",name:"Enpass (csv)",instructions:c.trustAsHtml('Using the Enpass desktop application, navigate to "File" > "Export" > "As CSV". Select "Yes" to the warning alert and save the CSV file.')},{id:"safeincloudxml",name:"SafeInCloud (xml)",instructions:c.trustAsHtml('Using the SaveInCloud desktop application, navigate to "File" > "Export" > "As XML" and save the XML file.')},{id:"pwsafexml",name:"Password Safe (xml)",instructions:c.trustAsHtml('Using the Password Safe desktop application, navigate to "File" > "Export To" > "XML format..." and save the XML file.')},{id:"stickypasswordxml",name:"Sticky Password (xml)",instructions:c.trustAsHtml('Using the Sticky Password desktop application, navigate to "Menu" (top right) > "Export" > "Export all". Select the unencrypted format XML option and then the "Save to file" button. Save the XML file.')},{id:"msecurecsv",name:"mSecure (csv)",instructions:c.trustAsHtml('Using the mSecure desktop application, navigate to "File" > "Export" > "CSV File..." and save the CSV file.')},{id:"truekeycsv",name:"True Key (csv)",instructions:c.trustAsHtml('Using the True Key desktop application, click the gear icon (top right) and then navigate to "App Settings". Click the "Export" button, enter your password and save the CSV file.')},{id:"passwordbossjson",name:"Password Boss (json)",instructions:c.trustAsHtml('Using the Password Boss desktop application, navigate to "File" > "Export data" > "Password Boss JSON - not encrypted" and save the JSON file.')},{id:"zohovaultcsv",name:"Zoho Vault (csv)",instructions:c.trustAsHtml('Log into the Zoho web vault (vault.zoho.com). Navigate to "Tools" > "Export Secrets". Select "All Secrets" and click the "Zoho Vault Format CSV" button. Highlight and copy the data from the textarea. Open a text editor like Notepad and paste the data. Save the data from the text editor as <code>zoho_export.csv</code>.')},{id:"splashidcsv",name:"SplashID (csv)",instructions:c.trustAsHtml('Using the SplashID Safe desktop application, click on the SplashID blue lock logo in the top right corner. Navigate to "Export" > "Export as CSV" and save the CSV file.')},{id:"passworddragonxml",name:"Password Dragon (xml)",instructions:c.trustAsHtml('Using the Password Dragon desktop application, navigate to "File" > "Export" > "To XML". In the dialog that pops up select "All Rows" and check all fields. Click the "Export" button and save the XML file.')},{id:"padlockcsv",name:"Padlock (csv)",instructions:c.trustAsHtml('Using the Padlock desktop application, click the hamburger icon in the top left corner and navigate to "Settings". Click the "Export Data" option. Ensure that the "CSV" option is selected from the dropdown. Highlight and copy the data from the textarea. Open a text editor like Notepad and paste the data. Save the data from the text editor as <code>padlock_export.csv</code>.')},{id:"clipperzhtml",name:"Clipperz (html)",instructions:c.trustAsHtml('Log into the Clipperz web application (clipperz.is/app). Click the hamburger menu icon in the top right to expand the navigation bar. Navigate to "Data" > "Export". Click the "download HTML+JSON" button to save the HTML file.')},{id:"avirajson",name:"Avira (json)",instructions:c.trustAsHtml('Using the Avira browser extension, click your username in the top right corner and navigate to "Settings". Locate the "Export Data" section and click "Export". In the dialog that pops up, click the "Export Password Manager Data" button to save the TXT/JSON file.')},{id:"saferpasscsv",name:"SaferPass (csv)",instructions:c.trustAsHtml('Using the SaferPass browser extension, click the hamburger icon in the top left corner and navigate to "Settings". Click the "Export accounts" button to save the CSV file.')},{id:"upmcsv",name:"Universal Password Manager (csv)",instructions:c.trustAsHtml('Using the Universal Password Manager desktop application, navigate to "Database" > "Export" and save the CSV file.')},{id:"ascendocsv",name:"Ascendo DataVault (csv)",instructions:c.trustAsHtml('Using the Ascendo DataVault desktop application, navigate to "Tools" > "Export". In the dialog that pops up, select the "All Items (DVX, CSV)" option. Click the "Ok" button to save the CSV file.')}],e.setSource=function(){for(var t=0;t<e.options.length;t++)if(e.options[t].id===e.model.source){e.source=e.options[t];break}},e.setSource(),e.import=function(t,n){if(!t.source||""===t.source)return void d.addError(n,"source","Select the format of the import file.",!0);var o=document.getElementById("file").files[0];if(!(o||t.fileContents&&""!==t.fileContents))return void d.addError(n,"file","Select the import file or copy/paste the import file contents.",!0);e.processing=!0,l.import(t.source,o||t.fileContents,u,g)},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultAddFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","$analytics",function(e,t,n,o,a,r){r.eventTrack("vaultAddFolderController",{category:"Modal"}),e.savePromise=null,e.save=function(o){var i=a.encryptFolder(o);e.savePromise=t.folders.post(i,function(e){r.eventTrack("Created Folder");var t=a.decryptFolder(e);n.close(t)}).$promise},e.close=function(){n.dismiss("close")}}]),angular.module("bit.vault").controller("vaultAddLoginController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","selectedFolder","$analytics","checkedFavorite","$rootScope",function(e,t,n,o,a,r,i,l,s,c){function d(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultAddLoginController",{category:"Modal"}),e.folders=c.vaultFolders,e.login={folderId:i?i.id:null,favorite:!0===s},e.savePromise=null,e.save=function(o){var r=a.encryptLogin(o);e.savePromise=t.logins.post(r,function(e){l.eventTrack("Created Login");var t=a.decryptLogin(e);n.close(t)}).$promise},e.generatePassword=function(){e.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Add"),e.login.password=r.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),d(e)},e.clipboardError=function(e,t){t&&d(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.id?e.name.toLowerCase():""},e.close=function(){n.dismiss("close")}}]),angular.module("bit.vault").controller("vaultController",["$scope","$uibModal","apiService","$filter","cryptoService","authService","toastr","cipherService","$q","$localStorage","$timeout","$rootScope","$state","$analytics",function(e,t,n,o,a,r,i,l,s,c,d,u,p,g){function m(){var t=n.folders.list({},function(e){for(var t=[{id:null,name:"No Folder"}],n=0;n<e.Data.length;n++){var o=l.decryptFolderPreview(e.Data[n]);t.push(o)}f(t)}).$promise,o=n.ciphers.list({},function(e){for(var n=[],o=0;o<e.Data.length;o++)if(1===e.Data[o].Type){var a=l.decryptLoginPreview(e.Data[o]);n.push(a)}s.when(t).then(function(){h(n)})}).$promise;s.all([o,t]).then(function(){e.loading=!1})}function f(e){u.vaultFolders=o("orderBy")(e,w)}function h(t){angular.forEach(u.vaultFolders,function(e,n){e.collapsed=c.collapsedFolders&&(e.id||"none")in c.collapsedFolders,angular.forEach(t,function(t){t.favorite?t.sort=-1:t.folderId==e.id&&(t.sort=n)})}),u.vaultLogins=e.logins=o("orderBy")(t,["sort","name","username"]);var n=y(u.vaultLogins,400);if(n.length>0){e.logins=n[0];var a=200;angular.forEach(n,function(t,n){a+=200,n>0&&d(function(){Array.prototype.push.apply(e.logins,t)},a)})}}function v(){u.vaultLogins=e.logins=o("orderBy")(u.vaultLogins,["name","username"])}function y(e,t){for(var n=[],o=0,a=e.length;o<a;)n.push(e.slice(o,o+=t));return n}function w(e){return e.id?e.name.toLowerCase():""}function b(t){var n=u.vaultLogins.indexOf(t);n>-1&&u.vaultLogins.splice(n,1),(n=e.logins.indexOf(t))>-1&&e.logins.splice(n,1)}e.loading=!0,e.logins=[],e.favoriteCollapsed=c.collapsedFolders&&"favorite"in c.collapsedFolders,p.params.refreshFromServer&&(u.vaultFolders=u.vaultLogins=null),e.$on("$viewContentLoaded",function(){if(u.vaultFolders&&u.vaultLogins)return e.loading=!1,f(u.vaultFolders),void h(u.vaultLogins);m()}),e.collapseExpand=function(e,t){c.collapsedFolders||(c.collapsedFolders={});var n=t?"favorite":e.id||"none";n in c.collapsedFolders?delete c.collapsedFolders[n]:c.collapsedFolders[n]=!0},e.editLogin=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultEditLogin.html",controller:"vaultEditLoginController",resolve:{loginId:function(){return e.id}}}).result.then(function(t){"edit"===t.action?(e.folderId=t.data.folderId,e.name=t.data.name,e.username=t.data.username,e.favorite=t.data.favorite,v()):"partialEdit"===t.action?(e.folderId=t.data.folderId,e.favorite=t.data.favorite):"delete"===t.action&&b(e)})},e.$on("vaultAddLogin",function(t,n){e.addLogin()}),e.addLogin=function(e,n){t.open({animation:!0,templateUrl:"app/vault/views/vaultAddLogin.html",controller:"vaultAddLoginController",resolve:{selectedFolder:function(){return e},checkedFavorite:function(){return n}}}).result.then(function(e){u.vaultLogins.push(e),v()})},e.deleteLogin=function(e){confirm("Are you sure you want to delete this login ("+e.name+")?")&&n.logins.del({id:e.id},function(){g.eventTrack("Deleted Login"),b(e)})},e.editFolder=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultEditFolder.html",controller:"vaultEditFolderController",size:"sm",resolve:{folderId:function(){return e.id}}}).result.then(function(t){e.name=t.name})},e.$on("vaultAddFolder",function(t,n){e.addFolder()}),e.addFolder=function(){t.open({animation:!0,templateUrl:"app/vault/views/vaultAddFolder.html",controller:"vaultAddFolderController",size:"sm"}).result.then(function(e){u.vaultFolders.push(e),f(u.vaultFolders)})},e.deleteFolder=function(e){confirm("Are you sure you want to delete this folder ("+e.name+")?")&&n.folders.del({id:e.id},function(){g.eventTrack("Deleted Folder");var t=u.vaultFolders.indexOf(e);t>-1&&u.vaultFolders.splice(t,1)})},e.canDeleteFolder=function(e){if(!e||!e.id||!u.vaultLogins)return!1;var t=o("filter")(u.vaultLogins,{folderId:e.id});return t&&0===t.length},e.share=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultShareLogin.html",controller:"vaultShareLoginController",resolve:{loginId:function(){return e.id}}}).result.then(function(t){e.organizationId=t})},e.collections=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultLoginCollections.html",controller:"vaultLoginCollectionsController",resolve:{loginId:function(){return e.id}}}).result.then(function(t){t.collectionIds&&!t.collectionIds.length&&b(e)})}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,n,o,a,r,i){i.eventTrack("vaultEditFolderController",{category:"Modal"}),e.folder={},t.folders.get({id:r},function(t){e.folder=a.decryptFolder(t)}),e.savePromise=null,e.save=function(o){var l=a.encryptFolder(o);e.savePromise=t.folders.put({id:r},l,function(e){i.eventTrack("Edited Folder");var t=a.decryptFolder(e);n.close(t)}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultEditLoginController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","loginId","$analytics","$rootScope",function(e,t,n,o,a,r,i,l,s){function c(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultEditLoginController",{category:"Modal"}),e.folders=s.vaultFolders,e.login={},e.readOnly=!1,t.logins.get({id:i},function(t){e.login=a.decryptLogin(t),e.readOnly=!t.Edit}),e.save=function(o){if(e.readOnly)e.savePromise=t.ciphers.putPartial({id:i},{folderId:o.folderId,favorite:o.favorite},function(e){l.eventTrack("Partially Edited Login"),n.close({action:"partialEdit",data:{id:i,favorite:o.favorite,folderId:o.folderId&&""!==o.folderId?o.folderId:null}})}).$promise;else{var r=a.encryptLogin(o);e.savePromise=t.logins.put({id:i},r,function(e){l.eventTrack("Edited Login");var t=a.decryptLogin(e);n.close({action:"edit",data:t})}).$promise}},e.generatePassword=function(){e.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Edit"),e.login.password=r.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),c(e)},e.clipboardError=function(e,t){t&&c(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.id?e.name.toLowerCase():""},e.delete=function(){confirm("Are you sure you want to delete this login ("+e.login.name+")?")&&t.logins.del({id:e.login.id},function(){l.eventTrack("Deleted Login From Edit"),n.close({action:"delete",data:e.login.id})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultLoginCollectionsController",["$scope","apiService","$uibModalInstance","cipherService","loginId","$analytics",function(e,t,n,o,a,r){r.eventTrack("vaultLoginCollectionsController",{category:"Modal"}),e.login={},e.readOnly=!1,e.loadingLogin=!0,e.loadingCollections=!0,e.selectedCollections={},e.collections=[],n.opened.then(function(){t.ciphers.getDetails({id:a}).$promise.then(function(t){if(e.loadingLogin=!1,e.readOnly=!t.Edit,t.Edit&&t.OrganizationId){1===t.Type&&(e.login=o.decryptLoginPreview(t));var n={};if(t.CollectionIds)for(var a=0;a<t.CollectionIds.length;a++)n[t.CollectionIds[a]]=!0;return e.selectedCollections=n,t}return null}).then(function(n){if(!n)return void(e.loadingCollections=!1);t.collections.listMe(function(t){for(var a=[],r=0;r<t.Data.length;r++)if(t.Data[r].OrganizationId!==n.OrganizationId||t.Data[r].ReadOnly)t.Data[r].Id in e.selectedCollections&&delete e.selectedCollections[t.Data[r].Id];else{var i=o.decryptCollection(t.Data[r]);a.push(i)}e.loadingCollections=!1,e.collections=a})})}),e.toggleCollectionSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.collections.length;o++)n[e.collections[o].id]=!0;e.selectedCollections=n},e.toggleCollectionSelection=function(t){t in e.selectedCollections?delete e.selectedCollections[t]:e.selectedCollections[t]=!0},e.collectionSelected=function(t){return t.id in e.selectedCollections},e.allSelected=function(){return Object.keys(e.selectedCollections).length===e.collections.length},e.submit=function(){var o={collectionIds:[]};for(var i in e.selectedCollections)e.selectedCollections.hasOwnProperty(i)&&o.collectionIds.push(i);e.submitPromise=t.ciphers.putCollections({id:a},o).$promise.then(function(e){r.eventTrack("Edited Login Collections"),n.close({action:"collectionsEdit",collectionIds:o.collectionIds})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultShareLoginController",["$scope","apiService","$uibModalInstance","authService","cipherService","loginId","$analytics","$state",function(e,t,n,o,a,r,i,l){i.eventTrack("vaultShareLoginController",{category:"Modal"}),e.model={},e.login={},e.collections=[],e.selectedCollections={},e.organizations=[];var s={};e.loadingCollections=!0,e.loading=!0,e.readOnly=!1,t.logins.get({id:r}).$promise.then(function(t){return e.readOnly=!t.Edit,t.Edit&&(e.login=a.decryptLogin(t)),t.Edit}).then(function(t){if(e.loading=!1,t)return o.getUserProfile()}).then(function(n){if(n&&n.organizations){var o=[],r=!1;for(var i in n.organizations)n.organizations.hasOwnProperty(i)&&n.organizations[i].enabled&&(o.push({id:n.organizations[i].id,name:n.organizations[i].name}),s[n.organizations[i].id]=0,r||(r=!0,e.model.organizationId=n.organizations[i].id));e.organizations=o,t.collections.listMe(function(t){for(var n=[],o=0;o<t.Data.length;o++)if(!t.Data[o].ReadOnly){var r=a.decryptCollection(t.Data[o]);r.organizationId=t.Data[o].OrganizationId,n.push(r),s[r.organizationId]++}e.collections=n,e.loadingCollections=!1})}}),e.toggleCollectionSelectionAll=function(t){var n={}
|
|
;if(t.target.checked)for(var o=0;o<e.collections.length;o++)e.model.organizationId&&e.collections[o].organizationId===e.model.organizationId&&!e.collections[o].readOnly&&(n[e.collections[o].id]=!0);e.selectedCollections=n},e.toggleCollectionSelection=function(t){t in e.selectedCollections?delete e.selectedCollections[t]:e.selectedCollections[t]=!0},e.collectionSelected=function(t){return t.id in e.selectedCollections},e.allSelected=function(){return!!e.model.organizationId&&Object.keys(e.selectedCollections).length===s[e.model.organizationId]},e.orgChanged=function(){e.selectedCollections={}},e.submitPromise=null,e.submit=function(o){e.login.organizationId=o.organizationId;var l={collectionIds:[],cipher:a.encryptLogin(e.login)};for(var s in e.selectedCollections)e.selectedCollections.hasOwnProperty(s)&&l.collectionIds.push(s);e.submitPromise=t.ciphers.putShare({id:r},l,function(e){i.eventTrack("Shared Login"),n.close(o.organizationId)}).$promise},e.close=function(){n.dismiss("cancel")},e.createOrg=function(){l.go("backend.user.settingsCreateOrg").then(function(){n.dismiss("cancel")})}}]),angular.module("bit.vault").controller("vaultSharedController",["$scope","apiService","cipherService","$analytics","$q","$localStorage","$uibModal","$filter","$rootScope",function(e,t,n,o,a,r,i,l,s){function c(e){if(s.vaultLogins){var t=l("filter")(s.vaultLogins,{id:e.id});if(t&&t.length)return t[0]}return null}function d(e){if(e&&e.id){var t=s.vaultLogins.indexOf(e);t>-1&&s.vaultLogins.splice(t,1)}}e.logins=[],e.collections=[],e.loading=!0,e.$on("$viewContentLoaded",function(){var o=t.collections.listMe({},function(t){for(var o=[],a=0;a<t.Data.length;a++){var i=n.decryptCollection(t.Data[a],null,!0);i.collapsed=r.collapsedCollections&&i.id in r.collapsedCollections,o.push(i)}e.collections=o}).$promise,i=t.ciphers.listDetails({},function(t){for(var o=[],a=0;a<t.Data.length;a++)if(1===t.Data[a].Type){var i=n.decryptLoginPreview(t.Data[a]);o.push(i)}o.length&&e.collections.push({id:null,name:"Unassigned",collapsed:r.collapsedCollections&&"unassigned"in r.collapsedCollections}),e.logins=o}).$promise;a.all([o,i]).then(function(){e.loading=!1})}),e.filterByCollection=function(e){return function(t){return t.collectionIds&&t.collectionIds.length?t.collectionIds.indexOf(e.id)>-1:null===e.id}},e.collectionSort=function(e){return e.id?e.name.toLowerCase():""},e.collapseExpand=function(e){r.collapsedCollections||(r.collapsedCollections={});var t=e.id||"unassigned";t in r.collapsedCollections?delete r.collapsedCollections[t]:r.collapsedCollections[t]=!0},e.editLogin=function(t){i.open({animation:!0,templateUrl:"app/vault/views/vaultEditLogin.html",controller:"vaultEditLoginController",resolve:{loginId:function(){return t.id}}}).result.then(function(n){var o=c(t)||{};if("edit"===n.action)t.folderId=o.folderId=n.data.folderId,t.name=o.name=n.data.name,t.username=o.username=n.data.username,t.favorite=o.favorite=n.data.favorite;else if("partialEdit"===n.action)t.folderId=o.folderId=n.data.folderId,t.favorite=o.favorite=n.data.favorite;else if("delete"===n.action){var a=e.logins.indexOf(t);a>-1&&e.logins.splice(a,1),d(o)}})},e.editCollections=function(e){i.open({animation:!0,templateUrl:"app/vault/views/vaultLoginCollections.html",controller:"vaultLoginCollectionsController",resolve:{loginId:function(){return e.id}}}).result.then(function(t){t.collectionIds&&(e.collectionIds=t.collectionIds)})},e.removeLogin=function(e,n){if(confirm("Are you sure you want to remove this login ("+e.name+") from the collection ("+n.name+") ?")){for(var a={collectionIds:[]},r=0;r<e.collectionIds.length;r++)e.collectionIds[r]!==n.id&&a.collectionIds.push(e.collectionIds[r]);t.ciphers.putCollections({id:e.id},a).$promise.then(function(t){o.eventTrack("Removed From Collection"),e.collectionIds=a.collectionIds})}}}]); |