%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/GroupController.php |
<?php
/**
* Copyright (C) 2023 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OPNsense\Firewall\Api;
use OPNsense\Base\ApiMutableModelControllerBase;
use OPNsense\Base\UserException;
use OPNsense\Core\Backend;
use OPNsense\Core\Config;
/**
* @package OPNsense\Firewall
*/
class GroupController extends ApiMutableModelControllerBase
{
protected static $internalModelName = 'group';
protected static $internalModelClass = 'OPNsense\Firewall\Group';
/**
* search groups
* @return array search results
* @throws \ReflectionException
*/
public function searchItemAction()
{
return $this->searchBase("ifgroupentry", ['ifname', 'descr', 'members', 'sequence'], "ifname");
}
/**
* Update group with given properties
* @param string $uuid internal id
* @return array save result + validation output
* @throws \OPNsense\Base\ValidationException when field validations fail
* @throws \ReflectionException when not bound to model
*/
public function setItemAction($uuid)
{
$refactored = false;
$node = $this->getModel()->getNodeByReference('ifgroupentry.' . $uuid);
$old_name = $node != null ? (string)$node->ifname : null;
if ($old_name !== null && $this->request->isPost() && $this->request->hasPost("group")) {
$new_name = $this->request->getPost("group")['ifname'];
if ($new_name != $old_name) {
// replace groups, setBase() will synchronise the changes to disk
$refactored = $this->getModel()->refactor($old_name, $new_name);
}
}
$result = $this->setBase("group", "ifgroupentry", $uuid);
if ($refactored) {
// interface renamed
(new Backend())->configdRun('interface invoke registration');
}
return $result;
}
/**
* Add new group and set with attributes from post
* @return array save result + validation output
* @throws \OPNsense\Base\ModelException when not bound to model
* @throws \OPNsense\Base\ValidationException when field validations fail
* @throws \ReflectionException when not bound to model
*/
public function addItemAction()
{
return $this->addBase("group", "ifgroupentry");
}
/**
* Retrieve group settings or return defaults for new one
* @param $uuid item unique id
* @return array group content
* @throws \ReflectionException when not bound to model
*/
public function getItemAction($uuid = null)
{
return $this->getBase("group", "ifgroupentry", $uuid);
}
/**
* Delete alias by uuid, save contents to tmp for removal on apply
* @param string $uuid internal id
* @return array save status
* @throws \OPNsense\Base\ValidationException when field validations fail
* @throws \ReflectionException when not bound to model
* @throws \OPNsense\Base\UserException when unable to delete
*/
public function delItemAction($uuid)
{
Config::getInstance()->lock();
$node = $this->getModel()->getNodeByReference('ifgroupentry.' . $uuid);
$node_name = $node != null ? (string)$node->ifname : null;
$uses = $node_name != null ? $this->getModel()->whereUsed($node_name) : [];
if (!empty($uses)) {
$message = "";
foreach ($uses as $key => $value) {
$message .= htmlspecialchars(sprintf("\n[%s] %s", $key, $value), ENT_NOQUOTES | ENT_HTML401);
}
$message = sprintf(gettext("Cannot delete group. Currently in use by %s"), $message);
throw new \OPNsense\Base\UserException($message, gettext("Group in use"));
}
return $this->delBase("ifgroupentry", $uuid);
}
/**
* reconfigure groups
*/
public function reconfigureAction()
{
if ($this->request->isPost()) {
(new Backend())->configdRun("filter reload skip_alias");
(new Backend())->configdRun('interface invoke registration');
return array("status" => "ok");
} else {
return array("status" => "failed");
}
}
}