mirror of
https://github.com/bitwarden/web
synced 2025-12-10 21:33:16 +00:00
2 lines
42 KiB
JavaScript
2 lines
42 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",version:"1.2.1",environment:"Production",apiUri:"https://api.bitwarden.com"}),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,r){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(){r.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(){r.warning("Your login session has expired.","Logged out")})),t.reject(o)}}}]),angular.module("bit").config(["$stateProvider","$urlRouterProvider","$httpProvider","jwtInterceptorProvider","$uibTooltipProvider","toastrConfig",function(e,t,r,o,n,a){o.urlParam="access_token",o.tokenGetter=["config","appSettings","tokenService",function(e,t,r){return 0===e.url.indexOf(t.apiUri)?r.getToken():void 0}],angular.extend(a,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),n.options({popupDelay:600}),r.defaults.headers.post&&(r.defaults.headers.post={}),r.defaults.headers.post["Content-Type"]="text/plain; charset=utf-8",r.interceptors.push("apiInterceptor"),r.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.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,r,o,n){e.$on("$stateChangeStart",function(e,a,s){return a.data&&a.data.authorize?void(t.isAuthenticated()&&!r.isTokenExpired(o.getToken())||(e.preventDefault(),t.logOut(),n.go("frontend.login.info"))):void(t.isAuthenticated()&&!r.isTokenExpired(o.getToken())&&(e.preventDefault(),n.go("backend.vault")))})}]),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","appSettings","$analytics",function(e,t,r,o,n,a,s,i,l){var c=r.get(i.rememberedEmailCookieName);c&&(e.model={email:c,rememberEmail:!0}),e.login=function(t){e.loginPromise=a.logIn(t.email,t.masterPassword),e.loginPromise.then(function(){if(t.rememberEmail){var e=new Date;e.setFullYear(e.getFullYear()+10),r.put(i.rememberedEmailCookieName,t.email,{expires:e})}else r.remove(i.rememberedEmailCookieName);var o=a.getUserProfile();o.twoFactor?(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.logInTwoFactor(t.code,"Authenticator"),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,r,o){t.logOut(),o.eventTrack("Logged Out"),r.go("frontend.login.info")}]),angular.module("bit.accounts").controller("accountsPasswordHintController",["$scope","$rootScope","apiService",function(e,t,r){e.success=!1,e.submit=function(t){e.submitPromise=r.accounts.postPasswordHint({email:t.email},function(){e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRegisterController",["$scope","$location","apiService","cryptoService","validationService","$analytics",function(e,t,r,o,n,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&&(n.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),s=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(n.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),c={name:e.model.name,email:i,masterPasswordHash:o.hashPassword(e.model.masterPassword,l),masterPasswordHint:e.model.masterPasswordHint};e.registerPromise=r.accounts.register(c,function(){e.success=!0,a.eventTrack("Registered")}).$promise}}}]),angular.module("bit.directives").directive("apiField",function(){var e=function(e,t,r,o){function n(){return o.$setValidity("api",!0),!0}function a(){o.$setValidity("api",!1)}o.$registerApiError=a,o.$validators.apiValidate=n};return{require:"ngModel",restrict:"A",compile:function(t,r){if(!r.name||""===r.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 r(e,r,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),r.$broadcast("show-errors-check-validity")}))}return{require:"form",restrict:"A",link:function(e,t,o,n){var a=o.apiForm||null;void 0!==a&&e.$watch(a,r.bind(null,n,e))}}}]),angular.module("bit.directives").directive("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(r,o,n,a){var s=t.getUserProfile();s&&(a.$parsers.unshift(function(t){if(t){var r=e.makeKey(t,s.email,!0),o=r===e.getKey(!0);return a.$setValidity("masterPassword",o),o?t:void 0}}),a.$formatters.unshift(function(t){if(t){var r=e.makeKey(t,s.email,!0),o=r===e.getKey(!0);return a.$setValidity("masterPassword",o),t}}))}}}]),angular.module("bit.directives").directive("pageTitle",["$rootScope","$timeout","appSettings",function(e,t,r){return{link:function(r,o){var n=function(e,r,n,a,s){var i="bitwarden Password Manager";r.data&&r.data.pageTitle&&(i=r.data.pageTitle+" - bitwarden Password Manager"),t(function(){o.text(i)})};e.$on("$stateChangeStart",n)}}}]),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 r=t.length;return e&&""!==e&&(-1!==e.indexOf(t)&&(r-=15),-1!==t.indexOf(e)&&(r-=e.length)),t.length>0&&t.length<=4?r+=t.length:t.length>=5&&t.length<=7?r+=6:t.length>=8&&t.length<=15?r+=12:t.length>=16&&(r+=18),t.match(/[a-z]/)&&(r+=1),t.match(/[A-Z]/)&&(r+=5),t.match(/\d/)&&(r+=5),t.match(/.*\d.*\d.*\d/)&&(r+=5),t.match(/[!,@,#,$,%,^,&,*,?,_,~]/)&&(r+=5),t.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)&&(r+=5),t.match(/(?=.*[a-z])(?=.*[A-Z])/)&&(r+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)&&(r+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)&&(r+=2),r=Math.round(2*r),Math.max(0,Math.min(100,r))},r=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=r(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,r){var o=r.passwordViewer;o&&(t.onclick=function(e){},t.on("click",function(e){var r=$(o);r&&"password"===r.attr("type")?(t.removeClass("fa-eye").addClass("fa-eye-slash"),r.attr("type","text")):r&&"text"===r.attr("type")&&(t.removeClass("fa-eye-slash").addClass("fa-eye"),r.attr("type","password"))}))}}}),angular.module("bit.global").controller("mainController",["$scope","$state","authService","appSettings","toastr",function(e,t,r,o,n){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,n,s){return a.searchVaultText=null,a.userProfile=r.getUserProfile(),t.data.bodyClass?void(a.bodyClass=t.data.bodyClass):void(a.bodyClass="")}),e.searchVault=function(){t.go("backend.vault")},e.addSite=function(){e.$broadcast("vaultAddSite")},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["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",function(e,t,r){var o={},n=r.apiUri;return o.sites=e(n+"/sites/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:n+"/sites/:id/delete",method:"POST",params:{id:"@id"}}}),o.folders=e(n+"/folders/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:n+"/folders/:id/delete",method:"POST",params:{id:"@id"}}}),o.ciphers=e(n+"/ciphers/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},"import":{url:n+"/ciphers/import",method:"POST",params:{}},favorite:{url:n+"/ciphers/:id/favorite",method:"POST",params:{id:"@id"}},del:{url:n+"/ciphers/:id/delete",method:"POST",params:{id:"@id"}}}),o.accounts=e(n+"/accounts",{},{register:{url:n+"/accounts/register",method:"POST",params:{}},emailToken:{url:n+"/accounts/email-token",method:"POST",params:{}},email:{url:n+"/accounts/email",method:"POST",params:{}},putPassword:{url:n+"/accounts/password",method:"POST",params:{}},getProfile:{url:n+"/accounts/profile",method:"GET",params:{}},putProfile:{url:n+"/accounts/profile",method:"POST",params:{}},getTwoFactor:{url:n+"/accounts/two-factor",method:"GET",params:{}},putTwoFactor:{url:n+"/accounts/two-factor",method:"POST",params:{}},postPasswordHint:{url:n+"/accounts/password-hint",method:"POST",params:{}},putSecurityStamp:{url:n+"/accounts/security-stamp",method:"POST",params:{}},"import":{url:n+"/accounts/import",method:"POST",params:{}},postDelete:{url:n+"/accounts/delete",method:"POST",params:{}}}),o.auth=e(n+"/auth",{},{token:{url:n+"/auth/token",method:"POST",params:{}},tokenTwoFactor:{url:n+"/auth/token/two-factor",method:"POST",params:{}}}),o}]),angular.module("bit.services").factory("authService",["cryptoService","apiService","tokenService","$q","jwtHelper",function(e,t,r,o,n){function a(e){i.extended={name:e.Name,twoFactorEnabled:e.TwoFactorEnabled,culture:e.Culture}}var s={},i=null;return s.logIn=function(n,a){n=n.toLowerCase();var i=e.makeKey(a,n),l={email:n,masterPasswordHash:e.hashPassword(a,i)},c=o.defer();return t.auth.token(l,function(t){t&&t.Token&&(r.setToken(t.Token),e.setKey(i),s.setUserProfile(t.Profile),c.resolve(t))},function(e){c.reject(e)}),c.promise},s.logInTwoFactor=function(e,n){var a={code:e,provider:n},i=o.defer();return t.auth.tokenTwoFactor(a,function(e){e&&e.Token&&(r.setToken(e.Token),s.setUserProfile(e.Profile),i.resolve(e))},function(e){i.reject(e)}),i.promise},s.logOut=function(){r.clearToken(),e.clearKey(),i=null},s.getUserProfile=function(){return i||s.setUserProfile(),i},s.setUserProfile=function(e){var o=r.getToken();if(o){var s=n.decodeToken(o),l="TwoFactor"===s.authmethod;i={id:s.nameid,email:s.email,twoFactor:l},!l&&e?a(e):l||e||t.accounts.getProfile({},a)}},s.isAuthenticated=function(){return null!==s.getUserProfile()&&!s.getUserProfile().twoFactor},s.isTwoFactorAuthenticated=function(){return null!==s.getUserProfile()&&s.getUserProfile().twoFactor},s}]),angular.module("bit.services").factory("cipherService",["cryptoService","apiService",function(e,t){var r={};return r.decryptSites=function(e){if(!e)throw"encryptedSites is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(r.decryptSite(e[o]));return t},r.decryptSite=function(t){if(!t)throw"encryptedSite is undefined or null";var r={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&&(r.folder={name:e.decrypt(t.Folder.Name)}),r},r.decryptFolders=function(e){if(!e)throw"encryptedFolders is undefined or null";for(var t=[],o=0;o<e.length;o++)t.push(r.decryptFolder(e[o]));return t},r.decryptFolder=function(t){if(!t)throw"encryptedFolder is undefined or null";return{id:t.Id,type:0,name:e.decrypt(t.Name)}},r.encryptSites=function(e,t){if(!e)throw"unencryptedSites is undefined or null";for(var o=[],n=0;n<e.length;n++)o.push(r.encryptSite(e[n],t));return o},r.encryptSite=function(t,r){if(!t)throw"unencryptedSite 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,r):null,name:e.encrypt(t.name,r),username:t.username&&""!==t.username?e.encrypt(t.username,r):null,password:t.password&&""!==t.password?e.encrypt(t.password,r):null,notes:t.notes&&""!==t.notes?e.encrypt(t.notes,r):null}},r.encryptFolders=function(e,t){if(!e)throw"unencryptedFolders is undefined or null";for(var o=[],n=0;n<e.length;n++)o.push(r.encryptFolder(e[n],t));return o},r.encryptFolder=function(t,r){if(!t)throw"unencryptedFolder is undefined or null";return{id:t.id,type:0,name:e.encrypt(t.name,r)}},r}]),angular.module("bit.services").factory("cryptoService",["$sessionStorage",function(e){var t,r,o,n={};return sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity."](),n.setKey=function(r){t=r,e.key=sjcl.codec.base64.fromBits(r)},n.getKey=function(o){return o&&o===!0&&r?r:!o&&t?t:(e.key&&(t=sjcl.codec.base64.toBits(e.key)),o&&o===!0?r=sjcl.codec.base64.fromBits(t):t)},n.clearKey=function(){t=r=o=null,delete e.key},n.makeKey=function(e,t,r){var o=sjcl.misc.pbkdf2(e,t,5e3,256,null);return r&&r===!0?sjcl.codec.base64.fromBits(o):o},n.hashPassword=function(e,t){if(t||(t=n.getKey()),!e||!t)throw"Invalid parameters.";var r=sjcl.misc.pbkdf2(t,e,1,256,null);return sjcl.codec.base64.fromBits(r)},n.getAes=function(){return!o&&n.getKey()&&(o=new sjcl.cipher.aes(n.getKey())),o},n.encrypt=function(e,t){if(!n.getKey()&&!t)throw"Encryption key unavailable.";t||(t=n.getKey());var r={},o={mode:"cbc",iv:sjcl.random.randomWords(4,10)},a=sjcl.encrypt(t,e,o,r),s=a.match(/"ct":"([^"]*)"/)[1],i=sjcl.codec.base64.fromBits(r.iv);return i+"|"+s},n.decrypt=function(e){if(!n.getAes())throw"AES encryption unavailable.";var t=e.split("|");if(2!==t.length)return"";var r=sjcl.codec.base64.toBits(t[0]),o=sjcl.codec.base64.toBits(t[1]),a=sjcl.mode.cbc.decrypt(n.getAes(),o,r,null);return sjcl.codec.utf8String.fromBits(a)},n}]),angular.module("bit.services").factory("importService",function(){function e(e){return e.length>1e3?e.substring(0,1e3):e}function t(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(r,o,n){Papa.parse(r,{header:!0,encoding:"UTF-8",complete:function(r){t(r);var n=[],a=[],s=[];angular.forEach(r.data,function(t,r){var o=n.length,i=a.length,l=t.folder&&""!==t.folder,c=l;if(l)for(var u=0;u<n.length;u++)if(n[u].name===t.folder){c=!1,o=u;break}if(a.push({favorite:null!==t.favorite?t.favorite:!1,uri:t.uri&&""!==t.uri?e(t.uri):null,username:t.username&&""!==t.username?t.username:null,password:t.password&&""!==t.password?t.password:null,notes:t.notes&&""!==t.notes?t.notes:null,name:t.name&&""!==t.name?t.name:"--"}),c&&n.push({name:t.folder}),l){var d={key:i,value:o};s.push(d)}}),o(n,a,s)}})}function o(r,o,n){function a(t){var r=[],n=[],a=[];angular.forEach(t,function(t,o){var s=r.length,i=n.length,l=t.grouping&&""!==t.grouping&&"(none)"!==t.grouping,c=l;if(l)for(var u=0;u<r.length;u++)if(r[u].name===t.grouping){c=!1,s=u;break}if(n.push({favorite:"1"===t.fav,uri:t.url&&""!==t.url?e(t.url):null,username:t.username&&""!==t.username?t.username:null,password:t.password&&""!==t.password?t.password:null,notes:t.extra&&""!==t.extra?t.extra:null,name:t.name&&""!==t.name?t.name:"--"}),c&&r.push({name:t.grouping}),l){var d={key:i,value:s};a.push(d)}}),o(r,n,a)}if("text/html"===r.type){var s=new FileReader;s.readAsText(r,"utf-8"),s.onload=function(e){var t,r,o=$(e.target.result),s=o.find("pre");if(1===s.length)t=s.text().trim(),r=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(r.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(),r=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(r.data);break}i||n()}},s.onerror=function(e){n()}}else Papa.parse(r,{header:!0,encoding:"UTF-8",complete:function(e){t(e),a(e.data)}})}function n(r,o,n){Papa.parse(r,{header:!0,encoding:"UTF-8",complete:function(r){t(r);var n=[],a=[],s=[];angular.forEach(r.data,function(t,r){a.push({favorite:!1,uri:t.URL&&""!==t.URL?e(t.URL):null,username:t.Login&&""!==t.Login?t.Login:null,password:t.Password&&""!==t.Password?t.Password:null,notes:t.Notes&&""!==t.Notes?t.Notes:null,name:t.Title&&""!==t.Title?t.Title:"--"})}),o(n,a,s)}})}function a(t,r,o){var n=[],a=[],s=[],i=[],l=0,c=0,u=new FileReader;u.readAsText(t,"utf-8"),u.onload=function(t){var u=$.parseXML(t.target.result),d=$(u),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")]=n.length,n.push({name:f.attr("name")})}var g=p.find("> card");if(g.length)for(l=0;l<g.length;l++){var v=$(g[l]);if("true"!==v.attr("template")){var h={favorite:!1,uri:null,username:null,password:null,notes:null,name:v.attr("title")},w=v.find("> field");for(c=0;c<w.length;c++){var b=$(w[c]),y=b.text(),S=b.attr("type");y&&""!==y&&("login"===S?h.username=y:"password"===S?h.password=y:"notes"===S?h.notes=y:"website"===S&&(h.uri=e(y)))}if(a.push(h),m=v.find("> label_id"),m.length){var P=$(m[0]).text(),T=i[P];null!==P&&""!==P&&null!==T&&s.push({key:a.length-1,value:T})}}}r(n,a,s)}else o()},u.onerror=function(e){o()}}function s(r,o,n){Papa.parse(r,{encoding:"UTF-8",complete:function(r){t(r);var n=[],a=[],s=[],i=[],l=0,c=0;for(l=0;l<r.data.length;l++){var u=r.data[l];if(0!==l){var d=n.length,p=a.length,m=u[1]&&""!==u[1],f=m;if(m)for(c=0;c<n.length;c++)if(n[c].name===u[1]){f=!1,d=c;break}var g={favorite:!1,uri:null,username:u[2]&&""!==u[2]?u[2]:null,password:u[3]&&""!==u[3]?u[3]:null,notes:null,name:u[0]&&""!==u[0]?u[0]:"--"};if(i.length)for(c=4;c<u.length;c++){var v=u[c];if(v&&""!==v){var h=i[c-4];"url"===h.toLowerCase()||"uri"===h.toLowerCase()?g.uri=e(v):(null===g.notes&&(g.notes=""),g.notes+=h+": "+v+"\n")}}a.push(g),f&&n.push({name:u[1]}),m&&s.push({key:p,value:d})}else for(c=4;c<u.length;c++)i.push(u[c])}o(n,a,s)}})}function i(t,r,o){function n(t,r,o){var l=a.length,c=o;r||(""!==c&&(c+=" > "),c+=t.find("> Name").text(),a.push({name:c}));var u=t.find("> Entry");if(u.length)for(var d=0;d<u.length;d++){for(var p=$(u[d]),m=s.length,f={favorite:!1,uri:null,username:null,password:null,notes:null,name:null},g=p.find("> String"),v=0;v<g.length;v++){var h=$(g[v]),w=h.find("> Key").text(),b=h.find("> Value").text();if(""!==b)switch(w){case"URL":f.uri=e(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),r||i.push({key:m,value:l})}var y=t.find("> Group");if(y.length)for(var S=0;S<y.length;S++)n($(y[S]),!1,c)}var a=[],s=[],i=[],l=new FileReader;l.readAsText(t,"utf-8"),l.onload=function(e){var t=$.parseXML(e.target.result),l=$(t),c=l.find("Root");if(c.length){var u=c.find("> Group");u.length&&(n($(u[0]),!0,""),r(a,s,i))}else o()},l.onerror=function(e){o()}}function l(t,r,o){var n=[],a=[],s=[],i=0,l=0,c=new FileReader;c.readAsText(t,"utf-8"),c.onload=function(t){var o=t.target.result,c=o.split(/(?:\r\n|\r|\n)\*\*\*.*?\*\*\*(?:\r\n|\r|\n)/),u="["+c.join(",")+"]",d=JSON.parse(u);for(i=0;i<d.length;i++){var p=d[i];if("webforms.WebForm"===p.typeName){var m={favorite:!(!p.openContents||!p.openContents.faveIndex),uri:p.location&&""!==p.location?e(p.location):null,username:null,password:null,notes:null,name:p.title&&""!==p.title?p.title:"--"};if(p.secureContents&&(p.secureContents.notesPlain&&(m.notes=p.secureContents.notesPlain),p.secureContents.fields))for(l=0;l<p.secureContents.fields.length;l++){var f=p.secureContents.fields[l];"username"===f.designation?m.username=f.value:"password"===f.designation?m.password=f.value:(null===m.notes?m.notes="":m.notes+="\n",m.notes+=f.name+": "+f.value+"\n")}a.push(m)}}r(n,a,s)},c.onerror=function(e){o()}}var c={};return c["import"]=function(e,t,c,u){if(!t)return void u();switch(e){case"local":r(t,c,u);break;case"lastpass":o(t,c,u);break;case"safeincloudcsv":n(t,c,u);break;case"safeincloudxml":a(t,c,u);break;case"keypassxml":i(t,c,u);break;case"padlockcsv":s(t,c,u);break;case"1password1pif":l(t,c,u);break;default:u()}},c}),angular.module("bit.services").factory("passwordService",function(){function e(t,r){var o=0,n=r-t,a=Math.ceil(Math.log2(n));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 c=8*(s-1),u=0;s>u;u++)o+=l[u]*Math.pow(2,c),c-=8;return o&=i,o>=n?e(t,r):t+o}var t={};return t.generatePassword=function(t){var r={length:10,ambiguous:!1,number:!0,minNumber:1,uppercase:!0,minUppercase:1,lowercase:!0,minLowercase:1,special:!1,minSpecial:1},o=angular.extend({},r,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 n=o.minUppercase+o.minLowercase+o.minNumber+o.minSpecial;o.length<n&&(o.length=n);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 c=0;c<o.minSpecial;c++)a.push("s");for(;a.length<o.length;)a.push("a");a.sort(function(){return 2*e(0,1)-1});var u="",d="abcdefghijkmnopqrstuvwxyz";o.ambiguous&&(d+="l"),o.lowercase&&(u+=d);var p="ABCDEFGHIJKLMNPQRSTUVWXYZ";o.ambiguous&&(p+="O"),o.uppercase&&(u+=p);var m="23456789";o.ambiguous&&(m+="01"),o.number&&(u+=m);var f="!@#$%^&*";o.special&&(u+=f);for(var g="",v=0;v<o.length;v++){var h;switch(a[v]){case"l":h=d;break;case"u":h=p;break;case"n":h=m;break;case"s":h=f;break;case"a":h=u}var w=e(0,h.length-1);g+=h.charAt(w)}return g},t}),angular.module("bit.services").factory("tokenService",["$sessionStorage",function(e){var t,r={};return r.setToken=function(r){e.authBearer=r,t=r},r.getToken=function(){return t||(t=e.authBearer),t},r.clearToken=function(){t=null,delete e.authBearer},r}]),angular.module("bit.services").factory("validationService",function(){var e={};return e.addErrors=function(t,r){var o=r.data,n="An unexpected error has occured.";if(t.$errors=[],!o||!angular.isObject(o))return void t.$errors.push(n);if(!o.ValidationErrors)return void(o.Message?t.$errors.push(o.Message):t.$errors.push(n));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,r,o){!o&&e.$errors||(e.$errors=[]);for(var n=!0,a=0;a<e.$errors.length;a++)if(e.$errors[a]===r){n=!1;break}n&&e.$errors.push(r),t&&""!==t&&e[t]&&e[t].$registerApiError&&e[t].$registerApiError()},e}),angular.module("bit.settings").controller("settingsChangeEmailController",["$scope","$state","apiService","$uibModalInstance","cryptoService","cipherService","authService","$q","toastr","$analytics",function(e,t,r,o,n,a,s,i,l,c){c.eventTrack("settingsChangeEmailController",{category:"Modal"});var u,d,p;e.token=function(t){u=n.hashPassword(t.masterPassword);var o=t.newEmail.toLowerCase(),a={newEmail:o,masterPasswordHash:u};e.tokenPromise=r.accounts.emailToken(a,function(){p=n.makeKey(t.masterPassword,o),d=n.hashPassword(t.masterPassword,p),e.tokenSent=!0}).$promise},e.confirm=function(n){e.processing=!0;var m=[],f=r.sites.list({dirty:!1},function(e){var t=a.decryptSites(e.Data);m=a.encryptSites(t,p)}).$promise,g=[],v=r.folders.list({dirty:!1},function(e){var t=a.decryptFolders(e.Data);g=a.encryptFolders(t,p)}).$promise;i.all([f,v]).then(function(){var a={token:n.token,newEmail:n.newEmail.toLowerCase(),masterPasswordHash:u,newMasterPasswordHash:d,ciphers:m.concat(g)};e.confirmPromise=r.accounts.email(a,function(){o.dismiss("cancel"),c.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,r,o,n,a,s,i,l,c,u){u.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=n.makeKey(d.newMasterPassword,f.email.toLowerCase()),v=[],h=r.sites.list({dirty:!1},function(e){var t=s.decryptSites(e.Data);v=s.encryptSites(t,g)}).$promise,w=[],b=r.folders.list({dirty:!1},function(e){var t=s.decryptFolders(e.Data);w=s.encryptFolders(t,g)}).$promise;l.all([h,b]).then(function(){var s={masterPasswordHash:n.hashPassword(d.masterPassword),newMasterPasswordHash:n.hashPassword(d.newMasterPassword,g),ciphers:v.concat(w)};e.savePromise=r.accounts.putPassword(s,function(){o.dismiss("cancel"),a.logOut(),u.eventTrack("Changed Password"),t.go("frontend.login.info").then(function(){c.success("Please log back in.","Master Password Changed")})},function(){o.dismiss("cancel"),c.error("Something went wrong.","Oh No!")}).$promise})}},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsController",["$scope","$uibModal","apiService","toastr","authService",function(e,t,r,o,n){e.model={},r.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=r.accounts.putProfile({},t,function(e){n.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,r){e.changePassword()}),e.changeEmail=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsChangeEmail.html",controller:"settingsChangeEmailController",size:"sm"})},e.$on("settingsChangeEmail",function(t,r){e.changeEmail()}),e.twoFactor=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsTwoFactor.html",controller:"settingsTwoFactorController"})},e.$on("settingsTwoFactor",function(t,r){e.twoFactor()}),e.sessions=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsSessions.html",controller:"settingsSessionsController"})},e.$on("settingsSessions",function(t,r){e.sessions()}),e["delete"]=function(){t.open({animation:!0,templateUrl:"app/settings/views/settingsDelete.html",controller:"settingsDeleteController",size:"sm"})},e.$on("settingsDelete",function(t,r){e["delete"]()})}]),angular.module("bit.settings").controller("settingsDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,r,o,n,a,s,i){i.eventTrack("settingsDeleteController",{category:"Modal"}),e.submit=function(l){var c={masterPasswordHash:n.hashPassword(l.masterPassword)};e.submitPromise=r.accounts.postDelete(c,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("settingsSessionsController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,r,o,n,a,s,i){i.eventTrack("settingsSessionsController",{category:"Modal"}),e.submit=function(l){var c={masterPasswordHash:n.hashPassword(l.masterPassword)};e.submitPromise=r.accounts.putSecurityStamp(c,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,r,o,n,a,s,i){i.eventTrack("settingsTwoFactorController",{category:"Modal"});var l,c="bitwarden",u=n.getUserProfile();e.account=u.email,e.enabled=function(){return u.extended&&u.extended.twoFactorEnabled},e.auth=function(r){l=o.hashPassword(r.masterPassword),e.authPromise=t.accounts.getTwoFactor({masterPasswordHash:l,provider:0},function(t){var r=t.AuthenticatorKey;e.twoFactorModel={enabled:t.TwoFactorEnabled,key:r.replace(/(.{4})/g,"$1 ").trim(),qr:"https://chart.googleapis.com/chart?chs=120x120&chld=L|0&cht=qr&chl=otpauth://totp/"+c+":"+encodeURIComponent(u.email)+"%3Fsecret="+encodeURIComponent(r)+"%26issuer="+c}}).$promise},e.update=function(r){var o=e.twoFactorModel.enabled;if(!o||confirm("Are you sure you want to disable two-step login?")){var n={enabled:!o,token:r?r.token:null,masterPasswordHash:l};e.updatePromise=t.accounts.putTwoFactor({},n,function(t){t.TwoFactorEnabled?(i.eventTrack("Enabled Two-step Login"),s.success("Two-step login has been enabled."),u.extended&&(u.extended.twoFactorEnabled=!0)):(i.eventTrack("Disabled Two-step Login"),s.success("Two-step login has been disabled."),u.extended&&(u.extended.twoFactorEnabled=!1)),e.close()}).$promise}},e.close=function(){r.dismiss("cancel")}}]),angular.module("bit.tools").controller("toolsAuditsController",["$scope","apiService","$uibModalInstance","toastr","$analytics",function(e,t,r,o,n){n.eventTrack("toolsAuditsController",{category:"Modal"}),e.close=function(){r.dismiss("cancel")}}]),angular.module("bit.tools").controller("toolsController",["$scope","$uibModal","apiService","toastr","authService",function(e,t,r,o,n){e["import"]=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsImport.html",controller:"toolsImportController",size:"sm"})},e.$on("toolsImport",function(t,r){e["import"]()}),e["export"]=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsExport.html",controller:"toolsExportController",size:"sm"})},e.$on("toolsExport",function(t,r){e["export"]()}),e.audits=function(){t.open({animation:!0,templateUrl:"app/tools/views/toolsAudits.html",controller:"toolsAuditsController"})},e.$on("toolsAudits",function(t,r){e.audits()})}]),angular.module("bit.tools").controller("toolsExportController",["$scope","apiService","authService","$uibModalInstance","cryptoService","cipherService","$q","toastr","$analytics",function(e,t,r,o,n,a,s,i,l){function c(){var e=new Date,t=e.getFullYear()+""+u(e.getMonth()+1,2)+u(e.getDate(),2)+u(e.getHours(),2)+u(e.getMinutes(),2)+u(e.getSeconds(),2);return"bitwarden_export_"+t+".csv"}function u(e,t,r){return r=r||"0",e+="",e.length>=t?e:new Array(t-e.length+1).join(r)+e}l.eventTrack("toolsExportController",{category:"Modal"}),e["export"]=function(r){e.startedExport=!0,t.sites.list({expand:["folder"]},function(t){try{for(var r=a.decryptSites(t.Data),o=[],n=0;n<r.length;n++){var s={name:r[n].name,uri:r[n].uri,username:r[n].username,password:r[n].password,notes:r[n].notes,folder:r[n].folder?r[n].folder.name:null};o.push(s)}var u=Papa.unparse(o),d=new Blob([u]);if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveBlob(d,c());else{var p=window.document.createElement("a");p.href=window.URL.createObjectURL(d,{type:"text/plain"}),p.download=c(),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",function(e,t,r,o,n,a,s,i,l){function c(i,c,d){return folder.length||c.length?void r.ciphers["import"]({folders:a.encryptFolders(i,n.getKey()),sites:a.encryptSites(c,n.getKey()),folderRelationships:d},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")})},u):void s.error("Nothing was imported.")}function u(t){l.eventTrack("Import Data Failed",{label:e.model.source}),o.dismiss("cancel"),t?s.error(t):s.error("Something went wrong. Try again.","Oh No!")}l.eventTrack("toolsImportController",{category:"Modal"}),e.model={source:"local"},e["import"]=function(t){e.processing=!0;var r=document.getElementById("file").files[0];i["import"](t.source,r,c,u)},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultAddFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","$analytics",function(e,t,r,o,n,a){a.eventTrack("vaultAddFolderController",{category:"Modal"}),e.savePromise=null,e.save=function(o){var s=n.encryptFolder(o);e.savePromise=t.folders.post(s,function(e){a.eventTrack("Created Folder");var t=n.decryptFolder(e);r.close(t)}).$promise},e.close=function(){r.dismiss("close")}}]),angular.module("bit.vault").controller("vaultAddSiteController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","folders","selectedFolder","$analytics",function(e,t,r,o,n,a,s,i,l){function c(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultAddSiteController",{category:"Modal"}),e.folders=s,e.site={folderId:i?i.id:null},e.savePromise=null,e.save=function(o){var a=n.encryptSite(o);e.savePromise=t.sites.post(a,function(e){l.eventTrack("Created Site");var t=n.decryptSite(e);r.close(t)}).$promise},e.generatePassword=function(){e.site.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Add"),e.site.password=a.generatePassword({length:10,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),c(e)},e.clipboardError=function(e,t){t&&c(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.close=function(){r.dismiss("close")}}]),angular.module("bit.vault").controller("vaultController",["$scope","$uibModal","apiService","$filter","cryptoService","authService","toastr","cipherService",function(e,t,r,o,n,a,s,i){e.sites=[],e.folders=[],e.loadingSites=!0,r.sites.list({},function(t){e.loadingSites=!1;for(var r=[],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=n.decrypt(t.Data[o].Name)}catch(s){a.name="[error: cannot decrypt]"}if(t.Data[o].Username)try{a.username=n.decrypt(t.Data[o].Username)}catch(s){a.username="[error: cannot decrypt]"}r.push(a)}e.sites=r},function(){e.loadingSites=!1}),e.loadingFolders=!0,r.folders.list({},function(t){e.loadingFolders=!1;for(var r=[{id:null,name:"(none)"}],o=0;o<t.Data.length;o++){var a={id:t.Data[o].Id};try{a.name=n.decrypt(t.Data[o].Name)}catch(s){a.name="[error: cannot decrypt]"}r.push(a)}e.folders=r},function(){e.loadingFolders=!1}),e.folderSort=function(e){return e.id?e.name.toLowerCase():""},e.editSite=function(r){var n=t.open({animation:!0,templateUrl:"app/vault/views/vaultEditSite.html",controller:"vaultEditSiteController",resolve:{siteId:function(){return r.id},folders:function(){return e.folders}}});n.result.then(function(t){var r=o("filter")(e.sites,{id:t.id},!0);r&&r.length>0&&(r[0].folderId=t.folderId,r[0].name=t.name,r[0].username=t.username,r[0].favorite=t.favorite)})},e.$on("vaultAddSite",function(t,r){e.addSite()}),e.addSite=function(r){var o=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddSite.html",controller:"vaultAddSiteController",resolve:{folders:function(){return e.folders},selectedFolder:function(){return r}}});o.result.then(function(t){e.sites.push(t)})},e.deleteSite=function(t){confirm("Are you sure you want to delete this site ("+t.name+")?")&&r.sites.del({id:t.id},function(){var r=e.sites.indexOf(t);e.sites.splice(r,1)})},e.editFolder=function(r){var n=t.open({animation:!0,templateUrl:"app/vault/views/vaultEditFolder.html",controller:"vaultEditFolderController",size:"sm",resolve:{folderId:function(){return r.id}}});n.result.then(function(t){var r=o("filter")(e.folders,{id:t.id},!0);r&&r.length>0&&(r[0].name=t.name)})},e.$on("vaultAddFolder",function(t,r){e.addFolder()}),e.addFolder=function(){var r=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddFolder.html",controller:"vaultAddFolderController",size:"sm"});r.result.then(function(t){e.folders.push(t)})},e.deleteFolder=function(t){confirm("Are you sure you want to delete this folder ("+t.name+")?")&&r.folders.del({id:t.id},function(){var r=e.folders.indexOf(t);e.folders.splice(r,1)})},e.canDeleteFolder=function(t){if(!t||!t.id)return!1;var r=o("filter")(e.sites,{folderId:t.id});return 0===r.length}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,r,o,n,a,s){s.eventTrack("vaultEditFolderController",{category:"Modal"}),e.folder={},t.folders.get({id:a},function(t){e.folder=n.decryptFolder(t)}),e.savePromise=null,e.save=function(o){var i=n.encryptFolder(o);e.savePromise=t.folders.put({id:a},i,function(e){s.eventTrack("Edited Folder");var t=n.decryptFolder(e);r.close(t)}).$promise},e.close=function(){r.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultEditSiteController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","siteId","folders","$analytics",function(e,t,r,o,n,a,s,i,l){function c(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultEditSiteController",{category:"Modal"}),e.folders=i,e.site={},t.sites.get({id:s},function(t){e.site=n.decryptSite(t)}),e.save=function(o){var a=n.encryptSite(o);e.savePromise=t.sites.put({id:s},a,function(e){l.eventTrack("Edited Site");var t=n.decryptSite(e);r.close(t)}).$promise},e.generatePassword=function(){e.site.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Edit"),e.site.password=a.generatePassword({length:10,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),c(e)},e.clipboardError=function(e,t){t&&c(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.close=function(){r.dismiss("cancel")}}]); |