Path: blob/1.0-develop/tests/Integration/Api/Client/Server/Subuser/UpdateSubuserTest.php
14052 views
<?php12namespace Pterodactyl\Tests\Integration\Api\Client\Server\Subuser;34use Pterodactyl\Models\User;5use Pterodactyl\Models\Subuser;6use Pterodactyl\Models\Permission;7use Illuminate\Support\Facades\Bus;8use Pterodactyl\Jobs\RevokeSftpAccessJob;9use Pterodactyl\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;1011class UpdateSubuserTest extends ClientApiIntegrationTestCase12{13/**14* Test that the correct permissions are applied to the account when making updates15* to a subusers permissions.16*/17public function testCorrectPermissionsAreRequiredForUpdating()18{19Bus::fake([RevokeSftpAccessJob::class]);2021[$user, $server] = $this->generateTestAccount(['user.read']);2223$subuser = Subuser::factory()24->for(User::factory()->create())25->for($server)26->create([27'permissions' => ['control.start'],28]);2930$this->postJson(31$endpoint = "/api/client/servers/$server->uuid/users/{$subuser->user->uuid}",32$data = [33'permissions' => [34'control.start',35'control.stop',36],37]38)39->assertUnauthorized();4041$this->actingAs($subuser->user)->postJson($endpoint, $data)->assertForbidden();42$this->actingAs($user)->postJson($endpoint, $data)->assertForbidden();4344$server->subusers()->where('user_id', $user->id)->update([45'permissions' => [46Permission::ACTION_USER_UPDATE,47Permission::ACTION_CONTROL_START,48Permission::ACTION_CONTROL_STOP,49],50]);5152$this->postJson($endpoint, $data)->assertOk();5354Bus::assertDispatchedTimes(function (RevokeSftpAccessJob $job) use ($server, $subuser) {55return $job->user === $subuser->user->uuid && $job->target->is($server);56});57}5859/**60* Tests that permissions for the account are updated and any extraneous values61* we don't know about are removed.62*/63public function testPermissionsAreSavedToAccount()64{65Bus::fake([RevokeSftpAccessJob::class]);6667[$user, $server] = $this->generateTestAccount();6869/** @var Subuser $subuser */70$subuser = Subuser::factory()71->for(User::factory()->create())72->for($server)73->create([74'permissions' => ['control.restart', 'websocket.connect', 'foo.bar'],75]);7677$this->actingAs($user)78->postJson("/api/client/servers/$server->uuid/users/{$subuser->user->uuid}", [79'permissions' => [80'control.start',81'control.stop',82'control.stop',83'foo.bar',84'power.fake',85],86])87->assertOk();8889$subuser->refresh();90$this->assertEqualsCanonicalizing(91['control.start', 'control.stop', 'websocket.connect'],92$subuser->permissions93);9495Bus::assertDispatchedTimes(function (RevokeSftpAccessJob $job) use ($server, $subuser) {96return $job->user === $subuser->user->uuid && $job->target->is($server);97});98}99100/**101* Ensure a subuser cannot assign permissions to an account that they do not have102* themselves.103*/104public function testUserCannotAssignPermissionsTheyDoNotHave()105{106Bus::fake([RevokeSftpAccessJob::class]);107108[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);109110$subuser = Subuser::factory()111->for(User::factory()->create())112->for($server)113->create(['permissions' => ['foo.bar']]);114115$this->actingAs($user)116->postJson("/api/client/servers/$server->uuid/users/{$subuser->user->uuid}", [117'permissions' => [Permission::ACTION_USER_READ, Permission::ACTION_CONTROL_CONSOLE],118])119->assertForbidden();120121$this->assertEqualsCanonicalizing(['foo.bar'], $subuser->refresh()->permissions);122123Bus::assertNothingDispatched();124}125126/**127* Test that a user cannot update thyself.128*/129public function testUserCannotUpdateSelf()130{131[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);132133$this->actingAs($user)134->postJson("/api/client/servers/$server->uuid/users/$user->uuid", [])135->assertForbidden();136}137138/**139* Test that an error is returned if you attempt to update a subuser on a different account.140*/141public function testCannotUpdateSubuserForDifferentServer()142{143[$user, $server] = $this->generateTestAccount();144[$user2] = $this->generateTestAccount(['foo.bar']);145146$this->actingAs($user)147->postJson("/api/client/servers/$server->uuid/users/$user2->uuid", [])148->assertNotFound();149}150}151152153