2929use Crypt ;
3030use Validator ;
3131use IPTools \Network ;
32- use Pterodactyl \Models ;
32+ use Pterodactyl \Models \User ;
33+ use Pterodactyl \Models \APIKey as Key ;
34+ use Pterodactyl \Models \APIPermission as Permission ;
3335use Pterodactyl \Exceptions \DisplayException ;
3436use Pterodactyl \Exceptions \DisplayValidationException ;
3537
3638class APIRepository
3739{
38- /**
39- * Valid API permissions.
40- *
41- * @var array
42- */
43- protected $ permissions = [
44- 'admin ' => [
45- '* ' ,
46-
47- // User Management Routes
48- 'users.list ' ,
49- 'users.create ' ,
50- 'users.view ' ,
51- 'users.update ' ,
52- 'users.delete ' ,
53-
54- // Server Manaement Routes
55- 'servers.list ' ,
56- 'servers.create ' ,
57- 'servers.view ' ,
58- 'servers.config ' ,
59- 'servers.build ' ,
60- 'servers.suspend ' ,
61- 'servers.unsuspend ' ,
62- 'servers.delete ' ,
63-
64- // Node Management Routes
65- 'nodes.list ' ,
66- 'nodes.view ' ,
67- 'nodes.create ' ,
68- 'nodes.allocations ' ,
69- 'nodes.delete ' ,
70-
71- // Service Routes
72- 'services.list ' ,
73- 'services.view ' ,
74-
75- // Location Routes
76- 'locations.list ' ,
77-
78- ],
79- 'user ' => [
80- '* ' ,
81-
82- // Informational
83- 'me ' ,
84-
85- // Server Control
86- 'server ' ,
87- 'server.power ' ,
88- ],
89- ];
90-
9140 /**
9241 * Holder for listing of allowed IPs when creating a new key.
9342 *
@@ -108,11 +57,11 @@ class APIRepository
10857 * @param null|\Pterodactyl\Models\User $user
10958 * @return void
11059 */
111- public function __construct (Models \ User $ user = null )
60+ public function __construct (User $ user = null )
11261 {
11362 $ this ->user = is_null ($ user ) ? Auth::user () : $ user ;
11463 if (is_null ($ this ->user )) {
115- throw new \Exception ('Cannot access API Repository without passing a user to constructor . ' );
64+ throw new \Exception ('Unable to initialize user for API repository instance . ' );
11665 }
11766 }
11867
@@ -129,8 +78,9 @@ public function create(array $data)
12978 {
13079 $ validator = Validator::make ($ data , [
13180 'memo ' => 'string|max:500 ' ,
81+ 'allowed_ips ' => 'sometimes|string ' ,
13282 'permissions ' => 'sometimes|required|array ' ,
133- 'adminPermissions ' => 'sometimes|required|array ' ,
83+ 'admin_permissions ' => 'sometimes|required|array ' ,
13484 ]);
13585
13686 $ validator ->after (function ($ validator ) use ($ data ) {
@@ -156,53 +106,69 @@ public function create(array $data)
156106 DB ::beginTransaction ();
157107 try {
158108 $ secretKey = str_random (16 ) . '. ' . str_random (7 ) . '. ' . str_random (7 );
159- $ key = new Models \APIKey ;
160- $ key ->fill ([
109+ $ key = Key::create ([
161110 'user_id ' => $ this ->user ->id ,
162111 'public ' => str_random (16 ),
163112 'secret ' => Crypt::encrypt ($ secretKey ),
164113 'allowed_ips ' => empty ($ this ->allowed ) ? null : json_encode ($ this ->allowed ),
165114 'memo ' => $ data ['memo ' ],
166115 'expires_at ' => null ,
167116 ]);
168- $ key ->save ();
169117
170118 $ totalPermissions = 0 ;
119+ $ pNodes = Permission::permissions ();
120+
171121 if (isset ($ data ['permissions ' ])) {
172- foreach ($ data ['permissions ' ] as $ permNode ) {
173- if (! strpos ($ permNode , ': ' )) {
122+ foreach ($ data ['permissions ' ] as $ permission ) {
123+ $ parts = explode ('- ' , $ permission );
124+
125+ if (count ($ parts ) !== 2 ) {
126+ continue ;
127+ }
128+
129+ list ($ block , $ search ) = $ parts ;
130+
131+ if (! array_key_exists ($ block , $ pNodes ['_user ' ])) {
174132 continue ;
175133 }
176134
177- list ($ toss , $ permission ) = explode (': ' , $ permNode );
178- if (in_array ($ permission , $ this ->permissions ['user ' ])) {
179- $ totalPermissions ++;
180- $ model = new Models \APIPermission ;
181- $ model ->fill ([
182- 'key_id ' => $ key ->id ,
183- 'permission ' => 'api.user. ' . $ permission ,
184- ]);
185- $ model ->save ();
135+ if (! in_array ($ search , $ pNodes ['_user ' ][$ block ])) {
136+ continue ;
186137 }
138+
139+ $ totalPermissions ++;
140+ Permission::create ([
141+ 'key_id ' => $ key ->id ,
142+ 'permission ' => 'user. ' . $ permission ,
143+ ]);
187144 }
188145 }
189146
190- if ($ this ->user ->isRootAdmin () && isset ($ data ['adminPermissions ' ])) {
191- foreach ($ data ['adminPermissions ' ] as $ permNode ) {
192- if (! strpos ($ permNode , ': ' )) {
147+ if ($ this ->user ->isRootAdmin () && isset ($ data ['admin_permissions ' ])) {
148+ unset($ pNodes ['_user ' ]);
149+
150+ foreach ($ data ['admin_permissions ' ] as $ permNode ) {
151+ $ parts = explode ('- ' , $ permission );
152+
153+ if (count ($ parts ) !== 2 ) {
193154 continue ;
194155 }
195156
196- list ($ toss , $ permission ) = explode (': ' , $ permNode );
197- if (in_array ($ permission , $ this ->permissions ['admin ' ])) {
198- $ totalPermissions ++;
199- $ model = new Models \APIPermission ;
200- $ model ->fill ([
201- 'key_id ' => $ key ->id ,
202- 'permission ' => 'api.admin. ' . $ permission ,
203- ]);
204- $ model ->save ();
157+ list ($ block , $ search ) = $ parts ;
158+
159+ if (! array_key_exists ($ block , $ pNodes )) {
160+ continue ;
161+ }
162+
163+ if (! in_array ($ search , $ pNodes [$ block ])) {
164+ continue ;
205165 }
166+
167+ $ totalPermissions ++;
168+ Permission::create ([
169+ 'key_id ' => $ key ->id ,
170+ 'permission ' => $ permission ,
171+ ]);
206172 }
207173 }
208174
@@ -229,20 +195,13 @@ public function create(array $data)
229195 */
230196 public function revoke ($ key )
231197 {
232- DB ::beginTransaction ();
233-
234- try {
235- $ model = Models \APIKey::with ('permissions ' )->where ('public ' , $ key )->where ('user_id ' , $ this ->user ->id )->firstOrFail ();
198+ DB ::transaction (function () use ($ key ) {
199+ $ model = Key::with ('permissions ' )->where ('public ' , $ key )->where ('user_id ' , $ this ->user ->id )->firstOrFail ();
236200 foreach ($ model ->permissions as &$ permission ) {
237201 $ permission ->delete ();
238202 }
239203
240204 $ model ->delete ();
241-
242- DB ::commit ();
243- } catch (\Exception $ ex ) {
244- DB ::rollBack ();
245- throw $ ex ;
246- }
205+ });
247206 }
248207}
0 commit comments