__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
<?php
/**
* Recent and Favorite table list handling
*/
declare(strict_types=1);
namespace PhpMyAdmin;
use PhpMyAdmin\ConfigStorage\Relation;
use function __;
use function array_key_exists;
use function array_merge;
use function array_pop;
use function array_unique;
use function array_unshift;
use function count;
use function is_string;
use function json_decode;
use function json_encode;
use function max;
use function md5;
use function ucfirst;
use const SORT_REGULAR;
/**
* Handles the recently used and favorite tables.
*
* @TODO Change the release version in table pma_recent
* (#recent in documentation)
*/
class RecentFavoriteTable
{
/** @var Template */
public $template;
/**
* Reference to session variable containing recently used or favorite tables.
*
* @var array
*/
private $tables;
/**
* Defines type of action, Favorite or Recent table.
*
* @var string
*/
private $tableType;
/**
* RecentFavoriteTable instances.
*
* @var array<string,RecentFavoriteTable>
*/
private static $instances = [];
/** @var Relation */
private $relation;
/**
* Creates a new instance of RecentFavoriteTable
*
* @param Template $template Template object
* @param string $type the table type
*/
private function __construct(Template $template, string $type)
{
$this->template = $template;
global $dbi;
$this->relation = new Relation($dbi);
$this->tableType = $type;
$server_id = $GLOBALS['server'];
if (! isset($_SESSION['tmpval'][$this->tableType . 'Tables'][$server_id])) {
$_SESSION['tmpval'][$this->tableType . 'Tables'][$server_id] = $this->getPmaTable()
? $this->getFromDb()
: [];
}
$this->tables =& $_SESSION['tmpval'][$this->tableType . 'Tables'][$server_id];
}
/**
* Returns class instance.
*
* @param string $type the table type
* @psalm-param 'favorite'|'recent' $type
*/
public static function getInstance(string $type): RecentFavoriteTable
{
if (! array_key_exists($type, self::$instances)) {
$template = new Template();
self::$instances[$type] = new RecentFavoriteTable($template, $type);
}
return self::$instances[$type];
}
/**
* Returns the recent/favorite tables array
*
* @return array
*/
public function getTables()
{
return $this->tables;
}
/**
* Returns recently used tables or favorite from phpMyAdmin database.
*
* @return array
*/
public function getFromDb(): array
{
global $dbi;
// Read from phpMyAdmin database, if recent tables is not in session
$sql_query = ' SELECT `tables` FROM ' . $this->getPmaTable() .
" WHERE `username` = '" . $dbi->escapeString($GLOBALS['cfg']['Server']['user']) . "'";
$result = $dbi->tryQueryAsControlUser($sql_query);
if ($result) {
$value = $result->fetchValue();
if (is_string($value)) {
return json_decode($value, true);
}
}
return [];
}
/**
* Save recent/favorite tables into phpMyAdmin database.
*
* @return true|Message
*/
public function saveToDb()
{
global $dbi;
$username = $GLOBALS['cfg']['Server']['user'];
$sql_query = ' REPLACE INTO ' . $this->getPmaTable() . ' (`username`, `tables`)' .
" VALUES ('" . $dbi->escapeString($username) . "', '"
. $dbi->escapeString(
json_encode($this->tables)
) . "')";
$success = $dbi->tryQuery($sql_query, DatabaseInterface::CONNECT_CONTROL);
if (! $success) {
$error_msg = '';
switch ($this->tableType) {
case 'recent':
$error_msg = __('Could not save recent table!');
break;
case 'favorite':
$error_msg = __('Could not save favorite table!');
break;
}
$message = Message::error($error_msg);
$message->addMessage(
Message::rawError($dbi->getError(DatabaseInterface::CONNECT_CONTROL)),
'<br><br>'
);
return $message;
}
return true;
}
/**
* Trim recent.favorite table according to the
* NumRecentTables/NumFavoriteTables configuration.
*/
public function trim(): bool
{
$max = max(
$GLOBALS['cfg']['Num' . ucfirst($this->tableType) . 'Tables'],
0
);
$trimmingOccurred = count($this->tables) > $max;
while (count($this->tables) > $max) {
array_pop($this->tables);
}
return $trimmingOccurred;
}
/**
* Return HTML ul.
*/
public function getHtmlList(): string
{
if (count($this->tables)) {
if ($this->tableType === 'recent') {
$tables = [];
foreach ($this->tables as $table) {
$tables[] = [
'db' => $table['db'],
'table' => $table['table'],
];
}
return $this->template->render('recent_favorite_table_recent', ['tables' => $tables]);
}
$tables = [];
foreach ($this->tables as $table) {
$removeParameters = [
'db' => $table['db'],
'ajax_request' => true,
'favorite_table' => $table['table'],
'remove_favorite' => true,
];
$tableParameters = [
'db' => $table['db'],
'table' => $table['table'],
'md5' => md5($table['db'] . '.' . $table['table']),
];
$tables[] = [
'remove_parameters' => $removeParameters,
'table_parameters' => $tableParameters,
];
}
return $this->template->render('recent_favorite_table_favorite', ['tables' => $tables]);
}
return $this->template->render('recent_favorite_table_no_tables', [
'is_recent' => $this->tableType === 'recent',
]);
}
public function getHtml(): string
{
$html = '<div class="drop_list">';
if ($this->tableType === 'recent') {
$html .= '<button title="' . __('Recent tables')
. '" class="drop_button btn">'
. __('Recent') . '</button><ul id="pma_recent_list">';
} else {
$html .= '<button title="' . __('Favorite tables')
. '" class="drop_button btn">'
. __('Favorites') . '</button><ul id="pma_favorite_list">';
}
$html .= $this->getHtmlList();
$html .= '</ul></div>';
return $html;
}
/**
* Add recently used or favorite tables.
*
* @param string $db database name where the table is located
* @param string $table table name
*
* @return true|Message True if success, Message if not
*/
public function add($db, $table)
{
global $dbi;
// If table does not exist, do not add._getPmaTable()
if (! $dbi->getColumns($db, $table)) {
return true;
}
$table_arr = [];
$table_arr['db'] = $db;
$table_arr['table'] = $table;
// add only if this is new table
if (! isset($this->tables[0]) || $this->tables[0] != $table_arr) {
array_unshift($this->tables, $table_arr);
$this->tables = array_merge(array_unique($this->tables, SORT_REGULAR));
$this->trim();
if ($this->getPmaTable()) {
return $this->saveToDb();
}
}
return true;
}
/**
* Removes recent/favorite tables that don't exist.
*
* @param string $db database
* @param string $table table
*
* @return bool|Message True if invalid and removed, False if not invalid,
* Message if error while removing
*/
public function removeIfInvalid($db, $table)
{
global $dbi;
foreach ($this->tables as $tbl) {
if ($tbl['db'] != $db || $tbl['table'] != $table) {
continue;
}
// TODO Figure out a better way to find the existence of a table
if (! $dbi->getColumns($tbl['db'], $tbl['table'])) {
return $this->remove($tbl['db'], $tbl['table']);
}
}
return false;
}
/**
* Remove favorite tables.
*
* @param string $db database name where the table is located
* @param string $table table name
*
* @return true|Message True if success, Message if not
*/
public function remove($db, $table)
{
foreach ($this->tables as $key => $value) {
if ($value['db'] != $db || $value['table'] != $table) {
continue;
}
unset($this->tables[$key]);
}
if ($this->getPmaTable()) {
return $this->saveToDb();
}
return true;
}
/**
* Generate Html for sync Favorite tables anchor. (from localStorage to pmadb)
*/
public function getHtmlSyncFavoriteTables(): string
{
$retval = '';
$server_id = $GLOBALS['server'];
if ($server_id == 0) {
return '';
}
$relationParameters = $this->relation->getRelationParameters();
// Not to show this once list is synchronized.
if (
$relationParameters->favoriteTablesFeature !== null
&& ! isset($_SESSION['tmpval']['favorites_synced'][$server_id])
) {
$url = Url::getFromRoute('/database/structure/favorite-table', [
'ajax_request' => true,
'favorite_table' => true,
'sync_favorite_tables' => true,
]);
$retval = '<a class="hide" id="sync_favorite_tables"';
$retval .= ' href="' . $url . '"></a>';
}
return $retval;
}
/**
* Generate Html to update recent tables.
*/
public static function getHtmlUpdateRecentTables(): string
{
return '<a class="hide" id="update_recent_tables" href="'
. Url::getFromRoute('/recent-table', [
'ajax_request' => true,
'recent_table' => true,
])
. '"></a>';
}
/**
* Return the name of the configuration storage table
*
* @return string|null pma table name
*/
private function getPmaTable(): ?string
{
$relationParameters = $this->relation->getRelationParameters();
if ($this->tableType === 'recent' && $relationParameters->recentlyUsedTablesFeature !== null) {
return Util::backquote($relationParameters->recentlyUsedTablesFeature->database)
. '.' . Util::backquote($relationParameters->recentlyUsedTablesFeature->recent);
}
if ($this->tableType === 'favorite' && $relationParameters->favoriteTablesFeature !== null) {
return Util::backquote($relationParameters->favoriteTablesFeature->database)
. '.' . Util::backquote($relationParameters->favoriteTablesFeature->favorite);
}
return null;
}
}
| 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 |
|