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:"https://api.bitwarden.com",version:"1.8.1",environment:"Production"}),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:'
',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.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=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 label");if(m.length)for(l=0;l card");if(g.length)for(l=0;l field");for(u=0;u 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 "),u+=e.find("> Name").text(),a.push({name:u}));var c=e.find("> Entry");if(c.length)for(var d=0;d String"),h=0;h 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 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=6){var o=r.length,i=a.length,l=e[0]&&""!==e[0],u=l,c=0;if(l)for(c=0;c6)for(null===d.notes?d.notes="":d.notes+="\n",c=6;c record");if(d.length)for(var p=0;p 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=i;i++)M+="> Attribute-"+i,10>i&&(M+=", ");var U=m.find(M);if(U.length)for(i=0;i2&&l.length%2===0)for(var d=0;d entry");if(p.length)for(var m=0;m 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 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 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=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;c3)for(var p=3;p").join("")),l=r.find("table.nobr");if(l.length)for(var u=0;u2&&u.length%2===0)for(var p=0;pa)){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;p2&&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"truekeycsv":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.length0)for(var s=0;s0)for(var i=0;i0)for(var l=0;l0)for(var u=0;uo},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=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 "Export".')},{id:"lastpass",name:"LastPass (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/getting-started/import-from-lastpass/')},{id:"chromecsv",name:"Chrome (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/getting-started/import-from-chrome/')},{id:"firefoxpasswordexportercsvxml",name:"Firefox Password Exporter (xml)",instructions:u.trustAsHtml('Use the Password Exporter addon for FireFox to export your passwords to a XML file. After installing the addon, type about:addons 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 https://help.bitwarden.com/getting-started/import-from-1password/')},{id:"1password6wincsv",name:"1Password 6 Windows (csv)",instructions:u.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/getting-started/import-from-1password/')},{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:"truekeycsv",name:"True Key (csv)",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, enter your password and save the CSV 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 zoho_export.csv.')},{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 padlock_export.csv.')},{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;t0&&(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")}}]);