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 | widgets/widget-mainwp-security-issues-widget.php +264 -201 4.6.0.1 → 6.2.1 View file →
@@ -8,223 +8,286 @@
8 8 */
9 9
10 10 namespace MainWP\Dashboard;
11 11
12 +// Exit if accessed directly.
13 +if ( ! defined( 'ABSPATH' ) ) {
14 + exit;
15 +}
16 +
12 17 /**
13 18 * Class MainWP_Security_Issues_Widget
14 19 *
15 20 * Detect security issues on CHild Sites & Build Widget.
16 21 */
17 -class MainWP_Security_Issues_Widget {
22 +class MainWP_Security_Issues_Widget { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
18 23
19 - /**
20 - * Method get_class_name()
21 - *
22 - * @return string __CLASS__ Class Name
23 - */
24 - public static function get_class_name() {
25 - return __CLASS__;
26 - }
24 + /**
25 + * Method get_class_name()
26 + *
27 + * @return string __CLASS__ Class Name
28 + */
29 + public static function get_class_name() {
30 + return __CLASS__;
31 + }
27 32
28 - /**
29 - * Method render_widget()
30 - *
31 - * Fetch Child Site issues from db & build widget.
32 - *
33 - * @uses \MainWP\Dashboard\MainWP_DB::query()
34 - * @uses \MainWP\Dashboard\MainWP_DB::get_sql_website_by_id()
35 - * @uses \MainWP\Dashboard\MainWP_DB::get_sql_search_websites_for_current_user()
36 - * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
37 - * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
38 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
39 - * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
40 - */
41 - public static function render_widget() {
42 - $current_wpid = MainWP_System_Utility::get_current_wpid();
33 + /**
34 + * Method render_widget()
35 + *
36 + * Fetch Child Site issues from db & build widget.
37 + *
38 + * @uses \MainWP\Dashboard\MainWP_DB::query()
39 + * @uses \MainWP\Dashboard\MainWP_DB::get_sql_website_by_id()
40 + * @uses \MainWP\Dashboard\MainWP_DB::get_sql_search_websites_for_current_user()
41 + * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
42 + * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
43 + * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
44 + * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
45 + */
46 + public static function render_widget() {
47 + $current_wpid = MainWP_System_Utility::get_current_wpid();
43 48
44 - if ( $current_wpid ) {
45 - $sql = MainWP_DB::instance()->get_sql_website_by_id( $current_wpid );
46 - } else {
47 - $sql = MainWP_DB::instance()->get_sql_websites_for_current_user();
48 - }
49 + if ( $current_wpid ) {
50 + $sql = MainWP_DB::instance()->get_sql_website_by_id( $current_wpid );
51 + $websites = MainWP_DB::instance()->query( $sql );
52 + } else {
53 + $wpsite_fields = array( 'id', 'name', 'url', 'securityIssues' );
54 + $websites = MainWP_DB::instance()->query(
55 + MainWP_DB::instance()->get_sql_websites_for_current_user_by_params(
56 + array(
57 + 'select_wp_fields' => $wpsite_fields,
58 + 'others_fields' => array(),
59 + 'view' => 'custom_view',
60 + )
61 + )
62 + );
63 + }
49 64
50 - $websites = MainWP_DB::instance()->query( $sql );
65 + $total_securityIssues = 0;
51 66
52 - $total_securityIssues = 0;
67 + MainWP_DB::data_seek( $websites, 0 );
68 + while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
69 + if ( MainWP_Utility::ctype_digit( $website->securityIssues ) ) {
70 + $total_securityIssues += $website->securityIssues;
71 + }
72 + }
53 73
54 - MainWP_DB::data_seek( $websites, 0 );
55 - while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
56 - if ( MainWP_Utility::ctype_digit( $website->securityIssues ) ) {
57 - $total_securityIssues += $website->securityIssues;
58 - }
59 - }
74 + static::render_issues( $websites, $total_securityIssues, $current_wpid );
75 + }
60 76
61 - self::render_issues( $websites, $total_securityIssues );
62 - }
77 + /**
78 + *
79 + * Method render_html_widget().
80 + *
81 + * Render html themes widget for current site
82 + *
83 + * @param mixed $websites Array of websites.
84 + * @param mixed $total_securityIssues Total security Issues.
85 + * @param int $current_wpid current wpid.
86 + *
87 + * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
88 + * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
89 + */
90 + public static function render_issues( $websites, $total_securityIssues, $current_wpid ) { // phpcs:ignore -- NOSONAR - complex.
91 + $is_demo = MainWP_Demo_Handle::is_demo_mode();
92 + ?>
93 + <div class="mainwp-widget-header">
94 + <div class="ui grid">
95 + <div class="fourteen wide column">
96 + <h2 class="ui header handle-drag">
97 + <?php
98 + /**
99 + * Filter: mainwp_security_issues_widget_title
100 + *
101 + * Filters the Security Issues widget title text.
102 + *
103 + * @since 4.1
104 + */
105 + echo esc_html( apply_filters( 'mainwp_security_issues_widget_title', esc_html__( 'Site Hardening', 'mainwp' ) ) );
106 + ?>
107 + <div class="sub header"><?php esc_html_e( 'Identify weak spots to boost site hardening.', 'mainwp' ); ?></div>
108 + </h2>
109 + </div>
63 110
64 - /**
65 - *
66 - * Method render_html_widget().
67 - *
68 - * Render html themes widget for current site
69 - *
70 - * @param mixed $websites Array of websites.
71 - * @param mixed $total_securityIssues Total security Issues.
72 - *
73 - * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
74 - * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
75 - */
76 - public static function render_issues( $websites, $total_securityIssues ) {
77 - $is_demo = MainWP_Demo_Handle::is_demo_mode();
78 - ?>
79 - <div class="mainwp-widget-header">
80 - <h3 class="ui header handle-drag">
81 - <?php
82 - /**
83 - * Filter: mainwp_security_issues_widget_title
84 - *
85 - * Filters the Security Issues widget title text.
86 - *
87 - * @since 4.1
88 - */
89 - echo esc_html( apply_filters( 'mainwp_security_issues_widget_title', esc_html__( 'Security Issues', 'mainwp' ) ) );
90 - ?>
91 - <div class="sub header"><?php esc_html_e( 'Detected security issues', 'mainwp' ); ?></div>
92 - </h3>
93 - </div>
111 + <div class="two wide column right aligned">
112 + <div id="widget-security-issues-dropdown-selector" class="ui dropdown top right tiny pointing not-auto-init mainwp-dropdown-tab">
113 + <i class="vertical ellipsis icon"></i>
114 + <div class="menu">
115 + <a href="javascript:void(0)" class="item" data-value="show"><?php esc_html_e( 'Show All', 'mainwp' ); ?></a>
116 + <a href="javascript:void(0)" class="item" data-value="issues"><?php esc_html_e( 'Show Issues', 'mainwp' ); ?></a>
117 + <a href="javascript:void(0)" class="item" data-value="hide"><?php esc_html_e( 'Hide All', 'mainwp' ); ?></a>
118 + </div>
119 + </div>
120 + </div>
121 + </div>
122 + <div class="ui cards">
123 + <div class="ui fluid small card">
124 + <div class="content">
125 + <div class="header">
126 + <span class="ui large text"><i class="shield alternate icon"></i> <?php echo intval( $total_securityIssues ); ?></span>
127 + </div>
128 + <div class="description">
129 + <strong><?php echo esc_html( _n( 'Recommendation', 'Recommendations', $total_securityIssues, 'mainwp' ) ); ?></strong>
130 + </div>
131 + </div>
132 + </div>
133 + </div>
134 + <script type="text/javascript">
94 135
95 - <?php
96 - /**
97 - * Action: mainwp_security_issues_widget_top
98 - *
99 - * Fires at the bottom of the Security Issues widget.
100 - *
101 - * @since 4.1
102 - */
103 - do_action( 'mainwp_security_issues_widget_top' );
104 - if ( $total_securityIssues > 0 ) {
105 - ?>
106 - <div class="ui two columns grid">
107 - <div class="column">
108 - <div class="ui horizontal statistics">
109 - <div class="statistic" style="margin: 0px;">
110 - <div class="value">
111 - <?php echo intval( $total_securityIssues ); ?>
112 - </div>
113 - <div class="label">
114 - <?php echo esc_html( _n( 'Security Issue Detected', 'Security Issues Detected', $total_securityIssues, 'mainwp' ) ); ?>
115 - </div>
116 - </div>
117 - </div>
118 - </div>
119 - <div class="right aligned middle aligned column">
120 - <a href="#" class="ui button mini basic" id="show-security-issues-widget-list" data-tooltip="<?php esc_attr_e( 'Click here to see the list of all sites and detected security issues.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
121 - <a href="#" class="<?php echo $is_demo ? 'disabled' : ''; ?> fix-all-security-issues ui button mini green" id="show-security-issues-widget-list" data-tooltip="<?php esc_attr_e( 'Clicking this buttin will resolve all detected security issue on all your child sites.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Fix All Issues', 'mainwp' ); ?></a>
136 + jQuery( document ).ready( function () {
137 + let curTab = mainwp_ui_state_load('security-widget-issues');
138 + curTab = ['hide', 'issues', 'show' ].includes(curTab) ? curTab : 'show';
139 + _showhide_issues(curTab);
140 + let $issuesSelect = jQuery( '#widget-security-issues-dropdown-selector' ).dropdown( {
141 + onChange: function( value ) {
142 + mainwp_ui_state_save('security-widget-issues', value);
143 + _showhide_issues(value);
144 + }
145 + } ).dropdown("set selected", curTab);
146 + } );
122 147
123 - </div>
124 - </div>
148 + const _showhide_issues = function(value){
149 + if('hide' === value ){
150 + jQuery('#mainwp-security-issues-widget-list').hide();
151 + } else {
152 + jQuery('#mainwp-security-issues-widget-list').fadeIn(1000);
153 + }
154 + if('issues' === value){
155 + jQuery('#mainwp-security-issues-widget-list').fadeIn(1000);
156 + jQuery('#mainwp-security-issues-widget-list > .item').show();
157 + jQuery('#mainwp-security-issues-widget-list > .item[count-issues=0]').hide();
158 + } else if('show' === value){
159 + jQuery('#mainwp-security-issues-widget-list').fadeIn(1000);
160 + jQuery('#mainwp-security-issues-widget-list > .item').fadeIn(1000);
161 + } else {
162 + jQuery('#mainwp-security-issues-widget-list').hide();
163 + }
164 + }
165 + </script>
166 + <?php
167 + /**
168 + * Action: mainwp_security_issues_widget_top
169 + *
170 + * Fires at the bottom of the Security Issues widget.
171 + *
172 + * @since 4.1
173 + */
174 + do_action( 'mainwp_security_issues_widget_top' );
175 + ?>
125 176
126 - <div class="mainwp-scrolly-overflow">
127 - <div id="mainwp-security-issues-widget-list" class="ui middle aligned divided selection list" style="display: none;">
128 - <?php
129 - $count_security_issues = '';
130 - MainWP_DB::data_seek( $websites, 0 );
131 - while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
132 - if ( '[]' === $website->securityIssues ) {
133 - $count_security_issues = '';
134 - } else {
135 - $count_security_issues = intval( $website->securityIssues );
136 - }
177 + </div>
178 + <?php
179 + /**
180 + * Action: mainwp_security_issues_widget_top
181 + *
182 + * Fires at the bottom of the Security Issues widget.
183 + *
184 + * @since 4.1
185 + */
186 + do_action( 'mainwp_security_issues_widget_top' );
187 + ?>
137 188
138 - ?>
139 - <div class="item" <?php echo '' !== $count_security_issues && $count_security_issues > 0 ? 'status="queue"' : ''; ?> siteid="<?php echo intval( $website->id ); ?>">
140 - <div class="ui grid stackable">
141 - <div class="eight wide middle aligned column">
142 - <a href="
143 - <?php
144 - /**
145 - * Filter: mainwp_security_issues_list_item_title_url
146 - *
147 - * Filters the Security Issues widget list item title URL.
148 - *
149 - * @since 4.1
150 - */
151 - echo esc_url( apply_filters( 'mainwp_security_issues_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
152 - ?>
153 - ">
154 - <?php
155 - /**
156 - * Filter: mainwp_security_issues_list_item_title
157 - *
158 - * Filters the Security Issues widget list item title text.
159 - *
160 - * @since 4.1
161 - */
162 - echo esc_attr( stripslashes( apply_filters( 'mainwp_security_issues_list_item_title', $website->name, $website ) ) );
163 - ?>
164 - </a>
165 - </div>
166 - <div class="five wide middle aligned column">
167 - <?php if ( 0 === $count_security_issues ) : ?>
168 - <span class="ui green small empty circular label"></span> <span class="ui small text"><?php esc_html_e( 'No issues detected', 'mainwp' ); ?></span>
169 - <?php elseif ( '' === $count_security_issues ) : ?>
170 - <span class="ui grey small empty circular label"></span> <span class="ui small text"><?php esc_html_e( 'No data available', 'mainwp' ); ?></span>
171 - <?php else : ?>
172 - <span class="ui red small empty circular label"></span> <span class="ui small text"><?php echo esc_html( $count_security_issues ); ?> <?php echo esc_html( _n( 'issue detected', 'issues detected', $count_security_issues, 'mainwp' ) ); ?></span>
173 - <?php endif; ?>
174 - </div>
175 - <?php
176 - /**
177 - * Action: mainwp_security_issues_list_item_column
178 - *
179 - * Fires before the last (actions) colum in the security issues list.
180 - *
181 - * Preferred HTML structure:
182 - *
183 - * <div class="column middle aligned">
184 - * Your content here!
185 - * </div>
186 - *
187 - * @param object $website Object containing the child site info.
188 - *
189 - * @since 4.1
190 - */
191 - do_action( 'mainwp_security_issues_list_item_column', $website );
192 - ?>
193 - <div class="three wide middle aligned column">
194 - <div class="ui mini icon fluid buttons">
195 - <a href="admin.php?page=managesites&scanid=<?php echo esc_attr( $website->id ); ?>" class="ui button basic" data-tooltip="<?php esc_attr_e( 'Click here to see details.', 'mainwp' ); ?>" data-position="left center" data-inverted=""><i class="info icon"></i></a>
196 - <?php if ( empty( $count_security_issues ) ) { ?>
197 - <a href="javascript:void(0)" class="<?php echo $is_demo ? 'disabled' : ''; ?> unfix-all-site-security-issues ui button basic green" data-position="left center" data-tooltip="<?php esc_attr_e( 'Click here to unfix all security issues on the child site.', 'mainwp' ); ?>" data-inverted=""><i class="undo alternate icon"></i></a>
198 - <?php } else { ?>
199 - <a href="javascript:void(0)" class="<?php echo $is_demo ? 'disabled' : ''; ?> fix-all-site-security-issues ui button green" data-position="left center" data-tooltip="<?php esc_attr_e( 'Click here to fix all security issues on the child site.', 'mainwp' ); ?>" data-inverted=""><i class="wrench icon"></i></a>
200 - <?php } ?>
201 - </div>
202 - </div>
203 - </div>
204 - </div>
205 - <?php } ?>
206 - </div>
207 - </div>
208 - <div class="ui active inverted dimmer" style="display:none" id="mainwp-secuirty-issues-loader"><div class="ui text loader"><?php esc_html_e( 'Please wait...', 'mainwp' ); ?></div></div>
209 - <?php
210 - } else {
211 - ?>
212 - <h2 class="ui icon header">
213 - <i class="thumbs up outline icon"></i>
214 - <div class="content">
215 - <?php esc_html_e( 'Well done!', 'mainwp' ); ?>
216 - <div class="sub header"><?php esc_html_e( 'No security issues detected!', 'mainwp' ); ?></div>
217 - </div>
218 - </h2>
219 - <?php
220 - }
221 - /**
222 - * Action: mainwp_security_issues_widget_bottom
223 - *
224 - * Fires at the bottom of the Security Issues widget.
225 - *
226 - * @since 4.1
227 - */
228 - do_action( 'mainwp_security_issues_widget_bottom' );
229 - }
189 +
190 + <div class="mainwp-scrolly-overflow">
191 +
192 + <div class="ui middle aligned divided list" id="mainwp-security-issues-widget-list" style="display:none">
193 + <?php
194 + $count_security_issues = '';
195 + MainWP_DB::data_seek( $websites, 0 );
196 + while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
197 + if ( '[]' === $website->securityIssues ) {
198 + $count_security_issues = '';
199 + } else {
200 + $count_security_issues = intval( $website->securityIssues );
201 + }
202 + ?>
203 + <div class="item" count-issues="<?php echo (int) $count_security_issues; ?>" <?php echo '' !== $count_security_issues && $count_security_issues > 0 ? 'status="queue"' : ''; ?> siteid="<?php echo intval( $website->id ); ?>">
204 + <div class="right floated">
205 + <div class="ui right pointing dropdown">
206 + <i class="ellipsis vertical icon"></i>
207 + <div class="menu">
208 + <a href="admin.php?page=managesites&scanid=<?php echo esc_attr( $website->id ); ?>" class="item"><?php esc_html_e( 'Details', 'mainwp' ); ?></a>
209 + </div>
210 + </div>
211 + </div>
212 + <?php if ( $is_demo ) : ?>
213 + <a href="<?php echo esc_html( $website->url ) . 'wp-admin.html'; ?>" target="_blank"><i class="sign in alternate icon"></i></a>
214 + <?php else : ?>
215 + <a href="<?php MainWP_Site_Open::get_open_site_admin_link( $website->id, true ); ?>" target="_blank"><i class="sign in alternate icon"></i></a>
216 + <?php endif; ?>
217 + <a href="
218 + <?php
219 + /**
220 + * Filter: mainwp_security_issues_list_item_title_url
221 + *
222 + * Filters the Security Issues widget list item title URL.
223 + *
224 + * @since 4.1
225 + */
226 + echo esc_url( apply_filters( 'mainwp_security_issues_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
227 + ?>
228 + ">
229 + <?php
230 + /**
231 + * Filter: mainwp_security_issues_list_item_title
232 + *
233 + * Filters the Security Issues widget list item title text.
234 + *
235 + * @since 4.1
236 + */
237 + echo esc_attr( stripslashes( apply_filters( 'mainwp_security_issues_list_item_title', $website->name, $website ) ) );
238 + ?>
239 + </a>
240 + <?php if ( 0 === $count_security_issues ) : ?>
241 + <div><span class="ui small text"><?php esc_html_e( 'No issues detected', 'mainwp' ); ?></span></div>
242 + <?php elseif ( '' === $count_security_issues ) : ?>
243 + <div><span class="ui small text"><?php esc_html_e( 'No data available', 'mainwp' ); ?></span></div>
244 + <?php else : ?>
245 + <div><span class="ui small text"><?php echo esc_html( $count_security_issues ); ?> <?php echo esc_html( _n( 'issue detected', 'issues detected', $count_security_issues, 'mainwp' ) ); ?></span></div>
246 + <?php endif; ?>
247 +
248 + <?php
249 + /**
250 + * Action: mainwp_security_issues_list_item_column
251 + *
252 + * Fires before the last (actions) colum in the security issues list.
253 + *
254 + * Preferred HTML structure:
255 + *
256 + * <div class="column middle aligned">
257 + * Your content here!
258 + * </div>
259 + *
260 + * @param object $website Object containing the child site info.
261 + *
262 + * @since 4.1
263 + */
264 + do_action( 'mainwp_security_issues_list_item_column', $website );
265 + ?>
266 +
267 + </div>
268 + <?php } ?>
269 + </div>
270 + </div>
271 + <?php
272 + /**
273 + * Action: mainwp_security_issues_widget_bottom
274 + *
275 + * Fires at the bottom of the Security Issues widget.
276 + *
277 + * @since 4.1
278 + */
279 + do_action( 'mainwp_security_issues_widget_bottom' );
280 + ?>
281 + <div class="ui two column grid mainwp-widget-footer">
282 + <div class="left aligned middle aligned column">
283 + </div>
284 + <div class="right aligned middle aligned column">
285 +
286 + </div>
287 + </div>
288 + <div class="ui active dimmer" style="display:none" id="mainwp-secuirty-issues-loader">
289 + <div class="ui double text loader"></div>
290 + </div>
291 + <?php
292 + }
230 293 }