public function testPlayerInformationCape() { $yggdrasil = new DefaultYggdrasil(); $accountUUID = '74ed335012fe4729a8923d9b15f94506'; //shadoune!!! $playerInformation = $yggdrasil->getPlayerInfo($accountUUID); $this->assertEquals($playerInformation->getName(), 'Shadoune666'); $this->assertFalse($playerInformation->isDemo()); $this->assertFalse($playerInformation->isLegacy()); $properties = $playerInformation->getProperties(); $this->assertNotNull($properties); $this->assertEquals($properties->getProfileID(), $accountUUID); $this->assertEquals($properties->getProfileName(), 'Shadoune666'); //cant really verify the timestamp/public properties $this->assertNotNull($properties->getSkinTexture()); $this->assertNotNull($properties->getCapeTexture()); $this->assertTrue($properties->hasSkin()); $this->assertTrue($properties->hasCape()); }
/** * Called on event LOGIN.EncryptionResponsePacket * @param EncryptionResponsePacket $packet */ public function onEncryptionResponsePacket(EncryptionResponsePacket $packet) { //if we don't have a verifiyToken sent yet then the packet has been sent without us sending a request, disconnect client if (null === $this->verifyToken) { $this->disconnectClient((new DisconnectPacket())->setReason('Packet received out of order')); return; } //get the verify token from the packet it and decrypt it using our key $verifyToken = $this->certificate->getPrivateKey()->decrypt($packet->getToken()); //if it isn't the same as our token then encryption failed, disconnect the client if ($verifyToken != $this->verifyToken) { $this->disconnectClient((new DisconnectPacket())->setReason('Invalid validation token')); return; } //decrypt the shared secret from the packet and decrypt it using our key $secret = $this->certificate->getPrivateKey()->decrypt($packet->getSecret()); //enable encryption using the client generated secret $this->enableAES($secret); //generate a login hash the same as the client for the session server request $publicKey = $this->certificate->getPublicKey()->getPublicKey(); $publicKey = base64_decode(substr($publicKey, 28, -26)); //cut out the start and end lines of the key $loginHash = $this->serverID . $secret . $publicKey; $loginHash = self::sha1($loginHash); //create a new Yggdrasil for checking against Mojang $yggdrasil = new DefaultYggdrasil(); try { //ask Mojang if the user has sent a join request, throws exception on failure $response = $yggdrasil->hasJoined($this->username, $loginHash); //get and set the clients UUID from the response $this->uuid = $response->getUuid(); //trigger the login success with the disconnect packet $disconnect = new DisconnectPacket(); $this->emit('login_success', [$this, $disconnect]); //if no reason was set after the event then set a default if ($disconnect->getReasonJSON() === null) { $disconnect->setReason("No kick reason supplied"); } //disconnect the client $this->disconnectClient($disconnect); } catch (Exception $ex) { echo "{$this->username} failed authentication with Mojang session servers\n"; //exception occured checking against Mojang $this->disconnectClient((new DisconnectPacket())->setReason("Error Authenticating with Mojang servers")); } }