()(
expiresAt: expiresAt,
ipv4Address: address4,
ipv6Address: address6,
- preUp: preUp,
- postUp: postUp,
- preDown: preDown,
- postDown: postDown,
+ preUp: HookSchema,
+ postUp: HookSchema,
+ preDown: HookSchema,
+ postDown: HookSchema,
allowedIps: AllowedIpsSchema,
serverAllowedIps: serverAllowedIps,
mtu: MtuSchema,
diff --git a/src/server/database/repositories/hooks/types.ts b/src/server/database/repositories/hooks/types.ts
index c42a05bf..f9bba9a4 100644
--- a/src/server/database/repositories/hooks/types.ts
+++ b/src/server/database/repositories/hooks/types.ts
@@ -6,13 +6,11 @@ export type HooksType = InferSelectModel;
export type HooksUpdateType = Omit;
-const hook = z.string({ message: t('zod.hook') }).pipe(safeStringRefine);
-
export const HooksUpdateSchema = schemaForType()(
z.object({
- preUp: hook,
- postUp: hook,
- preDown: hook,
- postDown: hook,
+ preUp: HookSchema,
+ postUp: HookSchema,
+ preDown: HookSchema,
+ postDown: HookSchema,
})
);
diff --git a/src/server/utils/types.ts b/src/server/utils/types.ts
index 14157549..898cf957 100644
--- a/src/server/utils/types.ts
+++ b/src/server/utils/types.ts
@@ -52,6 +52,10 @@ export const FileSchema = z.object({
file: z.string({ message: t('zod.file') }),
});
+export const HookSchema = z
+ .string({ message: t('zod.hook') })
+ .pipe(safeStringRefine);
+
export const schemaForType =
() =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
diff --git a/src/server/utils/wgHelper.ts b/src/server/utils/wgHelper.ts
index c2154863..5fdb8604 100644
--- a/src/server/utils/wgHelper.ts
+++ b/src/server/utils/wgHelper.ts
@@ -49,17 +49,19 @@ PostDown = ${iptablesTemplate(hooks.postDown, wgInterface)}`;
const cidr4Block = parseCidr(wgInterface.ipv4Cidr).prefix;
const cidr6Block = parseCidr(wgInterface.ipv6Cidr).prefix;
+ const hookLines = [
+ client.preUp ? `PreUp = ${client.preUp}` : null,
+ client.postUp ? `PostUp = ${client.postUp}` : null,
+ client.preDown ? `PreDown = ${client.preDown}` : null,
+ client.postDown ? `PostDown = ${client.postDown}` : null,
+ ].filter((v) => v !== null);
+
return `[Interface]
PrivateKey = ${client.privateKey}
Address = ${client.ipv4Address}/${cidr4Block}, ${client.ipv6Address}/${cidr6Block}
DNS = ${client.dns.join(', ')}
MTU = ${client.mtu}
-${client.preUp ? `PreUp = ${client.preUp}\n` : ''}${
- client.postUp ? `PostUp = ${client.postUp}\n` : ''
- }${client.preDown ? `PreDown = ${client.preDown}\n` : ''}${
- client.postDown ? `PostDown = ${client.postDown}\n` : ''
- }
-
+${hookLines.length ? `${hookLines.join('\n')}\n` : ''}
[Peer]
PublicKey = ${wgInterface.publicKey}
PresharedKey = ${client.preSharedKey}