diff --git a/public/locales/en-US/settings-email-pgp.json b/public/locales/en-US/settings-email-pgp.json
index 3228df3..1795266 100644
--- a/public/locales/en-US/settings-email-pgp.json
+++ b/public/locales/en-US/settings-email-pgp.json
@@ -5,7 +5,8 @@
"fields": {
"publicKey": {
"label": "Your public key",
- "helperText": "Paste your raw public key in armored format here."
+ "helperText": "Paste your raw public key in armored format here.",
+ "placeholder": "----BEGIN PGP PUBLIC KEY BLOCK----\n\n...\n----END PGP PUBLIC KEY BLOCK----"
}
},
"continueActionLabel": "Enable PGP encryption"
diff --git a/src/App.tsx b/src/App.tsx
index 8a44dad..43cf6f7 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -116,6 +116,7 @@ const router = createBrowserRouter([
},
{
path: "/settings/email-pgp",
+ loader: getServerSettings,
element: ,
},
{
diff --git a/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx b/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx
index 05393f7..5f6877e 100644
--- a/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx
+++ b/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx
@@ -1,23 +1,27 @@
import * as yup from "yup"
+import {useLoaderData} from "react-router-dom"
import {ReactElement, useContext, useState} from "react"
import {useFormik} from "formik"
+import {HiSearch} from "react-icons/hi"
+import {AxiosError} from "axios"
+import {RiLockFill} from "react-icons/ri"
+import {useTranslation} from "react-i18next"
+
+import {LoadingButton} from "@mui/lab"
import {useMutation} from "@tanstack/react-query"
import {Box, FormGroup, FormHelperText, Grid, TextField} from "@mui/material"
+
import {
FindPublicKeyResponse,
UpdatePreferencesData,
findPublicKey,
updatePreferences,
} from "~/apis"
-import {HiSearch} from "react-icons/hi"
-import {LoadingButton} from "@mui/lab"
import {parseFastAPIError} from "~/utils"
-import {AxiosError} from "axios"
-import {RiLockFill} from "react-icons/ri"
-import {SimpleDetailResponse, User} from "~/server-types"
-import {useTranslation} from "react-i18next"
+import {ServerSettings, SimpleDetailResponse, User} from "~/server-types"
import {useErrorSuccessSnacks} from "~/hooks"
import {AuthContext} from "~/components"
+
import ImportKeyDialog from "./ImportKeyDialog"
interface Form {
@@ -28,12 +32,13 @@ interface Form {
export default function SetupPGPEncryptionForm(): ReactElement {
const {t} = useTranslation(["settings-email-pgp", "common"])
+ const serverSettings = useLoaderData() as ServerSettings
const {showSuccess, showError} = useErrorSuccessSnacks()
const [publicKeyResult, setPublicKeyResult] = useState(null)
const schema = yup.object().shape({
- publicKey: yup.string().label(t("form.publicKey.label")),
+ publicKey: yup.string().label(t("form.publicKey.label")).min(1),
})
const {user, _updateUser} = useContext(AuthContext)
@@ -88,7 +93,7 @@ export default function SetupPGPEncryptionForm(): ReactElement {
@@ -98,6 +103,7 @@ export default function SetupPGPEncryptionForm(): ReactElement {
minRows={5}
maxRows={15}
label={t("form.fields.publicKey.label")}
+ placeholder={t("form.fields.publicKey.placeholder")}
name="publicKey"
value={formik.values.publicKey}
onChange={formik.handleChange}
@@ -111,16 +117,18 @@ export default function SetupPGPEncryptionForm(): ReactElement {
{t("form.fields.publicKey.helperText")}
-
- }
- onClick={() => findPublicKeyAsync()}
- >
- {t("findPublicKey.label")}
-
-
+ {serverSettings.allowPgpKeyDiscovery && (
+
+ }
+ onClick={() => findPublicKeyAsync()}
+ >
+ {t("findPublicKey.label")}
+
+
+ )}
}
+ disabled={!formik.isValid}
>
{t("form.continueActionLabel")}
diff --git a/src/server-types.ts b/src/server-types.ts
index b0efbcf..3fb2513 100644
--- a/src/server-types.ts
+++ b/src/server-types.ts
@@ -88,6 +88,7 @@ export interface ServerSettings {
allowAliasDeletion: boolean
apiKeyMaxDays: number
allowRegistrations: boolean
+ allowPgpKeyDiscovery: boolean
}
export interface Alias {