__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
<?php
/**
* Two authentication factor handling
*/
declare(strict_types=1);
namespace PhpMyAdmin;
use BaconQrCode\Renderer\ImageRenderer;
use CodeLts\U2F\U2FServer\U2FServer;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\Plugins\TwoFactor\Application;
use PhpMyAdmin\Plugins\TwoFactor\Invalid;
use PhpMyAdmin\Plugins\TwoFactor\Key;
use PhpMyAdmin\Plugins\TwoFactorPlugin;
use PragmaRX\Google2FAQRCode\Google2FA;
use XMLWriter;
use function array_merge;
use function class_exists;
use function extension_loaded;
use function in_array;
use function is_array;
use function is_string;
use function ucfirst;
/**
* Two factor authentication wrapper class
*/
class TwoFactor
{
/** @var string */
public $user;
/**
* @var array
* @psalm-var array{backend: string, settings: mixed[], type?: 'session'|'db'}
*/
public $config;
/** @var bool */
protected $writable;
/** @var TwoFactorPlugin */
protected $backend;
/** @var array */
protected $available;
/** @var UserPreferences */
private $userPreferences;
/**
* Creates new TwoFactor object
*
* @param string $user User name
*/
public function __construct($user)
{
global $dbi;
(new Relation($dbi))->initRelationParamsCache();
$this->userPreferences = new UserPreferences();
$this->user = $user;
$this->available = $this->getAvailableBackends();
$this->config = $this->readConfig();
$this->writable = ($this->config['type'] === 'db');
$this->backend = $this->getBackendForCurrentUser();
}
/**
* Reads the configuration
*
* @psalm-return array{backend: string, settings: mixed[], type: 'session'|'db'}
*/
public function readConfig(): array
{
$result = [];
$config = $this->userPreferences->load();
if (isset($config['config_data']['2fa']) && is_array($config['config_data']['2fa'])) {
$result = $config['config_data']['2fa'];
}
$backend = '';
if (isset($result['backend']) && is_string($result['backend'])) {
$backend = $result['backend'];
}
$settings = [];
if (isset($result['settings']) && is_array($result['settings'])) {
$settings = $result['settings'];
}
return ['backend' => $backend, 'settings' => $settings, 'type' => $config['type']];
}
public function isWritable(): bool
{
return $this->writable;
}
public function getBackend(): TwoFactorPlugin
{
return $this->backend;
}
/**
* @return array
*/
public function getAvailable(): array
{
return $this->available;
}
public function showSubmit(): bool
{
$backend = $this->backend;
return $backend::$showSubmit;
}
/**
* Returns list of available backends
*
* @return array
*/
public function getAvailableBackends()
{
$result = [];
if ($GLOBALS['cfg']['DBG']['simple2fa']) {
$result[] = 'simple';
}
if (
class_exists(Google2FA::class)
&& class_exists(ImageRenderer::class)
&& (class_exists(XMLWriter::class) || extension_loaded('imagick'))
) {
$result[] = 'application';
}
$result[] = 'WebAuthn';
if (class_exists(U2FServer::class)) {
$result[] = 'key';
}
return $result;
}
/**
* Returns list of missing dependencies
*
* @return array
*/
public function getMissingDeps()
{
$result = [];
if (! class_exists(Google2FA::class)) {
$result[] = [
'class' => Application::getName(),
'dep' => 'php-pragmarx-google2fa-qrcode',
];
}
if (! class_exists(ImageRenderer::class)) {
$result[] = [
'class' => Application::getName(),
'dep' => 'php-bacon-qr-code',
];
}
if (! class_exists(U2FServer::class)) {
$result[] = [
'class' => Key::getName(),
'dep' => 'php-code-lts-u2f-php-server',
];
}
return $result;
}
/**
* Returns class name for given name
*
* @param string $name Backend name
*
* @return string
* @psalm-return class-string
*/
public function getBackendClass($name)
{
$result = TwoFactorPlugin::class;
if (in_array($name, $this->available)) {
/** @psalm-var class-string $result */
$result = 'PhpMyAdmin\\Plugins\\TwoFactor\\' . ucfirst($name);
} elseif (! empty($name)) {
$result = Invalid::class;
}
return $result;
}
/**
* Returns backend for current user
*
* @return TwoFactorPlugin
*/
public function getBackendForCurrentUser()
{
$name = $this->getBackendClass($this->config['backend']);
return new $name($this);
}
/**
* Checks authentication, returns true on success
*
* @param bool $skipSession Skip session cache
*/
public function check($skipSession = false): bool
{
if ($skipSession) {
return $this->backend->check();
}
if (empty($_SESSION['two_factor_check'])) {
$_SESSION['two_factor_check'] = $this->backend->check();
}
return (bool) $_SESSION['two_factor_check'];
}
/**
* Renders user interface to enter two-factor authentication
*
* @return string HTML code
*/
public function render()
{
return $this->backend->getError() . $this->backend->render();
}
/**
* Renders user interface to configure two-factor authentication
*
* @return string HTML code
*/
public function setup()
{
return $this->backend->getError() . $this->backend->setup();
}
/**
* Saves current configuration.
*
* @return true|Message
*/
public function save()
{
return $this->userPreferences->persistOption('2fa', $this->config, null);
}
/**
* Changes two-factor authentication settings
*
* The object might stay in partially changed setup
* if configuration fails.
*
* @param string $name Backend name
*/
public function configure($name): bool
{
$this->config = ['backend' => $name, 'settings' => []];
if ($name === '') {
$cls = $this->getBackendClass($name);
$this->backend = new $cls($this);
} else {
if (! in_array($name, $this->available)) {
return false;
}
$cls = $this->getBackendClass($name);
$this->backend = new $cls($this);
if (! $this->backend->configure()) {
return false;
}
}
$result = $this->save();
if ($result !== true) {
echo $result->getDisplay();
}
return true;
}
/**
* Returns array with all available backends
*
* @return array
*/
public function getAllBackends()
{
$all = array_merge([''], $this->available);
$backends = [];
foreach ($all as $name) {
$cls = $this->getBackendClass($name);
$backends[] = [
'id' => $cls::$id,
'name' => $cls::getName(),
'description' => $cls::getDescription(),
];
}
return $backends;
}
}
| 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 |
|