SettingController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace App\Controllers;
  3. use App\Database\Queries\UserQuery;
  4. use Psr\Http\Message\ResponseInterface as Response;
  5. use Psr\Http\Message\ServerRequestInterface as Request;
  6. class SettingController extends Controller
  7. {
  8. /**
  9. * @param Request $request
  10. * @param Response $response
  11. *
  12. * @return Response
  13. */
  14. public function saveSettings(Request $request, Response $response): Response
  15. {
  16. if (!preg_match('/[0-9]+[K|M|G|T]/i', param($request, 'default_user_quota', '1G'))) {
  17. $this->session->alert(lang('invalid_quota', 'danger'));
  18. return redirect($response, route('system'));
  19. }
  20. if (param($request, 'recaptcha_enabled', 'off') === 'on' && (empty(param($request, 'recaptcha_site_key')) || empty(param($request, 'recaptcha_secret_key')))) {
  21. $this->session->alert(lang('recaptcha_keys_required', 'danger'));
  22. return redirect($response, route('system'));
  23. }
  24. // registrations
  25. $this->updateSetting('register_enabled', param($request, 'register_enabled', 'off'));
  26. $this->updateSetting('auto_tagging', param($request, 'auto_tagging', 'off'));
  27. // quota
  28. $this->updateSetting('quota_enabled', param($request, 'quota_enabled', 'off'));
  29. $this->updateSetting('default_user_quota', stringToBytes(param($request, 'default_user_quota', '1G')));
  30. $user = make(UserQuery::class)->get($request, $this->session->get('user_id'));
  31. $this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
  32. $this->updateSetting('custom_head', param($request, 'custom_head'));
  33. $this->updateSetting('recaptcha_enabled', param($request, 'recaptcha_enabled', 'off'));
  34. $this->updateSetting('recaptcha_site_key', param($request, 'recaptcha_site_key'));
  35. $this->updateSetting('recaptcha_secret_key', param($request, 'recaptcha_secret_key'));
  36. $this->applyTheme($request);
  37. $this->applyLang($request);
  38. $this->logger->info("User $user->username updated the system settings.");
  39. $this->session->alert(lang('settings_saved'));
  40. return redirect($response, route('system'));
  41. }
  42. /**
  43. * @param Request $request
  44. */
  45. public function applyLang(Request $request)
  46. {
  47. if (param($request, 'lang') !== 'auto') {
  48. $this->updateSetting('lang', param($request, 'lang'));
  49. } else {
  50. $this->database->query('DELETE FROM `settings` WHERE `key` = \'lang\'');
  51. }
  52. }
  53. /**
  54. * @param Request $request
  55. */
  56. public function applyTheme(Request $request)
  57. {
  58. if (param($request, 'css') !== null) {
  59. if (!is_writable(BASE_DIR.'static/bootstrap/css/bootstrap.min.css')) {
  60. $this->session->alert(lang('cannot_write_file'), 'danger');
  61. } else {
  62. file_put_contents(BASE_DIR.'static/bootstrap/css/bootstrap.min.css', file_get_contents(param($request, 'css')));
  63. }
  64. // if is default, remove setting
  65. if (param($request, 'css') !== 'https://bootswatch.com/_vendor/bootstrap/dist/css/bootstrap.min.css') {
  66. $this->updateSetting('css', param($request, 'css'));
  67. } else {
  68. $this->database->query('DELETE FROM `settings` WHERE `key` = \'css\'');
  69. }
  70. }
  71. }
  72. /**
  73. * @param $key
  74. * @param null $value
  75. */
  76. private function updateSetting($key, $value = null)
  77. {
  78. if (!$this->database->query('SELECT `value` FROM `settings` WHERE `key` = '.$this->database->getPdo()->quote($key))->fetch()) {
  79. $this->database->query('INSERT INTO `settings`(`key`, `value`) VALUES ('.$this->database->getPdo()->quote($key).', ?)', $value);
  80. } else {
  81. $this->database->query('UPDATE `settings` SET `value`=? WHERE `key` = '.$this->database->getPdo()->quote($key), $value);
  82. }
  83. }
  84. }