diff --git a/.eslintignore b/.eslintignore index 36a2c3fcbc..95acf5fc91 100644 --- a/.eslintignore +++ b/.eslintignore @@ -534,6 +534,9 @@ packages/app-desktop/gui/NoteToolbar/NoteToolbar.js.map packages/app-desktop/gui/OneDriveLoginScreen.d.ts packages/app-desktop/gui/OneDriveLoginScreen.js packages/app-desktop/gui/OneDriveLoginScreen.js.map +packages/app-desktop/gui/PasswordInput/PasswordInput.d.ts +packages/app-desktop/gui/PasswordInput/PasswordInput.js +packages/app-desktop/gui/PasswordInput/PasswordInput.js.map packages/app-desktop/gui/ResizableLayout/MoveButtons.d.ts packages/app-desktop/gui/ResizableLayout/MoveButtons.js packages/app-desktop/gui/ResizableLayout/MoveButtons.js.map diff --git a/.gitignore b/.gitignore index 65c58b1bc6..2df940c1c1 100644 --- a/.gitignore +++ b/.gitignore @@ -517,6 +517,9 @@ packages/app-desktop/gui/NoteToolbar/NoteToolbar.js.map packages/app-desktop/gui/OneDriveLoginScreen.d.ts packages/app-desktop/gui/OneDriveLoginScreen.js packages/app-desktop/gui/OneDriveLoginScreen.js.map +packages/app-desktop/gui/PasswordInput/PasswordInput.d.ts +packages/app-desktop/gui/PasswordInput/PasswordInput.js +packages/app-desktop/gui/PasswordInput/PasswordInput.js.map packages/app-desktop/gui/ResizableLayout/MoveButtons.d.ts packages/app-desktop/gui/ResizableLayout/MoveButtons.js packages/app-desktop/gui/ResizableLayout/MoveButtons.js.map diff --git a/packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx b/packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx index d2aabe492f..ee12fe20ae 100644 --- a/packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx +++ b/packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx @@ -5,12 +5,12 @@ import useAsyncEffect, { AsyncEffectEvent } from '@joplin/lib/hooks/useAsyncEffe import DialogButtonRow, { ClickEvent } from '../DialogButtonRow'; import Dialog from '../Dialog'; import DialogTitle from '../DialogTitle'; -import StyledInput from '../style/StyledInput'; -import { getMasterPasswordStatus, getMasterPasswordStatusMessage, checkHasMasterPasswordEncryptedData, masterPasswordIsValid, MasterPasswordStatus, resetMasterPassword, updateMasterPassword } from '@joplin/lib/services/e2ee/utils'; +import { getMasterPasswordStatus, getMasterPasswordStatusMessage, checkHasMasterPasswordEncryptedData, masterPasswordIsValid, MasterPasswordStatus, resetMasterPassword, updateMasterPassword, getMasterPassword } from '@joplin/lib/services/e2ee/utils'; import { reg } from '@joplin/lib/registry'; import EncryptionService from '@joplin/lib/services/e2ee/EncryptionService'; import KvStore from '@joplin/lib/services/KvStore'; import ShareService from '@joplin/lib/services/share/ShareService'; +import { PasswordInput } from '../PasswordInput/PasswordInput'; interface Props { themeId: number; @@ -41,6 +41,10 @@ export default function(props: Props) { }); }, [props.dispatch]); + useEffect(() => { + setCurrentPassword(getMasterPassword(false) || ''); + }, []); + useAsyncEffect(async (event: AsyncEffectEvent) => { const newStatus = await getMasterPasswordStatus(); const hasIt = await checkHasMasterPasswordEncryptedData(); @@ -122,7 +126,7 @@ export default function(props: Props) { function renderCurrentPasswordIcon() { if (!currentPassword || status === MasterPasswordStatus.NotSet) return null; - return currentPasswordIsValid ? : ; + return currentPasswordIsValid ? : ; } function renderPasswordForm() { @@ -130,15 +134,17 @@ export default function(props: Props) { if (status === MasterPasswordStatus.NotSet) return null; if (mode === Mode.Reset) return null; + // If the master password is in the keychain we preload it into the + // field and allow displaying it. That way if the user has forgotten + // their password, they have a chance to recover it that way without + // having to reset the password (and lose access to any data that's + // been encrypted with it). + return (