1
1
mirror of https://github.com/pterodactyl/panel.git synced 2024-10-27 04:12:28 +01:00

Use cache helpers rather than database to handle configuration tokens and downloads.

This commit is contained in:
Dane Everitt 2017-05-01 14:21:18 -04:00
parent 2330c25a8c
commit 605c91a9af
No known key found for this signature in database
GPG Key ID: EEA66103B3D71F53
11 changed files with 95 additions and 146 deletions

View File

@ -20,6 +20,8 @@ This project follows [Semantic Versioning](http://semver.org) guidelines.
* Environment setting commands now attempt to auto-quote strings with spaces in them, as well as comment lines that are edited to avoid manual changes being overwritten. * Environment setting commands now attempt to auto-quote strings with spaces in them, as well as comment lines that are edited to avoid manual changes being overwritten.
* Version in footer of panel now displays correctly if panel is installed using Git rather than a download from source. * Version in footer of panel now displays correctly if panel is installed using Git rather than a download from source.
* Mobile views are now more... viewable. Fixes `col-xs-6` usage thoughout the Admin CP where it was intended to be `col-md-6`. * Mobile views are now more... viewable. Fixes `col-xs-6` usage thoughout the Admin CP where it was intended to be `col-md-6`.
* Node Configuration tokens and Download tokens are stored using the cache helpers rather than a database to speed up functions and make use of auto-expiration/deletion functions.
* Old daemon routes using `/remote` have been changed to use `/daemon`, panel changes now reflect this.
## v0.6.0-beta.2.1 (Courageous Carniadactylus) ## v0.6.0-beta.2.1 (Courageous Carniadactylus)
### Fixed ### Fixed

View File

@ -27,6 +27,7 @@ namespace Pterodactyl\Http\Controllers\Admin;
use DB; use DB;
use Log; use Log;
use Alert; use Alert;
use Cache;
use Javascript; use Javascript;
use Pterodactyl\Models; use Pterodactyl\Models;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -364,11 +365,9 @@ class NodesController extends Controller
{ {
$node = Models\Node::findOrFail($id); $node = Models\Node::findOrFail($id);
$t = Models\NodeConfigurationToken::create([ $token = str_random(32);
'node_id' => $id, Cache::put('NodeConfiguration:' . $token, $node->id, 5);
'token' => str_random(32),
]);
return response()->json(['token' => $t->token]); return response()->json(['token' => $token]);
} }
} }

View File

@ -24,11 +24,11 @@
namespace Pterodactyl\Http\Controllers\Daemon; namespace Pterodactyl\Http\Controllers\Daemon;
use Cache;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Pterodactyl\Models\Node;
use Pterodactyl\Models\Server; use Pterodactyl\Models\Server;
use Pterodactyl\Models\Download;
use Pterodactyl\Http\Controllers\Controller; use Pterodactyl\Http\Controllers\Controller;
use Pterodactyl\Models\NodeConfigurationToken;
class ActionController extends Controller class ActionController extends Controller
{ {
@ -40,18 +40,17 @@ class ActionController extends Controller
*/ */
public function authenticateDownload(Request $request) public function authenticateDownload(Request $request)
{ {
$download = Download::where('token', $request->input('token'))->first(); $download = Cache::pull('Download:' . $request->input('token'));
if (! $download) {
if (is_null($download)) {
return response()->json([ return response()->json([
'error' => 'An invalid request token was recieved with this request.', 'error' => 'An invalid request token was recieved with this request.',
], 403); ], 403);
} }
$download->delete();
return response()->json([ return response()->json([
'path' => $download->path, 'path' => $download['path'],
'server' => $download->server, 'server' => $download['server'],
]); ]);
} }
@ -94,24 +93,14 @@ class ActionController extends Controller
*/ */
public function configuration(Request $request, $token) public function configuration(Request $request, $token)
{ {
// Try to query the token and the node from the database $nodeId = Cache::pull('NodeConfiguration:' . $token);
try { if (is_null($nodeId)) {
$model = NodeConfigurationToken::with('node')->where('token', $token)->firstOrFail();
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
return response()->json(['error' => 'token_invalid'], 403); return response()->json(['error' => 'token_invalid'], 403);
} }
// Check if token is expired $node = Node::findOrFail($nodeId);
if ($model->created_at->addMinutes(5)->lt(Carbon::now())) {
$model->delete();
return response()->json(['error' => 'token_expired'], 403);
}
// Delete the token, it's one-time use
$model->delete();
// Manually as getConfigurationAsJson() returns it in correct format already // Manually as getConfigurationAsJson() returns it in correct format already
return response($model->node->getConfigurationAsJson())->header('Content-Type', 'text/json'); return response($node->getConfigurationAsJson())->header('Content-Type', 'text/json');
} }
} }

