398 lines
11 KiB
PHP
398 lines
11 KiB
PHP
<?php
|
|
|
|
namespace BitApps\FM;
|
|
|
|
use function BitApps\FM\Functions\view;
|
|
|
|
use BitApps\FM\Http\Middleware\CapCheckerMiddleware;
|
|
use BitApps\FM\Http\Middleware\NonceCheckerMiddleware;
|
|
|
|
use BitApps\FM\Providers\AccessControlProvider;
|
|
|
|
use BitApps\FM\Providers\FileEditValidator;
|
|
|
|
use BitApps\FM\Providers\HookProvider;
|
|
use BitApps\FM\Providers\InstallerProvider;
|
|
use BitApps\FM\Providers\Logger;
|
|
use BitApps\FM\Providers\MediaSynchronizer;
|
|
use BitApps\FM\Providers\MimeProvider;
|
|
use BitApps\FM\Providers\PermissionsProvider;
|
|
use BitApps\FM\Providers\PreferenceProvider;
|
|
use BitApps\FM\Providers\VersionMigrationProvider;
|
|
use BitApps\FM\Views\Admin;
|
|
use BitApps\FM\Views\Shortcode;
|
|
use BitApps\WPKit\Hooks\Hooks;
|
|
use BitApps\WPKit\Http\RequestType;
|
|
|
|
use BitApps\WPKit\Migration\MigrationHelper;
|
|
use BitApps\WPTelemetry\Telemetry\Telemetry;
|
|
use BitApps\WPTelemetry\Telemetry\TelemetryConfig;
|
|
|
|
final class Plugin
|
|
{
|
|
/**
|
|
* Main instance of the plugin.
|
|
*
|
|
* @var null|Plugin
|
|
*/
|
|
private static $_instance;
|
|
|
|
private $_registeredMiddleware = [];
|
|
|
|
private $_container = [];
|
|
|
|
/**
|
|
* Initialize the Plugin with hooks.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
Hooks::addAction('init', [$this, 'registerProviders']);
|
|
Hooks::addAction('admin_enqueue_scripts', [$this, 'registerAssets']);
|
|
Hooks::addFilter('plugin_action_links_' . Config::get('BASENAME'), [$this, 'actionLinks']);
|
|
Hooks::addAction('wp_dashboard_setup', [$this, 'addNoticeToDashBoard']);
|
|
$this->setPhpIniVars();
|
|
$this->uploadFolder();
|
|
}
|
|
|
|
public function middlewares()
|
|
{
|
|
return [
|
|
'nonce' => NonceCheckerMiddleware::class,
|
|
'cap' => CapCheckerMiddleware::class,
|
|
];
|
|
}
|
|
|
|
public function getMiddleware($name)
|
|
{
|
|
if (isset($this->_registeredMiddleware[$name])) {
|
|
return $this->_registeredMiddleware[$name];
|
|
}
|
|
|
|
$middlewares = $this->middlewares();
|
|
if (isset($middlewares[$name])
|
|
&& class_exists($middlewares[$name])
|
|
&& method_exists($middlewares[$name], 'handle')) {
|
|
$this->_registeredMiddleware[$name] = new $middlewares[$name]();
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
return $this->_registeredMiddleware[$name];
|
|
}
|
|
|
|
/**
|
|
* Instantiate the Provider class.
|
|
*/
|
|
public function registerProviders()
|
|
{
|
|
if (RequestType::is('admin')) {
|
|
new Admin();
|
|
}
|
|
|
|
if (RequestType::is('frontend')) {
|
|
new Shortcode();
|
|
}
|
|
|
|
new HookProvider();
|
|
|
|
$this->initTelemetry();
|
|
|
|
$this->_container['access_control'] = new AccessControlProvider();
|
|
$this->_container['logger'] = new Logger();
|
|
$this->_container['permissions'] = new PermissionsProvider();
|
|
$this->_container['mimes'] = new MimeProvider(BFM_FINDER_DIR . 'php/mime.types');
|
|
$this->_container['media_sync'] = new MediaSynchronizer();
|
|
$this->_container['file_edit_validator'] = new FileEditValidator();
|
|
$this->_container['preferences'] = new PreferenceProvider();
|
|
|
|
$migrationProvider = new VersionMigrationProvider();
|
|
$migrationProvider->migrate();
|
|
}
|
|
|
|
/**
|
|
* Provide preferences
|
|
*
|
|
* @return PreferenceProvider
|
|
*/
|
|
public function preferences()
|
|
{
|
|
if (!isset($this->_container['preferences'])) {
|
|
$this->_container['preferences'] = new PreferenceProvider();
|
|
}
|
|
|
|
return $this->_container['preferences'];
|
|
}
|
|
|
|
/**
|
|
* Provide php syntax checker
|
|
*
|
|
* @return FileEditValidator
|
|
*/
|
|
public function fileEditValidator()
|
|
{
|
|
if (!isset($this->_container['file_edit_validator'])) {
|
|
$this->_container['file_edit_validator'] = new FileEditValidator();
|
|
}
|
|
|
|
return $this->_container['file_edit_validator'];
|
|
}
|
|
|
|
/**
|
|
* Provide media synchronizer
|
|
*
|
|
* @return MediaSynchronizer
|
|
*/
|
|
public function mediaSyncs()
|
|
{
|
|
if (!isset($this->_container['media_sync'])) {
|
|
$this->_container['media_sync'] = new MediaSynchronizer();
|
|
}
|
|
|
|
return $this->_container['media_sync'];
|
|
}
|
|
|
|
/**
|
|
* Provide finder mime types
|
|
*
|
|
* @return MimeProvider
|
|
*/
|
|
public function mimes()
|
|
{
|
|
if (!isset($this->_container['mimes'])) {
|
|
$this->_container['mimes'] = new MimeProvider(BFM_FINDER_DIR . 'php/mime.types');
|
|
}
|
|
|
|
return $this->_container['mimes'];
|
|
}
|
|
|
|
/**
|
|
* Provide stored permissions settings
|
|
*
|
|
* @return PermissionsProvider
|
|
*/
|
|
public function permissions()
|
|
{
|
|
if (!isset($this->_container['permissions'])) {
|
|
$this->_container['permissions'] = new PermissionsProvider();
|
|
}
|
|
|
|
return $this->_container['permissions'];
|
|
}
|
|
|
|
/**
|
|
* Provide access control for file manager
|
|
*
|
|
* @return AccessControlProvider
|
|
*/
|
|
public function accessControl()
|
|
{
|
|
if (!isset($this->_container['access_control'])) {
|
|
$this->_container['access_control'] = new AccessControlProvider();
|
|
}
|
|
|
|
return $this->_container['access_control'];
|
|
}
|
|
|
|
/**
|
|
* Provide Logger for finder
|
|
*
|
|
* @return Logger
|
|
*/
|
|
public function logger()
|
|
{
|
|
if (!isset($this->_container['logger'])) {
|
|
$this->_container['logger'] = new Logger();
|
|
}
|
|
|
|
return $this->_container['logger'];
|
|
}
|
|
|
|
public function get($name)
|
|
{
|
|
if (isset($this->_container[$name])) {
|
|
return $this->_container[$name];
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Load the asset libraries.
|
|
*
|
|
* @param string $currentScreen top_level_page variable for current page
|
|
*/
|
|
public function registerAssets($currentScreen = '')
|
|
{
|
|
$version = Config::VERSION;
|
|
|
|
wp_register_script(
|
|
'bfm-finder-loader',
|
|
BFM_ROOT_URL . 'assets/js/finder-loader.js',
|
|
[Config::SLUG . 'elfinder-script', 'jquery'],
|
|
$version
|
|
);
|
|
$this->registerFinderAssets(); // Loads all the assets necessary for elFinder
|
|
}
|
|
|
|
/**
|
|
* Registers all the elfinder assets
|
|
* */
|
|
public function registerFinderAssets()
|
|
{
|
|
wp_register_style(
|
|
'bfm-jquery-ui-css',
|
|
Hooks::applyFilter(
|
|
'fm_jquery_ui_theme_hook',
|
|
BFM_ROOT_URL . 'libs/js/jquery-ui/jquery-ui.min.css'
|
|
)
|
|
);
|
|
|
|
wp_register_style(
|
|
Config::SLUG . 'elfinder-css',
|
|
BFM_FINDER_URL . 'css/elfinder.min.css',
|
|
Config::VERSION
|
|
);
|
|
|
|
wp_register_style(Config::SLUG . 'theme-css', BFM_ROOT_URL . 'libs/js/jquery-ui/jquery-ui.theme.min.css');
|
|
|
|
// elFinder Scripts depends on jQuery UI core, selectable, draggable, droppable, resizable, dialog and slider.
|
|
wp_register_script(
|
|
Config::SLUG . 'elfinder-script',
|
|
BFM_FINDER_URL . 'js/elfinder.min.js',
|
|
['jquery', 'jquery-ui-core', 'jquery-ui-selectable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-resizable', 'jquery-ui-dialog', 'jquery-ui-slider', 'jquery-ui-tabs']
|
|
);
|
|
|
|
wp_register_script(
|
|
Config::SLUG . 'elfinder-editor-script',
|
|
BFM_FINDER_URL . 'js/extras/editors.default.min.js',
|
|
[Config::SLUG . 'elfinder-script']
|
|
);
|
|
|
|
wp_localize_script(
|
|
Config::SLUG . 'elfinder-script',
|
|
'fm',
|
|
$this->createConfigVariable()
|
|
);
|
|
}
|
|
|
|
public function createConfigVariable()
|
|
{
|
|
return apply_filters(
|
|
Config::withPrefix('localized_script'),
|
|
[
|
|
'ajaxURL' => admin_url('admin-ajax.php'),
|
|
'js_url' => BFM_FINDER_URL . 'js/',
|
|
'elfinder' => BFM_FINDER_URL,
|
|
'translations' => [],
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Plugin action links.
|
|
*
|
|
* @param array $links Array of links
|
|
*
|
|
* @return array
|
|
*/
|
|
public function actionLinks($links)
|
|
{
|
|
$linksToAdd = Config::get('PLUGIN_PAGE_LINKS');
|
|
foreach ($linksToAdd as $link) {
|
|
$links[] = '<a href="' . $link['url'] . '">' . $link['title'] . '</a>';
|
|
}
|
|
|
|
return $links;
|
|
}
|
|
|
|
public function addNoticeToDashBoard()
|
|
{
|
|
wp_add_dashboard_widget(
|
|
'bitapps_notice',
|
|
'Bit Apps',
|
|
function () {
|
|
view('admin.widget');
|
|
},
|
|
null,
|
|
null,
|
|
'normal',
|
|
'high'
|
|
);
|
|
|
|
global $wp_meta_boxes;
|
|
|
|
$metaBox = $wp_meta_boxes['dashboard']['normal']['high'];
|
|
$notice = [
|
|
'bitapps_notice' => $metaBox['bitapps_notice'],
|
|
];
|
|
|
|
$wp_meta_boxes['dashboard']['normal']['high'] = array_merge($notice, $metaBox);
|
|
}
|
|
|
|
/**
|
|
* Retrieves the main instance of the plugin.
|
|
*
|
|
* @return Plugin plugin main instance
|
|
*/
|
|
public static function instance()
|
|
{
|
|
return static::$_instance;
|
|
}
|
|
|
|
/**
|
|
* Loads the plugin main instance and initializes it.
|
|
*
|
|
* @return bool True if the plugin main instance could be loaded, false otherwise
|
|
*/
|
|
public static function load()
|
|
{
|
|
if (static::$_instance !== null) {
|
|
return false;
|
|
}
|
|
|
|
static::$_instance = new static();
|
|
if (version_compare(Config::getOption('version'), Config::VERSION_ID, '<')) {
|
|
MigrationHelper::migrate(InstallerProvider::migration());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function initTelemetry()
|
|
{
|
|
TelemetryConfig::setSlug(Config::SLUG);
|
|
TelemetryConfig::setTitle(Config::TITLE);
|
|
TelemetryConfig::setPrefix(Config::VAR_PREFIX);
|
|
TelemetryConfig::setVersion(Config::VERSION);
|
|
|
|
TelemetryConfig::setServerBaseUrl('https://wp-api.bitapps.pro/public/');
|
|
|
|
TelemetryConfig::setTermsUrl('https://bitapps.pro/terms-of-service/');
|
|
TelemetryConfig::setPolicyUrl('https://bitapps.pro/refund-policy/');
|
|
|
|
Telemetry::report()->init();
|
|
Telemetry::feedback()->init();
|
|
}
|
|
|
|
/**
|
|
* Set the all necessary variables of php.ini file.
|
|
* */
|
|
protected function setPhpIniVars()
|
|
{
|
|
if (\defined('WP_DEBUG') && isset($_REQUEST['action']) && sanitize_text_field($_REQUEST['action']) === 'bit_fm_connector') {
|
|
ini_set('post_max_size', '128M');
|
|
ini_set('upload_max_filesize', '128M');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if the upload folder is present. If not creates a upload folder.
|
|
* */
|
|
private function uploadFolder()
|
|
{
|
|
if (!is_dir(FM_UPLOAD_BASE_DIR)) {
|
|
mkdir(FM_UPLOAD_BASE_DIR, 0755);
|
|
}
|
|
}
|
|
}
|