%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Auth/Api/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Auth/Api/PrivController.php |
<?php
/*
* Copyright (C) 2024 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\Auth\Api;
use OPNsense\Base\ApiMutableModelControllerBase;
use OPNsense\Base\UserException;
use OPNsense\Auth\User;
use OPNsense\Auth\Group;
use OPNsense\Core\ACL;
use OPNsense\Core\Config;
/**
* Class PrivController
* @package OPNsense\Auth\Api
*/
class PrivController extends ApiMutableModelControllerBase
{
protected static $internalModelName = 'priv';
protected static $internalModelClass = 'OPNsense\Auth\Priv';
public function searchAction()
{
$userprivs = [];
$groupprivs = [];
foreach ((new User())->user->iterateItems() as $user) {
foreach (explode(',', $user->priv->getCurrentValue()) as $priv) {
if (!isset($userprivs[$priv])) {
$userprivs[$priv] = [];
}
$userprivs[$priv][] = (string)$user->name;
}
}
foreach ((new Group())->group->iterateItems() as $group) {
foreach (explode(',', $group->priv->getCurrentValue()) as $priv) {
if (!isset($groupprivs[$priv])) {
$groupprivs[$priv] = [];
}
$groupprivs[$priv][] = (string)$group->name;
}
}
$records = [];
foreach ((new ACL())->getPrivList() as $auth => $props) {
$records[] = [
'id' => $auth,
'name' => $props['name'],
'match' => implode("\n", $props['match'] ?? []),
'users' => $userprivs[$auth] ?? [],
'groups' => $groupprivs[$auth] ?? [],
];
}
return $this->searchRecordsetBase($records);
}
public function getItemAction($id)
{
$result = parent::getAction();
if (isset($result['priv'])) {
$result['priv']['id'] = $id;
foreach ((new User())->user->iterateItems() as $uuid => $user) {
if (
in_array($id, explode(',', $user->priv->getCurrentValue())) &&
isset($result['priv']['users'][$uuid])
) {
$result['priv']['users'][$uuid]['selected'] = 1;
}
}
foreach ((new Group())->group->iterateItems() as $uuid => $group) {
if (
in_array($id, explode(',', $group->priv->getCurrentValue())) &&
isset($result['priv']['groups'][$uuid])
) {
$result['priv']['groups'][$uuid]['selected'] = 1;
}
}
}
return $result;
}
public function setItemAction($id)
{
if ($this->request->isPost()) {
Config::getInstance()->lock();
}
$result = parent::setAction();
if ($result['result'] != 'failed') {
$mdl = $this->getModel();
$usermdl = new User();
$groupmdl = new Group();
foreach ([$usermdl->user, $groupmdl->group] as $topic) {
if ($topic == $usermdl->user) {
$uuids = explode(',', $mdl->users->getCurrentValue());
} else {
$uuids = explode(',', $mdl->groups->getCurrentValue());
}
foreach ($topic->iterateItems() as $uuid => $item) {
$privlist = array_filter(explode(',', $item->priv->getCurrentValue()));
if (!in_array($uuid, $uuids) && in_array($id, $privlist)) {
unset($privlist[array_search($id, $privlist)]);
} elseif (in_array($uuid, $uuids) && !in_array($id, $privlist)) {
$privlist[] = $id;
} else {
continue;
}
$item->priv = implode(',', $privlist);
}
}
$usermdl->serializeToConfig(false, true);
$groupmdl->serializeToConfig(false, true);
if (!(new ACL())->isPageAccessible($this->getUserName(), '/api/auth/priv')) {
throw new UserException(
sprintf(gettext("User %s can not lock itself out"), $this->getUserName()),
gettext("Usermanager")
);
}
Config::getInstance()->save();
}
return $result;
}
}