Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 243
0.00% covered (danger)
0.00%
0 / 29
CRAP
n/a
0 / 0
zeroBSCRM_checkSystemFeat
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 1
30
zeroBSCRM_checkSystemFeat_permalinks
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_fontinstalled
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_checkSystemFeat_corever
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_dbver
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_dalver
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_phpver
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_wordpressver
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_local
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_checkSystemFeat_serverdefaulttime
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_localtime
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_devmode
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
30
zeroBSCRM_checkSystemFeat_sqlrights
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_checkSystemFeat_dbserver
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_innodb
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_checkSystemFeat_executiontime
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_checkSystemFeat_memorylimit
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_postmaxsize
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_uploadmaxfilesize
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_wpuploadmaxfilesize
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_encryptionmethod
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
30
zeroBSCRM_checkPrettyPermalinks
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_zlib
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_checkSystemFeat_mb_internal_encoding
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
zbscrm_check_system_feat_dompdf
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_checkSystemFeat_pdffonts
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_checkSystemFeat_curl
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_checkSystemFeat_locale
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
zeroBSCRM_checkSystemFeat_assetdir
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/*
3 * Jetpack CRM
4 * https://jetpackcrm.com
5 * V1.20
6 *
7 * Copyright 2020 Automattic
8 *
9 * Date: 01/11/16
10 */
11
12defined( 'ZEROBSCRM_PATH' ) || exit( 0 );
13
14/*
15======================================================
16    Generic System Check Wrapper/Helper funcs
17    ====================================================== */
18
19/**
20 * Check if a PHP systems/library is correctly installed.
21 *
22 * @param string $key The feature we want to know the status off.
23 * @param bool   $with_info Weather we should return a message or not.
24 *
25 * @return array|false
26 */
27function zeroBSCRM_checkSystemFeat( $key = '', $with_info = false ) {
28
29    $feat_list = array(
30        'zlib',
31        'dompdf',
32        'mb_internal_encoding',
33        'pdffonts',
34        'curl',
35        'phpver',
36        'wordpressver',
37        'locale',
38        'assetdir',
39        'executiontime',
40        'memorylimit',
41        'postmaxsize',
42        'uploadmaxfilesize',
43        'wpuploadmaxfilesize',
44        'dbver',
45        'dalver',
46        'corever',
47        'local',
48        'localtime',
49        'serverdefaulttime',
50        'sqlrights',
51        'devmode',
52        'permalinks',
53        'dbserver',
54        'innodb',
55        'fontinstalled',
56        'encryptionmethod',
57    );
58
59    if ( in_array( $key, $feat_list, true ) ) {
60        if ( function_exists( 'zeroBSCRM_checkSystemFeat_' . $key ) ) {
61            return call_user_func_array( 'zeroBSCRM_checkSystemFeat_' . $key, array( $with_info ) );
62        }
63
64        if ( function_exists( 'zbscrm_check_system_feat_' . $key ) ) {
65            return call_user_func_array( 'zbscrm_check_system_feat_' . $key, array( $with_info ) );
66        }
67    }
68
69    if ( ! $with_info ) {
70        return false;
71    } else {
72        return array( false, __( 'No Check!', 'zero-bs-crm' ) );
73    }
74}
75
76function zeroBSCRM_checkSystemFeat_permalinks() {
77    if ( zeroBSCRM_checkPrettyPermalinks() ) {
78                $enabled = true;
79            $enabledStr  = 'Permalinks ' . get_option( 'permalink_structure' );
80                return array( $enabled, $enabledStr );
81    } else {
82                $enabled    = false;
83                $enabledStr = ' Pretty Permalinks need to be enabled';
84                return array( $enabled, $enabledStr );
85    }
86}
87
88function zeroBSCRM_checkSystemFeat_fontinstalled( $withInfo = false ) {
89
90    global $zbs;
91
92    $fonts = $zbs->get_fonts();
93
94    if ( ! $withInfo ) {
95        return $fonts->default_fonts_installed();
96    } else {
97
98        $enabled = $fonts->default_fonts_installed();
99        if ( $enabled ) {
100            $enabledStr = __( 'Font installed', 'zero-bs-crm' );
101        } else {
102            $enabledStr = sprintf( __( 'Font not installed (<a href="%s" target="_blank">reinstall pdf engine module</a>)', 'zero-bs-crm' ), jpcrm_esc_link( $zbs->slugs['modules'] ) );
103        }
104
105        return array( $enabled, $enabledStr );
106    }
107}
108
109function zeroBSCRM_checkSystemFeat_corever( $withInfo = false ) {
110    global $zbs;
111
112    if ( ! $withInfo ) {
113        return $zbs::VERSION;
114    } else {
115        $enabled     = true;
116        $enabled_str = 'Version ' . $zbs::VERSION;
117
118        return array( $enabled, $enabled_str );
119    }
120}
121
122function zeroBSCRM_checkSystemFeat_dbver( $withInfo = false ) {
123    global $zbs;
124
125    if ( ! $withInfo ) {
126        return $zbs->db_version;
127    } else {
128
129        $enabled    = true;
130        $enabledStr = 'Database Version ' . $zbs->db_version;
131
132        return array( $enabled, $enabledStr );
133    }
134}
135
136function zeroBSCRM_checkSystemFeat_dalver( $withInfo = false ) {
137    global $zbs;
138
139    if ( ! $withInfo ) {
140        return $zbs->dal_version;
141    } else {
142
143        $enabled    = true;
144        $enabledStr = 'Data Access Layer Version ' . $zbs->dal_version;
145
146        return array( $enabled, $enabledStr );
147    }
148}
149
150function zeroBSCRM_checkSystemFeat_phpver( $withInfo = false ) {
151
152    if ( ! $withInfo ) {
153        return PHP_VERSION;
154    } else {
155
156        $enabled    = true;
157        $enabledStr = 'PHP Version ' . PHP_VERSION;
158
159        return array( $enabled, $enabledStr );
160    }
161}
162
163function zeroBSCRM_checkSystemFeat_wordpressver( $withInfo = false ) {
164    global $wp_version;
165
166    if ( ! $withInfo ) {
167        return $wp_version;
168    } else {
169
170        $enabled    = true;
171        $enabledStr = sprintf( __( 'WordPress Version %s', 'zero-bs-crm' ), $wp_version );
172
173        return array( $enabled, $enabledStr );
174    }
175}
176
177function zeroBSCRM_checkSystemFeat_local( $withInfo = false ) {
178
179    $local = zeroBSCRM_isLocal();
180
181    if ( ! $withInfo ) {
182        return ! $local;
183    } else {
184
185        $enabled = ! $local;
186        if ( $local ) {
187            $enabledStr = 'Running Locally<br />This may cause connectivity issues with SMTP (Emails) and updates/feature downloads.';
188        } else {
189            $enabledStr = 'Connectivity Okay.';
190        }
191
192        return array( $enabled, $enabledStr );
193    }
194}
195function zeroBSCRM_checkSystemFeat_serverdefaulttime( $withInfo = false ) {
196
197    /*
198        if (function_exists('locale_get_default'))
199        $locale = locale_get_default();
200    else
201        $locale = Locale::getDefault();
202    */
203        $tz = date_default_timezone_get();
204
205    if ( ! $withInfo ) {
206        return true;
207    } else {
208
209        $enabled    = true;
210        $enabledStr = $tz;
211
212        return array( $enabled, $enabledStr );
213    }
214}
215function zeroBSCRM_checkSystemFeat_localtime( $withInfo = false ) {
216
217    $enabled = true;
218
219    if ( ! $withInfo ) {
220        return true;
221    } else {
222
223        $enabledStr = 'CRM Time: ' . zeroBSCRM_date_i18n( 'Y-m-d H:i:s', time() ) . ' (GMT: ' . date_i18n( 'Y-m-d H:i:s', time(), true ) . ')';
224
225        return array( $enabled, $enabledStr );
226    }
227}
228
229    // in devmode or not?
230function zeroBSCRM_checkSystemFeat_devmode( $withInfo = false ) {
231
232    $isLocal = zeroBSCRM_isLocal();
233
234    if ( ! $withInfo ) {
235        return $isLocal;
236    } else {
237
238        global $zbs;
239
240        $devModeStr = '';
241
242        if ( ! $isLocal ) {
243
244            // check if overriden
245            $key = $zbs->DAL->setting( 'localoverride', false );
246
247            // if set, less than 48h ago, is overriden
248            if ( $key !== false && $key > time() - 172800 ) {
249                $devModeStr = __( 'Production', 'zero-bs-crm' ) . ' (override)';
250            } else { // normal production (99% users)
251                $devModeStr = __( 'Production', 'zero-bs-crm' );
252            }
253        } else {
254
255            // devmode proper
256            $devModeStr = __( 'Developer Mode', 'zero-bs-crm' );
257
258        }
259
260        return array( $isLocal, $devModeStr );
261    }
262}
263
264    // https://wordpress.stackexchange.com/questions/6424/mysql-database-user-which-privileges-are-needed
265    // can we create tables?
266function zeroBSCRM_checkSystemFeat_sqlrights( $withInfo = false ) {
267
268    global $wpdb;
269
270    // run check tables
271    zeroBSCRM_checkTablesExist();
272    $lastError = $wpdb->last_error;
273
274    $okay = true;
275    if ( str_contains( $lastError, 'command denied' ) ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
276        $okay = false;
277    }
278
279    if ( ! $withInfo ) {
280        return $okay;
281    } else {
282
283        global $zbs;
284
285        $enabled = $okay;
286        if ( $enabled ) {
287            $enabledStr = __( 'Appears Okay', 'zero-bs-crm' );
288        } else {
289            $enabledStr = __( 'Error', 'zero-bs-crm' ) . ': ' . $lastError;
290        }
291
292        return array( $enabled, $enabledStr );
293    }
294}
295
296/**
297 * Get info about the database server engine and version.
298 *
299 * @param boolean $with_info Provides extra info.
300 */
301function zeroBSCRM_checkSystemFeat_dbserver( $with_info = false ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
302    if ( ! $with_info ) {
303        return zeroBSCRM_database_getVersion();
304    } else {
305        return array( 1, jpcrm_database_engine( true ) . ' (' . zeroBSCRM_database_getVersion() . ')' );
306    }
307}
308
309    // got InnoDB?
310function zeroBSCRM_checkSystemFeat_innodb( $withInfo = false ) {
311
312    if ( ! $withInfo ) {
313        return zeroBSCRM_DB_canInnoDB() ? __( 'Available', 'zero-bs-crm' ) : __( 'Not Available', 'zero-bs-crm' );
314    } else {
315        $innoDB = zeroBSCRM_DB_canInnoDB();
316        return array( $innoDB, ( $innoDB ? __( 'Available', 'zero-bs-crm' ) : __( 'Not Available', 'zero-bs-crm' ) ) );
317    }
318}
319
320    // below here: https://stackoverflow.com/questions/8744107/increase-max-execution-time-in-php
321
322function zeroBSCRM_checkSystemFeat_executiontime( $withInfo = false ) {
323
324        $maxExecution = ini_get( 'max_execution_time' );
325
326    if ( ! $withInfo ) {
327        return $maxExecution;
328    } else {
329
330        $str = $maxExecution . ' seconds';
331
332        // catch infinites
333        if ( $maxExecution == '0' ) {
334            $str = 'No Limit';
335        }
336
337        return array( $maxExecution, $str );
338
339    }
340}
341
342function zeroBSCRM_checkSystemFeat_memorylimit( $withInfo = false ) {
343
344        $maxMemory = ini_get( 'memory_limit' );
345
346    if ( ! $withInfo ) {
347        return $maxMemory;
348    } else {
349
350        $str = $maxMemory;
351
352        return array( $maxMemory, $str );
353
354    }
355}
356
357function zeroBSCRM_checkSystemFeat_postmaxsize( $withInfo = false ) {
358
359        $post_max_size = ini_get( 'post_max_size' );
360
361    if ( ! $withInfo ) {
362        return $post_max_size;
363    } else {
364
365        $str = $post_max_size;
366
367        return array( $post_max_size, $str );
368
369    }
370}
371
372function zeroBSCRM_checkSystemFeat_uploadmaxfilesize( $withInfo = false ) {
373
374        $upload_max_filesize = ini_get( 'upload_max_filesize' );
375
376    if ( ! $withInfo ) {
377        return $upload_max_filesize;
378    } else {
379
380        $str = $upload_max_filesize;
381
382        return array( $upload_max_filesize, $str );
383
384    }
385}
386
387function zeroBSCRM_checkSystemFeat_wpuploadmaxfilesize( $withInfo = false ) {
388
389        // https://codex.wordpress.org/Function_Reference/wp_max_upload_size
390        $wp_max_upload_size = zeroBSCRM_prettyformatBytes( wp_max_upload_size() );
391
392    if ( ! $withInfo ) {
393        return $wp_max_upload_size;
394    } else {
395
396        $str = $wp_max_upload_size;
397
398        return array( $wp_max_upload_size, $str );
399
400    }
401}
402
403    /*
404     * Encryption method check
405     */
406function zeroBSCRM_checkSystemFeat_encryptionmethod( $withInfo = false ) {
407
408    global $zbs;
409
410    // load encryption
411    $encryption = $zbs->load_encryption();
412
413    // any issues?
414    $return_string = '';
415
416    // check if has flipped fallback previously
417    $fallback_blocked = zeroBSCRM_getSetting( 'enc_fallback_blocked' );
418    if ( ! empty( $fallback_blocked ) ) {
419
420        $return_string = __( '<span class="ui label red">Warning!</span> Encryption disabled due to no available encryption method. Please contact support.', 'zero-bs-crm' );
421
422    }
423
424    // check if has flipped fallback previously
425    $fallback_active = zeroBSCRM_getSetting( 'enc_fallback_active' );
426    if ( ! empty( $fallback_active ) ) {
427
428        $return_string = sprintf( __( '<span class="ui label orange">Note:</span> Encryption using fallback method (%s) due to no available encryption method. Please contact support.', 'zero-bs-crm' ), $encryption->cipher_method() );
429
430    }
431
432    if ( ! $withInfo ) {
433
434        return $encryption->ready_to_encrypt();
435
436    } else {
437
438        if ( empty( $return_string ) ) {
439
440                $return_string = $encryption->cipher_method();
441
442        }
443
444        return array( $encryption->ready_to_encrypt(), $return_string );
445
446    }
447}
448
449// https://codex.wordpress.org/Using_Permalinks#Tips_and_Tricks
450function zeroBSCRM_checkPrettyPermalinks() {
451    if ( get_option( 'permalink_structure' ) ) {
452        return true;
453    } else {
454        return false;
455    }
456}
457
458/*
459======================================================
460    / Generic System Check Wrapper/Helper funcs
461    ====================================================== */
462
463/*
464======================================================
465    Specific System Check Wrapper/Helper funcs
466    ====================================================== */
467
468function zeroBSCRM_checkSystemFeat_zlib( $withInfo = false ) {
469
470    if ( ! $withInfo ) {
471
472        return class_exists( 'ZipArchive' );
473
474    } else {
475
476        $enabled = class_exists( 'ZipArchive' );
477        $str     = __( 'zlib is properly enabled on your server.', 'zero-bs-crm' );
478        if ( ! $enabled ) {
479
480            $str = __( 'zlib is disabled on your server.', 'zero-bs-crm' );
481
482            // see if fallback pclzip is working
483            if ( class_exists( 'PclZip' ) ) {
484
485                // it's probably all fine
486                $enabled = true;
487                $str    .= ' ' . __( "But don't worry, as the fallback PclZip appears to work.", 'zero-bs-crm' );
488
489            }
490        }
491
492        return array( $enabled, $str );
493
494    }
495}
496
497    /**
498     *
499     * Verify mb_internal_encoding (required by dompdf)
500     */
501function zeroBSCRM_checkSystemFeat_mb_internal_encoding( $withInfo = false ) {
502    $enabled = function_exists( 'mb_internal_encoding' );
503    if ( ! $withInfo ) {
504        return $enabled;
505    }
506
507    $str = __( 'The mbstring PHP module is properly enabled on your server.', 'zero-bs-crm' );
508
509    if ( ! $enabled ) {
510        $str = __( 'The mbstring PHP module is disabled on your server, which may prevent PDFs from being generated.', 'zero-bs-crm' );
511    }
512
513    return array( $enabled, $str );
514}
515
516/**
517 * Check if Dompdf is installed correctly on the server.
518 *
519 * @param false $with_info Determine if the returning results contains an explanatory string.
520 *
521 * @return array|bool
522 */
523function zbscrm_check_system_feat_dompdf( $with_info = false ) {
524    $enabled = class_exists( Dompdf\Dompdf::class );
525
526    if ( ! $with_info ) {
527        return $enabled;
528    }
529
530    if ( ! $enabled ) {
531        return array(
532            $enabled,
533            __( 'PDF Engine is not installed on your server.', 'zero-bs-crm' ),
534        );
535    }
536
537    try {
538        $dompdf  = new \Dompdf\Dompdf();
539        $version = $dompdf->version;
540    } catch ( \Exception $e ) {
541        $version = 'unknown';
542    }
543
544    return array(
545        $enabled,
546        /* translators: %s a version that explain which library is used and what version number it's running. */
547        sprintf( __( 'PDF Engine is properly installed on your server (Version: %s).', 'zero-bs-crm' ), $version ),
548    );
549}
550
551function zeroBSCRM_checkSystemFeat_pdffonts( $withInfo = false ) {
552
553    // get fonts dir
554    $fonts_dir       = jpcrm_storage_fonts_dir_path();
555    $fonts_installed = file_exists( $fonts_dir . 'fonts-info.txt' );
556
557    if ( ! $withInfo ) {
558        return $fonts_installed;
559    } else {
560
561        $str = 'PDF fonts appear to be installed on your server.';
562        if ( ! $fonts_installed ) {
563            $str = 'PDF fonts do not appear to be installed on your server.';
564        }
565
566        return array( $fonts_installed, $str );
567
568    }
569}
570function zeroBSCRM_checkSystemFeat_curl( $withInfo = false ) {
571
572    if ( ! $withInfo ) {
573        return function_exists( 'curl_init' );
574    } else {
575
576        $enabled = function_exists( 'curl_init' );
577        $str     = 'CURL is enabled on your server.';
578        if ( ! $enabled ) {
579            $str = 'CURL is not enabled on your server.';
580        }
581
582        return array( $enabled, $str );
583
584    }
585}
586function zeroBSCRM_checkSystemFeat_locale( $withInfo = false ) {
587
588    if ( ! $withInfo ) {
589        return true;
590    } else {
591
592        $locale = zeroBSCRM_getLocale();
593        $str    = 'WordPress Locale is set to <strong>' . $locale . '</strong>';
594
595        $str .= ' (Server: ' . zeroBSCRM_locale_getServerLocale() . ')';
596
597        return array( true, $str );
598
599    }
600}
601
602function zeroBSCRM_checkSystemFeat_assetdir() {
603
604    $potentialDirObj = zeroBSCRM_privatisedDirCheck();
605    if ( is_array( $potentialDirObj ) && isset( $potentialDirObj['path'] ) ) {
606        $potentialDir = $potentialDirObj['path'];
607    } else {
608        $potentialDir = false;
609    }
610
611    $enabled    = false;
612    $enabledStr = 'Using Default WP Upload Library';
613
614    if ( ! empty( $potentialDir ) ) {
615        $enabled    = true;
616        $enabledStr = $potentialDir;
617    }
618
619    return array( $enabled, $enabledStr );
620}