commit
a01c934480
|
@ -2,10 +2,14 @@
|
||||||
|
|
||||||
namespace Pterodactyl\Http\Controllers\Admin\Settings;
|
namespace Pterodactyl\Http\Controllers\Admin\Settings;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use Illuminate\View\View;
|
use Illuminate\View\View;
|
||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
use Prologue\Alerts\AlertsMessageBag;
|
use Prologue\Alerts\AlertsMessageBag;
|
||||||
use Illuminate\Contracts\Console\Kernel;
|
use Illuminate\Contracts\Console\Kernel;
|
||||||
|
use Pterodactyl\Notifications\MailTested;
|
||||||
|
use Illuminate\Support\Facades\Notification;
|
||||||
use Pterodactyl\Exceptions\DisplayException;
|
use Pterodactyl\Exceptions\DisplayException;
|
||||||
use Pterodactyl\Http\Controllers\Controller;
|
use Pterodactyl\Http\Controllers\Controller;
|
||||||
use Illuminate\Contracts\Encryption\Encrypter;
|
use Illuminate\Contracts\Encryption\Encrypter;
|
||||||
|
@ -81,13 +85,13 @@ class MailController extends Controller
|
||||||
* Handle request to update SMTP mail settings.
|
* Handle request to update SMTP mail settings.
|
||||||
*
|
*
|
||||||
* @param \Pterodactyl\Http\Requests\Admin\Settings\MailSettingsFormRequest $request
|
* @param \Pterodactyl\Http\Requests\Admin\Settings\MailSettingsFormRequest $request
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* @return \Illuminate\Http\Response
|
||||||
*
|
*
|
||||||
* @throws DisplayException
|
* @throws DisplayException
|
||||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||||
*/
|
*/
|
||||||
public function update(MailSettingsFormRequest $request): RedirectResponse
|
public function update(MailSettingsFormRequest $request): Response
|
||||||
{
|
{
|
||||||
if ($this->config->get('mail.driver') !== 'smtp') {
|
if ($this->config->get('mail.driver') !== 'smtp') {
|
||||||
throw new DisplayException('This feature is only available if SMTP is the selected email driver for the Panel.');
|
throw new DisplayException('This feature is only available if SMTP is the selected email driver for the Panel.');
|
||||||
|
@ -107,8 +111,25 @@ class MailController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->kernel->call('queue:restart');
|
$this->kernel->call('queue:restart');
|
||||||
$this->alert->success('Mail settings have been updated successfully and the queue worker was restarted to apply these changes.')->flash();
|
|
||||||
|
|
||||||
return redirect()->route('admin.settings.mail');
|
return response('', 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit a request to send a test mail message.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function test(Request $request): Response
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Notification::route('mail', $request->user()->email)
|
||||||
|
->notify(new MailTested($request->user()));
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return response($exception->getMessage(), 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response('', 204);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Pterodactyl\Notifications;
|
||||||
|
|
||||||
|
use Pterodactyl\Models\User;
|
||||||
|
use Illuminate\Notifications\Notification;
|
||||||
|
use Illuminate\Notifications\Messages\MailMessage;
|
||||||
|
|
||||||
|
class MailTested extends Notification
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \Pterodactyl\Models\User
|
||||||
|
*/
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
public function __construct(User $user)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function via()
|
||||||
|
{
|
||||||
|
return ['mail'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toMail()
|
||||||
|
{
|
||||||
|
return (new MailMessage)
|
||||||
|
->subject('Pterodactyl Test Message')
|
||||||
|
->greeting('Hello ' . $this->user->name . '!')
|
||||||
|
->line('This is a test of the Pterodactyl mail system. You\'re good to go!');
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
|
@ -55,7 +55,7 @@ $(document).ready(function () {
|
||||||
console.error(jqXHR);
|
console.error(jqXHR);
|
||||||
swal({
|
swal({
|
||||||
title: 'Whoops!',
|
title: 'Whoops!',
|
||||||
text: 'An error occured while attempting to set the EULA as accepted: ' . jqXHR.responseJSON.error,
|
text: 'An error occurred while attempting to set the EULA as accepted: ' + jqXHR.responseJSON.error,
|
||||||
type: 'error'
|
type: 'error'
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
<form action="{{ route('admin.settings.mail') }}" method="POST">
|
<form>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
|
@ -98,7 +98,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer">
|
<div class="box-footer">
|
||||||
{{ csrf_field() }}
|
{{ csrf_field() }}
|
||||||
<button type="submit" name="_method" value="PATCH" class="btn btn-sm btn-primary pull-right">Save</button>
|
<div class="pull-right">
|
||||||
|
<button type="button" id="testButton" class="btn btn-sm btn-success">Test</button>
|
||||||
|
<button type="button" id="saveButton" class="btn btn-sm btn-primary">Save</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@endif
|
@endif
|
||||||
|
@ -106,3 +109,96 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@section('footer-scripts')
|
||||||
|
{!! Theme::js('js/laroute.js?t={cache-version}') !!}
|
||||||
|
{!! Theme::js('vendor/jquery/jquery.min.js?t={cache-version}') !!}
|
||||||
|
{!! Theme::js('vendor/sweetalert/sweetalert.min.js?t={cache-version}') !!}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function saveSettings() {
|
||||||
|
return $.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
url: Router.route('admin.settings.mail'),
|
||||||
|
contentType: 'application/json',
|
||||||
|
data: JSON.stringify({
|
||||||
|
'mail:host': $('input[name="mail:host"]').val(),
|
||||||
|
'mail:port': $('input[name="mail:port"]').val(),
|
||||||
|
'mail:encryption': $('select[name="mail:encryption"]').val(),
|
||||||
|
'mail:username': $('input[name="mail:username"]').val(),
|
||||||
|
'mail:password': $('input[name="mail:password"]').val(),
|
||||||
|
'mail:from:address': $('input[name="mail:from:address"]').val(),
|
||||||
|
'mail:from:name': $('input[name="mail:from:name"]').val()
|
||||||
|
}),
|
||||||
|
headers: { 'X-CSRF-Token': $('input[name="_token"]').val() }
|
||||||
|
}).fail(function (jqXHR) {
|
||||||
|
showErrorDialog(jqXHR, 'save');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSettings() {
|
||||||
|
swal({
|
||||||
|
type: 'info',
|
||||||
|
title: 'Test Mail Settings',
|
||||||
|
text: 'Click "Test" to begin the test.',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'Test',
|
||||||
|
closeOnConfirm: false,
|
||||||
|
showLoaderOnConfirm: true
|
||||||
|
}, function () {
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: Router.route('admin.settings.mail.test'),
|
||||||
|
headers: { 'X-CSRF-Token': $('input[name="_token"]').val() }
|
||||||
|
}).fail(function (jqXHR) {
|
||||||
|
showErrorDialog(jqXHR, 'test');
|
||||||
|
}).done(function () {
|
||||||
|
swal({
|
||||||
|
title: 'Success',
|
||||||
|
text: 'The test message was sent successfully.',
|
||||||
|
type: 'success'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveAndTestSettings() {
|
||||||
|
saveSettings().done(testSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showErrorDialog(jqXHR, verb) {
|
||||||
|
console.error(jqXHR);
|
||||||
|
var errorText = '';
|
||||||
|
if (!jqXHR.responseJSON) {
|
||||||
|
errorText = jqXHR.responseText;
|
||||||
|
} else if (jqXHR.responseJSON.error) {
|
||||||
|
errorText = jqXHR.responseJSON.error;
|
||||||
|
} else if (jqXHR.responseJSON.errors) {
|
||||||
|
$.each(jqXHR.responseJSON.errors, function (i, v) {
|
||||||
|
if (v.detail) {
|
||||||
|
errorText += v.detail + ' ';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
swal({
|
||||||
|
title: 'Whoops!',
|
||||||
|
text: 'An error occurred while attempting to ' + verb + ' mail settings: ' + errorText,
|
||||||
|
type: 'error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#testButton').on('click', saveAndTestSettings);
|
||||||
|
$('#saveButton').on('click', function () {
|
||||||
|
saveSettings().done(function () {
|
||||||
|
swal({
|
||||||
|
title: 'Success',
|
||||||
|
text: 'Mail settings have been updated successfully and the queue worker was restarted to apply these changes.',
|
||||||
|
type: 'success'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
|
|
|
@ -64,6 +64,7 @@ Route::group(['prefix' => 'databases'], function () {
|
||||||
Route::group(['prefix' => 'settings'], function () {
|
Route::group(['prefix' => 'settings'], function () {
|
||||||
Route::get('/', 'Settings\IndexController@index')->name('admin.settings');
|
Route::get('/', 'Settings\IndexController@index')->name('admin.settings');
|
||||||
Route::get('/mail', 'Settings\MailController@index')->name('admin.settings.mail');
|
Route::get('/mail', 'Settings\MailController@index')->name('admin.settings.mail');
|
||||||
|
Route::get('/mail/test', 'Settings\MailController@test')->name('admin.settings.mail.test');
|
||||||
Route::get('/advanced', 'Settings\AdvancedController@index')->name('admin.settings.advanced');
|
Route::get('/advanced', 'Settings\AdvancedController@index')->name('admin.settings.advanced');
|
||||||
|
|
||||||
Route::patch('/', 'Settings\IndexController@update');
|
Route::patch('/', 'Settings\IndexController@update');
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Http\Controllers;
|
||||||
|
|
||||||
|
use Mockery as m;
|
||||||
|
use Prologue\Alerts\AlertsMessageBag;
|
||||||
|
use Illuminate\Contracts\Console\Kernel;
|
||||||
|
use Illuminate\Contracts\Encryption\Encrypter;
|
||||||
|
use Illuminate\Contracts\Config\Repository as ConfigRepository;
|
||||||
|
use Pterodactyl\Http\Controllers\Admin\Settings\MailController;
|
||||||
|
use Pterodactyl\Contracts\Repository\SettingsRepositoryInterface;
|
||||||
|
|
||||||
|
class MailControllerTest extends ControllerTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \Prologue\Alerts\AlertsMessageBag
|
||||||
|
*/
|
||||||
|
private $alert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Illuminate\Contracts\Config\Repository
|
||||||
|
*/
|
||||||
|
private $configRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Illuminate\Contracts\Encryption\Encrypter
|
||||||
|
*/
|
||||||
|
private $encrypter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Illuminate\Contracts\Console\Kernel
|
||||||
|
*/
|
||||||
|
private $kernel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Pterodactyl\Contracts\Repository\SettingsRepositoryInterface
|
||||||
|
*/
|
||||||
|
private $settingsRepositoryInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup tests.
|
||||||
|
*/
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->alert = m::mock(AlertsMessageBag::class);
|
||||||
|
$this->configRepository = m::mock(ConfigRepository::class);
|
||||||
|
$this->encrypter = m::mock(Encrypter::class);
|
||||||
|
$this->kernel = m::mock(Kernel::class);
|
||||||
|
$this->settingsRepositoryInterface = m::mock(SettingsRepositoryInterface::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the mail controller for viewing mail settings page.
|
||||||
|
*/
|
||||||
|
public function testIndex()
|
||||||
|
{
|
||||||
|
$this->configRepository->shouldReceive('get');
|
||||||
|
|
||||||
|
$response = $this->getController()->index();
|
||||||
|
|
||||||
|
$this->assertIsViewResponse($response);
|
||||||
|
$this->assertViewNameEquals('admin.settings.mail', $response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare a MailController using our mocks.
|
||||||
|
*
|
||||||
|
* @return MailController
|
||||||
|
*/
|
||||||
|
public function getController()
|
||||||
|
{
|
||||||
|
return new MailController(
|
||||||
|
$this->alert,
|
||||||
|
$this->configRepository,
|
||||||
|
$this->encrypter,
|
||||||
|
$this->kernel,
|
||||||
|
$this->settingsRepositoryInterface
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue