From 1f9b76178bc449858009b60076575a5defa20cb8 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Wed, 13 Dec 2017 12:48:03 +0200 Subject: [PATCH] Support for OTP codes via context menu --- keepassxc-browser/background/init.js | 1 + keepassxc-browser/keepassxc-browser.js | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/keepassxc-browser/background/init.js b/keepassxc-browser/background/init.js index 6655baf..4279020 100644 --- a/keepassxc-browser/background/init.js +++ b/keepassxc-browser/background/init.js @@ -79,6 +79,7 @@ browser.runtime.onMessage.addListener(kpxcEvent.onMessage); const contextMenuItems = [ {title: 'Fill User + Pass', action: 'fill_user_pass'}, {title: 'Fill Pass Only', action: 'fill_pass_only'}, + {title: 'Fill TOTP', action: 'fill_totp'}, {title: 'Show Password Generator Icons', action: 'activate_password_generator'}, {title: 'Save credentials', action: 'remember_credentials'} ]; diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js index e74d3e5..2d00087 100644 --- a/keepassxc-browser/keepassxc-browser.js +++ b/keepassxc-browser/keepassxc-browser.js @@ -38,6 +38,10 @@ browser.runtime.onMessage.addListener(function(req, sender, callback) { cip.receiveCredentialsIfNecessary(); cip.fillInFromActiveElementPassOnly(false); } + else if (req.action === 'fill_totp') { + cip.receiveCredentialsIfNecessary(); + cip.fillInFromActiveElementTOTPOnly(false); + } else if (req.action === 'activate_password_generator') { cip.initPasswordGenerator(cipFields.getAllFields()); } @@ -1445,6 +1449,26 @@ cip.fillInFromActiveElementPassOnly = function(suppressWarnings) { cip.fillInCredentials(combination, true, suppressWarnings); }; +cip.fillInFromActiveElementTOTPOnly = function(suppressWarnings) { + const el = document.activeElement; + cipFields.setUniqueId(jQuery(el)); + const fieldId = cipFields.prepareId(jQuery(el).attr('data-cip-id')); + + + if (cip.credentials[0]) { + const $sf = _fs(fieldId); + if (cip.credentials[0].stringFields && cip.credentials[0].stringFields.length > 0) { + const sFields = cip.credentials[0].stringFields; + for (const s of sFields) { + const val = s["KPH: {TOTP}"]; + if (val) { + cip.setValue($sf, val); + } + } + } + } +}; + cip.setValue = function(field, value) { if (field.is('select')) { value = value.toLowerCase().trim();