@strapi/email 5.48.1 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/pages/Settings.js +3 -2
- package/dist/admin/pages/Settings.js.map +1 -1
- package/dist/admin/utils/schema.js +3 -2
- package/dist/admin/utils/schema.js.map +1 -1
- package/dist/server/middlewares/rateLimit.js +5 -1
- package/dist/server/middlewares/rateLimit.js.map +1 -1
- package/dist/server/routes/validation/email.js +3 -2
- package/dist/server/routes/validation/email.js.map +1 -1
- package/dist/server/services/email.js +3 -2
- package/dist/server/services/email.js.map +1 -1
- package/package.json +5 -5
|
@@ -14,7 +14,8 @@ var constants = require('../constants.js');
|
|
|
14
14
|
var getYupInnerErrors = require('../utils/getYupInnerErrors.js');
|
|
15
15
|
var schema = require('../utils/schema.js');
|
|
16
16
|
|
|
17
|
-
function
|
|
17
|
+
function _interopNamespace(e) {
|
|
18
|
+
if (e && e.__esModule) return e;
|
|
18
19
|
var n = Object.create(null);
|
|
19
20
|
if (e) {
|
|
20
21
|
Object.keys(e).forEach(function (k) {
|
|
@@ -31,7 +32,7 @@ function _interopNamespaceDefault(e) {
|
|
|
31
32
|
return Object.freeze(n);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
var React__namespace = /*#__PURE__*/
|
|
35
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
35
36
|
|
|
36
37
|
const DocumentationLink = styledComponents.styled.a`
|
|
37
38
|
color: ${({ theme })=>theme.colors.primary600};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.js","sources":["../../../admin/src/pages/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useFetchClient, Layouts } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n Grid,\n SingleSelectOption,\n SingleSelect,\n TextInput,\n Typography,\n Field,\n Badge,\n} from '@strapi/design-system';\nimport { Mail, Check, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useMutation } from 'react-query';\nimport { styled } from 'styled-components';\nimport { ValidationError } from 'yup';\n\nimport { parseEmailAddress } from '../../../shared/email-address-parser';\nimport { PERMISSIONS } from '../constants';\nimport { getYupInnerErrors } from '../utils/getYupInnerErrors';\nimport { schema } from '../utils/schema';\n\nimport type { EmailSettings, ProviderCapabilities } from '../../../shared/types';\n\nconst DocumentationLink = styled.a`\n color: ${({ theme }) => theme.colors.primary600};\n`;\n\ninterface MutationBody {\n to: string;\n}\n\nconst FEATURE_LABELS: Record<string, { id: string; defaultMessage: string }> = {\n dkim: {\n id: 'email.Settings.capabilities.feature.dkim',\n defaultMessage: 'DKIM',\n },\n pool: {\n id: 'email.Settings.capabilities.feature.pool',\n defaultMessage: 'Connection pool',\n },\n rateLimiting: {\n id: 'email.Settings.capabilities.feature.rateLimiting',\n defaultMessage: 'Rate limiting',\n },\n oauth2: {\n id: 'email.Settings.capabilities.feature.oauth2',\n defaultMessage: 'OAuth2',\n },\n requireTLS: {\n id: 'email.Settings.capabilities.feature.requireTLS',\n defaultMessage: 'Require TLS',\n },\n};\n\nconst CapabilitiesSection = ({\n capabilities,\n isIdle,\n formatMessage,\n}: {\n capabilities: ProviderCapabilities;\n isIdle?: boolean;\n formatMessage: (msg: { id: string; defaultMessage: string }) => string;\n}) => {\n const transport = capabilities.transport;\n const auth = capabilities.auth;\n const features = capabilities.features ?? [];\n\n const encryptionLabel =\n transport?.secure === true\n ? 'TLS'\n : transport?.port === 587\n ? 'STARTTLS'\n : transport?.port === 465\n ? 'TLS'\n : 'None';\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.capabilities.title',\n defaultMessage: 'Provider capabilities',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'email.Settings.capabilities.subtitle',\n defaultMessage: 'Current SMTP configuration and enabled features',\n })}\n </Typography>\n </Flex>\n\n <Grid.Root gap={5}>\n {transport && (transport.host || transport.port) && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"smtp-server\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.smtpServer',\n defaultMessage: 'SMTP server',\n })}\n </Field.Label>\n <TextInput\n disabled\n readOnly\n value={\n transport.host && transport.port\n ? `${transport.host}:${transport.port}`\n : transport.host || String(transport.port)\n }\n />\n </Field.Root>\n </Grid.Item>\n )}\n\n {transport && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"encryption\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.encryption',\n defaultMessage: 'Encryption',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={encryptionLabel} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {auth && (auth.type || auth.user) && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"auth-type\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.authType',\n defaultMessage: 'Authentication',\n })}\n </Field.Label>\n <TextInput\n disabled\n readOnly\n value={\n auth.type\n ? auth.user\n ? `${auth.type} (${auth.user})`\n : auth.type\n : auth.user || 'None'\n }\n />\n </Field.Root>\n </Grid.Item>\n )}\n\n {transport?.pool && isIdle !== undefined && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"pool-status\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.poolStatus',\n defaultMessage: 'Pool status',\n })}\n </Field.Label>\n <Badge\n backgroundColor={isIdle ? 'success100' : 'primary100'}\n textColor={isIdle ? 'success700' : 'primary700'}\n >\n {isIdle\n ? formatMessage({\n id: 'email.Settings.capabilities.poolStatus.idle',\n defaultMessage: 'Idle',\n })\n : formatMessage({\n id: 'email.Settings.capabilities.poolStatus.active',\n defaultMessage: 'Active',\n })}\n </Badge>\n </Field.Root>\n </Grid.Item>\n )}\n\n {features.length > 0 && (\n <Grid.Item col={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"features\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.features',\n defaultMessage: 'Enabled features',\n })}\n </Field.Label>\n <Flex gap={2} wrap=\"wrap\">\n {features.map((f) => (\n <Badge key={f} backgroundColor=\"neutral100\" textColor=\"neutral700\">\n {formatMessage(\n FEATURE_LABELS[f] ?? {\n id: `email.Settings.capabilities.feature.${f}`,\n defaultMessage: f,\n }\n )}\n </Badge>\n ))}\n </Flex>\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n\nconst SettingsPage = () => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { get, post } = useFetchClient();\n\n const [testAddress, setTestAddress] = React.useState('');\n const [isTestAddressValid, setIsTestAddressValid] = React.useState(false);\n\n // TODO: I'm not sure how to type this. I think it should be Record<string, TranslationMessage> but that type is defined in the helper-plugin\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [formErrors, setFormErrors] = React.useState<Record<string, any>>({});\n\n const { data, isLoading } = useQuery(['email', 'settings'], async () => {\n const res = await get<EmailSettings>('/email/settings');\n const {\n data: { config, supportsVerify, capabilities, isIdle },\n } = res;\n\n return { ...config, supportsVerify, capabilities, isIdle };\n });\n\n const mutation = useMutation<void, Error, MutationBody>(\n async (body) => {\n await post('/email/test', body);\n },\n {\n onError() {\n toggleNotification!({\n type: 'danger',\n message: formatMessage(\n {\n id: 'email.Settings.email.plugin.notification.test.error',\n defaultMessage: 'Failed to send a test mail to {to}',\n },\n { to: testAddress }\n ),\n });\n },\n onSuccess() {\n toggleNotification!({\n type: 'success',\n message: formatMessage(\n {\n id: 'email.Settings.email.plugin.notification.test.success',\n defaultMessage: 'Email test succeeded, check the {to} mailbox',\n },\n { to: testAddress }\n ),\n });\n },\n retry: false,\n }\n );\n\n const [connectionStatus, setConnectionStatus] = React.useState<\n 'idle' | 'loading' | 'success' | 'error'\n >('idle');\n\n const verifyMutation = useMutation(\n async () => {\n await post('/email/verify', {});\n },\n {\n onMutate() {\n setConnectionStatus('loading');\n },\n onError() {\n setConnectionStatus('error');\n toggleNotification!({\n type: 'danger',\n message: formatMessage({\n id: 'email.Settings.email.plugin.notification.verify.error',\n defaultMessage: 'Connection verification failed',\n }),\n });\n },\n onSuccess() {\n setConnectionStatus('success');\n toggleNotification!({\n type: 'success',\n message: formatMessage({\n id: 'email.Settings.email.plugin.notification.verify.success',\n defaultMessage: 'Connection verified successfully',\n }),\n });\n },\n retry: false,\n }\n );\n\n React.useEffect(() => {\n schema\n .validate({ email: testAddress }, { abortEarly: false })\n .then(() => setIsTestAddressValid(true))\n .catch(() => setIsTestAddressValid(false));\n }, [testAddress]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setTestAddress(() => event.target.value);\n };\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n try {\n await schema.validate({ email: testAddress }, { abortEarly: false });\n } catch (error) {\n if (error instanceof ValidationError) {\n setFormErrors(getYupInnerErrors(error));\n }\n }\n\n mutation.mutate({ to: testAddress });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main labelledBy=\"title\" aria-busy={isLoading || mutation.isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'email.Settings.email.plugin.title',\n defaultMessage: 'Configuration',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n id=\"title\"\n title={formatMessage({\n id: 'email.Settings.email.plugin.title',\n defaultMessage: 'Configuration',\n })}\n subtitle={formatMessage({\n id: 'email.Settings.email.plugin.subTitle',\n defaultMessage: 'Test the settings for the Email plugin',\n })}\n />\n\n <Layouts.Content>\n {data && (\n <form onSubmit={handleSubmit}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={7}>\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.email.plugin.title.config',\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'email.Settings.email.plugin.text.configuration',\n defaultMessage:\n 'The plugin is configured through the {file} file, checkout this {link} for the documentation.',\n },\n {\n file: './config/plugins.js',\n link: (\n <DocumentationLink\n href=\"https://docs.strapi.io/developer-docs/latest/plugins/email.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {formatMessage({\n id: 'email.link',\n defaultMessage: 'Link',\n })}\n </DocumentationLink>\n ),\n }\n )}\n </Typography>\n </Flex>\n\n <Grid.Root gap={5}>\n {(() => {\n const parsedFrom = parseEmailAddress(data.settings.defaultFrom);\n const parsedReplyTo = parseEmailAddress(data.settings.defaultReplyTo);\n\n return (\n <>\n {/* Sender Name - only show if name is present */}\n {parsedFrom.name && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"sender-name\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.senderName',\n defaultMessage: 'Default sender name',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={parsedFrom.name} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {/* Sender Email */}\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"sender-email\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.defaultFrom',\n defaultMessage: 'Default sender email',\n })}\n </Field.Label>\n <TextInput\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.defaultFrom',\n defaultMessage: 'ex: no-reply@strapi.io',\n })}\n disabled\n readOnly\n value={parsedFrom.email}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n\n {/* Reply-To Name - only show if name is present */}\n {parsedReplyTo.name && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"reply-to-name\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.replyToName',\n defaultMessage: 'Default reply-to name',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={parsedReplyTo.name} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {/* Reply-To Email */}\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"reply-to-email\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.defaultReplyTo',\n defaultMessage: 'Default response email',\n })}\n </Field.Label>\n <TextInput\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.defaultReplyTo',\n defaultMessage: 'ex: support@strapi.io',\n })}\n disabled\n readOnly\n value={parsedReplyTo.email}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n </>\n );\n })()}\n\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"email-provider\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.provider',\n defaultMessage: 'Email provider',\n })}\n </Field.Label>\n <SingleSelect disabled value={data.provider}>\n <SingleSelectOption value={data.provider}>\n {data.provider}\n </SingleSelectOption>\n </SingleSelect>\n </Field.Root>\n </Grid.Item>\n\n {data.supportsVerify && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"start\">\n <Field.Root name=\"verify-connection\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.verifyConnection',\n defaultMessage: 'Connection status',\n })}\n </Field.Label>\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"secondary\"\n loading={verifyMutation.isLoading}\n onClick={() => verifyMutation.mutate()}\n type=\"button\"\n >\n {formatMessage({\n id: 'email.Settings.email.plugin.button.verify',\n defaultMessage: 'Test connection',\n })}\n </Button>\n {connectionStatus === 'success' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n <Flex gap={1}>\n <Check width=\"1.2rem\" height=\"1.2rem\" />\n {formatMessage({\n id: 'email.Settings.email.plugin.status.connected',\n defaultMessage: 'Connected',\n })}\n </Flex>\n </Badge>\n )}\n {connectionStatus === 'error' && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n <Flex gap={1}>\n <Cross width=\"1.2rem\" height=\"1.2rem\" />\n {formatMessage({\n id: 'email.Settings.email.plugin.status.error',\n defaultMessage: 'Error',\n })}\n </Flex>\n </Badge>\n )}\n </Flex>\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n\n {data.capabilities &&\n (data.capabilities.transport ||\n data.capabilities.auth ||\n (data.capabilities.features && data.capabilities.features.length > 0)) && (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <CapabilitiesSection\n capabilities={data.capabilities}\n isIdle={data.isIdle}\n formatMessage={formatMessage}\n />\n </Box>\n )}\n\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={4}\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.email.plugin.title.test',\n defaultMessage: 'Test email delivery',\n })}\n </Typography>\n\n <Grid.Root gap={5}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"test-address\"\n error={\n formErrors.email?.id &&\n formatMessage({\n id: `email.${formErrors.email?.id}`,\n defaultMessage: 'This is not a valid email',\n })\n }\n >\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.testAddress',\n defaultMessage: 'Recipient email',\n })}\n </Field.Label>\n <TextInput\n onChange={handleChange}\n value={testAddress}\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.testAddress',\n defaultMessage: 'ex: developer@example.com',\n })}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={7} xs={12} direction=\"column\" alignItems=\"start\">\n <Button\n loading={mutation.isLoading}\n disabled={!isTestAddressValid}\n type=\"submit\"\n startIcon={<Mail />}\n >\n {formatMessage({\n id: 'email.Settings.email.plugin.button.test-email',\n defaultMessage: 'Send test email',\n })}\n </Button>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Flex>\n </form>\n )}\n </Layouts.Content>\n </Page.Main>\n );\n};\n"],"names":["DocumentationLink","styled","a","theme","colors","primary600","FEATURE_LABELS","dkim","id","defaultMessage","pool","rateLimiting","oauth2","requireTLS","CapabilitiesSection","capabilities","isIdle","formatMessage","transport","auth","features","encryptionLabel","secure","port","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","Grid","Root","host","Item","col","xs","Field","name","Label","TextInput","disabled","readOnly","value","String","type","user","undefined","Badge","backgroundColor","textColor","length","wrap","map","f","ProtectedSettingsPage","Page","Protect","permissions","PERMISSIONS","settings","SettingsPage","toggleNotification","useNotification","useIntl","get","post","useFetchClient","testAddress","setTestAddress","React","useState","isTestAddressValid","setIsTestAddressValid","formErrors","setFormErrors","data","isLoading","useQuery","res","config","supportsVerify","mutation","useMutation","body","onError","message","to","onSuccess","retry","connectionStatus","setConnectionStatus","verifyMutation","onMutate","useEffect","schema","validate","email","abortEarly","then","catch","handleChange","event","target","handleSubmit","preventDefault","error","ValidationError","getYupInnerErrors","mutate","Loading","Main","labelledBy","aria-busy","Title","Layouts","Header","title","subtitle","Content","form","onSubmit","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","file","link","href","rel","parsedFrom","parseEmailAddress","defaultFrom","parsedReplyTo","defaultReplyTo","_Fragment","placeholder","SingleSelect","provider","SingleSelectOption","Button","loading","onClick","Check","width","height","Cross","onChange","startIcon","Mail"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Settings.js","sources":["../../../admin/src/pages/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useFetchClient, Layouts } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n Grid,\n SingleSelectOption,\n SingleSelect,\n TextInput,\n Typography,\n Field,\n Badge,\n} from '@strapi/design-system';\nimport { Mail, Check, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useMutation } from 'react-query';\nimport { styled } from 'styled-components';\nimport { ValidationError } from 'yup';\n\nimport { parseEmailAddress } from '../../../shared/email-address-parser';\nimport { PERMISSIONS } from '../constants';\nimport { getYupInnerErrors } from '../utils/getYupInnerErrors';\nimport { schema } from '../utils/schema';\n\nimport type { EmailSettings, ProviderCapabilities } from '../../../shared/types';\n\nconst DocumentationLink = styled.a`\n color: ${({ theme }) => theme.colors.primary600};\n`;\n\ninterface MutationBody {\n to: string;\n}\n\nconst FEATURE_LABELS: Record<string, { id: string; defaultMessage: string }> = {\n dkim: {\n id: 'email.Settings.capabilities.feature.dkim',\n defaultMessage: 'DKIM',\n },\n pool: {\n id: 'email.Settings.capabilities.feature.pool',\n defaultMessage: 'Connection pool',\n },\n rateLimiting: {\n id: 'email.Settings.capabilities.feature.rateLimiting',\n defaultMessage: 'Rate limiting',\n },\n oauth2: {\n id: 'email.Settings.capabilities.feature.oauth2',\n defaultMessage: 'OAuth2',\n },\n requireTLS: {\n id: 'email.Settings.capabilities.feature.requireTLS',\n defaultMessage: 'Require TLS',\n },\n};\n\nconst CapabilitiesSection = ({\n capabilities,\n isIdle,\n formatMessage,\n}: {\n capabilities: ProviderCapabilities;\n isIdle?: boolean;\n formatMessage: (msg: { id: string; defaultMessage: string }) => string;\n}) => {\n const transport = capabilities.transport;\n const auth = capabilities.auth;\n const features = capabilities.features ?? [];\n\n const encryptionLabel =\n transport?.secure === true\n ? 'TLS'\n : transport?.port === 587\n ? 'STARTTLS'\n : transport?.port === 465\n ? 'TLS'\n : 'None';\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.capabilities.title',\n defaultMessage: 'Provider capabilities',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'email.Settings.capabilities.subtitle',\n defaultMessage: 'Current SMTP configuration and enabled features',\n })}\n </Typography>\n </Flex>\n\n <Grid.Root gap={5}>\n {transport && (transport.host || transport.port) && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"smtp-server\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.smtpServer',\n defaultMessage: 'SMTP server',\n })}\n </Field.Label>\n <TextInput\n disabled\n readOnly\n value={\n transport.host && transport.port\n ? `${transport.host}:${transport.port}`\n : transport.host || String(transport.port)\n }\n />\n </Field.Root>\n </Grid.Item>\n )}\n\n {transport && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"encryption\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.encryption',\n defaultMessage: 'Encryption',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={encryptionLabel} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {auth && (auth.type || auth.user) && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"auth-type\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.authType',\n defaultMessage: 'Authentication',\n })}\n </Field.Label>\n <TextInput\n disabled\n readOnly\n value={\n auth.type\n ? auth.user\n ? `${auth.type} (${auth.user})`\n : auth.type\n : auth.user || 'None'\n }\n />\n </Field.Root>\n </Grid.Item>\n )}\n\n {transport?.pool && isIdle !== undefined && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"pool-status\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.poolStatus',\n defaultMessage: 'Pool status',\n })}\n </Field.Label>\n <Badge\n backgroundColor={isIdle ? 'success100' : 'primary100'}\n textColor={isIdle ? 'success700' : 'primary700'}\n >\n {isIdle\n ? formatMessage({\n id: 'email.Settings.capabilities.poolStatus.idle',\n defaultMessage: 'Idle',\n })\n : formatMessage({\n id: 'email.Settings.capabilities.poolStatus.active',\n defaultMessage: 'Active',\n })}\n </Badge>\n </Field.Root>\n </Grid.Item>\n )}\n\n {features.length > 0 && (\n <Grid.Item col={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"features\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.capabilities.label.features',\n defaultMessage: 'Enabled features',\n })}\n </Field.Label>\n <Flex gap={2} wrap=\"wrap\">\n {features.map((f) => (\n <Badge key={f} backgroundColor=\"neutral100\" textColor=\"neutral700\">\n {formatMessage(\n FEATURE_LABELS[f] ?? {\n id: `email.Settings.capabilities.feature.${f}`,\n defaultMessage: f,\n }\n )}\n </Badge>\n ))}\n </Flex>\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n\nconst SettingsPage = () => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { get, post } = useFetchClient();\n\n const [testAddress, setTestAddress] = React.useState('');\n const [isTestAddressValid, setIsTestAddressValid] = React.useState(false);\n\n // TODO: I'm not sure how to type this. I think it should be Record<string, TranslationMessage> but that type is defined in the helper-plugin\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [formErrors, setFormErrors] = React.useState<Record<string, any>>({});\n\n const { data, isLoading } = useQuery(['email', 'settings'], async () => {\n const res = await get<EmailSettings>('/email/settings');\n const {\n data: { config, supportsVerify, capabilities, isIdle },\n } = res;\n\n return { ...config, supportsVerify, capabilities, isIdle };\n });\n\n const mutation = useMutation<void, Error, MutationBody>(\n async (body) => {\n await post('/email/test', body);\n },\n {\n onError() {\n toggleNotification!({\n type: 'danger',\n message: formatMessage(\n {\n id: 'email.Settings.email.plugin.notification.test.error',\n defaultMessage: 'Failed to send a test mail to {to}',\n },\n { to: testAddress }\n ),\n });\n },\n onSuccess() {\n toggleNotification!({\n type: 'success',\n message: formatMessage(\n {\n id: 'email.Settings.email.plugin.notification.test.success',\n defaultMessage: 'Email test succeeded, check the {to} mailbox',\n },\n { to: testAddress }\n ),\n });\n },\n retry: false,\n }\n );\n\n const [connectionStatus, setConnectionStatus] = React.useState<\n 'idle' | 'loading' | 'success' | 'error'\n >('idle');\n\n const verifyMutation = useMutation(\n async () => {\n await post('/email/verify', {});\n },\n {\n onMutate() {\n setConnectionStatus('loading');\n },\n onError() {\n setConnectionStatus('error');\n toggleNotification!({\n type: 'danger',\n message: formatMessage({\n id: 'email.Settings.email.plugin.notification.verify.error',\n defaultMessage: 'Connection verification failed',\n }),\n });\n },\n onSuccess() {\n setConnectionStatus('success');\n toggleNotification!({\n type: 'success',\n message: formatMessage({\n id: 'email.Settings.email.plugin.notification.verify.success',\n defaultMessage: 'Connection verified successfully',\n }),\n });\n },\n retry: false,\n }\n );\n\n React.useEffect(() => {\n schema\n .validate({ email: testAddress }, { abortEarly: false })\n .then(() => setIsTestAddressValid(true))\n .catch(() => setIsTestAddressValid(false));\n }, [testAddress]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setTestAddress(() => event.target.value);\n };\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n try {\n await schema.validate({ email: testAddress }, { abortEarly: false });\n } catch (error) {\n if (error instanceof ValidationError) {\n setFormErrors(getYupInnerErrors(error));\n }\n }\n\n mutation.mutate({ to: testAddress });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main labelledBy=\"title\" aria-busy={isLoading || mutation.isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'email.Settings.email.plugin.title',\n defaultMessage: 'Configuration',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n id=\"title\"\n title={formatMessage({\n id: 'email.Settings.email.plugin.title',\n defaultMessage: 'Configuration',\n })}\n subtitle={formatMessage({\n id: 'email.Settings.email.plugin.subTitle',\n defaultMessage: 'Test the settings for the Email plugin',\n })}\n />\n\n <Layouts.Content>\n {data && (\n <form onSubmit={handleSubmit}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={7}>\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.email.plugin.title.config',\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'email.Settings.email.plugin.text.configuration',\n defaultMessage:\n 'The plugin is configured through the {file} file, checkout this {link} for the documentation.',\n },\n {\n file: './config/plugins.js',\n link: (\n <DocumentationLink\n href=\"https://docs.strapi.io/developer-docs/latest/plugins/email.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {formatMessage({\n id: 'email.link',\n defaultMessage: 'Link',\n })}\n </DocumentationLink>\n ),\n }\n )}\n </Typography>\n </Flex>\n\n <Grid.Root gap={5}>\n {(() => {\n const parsedFrom = parseEmailAddress(data.settings.defaultFrom);\n const parsedReplyTo = parseEmailAddress(data.settings.defaultReplyTo);\n\n return (\n <>\n {/* Sender Name - only show if name is present */}\n {parsedFrom.name && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"sender-name\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.senderName',\n defaultMessage: 'Default sender name',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={parsedFrom.name} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {/* Sender Email */}\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"sender-email\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.defaultFrom',\n defaultMessage: 'Default sender email',\n })}\n </Field.Label>\n <TextInput\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.defaultFrom',\n defaultMessage: 'ex: no-reply@strapi.io',\n })}\n disabled\n readOnly\n value={parsedFrom.email}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n\n {/* Reply-To Name - only show if name is present */}\n {parsedReplyTo.name && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"reply-to-name\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.replyToName',\n defaultMessage: 'Default reply-to name',\n })}\n </Field.Label>\n <TextInput disabled readOnly value={parsedReplyTo.name} />\n </Field.Root>\n </Grid.Item>\n )}\n\n {/* Reply-To Email */}\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"reply-to-email\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.defaultReplyTo',\n defaultMessage: 'Default response email',\n })}\n </Field.Label>\n <TextInput\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.defaultReplyTo',\n defaultMessage: 'ex: support@strapi.io',\n })}\n disabled\n readOnly\n value={parsedReplyTo.email}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n </>\n );\n })()}\n\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"email-provider\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.provider',\n defaultMessage: 'Email provider',\n })}\n </Field.Label>\n <SingleSelect disabled value={data.provider}>\n <SingleSelectOption value={data.provider}>\n {data.provider}\n </SingleSelectOption>\n </SingleSelect>\n </Field.Root>\n </Grid.Item>\n\n {data.supportsVerify && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"start\">\n <Field.Root name=\"verify-connection\">\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.verifyConnection',\n defaultMessage: 'Connection status',\n })}\n </Field.Label>\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"secondary\"\n loading={verifyMutation.isLoading}\n onClick={() => verifyMutation.mutate()}\n type=\"button\"\n >\n {formatMessage({\n id: 'email.Settings.email.plugin.button.verify',\n defaultMessage: 'Test connection',\n })}\n </Button>\n {connectionStatus === 'success' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n <Flex gap={1}>\n <Check width=\"1.2rem\" height=\"1.2rem\" />\n {formatMessage({\n id: 'email.Settings.email.plugin.status.connected',\n defaultMessage: 'Connected',\n })}\n </Flex>\n </Badge>\n )}\n {connectionStatus === 'error' && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n <Flex gap={1}>\n <Cross width=\"1.2rem\" height=\"1.2rem\" />\n {formatMessage({\n id: 'email.Settings.email.plugin.status.error',\n defaultMessage: 'Error',\n })}\n </Flex>\n </Badge>\n )}\n </Flex>\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n\n {data.capabilities &&\n (data.capabilities.transport ||\n data.capabilities.auth ||\n (data.capabilities.features && data.capabilities.features.length > 0)) && (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <CapabilitiesSection\n capabilities={data.capabilities}\n isIdle={data.isIdle}\n formatMessage={formatMessage}\n />\n </Box>\n )}\n\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={4}\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'email.Settings.email.plugin.title.test',\n defaultMessage: 'Test email delivery',\n })}\n </Typography>\n\n <Grid.Root gap={5}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"test-address\"\n error={\n formErrors.email?.id &&\n formatMessage({\n id: `email.${formErrors.email?.id}`,\n defaultMessage: 'This is not a valid email',\n })\n }\n >\n <Field.Label>\n {formatMessage({\n id: 'email.Settings.email.plugin.label.testAddress',\n defaultMessage: 'Recipient email',\n })}\n </Field.Label>\n <TextInput\n onChange={handleChange}\n value={testAddress}\n placeholder={formatMessage({\n id: 'email.Settings.email.plugin.placeholder.testAddress',\n defaultMessage: 'ex: developer@example.com',\n })}\n type=\"email\"\n />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={7} xs={12} direction=\"column\" alignItems=\"start\">\n <Button\n loading={mutation.isLoading}\n disabled={!isTestAddressValid}\n type=\"submit\"\n startIcon={<Mail />}\n >\n {formatMessage({\n id: 'email.Settings.email.plugin.button.test-email',\n defaultMessage: 'Send test email',\n })}\n </Button>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Flex>\n </form>\n )}\n </Layouts.Content>\n </Page.Main>\n );\n};\n"],"names":["DocumentationLink","styled","a","theme","colors","primary600","FEATURE_LABELS","dkim","id","defaultMessage","pool","rateLimiting","oauth2","requireTLS","CapabilitiesSection","capabilities","isIdle","formatMessage","transport","auth","features","encryptionLabel","secure","port","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","Grid","Root","host","Item","col","xs","Field","name","Label","TextInput","disabled","readOnly","value","String","type","user","undefined","Badge","backgroundColor","textColor","length","wrap","map","f","ProtectedSettingsPage","Page","Protect","permissions","PERMISSIONS","settings","SettingsPage","toggleNotification","useNotification","useIntl","get","post","useFetchClient","testAddress","setTestAddress","React","useState","isTestAddressValid","setIsTestAddressValid","formErrors","setFormErrors","data","isLoading","useQuery","res","config","supportsVerify","mutation","useMutation","body","onError","message","to","onSuccess","retry","connectionStatus","setConnectionStatus","verifyMutation","onMutate","useEffect","schema","validate","email","abortEarly","then","catch","handleChange","event","target","handleSubmit","preventDefault","error","ValidationError","getYupInnerErrors","mutate","Loading","Main","labelledBy","aria-busy","Title","Layouts","Header","title","subtitle","Content","form","onSubmit","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","file","link","href","rel","parsedFrom","parseEmailAddress","defaultFrom","parsedReplyTo","defaultReplyTo","_Fragment","placeholder","SingleSelect","provider","SingleSelectOption","Button","loading","onClick","Check","width","height","Cross","onChange","startIcon","Mail"],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
4
4
|
var yup = require('yup');
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
7
8
|
var n = Object.create(null);
|
|
8
9
|
if (e) {
|
|
9
10
|
Object.keys(e).forEach(function (k) {
|
|
@@ -20,7 +21,7 @@ function _interopNamespaceDefault(e) {
|
|
|
20
21
|
return Object.freeze(n);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
var yup__namespace = /*#__PURE__*/
|
|
24
|
+
var yup__namespace = /*#__PURE__*/_interopNamespace(yup);
|
|
24
25
|
|
|
25
26
|
const schema = yup__namespace.object().shape({
|
|
26
27
|
email: yup__namespace.string().email(strapiAdmin.translatedErrors.email.id).required(strapiAdmin.translatedErrors.required.id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sources":["../../../admin/src/utils/schema.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport * as yup from 'yup';\n\nexport const schema = yup.object().shape({\n email: yup.string().email(translatedErrors.email.id).required(translatedErrors.required.id),\n});\n"],"names":["schema","yup","object","shape","email","string","translatedErrors","id","required"],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.js","sources":["../../../admin/src/utils/schema.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport * as yup from 'yup';\n\nexport const schema = yup.object().shape({\n email: yup.string().email(translatedErrors.email.id).required(translatedErrors.required.id),\n});\n"],"names":["schema","yup","object","shape","email","string","translatedErrors","id","required"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;MAGaA,MAAAA,GAASC,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACvCC,IAAAA,KAAAA,EAAOH,cAAAA,CAAII,MAAM,EAAA,CAAGD,KAAK,CAACE,4BAAAA,CAAiBF,KAAK,CAACG,EAAE,EAAEC,QAAQ,CAACF,4BAAAA,CAAiBE,QAAQ,CAACD,EAAE;AAC5F,CAAA;;;;"}
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
4
|
var fp = require('lodash/fp');
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var utils__default = /*#__PURE__*/_interopDefault(utils);
|
|
9
|
+
|
|
10
|
+
const { RateLimitError } = utils__default.default.errors;
|
|
7
11
|
var rateLimit = ((config, { strapi })=>async (ctx, next)=>{
|
|
8
12
|
const pluginConfig = strapi.config.get('plugin::email');
|
|
9
13
|
const rateLimitConfig = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.js","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport utils from '@strapi/utils';\nimport { isString, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n const pluginConfig = strapi.config.get('plugin::email') as any;\n const rateLimitConfig = {\n enabled: true,\n ...(pluginConfig.ratelimit || {}),\n };\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","pluginConfig","get","rateLimitConfig","enabled","ratelimit","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","loadConfig","interval","min","max","prefixKey","handler","middleware"],"mappings":"
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sources":["../../../server/src/middlewares/rateLimit.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport utils from '@strapi/utils';\nimport { isString, get } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nconst { RateLimitError } = utils.errors;\n\nexport default (config: any, { strapi }: { strapi: Core.Strapi }) =>\n async (ctx: Context, next: Next) => {\n const pluginConfig = strapi.config.get('plugin::email') as any;\n const rateLimitConfig = {\n enabled: true,\n ...(pluginConfig.ratelimit || {}),\n };\n\n if (rateLimitConfig.enabled === true) {\n // TODO: TS - Do the dynamic import\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rateLimit = require('koa2-ratelimit').RateLimit;\n\n const requestEmail = get('request.body.email')(ctx);\n const userEmail = isString(requestEmail) ? requestEmail.toLowerCase() : 'unknownEmail';\n\n const loadConfig = {\n interval: { min: 5 },\n max: 5,\n prefixKey: `${userEmail}`,\n handler() {\n throw new RateLimitError();\n },\n ...rateLimitConfig,\n ...config,\n };\n\n return rateLimit.middleware(loadConfig)(ctx, next);\n }\n\n return next();\n };\n"],"names":["RateLimitError","utils","errors","config","strapi","ctx","next","pluginConfig","get","rateLimitConfig","enabled","ratelimit","rateLimit","require","RateLimit","requestEmail","userEmail","isString","toLowerCase","loadConfig","interval","min","max","prefixKey","handler","middleware"],"mappings":";;;;;;;;;AAKA,MAAM,EAAEA,cAAc,EAAE,GAAGC,uBAAMC,MAAM;AAEvC,gBAAe,CAAA,CAACC,MAAAA,EAAa,EAAEC,MAAM,EAA2B,GAC9D,OAAOC,GAAAA,EAAcC,IAAAA,GAAAA;AACnB,QAAA,MAAMC,YAAAA,GAAeH,MAAAA,CAAOD,MAAM,CAACK,GAAG,CAAC,eAAA,CAAA;AACvC,QAAA,MAAMC,eAAAA,GAAkB;YACtBC,OAAAA,EAAS,IAAA;AACT,YAAA,GAAIH,YAAAA,CAAaI,SAAS,IAAI;AAChC,SAAA;QAEA,IAAIF,eAAAA,CAAgBC,OAAO,KAAK,IAAA,EAAM;;;YAGpC,MAAME,SAAAA,GAAYC,OAAAA,CAAQ,gBAAA,CAAA,CAAkBC,SAAS;YAErD,MAAMC,YAAAA,GAAeP,OAAI,oBAAA,CAAA,CAAsBH,GAAAA,CAAAA;AAC/C,YAAA,MAAMW,SAAAA,GAAYC,WAAAA,CAASF,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaG,WAAW,EAAA,GAAK,cAAA;AAExE,YAAA,MAAMC,UAAAA,GAAa;gBACjBC,QAAAA,EAAU;oBAAEC,GAAAA,EAAK;AAAE,iBAAA;gBACnBC,GAAAA,EAAK,CAAA;AACLC,gBAAAA,SAAAA,EAAW,GAAGP,SAAAA,CAAAA,CAAW;AACzBQ,gBAAAA,OAAAA,CAAAA,GAAAA;AACE,oBAAA,MAAM,IAAIxB,cAAAA,EAAAA;AACZ,gBAAA,CAAA;AACA,gBAAA,GAAGS,eAAe;AAClB,gBAAA,GAAGN;AACL,aAAA;AAEA,YAAA,OAAOS,SAAAA,CAAUa,UAAU,CAACN,UAAAA,CAAAA,CAAYd,GAAAA,EAAKC,IAAAA,CAAAA;AAC/C,QAAA;QAEA,OAAOA,IAAAA,EAAAA;AACT,IAAA,CAAA;;;;"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var z = require('zod/v4');
|
|
4
4
|
|
|
5
|
-
function
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
6
7
|
var n = Object.create(null);
|
|
7
8
|
if (e) {
|
|
8
9
|
Object.keys(e).forEach(function (k) {
|
|
@@ -19,7 +20,7 @@ function _interopNamespaceDefault(e) {
|
|
|
19
20
|
return Object.freeze(n);
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
var z__namespace = /*#__PURE__*/
|
|
23
|
+
var z__namespace = /*#__PURE__*/_interopNamespace(z);
|
|
23
24
|
|
|
24
25
|
class EmailRouteValidator {
|
|
25
26
|
get sendEmailInput() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sources":["../../../../server/src/routes/validation/email.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\n\nexport class EmailRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n this._strapi = strapi;\n }\n\n get sendEmailInput() {\n return z\n .object({\n from: z.string().optional(),\n to: z.string(),\n cc: z.string().optional(),\n bcc: z.string().optional(),\n replyTo: z.string().optional(),\n subject: z.string(),\n text: z.string(),\n html: z.string().optional(),\n })\n .catchall(z.string());\n }\n\n get emailResponse() {\n return z.object({});\n }\n}\n"],"names":["EmailRouteValidator","sendEmailInput","z","object","from","string","optional","to","cc","bcc","replyTo","subject","text","html","catchall","emailResponse","strapi","_strapi"],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.js","sources":["../../../../server/src/routes/validation/email.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\n\nexport class EmailRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n this._strapi = strapi;\n }\n\n get sendEmailInput() {\n return z\n .object({\n from: z.string().optional(),\n to: z.string(),\n cc: z.string().optional(),\n bcc: z.string().optional(),\n replyTo: z.string().optional(),\n subject: z.string(),\n text: z.string(),\n html: z.string().optional(),\n })\n .catchall(z.string());\n }\n\n get emailResponse() {\n return z.object({});\n }\n}\n"],"names":["EmailRouteValidator","sendEmailInput","z","object","from","string","optional","to","cc","bcc","replyTo","subject","text","html","catchall","emailResponse","strapi","_strapi"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAMA,mBAAAA,CAAAA;AAOX,IAAA,IAAIC,cAAAA,GAAiB;QACnB,OAAOC,YAAAA,CACJC,MAAM,CAAC;YACNC,IAAAA,EAAMF,YAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AACzBC,YAAAA,EAAAA,EAAIL,aAAEG,MAAM,EAAA;YACZG,EAAAA,EAAIN,YAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;YACvBG,GAAAA,EAAKP,YAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;YACxBI,OAAAA,EAASR,YAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AAC5BK,YAAAA,OAAAA,EAAST,aAAEG,MAAM,EAAA;AACjBO,YAAAA,IAAAA,EAAMV,aAAEG,MAAM,EAAA;YACdQ,IAAAA,EAAMX,YAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ;SAC3B,CAAA,CACCQ,QAAQ,CAACZ,YAAAA,CAAEG,MAAM,EAAA,CAAA;AACtB,IAAA;AAEA,IAAA,IAAIU,aAAAA,GAAgB;QAClB,OAAOb,YAAAA,CAAEC,MAAM,CAAC,EAAC,CAAA;AACnB,IAAA;AArBA,IAAA,WAAA,CAAmBa,MAAmB,CAAE;QACtC,IAAI,CAACC,OAAO,GAAGD,MAAAA;AACjB,IAAA;AAoBF;;;;"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
7
8
|
var n = Object.create(null);
|
|
8
9
|
if (e) {
|
|
9
10
|
Object.keys(e).forEach(function (k) {
|
|
@@ -20,7 +21,7 @@ function _interopNamespaceDefault(e) {
|
|
|
20
21
|
return Object.freeze(n);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
var ___namespace = /*#__PURE__*/
|
|
24
|
+
var ___namespace = /*#__PURE__*/_interopNamespace(_);
|
|
24
25
|
|
|
25
26
|
const { createStrictInterpolationRegExp } = utils.template;
|
|
26
27
|
const getProviderSettings = ()=>strapi.config.get('plugin::email');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = () => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n});\n\nexport default emailService;\n"],"names":["createStrictInterpolationRegExp","template","getProviderSettings","strapi","config","get","send","options","plugin","provider","sendTemplatedEmail","emailOptions","emailTemplate","data","attributes","missingAttributes","_","difference","Object","keys","length","Error","join","allowedInterpolationVariables","objects","keysDeep","interpolate","templatedAttributes","reduce","compiled","attribute","assign","emailService"],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.js","sources":["../../../server/src/services/email.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport { objects, template } from '@strapi/utils';\n\nimport type {\n EmailConfig,\n EmailOptions,\n EmailTemplate,\n EmailTemplateData,\n SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin::email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n emailOptions: EmailOptions,\n emailTemplate: EmailTemplate,\n data: EmailTemplateData\n) => {\n const attributes = ['subject', 'text', 'html'];\n const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n if (missingAttributes.length > 0) {\n throw new Error(\n `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n );\n }\n\n const allowedInterpolationVariables = objects.keysDeep(data);\n const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n const templatedAttributes = attributes.reduce(\n (compiled, attribute) =>\n emailTemplate[attribute]\n ? Object.assign(compiled, {\n [attribute]: _.template(emailTemplate[attribute], {\n interpolate,\n })(data),\n })\n : compiled,\n {}\n );\n\n return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = () => ({\n getProviderSettings,\n send,\n sendTemplatedEmail,\n});\n\nexport default emailService;\n"],"names":["createStrictInterpolationRegExp","template","getProviderSettings","strapi","config","get","send","options","plugin","provider","sendTemplatedEmail","emailOptions","emailTemplate","data","attributes","missingAttributes","_","difference","Object","keys","length","Error","join","allowedInterpolationVariables","objects","keysDeep","interpolate","templatedAttributes","reduce","compiled","attribute","assign","emailService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAWA,MAAM,EAAEA,+BAA+B,EAAE,GAAGC,cAAAA;AAE5C,MAAMC,sBAAsB,IAAmBC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAA,CAAA;AAEjE,MAAMC,IAAAA,GAAO,OAAOC,OAAAA,GAAyBJ,MAAAA,CAAOK,MAAM,CAAC,OAAA,CAAA,CAASC,QAAQ,CAACH,IAAI,CAACC,OAAAA,CAAAA;AAElF;;;;;;AAMC,IACD,MAAMG,kBAAAA,GAAqB,CACzBC,YAAAA,EACAC,aAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,UAAAA,GAAa;AAAC,QAAA,SAAA;AAAW,QAAA,MAAA;AAAQ,QAAA;AAAO,KAAA;AAC9C,IAAA,MAAMC,oBAAoBC,YAAAA,CAAEC,UAAU,CAACH,UAAAA,EAAYI,MAAAA,CAAOC,IAAI,CAACP,aAAAA,CAAAA,CAAAA;IAE/D,IAAIG,iBAAAA,CAAkBK,MAAM,GAAG,CAAA,EAAG;QAChC,MAAM,IAAIC,MACR,CAAC,4DAA4D,EAAEN,iBAAAA,CAAkBO,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAEjG,IAAA;IAEA,MAAMC,6BAAAA,GAAgCC,aAAAA,CAAQC,QAAQ,CAACZ,IAAAA,CAAAA;IACvD,MAAMa,WAAAA,GAAc1B,gCAAgCuB,6BAAAA,EAA+B,GAAA,CAAA;AAEnF,IAAA,MAAMI,mBAAAA,GAAsBb,UAAAA,CAAWc,MAAM,CAC3C,CAACC,QAAAA,EAAUC,SAAAA,GACTlB,aAAa,CAACkB,SAAAA,CAAU,GACpBZ,MAAAA,CAAOa,MAAM,CAACF,QAAAA,EAAU;YACtB,CAACC,SAAAA,GAAYd,YAAAA,CAAEf,QAAQ,CAACW,aAAa,CAACkB,UAAU,EAAE;AAChDJ,gBAAAA;aACF,CAAA,CAAGb,IAAAA;AACL,SAAA,CAAA,GACAgB,UACN,EAAC,CAAA;AAGH,IAAA,OAAO1B,OAAOK,MAAM,CAAC,SAASC,QAAQ,CAACH,IAAI,CAAC;AAAE,QAAA,GAAGK,YAAY;AAAE,QAAA,GAAGgB;AAAoB,KAAA,CAAA;AACxF,CAAA;AAEA,MAAMK,YAAAA,GAAe,KAAO;AAC1B9B,QAAAA,mBAAAA;AACAI,QAAAA,IAAAA;AACAI,QAAAA;KACF;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/email",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.49.0",
|
|
4
4
|
"description": "Easily configure your Strapi application to send emails.",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"@strapi/design-system": "2.2.0",
|
|
65
65
|
"@strapi/icons": "2.2.0",
|
|
66
|
-
"@strapi/provider-email-sendmail": "5.
|
|
67
|
-
"@strapi/utils": "5.
|
|
66
|
+
"@strapi/provider-email-sendmail": "5.49.0",
|
|
67
|
+
"@strapi/utils": "5.49.0",
|
|
68
68
|
"koa2-ratelimit": "^1.1.3",
|
|
69
69
|
"lodash": "4.18.1",
|
|
70
70
|
"react-intl": "6.6.2",
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
"zod": "3.25.67"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@strapi/admin": "5.
|
|
77
|
-
"@strapi/types": "5.
|
|
76
|
+
"@strapi/admin": "5.49.0",
|
|
77
|
+
"@strapi/types": "5.49.0",
|
|
78
78
|
"@testing-library/react": "16.3.2",
|
|
79
79
|
"@types/koa": "2.13.4",
|
|
80
80
|
"@types/lodash": "^4.14.191",
|