%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Unbound/Api/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Unbound/Api/SettingsController.php |
<?php
/*
* Copyright (C) 2019 Michael Muenz <m.muenz@gmail.com>
* Copyright (C) 2020 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\Unbound\Api;
use OPNsense\Base\ApiMutableModelControllerBase;
use OPNsense\Core\Backend;
use OPNsense\Core\Config;
class SettingsController extends ApiMutableModelControllerBase
{
protected static $internalModelClass = '\OPNsense\Unbound\Unbound';
protected static $internalModelName = 'unbound';
private $type = 'forward';
public function updateBlocklistAction()
{
$result = ["status" => "failed"];
if ($this->request->isPost() && $this->request->hasPost('domain') && $this->request->hasPost('type')) {
Config::getInstance()->lock();
$domain = $this->request->getPost('domain');
$type = $this->request->getPost('type');
$mdl = $this->getModel();
$item = $mdl->getNodeByReference('dnsbl.' . $type);
if ($item != null) {
$remove = function ($csv, $part) {
while (($i = array_search($part, $csv)) !== false) {
unset($csv[$i]);
}
return implode(',', $csv);
};
// strip off any trailing dot
$value = rtrim($domain, '.');
$wl = explode(',', (string)$mdl->dnsbl->whitelists);
$bl = explode(',', (string)$mdl->dnsbl->blocklists);
$existing_domains = explode(',', (string)$item);
if (in_array($value, $existing_domains)) {
// value already in model, no need to re-run a potentially
// expensive dnsbl action
return ["status" => "OK"];
}
// Check if domains should be switched around in the model
if ($type == 'whitelists' && in_array($value, $bl)) {
$mdl->dnsbl->blocklists = $remove($bl, $value);
} elseif ($type == 'blocklists' && in_array($value, $wl)) {
$mdl->dnsbl->whitelists = $remove($wl, $value);
}
// update the model
$list = array_filter($existing_domains); // removes all empty entries
$list[] = $value;
$mdl->dnsbl->$type = implode(',', $list);
$mdl->serializeToConfig();
Config::getInstance()->save();
$service = new \OPNsense\Unbound\Api\ServiceController();
$result = $service->dnsblAction();
}
}
return $result;
}
public function getNameserversAction()
{
if ($this->request->isGet()) {
$backend = new Backend();
$nameservers = json_decode(trim($backend->configdRun("system list nameservers")));
if ($nameservers !== null) {
return $nameservers;
}
}
return array("message" => "Unable to run configd action");
}
/*
* Catch all Dot API endpoints and redirect them to Forward for
* backwards compatibility and infer the type from the request.
* If no type is provided, default to forward (__call only triggers on non-existing methods).
*/
public function __call($method, $args)
{
if (substr($method, -6) == 'Action') {
$fn = preg_replace('/Dot/', 'Forward', $method);
if (method_exists(get_class($this), $fn) && preg_match("/.*dot/i", $method)) {
$this->type = "dot";
return $this->$fn(...$args);
}
}
}
public function searchForwardAction()
{
$filter_fn = function ($record) {
return $record->type == $this->type;
};
return $this->searchBase('dots.dot', null, null, $filter_fn);
}
public function getForwardAction($uuid = null)
{
return $this->getBase('dot', 'dots.dot', $uuid);
}
public function addForwardAction()
{
return $this->addBase(
'dot',
'dots.dot',
[ "type" => $this->type ]
);
}
public function delForwardAction($uuid)
{
return $this->delBase('dots.dot', $uuid);
}
public function setForwardAction($uuid)
{
return $this->setBase(
'dot',
'dots.dot',
$uuid,
[ "type" => $this->type ]
);
}
public function toggleForwardAction($uuid, $enabled = null)
{
return $this->toggleBase('dots.dot', $uuid, $enabled);
}
/* Host overrides */
public function searchHostOverrideAction()
{
return $this->searchBase(
'hosts.host',
['enabled', 'hostname', 'domain', 'rr', 'mxprio', 'mx', 'server', 'description'],
'hostname',
null,
SORT_NATURAL | SORT_FLAG_CASE
);
}
public function getHostOverrideAction($uuid = null)
{
return $this->getBase('host', 'hosts.host', $uuid);
}
public function addHostOverrideAction()
{
return $this->addBase('host', 'hosts.host');
}
public function delHostOverrideAction($uuid)
{
/* Make sure the linked aliases are deleted as well. */
$node = $this->getModel();
foreach ($node->aliases->alias->iterateItems() as $alias_uuid => $alias) {
if ($alias->host == $uuid) {
$this->delBase('aliases.alias', $alias_uuid);
}
}
return $this->delBase('hosts.host', $uuid);
}
public function setHostOverrideAction($uuid)
{
return $this->setBase('host', 'hosts.host', $uuid);
}
public function toggleHostOverrideAction($uuid, $enabled = null)
{
return $this->toggleBase('hosts.host', $uuid, $enabled);
}
/* Aliases for hosts */
public function searchHostAliasAction()
{
$host = $this->request->get('host');
$filter_func = null;
if (!empty($host)) {
$filter_func = function ($record) use ($host) {
return $record->host == $host;
};
}
return $this->searchBase(
'aliases.alias',
['enabled', 'host', 'hostname', 'domain', 'description'],
"hostname",
$filter_func,
SORT_NATURAL | SORT_FLAG_CASE
);
}
public function getHostAliasAction($uuid = null)
{
$host_uuid = $this->request->get('host');
$result = $this->getBase('alias', 'aliases.alias', $uuid);
if (empty($uuid) && !empty($host_uuid)) {
foreach ($result['alias']['host'] as $key => &$value) {
if ($key == $host_uuid) {
$value['selected'] = 1;
} else {
$value['selected'] = 0;
}
}
}
return $result;
}
public function addHostAliasAction()
{
return $this->addBase('alias', 'aliases.alias');
}
public function delHostAliasAction($uuid)
{
return $this->delBase('aliases.alias', $uuid);
}
public function setHostAliasAction($uuid)
{
return $this->setBase('alias', 'aliases.alias', $uuid);
}
public function toggleHostAliasAction($uuid, $enabled = null)
{
return $this->toggleBase('aliases.alias', $uuid, $enabled);
}
/* ACLs */
public function searchAclAction()
{
return $this->searchBase(
'acls.acl',
['enabled', 'name', 'action', 'description'],
'acl.action',
null,
SORT_NATURAL | SORT_FLAG_CASE
);
}
public function getAclAction($uuid = null)
{
return $this->getBase('acl', 'acls.acl', $uuid);
}
public function addAclAction()
{
return $this->addBase('acl', 'acls.acl');
}
public function delAclAction($uuid)
{
return $this->delBase('acls.acl', $uuid);
}
public function setAclAction($uuid)
{
return $this->setBase('acl', 'acls.acl', $uuid);
}
public function toggleAclAction($uuid, $enabled = null)
{
return $this->toggleBase('acls.acl', $uuid, $enabled);
}
}