packets = $tmwa->packets; $address = gethostbyname($wgLadminHost); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 5, 'usec' => 0)); socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 5, 'usec' => 0)); if ($socket === False) { $this->socket = False; return False; } if(socket_connect($socket, $address, $wgLadminPort)) { $this->socket = $socket; if (self::admin_login()) { return True; } } $this->socket = False; return False; } private function ladmin_sendrecv($packet_data) { $packet_send = ''; foreach ($this->packets[$packet_data['packet']]['packet'] as $pack_name => $pack_item) { $packet_send .= pack($pack_item, $packet_data[$pack_name]); } socket_write($this->socket, $packet_send); $packet_send = ''; socket_recv($this->socket, $packet_pack, 2, MSG_PEEK); $packet_recv = unpack('vpacket/', $packet_pack); socket_recv($this->socket, $packet_pack, $this->packets[$packet_recv['packet']]['len'], MSG_DONTWAIT); $unpack_payload = ''; foreach ($this->packets[$packet_recv['packet']]['packet'] as $pack_name => $pack_item) { $unpack_payload .= $pack_item.$pack_name.'/'; } $payload_recv = unpack($unpack_payload, $packet_pack); return $payload_recv; } private function admin_login() { // Admin Login $login_response = self::ladmin_sendrecv(array('packet' => 0x7918, 'encryption_zero' => 0,'account_pass' => get_cfg_var("tmwa.cfg.LADMIN_PASS"))); if($login_response['error'] != 0) { return False; } return self::login_version(); } private function login_version() { // Login version $packet_data['packet'] = 0x7530; return self::ladmin_sendrecv($packet_data); } private function add_account($args) { // Add Account $packet_data['packet'] = 0x7930; $user_check = self::ladmin_sendrecv(array_merge($packet_data, $args)); return ($user_check['account_id'] > 0 ? True : False); } private function check_password($args) { // Check Password $packet_data['packet'] = 0x793a; $user_check = self::ladmin_sendrecv(array_merge($packet_data, $args)); return ($user_check['account_id'] > 0 ? True : False); } private function who_account($args) { // Who Account $packet_data['packet'] = 0x7952; return self::ladmin_sendrecv(array_merge($packet_data, $args)); } private function change_password($args) { // Change Password $packet_data['packet'] = 0x7934; $pass_result = self::ladmin_sendrecv(array_merge($packet_data, $args)); return ($pass_result['account_id'] > 0 ? True : False); } public function close() { socket_close($this->socket); } public function account_info($username) { $args = array('account_name' => $username); $account_info = self::who_account($args); return $account_info; } public function account_exists($username) { $args = array('account_name' => $username); $user_name_exists = self::who_account($args); return ($user_name_exists['account_id'] > 0 ? True : False); } public function check_auth($username, $userpass) { $args = array('account_name' => $username, 'account_password' => $userpass); return self::check_password($args); } public function check_ban($username) { $account_info = self::account_info($username); if ($account_info['state'] > 0) { return True; } elseif ($account_info['ban_until'] > 0) { return True; } return False; } public function change_pass($username, $userpass) { $args = array('account_name' => $username, 'account_password' => $userpass); return self::change_password($args); } public function reset_password($username, $userpass, $newuserpass) { $args = array('account_name' => $username, 'account_password' => $userpass); $user_check = self::check_password($args); return ($user_check ? self::change_pass($username, $newuserpass) : False); } public function create_account($username, $userpass, $sex, $email) { $user_name_exists = self::account_exists($username); $args = array('account_name' => $username, 'account_password' => $userpass, 'sex' => $sex, 'email' => $email); return (!$user_name_exists ? self::add_account($args) : False); } }