diff --git a/shared/studio/tabs/auth/index.tsx b/shared/studio/tabs/auth/index.tsx
index 4c9d594b..87d2bbfe 100644
--- a/shared/studio/tabs/auth/index.tsx
+++ b/shared/studio/tabs/auth/index.tsx
@@ -282,7 +282,9 @@ const ConfigPage = observer(function ConfigPage() {
state.draftTokenTime.value ??
state.configData.token_time_to_live
}
- onChange={(dur) => state.draftTokenTime.setValue(dur)}
+ onChange={(dur) =>
+ state.draftTokenTime.setValue(dur.toUpperCase())
+ }
error={state.draftTokenTime.error}
/>
{state.draftTokenTime.value != null ? (
@@ -583,7 +585,8 @@ const SMTPConfigPage = observer(function SMTPConfigPage() {
/>
- Maximum time to send an email, including retry attempts.
+ Maximum time in seconds to send an email, including retry
+ attempts.
@@ -601,7 +604,7 @@ const SMTPConfigPage = observer(function SMTPConfigPage() {
/>
- Maximum time for each SMTP request.
+ Maximum time in seconds for each SMTP request.
diff --git a/shared/studio/tabs/auth/state/index.tsx b/shared/studio/tabs/auth/state/index.tsx
index 9a7bd77f..f56f354d 100644
--- a/shared/studio/tabs/auth/state/index.tsx
+++ b/shared/studio/tabs/auth/state/index.tsx
@@ -127,7 +127,17 @@ export class AuthAdminState extends Model({
"std::duration",
(dur) => {
if (dur === null) return null;
- return /^\d+$/.test(dur) ? null : "Invalid duration";
+ dur = dur.trim();
+ if (!dur.length) {
+ return `Duration is required`;
+ }
+ try {
+ if (/^\d+$/.test(dur)) return null;
+ parsers["std::duration"](dur, null);
+ } catch {
+ return `Invalid duration`;
+ }
+ return null;
}
),
draftAllowedRedirectUrls: createDraftAuthConfig(
@@ -269,8 +279,8 @@ export class AuthAdminState extends Model({
username,
security,
validate_certs,
- timeout_per_email,
- timeout_per_attempt
+ timeout_per_email_seconds := duration_get(.timeout_per_email, 'totalseconds'),
+ timeout_per_attempt_seconds := duration_get(.timeout_per_attempt, 'totalseconds'),
})
}`,
undefined,
@@ -295,8 +305,8 @@ export class AuthAdminState extends Model({
this.smtpConfig = {
...smtp,
port: smtp.port?.toString(),
- timeout_per_email: smtp.timeout_per_email.toString(),
- timeout_per_attempt: smtp.timeout_per_attempt.toString(),
+ timeout_per_email: smtp.timeout_per_email_seconds,
+ timeout_per_attempt: smtp.timeout_per_attempt_seconds,
};
});
}
@@ -455,11 +465,12 @@ export class DraftSMTPConfig extends Model({
@computed
get timeoutPerEmailError() {
- const val = this.getConfigValue("timeout_per_email");
+ const val = this.getConfigValue("timeout_per_email").trim();
if (!val.length) {
return `Value is required`;
}
try {
+ if (/^\d+$/.test(val)) return null;
parsers["std::duration"](val, null);
} catch {
return `Invalid duration`;
@@ -469,11 +480,12 @@ export class DraftSMTPConfig extends Model({
@computed
get timeoutPerAttemptError() {
- const val = this.getConfigValue("timeout_per_attempt");
+ const val = this.getConfigValue("timeout_per_attempt").trim();
if (!val.length) {
return `Value is required`;
}
try {
+ if (/^\d+$/.test(val)) return null;
parsers["std::duration"](val, null);
} catch {
return `Invalid duration`;
@@ -544,7 +556,7 @@ export class DraftSMTPConfig extends Model({
{name: "security", cast: "ext::auth::SMTPSecurity"},
{name: "validate_certs", cast: null},
{name: "timeout_per_email", cast: "std::duration"},
- {name: "timeout_per_email", cast: "std::duration"},
+ {name: "timeout_per_attempt", cast: "std::duration"},
] as const
)
.map(({name, cast}) => {