38217-vm/wp-content/plugins/mainwp/pages/page-mainwp-manage-sites-handler.php
2026-02-05 17:08:59 +03:00

509 lines
21 KiB
PHP

<?php
/**
* Manage Sites Handler.
*
* @package MainWP/Dashboard
*/
namespace MainWP\Dashboard;
/**
* Class MainWP_Manage_Sites_Handler
*
* @package MainWP\Dashboard
*/
class MainWP_Manage_Sites_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
/**
* Get Class Name
*
* @return string __CLASS__
*/
public static function get_class_name() {
return __CLASS__;
}
/**
* Method check_site()
*
* Check to add site.
*
* @return mixed send json encode data
*
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
* @uses \MainWP\Dashboard\MainWP_Utility::esc_content()
*/
public static function check_site() { // phpcs:ignore -- NOSONAR - complex.
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$url = isset( $_POST['url'] ) ? sanitize_text_field( wp_unslash( $_POST['url'] ) ) : '';
$url = urldecode( $url );
$is_valid = static::is_valid_wp_url( $url );
if ( ! $is_valid ) { // to fix: valid url to check.
die( wp_json_encode( array( 'error' => esc_html__( 'Invalid URL! Please enter valid URL to the Site URL field.', 'mainwp' ) ) ) );
}
$website = MainWP_DB::instance()->get_websites_by_url( $url );
$ret = array();
if ( MainWP_System_Utility::can_edit_website( $website ) ) {
$ret['response'] = esc_html__( 'ERROR Site is already connected to your MainWP Dashboard.', 'mainwp' );
} else {
try {
$verify_cert = empty( $_POST['verify_certificate'] ) ? false : intval( $_POST['verify_certificate'] );
$ssl_version = empty( $_POST['ssl_version'] ) ? 0 : intval( $_POST['ssl_version'] );
$force_use_ipv4 = apply_filters( 'mainwp_manage_sites_force_use_ipv4', null, $url );
$http_user = ( isset( $_POST['http_user'] ) ? sanitize_text_field( wp_unslash( $_POST['http_user'] ) ) : '' );
$http_pass = ( isset( $_POST['http_pass'] ) ? wp_unslash( $_POST['http_pass'] ) : '' );
$admin = ( isset( $_POST['admin'] ) ? sanitize_text_field( wp_unslash( $_POST['admin'] ) ) : '' );
$output = array();
$information = MainWP_Connect::fetch_url_not_authed(
$url,
$admin,
'stats',
null,
false,
$verify_cert,
$http_user,
$http_pass,
$ssl_version,
array(
'force_use_ipv4' => $force_use_ipv4,
),
$output
); // Fetch the stats with the given admin name.
if ( isset( $information['wpversion'] ) ) {
$ret['response'] = 'OK';
} elseif ( isset( $information['error'] ) ) {
$ret['response'] = 'ERROR ' . MainWP_Utility::esc_content( $information['error'] );
} else {
$ret['response'] = 'ERROR';
$ret['resp_data'] = isset( $output['fetch_data'] ) ? $output['fetch_data'] : '';
}
} catch ( MainWP_Exception $e ) {
$ret['response'] = $e->getMessage();
$ret['resp_data'] = $e->get_data();
}
}
$ret['check_me'] = ( isset( $_POST['check_me'] ) ? intval( $_POST['check_me'] ) : null );
do_action( 'mainwp_check_site_result', $ret, $_POST );
die( wp_json_encode( $ret ) );
// phpcs:enable
}
/**
* Method is_valid_wp_url().
*
* @param string $url Site url.
*
* @return bool Valid or not.
*/
public static function is_valid_wp_url( $url ) {
if ( empty( $url ) ) {
return false;
}
$valid = true;
$info = wp_parse_url( $url );
if ( is_array( $info ) && ! empty( $info['port'] ) && ( 21 === intval( $info['port'] ) || 22 === intval( $info['port'] ) ) ) { // port 21, 22.
$valid = false;
}
if ( $valid && ( ( 0 !== strpos( $url, 'http://' ) && 0 !== strpos( $url, 'https://' ) ) || false !== strpos( $url, '?=' ) ) ) { // to fix: valid url to check.
$valid = false;
}
return $valid;
}
/**
* Method reconnect_site()
*
* Try to reconnect to Child Site.
*
* @throws \MainWP_Exception Error message.
*
* @uses \MainWP\Dashboard\MainWP_Manage_DB::get_website_by_id()
* @uses \MainWP\Dashboard\MainWP_Manage_Sites_View::m_reconnect_site()
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
*/
public static function reconnect_site() { //phpcs:ignore -- NOSONAR - complexity.
$siteId = isset( $_POST['siteid'] ) ? intval( $_POST['siteid'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Missing
try {
if ( MainWP_Utility::ctype_digit( $siteId ) ) {
$website = MainWP_DB::instance()->get_website_by_id( $siteId );
$params = array();
$sync_first = true;
if ( is_array( $params ) && ! empty( $_POST['managesites_add_wpadmin'] ) && ! empty( $_POST['managesites_add_adminpwd'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
$params['wpadmin'] = isset( $_POST['managesites_add_wpadmin'] ) ? sanitize_text_field( wp_unslash( $_POST['managesites_add_wpadmin'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
$params['adminpwd'] = isset( $_POST['managesites_add_adminpwd'] ) ? wp_unslash( $_POST['managesites_add_adminpwd'] ) : ''; //phpcs:ignore -- NOSONAR - requires urlencoded passwd, do not sanitize for specical chars.
$sync_first = false; // reconnect use user's passwd so do not sync first.
}
MainWP_Manage_Sites_View::m_reconnect_site( $website, $sync_first, $params );
} else {
throw new MainWP_Exception( esc_html__( 'Site could not be connected. Please check the Status page and be sure that all system requirments pass.', 'mainwp' ) );
}
} catch ( \Exception $e ) {
$msg = $e->getMessage();
$arr_msg = MainWP_Utility::parse_html_error_message( $msg );
if ( $e instanceof MainWP_Exception ) {
$error_code = $e->get_message_error_code();
if ( 'reconnect_failed' === $error_code ) {
die( $error_code ); // phpcs:ignore WordPress.Security.EscapeOutput
}
}
if ( is_array( $arr_msg ) ) {
die( 'ERROR ' . wp_json_encode( $arr_msg ) ); // phpcs:ignore WordPress.Security.EscapeOutput
}
die( 'ERROR ' . $msg ); // phpcs:ignore WordPress.Security.EscapeOutput
}
die( esc_html__( 'Site has been reconnected successfully!', 'mainwp' ) );
}
/**
* Method add_site()
*
* Add new Child Site.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Sites_View::add_site()
*/
public static function add_site() {
$ret = array();
$error = '';
$message = '';
$site_id = 0;
$output = array();
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( isset( $_POST['managesites_add_wpurl'] ) && isset( $_POST['managesites_add_wpadmin'] ) ) {
// Check if already in DB.
$website = MainWP_DB::instance()->get_websites_by_url( sanitize_text_field( wp_unslash( $_POST['managesites_add_wpurl'] ) ) );
list( $message, $error, $site_id ) = MainWP_Manage_Sites_View::add_site( $website, $output );
}
$ret['add_me'] = ( isset( $_POST['add_me'] ) ? intval( $_POST['add_me'] ) : null );
if ( '' !== $error ) {
$ret['response'] = 'ERROR ' . $error;
die( wp_json_encode( $ret ) );
}
$ret['response'] = $message;
$ret['siteid'] = $site_id;
if ( isset( $output['fetch_data'] ) ) {
$ret['resp_data'] = $output['fetch_data'];
}
// phpcs:enable
if ( 1 === MainWP_DB::instance()->get_websites_count() ) {
$ret['redirectUrl'] = esc_url( admin_url( 'admin.php?page=managesites' ) );
}
die( wp_json_encode( $ret ) );
}
/**
* Method rest_api_add_site().
*
* Rest API add website.
*
* @param array $data fields array.
* @param array $output Output array.
*
* $data fields.
* 'url'.
* 'name'.
* 'admin'.
* 'uniqueid'.
* 'ssl_verify'.
* 'force_use_ipv4'.
* 'ssl_version'.
* 'http_user'.
* 'http_pass'.
* 'groupids'.
*
* @return mixed Results.
*/
public static function rest_api_add_site( $data, &$output = array() ) {
$params['url'] = isset( $data['url'] ) ? sanitize_text_field( wp_unslash( $data['url'] ) ) : '';
$params['name'] = isset( $data['name'] ) ? sanitize_text_field( wp_unslash( $data['name'] ) ) : '';
$params['wpadmin'] = isset( $data['admin'] ) ? sanitize_text_field( wp_unslash( $data['admin'] ) ) : '';
$params['adminpwd'] = isset( $data['adminpassword'] ) ? wp_unslash( $data['adminpassword'] ) : '';
$params['unique_id'] = isset( $data['uniqueid'] ) ? sanitize_text_field( wp_unslash( $data['uniqueid'] ) ) : '';
$params['ssl_verify'] = empty( $data['ssl_verify'] ) ? false : intval( $data['ssl_verify'] );
$params['force_use_ipv4'] = ( ! isset( $data['force_use_ipv4'] ) || ( empty( $data['force_use_ipv4'] ) && ( '0' !== $data['force_use_ipv4'] ) ) ? null : intval( $data['force_use_ipv4'] ) );
$params['http_user'] = isset( $data['http_user'] ) ? sanitize_text_field( wp_unslash( $data['http_user'] ) ) : '';
$params['http_pass'] = isset( $data['http_pass'] ) ? wp_unslash( $data['http_pass'] ) : '';
$params['groupids'] = isset( $data['groupids'] ) && ! empty( $data['groupids'] ) ? explode( ',', sanitize_text_field( wp_unslash( $data['groupids'] ) ) ) : array();
$website = MainWP_DB::instance()->get_websites_by_url( $params['url'] );
list( $message, $error, $site_id ) = MainWP_Manage_Sites_View::add_wp_site( $website, $params, $output );
if ( '' !== $error ) {
return array( 'error' => $error );
}
return array(
'response' => $message,
'siteid' => $site_id,
);
}
/**
* Method apply_plugin_settings()
*
* Apply plugin settings.
*/
public static function apply_plugin_settings() {
$site_id = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Missing
$ext_dir_slug = isset( $_POST['ext_dir_slug'] ) ? sanitize_text_field( wp_unslash( $_POST['ext_dir_slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
if ( empty( $site_id ) ) {
die( wp_json_encode( array( 'error' => esc_html__( 'Invalid site ID. Please try again.', 'mainwp' ) ) ) );
}
/**
* Apply plugin settings
*
* Fires to apply certain plugin settigns automatically while adding a new site.
*
* @param int $site_id Child site ID.
*
* @since Unknown
*/
do_action( 'mainwp_applypluginsettings_' . $ext_dir_slug, $site_id );
die( wp_json_encode( array( 'error' => esc_html__( 'Undefined error occurred. Please try again.', 'mainwp' ) ) ) );
}
/**
* Method save_note()
*
* Save Child Site Note.
*
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
* @uses \MainWP\Dashboard\MainWP_Utility::esc_content()
*/
public static function save_note() {
if ( isset( $_POST['websiteid'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
$website = MainWP_DB::instance()->get_website_by_id( intval( $_POST['websiteid'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
if ( MainWP_System_Utility::can_edit_website( $website ) ) {
$note = isset( $_POST['note'] ) ? wp_unslash( $_POST['note'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$esc_note = MainWP_Utility::esc_content( $note );
MainWP_DB_Common::instance()->update_note( $website->id, $esc_note );
die(
wp_json_encode(
array(
'result' => 'SUCCESS',
'esc_note_content' => $esc_note,
)
)
);
} else {
die( wp_json_encode( array( 'error' => esc_html__( 'Are you sure this is your website?', 'mainwp' ) ) ) );
}
}
die( wp_json_encode( array( 'undefined_error' => true ) ) );
}
/**
* Method remove_wp_site()
*
* Try to remove Child Site.
*
* @throws MainWP_Extra_Exception Error message.
*
* @param intt $site_id The Site ID.
*
* @return mixed result.
*/
public static function remove_wp_site( $site_id ) {
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( isset( $site_id ) ) {
$info = static::remove_website( intval( $site_id ) );
$error = is_array( $info ) && isset( $info['error'] ) ? $info['error'] : '';
if ( 'NOMAINWP' === $error ) {
$error = esc_html__( 'Be sure to deactivate the child plugin on the child site to avoid potential security issues.', 'mainwp' );
}
if ( '' !== $error ) {
throw new MainWP_Extra_Exception( 'mainwp_remove_site_error', $error ); //phpcs:ignore -- ok.
} elseif ( is_array( $info ) && isset( $info['deactivated'] ) ) {
$result = array( 'result' => 'success' );
} elseif ( is_array( $info ) && isset( $info['removed'] ) ) {
$result = array( 'result' => 'removed' );
} else {
throw new MainWP_Extra_Exception( 'mainwp_remove_site_error', esc_html__( 'Undefined error. Please try again.', 'mainwp' ) );
}
return $result;
}
return false;
}
/**
* Method remove_site()
*
* Try to remove Child Site.
*/
public static function remove_site() {
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( isset( $_POST['id'] ) ) {
$result = static::remove_website( intval( $_POST['id'] ) );
$error = is_array( $result ) && isset( $result['error'] ) ? $result['error'] : '';
if ( 'NOMAINWP' === $error ) {
$error = esc_html__( 'Be sure to deactivate the child plugin on the child site to avoid potential security issues.', 'mainwp' );
}
if ( '' !== $error ) {
die( wp_json_encode( array( 'error' => esc_html( $error ) ) ) );
} elseif ( is_array( $result ) && isset( $result['deactivated'] ) ) {
die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
} elseif ( is_array( $result ) && isset( $result['removed'] ) ) {
die( wp_json_encode( array( 'result' => 'REMOVED' ) ) );
} else {
die( wp_json_encode( array( 'undefined_error' => true ) ) );
}
}
// phpcs:enable
die( wp_json_encode( array( 'result' => 'NOSITE' ) ) );
}
/**
* Method handle remove_site()
*
* Try to remove Child Site.
*
* @param object|int $site object or Child site ID.
*
* @return mixed|false result
* @throws \MainWP_Exception Error message.
*
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
* @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
* @uses \MainWP\Dashboard\MainWP_System_Utility::get_icons_dir()
*/
public static function remove_website( $site ) { //phpcs:ignore -- NOSONAR - complex.
if ( is_numeric( $site ) ) {
$website = MainWP_DB::instance()->get_website_by_id( intval( $site ) );
} else {
$website = $site;
}
$information = array();
if ( MainWP_System_Utility::can_edit_website( $website ) ) {
$is_demo_wp = MainWP_Demo_Handle::get_instance()->is_demo_website( $website );
/**
* Deactive child plugin on live site only,
* DO NOT deactive child on staging site, it will deactive child plugin of source site.
*/
if ( ! $website->is_staging && ! $is_demo_wp ) {
try {
$information = MainWP_Connect::fetch_url_authed(
$website,
'deactivate',
);
} catch ( MainWP_Exception $e ) {
$information['error'] = $e->getMessage();
}
} else {
$information['removed'] = true;
}
// Delete icon file.
$favi = MainWP_DB::instance()->get_website_option( $website, 'favi_icon', '' );
if ( ! empty( $favi ) && ( false !== strpos( $favi, 'favi-' . $website->id . '-' ) ) ) {
MainWP_System_Utility::get_wp_file_system();
/**
* WordPress files system object.
*
* @global object
*/
global $wp_filesystem;
$dirs = MainWP_System_Utility::get_icons_dir();
if ( $wp_filesystem->exists( $dirs[0] . $favi ) ) {
$wp_filesystem->delete( $dirs[0] . $favi );
}
}
// Remove from DB.
MainWP_DB::instance()->remove_website( $website->id );
/**
* Delete Child Sites
*
* Fires after a child site has been removed from MainWP Dashboard
*
* @param object $website Object containing child site data.
*
* @since 3.4
*/
! $is_demo_wp && do_action( 'mainwp_delete_site', $website );
/**
* Fires immediately after a new website is deleted.
*
* @since 4.5.1.1
*
* @param object $website website data.
*/
! $is_demo_wp && do_action( 'mainwp_site_deleted', $website );
}
return $information ? $information : false;
}
/**
* Method update_child_site_value()
*
* Update Child Site ID.
*
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
*/
public static function update_child_site_value() {
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( isset( $_POST['site_id'] ) ) {
$website = MainWP_DB::instance()->get_website_by_id( intval( $_POST['site_id'] ) );
if ( MainWP_System_Utility::can_edit_website( $website ) ) {
$error = '';
$uniqueId = isset( $_POST['unique_id'] ) ? sanitize_text_field( wp_unslash( $_POST['unique_id'] ) ) : '';
try {
$information = MainWP_Connect::fetch_url_authed( $website, 'update_values', array( 'uniqueId' => $uniqueId ) );
} catch ( MainWP_Exception $e ) {
$error = $e->getMessage();
}
if ( '' !== $error ) {
die( wp_json_encode( array( 'error' => $error ) ) );
} elseif ( isset( $information['result'] ) && ( 'ok' === $information['result'] ) ) {
die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
} else {
die( wp_json_encode( array( 'undefined_error' => true ) ) );
}
}
}
// phpcs:enable
die( wp_json_encode( array( 'error' => 'NO_SIDE_ID' ) ) );
}
}