You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1203 lines
						
					
					
						
							29 KiB
						
					
					
				
			
		
		
	
	
							1203 lines
						
					
					
						
							29 KiB
						
					
					
				| <?php
 | |
| 
 | |
| /**
 | |
|  * @file
 | |
|  * TeamSpeak 3 PHP Framework
 | |
|  *
 | |
|  * $Id: Host.php 06/06/2016 22:27:13 scp@Svens-iMac $
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * @package   TeamSpeak3
 | |
|  * @version   1.1.24
 | |
|  * @author    Sven 'ScP' Paulsen
 | |
|  * @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @class TeamSpeak3_Node_Host
 | |
|  * @brief Class describing a TeamSpeak 3 server instance and all it's parameters.
 | |
|  */
 | |
| class TeamSpeak3_Node_Host extends TeamSpeak3_Node_Abstract
 | |
| {
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $whoami = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $version = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $serverList = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $permissionEnds = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $permissionList = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $permissionCats = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $predefined_query_name = null;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $exclude_query_clients = FALSE;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $start_offline_virtual = FALSE;
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected $sort_clients_channels = FALSE;
 | |
| 
 | |
|   /**
 | |
|    * The TeamSpeak3_Node_Host constructor.
 | |
|    *
 | |
|    * @param  TeamSpeak3_Adapter_ServerQuery $squery
 | |
|    * @return TeamSpeak3_Node_Host
 | |
|    */
 | |
|   public function __construct(TeamSpeak3_Adapter_ServerQuery $squery)
 | |
|   {
 | |
|     $this->parent = $squery;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the primary ID of the selected virtual server.
 | |
|    *
 | |
|    * @return integer
 | |
|    */
 | |
|   public function serverSelectedId()
 | |
|   {
 | |
|     return $this->whoamiGet("virtualserver_id", 0);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the primary UDP port of the selected virtual server.
 | |
|    *
 | |
|    * @return integer
 | |
|    */
 | |
|   public function serverSelectedPort()
 | |
|   {
 | |
|     return $this->whoamiGet("virtualserver_port", 0);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the servers version information including platform and build number.
 | |
|    *
 | |
|    * @param  string $ident
 | |
|    * @return mixed
 | |
|    */
 | |
|   public function version($ident = null)
 | |
|   {
 | |
|     if($this->version === null)
 | |
|     {
 | |
|       $this->version = $this->request("version")->toList();
 | |
|     }
 | |
| 
 | |
|     return ($ident && isset($this->version[$ident])) ? $this->version[$ident] : $this->version;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Selects a virtual server by ID to allow further interaction.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @param  boolean $virtual
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverSelect($sid, $virtual = null)
 | |
|   {
 | |
|     if($this->whoami !== null && $this->serverSelectedId() == $sid) return;
 | |
| 
 | |
|     $virtual = ($virtual !== null) ? $virtual : $this->start_offline_virtual;
 | |
|     $getargs = func_get_args();
 | |
| 
 | |
|     $this->execute("use", array("sid" => $sid, $virtual ? "-virtual" : null));
 | |
| 
 | |
|     if($sid != 0 && $this->predefined_query_name !== null)
 | |
|     {
 | |
|       $this->execute("clientupdate", array("client_nickname" => (string) $this->predefined_query_name));
 | |
|     }
 | |
| 
 | |
|     $this->whoamiReset();
 | |
| 
 | |
|     $this->setStorage("_server_use", array(__FUNCTION__, $getargs));
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServerselected", $this);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Alias for serverSelect().
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @param  boolean $virtual
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverSelectById($sid, $virtual = null)
 | |
|   {
 | |
|     $this->serverSelect($sid, $virtual);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Selects a virtual server by UDP port to allow further interaction.
 | |
|    *
 | |
|    * @param  integer $port
 | |
|    * @param  boolean $virtual
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverSelectByPort($port, $virtual = null)
 | |
|   {
 | |
|     if($this->whoami !== null && $this->serverSelectedPort() == $port) return;
 | |
| 
 | |
|     $virtual = ($virtual !== null) ? $virtual : $this->start_offline_virtual;
 | |
|     $getargs = func_get_args();
 | |
| 
 | |
|     $this->execute("use", array("port" => $port, $virtual ? "-virtual" : null));
 | |
| 
 | |
|     if($port != 0 && $this->predefined_query_name !== null)
 | |
|     {
 | |
|       $this->execute("clientupdate", array("client_nickname" => (string) $this->predefined_query_name));
 | |
|     }
 | |
| 
 | |
|     $this->whoamiReset();
 | |
| 
 | |
|     $this->setStorage("_server_use", array(__FUNCTION__, $getargs));
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServerselected", $this);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Deselects the active virtual server.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverDeselect()
 | |
|   {
 | |
|     $this->serverSelect(0);
 | |
| 
 | |
|     $this->delStorage("_server_use");
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the ID of a virtual server matching the given port.
 | |
|    *
 | |
|    * @param  integer $port
 | |
|    * @return integer
 | |
|    */
 | |
|   public function serverIdGetByPort($port)
 | |
|   {
 | |
|     $sid = $this->execute("serveridgetbyport", array("virtualserver_port" => $port))->toList();
 | |
| 
 | |
|     return $sid["server_id"];
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the port of a virtual server matching the given ID.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @return integer
 | |
|    */
 | |
|   public function serverGetPortById($sid)
 | |
|   {
 | |
|     if(!array_key_exists((string) $sid, $this->serverList()))
 | |
|     {
 | |
|       throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid serverID", 0x400);
 | |
|     }
 | |
| 
 | |
|     return $this->serverList[intval((string) $sid)]["virtualserver_port"];
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the TeamSpeak3_Node_Server object matching the currently selected ID.
 | |
|    *
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetSelected()
 | |
|   {
 | |
|     return $this->serverGetById($this->serverSelectedId());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the TeamSpeak3_Node_Server object matching the given ID.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetById($sid)
 | |
|   {
 | |
|     $this->serverSelectById($sid);
 | |
| 
 | |
|     return new TeamSpeak3_Node_Server($this, array("virtualserver_id" => intval($sid)));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the TeamSpeak3_Node_Server object matching the given port number.
 | |
|    *
 | |
|    * @param  integer $port
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetByPort($port)
 | |
|   {
 | |
|     $this->serverSelectByPort($port);
 | |
| 
 | |
|     return new TeamSpeak3_Node_Server($this, array("virtualserver_id" => $this->serverSelectedId()));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the first TeamSpeak3_Node_Server object matching the given name.
 | |
|    *
 | |
|    * @param  string $name
 | |
|    * @throws TeamSpeak3_Adapter_ServerQuery_Exception
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetByName($name)
 | |
|   {
 | |
|     foreach($this->serverList() as $server)
 | |
|     {
 | |
|       if($server["virtualserver_name"] == $name) return $server;
 | |
|     }
 | |
| 
 | |
|     throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid serverID", 0x400);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the first TeamSpeak3_Node_Server object matching the given unique identifier.
 | |
|    *
 | |
|    * @param  string $uid
 | |
|    * @throws TeamSpeak3_Adapter_ServerQuery_Exception
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetByUid($uid)
 | |
|   {
 | |
|     foreach($this->serverList() as $server)
 | |
|     {
 | |
|       if($server["virtualserver_unique_identifier"] == $uid) return $server;
 | |
|     }
 | |
| 
 | |
|     throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid serverID", 0x400);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the first TeamSpeak3_Node_Server object matching the given TSDNS hostname. Like the
 | |
|    * TeamSpeak 3 Client, this method will start looking for a TSDNS server on the second-level
 | |
|    * domain including a fallback to the third-level domain of the specified $tsdns parameter.
 | |
|    *
 | |
|    * @param  string $tsdns
 | |
|    * @throws TeamSpeak3_Adapter_ServerQuery_Exception
 | |
|    * @return TeamSpeak3_Node_Server
 | |
|    */
 | |
|   public function serverGetByTSDNS($tsdns)
 | |
|   {
 | |
|     $parts = TeamSpeak3_Helper_Uri::getFQDNParts($tsdns);
 | |
|     $query = TeamSpeak3_Helper_String::factory(array_shift($parts));
 | |
| 
 | |
|     while($part = array_shift($parts))
 | |
|     {
 | |
|       $query->prepend($part);
 | |
| 
 | |
|       try
 | |
|       {
 | |
|         $port = TeamSpeak3::factory("tsdns://" . $query . "/?timeout=3")->resolve($tsdns)->section(":", 1);
 | |
| 
 | |
|         return $this->serverGetByPort($port == "" ? 9987 : $port);
 | |
|       }
 | |
|       catch(TeamSpeak3_Transport_Exception $e)
 | |
|       {
 | |
|         /* skip "Connection timed out" and "Connection refused" */
 | |
|         if($e->getCode() != 10060 && $e->getCode() != 10061) throw $e;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid serverID", 0x400);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new virtual server using given properties and returns an assoc
 | |
|    * array containing the new ID and initial admin token.
 | |
|    *
 | |
|    * @param  array $properties
 | |
|    * @return array
 | |
|    */
 | |
|   public function serverCreate(array $properties = array())
 | |
|   {
 | |
|     $this->serverListReset();
 | |
| 
 | |
|     $detail = $this->execute("servercreate", $properties)->toList();
 | |
|     $server = new TeamSpeak3_Node_Server($this, array("virtualserver_id" => intval($detail["sid"])));
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServercreated", $this, $detail["sid"]);
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyTokencreated", $server, $detail["token"]);
 | |
| 
 | |
|     return $detail;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Deletes the virtual server specified by ID.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverDelete($sid)
 | |
|   {
 | |
|     $this->serverListReset();
 | |
| 
 | |
|     $this->execute("serverdelete", array("sid" => $sid));
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServerdeleted", $this, $sid);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Starts the virtual server specified by ID.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverStart($sid)
 | |
|   {
 | |
|     if($sid == $this->serverSelectedId())
 | |
|     {
 | |
|       $this->serverDeselect();
 | |
|     }
 | |
| 
 | |
|     $this->execute("serverstart", array("sid" => $sid));
 | |
|     $this->serverListReset();
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServerstarted", $this, $sid);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Stops the virtual server specified by ID.
 | |
|    *
 | |
|    * @param  integer $sid
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverStop($sid)
 | |
|   {
 | |
|     if($sid == $this->serverSelectedId())
 | |
|     {
 | |
|       $this->serverDeselect();
 | |
|     }
 | |
| 
 | |
|     $this->execute("serverstop", array("sid" => $sid));
 | |
|     $this->serverListReset();
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServerstopped", $this, $sid);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Stops the entire TeamSpeak 3 Server instance by shutting down the process.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverStopProcess()
 | |
|   {
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyServershutdown", $this);
 | |
| 
 | |
|     $this->execute("serverprocessstop");
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an array filled with TeamSpeak3_Node_Server objects.
 | |
|    *
 | |
|    * @param  array $filter
 | |
|    * @return array
 | |
|    */
 | |
|   public function serverList(array $filter = array())
 | |
|   {
 | |
|     if($this->serverList === null)
 | |
|     {
 | |
|       $servers = $this->request("serverlist -uid")->toAssocArray("virtualserver_id");
 | |
| 
 | |
|       $this->serverList = array();
 | |
| 
 | |
|       foreach($servers as $sid => $server)
 | |
|       {
 | |
|         $this->serverList[$sid] = new TeamSpeak3_Node_Server($this, $server);
 | |
|       }
 | |
| 
 | |
|       $this->resetNodeList();
 | |
|     }
 | |
| 
 | |
|     return $this->filterList($this->serverList, $filter);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Resets the list of virtual servers.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverListReset()
 | |
|   {
 | |
|     $this->resetNodeList();
 | |
|     $this->serverList = null;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a list of IP addresses used by the server instance on multi-homed machines.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function bindingList($subsystem = "voice")
 | |
|   {
 | |
|     return $this->execute("bindinglist", array("subsystem" => $subsystem))->toArray();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a list of permissions available on the server instance.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function permissionList()
 | |
|   {
 | |
|     if($this->permissionList === null)
 | |
|     {
 | |
|       $this->fetchPermissionList();
 | |
|     }
 | |
| 
 | |
|     foreach($this->permissionList as $permname => $permdata)
 | |
|     {
 | |
|       if(isset($permdata["permcatid"]) && $permdata["permgrant"])
 | |
|       {
 | |
|         continue;
 | |
|       }
 | |
| 
 | |
|       $this->permissionList[$permname]["permcatid"] = $this->permissionGetCategoryById($permdata["permid"]);
 | |
|       $this->permissionList[$permname]["permgrant"] = $this->permissionGetGrantById($permdata["permid"]);
 | |
| 
 | |
|       $grantsid = "i_needed_modify_power_" . substr($permname, 2);
 | |
| 
 | |
|       if(!$permdata["permname"]->startsWith("i_needed_modify_power_") && !isset($this->permissionList[$grantsid]))
 | |
|       {
 | |
|         $this->permissionList[$grantsid]["permid"]    = $this->permissionList[$permname]["permgrant"];
 | |
|         $this->permissionList[$grantsid]["permname"]  = TeamSpeak3_Helper_String::factory($grantsid);
 | |
|         $this->permissionList[$grantsid]["permdesc"]  = null;
 | |
|         $this->permissionList[$grantsid]["permcatid"] = 0xFF;
 | |
|         $this->permissionList[$grantsid]["permgrant"] = $this->permissionList[$permname]["permgrant"];
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return $this->permissionList;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a list of permission categories available on the server instance.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function permissionCats()
 | |
|   {
 | |
|     if($this->permissionCats === null)
 | |
|     {
 | |
|       $this->fetchPermissionCats();
 | |
|     }
 | |
| 
 | |
|     return $this->permissionCats;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a list of permission category endings available on the server instance.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function permissionEnds()
 | |
|   {
 | |
|     if($this->permissionEnds === null)
 | |
|     {
 | |
|       $this->fetchPermissionList();
 | |
|     }
 | |
| 
 | |
|     return $this->permissionCats;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an array filled with all permission categories known to the server including
 | |
|    * their ID, name and parent.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function permissionTree()
 | |
|   {
 | |
|     $permtree = array();
 | |
| 
 | |
|     foreach($this->permissionCats() as $key => $val)
 | |
|     {
 | |
|       $permtree[$val]["permcatid"]      = $val;
 | |
|       $permtree[$val]["permcathex"]     = "0x" . dechex($val);
 | |
|       $permtree[$val]["permcatname"]    = TeamSpeak3_Helper_String::factory(TeamSpeak3_Helper_Convert::permissionCategory($val));
 | |
|       $permtree[$val]["permcatparent"]  = $permtree[$val]["permcathex"]{3} == 0 ? 0 : hexdec($permtree[$val]["permcathex"]{2} . 0);
 | |
|       $permtree[$val]["permcatchilren"] = 0;
 | |
|       $permtree[$val]["permcatcount"]   = 0;
 | |
| 
 | |
|       if(isset($permtree[$permtree[$val]["permcatparent"]]))
 | |
|       {
 | |
|         $permtree[$permtree[$val]["permcatparent"]]["permcatchilren"]++;
 | |
|       }
 | |
| 
 | |
|       if($permtree[$val]["permcatname"]->contains("/"))
 | |
|       {
 | |
|         $permtree[$val]["permcatname"] = $permtree[$val]["permcatname"]->section("/", 1)->trim();
 | |
|       }
 | |
| 
 | |
|       foreach($this->permissionList() as $permission)
 | |
|       {
 | |
|         if($permission["permid"]["permcatid"] == $val)
 | |
|         {
 | |
|           $permtree[$val]["permcatcount"]++;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return $permtree;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the IDs of all clients, channels or groups using the permission with the
 | |
|    * specified ID.
 | |
|    *
 | |
|    * @param  integer $permid
 | |
|    * @return array
 | |
|    */
 | |
|   public function permissionFind($permid)
 | |
|   {
 | |
|     if(!is_array($permid))
 | |
|     {
 | |
|       $permident = (is_numeric($permid)) ? "permid" : "permsid";
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       $permident = (is_numeric(current($permid))) ? "permid" : "permsid";
 | |
|     }
 | |
| 
 | |
|     return $this->execute("permfind", array($permident => $permid))->toArray();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the ID of the permission matching the given name.
 | |
|    *
 | |
|    * @param  string $name
 | |
|    * @throws TeamSpeak3_Adapter_ServerQuery_Exception
 | |
|    * @return integer
 | |
|    */
 | |
|   public function permissionGetIdByName($name)
 | |
|   {
 | |
|     if(!array_key_exists((string) $name, $this->permissionList()))
 | |
|     {
 | |
|       throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid permission ID", 0xA02);
 | |
|     }
 | |
| 
 | |
|     return $this->permissionList[(string) $name]["permid"];
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the name of the permission matching the given ID.
 | |
|    *
 | |
|    * @param  integer $permid
 | |
|    * @throws TeamSpeak3_Adapter_ServerQuery_Exception
 | |
|    * @return TeamSpeak3_Helper_String
 | |
|    */
 | |
|   public function permissionGetNameById($permid)
 | |
|   {
 | |
|     foreach($this->permissionList() as $name => $perm)
 | |
|     {
 | |
|       if($perm["permid"] == $permid) return new TeamSpeak3_Helper_String($name);
 | |
|     }
 | |
| 
 | |
|     throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid permission ID", 0xA02);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the internal category of the permission matching the given ID.
 | |
|    *
 | |
|    * All pre-3.0.7 permission IDs are are 2 bytes wide. The first byte identifies the category while 
 | |
|    * the second byte is the permission count within that group.
 | |
|    *
 | |
|    * @param  integer $permid
 | |
|    * @return integer
 | |
|    */
 | |
|   public function permissionGetCategoryById($permid)
 | |
|   {
 | |
|     if(!is_numeric($permid))
 | |
|     {
 | |
|       $permid = $this->permissionGetIdByName($permid);
 | |
|     }
 | |
| 
 | |
|     if($permid < 0x1000)
 | |
|     {
 | |
|       if($this->permissionEnds === null)
 | |
|       {
 | |
|         $this->fetchPermissionList();
 | |
|       }
 | |
| 
 | |
|       if($this->permissionCats === null)
 | |
|       {
 | |
|         $this->fetchPermissionCats();
 | |
|       }
 | |
| 
 | |
|       $catids = array_values($this->permissionCats());
 | |
| 
 | |
|       foreach($this->permissionEnds as $key => $val)
 | |
|       {
 | |
|         if($val >= $permid && isset($catids[$key]))
 | |
|         {
 | |
|           return $catids[$key];
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       return 0;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       return (int) $permid >> 8;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the internal ID of the i_needed_modify_power_* or grant permission.
 | |
|    *
 | |
|    * Every permission has an associated i_needed_modify_power_* permission, for example b_client_ban_create has an
 | |
|    * associated permission called i_needed_modify_power_client_ban_create.
 | |
|    *
 | |
|    * @param  integer $permid
 | |
|    * @return integer
 | |
|    */
 | |
|   public function permissionGetGrantById($permid)
 | |
|   {
 | |
|     if(!is_numeric($permid))
 | |
|     {
 | |
|       $permid = $this->permissionGetIdByName($permid);
 | |
|     }
 | |
| 
 | |
|     if($permid < 0x1000)
 | |
|     {
 | |
|       return (int) $permid+0x8000;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       return (int) bindec(substr(decbin($permid), -8))+0xFF00;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Adds a set of specified permissions to all regular server groups on all virtual servers. The target groups will
 | |
|    * be identified by the value of their i_group_auto_update_type permission specified with $sgtype.
 | |
|    *
 | |
|    * @param  integer $sgtype
 | |
|    * @param  integer $permid
 | |
|    * @param  integer $permvalue
 | |
|    * @param  integer $permnegated
 | |
|    * @param  integer $permskip
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverGroupPermAutoAssign($sgtype, $permid, $permvalue, $permnegated = FALSE, $permskip = FALSE)
 | |
|   {
 | |
|     if(!is_array($permid))
 | |
|     {
 | |
|       $permident = (is_numeric($permid)) ? "permid" : "permsid";
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       $permident = (is_numeric(current($permid))) ? "permid" : "permsid";
 | |
|     }
 | |
| 
 | |
|     $this->execute("servergroupautoaddperm", array("sgtype" => $sgtype, $permident => $permid, "permvalue" => $permvalue, "permnegated" => $permnegated, "permskip" => $permskip));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes a set of specified permissions from all regular server groups on all virtual servers. The target groups
 | |
|    * will be identified by the value of their i_group_auto_update_type permission specified with $sgtype.
 | |
|    *
 | |
|    * @param  integer $sgtype
 | |
|    * @param  integer $permid
 | |
|    * @return void
 | |
|    */
 | |
|   public function serverGroupPermAutoRemove($sgtype, $permid)
 | |
|   {
 | |
|     if(!is_array($permid))
 | |
|     {
 | |
|       $permident = (is_numeric($permid)) ? "permid" : "permsid";
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       $permident = (is_numeric(current($permid))) ? "permid" : "permsid";
 | |
|     }
 | |
| 
 | |
|     $this->execute("servergroupautodelperm", array("sgtype" => $sgtype, $permident => $permid));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an array containing the value of a specified permission for your own client.
 | |
|    *
 | |
|    * @param  integer $permid
 | |
|    * @return array
 | |
|    */
 | |
|   public function selfPermCheck($permid)
 | |
|   {
 | |
|     if(!is_array($permid))
 | |
|     {
 | |
|       $permident = (is_numeric($permid)) ? "permid" : "permsid";
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       $permident = (is_numeric(current($permid))) ? "permid" : "permsid";
 | |
|     }
 | |
| 
 | |
|     return $this->execute("permget", array($permident => $permid))->toAssocArray("permsid");
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Changes the server instance configuration using given properties.
 | |
|    *
 | |
|    * @param  array $properties
 | |
|    * @return void
 | |
|    */
 | |
|   public function modify(array $properties)
 | |
|   {
 | |
|     $this->execute("instanceedit", $properties);
 | |
|     $this->resetNodeInfo();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sends a text message to all clients on all virtual servers in the TeamSpeak 3 Server instance.
 | |
|    *
 | |
|    * @param  string $msg
 | |
|    * @return void
 | |
|    */
 | |
|   public function message($msg)
 | |
|   {
 | |
|     $this->execute("gm", array("msg" => $msg));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Displays a specified number of entries (1-100) from the servers log.
 | |
|    *
 | |
|    * @param  integer $lines
 | |
|    * @param  integer $begin_pos
 | |
|    * @param  boolean $reverse
 | |
|    * @param  boolean $instance
 | |
|    * @return array
 | |
|    */
 | |
|   public function logView($lines = 30, $begin_pos = null, $reverse = null, $instance = TRUE)
 | |
|   {
 | |
|     return $this->execute("logview", array("lines" => $lines, "begin_pos" => $begin_pos, "instance" => $instance, "reverse" => $reverse))->toArray();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Writes a custom entry into the server instance log.
 | |
|    *
 | |
|    * @param  string  $logmsg
 | |
|    * @param  integer $loglevel
 | |
|    * @return void
 | |
|    */
 | |
|   public function logAdd($logmsg, $loglevel = TeamSpeak3::LOGLEVEL_INFO)
 | |
|   {
 | |
|     $sid = $this->serverSelectedId();
 | |
| 
 | |
|     $this->serverDeselect();
 | |
|     $this->execute("logadd", array("logmsg" => $logmsg, "loglevel" => $loglevel));
 | |
|     $this->serverSelect($sid);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Authenticates with the TeamSpeak 3 Server instance using given ServerQuery login credentials.
 | |
|    *
 | |
|    * @param  string $username
 | |
|    * @param  string $password
 | |
|    * @return void
 | |
|    */
 | |
|   public function login($username, $password)
 | |
|   {
 | |
|     $this->execute("login", array("client_login_name" => $username, "client_login_password" => $password));
 | |
|     $this->whoamiReset();
 | |
| 
 | |
|     $crypt = new TeamSpeak3_Helper_Crypt($username);
 | |
| 
 | |
|     $this->setStorage("_login_user", $username);
 | |
|     $this->setStorage("_login_pass", $crypt->encrypt($password));
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyLogin", $this);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Deselects the active virtual server and logs out from the server instance.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function logout()
 | |
|   {
 | |
|     $this->request("logout");
 | |
|     $this->whoamiReset();
 | |
| 
 | |
|     $this->delStorage("_login_user");
 | |
|     $this->delStorage("_login_pass");
 | |
| 
 | |
|     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyLogout", $this);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns information about your current ServerQuery connection.
 | |
|    *
 | |
|    * @return array
 | |
|    */
 | |
|   public function whoami()
 | |
|   {
 | |
|     if($this->whoami === null)
 | |
|     {
 | |
|       $this->whoami = $this->request("whoami")->toList();
 | |
|     }
 | |
| 
 | |
|     return $this->whoami;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a single value from the current ServerQuery connection info.
 | |
|    *
 | |
|    * @param  string $ident
 | |
|    * @param  mixed  $default
 | |
|    * @return mixed
 | |
|    */
 | |
|   public function whoamiGet($ident, $default = null)
 | |
|   {
 | |
|     if(array_key_exists($ident, $this->whoami()))
 | |
|     {
 | |
|       return $this->whoami[$ident];
 | |
|     }
 | |
| 
 | |
|     return $default;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets a single value in the current ServerQuery connection info.
 | |
|    *
 | |
|    * @param  string $ident
 | |
|    * @param  mixed  $value
 | |
|    * @return mixed
 | |
|    */
 | |
|   public function whoamiSet($ident, $value = null)
 | |
|   {
 | |
|     $this->whoami();
 | |
| 
 | |
|     $this->whoami[$ident] = (is_numeric($value)) ? (int) $value : TeamSpeak3_Helper_String::factory($value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Resets the current ServerQuery connection info.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function whoamiReset()
 | |
|   {
 | |
|     $this->whoami = null;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the hostname or IPv4 address the adapter is connected to.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getAdapterHost()
 | |
|   {
 | |
|     return $this->getParent()->getTransportHost();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the network port the adapter is connected to.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getAdapterPort()
 | |
|   {
 | |
|     return $this->getParent()->getTransportPort();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected function fetchNodeList()
 | |
|   {
 | |
|     $servers = $this->serverList();
 | |
| 
 | |
|     foreach($servers as $server)
 | |
|     {
 | |
|       $this->nodeList[] = $server;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected function fetchNodeInfo()
 | |
|   {
 | |
|     $info1 = $this->request("hostinfo")->toList();
 | |
|     $info2 = $this->request("instanceinfo")->toList();
 | |
| 
 | |
|     $this->nodeInfo = array_merge($this->nodeInfo, $info1, $info2);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected function fetchPermissionList()
 | |
|   {
 | |
|     $reply = $this->request("permissionlist -new")->toArray();
 | |
|     $start = 1;
 | |
| 
 | |
|     $this->permissionEnds = array();
 | |
|     $this->permissionList = array();
 | |
| 
 | |
|     foreach($reply as $line)
 | |
|     {
 | |
|       if(array_key_exists("group_id_end", $line))
 | |
|       {
 | |
|         $this->permissionEnds[] = $line["group_id_end"];
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         $this->permissionList[$line["permname"]->toString()] = array_merge(array("permid" => $start++), $line);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @ignore
 | |
|    */
 | |
|   protected function fetchPermissionCats()
 | |
|   {
 | |
|     $permcats = array();
 | |
|     $reflects = new ReflectionClass("TeamSpeak3");
 | |
| 
 | |
|     foreach($reflects->getConstants() as $key => $val)
 | |
|     {
 | |
|       if(!TeamSpeak3_Helper_String::factory($key)->startsWith("PERM_CAT") || $val == 0xFF)
 | |
|       {
 | |
|         continue;
 | |
|       }
 | |
| 
 | |
|       $permcats[$key] = $val;
 | |
|     }
 | |
| 
 | |
|     $this->permissionCats = $permcats;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets a pre-defined nickname for ServerQuery clients which will be used automatically
 | |
|    * after selecting a virtual server.
 | |
|    *
 | |
|    * @param  string $name
 | |
|    * @return void
 | |
|    */
 | |
|   public function setPredefinedQueryName($name = null)
 | |
|   {
 | |
|     $this->setStorage("_query_nick", $name);
 | |
| 
 | |
|     $this->predefined_query_name = $name;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the pre-defined nickname for ServerQuery clients which will be used automatically
 | |
|    * after selecting a virtual server.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getPredefinedQueryName()
 | |
|   {
 | |
|     return $this->predefined_query_name;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the option to decide whether ServerQuery clients should be excluded from node
 | |
|    * lists or not.
 | |
|    *
 | |
|    * @param  boolean $exclude
 | |
|    * @return void
 | |
|    */
 | |
|   public function setExcludeQueryClients($exclude = FALSE)
 | |
|   {
 | |
|     $this->setStorage("_query_hide", $exclude);
 | |
| 
 | |
|     $this->exclude_query_clients = $exclude;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the option to decide whether ServerQuery clients should be excluded from node
 | |
|    * lists or not.
 | |
|    *
 | |
|    * @return boolean
 | |
|    */
 | |
|   public function getExcludeQueryClients()
 | |
|   {
 | |
|     return $this->exclude_query_clients;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the option to decide whether offline servers will be started in virtual mode
 | |
|    * by default or not.
 | |
|    *
 | |
|    * @param  boolean $virtual
 | |
|    * @return void
 | |
|    */
 | |
|   public function setUseOfflineAsVirtual($virtual = FALSE)
 | |
|   {
 | |
|     $this->setStorage("_do_virtual", $virtual);
 | |
| 
 | |
|     $this->start_offline_virtual = $virtual;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the option to decide whether offline servers will be started in virtual mode
 | |
|    * by default or not.
 | |
|    *
 | |
|    * @return boolean
 | |
|    */
 | |
|   public function getUseOfflineAsVirtual()
 | |
|   {
 | |
|     return $this->start_offline_virtual;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the option to decide whether clients should be sorted before sub-channels to support
 | |
|    * the new TeamSpeak 3 Client display mode or not.
 | |
|    *
 | |
|    * @param  boolean $first
 | |
|    * @return void
 | |
|    */
 | |
|   public function setLoadClientlistFirst($first = FALSE)
 | |
|   {
 | |
|     $this->setStorage("_client_top", $first);
 | |
| 
 | |
|     $this->sort_clients_channels = $first;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the option to decide whether offline servers will be started in virtual mode
 | |
|    * by default or not.
 | |
|    *
 | |
|    * @return boolean
 | |
|    */
 | |
|   public function getLoadClientlistFirst()
 | |
|   {
 | |
|     return $this->sort_clients_channels;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the underlying TeamSpeak3_Adapter_ServerQuery object.
 | |
|    *
 | |
|    * @return TeamSpeak3_Adapter_ServerQuery
 | |
|    */
 | |
|   public function getAdapter()
 | |
|   {
 | |
|     return $this->getParent();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a unique identifier for the node which can be used as a HTML property.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getUniqueId()
 | |
|   {
 | |
|     return "ts3_h";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the name of a possible icon to display the node object.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getIcon()
 | |
|   {
 | |
|     return "host";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a symbol representing the node.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function getSymbol()
 | |
|   {
 | |
|     return "+";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Re-authenticates with the TeamSpeak 3 Server instance using given ServerQuery login
 | |
|    * credentials and re-selects a previously selected virtual server.
 | |
|    *
 | |
|    * @return void
 | |
|    */
 | |
|   public function __wakeup()
 | |
|   {
 | |
|     $username = $this->getStorage("_login_user");
 | |
|     $password = $this->getStorage("_login_pass");
 | |
| 
 | |
|     if($username && $password)
 | |
|     {
 | |
|       $crypt = new TeamSpeak3_Helper_Crypt($username);
 | |
| 
 | |
|       $this->login($username, $crypt->decrypt($password));
 | |
|     }
 | |
| 
 | |
|     $this->predefined_query_name = $this->getStorage("_query_nick");
 | |
|     $this->exclude_query_clients = $this->getStorage("_query_hide", FALSE);
 | |
|     $this->start_offline_virtual = $this->getStorage("_do_virtual", FALSE);
 | |
|     $this->sort_clients_channels = $this->getStorage("_client_top", FALSE);
 | |
| 
 | |
|     if($server = $this->getStorage("_server_use"))
 | |
|     {
 | |
|       $func = array_shift($server);
 | |
|       $args = array_shift($server);
 | |
|       
 | |
|       try
 | |
|       {
 | |
|         call_user_func_array(array($this, $func), $args);
 | |
|       }
 | |
|       catch(Exception $e)
 | |
|       {
 | |
|         $class = get_class($e);
 | |
|         
 | |
|         throw new $class($e->getMessage(), $e->getCode());
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a string representation of this node.
 | |
|    *
 | |
|    * @return string
 | |
|    */
 | |
|   public function __toString()
 | |
|   {
 | |
|     return (string) $this->getAdapterHost();
 | |
|   }
 | |
| }
 | |
| 
 |