View File

@ -25,8 +25,8 @@
namespace Pterodactyl\Http\Controllers\Server; namespace Pterodactyl\Http\Controllers\Server;
use Log; use Log;
use Uuid;
use Alert; use Alert;
use Cache;
use Pterodactyl\Models; use Pterodactyl\Models;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Pterodactyl\Exceptions\DisplayException; use Pterodactyl\Exceptions\DisplayException;
@ -201,13 +201,11 @@ class ServerController extends Controller
$server = Models\Server::byUuid($uuid); $server = Models\Server::byUuid($uuid);
$this->authorize('download-files', $server); $this->authorize('download-files', $server);
$download = new Models\Download; $token = str_random(40);
Cache::tags(['Downloads', 'Downloads:Server:' . $server->uuid])->put('Download:' . $token, [
$download->token = (string) Uuid::generate(4); 'server' => $server->uuid,
$download->server = $server->uuid; 'path' => $file,
$download->path = $file; ], 1);
$download->save();
return redirect($server->node->scheme . '://' . $server->node->fqdn . ':' . $server->node->daemonListen . '/server/file/download/' . $download->token); return redirect($server->node->scheme . '://' . $server->node->fqdn . ':' . $server->node->daemonListen . '/server/file/download/' . $download->token);
} }

View File

@ -1,37 +0,0 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
namespace Pterodactyl\Models;
use Illuminate\Database\Eloquent\Model;
class Download extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'downloads';
}

View File

@ -1,61 +0,0 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
namespace Pterodactyl\Models;
use Illuminate\Database\Eloquent\Model;
class NodeConfigurationToken extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'node_configuration_tokens';
/**
* Fields that are not mass assignable.
*
* @var array
*/
protected $guarded = ['id', 'created_at', 'updated_at'];
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['created_at', 'updated_at', 'expires_at'];
/**
* Gets the node associated with a configuration token.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function node()
{
return $this->belongsTo(Node::class);
}
}

View File

@ -334,16 +334,6 @@ class Server extends Model
return $this->hasMany(Database::class); return $this->hasMany(Database::class);
} }
/**
* Gets all downloads associated with a server.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function downloads()
{
return $this->hasMany(Download::class, 'server', 'id');
}
/** /**
* Gets the location of the server. * Gets the location of the server.
* *

View File

@ -138,6 +138,7 @@ class ServerObserver
*/ */
Cache::tags('Model:Server:byUuid:' . $server->uuid)->flush(); Cache::tags('Model:Server:byUuid:' . $server->uuid)->flush();
Cache::tags('Model:Server:byUuid:' . $server->uuidShort)->flush(); Cache::tags('Model:Server:byUuid:' . $server->uuidShort)->flush();
Cache::tags('Downloads:Server:' . $server->uuid)->flush();
event(new Events\Server\Updated($server)); event(new Events\Server\Updated($server));
} }

View File

@ -284,9 +284,6 @@ class NodeRepository
// Delete Allocations // Delete Allocations
Models\Allocation::where('node_id', $node->id)->delete(); Models\Allocation::where('node_id', $node->id)->delete();
// Delete configure tokens
Models\NodeConfigurationToken::where('node_id', $node->id)->delete();
// Delete Node // Delete Node
$node->delete(); $node->delete();
}); });

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class DeleteDownloadTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('downloads');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('downloads', function (Blueprint $table) {
$table->increments('id');
$table->char('token', 36)->unique();
$table->char('server', 36);
$table->text('path');
$table->timestamps();
});
}
}

View File

@ -0,0 +1,37 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class DeleteNodeConfigurationTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('node_configuration_tokens');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('node_configuration_tokens', function (Blueprint $table) {
$table->increments('id');
$table->char('token', 32);
$table->unsignedInteger('node_id');
$table->timestamps();
});
Schema::table('node_configuration_tokens', function (Blueprint $table) {
$table->foreign('node_id')->references('id')->on('nodes');
});
}
}