From 41c32f3874f9f0cb2c10bc464a75897a8a655f75 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 7 Sep 2017 23:26:56 -0400 Subject: [PATCH] auto-fill basic auth prompts --- src/background.js | 69 ++++++++++++++++++++++++++++++++- src/manifest.json | 4 +- src/services/autofillService.js | 9 ++--- src/services/loginService.js | 15 +++++++ 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/background.js b/src/background.js index 4f9ec73131a..f870ea88aab 100644 --- a/src/background.js +++ b/src/background.js @@ -2,7 +2,8 @@ var isBackground = true, loginToAutoFill = null, pageDetailsToAutoFill = [], autofillTimeout = null, - menuOptionsLoaded = []; + menuOptionsLoaded = [], + pendingAuthRequests = []; var bg_loginsToAdd = []; @@ -209,6 +210,72 @@ chrome.contextMenus.onClicked.addListener(function (info, tab) { } }); +chrome.webRequest.onAuthRequired.addListener(function (details, callback) { + if (!details.url || pendingAuthRequests.indexOf(details.requestId) != -1) { + if (callback) { + callback(); + } + return; + } + + var domain = bg_utilsService.getDomain(details.url); + if (!domain) { + if (callback) { + callback(); + } + return; + } + + pendingAuthRequests.push(details.requestId); + + if (bg_utilsService.isFirefox()) { + return new Promise(function (resolve, reject) { + bg_loginService.getAllDecryptedForDomain(domain).then(function (logins) { + if (!logins || logins.length !== 1) { + reject(); + return; + } + + resolve({ + authCredentials: { + username: logins[0].username, + password: logins[0].password + } + }); + }, function () { + reject(); + }); + }); + } + else { + bg_loginService.getAllDecryptedForDomain(domain).then(function (logins) { + if (!logins || logins.length !== 1) { + callback(); + return; + } + + callback({ + authCredentials: { + username: logins[0].username, + password: logins[0].password + } + }); + }, function () { + callback(); + }); + } +}, { urls: ['http://*/*'] }, [bg_utilsService.isFirefox() ? 'blocking' : 'asyncBlocking']); + +chrome.webRequest.onCompleted.addListener(completeAuthRequest, { urls: ['http://*/*'] }); +chrome.webRequest.onErrorOccurred.addListener(completeAuthRequest, { urls: ['http://*/*'] }); + +function completeAuthRequest(details) { + var i = pendingAuthRequests.indexOf(details.requestId); + if (i > -1) { + pendingAuthRequests.splice(i, 1); + } +} + var buildingContextMenu = false; function buildContextMenu(callback) { if (buildingContextMenu) { diff --git a/src/manifest.json b/src/manifest.json index de15ed13e17..12a8b49d57a 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -72,7 +72,9 @@ "clipboardWrite", "idle", "http://*/*", - "https://*/*" + "https://*/*", + "webRequest", + "webRequestBlocking" ], "commands": { "autofill_login": { diff --git a/src/services/autofillService.js b/src/services/autofillService.js index b6c1ed39dd0..d20e7f3389c 100644 --- a/src/services/autofillService.js +++ b/src/services/autofillService.js @@ -228,13 +228,12 @@ function initAutofill() { return; } - self.loginService.getAllDecryptedForDomain(tabDomain).then(function (logins) { - if (!logins.length) { + self.loginService.getLastUsedForDomain(tabDomain).then(function (login) { + if (!login) { return; } - - var sortedLogins = logins.sort(self.loginService.sortLoginsByLastUsed); - self.doAutoFill(sortedLogins[0], pageDetails, true, true, true); + + self.doAutoFill(login, pageDetails, true, true, true); }); }); }; diff --git a/src/services/loginService.js b/src/services/loginService.js index 07f2e6aaae3..a7a0ec33313 100644 --- a/src/services/loginService.js +++ b/src/services/loginService.js @@ -193,6 +193,21 @@ function initLoginService() { }); }; + LoginService.prototype.getLastUsedForDomain = function (domain) { + var self = this; + var deferred = Q.defer(); + self.getAllDecryptedForDomain(domain).then(function (logins) { + if (!logins.length) { + deferred.reject(); + return; + } + + var sortedLogins = logins.sort(self.sortLoginsByLastUsed); + deferred.resolve(sortedLogins[0]); + }); + return deferred.promise; + }; + LoginService.prototype.saveWithServer = function (login) { var deferred = Q.defer();