1
0
mirror of https://github.com/bitwarden/web synced 2025-12-06 00:03:28 +00:00
Files
web/js/app.min.js
2017-01-29 21:25:17 -05:00

3 lines
74 KiB
JavaScript

angular.module("bit",["ui.router","ngMessages","angular-jwt","angular-md5","ui.bootstrap.showErrors","toastr","angulartics","angulartics.google.analytics","bit.directives","bit.services","bit.global","bit.accounts","bit.vault","bit.settings","bit.tools"]),angular.module("bit").constant("appSettings",{rememberedEmailCookieName:"bit.rememberedEmail",apiUri:"http://localhost:4000",version:"1.8.0",environment:"Development"}),angular.module("bit.accounts",["ui.bootstrap","ngCookies"]),angular.module("bit.directives",[]),angular.module("bit.global",[]),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","$uibTooltipProvider","toastrConfig",function(e,t,n,o,r,a){o.urlParam="access_token2";var s;o.tokenGetter=["config","appSettings","tokenService","apiService","jwtHelper","$q",function(e,t,n,o,r,a){if(0===e.url.indexOf(t.apiUri)){if(s)return s;var i=n.getToken();if(i){if(!n.tokenNeedsRefresh(i))return i;var l=n.getRefreshToken();if(l){var u=a.defer();return o.identity.token({grant_type:"refresh_token",client_id:"web",refresh_token:l},function(e){n.setToken(e.access_token),n.setRefreshToken(e.refresh_token),s=null,u.resolve(e.access_token)}),s=u.promise}}}}],angular.extend(a,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),r.options({popupDelay:600,appendToBody:!0}),n.defaults.headers.post&&(n.defaults.headers.post={}),n.defaults.headers.post["Content-Type"]="text/plain; charset=utf-8",n.interceptors.push("apiInterceptor"),n.interceptors.push("jwtInterceptor"),t.otherwise("/"),e.state("backend",{templateUrl:"app/views/backendLayout.html","abstract":!0,data:{authorize:!0}}).state("backend.vault",{url:"^/",templateUrl:"app/vault/views/vault.html",controller:"vaultController",data:{pageTitle:"My Vault"}}).state("backend.settings",{url:"^/settings",templateUrl:"app/settings/views/settings.html",controller:"settingsController",data:{pageTitle:"Settings"}}).state("backend.tools",{url:"^/tools",templateUrl:"app/tools/views/tools.html",controller:"toolsController",data:{pageTitle:"Tools"}}).state("frontend",{templateUrl:"app/views/frontendLayout.html","abstract":!0,data:{authorize:!1}}).state("frontend.login",{templateUrl:"app/accounts/views/accountsLogin.html",controller:"accountsLoginController",data:{bodyClass:"login-page"}}).state("frontend.login.info",{url:"^/login",templateUrl:"app/accounts/views/accountsLoginInfo.html",data:{pageTitle:"Log In"}}).state("frontend.login.twoFactor",{url:"^/login/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",templateUrl:"app/accounts/views/accountsRegister.html",controller:"accountsRegisterController",data:{pageTitle:"Register",bodyClass:"register-page"}})}]).run(["$rootScope","authService","jwtHelper","tokenService","$state",function(e,t,n,o,r){e.$on("$stateChangeStart",function(e,n,o){return n.data&&n.data.authorize?void(t.isAuthenticated()||(e.preventDefault(),t.logOut(),r.go("frontend.login.info"))):void(t.isAuthenticated()&&(e.preventDefault(),r.go("backend.vault")))})}]),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","appSettings","$analytics",function(e,t,n,o,r,a,s,i,l){var u=n.get(i.rememberedEmailCookieName);u&&(e.model={email:u,rememberEmail:!0});var c,d;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(i.rememberedEmailCookieName,t.email,{expires:o})}else n.remove(i.rememberedEmailCookieName);e&&e.length>0?(c=t.email,d=t.masterPassword,l.eventTrack("Logged In To Two-step"),s.go("frontend.login.twoFactor")):(l.eventTrack("Logged In"),s.go("backend.vault"))})},e.twoFactor=function(t){e.twoFactorPromise=a.logIn(c,d,t.code,0),e.twoFactorPromise.then(function(){l.eventTrack("Logged In From Two-step"),s.go("backend.vault")})}}]),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("accountsPasswordHintController",["$scope","$rootScope","apiService",function(e,t,n){e.success=!1,e.submit=function(t){e.submitPromise=n.accounts.postPasswordHint({email:t.email},function(){e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRecoverController",["$scope","apiService","cryptoService",function(e,t,n){e.success=!1,e.submit=function(o){var r=o.email.toLowerCase(),a=n.makeKey(o.masterPassword,r),s={email:r,masterPasswordHash:n.hashPassword(o.masterPassword,a),recoveryCode:o.code.replace(/\s/g,"").toLowerCase()};e.submitPromise=t.accounts.postTwoFactorRecover(s,function(){e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRegisterController",["$scope","$location","apiService","cryptoService","validationService","$analytics",function(e,t,n,o,r,a){var s=t.search();e.success=!1,e.model={email:s.email},e.registerPromise=null,e.register=function(t){var s=!1;if(e.model.masterPassword.length<8&&(r.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),s=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(r.addError(t,"ConfirmMasterPassword","Master password confirmation does not match.",!0),s=!0),!s){var i=e.model.email.toLowerCase(),l=o.makeKey(e.model.masterPassword,i),u={name:e.model.name,email:i,masterPasswordHash:o.hashPassword(e.model.masterPassword,l),masterPasswordHint:e.model.masterPasswordHint};e.registerPromise=n.accounts.register(u,function(){e.success=!0,a.eventTrack("Registered")}).$promise}}}]),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")}))}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("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(n,o,r,a){var s=t.getUserProfile();s&&(a.$parsers.unshift(function(t){if(t){var n=e.makeKey(t,s.email,!0),o=n===e.getKey(!0);return a.$setValidity("masterPassword",o),o?t:void 0}}),a.$formatters.unshift(function(t){if(t){var n=e.makeKey(t,s.email,!0),o=n===e.getKey(!0);return a.$setValidity("masterPassword",o),t}}))}}}]),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,s){var i="bitwarden Password Manager";n.data&&n.data.pageTitle&&(i=n.data.pageTitle+" - bitwarden Password Manager"),t(function(){o.text(i)})};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.global").controller("mainController",["$scope","$state","authService","appSettings","toastr",function(e,t,n,o,r){var a=this;a.bodyClass="",a.userProfile=null,a.searchVaultText=null,a.version=o.version,e.currentYear=(new Date).getFullYear(),e.$on("$viewContentLoaded",function(){$.AdminLTE&&($.AdminLTE.layout&&($.AdminLTE.layout.fix(),$.AdminLTE.layout.fixSidebar()),$.AdminLTE.pushMenu&&$.AdminLTE.pushMenu.expandOnHover())}),e.$on("$stateChangeSuccess",function(e,t,o,r,s){return a.searchVaultText=null,a.userProfile=n.getUserProfile(),t.data.bodyClass?void(a.bodyClass=t.data.bodyClass):void(a.bodyClass="")}),e.searchVault=function(){t.go("backend.vault")},e.addLogin=function(){e.$broadcast("vaultAddLogin")},e.addFolder=function(){e.$broadcast("vaultAddFolder")},e.changeEmail=function(){e.$broadcast("settingsChangeEmail")},e.changePassword=function(){e.$broadcast("settingsChangePassword")},e.sessions=function(){e.$broadcast("settingsSessions")},e.domains=function(){e.$broadcast("settingsDomains")},e["delete"]=function(){e.$broadcast("settingsDelete")},e.twoFactor=function(){e.$broadcast("settingsTwoFactor")},e["import"]=function(){e.$broadcast("toolsImport")},e["export"]=function(){e.$broadcast("toolsExport")},e.audits=function(){e.$broadcast("toolsAudits")}}]),angular.module("bit.global").controller("sideNavController",["$scope","$state",function(e,t){e.$state=t}]),angular.module("bit.global").controller("topNavController",["$scope",function(e){}]),angular.module("bit.services").factory("apiService",["$resource","tokenService","appSettings","$httpParamSerializer",function(e,t,n,o){function r(e){return o(e)}var a={},s=n.apiUri;return a.logins=e(s+"/sites/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:s+"/sites/:id/delete",method:"POST",params:{id:"@id"}}}),a.folders=e(s+"/folders/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:s+"/folders/:id/delete",method:"POST",params:{id:"@id"}}}),a.ciphers=e(s+"/ciphers/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},"import":{url:s+"/ciphers/import",method:"POST",params:{}},favorite:{url:s+"/ciphers/:id/favorite",method:"POST",params:{id:"@id"}},del:{url:s+"/ciphers/:id/delete",method:"POST",params:{id:"@id"}}}),a.accounts=e(s+"/accounts",{},{register:{url:s+"/accounts/register",method:"POST",params:{}},emailToken:{url:s+"/accounts/email-token",method:"POST",params:{}},email:{url:s+"/accounts/email",method:"POST",params:{}},putPassword:{url:s+"/accounts/password",method:"POST",params:{}},getProfile:{url:s+"/accounts/profile",method:"GET",params:{}},putProfile:{url:s+"/accounts/profile",method:"POST",params:{}},getDomains:{url:s+"/accounts/domains",method:"GET",params:{}},putDomains:{url:s+"/accounts/domains",method:"POST",params:{}},getTwoFactor:{url:s+"/accounts/two-factor",method:"GET",params:{}},putTwoFactor:{url:s+"/accounts/two-factor",method:"POST",params:{}},postTwoFactorRecover:{url:s+"/accounts/two-factor-recover",method:"POST",params:{}},postPasswordHint:{url:s+"/accounts/password-hint",method:"POST",params:{}},putSecurityStamp:{url:s+"/accounts/security-stamp",method:"POST",params:{}},"import":{url:s+"/accounts/import",method:"POST",params:{}},postDelete:{url:s+"/accounts/delete",method:"POST",params:{}}}),a.settings=e(s+"/settings",{},{getDomains:{url:s+"/settings/domains",method:"GET",params:{}},putDomains:{url:s+"/settings/domains",method:"POST",params:{}}}),a.auth=e(s+"/auth",{},{token:{url:s+"/auth/token",method:"POST",params:{}},tokenTwoFactor:{url:s+"/auth/token/two-factor",method:"POST",params:{}}}),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}]),angular.module("bit.services").factory("authService",["cryptoService","apiService","tokenService","$q","jwtHelper",function(e,t,n,o,r){function a(e){i.extended={name:e.Name,twoFactorEnabled:e.TwoFactorEnabled,culture:e.Culture}}var s={},i=null;return s.logIn=function(r,a,s,i){r=r.toLowerCase();var l=e.makeKey(a,r),u={username:r,password:e.hashPassword(a,l),grant_type:"password",scope:"api offline_access",client_id:"web"};s&&"undefined"!=typeof i&&null!==i&&(u.twoFactorToken=s.replace(" ",""),u.twoFactorProvider=i);var c=o.defer();return t.identity.token(u,function(t){t&&t.access_token&&(n.setToken(t.access_token),n.setRefreshToken(t.refresh_token),e.setKey(l),c.resolve())},function(e){400===e.status&&e.data.TwoFactorProviders&&e.data.TwoFactorProviders.length?c.resolve(e.data.TwoFactorProviders):c.reject(e)}),c.promise},s.logOut=function(){n.clearToken(),n.clearRefreshToken(),e.clearKey(),i=null},s.getUserProfile=function(){return i||s.setUserProfile(),i},s.setUserProfile=function(){var e=n.getToken();if(e){var o=r.decodeToken(e);i={id:o.name,email:o.email},t.accounts.getProfile({},a)}},s.isAuthenticated=function(){return null!==n.getToken()},s}]),angular.module("bit.services").factory("cipherService",["cryptoService","apiService",function(e,t){var n={};return n.decryptLogins=function(e){if(!e)throw"encryptedLogins is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(n.decryptLogin(e[o]));return t},n.decryptLogin=function(t){if(!t)throw"encryptedLogin is undefined or null";var n={id:t.Id,type:1,folderId:t.FolderId,favorite:t.Favorite,name:e.decrypt(t.Name),uri:t.Uri&&""!==t.Uri?e.decrypt(t.Uri):null,username:t.Username&&""!==t.Username?e.decrypt(t.Username):null,password:t.Password&&""!==t.Password?e.decrypt(t.Password):null,notes:t.Notes&&""!==t.Notes?e.decrypt(t.Notes):null};return t.Folder&&(n.folder={name:e.decrypt(t.Folder.Name)}),n},n.decryptFolders=function(e){if(!e)throw"encryptedFolders is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(n.decryptFolder(e[o]));return t},n.decryptFolder=function(t){if(!t)throw"encryptedFolder is undefined or null";return{id:t.Id,type:0,name:e.decrypt(t.Name)}},n.encryptLogins=function(e,t){if(!e)throw"unencryptedLogins is undefined or null";for(var o=[],r=0;r<e.length;r++)o.push(n.encryptLogin(e[r],t));return o},n.encryptLogin=function(t,n){if(!t)throw"unencryptedLogin is undefined or null";return{id:t.id,type:1,folderId:""===t.folderId?null:t.folderId,favorite:null!==t.favorite?t.favorite:!1,uri:t.uri&&""!==t.uri?e.encrypt(t.uri,n):null,name:e.encrypt(t.name,n),username:t.username&&""!==t.username?e.encrypt(t.username,n):null,password:t.password&&""!==t.password?e.encrypt(t.password,n):null,notes:t.notes&&""!==t.notes?e.encrypt(t.notes,n):null}},n.encryptFolders=function(e,t){if(!e)throw"unencryptedFolders is undefined or null";for(var o=[],r=0;r<e.length;r++)o.push(n.encryptFolder(e[r],t));return o},n.encryptFolder=function(t,n){if(!t)throw"unencryptedFolder is undefined or null";return{id:t.id,type:0,name:e.encrypt(t.name,n)}},n}]),angular.module("bit.services").factory("cryptoService",["$sessionStorage",function(e){function t(e,t){"string"==typeof e&&(e=sjcl.codec.base64.toBits(e)),"string"==typeof t&&(t=sjcl.codec.base64.toBits(t));var n=s.getMacKey(),o=new sjcl.misc.hmac(n,sjcl.hash.sha256),r=t.concat(e),a=o.encrypt(r);return sjcl.codec.base64.fromBits(a)}var n,o,r,a,s={};return sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity."](),s.setKey=function(t){n=t,e.key=sjcl.codec.base64.fromBits(t)},s.getKey=function(t){return t&&t===!0&&o?o:!t&&n?n:(e.key&&(n=sjcl.codec.base64.toBits(e.key)),t&&t===!0?o=sjcl.codec.base64.fromBits(n):n)},s.getEncKey=function(e){return e=e||s.getKey(),e.slice(0,4)},s.getMacKey=function(e){return e=e||s.getKey(),e.slice(4)},s.clearKey=function(){n=o=r=a=null,delete e.key},s.makeKey=function(e,t,n){var o=sjcl.misc.pbkdf2(e,t,5e3,256,null);return n&&n===!0?sjcl.codec.base64.fromBits(o):o},s.hashPassword=function(e,t){if(t||(t=s.getKey()),!e||!t)throw"Invalid parameters.";var n=sjcl.misc.pbkdf2(t,e,1,256,null);return sjcl.codec.base64.fromBits(n)},s.getAes=function(){return!r&&s.getKey()&&(r=new sjcl.cipher.aes(s.getKey())),r},s.getAesWithMac=function(){return!a&&s.getKey()&&(a=new sjcl.cipher.aes(s.getEncKey())),a},s.encrypt=function(e,t){if(!s.getKey()&&!t)throw"Encryption key unavailable.";var n=null;n=t||s.getKey();var o={},r={mode:"cbc",iv:sjcl.random.randomWords(4,10)},a=sjcl.encrypt(n,e,r,o),i=a.match(/"ct":"([^"]*)"/)[1],l=sjcl.codec.base64.fromBits(o.iv),u=l+"|"+i;return u},s.decrypt=function(e){if(!s.getAes()||!s.getAesWithMac())throw"AES encryption unavailable.";var n=e.split("|");if(2!==n.length&&3!==n.length)return"";var o=sjcl.codec.base64.toBits(n[0]),r=sjcl.codec.base64.toBits(n[1]),a=null;if(3===n.length&&(a=t(r,o),a!==n[2]))return console.error("MAC failed."),"";var i=sjcl.mode.cbc.decrypt(a?s.getAesWithMac():s.getAes(),r,o,null);return sjcl.codec.utf8String.fromBits(i)},s}]),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,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];angular.forEach(e.data,function(e,t){var o=r.length,i=a.length,l=e.folder&&""!==e.folder,u=l;if(l)for(var c=0;c<r.length;c++)if(r[c].name===e.folder){u=!1,o=c;break}if(a.push({favorite:null!==e.favorite?e.favorite:!1,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:"--"}),u&&r.push({name:e.folder}),l){var d={key:i,value:o};s.push(d)}}),t(r,a,s)}})}function a(e,t,r){function a(e){var o=[],r=[],a=[];angular.forEach(e,function(e,t){var s=o.length,i=r.length,l=e.grouping&&""!==e.grouping&&"(none)"!==e.grouping,u=l;if(l)for(var c=0;c<o.length;c++)if(o[c].name===e.grouping){u=!1,s=c;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:"--"}),u&&o.push({name:e.grouping}),l){var d={key:i,value:s};a.push(d)}}),t(o,r,a)}if("text/html"===e.type){var s=new FileReader;s.readAsText(e,"utf-8"),s.onload=function(e){var t,n,o=$(e.target.result),s=o.find("pre");if(1===s.length)t=s.text().trim(),n=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(n.data);else{for(var i=!1,l=0;l<o.length;l++)if("pre"===o[l].tagName.toLowerCase()){i=!0,t=o[l].outerText.trim(),n=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(n.data);break}i||r()}},s.onerror=function(e){r()}}else Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),a(e.data)}})}function s(e,t,o){var r=[],a=[],s=[],i=[],l=0,u=0,c=new FileReader;c.readAsText(e,"utf-8"),c.onload=function(e){var c=$.parseXML(e.target.result),d=$(c),p=d.find("database");if(p.length){var m=p.find("> label");if(m.length)for(l=0;l<m.length;l++){var f=$(m[l]);i[f.attr("id")]=r.length,r.push({name:f.attr("name")})}var g=p.find("> card");if(g.length)for(l=0;l<g.length;l++){var h=$(g[l]);if("true"!==h.attr("template")){var v={favorite:!1,uri:null,username:null,password:null,notes:null,name:h.attr("title")},w=h.find("> field");for(u=0;u<w.length;u++){var b=$(w[u]),y=b.text(),k=b.attr("type");y&&""!==y&&("login"===k?v.username=y:"password"===k?v.password=y:"notes"===k?v.notes=y:"weblogin"===k&&(v.uri=n(y)))}if(a.push(v),m=h.find("> label_id"),m.length){var S=$(m[0]).text(),P=i[S];null!==S&&""!==S&&null!==P&&s.push({key:a.length-1,value:P})}}}t(r,a,s)}else o()},c.onerror=function(e){o()}}function i(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[],i=[],l=0,u=0;for(l=0;l<e.data.length;l++){var c=e.data[l];if(0!==l){var d=r.length,p=a.length,m=c[1]&&""!==c[1],f=m;if(m)for(u=0;u<r.length;u++)if(r[u].name===c[1]){f=!1,d=u;break}var g={favorite:!1,uri:null,username:c[2]&&""!==c[2]?c[2]:null,password:c[3]&&""!==c[3]?c[3]:null,notes:null,name:c[0]&&""!==c[0]?c[0]:"--"};if(i.length)for(u=4;u<c.length;u++){var h=c[u];if(h&&""!==h){var v=i[u-4];"url"===v.toLowerCase()||"uri"===v.toLowerCase()?g.uri=n(h):(null===g.notes&&(g.notes=""),g.notes+=v+": "+h+"\n")}}a.push(g),f&&r.push({name:c[1]}),m&&s.push({key:p,value:d})}else for(u=4;u<c.length;u++)i.push(c[u])}t(r,a,s)}})}function l(e,t,o){function r(e,t,o){var l=a.length,u=o;t||(""!==u&&(u+=" > "),u+=e.find("> Name").text(),a.push({name:u}));var c=e.find("> Entry");if(c.length)for(var d=0;d<c.length;d++){for(var p=$(c[d]),m=s.length,f={favorite:!1,uri:null,username:null,password:null,notes:null,name:null},g=p.find("> String"),h=0;h<g.length;h++){var v=$(g[h]),w=v.find("> Key").text(),b=v.find("> Value").text();if(""!==b)switch(w){case"URL":f.uri=n(b);break;case"UserName":f.username=b;break;case"Password":f.password=b;break;case"Title":f.name=b;break;case"Notes":f.notes=null===f.notes?b+"\n":f.notes+b+"\n";break;default:f.notes=null===f.notes?w+": "+b+"\n":f.notes+w+": "+b+"\n"}}null===f.name&&(f.name="--"),s.push(f),t||i.push({key:m,value:l})}var y=e.find("> Group");if(y.length)for(var k=0;k<y.length;k++)r($(y[k]),!1,u)}var a=[],s=[],i=[],l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var n=$.parseXML(e.target.result),l=$(n),u=l.find("Root");if(u.length){var c=u.find("> Group");c.length&&(r($(c[0]),!0,""),t(a,s,i))}else o()},l.onerror=function(e){o()}}function u(e,n,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];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,i=r.length,l=a.length,u=null!==o,c=u,d=0;if(u)for(d=0;d<r.length;d++)if(r[d].name===o){c=!1,i=d;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),c&&r.push({name:o}),u){var m={key:l,value:i};s.push(m)}}),n(r,a,s)}})}function c(e,n,o){function r(e,t,n,o,r){for(var a=0;a<e.length;a++){var s=e[a];s[o]&&""!==s[o]&&(!t.username&&s[n]&&"username"===s[n]?t.username=s[o]:!t.password&&s[n]&&"password"===s[n]?t.password=s[o]:s[r]&&s[o]&&(null===t.notes?t.notes="":t.notes+="\n",t.notes+=s[r]+": "+s[o].toString().split("\\r\\n").join("\n").split("\\n").join("\n")))}}var a=[],s=[],i=[],l=0,u=new FileReader;u.readAsText(e,"utf-8"),u.onload=function(e){var o=e.target.result,u=o.split(/(?:\r\n|\r|\n)/);for(l=0;l<u.length;l++){var c=u[l];if(c.length&&"{"===c[0]){var d=JSON.parse(c),p={favorite:!(!d.openContents||!d.openContents.faveIndex),uri:d.location&&""!==d.location?t(d.location):null,username:null,password:null,notes:null,name:d.title&&""!==d.title?d.title:"--"};if(d.secureContents&&(d.secureContents.notesPlain&&""!==d.secureContents.notesPlain&&(p.notes=d.secureContents.notesPlain.split("\\r\\n").join("\n").split("\\n").join("\n")),d.secureContents.fields&&r(d.secureContents.fields,p,"designation","value","name"),d.secureContents.sections))for(var m=0;m<d.secureContents.sections.length;m++)d.secureContents.sections[m].fields&&r(d.secureContents.sections[m].fields,p,"n","v","t");s.push(p)}}n(a,s,i)},u.onerror=function(e){o()}}function d(e,n,r){var a=[],s=[],i=[];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 u={favorite:!1,uri:null,username:null,password:null,notes:l.notesPlain&&""!==l.notesPlain?l.notesPlain:"",name:l.title&&""!==l.title?l.title:"--"};for(var c in l)if(l.hasOwnProperty(c)){if(null===l[c]||""===l[c])continue;if(u.password||"password"!==c)if(u.username||"username"!==c)if(u.uri||"urls"!==c)"ainfo"===c||"autosubmit"===c||"notesPlain"===c||"ps"===c||"scope"===c||"tags"===c||"title"===c||"uuid"===c||c.startsWith("section:")||(""!==u.notes&&(u.notes+="\n"),u.notes+=c+": "+l[c]);else{var d=l[c].split(/(?:\r\n|\r|\n)/);u.uri=t(d[0]);for(var p=1;p<d.length;p++)""!==u.notes&&(u.notes+="\n"),u.notes+="url "+(p+1)+": "+d[p]}else u.username=l[c];else u.password=l[c]}""===u.notes&&(u.notes=null),s.push(u)}}n(a,s,i)}})}function p(e,t,r){Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];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,s)}})}function m(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(o){}return t}var a=[],s=[],i=[];if("text/xml"!==e.type)return void o("Only .xml exports are supported.");var l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){for(var o=$.parseXML(e.target.result),l=$(o),u=l.find("entry"),c=0;c<u.length;c++){var d=$(u[c]);if(d){var p=d.attr("host"),m=d.attr("user"),f=d.attr("password");s.push({favorite:!1,uri:p&&""!==p?n(p):null,username:m&&""!==m?m:null,password:f&&""!==f?f:null,notes:null,name:r(p)})}}t(a,s,i)},l.onerror=function(e){o()}}function f(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];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,s)}})}function g(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];angular.forEach(e.data,function(e,t){if(e.length>=6){var o=r.length,i=a.length,l=e[0]&&""!==e[0],u=l,c=0;if(l)for(c=0;c<r.length;c++)if(r[c].name===e[0]){u=!1,o=c;break}var d={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===d.notes?d.notes="":d.notes+="\n",c=6;c<e.length;c+=2){var p=e[c],m=e[c+1];d.notes+=p+": "+m+"\n"}if(a.push(d),u&&r.push({name:e[0]}),l){var f={key:i,value:o};s.push(f)}}}),t(r,a,s)}})}function h(e,t,o){var r=[],a=[],s=[],i=0,l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var l=$.parseXML(e.target.result),u=$(l),c=u.find("PasswordManager");if(c.length){var d=c.find("> record");if(d.length)for(var p=0;p<d.length;p++){var m=$(d[p]),f=m.find("> Account-Name"),g=f.length?$(f):null,h=m.find("> User-Id"),v=h.length?$(h):null,w=m.find("> Password"),b=w.length?$(w):null,y=m.find("> URL"),k=y.length?$(y):null,S=m.find("> Notes"),P=S.length?$(S):null,T=m.find("> Category"),x=T.length?$(T):null,E=x?x.text():null,C=r.length,F=a.length,L=E&&""!==E&&"Unfiled"!==E,A=L;if(L)for(i=0;i<r.length;i++)if(r[i].name===E){A=!1,C=i;break}var D={favorite:!1,uri:k&&""!==k.text()?n(k.text()):null,username:v&&""!==v.text()?v.text():null,password:b&&""!==b.text()?b.text():null,notes:P&&""!==P.text()?P.text():null,name:g&&""!==g.text()?g.text():"--"},M="";for(i=1;10>=i;i++)M+="> Attribute-"+i,10>i&&(M+=", ");var U=m.find(M);if(U.length)for(i=0;i<U.length;i++){var I=$(U[i]),O=I.prop("tagName"),N=I.text();N&&""!==N&&"null"!==N&&(null===D.notes?D.notes="":D.notes+="\n",D.notes+=O+": "+N)}if(a.push(D),A&&r.push({name:E}),L){var j={key:F,value:C};s.push(j)}}t(r,a,s)}else o()},l.onerror=function(e){o()}}function v(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var r=[],a=[],s=[],i=0;i<e.data.length;i++){var l=e.data[i];if(!(l.length<2||0===i&&"Title"===l[0])){var u=l[l.length-1],c={name:l[0],favorite:!1,uri:null,password:null,username:null,notes:u&&""!==u?u:null};if(l.length>2&&l.length%2===0)for(var d=0;d<l.length-2;d+=2){var p=l[d+2];if(p&&""!==p){var m=l[d+1],f=m.toLowerCase();"url"!==f||c.uri?"username"!==f&&"email"!==f||c.username?"password"!==f||c.password?c.notes=null===c.notes?m+": "+p:c.notes+"\n"+m+": "+p:c.password=p:c.username=p:c.uri=n(p)}}a.push(c)}}t(r,a,s)}})}function w(e,t,o){var r=[],a=[],s=[],i=0,l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var l=$.parseXML(e.target.result),u=$(l),c=u.find("passwordsafe");if(c.length){var d=c.attr("delimiter"),p=c.find("> entry");if(p.length)for(var m=0;m<p.length;m++){var f=$(p[m]),g=f.find("> title"),h=g.length?$(g):null,v=f.find("> username"),w=v.length?$(v):null,b=f.find("> email"),y=b.length?$(b):null,k=y?y.text():null,S=f.find("> password"),P=S.length?$(S):null,T=f.find("> url"),x=T.length?$(T):null,E=f.find("> notes"),C=E.length?$(E):null,F=C?C.text().split(d).join("\n"):null,L=f.find("> group"),A=L.length?$(L):null,D=A?A.text().split(".").join(" > "):null,M=r.length,U=a.length,I=D&&""!==D,O=I;if(I)for(i=0;i<r.length;i++)if(r[i].name===D){O=!1,M=i;break}var N={favorite:!1,uri:x&&""!==x.text()?n(x.text()):null,username:w&&""!==w.text()?w.text():null,
password:P&&""!==P.text()?P.text():null,notes:C&&""!==F?F:null,name:h&&""!==h.text()?h.text():"--"};if(!N.username&&k&&""!==k?N.username=k:k&&""!==k&&(N.notes=null===N.notes?"Email: "+k:N.notes+"\nEmail: "+k),a.push(N),O&&r.push({name:D}),I){var j={key:U,value:M};s.push(j)}}t(r,a,s)}else o()},l.onerror=function(e){o()}}function b(e,n,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);for(var r=[],a=[],s=[],i=0;i<e.data.length;i++){var l=!1,u=e.data[i];if(u.length&&1!==u.length){var c={name:u[0]&&""!==u[0]?u[0]:"--",favorite:!1,uri:null,password:null,username:null,notes:null};if(2===u.length)c.uri=t(u[1]);else if(3===u.length)c.uri=t(u[1]),c.username=u[2];else if(4===u.length)""===u[2]&&""===u[3]?(c.username=u[1],c.notes=u[2]+"\n"+u[3]):(c.username=u[2],c.notes=u[1]+"\n"+u[3]);else if(5===u.length)c.uri=t(u[1]),c.username=u[2],c.password=u[3],c.notes=u[4];else if(6===u.length)""===u[2]?(c.username=u[3],c.notes=u[5]):(c.username=u[2],c.notes=u[3]+"\n"+u[5]),c.uri=t(u[1]),c.password=u[4];else if(7===u.length)""===u[2]?(c.username=u[3],c.notes=u[4]+"\n"+u[6]):(c.username=u[2],c.notes=u[3]+"\n"+u[4]+"\n"+u[6]),c.uri=t(u[1]),c.password=u[5];else{c.notes="";for(var d=1;d<u.length;d++)if(c.notes=c.notes+u[d]+"\n","NO_TYPE"===u[d]){l=!0;break}}l||(""===c.username&&(c.username=null),""===c.password&&(c.password=null),""===c.notes&&(c.notes=null),""===c.uri&&(c.uri=null),a.push(c))}}n(r,a,s)}})}function y(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;var a=o.attr("ParentID");return r(e,a,n)}return n}var a=[],s=[],i=[],l=0,u=new FileReader;u.readAsText(e,"utf-8"),u.onload=function(e){var u=$.parseXML(e.target.result),c=$(u),d=c.find("root > Database");if(d.length){var p=d.find("> Logins > Login");if(p.length)for(var m=0;m<p.length;m++){var f=$(p[m]),g=f.attr("Name"),h=f.attr("Password"),v=f.attr("ID"),w=null,b=null,y=null,k=null,S=null;if(v&&""!==v){var P=d.find('> Accounts > Account > LoginLinks > Login[SourceLoginID="'+v+'"]');if(P.length){var T=P.parent().parent();T.length&&(w=T.attr("Name"),b=T.attr("Link"),k=T.attr("ParentID"),y=T.attr("Comments"),y&&(y=y.split("/n").join("\n")))}}k&&""!==k&&(S=r(d,k,""));var x=a.length,E=s.length,C=S&&""!==S,F=C;if(C)for(l=0;l<a.length;l++)if(a[l].name===S){F=!1,x=l;break}var L={favorite:!1,uri:b&&""!==b?n(b):null,username:g&&""!==g?g:null,password:h&&""!==h?h:null,notes:y&&""!==y?y:null,name:w&&""!==w?w:"--"};if(s.push(L),F&&a.push({name:S}),C){var A={key:E,value:x};i.push(A)}}t(a,s,i)}else o()},u.onerror=function(e){o()}}function k(e,t,r){Papa.parse(e,{encoding:"UTF-8",complete:function(e){o(e);var r=[],a=[],s=[];angular.forEach(e.data,function(e,t){if(e.length>=3){var o=r.length,i=a.length,l=e[0]&&""!==e[0]&&"Unassigned"!==e[0],u=l,c=0;if(l)for(c=0;c<r.length;c++)if(r[c].name===e[0]){u=!1,o=c;break}var d={favorite:!1,uri:null,username:null,password:null,notes:"",name:e[2]&&""!==e[2]?e[2]:null};if("Web Logins"===e[1])d.uri=e[4]&&""!==e[4]?n(e[4]):null,d.username=e[5]&&""!==e[5]?e[5]:null,d.password=e[6]&&""!==e[6]?e[6]:null,d.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]&&(""!==d.notes&&(d.notes=d.notes+"\n"),d.notes=d.notes+e[p]);if(e[1]&&""!==e[1]&&"Web Logins"!==e[1]&&(d.name=e[1]+": "+d.name),""===d.notes&&(d.notes=null),a.push(d),u&&r.push({name:e[0]}),l){var m={key:i,value:o};s.push(m)}}}),t(r,a,s)}})}function S(e,t,o){var r=[],a=[],s=[],i=0,l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var o=e.target.result,l=JSON.parse(o);if(l){if(l.logins)for(i=0;i<l.logins.length;i++){var u=l.logins[i];a.push({favorite:u.favorite&&u.favorite===!0,uri:u.url&&""!==u.url?n(u.url):null,username:u.login&&""!==u.login?u.login:null,password:u.password&&""!==u.password?u.password:null,notes:null,name:u.name&&""!==u.name?u.name:"--"})}if(l.documents)for(i=0;i<l.documents.length;i++){var c=l.documents[i],d={favorite:!1,uri:null,username:null,password:null,notes:"",name:c.title&&""!==c.title?c.title:"--"};if("note"===c.kind){if(!c.document_content||""===c.document_content)continue;d.notes=c.document_content}else for(var p in c)if(c.hasOwnProperty(p)){if("title"===p||"hexColor"===p||"kind"===p||""===c[p]||null===c[p])continue;""!==d.notes&&(d.notes=d.notes+"\n"),d.notes=d.notes+p+": "+c[p]}d.notes&&""!==d.notes&&(d.notes=d.notes.split("\\n").join("\n"),a.push(d))}}t(r,a,s)},l.onerror=function(e){o()}}function P(t,o,r){var a=[],s=[],i=[],l=new FileReader;l.readAsText(t,"utf-8"),l.onload=function(t){var r=$(t.target.result),l=r.find("textarea"),u=l&&l.length?l.val():null,c=u?JSON.parse(u):null;if(c&&c.length)for(var d=0;d<c.length;d++){var p=c[d],m={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&&(m.notes=p.data.notes.split("\\n").join("\n")),p.currentVersion&&p.currentVersion.fields)for(var f in p.currentVersion.fields)if(p.currentVersion.fields.hasOwnProperty(f)){var g=p.currentVersion.fields[f],h=g.actionType.toLowerCase();switch(h){case"password":m.password=g.value;break;case"email":case"username":case"user":case"name":m.username=g.value;break;case"url":m.uri=n(g.value);break;default:!m.username&&e(g.label,U)?m.username=g.value:!m.password&&e(g.label,M)?m.password=g.value:(m.notes&&""!==m.notes&&(m.notes=m.notes+"\n"),m.notes=m.notes+g.label+": "+g.value)}}""===m.notes&&(m.notes=null),s.push(m)}o(a,s,i)},l.onerror=function(e){r()}}function T(e,n,o){var r=[],a=[],s=[],i=0,l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var o=e.target.result,l=JSON.parse(o);if(l&&l.accounts)for(i=0;i<l.accounts.length;i++){var u=l.accounts[i],c={favorite:u.is_favorite&&u.is_favorite===!0,uri:u.domain&&""!==u.domain?t(u.domain):null,username:u.username&&""!==u.username?u.username:null,password:u.password&&""!==u.password?u.password:null,notes:null,name:u.label&&""!==u.label?u.label:u.domain};u.email&&""!==u.email&&(c.username&&""!==c.username?c.notes=u.email:c.username=u.email),c.name&&""!==c.name||(c.name="--"),a.push(c)}n(r,a,s)},l.onerror=function(e){o()}}function x(n,o,r){var a=[],s=[],i=[],l=new FileReader;l.readAsText(n,"utf-8"),l.onload=function(n){var r=$(n.target.result.split("&shy;").join("").split("<WBR>").join("")),l=r.find("table.nobr");if(l.length)for(var u=0;u<l.length;u++){var c=$(l[u]),d={favorite:!1,uri:null,username:null,password:null,notes:"",name:c.find("span.caption").text()},p=c.find(".subcaption").text();p&&""!==p&&(d.uri=t(p));var m=[];if($.each(c.find("table td:not(.subcaption)"),function(e,t){$(t).find("br").replaceWith("\n");var n=$(t).text();""!==n&&m.push(n.split("\\n").join("\n"))}),m.length&&m.length%2===0)for(var f=0;f<m.length;f+=2){var g=m[f],h=m[f+1];!d.password&&e(g.replace(":",""),M)?d.password=h:!d.username&&e(g.replace(":",""),U)?d.username=h:(""!==d.notes&&(d.notes=d.notes+"\n"),d.notes=d.notes+g+" "+h)}d.notes&&""!==d.notes||(d.notes=null),d.name&&""!==d.name||(d.name="--"),s.push(d)}o(a,s,i)},l.onerror=function(e){r()}}function E(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 s=[],i=[],l=[];Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e),angular.forEach(e.data,function(e,t){i.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(s,i,l)}})}function C(n,r,a){Papa.parse(n,{encoding:"UTF-8",complete:function(n){o(n);for(var a=[],s=[],i=[],l=0;l<n.data.length;l++){var u=n.data[l];if(!(u.length<2)){var c=u[u.length-1],d={name:u[0],favorite:!1,uri:null,password:null,username:null,notes:c&&""!==c?c:null};if(u.length>2&&u.length%2===0)for(var p=0;p<u.length-2;p+=2){var m=u[p+2],f=u[p+1];if(f&&""!==f&&m&&""!==m){f.toLowerCase();!d.uri&&e(f,I)?d.uri=t(m):!d.username&&e(f,U)?d.username=m:!d.password&&e(f,M)?d.password=m:(d.notes?d.notes+="\n":d.notes="",d.notes+=f+": "+m)}}s.push(d)}}r(a,s,i)}})}function F(e,n,o){var r=[],a=[],s=[],i=0,l=new FileReader;l.readAsText(e,"utf-8"),l.onload=function(e){var o=e.target.result,l=JSON.parse(o);if(l&&l.length)for(i=0;i<l.length;i++){var u=l[i],c={favorite:!1,uri:u.login_url&&""!==u.login_url?t(u.login_url):null,username:null,password:null,notes:"",name:u.name&&""!==u.name?u.name:"--"};if(u.identifiers){u.identifiers.notes&&""!==u.identifiers.notes&&(c.notes=u.identifiers.notes.split("\\r\\n").join("\n").split("\\n").join("\n"));for(var d in u.identifiers)if(u.identifiers.hasOwnProperty(d)){var p=u.identifiers[d];if("notes"===d||""===p||null===p)continue;"username"===d?c.username=p:"password"===d?c.password=p:(""!==c.notes&&(c.notes+="\n"),c.notes+=d+": "+p)}""===c.notes&&(c.notes=null),a.push(c)}}n(r,a,s)},l.onerror=function(e){o()}}function L(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(!(0>a)){var s=r.substring(0,a),i=r.length>a?r.substring(a+1):null;if(s&&""!==s&&i&&""!==i&&"SecretType"!==s){var l=s.toLowerCase();"user name"===l?t.username=i:"password"===l?t.password=i:(""!==t.notes&&(t.notes+="\n"),t.notes+=s+": "+i)}}}}Papa.parse(e,{header:!0,encoding:"UTF-8",complete:function(e){o(e);var r=[],s=[],i=[];angular.forEach(e.data,function(e,n){var o=e.ChamberName,l=r.length,u=s.length,c=o&&""!==o,d=c,p=0;if(c)for(p=0;p<r.length;p++)if(r[p].name===o){d=!1,l=p;break}var m={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,m),a(e.CustomData,m),""===m.notes&&(m.notes=null),e["Secret Name"]&&s.push(m),d&&r.push({name:o}),c){var f={key:u,value:l};i.push(f)}}),n(r,s,i)}})}function A(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=[],s=[],i=[],l=1;l<e.data.length;l++)if(!(e.data[l].length<3)){var u=e.data[l],c=u[e.data.length-1],d=u[e.data.length-2],p=u[0],m=a.length,f=s.length,g=c&&""!==c&&"Unfiled"!==c,h=g,v=0;if(g)for(v=0;v<a.length;v++)if(a[v].name===c){h=!1,m=v;break}var w={favorite:!1,uri:null,username:null,password:null,notes:d,name:u[1]&&""!==u[1]?u[1]:"--"};if("Web Logins"===p||"Servers"===p||"Email Accounts"===p?(w.uri=u[4]&&""!==u[4]?t(u[4]):null,w.username=u[2]&&""!==u[2]?u[2]:null,w.password=u[3]&&""!==u[3]?u[3]:null,r(5,u,w)):u.length>2&&r(2,u,w),w.name&&"--"!==w.name&&"Web Logins"!==p&&"Servers"!==p&&"Email Accounts"!==p&&(w.name=p+": "+w.name),""===w.notes&&(w.notes=null),s.push(w),h&&a.push({name:c}),g){var b={key:f,value:m};i.push(b)}}n(a,s,i)}})}var D={};D["import"]=function(e,t,n,o){if(!t)return void o();switch(e){case"bitwardencsv":r(t,n,o);break;case"lastpass":a(t,n,o);break;case"safeincloudxml":s(t,n,o);break;case"keepass2xml":l(t,n,o);break;case"keepassxcsv":u(t,n,o);break;case"padlockcsv":i(t,n,o);break;case"1password1pif":c(t,n,o);break;case"1password6wincsv":d(t,n,o);break;case"chromecsv":p(t,n,o);break;case"firefoxpasswordexportercsvxml":m(t,n,o);break;case"upmcsv":f(t,n,o);break;case"keepercsv":g(t,n,o);break;case"passworddragonxml":h(t,n,o);break;case"enpasscsv":v(t,n,o);break;case"pwsafexml":w(t,n,o);break;case"dashlanecsv":b(t,n,o);break;case"stickypasswordxml":y(t,n,o);break;case"msecurecsv":k(t,n,o);break;case"truekeyjson":S(t,n,o);break;case"clipperzhtml":P(t,n,o);break;case"avirajson":T(t,n,o);break;case"roboformhtml":x(t,n,o);break;case"saferpasscsv":E(t,n,o);break;case"ascendocsv":C(t,n,o);break;case"passwordbossjson":F(t,n,o);break;case"zohovaultcsv":L(t,n,o);break;case"splashidcsv":A(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"],U=["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"],I=["url","hyper link","hyperlink","link","host","hostname","host name","server","address","hyper ref","href","web","website","web site","site","web-site","ort","adresse"];return D}),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 s=Math.ceil(a/8),i=Math.pow(2,a)-1,l=new Uint8Array(s);window.crypto.getRandomValues(l);for(var u=8*(s-1),c=0;s>c;c++)o+=l[c]*Math.pow(2,u),u-=8;return o&=i,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 s=0;s<o.minLowercase;s++)a.push("l");if(o.uppercase&&o.minUppercase>0)for(var i=0;i<o.minUppercase;i++)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 u=0;u<o.minSpecial;u++)a.push("s");for(;a.length<o.length;)a.push("a");a.sort(function(){return 2*e(0,1)-1});var c="",d="abcdefghijkmnopqrstuvwxyz";o.ambiguous&&(d+="l"),o.lowercase&&(c+=d);var p="ABCDEFGHIJKLMNPQRSTUVWXYZ";o.ambiguous&&(p+="O"),o.uppercase&&(c+=p);var m="23456789";o.ambiguous&&(m+="01"),o.number&&(c+=m);var f="!@#$%^&*";o.special&&(c+=f);for(var g="",h=0;h<o.length;h++){var v;switch(a[h]){case"l":v=d;break;case"u":v=p;break;case"n":v=m;break;case"s":v=f;break;case"a":v=c}var w=e(0,v.length-1);g+=v.charAt(w)}return g},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?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?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){t=t||5;var o=n.tokenSecondsRemaining(e);return 60*t>o},n}]),angular.module("bit.services").factory("validationService",function(){var e={};return e.addErrors=function(t,n){var o=n.data,r="An unexpected error has occured.";if(t.$errors=[],!o||!angular.isObject(o))return void t.$errors.push(r);if(o&&o.ErrorModel&&(o=o.ErrorModel),!o.ValidationErrors)return void(o.Message?t.$errors.push(o.Message):t.$errors.push(r));for(var a in o.ValidationErrors)if(o.ValidationErrors.hasOwnProperty(a))for(var s=0;s<o.ValidationErrors[a].length;s++)e.addError(t,a,o.ValidationErrors[a][s])},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,s,i,l,u){u.eventTrack("settingsChangeEmailController",{category:"Modal"});var c,d,p;e.token=function(t){c=r.hashPassword(t.masterPassword);var o=t.newEmail.toLowerCase(),a={newEmail:o,masterPasswordHash:c};e.tokenPromise=n.accounts.emailToken(a,function(){p=r.makeKey(t.masterPassword,o),d=r.hashPassword(t.masterPassword,p),e.tokenSent=!0}).$promise},e.confirm=function(r){e.processing=!0;var m=[],f=n.logins.list({dirty:!1},function(e){var t=a.decryptLogins(e.Data);m=a.encryptLogins(t,p)}).$promise,g=[],h=n.folders.list({dirty:!1},function(e){var t=a.decryptFolders(e.Data);g=a.encryptFolders(t,p)}).$promise;i.all([f,h]).then(function(){var a={token:r.token,newEmail:r.newEmail.toLowerCase(),masterPasswordHash:c,newMasterPasswordHash:d,ciphers:m.concat(g)};e.confirmPromise=n.accounts.email(a,function(){o.dismiss("cancel"),u.eventTrack("Changed Email"),s.logOut(),t.go("frontend.login.info").then(function(){l.success("Please log back in.","Email Changed")})},function(){o.dismiss("cancel"),l.error("Something went wrong.","Oh No!")}).$promise})},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsChangePasswordController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","cipherService","validationService","$q","toastr","$analytics",function(e,t,n,o,r,a,s,i,l,u,c){c.eventTrack("settingsChangePasswordController",{category:"Modal"}),e.save=function(d,p){var m=!1;if(e.model.newMasterPassword.length<8&&(i.addError(p,"NewMasterPasswordHash","Master password must be at least 8 characters long.",!0),m=!0),e.model.newMasterPassword!==e.model.confirmNewMasterPassword&&(i.addError(p,"ConfirmNewMasterPasswordHash","New master password confirmation does not match.",!0),m=!0),!m){e.processing=!0;var f=a.getUserProfile(),g=r.makeKey(d.newMasterPassword,f.email.toLowerCase()),h=[],v=n.logins.list({dirty:!1},function(e){var t=s.decryptLogins(e.Data);h=s.encryptLogins(t,g)}).$promise,w=[],b=n.folders.list({dirty:!1},function(e){var t=s.decryptFolders(e.Data);w=s.encryptFolders(t,g)}).$promise;l.all([v,b]).then(function(){var s={masterPasswordHash:r.hashPassword(d.masterPassword),newMasterPasswordHash:r.hashPassword(d.newMasterPassword,g),ciphers:h.concat(w)};e.savePromise=n.accounts.putPassword(s,function(){o.dismiss("cancel"),a.logOut(),c.eventTrack("Changed Password"),t.go("frontend.login.info").then(function(){u.success("Please log back in.","Master Password Changed")})},function(){o.dismiss("cancel"),u.error("Something went wrong.","Oh No!")}).$promise})}},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsController",["$scope","$uibModal","apiService","toastr","authService",function(e,t,n,o,r){e.model={},n.accounts.getProfile({},function(t){e.model={name:t.Name,email:t.Email,masterPasswordHint:t.MasterPasswordHint,culture:t.Culture,twoFactorEnabled:t.TwoFactorEnabled}}),e.save=function(t){e.savePromise=n.accounts.putProfile({},t,function(e){r.setUserProfile(e),o.success("Account has been updated.","Success!")}).$promise},e.changePassword=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsChangePassword.html",controller:"settingsChangePasswordController"})},e.$on("settingsChangePassword",function(t,n){e.changePassword()}),e.changeEmail=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsChangeEmail.html",controller:"settingsChangeEmailController",size:"sm"})},e.$on("settingsChangeEmail",function(t,n){e.changeEmail()}),e.twoFactor=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsTwoFactor.html",controller:"settingsTwoFactorController"})},e.$on("settingsTwoFactor",function(t,n){e.twoFactor()}),e.sessions=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsSessions.html",controller:"settingsSessionsController"})},e.$on("settingsSessions",function(t,n){e.sessions()}),e.domains=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsDomains.html",controller:"settingsDomainsController"})},e.$on("settingsDomains",function(t,n){e.domains()}),e["delete"]=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsDelete.html",controller:"settingsDeleteController",size:"sm"})},e.$on("settingsDelete",function(t,n){e["delete"]()})}]),angular.module("bit.settings").controller("settingsDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,r,a,s,i){i.eventTrack("settingsDeleteController",{category:"Modal"}),e.submit=function(l){var u={masterPasswordHash:r.hashPassword(l.masterPassword)};e.submitPromise=n.accounts.postDelete(u,function(){o.dismiss("cancel"),a.logOut(),i.eventTrack("Deleted Account"),t.go("frontend.login.info").then(function(){s.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","$uibModalInstance","toastr","$analytics","$uibModal",function(e,t,n,o,r,a,s){a.eventTrack("settingsDomainsController",{category:"Modal"}),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.addEdit=function(t){var n=s.open({animation:!0,templateUrl:"app/settings/views/settingsAddEditEquivalentDomain.html",controller:"settingsAddEditEquivalentDomainController",size:"sm",resolve:{domainIndex:function(){return t},domains:function(){return null!==t?e.equivalentDomains[t]:null}}});n.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.save=function(){for(var t={ExcludedGlobalEquivalentDomains:[],EquivalentDomains:[]},o=0;o<e.globalEquivalentDomains.length;o++)e.globalEquivalentDomains[o].excluded&&t.ExcludedGlobalEquivalentDomains.push(e.globalEquivalentDomains[o].key);for(o=0;o<e.equivalentDomains.length;o++)t.EquivalentDomains.push(e.equivalentDomains[o].split(" ").join("").split(","));t.EquivalentDomains.length||(t.EquivalentDomains=null),t.ExcludedGlobalEquivalentDomains.length||(t.ExcludedGlobalEquivalentDomains=null),e.submitPromise=n.settings.putDomains(t,function(t){e.close(),r.success("Domains have been updated.","Success!")}).$promise},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsSessionsController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,r,a,s,i){i.eventTrack("settingsSessionsController",{category:"Modal"}),e.submit=function(l){var u={masterPasswordHash:r.hashPassword(l.masterPassword)};e.submitPromise=n.accounts.putSecurityStamp(u,function(){o.dismiss("cancel"),a.logOut(),i.eventTrack("Deauthorized Sessions"),t.go("frontend.login.info").then(function(){s.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,s,i){function l(e){return e?e.replace(/(.{4})/g,"$1 ").trim().toUpperCase():null}function u(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/"+d+":"+encodeURIComponent(p.email)+"%3Fsecret="+encodeURIComponent(n)+"%26issuer="+d}}i.eventTrack("settingsTwoFactorController",{category:"Modal"});var c,d="bitwarden",p=r.getUserProfile();e.account=p.email,e.enabled=function(){return p.extended&&p.extended.twoFactorEnabled},e.auth=function(n){c=o.hashPassword(n.masterPassword),e.authPromise=t.accounts.getTwoFactor({masterPasswordHash:c,provider:0},function(e){u(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:c};e.updatePromise=t.accounts.putTwoFactor({},r,function(t){t.TwoFactorEnabled?(i.eventTrack("Enabled Two-step Login"),s.success("Two-step login has been enabled."),p.extended&&(p.extended.twoFactorEnabled=!0),u(t),$("#token").blur(),n.token=null):(i.eventTrack("Disabled Two-step Login"),s.success("Two-step login has been disabled."),p.extended&&(p.extended.twoFactorEnabled=!1),e.close())}).$promise}},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.tools").controller("toolsAuditsController",["$scope","apiService","$uibModalInstance","toastr","$analytics",function(e,t,n,o,r){r.eventTrack("toolsAuditsController",{category:"Modal"}),e.close=function(){n.dismiss("cancel")}}]),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.$on("toolsImport",function(t,n){e["import"]()}),e["export"]=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsExport.html",controller:"toolsExportController",size:"sm"})},e.$on("toolsExport",function(t,n){e["export"]()}),e.audits=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsAudits.html",controller:"toolsAuditsController"})},e.$on("toolsAudits",function(t,n){e.audits()})}]),angular.module("bit.tools").controller("toolsExportController",["$scope","apiService","authService","$uibModalInstance","cryptoService","cipherService","$q","toastr","$analytics",function(e,t,n,o,r,a,s,i,l){function u(){var e=new Date,t=e.getFullYear()+""+c(e.getMonth()+1,2)+c(e.getDate(),2)+c(e.getHours(),2)+c(e.getMinutes(),2)+c(e.getSeconds(),2);return"bitwarden_export_"+t+".csv"}function c(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,t.logins.list({expand:["folder"]},function(t){try{for(var n=a.decryptLogins(t.Data),o=[],r=0;r<n.length;r++){var s={name:n[r].name,uri:n[r].uri,username:n[r].username,password:n[r].password,notes:n[r].notes,folder:n[r].folder?n[r].folder.name:null};o.push(s)}var c=Papa.unparse(o),d=new Blob([c]);if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveBlob(d,u());else{var p=window.document.createElement("a");p.href=window.URL.createObjectURL(d,{type:"text/plain"}),p.download=u(),document.body.appendChild(p),p.click(),document.body.removeChild(p)}l.eventTrack("Exported Data"),i.success("Your data has been exported. Check your browser's downloads folder.","Success!"),e.close()}catch(m){i.error("Something went wrong. Please try again.","Error!"),e.close()}},function(){i.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",function(e,t,n,o,r,a,s,i,l,u){function c(i,u,c){if(!i.length&&!u.length)return void p("Nothing was imported.");if(u.length){var m=Math.floor(u.length/2),f=u.length-1;if(d(u[0])&&d(u[m])&&d(u[f]))return void p("CSV data is not formatted correctly. Please check your import file and try again.")}n.ciphers["import"]({folders:a.encryptFolders(i,r.getKey()),logins:a.encryptLogins(u,r.getKey()),folderRelationships:c},function(){o.dismiss("cancel"),t.go("backend.vault").then(function(){l.eventTrack("Imported Data",{label:e.model.source}),s.success("Data has been successfully imported into your vault.","Import Success")})},p)}function d(e){return!(null!==e.name&&"--"!==e.name||null!==e.password&&""!==e.password)}function p(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 s.error(n.Message):void s.error(t);var r="";for(var a in n.ValidationErrors)if(n.ValidationErrors.hasOwnProperty(a))for(var i=0;i<n.ValidationErrors[a].length;i++)r+=a+": "+n.ValidationErrors[a][i]+" ";if(""!==r)return void s.error(r)}s.error("Something went wrong. Try again.","Oh No!")}l.eventTrack("toolsImportController",{category:"Modal"}),e.model={source:"bitwardencsv"},e.source={},e.options=[{id:"bitwardencsv",name:"bitwarden (csv)",instructions:u.trustAsHtml('Export using the web vault (vault.bitwarden.com). Log into the web vault and navigate to "Tools" > "Export".')},{id:"lastpass",name:"LastPass (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-lastpass/">https://help.bitwarden.com/getting-started/import-from-lastpass/</a>')},{id:"chromecsv",name:"Chrome (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-chrome/">https://help.bitwarden.com/getting-started/import-from-chrome/</a>')},{id:"firefoxpasswordexportercsvxml",name:"Firefox Password Exporter (xml)",instructions:u.trustAsHtml('Use the <a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/password-exporter/">Password Exporter</a> addon for FireFox to export your passwords to a XML file. After installing the addon, type <code>about:addons</code> in your FireFox navigation bar. Locate the Password Exporter addon and click the "Options" button. In the dialog that pops up, click the "Export Passwords" button to save the XML file.')},{id:"keepass2xml",name:"KeePass 2 (xml)",instructions:u.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:u.trustAsHtml('Using the KeePassX desktop application, navigate to "Database" > "Export to CSV file" and save the CSV file.')},{id:"dashlanecsv",name:"Dashlane (csv)",instructions:u.trustAsHtml('Using the Dashlane desktop application, navigate to "File" > "Export" > "Unsecured archive (readable) in CSV format" and save the CSV file.')},{id:"1password1pif",name:"1Password (1pif)",instructions:u.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-1password/">https://help.bitwarden.com/getting-started/import-from-1password/</a>')},{id:"1password6wincsv",name:"1Password 6 Windows (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at <a target="_blank" href="https://help.bitwarden.com/getting-started/import-from-1password/">https://help.bitwarden.com/getting-started/import-from-1password/</a>')},{id:"roboformhtml",
name:"RoboForm (html)",instructions:u.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:u.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:u.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:u.trustAsHtml('Using the SaveInCloud desktop application, navigate to "File" > "Export" > "As XML" and save the XML file.')},{id:"pwsafexml",name:"Password Safe (xml)",instructions:u.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:u.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:u.trustAsHtml('Using the mSecure desktop application, navigate to "File" > "Export" > "CSV File..." and save the CSV file.')},{id:"truekeyjson",name:"True Key (json)",instructions:u.trustAsHtml('Using the True Key desktop application, click the gear icon (top right) and then navigate to "App Settings". Click the "Export" button and save the JSON file.')},{id:"passwordbossjson",name:"Password Boss (json)",instructions:u.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:u.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:u.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:u.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:u.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:u.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:u.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:u.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:u.trustAsHtml('Using the Universal Password Manager desktop application, navigate to "Database" > "Export" and save the CSV file.')},{id:"ascendocsv",name:"Ascendo DataVault (csv)",instructions:u.trustAsHtml('Using the Ascendo DataVault desktop application, navigate to "Tools" > "Export". In the dialog that pops up, select the "All Items (DVX, CSV)" option. Click the "Ok" button to save the CSV file.')}],e.setSource=function(){for(var t=0;t<e.options.length;t++)if(e.options[t].id===e.model.source){e.source=e.options[t];break}},e.setSource(),e["import"]=function(t){e.processing=!0;var n=document.getElementById("file").files[0];i["import"](t.source,n,c,p)},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 s=r.encryptFolder(o);e.savePromise=t.folders.post(s,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","folders","selectedFolder","$analytics",function(e,t,n,o,r,a,s,i,l){function u(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultAddLoginController",{category:"Modal"}),e.folders=s,e.login={folderId:i?i.id:null},e.savePromise=null,e.save=function(o){var a=r.encryptLogin(o);e.savePromise=t.logins.post(a,function(e){l.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?")||(l.eventTrack("Generated Password From Add"),e.login.password=a.generatePassword({length:10,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),u(e)},e.clipboardError=function(e,t){t&&u(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.name.toLowerCase()},e.close=function(){n.dismiss("close")}}]),angular.module("bit.vault").controller("vaultController",["$scope","$uibModal","apiService","$filter","cryptoService","authService","toastr","cipherService",function(e,t,n,o,r,a,s,i){e.logins=[],e.folders=[],e.loadingLogins=!0,n.logins.list({},function(t){e.loadingLogins=!1;for(var n=[],o=0;o<t.Data.length;o++){var a={id:t.Data[o].Id,folderId:t.Data[o].FolderId,favorite:t.Data[o].Favorite};try{a.name=r.decrypt(t.Data[o].Name)}catch(s){a.name="[error: cannot decrypt]"}if(t.Data[o].Username)try{a.username=r.decrypt(t.Data[o].Username)}catch(s){a.username="[error: cannot decrypt]"}n.push(a)}e.logins=n},function(){e.loadingLogins=!1}),e.loadingFolders=!0,n.folders.list({},function(t){e.loadingFolders=!1;for(var n=[{id:null,name:"(none)"}],o=0;o<t.Data.length;o++){var a={id:t.Data[o].Id};try{a.name=r.decrypt(t.Data[o].Name)}catch(s){a.name="[error: cannot decrypt]"}n.push(a)}e.folders=n},function(){e.loadingFolders=!1}),e.folderSort=function(e){return e.id?e.name.toLowerCase():""},e.editLogin=function(n){var r=t.open({animation:!0,templateUrl:"app/vault/views/vaultEditLogin.html",controller:"vaultEditLoginController",resolve:{loginId:function(){return n.id},folders:function(){return e.folders}}});r.result.then(function(t){if("edit"===t.action){var n=o("filter")(e.logins,{id:t.data.id},!0);n&&n.length>0&&(n[0].folderId=t.data.folderId,n[0].name=t.data.name,n[0].username=t.data.username,n[0].favorite=t.data.favorite)}else if("delete"===t.action){var r=o("filter")(e.logins,{id:t.data},!0);if(r&&r.length>0){var a=e.logins.indexOf(r[0]);a>-1&&e.logins.splice(a,1)}}})},e.$on("vaultAddLogin",function(t,n){e.addLogin()}),e.addLogin=function(n){var o=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddLogin.html",controller:"vaultAddLoginController",resolve:{folders:function(){return e.folders},selectedFolder:function(){return n}}});o.result.then(function(t){e.logins.push(t)})},e.deleteLogin=function(t){confirm("Are you sure you want to delete this login ("+t.name+")?")&&n.logins.del({id:t.id},function(){var n=e.logins.indexOf(t);n>-1&&e.logins.splice(n,1)})},e.editFolder=function(n){var r=t.open({animation:!0,templateUrl:"app/vault/views/vaultEditFolder.html",controller:"vaultEditFolderController",size:"sm",resolve:{folderId:function(){return n.id}}});r.result.then(function(t){var n=o("filter")(e.folders,{id:t.id},!0);n&&n.length>0&&(n[0].name=t.name)})},e.$on("vaultAddFolder",function(t,n){e.addFolder()}),e.addFolder=function(){var n=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddFolder.html",controller:"vaultAddFolderController",size:"sm"});n.result.then(function(t){e.folders.push(t)})},e.deleteFolder=function(t){confirm("Are you sure you want to delete this folder ("+t.name+")?")&&n.folders.del({id:t.id},function(){var n=e.folders.indexOf(t);n>-1&&e.folders.splice(n,1)})},e.canDeleteFolder=function(t){if(!t||!t.id)return!1;var n=o("filter")(e.logins,{folderId:t.id});return 0===n.length}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,n,o,r,a,s){s.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 i=r.encryptFolder(o);e.savePromise=t.folders.put({id:a},i,function(e){s.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","folders","$analytics",function(e,t,n,o,r,a,s,i,l){function u(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultEditLoginController",{category:"Modal"}),e.folders=i,e.login={},t.logins.get({id:s},function(t){e.login=r.decryptLogin(t)}),e.save=function(o){var a=r.encryptLogin(o);e.savePromise=t.logins.put({id:s},a,function(e){l.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?")||(l.eventTrack("Generated Password From Edit"),e.login.password=a.generatePassword({length:10,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),u(e)},e.clipboardError=function(e,t){t&&u(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return 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(){n.close({action:"delete",data:e.login.id})})},e.close=function(){n.dismiss("cancel")}}]);