PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.2.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.2.1
6.2.3 6.2.2 6.2.1 6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 All 156 releases
← All changes | class/class-mainwp-post-site-handler.php +427 -371 4.6.0.1 → 6.2.1 View file →
@@ -6,8 +6,13 @@
6 6 */
7 7
8 8 namespace MainWP\Dashboard;
9 9
10 +// Exit if accessed directly.
11 +if ( ! defined( 'ABSPATH' ) ) {
12 + exit;
13 +}
14 +
10 15 /**
11 16 * Class MainWP_Post_Site_Handler
12 17 *
13 18 * @package MainWP\Dashboard
@@ -13,434 +18,485 @@
13 18 * @package MainWP\Dashboard
14 19 *
15 20 * @uses \MainWP\Dashboard\MainWP_Post_Base_Handler
16 21 */
17 -class MainWP_Post_Site_Handler extends MainWP_Post_Base_Handler {
22 +class MainWP_Post_Site_Handler extends MainWP_Post_Base_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
18 23
19 - /**
20 - * Private static variable to hold the single instance of the class.
21 - *
22 - * @static
23 - *
24 - * @var mixed Default null
25 - */
26 - private static $instance = null;
24 + /**
25 + * Private static variable to hold the single instance of the class.
26 + *
27 + * @static
28 + *
29 + * @var mixed Default null
30 + */
31 + private static $instance = null;
27 32
28 - /**
29 - * Method instance()
30 - *
31 - * Create MainWP Post Site Handler instance.
32 - *
33 - * @static
34 - * @return self $instance MainWP_Post_Site_Handler.
35 - */
36 - public static function instance() {
37 - if ( null === self::$instance ) {
38 - self::$instance = new self();
39 - }
40 - return self::$instance;
41 - }
33 + /**
34 + * Method instance()
35 + *
36 + * Create MainWP Post Site Handler instance.
37 + *
38 + * @static
39 + * @return self $instance MainWP_Post_Site_Handler.
40 + */
41 + public static function instance() {
42 + if ( null === static::$instance ) {
43 + static::$instance = new self();
44 + }
45 + return static::$instance;
46 + }
42 47
43 - /**
44 - * Init site actions
45 - */
46 - public function init() {
47 - // Page: ManageSites.
48 - $this->add_action( 'mainwp_checkwp', array( &$this, 'mainwp_checkwp' ) );
49 - $this->add_action( 'mainwp_addwp', array( &$this, 'mainwp_addwp' ) );
50 - $this->add_action( 'mainwp_get_site_icon', array( &$this, 'get_site_icon' ) );
51 - $this->add_action( 'mainwp_check_abandoned', array( &$this, 'check_abandoned' ) );
48 + /**
49 + * Init site actions
50 + */
51 + public function init() {
52 + // Page: ManageSites.
53 + $this->add_action( 'mainwp_checkwp', array( &$this, 'mainwp_checkwp' ) );
54 + $this->add_action( 'mainwp_addwp', array( &$this, 'mainwp_addwp' ) );
55 + $this->add_action( 'mainwp_get_site_icon', array( &$this, 'get_site_icon' ) );
56 + $this->add_action( 'mainwp_check_abandoned', array( &$this, 'check_abandoned' ) );
52 57
53 - if ( mainwp_current_user_have_right( 'dashboard', 'test_connection' ) ) {
54 - $this->add_action( 'mainwp_testwp', array( &$this, 'mainwp_testwp' ) );
55 - }
58 + if ( \mainwp_current_user_can( 'dashboard', 'test_connection' ) ) {
59 + $this->add_action( 'mainwp_testwp', array( &$this, 'mainwp_testwp' ) );
60 + }
56 61
57 - $this->add_action( 'mainwp_removesite', array( &$this, 'mainwp_removesite' ) );
58 - $this->add_action( 'mainwp_reconnectwp', array( &$this, 'mainwp_reconnectwp' ) );
59 - $this->add_action( 'mainwp_updatechildsite_value', array( &$this, 'mainwp_updatechildsite_value' ) );
62 + $this->add_action( 'mainwp_removesite', array( &$this, 'mainwp_removesite' ) );
63 + $this->add_action( 'mainwp_reconnectwp', array( &$this, 'mainwp_reconnectwp' ) );
64 + $this->add_action( 'mainwp_updatechildsite_value', array( &$this, 'mainwp_updatechildsite_value' ) );
60 65
61 - // Page: ManageGroups.
62 - $this->add_action( 'mainwp_group_rename', array( &$this, 'mainwp_group_rename' ) );
63 - $this->add_action( 'mainwp_group_delete', array( &$this, 'mainwp_group_delete' ) );
64 - $this->add_action( 'mainwp_group_add', array( &$this, 'mainwp_group_add' ) );
66 + // Page: ManageGroups.
67 + $this->add_action( 'mainwp_group_rename', array( &$this, 'mainwp_group_rename' ) );
68 + $this->add_action( 'mainwp_group_delete', array( &$this, 'mainwp_group_delete' ) );
69 + $this->add_action( 'mainwp_group_add', array( &$this, 'mainwp_group_add' ) );
65 70
66 - $this->add_action( 'mainwp_group_getsites', array( &$this, 'mainwp_group_getsites' ) );
67 - $this->add_action( 'mainwp_group_updategroup', array( &$this, 'mainwp_group_updategroup' ) );
71 + $this->add_action( 'mainwp_group_getsites', array( &$this, 'mainwp_group_getsites' ) );
72 + $this->add_action( 'mainwp_group_updategroup', array( &$this, 'mainwp_group_updategroup' ) );
68 73
69 - // Widget: RightNow.
70 - $this->add_action( 'mainwp_syncsites', array( &$this, 'mainwp_syncsites' ) );
74 + // Widget: RightNow.
75 + $this->add_action( 'mainwp_syncsites', array( &$this, 'mainwp_syncsites' ) );
71 76
72 - $this->add_action( 'mainwp_checksites', array( &$this, 'mainwp_checksites' ) );
73 - $this->add_action( 'mainwp_manage_sites_suspend_site', array( &$this, 'manage_suspend_site' ) );
74 - $this->add_action( 'mainwp_group_sites_add', array( &$this, 'ajax_group_sites_add' ) );
75 - }
77 + $this->add_action( 'mainwp_checksites', array( &$this, 'ajax_checksites' ) );
78 + $this->add_action( 'mainwp_manage_sites_suspend_site', array( &$this, 'manage_suspend_site' ) );
79 + $this->add_action( 'mainwp_group_sites_add', array( &$this, 'ajax_group_sites_add' ) );
80 + }
76 81
77 - /**
78 - * Method mainwp_group_rename()
79 - *
80 - * Rename Group.
81 - *
82 - * @uses \MainWP\Dashboard\MainWP_Manage_Groups::rename_group()
83 - */
84 - public function mainwp_group_rename() {
85 - $this->secure_request( 'mainwp_group_rename' );
82 + /**
83 + * Method mainwp_group_rename()
84 + *
85 + * Rename Group.
86 + *
87 + * @uses \MainWP\Dashboard\MainWP_Manage_Groups::rename_group()
88 + */
89 + public function mainwp_group_rename() {
90 + $this->secure_request( 'mainwp_group_rename' );
86 91
87 - MainWP_Manage_Groups::rename_group();
88 - }
92 + MainWP_Manage_Groups::rename_group();
93 + }
89 94
90 - /**
91 - * Method mainwp_group_delete()
92 - *
93 - * Delete Group.
94 - *
95 - * @uses \MainWP\Dashboard\MainWP_Manage_Groups::delete_group()
96 - */
97 - public function mainwp_group_delete() {
98 - $this->secure_request( 'mainwp_group_delete' );
95 + /**
96 + * Method mainwp_group_delete()
97 + *
98 + * Delete Group.
99 + *
100 + * @uses \MainWP\Dashboard\MainWP_Manage_Groups::delete_group()
101 + */
102 + public function mainwp_group_delete() {
103 + $this->secure_request( 'mainwp_group_delete' );
99 104
100 - MainWP_Manage_Groups::delete_group();
101 - }
105 + MainWP_Manage_Groups::delete_group();
106 + }
102 107
103 - /**
104 - * Method mainwp_group_add()
105 - *
106 - * Add Group.
107 - *
108 - * @uses \MainWP\Dashboard\MainWP_Manage_Groups::add_group()
109 - */
110 - public function mainwp_group_add() {
111 - $this->secure_request( 'mainwp_group_add' );
112 - MainWP_Manage_Groups::add_group();
113 - }
108 + /**
109 + * Method mainwp_group_add()
110 + *
111 + * Add Group.
112 + *
113 + * @uses \MainWP\Dashboard\MainWP_Manage_Groups::add_group()
114 + */
115 + public function mainwp_group_add() {
116 + $this->secure_request( 'mainwp_group_add' );
117 + MainWP_Manage_Groups::add_group();
118 + }
114 119
115 - /**
116 - * Method ajax_group_sites_add()
117 - *
118 - * Add Group in modal.
119 - */
120 - public function ajax_group_sites_add() {
121 - $this->secure_request( 'mainwp_group_sites_add' );
122 - // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
123 - $newName = isset( $_POST['newName'] ) ? sanitize_text_field( wp_unslash( $_POST['newName'] ) ) : '';
124 - $newColor = isset( $_POST['newColor'] ) ? sanitize_hex_color( wp_unslash( $_POST['newColor'] ) ) : '';
125 - if ( empty( $newColor ) && ! empty( $tmp_color ) ) {
126 - $newColor = '#cce2ff'; // default.
127 - }
128 - $selected_sites = isset( $_POST['selected_sites'] ) && is_array( $_POST['selected_sites'] ) ? array_map( 'intval', wp_unslash( $_POST['selected_sites'] ) ) : array();
129 - $selected_sites = array_filter( $selected_sites );
130 - // phpcs:enable
131 - $success = false;
132 - if ( ! empty( $newName ) ) {
133 - $success = MainWP_Manage_Groups::add_group_sites( $newName, $selected_sites, $newColor );
134 - }
135 - if ( ! $success ) {
136 - wp_die( wp_json_encode( array( 'error' => esc_html__( 'Unexpected error occurred. Please try again.', 'mainwp' ) ) ) );
137 - } else {
138 - wp_die( wp_json_encode( array( 'success' => 1 ) ) );
139 - }
140 - }
120 + /**
121 + * Method ajax_group_sites_add()
122 + *
123 + * Add Group in modal.
124 + */
125 + public function ajax_group_sites_add() {
126 + $this->secure_request( 'mainwp_group_sites_add' );
127 + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
128 + $newName = isset( $_POST['newName'] ) ? sanitize_text_field( wp_unslash( $_POST['newName'] ) ) : '';
129 + $newColor = isset( $_POST['newColor'] ) ? sanitize_hex_color( wp_unslash( $_POST['newColor'] ) ) : '';
130 + if ( empty( $newColor ) ) {
131 + $newColor = '#cce2ff'; // default.
132 + }
133 + $selected_sites = isset( $_POST['selected_sites'] ) && is_array( $_POST['selected_sites'] ) ? array_map( 'intval', wp_unslash( $_POST['selected_sites'] ) ) : array();
134 + $selected_sites = array_filter( $selected_sites );
135 + // phpcs:enable
136 + $success = false;
137 + if ( ! empty( $newName ) ) {
138 + $success = MainWP_Manage_Groups::add_group_sites( $newName, $selected_sites, $newColor );
139 + }
140 + if ( ! $success ) {
141 + wp_die( wp_json_encode( array( 'error' => esc_html__( 'Unexpected error occurred. Please try again.', 'mainwp' ) ) ) );
142 + } else {
143 + wp_die( wp_json_encode( array( 'success' => $success ) ) );
144 + }
145 + }
141 146
142 147
143 - /**
144 - * Method mainwp_group_getsites()
145 - *
146 - * Get Child Sites in group.
147 - *
148 - * @uses \MainWP\Dashboard\MainWP_Manage_Groups::get_sites()
149 - */
150 - public function mainwp_group_getsites() {
151 - $this->secure_request( 'mainwp_group_getsites' );
148 + /**
149 + * Method mainwp_group_getsites()
150 + *
151 + * Get Child Sites in group.
152 + */
153 + public function mainwp_group_getsites() {
152 154
153 - die( MainWP_Manage_Groups::get_sites() ); // phpcs:ignore WordPress.Security.EscapeOutput
154 - }
155 + $this->secure_request( 'mainwp_group_getsites' );
156 + //phpcs:disable WordPress.Security.NonceVerification.Missing
157 + $groupid = isset( $_POST['groupId'] ) && ! empty( $_POST['groupId'] ) ? intval( $_POST['groupId'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
158 + //phpcs:enable
155 159
156 - /**
157 - * Method mainwp_group_updategroup()
158 - *
159 - * Update Group.
160 - *
161 - * @uses \MainWP\Dashboard\MainWP_Manage_Groups::update_group()
162 - */
163 - public function mainwp_group_updategroup() {
164 - $this->secure_request( 'mainwp_group_updategroup' );
160 + if ( $groupid ) {
161 + $group = MainWP_DB_Common::instance()->get_group_by_id( $groupid );
162 + if ( ! empty( $group ) ) {
163 + $websites = MainWP_DB::instance()->get_websites_by_group_id( $group->id );
164 + $websiteIds = array();
165 + if ( ! empty( $websites ) ) {
166 + foreach ( $websites as $website ) {
167 + $websiteIds[] = $website->id;
168 + }
169 + }
165 170
166 - MainWP_Manage_Groups::update_group();
167 - }
171 + die( wp_json_encode( $websiteIds ) ); // phpcs:ignore WordPress.Security.EscapeOutput
172 + }
173 + }
174 + die( 'ERROR' );
175 + }
168 176
169 - /**
170 - * Method mainwp_checkwp()
171 - *
172 - * Check if WP can be added.
173 - *
174 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::check_site()
175 - */
176 - public function mainwp_checkwp() {
177 - $this->check_security( 'mainwp_checkwp', 'security' );
178 - MainWP_Manage_Sites_Handler::check_site();
179 - }
177 + /**
178 + * Method mainwp_group_updategroup()
179 + *
180 + * Update Group.
181 + *
182 + * @uses \MainWP\Dashboard\MainWP_Manage_Groups::update_group()
183 + */
184 + public function mainwp_group_updategroup() {
185 + $this->secure_request( 'mainwp_group_updategroup' );
180 186
181 - /**
182 - * Method mainwp_addwp()
183 - *
184 - * Add WP to the database.
185 - *
186 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::add_site()
187 - */
188 - public function mainwp_addwp() {
189 - $this->check_security( 'mainwp_addwp', 'security' );
190 - MainWP_Manage_Sites_Handler::add_site();
191 - }
187 + MainWP_Manage_Groups::update_group();
188 + }
192 189
193 - /**
194 - * Method get_site_icon()
195 - *
196 - * Get Child Site Favicon.
197 - *
198 - * @uses \MainWP\Dashboard\MainWP_Sync::get_wp_icon()
199 - */
200 - public function get_site_icon() {
201 - $this->check_security( 'mainwp_get_site_icon', 'security' );
202 - $siteId = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
203 - $result = MainWP_Sync::get_wp_icon( $siteId );
204 - wp_send_json( $result );
205 - }
190 + /**
191 + * Method mainwp_checkwp()
192 + *
193 + * Check if WP can be added.
194 + *
195 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::check_site()
196 + */
197 + public function mainwp_checkwp() {
198 + $this->check_security( 'mainwp_checkwp', 'security' );
199 + MainWP_Manage_Sites_Handler::check_site();
200 + }
206 201
207 - /**
208 - * Method check_abandoned()
209 - *
210 - * Check abandoned plugins or themes.
211 - */
212 - public function check_abandoned() {
213 - $this->check_security( 'mainwp_check_abandoned', 'security' );
214 - $siteId = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
215 - $which = isset( $_POST['which'] ) ? sanitize_text_field( wp_unslash( $_POST['which'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
216 - $result = MainWP_Utility::check_abandoned( $siteId, $which );
217 - wp_send_json( $result );
218 - }
202 + /**
203 + * Method mainwp_addwp()
204 + *
205 + * Add WP to the database.
206 + *
207 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::add_site()
208 + */
209 + public function mainwp_addwp() {
210 + $this->check_security( 'mainwp_addwp', 'security' );
211 + MainWP_Manage_Sites_Handler::add_site();
212 + }
219 213
220 - /**
221 - * Method mainwp_testwp()
222 - *
223 - * Test if Child Site can be reached.
224 - *
225 - * @uses \MainWP\Dashboard\MainWP_Connect::try_visit()
226 - * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
227 - * @uses \MainWP\Dashboard\MainWP_Utility::remove_http_prefix()
228 - */
229 - public function mainwp_testwp() { // phpcs:ignore -- complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
230 - $this->secure_request( 'mainwp_testwp' );
214 + /**
215 + * Method get_site_icon()
216 + *
217 + * Get Child Site Favicon.
218 + *
219 + * @uses \MainWP\Dashboard\MainWP_Sync::get_wp_icon()
220 + */
221 + public function get_site_icon() {
222 + $this->check_security( 'mainwp_get_site_icon', 'security' );
223 + $siteId = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
224 + $result = MainWP_Sync::get_wp_icon( $siteId );
225 + wp_send_json( $result );
226 + }
231 227
232 - $url = null;
233 - $name = null;
234 - $http_user = null;
235 - $http_pass = null;
236 - $verifyCertificate = 1;
237 - $sslVersion = 0;
228 + /**
229 + * Method check_abandoned()
230 + *
231 + * Check abandoned plugins or themes.
232 + */
233 + public function check_abandoned() {
234 + $this->check_security( 'mainwp_check_abandoned', 'security' );
235 + $siteId = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
236 + $which = isset( $_POST['which'] ) ? sanitize_text_field( wp_unslash( $_POST['which'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
237 + $result = MainWP_Utility::check_abandoned( $siteId, $which );
238 + wp_send_json( $result );
239 + }
238 240
239 - // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
240 - if ( isset( $_POST['url'] ) ) {
241 - $url = sanitize_text_field( wp_unslash( $_POST['url'] ) );
242 - $url = urldecode( $url );
241 + /**
242 + * Method mainwp_testwp()
243 + *
244 + * Test if Child Site can be reached.
245 + *
246 + * @uses \MainWP\Dashboard\MainWP_Connect::try_visit()
247 + * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
248 + * @uses \MainWP\Dashboard\MainWP_Utility::remove_http_prefix()
249 + */
250 + public function mainwp_testwp() { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
251 + $this->secure_request( 'mainwp_testwp' );
243 252
244 - $invalid = false;
245 - $info = wp_parse_url( $url );
253 + $url = null;
254 + $name = null;
255 + $http_user = null;
256 + $http_pass = null;
257 + $verifyCertificate = 1;
258 + $sslVersion = 0;
246 259
247 - $def_not_allow = array( 21, 22 ); // not allow ports 21, 22.
248 - $not_allow_ports = apply_filters( 'mainwp_connect_sites_not_allow_ports', $def_not_allow, $url );
260 + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
261 + if ( isset( $_POST['url'] ) ) {
262 + $url = sanitize_text_field( wp_unslash( $_POST['url'] ) );
263 + $url = urldecode( $url );
249 264
250 - if ( ! is_array( $not_allow_ports ) ) {
251 - $not_allow_ports = $def_not_allow;
252 - }
265 + $invalid = false;
266 + $info = wp_parse_url( $url );
253 267
254 - if ( is_array( $info ) && ! empty( $info['port'] ) && ( in_array( intval( $info['port'] ), $not_allow_ports, true ) ) ) {
255 - $invalid = true;
256 - }
268 + $def_not_allow = array( 21, 22 ); // not allow ports 21, 22.
269 + $not_allow_ports = apply_filters( 'mainwp_connect_sites_not_allow_ports', $def_not_allow, $url );
257 270
258 - $temp_url = MainWP_Utility::remove_http_prefix( $url, true );
271 + if ( ! is_array( $not_allow_ports ) ) {
272 + $not_allow_ports = $def_not_allow;
273 + }
259 274
260 - if ( $invalid || false !== strpos( $url, '?=' ) ) {
261 - die( wp_json_encode( array( 'error' => esc_html__( 'Invalid URL.', 'mainwp' ) ) ) );
262 - }
275 + if ( is_array( $info ) && ! empty( $info['port'] ) && ( in_array( intval( $info['port'] ), $not_allow_ports, true ) ) ) {
276 + $invalid = true;
277 + }
263 278
264 - if ( strpos( $temp_url, ':' ) ) {
265 - $invalid = true;
266 - $allow_ports = apply_filters( 'mainwp_connect_sites_allow_ports', array(), $url );
267 - if ( ! empty( $allow_ports ) && is_array( $allow_ports ) ) {
268 - if ( is_array( $info ) && ! empty( $info['port'] ) && ( in_array( intval( $info['port'] ), $allow_ports, true ) ) ) {
269 - $invalid = false;
270 - }
271 - }
272 - if ( $invalid ) {
273 - die( wp_json_encode( array( 'error' => esc_html__( 'Invalid URL.', 'mainwp' ) ) ) );
274 - }
275 - }
279 + $temp_url = MainWP_Utility::remove_http_prefix( $url, true );
276 280
277 - $verifyCertificate = isset( $_POST['test_verify_cert'] ) ? intval( $_POST['test_verify_cert'] ) : 1;
278 - $forceUseIPv4 = apply_filters( 'mainwp_manage_sites_force_use_ipv4', false, $url );
279 - $sslVersion = isset( $_POST['ssl_version'] ) ? intval( $_POST['ssl_version'] ) : 0;
280 - $http_user = isset( $_POST['http_user'] ) ? sanitize_text_field( wp_unslash( $_POST['http_user'] ) ) : '';
281 - $http_pass = isset( $_POST['http_pass'] ) ? wp_unslash( $_POST['http_pass'] ) : '';
281 + if ( $invalid || false !== strpos( $url, '?=' ) ) {
282 + die( wp_json_encode( array( 'error' => esc_html__( 'Invalid URL.', 'mainwp' ) ) ) );
283 + }
282 284
283 - } elseif ( isset( $_POST['siteid'] ) ) {
284 - $website = MainWP_DB::instance()->get_website_by_id( intval( $_POST['siteid'] ) );
285 - if ( $website ) {
286 - $url = $website->url;
287 - $name = $website->name;
288 - $verifyCertificate = (int) $website->verify_certificate;
289 - $forceUseIPv4 = $website->force_use_ipv4;
290 - $sslVersion = $website->ssl_version;
291 - $http_user = $website->http_user;
292 - $http_pass = $website->http_pass;
293 - }
294 - }
295 - // phpcs:enable
285 + if ( strpos( $temp_url, ':' ) ) {
286 + $invalid = true;
287 + $allow_ports = apply_filters( 'mainwp_connect_sites_allow_ports', array(), $url );
288 + if ( ! empty( $allow_ports ) && is_array( $allow_ports ) && is_array( $info ) && ! empty( $info['port'] ) && ( in_array( intval( $info['port'] ), $allow_ports, true ) ) ) {
289 + $invalid = false;
290 + }
291 + if ( $invalid ) {
292 + die( wp_json_encode( array( 'error' => esc_html__( 'Invalid URL.', 'mainwp' ) ) ) );
293 + }
294 + }
296 295
297 - $ssl_verifyhost = false;
296 + $verifyCertificate = isset( $_POST['test_verify_cert'] ) ? intval( $_POST['test_verify_cert'] ) : 1;
297 + $forceUseIPv4 = apply_filters( 'mainwp_manage_sites_force_use_ipv4', false, $url );
298 + $sslVersion = isset( $_POST['ssl_version'] ) ? intval( $_POST['ssl_version'] ) : 0;
299 + $http_user = isset( $_POST['http_user'] ) ? sanitize_text_field( wp_unslash( $_POST['http_user'] ) ) : '';
300 + $http_pass = isset( $_POST['http_pass'] ) ? wp_unslash( $_POST['http_pass'] ) : '';
298 301
299 - if ( 1 === $verifyCertificate ) {
300 - $ssl_verifyhost = true;
301 - } elseif ( 2 === $verifyCertificate ) {
302 - if ( ( ( false === get_option( 'mainwp_sslVerifyCertificate' ) ) || ( 1 === (int) get_option( 'mainwp_sslVerifyCertificate' ) ) ) ) {
303 - $ssl_verifyhost = true;
304 - }
305 - }
302 + } elseif ( isset( $_POST['siteid'] ) ) {
303 + $website = MainWP_DB::instance()->get_website_by_id( intval( $_POST['siteid'] ) );
304 + if ( $website ) {
305 + $url = $website->url;
306 + $name = $website->name;
307 + $verifyCertificate = (int) $website->verify_certificate;
308 + $forceUseIPv4 = $website->force_use_ipv4;
309 + $sslVersion = $website->ssl_version;
310 + // MWP-1548: decrypt at the boundary so the reconnect /
311 + // try_visit call below uses plaintext credentials.
312 + $http_user = MainWP_Credential_Storage::decrypt_credential( $website->http_user );
313 + $http_pass = MainWP_Credential_Storage::decrypt_credential( $website->http_pass );
314 + }
315 + }
316 + // phpcs:enable
306 317
307 - $rslt = MainWP_Connect::try_visit( $url, $ssl_verifyhost, $http_user, $http_pass, $sslVersion, $forceUseIPv4 );
318 + $ssl_verifyhost = false;
308 319
309 - if ( isset( $rslt['error'] ) && ( '' !== $rslt['error'] ) && ( 'wp-admin/' !== substr( $url, - 9 ) ) ) {
310 - if ( substr( $url, - 1 ) !== '/' ) {
311 - $url .= '/';
312 - }
313 - $url .= 'wp-admin/';
314 - $newrslt = MainWP_Connect::try_visit( $url, $ssl_verifyhost, $http_user, $http_pass, $sslVersion, $forceUseIPv4 );
315 - if ( isset( $newrslt['error'] ) && ( '' !== $rslt['error'] ) ) {
316 - $rslt = $newrslt;
317 - }
318 - }
320 + if ( 1 === $verifyCertificate ) {
321 + $ssl_verifyhost = true;
322 + } elseif ( 2 === $verifyCertificate ) {
323 + if ( ( false === get_option( 'mainwp_sslVerifyCertificate' ) ) || ( 1 === (int) get_option( 'mainwp_sslVerifyCertificate' ) ) ) {
324 + $ssl_verifyhost = true;
325 + }
326 + }
319 327
320 - if ( null !== $name ) {
321 - $rslt['sitename'] = esc_html( $name );
322 - }
328 + $rslt = MainWP_Connect::try_visit( $url, $ssl_verifyhost, $http_user, $http_pass, $sslVersion, $forceUseIPv4 );
323 329
324 - wp_send_json( $rslt );
325 - }
330 + if ( isset( $rslt['error'] ) && ( '' !== $rslt['error'] ) && ( 'wp-admin/' !== substr( $url, - 9 ) ) ) {
331 + if ( substr( $url, - 1 ) !== '/' ) {
332 + $url .= '/';
333 + }
334 + $url .= 'wp-admin/';
335 + $newrslt = MainWP_Connect::try_visit( $url, $ssl_verifyhost, $http_user, $http_pass, $sslVersion, $forceUseIPv4 );
336 + if ( isset( $newrslt['error'] ) && ( '' !== $rslt['error'] ) ) {
337 + $rslt = $newrslt;
338 + }
339 + }
326 340
327 - /**
328 - * Method mainwp_removesite()
329 - *
330 - * Remove a website from MainWP.
331 - *
332 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::remove_site()
333 - */
334 - public function mainwp_removesite() {
335 - if ( ! mainwp_current_user_have_right( 'dashboard', 'delete_sites' ) ) {
336 - die( wp_json_encode( array( 'error' => mainwp_do_not_have_permissions( esc_html__( 'delete sites', 'mainwp' ), false ) ) ) );
337 - }
341 + if ( null !== $name ) {
342 + $rslt['sitename'] = esc_html( $name );
343 + }
338 344
339 - $this->secure_request( 'mainwp_removesite' );
345 + wp_send_json( $rslt );
346 + }
340 347
341 - MainWP_Manage_Sites_Handler::remove_site();
342 - }
348 + /**
349 + * Method mainwp_removesite()
350 + *
351 + * Remove a website from MainWP.
352 + *
353 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::remove_site()
354 + */
355 + public function mainwp_removesite() {
356 + if ( ! \mainwp_current_user_can( 'dashboard', 'delete_sites' ) ) {
357 + die( wp_json_encode( array( 'error' => \mainwp_do_not_have_permissions( esc_html__( 'delete sites', 'mainwp' ), false ) ) ) );
358 + }
343 359
344 - /**
345 - * Method mainwp_reconnectwp()
346 - *
347 - * Reconnect to Child Site.
348 - *
349 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::reconnect_site()
350 - */
351 - public function mainwp_reconnectwp() {
352 - $this->secure_request( 'mainwp_reconnectwp' );
360 + $this->secure_request( 'mainwp_removesite' );
353 361
354 - MainWP_Manage_Sites_Handler::reconnect_site();
355 - }
362 + static::invalidate_warm_cache();
356 363
357 - /**
358 - * Method mainwp_updatechildsite_value()
359 - *
360 - * Update Child Site value.
361 - *
362 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::update_child_site_value()
363 - */
364 - public function mainwp_updatechildsite_value() {
365 - $this->secure_request( 'mainwp_updatechildsite_value' );
364 + MainWP_Manage_Sites_Handler::remove_site();
365 + }
366 366
367 - MainWP_Manage_Sites_Handler::update_child_site_value();
368 - }
369 367
370 - /**
371 - * Method mainwp_syncsites()
372 - *
373 - * Sync Child Sites.
374 - *
375 - * @uses \MainWP\Dashboard\MainWP_Updates_Overview::dismiss_sync_errors()
376 - */
377 - public function mainwp_syncsites() {
378 - $this->secure_request( 'mainwp_syncsites' );
379 - MainWP_Updates_Overview::dismiss_sync_errors( false );
368 + /**
369 + * Method invalidate_warm_cache()
370 + */
371 + public static function invalidate_warm_cache() {
372 + MainWP_Cache_Warm_Helper::invalidate_manage_pages( array( 'managesites', 'mainwp_tab' ) );
373 + }
380 374
381 - $website = null;
382 - $wp_id = isset( $_POST['wp_id'] ) ? intval( $_POST['wp_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
383 - if ( $wp_id ) {
384 - $website = MainWP_DB::instance()->get_website_by_id( $wp_id );
385 - }
375 + /**
376 + * Method mainwp_reconnectwp()
377 + *
378 + * Reconnect to Child Site.
379 + *
380 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::reconnect_site()
381 + */
382 + public function mainwp_reconnectwp() {
383 + $this->secure_request( 'mainwp_reconnectwp' );
386 384
387 - if ( null === $website ) {
388 - die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) );
389 - }
385 + MainWP_Manage_Sites_Handler::reconnect_site();
386 + }
390 387
391 - if ( MainWP_Sync::sync_website( $website ) ) {
392 - die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
393 - }
388 + /**
389 + * Method mainwp_updatechildsite_value()
390 + *
391 + * Update Child Site value.
392 + *
393 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::update_child_site_value()
394 + */
395 + public function mainwp_updatechildsite_value() {
396 + $this->secure_request( 'mainwp_updatechildsite_value' );
394 397
395 - $website = MainWP_DB::instance()->get_website_by_id( $website->id );
398 + MainWP_Manage_Sites_Handler::update_child_site_value();
399 + }
396 400
397 - die( wp_json_encode( array( 'error' => esc_html( wp_strip_all_tags( $website->sync_errors ) ) ) ) );
398 - }
401 + /**
402 + * Method mainwp_syncsites()
403 + *
404 + * Sync Child Sites.
405 + *
406 + * @uses \MainWP\Dashboard\MainWP_Updates_Overview::dismiss_sync_errors()
407 + */
408 + public function mainwp_syncsites() {
409 + $this->secure_request( 'mainwp_syncsites' );
410 + MainWP_Updates_Overview::dismiss_sync_errors( false );
399 411
400 - /**
401 - * Method mainwp_checksites()
402 - *
403 - * Check Child Sites.
404 - *
405 - * @uses \MainWP\Dashboard\MainWP_Monitoring_Handler::ajax_check_status_site()
406 - */
407 - public function mainwp_checksites() {
408 - $this->secure_request( 'mainwp_checksites' );
409 - MainWP_Monitoring_Handler::ajax_check_status_site();
410 - }
412 + $website = null;
413 + $wp_id = isset( $_POST['wp_id'] ) ? intval( $_POST['wp_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
414 + if ( $wp_id ) {
415 + $website = MainWP_DB::instance()->get_website_by_id( $wp_id );
416 + }
411 417
412 - /**
413 - * Method mainwp_manage_sites_suspend_site()
414 - *
415 - * Check Child Sites.
416 - *
417 - * @uses \MainWP\Dashboard\MainWP_Sync::get_wp_icon()
418 - */
419 - public function manage_suspend_site() {
420 - $this->secure_request( 'mainwp_manage_sites_suspend_site' );
421 - $siteId = isset( $_POST['siteid'] ) ? intval( $_POST['siteid'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
422 - $suspended = isset( $_POST['suspended'] ) && '1' === $_POST['suspended'] ? 1 : 0; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
423 - $newValues = array(
424 - 'suspended' => $suspended,
425 - );
418 + if ( null === $website ) {
419 + die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) );
420 + }
426 421
427 - if ( $siteId ) {
428 - $website = MainWP_DB::instance()->get_website_by_id( $siteId );
429 - if ( $website && $website->suspended != $suspended ) { //phpcs:ignore -- to valid.
430 - MainWP_DB::instance()->update_website_values( $siteId, $newValues );
431 - /**
432 - * Fires immediately after website suspended/unsuspend.
433 - *
434 - * @since 4.5.1.1
435 - *
436 - * @param object $website website data.
437 - * @param int $suspended The new suspended value.
438 - */
439 - do_action( 'mainwp_site_suspended', $website, $suspended );
440 - }
441 - wp_send_json( array( 'result' => 'success' ) );
442 - } else {
443 - wp_send_json( array( 'error' => 'Error: site id empty' ) );
444 - }
445 - }
422 + if ( MainWP_Sync::sync_website( $website ) ) {
423 + $website = MainWP_DB::instance()->get_website_by_id( $website->id ); // reload.
424 + /**
425 + * Fires immediately after website synced successfully.
426 + *
427 + * @since 4.6
428 + *
429 + * @param object $website website data.
430 + */
431 + do_action( 'mainwp_after_sync_site_success', $website );
432 + die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
433 + }
434 +
435 + $website = MainWP_DB::instance()->get_website_by_id( $website->id );
436 +
437 + die( wp_json_encode( array( 'error' => esc_html( wp_strip_all_tags( $website->sync_errors ) ) ) ) );
438 + }
439 +
440 + /**
441 + * Method ajax_checksites()
442 + *
443 + * Check Child Sites.
444 + */
445 + public function ajax_checksites() {
446 + $this->secure_request( 'mainwp_checksites' );
447 +
448 + $website = null;
449 + if ( isset( $_POST['wp_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
450 + $website = MainWP_DB::instance()->get_website_by_id( intval( $_POST['wp_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
451 + }
452 +
453 + if ( null === $website ) {
454 + die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) );
455 + }
456 +
457 + MainWP_Utility::end_session();
458 + $result = MainWP_Monitoring_Handler::handle_check_website( $website );
459 + MainWP_Utility::end_session();
460 +
461 + if ( is_array( $result ) ) {
462 + die( wp_json_encode( array( 'result' => 'success' ) ) );
463 + } else {
464 + die( wp_json_encode( array( 'error' => esc_html__( 'Request failed. Please, try again.', 'mainwp' ) ) ) );
465 + }
466 + }
467 +
468 + /**
469 + * Method mainwp_manage_sites_suspend_site()
470 + *
471 + * Check Child Sites.
472 + *
473 + * @uses \MainWP\Dashboard\MainWP_Sync::get_wp_icon()
474 + */
475 + public function manage_suspend_site() {
476 + $this->secure_request( 'mainwp_manage_sites_suspend_site' );
477 + $siteId = isset( $_POST['siteid'] ) ? intval( $_POST['siteid'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
478 + $suspended = isset( $_POST['suspended'] ) && '1' === $_POST['suspended'] ? 1 : 0; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
479 + $newValues = array(
480 + 'suspended' => $suspended,
481 + );
482 +
483 + if ( $siteId ) {
484 + $website = MainWP_DB::instance()->get_website_by_id( $siteId );
485 + if ( $website && $website->suspended != $suspended ) { //phpcs:ignore -- to valid.
486 + MainWP_DB::instance()->update_website_values( $siteId, $newValues );
487 + /**
488 + * Fires immediately after website suspended/unsuspend.
489 + *
490 + * @since 4.5.1.1
491 + *
492 + * @param object $website website data.
493 + * @param int $suspended The new suspended value.
494 + */
495 + do_action( 'mainwp_site_suspended', $website, $suspended );
496 + }
497 + wp_send_json( array( 'result' => 'success' ) );
498 + } else {
499 + wp_send_json( array( 'error' => 'Error: site id empty' ) );
500 + }
501 + }
446 502 }