317 lines
7.1 KiB
PHP
317 lines
7.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Description of User
|
|
*
|
|
* @author fronk
|
|
*/
|
|
class User extends mfBaseModel {
|
|
public $permissions;
|
|
public $flags;
|
|
public $address;
|
|
protected $forcestr = ['mobile','twofactorcode'];
|
|
|
|
private $my_networks;
|
|
|
|
public function init() {
|
|
$this->table = "Worker";
|
|
|
|
if(defined("MFUSERTABLE")) {
|
|
$this->table = MFUSERTABLE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Loads currently logged in user
|
|
*/
|
|
public function loadMe() {
|
|
if(defined("INTERNAL_USER_ID") && is_numeric(INTERNAL_USER_ID)) {
|
|
$this->fetch(INTERNAL_USER_ID);
|
|
return true;
|
|
}
|
|
|
|
if(!isset($_SESSION) || !is_array($_SESSION) || !array_key_exists(MFAPPNAME.'_username', $_SESSION)) {
|
|
return false;
|
|
}
|
|
|
|
$username = $_SESSION[MFAPPNAME.'_username'];
|
|
$res = $this->db->select($this->table,"*","username='$username' LIMIT 1");
|
|
if($this->db->num_rows($res)) {
|
|
$data = $this->db->fetch_object($res);
|
|
$this->load($data);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function loadByUsername($username) {
|
|
$username = $this->db->escape($username);
|
|
if(!$username) {
|
|
return false;
|
|
}
|
|
|
|
$res = $this->db->select($this->table, "*", "username='$username' LIMIT 1");
|
|
if($this->db->num_rows($res)) {
|
|
$data = $this->db->fetch_object($res);
|
|
$this->load($data);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function loadByApikey($key) {
|
|
$key = $this->db->escape($key);
|
|
if(!$key) {
|
|
return false;
|
|
}
|
|
|
|
$res = $this->db->select($this->table, "*", "apikey='$key'");
|
|
if($this->db->num_rows($res) === 1) {
|
|
$data = $this->db->fetch_object($res);
|
|
$this->load($data);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function createApiKey() {
|
|
$tries = 3;
|
|
$key = false;
|
|
|
|
while(!$key) {
|
|
$source = random_bytes(128);
|
|
$key = base64_encode($source);
|
|
$key = str_replace(["/","=","+"], "", $key);
|
|
$key = substr($key, 0, 32);
|
|
|
|
$res = $this->db->select($this->table, "id", "apikey='$key'");
|
|
if($this->db->num_rows($res) || strlen($key) < 32) {
|
|
$key = false;
|
|
$tries--;
|
|
$this->log->error("new api key not unique ($tries)");
|
|
if($tries < 1) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!$key) {
|
|
$this->log->error("unable to create unique api key");
|
|
return null;
|
|
}
|
|
|
|
return $key;
|
|
}
|
|
|
|
public function getAbbrName() {
|
|
if(strpos($this->name, " ") === false) {
|
|
return $this->name;
|
|
}
|
|
|
|
$m = [];
|
|
if(preg_match('/^([^ ]+) ([^ ]+)(?: ([^ ]+))?$/', $this->name, $m)) {
|
|
$firstname = $m[1];
|
|
if($m[3]) {
|
|
$middlename = $m[2];
|
|
$lastname = $m[3];
|
|
} else {
|
|
$middlename = "";
|
|
$lastname = $m[2];
|
|
}
|
|
|
|
//var_dump($m);exit;
|
|
|
|
$abbr = substr($firstname, 0, 1). ". ";
|
|
if($middlename) {
|
|
$abbr .= substr($middlename, 0, 1). ". ";
|
|
}
|
|
$abbr .= $lastname;
|
|
|
|
return $abbr;
|
|
}
|
|
|
|
return $this->name;
|
|
}
|
|
|
|
protected function afterLoad() {
|
|
$wp = new WorkerPermission();
|
|
$wp->loadByUserId($this->id);
|
|
$this->permissions = $wp;
|
|
$this->loadFlags();
|
|
|
|
$this->address = new Address($this->address_id);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function getFlag($name) {
|
|
return new WorkerFlag($this->id, $name);
|
|
}
|
|
|
|
private function loadFlags() {
|
|
$res = $this->db->select("WorkerFlag", "*", "worker_id=".$this->id);
|
|
if(!$this->db->num_rows($res)) {
|
|
return false;
|
|
}
|
|
|
|
while($data = $this->db->fetch_object($res)) {
|
|
$this->flags[$data->name] = $data->value;
|
|
}
|
|
}
|
|
|
|
protected function afterSave() {
|
|
$this->afterLoad();
|
|
}
|
|
|
|
protected function afterDelete() {
|
|
if(is_object($this->permissions)) {
|
|
$this->permissions->delete();
|
|
}
|
|
}
|
|
|
|
public function is($what) {
|
|
if(!$this->id) {
|
|
return false;
|
|
}
|
|
|
|
if(!is_array($what)) {
|
|
$what = [$what];
|
|
}
|
|
|
|
foreach($what as $w) {
|
|
$perm = ucfirst(strtolower($w));
|
|
if(is_object($this->permissions) && property_exists($this->permissions, "is$perm")) {
|
|
if($this->permissions->{"is$perm"} === 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(array_key_exists($w, $this->address->types) && $this->address->types[$w]->id) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function isAdmin() {
|
|
if(is_object($this->permissions) && property_exists($this->permissions, "isAdmin")) {
|
|
return $this->permissions->isAdmin;
|
|
}
|
|
$this->log->warning("No permissions object in user");
|
|
return false;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public function myNetworks($types) {
|
|
$typenets = [];
|
|
$my_networks = $this->getProperty("my_networks");
|
|
|
|
if(!is_array($types)) {
|
|
$types = [$types];
|
|
}
|
|
|
|
foreach($my_networks as $net) {
|
|
//var_dump($net);exit;
|
|
$address_id = $this->address_id;
|
|
if($this->address->parent_id) {
|
|
$address_id = $this->address->parent_id;
|
|
}
|
|
$found = NetworkaddressModel::search(['network_id' => $net->id, "addresstype" => $types, 'address_id' => $address_id]);
|
|
if($found) {
|
|
$typenets[] = $net;
|
|
}
|
|
|
|
}
|
|
|
|
//var_dump($typenets);exit;
|
|
return $typenets;
|
|
}
|
|
|
|
public function hasGwrNetworks() {
|
|
$my_networks = $this->myNetworks(["netowner"]);
|
|
foreach($my_networks as $network) {
|
|
if($network->adb_netzgebiet_id) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private function getMyNetworks() {
|
|
if(!$this->id) {
|
|
return false;
|
|
}
|
|
|
|
$my_networks = [];
|
|
|
|
$address_id = $this->address_id;
|
|
|
|
if($this->getProperty("address")->parent_id) {
|
|
$address_id = $this->getProperty("address")->parent_id;
|
|
}
|
|
//var_dump($address_id);exit;
|
|
$network_list = NetworkAddressModel::search(['address_id' => $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;
|
|
}
|
|
|
|
public function getAddressOrParent() {
|
|
if(!$this->id) {
|
|
return null;
|
|
}
|
|
|
|
if(!$this->address->parent_id) {
|
|
return $this->address;
|
|
}
|
|
|
|
$parent = $this->address->parent;
|
|
$p = $parent;
|
|
while($p) {
|
|
if(!$p->parent_id) {
|
|
break;
|
|
}
|
|
$parent = $p->parent;
|
|
}
|
|
|
|
return $parent;
|
|
}
|
|
|
|
}
|