From 06d0969eb25e7fb7a94b66834cea86cd88061566 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Wed, 1 Nov 2023 08:21:18 +0100 Subject: [PATCH] net/wireguard: allow instance selection from peer --- .../Wireguard/Api/ClientController.php | 42 ++++++++++++++++++- .../forms/dialogEditWireguardClient.xml | 6 +++ .../forms/dialogEditWireguardServer.xml | 1 - 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/ClientController.php b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/ClientController.php index d4f2bf4f0..8299f6fe2 100644 --- a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/ClientController.php +++ b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/ClientController.php @@ -30,6 +30,8 @@ namespace OPNsense\Wireguard\Api; use OPNsense\Base\ApiMutableModelControllerBase; +use OPNsense\Core\Config; +use OPNsense\Wireguard\Server; class ClientController extends ApiMutableModelControllerBase { @@ -46,12 +48,22 @@ class ClientController extends ApiMutableModelControllerBase public function getClientAction($uuid = null) { - return $this->getBase('client', 'clients.client', $uuid); + $result = $this->getBase('client', 'clients.client', $uuid); + if (!empty($result['client'])) { + $result['client']['servers'] = []; + foreach ((new Server())->servers->server->iterateItems() as $key => $node) { + $result['client']['servers'][$key] = [ + 'value' => (string)$node->name, + 'selected' => in_array($uuid, explode(',', (string)$node->peers)) ? '1' : '0' + ]; + } + } + return $result; } public function addClientAction() { - return $this->addBase('client', 'clients.client'); + return $this->setClientAction(null); } public function delClientAction($uuid) @@ -61,6 +73,32 @@ class ClientController extends ApiMutableModelControllerBase public function setClientAction($uuid) { + if (!empty($this->request->getPost(static::$internalModelName)) && $this->request->isPost()) { + $servers = []; + if (!empty($this->request->getPost(static::$internalModelName)['servers'])) { + $servers = explode(',', $this->request->getPost(static::$internalModelName)['servers']); + } + Config::getInstance()->lock(); + $mdl = new Server(); + if (empty($uuid)) { + // add new client, generate uuid + $uuid = $mdl->servers->generateUUID(); + } + foreach ($mdl->servers->server->iterateItems() as $key => $node) { + $peers = array_filter(explode(',', (string)$node->peers)); + if (in_array($uuid, $peers) && !in_array($key, $servers)) { + $node->peers = implode(',', array_diff($peers, [$uuid])); + } elseif (!in_array($uuid, $peers) && in_array($key, $servers)) { + $node->peers = implode(',', array_merge($peers, [$uuid])); + } + } + /** + * Save to in memory model. + * Ignore validations as $uuid might be new or trigger an existing validation issue. + * Persisting the data is handled by setBase() + */ + $mdl->serializeToConfig(false, true); + } return $this->setBase('client', 'clients.client', $uuid); } diff --git a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardClient.xml b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardClient.xml index e71c4ff5f..ff303f842 100644 --- a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardClient.xml +++ b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardClient.xml @@ -43,6 +43,12 @@ text Set port the endpoint listens to. + + client.servers + + select_multiple + List of instances this peer belongs to. + client.keepalive diff --git a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardServer.xml b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardServer.xml index 4c2fe27f0..3b23f056f 100644 --- a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardServer.xml +++ b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/forms/dialogEditWireguardServer.xml @@ -69,7 +69,6 @@ server.peers select_multiple - true List of peers for this instance.