PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.12.3
Translate and Go multilingual – Automatic AI translation – wpLingua v2.12.3
2.16.7 2.16.6 2.16.5 2.16.4 2.16.3 2.16.2 2.16.1 2.16.0 2.15.2 2.15.1 2.15.0 2.14.3 2.14.2 2.14.1 2.14.0 2.13.1 2.13.0 2.12.3 2.12.2 2.12.1 trunk 1.0.3 1.0.4 1.0.5 1.1.0 All 112 releases
wplingua / inc / api-key.php

api-key.php in Translate and Go multilingual – Automatic AI translation – wpLingua 2.12.3, at inc/api-key.php

416 lines 8.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // If this file is called directly, abort.
4 if ( ! defined( 'WPINC' ) ) {
5 die;
6 }
7
8
9 /**
10 * Validate a wpLingua API key
11 *
12 * @param string $api_key
13 * @return bool
14 */
15 function wplng_is_valid_api_key_format( $api_key ) {
16
17 $regex = '/^[a-zA-Z0-9]{42}$/s';
18
19 if (
20 empty( $api_key )
21 || ! is_string( $api_key )
22 || false === preg_match( $regex, $api_key )
23 ) {
24 return false;
25 }
26
27 return true;
28 }
29
30
31 /**
32 * Get the wpLingua registered API key
33 *
34 * @return string
35 */
36 function wplng_get_api_key() {
37
38 $api_key = trim( get_option( 'wplng_api_key' ) );
39
40 if ( ! wplng_is_valid_api_key_format( $api_key ) ) {
41 $api_key = '';
42 }
43
44 return $api_key;
45 }
46
47
48 /**
49 * Get wpLingua API key data
50 * - Website language (id or 'all')
51 * - Target language(s) (array)
52 * - Enabled features
53 *
54 * @return array
55 */
56 function wplng_get_api_data( $try_update_from_api = false ) {
57
58 global $wplng_api_data;
59
60 if ( $wplng_api_data !== null && $try_update_from_api === false ) {
61 return $wplng_api_data;
62 }
63
64 if ( empty( wplng_get_api_key() ) ) {
65 return array();
66 }
67
68 /**
69 * Get data from cache or API
70 */
71
72 $data_checked = array();
73 $data = array();
74 $data_from_cache = get_option( 'wplng_api_key_data' );
75
76 if ( ! empty( $data_from_cache ) ) {
77 $data_from_cache = json_decode( $data_from_cache, true );
78 if ( ! is_array( $data_from_cache ) ) {
79 $data_from_cache = array();
80 }
81 }
82
83 if ( empty( $data_from_cache ) ) {
84
85 /**
86 * No data in cache
87 */
88
89 // Try to get update from API
90 $data = wplng_api_call_validate_api_key();
91
92 // If no data in cache and no data from API, return empty array
93 if ( empty( $data ) ) {
94 return array();
95 }
96
97 $data['time'] = time();
98
99 } else {
100
101 /**
102 * Data is in cache
103 */
104
105 $data = $data_from_cache;
106
107 // Time of last update is not define, set is as current time
108 if ( empty( $data['time'] )
109 || ! is_int( $data['time'] )
110 ) {
111 $data['time'] = time();
112 }
113
114 // Time of last update older than 8 hours
115 // Or $try_update_from_api is true
116 // Try to get update from API
117 if ( ( $data['time'] + ( 8 * HOUR_IN_SECONDS ) ) <= time()
118 || $try_update_from_api === true
119 ) {
120
121 $data_from_api = wplng_api_call_validate_api_key();
122
123 if ( ! empty( $data_from_api ) ) {
124 $data = $data_from_api;
125 $data['time'] = time();
126 }
127 }
128 }
129
130 /**
131 * Check the API key data
132 */
133
134 if ( ! empty( $data['language_original'] )
135 && (
136 wplng_is_valid_language_id( $data['language_original'] )
137 || 'all' === $data['language_original']
138 )
139 && ! empty( $data['languages_target'] )
140 && wplng_is_valid_language_ids( $data['languages_target'] )
141 && isset( $data['features'] )
142 && is_array( $data['features'] )
143 && ! empty( $data['status'] )
144 && ! empty( $data['time'] )
145 && is_int( $data['time'] )
146 ) {
147
148 /**
149 * Sanitize languages target
150 */
151
152 $languages_target = array();
153
154 foreach ( $data['languages_target'] as $id ) {
155
156 if ( ! wplng_is_valid_language_id( $id ) ) {
157 continue;
158 }
159
160 $languages_target[] = sanitize_key( $id );
161 }
162
163 /**
164 * Sanitize features list
165 */
166
167 $features = array();
168
169 foreach ( $data['features'] as $key => $allow ) {
170
171 if ( ! is_string( $key ) || ! is_bool( $allow ) ) {
172 continue;
173 }
174
175 $key = sanitize_key( $key );
176 $allow = ( true === $allow );
177
178 $features[ $key ] = $allow;
179 }
180
181 /**
182 * Sanitize status
183 */
184
185 $status = 'FREE';
186
187 if ( 'PREMIUM' === $data['status']
188 || 'VIP' === $data['status']
189 ) {
190 $status = $data['status'];
191 }
192
193 /**
194 * Make the checked response
195 */
196
197 $data_checked = array(
198 'language_original' => sanitize_key( $data['language_original'] ),
199 'languages_target' => $languages_target,
200 'features' => $features,
201 'status' => $status,
202 'time' => $data['time'],
203 );
204
205 /**
206 * Add expiration
207 */
208
209 if ( ! empty( $data['expiration'] )
210 && is_string( $data['expiration'] )
211 ) {
212 $data_checked['expiration'] = $data['expiration'];
213 }
214 }
215
216 // Set data in DB cache (option)
217 if ( ! empty( $data_checked )
218 && $data_checked !== $data_from_cache
219 ) {
220 update_option(
221 'wplng_api_key_data',
222 wp_json_encode( $data_checked ),
223 true
224 );
225
226 wp_cache_flush();
227 }
228
229 // Set data for global variable
230 $wplng_api_data = $data_checked;
231
232 return $data_checked;
233 }
234
235
236 /**
237 * Get website language from wpLingua API data
238 *
239 * @return string Language ID, 'all' or ''
240 */
241 function wplng_get_api_language_website() {
242
243 $data = wplng_get_api_data();
244
245 if (
246 ! empty( $data['language_original'] )
247 && (
248 wplng_is_valid_language_id( $data['language_original'] )
249 || 'all' === $data['language_original']
250 )
251 ) {
252 return $data['language_original'];
253 }
254
255 return '';
256 }
257
258
259 /**
260 * Get target languages from wpLingua API data
261 *
262 * @return mixed Language IDs array, 'all' or false
263 */
264 function wplng_get_api_languages_target() {
265
266 $data = wplng_get_api_data();
267
268 if ( empty( $data['languages_target'] ) ) {
269 return false;
270 } elseif ( 'all' === $data['languages_target'] ) {
271 return 'all';
272 } elseif ( is_array( $data['languages_target'] ) ) {
273
274 $all_languages = wplng_get_languages_all();
275 $languages_id_ordered = array();
276
277 foreach ( $all_languages as $language ) {
278 foreach ( $data['languages_target'] as $language_id ) {
279
280 if (
281 ! wplng_is_valid_language_id( $language_id )
282 || empty( $language['id'] )
283 || $language['id'] !== $language_id
284 ) {
285 continue;
286 }
287
288 $languages_id_ordered[] = $language_id;
289 break;
290
291 }
292 }
293
294 return $languages_id_ordered;
295 }
296
297 return false;
298 }
299
300
301 /**
302 * Get enabled features from wpLingua API data
303 * ('search', 'commercial', 'detection')
304 *
305 * @return array
306 */
307 function wplng_get_api_feature() {
308
309 $data = wplng_get_api_data();
310 $all = array( 'search', 'commercial', 'detection' );
311 $features = array();
312
313 if ( ! empty( $data['features'] ) && is_array( $data['features'] ) ) {
314 foreach ( $data['features'] as $feature_name => $feature_allow ) {
315 if ( $feature_allow && in_array( $feature_name, $all ) ) {
316 $features[] = $feature_name;
317 }
318 }
319 }
320
321 return $features;
322 }
323
324
325 /**
326 * Return true if the feature is enable in wpLingua API key data
327 *
328 * @param string $feature_name
329 * @return bool
330 */
331 function wplng_api_feature_is_allow( $feature_name ) {
332 return in_array( $feature_name, wplng_get_api_feature() );
333 }
334
335
336 /**
337 * Check if the wpLingua API is overloaded
338 *
339 * This function determines whether the wpLingua API is currently overloaded
340 * based on a stored timestamp. If the API is overloaded, it returns true.
341 * Otherwise, it clears the overloaded status and returns false.
342 *
343 * @global bool|null $wplng_api_is_overloaded Cached overloaded status
344 * @return bool True if the API is overloaded, false otherwise
345 */
346 function wplng_get_api_overloaded() {
347
348 global $wplng_api_is_overloaded;
349
350 // If overload is true, return directly
351 // Else, recheck the value
352 if ( ! empty( $wplng_api_is_overloaded ) ) {
353 return $wplng_api_is_overloaded;
354 }
355
356 $overloaded = get_option( 'wplng_api_overloaded' );
357
358 if ( ! empty( $overloaded )
359 && ( $overloaded + ( 2 * MINUTE_IN_SECONDS ) ) > time()
360 ) {
361 $wplng_api_is_overloaded = true;
362 } else {
363 $wplng_api_is_overloaded = false;
364 delete_option( 'wplng_api_overloaded' );
365 }
366
367 return $wplng_api_is_overloaded;
368 }
369
370
371 /**
372 * Mark the wpLingua API as overloaded
373 *
374 * This function sets the overloaded status for the wpLingua API by updating
375 * a timestamp in the database. If the API is already marked as overloaded,
376 * the function does nothing.
377 *
378 * @global bool|null $wplng_api_is_overloaded Cached overloaded status
379 * @return void
380 */
381 function wplng_set_api_overloaded() {
382
383 if ( wplng_get_api_overloaded() ) {
384 return;
385 }
386
387 global $wplng_api_is_overloaded;
388 $wplng_api_is_overloaded = true;
389
390 update_option(
391 'wplng_api_overloaded',
392 time(),
393 true
394 );
395
396 wp_cache_flush();
397 }
398
399
400 /**
401 * Clear wpLingua API key data if wpLingua key is changed
402 *
403 * @param string $old_value JSON
404 * @param string $new_value JSON
405 * @return void
406 */
407 function wplng_on_update_option_wplng_api_key( $old_value, $new_value ) {
408
409 delete_option( 'wplng_api_key_data' );
410 delete_option( 'wplng_website_language' );
411 delete_option( 'wplng_website_flag' );
412
413 wplng_clear_translations_cache();
414 wplng_clear_slugs_cache();
415 }
416