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 = "$firstname "; if($middlename) { $abbr .= substr($middlename, 0, 1). ". "; } $abbr .= substr($lastname, 0, 1). ". "; 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; } 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; } }