mirror of
https://github.com/keepassxreboot/keepassxc-browser.git
synced 2026-03-11 08:54:43 +00:00
Merge tag '1.3.0'
This commit is contained in:
commit
172f50d6ff
25 changed files with 1265 additions and 415 deletions
3
.github/ISSUE_TEMPLATE.md
vendored
3
.github/ISSUE_TEMPLATE.md
vendored
|
|
@ -25,7 +25,6 @@
|
|||
## Debug info
|
||||
<!--- Please copy/paste the browser's JavaScript console messages and errors here -->
|
||||
KeePassXC - {VERSION}
|
||||
keepassxc-browser - {VERSION}
|
||||
KeePassXC-Browser - {VERSION}
|
||||
Operating system: Mac/Win/Linux
|
||||
Browser: Chrome/Firefox/Vivaldi/Chromium
|
||||
Proxy used: YES/NO
|
||||
|
|
|
|||
18
CHANGELOG
18
CHANGELOG
|
|
@ -1,3 +1,21 @@
|
|||
1.3.0 (07-10-2018)
|
||||
=========================
|
||||
- Add support for translations [#37]
|
||||
- Add quick-filter bar to credentials selection popup [#252]
|
||||
- Disable automatic filling and submission of HTTP basic-auth fields by default [#260]
|
||||
- Do not fill password fields if a manually entered username does not match retrieved credentials [#289]
|
||||
- Fix handling of websites with separate pages for username and password [#291]
|
||||
- Improve detection and handling of hidden input fields [#263, #293]
|
||||
- Fix updating credentials from the context menu [#256]
|
||||
- Improve shortcuts and add button to open shortcut settings [#304]
|
||||
- Do not mix pairing IDs across multiple databases within a session [#258]
|
||||
- Ignore certain elements on a page, such as SVGs [#246]
|
||||
- Do not show the full pairing key on the settings page [#242]
|
||||
- Default to checking for updates every 3 days [#239]
|
||||
- Hide update message when updates are turned off [#285]
|
||||
- Fix discard button not being shown when selection custom login fields [#307]
|
||||
- Update webextension polyfill to a newer version, which fixes various errors [#296]
|
||||
|
||||
1.2.0 (29-07-2018)
|
||||
=========================
|
||||
- Replace "Ignored Sites" with new "Site Preferences" settings page [#208]
|
||||
|
|
|
|||
738
keepassxc-browser/_locales/en/messages.json
Normal file
738
keepassxc-browser/_locales/en/messages.json
Normal file
|
|
@ -0,0 +1,738 @@
|
|||
{
|
||||
"extensionDescription": {
|
||||
"message": "KeePassXC integration for modern web browsers",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"contextMenuFillUsernameAndPassword": {
|
||||
"message": "Fill Username and Password",
|
||||
"description": "Context menu item for filling both username and password."
|
||||
},
|
||||
"contextMenuFillPassword": {
|
||||
"message": "Fill Password Only",
|
||||
"description": "Context menu item for filling password."
|
||||
},
|
||||
"contextMenuFillTOTP": {
|
||||
"message": "Fill TOTP",
|
||||
"description": "Context menu item for filling Time-based One Time Password."
|
||||
},
|
||||
"contextMenuShowPasswordGeneratorIcons": {
|
||||
"message": "Show Password Generator Icons",
|
||||
"description": "Show password generator icon on every password input field."
|
||||
},
|
||||
"contextMenuSaveCredentials": {
|
||||
"message": "Save credentials",
|
||||
"description": "Save credentials using the extension popup icon."
|
||||
},
|
||||
"rememberCredentialsPopup": {
|
||||
"message": "Create or modify the credentials by clicking on the extension icon.",
|
||||
"description": "Notification text when saving credentials from the context menu."
|
||||
},
|
||||
"multipleCredentialsDetected": {
|
||||
"message": "HTTP authentication with multiple credentials detected. Click on the extension icon to choose the correct one.",
|
||||
"description": "Notification when HTTP Authentication has multiple credentials detected."
|
||||
},
|
||||
"errorMessageUnknown": {
|
||||
"message": "Unknown error.",
|
||||
"description": "Unknown error."
|
||||
},
|
||||
"errorMessageDatabaseNotOpened": {
|
||||
"message": "Database not opened.",
|
||||
"description": "Database not opened."
|
||||
},
|
||||
"errorMessageDatabaseHash": {
|
||||
"message": "Database hash not received.",
|
||||
"description": "Database hash not received."
|
||||
},
|
||||
"errorMessageClientPublicKey": {
|
||||
"message": "Client public key not received.",
|
||||
"description": "Client public key not received."
|
||||
},
|
||||
"errorMessageDecrypt": {
|
||||
"message": "Cannot decrypt message.",
|
||||
"description": "Cannot decrypt message."
|
||||
},
|
||||
"errorMessageTimeout": {
|
||||
"message": "Timeout or not connected to KeePassXC.",
|
||||
"description": "Timeout or not connected to KeePassXC."
|
||||
},
|
||||
"errorMessageCanceled": {
|
||||
"message": "Action canceled or denied.",
|
||||
"description": "Action canceled or denied."
|
||||
},
|
||||
"errorMessageEncrypt": {
|
||||
"message": "Cannot encrypt message or public key not found. Is native messaging or support for your browser enabled in KeePassXC?",
|
||||
"description": "Cannot encrypt message or public key not found. Is native messaging or support for your browser enabled in KeePassXC?"
|
||||
},
|
||||
"errorMessageAssociate": {
|
||||
"message": "KeePassXC association failed, try again.",
|
||||
"description": "KeePassXC association failed, try again."
|
||||
},
|
||||
"errorMessageKeyExchange": {
|
||||
"message": "Key exchange was not successful.",
|
||||
"description": "Key exchange was not successful."
|
||||
},
|
||||
"errorMessageEncryptionKey": {
|
||||
"message": "Encryption key is not recognized.",
|
||||
"description": "Encryption key is not recognized."
|
||||
},
|
||||
"errorMessageSavedDatabases": {
|
||||
"message": "No saved databases found.",
|
||||
"description": "No saved databases found."
|
||||
},
|
||||
"errorMessageIncorrectAction": {
|
||||
"message": "Incorrect action.",
|
||||
"description": "Incorrect action."
|
||||
},
|
||||
"errorMessageEmptyMessage": {
|
||||
"message": "Empty message received.",
|
||||
"description": "Empty message received."
|
||||
},
|
||||
"errorMessageNoURL": {
|
||||
"message": "No URL provided.",
|
||||
"description": "No URL provided."
|
||||
},
|
||||
"errorMessageNoLogins": {
|
||||
"message": "No logins found.",
|
||||
"description": "No logins found."
|
||||
},
|
||||
"passwordGeneratorPlaceholder": {
|
||||
"message": "Generated password",
|
||||
"description": "Input field placeholder for generated password."
|
||||
},
|
||||
"passwordGeneratorLabel": {
|
||||
"message": "Also fill in the next password-field",
|
||||
"description": "Checkbox text below the password generator input field."
|
||||
},
|
||||
"passwordGeneratorBits": {
|
||||
"message": "??? Bits",
|
||||
"description": "Bits of the generated password."
|
||||
},
|
||||
"passwordGeneratorTitle": {
|
||||
"message": "Password Generator",
|
||||
"description": "Password generator dialog title."
|
||||
},
|
||||
"passwordGeneratorGenerate": {
|
||||
"message": "Generate",
|
||||
"description": "Generate button text in password generator."
|
||||
},
|
||||
"passwordGeneratorCopy": {
|
||||
"message": "Copy",
|
||||
"description": "Copy button text in password generator."
|
||||
},
|
||||
"passwordGeneratorFillAndCopy": {
|
||||
"message": "Fill and copy",
|
||||
"description": "Fill and copy button text in password generator."
|
||||
},
|
||||
"passwordGeneratorErrorTooLong": {
|
||||
"message": "Error:\nThe generated password is longer than the allowed length!\nIt has been cut to fit the length.\n\nPlease remember the new password!",
|
||||
"description": "A warning text shown in the password generator."
|
||||
},
|
||||
"passwordGeneratorGenerateText": {
|
||||
"message": "Generate password",
|
||||
"description": "Password icon title text."
|
||||
},
|
||||
"passwordGeneratorError": {
|
||||
"message": "Cannot receive generated password.<br />Is KeePassXC running?",
|
||||
"description": "Password generator error text when KeePassXC is closed."
|
||||
},
|
||||
"defineDismiss": {
|
||||
"message": "Dismiss",
|
||||
"description": "Dismiss button text when choosing custom login fields."
|
||||
},
|
||||
"defineSkip": {
|
||||
"message": "Skip",
|
||||
"description": "Skip button text when choosing custom login fields."
|
||||
},
|
||||
"defineAgain": {
|
||||
"message": "Again",
|
||||
"description": "Again button text when choosing custom login fields."
|
||||
},
|
||||
"defineConfirm": {
|
||||
"message": "Confirm",
|
||||
"description": "Confirm button text when choosing custom login fields."
|
||||
},
|
||||
"defineAlreadySelected": {
|
||||
"message": "Login fields for this page are already selected and will be overwritten.",
|
||||
"description": "A text shown when custom credentials fields are already set for the page."
|
||||
},
|
||||
"defineDiscard": {
|
||||
"message": "Discard selection",
|
||||
"description": "Discard selection button text when choosing custom login fields."
|
||||
},
|
||||
"defineStringField": {
|
||||
"message": "String field #",
|
||||
"description": "Text for string field."
|
||||
},
|
||||
"defineChooseUsername": {
|
||||
"message": "1. Choose a username field",
|
||||
"description": "Choosing a username field text when choosing custom login fields."
|
||||
},
|
||||
"defineChoosePassword": {
|
||||
"message": "2. Now choose a password field",
|
||||
"description": "Choosing a password field text when choosing custom login fields."
|
||||
},
|
||||
"defineConfirmSelection": {
|
||||
"message": "3. Confirm selection",
|
||||
"description": "Confirm a selection text when choosing custom login fields."
|
||||
},
|
||||
"defineHelpText": {
|
||||
"message": "Please confirm your selection or choose more fields as <em>String fields</em>.",
|
||||
"description": "Confirm a selection text when choosing custom login fields which contains string fields."
|
||||
},
|
||||
"username": {
|
||||
"message": "Username",
|
||||
"description": "General text for username."
|
||||
},
|
||||
"password": {
|
||||
"message": "Password",
|
||||
"description": "General text for password."
|
||||
},
|
||||
"credentialsNoUsername": {
|
||||
"message": "- no username -",
|
||||
"description": "Shown when no username is set in the credentials."
|
||||
},
|
||||
"credentialsNoLoginsFound": {
|
||||
"message": "Error:\nNo logins found.",
|
||||
"description": "Shown when no credentials are found for the current page."
|
||||
},
|
||||
"credentialsMultipleFound": {
|
||||
"message": "Error:\nMore than one login was found in KeePassXC!\nPress the KeePassXC-Browser icon for more options.",
|
||||
"description": "Alert message when trying to fill username and/or password when multiple credentials are found."
|
||||
},
|
||||
"credentialsNoUsernameFound": {
|
||||
"message": "Error:\nNo credentials for the given username found.",
|
||||
"description": "Alert message when no credentials are found for the given username."
|
||||
},
|
||||
"fieldsFill": {
|
||||
"message": "Error:\nCannot find fields to fill in.",
|
||||
"description": "Alert message when no fields are found to fill in."
|
||||
},
|
||||
"fieldsNoPasswordField": {
|
||||
"message": "Error:\nUnable to find a password field.",
|
||||
"description": "Message shown when no password fields are found."
|
||||
},
|
||||
"rememberNothingChanged": {
|
||||
"message": "Error:\nCould not detect changed credentials.",
|
||||
"description": "Message shown when trying to save credentials that haven't changed."
|
||||
},
|
||||
"popupTitle": {
|
||||
"message": "KeePassXC - Popup",
|
||||
"description": "Popup window title."
|
||||
},
|
||||
"popupSettingsText": {
|
||||
"message": " Settings",
|
||||
"description": "Popup Settings button text."
|
||||
},
|
||||
"popupChooseCredentialsText": {
|
||||
"message": " Choose custom login fields for this page",
|
||||
"description": "Popup credential choosing button text."
|
||||
},
|
||||
"popupConnectButton": {
|
||||
"message": " Connect",
|
||||
"description": "Popup Connect button text."
|
||||
},
|
||||
"popupReconnectButton": {
|
||||
"message": " Reconnect",
|
||||
"description": "Popup Reconnect button text."
|
||||
},
|
||||
"popupRedetectButton": {
|
||||
"message": " Redetect login fields",
|
||||
"description": "Popup Redetect login fields button text."
|
||||
},
|
||||
"popupReloadButton": {
|
||||
"message": " Reload",
|
||||
"description": "Popup Reload button text."
|
||||
},
|
||||
"popupReopenButton": {
|
||||
"message": " Reopen database",
|
||||
"description": "Popup reopen database button text."
|
||||
},
|
||||
"popupErrorEncountered": {
|
||||
"message": "KeePassXC-Browser has encountered an error:",
|
||||
"description": "A text shown above error message in the popup."
|
||||
},
|
||||
"popupUpdateAvailable": {
|
||||
"message": "You use an old version of KeePassXC.",
|
||||
"description": "Popup warning message about old version of KeePassXC."
|
||||
},
|
||||
"popupDownloadNewVersion": {
|
||||
"message": "Please download the latest version from keepassxc.org",
|
||||
"description": "Popup warning message link when KeePassXC version is not up-to-date."
|
||||
},
|
||||
"popupCheckingStatus": {
|
||||
"message": " Checking status...",
|
||||
"description": "Checking status message in popup."
|
||||
},
|
||||
"popupNotConfigured": {
|
||||
"message": "KeePassXC-Browser has not been configured. Press the connect button to pair with KeePassXC.",
|
||||
"description": "A popup message shown when the extension has not been connected to KeePassXC."
|
||||
},
|
||||
"popupNeedReconfigure": {
|
||||
"message": "KeePassXC-Browser has been disconnected from KeePassXC.",
|
||||
"description": "A popup message shown when the extension has been disconnected from KeePassXC."
|
||||
},
|
||||
"popupNeedReconfigureMessage": {
|
||||
"message": "Press the reconnect button to establish a new connection.",
|
||||
"description": "A popup message shown when reconnect is needed."
|
||||
},
|
||||
"popupConfiguredNotAssociated": {
|
||||
"message": "KeePassXC-Browser has not yet connected to KeePassXC but has been configured using the identifier: $1",
|
||||
"description": "A popup message shown when KeePassXC is not connected but configured."
|
||||
},
|
||||
"popupConfiguredAndAssociated": {
|
||||
"message": "KeePassXC-Browser is connected to KeePassXC and has been configured using the following identifier: $1",
|
||||
"description": "A popuo message when a connection to KeePassXC is succesful."
|
||||
},
|
||||
"popupRememberInfoText": {
|
||||
"message": "Username or password changed! Save it?",
|
||||
"description": "Popup message when username or password has changed."
|
||||
},
|
||||
"popupRememberSaving": {
|
||||
"message": "Credentials will be saved in connected database with identifier $1",
|
||||
"description": "A popup message when saving or updating credentials."
|
||||
},
|
||||
"popupRememberNewUsername": {
|
||||
"message": "The following username is currently not saved: $1",
|
||||
"description": "A popup message shown when a new username is detected when saving credentials."
|
||||
},
|
||||
"popupRememberUsernameExists": {
|
||||
"message": "The credentials with the used username are marked bold: $1",
|
||||
"description": "A popup message shown when a existing username is detected when saving credentials."
|
||||
},
|
||||
"popupRememberChooseCredentials": {
|
||||
"message": "Please choose the credentials you want to update.",
|
||||
"description": "A popup message shown choosing what credentials user wants to update."
|
||||
},
|
||||
"popupLoginText": {
|
||||
"message": "Select the login information you would like to get entered into the page.",
|
||||
"description": "A popup message shown when one or multiple credentials are present."
|
||||
},
|
||||
"popupFilterText": {
|
||||
"message": "Filter:",
|
||||
"description": "Text for login credentials quick filter."
|
||||
},
|
||||
"popupAuthText": {
|
||||
"message": "Select the login information you would like to get logged in with.",
|
||||
"description": "A popup message shown when doing HTTP Authentication with multiple credentials present."
|
||||
},
|
||||
"popupMultiplePasswordFields": {
|
||||
"message": "More than one password field found on this page. Right-click one of the password fields, and choose one of:",
|
||||
"description": "A popup message shown when web page has multiple password fields."
|
||||
},
|
||||
"popupURL": {
|
||||
"message": "URL: ",
|
||||
"description": "URL. Might not need any translation."
|
||||
},
|
||||
"popupUsername": {
|
||||
"message": "Username: ",
|
||||
"description": "A username field name shown on credential update."
|
||||
},
|
||||
"popupButtonNew": {
|
||||
"message": " New",
|
||||
"description": "New button text in popup when updating credentials."
|
||||
},
|
||||
"popupButtonUpdate": {
|
||||
"message": " Update",
|
||||
"description": "Update button text in popup when updating credentials."
|
||||
},
|
||||
"popupButtonDismiss": {
|
||||
"message": " Dismiss",
|
||||
"description": "Dismiss button text in popup when updating credentials."
|
||||
},
|
||||
"popupButtonIgnore": {
|
||||
"message": "Never ask for this page",
|
||||
"description": "Ignore button text in popup or in notification when updating credentials."
|
||||
},
|
||||
"popupButtonClose": {
|
||||
"message": "Close",
|
||||
"description": "Close button text in popup or in notification."
|
||||
},
|
||||
"popupButtonDismissHttpAuth": {
|
||||
"message": " Dismiss and show the default authentication dialog",
|
||||
"description": "Dismiss button text when in HTTP Authentication popup."
|
||||
},
|
||||
"optionsTitle": {
|
||||
"message": "Settings | KeePassXC-Browser",
|
||||
"description": "Options page title."
|
||||
},
|
||||
"optionsGeneralSettingsTab": {
|
||||
"message": "General Settings",
|
||||
"description": "General Settings tab text."
|
||||
},
|
||||
"optionsConnectedDatabasesTab": {
|
||||
"message": "Connected Databases",
|
||||
"description": "Connected Databases tab text."
|
||||
},
|
||||
"optionsCustomFieldsTab": {
|
||||
"message": "Custom login fields",
|
||||
"description": "Saved custom login fields tab text."
|
||||
},
|
||||
"optionsSitePreferencesTab": {
|
||||
"message": "Site preferences",
|
||||
"description": "Site preferences fields tab text."
|
||||
},
|
||||
"optionsAboutTab": {
|
||||
"message": "About",
|
||||
"description": "About tab text."
|
||||
},
|
||||
"optionsMenuGeneral": {
|
||||
"message": "General",
|
||||
"description": "General settings page header."
|
||||
},
|
||||
"optionsMenuConnectedDatabases": {
|
||||
"message": "Connected Databases",
|
||||
"description": "Connected Databases page header."
|
||||
},
|
||||
"optionsMenuCustomFields": {
|
||||
"message": "Custom login fields",
|
||||
"description": "Custom login fields page header."
|
||||
},
|
||||
"optionsMenuSitePreferences": {
|
||||
"message": "Site preferences",
|
||||
"description": "Site preferences page header."
|
||||
},
|
||||
"optionsMenuAbout": {
|
||||
"message": "About",
|
||||
"description": "About page header."
|
||||
},
|
||||
"optionsButtonConfigureShortcuts": {
|
||||
"message": " Configure shortcuts",
|
||||
"description": "Keyboard shortcut button text."
|
||||
},
|
||||
"optionsButtonSave": {
|
||||
"message": " Save",
|
||||
"description": "Save button text."
|
||||
},
|
||||
"optionsButtonConnect": {
|
||||
"message": " Connect",
|
||||
"description": "Connect button text."
|
||||
},
|
||||
"optionsButtonRemove": {
|
||||
"message": " Remove",
|
||||
"description": "Remove button text."
|
||||
},
|
||||
"optionsButtonAdd": {
|
||||
"message": " Add",
|
||||
"description": "Add button text."
|
||||
},
|
||||
"optionsButtonUpdate": {
|
||||
"message": " Check for updates",
|
||||
"description": "Check for updates button text."
|
||||
},
|
||||
"optionsButtonRemoveNow": {
|
||||
"message": " Yes, remove now",
|
||||
"description": "Confirm button text when removing database key or custom login fields."
|
||||
},
|
||||
"optionsButtonCancel": {
|
||||
"message": " Cancel",
|
||||
"description": "Cancel button text when removing database key or custom login fields."
|
||||
},
|
||||
"optionsLabelBlinkTime": {
|
||||
"message": "Blink Time:",
|
||||
"description": "Blink Time option text."
|
||||
},
|
||||
"optionsLabelRedirectOffset": {
|
||||
"message": "Redirect Offset:",
|
||||
"description": "Redirect Offset option text."
|
||||
},
|
||||
"optionsLabelRedirectAllowance": {
|
||||
"message": "Maximum (Number of) Redirects:",
|
||||
"description": "RMaximum (Number of) Redirects options text."
|
||||
},
|
||||
"optionsCheckboxUsePasswordGenerator": {
|
||||
"message": "Activate password generator.",
|
||||
"description": "Activate password generator checkbox text."
|
||||
},
|
||||
"optionsCheckboxAutoRetrieveCredentials": {
|
||||
"message": "Automatically retrieve credentials.",
|
||||
"description": "Automatically retrieve credentials checkbox text."
|
||||
},
|
||||
"optionsCheckboxAutoFillSingleEntry": {
|
||||
"message": "Automatically fill in single-credential entries.",
|
||||
"description": "Automatically fill-in single credential entry checkbox text."
|
||||
},
|
||||
"optionsCheckboxAutoCompleteUsernames": {
|
||||
"message": "Activate autocomplete for username fields.",
|
||||
"description": "Activate autocomplete for username fields checkbox text."
|
||||
},
|
||||
"optionsCheckboxShowNotifications": {
|
||||
"message": "Show notifications.",
|
||||
"description": "Show notifications checkbox text."
|
||||
},
|
||||
"optionsSaveDomainOnly": {
|
||||
"message": "Save domain only.",
|
||||
"description": "Save domain only checkbox text."
|
||||
},
|
||||
"optionsCheckboxShowLoginNotifications": {
|
||||
"message": "Show a notification when new credentials can be saved to the database.",
|
||||
"description": "Show login notifications checkbox text."
|
||||
},
|
||||
"optionsCheckboxAutoFillAndSend": {
|
||||
"message": "Automatically fill in HTTP Basic Auth dialogs and submit them.",
|
||||
"description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text."
|
||||
},
|
||||
"optionsRadioText": {
|
||||
"message": "Check for updates of KeePassXC:",
|
||||
"description": "Text above radio buttons in the settings page."
|
||||
},
|
||||
"optionsRadioThreeDays": {
|
||||
"message": " every 3 days",
|
||||
"description": "Radio button text."
|
||||
},
|
||||
"optionsRadioWeek": {
|
||||
"message": " every week",
|
||||
"description": "Radio button text."
|
||||
},
|
||||
"optionsRadioMonth": {
|
||||
"message": " every month",
|
||||
"description": "Radio button text."
|
||||
},
|
||||
"optionsRadioNever": {
|
||||
"message": " never",
|
||||
"description": "Radio button text."
|
||||
},
|
||||
"optionsKeyboardShortcutsHeader": {
|
||||
"message": "Keyboard shortcuts",
|
||||
"description": "Keyboard shortcut header text."
|
||||
},
|
||||
"optionsBlinkTimeHelpText": {
|
||||
"message": "Maximum time (ms) the icon should blink after detecting new credentials",
|
||||
"description": "Blink Time option help text."
|
||||
},
|
||||
"optionsRedirectOffsetHelpText": {
|
||||
"message": "Minimum time (ms) the icon should blink before deactivating due to page redirects.",
|
||||
"description": "Redirect Offset option help text."
|
||||
},
|
||||
"optionsRedirectOffsetHelpTextSecond": {
|
||||
"message": "-1 to only use blink time ignoring Maximum Redirects (old behavior)",
|
||||
"description": "Redirect Offset option help text, second part."
|
||||
},
|
||||
"optionsRedirectAllowanceHelpText": {
|
||||
"message": "How many pages should the tab cycle through after the redirect offset before deactivating the icon",
|
||||
"description": "Redirect Allowance option help text."
|
||||
},
|
||||
"optionsUsePasswordGeneratorHelpText": {
|
||||
"message": "Adds a button to password fields for generating a new password.",
|
||||
"description": "Password Generator option help text."
|
||||
},
|
||||
"optionsUsePasswordGeneratorHelpTextSecond": {
|
||||
"message": "Passwords are generated by KeePassXC using your password generation profile.",
|
||||
"description": "Password Generator option help text, second part."
|
||||
},
|
||||
"optionsAutoRetrieveCredentialsHelpText": {
|
||||
"message": "KeePassXC-Browser will immediately retrieve credentials when a tab is activated.",
|
||||
"description": "Auto-Retrive Credentials option help text."
|
||||
},
|
||||
"optionsAutoFillSingleEntryHelpText": {
|
||||
"message": "Let KeePassXC-Browser automatically fill in credentials if it receives only a single entry.",
|
||||
"description": "Auto-Fill Single Entry option help text."
|
||||
},
|
||||
"optionsAutoFillSingleEntryWarning": {
|
||||
"message": "Warning! Using auto-fill is not safe. Use at your own risk.",
|
||||
"description": "Auto-Fill Single Entry warning text."
|
||||
},
|
||||
"optionsAutocompleteUsernamesHelpText": {
|
||||
"message": "Show a dropdown list containing available credentials for all username fields on a page.",
|
||||
"description": "Autocomplete Usernames option help text."
|
||||
},
|
||||
"optionsShowNotificationsHelpText": {
|
||||
"message": "Show notifications for errors and when user interaction is required.",
|
||||
"description": "Show notifications option help text."
|
||||
},
|
||||
"optionsSaveDomainOnlyHelpText": {
|
||||
"message": "When saving new credentials, save only the domain instead of full URL.",
|
||||
"description": "Save domain only option help text."
|
||||
},
|
||||
"optionsAutoFillAndSendHelpText": {
|
||||
"message": "If credentials are found for a page and the login-type is an HTTP Basic Auth request, KeePassXC-Browser tries to login with the first given credentials.",
|
||||
"description": "Auto-Fill And Send option help text."
|
||||
},
|
||||
"optionsAutoFillAndSendHelpTextSecond": {
|
||||
"message": "An HTTP Basic Auth dialog looks like this:",
|
||||
"description": "HTTP Basic Auth image help text."
|
||||
},
|
||||
"optionsVersionInfoText": {
|
||||
"message": "KeePassXC-Browser needs KeePassXC to retrieve credentials.",
|
||||
"description": "Settings page version info text."
|
||||
},
|
||||
"optionsVersionDownload": {
|
||||
"message": "You can download the latest stable version from $1",
|
||||
"description": "Settings page download link."
|
||||
},
|
||||
"optionsVersionRunning": {
|
||||
"message": "You are running KeePassXC version: $1",
|
||||
"description": "Settings page info text of user's KeePassXC version."
|
||||
},
|
||||
"optionsLatestVersion": {
|
||||
"message": "Latest available version of KeePassXC: $1",
|
||||
"description": "Settings page info text about the latest KeePassXC version."
|
||||
},
|
||||
"optionsDefault": {
|
||||
"message": "Default: $1",
|
||||
"description": "Default setting text."
|
||||
},
|
||||
"optionsInfinite": {
|
||||
"message": "Infinite: $1",
|
||||
"description": "Infinite setting text."
|
||||
},
|
||||
"optionsRecommended": {
|
||||
"message": "Recommended: $1",
|
||||
"description": "Recommended setting text."
|
||||
},
|
||||
"optionsConnectedDatabasesText": {
|
||||
"message": "The following KeePassXC databases are connected to KeePassXC-Browser.",
|
||||
"description": "Info text about connected databases."
|
||||
},
|
||||
"optionsConnectedDatabasesNotFound": {
|
||||
"message": "No connected databases found.",
|
||||
"description": "Shown in the connected databases table when there is no connected databases."
|
||||
},
|
||||
"optionsDatabasesRemoveIdentifier": {
|
||||
"message": "Remove identifier from database list?",
|
||||
"description": "Confirmation text when removing database from the list."
|
||||
},
|
||||
"optionsDatabasesRemoveIdentifierConfirmFirst": {
|
||||
"message": "Do you really want to remove the following identifier from the database list?",
|
||||
"description": "Confirmation text when removing database from the list."
|
||||
},
|
||||
"optionsDatabasesRemoveIdentifierConfirmSecond": {
|
||||
"message": "You can reconnect your database at any time.",
|
||||
"description": "Confirmation text when removing database from the list, second part."
|
||||
},
|
||||
"optionsDatabaseIdentifier": {
|
||||
"message": "Identifier",
|
||||
"description": "Database list column title."
|
||||
},
|
||||
"optionsDatabaseKey": {
|
||||
"message": "Key",
|
||||
"description": "Database list column title."
|
||||
},
|
||||
"optionsDatabaseLastUsed": {
|
||||
"message": "Last used",
|
||||
"description": "Database list column title."
|
||||
},
|
||||
"optionsDatabaseCreated": {
|
||||
"message": "Created",
|
||||
"description": "Database list column title."
|
||||
},
|
||||
"optionsDatabaseDelete": {
|
||||
"message": "Delete",
|
||||
"description": "Database list column title."
|
||||
},
|
||||
"optionsColumnPageURL": {
|
||||
"message": "Page URL",
|
||||
"description": "Site preferences list column title."
|
||||
},
|
||||
"optionsColumnIgnore": {
|
||||
"message": "Ignore",
|
||||
"description": "Site preferences list column title."
|
||||
},
|
||||
"optionsColumnUsernameOnly": {
|
||||
"message": "Username-only Detection",
|
||||
"description": "Site preferences list column title."
|
||||
},
|
||||
"optionsColumnDelete": {
|
||||
"message": "Delete",
|
||||
"description": "Site preferences list column title."
|
||||
},
|
||||
"optionsSelectionNothing": {
|
||||
"message": "Enable all features",
|
||||
"description": "Site preferences option selection."
|
||||
},
|
||||
"optionsSelectionNormal": {
|
||||
"message": "Disable new/modified credentials",
|
||||
"description": "Site preferences option selection."
|
||||
},
|
||||
"optionsSelectionFull": {
|
||||
"message": "Disable all features",
|
||||
"description": "Site preferences option selection."
|
||||
},
|
||||
"optionsCustomFieldsNotFound": {
|
||||
"message": "No saved custom login fields found.",
|
||||
"description": "Shown when no saved custom credentials are saved."
|
||||
},
|
||||
"optionsCustomFieldsTabHelpTextFirst": {
|
||||
"message": "If KeePassXC-Browser detects the wrong login fields, you are able to specify the correct fields yourself.",
|
||||
"description": "Saved custom login fields info text, first part."
|
||||
},
|
||||
"optionsCustomFieldsTabHelpTextSecond": {
|
||||
"message": "Go to the page and click on the KeePassXC-Browser icon, then select ",
|
||||
"description": "Saved custom login fields info text, second part."
|
||||
},
|
||||
"optionsCustomFieldsTabHelpTextThird": {
|
||||
"message": "On this page you can manage saved custom login fields.",
|
||||
"description": "Saved custom login fields info text, third part."
|
||||
},
|
||||
"optionsCustomFieldsRemove": {
|
||||
"message": "Remove saved custom login fields?",
|
||||
"description": "Confirmation text when removing saved custom login fields."
|
||||
},
|
||||
"optionsCustomFieldsConfirmation": {
|
||||
"message": "Do you really want to remove the saved custom login fields on the page: $1",
|
||||
"description": "Confirmation text when removing saved custom login fields."
|
||||
},
|
||||
"optionsCustomFieldsConfirmationHelpText": {
|
||||
"message": "KeePassXC-Browser will automatically detect the login fields next time you visit this page.",
|
||||
"description": "Part of confirmation text when removing saved custom login fields."
|
||||
},
|
||||
"optionsSitePreferencesNotFound": {
|
||||
"message": "No ignored sites found.",
|
||||
"description": "Shown when no ignored sites are saved."
|
||||
},
|
||||
"optionsSitePreferencesRemove": {
|
||||
"message": "Remove site?",
|
||||
"description": "Confirmation text when removing ignored sites from the list."
|
||||
},
|
||||
"optionsSitePreferencesTabHelpTextFirst": {
|
||||
"message": "Sites on this page have special handling methods associated with them.",
|
||||
"description": "Site preferences info text, first part."
|
||||
},
|
||||
"optionsSitePreferencesTabHelpTextSecond": {
|
||||
"message": "To ignore new/modified credentials on a specific site, add them below or click the blinking KeePassXC-Browser icon and select",
|
||||
"description": "Site preferences info text, second part."
|
||||
},
|
||||
"optionsSitePreferencesTabHelpTextThird": {
|
||||
"message": "If a site is fully ignored (<em>Disable all features</em> is selected), then the plugin will do nothing when visiting that site.",
|
||||
"description": "Site preferences info text, third part."
|
||||
},
|
||||
"optionsSitePreferencesTabHelpTextFourth": {
|
||||
"message": "Username-only detection allows KeePassXC-Browser to fill in login details on websites with separate pages for username and password.",
|
||||
"description": "Site preferences info text, fourth part."
|
||||
},
|
||||
"optionsSitePreferencesManualAddText": {
|
||||
"message": "Add URL manually:",
|
||||
"description": "Label for adding site manually on Site preferences tab."
|
||||
},
|
||||
"optionsSitePreferencesConfirmation": {
|
||||
"message": "Do you really want to remove the specified site from the list: $1",
|
||||
"description": "Confirmation text when removing site from site preferences."
|
||||
},
|
||||
"optionsSitePreferencesConfirmationHelpText": {
|
||||
"message": "KeePassXC-Browser will enable all features for this site and remove username-only detection.",
|
||||
"description": "Part of confirmation text when removing site preferences."
|
||||
},
|
||||
"optionsAboutChrome": {
|
||||
"message": "Visit KeePassXC-Browser in the Chrome Web Store.",
|
||||
"description": "About page link to Chrome Web Store."
|
||||
},
|
||||
"optionsAboutMozilla": {
|
||||
"message": "Visit KeePassXC-Browser in the Mozilla Add-ons directory.",
|
||||
"description": "About page link to AMO."
|
||||
},
|
||||
"optionsAboutGitHub": {
|
||||
"message": "Visit KeePassXC-Browser on GitHub.",
|
||||
"description": "About page link to GitHub."
|
||||
},
|
||||
"optionsAboutExtensionVersion": {
|
||||
"message": "KeePassXC-Browser Version: $1",
|
||||
"description": "About page text of extension version."
|
||||
},
|
||||
"optionsAboutKeePassXCVersion": {
|
||||
"message": "KeePassXC Version: $1",
|
||||
"description": "About page text of KeePassXC version."
|
||||
},
|
||||
"optionsAboutContributors": {
|
||||
"message": "Contributors:",
|
||||
"description": "About page text of contributors."
|
||||
}
|
||||
}
|
||||
|
|
@ -252,13 +252,13 @@ browserAction.setRememberPopup = function(tabId, username, password, url, userna
|
|||
browserAction.show(null, {'id': id});
|
||||
|
||||
if (page.settings.showLoginNotifications) {
|
||||
const message = 'Create or modify the credentials by clicking on the extension icon.';
|
||||
const message = tr('rememberCredentialsPopup');
|
||||
const buttons = [
|
||||
{
|
||||
'title': 'Close'
|
||||
'title': tr('popupButtonClose')
|
||||
},
|
||||
{
|
||||
'title': 'Never ask for this page'
|
||||
'title': tr('popupButtonIgnore')
|
||||
}];
|
||||
|
||||
browser.notifications.create({
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ kpxcEvent.onCheckUpdateKeePassXC = function(callback, tab) {
|
|||
};
|
||||
|
||||
kpxcEvent.onUpdateAvailableKeePassXC = function(callback, tab) {
|
||||
callback(keepass.keePassXCUpdateAvailable());
|
||||
callback(page.settings.checkUpdateKeePassXC > 0 ? keepass.keePassXCUpdateAvailable() : false);
|
||||
};
|
||||
|
||||
kpxcEvent.onRemoveCredentialsFromTabInformation = function(callback, tab) {
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ httpAuth.loginOrShowCredentials = function(logins, details, resolve, reject) {
|
|||
});
|
||||
} else {
|
||||
if (page.settings.showNotifications) {
|
||||
showNotification('HTTP authentication with multiple credentials detected. Click on the extension icon to choose the correct one.');
|
||||
showNotification(tr('multipleCredentialsDetected'));
|
||||
}
|
||||
kpxcEvent.onHTTPAuthPopup(null, { 'id': details.tabId }, { 'logins': logins, 'url': details.searchUrl, 'resolve': resolve });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,11 +84,11 @@ browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
|||
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'}
|
||||
{title: tr('contextMenuFillUsernameAndPassword'), action: 'fill_user_pass'},
|
||||
{title: tr('contextMenuFillPassword'), action: 'fill_pass_only'},
|
||||
{title: tr('contextMenuFillTOTP'), action: 'fill_totp'},
|
||||
{title: tr('contextMenuShowPasswordGeneratorIcons'), action: 'activate_password_generator'},
|
||||
{title: tr('contextMenuSaveCredentials'), action: 'remember_credentials'}
|
||||
];
|
||||
|
||||
let menuContexts = ['editable'];
|
||||
|
|
|
|||
|
|
@ -56,22 +56,22 @@ const kpErrors = {
|
|||
NO_LOGINS_FOUND: 15,
|
||||
|
||||
errorMessages : {
|
||||
0: { msg: 'Unknown error' },
|
||||
1: { msg: 'Database not opened' },
|
||||
2: { msg: 'Database hash not received' },
|
||||
3: { msg: 'Client public key not reveiced' },
|
||||
4: { msg: 'Cannot decrypt message' },
|
||||
5: { msg: 'Timeout or not connected to KeePassXC' },
|
||||
6: { msg: 'Action cancelled or denied' },
|
||||
7: { msg: 'Cannot encrypt message or public key not found. Is native messaging or support for your browser enabled in KeePassXC?' },
|
||||
8: { msg: 'KeePassXC association failed, try again.' },
|
||||
9: { msg: 'Key change was not successful.' },
|
||||
10: { msg: 'Encryption key is not recognized' },
|
||||
11: { msg: 'No saved databases found.' },
|
||||
12: { msg: 'Incorrect action.' },
|
||||
13: { msg: 'Empty message received.' },
|
||||
14: { msg: 'No URL provided.' },
|
||||
15: { msg: 'No logins found.' }
|
||||
0: { msg: tr('errorMessageUnknown') },
|
||||
1: { msg: tr('errorMessageDatabaseNotOpened') },
|
||||
2: { msg: tr('errorMessageDatabaseHash') },
|
||||
3: { msg: tr('errorMessageClientPublicKey') },
|
||||
4: { msg: tr('errorMessageDecrypt') },
|
||||
5: { msg: tr('errorMessageTimeout') },
|
||||
6: { msg: tr('errorMessageCanceled') },
|
||||
7: { msg: tr('errorMessageEncrypt') },
|
||||
8: { msg: tr('errorMessageAssociate') },
|
||||
9: { msg: tr('errorMessageKeyExchange') },
|
||||
10: { msg: tr('errorMessageEncryptionKey') },
|
||||
11: { msg: tr('errorMessageSavedDatabases') },
|
||||
12: { msg: tr('errorMessageIncorrectAction') },
|
||||
13: { msg: tr('errorMessageEmptyMessage') },
|
||||
14: { msg: tr('errorMessageNoURL') },
|
||||
15: { msg: tr('errorMessageNoLogins') }
|
||||
},
|
||||
|
||||
getError(errorCode) {
|
||||
|
|
@ -371,10 +371,13 @@ keepass.associate = function(callback, tab) {
|
|||
const key = nacl.util.encodeBase64(keepass.keyPair.publicKey);
|
||||
const nonce = keepass.getNonce();
|
||||
const incrementedNonce = keepass.incrementedNonce(nonce);
|
||||
const idKeyPair = nacl.box.keyPair();
|
||||
const idKey = nacl.util.encodeBase64(idKeyPair.publicKey);
|
||||
|
||||
const messageData = {
|
||||
action: kpAction,
|
||||
key: key
|
||||
key: key,
|
||||
idKey: idKey
|
||||
};
|
||||
|
||||
const request = {
|
||||
|
|
@ -402,7 +405,7 @@ keepass.associate = function(callback, tab) {
|
|||
keepass.handleError(tab, kpErrors.ASSOCIATION_FAILED);
|
||||
}
|
||||
else {
|
||||
keepass.setCryptoKey(id, key); // Save the current public key as id key for the database
|
||||
keepass.setCryptoKey(id, idKey); // Save the new identification public key as id key for the database
|
||||
keepass.associated.value = true;
|
||||
keepass.associated.hash = parsed.hash || 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
const defaultSettings = {
|
||||
checkUpdateKeePassXC: 3,
|
||||
autoCompleteUsernames: true,
|
||||
autoFillAndSend: true,
|
||||
autoFillAndSend: false,
|
||||
usePasswordGenerator: true,
|
||||
autoFillSingleEntry: false,
|
||||
autoRetrieveCredentials: true,
|
||||
|
|
|
|||
4
keepassxc-browser/browser-polyfill.min.js
vendored
4
keepassxc-browser/browser-polyfill.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -90,4 +90,14 @@ var matchPatternToRegExp = function(pattern) {
|
|||
var siteMatch = function(site, url) {
|
||||
const rx = matchPatternToRegExp(site);
|
||||
return url.match(rx);
|
||||
};
|
||||
};
|
||||
|
||||
// Checks if URL has only scheme and host without the last / char.
|
||||
var slashNeededForUrl = function(pattern) {
|
||||
const matchPattern = new RegExp(`^${schemeSegment}://${hostSegment}$`);
|
||||
return matchPattern.exec(pattern);
|
||||
};
|
||||
|
||||
function tr(key, params) {
|
||||
return browser.i18n.getMessage(key, params);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -158,7 +158,12 @@ cipAutocomplete.onBlur = function() {
|
|||
else {
|
||||
const fieldId = cipFields.prepareId(jQuery(this).attr('data-cip-id'));
|
||||
const fields = cipFields.getCombination('username', fieldId);
|
||||
if (_f(fields.password) && _f(fields.password).data('unchanged') !== true && jQuery(this).val() !== '' && _detectedFields > 1) {
|
||||
const fieldValue = jQuery(this).val();
|
||||
|
||||
// Check if the manually inserted value is one of the retrieved credentials
|
||||
let fieldFound = cipAutocomplete.elements.some(e => e.value === fieldValue);
|
||||
|
||||
if (_f(fields.password) && _f(fields.password).data('unchanged') !== true && fieldFound && _detectedFields > 1) {
|
||||
cip.fillInCredentials(fields, true, true);
|
||||
}
|
||||
}
|
||||
|
|
@ -232,7 +237,7 @@ cipPassword.createDialog = function() {
|
|||
.attr('id', 'cip-genpw-textfield-password')
|
||||
.attr('type', 'text')
|
||||
.attr('aria-describedby', 'cip-genpw-quality')
|
||||
.attr('placeholder', 'Generated password')
|
||||
.attr('placeholder', tr('passwordGeneratorPlaceholder'))
|
||||
.addClass('genpw-text ui-widget-content ui-corner-all')
|
||||
.on('change keypress paste textInput input', function() {
|
||||
jQuery('#cip-genpw-btn-clipboard:first').removeClass('btn-success');
|
||||
|
|
@ -241,7 +246,7 @@ cipPassword.createDialog = function() {
|
|||
.addClass('genpw-input-group-addon')
|
||||
.addClass('b2c-add-on')
|
||||
.attr('id', 'cip-genpw-quality')
|
||||
.text('??? Bits');
|
||||
.text(tr('passwordGeneratorBits'));
|
||||
$inputGroup.append($textfieldPassword).append($quality);
|
||||
|
||||
const $checkGroup = jQuery('<div>').addClass('genpw-input-group');
|
||||
|
|
@ -252,7 +257,7 @@ cipPassword.createDialog = function() {
|
|||
const $labelNextField = jQuery('<label>')
|
||||
.append($checkboxNextField)
|
||||
.addClass('cip-genpw-label')
|
||||
.append(' also fill in the next password-field');
|
||||
.append(tr('passwordGeneratorLabel'));
|
||||
$checkGroup.append($labelNextField);
|
||||
|
||||
$inputDiv.append($inputGroup).append($checkGroup);
|
||||
|
|
@ -273,12 +278,12 @@ cipPassword.createDialog = function() {
|
|||
resizable: false,
|
||||
minWidth: 300,
|
||||
minHeight: 80,
|
||||
title: 'Password Generator',
|
||||
title: tr('passwordGeneratorTitle'),
|
||||
classes: {'ui-dialog': 'ui-corner-all'},
|
||||
buttons: {
|
||||
'Generate':
|
||||
{
|
||||
text: 'Generate',
|
||||
text: tr('passwordGeneratorGenerate'),
|
||||
id: 'cip-genpw-btn-generate',
|
||||
click: (e) => {
|
||||
e.preventDefault();
|
||||
|
|
@ -291,7 +296,7 @@ cipPassword.createDialog = function() {
|
|||
},
|
||||
'Copy':
|
||||
{
|
||||
text: 'Copy',
|
||||
text: tr('passwordGeneratorCopy'),
|
||||
id: 'cip-genpw-btn-clipboard',
|
||||
click: (e) => {
|
||||
e.preventDefault();
|
||||
|
|
@ -300,7 +305,7 @@ cipPassword.createDialog = function() {
|
|||
},
|
||||
'Fill & copy':
|
||||
{
|
||||
text: 'Fill & copy',
|
||||
text: tr('passwordGeneratorFillAndCopy'),
|
||||
id: 'cip-genpw-btn-fillin',
|
||||
click: (e) => {
|
||||
e.preventDefault();
|
||||
|
|
@ -315,7 +320,7 @@ cipPassword.createDialog = function() {
|
|||
$password = $password.substring(0, field.attr('maxlength'));
|
||||
jQuery('input#cip-genpw-textfield-password:first').val($password);
|
||||
jQuery('#cip-genpw-btn-clipboard:first').removeClass('b2c-btn-success');
|
||||
const message = 'Error:\nThe generated password is longer than the allowed length!\nIt has been cut to fit the length.\n\nPlease remember the new password!';
|
||||
alert(tr('passwordGeneratorErrorTooLong'));
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -362,7 +367,7 @@ cipPassword.createIcon = function(field) {
|
|||
.addClass('kpxc')
|
||||
.addClass('cip-genpw-icon')
|
||||
.addClass($className)
|
||||
.attr('title', 'Generate password')
|
||||
.attr('title', tr('passwordGeneratorGenerateText'))
|
||||
.css('z-index', '9999')
|
||||
.css('width', $size)
|
||||
.css('height', $size)
|
||||
|
|
@ -446,7 +451,7 @@ cipPassword.callbackGeneratedPassword = function(entries) {
|
|||
}
|
||||
else {
|
||||
if (jQuery('div#cip-genpw-error:first').length === 0) {
|
||||
jQuery('button#cip-genpw-btn-generate:first').after('<div style=\'block\' id=\'cip-genpw-error\'>Cannot receive generated password.<br />Is KeePassXC opened?<br /></div>');
|
||||
jQuery('button#cip-genpw-btn-generate:first').after('<div style=\'block\' id=\'cip-genpw-error\'>' + tr('passwordGeneratorError') + '<br /></div>');
|
||||
jQuery('input#cip-genpw-textfield-password:first').parent().hide();
|
||||
jQuery('input#cip-genpw-checkbox-next-field:first').parent('label').hide();
|
||||
jQuery('button#cip-genpw-btn-generate').hide();
|
||||
|
|
@ -586,13 +591,13 @@ cipDefine.initDescription = function() {
|
|||
const $help = jQuery('<div>').addClass('b2c-chooser-help').attr('id', 'b2c-help');
|
||||
$description.append($help);
|
||||
|
||||
const $btnDismiss = jQuery('<button>').text('Dismiss').attr('id', 'b2c-btn-dismiss')
|
||||
const $btnDismiss = jQuery('<button>').text(tr('defineDismiss')).attr('id', 'b2c-btn-dismiss')
|
||||
.addClass('btn').addClass('btn-danger')
|
||||
.click(function(e) {
|
||||
jQuery('div#b2c-backdrop').remove();
|
||||
jQuery('div#b2c-cipDefine-fields').remove();
|
||||
});
|
||||
const $btnSkip = jQuery('<button>').text('Skip').attr('id', 'b2c-btn-skip')
|
||||
const $btnSkip = jQuery('<button>').text(tr('defineSkip')).attr('id', 'b2c-btn-skip')
|
||||
.addClass('btn').addClass('btn-info')
|
||||
.css('margin-right', '5px')
|
||||
.click(function() {
|
||||
|
|
@ -607,7 +612,7 @@ cipDefine.initDescription = function() {
|
|||
cipDefine.markAllStringFields(jQuery('#b2c-cipDefine-fields'));
|
||||
}
|
||||
});
|
||||
const $btnAgain = jQuery('<button>').text('Again').attr('id', 'b2c-btn-again')
|
||||
const $btnAgain = jQuery('<button>').text(tr('defineAgain')).attr('id', 'b2c-btn-again')
|
||||
.addClass('btn').addClass('btn-warning')
|
||||
.css('margin-right', '5px')
|
||||
.click(function(e) {
|
||||
|
|
@ -616,7 +621,7 @@ cipDefine.initDescription = function() {
|
|||
cipDefine.markAllUsernameFields(jQuery('#b2c-cipDefine-fields'));
|
||||
})
|
||||
.hide();
|
||||
const $btnConfirm = jQuery('<button>').text('Confirm').attr('id', 'b2c-btn-confirm')
|
||||
const $btnConfirm = jQuery('<button>').text(tr('defineConfirm')).attr('id', 'b2c-btn-confirm')
|
||||
.addClass('btn').addClass('btn-primary')
|
||||
.css('margin-right', '15px')
|
||||
.click(function(e) {
|
||||
|
|
@ -661,10 +666,10 @@ cipDefine.initDescription = function() {
|
|||
|
||||
const location = cip.getDocumentLocation();
|
||||
if (cip.settings['defined-custom-fields'] && cip.settings['defined-custom-fields'][location]) {
|
||||
const $p = jQuery('<p>').html('For this page credential fields are already selected and will be overwritten.<br />');
|
||||
const $p = jQuery('<p>').html(tr('defineAlreadySelected') + '<br />');
|
||||
const $btnDiscard = jQuery('<button>')
|
||||
.attr('id', 'btn-warning')
|
||||
.text('Discard selection')
|
||||
.text(tr('defineDiscard'))
|
||||
.css('margin-top', '5px')
|
||||
.addClass('btn')
|
||||
.addClass('btn-sm')
|
||||
|
|
@ -709,7 +714,7 @@ cipDefine.isFieldSelected = function($cipId) {
|
|||
cipDefine.markAllUsernameFields = function($chooser) {
|
||||
cipDefine.eventFieldClick = function(e) {
|
||||
cipDefine.selection.username = jQuery(this).data('cip-id');
|
||||
jQuery(this).addClass('b2c-fixed-username-field').text('Username').unbind('click');
|
||||
jQuery(this).addClass('b2c-fixed-username-field').text(tr('username')).unbind('click');
|
||||
cipDefine.prepareStep2();
|
||||
cipDefine.markAllPasswordFields(jQuery('#b2c-cipDefine-fields'));
|
||||
};
|
||||
|
|
@ -719,7 +724,7 @@ cipDefine.markAllUsernameFields = function($chooser) {
|
|||
cipDefine.markAllPasswordFields = function($chooser) {
|
||||
cipDefine.eventFieldClick = function(e) {
|
||||
cipDefine.selection.password = jQuery(this).data('cip-id');
|
||||
jQuery(this).addClass('b2c-fixed-password-field').text('Password').unbind('click');
|
||||
jQuery(this).addClass('b2c-fixed-password-field').text(tr('password')).unbind('click');
|
||||
cipDefine.prepareStep3();
|
||||
cipDefine.markAllStringFields(jQuery('#b2c-cipDefine-fields'));
|
||||
};
|
||||
|
|
@ -730,7 +735,7 @@ cipDefine.markAllStringFields = function($chooser) {
|
|||
cipDefine.eventFieldClick = function(e) {
|
||||
cipDefine.selection.fields[jQuery(this).data('cip-id')] = true;
|
||||
const count = Object.keys(cipDefine.selection.fields).length;
|
||||
jQuery(this).addClass('b2c-fixed-string-field').text('String field #' + String(count)).unbind('click');
|
||||
jQuery(this).addClass('b2c-fixed-string-field').text(tr('defineStringField') + String(count)).unbind('click');
|
||||
jQuery('button#b2c-btn-confirm:first').addClass('b2c-btn-primary').attr('disabled', false);
|
||||
};
|
||||
cipDefine.markFields($chooser, cipFields.inputQueryPattern + ', select');
|
||||
|
|
@ -761,7 +766,7 @@ cipDefine.prepareStep1 = function() {
|
|||
jQuery('div#b2c-cipDefine-fields').removeData('username');
|
||||
jQuery('div#b2c-cipDefine-fields').removeData('password');
|
||||
jQuery('div.b2c-fixed-field', jQuery('div#b2c-cipDefine-fields')).remove();
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text('1. Choose a username field');
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text(tr('defineChooseUsername'));
|
||||
jQuery('button#b2c-btn-skip:first').data('step', '1').show();
|
||||
jQuery('button#b2c-btn-confirm:first').hide();
|
||||
jQuery('button#b2c-btn-again:first').hide();
|
||||
|
|
@ -770,7 +775,7 @@ cipDefine.prepareStep1 = function() {
|
|||
cipDefine.prepareStep2 = function() {
|
||||
jQuery('div#b2c-help').text('').css('margin-bottom', 0);
|
||||
jQuery('div.b2c-fixed-field:not(.b2c-fixed-username-field)', jQuery('div#b2c-cipDefine-fields')).remove();
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text('2. Now choose a password field');
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text(tr('defineChoosePassword'));
|
||||
jQuery('button#b2c-btn-skip:first').data('step', '2');
|
||||
jQuery('button#b2c-btn-again:first').show();
|
||||
};
|
||||
|
|
@ -780,11 +785,11 @@ cipDefine.prepareStep3 = function() {
|
|||
jQuery('button#b2c-btn-confirm:first').removeClass('b2c-btn-primary').attr('disabled', true);
|
||||
}
|
||||
|
||||
jQuery('div#b2c-help').html('Please confirm your selection or choose more fields as <em>String fields</em>.').css('margin-bottom', '5px');
|
||||
jQuery('div#b2c-help').html(tr('defineHelpText')).css('margin-bottom', '5px');
|
||||
jQuery('div.b2c-fixed-field:not(.b2c-fixed-password-field,.b2c-fixed-username-field)', jQuery('div#b2c-cipDefine-fields')).remove();
|
||||
jQuery('button#b2c-btn-confirm:first').show();
|
||||
jQuery('button#b2c-btn-skip:first').data('step', '3').hide();
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text('3. Confirm selection');
|
||||
jQuery('div:first', jQuery('div#b2c-cipDefine-description')).text(tr('defineConfirmSelection'));
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -902,7 +907,7 @@ cipFields.isVisible = function(field) {
|
|||
}
|
||||
|
||||
// Check element position and size
|
||||
if (rect.x < 0 || rect.y < 0 || rect.width < 16 || rect.height < 16) {
|
||||
if (rect.x < 0 || rect.y < 0 || rect.width < 8 || rect.height < 8) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1234,17 +1239,27 @@ cipObserverHelper.ignoredNode = function(target) {
|
|||
};
|
||||
|
||||
cipObserverHelper.getInputs = function(target) {
|
||||
// Ignores target element if it's not an element node
|
||||
if (cipObserverHelper.ignoredNode(target)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const input = target.getElementsByTagName('input');
|
||||
if (input.length === 0 || input.length > _maximumInputs) {
|
||||
// Filter out any input fields with type 'hidden' right away
|
||||
let inputFields = [];
|
||||
Array.from(target.getElementsByTagName('input')).forEach(e => {
|
||||
if (e.type !== 'hidden') {
|
||||
inputFields.push(e);
|
||||
}
|
||||
});
|
||||
|
||||
// Do not allow more visible inputs than _maximumInputs (default value: 100)
|
||||
if (inputFields.length === 0 || inputFields.length > _maximumInputs) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Only include input fields that match with cipObserverHelper.inputTypes
|
||||
let inputs = [];
|
||||
for (const i of input) {
|
||||
for (const i of inputFields) {
|
||||
if (cipObserverHelper.inputTypes.includes(i.getAttribute('type'))) {
|
||||
inputs.push(i);
|
||||
}
|
||||
|
|
@ -1257,16 +1272,14 @@ cipObserverHelper.getId = function(target) {
|
|||
};
|
||||
|
||||
cipObserverHelper.ignoredElement = function(target) {
|
||||
// Ignore SVG elements
|
||||
if (target.nodeName === 'svg' ||
|
||||
target.nodeName === 'g' ||
|
||||
(target.parentNode &&
|
||||
(target.parentNode.nodeName === 'svg' || target.parentNode.nodeName === 'g'))) {
|
||||
// Ignore elements that do not have a className (including SVG)
|
||||
if (typeof target.className !== 'string') {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Ignore KeePassXC-Browser classes
|
||||
if (target.className && (target.className.includes('kpxc') || target.className.includes('ui-helper'))) {
|
||||
if (target.className && target.className !== undefined &&
|
||||
(target.className.includes('kpxc') || target.className.includes('ui-helper'))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1566,7 +1579,7 @@ cip.preparePageForMultipleCredentials = function(credentials) {
|
|||
cipAutocomplete.elements = [];
|
||||
let visibleLogin;
|
||||
for (let i = 0; i < credentials.length; i++) {
|
||||
visibleLogin = (credentials[i].login.length > 0) ? credentials[i].login : '- no username -';
|
||||
visibleLogin = (credentials[i].login.length > 0) ? credentials[i].login : tr('credentialsNoUsername');
|
||||
usernames.push(visibleLogin + ' (' + credentials[i].name + ')');
|
||||
const item = {
|
||||
label: visibleLogin + ' (' + credentials[i].name + ')',
|
||||
|
|
@ -1704,7 +1717,7 @@ cip.fillInFromActiveElement = function(suppressWarnings, passOnly = false) {
|
|||
|
||||
if (passOnly) {
|
||||
if (!_f(combination.password)) {
|
||||
const message = 'Error:\nUnable to find a password field';
|
||||
const message = tr('fieldsNoPasswordField');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -1795,7 +1808,7 @@ cip.setValueWithChange = function(field, value) {
|
|||
cip.fillIn = function(combination, onlyPassword, suppressWarnings) {
|
||||
// no credentials available
|
||||
if (cip.credentials.length === 0 && !suppressWarnings) {
|
||||
const message = 'Error:\nNo logins found.';
|
||||
const message = tr('credentialsNoLoginsFound');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -1809,7 +1822,7 @@ cip.fillIn = function(combination, onlyPassword, suppressWarnings) {
|
|||
// exactly one pair of credentials available
|
||||
if (cip.credentials.length === 1) {
|
||||
let filledIn = false;
|
||||
if (uField && !onlyPassword) {
|
||||
if (uField && (!onlyPassword || _singleInputEnabledForPage)) {
|
||||
cip.setValueWithChange(uField, cip.credentials[0].login);
|
||||
browser.runtime.sendMessage({
|
||||
action: 'page_set_login_id', args: [0]
|
||||
|
|
@ -1834,7 +1847,7 @@ cip.fillIn = function(combination, onlyPassword, suppressWarnings) {
|
|||
|
||||
if (!filledIn) {
|
||||
if (!suppressWarnings) {
|
||||
const message = 'Error:\nCannot find fields to fill in.';
|
||||
const message = tr('fieldsFill');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -1870,7 +1883,7 @@ cip.fillIn = function(combination, onlyPassword, suppressWarnings) {
|
|||
|
||||
if (!filledIn) {
|
||||
if (!suppressWarnings) {
|
||||
const message = 'Error:\nCannot find fields to fill in.';
|
||||
const message = tr('fieldsFill');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -1932,7 +1945,7 @@ cip.fillIn = function(combination, onlyPassword, suppressWarnings) {
|
|||
}
|
||||
else if (countPasswords < 1) {
|
||||
if (!suppressWarnings) {
|
||||
const message = 'Error:\nNo credentials for given username found.';
|
||||
const message = tr('credentialsNoUsernameFound');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -1981,7 +1994,7 @@ cip.contextMenuRememberCredentials = function() {
|
|||
}
|
||||
|
||||
if (!cip.rememberCredentials(usernameValue, passwordValue)) {
|
||||
const message = 'Error:\nCould not detect changed credentials.';
|
||||
const message = tr('rememberNothingChanged');
|
||||
browser.runtime.sendMessage({
|
||||
action: 'show_notification',
|
||||
args: [message]
|
||||
|
|
@ -2055,9 +2068,13 @@ cip.ignoreSite = function(sites) {
|
|||
return;
|
||||
}
|
||||
|
||||
const site = sites[0];
|
||||
let site = sites[0];
|
||||
cip.initializeSitePreferences();
|
||||
|
||||
if (slashNeededForUrl(site)) {
|
||||
site += '/';
|
||||
}
|
||||
|
||||
// Check if the site already exists
|
||||
let siteExists = false;
|
||||
for (const existingSite of cip.settings['sitePreferences']) {
|
||||
|
|
|
|||
|
|
@ -1,109 +1,110 @@
|
|||
{
|
||||
"manifest_version": 2,
|
||||
"name": "KeePassXC-Browser",
|
||||
"version": "1.2.0",
|
||||
"description": "KeePassXC integration for modern web browsers",
|
||||
"author": "KeePassXC Team",
|
||||
"icons": {
|
||||
"16": "icons/keepassxc_16x16.png",
|
||||
"48": "icons/keepassxc_48x48.png",
|
||||
"128": "icons/keepassxc_128x128.png"
|
||||
},
|
||||
"manifest_version": 2,
|
||||
"name": "KeePassXC-Browser",
|
||||
"version": "1.3.0",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"author": "KeePassXC Team",
|
||||
"icons": {
|
||||
"16": "icons/keepassxc_16x16.png",
|
||||
"48": "icons/keepassxc_48x48.png",
|
||||
"128": "icons/keepassxc_128x128.png"
|
||||
},
|
||||
|
||||
"browser_action": {
|
||||
"default_icon": {
|
||||
"19": "icons/keepassxc_19x19.png",
|
||||
"38": "icons/keepassxc_38x38.png"
|
||||
},
|
||||
"default_title": "KeePassXC-Browser",
|
||||
"default_popup": "popups/popup.html"
|
||||
},
|
||||
"options_ui": {
|
||||
"page": "options/options.html",
|
||||
"open_in_tab": true
|
||||
},
|
||||
"background": {
|
||||
"scripts": [
|
||||
"browser-polyfill.min.js",
|
||||
"global.js",
|
||||
"background/nacl.min.js",
|
||||
"background/nacl-util.min.js",
|
||||
"background/keepass.js",
|
||||
"background/httpauth.js",
|
||||
"background/browserAction.js",
|
||||
"background/page.js",
|
||||
"background/event.js",
|
||||
"background/init.js"
|
||||
]
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": [
|
||||
"<all_urls>"
|
||||
],
|
||||
"exclude_matches": [
|
||||
"*://*/*.xml",
|
||||
"*://*/*.xsd"
|
||||
],
|
||||
"js": [
|
||||
"browser-polyfill.min.js",
|
||||
"global.js",
|
||||
"jquery-3.3.1.min.js",
|
||||
"jquery-ui.min.js",
|
||||
"keepassxc-browser.js"
|
||||
],
|
||||
"css": [
|
||||
"jquery-ui.min.css",
|
||||
"keepassxc-browser.css"
|
||||
],
|
||||
"run_at": "document_idle",
|
||||
"all_frames": true
|
||||
}
|
||||
],
|
||||
"commands": {
|
||||
"fill-username-password": {
|
||||
"description": "Insert username + password",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Shift+U",
|
||||
"mac": "MacCtrl+Shift+U"
|
||||
}
|
||||
},
|
||||
"fill-password": {
|
||||
"description": "Insert a password",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Shift+I",
|
||||
"mac": "MacCtrl+Shift+I"
|
||||
}
|
||||
},
|
||||
"browser_action": {
|
||||
"default_icon": {
|
||||
"19": "icons/keepassxc_19x19.png",
|
||||
"38": "icons/keepassxc_38x38.png"
|
||||
},
|
||||
"default_title": "KeePassXC-Browser",
|
||||
"default_popup": "popups/popup.html"
|
||||
},
|
||||
"options_ui": {
|
||||
"page": "options/options.html",
|
||||
"open_in_tab": true
|
||||
},
|
||||
"background": {
|
||||
"scripts": [
|
||||
"browser-polyfill.min.js",
|
||||
"global.js",
|
||||
"background/nacl.min.js",
|
||||
"background/nacl-util.min.js",
|
||||
"background/keepass.js",
|
||||
"background/httpauth.js",
|
||||
"background/browserAction.js",
|
||||
"background/page.js",
|
||||
"background/event.js",
|
||||
"background/init.js"
|
||||
]
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": [
|
||||
"<all_urls>"
|
||||
],
|
||||
"exclude_matches": [
|
||||
"*://*/*.xml",
|
||||
"*://*/*.xsd"
|
||||
],
|
||||
"js": [
|
||||
"browser-polyfill.min.js",
|
||||
"global.js",
|
||||
"jquery-3.3.1.min.js",
|
||||
"jquery-ui.min.js",
|
||||
"keepassxc-browser.js"
|
||||
],
|
||||
"css": [
|
||||
"jquery-ui.min.css",
|
||||
"keepassxc-browser.css"
|
||||
],
|
||||
"run_at": "document_idle",
|
||||
"all_frames": true
|
||||
}
|
||||
],
|
||||
"commands": {
|
||||
"fill-username-password": {
|
||||
"description": "__MSG_contextMenuFillUsernameAndPassword__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Shift+U",
|
||||
"mac": "MacCtrl+Shift+U"
|
||||
}
|
||||
},
|
||||
"fill-password": {
|
||||
"description": "__MSG_contextMenuFillPassword__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Shift+I",
|
||||
"mac": "MacCtrl+Shift+I"
|
||||
}
|
||||
},
|
||||
"fill-totp": {
|
||||
"description": "Insert a TOTP",
|
||||
"description": "__MSG_contextMenuFillTOTP__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Shift+T",
|
||||
"mac": "MacCtrl+Shift+T"
|
||||
}
|
||||
}
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
"icons/key.png"
|
||||
],
|
||||
"permissions": [
|
||||
"activeTab",
|
||||
"contextMenus",
|
||||
"clipboardWrite",
|
||||
"nativeMessaging",
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
"icons/key.png"
|
||||
],
|
||||
"permissions": [
|
||||
"activeTab",
|
||||
"contextMenus",
|
||||
"clipboardWrite",
|
||||
"nativeMessaging",
|
||||
"notifications",
|
||||
"storage",
|
||||
"tabs",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"https://*/*",
|
||||
"http://*/*",
|
||||
"https://api.github.com/"
|
||||
],
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "keepassxc-browser@keepassxc.org",
|
||||
"strict_min_version": "52.0"
|
||||
}
|
||||
}
|
||||
"storage",
|
||||
"tabs",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"https://*/*",
|
||||
"http://*/*",
|
||||
"https://api.github.com/"
|
||||
],
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "keepassxc-browser@keepassxc.org",
|
||||
"strict_min_version": "52.0"
|
||||
}
|
||||
},
|
||||
"default_locale": "en"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Settings | KeePassXC-Browser</title>
|
||||
<title data-i18n="optionsTitle"></title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="options.css" />
|
||||
|
|
@ -17,71 +17,72 @@
|
|||
|
||||
<nav class="navbar navbar-default">
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="active"><a href="#general-settings">General</a></li>
|
||||
<li><a href="#connected-databases">Connected Databases</a></li>
|
||||
<li><a href="#custom-fields">Custom credential fields</a></li>
|
||||
<li><a href="#site-preferences">Site preferences</a></li>
|
||||
<li><a href="#about">About</a></li>
|
||||
<li class="active"><a href="#general-settings"><span data-i18n="optionsMenuGeneral"/></a></li>
|
||||
<li><a href="#connected-databases"><span data-i18n="optionsMenuConnectedDatabases"/></a></li>
|
||||
<li><a href="#custom-fields"><span data-i18n="optionsMenuCustomFields"/></a></li>
|
||||
<li><a href="#site-preferences"><span data-i18n="optionsMenuSitePreferences"></a></li>
|
||||
<li><a href="#about"><span data-i18n="optionsMenuAbout"/></a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- General Settings -->
|
||||
<div class="tab" id="tab-general-settings">
|
||||
<h2>General settings</h2>
|
||||
<h2 data-i18n="optionsGeneralSettingsTab"></h2>
|
||||
<hr />
|
||||
<h3 data-i18n="optionsKeyboardShortcutsHeader"></h3>
|
||||
<p>
|
||||
If you just want to insert username + password into the fields where your focus is, press <code><span id="mac-user-shortcut">Ctrl + Shift + U</span><span id="default-user-shortcut">Alt + Shift + U</span></code>.
|
||||
<br />
|
||||
If you only want to insert the password, just press <code><span id="mac-pass-shortcut">Ctrl + Shift + I</span><span id="default-pass-shortcut">Alt + Shift + I</span></code>.
|
||||
<span id="chrome-only">You can customize these shortcuts on <code>chrome://extensions/configureCommands</code> page</span>
|
||||
<span data-i18n="contextMenuFillUsernameAndPassword"></span>: <span id="fill-username-password-shortcut">error</span><br />
|
||||
<span data-i18n="contextMenuFillPassword"></span>: <span id="fill-password-shortcut">error</span><br />
|
||||
<span data-i18n="contextMenuFillTOTP"></span>: <span id="fill-totp-shortcut">error</span>
|
||||
</p>
|
||||
<p id="chrome-only"><button class="btn btn-sm btn-primary" id="configureCommands" type="button"><span class="glyphicon glyphicon-cog"></span><span data-i18n="optionsButtonConfigureShortcuts"/></button></p>
|
||||
<p>
|
||||
<div class="form-group">
|
||||
<label for="blinkTimeout">Blink Time:</label>
|
||||
<label for="blinkTimeout" data-i18n="optionsLabelBlinkTime"></label>
|
||||
<div class="control-group">
|
||||
<div class="input-append">
|
||||
<input type="number" id="blinkTimeout" placeholder="7500" value="7500" min="-1"/>
|
||||
<button class="btn btn-sm btn-primary" id="blinkTimeoutButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span> Save</button>
|
||||
<button class="btn btn-sm btn-primary" id="blinkTimeoutButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span><span data-i18n="optionsButtonSave"/></button>
|
||||
</div>
|
||||
</div>
|
||||
<span class="help-inline">
|
||||
What is the maximum time (ms) the icon should blink after detecting new credentials
|
||||
<span data-i18n="optionsBlinkTimeHelpText"></span>
|
||||
<br />
|
||||
Default: 7500, Infinite: -1
|
||||
<span data-i18n="optionsDefault" i18n-placeholder="7500"></span>, <span data-i18n="optionsInfinite" i18n-placeholder="-1"></span>
|
||||
</span>
|
||||
</div>
|
||||
</p>
|
||||
<p>
|
||||
<div class="form-group">
|
||||
<label for="blinkMinTimeout">Redirect Offset:</label>
|
||||
<label for="blinkMinTimeout" data-i18n="optionsLabelRedirectOffset"></label>
|
||||
<div class="control-group">
|
||||
<div class="input-append">
|
||||
<input type="number" id="blinkMinTimeout" placeholder="2000" value="2000" min="-1"/>
|
||||
<button class="btn btn-sm btn-primary" id="blinkMinTimeoutButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span> Save</button>
|
||||
<button class="btn btn-sm btn-primary" id="blinkMinTimeoutButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span><span data-i18n="optionsButtonSave"/></button>
|
||||
</div>
|
||||
</div>
|
||||
<span class="help-inline">
|
||||
What is the minimum time (ms) the icon should blink before deactivating due to page redirects.
|
||||
<span data-i18n="optionsRedirectOffsetHelpText"></span>
|
||||
<br />
|
||||
-1 to only use <i>Blink Time</i> ignoring Redirect Allowance (old behavior)
|
||||
<span data-i18n="optionsRedirectOffsetHelpTextSecond"></span>
|
||||
<br />
|
||||
Default: -1, Recommended: 2000
|
||||
<span data-i18n="optionsDefault" i18n-placeholder="-1"></span>, <span data-i18n="optionsRecommended" i18n-placeholder="2000"></span>
|
||||
</span>
|
||||
</div>
|
||||
</p>
|
||||
<p>
|
||||
<div class="form-group">
|
||||
<label for="allowedRedirect">Redirect Allowance:</label>
|
||||
<label for="allowedRedirect" data-i18n="optionsLabelRedirectAllowance"></label>
|
||||
<div class="control-group">
|
||||
<div class="input-append">
|
||||
<input type="number" id="allowedRedirect" placeholder="1" value="1" min="1"/>
|
||||
<button class="btn btn-sm btn-primary" id="allowedRedirectButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span> Save</button>
|
||||
<button class="btn btn-sm btn-primary" id="allowedRedirectButton" type="button"><span class="glyphicon glyphicon-floppy-disk"></span><span data-i18n="optionsButtonSave"/></button>
|
||||
</div>
|
||||
</div>
|
||||
<span class="help-inline">
|
||||
How many pages should the tab cycle through after the redirect offset before deactivating the icon
|
||||
<span data-i18n="optionsRedirectAllowanceHelpText"></span>
|
||||
<br />
|
||||
Default: 1
|
||||
<span data-i18n="optionsDefault"></span>1
|
||||
</span>
|
||||
</div>
|
||||
</p>
|
||||
|
|
@ -89,53 +90,53 @@
|
|||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="usePasswordGenerator" value="true" /> Activate password generator.
|
||||
<input type="checkbox" name="usePasswordGenerator" value="true"/><span data-i18n="optionsCheckboxUsePasswordGenerator"/>
|
||||
</label>
|
||||
<span class="help-block">
|
||||
For all password-fields there will be an icon added to generate a new password.
|
||||
<span data-i18n="optionsUsePasswordGeneratorHelpText"></span>
|
||||
<br />
|
||||
It is generated by KeePassXC with the profile for automatically generated passwords for new entries.</span>
|
||||
<span data-i18n="optionsUsePasswordGeneratorHelpTextSecond"></span></span>
|
||||
</div>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="autoRetrieveCredentials" value="true" /> Automatically retrieve credentials.
|
||||
<input type="checkbox" name="autoRetrieveCredentials" value="true" /><span data-i18n="optionsCheckboxAutoRetrieveCredentials"/>
|
||||
</label>
|
||||
<span class="help-block">KeePassXC-Browser will immediately retrieve the credentials when the tab is activated.</span>
|
||||
<span class="help-block" data-i18n="optionsAutoRetrieveCredentialsHelpText"></span>
|
||||
</div>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="autoFillSingleEntry" value="false" /> Automatically fill-in single credentials entry.
|
||||
<input type="checkbox" name="autoFillSingleEntry" value="false" /><span data-i18n="optionsCheckboxAutoFillSingleEntry"/>
|
||||
</label>
|
||||
<span class="help-block">If KeePassXC-Browser does only receive a single entry from KeePassXC it automatically fills this credentials into the found credential fields.</span>
|
||||
<span class="bg-danger">Warning! Using auto-fill is not safe. Use at your own risk.</span>
|
||||
<span class="help-block" data-i18n="optionsAutoFillSingleEntryHelpText"></span>
|
||||
<span class="bg-danger" data-i18n="optionsAutoFillSingleEntryWarning"></span>
|
||||
</div>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="autoCompleteUsernames" value="true" /> Activate autocomplete for username fields.
|
||||
<input type="checkbox" name="autoCompleteUsernames" value="true" /><span data-i18n="optionsCheckboxAutoCompleteUsernames"/>
|
||||
</label>
|
||||
<span class="help-block">For all username fields on a page a dropdown list appears which contains all available credentials.</span>
|
||||
<span class="help-block" data-i18n="optionsAutocompleteUsernamesHelpText"></span>
|
||||
</div>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="showNotifications" value="true" /> Show notifications.
|
||||
<input type="checkbox" name="showNotifications" value="true" /><span data-i18n="optionsCheckboxShowNotifications"/>
|
||||
</label>
|
||||
<span class="help-block">Show notifications for errors and when user interaction is required.</span>
|
||||
<span class="help-block" data-i18n="optionsShowNotificationsHelpText"></span>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="showLoginNotifications" value="true" /> Show a notification when new credentials can be saved to the database.
|
||||
<input type="checkbox" name="showLoginNotifications" value="true" /><span data-i18n="optionsCheckboxShowLoginNotifications"/>
|
||||
</label>
|
||||
</div>
|
||||
</p>
|
||||
|
|
@ -143,44 +144,43 @@
|
|||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="saveDomainOnly" value="true" /> Save domain only.
|
||||
<input type="checkbox" name="saveDomainOnly" value="true" /><span data-i18n="optionsSaveDomainOnly"/>
|
||||
</label>
|
||||
<span class="help-block">When saving new credentials save only the domain instead of full URL.</span>
|
||||
<span class="help-block" data-i18n="optionsSaveDomainOnlyHelpText"></span>
|
||||
</div>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
Check for updates of KeePassXC:
|
||||
<br />
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="3" /> every 3 days</label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="7" /> every week</label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="30" /> every month</label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="0" /> never</label>
|
||||
<div data-i18n="optionsRadioText"></div>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="3" checked="true"/><span data-i18n="optionsRadioThreeDays"/></label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="7" /><span data-i18n="optionsRadioWeek"/></label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="30" /><span data-i18n="optionsRadioMonth"/></label>
|
||||
<label class="radio-inline"><input type="radio" name="checkUpdateKeePassXC" value="0" /><span data-i18n="optionsRadioNever"/></label>
|
||||
</p>
|
||||
<div class="help-block kphVersion">
|
||||
KeePassXC-Browser needs KeePassXC to retrieve credentials.
|
||||
<span data-i18n="optionsVersionInfoText"></span>
|
||||
<br />
|
||||
You can download the latest stable version from here: <a target="_blank" href="https://keepassxc.org/">https://keepassxc.org/</a>
|
||||
<span data-i18n="optionsVersionDownload" i18n-placeholder="<a target='_blank' href='https://keepassxc.org/'>https://keepassxc.org/</a>"></span>
|
||||
<br />
|
||||
<br />
|
||||
<div>
|
||||
You are running KeePassXC version: <em class="yourVersion"></em>
|
||||
<span data-i18n="optionsVersionRunning" i18n-placeholder="<em class='yourVersion'></em>"></span>
|
||||
</div>
|
||||
<div>
|
||||
Latest available version of KeePassXC: <em class="latestVersion"></em>
|
||||
<button class="btn btn-sm btn-primary checkUpdateKeePassXC"><span class="glyphicon glyphicon-refresh"></span> Check for updates</button>
|
||||
<span data-i18n="optionsLatestVersion" i18n-placeholder="<em class='latestVersion'></em>"></span>
|
||||
<button class="btn btn-sm btn-primary checkUpdateKeePassXC"><span class="glyphicon glyphicon-refresh"></span><span data-i18n="optionsButtonUpdate"/></button>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<p>
|
||||
<div class="checkbox">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="autoFillAndSend" value="1" /> Auto fill HTTP Auth dialogs and send them.
|
||||
<input type="checkbox" name="autoFillAndSend" value="0" /><span data-i18n="optionsCheckboxAutoFillAndSend"/>
|
||||
</label>
|
||||
<span class="help-block">
|
||||
If credentials are found for a page and the login-type is an HTTP Auth request, KeePassXC-Browser tries to login with the first given credentials.
|
||||
<span data-i18n="optionsAutoFillAndSendHelpText"></span>
|
||||
<br />
|
||||
An HTTP Auth dialog looks like this:
|
||||
<span data-i18n="optionsAutoFillAndSendHelpTextSecond"></span>
|
||||
</span>
|
||||
</div>
|
||||
<img src="/options/http-auth-dialog.png" alt="http-auth-dialog" />
|
||||
|
|
@ -189,36 +189,34 @@
|
|||
|
||||
<!-- Connected Databases -->
|
||||
<div class="tab" id="tab-connected-databases">
|
||||
<h2>Connected databases</h2>
|
||||
<h2 data-i18n="optionsConnectedDatabasesTab"></h2>
|
||||
<hr />
|
||||
<p>
|
||||
The following KeePassXC databases are connected to KeePassXC-Browser.
|
||||
</p>
|
||||
<p data-i18n="optionsConnectedDatabasesText"/>
|
||||
<table class="table table-striped table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Identifier</th>
|
||||
<th>Key</th>
|
||||
<th>Last used</th>
|
||||
<th>Created</th>
|
||||
<th>Delete</th>
|
||||
<th><span data-i18n="optionsDatabaseIdentifier"></span></th>
|
||||
<th><span data-i18n="optionsDatabaseKey"></span></th>
|
||||
<th><span data-i18n="optionsDatabaseLastUsed"></span></th>
|
||||
<th><span data-i18n="optionsDatabaseCreated"></span></th>
|
||||
<th><span data-i18n="optionsDatabaseDelete"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="empty">
|
||||
<td colspan="5">No connected databases found.</td>
|
||||
<td colspan="5"><span data-i18n="optionsConnectedDatabasesNotFound"></span></td>
|
||||
</tr>
|
||||
<tr class="clone">
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="last-used"></td>
|
||||
<td class="created"></td>
|
||||
<td><button class="btn delete btn-danger"><span class="glyphicon glyphicon-remove-sign"></span> Remove</button></td>
|
||||
<td><button class="btn delete btn-danger"><span class="glyphicon glyphicon-remove-sign"></span><span data-i18n="optionsButtonRemove"></span></button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div style="text-align: right">
|
||||
<button id="connect-button" class="btn btn-primary"><span class="glyphicon glyphicon-link"></span> Connect</button>
|
||||
<button id="connect-button" class="btn btn-primary"><span class="glyphicon glyphicon-link"></span><span data-i18n="optionsButtonConnect"></span></button>
|
||||
</div>
|
||||
|
||||
<div id="dialogDeleteConnectedDatabase" class="modal fade" tabindex="-1" role="dialog">
|
||||
|
|
@ -226,15 +224,16 @@
|
|||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 class="modal-title" id="myModalLabel">Remove identifier from database list?</h3>
|
||||
<h3 class="modal-title" id="myModalLabel" data-i18n="optionsDatabasesRemoveIdentifier"></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>Do you really want to remove the identifier <span class="bold"></span> from the database list?</p>
|
||||
<p class="help-block">You can reconnect your database at any time.</p>
|
||||
<p data-i18n="optionsDatabasesRemoveIdentifierConfirmFirst"></p>
|
||||
<span class="bold"></span>
|
||||
<p class="help-block" data-i18n="optionsDatabasesRemoveIdentifierConfirmSecond"></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true"><span class="glyphicon glyphicon-remove"></span> Cancel</button>
|
||||
<button class="btn yes btn-primary"><span class="glyphicon glyphicon-ok"></span> Yes, remove now</button>
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true"><span class="glyphicon glyphicon-remove"></span><span data-i18n="optionsButtonCancel"></span></button>
|
||||
<button class="btn yes btn-primary"><span class="glyphicon glyphicon-ok"></span><span data-i18n="optionsButtonRemoveNow"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -243,29 +242,29 @@
|
|||
|
||||
<!-- Custom credential fields -->
|
||||
<div class="tab" id="tab-custom-fields">
|
||||
<h2>Custom credential fields</h2>
|
||||
<h2 data-i18n="optionsCustomFieldsTab"></h2>
|
||||
<hr />
|
||||
<p>
|
||||
If KeePassXC-Browser detects the wrong credential fields, you are able to specify the correct fields by yourself.
|
||||
<span data-i18n="optionsCustomFieldsTabHelpTextFirst"></span>
|
||||
<br />
|
||||
Go to the page and click on the KeePassXC-Browser-Icon, now select <em>Choose custom credential fields for this page</em>.
|
||||
<span data-i18n="optionsCustomFieldsTabHelpTextSecond"></span><em><span data-i18n="popupChooseCredentialsText"></span></em>.
|
||||
<br />
|
||||
On this page you can manage saved custom credential fields.
|
||||
<span data-i18n="optionsCustomFieldsTabHelpTextThird"></span>
|
||||
</p>
|
||||
<table class="table table-striped table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Page URL</th>
|
||||
<th>Delete</th>
|
||||
<th><span data-i18n="optionsColumnPageURL"></span></th>
|
||||
<th><span data-i18n="optionsColumnDelete"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="empty">
|
||||
<td colspan="2">No saved custom credential fields found.</td>
|
||||
<td colspan="2"><span data-i18n="optionsCustomFieldsNotFound"></span></td>
|
||||
</tr>
|
||||
<tr class="clone">
|
||||
<td></td>
|
||||
<td><button class="btn delete btn-danger btn"><span class="glyphicon glyphicon-remove-sign"></span> Remove</button></td>
|
||||
<td><button class="btn delete btn-danger btn"><span class="glyphicon glyphicon-remove-sign"></span><span data-i18n="optionsButtonRemove"></span></button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -274,15 +273,15 @@
|
|||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 id="myModalLabel">Remove saved custom credential fields?</h3>
|
||||
<h3 id="myModalLabel" data-i18n="optionsCustomFieldsRemove"></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>DDo you really want to remove the saved custom credential fields on the page: <strong></strong>?</p>
|
||||
<p class="help-block">KeePassXC-Browser will automatically detect the credential fields next time you visit this page.</p>
|
||||
<p><span data-i18n="optionsCustomFieldsConfirmation" i18n-placeholder="<strong></strong>"></span></p>
|
||||
<p class="help-block" data-i18n="optionsCustomFieldsConfirmationHelpText"></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
|
||||
<button class="btn yes btn-primary">Yes, remove now</button>
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true"><span class="glyphicon glyphicon-remove"></span><span data-i18n="optionsButtonCancel"></span></button>
|
||||
<button class="btn yes btn-primary"><span class="glyphicon glyphicon-ok"></span><span data-i18n="optionsButtonRemoveNow"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -291,24 +290,24 @@
|
|||
|
||||
<!-- Site preferences -->
|
||||
<div class="tab" id="tab-site-preferences">
|
||||
<h2>Site preferences</h2>
|
||||
<h2 data-i18n="optionsSitePreferencesTab"></h2>
|
||||
<hr />
|
||||
<p>
|
||||
Sites on this page have special handling methods associated with them.
|
||||
<span data-i18n="optionsSitePreferencesTabHelpTextFirst"></span>
|
||||
<br />
|
||||
To ignore new/modified credentials on a specific site, add it below or click the blinking KeePassXC-Browser icon and select <em>Never ask for this page</em>.
|
||||
<span data-i18n="optionsSitePreferencesTabHelpTextSecond"></span> <em><span data-i18n="popupButtonIgnore"></span></em>.
|
||||
<br />
|
||||
If a site is fully ignored (<em>Disable all features</em> is selected), then the plugin will do nothing when visiting that site.
|
||||
<span data-i18n="optionsSitePreferencesTabHelpTextThird"></span>
|
||||
<br />
|
||||
Enabling the <em>Username-Only Detection</em> feature allows KeePassXC-Browser to fill-in pages on sites that do present a separated username and password input.
|
||||
<span data-i18n="optionsSitePreferencesTabHelpTextFourth"></span>
|
||||
</p>
|
||||
<hr />
|
||||
<div class="form-group">
|
||||
<label for="sitePreferencesManualAdd">Add URL manually:</label>
|
||||
<label for="ignoreManualAdd" data-i18n="optionsSitePreferencesManualAddText"></label>
|
||||
<div class="control-group">
|
||||
<div class="input-append">
|
||||
<input type="url" id="manualUrl"/>
|
||||
<button class="btn btn-sm btn-primary" id="sitePreferencesManualAdd" type="button"><span class="glyphicon glyphicon-plus-sign"></span> Add</button>
|
||||
<button class="btn btn-sm btn-primary" id="sitePreferencesManualAdd" type="button"><span class="glyphicon glyphicon-plus-sign"></span><span data-i18n="optionsButtonAdd"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -316,27 +315,27 @@
|
|||
<table class="table table-striped table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Page URL</th>
|
||||
<th>Ignore</th>
|
||||
<th>Username-Only Detection</th>
|
||||
<th>Delete</th>
|
||||
<th><span data-i18n="optionsColumnPageURL"></span></th>
|
||||
<th><span data-i18n="optionsColumnIgnore"></span></th>
|
||||
<th><span data-i18n="optionsColumnUsernameOnly"></span></th>
|
||||
<th><span data-i18n="optionsColumnDelete"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="empty">
|
||||
<td colspan="4">No sites found.</td>
|
||||
<td colspan="4"><span data-i18n="optionsSitePreferencesNotFound"></span></td>
|
||||
</tr>
|
||||
<tr class="clone">
|
||||
<td></td>
|
||||
<td>
|
||||
<select name="ignore">
|
||||
<option value="ignoreNothing">Enable all features</option>
|
||||
<option value="ignoreNormal">Disable new/modified credentials</option>
|
||||
<option value="ignoreFull">Disable all features</option>
|
||||
<option value="ignoreNothing" data-i18n="optionsSelectionNothing"></option>
|
||||
<option value="ignoreNormal" data-i18n="optionsSelectionNormal"></option>
|
||||
<option value="ignoreFull" data-i18n="optionsSelectionFull"></option>
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="checkbox" name="usernameOnly" value="false" /></td>
|
||||
<td><button class="btn delete btn-danger btn"><span class="glyphicon glyphicon-remove-sign"></span> Remove</button></td>
|
||||
<td><button class="btn delete btn-danger btn"><span class="glyphicon glyphicon-remove-sign"></span><span data-i18n="optionsButtonRemove"></span></button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -345,15 +344,15 @@
|
|||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 id="myModalLabel">Remove site?</h3>
|
||||
<h3 id="myModalLabel" data-i18n="optionsIgnoredSitesRemove"></h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>Do you really want to remove the specified site from the list?</p>
|
||||
<p class="help-block">KeePassXC-Browser will enable all features for this site and remove username-only detection.</p>
|
||||
<p><span data-i18n="optionsSitePreferencesConfirmation" i18n-placeholder="<strong></strong>"></span></p>
|
||||
<p class="help-block" data-i18n="optionsSitePreferencesConfirmationHelpText"></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
|
||||
<button class="btn yes btn-primary">Yes, remove now</button>
|
||||
<button class="btn" data-dismiss="modal" aria-hidden="true"><span data-i18n="optionsButtonCancel"></span></button>
|
||||
<button class="btn yes btn-primary"><span data-i18n="optionsButtonRemoveNow"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -362,30 +361,30 @@
|
|||
|
||||
<!-- About -->
|
||||
<div class="tab" id="tab-about">
|
||||
<h2>About</h2>
|
||||
<h2 data-i18n="optionsAboutTab"></h2>
|
||||
<hr />
|
||||
<p>
|
||||
<a target="_blank" href="https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk">Visit extension's page in Chrome Web store</a>
|
||||
<a target="_blank" href="https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk"><span data-i18n="optionsAboutChrome"/></a>
|
||||
</p>
|
||||
<p>
|
||||
<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/">Visit extension's page in Mozilla's Add-ons page</a>
|
||||
<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/"><span data-i18n="optionsAboutMozilla"/></a>
|
||||
</p>
|
||||
<p>
|
||||
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser">Visit project's page in GitHub</a>.
|
||||
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser"><span data-i18n="optionsAboutGitHub"/></a>.
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
KeePassXC-Browser Version: <em class="versionCIP"></em>
|
||||
<span data-i18n="optionsAboutExtensionVersion" i18n-placeholder="<em class='versionCIP'></em>"></span>
|
||||
</p>
|
||||
<p>
|
||||
KeePassXC Version: <em class="versionKPH"></em>
|
||||
<span data-i18n="optionsAboutKeePassXCVersion" i18n-placeholder="<em class='versionKPH'></em>"></span>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
Contributors:<br>
|
||||
<span data-i18n="optionsAboutContributors"></span><br>
|
||||
<a target="_blank" href="https://github.com/pfn/">Perry Nguyen</a>, <a target="_blank" href="http://lukas-schulze.de">Lukas Schulze</a>,
|
||||
<a target="_blank" href="https://github.com/smorks">Andy Brandt</a>, <a target="_blank" href="https://github.com/varjolintu/">Sami Vänttinen</a>
|
||||
and <a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser">KeePassXC Team</a>.
|
||||
<a target="_blank" href="https://github.com/smorks">Andy Brandt</a>, <a target="_blank" href="https://github.com/varjolintu/">Sami Vänttinen</a>,
|
||||
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser">KeePassXC Team</a>.
|
||||
</p>
|
||||
</div>
|
||||
<hr>
|
||||
|
|
@ -393,5 +392,7 @@
|
|||
<p>(C) 2017-2018 - KeePassXC Team</p>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -118,6 +118,18 @@ options.initGeneralSettings = function() {
|
|||
$('#blinkMinTimeout').val(options.settings['blinkMinTimeout']);
|
||||
$('#allowedRedirect').val(options.settings['allowedRedirect']);
|
||||
|
||||
browser.commands.getAll().then(function(commands) {
|
||||
commands.forEach(function(command) {
|
||||
var shortcut = document.getElementById(`${command.name}-shortcut`);
|
||||
if (!shortcut) return;
|
||||
shortcut.textContent = command.shortcut || 'not configured';
|
||||
});
|
||||
});
|
||||
|
||||
$('#configureCommands').click(function(){
|
||||
browser.tabs.create({ url: 'chrome://extensions/configureCommands' });
|
||||
});
|
||||
|
||||
$('#blinkTimeoutButton').click(function(){
|
||||
const blinkTimeout = $.trim($('#blinkTimeout').val());
|
||||
const blinkTimeoutval = blinkTimeout !== '' ? Number(blinkTimeout) : defaultSettings.blinkTimeout;
|
||||
|
|
@ -156,6 +168,10 @@ options.showKeePassXCVersions = function(response) {
|
|||
$('#tab-general-settings button.checkUpdateKeePassXC:first').attr('disabled', false);
|
||||
};
|
||||
|
||||
options.getPartiallyHiddenKey = function(key) {
|
||||
return !key ? 'Error' : (key.substr(0, 8) + '*'.repeat(10));
|
||||
};
|
||||
|
||||
options.initConnectedDatabases = function() {
|
||||
$('#dialogDeleteConnectedDatabase').modal({keyboard: true, show: false, backdrop: true});
|
||||
$('#tab-connected-databases tr.clone:first button.delete:first').click(function(e) {
|
||||
|
|
@ -193,7 +209,7 @@ options.initConnectedDatabases = function() {
|
|||
$('a.dropdown-toggle:first img:first', tr).attr('src', '/icons/19x19/icon_normal_19x19.png');
|
||||
|
||||
tr.children('td:first').text(options.keyRing[hash].id);
|
||||
tr.children('td:eq(1)').text(options.keyRing[hash].key);
|
||||
tr.children('td:eq(1)').text(options.getPartiallyHiddenKey(options.keyRing[hash].key));
|
||||
const lastUsed = (options.keyRing[hash].lastUsed) ? new Date(options.keyRing[hash].lastUsed).toLocaleString() : 'unknown';
|
||||
tr.children('td:eq(2)').text(lastUsed);
|
||||
const date = (options.keyRing[hash].created) ? new Date(options.keyRing[hash].created).toLocaleDateString() : 'unknown';
|
||||
|
|
@ -310,7 +326,7 @@ options.initSitePreferences = function() {
|
|||
trClone.removeClass('clone');
|
||||
|
||||
// Fills the last / char if needed. This ensures the compatibility with Match Patterns
|
||||
if (options.slashNeededForUrl(value)) {
|
||||
if (slashNeededForUrl(value)) {
|
||||
value += '/';
|
||||
}
|
||||
|
||||
|
|
@ -366,7 +382,7 @@ options.initSitePreferences = function() {
|
|||
$('#tab-site-preferences table tbody:first').append(tr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($('#tab-site-preferences table tbody:first tr').length > 2) {
|
||||
$('#tab-site-preferences table tbody:first tr.empty:first').hide();
|
||||
} else {
|
||||
|
|
@ -379,22 +395,4 @@ options.initAbout = function() {
|
|||
if (isFirefox()) {
|
||||
$('#chrome-only').remove();
|
||||
}
|
||||
|
||||
if (navigator.platform === 'MacIntel') {
|
||||
$('#default-user-shortcut').hide();
|
||||
$('#default-pass-shortcut').hide();
|
||||
$('#mac-user-shortcut').show();
|
||||
$('#mac-pass-shortcut').show();
|
||||
} else {
|
||||
$('#mac-user-shortcut').hide();
|
||||
$('#mac-pass-shortcut').hide();
|
||||
$('#default-user-shortcut').show();
|
||||
$('#default-pass-shortcut').show();
|
||||
}
|
||||
};
|
||||
|
||||
// Checks if URL has only scheme and host without the last / char.
|
||||
options.slashNeededForUrl = function(pattern) {
|
||||
const matchPattern = new RegExp(`^${schemeSegment}://${hostSegment}$`);
|
||||
return matchPattern.exec(pattern);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ body {
|
|||
background-color: #eee;
|
||||
font-size: 15px;
|
||||
padding: 8px;
|
||||
min-width: 440px;
|
||||
max-width: 460px;
|
||||
width: auto;
|
||||
}
|
||||
.container {
|
||||
min-width: 440px;
|
||||
|
|
@ -59,3 +62,11 @@ body {
|
|||
float: right;
|
||||
height: 30px;
|
||||
}
|
||||
#login-filter {
|
||||
outline:none;
|
||||
border-radius: 4px 0 0 4px;
|
||||
border: 1px solid #ccc;
|
||||
margin-bottom: 5px;
|
||||
padding: 2px 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>KeePassXC - Popup</title>
|
||||
<title data-i18n="popupTitle"></title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="popup.css" />
|
||||
<link rel="stylesheet" href="../options/bootstrap.min.css" />
|
||||
|
|
@ -14,86 +14,70 @@
|
|||
<body>
|
||||
<div class="container">
|
||||
<div id="settings" class="settings">
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span> Settings</button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span> Choose custom credential fields for this page</button>
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span><span data-i18n="popupSettingsText"/></button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span><span data-i18n="popupChooseCredentialsText"/></button>
|
||||
<button id="lock-database-button" class="btn btn-danger" title="Lock database"><span class="glyphicon glyphicon-lock"></span></button>
|
||||
|
||||
<div id="update-available" class="alert alert-danger">
|
||||
You use an old version of KeePassXC.
|
||||
<span data-i18n="popupUpdateAvailable"></span>
|
||||
<br />
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download">Please download the latest version from keepassxc.org</a>.
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download"><span data-i18n="popupDownloadNewVersion"/></a>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="initial-state">
|
||||
<p><img style="margin-right: 1em" src="throbber.gif"/> Checking status...</p>
|
||||
<p><img style="margin-right: 1em" src="throbber.gif"/><span data-i18n="popupCheckingStatus"/></p>
|
||||
</div>
|
||||
|
||||
<div id="not-configured" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has not been configured.
|
||||
Press the connect button to register and pair with KeePassXC.
|
||||
</p>
|
||||
<p data-i18n="popupNotConfigured"/>
|
||||
<div style="text-align: right">
|
||||
<button id="connect-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-link"></span> Connect</button>
|
||||
<button id="connect-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-link"></span><span data-i18n="popupConnectButton"/></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="need-reconfigure" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has been disconnected from KeePassXC.
|
||||
</p>
|
||||
<code id="need-reconfigure-message"></code>
|
||||
<p>
|
||||
Press the reconnect button to establish a new connection.
|
||||
<p data-i18n="popupNeedReconfigure"/>
|
||||
<p style="margin-left: 1em">
|
||||
<code id="need-reconfigure-message"></code>
|
||||
</p>
|
||||
<p data-i18n="popupNeedReconfigureMessage"/>
|
||||
<div style="text-align: right">
|
||||
<button id="reconnect-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-refresh"></span> Reconnect</button>
|
||||
<button id="reconnect-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-refresh"></span><span data-i18n="popupReconnectButton"/></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="configured-not-associated" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has been configured using the identifier
|
||||
<em id="unassociated-identifier"></em> and has not yet
|
||||
connected to KeePassXC.
|
||||
</p>
|
||||
<span data-i18n="popupConfiguredNotAssociated" i18n-placeholder="<span class='bg-warning' id='unassociated-identifier'></span>"></span>
|
||||
</div>
|
||||
|
||||
<div id="configured-and-associated" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has been configured using the identifier
|
||||
"<em id="associated-identifier"></em>" and is successfully
|
||||
connected to KeePassXC.
|
||||
</p>
|
||||
<span data-i18n="popupConfiguredAndAssociated" i18n-placeholder="<span class='bg-success' id='associated-identifier'></span>"></span>
|
||||
<div style="text-align: right">
|
||||
<button id="redetect-fields-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-list-alt"></span> Redetect credential fields</button>
|
||||
<button id="redetect-fields-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-list-alt"></span><span data-i18n="popupRedetectButton"/></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="error-encountered" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has encountered an error:
|
||||
</p>
|
||||
<p data-i18n="popupErrorEncountered"/>
|
||||
<p style="margin-left: 1em">
|
||||
<code id="error-message"></code>
|
||||
</p>
|
||||
<div style="text-align: right">
|
||||
<button id="reload-status-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-refresh"></span> Reload</button>
|
||||
<button id="reload-status-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-refresh"></span><span data-i18n="popupReloadButton"/></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="database-not-opened" style="display: none">
|
||||
<p>
|
||||
KeePassXC-Browser has encountered an error:
|
||||
</p>
|
||||
<p data-i18n="popupErrorEncountered"/>
|
||||
<p style="margin-left: 1em">
|
||||
<code id="database-error-message"></code>
|
||||
</p>
|
||||
<div style="text-align: right">
|
||||
<button id="reopen-database-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-lock"></span> Reopen database</button>
|
||||
<button id="reopen-database-button" class="btn btn-sm btn-primary"><span class="glyphicon glyphicon-lock"></span><span data-i18n="popupReopenButton"/></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -14,26 +14,25 @@
|
|||
<body>
|
||||
<div class="container">
|
||||
<div id="settings" class="settings">
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span> Settings</button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span> Choose custom credential fields for this page</button>
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span><span data-i18n="popupSettingsText"/></button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span><span data-i18n="popupChooseCredentialsText"/></button>
|
||||
<button id="lock-database-button" class="btn btn-danger" title="Lock database"><span class="glyphicon glyphicon-lock"></span></button>
|
||||
|
||||
<div id="update-available" class="alert alert-danger">
|
||||
You use an old version of KeePassXC.
|
||||
<span data-i18n="popupUpdateAvailable"></span>
|
||||
<br />
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download">Please download the latest version from keepassxc.org</a>.
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download"><span data-i18n="popupDownloadNewVersion"/></a>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="credentials">
|
||||
<p>
|
||||
Select the login information you would like to get logged in with:
|
||||
</p>
|
||||
<p data-i18n="popupAuthText"></p>
|
||||
<div id="login-list" class="list-group"></div>
|
||||
<p>
|
||||
<button id="btn-dismiss" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-remove"></span> Dismiss and show the default authentication dialog</button>
|
||||
<button id="btn-dismiss" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-remove"></span><span data-i18n="popupButtonDismissHttpAuth"/></button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -14,23 +14,26 @@
|
|||
<body>
|
||||
<div class="container">
|
||||
<div id="settings" class="settings">
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span> Settings</button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span> Choose custom credential fields for this page</button>
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span><span data-i18n="popupSettingsText"/></button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span><span data-i18n="popupChooseCredentialsText"/></button>
|
||||
<button id="lock-database-button" class="btn btn-danger" title="Lock database"><span class="glyphicon glyphicon-lock"></span></button>
|
||||
|
||||
<div id="update-available" class="alert alert-danger">
|
||||
You use an old version of KeePassXC.
|
||||
<span data-i18n="popupUpdateAvailable"></span>
|
||||
<br />
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download">Please download the latest version from keepassxc.org</a>.
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download"><span data-i18n="popupDownloadNewVersion"/></a>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="credentials">
|
||||
<p>
|
||||
Select the login information you would like to get entered into the page:
|
||||
</p>
|
||||
<p data-i18n="popupLoginText"></p>
|
||||
<div id="filter-block" style="display: none;">
|
||||
<label for="login-filter" data-i18n="popupFilterText"></label>
|
||||
<input type="text" id="login-filter">
|
||||
</div>
|
||||
<div id="login-list" class="list-group"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,23 @@ $(function() {
|
|||
});
|
||||
ll.appendChild(a);
|
||||
}
|
||||
|
||||
if (logins.length > 1) {
|
||||
document.getElementById('filter-block').style = '';
|
||||
let filter = document.getElementById('login-filter');
|
||||
filter.addEventListener('keyup', (e) => {
|
||||
let val = filter.value;
|
||||
let re = new RegExp(val, 'i');
|
||||
let links = ll.getElementsByTagName('a');
|
||||
for (let i in links) {
|
||||
if (links.hasOwnProperty(i)) {
|
||||
let found = String(links[i].textContent).match(re) !== null;
|
||||
links[i].style = found ? '' : 'display: none;';
|
||||
}
|
||||
}
|
||||
});
|
||||
filter.focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,36 +1,36 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>KeePassXC-Browser - Popup</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="popup.css" />
|
||||
<link rel="stylesheet" href="../options/bootstrap.min.css" />
|
||||
<script type="text/javascript" src="../browser-polyfill.min.js"></script>
|
||||
<script type="text/javascript" src="../global.js"></script>
|
||||
<script type="text/javascript" src="../jquery-3.3.1.min.js"></script>
|
||||
<script type="text/javascript" src="../options/bootstrap.min.js" /></script>
|
||||
<script type="text/javascript" src="popup_functions.js"></script>
|
||||
<title>KeePassXC-Browser - Popup</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="popup.css" />
|
||||
<link rel="stylesheet" href="../options/bootstrap.min.css" />
|
||||
<script type="text/javascript" src="../browser-polyfill.min.js"></script>
|
||||
<script type="text/javascript" src="../global.js"></script>
|
||||
<script type="text/javascript" src="../jquery-3.3.1.min.js"></script>
|
||||
<script type="text/javascript" src="../options/bootstrap.min.js" /></script>
|
||||
<script type="text/javascript" src="popup_functions.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div id="settings" class="settings">
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span> Settings</button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span> Choose custom credential fields for this page</button>
|
||||
<button id="lock-database-button" class="btn btn-danger" title="Lock database"><span class="glyphicon glyphicon-lock"></span></button>
|
||||
<div class="container">
|
||||
<div id="settings" class="settings">
|
||||
<button id="btn-options" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-cog"></span><span data-i18n="popupSettingsText"/></button>
|
||||
<button id="btn-choose-credential-fields" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-list-alt"></span><span data-i18n="popupChooseCredentialsText"/></button>
|
||||
<button id="lock-database-button" class="btn btn-danger" title="Lock database"><span class="glyphicon glyphicon-lock"></span></button>
|
||||
|
||||
<div id="update-available" class="alert alert-danger">
|
||||
You use an old version of KeePassXC.
|
||||
<br />
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download">Please download the latest version from keepassxc.org</a>.
|
||||
</div>
|
||||
</div>
|
||||
<div id="update-available" class="alert alert-danger">
|
||||
<span data-i18n="popupUpdateAvailable"></span>
|
||||
<br />
|
||||
<a target="_blank" class="alert-link" href="https://keepassxc.org/download"><span data-i18n="popupDownloadNewVersion"/></a>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p>
|
||||
KeePassXC-Browser found more than one password field on this page. To enter your
|
||||
logins, right-click on one of the password fields, and choose either the
|
||||
"<code>Fill User + Pass</code>" or "<code>Fill Pass Only</code>" command.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<span data-i18n="popupMultiplePasswordFields"></span>
|
||||
"<code><span data-i18n="contextMenuFillUsernameAndPassword"></span></code>", "<code><span data-i18n="contextMenuFillPassword"></span></code>"
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -17,36 +17,36 @@
|
|||
.credentials .username-exists {display: none;}
|
||||
.small { font-weight: bold; }
|
||||
.small .normal { font-weight: normal; }
|
||||
.info { font-weight: normal; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="buttons">
|
||||
<p>
|
||||
Username or password changed! Save it?
|
||||
<span data-i18n="popupRememberInfoText"></span>
|
||||
<br />
|
||||
<span class="small information-url">Url: <span class="normal"></span></span>
|
||||
<span class="small" data-i18n="popupURL"></span><span class="small info information-url"></span>
|
||||
<br />
|
||||
<span class="small information-username">Username: <span class="normal"></span></span>
|
||||
<span class="small" data-i18n="popupUsername"></span><span class="small info information-username"></span>
|
||||
</p>
|
||||
<p>
|
||||
<button id="btn-new" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-pencil"></span> New</button>
|
||||
<button id="btn-update" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-refresh"></span> Update</button>
|
||||
<button id="btn-dismiss" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-remove"></span> Dismiss</button>
|
||||
<button id="btn-ignore" class="btn btn-sm btn-default"><span class="glyphicon glyphicon-remove"></span> Never ask for this page</button>
|
||||
<button id="btn-new" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-pencil"></span><span data-i18n="popupButtonNew"></span></button>
|
||||
<button id="btn-update" class="btn btn-sm btn-warning"><span class="glyphicon glyphicon-refresh"></span><span data-i18n="popupButtonUpdate"></span></button>
|
||||
<button id="btn-dismiss" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-remove"></span><span data-i18n="popupButtonDismiss"></span></button>
|
||||
<button id="btn-ignore" class="btn btn-sm btn-default"><span class="glyphicon glyphicon-remove"></span><span data-i18n="popupButtonIgnore"></span></button> <!--missing-->
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="connected-database">
|
||||
<p>Credentials will be saved in connected database with identifier <em></em>.</p>
|
||||
<p data-i18n="popupRememberSaving" i18n-placeholder="<span></span><em></em>"></p>
|
||||
</div>
|
||||
|
||||
<div class="credentials">
|
||||
<p class="username-new">The used username <strong></strong> is currently not saved!</p>
|
||||
<p class="username-exists">The credentials with the used username <strong></strong> are marked bold.</p>
|
||||
<p>
|
||||
Please choose the credentials you want to update:
|
||||
</p>
|
||||
<p class="username-new"><span data-i18n="popupRememberNewUsername" i18n-placeholder="<strong></strong>"></span></p>
|
||||
<p class="username-exists"><span data-i18n="popupRememberUsernameExists" i18n-placeholder="<strong></strong>"></span></p>
|
||||
<p data-i18n="popupRememberChooseCredentials"></p>
|
||||
<ul id="list"></ul>
|
||||
</div>
|
||||
<script type="text/javascript" src="../translate.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -5,21 +5,26 @@ var _tab;
|
|||
function _initialize(tab) {
|
||||
_tab = tab;
|
||||
|
||||
// no credentials set or credentials already cleared
|
||||
if (!_tab.credentials.username) {
|
||||
// No credentials set or credentials already cleared
|
||||
if (!_tab.credentials.username && !_tab.credentials.password) {
|
||||
_close();
|
||||
return;
|
||||
}
|
||||
|
||||
// no existing credentials to update --> disable update-button
|
||||
// No existing credentials to update --> disable Update button
|
||||
if (_tab.credentials.list.length === 0) {
|
||||
$('#btn-update').attr('disabled', true).removeClass('btn-warning');
|
||||
}
|
||||
|
||||
// No username available. This might be because of trigger from context menu --> disable New button
|
||||
if (!_tab.credentials.username && _tab.credentials.password) {
|
||||
$('#btn-new').attr('disabled', true).removeClass('btn-success');
|
||||
}
|
||||
|
||||
let url = _tab.credentials.url;
|
||||
url = (url.length > 50) ? url.substring(0, 50) + '...' : url;
|
||||
$('.information-url:first span:first').text(url);
|
||||
$('.information-username:first span:first').text(_tab.credentials.username);
|
||||
$('.information-url:first').text(url);
|
||||
$('.information-username:first').text(_tab.credentials.username);
|
||||
|
||||
$('#btn-new').click(function(e) {
|
||||
browser.runtime.sendMessage({
|
||||
|
|
@ -31,8 +36,13 @@ function _initialize(tab) {
|
|||
$('#btn-update').click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// only one entry which could be updated
|
||||
// Only one entry which could be updated
|
||||
if(_tab.credentials.list.length === 1) {
|
||||
// Use the current username if it's empty
|
||||
if (!_tab.credentials.username) {
|
||||
_tab.credentials.username = _tab.credentials.list[0].login;
|
||||
}
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
action: 'update_credentials',
|
||||
args: [_tab.credentials.list[0].uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url]
|
||||
|
|
@ -58,10 +68,35 @@ function _initialize(tab) {
|
|||
.data('entryId', i)
|
||||
.click(function(e) {
|
||||
e.preventDefault();
|
||||
const entryId = $(this).data('entryId');
|
||||
|
||||
// Use the current username if it's empty
|
||||
if (!_tab.credentials.username) {
|
||||
_tab.credentials.username = _tab.credentials.list[entryId].login;
|
||||
}
|
||||
|
||||
// Check if the password has changed for the updated credentials
|
||||
browser.runtime.sendMessage({
|
||||
action: 'update_credentials',
|
||||
args: [_tab.credentials.list[$(this).data('entryId')].uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url]
|
||||
}).then(_verifyResult);
|
||||
action: 'retrieve_credentials',
|
||||
args: [ url, '', false, true ]
|
||||
}).then((credentials) => {
|
||||
if (!credentials || credentials.length !== _tab.credentials.list.length) {
|
||||
_verifyResult('error');
|
||||
return;
|
||||
}
|
||||
|
||||
// Show a notification if the user tries to update credentials using the old password
|
||||
if (credentials[entryId].password === _tab.credentials.password) {
|
||||
showNotification('Error: Credentials not updated. The password has not been changed.');
|
||||
_close();
|
||||
return;
|
||||
}
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
action: 'update_credentials',
|
||||
args: [_tab.credentials.list[entryId].uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url]
|
||||
}).then(_verifyResult);
|
||||
});
|
||||
});
|
||||
|
||||
if (_tab.credentials.usernameExists && _tab.credentials.username === _tab.credentials.list[i].login) {
|
||||
|
|
|
|||
15
keepassxc-browser/translate.js
Normal file
15
keepassxc-browser/translate.js
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
'use strict'
|
||||
|
||||
const items = document.querySelectorAll('[data-i18n]');
|
||||
for (let item of items) {
|
||||
const key = item.getAttribute('data-i18n');
|
||||
if (key) {
|
||||
const placeholder = item.getAttribute('i18n-placeholder');
|
||||
const translation = placeholder ? browser.i18n.getMessage(key, placeholder) : browser.i18n.getMessage(key);
|
||||
if (item.hasAttribute('href')) {
|
||||
item.text = translation;
|
||||
} else {
|
||||
item.innerHTML = translation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ Now the requests are encrypted by [TweetNaCl.js](https://github.com/dchest/tweet
|
|||
3. All messages between the browser extension and KeePassXC are now encrypted.
|
||||
4. When keepassxc-browser sends a message it is encrypted with KeePassXC's public key, a random generated nonce and keepassxc-browser's secret key.
|
||||
5. When KeePassXC sends a message it is encrypted with keepassxc-browser's public key and an incremented nonce.
|
||||
6. Databases are stored based on the current public key used with `associate`. A new key pair for data transfer is generated each time keepassxc-browser is launched. This saved key is not used again, as it's only used for identification.
|
||||
6. Databases are stored with newly created public key used with `associate`. A new key pair for data transfer is generated each time keepassxc-browser is launched. This saved key is not used again, as it's only used for identification.
|
||||
|
||||
Encrypted messages are built with these JSON parameters:
|
||||
- action - `test-associate`, `associate`, `get-logins`, `get-logins-count`, `set-login`...
|
||||
|
|
@ -71,7 +71,8 @@ Unencrypted message:
|
|||
```javascript
|
||||
{
|
||||
"action": "associate",
|
||||
"key": "<current public key>"
|
||||
"key": "<current public key>",
|
||||
"idKey": "<a new identification key>"
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue