Added permission checks for Buildings and terminations

This commit is contained in:
Frank Schubert
2021-08-05 20:11:15 +02:00
parent 4a74e15300
commit c06bb156c7
18 changed files with 246 additions and 91 deletions

View File

@@ -83,12 +83,14 @@
</div>
</div>
<?php if($building->id): ?>
<div class="form-group row" id="gps-again" style="display:none;">
<div class="col-lg-2"></div>
<div class="col-lg-10">
<label class="text-pink"><input type="checkbox" name="gps_again" value="1" /> GPS-Koordinaten erneut berechnen</label>
</div>
</div>
<?php endif; ?>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="code">Objekt ID</label>
@@ -205,15 +207,6 @@
</div>
</div>
<!--
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="description">Bauabschnitt</label>
<div class="col-lg-10">
<textarea id="description" class="form-control" name="description" rows="5"><?=$building->description?></textarea>
</div>
</div>
-->
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="status_id">Status</label>
<div class="col-lg-10">
@@ -234,9 +227,9 @@
<div class="card-body">
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="pipeworker_id">Tiefbau *</label>
<label class="col-lg-2 col-form-label" for="pipeworker_id">Tiefbau</label>
<div class="col-lg-10">
<select class="select2 form-control " name="pipeworker_id" id="pipeworker_id" >
<select class="select2 form-control " name="pipeworker_id" id="pipeworker_id" <?=(!$me->is(["Admin", "netowner", "pipeplanner"])) ? "disabled='disabled'" : ""?>>
<option></option>
<?php foreach($pipeworkers as $pw): ?>
<option value="<?=$pw->id?>" <?=($building->pipeworker_id == $pw->id) ? "selected='selected'" : ""?>><?=$pw->getCompanyOrName()?></option>
@@ -246,9 +239,9 @@
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label" for="lineworker_id">Kabelbau *</label>
<label class="col-lg-2 col-form-label" for="lineworker_id">Kabelbau</label>
<div class="col-lg-10">
<select class="select2 form-control " name="lineworker_id" id="lineworker_id" <?=(!$me->is("Admin")) ? "disabled='disabled'" : ""?>>
<select class="select2 form-control " name="lineworker_id" id="lineworker_id" <?=(!$me->is(["Admin", "netowner", "pipeplanner"])) ? "disabled='disabled'" : ""?>>
<option></option>
<?php foreach($lineworkers as $lw): ?>
<option value="<?=$lw->id?>" <?=($building->lineworker_id == $lw->id) ? "selected='selected'" : ""?>><?=$lw->getCompanyOrName()?></option>

View File

@@ -46,7 +46,7 @@
<select name="address_id" id="address_id" class="form-control">
<option value=""></option>
<?php foreach($addresses as $address): ?>
<option value="<?=$address->id?>" <?=($address->id == $user->address_id) ? "selected='selected'" : ""?>><?=($address->company) ? $address->company : $address->getFullName()?></option>
<option value="<?=$address->id?>" <?=($address->id == $user->address_id || $address->id == $address_id) ? "selected='selected'" : ""?>><?=($address->company) ? $address->company : $address->getFullName()?></option>
<?php endforeach; ?>
</select>
</div>

View File

@@ -38,7 +38,11 @@
</p>
</div>
<div class="float-right">
<?php if(is_array($filter) && count($filter) && is_numeric($filter['address_id'])): ?>
<a class="btn btn-primary" href="<?=self::getUrl("User", "add", ['address_id' => $filter['address_id']])?>"><i class="fas fa-plus"></i> Neuen Benutzer anlegen</a>
<?php else: ?>
<a class="btn btn-primary" href="<?=self::getUrl("User", "add")?>"><i class="fas fa-plus"></i> Neuen Benutzer anlegen</a>
<?php endif; ?>
</div>
<table class="table table-striped table-hover">
<tr>

View File

