From 5923319c92ef143d3cbdb4f408b5d522cb456bbd Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 9 Nov 2025 13:45:31 +0100 Subject: [PATCH 1/6] added option for connection timeout used when browser extension is trying to connect to KeePassXC --- keepassxc-browser/_locales/de/messages.json | 8 ++++++++ keepassxc-browser/_locales/en/messages.json | 8 ++++++++ keepassxc-browser/_locales/en_GB/messages.json | 8 ++++++++ keepassxc-browser/background/keepass.js | 6 +++++- keepassxc-browser/background/page.js | 2 ++ keepassxc-browser/managed_storage.json | 4 ++++ keepassxc-browser/options/options.html | 10 ++++++++++ keepassxc-browser/options/options.js | 16 +++++++++++++--- 8 files changed, 58 insertions(+), 4 deletions(-) diff --git a/keepassxc-browser/_locales/de/messages.json b/keepassxc-browser/_locales/de/messages.json index 7d2107c..d4d7bf0 100644 --- a/keepassxc-browser/_locales/de/messages.json +++ b/keepassxc-browser/_locales/de/messages.json @@ -1018,6 +1018,14 @@ "message": "Anmeldedaten werden nach dem Timeout aus Hintergrund-Tabs entfernt. Für diese Seiten wird erneut um Erlaubnis gebeten.", "description": "Clear credentials timeout help text." }, + "optionsConnectionTimeout": { + "message": "KeepassXC Zeitlimit für die Verbindung (Sekunden, 2-60).", + "description": "Connection timeout label text." + }, + "optionsConnectionTimeoutHelpText": { + "message": "Wenn die KeePassXC Browser Erweiterung versucht, sich mit KeePass zu verbinden, wird dieses Zeitlimit verwendet.", + "description": "Connection timeout label text." + }, "optionsVersionInfoText": { "message": "KeePassXC-Browser benötigt KeePassXC, um Anmeldedaten abzurufen.", "description": "Settings page version info text." diff --git a/keepassxc-browser/_locales/en/messages.json b/keepassxc-browser/_locales/en/messages.json index b58595d..d586cc0 100644 --- a/keepassxc-browser/_locales/en/messages.json +++ b/keepassxc-browser/_locales/en/messages.json @@ -1022,6 +1022,14 @@ "message": "Credentials are cleared from background tabs after the timeout and permissions for those pages will be asked again.", "description": "Clear credentials timeout help text." }, + "optionsConnectionTimeout": { + "message": "KeepassXC connection timeout (seconds, 2-60).", + "description": "Connection timeout label text." + }, + "optionsConnectionTimeoutHelpText": { + "message": "When KeePassXC browser extension tries to connect to to keepass, this timeout value is used", + "description": "Connection timeout label text." + }, "optionsVersionInfoText": { "message": "KeePassXC-Browser needs KeePassXC to retrieve credentials.", "description": "Settings page version info text." diff --git a/keepassxc-browser/_locales/en_GB/messages.json b/keepassxc-browser/_locales/en_GB/messages.json index ef8d012..39bc0e8 100644 --- a/keepassxc-browser/_locales/en_GB/messages.json +++ b/keepassxc-browser/_locales/en_GB/messages.json @@ -1018,6 +1018,14 @@ "message": "Credentials are cleared from background tabs after the timeout, and permissions for those pages will be asked again.", "description": "Clear credentials timeout help text." }, + "optionsConnectionTimeout": { + "message": "KeepassXC connection timeout (seconds, 2-60).", + "description": "Connection timeout label text." + }, + "optionsConnectionTimeoutHelpText": { + "message": "When KeePassXC browser extension tries to connect to to keepass, this timeout value is used", + "description": "Connection timeout label text." + }, "optionsVersionInfoText": { "message": "KeePassXC-Browser needs KeePassXC to retrieve credentials.", "description": "Settings page version info text." diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index c1d1367..7f1ee3d 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -804,7 +804,11 @@ keepass.disableAutomaticReconnect = function() { keepass.reconnectLoop = null; }; -keepass.reconnect = async function(tab = null, connectionTimeout = 1500) { +keepass.reconnect = async function(tab = null, connectionTimeout = -1) { + if (connectionTimeout == -1) { + connectionTimeout = page.settings.connectionTimeout * 1000; + } + keepassClient.connectToNative(); keepass.generateNewKeyPair(); const keyChangeResult = await keepass.changePublicKeys(tab, !!connectionTimeout, connectionTimeout).catch(() => false); diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index 4020a1b..fbe17ec 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -14,6 +14,7 @@ const defaultSettings = { bannerPosition: BannerPosition.TOP, checkUpdateKeePassXC: CHECK_UPDATE_NEVER, clearCredentialsTimeout: 10, + connectionTimeout: 2, colorTheme: 'system', credentialSorting: SORT_BY_GROUP_AND_TITLE, debugLogging: false, @@ -47,6 +48,7 @@ page.autoSubmitPerformed = false; page.attributeMenuItems = []; page.blockedTabs = []; page.clearCredentialsTimeout = null; +page.connectionTimeout = null; page.currentRequest = {}; page.currentTabId = -1; page.isFirefox = false; diff --git a/keepassxc-browser/managed_storage.json b/keepassxc-browser/managed_storage.json index 21af9b8..a09abf0 100644 --- a/keepassxc-browser/managed_storage.json +++ b/keepassxc-browser/managed_storage.json @@ -52,6 +52,10 @@ "title": "Clear credential info from tabs after timeout. Default (seconds): 10", "type": "integer" }, + "connectionTimeout": { + "title": "Connection timeout to KeePassXC. Default (seconds): 2", + "type": "integer" + }, "colorTheme": { "title": "Extension color scheme. Default: system", "type": "string" diff --git a/keepassxc-browser/options/options.html b/keepassxc-browser/options/options.html index 4dd97d0..35683e0 100644 --- a/keepassxc-browser/options/options.html +++ b/keepassxc-browser/options/options.html @@ -531,6 +531,16 @@
+ + +
+ +
+ +
+
+
+
diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index c5c5d28..840f8c3 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -124,6 +124,7 @@ options.initGeneralSettings = async function() { $('#tab-general-settings input#defaultGroup').value = options.settings['defaultGroup']; $('#tab-general-settings input#defaultPasskeyGroup').value = options.settings['defaultPasskeyGroup']; $('#tab-general-settings input#clearCredentialTimeout').value = options.settings['clearCredentialsTimeout']; + $('#tab-general-settings input#connectionTimeout').value = options.settings['connectionTimeout']; const generalSettingsRadioInputs = document.querySelectorAll('#tab-general-settings input[type=radio]'); for (const radio of generalSettingsRadioInputs) { @@ -172,6 +173,15 @@ options.initGeneralSettings = async function() { await options.saveSettings(); }); + $('#tab-general-settings input#connectionTimeout').addEventListener('change', async function(e) { + if (e.target.valueAsNumber < 2 || e.target.valueAsNumber > 60) { + return; + } + + options.settings['connectionTimeout'] = e.target.valueAsNumber; + await options.saveSettings(); + }); + // Change label text dynamically with the range input $('#tab-general-settings input[type=range]').addEventListener('input', function(e) { const currentValue = e.target.valueAsNumber === 11 ? 'Infinite' : e.target.value; @@ -726,7 +736,7 @@ options.initSitePreferences = function() { // Page URL row.children[0].children[0].children[0].value = url; - row.children[0].children[0]?.addEventListener('dblclick', (e) => + row.children[0].children[0]?.addEventListener('dblclick', (e) => enterEditMode(e, row, inputField, editButton, cancelButton, saveButton) ); @@ -891,7 +901,7 @@ const getBrowserId = function(userAgent) { return `${query.name} ${getVersion(userAgent, query.findStr)}`; } } - + return 'Other/Unknown'; }; @@ -919,7 +929,7 @@ const updateDropdownPosition = function(e, dropdown) { if (!rect) { return; } - + const zoom = getComputedStyle(document.body).zoom || 1; const scrollTop = document.defaultView.scrollY / zoom; const scrollLeft = document.defaultView?.scrollX / zoom; From 1c821219f5ede7ad5ccb3fecc4d21843a9609368 Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 9 Nov 2025 14:17:02 +0100 Subject: [PATCH 2/6] Improved based on review feedback --- keepassxc-browser/background/keepass.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 7f1ee3d..8ad3564 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -805,7 +805,7 @@ keepass.disableAutomaticReconnect = function() { }; keepass.reconnect = async function(tab = null, connectionTimeout = -1) { - if (connectionTimeout == -1) { + if (connectionTimeout === -1) { connectionTimeout = page.settings.connectionTimeout * 1000; } From 5a06415d1fdc699827eb1e5c96ff08820cb2e174 Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 9 Nov 2025 14:19:15 +0100 Subject: [PATCH 3/6] Removed german translations --- keepassxc-browser/_locales/de/messages.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/keepassxc-browser/_locales/de/messages.json b/keepassxc-browser/_locales/de/messages.json index d4d7bf0..7d2107c 100644 --- a/keepassxc-browser/_locales/de/messages.json +++ b/keepassxc-browser/_locales/de/messages.json @@ -1018,14 +1018,6 @@ "message": "Anmeldedaten werden nach dem Timeout aus Hintergrund-Tabs entfernt. Für diese Seiten wird erneut um Erlaubnis gebeten.", "description": "Clear credentials timeout help text." }, - "optionsConnectionTimeout": { - "message": "KeepassXC Zeitlimit für die Verbindung (Sekunden, 2-60).", - "description": "Connection timeout label text." - }, - "optionsConnectionTimeoutHelpText": { - "message": "Wenn die KeePassXC Browser Erweiterung versucht, sich mit KeePass zu verbinden, wird dieses Zeitlimit verwendet.", - "description": "Connection timeout label text." - }, "optionsVersionInfoText": { "message": "KeePassXC-Browser benötigt KeePassXC, um Anmeldedaten abzurufen.", "description": "Settings page version info text." From 0b63edb8f86cad2c4f30435eac513cac4f8b8d79 Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 9 Nov 2025 14:20:12 +0100 Subject: [PATCH 4/6] Removed en_GB translations --- keepassxc-browser/_locales/en_GB/messages.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/keepassxc-browser/_locales/en_GB/messages.json b/keepassxc-browser/_locales/en_GB/messages.json index 39bc0e8..ef8d012 100644 --- a/keepassxc-browser/_locales/en_GB/messages.json +++ b/keepassxc-browser/_locales/en_GB/messages.json @@ -1018,14 +1018,6 @@ "message": "Credentials are cleared from background tabs after the timeout, and permissions for those pages will be asked again.", "description": "Clear credentials timeout help text." }, - "optionsConnectionTimeout": { - "message": "KeepassXC connection timeout (seconds, 2-60).", - "description": "Connection timeout label text." - }, - "optionsConnectionTimeoutHelpText": { - "message": "When KeePassXC browser extension tries to connect to to keepass, this timeout value is used", - "description": "Connection timeout label text." - }, "optionsVersionInfoText": { "message": "KeePassXC-Browser needs KeePassXC to retrieve credentials.", "description": "Settings page version info text." From a7ef451f4cfc51e399e2955652dfe43132436cba Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 9 Nov 2025 15:53:32 +0100 Subject: [PATCH 5/6] Changed approach of setting connection timeout by introducing a slider and handle the conversion between seconds and milliseconds during options processing --- keepassxc-browser/_locales/en/messages.json | 4 ++-- keepassxc-browser/background/keepass.js | 6 +----- keepassxc-browser/background/page.js | 2 +- keepassxc-browser/managed_storage.json | 2 +- keepassxc-browser/options/options.html | 6 ++---- keepassxc-browser/options/options.js | 17 ++++++++++++----- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/keepassxc-browser/_locales/en/messages.json b/keepassxc-browser/_locales/en/messages.json index d586cc0..bff1136 100644 --- a/keepassxc-browser/_locales/en/messages.json +++ b/keepassxc-browser/_locales/en/messages.json @@ -1023,11 +1023,11 @@ "description": "Clear credentials timeout help text." }, "optionsConnectionTimeout": { - "message": "KeepassXC connection timeout (seconds, 2-60).", + "message": "KeepassXC connection timeout: $1 seconds", "description": "Connection timeout label text." }, "optionsConnectionTimeoutHelpText": { - "message": "When KeePassXC browser extension tries to connect to to keepass, this timeout value is used", + "message": "When KeePassXC browser extension tries to connect to to keepass, this timeout value is used. Default value is 1.5. Maximum is 60.0.", "description": "Connection timeout label text." }, "optionsVersionInfoText": { diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 8ad3564..08dfdd9 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -804,11 +804,7 @@ keepass.disableAutomaticReconnect = function() { keepass.reconnectLoop = null; }; -keepass.reconnect = async function(tab = null, connectionTimeout = -1) { - if (connectionTimeout === -1) { - connectionTimeout = page.settings.connectionTimeout * 1000; - } - +keepass.reconnect = async function(tab = null, connectionTimeout = page.settings.connectionTimeout) { keepassClient.connectToNative(); keepass.generateNewKeyPair(); const keyChangeResult = await keepass.changePublicKeys(tab, !!connectionTimeout, connectionTimeout).catch(() => false); diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index fbe17ec..a0a76c1 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -14,7 +14,7 @@ const defaultSettings = { bannerPosition: BannerPosition.TOP, checkUpdateKeePassXC: CHECK_UPDATE_NEVER, clearCredentialsTimeout: 10, - connectionTimeout: 2, + connectionTimeout: 1500, colorTheme: 'system', credentialSorting: SORT_BY_GROUP_AND_TITLE, debugLogging: false, diff --git a/keepassxc-browser/managed_storage.json b/keepassxc-browser/managed_storage.json index a09abf0..1db4369 100644 --- a/keepassxc-browser/managed_storage.json +++ b/keepassxc-browser/managed_storage.json @@ -53,7 +53,7 @@ "type": "integer" }, "connectionTimeout": { - "title": "Connection timeout to KeePassXC. Default (seconds): 2", + "title": "Connection timeout to KeePassXC. Default (seconds): 1.5", "type": "integer" }, "colorTheme": { diff --git a/keepassxc-browser/options/options.html b/keepassxc-browser/options/options.html index 35683e0..d8e672d 100644 --- a/keepassxc-browser/options/options.html +++ b/keepassxc-browser/options/options.html @@ -534,10 +534,8 @@
- -
- -
+ +
diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index 840f8c3..fabab29 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -114,7 +114,7 @@ options.initGeneralSettings = async function() { $('#tab-general-settings input[type=radio]#checkUpdateOneMonth').value = CHECK_UPDATE_ONE_MONTH; $('#tab-general-settings input[type=radio]#checkUpdateNever').value = CHECK_UPDATE_NEVER; - $('#tab-general-settings input[type=range]').value = options.settings['redirectAllowance']; + $('#tab-general-settings #redirectAllowance').value = options.settings['redirectAllowance']; $('#redirectAllowanceLabel').textContent = tr('optionsRedirectAllowance', options.settings['redirectAllowance'] === 11 ? 'Infinite' : String(options.settings['redirectAllowance'])); @@ -124,7 +124,9 @@ options.initGeneralSettings = async function() { $('#tab-general-settings input#defaultGroup').value = options.settings['defaultGroup']; $('#tab-general-settings input#defaultPasskeyGroup').value = options.settings['defaultPasskeyGroup']; $('#tab-general-settings input#clearCredentialTimeout').value = options.settings['clearCredentialsTimeout']; - $('#tab-general-settings input#connectionTimeout').value = options.settings['connectionTimeout']; + const connectionTimeout = (options.settings['connectionTimeout']/1000); + $('#tab-general-settings input#connectionTimeout').value = connectionTimeout; + $('#connectionTimeoutLabel').textContent = tr('optionsConnectionTimeout', String(connectionTimeout)); const generalSettingsRadioInputs = document.querySelectorAll('#tab-general-settings input[type=radio]'); for (const radio of generalSettingsRadioInputs) { @@ -173,17 +175,22 @@ options.initGeneralSettings = async function() { await options.saveSettings(); }); + // Change label text dynamically with the range input + $('#tab-general-settings input#connectionTimeout').addEventListener('input', function(e) { + $('#connectionTimeoutLabel').textContent = tr('optionsConnectionTimeout', e.target.value); + }); + $('#tab-general-settings input#connectionTimeout').addEventListener('change', async function(e) { - if (e.target.valueAsNumber < 2 || e.target.valueAsNumber > 60) { + if (e.target.valueAsNumber < 1.5 || e.target.valueAsNumber > 60) { return; } - options.settings['connectionTimeout'] = e.target.valueAsNumber; + options.settings['connectionTimeout'] = e.target.valueAsNumber * 1000; await options.saveSettings(); }); // Change label text dynamically with the range input - $('#tab-general-settings input[type=range]').addEventListener('input', function(e) { + $('#tab-general-settings input#redirectAllowance').addEventListener('input', function(e) { const currentValue = e.target.valueAsNumber === 11 ? 'Infinite' : e.target.value; $('#redirectAllowanceLabel').textContent = tr('optionsRedirectAllowance', currentValue); }); From 511b9ed32e924fdd13c5031cd64b3c71766bbf3a Mon Sep 17 00:00:00 2001 From: Talkabout Date: Sun, 16 Nov 2025 14:10:14 +0100 Subject: [PATCH 6/6] - added constant for default connection timeout value - decide if settings value should be used based on parameter count --- keepassxc-browser/background/keepass.js | 7 ++++++- keepassxc-browser/background/page.js | 2 +- keepassxc-browser/common/global.js | 3 +++ keepassxc-browser/options/options.js | 6 +----- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 08dfdd9..31ab97f 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -804,7 +804,12 @@ keepass.disableAutomaticReconnect = function() { keepass.reconnectLoop = null; }; -keepass.reconnect = async function(tab = null, connectionTimeout = page.settings.connectionTimeout) { +keepass.reconnect = async function(tab = null, connectionTimeout = CONNECTION_TIMEOUT) { + if (arguments.length < 2) { + connectionTimeout = page.settings.connectionTimeout; + } + + connectionTimeout = Math.min(60000, Math.max(CONNECTION_TIMEOUT, connectionTimeout)) keepassClient.connectToNative(); keepass.generateNewKeyPair(); const keyChangeResult = await keepass.changePublicKeys(tab, !!connectionTimeout, connectionTimeout).catch(() => false); diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index a0a76c1..c2fce28 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -14,7 +14,7 @@ const defaultSettings = { bannerPosition: BannerPosition.TOP, checkUpdateKeePassXC: CHECK_UPDATE_NEVER, clearCredentialsTimeout: 10, - connectionTimeout: 1500, + connectionTimeout: CONNECTION_TIMEOUT, colorTheme: 'system', credentialSorting: SORT_BY_GROUP_AND_TITLE, debugLogging: false, diff --git a/keepassxc-browser/common/global.js b/keepassxc-browser/common/global.js index 10f58f6..bcf5a44 100755 --- a/keepassxc-browser/common/global.js +++ b/keepassxc-browser/common/global.js @@ -24,6 +24,9 @@ const CHECK_UPDATE_THREE_DAYS = 3; const CHECK_UPDATE_ONE_WEEK = 7; const CHECK_UPDATE_ONE_MONTH = 30; +// Default value for connection timeout +const CONNECTION_TIMEOUT = 1500; + const URL_WILDCARD = '1kpxcwc1'; const schemeSegment = '(\\*|http|https|ws|wss|ftp)'; const hostSegment = '(\\*|(?:\\*\\.)?(?:[^/*]+))?'; diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index fabab29..1202af3 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -181,11 +181,7 @@ options.initGeneralSettings = async function() { }); $('#tab-general-settings input#connectionTimeout').addEventListener('change', async function(e) { - if (e.target.valueAsNumber < 1.5 || e.target.valueAsNumber > 60) { - return; - } - - options.settings['connectionTimeout'] = e.target.valueAsNumber * 1000; + options.settings['connectionTimeout'] = Math.min(60000, Math.max(CONNECTION_TIMEOUT, e.target.valueAsNumber * 1000)) await options.saveSettings(); });