expectRedirectTo(''); $this->get('magic'); } #[BackupStaticProperties(App::class)] public function test_local_request_without_delegate(): void { $baseurl = 'https://hubzilla.test'; $dest_url = $baseurl . '/channel/testuser'; App::set_baseurl($baseurl); App::$observer = [ 'xchan_hash' => 'the hash', ]; // We pass a local URL, and have a valid observer, but as the // delegate param is not passed, nothing will be done except // redirecting to the passed dest url. // // This should probably return a 400 Invalid Request instead. $this->expectRedirectTo($dest_url); $this->get('magic', [ 'bdest' => bin2hex($dest_url) ]); } #[BackupStaticProperties(App::class)] public function test_delegate_request_switches_channel_when_allowed(): void { $baseurl = 'https://hubzilla.test'; $dest_url = $baseurl . '/channel/testuser'; // Set the stage: // Populate the global static App class with necessary values for the // code under test App::set_baseurl($baseurl); App::$timezone = 'UTC'; // Simulate a foreign (to this hub) observer, App::$observer = [ 'xchan_hash' => 'foreign hash', ]; // Create the channel the foreign observer wants to access $result = create_identity([ 'account_id' => $this->fixtures['account'][0]['account_id'], 'nickname' => 'testuser', 'name' => 'Trish Testuser', ]); // Shortcut the permission checks, by saying this observer is allowed // the delegate privilege over the target channel insert_hook('perm_is_allowed', function (array &$perm) { $perm['result'] = true; }); // Add some dummy session data, so we can check that it's being // pushed to the delegate session. $original_session = [ 'data' => 'Just some test session data', ]; $_SESSION = $original_session; // Handle redirects manually, since we want to be able to check some // assertions after the redirect is thrown. $this->stub_goaway(); try { // Send a request to get delegate privileges for the `testuser` channel // on the local hub. $this->get('magic', [ 'bdest' => bin2hex($dest_url), 'delegate' => 'testuser@hubzilla.test'] ); } catch (RedirectException $e) { $this->assertEquals($dest_url, $e->getMessage()); $this->assertEquals($result['channel']['channel_id'], App::$channel['channel_id']); $this->assertEquals($original_session, $_SESSION['delegate_push']); $this->assertEquals($result['channel']['channel_id'], $_SESSION['delegate_channel']); $this->assertEquals('foreign hash', $_SESSION['delegate']); $this->assertEquals($this->fixtures['account'][0]['account_id'], $_SESSION['account_id']); } } }