@@ -7,6 +7,8 @@
<li class="has-submenu">
<a href="<?=self::getUrl("Dashboard")?>"><i class="fe-airplay"></i>Dashboard</a>
</li>
<?php if($me->is("Admin")): ?>
<li class="has-submenu">
<a href="#">
<i class="fas fa-database"></i>Stammdaten <div class="arrow-down"></div>
@@ -16,38 +18,39 @@
<a href="<?=self::getUrl("Address")?>">Personen & Firmen</a>
<ul class="sub-submenu">
<li><a href="<?=self::getUrl("Address", "Index" , ["filter" => ["addresstype" => ["employee"]]])?>">Mitarbeiter</a></li>
<li><a href="<?=self::getUrl("Address", "Index" , ["filter" => ["addresstype" => ["customer"]]])?>">Kunden</a></li>
<li><a href="<?=self::getUrl("Address", "Index" , ["filter" => ["addresstype" => ["supplier"]]])?>">Lieferanten</a></li>
</ul>
</li>
<li class="has-sub-submenu">
<a href="<?=self::getUrl("Product")?>">Produkte</a>
<ul class="sub-submenu">
<li><a href="<?=self::getUrl("Producttech")?>">Technologien</a></li>
</ul>
</li>
<li><a href="<?=self::getUrl("Product")?>">Produkte</a></li>
<li><a href="<?=self::getUrl("Producttech")?>">Technologien</a></li>
<li><a href="<?=self::getUrl("User")?>">Benutzer</a></li>
<li><a href="<?=self::getUrl("Network")?>">Netzgebiete</a></li>
</ul>
</li>
<?php endif; ?>
<?php if($me->is(["Admin","netowner","lineplanner","pipeplanner"])): ?>
<li class="has-submenu">
<a href="#">
<i class="fas fa-hard-hat"></i>Netzbau <div class="arrow-down"></div>
</a>
<ul class="submenu">
<li><a href="<?=self::getUrl("Building")?>">Objekte</a></li>
<li><a href="<?=self::getUrl("Building")?>">Objekte & Anschlüsse</a></li>
</ul>
</li>
<?php endif; ?>
<?php if($me->is(["Admin","salespartner"])): ?>
<li class="has-submenu">
<a href="#">
<i class="fas fa-hard-hat"></i>Verkauf <div class="arrow-down"></div>
<i class="fas fa-beer"></i>Verkauf <div class="arrow-down"></div>
</a>
<ul class="submenu">
<li><a href="<?=self::getUrl("Order")?>">Bestellungen</a></li>
</ul>
</li>
<?php endif; ?>
</ul>
<!-- End navigation menu -->

View File

@@ -94,58 +94,22 @@
</div>
</li>
<li class="dropdown notification-list">
<a class="nav-link dropdown-toggle nav-user mr-0" data-toggle="dropdown" href="#" role="button" aria-haspopup="false" aria-expanded="false">
<li>
<a class="nav-link nav-user mr-0" href="#">
<!-- <img src="<?=self::getResourcePath()?>assets/images/users/avatar-4.jpg" alt="user-image" class="rounded-circle"> -->
<i style="font-size: 24px; border-radius: 50%;" class="fas fa-user-secret text-white img-circle bg-info"></i>
<span class="pro-user-name ml-1">
<?=$me->username?> <i class="mdi mdi-chevron-down"></i>
<?=$me->username?>
</span>
</a>
<div class="dropdown-menu dropdown-menu-right profile-dropdown ">
<!-- item-->
<div class="dropdown-item noti-title">
<h6 class="m-0">
Welcome !
</h6>
</div>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<i class="dripicons-user"></i>
<span>Mein Konto</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<i class="dripicons-gear"></i>
<span>Einstellungen</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<i class="dripicons-help"></i>
<span>Support</span>
</a>
<!-- item-->
<a href="javascript:void(0);" class="dropdown-item notify-item">
<i class="dripicons-lock"></i>
<span>Mochzua</span>
</a>
<div class="dropdown-divider"></div>
<!-- item-->
<a href="<?=self::getUrl("Dashboard","logout")?>" class="dropdown-item notify-item">
<i class="dripicons-power"></i>
<span>Omöldn</span>
</a>
</div>
</li>
<li>
<a href="<?=self::getUrl("Dashboard","logout")?>" class="nav-link nav-user">
<i class="fas fa-sign-out-alt"></i>
<span class="pro-user-name ml-1">Omöldn</span>
</a>
</li>
</ul>

