diff --git a/net/radsecproxy/Makefile b/net/radsecproxy/Makefile
new file mode 100644
index 000000000..c27c40120
--- /dev/null
+++ b/net/radsecproxy/Makefile
@@ -0,0 +1,8 @@
+PLUGIN_NAME= radsecproxy
+PLUGIN_VERSION= 0.1
+PLUGIN_COMMENT= RADIUS proxy provides both RADIUS UDP and TCP/TLS (RadSec) transport
+PLUGIN_DEPENDS= radsecproxy
+PLUGIN_MAINTAINER= tobias@boehnert.dev
+PLUGIN_DEVEL= yes
+
+.include "../../Mk/plugins.mk"
diff --git a/net/radsecproxy/pkg-descr b/net/radsecproxy/pkg-descr
new file mode 100644
index 000000000..ef872b8a7
--- /dev/null
+++ b/net/radsecproxy/pkg-descr
@@ -0,0 +1,5 @@
+A generic RADIUS proxy that in addition to usual RADIUS UDP
+transport, also supports TLS (RadSec), as well as RADIUS
+over TCP and DTLS. The aim is for the proxy to have
+sufficient features to be flexible, while at the same time
+to be small, efficient and easy to configure.
diff --git a/net/radsecproxy/src/etc/inc/plugins.inc.d/radsecproxy.inc b/net/radsecproxy/src/etc/inc/plugins.inc.d/radsecproxy.inc
new file mode 100644
index 000000000..57e873477
--- /dev/null
+++ b/net/radsecproxy/src/etc/inc/plugins.inc.d/radsecproxy.inc
@@ -0,0 +1,73 @@
+general->enabled == '1') {
+ return true;
+ }
+
+ return false;
+}
+
+function radsecproxy_syslog()
+{
+ // $syslogconf = array();
+
+ // $syslogconf['radsecproxy'] = array(
+ // 'local' => '/var/log/radsecproxy.log',
+ // 'facility' => array('radsecproxy'),
+ // 'remote' => 'relayd',
+ // );
+
+ // return $syslogconf;
+
+ $logfacilities = array();
+ $logfacilities['radsecproxy'] = array(
+ 'facility' => array('LOG_DAEMON'),
+ );
+ return $logfacilities;
+
+}
+
+
+function radsecproxy_services()
+{
+ $services = array();
+
+ if (radsecproxy_enabled()) {
+ $services[] = array(
+ 'description' => gettext('Radius Secure Proxy'),
+ 'configd' => array(
+ 'restart' => array('radsecproxy restart'),
+ 'start' => array('radsecproxy start'),
+ 'stop' => array('radsecproxy stop'),
+ ),
+ 'name' => 'radsecproxy',
+ 'pidfile' => '/var/run/radsecproxy/radsecproxy.pid'
+ );
+ }
+ return $services;
+}
diff --git a/net/radsecproxy/src/etc/rc.d/os-radsecproxy b/net/radsecproxy/src/etc/rc.d/os-radsecproxy
new file mode 100755
index 000000000..4faca1f6b
--- /dev/null
+++ b/net/radsecproxy/src/etc/rc.d/os-radsecproxy
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+# PROVIDE: radsecproxy
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+# Add the following line to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# radsecproxy_enable (bool): Set to NO by default.
+# Set it to YES to enable radsecproxy.
+
+. /etc/rc.subr
+
+name="radsecproxy"
+rcvar=radsecproxy_enable
+
+: ${radsecproxy_enable:="NO"}
+: ${radsecproxy_user:="root"}
+: ${radsecproxy_group:="wheel"}
+: ${radsecproxy_pidfile:="/var/run/radsecproxy.pid"}
+
+user=${radsecproxy_user}
+group=${radsecproxy_group}
+pidfile=${radsecproxy_pidfile}
+required_files=/usr/local/etc/radsecproxy.conf
+
+command="/usr/local/sbin/${name}"
+command_args="-c /usr/local/etc/radsecproxy.conf -i ${pidfile}"
+
+start_precmd="radsecproxy_prestart"
+stop_postcmd="radsecproxy_poststop"
+
+radsecproxy_prestart()
+{
+ mkdir -p $(dirname $pidfile)
+ chown ${user}:${group} $(dirname $pidfile)
+}
+
+radsecproxy_poststop()
+{
+ rm -f ${pidfile}
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ClientsController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ClientsController.php
new file mode 100644
index 000000000..a256a8765
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ClientsController.php
@@ -0,0 +1,67 @@
+searchBase(
+ "clients.client",
+ array('enabled', 'description', 'host', 'identifier', 'type'),
+ "name"
+ );
+ }
+
+ public function setItemAction($uuid)
+ {
+ return $this->setBase("client", "clients.client", $uuid);
+ }
+
+ public function addItemAction()
+ {
+ return $this->addBase("client", "clients.client");
+ }
+
+ public function getItemAction($uuid = null)
+ {
+ return $this->getBase("client", "clients.client", $uuid);
+ }
+
+ public function delItemAction($uuid)
+ {
+ return $this->delBase("clients.client", $uuid);
+ }
+
+ public function toggleItemAction($uuid, $enabled = null)
+ {
+ return $this->toggleBase("clients.client", $uuid, $enabled);
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/GeneralController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/GeneralController.php
new file mode 100644
index 000000000..786df74eb
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/GeneralController.php
@@ -0,0 +1,33 @@
+searchBase("realms.realm", array('enabled', 'description', 'realm'), "description");
+ }
+
+ public function setItemAction($uuid)
+ {
+ return $this->setBase("realm", "realms.realm", $uuid);
+ }
+
+ public function addItemAction()
+ {
+ return $this->addBase("realm", "realms.realm");
+ }
+
+ public function getItemAction($uuid = null)
+ {
+ return $this->getBase("realm", "realms.realm", $uuid);
+ }
+
+ public function delItemAction($uuid)
+ {
+ return $this->delBase("realms.realm", $uuid);
+ }
+
+ public function toggleItemAction($uuid, $enabled = null)
+ {
+ return $this->toggleBase("realms.realm", $uuid, $enabled);
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/RewritesController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/RewritesController.php
new file mode 100644
index 000000000..c1fb95d92
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/RewritesController.php
@@ -0,0 +1,67 @@
+searchBase(
+ "rewrites.rewrite",
+ array('enabled', 'name', 'description'),
+ "name"
+ );
+ }
+
+ public function setItemAction($uuid)
+ {
+ return $this->setBase("rewrite", "rewrites.rewrite", $uuid);
+ }
+
+ public function addItemAction()
+ {
+ return $this->addBase("rewrite", "rewrites.rewrite");
+ }
+
+ public function getItemAction($uuid = null)
+ {
+ return $this->getBase("rewrite", "rewrites.rewrite", $uuid);
+ }
+
+ public function delItemAction($uuid)
+ {
+ return $this->delBase("rewrites.rewrite", $uuid);
+ }
+
+ public function toggleItemAction($uuid, $enabled = null)
+ {
+ return $this->toggleBase("rewrites.rewrite", $uuid, $enabled);
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServersController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServersController.php
new file mode 100644
index 000000000..55394aa5e
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServersController.php
@@ -0,0 +1,67 @@
+searchBase(
+ "servers.server",
+ array('description', 'host', 'type', 'identifier', 'tlsConfig'),
+ "name"
+ );
+ }
+
+ public function setItemAction($uuid)
+ {
+ return $this->setBase("server", "servers.server", $uuid);
+ }
+
+ public function addItemAction()
+ {
+ return $this->addBase("server", "servers.server");
+ }
+
+ public function getItemAction($uuid = null)
+ {
+ return $this->getBase("server", "servers.server", $uuid);
+ }
+
+ public function delItemAction($uuid)
+ {
+ return $this->delBase("servers.server", $uuid);
+ }
+
+ public function toggleItemAction($uuid, $enabled = null)
+ {
+ return $this->toggleBase("servers.server", $uuid, $enabled);
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServiceController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServiceController.php
new file mode 100644
index 000000000..2aebebd84
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/Api/ServiceController.php
@@ -0,0 +1,40 @@
+searchBase(
+ "tlsConfigs.tlsConfig",
+ array('description', 'name', 'caCertificateRefId', 'proxyCertificateRefId'),
+ "name"
+ );
+ }
+
+ public function setItemAction($uuid)
+ {
+ return $this->setBase("tlsConfig", "tlsConfigs.tlsConfig", $uuid);
+ }
+
+ public function addItemAction()
+ {
+ return $this->addBase("tlsConfig", "tlsConfigs.tlsConfig");
+ }
+
+ public function getItemAction($uuid = null)
+ {
+ return $this->getBase("tlsConfig", "tlsConfigs.tlsConfig", $uuid);
+ }
+
+ public function delItemAction($uuid)
+ {
+ return $this->delBase("tlsConfigs.tlsConfig", $uuid);
+ }
+
+ public function toggleItemAction($uuid, $enabled = null)
+ {
+ return $this->toggleBase("tlsConfigs.tlsConfig", $uuid, $enabled);
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ClientsController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ClientsController.php
new file mode 100644
index 000000000..91e92ce29
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ClientsController.php
@@ -0,0 +1,36 @@
+view->generalForm = $this->getForm("clients");
+ // pick the template to serve to our users.
+ $this->view->pick('OPNsense/RadSecProxy/clients');
+ $this->view->formDialogClient = $this->getForm("dialogClient");
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/GeneralController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/GeneralController.php
new file mode 100644
index 000000000..5c17d3cd8
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/GeneralController.php
@@ -0,0 +1,34 @@
+view->generalForm = $this->getForm("general");
+ $this->view->pick('OPNsense/RadSecProxy/general');
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/IndexController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/IndexController.php
new file mode 100644
index 000000000..3596535ac
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/IndexController.php
@@ -0,0 +1,34 @@
+view->basicForm = $this->getForm("basic");
+ $this->view->pick('OPNsense/RadSecProxy/index');
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RealmsController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RealmsController.php
new file mode 100644
index 000000000..d227bbac1
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RealmsController.php
@@ -0,0 +1,34 @@
+view->pick('OPNsense/RadSecProxy/realms');
+ $this->view->formDialogRealm = $this->getForm("dialogRealm");
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RewritesController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RewritesController.php
new file mode 100644
index 000000000..92869405e
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/RewritesController.php
@@ -0,0 +1,36 @@
+view->generalForm = $this->getForm("clients");
+ // pick the template to serve to our users.
+ $this->view->pick('OPNsense/RadSecProxy/rewrites');
+ $this->view->formDialogRewrite = $this->getForm("dialogRewrite");
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ServersController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ServersController.php
new file mode 100644
index 000000000..98186c101
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/ServersController.php
@@ -0,0 +1,34 @@
+view->pick('OPNsense/RadSecProxy/servers');
+ $this->view->formDialogServer = $this->getForm("dialogServer");
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/TlsController.php b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/TlsController.php
new file mode 100644
index 000000000..146157e55
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/TlsController.php
@@ -0,0 +1,34 @@
+view->pick('OPNsense/RadSecProxy/tls');
+ $this->view->formDialogTls = $this->getForm("dialogTls");
+ }
+}
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogClient.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogClient.xml
new file mode 100644
index 000000000..127ff5768
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogClient.xml
@@ -0,0 +1,96 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRealm.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRealm.xml
new file mode 100644
index 000000000..6c270fed7
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRealm.xml
@@ -0,0 +1,71 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRewrite.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRewrite.xml
new file mode 100644
index 000000000..ca8ef6092
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogRewrite.xml
@@ -0,0 +1,101 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogServer.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogServer.xml
new file mode 100644
index 000000000..ce44adcb9
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogServer.xml
@@ -0,0 +1,102 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogTls.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogTls.xml
new file mode 100644
index 000000000..240d91266
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/dialogTls.xml
@@ -0,0 +1,68 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/general.xml b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/general.xml
new file mode 100644
index 000000000..eaf9611ed
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/controllers/OPNsense/RadSecProxy/forms/general.xml
@@ -0,0 +1,121 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/Menu/Menu.xml b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/Menu/Menu.xml
new file mode 100644
index 000000000..65b18340f
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/Menu/Menu.xml
@@ -0,0 +1,12 @@
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.php b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.php
new file mode 100644
index 000000000..31e1b506e
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.php
@@ -0,0 +1,31 @@
+
+ //OPNsense/radsecproxy
+
+ RadSecProxy-Management
+
+ 0.0.1
+
+
+
+
+ 0
+ Y
+
+
+
+ Y
+ 2
+
+ 1 (only serious errors)
+ 2 (default)
+ 3
+ 4
+ 5 (log everything)
+
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ Y
+ Original
+
+ Static
+ Original
+ VendorHashed
+ VendorKeyHashed
+ FullyHashed
+ FullyKeyHashed
+
+
+
+
+ Y
+ on
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+
+
+
+
+
+ 1
+ Y
+
+
+
+ Y
+ /^([0-9a-zA-Z_\-]){1,25}$/u
+ Should be a string between 1 and 25 characters whithout special characters.
+
+
+ UniqueConstraint
+ Identifier already in use
+
+
+
+
+
+ N
+
+
+
+ Y
+ Y
+
+
+ UniqueConstraint
+
+
+
+
+
+ Y
+ udp
+
+ UDP
+ TCP
+ TLS
+ DTLS
+
+
+
+
+ N
+
+
+ Must be set for UDP-clients.
+ SetIfConstraint
+ type
+ udp
+
+
+ Must be set for TCP-clients.
+ SetIfConstraint
+ type
+ tcp
+
+
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ tlsConfigs.tlsConfig
+ name
+
+
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ rewrites.rewrite
+ name
+
+
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ rewrites.rewrite
+ name
+
+
+
+
+
+
+
+
+
+
+
+ Y
+ /^([0-9a-zA-Z_\-]){1,25}$/u
+ Should be a string between 1 and 25 characters whithout special characters.
+
+
+ UniqueConstraint
+ Identifier already in use
+
+
+
+
+
+ N
+
+
+
+ Y
+ Y
+
+
+
+ N
+
+
+
+ Y
+ off
+
+ On
+ Off
+ Minimal
+ Auto
+
+
+
+
+ Y
+ udp
+
+ UDP
+ TCP
+ TLS
+ DTLS
+
+
+
+
+ N
+
+
+ Must be set for UDP-servers.
+ SetIfConstraint
+ type
+ udp
+
+
+ Must be set for TCP-servers.
+ SetIfConstraint
+ type
+ tcp
+
+
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ tlsConfigs.tlsConfig
+ name
+
+
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ rewrites.rewrite
+ name
+
+
+
+
+
+ N
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ rewrites.rewrite
+ name
+
+
+
+
+
+
+
+
+
+
+
+ Y
+ /^([0-9a-zA-Z_\-]){1,25}$/u
+ Should be a string between 1 and 25 characters whithout special characters.
+ default
+
+
+ UniqueConstraint
+ Name already in use
+
+
+
+
+
+ N
+
+
+
+ Y
+ Field is required
+ ca
+
+
+
+ Y
+ Field is required
+ cert
+
+
+
+ N
+ Y
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+
+
+
+
+
+
+ 1
+ Y
+
+
+
+ N
+
+
+
+ Y
+ Must not be empty
+
+
+ UniqueConstraint
+ Must be unique
+
+
+
+
+
+ Y
+ N
+ Y
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ servers.server
+ identifier
+
+
+ Related server not found
+
+
+
+ Y
+ N
+ Y
+
+
+ OPNsense.RadSecProxy.RadSecProxy
+ servers.server
+ identifier
+
+
+ Related server not found
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+
+
+
+
+
+
+ 1
+ Y
+
+
+
+ Y
+ /^([0-9a-zA-Z_\-]){1,25}$/u
+ Should be a string between 1 and 25 characters whithout special characters.
+ default
+
+
+ UniqueConstraint
+ Name already in use
+
+
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ N
+
+
+
+ Y
+ off
+
+ On
+ Off
+
+
+
+
+ N
+
+
+
+ N
+
+
+
+
+
+
diff --git a/net/radsecproxy/src/opnsense/mvc/app/views/OPNsense/RadSecProxy/clients.volt b/net/radsecproxy/src/opnsense/mvc/app/views/OPNsense/RadSecProxy/clients.volt
new file mode 100644
index 000000000..33e7413f2
--- /dev/null
+++ b/net/radsecproxy/src/opnsense/mvc/app/views/OPNsense/RadSecProxy/clients.volt
@@ -0,0 +1,56 @@
+
+
+