Add database password change support and fix column name

This commit is contained in:
Dane Everitt 2016-08-16 00:07:10 -04:00
parent 0d61c50dcc
commit 5233d6e87b
11 changed files with 188 additions and 9 deletions

View file

@ -56,7 +56,7 @@ class DatabaseController extends Controller
'servers.id as a_serverId',
'servers.name as a_serverName'
)->join('database_servers', 'database_servers.id', '=', 'databases.db_server')
->join('servers', 'databases.server', '=', 'servers.id')
->join('servers', 'databases.server_id', '=', 'servers.id')
->paginate(20),
'dbh' => Models\DatabaseServer::select(
'database_servers.*',

View file

@ -99,7 +99,7 @@ class ServersController extends Controller
->where('server_variables.server_id', $server->id)
->get(),
'databases' => Models\Database::select('databases.*', 'database_servers.host as a_host', 'database_servers.port as a_port')
->where('server', $server->id)
->where('server_id', $server->id)
->join('database_servers', 'database_servers.id', '=', 'databases.db_server')
->get(),
'db_servers' => Models\DatabaseServer::all()

View file

@ -25,6 +25,7 @@ namespace Pterodactyl\Http\Controllers\Server;
use Log;
use Debugbar;
use Pterodactyl\Models;
use Pterodactyl\Models\Server;
use Pterodactyl\Models\Node;
@ -223,4 +224,28 @@ class AjaxController extends Controller
}
}
public function postResetDatabasePassword(Request $request, $uuid)
{
$server = Models\Server::getByUUID($uuid);
$database = Models\Database::where('id', $request->input('database'))->where('server_id', $server->id)->firstOrFail();
$this->authorize('reset-db-password', $server);
try {
$repo = new Repositories\DatabaseRepository;
$password = str_random(16);
$repo->modifyPassword($request->input('database'), $password);
return response($password);
} catch (\Pterodactyl\Exceptions\DisplayException $ex) {
return response()->json([
'error' => $ex->getMessage(),
], 503);
} catch(\Exception $ex) {
Log::error($ex);
return response()->json([
'error' => 'An unhandled error occured while attempting to modify this database\'s password.'
], 503);
}
}
}

View file

@ -229,7 +229,7 @@ class ServerController extends Controller
return view('server.settings', [
'server' => $server,
'databases' => Models\Database::select('databases.*', 'database_servers.host as a_host', 'database_servers.port as a_port')
->where('server', $server->id)
->where('server_id', $server->id)
->join('database_servers', 'database_servers.id', '=', 'databases.db_server')
->get(),
'node' => Models\Node::find($server->node),

View file

@ -152,6 +152,11 @@ class ServerRoutes {
$router->post('set-connection', [
'uses' => 'Server\AjaxController@postSetConnection'
]);
$router->post('settings/reset-database-password', [
'as' => 'server.ajax.reset-database-password',
'uses' => 'Server\AjaxController@postResetDatabasePassword'
]);
});
// Assorted AJAX Routes

View file

@ -56,6 +56,8 @@ class DatabaseServer extends Model
*/
protected $casts = [
'id' => 'integer',
'server_id' => 'integer',
'db_server' => 'integer'
];
}

View file

@ -546,4 +546,13 @@ class ServerPolicy
return $user->permissions()->server($server)->permission('create-task')->exists();
}
public function resetDbPassword(User $user, Server $server)
{
if ($this->isOwner($user, $server)) {
return true;
}
return $user->permissions()->server($server)->permission('create-task')->exists();
}
}

View file

@ -60,7 +60,7 @@ class DatabaseRepository {
try {
$db = new Models\Database;
$db->fill([
'server' => $server->id,
'server_id' => $server->id,
'db_server' => $options['db_server'],
'database' => $server->uuidShort . '_' . $options['database'],
'username' => $server->uuidShort . '_' . str_random(7),
@ -103,6 +103,54 @@ class DatabaseRepository {
}
}
/**
* Updates the password for a given database.
* @param int $database The ID of the database to modify.
* @param string $password The new password to use for the database.
* @return bool
*/
public function modifyPassword($database, $password)
{
$db = Models\Database::findOrFail($database);
$dbr = Models\DatabaseServer::findOrFail($db->db_server);
DB::beginTransaction();
try {
$db->password = Crypt::encrypt($password);
$db->save();
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'mysql',
'host' => $dbr->host,
'port' => $dbr->port,
'database' => 'mysql',
'username' => $dbr->username,
'password' => Crypt::decrypt($dbr->password),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'options' => [
\PDO::ATTR_TIMEOUT => 3,
]
]);
$capsule->setAsGlobal();
Capsule::statement(sprintf(
'ALTER USER \'%s\'@\'%s\' IDENTIFIED BY \'%s\'',
$db->username,
$db->remote,
$password
));
DB::commit();
} catch(\Exception $ex) {
DB::rollback();
throw $ex;
}
}
/**
* Drops a database from the associated MySQL Server
* @param int $database The ID of the database to drop.