View File

@@ -2,8 +2,11 @@
class Address extends mfBaseModel {
protected $forcestr = ['street','company','zip','phone','fax','mobile','note'];
private $parent;
private $types;
private $attributes;
private $permissions;
public function getFullName() {
// Assumes "Firma1 Firma2" or "firstname lastname" as readable form
@@ -28,17 +31,33 @@ class Address extends mfBaseModel {
return $this->getFullName();
}
private function loadAddresstypes() {
public function loadAddresstypes() {
if(!$this->id) {
return false;
}
$this->types = AddresstypeModel::search(['address_id' => $this->id], true);
if(!$this->parent_id) {
$this->types = AddresstypeModel::search(['address_id' => $this->id], true);
} else {
// get types from parent
$parent = $this->getProperty("parent");
$types = $parent->getProperty("types");
$this->types = $types;
}
return true;
}
public function getProperty($name) {
if($this->$name == null) {
if(!$this->id) {
return null;
}
if($name == "types") {
$this->loadAddresstypes();
return $this->types;
@@ -55,6 +74,16 @@ class Address extends mfBaseModel {
return $this->attributes;
}
if($name == "permissions") {
$this->permissions = NetworkAddressModel::search(['address_id' => $this->id]);
return $permissions;
}
if($name == "parent") {
$this->parent = new Address($this->parent_id);
return $this->parent;
}
$classname = ucfirst($name);
$idfield = $name."_id";
$this->$name = new $classname($this->$idfield);

View File

@@ -95,10 +95,12 @@ class AddressModel {
}
}
$res = $db->select("Address", "*", "$where AND id NOT IN (".implode(",", $have).")");
if($db->num_rows()) {
while($data = $db->fetch_object($res)) {
$items[] = new Address($data);
if(!array_key_exists("addresstype", $filter)) {
$res = $db->select("Address", "*", "$where AND id NOT IN (".implode(",", $have).")");
if($db->num_rows()) {
while($data = $db->fetch_object($res)) {
$items[] = new Address($data);
}
}
}

View File

@@ -9,7 +9,7 @@ class BuildingController extends mfBaseController {
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->isAdmin()) {
if(!$me->is(["Admin", "netowner", "pipeplanner"])) {
$this->redirect("Dashboard");
}
}
@@ -21,12 +21,43 @@ class BuildingController extends mfBaseController {
protected function addAction() {
$this->layout()->setTemplate("Building/Form");
$this->layout()->set("networks", NetworkModel::getAll());
if($this->me->isAdmin()) {
$this->layout()->set("networks", NetworkModel::getAll());
$this->layout()->set("pipeworkers", AddressModel::search(["addresstype" => ["pipeworker"]])); // change to NetworkaddressModel
$this->layout()->set("lineworkers", AddressModel::search(["addresstype" => ["lineworker"]])); // change to NetworkaddressModel
} else {
$this->layout()->set("networks", $this->me->my_networks);
$pipeworkers = [];
$lineworkers = [];
foreach($this->me->my_networks as $network) {
//var_dump($network->addresstypes);exit;
if(is_array($network->addresstypes)) {
foreach($network->getTypeAddresses("pipeworker") as $address) {
if(!array_key_exists($address->id, $pipeworkers)) {
$pipeworkers[$address->id] = $address;
}
}
foreach($network->getTypeAddresses("lineworker") as $address) {
if(!array_key_exists($address->id, $lineworkers)) {
$lineworkers[$address->id] = $address;
}
}
}
}
$this->layout()->set("pipeworkers", $pipeworkers); // change to NetworkaddressModel
$this->layout()->set("lineworkers", $lineworkers); // change to NetworkaddressModel
}
$this->layout()->set("types", BuildingtypeModel::getAll());
$this->layout()->set("statuses", BuildingstatusModel::getAll());
$this->layout()->set("pipeworkers", AddressModel::search(["addresstype" => ["pipeworker"]]));
$this->layout()->set("lineworkers", AddressModel::search(["addresstype" => ["lineworker"]]));
$this->layout()->set("networksections", NetworksectionModel::getAll());
}
protected function editAction() {
@@ -71,7 +102,7 @@ class BuildingController extends mfBaseController {
$data['network_id'] = $r->network_id;
$data['pop_id'] = ($r->pop_id) ? $r->pop_id : null;
$data['type_id'] = $r->type_id;
$data['status_id'] = ($r->status_id) ? $r->status_id : null;
$data['status_id'] = ($r->status_id) ? $r->status_id : 1;
$data['pipeworker_id'] = ($r->pipeworker_id) ? $r->pipeworker_id : null;
$data['lineworker_id'] = ($r->lineworker_id) ? $r->lineworker_id : null;
$data['networksection_id'] = ($r->networksection_id) ? $r->networksection_id : null;
@@ -98,7 +129,6 @@ class BuildingController extends mfBaseController {
}
if($mode == "add") {
$data['status_id'] = 1;
$data['create_by'] = 1;
$building = BuildingModel::create($data);
} else {
@@ -141,7 +171,8 @@ class BuildingController extends mfBaseController {
}
// Anschlüsse anlegen
if($building->units > 0) {
if(!$building->terminations && $building->units > 0) {
for($i = 1; $i <= $building->units; $i++) {
$data = [];
$data['building_id'] = $building->id;

View File

@@ -17,8 +17,11 @@ class DashboardController extends mfBaseController {
protected function testAction() {
$b = new Building(7);
/*$b = new Building(7);
var_dump($b->getNewObjectCode());exit;
*/
$address = AddressModel::getOne(5);
var_dump($address->types);exit;
}
}

View File

@@ -7,6 +7,28 @@ class Network extends mfBaseModel {
private $roles;
private $sections;
public function getTypeAddresses($search_type) {
if(!$this->id) {
return false;
}
$addresses = [];
$addresstypes = $this->getProperty("addresstypes");
//var_dump($addresstypes);exit;
foreach($addresstypes as $address_id => $atypes) {
//var_dump($atypes);
foreach($atypes as $atype) {
//var_dump($atype);
if($atype->type == $search_type && !array_key_exists($address_id, $addresses)) {
$addresses[$address_id] = new Address($address_id);
}
}
}
return $addresses;
}
public function loadAddresstypes() {
if(!$this->id) {
return false;

View File

@@ -9,7 +9,7 @@ class NetworkController extends mfBaseController {
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->isAdmin()) {
if(!$me->is(["Admin", "netowner", "pipeplanner"])) {
$this->redirect("Dashboard");
}
}

View File

@@ -9,7 +9,7 @@ class NetworksectionController extends mfBaseController {
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->isAdmin()) {
if(!$me->is(["Admin", "netowner", "pipeplanner"])) {
$this->redirect("Dashboard");
}
}

View File

@@ -124,6 +124,13 @@ class OrderProductModel {
}
}
if(array_key_exists("termination_id", $filter)) {
$termination_id = $filter['termination_id'];
if(is_numeric($termination_id)) {
$where .= " AND termination_id=$termination_id";
}
}
//var_dump($filter, $where);exit;
return $where;
}

View File

@@ -9,7 +9,7 @@ class PopController extends mfBaseController {
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->isAdmin()) {
if(!$me->is(["Admin", "netowner", "pipeplanner"])) {
$this->redirect("Dashboard");
}
}

View File

@@ -8,6 +8,7 @@ class ProductModel {
public $productgroup_id = null;
public $producttech_id = null;
public $price = null;
public $price_setup = null;
public $price_nne = null;
public $price_nbe = null;
public $billing_period = null;

View File

@@ -71,7 +71,7 @@ class TerminationController extends mfBaseController {
protected function delete() {
if(!$this->me->is("Admin")) {
if(!$this->me->is(["Admin", "netowner", "pipeplanner"])) {
$this->layout()->setFlash("Keine Berechtigung", "error");
$this->redirect("Building");
}
@@ -91,6 +91,36 @@ class TerminationController extends mfBaseController {
$building_id = $term->building_id;
// if user is not admin, check if they have permission for this network
if(!$this->me->is("Admin")) {
$allowed = false;
$building = $term->building;
$network = $building->network;
foreach(["netowner", "pipeplanner"] as $type) {
$perms = $network->getTypeAddresses($type);
foreach($perms as $address_id => $perm) {
if($this->me->address_id != $address_id) {
continue;
}
$allowed = true;
}
}
if(!$allowed) {
$this->layout()->setFlash("Keine Berechtigung", "error");
$this->redirect("Building", "Index", [], "building=".$building_id);
}
}
// check for dependencies
if(OrderProductModel::search(["termination_id" => $id])) {
$this->layout()->setFlash("Anschluss kann nicht gelöscht werden, da abhängige Objekte gefunden wurden.", "error");
$this->redirect("Building", "Index", [], "building=".$building_id);
}
$term->delete();
$this->layout()->setFlash("Anschluss gelöscht", "success");
@@ -148,4 +178,4 @@ class TerminationController extends mfBaseController {
return ["msg" => "Saved successfully"];
}
}
}

View File

@@ -9,6 +9,8 @@ class User extends mfBaseModel {
public $permissions;
public $flags;
public $address;
private $my_networks;
public function init() {
$this->table = "Worker";
@@ -77,12 +79,27 @@ class User extends mfBaseModel {
if(!$this->id) {
return false;
}
if(is_object($this->permissions) && property_exists($this->permissions, "is$what")) {
return $this->permissions->{"is$what"};
if(!is_array($what)) {
$what = [$what];
}
if(is_object($this->address) && property_exists($this->address, "types") && is_array($this->address->types)) {
return ($this->address->types[$what]->id) ? true : false;
foreach($what as $w) {
if(is_object($this->permissions) && property_exists($this->permissions, "is$w")) {
if($this->permissions->{"is$w"} === true) {
return true;
}
}
//var_dump($this->address->types);exit;
if(is_object($this->address) && property_exists($this->address, "types") && is_array($this->address->types)) {
if($this->address->types[$w]->id) {
return true;
}
}
}
return false;
}
public function isAdmin() {
@@ -96,4 +113,49 @@ class User extends mfBaseModel {
public function __toString() {
return $this->username;
}
public function getProperty($name) {
if($this->$name == null) {
if(!$this->id) {
return null;
}
if($name == "my_networks") {
$this->my_networks = $this->getMyNetworks();
return $this->my_networks;
}
$classname = ucfirst($name);
$idfield = $name."_id";
$this->$name = new $classname($this->$idfield);
if($this->$name->id) {
return $this->$name;
} else {
return null;
}
}
return $this->$name;
}
private function getMyNetworks() {
if(!$this->id) {
return false;
}
$my_networks = [];
$network_list = NetworkAddressModel::search(['address_id' => $this->address_id]);
foreach($network_list as $n) {
if(!array_key_exists($n->network_id, $my_networks)) {
$my_networks[$n->network_id] = new Network($n->network_id);
}
}
return $my_networks;
}
}

View File

@@ -49,6 +49,10 @@ class UserController extends mfBaseController {
$addresses = AddressModel::getAll();
$this->layout()->set("addresses", $addresses);
if($this->request->address_id) {
$this->layout()->set("address_id", $this->request->address_id);
}
}
protected function editAction($request) {