2323 */
2424namespace Pterodactyl \Repositories ;
2525
26+ use Auth ;
2627use DB ;
2728use Crypt ;
2829use Validator ;
@@ -40,38 +41,51 @@ class APIRepository
4041 * @var array
4142 */
4243 protected $ permissions = [
43- '* ' ,
44-
45- // User Management Routes
46- 'api.users.list ' ,
47- 'api.users.create ' ,
48- 'api.users.view ' ,
49- 'api.users.update ' ,
50- 'api.users.delete ' ,
51-
52- // Server Manaement Routes
53- 'api.servers.list ' ,
54- 'api.servers.create ' ,
55- 'api.servers.view ' ,
56- 'api.servers.config ' ,
57- 'api.servers.build ' ,
58- 'api.servers.suspend ' ,
59- 'api.servers.unsuspend ' ,
60- 'api.servers.delete ' ,
61-
62- // Node Management Routes
63- 'api.nodes.list ' ,
64- 'api.nodes.create ' ,
65- 'api.nodes.list ' ,
66- 'api.nodes.allocations ' ,
67- 'api.nodes.delete ' ,
68-
69- // Service Routes
70- 'api.services.list ' ,
71- 'api.services.view ' ,
72-
73- // Location Routes
74- 'api.locations.list ' ,
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.create ' ,
67+ 'nodes.list ' ,
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+ ],
7589 ];
7690
7791 /**
@@ -80,12 +94,17 @@ class APIRepository
8094 */
8195 protected $ allowed = [];
8296
97+ protected $ user ;
98+
8399 /**
84100 * Constructor
85101 */
86- public function __construct ()
102+ public function __construct (Models \ User $ user = null )
87103 {
88- //
104+ $ this ->user = is_null ($ user ) ? Auth::user () : $ user ;
105+ if (is_null ($ this ->user )) {
106+ throw new \Exception ('Cannot access API Repository without passing a user to __construct(). ' );
107+ }
89108 }
90109
91110 /**
@@ -101,7 +120,9 @@ public function __construct()
101120 public function new (array $ data )
102121 {
103122 $ validator = Validator::make ($ data , [
104- 'permissions ' => 'required|array '
123+ 'memo ' => 'string|max:500 ' ,
124+ 'permissions ' => 'sometimes|required|array ' ,
125+ 'adminPermissions ' => 'sometimes|required|array '
105126 ]);
106127
107128 $ validator ->after (function ($ validator ) use ($ data ) {
@@ -125,31 +146,53 @@ public function new(array $data)
125146 }
126147
127148 DB ::beginTransaction ();
128-
129149 try {
130- $ secretKey = str_random (16 ) . '. ' . str_random (15 );
150+ $ secretKey = str_random (16 ) . '. ' . str_random (7 ) . ' . ' . str_random ( 7 );
131151 $ key = new Models \APIKey ;
132152 $ key ->fill ([
153+ 'user ' => $ this ->user ->id ,
133154 'public ' => str_random (16 ),
134155 'secret ' => Crypt::encrypt ($ secretKey ),
135- 'allowed_ips ' => empty ($ this ->allowed ) ? null : json_encode ($ this ->allowed )
156+ 'allowed_ips ' => empty ($ this ->allowed ) ? null : json_encode ($ this ->allowed ),
157+ 'memo ' => $ data ['memo ' ],
158+ 'expires_at ' => null
136159 ]);
137160 $ key ->save ();
138161
139- foreach ($ data ['permissions ' ] as $ permission ) {
140- if (in_array ($ permission , $ this ->permissions )) {
162+ foreach ($ data ['permissions ' ] as $ permNode ) {
163+ if (!strpos ($ permNode , ': ' )) continue ;
164+
165+ list ($ toss , $ permission ) = explode (': ' , $ permNode );
166+ if (in_array ('api.user. ' . $ permission , $ this ->permissions ['user ' ])) {
141167 $ model = new Models \APIPermission ;
142168 $ model ->fill ([
143169 'key_id ' => $ key ->id ,
144- 'permission ' => $ permission
170+ 'permission ' => ' api.user. ' . $ permission
145171 ]);
146172 $ model ->save ();
147173 }
148174 }
149175
176+ if ($ this ->user ->root_admin === 1 ) {
177+ foreach ($ data ['permissions ' ] as $ permNode ) {
178+ if (!strpos ($ permNode , ': ' )) continue ;
179+
180+ list ($ toss , $ permission ) = explode (': ' , $ permNode );
181+ if (in_array ('api.admin. ' . $ permission , $ this ->permissions ['admin ' ])) {
182+ $ model = new Models \APIPermission ;
183+ $ model ->fill ([
184+ 'key_id ' => $ key ->id ,
185+ 'permission ' => 'api.admin. ' . $ permission
186+ ]);
187+ $ model ->save ();
188+ }
189+ }
190+ }
191+
150192 DB ::commit ();
151193 return $ secretKey ;
152194 } catch (\Exception $ ex ) {
195+ DB ::rollBack ();
153196 throw $ ex ;
154197 }
155198
@@ -169,7 +212,7 @@ public function revoke(string $key)
169212 DB ::beginTransaction ();
170213
171214 try {
172- $ model = Models \APIKey::where ('public ' , $ key )->firstOrFail ();
215+ $ model = Models \APIKey::where ('public ' , $ key )->where ( ' user ' , $ this -> user -> id )-> firstOrFail ();
173216 $ permissions = Models \APIPermission::where ('key_id ' , $ model ->id )->delete ();
174217 $ model ->delete ();
175218
0 commit comments