Add SFTP management to server front-end

This commit is contained in:
Dane Everitt 2016-01-21 23:53:48 -05:00
parent b6e83b8e32
commit 52229d5d2e
6 changed files with 196 additions and 8 deletions

View file

@ -24,16 +24,21 @@
namespace Pterodactyl\Http\Controllers\Server;
use Auth;
use Debugbar;
use Uuid;
use Alert;
use Log;
use Pterodactyl\Models\Server;
use Pterodactyl\Models\Node;
use Pterodactyl\Models\Download;
use Pterodactyl\Models\Allocation;
use Debugbar;
use Uuid;
use Alert;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Repositories;
use Pterodactyl\Exceptions\DisplayValidationException;
use Pterodactyl\Repositories\Daemon\FileRepository;
use Pterodactyl\Repositories\ServerRepository;
use Pterodactyl\Http\Controllers\Controller;
use Illuminate\Http\Request;
@ -127,7 +132,7 @@ class ServerController extends Controller
$this->authorize('edit-files', $server);
$fileInfo = (object) pathinfo($file);
$controller = new Repositories\Daemon\FileRepository($uuid);
$controller = new FileRepository($uuid);
try {
$fileContent = $controller->returnFileContents($file);
@ -184,4 +189,39 @@ class ServerController extends Controller
}
/**
* Renders server settings page.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function getSettings(Request $request, $uuid)
{
$server = Server::getByUUID($uuid);
return view('server.settings', [
'server' => $server,
'node' => Node::find($server->node)
]);
}
public function postSettingsSFTP(Request $request, $uuid)
{
$server = Server::getByUUID($uuid);
$this->authorize('reset-sftp', $server);
try {
$repo = new ServerRepository;
$repo->updateSFTPPassword($server->id, $request->input('sftp_pass'));
Alert::success('Successfully updated this servers SFTP password.')->flash();
} catch (DisplayValidationException $ex) {
return redirect()->route('server.settings', $uuid)->withErrors(json_decode($ex->getMessage()));
} catch (DisplayException $ex) {
Alert::danger($ex->getMessage())->flash();
} catch (\Exception $ex) {
Log::error($ex);
Alert::danger('An unknown error occured while attempting to update this server\'s SFTP settings.')->flash();
}
return redirect()->route('server.settings', $uuid);
}
}

View file

@ -42,6 +42,17 @@ class ServerRoutes {
'uses' => 'Server\ServerController@getIndex'
]);
// Settings
$router->get('/settings', [
'as' => 'server.settings',
'uses' => 'Server\ServerController@getSettings'
]);
$router->post('/settings/sftp', [
'as' => 'server.settings.sftp',
'uses' => 'Server\ServerController@postSettingsSFTP'
]);
// File Manager Routes
$router->get('/files', [
'as' => 'files.index',

View file

@ -98,8 +98,8 @@ class Node extends Model
// @TODO: Better solution to disabling verification. Security risk.
self::$guzzle[$node] = new Client([
'base_uri' => sprintf('%s://%s:%s/', $nodeData->scheme, $nodeData->fqdn, $nodeData->daemonListen),
'timeout' => 10.0,
'connect_timeout' => 5.0,
'timeout' => 5.0,
'connect_timeout' => 3.0,
]);
return self::$guzzle[$node];

View file

@ -724,4 +724,39 @@ class ServerRepository
return true;
}
public function updateSFTPPassword($id, $password)
{
$server = Models\Server::findOrFail($id);
$node = Models\Node::findOrFail($server->node);
$validator = Validator::make([
'password' => $password,
], [
'password' => 'required|regex:/^((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})$/'
]);
if ($validator->fails()) {
throw new DisplayValidationException(json_encode($validator->errors()));
}
try {
$client = Models\Node::guzzleRequest($server->node);
$client->request('POST', '/server/password', [
'headers' => [
'X-Access-Token' => $node->daemonSecret,
'X-Access-Server' => $server->uuid
],
'json' => [
'password' => $password,
],
]);
return true;
} catch (\GuzzleHttp\Exception\TransferException $ex) {
throw new DisplayException('There was an error while attmping to contact the remote service to change the password.');
} catch (\Exception $ex) {
throw $ex;
}
}
}