PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / trunk
MainWP Dashboard: Self-hosted WordPress Management for Agencies vtrunk
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 5.2.1 5.2.2 5.3 All 153 releases
mainwp / widgets / widget-mainwp-security-issues-widget.php

widget-mainwp-security-issues-widget.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies trunk, at widgets/widget-mainwp-security-issues-widget.php

294 lines 12.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Security Widget
4 *
5 * Displays detected security issues on Child Sites.
6 *
7 * @package MainWP/Dashboard
8 */
9
10 namespace MainWP\Dashboard;
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Class MainWP_Security_Issues_Widget
19 *
20 * Detect security issues on CHild Sites & Build Widget.
21 */
22 class MainWP_Security_Issues_Widget { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
23
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 }
32
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();
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 }
64
65 $total_securityIssues = 0;
66
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 }
73
74 static::render_issues( $websites, $total_securityIssues, $current_wpid );
75 }
76
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>
110
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">
135
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 } );
147
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 ?>
176
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 ?>
188
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 }
293 }
294