mirror of
https://github.com/bitwarden/web
synced 2025-12-10 13:23:15 +00:00
5 lines
148 KiB
JavaScript
5 lines
148 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","bit.reports"]),angular.module("bit").constant("appSettings",{apiUri:"https://api.bitwarden.com",identityUri:"https://identity.bitwarden.com",stripeKey:"pk_live_bpN0P37nMxrMQkcaHXtAybJk",version:"1.13.0",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.reports",["toastr","ngSanitize"]),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","appSettings",function(e,t,n,o,r,a,i,s,l,c,d){l.errorOnUnhandledRejections(!1),s.hashPrefix(""),r.config({urlParam:"access_token3",whiteListedDomains:["api.bitwarden.com","preview-api.bitwarden.com","localhost","192.168.1.6"]});var u;o.tokenGetter=["options","tokenService","authService",function(e,t,n){if(0===e.url.indexOf(d.apiUri)){if(u)return u;var o=t.getToken();if(o)return t.tokenNeedsRefresh(o)?u=n.refreshAccessToken().then(function(e){return u=null,e||o}):o}}],c.setPublishableKey(d.stripeKey),angular.extend(i,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),a.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",controlSidebar:!0},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.reportsBreach",{url:"^/reports/breach",templateUrl:"app/reports/views/reportsBreach.html",controller:"reportsBreachController",data:{pageTitle:"Data Breach Report"}}).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,r,a){if(!r.data||!r.data.authorize){if(r.data&&r.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");r.name.indexOf("backend.org.")>-1&&a.orgId&&(e.vaultLogins=e.vaultFolders=null,t.getUserProfile().then(function(e){var t=e.organizations;t&&a.orgId in t&&2===t[a.orgId].status&&2!==t[a.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},enterprise:{seatPrice:3,annualSeatPrice:36,monthlySeatPrice:4,monthPlanType:"enterpriseMonthly",annualPlanType:"enterpriseAnnually",upgradeSortOrder:3}}}),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","constants","$analytics",function(e,t,n,o,r,a,i,s,l){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(s.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=a.logIn(t.email,t.masterPassword),e.loginPromise.then(function(e){if(t.rememberEmail){var o=new Date;o.setFullYear(o.getFullYear()+10),n.put(s.rememberedEmailCookieName,t.email,{expires:o})}else n.remove(s.rememberedEmailCookieName);e&&e.length>0?(p=t.email,g=t.masterPassword,l.eventTrack("Logged In To Two-step"),i.go("frontend.login.twoFactor",{returnState:d})):(l.eventTrack("Logged In"),c())})},e.twoFactor=function(t){e.twoFactorPromise=a.logIn(p,g,t.code,0),e.twoFactorPromise.then(function(){l.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,r,a){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(){r.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(){a.eventTrack("Accepted Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){r.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(){a.eventTrack("Failed To Accept Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){r.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(r){var a=r.email.toLowerCase(),i=n.makeKey(r.masterPassword,a),s={email:a,masterPasswordHash:n.hashPassword(r.masterPassword,i),recoveryCode:r.code.replace(/\s/g,"").toLowerCase()};e.submitPromise=t.accounts.postTwoFactorRecover(s,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,r,a,i){var s=t.search(),l=i.params;e.createOrg=l.org,!l.returnState&&l.org?e.returnState={name:"backend.user.settingsCreateOrg",params:{plan:i.params.org}}:e.returnState=l.returnState,e.success=!1,e.model={email:s.email?s.email:l.email},e.readOnlyEmail=null!==l.email,e.registerPromise=null,e.register=function(t){var i=!1;if(e.model.masterPassword.length<8&&(r.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),i=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(r.addError(t,"ConfirmMasterPassword","Master password confirmation does not match.",!0),i=!0),!i){var s=e.model.email.toLowerCase(),l=o.makeKey(e.model.masterPassword,s),c=o.makeEncKey(l);e.registerPromise=o.makeKeyPair(c.encKey).then(function(t){var r={name:e.model.name,email:s,masterPasswordHash:o.hashPassword(e.model.masterPassword,l),masterPasswordHint:e.model.masterPasswordHint,key:c.encKeyEnc,keys:{publicKey:t.publicKey,encryptedPrivateKey:t.privateKeyEnc}};return n.accounts.register(r).$promise},function(e){return r.addError(t,null,"Problem generating keys.",!0),!1}).then(function(t){!1!==t&&(e.success=!0,a.eventTrack("Registered"))})}}}]),angular.module("bit.directives").directive("apiField",function(){var e=function(e,t,n,o){function r(){return o.$setValidity("api",!0),!0}function a(){o.$setValidity("api",!1)}o.$registerApiError=a,o.$validators.apiValidate=r};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,r){var a=o.apiForm||null;void 0!==a&&e.$watch(a,n.bind(null,r,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="",r=0;r<t;r++)o+=n[r].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,r){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":r+"px"})}return{restrict:"AE",replace:!0,scope:{data:"@"},link:function(r,a,i){function s(){var i=null,s=r.data.toUpperCase();l.charCount>1&&(i=t(s,l.charCount)),i||(i=s.substr(0,l.charCount));var c=o(i,l.textColor,l.fontFamily,l.fontWeight,l.fontSize),d=l.bgColor?l.bgColor:e(s),u=n(l.width,l.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:r.data});"true"===l.round&&f.css("border-radius","50%"),"true"===l.border&&f.css("border",l.borderStyle),l.class&&f.addClass(l.class),"true"===l.dynamic?(a.empty(),a.append(f)):a.replaceWith(f)}var l={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"===l.dynamic?r.$watch("data",function(){s()}):s()}}}),angular.module("bit.directives").directive("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(n,o,r,a){t.getUserProfile().then(function(t){a.$parsers.unshift(function(n){if(n){var o=e.makeKey(n,t.email),r=o.keyB64===e.getKey().keyB64;return a.$setValidity("masterPassword",r),r?n:void 0}}),a.$formatters.unshift(function(n){if(n){var o=e.makeKey(n,t.email),r=o.keyB64===e.getKey().keyB64;return a.$setValidity("masterPassword",r),n}})})}}}]),angular.module("bit.directives").directive("pageTitle",["$rootScope","$timeout","appSettings",function(e,t,n){return{link:function(n,o){var r=function(e,n,r,a,i){var s="bitwarden Password Manager";n.data&&n.data.pageTitle&&(s=n.data.pageTitle+" - bitwarden Password Manager"),t(function(){o.text(s)})};e.$on("$stateChangeStart",r)}}}]),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.directives").directive("stopClick",function(){return function(e,t,n){$(t).click(function(e){e.preventDefault()})}}),angular.module("bit.directives").directive("stopProp",function(){return function(e,t,n){$(t).click(function(e){e.stopPropagation()})}}),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,r,a,i){var s=this;s.bodyClass="",s.usingControlSidebar=s.openControlSidebar=!1,s.searchVaultText=null,s.version=o.version,e.currentYear=(new Date).getFullYear(),e.$on("$viewContentLoaded",function(){n.getUserProfile().then(function(e){s.userProfile=e}),$.AdminLTE&&($.AdminLTE.layout&&($.AdminLTE.layout.fix(),$.AdminLTE.layout.fixSidebar()),$.AdminLTE.pushMenu&&$.AdminLTE.pushMenu.expandOnHover(),i.off("click",".sidebar li a"))}),e.$on("$stateChangeSuccess",function(e,t,n,o,r){if(s.searchVaultText=null,t.data.bodyClass)return void(s.bodyClass=t.data.bodyClass);s.bodyClass="",s.usingControlSidebar=!!t.data.controlSidebar,s.openControlSidebar=s.usingControlSidebar&&i.width()>768}),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")},e.addOrganizationGroup=function(){e.$broadcast("organizationGroupsAdd")};var l,c,d,u={scrollbarWidth:function(){if(!l){var e=$("body");e.addClass("bit-position-body-scrollbar-measure"),l=a.innerWidth-e[0].clientWidth,l=isFinite(l)?l:0,e.removeClass("bit-position-body-scrollbar-measure")}return l},scrollbarInfo:function(){return{width:u.scrollbarWidth(),visible:i.height()>$(a).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(),r={display:"block",top:o.top+t.outerHeight()};if(c.hasClass("dropdown-menu-right")){var i=u.scrollbarInfo(),s=0;i.visible&&i.width&&(s=i.width),r.right=a.innerWidth-s-(o.left+t.prop("offsetWidth"))+"px",r.left="auto"}else r.left=o.left+"px",r.right="auto";c.css(r)}),$(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,r){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 r in n.organizations)n.organizations.hasOwnProperty(r)&&(n.organizations[r].enabled||n.organizations[r].type<2)&&o.push(n.organizations[r]);e.orgs=o}}),e.viewOrganization=function(e){if(2===e.type)return void o.error("You cannot manage this organization.");r.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){e.toggleControlSidebar=function(){var e=$("body");e.hasClass("control-sidebar-open")?e.removeClass("control-sidebar-open"):e.addClass("control-sidebar-open")}}]),angular.module("bit.organization").controller("organizationBillingAdjustSeatsController",["$scope","$state","$uibModalInstance","apiService","$analytics","toastr","add",function(e,t,n,o,r,a,i){r.eventTrack("organizationBillingAdjustSeatsController",{category:"Modal"}),e.add=i,e.seatAdjustment=0,e.submit=function(){var s={seatAdjustment:e.seatAdjustment};i||(s.seatAdjustment*=-1),e.submitPromise=o.organizations.putSeat({id:t.params.orgId},s).$promise.then(function(t){i?(r.eventTrack("Added Seats"),a.success("You have added "+e.seatAdjustment+" seats.")):(r.eventTrack("Removed Seats"),a.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,r,a,i,s){a.eventTrack("organizationBillingChangePaymentController",{category:"Modal"}),e.existingPaymentMethod=s,e.submit=function(){e.submitPromise=r.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,s?(a.eventTrack("Changed Payment Method"),i.success("You have changed your payment method.")):(a.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,r,a){a.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,r,a){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){a.eventTrack("Canceled Plan"),r.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){a.eventTrack("Reinstated Plan"),r.success("Organization cancellation request has been removed."),i()})}}]),angular.module("bit.organization").controller("organizationCollectionsAddController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","authService",function(e,t,n,o,r,a,i){a.eventTrack("organizationCollectionsAddController",{category:"Modal"});var s=0;e.groups=[],e.selectedGroups={},e.loading=!0,e.useGroups=!1,n.opened.then(function(){return i.getUserProfile()}).then(function(n){if(n.organizations){var r=n.organizations[t.params.orgId];e.useGroups=!!r.useGroups}return e.useGroups?o.groups.listOrganization({orgId:t.params.orgId}).$promise:null}).then(function(t){if(!t)return void(e.loading=!1);for(var n=[],o=0;o<t.Data.length;o++)n.push({id:t.Data[o].Id,name:t.Data[o].Name,accessAll:t.Data[o].AccessAll}),t.Data[o].AccessAll||s++;e.groups=n,e.loading=!1}),e.toggleGroupSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.groups.length;o++)n[e.groups[o].id]={id:e.groups[o].id,readOnly:e.groups[o].id in e.selectedGroups&&e.selectedGroups[e.groups[o].id].readOnly};e.selectedGroups=n},e.toggleGroupSelection=function(t){t in e.selectedGroups?delete e.selectedGroups[t]:e.selectedGroups[t]={id:t,readOnly:!1}},e.toggleGroupReadOnlySelection=function(t){t.id in e.selectedGroups&&(e.selectedGroups[t.id].readOnly=!t.accessAll&&!e.selectedGroups[t.id].readOnly)},e.groupSelected=function(t){return t.id in e.selectedGroups||t.accessAll},e.allSelected=function(){return Object.keys(e.selectedGroups).length>=s},e.submit=function(i){var s=r.encryptCollection(i,t.params.orgId);if(e.useGroups){s.groups=[];for(var l in e.selectedGroups)if(e.selectedGroups.hasOwnProperty(l))for(var c=0;c<e.groups.length;c++)if(e.groups[c].id===e.selectedGroups[l].id){e.groups[c].accessAll||s.groups.push(e.selectedGroups[l]);break}}e.submitPromise=o.collections.post({orgId:t.params.orgId},s,function(e){a.eventTrack("Created Collection");var o=r.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,r,a,i,s){function l(){n.collections.listOrganization({orgId:t.params.orgId},function(n){e.collections=r.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1})}e.collections=[],e.loading=!0,e.$on("$viewContentLoaded",function(){l()}),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=a("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),s.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","authService",function(e,t,n,o,r,a,i,s){a.eventTrack("organizationCollectionsEditController",{category:"Modal"});var l=0;e.collection={},e.groups=[],e.selectedGroups={},e.loading=!0,e.useGroups=!1,n.opened.then(function(){return o.collections.getDetails({orgId:t.params.orgId,id:i}).$promise}).then(function(t){e.collection=r.decryptCollection(t);var n={};if(t.Groups)for(var o=0;o<t.Groups.length;o++)n[t.Groups[o].Id]={id:t.Groups[o].Id,readOnly:t.Groups[o].ReadOnly};return e.selectedGroups=n,s.getUserProfile()}).then(function(n){if(n.organizations){var r=n.organizations[t.params.orgId];e.useGroups=!!r.useGroups}return e.useGroups?o.groups.listOrganization({orgId:t.params.orgId}).$promise:null}).then(function(t){if(!t)return void(e.loading=!1);for(var n=[],o=0;o<t.Data.length;o++)n.push({id:t.Data[o].Id,name:t.Data[o].Name,accessAll:t.Data[o].AccessAll}),t.Data[o].AccessAll||l++;e.groups=n,e.loading=!1}),e.toggleGroupSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.groups.length;o++)n[e.groups[o].id]={id:e.groups[o].id,readOnly:e.groups[o].id in e.selectedGroups&&e.selectedGroups[e.groups[o].id].readOnly};e.selectedGroups=n},e.toggleGroupSelection=function(t){t in e.selectedGroups?delete e.selectedGroups[t]:e.selectedGroups[t]={id:t,readOnly:!1}},e.toggleGroupReadOnlySelection=function(t){t.id in e.selectedGroups&&(e.selectedGroups[t.id].readOnly=!t.accessAll&&!e.selectedGroups[t.id].readOnly)},e.groupSelected=function(t){return t.id in e.selectedGroups||t.accessAll},e.allSelected=function(){return Object.keys(e.selectedGroups).length>=l},e.submit=function(s){var l=r.encryptCollection(s,t.params.orgId);if(e.useGroups){l.groups=[];for(var c in e.selectedGroups)if(e.selectedGroups.hasOwnProperty(c))for(var d=0;d<e.groups.length;d++)if(e.groups[d].id===e.selectedGroups[c].id){e.groups[d].accessAll||l.groups.push(e.selectedGroups[c]);break}}e.submitPromise=o.collections.put({orgId:t.params.orgId,id:i},l,function(e){a.eventTrack("Edited Collection");var o=r.decryptCollection(e,t.params.orgId,!0);n.close(o)}).$promise},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,r,a,i,s){a.eventTrack("organizationCollectionsUsersController",{category:"Modal"}),e.loading=!0,e.collection=i,e.users=[],n.opened.then(function(){e.loading=!1,o.collections.listUsers({orgId:t.params.orgId,id:i.id},function(t){if(t&&t.Data.length){for(var n=[],o=0;o<t.Data.length;o++)n.push({organizationUserId:t.Data[o].OrganizationUserId,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.collections.delUser({orgId:t.params.orgId,id:i.id,orgUserId:n.organizationUserId},null,function(){s.success(n.email+" has been removed.","User Removed"),a.eventTrack("Removed User From Collection");var t=e.users.indexOf(n);t>-1&&e.users.splice(t,1)},function(){s.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,r,a,i,s){s.eventTrack("organizationDeleteController",{category:"Modal"}),e.submit=function(){var l={masterPasswordHash:r.hashPassword(e.masterPassword)};e.submitPromise=n.organizations.del({id:t.params.orgId},l,function(){o.dismiss("cancel"),a.removeProfileOrganization(t.params.orgId),s.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("organizationGroupsAddController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics",function(e,t,n,o,r,a){a.eventTrack("organizationGroupsAddController",{category:"Modal"}),e.collections=[],e.selectedCollections={},e.loading=!0,n.opened.then(function(){return o.collections.listOrganization({orgId:t.params.orgId}).$promise}).then(function(n){e.collections=r.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]={id: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]={id: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.submit=function(r){var i={name:r.name,accessAll:!!r.accessAll,externalId:r.externalId};if(!i.accessAll){i.collections=[];for(var s in e.selectedCollections)e.selectedCollections.hasOwnProperty(s)&&i.collections.push(e.selectedCollections[s])}e.submitPromise=o.groups.post({orgId:t.params.orgId},i,function(e){a.eventTrack("Created Group"),n.close({id:e.Id,name:e.Name})}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationGroupsController",["$scope","$state","apiService","$uibModal","$filter","toastr","$analytics",function(e,t,n,o,r,a,i){function s(){n.groups.listOrganization({orgId:t.params.orgId},function(t){for(var n=[],o=0;o<t.Data.length;o++)n.push({id:t.Data[o].Id,name:t.Data[o].Name});e.groups=n,e.loading=!1})}e.groups=[],e.loading=!0,e.$on("$viewContentLoaded",function(){s()}),e.$on("organizationGroupsAdd",function(t,n){e.add()}),e.add=function(){o.open({animation:!0,templateUrl:"app/organization/views/organizationGroupsAdd.html",controller:"organizationGroupsAddController"}).result.then(function(t){e.groups.push(t)})},e.edit=function(t){o.open({animation:!0,templateUrl:"app/organization/views/organizationGroupsEdit.html",controller:"organizationGroupsEditController",resolve:{id:function(){return t.id}}}).result.then(function(t){var n=r("filter")(e.groups,{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/organizationGroupsUsers.html",controller:"organizationGroupsUsersController",size:"lg",resolve:{group:function(){return e}}}).result.then(function(){})},e.delete=function(o){confirm("Are you sure you want to delete this group ("+o.name+")?")&&n.groups.del({orgId:t.params.orgId,id:o.id},function(){var t=e.groups.indexOf(o);t>-1&&e.groups.splice(t,1),i.eventTrack("Deleted Group"),a.success(o.name+" has been deleted.","Group Deleted")},function(){a.error(o.name+" was not able to be deleted.","Error")})}}]),angular.module("bit.organization").controller("organizationGroupsEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","id",function(e,t,n,o,r,a,i){a.eventTrack("organizationGroupsEditController",{category:"Modal"}),e.collections=[],e.selectedCollections={},e.loading=!0,n.opened.then(function(){return o.groups.getDetails({orgId:t.params.orgId,id:i}).$promise}).then(function(n){e.group={id:i,name:n.Name,externalId:n.ExternalId,accessAll:n.AccessAll};var r={};if(n.Collections)for(var a=0;a<n.Collections.length;a++)r[n.Collections[a].Id]={id:n.Collections[a].Id,readOnly:n.Collections[a].ReadOnly};return e.selectedCollections=r,o.collections.listOrganization({orgId:t.params.orgId}).$promise}).then(function(n){e.collections=r.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]={id: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]={id: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.submit=function(){var r={name:e.group.name,accessAll:!!e.group.accessAll,externalId:e.group.externalId};if(!r.accessAll){r.collections=[];for(var s in e.selectedCollections)e.selectedCollections.hasOwnProperty(s)&&r.collections.push(e.selectedCollections[s])}e.submitPromise=o.groups.put({orgId:t.params.orgId,id:i},r,function(e){a.eventTrack("Edited Group"),n.close({id:e.Id,name:e.Name})}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationGroupsUsersController",["$scope","$state","$uibModalInstance","apiService","$analytics","group","toastr",function(e,t,n,o,r,a,i){r.eventTrack("organizationGroupUsersController",{category:"Modal"}),e.loading=!0,e.group=a,e.users=[],n.opened.then(function(){return o.groups.listUsers({orgId:t.params.orgId,id:a.id}).$promise}).then(function(t){var n=[];if(t&&t.Data.length)for(var o=0;o<t.Data.length;o++)n.push({organizationUserId:t.Data[o].OrganizationUserId,name:t.Data[o].Name,email:t.Data[o].Email,type:t.Data[o].Type,status:t.Data[o].Status,accessAll:t.Data[o].AccessAll});e.users=n,e.loading=!1}),e.remove=function(n){confirm("Are you sure you want to remove this user ("+n.email+") from this group ("+a.name+")?")&&o.groups.delUser({orgId:t.params.orgId,id:a.id,orgUserId:n.organizationUserId},null,function(){i.success(n.email+" has been removed.","User Removed"),r.eventTrack("Removed User From Group");var t=e.users.indexOf(n);t>-1&&e.users.splice(t,1)},function(){i.error("Unable to remove user.","Error")})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationPeopleController",["$scope","$state","$uibModal","cryptoService","apiService","authService","toastr","$analytics",function(e,t,n,o,r,a,i,s){function l(){r.organizationUsers.list({orgId:t.params.orgId},function(t){for(var n=[],o=0;o<t.Data.length;o++){var r={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(r)}e.users=n})}e.users=[],e.useGroups=!1,e.$on("$viewContentLoaded",function(){l(),a.getUserProfile().then(function(n){if(n.organizations){var o=n.organizations[t.params.orgId];e.useGroups=!!o.useGroups}})}),e.reinvite=function(e){r.organizationUsers.reinvite({orgId:t.params.orgId,id:e.id},null,function(){s.eventTrack("Reinvited User"),i.success(e.email+" has been invited again.","User Invited")},function(){i.error("Unable to invite user.","Error")})},e.delete=function(n){confirm("Are you sure you want to remove this user ("+n.email+")?")&&r.organizationUsers.del({orgId:t.params.orgId,id:n.id},null,function(){s.eventTrack("Deleted User"),i.success(n.email+" has been removed.","User Removed");var t=e.users.indexOf(n);t>-1&&e.users.splice(t,1)},function(){i.error("Unable to remove user.","Error")})},e.confirm=function(e){r.users.getPublicKey({id:e.userId},function(n){var a=o.getOrgKey(t.params.orgId);if(!a)return void i.error("Unable to confirm user.","Error");var l=o.rsaEncrypt(a.key,n.PublicKey);r.organizationUsers.confirm({orgId:t.params.orgId,id:e.id},{key:l},function(){e.status=2,s.eventTrack("Confirmed User"),i.success(e.email+" has been confirmed.","User Confirmed")},function(){i.error("Unable to confirm user.","Error")})},function(){i.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:{orgUser:function(){return e}}}).result.then(function(){l()})},e.groups=function(e){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleGroups.html",controller:"organizationPeopleGroupsController",resolve:{orgUser:function(){return e}}}).result.then(function(){})}}]),angular.module("bit.organization").controller("organizationPeopleEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","orgUser","$analytics",function(e,t,n,o,r,a,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=r.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1}),o.organizationUsers.get({orgId:t.params.orgId,id:a.id},function(t){var n={};if(t&&t.Collections)for(var o=0;o<t.Collections.length;o++)n[t.Collections[o].Id]={id:t.Collections[o].Id,readOnly:t.Collections[o].ReadOnly};e.email=a.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]={id: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]={id: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(r){var s=[];if(!e.accessAll)for(var l in e.selectedCollections)e.selectedCollections.hasOwnProperty(l)&&s.push(e.selectedCollections[l]);e.submitPromise=o.organizationUsers.put({orgId:t.params.orgId,id:a.id},{type:e.type,collections:s,accessAll:e.accessAll},function(){i.eventTrack("Edited User"),n.close()}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationPeopleGroupsController",["$scope","$state","$uibModalInstance","apiService","orgUser","$analytics",function(e,t,n,o,r,a){a.eventTrack("organizationPeopleGroupsController",{category:"Modal"}),e.loading=!0,e.groups=[],e.selectedGroups={},e.orgUser=r,n.opened.then(function(){return o.groups.listOrganization({orgId:t.params.orgId}).$promise}).then(function(n){for(var a=[],i=0;i<n.Data.length;i++)a.push({id:n.Data[i].Id,name:n.Data[i].Name});return e.groups=a,o.organizationUsers.listGroups({orgId:t.params.orgId,id:r.id}).$promise}).then(function(t){var n={};if(t)for(var o=0;o<t.length;o++)n[t[o]]=!0;e.selectedGroups=n,e.loading=!1}),e.toggleGroupSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o<e.groups.length;o++)n[e.groups[o].id]=!0;e.selectedGroups=n},e.toggleGroupSelection=function(t){t in e.selectedGroups?delete e.selectedGroups[t]:e.selectedGroups[t]=!0},e.groupSelected=function(t){return t.id in e.selectedGroups},e.allSelected=function(){return Object.keys(e.selectedGroups).length===e.groups.length},e.submitPromise=null,e.submit=function(i){var s=[];for(var l in e.selectedGroups)e.selectedGroups.hasOwnProperty(l)&&s.push(l);e.submitPromise=o.organizationUsers.putGroups({orgId:t.params.orgId,id:r.id},{groupIds:s},function(){a.eventTrack("Edited User Groups"),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,r,a){a.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=r.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]={id: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]={id: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(r){var i=[];if(!r.accessAll)for(var s in e.selectedCollections)e.selectedCollections.hasOwnProperty(s)&&i.push(e.selectedCollections[s]);var l=r.emails.trim().split(/\s*,\s*/);e.submitPromise=o.organizationUsers.invite({orgId:t.params.orgId},{emails:l,type:r.type,collections:i,accessAll:r.accessAll},function(){a.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,r,a,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){r.updateProfileOrganization(e).then(function(e){i.eventTrack("Updated Organization Settings"),o.success("Organization has been updated.","Success!")})}).$promise},e.delete=function(){a.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,r,a,i,s){function l(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=s;var a=r.encryptLogin(o);e.savePromise=t.logins.postAdmin(a,function(e){i.eventTrack("Created Organization Login");var t=r.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=a.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),l(e)},e.clipboardError=function(e,t){t&&l(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,r,a,i,s,l){e.logins=[],e.collections=[],e.loading=!0,e.$on("$viewContentLoaded",function(){var o=t.collections.listOrganization({orgId:a.params.orgId},function(t){for(var o=([{id:null,name:"Unassigned",collapsed:i.collapsedOrgCollections&&"unassigned"in i.collapsedOrgCollections}]),r=0;r<t.Data.length;r++){var a=n.decryptCollection(t.Data[r],null,!0);a.collapsed=i.collapsedOrgCollections&&a.id in i.collapsedOrgCollections,o.push(a)}e.collections=o}).$promise,s=t.ciphers.listOrganizationDetails({organizationId:a.params.orgId},function(t){for(var o=[],r=0;r<t.Data.length;r++)if(1===t.Data[r].Type){var a=n.decryptLoginPreview(t.Data[r]);o.push(a)}e.logins=o}).$promise;r.all([o,s]).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){s.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(){s.open({animation:!0,templateUrl:"app/vault/views/vaultAddLogin.html",controller:"organizationVaultAddLoginController",resolve:{orgId:function(){return a.params.orgId}}}).result.then(function(t){e.logins.push(t)})},e.editCollections=function(t){s.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 r={collectionIds:[]},a=0;a<e.collectionIds.length;a++)e.collectionIds[a]!==n.id&&r.collectionIds.push(e.collectionIds[a]);t.ciphers.putCollections({id:e.id},r).$promise.then(function(t){o.eventTrack("Removed Login From Collection"),e.collectionIds=r.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,r,a,i,s){function l(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}s.eventTrack("organizationVaultEditLoginController",{category:"Modal"}),e.login={},e.hideFolders=e.hideFavorite=!0,t.logins.getAdmin({id:i},function(t){e.login=r.decryptLogin(t)}),e.save=function(o){var a=r.encryptLogin(o);e.savePromise=t.logins.putAdmin({id:i},a,function(e){s.eventTrack("Edited Organization Login");var t=r.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?")||(s.eventTrack("Generated Password From Edit"),e.login.password=a.generatePassword({length:12,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),l(e)},e.clipboardError=function(e,t){t&&l(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(){s.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,r,a,i){a.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=r;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:r.id},o).$promise.then(function(e){a.eventTrack("Edited Login Collections"),n.close({action:"collectionsEdit",collectionIds:o.collectionIds})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.tools").controller("reportsBreachController",["$scope","apiService","toastr","authService",function(e,t,n,o){e.loading=!0,e.error=!1,e.breachAccounts=[],e.email=null,e.$on("$viewContentLoaded",function(){o.getUserProfile().then(function(n){return e.email=n.email,t.hibp.get({email:e.email}).$promise}).then(function(t){for(var n=[],o=0;o<t.length;o++){var r={id:t[o].Name,title:t[o].Title,domain:t[o].Domain,date:new Date(t[o].BreachDate),reportedDate:new Date(t[o].AddedDate),modifiedDate:new Date(t[o].ModifiedDate),count:t[o].PwnCount,description:t[o].Description,classes:t[o].DataClasses,image:"https://haveibeenpwned.com/Content/Images/PwnedLogos/"+t[o].Name+"."+t[o].LogoType};n.push(r)}e.breachAccounts=n,e.loading=!1},function(t){e.error=404!==t.status,e.loading=!1})})}]),angular.module("bit.services").factory("apiService",["$resource","tokenService","appSettings","$httpParamSerializer",function(e,t,n,o){function r(e){return o(e)}var a={},i=n.apiUri,s=n.identityUri;return a.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"}}}),a.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"}}}),a.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"}},delMany:{url:i+"/ciphers/delete",method:"POST"},moveMany:{url:i+"/ciphers/move",method:"POST"}}),a.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"}}}),a.organizationUsers=e(i+"/organizations/:orgId/users/:id",{},{get:{method:"GET",params:{id:"@id",orgId:"@orgId"}},list:{method:"GET",params:{orgId:"@orgId"}},listGroups:{url:i+"/organizations/:orgId/users/:id/groups",method:"GET",params:{id:"@id",orgId:"@orgId"},isArray:!0},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"}},putGroups:{url:i+"/organizations/:orgId/users/:id/groups",method:"POST",params:{id:"@id",orgId:"@orgId"}},del:{url:i+"/organizations/:orgId/users/:id/delete",method:"POST",params:{id:"@id",orgId:"@orgId"}}}),a.collections=e(i+"/organizations/:orgId/collections/:id",{},{get:{method:"GET",params:{id:"@id",orgId:"@orgId"}},getDetails:{url:i+"/organizations/:orgId/collections/:id/details",method:"GET",params:{id:"@id",orgId:"@orgId"}},listMe:{url:i+"/collections",method:"GET",params:{}},listOrganization:{method:"GET",params:{orgId:"@orgId"}},listUsers:{url:i+"/organizations/:orgId/collections/:id/users",method:"GET",params:{id:"@id",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"}},delUser:{url:i+"/organizations/:orgId/collections/:id/delete-user/:orgUserId",method:"POST",params:{id:"@id",orgId:"@orgId",orgUserId:"@orgUserId"}}}),a.groups=e(i+"/organizations/:orgId/groups/:id",{},{get:{method:"GET",params:{id:"@id",
|
|
orgId:"@orgId"}},getDetails:{url:i+"/organizations/:orgId/groups/:id/details",method:"GET",params:{id:"@id",orgId:"@orgId"}},listOrganization:{method:"GET",params:{orgId:"@orgId"}},listUsers:{url:i+"/organizations/:orgId/groups/:id/users",method:"GET",params:{id:"@id",orgId:"@orgId"}},post:{method:"POST",params:{orgId:"@orgId"}},put:{method:"POST",params:{id:"@id",orgId:"@orgId"}},del:{url:i+"/organizations/:orgId/groups/:id/delete",method:"POST",params:{id:"@id",orgId:"@orgId"}},delUser:{url:i+"/organizations/:orgId/groups/:id/delete-user/:orgUserId",method:"POST",params:{id:"@id",orgId:"@orgId",orgUserId:"@orgUserId"}}}),a.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:{}},putKey:{url:i+"/accounts/key",method:"POST",params:{}},import:{url:i+"/accounts/import",method:"POST",params:{}},postDelete:{url:i+"/accounts/delete",method:"POST",params:{}}}),a.settings=e(i+"/settings",{},{getDomains:{url:i+"/settings/domains",method:"GET",params:{}},putDomains:{url:i+"/settings/domains",method:"POST",params:{}}}),a.users=e(i+"/users/:id",{},{getPublicKey:{url:i+"/users/:id/public-key",method:"GET",params:{id:"@id"}}}),a.identity=e(s+"/connect",{},{token:{url:s+"/connect/token",method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8"},transformRequest:r,skipAuthorization:!0,params:{}}}),a.hibp=e("https://haveibeenpwned.com/api/v2/breachedaccount/:email",{},{get:{method:"GET",params:{email:"@email"},isArray:!0}}),a}]),angular.module("bit.services").factory("authService",["cryptoService","apiService","tokenService","$q","jwtHelper","$rootScope",function(e,t,n,o,r,a){var i={},s=null;i.logIn=function(r,a,s,l){r=r.toLowerCase();var c=e.makeKey(a,r),d={username:r,password:e.hashPassword(a,c),grant_type:"password",scope:"api offline_access",client_id:"web"};s&&void 0!==l&&null!==l&&(d.twoFactorToken=s.replace(" ",""),d.twoFactorProvider=l);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.Key&&e.setEncKey(t.Key,c),t.PrivateKey?(e.setPrivateKey(t.PrivateKey),!0):e.makeKeyPair()}).then(function(n){if(!0!==n)return e.setPrivateKey(n.privateKeyEnc),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(),a.vaultFolders=a.vaultLogins=null,s=null},i.getUserProfile=function(){if(!s)return i.setUserProfile();var e=o.defer();return e.resolve(s),e.promise};var l=null;return i.setUserProfile=function(){if(l&&0===l.promise.$$state.status)return l.promise;l=o.defer();var a=n.getToken();if(!a)return l.reject(),l.promise;var i=r.decodeToken(a);return t.accounts.getProfile({},function(t){if(s={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,maxCollections:t.Organizations[o].MaxCollections,seats:t.Organizations[o].Seats,useGroups:t.Organizations[o].UseGroups};s.organizations=n,e.setOrgKeys(n),l.resolve(s)}},function(){l.reject()}),l.promise},i.addProfileOrganizationOwner=function(t,n){return i.getUserProfile().then(function(o){if(o){o.organizations||(o.organizations={});var r={id:t.Id,name:t.Name,key:n,status:2,type:0,enabled:!0,maxCollections:t.MaxCollections,seats:t.Seats,useGroups:t.UseGroups};o.organizations[r.id]=r,s=o,e.addOrgKey(r.id,r.key)}})},i.removeProfileOrganization=function(t){return i.getUserProfile().then(function(n){n&&(n.organizations&&n.organizations.hasOwnProperty(t)&&(delete n.organizations[t],s=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,s=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},function(e){}):null},i}]),angular.module("bit.services").factory("cipherService",["cryptoService","apiService","$q",function(e,t,n){var o={};return o.decryptLogins=function(e){if(!e)throw"encryptedLogins is undefined or null";for(var t=[],n=0;n<e.length;n++)t.push(o.decryptLogin(e[n]));return t},o.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}},o.decryptLoginPreview=function(t){if(!t)throw"encryptedCipher is undefined or null";var n=null;return t.OrganizationId&&(n=e.getOrgKey(t.OrganizationId)),{id:t.Id,organizationId:t.OrganizationId,collectionIds:t.CollectionIds||[],folderId:t.FolderId,favorite:t.Favorite,edit:t.Edit,name:o.decryptProperty(t.Data.Name,n,!1),username:o.decryptProperty(t.Data.Username,n,!0),password:o.decryptProperty(t.Data.Password,n,!0)}},o.decryptFolders=function(e){if(!e)throw"encryptedFolders is undefined or null";for(var t=[],n=0;n<e.length;n++)t.push(o.decryptFolder(e[n]));return t},o.decryptFolder=function(t){if(!t)throw"encryptedFolder is undefined or null";return{id:t.Id,name:e.decrypt(t.Name)}},o.decryptFolderPreview=function(e){if(!e)throw"encryptedFolder is undefined or null";return{id:e.Id,name:o.decryptProperty(e.Name,null,!1)}},o.decryptCollections=function(e,t,n){if(!e)throw"encryptedCollections is undefined or null";for(var r=[],a=0;a<e.length;a++)r.push(o.decryptCollection(e[a],t,n));return r},o.decryptCollection=function(t,n,r){if(!t)throw"encryptedCollection is undefined or null";r=!0===r,n=n||t.OrganizationId;var a=e.getOrgKey(n);return{id:t.Id,name:r?o.decryptProperty(t.Name,a,!1):e.decrypt(t.Name,a)}},o.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]"},o.encryptLogins=function(e,t){if(!e)throw"unencryptedLogins is undefined or null";for(var n=[],r=0;r<e.length;r++)n.push(o.encryptLogin(e[r],t));return n},o.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}},o.encryptFolders=function(e,t){if(!e)throw"unencryptedFolders is undefined or null";for(var n=[],r=0;r<e.length;r++)n.push(o.encryptFolder(e[r],t));return n},o.encryptFolder=function(t,n){if(!t)throw"unencryptedFolder is undefined or null";return{id:t.id,name:e.encrypt(t.name,n)}},o.encryptCollections=function(e,t){if(!e)throw"unencryptedCollections is undefined or null";for(var n=[],r=0;r<e.length;r++)n.push(o.encryptCollection(e[r],t));return n},o.encryptCollection=function(t,n){if(!t)throw"unencryptedCollection is undefined or null";return{id:t.id,name:e.encrypt(t.name,e.getOrgKey(n))}},o.updateKey=function(r,a,i){var s=e.makeEncKey(null);encKey=s.encKey;var l=s.encKeyEnc,c=[],d=t.logins.list({},function(e){for(var t=[],n=0;n<e.Data.length;n++)e.Data[n].OrganizationId||t.push(e.Data[n]);var r=o.decryptLogins(t);c=o.encryptLogins(r,encKey)}).$promise,u=[],p=t.folders.list({},function(e){var t=o.decryptFolders(e.Data);u=o.encryptFolders(t,encKey)}).$promise,g=e.getPrivateKey("raw"),m=null;return g&&(m=e.encrypt(g,encKey,"raw")),n.all([d,p]).then(function(){var e={masterPasswordHash:r,ciphers:c,folders:u,privateKey:m,key:l};return t.accounts.putKey(e).$promise},i).then(function(){return e.setEncKey(encKey,null,!0),a()},function(){e.clearEncKey(),i()})},o}]),angular.module("bit.services").factory("cryptoService",["$sessionStorage","constants","$q",function(e,t,n){function o(e,t,n,o){var r=forge.hmac.create();r.start("sha256",n),r.update(t+e);var a=r.digest();return o?forge.util.encode64(a.getBytes()):a.getBytes()}function r(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 a(e,n,o){if(n&&(e=forge.util.decode64(e)),!e)throw"Must provide keyBytes";var r=forge.util.createBuffer(e);if(!r||0===r.length())throw"Couldn't make buffer";var a=r.length();if(null===o||void 0===o)if(32===a)o=t.encType.AesCbc256_B64;else{if(64!==a)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===a)this.encKey=e,this.macKey=null;else if(o===t.encType.AesCbc128_HmacSha256_B64&&32===a)this.encKey=r.getBytes(16),this.macKey=r.getBytes(16);else{if(o!==t.encType.AesCbc256_HmacSha256_B64||64!==a)throw"Unsupported encType/key length.";this.encKey=r.getBytes(32),this.macKey=r.getBytes(32)}}var i,s,l,c,d,u,p={};return p.setKey=function(t){i=t,e.key=i.keyB64},p.setEncKey=function(t,n,o){if(o)return s=t,void(e.encKey=s.keyB64);try{var r=p.decrypt(t,n,"raw");e.encKey=forge.util.encode64(r),s=new a(r)}catch(e){console.log("Cannot set enc key. Decryption failed.")}},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={},r={},i=!1;for(var s in t)if(t.hasOwnProperty(s))try{var l=p.rsaDecrypt(t[s].key,n),c=new a(l);r[s]=c,o[s]=c.keyB64,i=!0}catch(e){console.log("Cannot set org key for "+s+". Decryption failed.")}i?e.orgKeys=o:r=null}},p.addOrgKey=function(t,n,o){(c=p.getOrgKeys())||(c={});var r=e.orgKeys;r||(r={});try{var i=p.rsaDecrypt(n,o),s=new a(i);c[t]=s,r[t]=s.keyB64}catch(e){c=null,console.log("Cannot set org key. Decryption failed.")}e.orgKeys=r},p.getKey=function(){if(!i&&e.key&&(i=new a(e.key,!0)),!i)throw"key unavailable";return i},p.getEncKey=function(){return!s&&e.encKey&&(s=new a(e.encKey,!0)),s},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 r=forge.util.decode64(e.privateKey);if(d=forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(r)),"raw"===t)return r}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 a(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(){i=null,l=null,delete e.key},p.clearEncKey=function(){s=null,delete e.encKey},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.clearEncKey(),p.clearKeyPair(),p.clearOrgKeys()},p.makeKey=function(e,t){return new a(forge.pbkdf2(forge.util.encodeUtf8(e),forge.util.encodeUtf8(t),5e3,32,"sha256"))},p.makeEncKey=function(e){var t=forge.random.getBytesSync(64),n=p.encrypt(t,e,"raw");return{encKey:new a(t),encKeyEnc:n}},p.makeKeyPair=function(e){var t=n.defer();return forge.pki.rsa.generateKeyPair({bits:2048,workers:2,workerScript:"/lib/forge/prime.worker.min.js"},function(n,o){if(n)return void t.reject(n);var r=forge.pki.privateKeyToAsn1(o.privateKey),a=forge.pki.wrapRsaPrivateKey(r),i=forge.asn1.toDer(a).getBytes(),s=p.encrypt(i,e,"raw"),l=forge.pki.publicKeyToAsn1(o.publicKey),c=forge.asn1.toDer(l).getBytes();t.resolve({publicKey:forge.util.encode64(c),privateKeyEnc:s})}),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,t,n){if(!(t=t||p.getEncKey()||p.getKey()))throw"Encryption key unavailable.";n=n||"utf8";var r=forge.util.createBuffer(e,n),a=forge.random.getBytesSync(16),i=forge.cipher.createCipher("AES-CBC",t.encKey);i.start({iv:a}),i.update(r),i.finish();var s=forge.util.encode64(a),l=i.output.getBytes(),c=forge.util.encode64(l),d=s+"|"+c;if(t.macKey){d=d+"|"+o(l,a,t.macKey,!0)}return t.encType+"."+d},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 r=n.encrypt(e,"RSA-OAEP",{md:forge.md.sha1.create()});return t.encType.Rsa2048_OaepSha1_B64+"."+forge.util.encode64(r)},p.decrypt=function(e,n,i){n=n||p.getEncKey()||p.getKey();var s,c,d=e.split(".");if(2===d.length)try{s=parseInt(d[0]),c=d[1].split("|")}catch(e){return null}else c=e.split("|"),s=3===c.length?t.encType.AesCbc128_HmacSha256_B64:t.encType.AesCbc256_B64;if(s===t.encType.AesCbc128_HmacSha256_B64&&n.encType===t.encType.AesCbc256_B64&&(l=l||new a(n.key,!1,t.encType.AesCbc128_HmacSha256_B64),n=l),s!==n.encType)throw"encType unavailable.";switch(s){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(!r(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,r,a=e.split(".");if(1===a.length)o=t.encType.Rsa2048_OaepSha256_B64,r=a[0];else if(2===a.length)try{o=parseInt(a[0]),r=a[1]}catch(e){return null}var i,s=forge.util.decode64(r);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(s,"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 r(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 a(e,t,n){r(e,function(e){t($.parseXML(e))},n)}function i(e,t,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[];angular.forEach(e.data,function(e,t){var o=r.length,s=a.length,l=e.folder&&""!==e.folder,c=l;if(l)for(var d=0;d<r.length;d++)if(r[d].name===e.folder){c=!1,o=d;break}if(a.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&&r.push({name:e.folder}),l){var u={key:s,value:o};i.push(u)}}),t(r,a,i)}})}function s(e,t,r){function a(e){var o=[],r=[],a=[];angular.forEach(e,function(e,t){var i=o.length,s=r.length,l=e.grouping&&""!==e.grouping&&"(none)"!==e.grouping,c=l;if(l)for(var d=0;d<o.length;d++)if(o[d].name===e.grouping){c=!1,i=d;break}if(r.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}),l){var u={key:s,value:i};a.push(u)}}),t(o,r,a)}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"}),a(n.data);else{for(var s=!1,l=0;l<o.length;l++)if("pre"===o[l].tagName.toLowerCase()){s=!0,t=o[l].outerText.trim(),n=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(n.data);break}s||r()}},i.onerror=function(e){r()}}else Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),a(e.data)},beforeFirstChunk:function(e){return e.replace(/^\s+/,"")}})}function l(e,t,o){function r(e){var r=$(e),a=r.find("database");if(a.length){var p=a.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=a.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),s.push(h),p=f.find("> label_id"),p.length){var k=$(p[0]).text(),P=c[k];null!==k&&""!==k&&null!==P&&l.push({key:s.length-1,value:P})}}}t(i,s,l)}else o()}var i=[],s=[],l=[],c=[],d=0,u=0;a(e,r,o)}function c(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[],s=[],l=0,c=0;for(l=0;l<e.data.length;l++){var d=e.data[l];if(0!==l){var u=r.length,p=a.length,g=d[1]&&""!==d[1],m=g;if(g)for(c=0;c<r.length;c++)if(r[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(s.length)for(c=4;c<d.length;c++){var h=d[c];if(h&&""!==h){var v=s[c-4];"url"===v.toLowerCase()||"uri"===v.toLowerCase()?f.uri=n(h):(null===f.notes&&(f.notes=""),f.notes+=v+": "+h+"\n")}}a.push(f),m&&r.push({name:d[1]}),g&&i.push({key:p,value:u})}else for(c=4;c<d.length;c++)s.push(d[c])}t(r,a,i)}})}function d(e,t,o){function r(e){var n=$(e),r=n.find("Root");if(r.length){var a=r.find("> Group");a.length&&(i($(a[0]),!0,""),t(s,l,c))}else o()}function i(e,t,o){var r=s.length,a=o;t||(""!==a&&(a+=" > "),a+=e.find("> Name").text(),s.push({name:a}));var d=e.find("> Entry");if(d.length)for(var u=0;u<d.length;u++){for(var p=$(d[u]),g=l.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="--"),l.push(m),t||c.push({key:g,value:r})}var b=e.find("> Group");if(b.length)for(var C=0;C<b.length;C++)i($(b[C]),!1,a)}var s=[],l=[],c=[];a(e,r,o)}function u(e,n,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],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,s=r.length,l=a.length,c=null!==o,d=c,u=0;if(c)for(u=0;u<r.length;u++)if(r[u].name===o){d=!1,s=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&&a.push(p),d&&r.push({name:o}),c){var g={key:l,value:s};i.push(g)}}),n(r,a,i)}})}function p(e,n,o){function a(e,t,n,o,r){for(var a=0;a<e.length;a++){var i=e[a];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[r]&&i[o]&&(null===t.notes?t.notes="":t.notes+="\n",t.notes+=i[r]+": "+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 r=o[d];if(r.length&&"{"===r[0]){var i=JSON.parse(r),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&&a(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&&a(i.secureContents.sections[p].fields,u,"n","v","t");l.push(u)}}n(s,l,c)}var s=[],l=[],c=[],d=0;r(e,i,o)}function g(e,n,r){var a=[],i=[],s=[];Papa.parse(e,{encoding:"UTF-8",header:!0,complete:function(e){o(e);for(var r=0;r<e.data.length;r++){var l=e.data[r];if(l.title){var c={favorite:!1,uri:null,username:null,password:null,notes:l.notesPlain&&""!==l.notesPlain?l.notesPlain:"",name:l.title&&""!==l.title?l.title:"--"};for(var d in l)if(l.hasOwnProperty(d)){if(null===l[d]||""===l[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+": "+l[d]);else{var u=l[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=l[d];else c.password=l[d]}""===c.notes&&(c.notes=null),i.push(c)}}n(a,i,s)}})}function m(e,t,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[];angular.forEach(e.data,function(e,t){a.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(r,a,i)}})}function f(e,t,o){function r(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),a=o.find("entry"),i=0;i<a.length;i++){var d=$(a[i]);if(d){var u=d.attr("host"),p=d.attr("user"),g=d.attr("password");l.push({favorite:!1,uri:u&&""!==u?n(u):null,username:p&&""!==p?p:null,password:g&&""!==g?g:null,notes:null,name:r(u)})}}t(s,l,c)}var s=[],l=[],c=[];if(!e.type||"text/xml"!==e.type)return void o("Only .xml exports are supported.");a(e,i,o)}function h(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[];angular.forEach(e.data,function(e,t){5===e.length&&a.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(r,a,i)}})}function v(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[];angular.forEach(e.data,function(e,t){if(e.length>=6){var o=r.length,s=a.length,l=e[0]&&""!==e[0],c=l,d=0;if(l)for(d=0;d<r.length;d++)if(r[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(a.push(u),c&&r.push({name:e[0]}),l){var m={key:s,value:o};i.push(m)}}}),t(r,a,i)}})}function y(e,t,o){function r(e){var r=$(e),a=r.find("PasswordManager");if(a.length){var d=a.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=s.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 A={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():"--"},U="";for(c=1;c<=10;c++)U+="> Attribute-"+c,c<10&&(U+=", ");var x=p.find(U);if(x.length)for(c=0;c<x.length;c++){var L=$(x[c]),D=L.prop("tagName"),F=L.text();F&&""!==F&&"null"!==F&&(null===A.notes?A.notes="":A.notes+="\n",A.notes+=D+": "+F)}if(s.push(A),E&&i.push({name:I}),O){var M={key:z,value:T};l.push(M)}}t(i,s,l)}else o()}var i=[],s=[],l=[],c=0;a(e,r,o)}function w(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var r=[],a=[],i=[],s=0;s<e.data.length;s++){var l=e.data[s];if(!(l.length<2)&&(0!==s||"Title"!==l[0])){var c=l[l.length-1],d={name:l[0],favorite:!1,uri:null,password:null,username:null,notes:c&&""!==c?c:null};if(l.length>2&&l.length%2==0)for(var u=0;u<l.length-2;u+=2){var p=l[u+2];if(p&&""!==p){var g=l[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)}}a.push(d)}}t(r,a,i)}})}function b(e,t,o){function r(e){var r=$(e),a=r.find("passwordsafe");if(a.length){var d=a.attr("delimiter"),u=a.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,A=E?E.text().split(".").join(" > "):null,U=i.length,x=s.length,L=A&&""!==A,D=L;if(L)for(c=0;c<i.length;c++)if(i[c].name===A){D=!1,U=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),s.push(F),D&&i.push({name:A}),L){var M={key:x,value:U};l.push(M)}}t(i,s,l)}else o()}var i=[],s=[],l=[],c=0;a(e,r,o)}function C(e,n,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var r=[],a=[],i=[],s=0;s<e.data.length;s++){var l=!1,c=e.data[s];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.password=c[4],d.notes=c[5]):(d.username=c[2],d.password=c[3],d.notes=c[4]+"\n"+c[5]),d.uri=t(c[1]);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]){l=!0;break}}l||(""===d.username&&(d.username=null),""===d.password&&(d.password=null),""===d.notes&&(d.notes=null),""===d.uri&&(d.uri=null),a.push(d))}}n(r,a,i)}})}function S(e,t,o){function r(e,t,n){var o=e.find('> Groups > Group[ID="'+t+'"]');if(o.length){n&&""!==n&&(n=" > "+n),n=o.attr("Name")+n;return r(e,o.attr("ParentID"),n)}return n}function i(e){var a=$(e),i=a.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=r(i,b,""));var P=s.length,I=l.length,T=C&&""!==C,z=T;if(T)for(d=0;d<s.length;d++)if(s[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(l.push(O),z&&s.push({name:C}),T){var E={key:I,value:P};c.push(E)}}t(s,l,c)}else o()}var s=[],l=[],c=[],d=0;a(e,i,o)}function k(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],i=[];angular.forEach(e.data,function(e,t){if(e.length>=3){var o=r.length,s=a.length,l=e[0]&&""!==e[0]&&"Unassigned"!==e[0],c=l,d=0;if(l)for(d=0;d<r.length;d++)if(r[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),a.push(u),c&&r.push({name:e[0]}),l){var g={key:s,value:o};i.push(g)}}}),t(r,a,i)}})}function P(e,t,r){
|
|
var a=[],i=[],s=[],l=["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 r in e)e.hasOwnProperty(r)&&l.indexOf(r.toLowerCase())<0&&e[r]&&""!==e[r]&&(o.notes?o.notes+="\n":o.notes="",o.notes+=r+": "+e[r])}i.push(o)}),t(a,i,s)}})}function I(t,o,a){function i(t){var r=$(t),a=r.find("textarea"),i=a&&a.length?a.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,G)?g.username=f.value:!g.password&&e(f.label,M)?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),l.push(g)}o(s,l,c)}var s=[],l=[],c=[];r(t,i,a)}function T(e,n,o){function a(e){var o=JSON.parse(e);if(o&&o.accounts)for(c=0;c<o.accounts.length;c++){var r=o.accounts[c],a={favorite:r.is_favorite&&!0===r.is_favorite,uri:r.domain&&""!==r.domain?t(r.domain):null,username:r.username&&""!==r.username?r.username:null,password:r.password&&""!==r.password?r.password:null,notes:null,name:r.label&&""!==r.label?r.label:r.domain};r.email&&""!==r.email&&(a.username&&""!==a.username?a.notes=r.email:a.username=r.email),a.name&&""!==a.name||(a.name="--"),s.push(a)}n(i,s,l)}var i=[],s=[],l=[],c=0;r(e,a,o)}function z(n,o,a){function i(n){var r=$(n.split("­").join("").split("<WBR>").join("")),a=r.find("table.nobr");if(a.length)for(var i=0;i<a.length;i++){var d=$(a[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(":",""),M)?u.password=h:!u.username&&e(f.replace(":",""),G)?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="--"),l.push(u)}o(s,l,c)}var s=[],l=[],c=[];r(n,i,a)}function O(e,t,r){function a(e){var t=document.createElement("a");return t.href=e,t.hostname.startsWith("www.")?t.hostname.replace("www.",""):t.hostname}var i=[],s=[],l=[];Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),angular.forEach(e.data,function(e,t){s.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?a(e.url):"--"})}),t(i,s,l)}})}function E(n,r,a){Papa.parse(n,{encoding:"UTF-8",complete:function(n){o(n);for(var a=[],i=[],s=[],l=0;l<n.data.length;l++){var c=n.data[l];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,K)?u.uri=t(g):!u.username&&e(m,G)?u.username=g:!u.password&&e(m,M)?u.password=g:(u.notes?u.notes+="\n":u.notes="",u.notes+=m+": "+g)}}i.push(u)}}r(a,i,s)}})}function A(e,n,o){function a(e){var o=JSON.parse(e);if(o&&o.length)for(c=0;c<o.length;c++){var r=o[c],a={favorite:!1,uri:r.login_url&&""!==r.login_url?t(r.login_url):null,username:null,password:null,notes:"",name:r.name&&""!==r.name?r.name:"--"};if(r.identifiers){r.identifiers.notes&&""!==r.identifiers.notes&&(a.notes=r.identifiers.notes.split("\\r\\n").join("\n").split("\\n").join("\n"));for(var d in r.identifiers)if(r.identifiers.hasOwnProperty(d)){var u=r.identifiers[d];if("notes"===d||""===u||null===u)continue;"username"===d?a.username=u:"password"===d?a.password=u:(""!==a.notes&&(a.notes+="\n"),a.notes+=d+": "+u)}""===a.notes&&(a.notes=null),s.push(a)}}n(i,s,l)}var i=[],s=[],l=[],c=0;r(e,a,o)}function U(e,n,r){function a(e,t){if(e&&""!==e)for(var n=e.split(/(?:\r\n|\r|\n)/),o=0;o<n.length;o++){var r=n[o],a=r.indexOf(":");if(!(a<0)){var i=r.substring(0,a),s=r.length>a?r.substring(a+1):null;if(i&&""!==i&&s&&""!==s&&"SecretType"!==i){var l=i.toLowerCase();"user name"===l?t.username=s:"password"===l?t.password=s:(""!==t.notes&&(t.notes+="\n"),t.notes+=i+": "+s)}}}}Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],i=[],s=[];angular.forEach(e.data,function(e,n){var o=e.ChamberName,l=r.length,c=i.length,d=o&&""!==o,u=d,p=0;if(d)for(p=0;p<r.length;p++)if(r[p].name===o){u=!1,l=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(a(e.SecretData,g),a(e.CustomData,g),""===g.notes&&(g.notes=null),e["Secret Name"]&&i.push(g),u&&r.push({name:o}),d){var m={key:c,value:l};s.push(m)}}),n(r,i,s)}})}function x(e,n,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){function r(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 a=[],i=[],s=[],l=1;l<e.data.length;l++)if(!(e.data[l].length<3)){var c=e.data[l],d=c[e.data.length-1],u=c[e.data.length-2],p=c[0],g=a.length,m=i.length,f=d&&""!==d&&"Unfiled"!==d,h=f,v=0;if(f)for(v=0;v<a.length;v++)if(a[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,r(5,c,y)):c.length>2&&r(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&&a.push({name:d}),f){var w={key:m,value:g};s.push(w)}}n(a,i,s)}})}function L(e,n,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);for(var r=[],a=[],i=[],s=0;s<e.data.length;s++){var l=e.data[s],c={name:l.DisplayName&&""!==l.DisplayName?l.DisplayName:"--",favorite:!1,uri:l.Url&&""!==l.Url?t(l.Url):null,password:l.Password&&""!==l.Password?l.Password:null,username:l.UserName&&""!==l.UserName?l.UserName:null,notes:l.Notes&&""!==l.Notes?l.Notes:null};a.push(c)}n(r,a,i)}})}function D(e,n,r){function a(e,t){var n=t[e]||t[" "+e];return n&&""!==n?n:null}Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],i=[],s=[];angular.forEach(e.data,function(e,n){var o=r.length,l=i.length,c=!!a("category",e),d=c,u=0;if(c)for(u=0;u<r.length;u++)if(r[u].name===a("category",e)){d=!1,o=u;break}var p={favorite:!1,uri:a("site",e)?t(a("site",e)):null,username:a("username",e)?a("username",e):null,password:a("password",e)?a("password",e):null,notes:a("description",e)?a("description",e):null,name:a("title",e)?a("title",e):"--"};if(a("password2",e)&&(p.notes?p.notes+="\n":p.notes="",p.notes+="Password 2: "+a("password2",e)),i.push(p),d&&r.push({name:a("category",e)}),c){var g={key:l,value:o};s.push(g)}}),n(r,i,s)}})}var F={};F.import=function(e,t,n,o){if(!t)return void o();switch(e){case"bitwardencsv":i(t,n,o);break;case"lastpass":s(t,n,o);break;case"safeincloudxml":l(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":case"vivaldicsv":case"operacsv":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":A(t,n,o);break;case"zohovaultcsv":U(t,n,o);break;case"splashidcsv":x(t,n,o);break;case"meldiumcsv":L(t,n,o);break;case"passkeepcsv":D(t,n,o);break;default:o()}};var M=["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"],G=["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"],K=["url","hyper link","hyperlink","link","host","hostname","host name","server","address","hyper ref","href","web","website","web site","site","web-site","ort","adresse"];return F}),angular.module("bit.services").factory("passwordService",function(){function e(t,n){var o=0,r=n-t,a=Math.ceil(Math.log2(r));if(a>53)throw new Exception("We cannot generate numbers larger than 53 bits.");var i=Math.ceil(a/8),s=Math.pow(2,a)-1,l=new Uint8Array(i);window.crypto.getRandomValues(l);for(var c=8*(i-1),d=0;d<i;d++)o+=l[d]*Math.pow(2,c),c-=8;return o&=s,o>=r?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 r=o.minUppercase+o.minLowercase+o.minNumber+o.minSpecial;o.length<r&&(o.length=r);var a=[];if(o.lowercase&&o.minLowercase>0)for(var i=0;i<o.minLowercase;i++)a.push("l");if(o.uppercase&&o.minUppercase>0)for(var s=0;s<o.minUppercase;s++)a.push("u");if(o.number&&o.minNumber>0)for(var l=0;l<o.minNumber;l++)a.push("n");if(o.special&&o.minSpecial>0)for(var c=0;c<o.minSpecial;c++)a.push("s");for(;a.length<o.length;)a.push("a");a.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(a[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,r=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,r=t},n.getRefreshToken=function(){return r||(r=e.refreshToken),r||null},n.clearRefreshToken=function(){r=null,delete e.refreshToken},n.tokenSecondsRemaining=function(e,n){var o=t.getTokenExpirationDate(e);if(n=n||0,null===o)return 0;var r=o.valueOf()-((new Date).valueOf()+1e3*n);return Math.round(r/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 occurred.");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 occurred."));for(var r in o.ValidationErrors)if(o.ValidationErrors.hasOwnProperty(r))for(var a=0;a<o.ValidationErrors[r].length;a++)e.addError(t,r,o.ValidationErrors[r][a])},e.addError=function(e,t,n,o){!o&&e.$errors||(e.$errors=[]);for(var r=!0,a=0;a<e.$errors.length;a++)if(e.$errors[a]===n){r=!1;break}r&&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,r){n.eventTrack("settingsAddEditEquivalentDomainController",{category:"Modal"}),e.domains=r,e.index=o,e.submit=function(r){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,r,a,i,s,l,c){function d(t){var o={newEmail:m,masterPasswordHash:p};return n.accounts.emailToken(o,function(){e.tokenSent=!0}).$promise}function u(){o.dismiss("cancel"),l.error("Something went wrong. Try again.","Oh No!")}c.eventTrack("settingsChangeEmailController",{category:"Modal"});var p,g,m;e.token=function(t){g=t.masterPassword,p=r.hashPassword(g),m=t.newEmail.toLowerCase();var n=r.getEncKey();e.tokenPromise=n?d(t):a.updateKey(p,function(){return d(t)},u)},e.confirm=function(a){e.processing=!0;var s=r.makeKey(g,m),d=r.getEncKey(),f=r.encrypt(d.key,s,"raw"),h={token:a.token,newEmail:m,masterPasswordHash:p,newMasterPasswordHash:r.hashPassword(g,s),key:f};e.confirmPromise=n.accounts.email(h).$promise.then(function(){return o.dismiss("cancel"),i.logOut(),c.eventTrack("Changed Email"),t.go("frontend.login.info")},u).then(function(){l.success("Please log back in.","Email Changed")},u)},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsChangePasswordController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","cipherService","validationService","toastr","$analytics",function(e,t,n,o,r,a,i,s,l,c){function d(e){return a.getUserProfile().then(function(t){var o=r.makeKey(e.newMasterPassword,t.email.toLowerCase()),a=r.getEncKey(),i=r.encrypt(a.key,o,"raw"),s={masterPasswordHash:r.hashPassword(e.masterPassword),newMasterPasswordHash:r.hashPassword(e.newMasterPassword,o),key:i};return n.accounts.putPassword(s).$promise},u).then(function(){return o.dismiss("cancel"),a.logOut(),c.eventTrack("Changed Password"),t.go("frontend.login.info")},u).then(function(){l.success("Please log back in.","Master Password Changed")},u)}function u(){o.dismiss("cancel"),l.error("Something went wrong.","Oh No!")}c.eventTrack("settingsChangePasswordController",{category:"Modal"}),e.save=function(t,n){var o=!1;if(e.model.newMasterPassword.length<8&&(s.addError(n,"NewMasterPasswordHash","Master password must be at least 8 characters long.",!0),o=!0),e.model.newMasterPassword!==e.model.confirmNewMasterPassword&&(s.addError(n,"ConfirmNewMasterPasswordHash","New master password confirmation does not match.",!0),o=!0),!o){e.processing=!0;if(r.getEncKey())e.savePromise=d(t);else{var a=r.hashPassword(t.masterPassword);e.savePromise=i.updateKey(a,function(){return d(t)},u)}}},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsController",["$scope","$state","$uibModal","apiService","toastr","authService",function(e,t,n,o,r,a){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){a.setUserProfile(e).then(function(e){r.success("Account has been updated.","Success!")})}).$promise},e.passwordHintSave=function(){e.passwordHintPromise=o.accounts.putProfile({},e.model.profile,function(e){a.setUserProfile(e).then(function(e){r.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 r.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){a.refreshAccessToken().then(function(){var n=e.model.organizations.indexOf(t);n>-1&&e.model.organizations.splice(n,1),r.success("You have left the organization."),i()})},function(e){r.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,r,a,i,s,l){e.plans=l.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||0)+(e.plans[e.model.plan].monthlyBasePrice||0):(e.model.additionalSeats||0)*(e.plans[e.model.plan].annualSeatPrice||0)+(e.plans[e.model.plan].annualBasePrice||0)},e.changedPlan=function(){e.plans[e.model.plan].hasOwnProperty("monthPlanType")&&(e.model.interval="year"),e.plans[e.model.plan].noAdditionalSeats?e.model.additionalSeats=0:e.model.additionalSeats||e.plans[e.model.plan].baseSeats||e.plans[e.model.plan].noAdditionalSeats||(e.model.additionalSeats=1)},e.changedBusiness=function(){e.model.ownedBusiness&&(e.model.plan="teams")},e.submit=function(l){function c(e){a.eventTrack("Created Organization"),i.addProfileOrganizationOwner(e,u),i.refreshAccessToken().then(function(){d(e.Id)},function(){d(e.Id)})}function d(e){t.go("backend.org.dashboard",{orgId:e}).then(function(){r.success("Your new organization is ready to go!","Organization Created")})}var u=o.makeShareKeyCt();if("free"===l.plan){var p={name:l.name,planType:l.plan,key:u,billingEmail:l.billingEmail};e.submitPromise=n.organizations.post(p).$promise.then(c)}else e.submitPromise=s.card.createToken(l.card).then(function(t){var o={name:l.name,planType:"month"===l.interval?e.plans[l.plan].monthPlanType:e.plans[l.plan].annualPlanType,key:u,paymentToken:t.id,additionalSeats:l.additionalSeats,billingEmail:l.billingEmail,businessName:l.ownedBusiness?l.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,r,a,i,s){s.eventTrack("settingsDeleteController",{category:"Modal"}),e.submit=function(l){var c={masterPasswordHash:r.hashPassword(l.masterPassword)};e.submitPromise=n.accounts.postDelete(c,function(){o.dismiss("cancel"),a.logOut(),s.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,r,a){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){a.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:[]},a=0;a<e.globalEquivalentDomains.length;a++)e.globalEquivalentDomains[a].excluded&&t.ExcludedGlobalEquivalentDomains.push(e.globalEquivalentDomains[a].key);for(a=0;a<e.equivalentDomains.length;a++)t.EquivalentDomains.push(e.equivalentDomains[a].split(" ").join("").split(","));return t.EquivalentDomains.length||(t.EquivalentDomains=null),t.ExcludedGlobalEquivalentDomains.length||(t.ExcludedGlobalEquivalentDomains=null),n.settings.putDomains(t,function(e){r.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,r,a,i,s){s.eventTrack("settingsSessionsController",{category:"Modal"}),e.submit=function(l){var c={masterPasswordHash:r.hashPassword(l.masterPassword)};e.submitPromise=n.accounts.putSecurityStamp(c,function(){o.dismiss("cancel"),a.logOut(),s.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,r,a,i,s){function l(e){return e?e.replace(/(.{4})/g,"$1 ").trim().toUpperCase():null}function c(t){var n=t.AuthenticatorKey;e.twoFactorModel={enabled:t.TwoFactorEnabled,key:l(n),recovery:l(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}}s.eventTrack("settingsTwoFactorController",{category:"Modal"});var d,u="bitwarden",p=null;r.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 r={enabled:!o,token:n.token.replace(" ",""),masterPasswordHash:d};e.updatePromise=t.accounts.putTwoFactor({},r,function(t){t.TwoFactorEnabled?(s.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):(s.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){s.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,r){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,r,a,i,s,l){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}l.eventTrack("toolsExportController",{category:"Modal"}),e.export=function(n){e.startedExport=!0;var o=[],r=[],d=t.folders.list({},function(e){r=a.decryptFolders(e.Data)}).$promise,u=t.logins.list({},function(e){o=a.decryptLogins(e.Data)}).$promise;i.all([d,u]).then(function(){if(!o.length)return s.error("Nothing to export.","Error!"),void e.close();for(var t={},n=0;n<r.length;n++)t[r[n].id]=r[n];try{var a=[];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};a.push(i)}var d=Papa.unparse(a),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)}l.eventTrack("Exported Data"),s.success("Your data has been exported. Check your browser's downloads folder.","Success!"),e.close()}catch(t){s.error("Something went wrong. Please try again.","Error!"),e.close()}},function(){s.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,r,a,i,s,l,c,d){function u(r,s,c){if(!r.length&&!s.length)return void g("Nothing was imported.");if(s.length){var d=Math.floor(s.length/2),u=s.length-1;if(p(s[0])&&p(s[d])&&p(s[u]))return void g("CSV data is not formatted correctly. Please check your import file and try again.")}n.ciphers.import({folders:a.encryptFolders(r),logins:a.encryptLogins(s),folderRelationships:c},function(){o.dismiss("cancel"),t.go("backend.user.vault",{refreshFromServer:!0}).then(function(){l.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(l.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 r="";for(var a in n.ValidationErrors)if(n.ValidationErrors.hasOwnProperty(a))for(var s=0;s<n.ValidationErrors[a].length;s++)r+=a+": "+n.ValidationErrors[a][s]+" ";if(""!==r)return void i.error(r)}i.error("Something went wrong. Try again.","Oh No!")}l.eventTrack("toolsImportController",{category:"Modal"}),e.model={source:""},e.source={},e.options=[{id:"bitwardencsv",name:"bitwarden (csv)",featured:!0,sort:1,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)",featured:!0,sort:2,instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/article/import-from-lastpass/">https://help.bitwarden.com/article/import-from-lastpass/</a>')},{id:"chromecsv",name:"Chrome (csv)",featured:!0,sort:3,instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/article/import-from-chrome/">https://help.bitwarden.com/article/import-from-chrome/</a>')},{id:"firefoxpasswordexportercsvxml",name:"Firefox Password Exporter (xml)",featured:!0,sort:4,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)",featured:!0,sort:5,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)",featured:!0,sort:7,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)",featured:!0,sort:6,instructions:c.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/article/import-from-1password/">https://help.bitwarden.com/article/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/article/import-from-1password/">https://help.bitwarden.com/article/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.')},{id:"meldiumcsv",name:"Meldium (csv)",instructions:c.trustAsHtml('Using the Meldium web vault, navigate to "Settings". Locate the "Export data" function and click "Show me my data" to save the CSV file.')},{id:"passkeepcsv",name:"PassKeep (csv)",instructions:c.trustAsHtml('Using the PassKeep mobile app, navigate to "Backup/Restore". Locate the "CSV Backup/Restore" section and click "Backup to CSV" to save the CSV file.')},{id:"operacsv",name:"Opera (csv)",instructions:c.trustAsHtml('The process for importing from Opera is exactly the same as importing from Google Chrome. See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/article/import-from-chrome/">https://help.bitwarden.com/article/import-from-chrome/</a>')},{id:"vivaldicsv",name:"Vivaldi (csv)",instructions:c.trustAsHtml('The process for importing from Vivaldi is exactly the same as importing from Google Chrome. See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/article/import-from-chrome/">https://help.bitwarden.com/article/import-from-chrome/</a>')}],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,s.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,r,a){a.eventTrack("vaultAddFolderController",{category:"Modal"}),e.savePromise=null,e.save=function(o){var i=r.encryptFolder(o);e.savePromise=t.folders.post(i,function(e){a.eventTrack("Created Folder");var t=r.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,r,a,i,s,l,c){function d(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}s.eventTrack("vaultAddLoginController",{category:"Modal"}),e.folders=c.vaultFolders,e.login={folderId:i?i.id:null,favorite:!0===l},e.savePromise=null,e.save=function(o){var a=r.encryptLogin(o);e.savePromise=t.logins.post(a,function(e){s.eventTrack("Created Login");var t=r.decryptLogin(e);n.close(t)}).$promise},e.generatePassword=function(){e.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(s.eventTrack("Generated Password From Add"),e.login.password=a.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,r,a,i,s,l,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=s.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 r=s.decryptLoginPreview(e.Data[o]);n.push(r)}l.when(t).then(function(){h(n)})}).$promise;l.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 r=200;angular.forEach(n,function(t,n){r+=200,n>0&&d(function(){Array.prototype.push.apply(e.logins,t)},r)})}}function v(){u.vaultLogins=e.logins=o("orderBy")(u.vaultLogins,["name","username"])}function y(e,t){for(var n=[],o=0,r=e.length;o<r;)n.push(e.slice(o,o+=t));return n}function w(e){return e.id?e.name.toLowerCase():""}function b(e,t,n){return n.indexOf(e)===t}function C(){return $('input[name="loginSelection"]:checked').map(function(){return $(this).val()}).get().filter(b)}function S(e){$('input[name="loginSelection"]').prop("checked",e)}function k(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,e.folderIdFilter=void 0,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.clipboardError=function(e){alert("Your web browser does not support easy clipboard copying. Edit the login and copy it manually instead.")},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.password=t.data.password,e.favorite=t.data.favorite,v()):"partialEdit"===t.action?(e.folderId=t.data.folderId,e.favorite=t.data.favorite):"delete"===t.action&&k(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"),k(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&&k(e)})},e.filterFolder=function(t){e.folderIdFilter=t.id,$.AdminLTE&&$.AdminLTE.layout&&d(function(){$.AdminLTE.layout.fix()},0)},e.clearFilters=function(){e.folderIdFilter=void 0,$.AdminLTE&&$.AdminLTE.layout&&d(function(){$.AdminLTE.layout.fix()},0)},e.folderFilter=function(t){return void 0===e.folderIdFilter||t.id===e.folderIdFilter},e.unselectAll=function(){S(!1)},e.selectFolder=function(e,t){$(t.currentTarget).closest(".box").find('input[name="loginSelection"]').prop("checked",!0)},e.select=function(e){var t=$(e.currentTarget).closest("tr").find('input[name="loginSelection"]');t.prop("checked",!t.prop("checked"))},e.bulkMove=function(){var e=C();if(0===e.length)return void alert("You have not selected anything.");t.open({animation:!0,templateUrl:"app/vault/views/vaultMoveLogins.html",controller:"vaultMoveLoginsController",size:"sm",resolve:{ids:function(){return e}}}).result.then(function(t){for(var n=0;n<e.length;n++){var r=o("filter")(u.vaultLogins,{id:e[n]});r.length&&(r[0].folderId=t)}S(!1),v(),i.success("Items have been moved!")})},e.bulkDelete=function(){var t=C();if(0===t.length)return void alert("You have not selected anything.");confirm("Are you sure you want to delete the selected logins (total: "+t.length+")?")&&(e.bulkActionLoading=!0,n.ciphers.delMany({ids:t},function(){g.eventTrack("Bulk Deleted Logins");for(var n=0;n<t.length;n++){var r=o("filter")(u.vaultLogins,{id:t[n]});r.length&&r[0].edit&&k(r[0])}S(!1),e.bulkActionLoading=!1,i.success("Items have been deleted!")},function(){i.error("An error occurred."),e.bulkActionLoading=!1}))}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,n,o,r,a,i){i.eventTrack("vaultEditFolderController",{category:"Modal"}),e.folder={},t.folders.get({id:a},function(t){e.folder=r.decryptFolder(t)}),e.savePromise=null,e.save=function(o){var s=r.encryptFolder(o);e.savePromise=t.folders.put({id:a},s,function(e){i.eventTrack("Edited Folder");var t=r.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,r,a,i,s,l){function c(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}s.eventTrack("vaultEditLoginController",{category:"Modal"}),e.folders=l.vaultFolders,e.login={},e.readOnly=!1,t.logins.get({id:i},function(t){e.login=r.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){s.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 a=r.encryptLogin(o);e.savePromise=t.logins.put({id:i},a,function(e){s.eventTrack("Edited Login");var t=r.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?")||(s.eventTrack("Generated Password From Edit"),e.login.password=a.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(){s.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,r,a){a.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:r}).$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 r=0;r<t.CollectionIds.length;r++)n[t.CollectionIds[r]]=!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 r=[],a=0;a<t.Data.length;a++)if(t.Data[a].OrganizationId!==n.OrganizationId||t.Data[a].ReadOnly)t.Data[a].Id in e.selectedCollections&&delete e.selectedCollections[t.Data[a].Id];else{var i=o.decryptCollection(t.Data[a]);r.push(i)}e.loadingCollections=!1,e.collections=r})})}),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:r},o).$promise.then(function(e){a.eventTrack("Edited Login Collections"),n.close({action:"collectionsEdit",collectionIds:o.collectionIds})})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultMoveLoginsController",["$scope","apiService","$uibModalInstance","ids","$analytics","$rootScope",function(e,t,n,o,r,a){r.eventTrack("vaultMoveLoginsController",{category:"Modal"}),e.folders=a.vaultFolders,e.count=o.length,e.save=function(){e.savePromise=t.ciphers.moveMany({ids:o,folderId:e.folderId},function(){r.eventTrack("Bulk Moved Logins"),n.close(e.folderId||null)}).$promise},e.folderSort=function(e){return e.id?e.name.toLowerCase():"!"},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,r,a,i,s){i.eventTrack("vaultShareLoginController",{category:"Modal"}),e.model={},e.login={},e.collections=[],e.selectedCollections={},e.organizations=[];var l={};e.loadingCollections=!0,e.loading=!0,e.readOnly=!1,t.logins.get({id:a}).$promise.then(function(t){return e.readOnly=!t.Edit,t.Edit&&(e.login=r.decryptLogin(t)),t.Edit}).then(function(t){if(e.loading=!1,t)return o.getUserProfile()}).then(function(n){if(n&&n.organizations){var o=[],a=!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}),l[n.organizations[i].id]=0,a||(a=!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 a=r.decryptCollection(t.Data[o]);a.organizationId=t.Data[o].OrganizationId,n.push(a),l[a.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===l[e.model.organizationId]},e.orgChanged=function(){e.selectedCollections={}},e.submitPromise=null,e.submit=function(o){e.login.organizationId=o.organizationId;var s={collectionIds:[],cipher:r.encryptLogin(e.login)};for(var l in e.selectedCollections)e.selectedCollections.hasOwnProperty(l)&&s.collectionIds.push(l);e.submitPromise=t.ciphers.putShare({id:a},s,function(e){i.eventTrack("Shared Login"),n.close(o.organizationId)}).$promise},e.close=function(){n.dismiss("cancel")},e.createOrg=function(){s.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,r,a,i,s,l){function c(e){if(l.vaultLogins){var t=s("filter")(l.vaultLogins,{id:e.id});if(t&&t.length)return t[0]}return null}function d(e){if(e&&e.id){var t=l.vaultLogins.indexOf(e);t>-1&&l.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=[],r=0;r<t.Data.length;r++){var i=n.decryptCollection(t.Data[r],null,!0);i.collapsed=a.collapsedCollections&&i.id in a.collapsedCollections,o.push(i)}e.collections=o}).$promise,i=t.ciphers.listDetails({},function(t){for(var o=[],r=0;r<t.Data.length;r++)if(1===t.Data[r].Type){var i=n.decryptLoginPreview(t.Data[r]);o.push(i)}o.length&&e.collections.push({id:null,name:"Unassigned",collapsed:a.collapsedCollections&&"unassigned"in a.collapsedCollections}),e.logins=o}).$promise;r.all([o,i]).then(function(){e.loading=!1})}),e.clipboardError=function(e){alert("Your web browser does not support easy clipboard copying. Edit the login and copy it manually instead.")},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){a.collapsedCollections||(a.collapsedCollections={});var t=e.id||"unassigned";t in a.collapsedCollections?delete a.collapsedCollections[t]:a.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.password=o.username=n.data.password,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 r=e.logins.indexOf(t);r>-1&&e.logins.splice(r,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 r={collectionIds:[]},a=0;a<e.collectionIds.length;a++)e.collectionIds[a]!==n.id&&r.collectionIds.push(e.collectionIds[a]);t.ciphers.putCollections({id:e.id},r).$promise.then(function(t){o.eventTrack("Removed From Collection"),e.collectionIds=r.collectionIds})}}}]); |