From 2b6838c6e511eeb77e629f38ecfa8bcb2f99cf47 Mon Sep 17 00:00:00 2001 From: Michael Nowak Date: Thu, 30 Oct 2014 22:42:58 +0100 Subject: [PATCH] third useable alpha version * adds new feature: adds filled-in credentials if none exist * updates version Info.plist and Update.plist * removes unused start.js --- Info.plist | 4 +- Update.plist | 6 +-- end.js | 37 ++++++++++++-- global.js | 134 +++++++++++++++++++++++++++++++++++++++++---------- start.js | 5 -- 5 files changed, 148 insertions(+), 38 deletions(-) delete mode 100644 start.js diff --git a/Info.plist b/Info.plist index b2ce805..6e9aeb0 100644 --- a/Info.plist +++ b/Info.plist @@ -13,9 +13,9 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleShortVersionString - 1.0.alpha2 + 1.0.alpha3 CFBundleVersion - 0.8.2 + 0.8.3 Chrome Global Page diff --git a/Update.plist b/Update.plist index dd9815d..1a20058 100644 --- a/Update.plist +++ b/Update.plist @@ -10,11 +10,11 @@ Developer Identifier 897X8SYVFR CFBundleVersion - 1.0.alpha2 + 1.0.alpha3 CFBundleShortVersionString - 0.8.2 + 0.8.3 URL - https://github.com/mmichaa/passafari.safariextension/releases/download/v1.0.alpha2/passafari-v1.0.alpha2.safariextz + https://github.com/mmichaa/passafari.safariextension/releases/download/v1.0.alpha3/passafari-v1.0.alpha3.safariextz diff --git a/end.js b/end.js index 62aa712..3f368ce 100644 --- a/end.js +++ b/end.js @@ -8,11 +8,21 @@ function passafari_injected_message_handler(event) { if(name === "passafari_credentials") { passafari_injected_credentials_handler(name, data); + } else if(name === "passafari_retrieve") { + passafari_injected_retrieve_handler(name, data); + } else { + console.log(data); } return undefined; } +if(window.parent === window) { + console.log('passafari: window.top'); + safari.self.addEventListener("message", passafari_injected_message_handler, false); +} + +// CALLED by passafari_injected_message_handler function passafari_injected_credentials_handler(event_name, event_data) { if(event_data.length === 1) { var credentials = event_data[0]; @@ -35,11 +45,32 @@ function passafari_injected_credentials_handler(event_name, event_data) { return undefined; } -if(window.parent === window) { - console.log('passafari: window.top'); - safari.self.addEventListener("message", passafari_injected_message_handler, false); +// CALLED by passafari_injected_message_handler +function passafari_injected_retrieve_handler(event_name, event_data) { + var input_candidates = passafari_input_candidates(); + + if(input_candidates.length === 1) { + var inputs = input_candidates[0]; + + var username = inputs.username.value; + var password = inputs.password.value; + + passafari_notify_global_page("passafari_save", {"Login": username, "Password": password}); + } else { + console.log("passafari_injected_retrieve_handler: more than one inputs found.") + console.log(inputs); + } + + return undefined; +} + +// UTILS end.js related +function passafari_notify_global_page(msg_name, msg_data) { + safari.self.tab.dispatchMessage(msg_name, msg_data); + return undefined; } +// UTILS end.js related function passafari_input_candidates() { var candidates = []; diff --git a/global.js b/global.js index 52d6b6b..f07510b 100644 --- a/global.js +++ b/global.js @@ -4,6 +4,8 @@ function passafari_command_handler(event) { passafari_open(event); } else if (event.command === "passafari_select_credentials") { passafari_select_credentials(event); + } else if (event.command === "passafari_select_save") { + passafari_select_save(event); } else { console.log(event); } @@ -12,24 +14,28 @@ function passafari_command_handler(event) { function passafari_message_handler(event) { console.log("passafari_message_handler: " + event.name); - if (event.name == "passafari_associate") { - passafari_associate(event); + if (event.name == "passafari_save") { + passafari_save(event); } else { console.log(event); } return undefined; }; -safari.application.addEventListener("command", passafari_command_handler, false); -safari.application.addEventListener("message", passafari_message_handler, false); +safari.application.addEventListener("command", passafari_command_handler, false); +safari.application.addEventListener("message", passafari_message_handler, false); + +// CALLED by passafari_command_handler function passafari_open(event) { passafari_associate(); + passafari_credentials_cache(null); passafari_retrieve_credentials(function(credentials) { if (credentials.length === 0) { + passafari_notify_injected("passafari_retrieve"); } else if (credentials.length === 1) { - passafari_notify_injected(credentials); + passafari_notify_injected("passafari_credentials", credentials); } else { passafari_display_credentials(credentials); } @@ -38,6 +44,99 @@ function passafari_open(event) { return undefined; } +// CALLED by passafari_command_handler +function passafari_select_credentials(event) { + var idx = parseInt( event.target.identifier.split("_").pop() ); + var credentials = passafari_credentials_cache(null); + + if (credentials.length === 0) { + // NOOP + } else if (credentials.length === 1) { + passafari_notify_injected("passafari_credentials", credentials); + } else { + passafari_notify_injected("passafari_credentials", [ credentials[idx] ]); + } + + return undefined; +} + +// CALLED by passafari_command_handler +function passafari_select_save(event) { + var idx = parseInt( event.target.identifier.split("_").pop() ); + var credentials = passafari_credentials_cache(null); + var credential = credentials[idx]; + + if(credential) { + var callback = function(code) { console.log("passafari_save: response code '" + code + "'.") }; + var tab = undefined; + var entryId = credential.Uuid; + var username = credential.Login; + var password = credential.Password; + var url = safari.application.activeBrowserWindow.activeTab.url; + + keepass.updateCredentials(callback, tab, entryId, username, password, url); + } else { + console.log("passafari_select_save: no credential found in cache for index '" + idx + "'."); + } + + return undefined; +} + +// CALLED by passafari_message_handler +function passafari_save(event) { + console.log("passafari_save:"); + console.log(event); + + var credentials = passafari_credentials_cache(null) || []; + var credential = event.message; + + if (credentials.length === 0) { + if (credential && credential.Login.length > 0) { + var toolbarItem = passafari_toolbar_item(); + + safari.extension.removeMenu("passafari_save"); + var menu = safari.extension.createMenu("passafari_save"); + + menu.appendMenuItem("passafari_credentials_0", credential.Login + " | Add", "passafari_select_save"); + + passafari_credentials_cache([credential]); + + toolbarItem.menu = menu; + toolbarItem.showMenu(); + } + } else if (credentials.length === 1) { + // NOOP + } else { + // NOOP + } +} + +// UTILS global.js related +function passafari_toolbar_item() { + return safari.extension.toolbarItems[0]; +} + +// UTILS global.js related +function passafari_notify_injected(msg_name, msg_data) { + safari.application.activeBrowserWindow.activeTab.page.dispatchMessage(msg_name, msg_data); + return undefined; +} + +// UTILS global.js related +function passafari_credentials_cache(credentials) { + if (credentials === undefined) { + credentials = safari.extension.secureSettings['credentials_cache']; + } else if (credentials === null) { + credentials = safari.extension.secureSettings['credentials_cache']; + delete safari.extension.secureSettings['credentials_cache']; + } else { + safari.extension.secureSettings['credentials_cache'] = credentials; + } + + return credentials; +} + +// UTILS global.js related function passafari_associate(event) { if(keepass.isConfigured()) { if(keepass.isAssociated()) { @@ -55,6 +154,7 @@ function passafari_associate(event) { return undefined; } +// UTILS global.js related function passafari_retrieve_credentials(callback) { var tab = undefined; var url = safari.application.activeBrowserWindow.activeTab.url; @@ -69,8 +169,9 @@ function passafari_retrieve_credentials(callback) { return undefined; } +// UTILS global.js related function passafari_display_credentials(credentials) { - var toolbarItem = safari.extension.toolbarItems[0]; + var toolbarItem = passafari_toolbar_item(); safari.extension.removeMenu("passafari_credentials"); var menu = safari.extension.createMenu("passafari_credentials"); @@ -81,27 +182,10 @@ function passafari_display_credentials(credentials) { menu.appendMenuItem("passafari_credentials_" + idx, credential.Login + " | " + credential.Name, "passafari_select_credentials"); } + passafari_credentials_cache(credentials); + toolbarItem.menu = menu; toolbarItem.showMenu(); return undefined; -} - -function passafari_select_credentials(event) { - var idx = parseInt( event.target.identifier.split("_").pop() ); - - passafari_retrieve_credentials(function(credentials) { - if (credentials.length === 0) { - } else if (credentials.length === 1) { - passafari_notify_injected(credentials); - } else { - passafari_notify_injected([ credentials[idx] ]); - } - }); - - return undefined; -} - -function passafari_notify_injected(credentials) { - safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("passafari_credentials", credentials); } \ No newline at end of file diff --git a/start.js b/start.js deleted file mode 100644 index a5faac3..0000000 --- a/start.js +++ /dev/null @@ -1,5 +0,0 @@ -console.log('passafari: start.js'); - -if(window.parent === window) { - console.log('passafari: window.top'); -} \ No newline at end of file