You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.7 KiB

1 year ago
<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
abstract class CControllerResponse {
protected $location = '';
protected $messages = [];
public function getLocation(): string {
return $this->location;
}
public function redirect(): void {
// Redirect as simple request.
if ($this instanceof CControllerResponseRedirect) {
if ($this->getFormData() === null && CMessageHelper::getTitle() === null) {
redirect($this->getLocation());
}
CMessageHelper::restoreScheduleMessages();
}
(new CHtmlPageHeader(_('Loading...'), CWebUser::getLang()))->show();
echo '<body>';
echo $this
->getForm()
->toString();
echo $this
->getScript()
->toString();
echo '</body></html>';
session_write_close();
exit();
}
protected function getForm(): CForm {
$form = (new CForm())
->setAction($this->getLocation())
->setEnctype('multipart/form-data')
->setId('form-data');
$data = $this->getData();
$data = json_encode($data);
$sign = CEncryptHelper::sign($data);
$form->addItem(new CInput('hidden', 'formdata', ''));
$form->addItem(new CInput('hidden', 'sign', base64_encode($sign)));
$form->addItem(new CInput('hidden', 'data', base64_encode($data)));
return $form;
}
protected function getScript(): CJsScript {
$js = '
<script>
document.addEventListener("DOMContentLoaded", () => document.getElementById("form-data").submit());
</script>
';
return new CJsScript($js);
}
private function getData(): array {
$data = [];
$messages['messages'] = CMessageHelper::getMessages();
if ($this instanceof CControllerResponseRedirect) {
switch (CMessageHelper::getType()) {
case CMessageHelper::MESSAGE_TYPE_ERROR:
$messages[CMessageHelper::MESSAGE_TYPE_ERROR] = CMessageHelper::getTitle();
break;
case CMessageHelper::MESSAGE_TYPE_SUCCESS:
$messages[CMessageHelper::MESSAGE_TYPE_SUCCESS] = CMessageHelper::getTitle();
break;
}
$data = $this->getFormData();
}
return ['form' => $data, 'messages' => $messages];
}
}