<?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);
}
}
}