__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
<?php
/**
* Manages the rendering of pages in PMA
*/
declare(strict_types=1);
namespace PhpMyAdmin;
use function defined;
use function headers_sent;
use function http_response_code;
use function is_array;
use function is_scalar;
use function json_encode;
use function json_last_error_msg;
use function mb_strlen;
use function register_shutdown_function;
use function strlen;
use const PHP_SAPI;
/**
* Singleton class used to manage the rendering of pages in PMA
*/
class ResponseRenderer
{
/**
* Response instance
*
* @static
* @var ResponseRenderer
*/
private static $instance;
/**
* Header instance
*
* @var Header
*/
protected $header;
/**
* HTML data to be used in the response
*
* @var string
*/
private $HTML;
/**
* An array of JSON key-value pairs
* to be sent back for ajax requests
*
* @var array
*/
private $JSON;
/**
* PhpMyAdmin\Footer instance
*
* @var Footer
*/
protected $footer;
/**
* Whether we are servicing an ajax request.
*
* @var bool
*/
protected $isAjax = false;
/**
* Whether response object is disabled
*
* @var bool
*/
private $isDisabled;
/**
* Whether there were any errors during the processing of the request
* Only used for ajax responses
*
* @var bool
*/
protected $isSuccess;
/**
* @see http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
*
* @var array<int, string>
*/
protected static $httpStatusMessages = [
// Informational
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
103 => 'Early Hints',
// Success
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
208 => 'Already Reported',
226 => 'IM Used',
// Redirection
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
// Client Error
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Payload Too Large',
414 => 'URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Range Not Satisfiable',
417 => 'Expectation Failed',
421 => 'Misdirected Request',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
425 => 'Too Early',
426 => 'Upgrade Required',
427 => 'Unassigned',
428 => 'Precondition Required',
429 => 'Too Many Requests',
430 => 'Unassigned',
431 => 'Request Header Fields Too Large',
451 => 'Unavailable For Legal Reasons',
// Server Error
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
509 => 'Unassigned',
510 => 'Not Extended',
511 => 'Network Authentication Required',
];
/**
* Creates a new class instance
*/
private function __construct()
{
if (! defined('TESTSUITE')) {
$buffer = OutputBuffering::getInstance();
$buffer->start();
register_shutdown_function([$this, 'response']);
}
$this->header = new Header();
$this->HTML = '';
$this->JSON = [];
$this->footer = new Footer();
$this->isSuccess = true;
$this->isDisabled = false;
$this->setAjax(! empty($_REQUEST['ajax_request']));
}
/**
* Set the ajax flag to indicate whether
* we are servicing an ajax request
*
* @param bool $isAjax Whether we are servicing an ajax request
*/
public function setAjax(bool $isAjax): void
{
$this->isAjax = $isAjax;
$this->header->setAjax($this->isAjax);
$this->footer->setAjax($this->isAjax);
}
/**
* Returns the singleton Response object
*
* @return ResponseRenderer object
*/
public static function getInstance()
{
if (empty(self::$instance)) {
self::$instance = new ResponseRenderer();
}
return self::$instance;
}
/**
* Set the status of an ajax response,
* whether it is a success or an error
*
* @param bool $state Whether the request was successfully processed
*/
public function setRequestStatus(bool $state): void
{
$this->isSuccess = ($state === true);
}
/**
* Returns true or false depending on whether
* we are servicing an ajax request
*/
public function isAjax(): bool
{
return $this->isAjax;
}
/**
* Disables the rendering of the header
* and the footer in responses
*/
public function disable(): void
{
$this->header->disable();
$this->footer->disable();
$this->isDisabled = true;
}
/**
* Returns a PhpMyAdmin\Header object
*
* @return Header
*/
public function getHeader()
{
return $this->header;
}
/**
* Returns a PhpMyAdmin\Footer object
*
* @return Footer
*/
public function getFooter()
{
return $this->footer;
}
/**
* Append HTML code to the current output buffer
*/
public function addHTML(string $content): void
{
$this->HTML .= $content;
}
/**
* Add JSON code to the response
*
* @param string|int|array $json Either a key (string) or an array or key-value pairs
* @param mixed|null $value Null, if passing an array in $json otherwise
* it's a string value to the key
*/
public function addJSON($json, $value = null): void
{
if (is_array($json)) {
foreach ($json as $key => $value) {
$this->addJSON($key, $value);
}
} elseif ($value instanceof Message) {
$this->JSON[$json] = $value->getDisplay();
} else {
$this->JSON[$json] = $value;
}
}
/**
* Renders the HTML response text
*/
private function getDisplay(): string
{
// The header may contain nothing at all,
// if its content was already rendered
// and, in this case, the header will be
// in the content part of the request
$retval = $this->header->getDisplay();
$retval .= $this->HTML;
$retval .= $this->footer->getDisplay();
return $retval;
}
/**
* Sends a JSON response to the browser
*/
private function ajaxResponse(): string
{
global $dbi;
/* Avoid wrapping in case we're disabled */
if ($this->isDisabled) {
return $this->getDisplay();
}
if (! isset($this->JSON['message'])) {
$this->JSON['message'] = $this->getDisplay();
} elseif ($this->JSON['message'] instanceof Message) {
$this->JSON['message'] = $this->JSON['message']->getDisplay();
}
if ($this->isSuccess) {
$this->JSON['success'] = true;
} else {
$this->JSON['success'] = false;
$this->JSON['error'] = $this->JSON['message'];
unset($this->JSON['message']);
}
if ($this->isSuccess) {
if (! isset($this->JSON['title'])) {
$this->addJSON('title', '<title>' . $this->getHeader()->getPageTitle() . '</title>');
}
if (isset($dbi)) {
$this->addJSON('menu', $this->getHeader()->getMenu()->getDisplay());
}
$this->addJSON('scripts', $this->getHeader()->getScripts()->getFiles());
$this->addJSON('selflink', $this->getFooter()->getSelfUrl());
$this->addJSON('displayMessage', $this->getHeader()->getMessage());
$debug = $this->footer->getDebugMessage();
if (empty($_REQUEST['no_debug']) && strlen($debug) > 0) {
$this->addJSON('debug', $debug);
}
$errors = $this->footer->getErrorMessages();
if (strlen($errors) > 0) {
$this->addJSON('errors', $errors);
}
$promptPhpErrors = $GLOBALS['errorHandler']->hasErrorsForPrompt();
$this->addJSON('promptPhpErrors', $promptPhpErrors);
if (empty($GLOBALS['error_message'])) {
// set current db, table and sql query in the querywindow
// (this is for the bottom console)
$query = '';
$maxChars = $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'];
if (isset($GLOBALS['sql_query']) && mb_strlen($GLOBALS['sql_query']) < $maxChars) {
$query = $GLOBALS['sql_query'];
}
$this->addJSON(
'reloadQuerywindow',
[
'db' => isset($GLOBALS['db']) && is_scalar($GLOBALS['db'])
? (string) $GLOBALS['db'] : '',
'table' => isset($GLOBALS['table']) && is_scalar($GLOBALS['table'])
? (string) $GLOBALS['table'] : '',
'sql_query' => $query,
]
);
if (! empty($GLOBALS['focus_querywindow'])) {
$this->addJSON('_focusQuerywindow', $query);
}
if (! empty($GLOBALS['reload'])) {
$this->addJSON('reloadNavigation', 1);
}
$this->addJSON('params', $this->getHeader()->getJsParams());
}
}
// Set the Content-Type header to JSON so that jQuery parses the
// response correctly.
Core::headerJSON();
$result = json_encode($this->JSON);
if ($result === false) {
return (string) json_encode([
'success' => false,
'error' => 'JSON encoding failed: ' . json_last_error_msg(),
]);
}
return $result;
}
/**
* Sends an HTML response to the browser
*/
public function response(): void
{
$buffer = OutputBuffering::getInstance();
if (empty($this->HTML)) {
$this->HTML = $buffer->getContents();
}
if ($this->isAjax()) {
echo $this->ajaxResponse();
} else {
echo $this->getDisplay();
}
$buffer->flush();
exit;
}
/**
* Wrapper around PHP's header() function.
*
* @param string $text header string
*/
public function header($text): void
{
// phpcs:ignore SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly
\header($text);
}
/**
* Wrapper around PHP's headers_sent() function.
*/
public function headersSent(): bool
{
return headers_sent();
}
/**
* Wrapper around PHP's http_response_code() function.
*
* @param int $response_code will set the response code.
*/
public function httpResponseCode($response_code): void
{
http_response_code($response_code);
}
/**
* Sets http response code.
*
* @param int $responseCode will set the response code.
*/
public function setHttpResponseCode(int $responseCode): void
{
$this->httpResponseCode($responseCode);
$header = 'status: ' . $responseCode . ' ';
if (isset(static::$httpStatusMessages[$responseCode])) {
$header .= static::$httpStatusMessages[$responseCode];
} else {
$header .= 'Web server is down';
}
if (PHP_SAPI === 'cgi-fcgi') {
return;
}
$this->header($header);
}
/**
* Generate header for 303
*
* @param string $location will set location to redirect.
*/
public function generateHeader303($location): void
{
$this->setHttpResponseCode(303);
$this->header('Location: ' . $location);
if (! defined('TESTSUITE')) {
exit;
}
}
/**
* Configures response for the login page
*
* @return bool Whether caller should exit
*/
public function loginPage(): bool
{
/* Handle AJAX redirection */
if ($this->isAjax()) {
$this->setRequestStatus(false);
// redirect_flag redirects to the login page
$this->addJSON('redirect_flag', '1');
return true;
}
$this->getFooter()->setMinimal();
$header = $this->getHeader();
$header->setBodyId('loginform');
$header->setTitle('phpMyAdmin');
$header->disableMenuAndConsole();
$header->disableWarnings();
return false;
}
}
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| Charsets | Folder | 0755 |
|
|
| Command | Folder | 0755 |
|
|
| Config | Folder | 0755 |
|
|
| ConfigStorage | Folder | 0755 |
|
|
| Controllers | Folder | 0755 |
|
|
| Crypto | Folder | 0755 |
|
|
| Database | Folder | 0755 |
|
|
| Dbal | Folder | 0755 |
|
|
| Display | Folder | 0755 |
|
|
| Engines | Folder | 0755 |
|
|
| Exceptions | Folder | 0755 |
|
|
| Export | Folder | 0755 |
|
|
| Gis | Folder | 0755 |
|
|
| Html | Folder | 0755 |
|
|
| Http | Folder | 0755 |
|
|
| Image | Folder | 0755 |
|
|
| Import | Folder | 0755 |
|
|
| Navigation | Folder | 0755 |
|
|
| Partitioning | Folder | 0755 |
|
|
| Plugins | Folder | 0755 |
|
|
| Properties | Folder | 0755 |
|
|
| Providers | Folder | 0755 |
|
|
| Query | Folder | 0755 |
|
|
| Server | Folder | 0755 |
|
|
| Setup | Folder | 0755 |
|
|
| Table | Folder | 0755 |
|
|
| Twig | Folder | 0755 |
|
|
| Utils | Folder | 0755 |
|
|
| WebAuthn | Folder | 0755 |
|
|
| Advisor.php | File | 12.32 KB | 0644 |
|
| Bookmark.php | File | 9.19 KB | 0644 |
|
| BrowseForeigners.php | File | 10.63 KB | 0644 |
|
| Cache.php | File | 1.5 KB | 0644 |
|
| Charsets.php | File | 6.82 KB | 0644 |
|
| CheckUserPrivileges.php | File | 11.3 KB | 0644 |
|
| Common.php | File | 19.4 KB | 0644 |
|
| Config.php | File | 41.65 KB | 0644 |
|
| Console.php | File | 3.25 KB | 0644 |
|
| Core.php | File | 28.91 KB | 0644 |
|
| CreateAddField.php | File | 15.83 KB | 0644 |
|
| DatabaseInterface.php | File | 71.73 KB | 0644 |
|
| DbTableExists.php | File | 2.86 KB | 0644 |
|
| Encoding.php | File | 8.41 KB | 0644 |
|
| Error.php | File | 13.63 KB | 0644 |
|
| ErrorHandler.php | File | 18.31 KB | 0644 |
|
| ErrorReport.php | File | 8.99 KB | 0644 |
|
| Export.php | File | 45.7 KB | 0644 |
|
| FieldMetadata.php | File | 11.11 KB | 0644 |
|
| File.php | File | 19.75 KB | 0644 |
|
| FileListing.php | File | 2.88 KB | 0644 |
|
| FlashMessages.php | File | 1.22 KB | 0644 |
|
| Font.php | File | 5.58 KB | 0644 |
|
| Footer.php | File | 8.06 KB | 0644 |
|
| Git.php | File | 18 KB | 0644 |
|
| Header.php | File | 20 KB | 0644 |
|
| Import.php | File | 48.72 KB | 0644 |
|
| Index.php | File | 14.83 KB | 0644 |
|
| IndexColumn.php | File | 4.75 KB | 0644 |
|
| InsertEdit.php | File | 89.05 KB | 0644 |
|
| InternalRelations.php | File | 17.31 KB | 0644 |
|
| IpAllowDeny.php | File | 9.13 KB | 0644 |
|
| Language.php | File | 4.47 KB | 0644 |
|
| LanguageManager.php | File | 22.74 KB | 0644 |
|
| Linter.php | File | 4.99 KB | 0644 |
|
| ListAbstract.php | File | 1.67 KB | 0644 |
|
| ListDatabase.php | File | 4.11 KB | 0644 |
|
| Logging.php | File | 2.69 KB | 0644 |
|
| Menu.php | File | 20.4 KB | 0644 |
|
| Message.php | File | 18.68 KB | 0644 |
|
| Mime.php | File | 927 B | 0644 |
|
| Normalization.php | File | 41.53 KB | 0644 |
|
| OpenDocument.php | File | 8.62 KB | 0644 |
|
| Operations.php | File | 35.11 KB | 0644 |
|
| OutputBuffering.php | File | 4.1 KB | 0644 |
|
| ParseAnalyze.php | File | 2.34 KB | 0644 |
|
| Pdf.php | File | 4.17 KB | 0644 |
|
| Plugins.php | File | 21.83 KB | 0644 |
|
| Profiling.php | File | 2.16 KB | 0644 |
|
| RecentFavoriteTable.php | File | 11.44 KB | 0644 |
|
| Replication.php | File | 4.81 KB | 0644 |
|
| ReplicationGui.php | File | 21.24 KB | 0644 |
|
| ReplicationInfo.php | File | 4.79 KB | 0644 |
|
| ResponseRenderer.php | File | 13.5 KB | 0644 |
|
| Routing.php | File | 6.55 KB | 0644 |
|
| Sanitize.php | File | 11.98 KB | 0644 |
|
| SavedSearches.php | File | 11.33 KB | 0644 |
|
| Scripts.php | File | 3.74 KB | 0644 |
|
| Session.php | File | 8.16 KB | 0644 |
|
| Sql.php | File | 64.01 KB | 0644 |
|
| SqlQueryForm.php | File | 6.74 KB | 0644 |
|
| StorageEngine.php | File | 15.71 KB | 0644 |
|
| SystemDatabase.php | File | 3.98 KB | 0644 |
|
| Table.php | File | 90.33 KB | 0644 |
|
| Template.php | File | 4.5 KB | 0644 |
|
| Theme.php | File | 7.32 KB | 0644 |
|
| ThemeManager.php | File | 7 KB | 0644 |
|
| Tracker.php | File | 30.34 KB | 0644 |
|
| Tracking.php | File | 36.11 KB | 0644 |
|
| Transformations.php | File | 16.31 KB | 0644 |
|
| TwoFactor.php | File | 7.5 KB | 0644 |
|
| Types.php | File | 25.85 KB | 0644 |
|
| Url.php | File | 10.61 KB | 0644 |
|
| UrlRedirector.php | File | 1.74 KB | 0644 |
|
| UserPassword.php | File | 6.86 KB | 0644 |
|
| UserPreferences.php | File | 10.49 KB | 0644 |
|
| Util.php | File | 86.45 KB | 0644 |
|
| Version.php | File | 556 B | 0644 |
|
| VersionInformation.php | File | 7.3 KB | 0644 |
|
| ZipExtension.php | File | 10.33 KB | 0644 |
|