Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/tests/Integration/Api/Client/Server/Subuser/UpdateSubuserTest.php
7461 views
1
<?php
2
3
namespace Pterodactyl\Tests\Integration\Api\Client\Server\Subuser;
4
5
use Pterodactyl\Models\User;
6
use Pterodactyl\Models\Subuser;
7
use Pterodactyl\Models\Permission;
8
use Pterodactyl\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
9
10
class UpdateSubuserTest extends ClientApiIntegrationTestCase
11
{
12
/**
13
* Test that the correct permissions are applied to the account when making updates
14
* to a subusers permissions.
15
*/
16
public function testCorrectPermissionsAreRequiredForUpdating()
17
{
18
[$user, $server] = $this->generateTestAccount(['user.read']);
19
20
$subuser = Subuser::factory()
21
->for(User::factory()->create())
22
->for($server)
23
->create([
24
'permissions' => ['control.start'],
25
]);
26
27
$this->postJson(
28
$endpoint = "/api/client/servers/$server->uuid/users/{$subuser->user->uuid}",
29
$data = [
30
'permissions' => [
31
'control.start',
32
'control.stop',
33
],
34
]
35
)
36
->assertUnauthorized();
37
38
$this->actingAs($subuser->user)->postJson($endpoint, $data)->assertForbidden();
39
$this->actingAs($user)->postJson($endpoint, $data)->assertForbidden();
40
41
$server->subusers()->where('user_id', $user->id)->update([
42
'permissions' => [
43
Permission::ACTION_USER_UPDATE,
44
Permission::ACTION_CONTROL_START,
45
Permission::ACTION_CONTROL_STOP,
46
],
47
]);
48
49
$this->postJson($endpoint, $data)->assertOk();
50
}
51
52
/**
53
* Tests that permissions for the account are updated and any extraneous values
54
* we don't know about are removed.
55
*/
56
public function testPermissionsAreSavedToAccount()
57
{
58
[$user, $server] = $this->generateTestAccount();
59
60
/** @var Subuser $subuser */
61
$subuser = Subuser::factory()
62
->for(User::factory()->create())
63
->for($server)
64
->create([
65
'permissions' => ['control.restart', 'websocket.connect', 'foo.bar'],
66
]);
67
68
$this->actingAs($user)
69
->postJson("/api/client/servers/$server->uuid/users/{$subuser->user->uuid}", [
70
'permissions' => [
71
'control.start',
72
'control.stop',
73
'control.stop',
74
'foo.bar',
75
'power.fake',
76
],
77
])
78
->assertOk();
79
80
$subuser->refresh();
81
$this->assertEqualsCanonicalizing(
82
['control.start', 'control.stop', 'websocket.connect'],
83
$subuser->permissions
84
);
85
}
86
87
/**
88
* Ensure a subuser cannot assign permissions to an account that they do not have
89
* themselves.
90
*/
91
public function testUserCannotAssignPermissionsTheyDoNotHave()
92
{
93
[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);
94
95
$subuser = Subuser::factory()
96
->for(User::factory()->create())
97
->for($server)
98
->create(['permissions' => ['foo.bar']]);
99
100
$this->actingAs($user)
101
->postJson("/api/client/servers/$server->uuid/users/{$subuser->user->uuid}", [
102
'permissions' => [Permission::ACTION_USER_READ, Permission::ACTION_CONTROL_CONSOLE],
103
])
104
->assertForbidden();
105
106
$this->assertEqualsCanonicalizing(['foo.bar'], $subuser->refresh()->permissions);
107
}
108
109
/**
110
* Test that a user cannot update thyself.
111
*/
112
public function testUserCannotUpdateSelf()
113
{
114
[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);
115
116
$this->actingAs($user)
117
->postJson("/api/client/servers/$server->uuid/users/$user->uuid", [])
118
->assertForbidden();
119
}
120
121
/**
122
* Test that an error is returned if you attempt to update a subuser on a different account.
123
*/
124
public function testCannotUpdateSubuserForDifferentServer()
125
{
126
[$user, $server] = $this->generateTestAccount();
127
[$user2] = $this->generateTestAccount(['foo.bar']);
128
129
$this->actingAs($user)
130
->postJson("/api/client/servers/$server->uuid/users/$user2->uuid", [])
131
->assertNotFound();
132
}
133
}
134
135