Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
1.8 KB typescript
import { InterfaceUpdateSchema } from '#db/repositories/interface/types';

export default definePermissionEventHandler(
  'admin',
  'any',
  async ({ event }) => {
    const data = await readValidatedBody(
      event,
      validateZod(InterfaceUpdateSchema, event)
    );

    if (data.firewallEnabled) {
      firewall.clearAvailabilityCache();

      const iptablesAvailable = await firewall.isAvailable(
        !WG_ENV.DISABLE_IPV6
      );
      if (!iptablesAvailable) {
        const requiredTools = WG_ENV.DISABLE_IPV6
          ? 'iptables'
          : 'iptables and ip6tables';
        throw createError({
          statusCode: 400,
          statusMessage: `Per-Client Firewall requires ${requiredTools} to be installed on the host system. Please install ${requiredTools} before enabling this feature.`,
        });
      }
    }

    const prev = await Database.interfaces.get();
    const publicIpChanged =
      prev.serverPublicIpV4 !== data.serverPublicIpV4 ||
      prev.serverPublicIpV6 !== data.serverPublicIpV6;

    if (data.egressMode === 'warp' && !(await Database.warp.isRegistered())) {
      throw createError({
        statusCode: 400,
        statusMessage:
          'WARP egress requires a registered WARP configuration. Register WARP first.',
      });
    }

    await Database.interfaces.update(data);
    await WireGuard.saveConfig();

    if (data.egressMode === 'warp' && prev.egressMode !== 'warp') {
      try {
        await WarpInterface.enable();
      } catch (e) {
        throw createError({
          statusCode: 400,
          statusMessage: (e as Error).message,
        });
      }
    } else if (data.egressMode !== 'warp' && prev.egressMode === 'warp') {
      await WarpInterface.disable();
    }

    if (publicIpChanged) {
      await Obfuscator.applyAll();
    }

    PhobosPackage.invalidate();

    return { success: true };
  }
);