11<?php
22
33use Illuminate \Support \Facades \DB ;
4+ use Illuminate \Support \Collection ;
5+ use Pterodactyl \Models \Permission ;
46use Illuminate \Support \Facades \Schema ;
7+ use Pterodactyl \Models \Permission as P ;
58use Illuminate \Database \Schema \Blueprint ;
69use Illuminate \Database \Migrations \Migration ;
710
811class MergePermissionsTableIntoSubusers extends Migration
912{
13+ /**
14+ * A list of all pre-1.0 permissions available to a user and their associated
15+ * casting for the new permissions system.
16+ *
17+ * @var array
18+ */
19+ protected static $ permissionsMap = [
20+ 'power-start ' => P::ACTION_CONTROL_START ,
21+ 'power-stop ' => P::ACTION_CONTROL_STOP ,
22+ 'power-restart ' => P::ACTION_CONTROL_RESTART ,
23+ 'power-kill ' => P::ACTION_CONTROL_STOP ,
24+ 'send-command ' => P::ACTION_CONTROL_CONSOLE ,
25+ 'list-subusers ' => P::ACTION_USER_READ ,
26+ 'view-subuser ' => P::ACTION_USER_READ ,
27+ 'edit-subuser ' => P::ACTION_USER_UPDATE ,
28+ 'create-subuser ' => P::ACTION_USER_CREATE ,
29+ 'delete-subuser ' => P::ACTION_USER_DELETE ,
30+ 'view-allocations ' => P::ACTION_ALLOCATION_READ ,
31+ 'edit-allocation ' => P::ACTION_ALLOCATION_UPDATE ,
32+ 'view-startup ' => P::ACTION_STARTUP_READ ,
33+ 'edit-startup ' => P::ACTION_STARTUP_UPDATE ,
34+ 'view-databases ' => P::ACTION_DATABASE_READ ,
35+ // Better to just break this flow a bit than accidentally grant a dangerous permission.
36+ 'reset-db-password ' => P::ACTION_DATABASE_UPDATE ,
37+ 'delete-database ' => P::ACTION_DATABASE_DELETE ,
38+ 'create-database ' => P::ACTION_DATABASE_CREATE ,
39+ 'access-sftp ' => P::ACTION_FILE_SFTP ,
40+ 'list-files ' => P::ACTION_FILE_READ ,
41+ 'edit-files ' => P::ACTION_FILE_READ_CONTENT ,
42+ 'save-files ' => P::ACTION_FILE_UPDATE ,
43+ 'create-files ' => P::ACTION_FILE_CREATE ,
44+ 'delete-files ' => P::ACTION_FILE_DELETE ,
45+ 'compress-files ' => P::ACTION_FILE_ARCHIVE ,
46+ 'list-schedules ' => P::ACTION_SCHEDULE_READ ,
47+ 'view-schedule ' => P::ACTION_SCHEDULE_READ ,
48+ 'edit-schedule ' => P::ACTION_SCHEDULE_UPDATE ,
49+ 'create-schedule ' => P::ACTION_SCHEDULE_CREATE ,
50+ 'delete-schedule ' => P::ACTION_SCHEDULE_DELETE ,
51+ // Skipping these permissions as they are granted if you have more specific read/write permissions.
52+ 'move-files ' => null ,
53+ 'copy-files ' => null ,
54+ 'decompress-files ' => null ,
55+ 'upload-files ' => null ,
56+ 'download-files ' => null ,
57+ // These permissions do not exist in 1.0
58+ 'toggle-schedule ' => null ,
59+ 'queue-schedule ' => null ,
60+ ];
61+
1062 /**
1163 * Run the migrations.
1264 *
@@ -27,10 +79,19 @@ public function up()
2779
2880 DB ::transaction (function () use (&$ cursor ) {
2981 $ cursor ->each (function ($ datum ) {
30- DB ::update ('UPDATE subusers SET permissions = ? WHERE id = ? ' , [
31- json_encode (explode (', ' , $ datum ->permissions )),
32- $ datum ->subuser_id ,
33- ]);
82+ $ updated = Collection::make (explode (', ' , $ datum ->permissions ))
83+ ->map (function ($ value ) {
84+ return self ::$ permissionsMap [$ value ] ?? null ;
85+ })->filter (function ($ value ) {
86+ return !is_null ($ value ) && $ value !== Permission::ACTION_WEBSOCKET_CONNECT ;
87+ })
88+ // All subusers get this permission, so make sure it gets pushed into the array.
89+ ->merge ([ Permission::ACTION_WEBSOCKET_CONNECT ])
90+ ->unique ()
91+ ->values ()
92+ ->toJson ();
93+
94+ DB ::update ('UPDATE subusers SET permissions = ? WHERE id = ? ' , [$ updated , $ datum ->subuser_id ]);
3495 });
3596 });
3697 }
@@ -42,11 +103,15 @@ public function up()
42103 */
43104 public function down ()
44105 {
106+ $ flipped = array_flip (self ::$ permissionsMap );
107+
45108 foreach (DB ::select ('SELECT id, permissions FROM subusers ' ) as $ datum ) {
46109 $ values = [];
47110 foreach (json_decode ($ datum ->permissions , true ) as $ permission ) {
48- $ values [] = $ datum ->id ;
49- $ values [] = $ permission ;
111+ if (!empty ($ v = $ flipped [$ permission ])) {
112+ $ values [] = $ datum ->id ;
113+ $ values [] = $ v ;
114+ }
50115 }
51116
52117 if (! empty ($ values )) {
0 commit comments