PluginProbe
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs / 2.6.6
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs v2.6.6
5.0.1 4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 All 39 releases
← All changes | freemius/templates/debug.php +831 -959 5.0.1 → 2.6.6 View file →
@@ -1,959 +1,831 @@
1 -<?php
2 - /**
3 - * @package Freemius
4 - * @copyright Copyright (c) 2015, Freemius, Inc.
5 - * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6 - * @since 1.1.1
7 - */
8 -
9 - if ( ! defined( 'ABSPATH' ) ) {
10 - exit;
11 - }
12 -
13 - global $fs_active_plugins;
14 -
15 - $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true );
16 -
17 - $off_text = fs_text_x_inline( 'Off', 'as turned off' );
18 - $on_text = fs_text_x_inline( 'On', 'as turned on' );
19 -
20 - // For some reason css was missing
21 - fs_enqueue_local_style( 'fs_common', '/admin/common.css' );
22 -
23 - $has_any_active_clone = false;
24 -
25 - $is_multisite = is_multisite();
26 -
27 - $auto_off_timestamp = wp_next_scheduled( 'fs_debug_turn_off_logging_hook' ) * 1000;
28 -?>
29 -<h1><?php echo fs_text_inline( 'Freemius Debug' ) . ' - ' . fs_text_inline( 'SDK' ) . ' v.' . $fs_active_plugins->newest->version ?></h1>
30 -<div>
31 - <!-- Debugging Switch -->
32 - <span class="fs-switch-label"><?php fs_esc_html_echo_x_inline( 'Debugging', 'as code debugging' ) ?></span>
33 -
34 - <div class="fs-switch fs-round <?php echo WP_FS__DEBUG_SDK ? 'fs-on' : 'fs-off' ?>">
35 - <div class="fs-toggle"></div>
36 - </div>
37 -
38 - <span class="auto-off-debug-countdown hidden"><?php echo fs_esc_html_echo_x_inline( 'Auto off in:', 'timer for auto-disabling debug' ); ?> <span class="time">23:59:59</span>
39 -
40 - <script type="text/javascript">
41 - (function ($) {
42 - $(document).ready(function () {
43 - // Switch toggle
44 - $( '.fs-switch' ).click( function () {
45 - $( this )
46 - .toggleClass( 'fs-on' )
47 - .toggleClass( 'fs-off' );
48 -
49 - var is_on = ($(this).hasClass( 'fs-on' ) ? 1 : 0);
50 -
51 - $.post( <?php echo Freemius::ajax_url() ?>, {
52 - action: 'fs_toggle_debug_mode',
53 - // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
54 - _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_toggle_debug_mode' ) ); ?>,
55 - is_on
56 - }, function (response) {
57 - if (is_on) {
58 - startCountdownManually();
59 - } else {
60 - stopCountdownManually();
61 - }
62 -
63 - if ( 1 == response ) {
64 - // Refresh page on success.
65 - location.reload();
66 - }
67 - });
68 - });
69 -
70 - // Countdown
71 - var countdownElement = document.querySelector('.auto-off-debug-countdown');
72 - var timeElement = countdownElement.querySelector('.time');
73 - var targetTime = <?php echo wp_json_encode( $auto_off_timestamp ); ?>;
74 - var countdownTimeout;
75 -
76 - function updateCountdown() {
77 - var currentTime = new Date().getTime();
78 - var remainingTimeInMs = targetTime - currentTime;
79 - var hours = Math.floor((remainingTimeInMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
80 - var minutes = Math.floor((remainingTimeInMs % (1000 * 60 * 60)) / (1000 * 60));
81 - var seconds = Math.floor((remainingTimeInMs % (1000 * 60)) / 1000);
82 -
83 -
84 - if (remainingTimeInMs < 1000) {
85 - countdownElement.classList.add('hidden');
86 - countdownTimeout = null;
87 - } else {
88 - timeElement.innerHTML = hours + ":"
89 - + minutes.toString().padStart(2, '0') + ":"
90 - + seconds.toString().padStart(2, '0');
91 - countdownElement.classList.remove('hidden');
92 -
93 - if (countdownTimeout) {
94 - clearTimeout(countdownTimeout);
95 - }
96 - countdownTimeout = setTimeout(updateCountdown, 1000);
97 - }
98 - }
99 -
100 - function startCountdownManually() {
101 - targetTime = ( new Date().getTime() ) + (24 * 60 * 60 * 1000) - 1;
102 - updateCountdown();
103 - }
104 -
105 - function stopCountdownManually() {
106 - targetTime = new Date().getTime();
107 - updateCountdown();
108 - }
109 -
110 - updateCountdown();
111 - // End countdown
112 -
113 - });
114 - }(jQuery));
115 - </script>
116 -</div>
117 -<h2><?php fs_esc_html_echo_inline( 'Actions', 'actions' ) ?></h2>
118 -<table>
119 - <tbody>
120 - <tr>
121 - <td>
122 - <!-- Delete All Accounts -->
123 - <form action="" method="POST">
124 - <input type="hidden" name="fs_action" value="restart_freemius">
125 - <?php wp_nonce_field( 'restart_freemius' ) ?>
126 - <button class="button button-primary"
127 - onclick="if (confirm('<?php fs_esc_attr_echo_inline( 'Are you sure you want to delete all Freemius data?', 'delete-all-confirm' ) ?>')) this.parentNode.submit(); return false;"><?php fs_esc_html_echo_inline( 'Delete All Accounts' ) ?></button>
128 - </form>
129 - </td>
130 - <td>
131 - <!-- Clear API Cache -->
132 - <form action="" method="POST">
133 - <input type="hidden" name="fs_clear_api_cache" value="true">
134 - <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Clear API Cache' ) ?></button>
135 - </form>
136 - </td>
137 - <td>
138 - <!-- Clear Updates Transients -->
139 - <form action="" method="POST">
140 - <input type="hidden" name="fs_action" value="clear_updates_data">
141 - <?php wp_nonce_field( 'clear_updates_data' ) ?>
142 - <button class="button"><?php fs_esc_html_echo_inline( 'Clear Updates Transients' ) ?></button>
143 - </form>
144 - </td>
145 - <?php if ( Freemius::is_deactivation_snoozed() ) : ?>
146 - <td>
147 - <!-- Reset Deactivation Snoozing -->
148 - <form action="" method="POST">
149 - <input type="hidden" name="fs_action" value="reset_deactivation_snoozing">
150 - <?php wp_nonce_field( 'reset_deactivation_snoozing' ) ?>
151 - <button class="button"><?php fs_esc_html_echo_inline( 'Reset Deactivation Snoozing' ) ?> (Expires in <?php echo ( Freemius::deactivation_snooze_expires_at() - time() ) ?> sec)</button>
152 - </form>
153 - </td>
154 - <?php endif ?>
155 - <td>
156 - <!-- Sync Data with Server -->
157 - <form action="" method="POST">
158 - <input type="hidden" name="background_sync" value="true">
159 - <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Sync Data From Server' ) ?></button>
160 - </form>
161 - </td>
162 - <?php if ( fs_is_network_admin() && true !== $fs_options->get_option( 'ms_migration_complete', false, true ) ) : ?>
163 - <td>
164 - <!-- Migrate Options to Network -->
165 - <form action="" method="POST">
166 - <input type="hidden" name="fs_action" value="migrate_options_to_network">
167 - <?php wp_nonce_field( 'migrate_options_to_network' ) ?>
168 - <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Migrate Options to Network' ) ?></button>
169 - </form>
170 - </td>
171 - <?php endif ?>
172 - <td>
173 - <button id="fs_load_db_option" class="button"><?php fs_esc_html_echo_inline( 'Load DB Option' ) ?></button>
174 - </td>
175 - <td>
176 - <button id="fs_set_db_option" class="button"><?php fs_esc_html_echo_inline( 'Set DB Option' ) ?></button>
177 - </td>
178 - <td>
179 - <?php
180 - $fs_debug_page_url = 'admin.php?page=freemius&fs_action=allow_clone_resolution_notice';
181 - $fs_debug_page_url = fs_is_network_admin() ?
182 - network_admin_url( $fs_debug_page_url ) :
183 - admin_url( $fs_debug_page_url );
184 - ?>
185 - <a href="<?php echo wp_nonce_url( $fs_debug_page_url, 'fs_allow_clone_resolution_notice' ) ?>" class="button button-primary">Resolve Clone(s)</a>
186 - </td>
187 - </tr>
188 - </tbody>
189 -</table>
190 -<script type="text/javascript">
191 - (function ($) {
192 - $('#fs_load_db_option').click(function () {
193 - var optionName = prompt('Please enter the option name:');
194 -
195 - if (optionName) {
196 - $.post(<?php echo Freemius::ajax_url() ?>, {
197 - action : 'fs_get_db_option',
198 - // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
199 - _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_db_option' ) ); ?>,
200 - option_name: optionName
201 - }, function (response) {
202 - if (response.data.value)
203 - prompt('The option value is:', response.data.value);
204 - else
205 - alert('Oops... Option does not exist in the DB.');
206 - });
207 - }
208 - });
209 -
210 - $('#fs_set_db_option').click(function () {
211 - var optionName = prompt('Please enter the option name:');
212 -
213 - if (optionName) {
214 - var optionValue = prompt('Please enter the option value:');
215 -
216 - if (optionValue) {
217 - $.post(<?php echo Freemius::ajax_url() ?>, {
218 - action : 'fs_set_db_option',
219 - // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
220 - _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_set_db_option' ) ); ?>,
221 - option_name : optionName,
222 - option_value: optionValue
223 - }, function () {
224 - alert('Option was successfully set.');
225 - });
226 - }
227 - }
228 - });
229 - })(jQuery);
230 -</script>
231 -<?php
232 - if ( ! defined( 'FS_API__ADDRESS' ) ) {
233 - define( 'FS_API__ADDRESS', '://api.freemius.com' );
234 - }
235 - if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) {
236 - define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' );
237 - }
238 -
239 - $defines = array(
240 - array(
241 - 'key' => 'WP_FS__REMOTE_ADDR',
242 - 'val' => WP_FS__REMOTE_ADDR,
243 - ),
244 - array(
245 - 'key' => 'WP_FS__ADDRESS_PRODUCTION',
246 - 'val' => WP_FS__ADDRESS_PRODUCTION,
247 - ),
248 - array(
249 - 'key' => 'FS_API__ADDRESS',
250 - 'val' => FS_API__ADDRESS,
251 - ),
252 - array(
253 - 'key' => 'FS_API__SANDBOX_ADDRESS',
254 - 'val' => FS_API__SANDBOX_ADDRESS,
255 - ),
256 - array(
257 - 'key' => 'WP_FS__DIR',
258 - 'val' => WP_FS__DIR,
259 - ),
260 - array(
261 - 'key' => 'DISABLE_WP_CRON',
262 - 'val' => defined( 'DISABLE_WP_CRON' ) ? ( DISABLE_WP_CRON ? 'true' : 'false' ) : 'Not defined',
263 - ),
264 - array(
265 - 'key' => 'wp_using_ext_object_cache()',
266 - 'val' => wp_using_ext_object_cache() ? 'true' : 'false',
267 - ),
268 - array(
269 - 'key' => 'Freemius::get_unfiltered_site_url()',
270 - 'val' => Freemius::get_unfiltered_site_url(),
271 - ),
272 - )
273 -?>
274 -<br>
275 -<table class="widefat">
276 - <thead>
277 - <tr>
278 - <th><?php fs_esc_html_echo_inline( 'Key', 'key' ) ?></th>
279 - <th><?php fs_esc_html_echo_inline( 'Value', 'value' ) ?></th>
280 - </tr>
281 - </thead>
282 - <tbody>
283 - <?php $alternate = false;
284 - foreach ( $defines as $p ) : ?>
285 - <tr<?php if ( $alternate ) {
286 - echo ' class="alternate"';
287 - } ?>>
288 - <td><?php echo $p['key'] ?></td>
289 - <td><?php echo $p['val'] ?><?php
290 - if ( 'DISABLE_WP_CRON' === $p['key'] && 'true' === $p['val'] ) {
291 - echo '<p><small><strong>Freemius SDK’s sync cron jobs will not run unless an alternative server-side cron is set up.</strong></small></p>';
292 - }
293 - ?></td>
294 - </tr>
295 - <?php $alternate = ! $alternate ?>
296 - <?php endforeach ?>
297 - </tbody>
298 -</table>
299 -<h2>
300 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
301 - <span class="fs-debug-table-toggle-icon">▼</span>
302 - </button>
303 - <?php fs_esc_html_echo_x_inline( 'SDK Versions', 'as software development kit versions', 'sdk-versions' ) ?>
304 -</h2>
305 -<table id="fs_sdks" class="widefat fs-debug-table">
306 - <thead>
307 - <tr>
308 - <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
309 - <th><?php fs_esc_html_echo_inline( 'SDK Path' ) ?></th>
310 - <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th>
311 - <th><?php fs_esc_html_echo_inline( 'Is Active' ) ?></th>
312 - </tr>
313 - </thead>
314 - <tbody>
315 - <?php foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) : ?>
316 - <?php $is_active = ( WP_FS__SDK_VERSION == $data->version ) ?>
317 - <tr<?php if ( $is_active ) {
318 - echo ' style="background: #E6FFE6; font-weight: bold"';
319 - } ?>>
320 - <td><?php echo $data->version ?></td>
321 - <td><?php echo $sdk_path ?></td>
322 - <td><?php echo $data->plugin_path ?></td>
323 - <td><?php echo ( $is_active ) ? 'Active' : 'Inactive' ?></td>
324 - </tr>
325 - <?php endforeach ?>
326 - </tbody>
327 -</table>
328 -
329 -<?php
330 - $module_types = array(
331 - WP_FS__MODULE_TYPE_PLUGIN,
332 - WP_FS__MODULE_TYPE_THEME
333 - );
334 -?>
335 -<?php $active_modules_by_id = array() ?>
336 -<?php foreach ( $module_types as $module_type ) : ?>
337 - <?php $modules = fs_get_entities( $fs_options->get_option( $module_type . 's' ), FS_Plugin::get_class_name() ) ?>
338 - <?php if ( is_array( $modules ) && count( $modules ) > 0 ) : ?>
339 - <h2>
340 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
341 - <span class="fs-debug-table-toggle-icon">▼</span>
342 - </button>
343 - <?php echo esc_html( ( WP_FS__MODULE_TYPE_PLUGIN == $module_type ) ? fs_text_inline( 'Plugins', 'plugins' ) : fs_text_inline( 'Themes', 'themes' ) ) ?>
344 - </h2>
345 - <table id="fs_<?php echo $module_type ?>" class="widefat fs-debug-table">
346 - <thead>
347 - <tr>
348 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
349 - <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
350 - <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
351 - <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th>
352 - <th><?php fs_esc_html_echo_x_inline( 'API', 'as application program interface' ) ?></th>
353 - <th><?php fs_esc_html_echo_inline( 'Freemius State' ) ?></th>
354 - <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th>
355 - <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
356 - <?php if ( $is_multisite ) : ?>
357 - <th><?php fs_esc_html_echo_inline( 'Network Blog' ) ?></th>
358 - <th><?php fs_esc_html_echo_inline( 'Network User' ) ?></th>
359 - <?php endif ?>
360 - <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
361 - </tr>
362 - </thead>
363 - <tbody>
364 - <?php $alternate = false; ?>
365 - <?php foreach ( $modules as $slug => $data ) : ?>
366 - <?php
367 - if ( WP_FS__MODULE_TYPE_THEME !== $module_type ) {
368 - $is_active = is_plugin_active( $data->file );
369 - } else {
370 - $current_theme = wp_get_theme();
371 - $is_active = ( $current_theme->stylesheet === $data->file );
372 -
373 - if ( ! $is_active && is_child_theme() ) {
374 - $parent_theme = $current_theme->parent();
375 -
376 - $is_active = ( ( $parent_theme instanceof WP_Theme ) && $parent_theme->stylesheet === $data->file );
377 - }
378 - }
379 - ?>
380 - <?php
381 - $fs = null;
382 - if ( $is_active ) {
383 - $fs = freemius( $data->id );
384 -
385 - $active_modules_by_id[ $data->id ] = true;
386 - }
387 - ?>
388 - <tr<?php if ( $alternate ) { echo ' class="alternate" '; } ?><?php if ( $is_active ) {
389 - $has_api_connectivity = $fs->has_api_connectivity();
390 -
391 - if ( true === $has_api_connectivity && $fs->is_on() ) {
392 - echo ' style="background: #E6FFE6; font-weight: bold"';
393 - } else if ( false === $has_api_connectivity || ! $fs->is_on() ) {
394 - echo ' style="background: #ffd0d0; font-weight: bold"';
395 - }
396 - } ?>>
397 - <td><?php echo $data->id ?></td>
398 - <td><?php echo $slug ?></td>
399 - <td><?php echo $data->version ?></td>
400 - <td><?php echo $data->title ?></td>
401 - <td<?php if ( $is_active && false === $has_api_connectivity ) {
402 - echo ' style="color: red; text-transform: uppercase;"';
403 - } ?>><?php if ( $is_active ) {
404 - echo esc_html( true === $has_api_connectivity ?
405 - fs_text_x_inline( 'Connected', 'as connection was successful' ) :
406 - ( false === $has_api_connectivity ?
407 - fs_text_x_inline( 'Blocked', 'as connection blocked' ) :
408 - fs_text_x_inline( 'No requests yet', 'API connectivity state is unknown' ) )
409 - );
410 - } ?></td>
411 - <td<?php if ( $is_active && ! $fs->is_on() ) {
412 - echo ' style="color: red; text-transform: uppercase;"';
413 - } ?>><?php if ( $is_active ) {
414 - echo esc_html( $fs->is_on() ?
415 - $on_text :
416 - $off_text
417 - );
418 - } ?></td>
419 - <td><?php echo $data->file ?></td>
420 - <td><?php echo $data->public_key ?></td>
421 - <?php if ( $is_multisite ) : ?>
422 - <?php
423 - $network_blog_id = null;
424 - $network_user = null;
425 -
426 - if ( is_object( $fs ) ) {
427 - $network_blog_id = $fs->get_network_install_blog_id();
428 - $network_user = $fs->get_network_user();
429 - }
430 - ?>
431 - <td><?php echo is_numeric( $network_blog_id ) ? $network_blog_id : '' ?></td>
432 - <td><?php if ( is_object( $network_user ) ) {
433 - echo $network_user->email;
434 - } ?></td>
435 - <?php endif ?>
436 - <td>
437 - <?php if ( $is_active ) : ?>
438 - <?php if ( $fs->has_trial_plan() ) : ?>
439 - <form action="" method="POST">
440 - <input type="hidden" name="fs_action" value="simulate_trial">
441 - <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>">
442 - <?php wp_nonce_field( 'simulate_trial' ) ?>
443 -
444 - <button type="submit" class="button button-primary simulate-trial"><?php fs_esc_html_echo_inline( 'Simulate Trial Promotion' ) ?></button>
445 - </form>
446 - <?php endif ?>
447 - <?php if ( $fs->is_registered() ) : ?>
448 - <a class="button" href="<?php echo $fs->get_account_url() ?>"><?php fs_esc_html_echo_inline( 'Account', 'account' ) ?></a>
449 - <?php endif ?>
450 - <?php if ( fs_is_network_admin() && ! $fs->is_network_upgrade_mode() ) : ?>
451 - <form action="" method="POST">
452 - <input type="hidden" name="fs_action" value="simulate_network_upgrade">
453 - <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>">
454 - <?php wp_nonce_field( 'simulate_network_upgrade' ) ?>
455 -
456 - <button type="submit" class="button button-small"><?php fs_esc_html_echo_inline( 'Simulate Network Upgrade' ) ?></button>
457 - </form>
458 - <?php endif ?>
459 - <?php endif ?>
460 - </td>
461 - </tr>
462 - <?php $alternate = ! $alternate ?>
463 - <?php endforeach ?>
464 - </tbody>
465 - </table>
466 - <?php endif ?>
467 -<?php endforeach ?>
468 -<?php foreach ( $module_types as $module_type ) : ?>
469 - <?php
470 - /**
471 - * @var array $VARS
472 - * @var array[string]FS_Site|array[string]FS_Site[] $sites_map
473 - */
474 - $sites_map = $VARS[ $module_type . '_sites' ];
475 -
476 - $all_plans = false;
477 - ?>
478 - <?php if ( is_array( $sites_map ) && count( $sites_map ) > 0 ) : ?>
479 - <h2>
480 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
481 - <span class="fs-debug-table-toggle-icon">▼</span>
482 - </button>
483 - <?php echo esc_html( sprintf(
484 - /* translators: %s: 'plugin' or 'theme' */
485 - fs_text_inline( '%s Installs', 'module-installs' ),
486 - ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) )
487 - ) ) ?> / <?php fs_esc_html_echo_x_inline( 'Sites', 'like websites', 'sites' ) ?>
488 - </h2>
489 - <table id="fs_<?php echo $module_type ?>_installs" class="widefat fs-debug-table">
490 - <thead>
491 - <tr>
492 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
493 - <?php if ( $is_multisite ) : ?>
494 - <th><?php fs_esc_html_echo_inline( 'Blog ID' ) ?></th>
495 - <th><?php fs_esc_html_echo_inline( 'Address' ) ?></th>
496 - <?php endif ?>
497 - <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
498 - <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th>
499 - <th><?php fs_esc_html_echo_inline( 'License ID' ) ?></th>
500 - <th><?php fs_esc_html_echo_x_inline( 'Plan', 'as product pricing plan', 'plan' ) ?></th>
501 - <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
502 - <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
503 - <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
504 - </tr>
505 - </thead>
506 - <tbody>
507 - <?php $site_url = null ?>
508 - <?php foreach ( $sites_map as $slug => $sites ) : ?>
509 - <?php foreach ( $sites as $site ) : ?>
510 - <?php
511 - $blog_id = $is_multisite ?
512 - $site->blog_id :
513 - null;
514 -
515 - if ( is_null( $site_url ) || $is_multisite ) {
516 - $site_url = Freemius::get_unfiltered_site_url(
517 - $blog_id,
518 - true,
519 - true
520 - );
521 - }
522 -
523 - $is_active_clone = ( $site->is_clone( $site_url ) && isset( $active_modules_by_id[ $site->plugin_id ] ) );
524 -
525 - if ( $is_active_clone ) {
526 - $has_any_active_clone = true;
527 - }
528 - ?>
529 - <tr>
530 - <td>
531 - <?php echo $site->id ?>
532 - <?php if ( $is_active_clone ) : ?>
533 - <label class="fs-tag fs-warn">Clone</label>
534 - <?php endif ?>
535 - </td>
536 - <?php if ( $is_multisite ) : ?>
537 - <td><?php echo $blog_id ?></td>
538 - <td><?php echo fs_strip_url_protocol( $site->url ) ?></td>
539 - <?php endif ?>
540 - <td><?php echo $slug ?></td>
541 - <td><?php echo $site->user_id ?></td>
542 - <td><?php echo !empty($site->license_id) ? $site->license_id : '' ?></td>
543 - <td><?php
544 - $plan_name = '';
545 - if ( FS_Plugin_Plan::is_valid_id( $site->plan_id ) ) {
546 - if ( false === $all_plans ) {
547 - $option_name = 'plans';
548 - if ( WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) {
549 - $option_name = $module_type . '_' . $option_name;
550 - }
551 -
552 - $all_plans = fs_get_entities( $fs_options->get_option( $option_name, array() ), FS_Plugin_Plan::get_class_name() );
553 - }
554 -
555 - foreach ( $all_plans[ $slug ] as $plan ) {
556 - $plan_id = Freemius::_decrypt( $plan->id );
557 -
558 - if ( $site->plan_id == $plan_id ) {
559 - $plan_name = Freemius::_decrypt( $plan->name );
560 - break;
561 - }
562 - }
563 - }
564 -
565 - echo $plan_name;
566 - ?></td>
567 - <td><?php echo $site->public_key ?></td>
568 - <td><?php
569 - $plugin_storage = FS_Storage::instance( $module_type, $slug );
570 -
571 - echo $plugin_storage->is_whitelabeled ?
572 - FS_Plugin_License::mask_secret_key_for_html( $site->secret_key ) :
573 - esc_html( $site->secret_key );
574 - ?></td>
575 - <td>
576 - <form action="" method="POST">
577 - <input type="hidden" name="fs_action" value="delete_install">
578 - <?php wp_nonce_field( 'delete_install' ) ?>
579 - <input type="hidden" name="module_id" value="<?php echo $site->plugin_id ?>">
580 - <?php if ( $is_multisite ) : ?>
581 - <input type="hidden" name="blog_id" value="<?php echo $site->blog_id ?>">
582 - <?php endif ?>
583 - <input type="hidden" name="module_type" value="<?php echo $module_type ?>">
584 - <input type="hidden" name="slug" value="<?php echo $slug ?>">
585 - <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button>
586 - </form>
587 - </td>
588 - </tr>
589 - <?php endforeach ?>
590 - <?php endforeach ?>
591 - </tbody>
592 - </table>
593 - <?php endif ?>
594 -<?php endforeach ?>
595 -<?php
596 - $addons = $VARS['addons'];
597 -?>
598 -<?php foreach ( $addons as $plugin_id => $plugin_addons ) : ?>
599 - <h2>
600 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
601 - <span class="fs-debug-table-toggle-icon">▼</span>
602 - </button>
603 - <?php echo esc_html( sprintf( fs_text_inline( 'Add Ons of module %s', 'addons-of-x' ), $plugin_id ) ) ?>
604 - </h2>
605 - <table id="fs_addons" class="widefat fs-debug-table">
606 - <thead>
607 - <tr>
608 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
609 - <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th>
610 - <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
611 - <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
612 - <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
613 - <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
614 - </tr>
615 - </thead>
616 - <tbody>
617 - <?php
618 - /**
619 - * @var FS_Plugin[] $plugin_addons
620 - */
621 - foreach ( $plugin_addons as $addon ) : ?>
622 - <tr>
623 - <td><?php echo $addon->id ?></td>
624 - <td><?php echo $addon->title ?></td>
625 - <td><?php echo $addon->slug ?></td>
626 - <td><?php echo $addon->version ?></td>
627 - <td><?php echo $addon->public_key ?></td>
628 - <td><?php echo esc_html( $addon->secret_key ) ?></td>
629 - </tr>
630 - <?php endforeach ?>
631 - </tbody>
632 - </table>
633 -<?php endforeach ?>
634 -<?php
635 - /**
636 - * @var FS_User[] $users
637 - */
638 - $users = $VARS['users'];
639 - $user_ids_map = array();
640 - $users_with_developer_license_by_id = array();
641 -
642 - if ( is_array( $users ) && ! empty( $users ) ) {
643 - foreach ( $users as $user ) {
644 - $user_ids_map[ $user->id ] = true;
645 - }
646 - }
647 -
648 - foreach ( $module_types as $module_type ) {
649 - /**
650 - * @var FS_Plugin_License[] $licenses
651 - */
652 - $licenses = $VARS[ $module_type . '_licenses' ];
653 -
654 - foreach ( $licenses as $license ) {
655 - if ( $license->is_whitelabeled ) {
656 - $users_with_developer_license_by_id[ $license->user_id ] = true;
657 - }
658 - }
659 - }
660 -
661 -?>
662 -<?php if ( is_array( $users ) && 0 < count( $users ) ) : ?>
663 - <h2>
664 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
665 - <span class="fs-debug-table-toggle-icon">▼</span>
666 - </button>
667 - <?php fs_esc_html_echo_inline( 'Users' ) ?>
668 - </h2>
669 - <table id="fs_users" class="widefat fs-debug-table">
670 - <thead>
671 - <tr>
672 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
673 - <th><?php fs_esc_html_echo_inline( 'Name' ) ?></th>
674 - <th><?php fs_esc_html_echo_inline( 'Email' ) ?></th>
675 - <th><?php fs_esc_html_echo_inline( 'Verified' ) ?></th>
676 - <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
677 - <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
678 - <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
679 - </tr>
680 - </thead>
681 - <tbody>
682 - <?php foreach ( $users as $user_id => $user ) : ?>
683 - <?php $has_developer_license = isset( $users_with_developer_license_by_id[ $user_id ] ) ?>
684 - <tr>
685 - <td><?php echo $user->id ?></td>
686 - <td><?php echo $has_developer_license ? '' : $user->get_name() ?></td>
687 - <td>
688 - <?php if ( ! $has_developer_license ) : ?>
689 - <a href="mailto:<?php echo esc_attr( $user->email ) ?>"><?php echo $user->email ?></a>
690 - <?php endif ?>
691 - </td>
692 - <td><?php echo $has_developer_license ? '' : json_encode( $user->is_verified ) ?></td>
693 - <td><?php echo $user->public_key ?></td>
694 - <td><?php echo $has_developer_license ? FS_Plugin_License::mask_secret_key_for_html($user->secret_key) : esc_html( $user->secret_key ) ?></td>
695 - <td>
696 - <?php if ( ! $has_developer_license ) : ?>
697 - <form action="" method="POST">
698 - <input type="hidden" name="fs_action" value="delete_user">
699 - <?php wp_nonce_field( 'delete_user' ) ?>
700 - <input type="hidden" name="user_id" value="<?php echo $user->id ?>">
701 - <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button>
702 - </form>
703 - <?php endif ?>
704 - </td>
705 - </tr>
706 - <?php endforeach ?>
707 - </tbody>
708 - </table>
709 -<?php endif ?>
710 -<?php foreach ( $module_types as $module_type ) : ?>
711 - <?php
712 - /**
713 - * @var FS_Plugin_License[] $licenses
714 - */
715 - $licenses = $VARS[ $module_type . '_licenses' ] ?>
716 - <?php if ( is_array( $licenses ) && count( $licenses ) > 0 ) : ?>
717 - <h2>
718 - <button class="fs-debug-table-toggle-button" aria-expanded="true">
719 - <span class="fs-debug-table-toggle-icon">▼</span>
720 - </button>
721 - <?php echo esc_html( sprintf( fs_text_inline( '%s Licenses', 'module-licenses' ), ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) ) ) ) ?>
722 - </h2>
723 - <table id="fs_<?php echo $module_type ?>_licenses" class="widefat fs-debug-table">
724 - <thead>
725 - <tr>
726 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
727 - <th><?php fs_esc_html_echo_inline( 'Plugin ID' ) ?></th>
728 - <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th>
729 - <th><?php fs_esc_html_echo_inline( 'Plan ID' ) ?></th>
730 - <th><?php fs_esc_html_echo_inline( 'Quota' ) ?></th>
731 - <th><?php fs_esc_html_echo_inline( 'Activated' ) ?></th>
732 - <th><?php fs_esc_html_echo_inline( 'Blocking' ) ?></th>
733 - <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th>
734 - <th><?php fs_esc_html_echo_inline( 'License Key' ) ?></th>
735 - <th><?php fs_esc_html_echo_x_inline( 'Expiration', 'as expiration date' ) ?></th>
736 - </tr>
737 - </thead>
738 - <tbody>
739 - <?php foreach ( $licenses as $license ) : ?>
740 - <tr>
741 - <td><?php echo $license->id ?></td>
742 - <td><?php echo $license->plugin_id ?></td>
743 - <td><?php echo $license->user_id ?></td>
744 - <td><?php echo $license->plan_id ?></td>
745 - <td><?php echo $license->is_unlimited() ? 'Unlimited' : ( $license->is_single_site() ? 'Single Site' : $license->quota ) ?></td>
746 - <td><?php echo $license->activated ?></td>
747 - <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td>
748 - <td><?php echo $license->is_whitelabeled ? 'Whitelabeled' : 'Normal' ?></td>
749 - <td><?php
750 - echo ( $license->is_whitelabeled || ! isset( $user_ids_map[ $license->user_id ] ) ) ?
751 - $license->get_html_escaped_masked_secret_key() :
752 - esc_html( $license->secret_key );
753 - ?></td>
754 - <td><?php echo $license->expiration ?></td>
755 - </tr>
756 - <?php endforeach ?>
757 - </tbody>
758 - </table>
759 - <?php endif ?>
760 -<?php endforeach ?>
761 -<?php
762 - $page_params = array( 'is_fs_debug_page' => true );
763 - fs_require_template( 'debug/scheduled-crons.php', $page_params );
764 -?>
765 -<?php if ( FS_Logger::is_storage_logging_on() ) : ?>
766 -
767 - <h2><?php fs_esc_html_echo_inline( 'Debug Log', 'debug-log' ) ?></h2>
768 -
769 - <div id="fs_debug_filters">
770 - <select name="type">
771 - <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Types', 'all-types' ) ?></option>
772 - <option value="warn_error">Warnings & Errors</option>
773 - <option value="error">Errors</option>
774 - <option value="warn">Warnings</option>
775 - <option value="info">Info</option>
776 - </select>
777 - <select name="request_type">
778 - <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Requests', 'all-requests' ) ?></option>
779 - <option value="call">Sync</option>
780 - <option value="ajax">AJAX</option>
781 - <option value="cron">WP Cron</option>
782 - </select>
783 - <input name="file" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'File' ) ?>"/>
784 - <input name="function" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Function' ) ?>"/>
785 - <input name="process_id" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Process ID' ) ?>"/>
786 - <input name="logger" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Logger' ) ?>"/>
787 - <input name="message" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Message' ) ?>"/>
788 - <div style="margin: 10px 0">
789 - <button id="fs_filter" class="button" style="float: left"><i class="dashicons dashicons-filter"></i> <?php fs_esc_html_echo_inline( 'Filter', 'filter' ) ?>
790 - </button>
791 -
792 - <form action="" method="POST" style="float: left; margin-left: 10px;">
793 - <input type="hidden" name="fs_action" value="download_logs">
794 - <?php wp_nonce_field( 'download_logs' ) ?>
795 - <div class="fs-filters"></div>
796 - <button id="fs_download" class="button" type="submit"><i
797 - class="dashicons dashicons-download"></i> <?php fs_esc_html_echo_inline( 'Download' ) ?></button>
798 - </form>
799 - <div style="clear: both"></div>
800 - </div>
801 - </div>
802 -
803 - <div id="fs_log_book" style="height: 300px; overflow: auto;">
804 - <table class="widefat">
805 - <thead>
806 - <tr>
807 - <th>#</th>
808 - <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th>
809 - <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
810 - <th><?php fs_esc_html_echo_inline( 'Function' ) ?></th>
811 - <th><?php fs_esc_html_echo_inline( 'Message' ) ?></th>
812 - <th><?php fs_esc_html_echo_inline( 'File' ) ?></th>
813 - <th><?php fs_esc_html_echo_inline( 'Timestamp' ) ?></th>
814 - </tr>
815 - </thead>
816 - <tbody>
817 - <tr style="display: none">
818 - <td>{$log.log_order}.</td>
819 - <td class="fs-col--type">{$log.type}</td>
820 - <td class="fs-col--logger">{$log.logger}</td>
821 - <td class="fs-col--function">{$log.function}</td>
822 - <td class="fs-col--message">
823 - <a href="#" onclick="jQuery(this).parent().find('div').toggle(); return false;">
824 - <nobr>{$log.message_short}</nobr>
825 - </a>
826 - <div style="display: none;">{$log.message}</div>
827 - </td>
828 - <td class="fs-col--file">{$log.file}:{$log.line}</td>
829 - <td class="fs-col--timestamp">{$log.created}</td>
830 - </tr>
831 -
832 - </tbody>
833 - </table>
834 - </div>
835 - <script type="text/javascript">
836 - jQuery(document).ready(function ($) {
837 - var filtersChanged = false,
838 - offset = 0,
839 - limit = 200,
840 - prevFiltersSignature = null;
841 -
842 - var getFilters = function () {
843 - var filters = {},
844 - signature = '';
845 -
846 - $('#fs_debug_filters').find('select, input').each(function (i, e) {
847 - var $element = $(e);
848 -
849 - if ('hidden' === $element.attr('type'))
850 - return;
851 -
852 - var val = $element.val();
853 - if ('' !== val.trim()) {
854 - var name = $(e).attr('name');
855 - filters[name] = val;
856 - signature += name + '=' + val + '~';
857 - }
858 - });
859 -
860 - if (signature != prevFiltersSignature) {
861 - filtersChanged = true;
862 - prevFiltersSignature = signature;
863 - } else {
864 - filtersChanged = false;
865 - }
866 -
867 - return filters;
868 - };
869 -
870 - $('#fs_download').parent().submit(function () {
871 - var filters = getFilters(),
872 - hiddenFields = '';
873 -
874 - for (var f in filters) {
875 - if (filters.hasOwnProperty(f)) {
876 - hiddenFields += '<input type="hidden" name="filters[' + f + ']" value="' + filters[f] + '" />';
877 - }
878 - }
879 -
880 - $(this).find('.fs-filters').html(hiddenFields);
881 - });
882 -
883 - var loadLogs = function () {
884 - var $tbody = $('#fs_log_book tbody'),
885 - template = $tbody.find('tr:first-child').html(),
886 - filters = getFilters();
887 -
888 - if (!filtersChanged) {
889 - offset += limit;
890 - } else {
891 - // Cleanup table for new filter (only keep template row).
892 - $tbody.find('tr').each(function (i, e) {
893 - if (0 == i)
894 - return;
895 -
896 - $(e).remove();
897 - });
898 -
899 - offset = 0;
900 - }
901 -
902 - $.post(<?php echo Freemius::ajax_url() ?>, {
903 - action : 'fs_get_debug_log',
904 - // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
905 - _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_debug_log' ) ); ?>,
906 - filters: filters,
907 - offset : offset,
908 - limit : limit
909 - }, function (response) {
910 -
911 - for (var i = 0; i < response.data.length; i++) {
912 - var templateCopy = template;
913 -
914 - response.data[i].message_short = (response.data[i].message.length > 32) ?
915 - response.data[i].message.substr(0, 32) + '...' :
916 - response.data[i].message;
917 -
918 - for (var p in response.data[i]) {
919 - if (response.data[i].hasOwnProperty(p)) {
920 - templateCopy = templateCopy.replace('{$log.' + p + '}', response.data[i][p]);
921 - }
922 - }
923 -
924 - $tbody.append('<tr' + (i % 2 ? ' class="alternate"' : '') + '>' + templateCopy + '</tr>');
925 - }
926 - });
927 - };
928 -
929 - $('#fs_filter').click(function () {
930 - loadLogs();
931 -
932 - return false;
933 - });
934 -
935 - loadLogs();
936 - });
937 - </script>
938 -<?php endif ?>
939 -<script type="text/javascript">
940 - // JavaScript to toggle the visibility of the table body and change the caret icon
941 - jQuery( document ).ready( function ( $ ) {
942 - $( '.fs-debug-table-toggle-button' ).on( 'click', function () {
943 - const button = $( this );
944 - const table = button.closest( 'h2' ).next( 'table' );
945 - const isExpanded = ( 'false' === button.attr( 'aria-expanded' ) );
946 -
947 - button.attr( 'aria-expanded', isExpanded );
948 - button.find( '.fs-debug-table-toggle-icon' ).text( isExpanded ? '▼' : '▶' );
949 -
950 - table.css( {
951 - display : isExpanded ? 'table' : 'block',
952 - borderBottomWidth: isExpanded ? '1px' : '0',
953 - maxHeight : isExpanded ? 'auto' : '0',
954 - } );
955 - } );
956 -
957 - $( '.fs-debug-table-toggle-button:last' ).click();
958 - } );
959 -</script>
1 +<?php
2 + /**
3 + * @package Freemius
4 + * @copyright Copyright (c) 2015, Freemius, Inc.
5 + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6 + * @since 1.1.1
7 + */
8 +
9 + if ( ! defined( 'ABSPATH' ) ) {
10 + exit;
11 + }
12 +
13 + global $fs_active_plugins;
14 +
15 + $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true );
16 +
17 + $off_text = fs_text_x_inline( 'Off', 'as turned off' );
18 + $on_text = fs_text_x_inline( 'On', 'as turned on' );
19 +
20 + $has_any_active_clone = false;
21 +
22 + $is_multisite = is_multisite();
23 +?>
24 +<h1><?php echo fs_text_inline( 'Freemius Debug' ) . ' - ' . fs_text_inline( 'SDK' ) . ' v.' . $fs_active_plugins->newest->version ?></h1>
25 +<div>
26 + <!-- Debugging Switch -->
27 + <?php //$debug_mode = get_option( 'fs_debug_mode', null ) ?>
28 + <span class="fs-switch-label"><?php fs_esc_html_echo_x_inline( 'Debugging', 'as code debugging' ) ?></span>
29 +
30 + <div class="fs-switch fs-round <?php echo WP_FS__DEBUG_SDK ? 'fs-on' : 'fs-off' ?>">
31 + <div class="fs-toggle"></div>
32 + </div>
33 + <script type="text/javascript">
34 + (function ($) {
35 + $(document).ready(function () {
36 + // Switch toggle
37 + $( '.fs-switch' ).click( function () {
38 + $( this )
39 + .toggleClass( 'fs-on' )
40 + .toggleClass( 'fs-off' );
41 +
42 + $.post( <?php echo Freemius::ajax_url() ?>, {
43 + action: 'fs_toggle_debug_mode',
44 + // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
45 + _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_toggle_debug_mode' ) ); ?>,
46 + is_on : ($(this).hasClass( 'fs-on' ) ? 1 : 0)
47 + }, function ( response ) {
48 + if ( 1 == response ) {
49 + // Refresh page on success.
50 + location.reload();
51 + }
52 + });
53 + });
54 + });
55 + }(jQuery));
56 + </script>
57 +</div>
58 +<h2><?php fs_esc_html_echo_inline( 'Actions', 'actions' ) ?></h2>
59 +<table>
60 + <tbody>
61 + <tr>
62 + <td>
63 + <!-- Delete All Accounts -->
64 + <form action="" method="POST">
65 + <input type="hidden" name="fs_action" value="restart_freemius">
66 + <?php wp_nonce_field( 'restart_freemius' ) ?>
67 + <button class="button button-primary"
68 + onclick="if (confirm('<?php fs_esc_attr_echo_inline( 'Are you sure you want to delete all Freemius data?', 'delete-all-confirm' ) ?>')) this.parentNode.submit(); return false;"><?php fs_esc_html_echo_inline( 'Delete All Accounts' ) ?></button>
69 + </form>
70 + </td>
71 + <td>
72 + <!-- Clear API Cache -->
73 + <form action="" method="POST">
74 + <input type="hidden" name="fs_clear_api_cache" value="true">
75 + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Clear API Cache' ) ?></button>
76 + </form>
77 + </td>
78 + <td>
79 + <!-- Clear Updates Transients -->
80 + <form action="" method="POST">
81 + <input type="hidden" name="fs_action" value="clear_updates_data">
82 + <?php wp_nonce_field( 'clear_updates_data' ) ?>
83 + <button class="button"><?php fs_esc_html_echo_inline( 'Clear Updates Transients' ) ?></button>
84 + </form>
85 + </td>
86 + <?php if ( Freemius::is_deactivation_snoozed() ) : ?>
87 + <td>
88 + <!-- Reset Deactivation Snoozing -->
89 + <form action="" method="POST">
90 + <input type="hidden" name="fs_action" value="reset_deactivation_snoozing">
91 + <?php wp_nonce_field( 'reset_deactivation_snoozing' ) ?>
92 + <button class="button"><?php fs_esc_html_echo_inline( 'Reset Deactivation Snoozing' ) ?> (Expires in <?php echo ( Freemius::deactivation_snooze_expires_at() - time() ) ?> sec)</button>
93 + </form>
94 + </td>
95 + <?php endif ?>
96 + <td>
97 + <!-- Sync Data with Server -->
98 + <form action="" method="POST">
99 + <input type="hidden" name="background_sync" value="true">
100 + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Sync Data From Server' ) ?></button>
101 + </form>
102 + </td>
103 + <?php if ( fs_is_network_admin() && true !== $fs_options->get_option( 'ms_migration_complete', false, true ) ) : ?>
104 + <td>
105 + <!-- Migrate Options to Network -->
106 + <form action="" method="POST">
107 + <input type="hidden" name="fs_action" value="migrate_options_to_network">
108 + <?php wp_nonce_field( 'migrate_options_to_network' ) ?>
109 + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Migrate Options to Network' ) ?></button>
110 + </form>
111 + </td>
112 + <?php endif ?>
113 + <td>
114 + <button id="fs_load_db_option" class="button"><?php fs_esc_html_echo_inline( 'Load DB Option' ) ?></button>
115 + </td>
116 + <td>
117 + <button id="fs_set_db_option" class="button"><?php fs_esc_html_echo_inline( 'Set DB Option' ) ?></button>
118 + </td>
119 + <td>
120 + <?php
121 + $fs_debug_page_url = 'admin.php?page=freemius&fs_action=allow_clone_resolution_notice';
122 + $fs_debug_page_url = fs_is_network_admin() ?
123 + network_admin_url( $fs_debug_page_url ) :
124 + admin_url( $fs_debug_page_url );
125 + ?>
126 + <a href="<?php echo wp_nonce_url( $fs_debug_page_url, 'fs_allow_clone_resolution_notice' ) ?>" class="button button-primary">Resolve Clone(s)</a>
127 + </td>
128 + </tr>
129 + </tbody>
130 +</table>
131 +<script type="text/javascript">
132 + (function ($) {
133 + $('#fs_load_db_option').click(function () {
134 + var optionName = prompt('Please enter the option name:');
135 +
136 + if (optionName) {
137 + $.post(<?php echo Freemius::ajax_url() ?>, {
138 + action : 'fs_get_db_option',
139 + // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
140 + _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_db_option' ) ); ?>,
141 + option_name: optionName
142 + }, function (response) {
143 + if (response.data.value)
144 + prompt('The option value is:', response.data.value);
145 + else
146 + alert('Oops... Option does not exist in the DB.');
147 + });
148 + }
149 + });
150 +
151 + $('#fs_set_db_option').click(function () {
152 + var optionName = prompt('Please enter the option name:');
153 +
154 + if (optionName) {
155 + var optionValue = prompt('Please enter the option value:');
156 +
157 + if (optionValue) {
158 + $.post(<?php echo Freemius::ajax_url() ?>, {
159 + action : 'fs_set_db_option',
160 + // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
161 + _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_set_db_option' ) ); ?>,
162 + option_name : optionName,
163 + option_value: optionValue
164 + }, function () {
165 + alert('Option was successfully set.');
166 + });
167 + }
168 + }
169 + });
170 + })(jQuery);
171 +</script>
172 +<?php
173 + if ( ! defined( 'FS_API__ADDRESS' ) ) {
174 + define( 'FS_API__ADDRESS', '://api.freemius.com' );
175 + }
176 + if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) {
177 + define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' );
178 + }
179 +
180 + $defines = array(
181 + array(
182 + 'key' => 'WP_FS__REMOTE_ADDR',
183 + 'val' => WP_FS__REMOTE_ADDR,
184 + ),
185 + array(
186 + 'key' => 'WP_FS__ADDRESS_PRODUCTION',
187 + 'val' => WP_FS__ADDRESS_PRODUCTION,
188 + ),
189 + array(
190 + 'key' => 'FS_API__ADDRESS',
191 + 'val' => FS_API__ADDRESS,
192 + ),
193 + array(
194 + 'key' => 'FS_API__SANDBOX_ADDRESS',
195 + 'val' => FS_API__SANDBOX_ADDRESS,
196 + ),
197 + array(
198 + 'key' => 'WP_FS__DIR',
199 + 'val' => WP_FS__DIR,
200 + ),
201 + array(
202 + 'key' => 'wp_using_ext_object_cache()',
203 + 'val' => wp_using_ext_object_cache() ? 'true' : 'false',
204 + ),
205 + )
206 +?>
207 +<br>
208 +<table class="widefat">
209 + <thead>
210 + <tr>
211 + <th><?php fs_esc_html_echo_inline( 'Key', 'key' ) ?></th>
212 + <th><?php fs_esc_html_echo_inline( 'Value', 'value' ) ?></th>
213 + </tr>
214 + </thead>
215 + <tbody>
216 + <?php $alternate = false;
217 + foreach ( $defines as $p ) : ?>
218 + <tr<?php if ( $alternate ) {
219 + echo ' class="alternate"';
220 + } ?>>
221 + <td><?php echo $p['key'] ?></td>
222 + <td><?php echo $p['val'] ?></td>
223 + </tr>
224 + <?php $alternate = ! $alternate ?>
225 + <?php endforeach ?>
226 + </tbody>
227 +</table>
228 +<h2><?php fs_esc_html_echo_x_inline( 'SDK Versions', 'as software development kit versions', 'sdk-versions' ) ?></h2>
229 +<table id="fs_sdks" class="widefat">
230 + <thead>
231 + <tr>
232 + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
233 + <th><?php fs_esc_html_echo_inline( 'SDK Path' ) ?></th>
234 + <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th>
235 + <th><?php fs_esc_html_echo_inline( 'Is Active' ) ?></th>
236 + </tr>
237 + </thead>
238 + <tbody>
239 + <?php foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) : ?>
240 + <?php $is_active = ( WP_FS__SDK_VERSION == $data->version ) ?>
241 + <tr<?php if ( $is_active ) {
242 + echo ' style="background: #E6FFE6; font-weight: bold"';
243 + } ?>>
244 + <td><?php echo $data->version ?></td>
245 + <td><?php echo $sdk_path ?></td>
246 + <td><?php echo $data->plugin_path ?></td>
247 + <td><?php echo ( $is_active ) ? 'Active' : 'Inactive' ?></td>
248 + </tr>
249 + <?php endforeach ?>
250 + </tbody>
251 +</table>
252 +
253 +<?php
254 + $module_types = array(
255 + WP_FS__MODULE_TYPE_PLUGIN,
256 + WP_FS__MODULE_TYPE_THEME
257 + );
258 +?>
259 +<?php $active_modules_by_id = array() ?>
260 +<?php foreach ( $module_types as $module_type ) : ?>
261 + <?php $modules = fs_get_entities( $fs_options->get_option( $module_type . 's' ), FS_Plugin::get_class_name() ) ?>
262 + <?php if ( is_array( $modules ) && count( $modules ) > 0 ) : ?>
263 + <h2><?php echo esc_html( ( WP_FS__MODULE_TYPE_PLUGIN == $module_type ) ? fs_text_inline( 'Plugins', 'plugins' ) : fs_text_inline( 'Themes', 'themes' ) ) ?></h2>
264 + <table id="fs_<?php echo $module_type ?>" class="widefat">
265 + <thead>
266 + <tr>
267 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
268 + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
269 + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
270 + <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th>
271 + <th><?php fs_esc_html_echo_x_inline( 'API', 'as application program interface' ) ?></th>
272 + <th><?php fs_esc_html_echo_inline( 'Freemius State' ) ?></th>
273 + <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th>
274 + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
275 + <?php if ( $is_multisite ) : ?>
276 + <th><?php fs_esc_html_echo_inline( 'Network Blog' ) ?></th>
277 + <th><?php fs_esc_html_echo_inline( 'Network User' ) ?></th>
278 + <?php endif ?>
279 + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
280 + </tr>
281 + </thead>
282 + <tbody>
283 + <?php foreach ( $modules as $slug => $data ) : ?>
284 + <?php
285 + if ( WP_FS__MODULE_TYPE_THEME !== $module_type ) {
286 + $is_active = is_plugin_active( $data->file );
287 + } else {
288 + $current_theme = wp_get_theme();
289 + $is_active = ( $current_theme->stylesheet === $data->file );
290 +
291 + if ( ! $is_active && is_child_theme() ) {
292 + $parent_theme = $current_theme->parent();
293 +
294 + $is_active = ( ( $parent_theme instanceof WP_Theme ) && $parent_theme->stylesheet === $data->file );
295 + }
296 + }
297 + ?>
298 + <?php
299 + $fs = null;
300 + if ( $is_active ) {
301 + $fs = freemius( $data->id );
302 +
303 + $active_modules_by_id[ $data->id ] = true;
304 + }
305 + ?>
306 + <tr<?php if ( $is_active ) {
307 + $has_api_connectivity = $fs->has_api_connectivity();
308 +
309 + if ( true === $has_api_connectivity && $fs->is_on() ) {
310 + echo ' style="background: #E6FFE6; font-weight: bold"';
311 + } else {
312 + echo ' style="background: #ffd0d0; font-weight: bold"';
313 + }
314 + } ?>>
315 + <td><?php echo $data->id ?></td>
316 + <td><?php echo $slug ?></td>
317 + <td><?php echo $data->version ?></td>
318 + <td><?php echo $data->title ?></td>
319 + <td<?php if ( $is_active && true !== $has_api_connectivity ) {
320 + echo ' style="color: red; text-transform: uppercase;"';
321 + } ?>><?php if ( $is_active ) {
322 + echo esc_html( true === $has_api_connectivity ?
323 + fs_text_x_inline( 'Connected', 'as connection was successful' ) :
324 + ( false === $has_api_connectivity ?
325 + fs_text_x_inline( 'Blocked', 'as connection blocked' ) :
326 + fs_text_x_inline( 'Unknown', 'API connectivity state is unknown' ) )
327 + );
328 + } ?></td>
329 + <td<?php if ( $is_active && ! $fs->is_on() ) {
330 + echo ' style="color: red; text-transform: uppercase;"';
331 + } ?>><?php if ( $is_active ) {
332 + echo esc_html( $fs->is_on() ?
333 + $on_text :
334 + $off_text
335 + );
336 + } ?></td>
337 + <td><?php echo $data->file ?></td>
338 + <td><?php echo $data->public_key ?></td>
339 + <?php if ( $is_multisite ) : ?>
340 + <?php
341 + $network_blog_id = null;
342 + $network_user = null;
343 +
344 + if ( is_object( $fs ) ) {
345 + $network_blog_id = $fs->get_network_install_blog_id();
346 + $network_user = $fs->get_network_user();
347 + }
348 + ?>
349 + <td><?php echo is_numeric( $network_blog_id ) ? $network_blog_id : '' ?></td>
350 + <td><?php if ( is_object( $network_user ) ) {
351 + echo $network_user->email;
352 + } ?></td>
353 + <?php endif ?>
354 + <td>
355 + <?php if ( $is_active ) : ?>
356 + <?php if ( $fs->has_trial_plan() ) : ?>
357 + <form action="" method="POST">
358 + <input type="hidden" name="fs_action" value="simulate_trial">
359 + <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>">
360 + <?php wp_nonce_field( 'simulate_trial' ) ?>
361 +
362 + <button type="submit" class="button button-primary simulate-trial"><?php fs_esc_html_echo_inline( 'Simulate Trial Promotion' ) ?></button>
363 + </form>
364 + <?php endif ?>
365 + <?php if ( $fs->is_registered() ) : ?>
366 + <a class="button" href="<?php echo $fs->get_account_url() ?>"><?php fs_esc_html_echo_inline( 'Account', 'account' ) ?></a>
367 + <?php endif ?>
368 + <?php if ( fs_is_network_admin() && ! $fs->is_network_upgrade_mode() ) : ?>
369 + <form action="" method="POST">
370 + <input type="hidden" name="fs_action" value="simulate_network_upgrade">
371 + <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>">
372 + <?php wp_nonce_field( 'simulate_network_upgrade' ) ?>
373 +
374 + <button type="submit" class="button button-small"><?php fs_esc_html_echo_inline( 'Simulate Network Upgrade' ) ?></button>
375 + </form>
376 + <?php endif ?>
377 + <?php endif ?>
378 + </td>
379 + </tr>
380 + <?php endforeach ?>
381 + </tbody>
382 + </table>
383 + <?php endif ?>
384 +<?php endforeach ?>
385 +<?php foreach ( $module_types as $module_type ) : ?>
386 + <?php
387 + /**
388 + * @var array $VARS
389 + * @var array[string]FS_Site|array[string]FS_Site[] $sites_map
390 + */
391 + $sites_map = $VARS[ $module_type . '_sites' ];
392 +
393 + $all_plans = false;
394 + ?>
395 + <?php if ( is_array( $sites_map ) && count( $sites_map ) > 0 ) : ?>
396 + <h2><?php echo esc_html( sprintf(
397 + /* translators: %s: 'plugin' or 'theme' */
398 + fs_text_inline( '%s Installs', 'module-installs' ),
399 + ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) )
400 + ) ) ?> / <?php fs_esc_html_echo_x_inline( 'Sites', 'like websites', 'sites' ) ?></h2>
401 + <table id="fs_<?php echo $module_type ?>_installs" class="widefat">
402 + <thead>
403 + <tr>
404 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
405 + <?php if ( $is_multisite ) : ?>
406 + <th><?php fs_esc_html_echo_inline( 'Blog ID' ) ?></th>
407 + <th><?php fs_esc_html_echo_inline( 'Address' ) ?></th>
408 + <?php endif ?>
409 + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
410 + <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th>
411 + <th><?php fs_esc_html_echo_inline( 'License ID' ) ?></th>
412 + <th><?php fs_esc_html_echo_x_inline( 'Plan', 'as product pricing plan', 'plan' ) ?></th>
413 + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
414 + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
415 + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
416 + </tr>
417 + </thead>
418 + <tbody>
419 + <?php $site_url = null ?>
420 + <?php foreach ( $sites_map as $slug => $sites ) : ?>
421 + <?php foreach ( $sites as $site ) : ?>
422 + <?php
423 + $blog_id = $is_multisite ?
424 + $site->blog_id :
425 + null;
426 +
427 + if ( is_null( $site_url ) || $is_multisite ) {
428 + $site_url = Freemius::get_unfiltered_site_url(
429 + $blog_id,
430 + true,
431 + true
432 + );
433 + }
434 +
435 + $is_active_clone = ( $site->is_clone( $site_url ) && isset( $active_modules_by_id[ $site->plugin_id ] ) );
436 +
437 + if ( $is_active_clone ) {
438 + $has_any_active_clone = true;
439 + }
440 + ?>
441 + <tr>
442 + <td>
443 + <?php echo $site->id ?>
444 + <?php if ( $is_active_clone ) : ?>
445 + <label class="fs-tag fs-warn">Clone</label>
446 + <?php endif ?>
447 + </td>
448 + <?php if ( $is_multisite ) : ?>
449 + <td><?php echo $blog_id ?></td>
450 + <td><?php echo fs_strip_url_protocol( $site->url ) ?></td>
451 + <?php endif ?>
452 + <td><?php echo $slug ?></td>
453 + <td><?php echo $site->user_id ?></td>
454 + <td><?php echo !empty($site->license_id) ? $site->license_id : '' ?></td>
455 + <td><?php
456 + $plan_name = '';
457 + if ( FS_Plugin_Plan::is_valid_id( $site->plan_id ) ) {
458 + if ( false === $all_plans ) {
459 + $option_name = 'plans';
460 + if ( WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) {
461 + $option_name = $module_type . '_' . $option_name;
462 + }
463 +
464 + $all_plans = fs_get_entities( $fs_options->get_option( $option_name, array() ), FS_Plugin_Plan::get_class_name() );
465 + }
466 +
467 + foreach ( $all_plans[ $slug ] as $plan ) {
468 + $plan_id = Freemius::_decrypt( $plan->id );
469 +
470 + if ( $site->plan_id == $plan_id ) {
471 + $plan_name = Freemius::_decrypt( $plan->name );
472 + break;
473 + }
474 + }
475 + }
476 +
477 + echo $plan_name;
478 + ?></td>
479 + <td><?php echo $site->public_key ?></td>
480 + <td><?php
481 + $plugin_storage = FS_Storage::instance( $module_type, $slug );
482 +
483 + echo $plugin_storage->is_whitelabeled ?
484 + FS_Plugin_License::mask_secret_key_for_html( $site->secret_key ) :
485 + esc_html( $site->secret_key );
486 + ?></td>
487 + <td>
488 + <form action="" method="POST">
489 + <input type="hidden" name="fs_action" value="delete_install">
490 + <?php wp_nonce_field( 'delete_install' ) ?>
491 + <input type="hidden" name="module_id" value="<?php echo $site->plugin_id ?>">
492 + <?php if ( $is_multisite ) : ?>
493 + <input type="hidden" name="blog_id" value="<?php echo $site->blog_id ?>">
494 + <?php endif ?>
495 + <input type="hidden" name="module_type" value="<?php echo $module_type ?>">
496 + <input type="hidden" name="slug" value="<?php echo $slug ?>">
497 + <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button>
498 + </form>
499 + </td>
500 + </tr>
501 + <?php endforeach ?>
502 + <?php endforeach ?>
503 + </tbody>
504 + </table>
505 + <?php endif ?>
506 +<?php endforeach ?>
507 +<?php
508 + $addons = $VARS['addons'];
509 +?>
510 +<?php foreach ( $addons as $plugin_id => $plugin_addons ) : ?>
511 + <h2><?php echo esc_html( sprintf( fs_text_inline( 'Add Ons of module %s', 'addons-of-x' ), $plugin_id ) ) ?></h2>
512 + <table id="fs_addons" class="widefat">
513 + <thead>
514 + <tr>
515 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
516 + <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th>
517 + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th>
518 + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th>
519 + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
520 + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
521 + </tr>
522 + </thead>
523 + <tbody>
524 + <?php
525 + /**
526 + * @var FS_Plugin[] $plugin_addons
527 + */
528 + foreach ( $plugin_addons as $addon ) : ?>
529 + <tr>
530 + <td><?php echo $addon->id ?></td>
531 + <td><?php echo $addon->title ?></td>
532 + <td><?php echo $addon->slug ?></td>
533 + <td><?php echo $addon->version ?></td>
534 + <td><?php echo $addon->public_key ?></td>
535 + <td><?php echo esc_html( $addon->secret_key ) ?></td>
536 + </tr>
537 + <?php endforeach ?>
538 + </tbody>
539 + </table>
540 +<?php endforeach ?>
541 +<?php
542 + /**
543 + * @var FS_User[] $users
544 + */
545 + $users = $VARS['users'];
546 + $user_ids_map = array();
547 + $users_with_developer_license_by_id = array();
548 +
549 + if ( is_array( $users ) && ! empty( $users ) ) {
550 + foreach ( $users as $user ) {
551 + $user_ids_map[ $user->id ] = true;
552 + }
553 + }
554 +
555 + foreach ( $module_types as $module_type ) {
556 + /**
557 + * @var FS_Plugin_License[] $licenses
558 + */
559 + $licenses = $VARS[ $module_type . '_licenses' ];
560 +
561 + foreach ( $licenses as $license ) {
562 + if ( $license->is_whitelabeled ) {
563 + $users_with_developer_license_by_id[ $license->user_id ] = true;
564 + }
565 + }
566 + }
567 +
568 +?>
569 +<?php if ( is_array( $users ) && 0 < count( $users ) ) : ?>
570 + <h2><?php fs_esc_html_echo_inline( 'Users' ) ?></h2>
571 + <table id="fs_users" class="widefat">
572 + <thead>
573 + <tr>
574 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
575 + <th><?php fs_esc_html_echo_inline( 'Name' ) ?></th>
576 + <th><?php fs_esc_html_echo_inline( 'Email' ) ?></th>
577 + <th><?php fs_esc_html_echo_inline( 'Verified' ) ?></th>
578 + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th>
579 + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th>
580 + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th>
581 + </tr>
582 + </thead>
583 + <tbody>
584 + <?php foreach ( $users as $user_id => $user ) : ?>
585 + <?php $has_developer_license = isset( $users_with_developer_license_by_id[ $user_id ] ) ?>
586 + <tr>
587 + <td><?php echo $user->id ?></td>
588 + <td><?php echo $has_developer_license ? '' : $user->get_name() ?></td>
589 + <td>
590 + <?php if ( ! $has_developer_license ) : ?>
591 + <a href="mailto:<?php echo esc_attr( $user->email ) ?>"><?php echo $user->email ?></a>
592 + <?php endif ?>
593 + </td>
594 + <td><?php echo $has_developer_license ? '' : json_encode( $user->is_verified ) ?></td>
595 + <td><?php echo $user->public_key ?></td>
596 + <td><?php echo $has_developer_license ? FS_Plugin_License::mask_secret_key_for_html($user->secret_key) : esc_html( $user->secret_key ) ?></td>
597 + <td>
598 + <?php if ( ! $has_developer_license ) : ?>
599 + <form action="" method="POST">
600 + <input type="hidden" name="fs_action" value="delete_user">
601 + <?php wp_nonce_field( 'delete_user' ) ?>
602 + <input type="hidden" name="user_id" value="<?php echo $user->id ?>">
603 + <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button>
604 + </form>
605 + <?php endif ?>
606 + </td>
607 + </tr>
608 + <?php endforeach ?>
609 + </tbody>
610 + </table>
611 +<?php endif ?>
612 +<?php foreach ( $module_types as $module_type ) : ?>
613 + <?php
614 + /**
615 + * @var FS_Plugin_License[] $licenses
616 + */
617 + $licenses = $VARS[ $module_type . '_licenses' ] ?>
618 + <?php if ( is_array( $licenses ) && count( $licenses ) > 0 ) : ?>
619 + <h2><?php echo esc_html( sprintf( fs_text_inline( '%s Licenses', 'module-licenses' ), ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) ) ) ) ?></h2>
620 + <table id="fs_<?php echo $module_type ?>_licenses" class="widefat">
621 + <thead>
622 + <tr>
623 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
624 + <th><?php fs_esc_html_echo_inline( 'Plugin ID' ) ?></th>
625 + <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th>
626 + <th><?php fs_esc_html_echo_inline( 'Plan ID' ) ?></th>
627 + <th><?php fs_esc_html_echo_inline( 'Quota' ) ?></th>
628 + <th><?php fs_esc_html_echo_inline( 'Activated' ) ?></th>
629 + <th><?php fs_esc_html_echo_inline( 'Blocking' ) ?></th>
630 + <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th>
631 + <th><?php fs_esc_html_echo_inline( 'License Key' ) ?></th>
632 + <th><?php fs_esc_html_echo_x_inline( 'Expiration', 'as expiration date' ) ?></th>
633 + </tr>
634 + </thead>
635 + <tbody>
636 + <?php foreach ( $licenses as $license ) : ?>
637 + <tr>
638 + <td><?php echo $license->id ?></td>
639 + <td><?php echo $license->plugin_id ?></td>
640 + <td><?php echo $license->user_id ?></td>
641 + <td><?php echo $license->plan_id ?></td>
642 + <td><?php echo $license->is_unlimited() ? 'Unlimited' : ( $license->is_single_site() ? 'Single Site' : $license->quota ) ?></td>
643 + <td><?php echo $license->activated ?></td>
644 + <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td>
645 + <td><?php echo $license->is_whitelabeled ? 'Whitelabeled' : 'Normal' ?></td>
646 + <td><?php
647 + echo ( $license->is_whitelabeled || ! isset( $user_ids_map[ $license->user_id ] ) ) ?
648 + $license->get_html_escaped_masked_secret_key() :
649 + esc_html( $license->secret_key );
650 + ?></td>
651 + <td><?php echo $license->expiration ?></td>
652 + </tr>
653 + <?php endforeach ?>
654 + </tbody>
655 + </table>
656 + <?php endif ?>
657 +<?php endforeach ?>
658 +<?php if ( FS_Logger::is_storage_logging_on() ) : ?>
659 +
660 + <h2><?php fs_esc_html_echo_inline( 'Debug Log', 'debug-log' ) ?></h2>
661 +
662 + <div id="fs_debug_filters">
663 + <select name="type">
664 + <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Types', 'all-types' ) ?></option>
665 + <option value="warn_error">Warnings & Errors</option>
666 + <option value="error">Errors</option>
667 + <option value="warn">Warnings</option>
668 + <option value="info">Info</option>
669 + </select>
670 + <select name="request_type">
671 + <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Requests', 'all-requests' ) ?></option>
672 + <option value="call">Sync</option>
673 + <option value="ajax">AJAX</option>
674 + <option value="cron">WP Cron</option>
675 + </select>
676 + <input name="file" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'File' ) ?>"/>
677 + <input name="function" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Function' ) ?>"/>
678 + <input name="process_id" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Process ID' ) ?>"/>
679 + <input name="logger" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Logger' ) ?>"/>
680 + <input name="message" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Message' ) ?>"/>
681 + <div style="margin: 10px 0">
682 + <button id="fs_filter" class="button" style="float: left"><i class="dashicons dashicons-filter"></i> <?php fs_esc_html_echo_inline( 'Filter', 'filter' ) ?>
683 + </button>
684 +
685 + <form action="" method="POST" style="float: left; margin-left: 10px;">
686 + <input type="hidden" name="fs_action" value="download_logs">
687 + <?php wp_nonce_field( 'download_logs' ) ?>
688 + <div class="fs-filters"></div>
689 + <button id="fs_download" class="button" type="submit"><i
690 + class="dashicons dashicons-download"></i> <?php fs_esc_html_echo_inline( 'Download' ) ?></button>
691 + </form>
692 + <div style="clear: both"></div>
693 + </div>
694 + </div>
695 +
696 + <div id="fs_log_book" style="height: 300px; overflow: auto;">
697 + <table class="widefat">
698 + <thead>
699 + <tr>
700 + <th>#</th>
701 + <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th>
702 + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th>
703 + <th><?php fs_esc_html_echo_inline( 'Function' ) ?></th>
704 + <th><?php fs_esc_html_echo_inline( 'Message' ) ?></th>
705 + <th><?php fs_esc_html_echo_inline( 'File' ) ?></th>
706 + <th><?php fs_esc_html_echo_inline( 'Timestamp' ) ?></th>
707 + </tr>
708 + </thead>
709 + <tbody>
710 + <tr style="display: none">
711 + <td>{$log.log_order}.</td>
712 + <td class="fs-col--type">{$log.type}</td>
713 + <td class="fs-col--logger">{$log.logger}</td>
714 + <td class="fs-col--function">{$log.function}</td>
715 + <td class="fs-col--message">
716 + <a href="#" onclick="jQuery(this).parent().find('div').toggle(); return false;">
717 + <nobr>{$log.message_short}</nobr>
718 + </a>
719 + <div style="display: none;">{$log.message}</div>
720 + </td>
721 + <td class="fs-col--file">{$log.file}:{$log.line}</td>
722 + <td class="fs-col--timestamp">{$log.created}</td>
723 + </tr>
724 +
725 + </tbody>
726 + </table>
727 + </div>
728 + <script type="text/javascript">
729 + jQuery(document).ready(function ($) {
730 + var filtersChanged = false,
731 + offset = 0,
732 + limit = 200,
733 + prevFiltersSignature = null;
734 +
735 + var getFilters = function () {
736 + var filters = {},
737 + signature = '';
738 +
739 + $('#fs_debug_filters').find('select, input').each(function (i, e) {
740 + var $element = $(e);
741 +
742 + if ('hidden' === $element.attr('type'))
743 + return;
744 +
745 + var val = $element.val();
746 + if ('' !== val.trim()) {
747 + var name = $(e).attr('name');
748 + filters[name] = val;
749 + signature += name + '=' + val + '~';
750 + }
751 + });
752 +
753 + if (signature != prevFiltersSignature) {
754 + filtersChanged = true;
755 + prevFiltersSignature = signature;
756 + } else {
757 + filtersChanged = false;
758 + }
759 +
760 + return filters;
761 + };
762 +
763 + $('#fs_download').parent().submit(function () {
764 + var filters = getFilters(),
765 + hiddenFields = '';
766 +
767 + for (var f in filters) {
768 + if (filters.hasOwnProperty(f)) {
769 + hiddenFields += '<input type="hidden" name="filters[' + f + ']" value="' + filters[f] + '" />';
770 + }
771 + }
772 +
773 + $(this).find('.fs-filters').html(hiddenFields);
774 + });
775 +
776 + var loadLogs = function () {
777 + var $tbody = $('#fs_log_book tbody'),
778 + template = $tbody.find('tr:first-child').html(),
779 + filters = getFilters();
780 +
781 + if (!filtersChanged) {
782 + offset += limit;
783 + } else {
784 + // Cleanup table for new filter (only keep template row).
785 + $tbody.find('tr').each(function (i, e) {
786 + if (0 == i)
787 + return;
788 +
789 + $(e).remove();
790 + });
791 +
792 + offset = 0;
793 + }
794 +
795 + $.post(<?php echo Freemius::ajax_url() ?>, {
796 + action : 'fs_get_debug_log',
797 + // As such we don't need to use `wp_json_encode` method but using it to follow wp.org guideline.
798 + _wpnonce : <?php echo wp_json_encode( wp_create_nonce( 'fs_get_debug_log' ) ); ?>,
799 + filters: filters,
800 + offset : offset,
801 + limit : limit
802 + }, function (response) {
803 +
804 + for (var i = 0; i < response.data.length; i++) {
805 + var templateCopy = template;
806 +
807 + response.data[i].message_short = (response.data[i].message.length > 32) ?
808 + response.data[i].message.substr(0, 32) + '...' :
809 + response.data[i].message;
810 +
811 + for (var p in response.data[i]) {
812 + if (response.data[i].hasOwnProperty(p)) {
813 + templateCopy = templateCopy.replace('{$log.' + p + '}', response.data[i][p]);
814 + }
815 + }
816 +
817 + $tbody.append('<tr' + (i % 2 ? ' class="alternate"' : '') + '>' + templateCopy + '</tr>');
818 + }
819 + });
820 + };
821 +
822 + $('#fs_filter').click(function () {
823 + loadLogs();
824 +
825 + return false;
826 + });
827 +
828 + loadLogs();
829 + });
830 + </script>
831 +<?php endif ?>