Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: cloud.cls.php
}
[500] Fix | Delete
[501] Fix | Delete
$data = [
[502] Fix | Delete
'wp_ts' => time(),
[503] Fix | Delete
];
[504] Fix | Delete
$data['wp_signature_b64'] = $this->_sign_b64( $data['wp_ts'] );
[505] Fix | Delete
[506] Fix | Delete
// Activation redirect
[507] Fix | Delete
$param = [
[508] Fix | Delete
'site_url' => site_url(),
[509] Fix | Delete
'ver' => Core::VER,
[510] Fix | Delete
'data' => $data,
[511] Fix | Delete
'ref' => $this->_get_ref_url(),
[512] Fix | Delete
];
[513] Fix | Delete
wp_safe_redirect( $this->_cloud_server_dash . '/' . self::SVC_U_ENABLE_CDN . '?data=' . rawurlencode( Utility::arr2str( $param ) ) );
[514] Fix | Delete
exit;
[515] Fix | Delete
}
[516] Fix | Delete
[517] Fix | Delete
/**
[518] Fix | Delete
* Encrypt data for cloud req
[519] Fix | Delete
*
[520] Fix | Delete
* @since 7.0
[521] Fix | Delete
*
[522] Fix | Delete
* @param string|int $data Data to sign.
[523] Fix | Delete
* @return string|false
[524] Fix | Delete
*/
[525] Fix | Delete
private function _sign_b64( $data ) {
[526] Fix | Delete
if ( empty( $this->_summary['sk_b64'] ) ) {
[527] Fix | Delete
self::debugErr( 'No sk to sign.' );
[528] Fix | Delete
return false;
[529] Fix | Delete
}
[530] Fix | Delete
$sk = base64_decode( $this->_summary['sk_b64'] ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
[531] Fix | Delete
if ( strlen( $sk ) !== SODIUM_CRYPTO_SIGN_SECRETKEYBYTES ) {
[532] Fix | Delete
self::debugErr( 'Invalid local sign sk length.' );
[533] Fix | Delete
// Reset local pk/sk
[534] Fix | Delete
unset( $this->_summary['pk_b64'] );
[535] Fix | Delete
unset( $this->_summary['sk_b64'] );
[536] Fix | Delete
$this->save_summary();
[537] Fix | Delete
self::debug( 'Clear local sign pk/sk pair.' );
[538] Fix | Delete
[539] Fix | Delete
return false;
[540] Fix | Delete
}
[541] Fix | Delete
$signature = sodium_crypto_sign_detached( (string) $data, $sk );
[542] Fix | Delete
return base64_encode( $signature ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
[543] Fix | Delete
}
[544] Fix | Delete
[545] Fix | Delete
/**
[546] Fix | Delete
* Load server pk from cloud
[547] Fix | Delete
*
[548] Fix | Delete
* @since 7.0
[549] Fix | Delete
*
[550] Fix | Delete
* @param bool $from_wpapi Load from WP API server.
[551] Fix | Delete
* @return string|false Binary public key or false.
[552] Fix | Delete
*/
[553] Fix | Delete
private function _load_server_pk( $from_wpapi = false ) {
[554] Fix | Delete
// Load cloud pk
[555] Fix | Delete
$server_key_url = $this->_cloud_server . '/' . self::API_SERVER_KEY_SIGN;
[556] Fix | Delete
if ( $from_wpapi ) {
[557] Fix | Delete
$server_key_url = $this->_cloud_server_wp . '/' . self::API_SERVER_KEY_SIGN;
[558] Fix | Delete
}
[559] Fix | Delete
$resp = wp_safe_remote_get( $server_key_url );
[560] Fix | Delete
if ( is_wp_error( $resp ) ) {
[561] Fix | Delete
self::debugErr( 'Failed to load key: ' . $resp->get_error_message() );
[562] Fix | Delete
return false;
[563] Fix | Delete
}
[564] Fix | Delete
$pk = trim( $resp['body'] );
[565] Fix | Delete
self::debug( 'Loaded key from ' . $server_key_url . ': ' . $pk );
[566] Fix | Delete
$cloud_pk = base64_decode( $pk ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
[567] Fix | Delete
if ( strlen( $cloud_pk ) !== SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES ) {
[568] Fix | Delete
self::debugErr( 'Invalid cloud public key length.' );
[569] Fix | Delete
return false;
[570] Fix | Delete
}
[571] Fix | Delete
[572] Fix | Delete
$sk = base64_decode( $this->_summary['sk_b64'] ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
[573] Fix | Delete
if ( strlen( $sk ) !== SODIUM_CRYPTO_SIGN_SECRETKEYBYTES ) {
[574] Fix | Delete
self::debugErr( 'Invalid local secret key length.' );
[575] Fix | Delete
// Reset local pk/sk
[576] Fix | Delete
unset( $this->_summary['pk_b64'] );
[577] Fix | Delete
unset( $this->_summary['sk_b64'] );
[578] Fix | Delete
$this->save_summary();
[579] Fix | Delete
self::debug( 'Unset local pk/sk pair.' );
[580] Fix | Delete
[581] Fix | Delete
return false;
[582] Fix | Delete
}
[583] Fix | Delete
[584] Fix | Delete
return $cloud_pk;
[585] Fix | Delete
}
[586] Fix | Delete
[587] Fix | Delete
/**
[588] Fix | Delete
* WPAPI echo back to notify the sealed databox
[589] Fix | Delete
*
[590] Fix | Delete
* @since 7.0
[591] Fix | Delete
*/
[592] Fix | Delete
public function wp_rest_echo() {
[593] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing
[594] Fix | Delete
self::debug( 'Parsing echo', $_POST );
[595] Fix | Delete
[596] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing
[597] Fix | Delete
$ts = !empty( $_POST['wpapi_ts'] ) ? sanitize_text_field( wp_unslash( $_POST['wpapi_ts'] ) ) : '';
[598] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing
[599] Fix | Delete
$sig = !empty( $_POST['wpapi_signature_b64'] ) ? sanitize_text_field( wp_unslash( $_POST['wpapi_signature_b64'] ) ) : '';
[600] Fix | Delete
[601] Fix | Delete
if ( empty( $ts ) || empty( $sig ) ) {
[602] Fix | Delete
return self::err( 'No echo data' );
[603] Fix | Delete
}
[604] Fix | Delete
[605] Fix | Delete
$is_valid = $this->_validate_signature( $sig, $ts, true );
[606] Fix | Delete
if ( ! $is_valid ) {
[607] Fix | Delete
return self::err( 'Data validation from WPAPI REST Echo failed' );
[608] Fix | Delete
}
[609] Fix | Delete
[610] Fix | Delete
$diff = time() - (int) $ts;
[611] Fix | Delete
if ( abs( $diff ) > 86400 ) {
[612] Fix | Delete
self::debugErr( 'WPAPI echo data timeout [diff] ' . $diff );
[613] Fix | Delete
return self::err( 'Echo data expired' );
[614] Fix | Delete
}
[615] Fix | Delete
[616] Fix | Delete
$signature_b64 = $this->_sign_b64( $ts );
[617] Fix | Delete
self::debug( 'Response to echo [signature_b64] ' . $signature_b64 );
[618] Fix | Delete
return self::ok( [ 'signature_b64' => $signature_b64 ] );
[619] Fix | Delete
}
[620] Fix | Delete
[621] Fix | Delete
/**
[622] Fix | Delete
* Validate cloud data
[623] Fix | Delete
*
[624] Fix | Delete
* @since 7.0
[625] Fix | Delete
*
[626] Fix | Delete
* @param string $signature_b64 Base64 signature.
[627] Fix | Delete
* @param string $data Data to validate.
[628] Fix | Delete
* @param bool $from_wpapi Whether the signature is from WP API server.
[629] Fix | Delete
* @return bool
[630] Fix | Delete
*/
[631] Fix | Delete
private function _validate_signature( $signature_b64, $data, $from_wpapi = false ) {
[632] Fix | Delete
// Try validation
[633] Fix | Delete
try {
[634] Fix | Delete
$cloud_pk = $this->_load_server_pk( $from_wpapi );
[635] Fix | Delete
if ( ! $cloud_pk ) {
[636] Fix | Delete
return false;
[637] Fix | Delete
}
[638] Fix | Delete
$signature = base64_decode( $signature_b64 ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
[639] Fix | Delete
$is_valid = sodium_crypto_sign_verify_detached( $signature, (string) $data, $cloud_pk );
[640] Fix | Delete
} catch ( \SodiumException $e ) {
[641] Fix | Delete
self::debugErr( 'Decryption failed: ' . esc_html( $e->getMessage() ) );
[642] Fix | Delete
return false;
[643] Fix | Delete
}
[644] Fix | Delete
self::debug( 'Signature validation result: ' . ( $is_valid ? 'true' : 'false' ) );
[645] Fix | Delete
return $is_valid;
[646] Fix | Delete
}
[647] Fix | Delete
[648] Fix | Delete
/**
[649] Fix | Delete
* Finish qc activation after redirection back from QC
[650] Fix | Delete
*
[651] Fix | Delete
* @since 7.0
[652] Fix | Delete
*
[653] Fix | Delete
* @param string|false $ref Ref slug.
[654] Fix | Delete
*/
[655] Fix | Delete
public function finish_qc_activation( $ref = false ) {
[656] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
[657] Fix | Delete
$qc_activated = !empty( $_GET['qc_activated'] ) ? sanitize_text_field( wp_unslash( $_GET['qc_activated'] ) ) : '';
[658] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
[659] Fix | Delete
$qc_ts = !empty( $_GET['qc_ts'] ) ? sanitize_text_field( wp_unslash( $_GET['qc_ts'] ) ) : '';
[660] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
[661] Fix | Delete
$qc_sig = !empty( $_GET['qc_signature_b64'] ) ? sanitize_text_field( wp_unslash( $_GET['qc_signature_b64'] ) ) : '';
[662] Fix | Delete
[663] Fix | Delete
if ( ! $qc_activated || ! $qc_ts || ! $qc_sig ) {
[664] Fix | Delete
return;
[665] Fix | Delete
}
[666] Fix | Delete
[667] Fix | Delete
$data_to_validate_signature = [
[668] Fix | Delete
'wp_pk_b64' => $this->_summary['pk_b64'],
[669] Fix | Delete
'qc_ts' => $qc_ts,
[670] Fix | Delete
];
[671] Fix | Delete
$is_valid = $this->_validate_signature( $qc_sig, implode( '', $data_to_validate_signature ) );
[672] Fix | Delete
if ( ! $is_valid ) {
[673] Fix | Delete
self::debugErr( 'Failed to validate qc activation data' );
[674] Fix | Delete
Admin_Display::error( sprintf( __( 'Failed to validate %s activation data.', 'litespeed-cache' ), 'QUIC.cloud' ) );
[675] Fix | Delete
return;
[676] Fix | Delete
}
[677] Fix | Delete
[678] Fix | Delete
self::debug( 'QC activation status: ' . $qc_activated );
[679] Fix | Delete
if ( ! in_array( $qc_activated, [ 'anonymous', 'linked', 'cdn' ], true ) ) {
[680] Fix | Delete
self::debugErr( 'Failed to parse qc activation status' );
[681] Fix | Delete
Admin_Display::error( sprintf( __( 'Failed to parse %s activation status.', 'litespeed-cache' ), 'QUIC.cloud' ) );
[682] Fix | Delete
return;
[683] Fix | Delete
}
[684] Fix | Delete
[685] Fix | Delete
$diff = time() - (int) $qc_ts;
[686] Fix | Delete
if ( abs( $diff ) > 86400 ) {
[687] Fix | Delete
self::debugErr( 'QC activation data timeout [diff] ' . $diff );
[688] Fix | Delete
Admin_Display::error( sprintf( __( '%s activation data expired.', 'litespeed-cache' ), 'QUIC.cloud' ) );
[689] Fix | Delete
return;
[690] Fix | Delete
}
[691] Fix | Delete
[692] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended
[693] Fix | Delete
$main_domain = ! empty( $_GET['main_domain'] ) ? sanitize_text_field( wp_unslash( $_GET['main_domain'] ) ) : false;
[694] Fix | Delete
$this->update_qc_activation( $qc_activated, $main_domain );
[695] Fix | Delete
[696] Fix | Delete
wp_safe_redirect( $this->_get_ref_url( $ref ) );
[697] Fix | Delete
exit;
[698] Fix | Delete
}
[699] Fix | Delete
[700] Fix | Delete
/**
[701] Fix | Delete
* Finish qc activation process
[702] Fix | Delete
*
[703] Fix | Delete
* @since 7.0
[704] Fix | Delete
*
[705] Fix | Delete
* @param string $qc_activated Activation status.
[706] Fix | Delete
* @param string|bool $main_domain Main domain.
[707] Fix | Delete
* @param bool $quite Quiet flag.
[708] Fix | Delete
*/
[709] Fix | Delete
public function update_qc_activation( $qc_activated, $main_domain = false, $quite = false ) {
[710] Fix | Delete
$this->_summary['qc_activated'] = $qc_activated;
[711] Fix | Delete
if ( $main_domain ) {
[712] Fix | Delete
$this->_summary['main_domain'] = $main_domain;
[713] Fix | Delete
}
[714] Fix | Delete
$this->save_summary();
[715] Fix | Delete
[716] Fix | Delete
$msg = sprintf( __( 'Congratulations, %s successfully set this domain up for the anonymous online services.', 'litespeed-cache' ), 'QUIC.cloud' );
[717] Fix | Delete
if ( 'linked' === $qc_activated ) {
[718] Fix | Delete
$msg = sprintf( __( 'Congratulations, %s successfully set this domain up for the online services.', 'litespeed-cache' ), 'QUIC.cloud' );
[719] Fix | Delete
// Sync possible partner info
[720] Fix | Delete
$this->sync_usage();
[721] Fix | Delete
}
[722] Fix | Delete
if ( 'cdn' === $qc_activated ) {
[723] Fix | Delete
$msg = sprintf( __( 'Congratulations, %s successfully set this domain up for the online services with CDN service.', 'litespeed-cache' ), 'QUIC.cloud' );
[724] Fix | Delete
// Turn on CDN option
[725] Fix | Delete
$this->cls( 'Conf' )->update_confs( [ self::O_CDN_QUIC => true ] );
[726] Fix | Delete
}
[727] Fix | Delete
if ( ! $quite ) {
[728] Fix | Delete
Admin_Display::success( '🎊 ' . $msg );
[729] Fix | Delete
}
[730] Fix | Delete
[731] Fix | Delete
$this->_clear_reset_qc_reg_msg();
[732] Fix | Delete
[733] Fix | Delete
$this->clear_cloud();
[734] Fix | Delete
}
[735] Fix | Delete
[736] Fix | Delete
/**
[737] Fix | Delete
* Load QC status for dash usage.
[738] Fix | Delete
* Format to translate: `<a href="{#xxx#}" class="button button-primary">xxxx</a><a href="{#xxx#}">xxxx2</a>`
[739] Fix | Delete
*
[740] Fix | Delete
* @since 7.0
[741] Fix | Delete
*
[742] Fix | Delete
* @param string $type Type.
[743] Fix | Delete
* @param bool $force Force refresh.
[744] Fix | Delete
* @return string
[745] Fix | Delete
*/
[746] Fix | Delete
public function load_qc_status_for_dash( $type, $force = false ) {
[747] Fix | Delete
return Str::translate_qc_apis( $this->_load_qc_status_for_dash( $type, $force ) );
[748] Fix | Delete
}
[749] Fix | Delete
[750] Fix | Delete
/**
[751] Fix | Delete
* Internal: load QC status HTML for dash.
[752] Fix | Delete
*
[753] Fix | Delete
* @param string $type Type.
[754] Fix | Delete
* @param bool $force Force refresh.
[755] Fix | Delete
* @return string
[756] Fix | Delete
*/
[757] Fix | Delete
private function _load_qc_status_for_dash( $type, $force = false ) {
[758] Fix | Delete
if (
[759] Fix | Delete
! $force &&
[760] Fix | Delete
! empty( $this->_summary['mini_html'] ) &&
[761] Fix | Delete
isset( $this->_summary['mini_html'][ $type ] ) &&
[762] Fix | Delete
! empty( $this->_summary['mini_html'][ 'ttl.' . $type ] ) &&
[763] Fix | Delete
$this->_summary['mini_html'][ 'ttl.' . $type ] > time()
[764] Fix | Delete
) {
[765] Fix | Delete
return Str::safe_html( $this->_summary['mini_html'][ $type ] );
[766] Fix | Delete
}
[767] Fix | Delete
[768] Fix | Delete
// Try to update dash content
[769] Fix | Delete
$data = self::post( self::SVC_D_DASH, [ 'action2' => ( 'cdn_dash_mini' === $type ? 'cdn_dash' : $type ) ] );
[770] Fix | Delete
if ( ! empty( $data['qc_activated'] ) ) {
[771] Fix | Delete
// Sync conf as changed
[772] Fix | Delete
if ( empty( $this->_summary['qc_activated'] ) || $this->_summary['qc_activated'] !== $data['qc_activated'] ) {
[773] Fix | Delete
$msg = sprintf( __( 'Congratulations, %s successfully set this domain up for the online services with CDN service.', 'litespeed-cache' ), 'QUIC.cloud' );
[774] Fix | Delete
Admin_Display::success( '🎊 ' . $msg );
[775] Fix | Delete
$this->_clear_reset_qc_reg_msg();
[776] Fix | Delete
// Turn on CDN option
[777] Fix | Delete
$this->cls( 'Conf' )->update_confs( [ self::O_CDN_QUIC => true ] );
[778] Fix | Delete
$this->cls( 'CDN\Quic' )->try_sync_conf( true );
[779] Fix | Delete
}
[780] Fix | Delete
[781] Fix | Delete
$this->_summary['qc_activated'] = $data['qc_activated'];
[782] Fix | Delete
$this->save_summary();
[783] Fix | Delete
}
[784] Fix | Delete
[785] Fix | Delete
// Show the info
[786] Fix | Delete
if ( isset( $this->_summary['mini_html'][ $type ] ) ) {
[787] Fix | Delete
return Str::safe_html( $this->_summary['mini_html'][ $type ] );
[788] Fix | Delete
}
[789] Fix | Delete
[790] Fix | Delete
return '';
[791] Fix | Delete
}
[792] Fix | Delete
[793] Fix | Delete
/**
[794] Fix | Delete
* Update QC status
[795] Fix | Delete
*
[796] Fix | Delete
* @since 7.0
[797] Fix | Delete
*/
[798] Fix | Delete
public function update_cdn_status() {
[799] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Missing
[800] Fix | Delete
$qc_activated = !empty( $_POST['qc_activated'] ) ? sanitize_text_field( wp_unslash( $_POST['qc_activated'] ) ) : '';
[801] Fix | Delete
[802] Fix | Delete
if ( !$qc_activated || ! in_array( $qc_activated, [ 'anonymous', 'linked', 'cdn', 'deleted' ], true ) ) {
[803] Fix | Delete
return self::err( 'lack_of_params' );
[804] Fix | Delete
}
[805] Fix | Delete
[806] Fix | Delete
self::debug( 'update_cdn_status request hash: ' . $qc_activated );
[807] Fix | Delete
[808] Fix | Delete
if ( 'deleted' === $qc_activated ) {
[809] Fix | Delete
$this->_reset_qc_reg();
[810] Fix | Delete
} else {
[811] Fix | Delete
$this->_summary['qc_activated'] = $qc_activated;
[812] Fix | Delete
$this->save_summary();
[813] Fix | Delete
}
[814] Fix | Delete
[815] Fix | Delete
if ( 'cdn' === $qc_activated ) {
[816] Fix | Delete
$msg = sprintf( __( 'Congratulations, %s successfully set this domain up for the online services with CDN service.', 'litespeed-cache' ), 'QUIC.cloud' );
[817] Fix | Delete
Admin_Display::success( '🎊 ' . $msg );
[818] Fix | Delete
$this->_clear_reset_qc_reg_msg();
[819] Fix | Delete
// Turn on CDN option
[820] Fix | Delete
$this->cls( 'Conf' )->update_confs( [ self::O_CDN_QUIC => true ] );
[821] Fix | Delete
$this->cls( 'CDN\Quic' )->try_sync_conf( true );
[822] Fix | Delete
}
[823] Fix | Delete
[824] Fix | Delete
return self::ok( [ 'qc_activated' => $qc_activated ] );
[825] Fix | Delete
}
[826] Fix | Delete
[827] Fix | Delete
/**
[828] Fix | Delete
* Reset QC setup
[829] Fix | Delete
*
[830] Fix | Delete
* @since 7.0
[831] Fix | Delete
*/
[832] Fix | Delete
public function reset_qc() {
[833] Fix | Delete
unset( $this->_summary['pk_b64'] );
[834] Fix | Delete
unset( $this->_summary['sk_b64'] );
[835] Fix | Delete
unset( $this->_summary['qc_activated'] );
[836] Fix | Delete
if ( ! empty( $this->_summary['partner'] ) ) {
[837] Fix | Delete
unset( $this->_summary['partner'] );
[838] Fix | Delete
}
[839] Fix | Delete
$this->save_summary();
[840] Fix | Delete
self::debug( 'Clear local QC activation.' );
[841] Fix | Delete
[842] Fix | Delete
$this->clear_cloud();
[843] Fix | Delete
[844] Fix | Delete
Admin_Display::success( sprintf( __( 'Reset %s activation successfully.', 'litespeed-cache' ), 'QUIC.cloud' ) );
[845] Fix | Delete
wp_safe_redirect( $this->_get_ref_url() );
[846] Fix | Delete
exit;
[847] Fix | Delete
}
[848] Fix | Delete
[849] Fix | Delete
/**
[850] Fix | Delete
* Show latest commit version always if is on dev
[851] Fix | Delete
*
[852] Fix | Delete
* @since 3.0
[853] Fix | Delete
*/
[854] Fix | Delete
public function check_dev_version() {
[855] Fix | Delete
if ( ! preg_match( '/[^\d\.]/', Core::VER ) ) {
[856] Fix | Delete
return;
[857] Fix | Delete
}
[858] Fix | Delete
[859] Fix | Delete
$last_check = empty( $this->_summary[ 'last_request.' . self::API_VER ] ) ? 0 : $this->_summary[ 'last_request.' . self::API_VER ];
[860] Fix | Delete
[861] Fix | Delete
if ( time() - $last_check > 86400 ) {
[862] Fix | Delete
$auto_v = self::version_check( 'dev' );
[863] Fix | Delete
if ( ! empty( $auto_v['dev'] ) ) {
[864] Fix | Delete
self::save_summary( [ 'version.dev' => $auto_v['dev'] ] );
[865] Fix | Delete
}
[866] Fix | Delete
}
[867] Fix | Delete
[868] Fix | Delete
if ( empty( $this->_summary['version.dev'] ) ) {
[869] Fix | Delete
return;
[870] Fix | Delete
}
[871] Fix | Delete
[872] Fix | Delete
self::debug( 'Latest dev version ' . $this->_summary['version.dev'] );
[873] Fix | Delete
[874] Fix | Delete
if ( version_compare( $this->_summary['version.dev'], Core::VER, '<=' ) ) {
[875] Fix | Delete
return;
[876] Fix | Delete
}
[877] Fix | Delete
[878] Fix | Delete
// Show the dev banner
[879] Fix | Delete
require_once LSCWP_DIR . 'tpl/banner/new_version_dev.tpl.php';
[880] Fix | Delete
}
[881] Fix | Delete
[882] Fix | Delete
/**
[883] Fix | Delete
* Check latest version
[884] Fix | Delete
*
[885] Fix | Delete
* @since 2.9
[886] Fix | Delete
* @access public
[887] Fix | Delete
*
[888] Fix | Delete
* @param string|false $src Source.
[889] Fix | Delete
* @return mixed
[890] Fix | Delete
*/
[891] Fix | Delete
public static function version_check( $src = false ) {
[892] Fix | Delete
$req_data = [
[893] Fix | Delete
'v' => defined( 'LSCWP_CUR_V' ) ? LSCWP_CUR_V : '',
[894] Fix | Delete
'src' => $src,
[895] Fix | Delete
'php' => phpversion(),
[896] Fix | Delete
];
[897] Fix | Delete
// If code ver is smaller than db ver, bypass
[898] Fix | Delete
if ( ! empty( $req_data['v'] ) && version_compare( Core::VER, $req_data['v'], '<' ) ) {
[899] Fix | Delete
return;
[900] Fix | Delete
}
[901] Fix | Delete
if ( defined( 'LITESPEED_ERR' ) ) {
[902] Fix | Delete
$litespeed_err = constant( 'LITESPEED_ERR' );
[903] Fix | Delete
$req_data['err'] = base64_encode( ! is_string( $litespeed_err ) ? wp_json_encode( $litespeed_err ) : $litespeed_err ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
[904] Fix | Delete
}
[905] Fix | Delete
$data = self::post( self::API_VER, $req_data );
[906] Fix | Delete
[907] Fix | Delete
return $data;
[908] Fix | Delete
}
[909] Fix | Delete
[910] Fix | Delete
/**
[911] Fix | Delete
* Show latest news
[912] Fix | Delete
*
[913] Fix | Delete
* @since 3.0
[914] Fix | Delete
*/
[915] Fix | Delete
public function news() {
[916] Fix | Delete
$this->_update_news();
[917] Fix | Delete
[918] Fix | Delete
if ( empty( $this->_summary['news.new'] ) ) {
[919] Fix | Delete
return;
[920] Fix | Delete
}
[921] Fix | Delete
[922] Fix | Delete
if ( ! empty( $this->_summary['news.plugin'] ) && Activation::cls()->dash_notifier_is_plugin_active( $this->_summary['news.plugin'] ) ) {
[923] Fix | Delete
return;
[924] Fix | Delete
}
[925] Fix | Delete
[926] Fix | Delete
require_once LSCWP_DIR . 'tpl/banner/cloud_news.tpl.php';
[927] Fix | Delete
}
[928] Fix | Delete
[929] Fix | Delete
/**
[930] Fix | Delete
* Update latest news
[931] Fix | Delete
*
[932] Fix | Delete
* @since 2.9.9.1
[933] Fix | Delete
*/
[934] Fix | Delete
private function _update_news() {
[935] Fix | Delete
if ( ! empty( $this->_summary['news.utime'] ) && time() - (int) $this->_summary['news.utime'] < 86400 * 7 ) {
[936] Fix | Delete
return;
[937] Fix | Delete
}
[938] Fix | Delete
[939] Fix | Delete
self::save_summary( [ 'news.utime' => time() ] );
[940] Fix | Delete
[941] Fix | Delete
$data = self::get( self::API_NEWS );
[942] Fix | Delete
if ( empty( $data['id'] ) ) {
[943] Fix | Delete
return;
[944] Fix | Delete
}
[945] Fix | Delete
[946] Fix | Delete
// Save news
[947] Fix | Delete
if ( ! empty( $this->_summary['news.id'] ) && (string) $this->_summary['news.id'] === (string) $data['id'] ) {
[948] Fix | Delete
return;
[949] Fix | Delete
}
[950] Fix | Delete
[951] Fix | Delete
$this->_summary['news.id'] = $data['id'];
[952] Fix | Delete
$this->_summary['news.plugin'] = ! empty( $data['plugin'] ) ? $data['plugin'] : '';
[953] Fix | Delete
$this->_summary['news.title'] = ! empty( $data['title'] ) ? $data['title'] : '';
[954] Fix | Delete
$this->_summary['news.content'] = ! empty( $data['content'] ) ? $data['content'] : '';
[955] Fix | Delete
$this->_summary['news.zip'] = ! empty( $data['zip'] ) ? $data['zip'] : '';
[956] Fix | Delete
$this->_summary['news.new'] = 1;
[957] Fix | Delete
[958] Fix | Delete
if ( $this->_summary['news.plugin'] ) {
[959] Fix | Delete
$plugin_info = Activation::cls()->dash_notifier_get_plugin_info( $this->_summary['news.plugin'] );
[960] Fix | Delete
if ( $plugin_info && ! empty( $plugin_info->name ) ) {
[961] Fix | Delete
$this->_summary['news.plugin_name'] = $plugin_info->name;
[962] Fix | Delete
}
[963] Fix | Delete
}
[964] Fix | Delete
[965] Fix | Delete
self::save_summary();
[966] Fix | Delete
}
[967] Fix | Delete
[968] Fix | Delete
/**
[969] Fix | Delete
* Check if contains a package in a service or not
[970] Fix | Delete
*
[971] Fix | Delete
* @since 4.0
[972] Fix | Delete
*
[973] Fix | Delete
* @param string $service Service.
[974] Fix | Delete
* @param int $pkg Package flag.
[975] Fix | Delete
* @return bool
[976] Fix | Delete
*/
[977] Fix | Delete
public function has_pkg( $service, $pkg ) {
[978] Fix | Delete
if ( ! empty( $this->_summary[ 'usage.' . $service ]['pkgs'] ) && ( $this->_summary[ 'usage.' . $service ]['pkgs'] & $pkg ) ) {
[979] Fix | Delete
return true;
[980] Fix | Delete
}
[981] Fix | Delete
[982] Fix | Delete
return false;
[983] Fix | Delete
}
[984] Fix | Delete
[985] Fix | Delete
/**
[986] Fix | Delete
* Get allowance of current service
[987] Fix | Delete
*
[988] Fix | Delete
* @since 3.0
[989] Fix | Delete
* @access private
[990] Fix | Delete
*
[991] Fix | Delete
* @param string $service Service.
[992] Fix | Delete
* @param string|bool $err Error code by ref.
[993] Fix | Delete
* @return int
[994] Fix | Delete
*/
[995] Fix | Delete
public function allowance( $service, &$err = false ) {
[996] Fix | Delete
// Only auto sync usage at most one time per day
[997] Fix | Delete
if ( empty( $this->_summary[ 'last_request.' . self::SVC_D_USAGE ] ) || time() - (int) $this->_summary[ 'last_request.' . self::SVC_D_USAGE ] > 86400 ) {
[998] Fix | Delete
$this->sync_usage();
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function