Fix Node daemon secret not being reset, closes #1390
This commit is contained in:
parent
4d8760f335
commit
7c73f21b30
4 changed files with 44 additions and 14 deletions
|
@ -263,7 +263,7 @@ class NodesController extends Controller
|
||||||
*/
|
*/
|
||||||
public function updateSettings(NodeFormRequest $request, Node $node)
|
public function updateSettings(NodeFormRequest $request, Node $node)
|
||||||
{
|
{
|
||||||
$this->updateService->handle($node, $request->normalize());
|
$this->updateService->handle($node, $request->normalize(), $request->input('reset_secret') === 'on');
|
||||||
$this->alert->success(trans('admin/node.notices.node_updated'))->flash();
|
$this->alert->success(trans('admin/node.notices.node_updated'))->flash();
|
||||||
|
|
||||||
return redirect()->route('admin.nodes.view.settings', $node->id)->withInput();
|
return redirect()->route('admin.nodes.view.settings', $node->id)->withInput();
|
||||||
|
|
|
@ -125,7 +125,7 @@ class NodeController extends ApplicationApiController
|
||||||
public function update(UpdateNodeRequest $request): array
|
public function update(UpdateNodeRequest $request): array
|
||||||
{
|
{
|
||||||
$node = $this->updateService->handle(
|
$node = $this->updateService->handle(
|
||||||
$request->getModel(Node::class), $request->validated()
|
$request->getModel(Node::class), $request->validated(), $request->input('reset_secret') === true
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->fractal->item($node)
|
return $this->fractal->item($node)
|
||||||
|
|
|
@ -50,24 +50,41 @@ class NodeUpdateService
|
||||||
*
|
*
|
||||||
* @param \Pterodactyl\Models\Node $node
|
* @param \Pterodactyl\Models\Node $node
|
||||||
* @param array $data
|
* @param array $data
|
||||||
|
* @param bool $resetToken
|
||||||
|
*
|
||||||
* @return \Pterodactyl\Models\Node
|
* @return \Pterodactyl\Models\Node
|
||||||
*
|
*
|
||||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
|
||||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||||
|
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
|
||||||
|
* @throws \Pterodactyl\Exceptions\Service\Node\ConfigurationNotPersistedException
|
||||||
*/
|
*/
|
||||||
public function handle(Node $node, array $data)
|
public function handle(Node $node, array $data, bool $resetToken = false)
|
||||||
{
|
{
|
||||||
if (! is_null(array_get($data, 'reset_secret'))) {
|
if ($resetToken) {
|
||||||
$data['daemonSecret'] = str_random(Node::DAEMON_SECRET_LENGTH);
|
$data['daemonSecret'] = str_random(Node::DAEMON_SECRET_LENGTH);
|
||||||
unset($data['reset_secret']);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->connection->beginTransaction();
|
$this->connection->beginTransaction();
|
||||||
|
|
||||||
|
/** @var \Pterodactyl\Models\Node $updatedModel */
|
||||||
$updatedModel = $this->repository->update($node->id, $data);
|
$updatedModel = $this->repository->update($node->id, $data);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if ($resetToken) {
|
||||||
|
// We need to clone the new model and set it's authentication token to be the
|
||||||
|
// old one so we can connect. Then we will pass the new token through as an
|
||||||
|
// override on the call.
|
||||||
|
$cloned = $updatedModel->replicate(['daemonSecret']);
|
||||||
|
$cloned->setAttribute('daemonSecret', $node->getAttribute('daemonSecret'));
|
||||||
|
|
||||||
|
$this->configRepository->setNode($cloned)->update([
|
||||||
|
'keys' => [$data['daemonSecret']],
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
$this->configRepository->setNode($updatedModel)->update();
|
$this->configRepository->setNode($updatedModel)->update();
|
||||||
|
}
|
||||||
|
|
||||||
$this->connection->commit();
|
$this->connection->commit();
|
||||||
} catch (RequestException $exception) {
|
} catch (RequestException $exception) {
|
||||||
// Failed to connect to the Daemon. Let's go ahead and save the configuration
|
// Failed to connect to the Daemon. Let's go ahead and save the configuration
|
||||||
|
|
|
@ -51,21 +51,34 @@ class NodeUpdateServiceTest extends TestCase
|
||||||
public function testNodeIsUpdatedAndDaemonSecretIsReset()
|
public function testNodeIsUpdatedAndDaemonSecretIsReset()
|
||||||
{
|
{
|
||||||
$model = factory(Node::class)->make();
|
$model = factory(Node::class)->make();
|
||||||
|
$updatedModel = factory(Node::class)->make([
|
||||||
|
'name' => 'New Name',
|
||||||
|
'daemonSecret' => 'abcd1234',
|
||||||
|
]);
|
||||||
|
|
||||||
$this->getFunctionMock('\\Pterodactyl\\Services\\Nodes', 'str_random')
|
$this->getFunctionMock('\\Pterodactyl\\Services\\Nodes', 'str_random')
|
||||||
->expects($this->once())->willReturn('random_string');
|
->expects($this->once())->willReturn($updatedModel->daemonSecret);
|
||||||
|
|
||||||
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
|
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
|
||||||
$this->repository->shouldReceive('update')->with($model->id, [
|
$this->repository->shouldReceive('update')->with($model->id, [
|
||||||
'name' => 'NewName',
|
'name' => $updatedModel->name,
|
||||||
'daemonSecret' => 'random_string',
|
'daemonSecret' => $updatedModel->daemonSecret,
|
||||||
])->andReturn($model);
|
])->andReturn($model);
|
||||||
|
|
||||||
$this->configRepository->shouldReceive('setNode')->with($model)->once()->andReturnSelf()
|
$cloned = $updatedModel->replicate(['daemonSecret']);
|
||||||
->shouldReceive('update')->withNoArgs()->once()->andReturn(new Response);
|
$cloned->daemonSecret = $model->daemonSecret;
|
||||||
|
|
||||||
|
$this->configRepository->shouldReceive('setNode')->with(m::on(function ($model) use ($updatedModel) {
|
||||||
|
return $model->daemonSecret !== $updatedModel->daemonSecret;
|
||||||
|
}))->once()->andReturnSelf();
|
||||||
|
|
||||||
|
$this->configRepository->shouldReceive('update')->with([
|
||||||
|
'keys' => ['abcd1234'],
|
||||||
|
])->once()->andReturn(new Response);
|
||||||
|
|
||||||
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
|
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
|
||||||
|
|
||||||
$response = $this->getService()->handle($model, ['name' => 'NewName', 'reset_secret' => true]);
|
$response = $this->getService()->handle($model, ['name' => $updatedModel->name], true);
|
||||||
$this->assertInstanceOf(Node::class, $response);
|
$this->assertInstanceOf(Node::class, $response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue