Contact Form & SMTP Plugin for WordPress by PirateForms - Version 2.2.0

Version Description

  • 2017-09-27
Download this release

Release Info

Developer codeinwp
Plugin Icon 128x128 Contact Form & SMTP Plugin for WordPress by PirateForms
Version 2.2.0
Comparing to
See all releases

Code changes from version 2.1.0 to 2.2.0

Files changed (49) hide show
  1. CHANGELOG.md +7 -0
  2. admin/class-pirateforms-admin.php +52 -8
  3. admin/css/wp-admin.css +8 -0
  4. admin/js/scripts-admin.js +12 -0
  5. includes/class-pirateforms-html.php +33 -4
  6. includes/class-pirateforms-phpformbuilder.php +1 -1
  7. includes/class-pirateforms-util.php +28 -0
  8. includes/class-pirateforms.php +11 -2
  9. pirate-forms.php +2 -2
  10. public/class-pirateforms-public.php +253 -133
  11. public/css/front.css +49 -1
  12. public/js/scripts-general.js +3 -0
  13. public/js/scripts.js +14 -0
  14. readme.txt +8 -0
  15. vendor/autoload.php +0 -7
  16. vendor/autoload_52.php +0 -7
  17. vendor/codeinwp/themeisle-sdk/LICENSE +0 -674
  18. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php +0 -470
  19. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-factory.php +0 -50
  20. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-review.php +0 -185
  21. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback.php +0 -90
  22. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-licenser.php +0 -710
  23. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-loader.php +0 -88
  24. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php +0 -211
  25. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-notification-manager.php +0 -119
  26. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php +0 -401
  27. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php +0 -374
  28. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget.php +0 -50
  29. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widgets-factory.php +0 -37
  30. vendor/codeinwp/themeisle-sdk/composer.json +0 -24
  31. vendor/codeinwp/themeisle-sdk/index.php +0 -5
  32. vendor/codeinwp/themeisle-sdk/load.php +0 -35
  33. vendor/codeinwp/themeisle-sdk/start.php +0 -35
  34. vendor/composer/ClassLoader.php +0 -413
  35. vendor/composer/ClassLoader52.php +0 -271
  36. vendor/composer/LICENSE +0 -21
  37. vendor/composer/autoload_classmap.php +0 -9
  38. vendor/composer/autoload_files.php +0 -10
  39. vendor/composer/autoload_namespaces.php +0 -10
  40. vendor/composer/autoload_psr4.php +0 -9
  41. vendor/composer/autoload_real.php +0 -59
  42. vendor/composer/autoload_real_52.php +0 -46
  43. vendor/composer/installed.json +0 -77
  44. vendor/xrstf/composer-php52/LICENSE +0 -19
  45. vendor/xrstf/composer-php52/README.md +0 -37
  46. vendor/xrstf/composer-php52/composer.json +0 -26
  47. vendor/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php +0 -346
  48. vendor/xrstf/composer-php52/lib/xrstf/Composer52/ClassLoader.php +0 -271
  49. vendor/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php +0 -39
CHANGELOG.md CHANGED
@@ -1,4 +1,11 @@
1
 
 
 
 
 
 
 
 
2
  ### v2.1.0 - 2017-08-26
3
  **Changes:**
4
  * Improved compatibility with the pro version.
1
 
2
+ ### v2.2.0 - 2017-09-27
3
+ **Changes:**
4
+ * Adds integration with Akismet for spam block.
5
+ * Adds another spam tramp mechanism, independent from Google reCAPTCHA.
6
+ * Adds filter for customizing the email body.
7
+ * Improvements for compatibility with the pro version.
8
+
9
  ### v2.1.0 - 2017-08-26
10
  **Changes:**
11
  * Improved compatibility with the pro version.
admin/class-pirateforms-admin.php CHANGED
@@ -223,6 +223,20 @@ class PirateForms_Admin {
223
  $pirate_forms_contactus_email = get_bloginfo( 'admin_email' );
224
  endif;
225
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  // the key(s) will be added to the div as class names
227
  // to enable tooltip popup add 'pirate_dashicons'
228
  return apply_filters(
@@ -276,7 +290,7 @@ class PirateForms_Admin {
276
  'value' => __( 'Store submissions in the database', 'pirate-forms' ),
277
  'html' => '<span class="dashicons dashicons-editor-help"></span>',
278
  'desc' => array(
279
- 'value' => __( 'Should the submissions be stored in the admin area? If chosen, contact form submissions will be saved in Contacts on the left (appears after this option is activated).', 'pirate-forms' ),
280
  'class' => 'pirate_forms_option_description',
281
  ),
282
  ),
@@ -318,7 +332,7 @@ class PirateForms_Admin {
318
  'class' => 'pirate_forms_option_description',
319
  ),
320
  ),
321
- 'value' => PirateForms_Util::get_option( 'pirateformsopt_confirm_email' ),
322
  'wrap' => array(
323
  'type' => 'div',
324
  'class' => 'pirate-forms-grouped',
@@ -344,6 +358,27 @@ class PirateForms_Admin {
344
  ),
345
  'options' => PirateForms_Util::get_thank_you_pages(),
346
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
  )
348
  ),
349
  ),
@@ -448,9 +483,9 @@ class PirateForms_Admin {
448
  /* Recaptcha */
449
  array(
450
  'id' => 'pirateformsopt_recaptcha_field',
451
- 'type' => 'checkbox',
452
  'label' => array(
453
- 'value' => __( 'Add a reCAPTCHA', 'pirate-forms' ),
454
  ),
455
  'default' => $pirate_forms_contactus_recaptcha_show,
456
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_field' ),
@@ -459,7 +494,9 @@ class PirateForms_Admin {
459
  'class' => 'pirate-forms-grouped',
460
  ),
461
  'options' => array(
462
- 'yes' => __( 'Yes', 'pirate-forms' ),
 
 
463
  ),
464
  ),
465
  /* Site key */
@@ -478,7 +515,7 @@ class PirateForms_Admin {
478
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_sitekey' ),
479
  'wrap' => array(
480
  'type' => 'div',
481
- 'class' => 'pirate-forms-grouped',
482
  ),
483
  ),
484
  /* Secret key */
@@ -492,7 +529,7 @@ class PirateForms_Admin {
492
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_secretkey' ),
493
  'wrap' => array(
494
  'type' => 'div',
495
- 'class' => 'pirate-forms-grouped',
496
  ),
497
  ),
498
  )
@@ -868,12 +905,19 @@ class PirateForms_Admin {
868
  public function manage_contact_posts_columns( $columns ) {
869
  $tmp = $columns;
870
  $columns = array();
 
 
 
 
 
871
  foreach ( $tmp as $key => $val ) {
872
  if ( 'date' === $key ) {
873
  // ensure our columns are added before the date.
874
  $columns['pf_mailstatus'] = __( 'Mail Status', 'pirate-forms' );
875
  }
876
- $columns[ $key ] = $val;
 
 
877
  }
878
 
879
  return $columns;
223
  $pirate_forms_contactus_email = get_bloginfo( 'admin_email' );
224
  endif;
225
 
226
+ // check if akismet is installed
227
+ $akismet_status = false;
228
+ if ( is_plugin_active( 'akismet/akismet.php' ) ) {
229
+ $akismet_key = get_option( 'wordpress_api_key' );
230
+ if ( ! empty( $akismet_key ) ) {
231
+ $akismet_status = true;
232
+ }
233
+ }
234
+
235
+ $akismet_msg = '';
236
+ if ( ! $akismet_status ) {
237
+ $akismet_msg = __( 'To use this option, please ensure Akismet is activated with a valid key.', 'pirate-forms' );
238
+ }
239
+
240
  // the key(s) will be added to the div as class names
241
  // to enable tooltip popup add 'pirate_dashicons'
242
  return apply_filters(
290
  'value' => __( 'Store submissions in the database', 'pirate-forms' ),
291
  'html' => '<span class="dashicons dashicons-editor-help"></span>',
292
  'desc' => array(
293
+ 'value' => __( 'Should the submissions be stored in the admin area? If chosen, contact form submissions will be saved under "All Entries" on the left (appears after this option is activated).', 'pirate-forms' ),
294
  'class' => 'pirate_forms_option_description',
295
  ),
296
  ),
332
  'class' => 'pirate_forms_option_description',
333
  ),
334
  ),
335
+ 'value' => stripslashes( PirateForms_Util::get_option( 'pirateformsopt_confirm_email' ) ),
336
  'wrap' => array(
337
  'type' => 'div',
338
  'class' => 'pirate-forms-grouped',
358
  ),
359
  'options' => PirateForms_Util::get_thank_you_pages(),
360
  ),
361
+ array(
362
+ 'id' => 'pirateformsopt_akismet',
363
+ 'type' => 'checkbox',
364
+ 'label' => array(
365
+ 'value' => __( 'Integrate with Akismet?', 'pirate-forms' ),
366
+ 'html' => '<span class="dashicons dashicons-editor-help"></span>',
367
+ 'desc' => array(
368
+ 'value' => sprintf( __( 'Checking this option will verify the content of the message with Akismet to check if it\'s spam. If it is determined to be spam, the message will be blocked. %s', 'pirate-forms' ), $akismet_msg ),
369
+ 'class' => 'pirate_forms_option_description',
370
+ ),
371
+ ),
372
+ 'value' => PirateForms_Util::get_option( 'pirateformsopt_akismet' ),
373
+ 'wrap' => array(
374
+ 'type' => 'div',
375
+ 'class' => 'pirate-forms-grouped',
376
+ ),
377
+ 'options' => array(
378
+ 'yes' => __( 'Yes', 'pirate-forms' ),
379
+ ),
380
+ 'disabled' => ! empty( $akismet_msg ),
381
+ ),
382
  )
383
  ),
384
  ),
483
  /* Recaptcha */
484
  array(
485
  'id' => 'pirateformsopt_recaptcha_field',
486
+ 'type' => 'radio',
487
  'label' => array(
488
+ 'value' => __( 'Add a spam trap', 'pirate-forms' ),
489
  ),
490
  'default' => $pirate_forms_contactus_recaptcha_show,
491
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_field' ),
494
  'class' => 'pirate-forms-grouped',
495
  ),
496
  'options' => array(
497
+ '' => __( 'No', 'pirate-forms' ),
498
+ 'custom' => __( 'Custom', 'pirate-forms' ),
499
+ 'yes' => __( 'Google reCAPTCHA', 'pirate-forms' ),
500
  ),
501
  ),
502
  /* Site key */
515
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_sitekey' ),
516
  'wrap' => array(
517
  'type' => 'div',
518
+ 'class' => 'pirate-forms-grouped pirateformsopt_recaptcha',
519
  ),
520
  ),
521
  /* Secret key */
529
  'value' => PirateForms_Util::get_option( 'pirateformsopt_recaptcha_secretkey' ),
530
  'wrap' => array(
531
  'type' => 'div',
532
+ 'class' => 'pirate-forms-grouped pirateformsopt_recaptcha',
533
  ),
534
  ),
535
  )
905
  public function manage_contact_posts_columns( $columns ) {
906
  $tmp = $columns;
907
  $columns = array();
908
+ /**
909
+ * Remove redundant columns.
910
+ */
911
+ $allowed_keys = array( 'cb', 'title', 'pf_mailstatus', 'pf_form', 'date' );
912
+
913
  foreach ( $tmp as $key => $val ) {
914
  if ( 'date' === $key ) {
915
  // ensure our columns are added before the date.
916
  $columns['pf_mailstatus'] = __( 'Mail Status', 'pirate-forms' );
917
  }
918
+ if ( in_array( $key, $allowed_keys ) ) {
919
+ $columns[ $key ] = $val;
920
+ }
921
  }
922
 
923
  return $columns;
admin/css/wp-admin.css CHANGED
@@ -361,3 +361,11 @@ div.pirate_dashicons > form > div > label {
361
  .pirate-forms-test-button {
362
  margin-left: 10px;
363
  }
 
 
 
 
 
 
 
 
361
  .pirate-forms-test-button {
362
  margin-left: 10px;
363
  }
364
+ input#save.pirate-forms-save-button{
365
+ margin-right:10px;
366
+ }
367
+ .pirate-forms-grouped input[type=radio]{
368
+ margin-top: 0px;
369
+ margin-left:5px;
370
+ margin-right: 10px;
371
+ }
admin/js/scripts-admin.js CHANGED
@@ -23,6 +23,18 @@ jQuery(document).ready(function() {
23
  return false;
24
  });
25
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  function cwpSendTestEmail() {
27
  jQuery('.pirate-forms-test-message').html('');
28
  startAjaxIntro();
23
  return false;
24
  });
25
 
26
+ jQuery('input[name="pirateformsopt_recaptcha_field"]').on('click', function(){
27
+ if(jQuery(this).val() === 'yes'){
28
+ jQuery('.pirateformsopt_recaptcha').show();
29
+ }else{
30
+ jQuery('.pirateformsopt_recaptcha').hide();
31
+ }
32
+ });
33
+
34
+ if( jQuery('input[name="pirateformsopt_recaptcha_field"]:checked').val() !== 'yes' ){
35
+ jQuery('.pirateformsopt_recaptcha').hide();
36
+ }
37
+
38
  function cwpSendTestEmail() {
39
  jQuery('.pirate-forms-test-message').html('');
40
  startAjaxIntro();
includes/class-pirateforms-html.php CHANGED
@@ -103,6 +103,10 @@ class PirateForms_HTML {
103
  $html .= ' value="' . ( isset( $args['value'] ) ? esc_attr( $args['value'] ) : '' ) . '"';
104
  }
105
 
 
 
 
 
106
  return $html;
107
  }
108
 
@@ -162,8 +166,33 @@ class PirateForms_HTML {
162
  * @since 1.2.6
163
  */
164
  private function file( $args ) {
165
- $html = $this->get_label( $args );
166
- $html .= '<input type="file" ' . $this->get_common( $args, array( 'value' ) ) . '>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
 
168
  return $this->get_wrap( $args, $html );
169
  }
@@ -310,8 +339,8 @@ class PirateForms_HTML {
310
  $name .= '[]';
311
  }
312
  foreach ( $args['options'] as $key => $val ) {
313
- $extra = $key == $args['value'] ? 'checked' : '';
314
- $html .= '<input type="checkbox" value="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] . $key ) . '" name="' . $name . '" class="' . ( isset( $args['class'] ) ? esc_attr( $args['class'] ) : '' ) . '" ' . $extra . '>' . $val;
315
  }
316
  }
317
 
103
  $html .= ' value="' . ( isset( $args['value'] ) ? esc_attr( $args['value'] ) : '' ) . '"';
104
  }
105
 
106
+ if ( isset( $args['disabled'] ) && $args['disabled'] ) {
107
+ $html .= ' disabled';
108
+ }
109
+
110
  return $html;
111
  }
112
 
166
  * @since 1.2.6
167
  */
168
  private function file( $args ) {
169
+ $class = 'pirate-forms-file-upload-hidden';
170
+ if ( isset( $args['class'] ) ) {
171
+ $class .= ' ' . $args['class'];
172
+ }
173
+ $args['class'] = $class;
174
+
175
+ // label for the upload button
176
+ $label = isset( $args['label']['value'] ) ? $args['label']['value'] : ( isset( $args['placeholder'] ) ? $args['placeholder'] : '' );
177
+ if ( empty( $label ) ) {
178
+ $label = __( 'Upload file', 'pirate-forms' );
179
+ }
180
+ $args['label']['value'] = $label;
181
+
182
+ // since the file field is going to be non-focussable, let's put the required attributes (if available) on the text field
183
+ $text_args = array(
184
+ 'class' => 'pirate-forms-file-upload-input',
185
+ 'id' => '',
186
+ 'name' => '',
187
+ );
188
+ if ( isset( $args['required'] ) && $args['required'] && isset( $args['required_msg'] ) ) {
189
+ $text_args['required'] = $args['required'];
190
+ $text_args['required_msg'] = $args['required_msg'];
191
+ unset( $args['required'] );
192
+ unset( $args['required_msg'] );
193
+ }
194
+
195
+ $html = '<div class="pirate-forms-file-upload-wrapper"><input type="file" ' . $this->get_common( $args, array( 'value' ) ) . ' style="position: absolute; left: -9999px;" tabindex="-1"><button type="button" class="pirate-forms-file-upload-button" tabindex="-1">' . ( isset( $args['label']['value'] ) ? esc_attr( $args['label']['value'] ) : '' ) . '</button><input type="text" ' . $this->get_common( $text_args ) . ' />';
196
 
197
  return $this->get_wrap( $args, $html );
198
  }
339
  $name .= '[]';
340
  }
341
  foreach ( $args['options'] as $key => $val ) {
342
+ $extra = isset( $args['value'] ) && $key == $args['value'] ? 'checked' : '';
343
+ $html .= '<input type="checkbox" ' . $extra . ' ' . $this->get_common( $args ) . ' value="' . esc_attr( $key ) . '">' . esc_attr( $val );
344
  }
345
  }
346
 
includes/class-pirateforms-phpformbuilder.php CHANGED
@@ -27,7 +27,7 @@ class PirateForms_PhpFormBuilder {
27
  function build_form( $elements, $pirate_forms_options, $from_widget ) {
28
  $this->pirate_forms_options = $pirate_forms_options;
29
  $pirateformsopt_attachment_field = $pirate_forms_options['pirateformsopt_attachment_field'];
30
- if ( 'yes' === $pirateformsopt_attachment_field ) {
31
  $pirate_forms_enctype = 'multipart/form-data';
32
  } else {
33
  $pirate_forms_enctype = 'application/x-www-form-urlencoded';
27
  function build_form( $elements, $pirate_forms_options, $from_widget ) {
28
  $this->pirate_forms_options = $pirate_forms_options;
29
  $pirateformsopt_attachment_field = $pirate_forms_options['pirateformsopt_attachment_field'];
30
+ if ( ! empty( $pirateformsopt_attachment_field ) ) {
31
  $pirate_forms_enctype = 'multipart/form-data';
32
  } else {
33
  $pirate_forms_enctype = 'application/x-www-form-urlencoded';
includes/class-pirateforms-util.php CHANGED
@@ -7,6 +7,34 @@
7
  */
8
  class PirateForms_Util {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  /**
11
  * Return the table row
12
  *
7
  */
8
  class PirateForms_Util {
9
 
10
+ /**
11
+ * Return the table.
12
+ *
13
+ * @since 1.0.0
14
+ */
15
+ public static function get_table( $body ) {
16
+ $html = '';
17
+ foreach ( $body as $type => $value ) {
18
+ switch ( $type ) {
19
+ case 'heading':
20
+ $html .= '<h2>' . $value . '</h2>';
21
+ break;
22
+ case 'body':
23
+ $html .= '<table>';
24
+ foreach ( $value as $k => $v ) {
25
+ $html .= self::table_row( $k . ':', $v );
26
+ }
27
+ if ( isset( $body['rows'] ) ) {
28
+ // special case for new lite and old pro where the old pro returns the table rows as an HTML string.
29
+ $html .= $body['rows'];
30
+ }
31
+ $html .= '</table>';
32
+ break;
33
+ }
34
+ }
35
+ return $html;
36
+ }
37
+
38
  /**
39
  * Return the table row
40
  *
includes/class-pirateforms.php CHANGED
@@ -69,7 +69,7 @@ class PirateForms {
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'pirateforms';
72
- $this->version = '2.1.0';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
@@ -153,7 +153,10 @@ class PirateForms {
153
  $this->loader->add_action( 'pirate_forms_load_sidebar_theme', $plugin_admin, 'load_sidebar_theme' );
154
  $this->loader->add_action( 'pirate_forms_load_sidebar_subscribe', $plugin_admin, 'load_sidebar_subscribe' );
155
 
156
- $this->loader->add_filter( 'manage_pf_contact_posts_columns', $plugin_admin, 'manage_contact_posts_columns' );
 
 
 
157
  $this->loader->add_filter( 'manage_pf_contact_posts_custom_column', $plugin_admin, 'manage_contact_posts_custom_column', 10, 2 );
158
 
159
  }
@@ -183,6 +186,12 @@ class PirateForms {
183
  $this->loader->add_filter( 'widget_text', $plugin_public, 'widget_text_filter', 9 );
184
  $this->loader->add_filter( 'pirate_forms_public_controls', $plugin_public, 'compatibility_class', 9 );
185
 
 
 
 
 
 
 
186
  add_shortcode( 'pirate_forms', array( $plugin_public, 'display_form' ) );
187
  }
188
 
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'pirateforms';
72
+ $this->version = '2.2.0';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
153
  $this->loader->add_action( 'pirate_forms_load_sidebar_theme', $plugin_admin, 'load_sidebar_theme' );
154
  $this->loader->add_action( 'pirate_forms_load_sidebar_subscribe', $plugin_admin, 'load_sidebar_subscribe' );
155
 
156
+ // this informs the pro whether the lite will implement the custom spam checkbox or not.
157
+ add_filter( 'pirate_forms_support_custom_spam', '__return_true' );
158
+
159
+ $this->loader->add_filter( 'manage_pf_contact_posts_columns', $plugin_admin, 'manage_contact_posts_columns', PHP_INT_MAX );
160
  $this->loader->add_filter( 'manage_pf_contact_posts_custom_column', $plugin_admin, 'manage_contact_posts_custom_column', 10, 2 );
161
 
162
  }
186
  $this->loader->add_filter( 'widget_text', $plugin_public, 'widget_text_filter', 9 );
187
  $this->loader->add_filter( 'pirate_forms_public_controls', $plugin_public, 'compatibility_class', 9 );
188
 
189
+ /**
190
+ * SDK tweaks.
191
+ */
192
+
193
+ $this->loader->add_filter( 'pirate_forms_friendly_name', $plugin_public, 'change_name' );
194
+
195
  add_shortcode( 'pirate_forms', array( $plugin_public, 'display_form' ) );
196
  }
197
 
pirate-forms.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: Free & Simple Contact Form Plugin - Pirateforms
17
  * Plugin URI: http://themeisle.com/plugins/pirate-forms/
18
  * Description: Easily creates a nice looking, simple contact form on your WP site.
19
- * Version: 2.1.0
20
  * Author: Themeisle
21
  * Author URI: http://themeisle.com
22
  * Text Domain: pirate-forms
@@ -36,7 +36,7 @@ if ( ! defined( 'WPINC' ) ) {
36
  define( 'PIRATEFORMS_NAME', 'Pirate Forms' );
37
  define( 'PIRATEFORMS_SLUG', 'pirate-forms' );
38
  define( 'PIRATEFORMS_USELL_LINK', 'https://themeisle.com/plugins/pirate-forms-extended/' );
39
- define( 'PIRATE_FORMS_VERSION', '2.1.0' );
40
  define( 'PIRATEFORMS_DIR', trailingslashit( plugin_dir_path( __FILE__ ) ) );
41
  define( 'PIRATEFORMS_URL', plugin_dir_url( __FILE__ ) );
42
  define( 'PIRATEFORMS_BASENAME', plugin_basename( __FILE__ ) );
16
  * Plugin Name: Free & Simple Contact Form Plugin - Pirateforms
17
  * Plugin URI: http://themeisle.com/plugins/pirate-forms/
18
  * Description: Easily creates a nice looking, simple contact form on your WP site.
19
+ * Version: 2.2.0
20
  * Author: Themeisle
21
  * Author URI: http://themeisle.com
22
  * Text Domain: pirate-forms
36
  define( 'PIRATEFORMS_NAME', 'Pirate Forms' );
37
  define( 'PIRATEFORMS_SLUG', 'pirate-forms' );
38
  define( 'PIRATEFORMS_USELL_LINK', 'https://themeisle.com/plugins/pirate-forms-extended/' );
39
+ define( 'PIRATE_FORMS_VERSION', '2.2.0' );
40
  define( 'PIRATEFORMS_DIR', trailingslashit( plugin_dir_path( __FILE__ ) ) );
41
  define( 'PIRATEFORMS_URL', plugin_dir_url( __FILE__ ) );
42
  define( 'PIRATEFORMS_BASENAME', plugin_basename( __FILE__ ) );
public/class-pirateforms-public.php CHANGED
@@ -55,6 +55,17 @@ class PirateForms_Public {
55
 
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
58
  /**
59
  * Register the stylesheets for the public-facing side of the site.
60
  *
@@ -67,7 +78,7 @@ class PirateForms_Public {
67
  /* recaptcha js */
68
  $pirate_forms_options = get_option( 'pirate_forms_settings_array' );
69
  if ( ! empty( $pirate_forms_options ) ) :
70
- if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) && ( $pirate_forms_options['pirateformsopt_recaptcha_field'] == 'yes' ) ) :
71
  if ( defined( 'POLYLANG_VERSION' ) && function_exists( 'pll_current_language' ) ) {
72
  $pirate_forms_contactus_language = pll_current_language();
73
  } else {
@@ -90,6 +101,10 @@ class PirateForms_Public {
90
  wp_localize_script(
91
  'pirate_forms_scripts_general', 'pirateFormsObject', array(
92
  'errors' => $pirate_forms_errors,
 
 
 
 
93
  )
94
  );
95
  }
@@ -103,7 +118,7 @@ class PirateForms_Public {
103
  $atts = shortcode_atts(
104
  array(
105
  'from' => '',
106
- 'id' => '',
107
  ), $atts
108
  );
109
 
@@ -147,8 +162,8 @@ class PirateForms_Public {
147
 
148
  $error_key = wp_create_nonce( get_bloginfo( 'admin_email' ) . ( $from_widget ? 'yes' : 'no' ) );
149
 
150
- $thank_you_message = '';
151
- if ( isset( $_GET['done'] ) ) {
152
  $thank_you_message = sanitize_text_field( $pirate_forms_options['pirateformsopt_label_submit'] );
153
  }
154
 
@@ -290,7 +305,6 @@ class PirateForms_Public {
290
  $wrap_classes[] = 'error';
291
  }
292
  $elements[] = array(
293
- 'placeholder' => stripslashes( sanitize_text_field( $label ) ),
294
  'required' => $required,
295
  'required_msg' => $pirate_forms_options['pirateformsopt_label_err_no_attachment'],
296
  'type' => 'file',
@@ -304,7 +318,7 @@ class PirateForms_Public {
304
  endif;
305
  /**
306
  ******* ReCaptcha */
307
- if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) && ( $pirate_forms_options['pirateformsopt_recaptcha_field'] == 'yes' ) ) :
308
  $pirateformsopt_recaptcha_sitekey = $pirate_forms_options['pirateformsopt_recaptcha_sitekey'];
309
  $pirateformsopt_recaptcha_secretkey = $pirate_forms_options['pirateformsopt_recaptcha_secretkey'];
310
  $elements[] = array(
@@ -320,6 +334,18 @@ class PirateForms_Public {
320
  );
321
  endif;
322
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  /**
324
  ****** Submit button */
325
  $pirateformsopt_label_submit_btn = '';
@@ -366,7 +392,7 @@ class PirateForms_Public {
366
  unset( $_SESSION[ $error_key ] );
367
  }
368
 
369
- $elements = apply_filters( 'pirate_forms_get_custom_elements', $elements, $pirate_forms_options );
370
 
371
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'displaying elements %s', print_r( $elements, true ) ), 'debug', __FILE__, __LINE__ );
372
 
@@ -495,19 +521,18 @@ class PirateForms_Public {
495
  return false;
496
  }
497
 
498
- $pirate_forms_options = PirateForms_Util::get_form_options( isset( $_POST['pirate_forms_form_id'] ) ? $_POST['pirate_forms_form_id'] : null );
499
 
500
- if ( ! $this->validate_captcha( $error_key, $pirate_forms_options ) ) {
501
  return false;
502
  }
503
 
504
  // Start the body of the contact email
505
- $body = '<h2>' . __( 'Contact form submission from', 'pirate-forms' ) . ' ' .
506
- get_bloginfo( 'name' ) . ' (' . site_url() . ') </h2>';
 
507
 
508
- $body .= '<table>';
509
-
510
- list($pirate_forms_contact_email, $pirate_forms_contact_name, $pirate_forms_contact_subject) = $this->validate_request( $error_key, $pirate_forms_options, $body );
511
 
512
  /**
513
  ******** Validate recipients email */
@@ -528,17 +553,17 @@ class PirateForms_Public {
528
 
529
  // If valid and present, create a link to an IP search
530
  if ( ! empty( $contact_ip ) ) {
531
- $body .= PirateForms_Util::table_row( __( 'IP address: ', 'pirate-forms' ), $contact_ip );
532
- $body .= PirateForms_Util::table_row( __( 'IP search:', 'pirate-forms' ), "http://whatismyipaddress.com/ip/$contact_ip" );
533
  }
534
 
535
  // Sanitize and prepare referrer;
536
  if ( ! empty( $_POST['pirate-forms-contact-referrer'] ) ) {
537
- $body .= PirateForms_Util::table_row( __( 'Came from: ', 'pirate-forms' ), sanitize_text_field( $_POST['pirate-forms-contact-referrer'] ) );
538
  }
539
 
540
  // Show the page this contact form was submitted on
541
- $body .= PirateForms_Util::table_row( __( 'Sent from page: ', 'pirate-forms' ), get_permalink( get_the_id() ) );
542
 
543
  // Check the blacklist
544
  $blocked = PirateForms_Util::is_blacklisted( $error_key, $pirate_forms_contact_email, $contact_ip );
@@ -546,7 +571,9 @@ class PirateForms_Public {
546
  return false;
547
  }
548
 
549
- $body .= '</table>';
 
 
550
 
551
  // No errors? Go ahead and process the contact
552
  if ( empty( $_SESSION[ $error_key ] ) ) {
@@ -568,7 +595,7 @@ class PirateForms_Public {
568
  }
569
 
570
  // Need an email address for the email notification
571
- $send_from = '';
572
  if ( '[email]' == $site_email && ! empty( $pirate_forms_contact_email ) ) {
573
  $send_from = $pirate_forms_contact_email;
574
  } elseif ( ! empty( $site_email ) ) {
@@ -582,24 +609,29 @@ class PirateForms_Public {
582
  $headers = "From: $send_from_name <$send_from>\r\nReply-To: $pirate_forms_contact_name <$pirate_forms_contact_email>\r\nContent-type: text/html";
583
  add_action( 'phpmailer_init', array( $this, 'phpmailer' ) );
584
 
585
- $attachments = $this->get_attachments( $error_key, $pirate_forms_options );
586
  if ( is_bool( $attachments ) ) {
587
  return false;
588
  }
589
 
590
  $subject = 'Contact on ' . htmlspecialchars_decode( get_bloginfo( 'name' ) );
591
  if ( ! empty( $pirate_forms_contact_subject ) ) {
592
- $subject = $pirate_forms_contact_subject;
593
  }
594
 
595
- do_action( 'pirate_forms_before_sending', $pirate_forms_contact_email, $site_recipients, $subject, $body, $headers, $attachments );
596
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'before sending email to = %s, subject = %s, body = %s, headers = %s, attachments = %s', $site_recipients, $subject, $body, $headers, print_r( $attachments, true ) ), 'debug', __FILE__, __LINE__ );
597
- $response = wp_mail( $site_recipients, $subject, $body, $headers, $attachments );
 
 
 
 
 
598
  if ( ! $response ) {
599
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, 'Email not sent', 'debug', __FILE__, __LINE__ );
600
  error_log( 'Email not sent' );
601
  }
602
- do_action( 'pirate_forms_after_sending', $pirate_forms_options, $response, $pirate_forms_contact_email, $site_recipients, $subject, $body, $headers, $attachments );
603
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'after sending email, response = %s', $response ), 'debug', __FILE__, __LINE__ );
604
 
605
  // delete the tmp directory
@@ -609,27 +641,28 @@ class PirateForms_Public {
609
  $wp_filesystem->delete( $this->get_upload_tmp_dir(), true, 'd' );
610
 
611
  // Should a confirm email be sent?
612
- $confirm_body = stripslashes( trim( $pirate_forms_options['pirateformsopt_confirm_email'] ) );
 
613
  if ( ! empty( $confirm_body ) && ! empty( $pirate_forms_contact_email ) ) {
614
  // Removing entities
615
  $confirm_body = htmlspecialchars_decode( $confirm_body );
616
  $confirm_body = html_entity_decode( $confirm_body );
617
  $confirm_body = str_replace( '&#39;', "'", $confirm_body );
618
- $send_from = PirateForms_Util::get_from_email();
619
  if ( ! empty( $site_email ) && '[email]' !== $site_email ) {
620
  $send_from = $site_email;
621
  }
622
- $site_name = htmlspecialchars_decode( get_bloginfo( 'name' ) );
623
 
624
- $headers = "From: $site_name <$send_from>\r\nReply-To: $site_name <$send_from>";
625
- $subject = $pirate_forms_options['pirateformsopt_label_submit'] . ' - ' . $site_name;
626
 
627
  do_action( 'pirate_forms_before_sending_confirm', $pirate_forms_contact_email, $pirate_forms_contact_email, $subject, $confirm_body, $headers );
628
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'before sending confirm email to = %s, subject = %s, body = %s, headers = %s', $pirate_forms_contact_email, $subject, $confirm_body, $headers ), 'debug', __FILE__, __LINE__ );
629
- $response1 = wp_mail( $pirate_forms_contact_email, $subject, $confirm_body, $headers );
630
- do_action( 'pirate_forms_after_sending_confirm', $pirate_forms_options, $response1, $pirate_forms_contact_email, $pirate_forms_contact_email, $subject, $confirm_body, $headers );
631
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'after sending confirm email response = %s', $response1 ), 'debug', __FILE__, __LINE__ );
632
- if ( ! $response ) {
633
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, 'Confirm email not sent', 'debug', __FILE__, __LINE__ );
634
  error_log( 'Confirm email not sent' );
635
  }
@@ -642,7 +675,7 @@ class PirateForms_Public {
642
  array(
643
  'post_type' => 'pf_contact',
644
  'post_title' => date( 'l, M j, Y', time() ) . ' by "' . $pirate_forms_contact_name . '"',
645
- 'post_content' => $body,
646
  'post_author' => 1,
647
  'post_status' => 'private',
648
  )
@@ -651,6 +684,7 @@ class PirateForms_Public {
651
  add_post_meta( $new_post_id, 'Contact email', $pirate_forms_contact_email );
652
  }
653
  add_post_meta( $new_post_id, PIRATEFORMS_SLUG . 'mail-status', $response );
 
654
  do_action( 'pirate_forms_update_contact', $pirate_forms_options, $new_post_id );
655
  }
656
 
@@ -658,6 +692,13 @@ class PirateForms_Public {
658
 
659
  if ( ! $test ) {
660
  $pirate_forms_current_theme = wp_get_theme();
 
 
 
 
 
 
 
661
 
662
  /* If a Thank you page is selected, redirect to that page */
663
  if ( $pirate_forms_options['pirateformsopt_thank_you_url'] ) {
@@ -666,9 +707,14 @@ class PirateForms_Public {
666
  if ( ! empty( $redirect ) ) {
667
  wp_safe_redirect( $redirect );
668
  }
669
- } elseif ( ( 'Zerif Lite' == $pirate_forms_current_theme->name ) || ( 'Zerif Lite' == $pirate_forms_current_theme->parent_theme ) || ( 'Zerif PRO' == $pirate_forms_current_theme->name ) || ( 'Zerif PRO' == $pirate_forms_current_theme->parent_theme ) ) {
670
  // the fragment identifier should always be the last argument, otherwise the thank you message will not show.
671
- $redirect = add_query_arg( array( 'done' => 'done', 'pcf' => '1#contact' ), $_SERVER['HTTP_REFERER'] );
 
 
 
 
 
672
  wp_safe_redirect( $redirect );
673
  } elseif ( isset( $_SERVER['HTTP_REFERER'] ) ) {
674
  $redirect = add_query_arg( array( 'done' => 'done' ), $_SERVER['HTTP_REFERER'] );
@@ -678,6 +724,50 @@ class PirateForms_Public {
678
  }
679
  }
680
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
681
  /**
682
  * Validate request
683
  *
@@ -686,12 +776,14 @@ class PirateForms_Public {
686
  * @param string $body the body to save as the CPT.
687
  */
688
  function validate_request( $error_key, $pirate_forms_options, &$body ) {
689
- $pirate_forms_contact_email = null;
690
- $pirate_forms_contact_name = null;
691
- $pirate_forms_contact_subject = null;
692
- $fields = array( 'name', 'email', 'subject', 'message' );
 
 
693
  foreach ( $fields as $field ) {
694
- $value = isset( $_POST[ 'pirate-forms-contact-' . $field ] ) ? sanitize_text_field( trim( $_POST[ 'pirate-forms-contact-' . $field ] ) ) : '';
695
  if ( 'req' === $pirate_forms_options[ 'pirateformsopt_' . $field . '_field' ] && empty( $value ) ) {
696
  $_SESSION[ $error_key ][ 'pirate-forms-contact-' . $field ] = $pirate_forms_options[ 'pirateformsopt_label_err_' . $field ];
697
  } elseif ( ! empty( $value ) ) {
@@ -699,56 +791,73 @@ class PirateForms_Public {
699
  $_SESSION[ $error_key ][ 'pirate-forms-contact-' . $field ] = $pirate_forms_options[ 'pirateformsopt_label_err_' . $field ];
700
  } else {
701
  if ( 'email' === $field ) {
702
- $pirate_forms_contact_email = $value;
703
  } elseif ( 'name' === $field ) {
704
- $pirate_forms_contact_name = $value;
705
  } elseif ( 'subject' === $field ) {
706
- $pirate_forms_contact_subject = $value;
 
 
707
  }
708
- $body .= PirateForms_Util::table_row( stripslashes( $pirate_forms_options[ 'pirateformsopt_label_' . $field ] ), $value );
709
  }
710
  }
711
  }
712
 
713
- $body = apply_filters( 'pirate_forms_validate_request', $body, $error_key, $pirate_forms_options );
 
 
 
 
 
 
 
 
 
714
 
715
- return array( $pirate_forms_contact_email, $pirate_forms_contact_name, $pirate_forms_contact_subject );
716
  }
717
 
718
  /**
719
- * Validate CAPTCHA
720
- *
721
- * @param string $error_key the key for the session object.
722
- * @param array $pirate_forms_options the array of options for this form.
723
  */
724
- function validate_captcha( $error_key, $pirate_forms_options ) {
725
- $pirateformsopt_recaptcha_sitekey = $pirate_forms_options['pirateformsopt_recaptcha_sitekey'];
726
- $pirateformsopt_recaptcha_secretkey = $pirate_forms_options['pirateformsopt_recaptcha_secretkey'];
727
- $pirateformsopt_recaptcha_field = isset( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) ? $pirate_forms_options['pirateformsopt_recaptcha_field'] : '';
728
- if ( ! empty( $pirateformsopt_recaptcha_secretkey ) && ! empty( $pirateformsopt_recaptcha_sitekey ) && ! empty( $pirateformsopt_recaptcha_field ) && ( $pirateformsopt_recaptcha_field == 'yes' ) ) :
729
- if ( isset( $_POST['g-recaptcha-response'] ) ) {
730
- $captcha = $_POST['g-recaptcha-response'];
731
- }
732
- if ( ! $captcha ) {
733
- $_SESSION[ $error_key ]['pirate-forms-captcha'] = __( 'Wrong reCAPTCHA', 'pirate-forms' );
734
 
735
- return false;
736
- }
737
- $response = wp_remote_get( 'https://www.google.com/recaptcha/api/siteverify?secret=' . $pirateformsopt_recaptcha_secretkey . '&response=' . $captcha . '&remoteip=' . $_SERVER['REMOTE_ADDR'] );
738
- if ( ! empty( $response ) ) :
739
- $response_body = wp_remote_retrieve_body( $response );
740
- endif;
741
- if ( ! empty( $response_body ) ) :
742
- $result = json_decode( $response_body, true );
743
- endif;
744
- if ( isset( $result['success'] ) && ( $result['success'] == false ) ) {
745
- $_SESSION[ $error_key ]['pirate-forms-captcha'] = __( 'Wrong reCAPTCHA', 'pirate-forms' );
 
 
 
 
 
 
 
 
 
746
 
747
- return false;
748
- }
749
- endif;
750
 
751
- return true;
752
  }
753
 
754
  /**
@@ -756,88 +865,72 @@ class PirateForms_Public {
756
  *
757
  * @param string $error_key the key for the session object.
758
  * @param array $pirate_forms_options the array of options for the form.
 
759
  *
760
  * @throws Exception When file uploading fails.
761
  */
762
- function get_attachments( $error_key, $pirate_forms_options ) {
763
- $attachments = '';
764
- /**
765
- ******* Validate Attachment */
766
- $use_files = $pirate_forms_options['pirateformsopt_attachment_field'];
767
- if ( ! empty( $use_files ) && ( $use_files == 'yes' ) ) {
768
- $pirate_forms_attach_file = isset( $_FILES['pirate-forms-attachment'] ) ? $_FILES['pirate-forms-attachment'] : '';
769
- if ( ! empty( $pirate_forms_attach_file ) && ! empty( $pirate_forms_attach_file['name'] ) ) {
 
 
 
770
  /* Validate file type */
771
- $file_types_allowed = 'jpg|jpeg|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv';
772
  $pirate_forms_file_types_allowed = $file_types_allowed;
773
  $pirate_forms_file_types_allowed = trim( $pirate_forms_file_types_allowed, '|' );
774
  $pirate_forms_file_types_allowed = '(' . $pirate_forms_file_types_allowed . ')';
775
  $pirate_forms_file_types_allowed = '/\.' . $pirate_forms_file_types_allowed . '$/i';
776
- if ( ! preg_match( $pirate_forms_file_types_allowed, $pirate_forms_attach_file['name'] ) ) {
777
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'file invalid: expected %s got %s', $file_types_allowed, $pirate_forms_attach_file['name'] ), 'error', __FILE__, __LINE__ );
778
- $_SESSION[ $error_key ]['pirate-forms-upload-failed-type'] = __( 'Uploaded file is not allowed for file type', 'pirate-forms' );
779
 
780
  return false;
781
  }
782
  /* Validate file size */
783
  $pirate_forms_file_size_allowed = 1048576; // default size 1 MB
784
- if ( $pirate_forms_attach_file['size'] > $pirate_forms_file_size_allowed ) {
785
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'file too large: expected %d got %d', $pirate_forms_file_size_allowed, $pirate_forms_attach_file['size'] ), 'error', __FILE__, __LINE__ );
786
- $_SESSION[ $error_key ]['pirate-forms-upload-failed-size'] = __( 'Uploaded file is too large', 'pirate-forms' );
787
 
788
  return false;
789
  }
790
  $this->init_uploads();
791
- $uploads_dir = $this->get_upload_tmp_dir();
792
- $uploads_dir = $this->maybe_add_random_dir( $uploads_dir );
793
- $filename = $pirate_forms_attach_file['name'];
794
- $filename = $this->canonicalize( $filename );
795
- $filename = sanitize_file_name( $filename );
796
- $filename = $this->antiscript_file_name( $filename );
797
- $filename = wp_unique_filename( $uploads_dir, $filename );
798
- $new_file = trailingslashit( $uploads_dir ) . $filename;
799
  try {
800
- if ( false === move_uploaded_file( $pirate_forms_attach_file['tmp_name'], $new_file ) ) {
801
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'unable to move the uploaded file from %s to %s', $pirate_forms_attach_file['tmp_name'], $new_file ), 'error', __FILE__, __LINE__ );
802
- throw new Exception( __( 'There was an unknown error uploading the file.', 'pirate-forms' ) );
803
  }
804
  } catch ( Exception $ex ) {
805
- do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'unable to move the uploaded file from %s to %s with error %s', $pirate_forms_attach_file['tmp_name'], $new_file, $ex->getMessage() ), 'error', __FILE__, __LINE__ );
806
  $_SESSION[ $error_key ]['pirate-forms-upload-failed-general'] = $ex->getMessage();
807
  }
808
  if ( ! empty( $new_file ) ) {
809
- $attachments = $new_file;
810
  }
811
- }// End if().
812
- }// End if().
813
- return $attachments;
814
- }
815
-
816
- /**
817
- * Prepare the uploading process
818
- *
819
- * @since 1.0.0
820
- * @throws Exception When file could not be opened.
821
- */
822
- function init_uploads() {
823
- $dir = $this->get_upload_tmp_dir();
824
- wp_mkdir_p( $dir );
825
- $htaccess_file = trailingslashit( $dir ) . '.htaccess';
826
- if ( file_exists( $htaccess_file ) ) {
827
- return;
828
  }
829
- try {
830
- $handle = fopen( $htaccess_file, 'w' );
831
-
832
- if ( ! $handle ) {
833
- throw new Exception( 'File open failed.' );
834
- } else {
835
- fwrite( $handle, "Deny from all\n" );
836
- fclose( $handle );
837
  }
838
- } catch ( Exception $e ) {
839
- // nothing
840
  }
 
 
 
841
  }
842
 
843
  /**
@@ -890,6 +983,33 @@ class PirateForms_Public {
890
  return $dir;
891
  }
892
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
893
  /**
894
  * Functions to Process uploaded files
895
  */
55
 
56
  }
57
 
58
+ /**
59
+ * Change plugin name from readme.txt.
60
+ *
61
+ * @param string $name Old name.
62
+ *
63
+ * @return string New name.
64
+ */
65
+ public function change_name( $name ) {
66
+ return 'Pirate Forms';
67
+ }
68
+
69
  /**
70
  * Register the stylesheets for the public-facing side of the site.
71
  *
78
  /* recaptcha js */
79
  $pirate_forms_options = get_option( 'pirate_forms_settings_array' );
80
  if ( ! empty( $pirate_forms_options ) ) :
81
+ if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && 'yes' === $pirate_forms_options['pirateformsopt_recaptcha_field'] ) :
82
  if ( defined( 'POLYLANG_VERSION' ) && function_exists( 'pll_current_language' ) ) {
83
  $pirate_forms_contactus_language = pll_current_language();
84
  } else {
101
  wp_localize_script(
102
  'pirate_forms_scripts_general', 'pirateFormsObject', array(
103
  'errors' => $pirate_forms_errors,
104
+ 'spam' => array(
105
+ 'label' => __( 'I\'m human!', 'pirate-forms' ),
106
+ 'value' => wp_create_nonce( PIRATEFORMS_NAME ),
107
+ ),
108
  )
109
  );
110
  }
118
  $atts = shortcode_atts(
119
  array(
120
  'from' => '',
121
+ 'id' => '',
122
  ), $atts
123
  );
124
 
162
 
163
  $error_key = wp_create_nonce( get_bloginfo( 'admin_email' ) . ( $from_widget ? 'yes' : 'no' ) );
164
 
165
+ $thank_you_message = '';
166
+ if ( isset( $_GET['done'] ) && empty( $_SESSION[ $error_key ] ) ) {
167
  $thank_you_message = sanitize_text_field( $pirate_forms_options['pirateformsopt_label_submit'] );
168
  }
169
 
305
  $wrap_classes[] = 'error';
306
  }
307
  $elements[] = array(
 
308
  'required' => $required,
309
  'required_msg' => $pirate_forms_options['pirateformsopt_label_err_no_attachment'],
310
  'type' => 'file',
318
  endif;
319
  /**
320
  ******* ReCaptcha */
321
+ if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && 'yes' === $pirate_forms_options['pirateformsopt_recaptcha_field'] ) :
322
  $pirateformsopt_recaptcha_sitekey = $pirate_forms_options['pirateformsopt_recaptcha_sitekey'];
323
  $pirateformsopt_recaptcha_secretkey = $pirate_forms_options['pirateformsopt_recaptcha_secretkey'];
324
  $elements[] = array(
334
  );
335
  endif;
336
 
337
+ if ( 'custom' === $pirate_forms_options['pirateformsopt_recaptcha_field'] ) :
338
+ $elements[] = array(
339
+ 'type' => 'div',
340
+ 'class' => 'pirate-forms-maps-custom', // spam.reverse() = maps
341
+ 'id' => 'pirate-forms-maps-custom',
342
+ 'wrap' => array(
343
+ 'type' => 'div',
344
+ 'class' => implode( ' ', apply_filters( 'pirateform_wrap_classes_spam', array( 'col-xs-12 col-sm-6 col-lg-6 form_field_wrap pirateform_wrap_classes_spam_wrap' ) ) ),
345
+ ),
346
+ );
347
+ endif;
348
+
349
  /**
350
  ****** Submit button */
351
  $pirateformsopt_label_submit_btn = '';
392
  unset( $_SESSION[ $error_key ] );
393
  }
394
 
395
+ $elements = apply_filters( 'pirate_forms_get_custom_elements', $elements, $pirate_forms_options );
396
 
397
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'displaying elements %s', print_r( $elements, true ) ), 'debug', __FILE__, __LINE__ );
398
 
521
  return false;
522
  }
523
 
524
+ $pirate_forms_options = PirateForms_Util::get_form_options( isset( $_POST['pirate_forms_form_id'] ) ? $_POST['pirate_forms_form_id'] : null );
525
 
526
+ if ( ! $this->validate_spam( $error_key, $pirate_forms_options ) ) {
527
  return false;
528
  }
529
 
530
  // Start the body of the contact email
531
+ $body = array();
532
+ $body['heading'] = sprintf( __( 'Contact form submission from %s', 'pirate-forms' ), get_bloginfo( 'name' ) . ' (' . site_url() . ')' );
533
+ $body['body'] = array();
534
 
535
+ list( $pirate_forms_contact_email, $pirate_forms_contact_name, $pirate_forms_contact_subject, $msg ) = $this->validate_request( $error_key, $pirate_forms_options, $body );
 
 
536
 
537
  /**
538
  ******** Validate recipients email */
553
 
554
  // If valid and present, create a link to an IP search
555
  if ( ! empty( $contact_ip ) ) {
556
+ $body['body'][ __( 'IP address', 'pirate-forms' ) ] = $contact_ip;
557
+ $body['body'][ __( 'IP search', 'pirate-forms' ) ] = "http://whatismyipaddress.com/ip/$contact_ip";
558
  }
559
 
560
  // Sanitize and prepare referrer;
561
  if ( ! empty( $_POST['pirate-forms-contact-referrer'] ) ) {
562
+ $body['body'][ __( 'Came from', 'pirate-forms' ) ] = sanitize_text_field( $_POST['pirate-forms-contact-referrer'] );
563
  }
564
 
565
  // Show the page this contact form was submitted on
566
+ $body['body'][ __( 'Sent from page', 'pirate-forms' ) ] = get_permalink( get_the_id() );
567
 
568
  // Check the blacklist
569
  $blocked = PirateForms_Util::is_blacklisted( $error_key, $pirate_forms_contact_email, $contact_ip );
571
  return false;
572
  }
573
 
574
+ if ( $this->is_spam( $pirate_forms_options, $contact_ip, get_permalink( get_the_id() ), $msg ) ) {
575
+ $_SESSION[ $error_key ]['honeypot'] = __( 'Form submission failed!', 'pirate-forms' );
576
+ }
577
 
578
  // No errors? Go ahead and process the contact
579
  if ( empty( $_SESSION[ $error_key ] ) ) {
595
  }
596
 
597
  // Need an email address for the email notification
598
+ $send_from = '';
599
  if ( '[email]' == $site_email && ! empty( $pirate_forms_contact_email ) ) {
600
  $send_from = $pirate_forms_contact_email;
601
  } elseif ( ! empty( $site_email ) ) {
609
  $headers = "From: $send_from_name <$send_from>\r\nReply-To: $pirate_forms_contact_name <$pirate_forms_contact_email>\r\nContent-type: text/html";
610
  add_action( 'phpmailer_init', array( $this, 'phpmailer' ) );
611
 
612
+ $attachments = $this->get_attachments( $error_key, $pirate_forms_options, $body );
613
  if ( is_bool( $attachments ) ) {
614
  return false;
615
  }
616
 
617
  $subject = 'Contact on ' . htmlspecialchars_decode( get_bloginfo( 'name' ) );
618
  if ( ! empty( $pirate_forms_contact_subject ) ) {
619
+ $subject = $pirate_forms_contact_subject;
620
  }
621
 
622
+ $mail_body = apply_filters( 'pirate_forms_get_mail_body', $body );
623
+ if ( is_array( $mail_body ) ) {
624
+ $mail_body = PirateForms_Util::get_table( $mail_body );
625
+ }
626
+
627
+ do_action( 'pirate_forms_before_sending', $pirate_forms_contact_email, $site_recipients, $subject, $mail_body, $headers, $attachments );
628
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'before sending email to = %s, subject = %s, body = %s, headers = %s, attachments = %s', $site_recipients, $subject, $mail_body, $headers, print_r( $attachments, true ) ), 'debug', __FILE__, __LINE__ );
629
+ $response = wp_mail( $site_recipients, $subject, $mail_body, $headers, $attachments );
630
  if ( ! $response ) {
631
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, 'Email not sent', 'debug', __FILE__, __LINE__ );
632
  error_log( 'Email not sent' );
633
  }
634
+ do_action( 'pirate_forms_after_sending', $pirate_forms_options, $response, $pirate_forms_contact_email, $site_recipients, $subject, $mail_body, $headers, $attachments );
635
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'after sending email, response = %s', $response ), 'debug', __FILE__, __LINE__ );
636
 
637
  // delete the tmp directory
641
  $wp_filesystem->delete( $this->get_upload_tmp_dir(), true, 'd' );
642
 
643
  // Should a confirm email be sent?
644
+ $confirm_body = stripslashes( trim( $pirate_forms_options['pirateformsopt_confirm_email'] ) );
645
+ $response_confirm = '';
646
  if ( ! empty( $confirm_body ) && ! empty( $pirate_forms_contact_email ) ) {
647
  // Removing entities
648
  $confirm_body = htmlspecialchars_decode( $confirm_body );
649
  $confirm_body = html_entity_decode( $confirm_body );
650
  $confirm_body = str_replace( '&#39;', "'", $confirm_body );
651
+ $send_from = PirateForms_Util::get_from_email();
652
  if ( ! empty( $site_email ) && '[email]' !== $site_email ) {
653
  $send_from = $site_email;
654
  }
655
+ $site_name = htmlspecialchars_decode( get_bloginfo( 'name' ) );
656
 
657
+ $headers = "From: $site_name <$send_from>\r\nReply-To: $site_name <$send_from>";
658
+ $subject = $pirate_forms_options['pirateformsopt_label_submit'] . ' - ' . $site_name;
659
 
660
  do_action( 'pirate_forms_before_sending_confirm', $pirate_forms_contact_email, $pirate_forms_contact_email, $subject, $confirm_body, $headers );
661
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'before sending confirm email to = %s, subject = %s, body = %s, headers = %s', $pirate_forms_contact_email, $subject, $confirm_body, $headers ), 'debug', __FILE__, __LINE__ );
662
+ $response_confirm = wp_mail( $pirate_forms_contact_email, $subject, $confirm_body, $headers );
663
+ do_action( 'pirate_forms_after_sending_confirm', $pirate_forms_options, $response_confirm, $pirate_forms_contact_email, $pirate_forms_contact_email, $subject, $confirm_body, $headers );
664
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'after sending confirm email response = %s', $response_confirm ), 'debug', __FILE__, __LINE__ );
665
+ if ( ! $response_confirm ) {
666
  do_action( 'themeisle_log_event', PIRATEFORMS_NAME, 'Confirm email not sent', 'debug', __FILE__, __LINE__ );
667
  error_log( 'Confirm email not sent' );
668
  }
675
  array(
676
  'post_type' => 'pf_contact',
677
  'post_title' => date( 'l, M j, Y', time() ) . ' by "' . $pirate_forms_contact_name . '"',
678
+ 'post_content' => $mail_body,
679
  'post_author' => 1,
680
  'post_status' => 'private',
681
  )
684
  add_post_meta( $new_post_id, 'Contact email', $pirate_forms_contact_email );
685
  }
686
  add_post_meta( $new_post_id, PIRATEFORMS_SLUG . 'mail-status', $response );
687
+ add_post_meta( $new_post_id, PIRATEFORMS_SLUG . 'confirm-mail-status', $response_confirm );
688
  do_action( 'pirate_forms_update_contact', $pirate_forms_options, $new_post_id );
689
  }
690
 
692
 
693
  if ( ! $test ) {
694
  $pirate_forms_current_theme = wp_get_theme();
695
+ $is_our_theme = array_intersect(
696
+ array(
697
+ 'Zerif Lite',
698
+ 'Zerif PRO',
699
+ 'Hestia Pro',
700
+ ), array( $pirate_forms_current_theme->name, $pirate_forms_current_theme->parent_theme )
701
+ );
702
 
703
  /* If a Thank you page is selected, redirect to that page */
704
  if ( $pirate_forms_options['pirateformsopt_thank_you_url'] ) {
707
  if ( ! empty( $redirect ) ) {
708
  wp_safe_redirect( $redirect );
709
  }
710
+ } elseif ( $is_our_theme ) {
711
  // the fragment identifier should always be the last argument, otherwise the thank you message will not show.
712
+ $redirect = add_query_arg(
713
+ array(
714
+ 'done' => 'done',
715
+ 'pcf' => '1#contact',
716
+ ), $_SERVER['HTTP_REFERER']
717
+ );
718
  wp_safe_redirect( $redirect );
719
  } elseif ( isset( $_SERVER['HTTP_REFERER'] ) ) {
720
  $redirect = add_query_arg( array( 'done' => 'done' ), $_SERVER['HTTP_REFERER'] );
724
  }
725
  }
726
 
727
+ /**
728
+ * Validate SPAM/reCAPTCHA
729
+ *
730
+ * @param string $error_key the key for the session object.
731
+ * @param array $pirate_forms_options the array of options for this form.
732
+ */
733
+ function validate_spam( $error_key, $pirate_forms_options ) {
734
+ $pirateformsopt_recaptcha_field = isset( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) ? $pirate_forms_options['pirateformsopt_recaptcha_field'] : '';
735
+ if ( 'yes' === $pirateformsopt_recaptcha_field ) {
736
+ $pirateformsopt_recaptcha_sitekey = $pirate_forms_options['pirateformsopt_recaptcha_sitekey'];
737
+ $pirateformsopt_recaptcha_secretkey = $pirate_forms_options['pirateformsopt_recaptcha_secretkey'];
738
+ if ( ! empty( $pirateformsopt_recaptcha_secretkey ) && ! empty( $pirateformsopt_recaptcha_sitekey ) ) {
739
+ $captcha = $_POST['g-recaptcha-response'];
740
+ }
741
+ if ( ! $captcha ) {
742
+ $_SESSION[ $error_key ]['pirate-forms-captcha'] = __( 'Wrong reCAPTCHA', 'pirate-forms' );
743
+
744
+ return false;
745
+ }
746
+ $response = wp_remote_get( 'https://www.google.com/recaptcha/api/siteverify?secret=' . $pirateformsopt_recaptcha_secretkey . '&response=' . $captcha . '&remoteip=' . $_SERVER['REMOTE_ADDR'] );
747
+ if ( ! empty( $response ) ) :
748
+ $response_body = wp_remote_retrieve_body( $response );
749
+ endif;
750
+ if ( ! empty( $response_body ) ) :
751
+ $result = json_decode( $response_body, true );
752
+ endif;
753
+ if ( isset( $result['success'] ) && ( $result['success'] == false ) ) {
754
+ $_SESSION[ $error_key ]['pirate-forms-captcha'] = __( 'Wrong reCAPTCHA', 'pirate-forms' );
755
+
756
+ return false;
757
+ }
758
+ } elseif ( 'custom' === $pirateformsopt_recaptcha_field ) {
759
+ if ( isset( $_POST['xobkcehc'] ) && wp_verify_nonce( $_POST['xobkcehc'], PIRATEFORMS_NAME ) ) {
760
+ return true;
761
+ }
762
+
763
+ $_SESSION[ $error_key ]['pirate-forms-captcha'] = __( 'Submission blocked!', 'pirate-forms' );
764
+
765
+ return false;
766
+ }
767
+
768
+ return true;
769
+ }
770
+
771
  /**
772
  * Validate request
773
  *
776
  * @param string $body the body to save as the CPT.
777
  */
778
  function validate_request( $error_key, $pirate_forms_options, &$body ) {
779
+ $contact_email = null;
780
+ $contact_name = null;
781
+ $contact_subject = null;
782
+ $message = null;
783
+ $fields = array( 'name', 'email', 'subject', 'message' );
784
+
785
  foreach ( $fields as $field ) {
786
+ $value = isset( $_POST[ 'pirate-forms-contact-' . $field ] ) ? sanitize_text_field( trim( $_POST[ 'pirate-forms-contact-' . $field ] ) ) : '';
787
  if ( 'req' === $pirate_forms_options[ 'pirateformsopt_' . $field . '_field' ] && empty( $value ) ) {
788
  $_SESSION[ $error_key ][ 'pirate-forms-contact-' . $field ] = $pirate_forms_options[ 'pirateformsopt_label_err_' . $field ];
789
  } elseif ( ! empty( $value ) ) {
791
  $_SESSION[ $error_key ][ 'pirate-forms-contact-' . $field ] = $pirate_forms_options[ 'pirateformsopt_label_err_' . $field ];
792
  } else {
793
  if ( 'email' === $field ) {
794
+ $contact_email = $value;
795
  } elseif ( 'name' === $field ) {
796
+ $contact_name = $value;
797
  } elseif ( 'subject' === $field ) {
798
+ $contact_subject = $value;
799
+ } elseif ( 'message' === $field ) {
800
+ $message = $value;
801
  }
802
+ $body['body'][ stripslashes( $pirate_forms_options[ 'pirateformsopt_label_' . $field ] ) ] = $value;
803
  }
804
  }
805
  }
806
 
807
+ $customize = apply_filters( 'pirate_forms_customize_body', false );
808
+ if ( ! $customize ) {
809
+ // new lite, old pro
810
+ $temp = '';
811
+ $temp = apply_filters( 'pirate_forms_validate_request', $temp, $error_key, $pirate_forms_options );
812
+ $body['rows'] = $temp;
813
+ } else {
814
+ // new lite, new pro
815
+ $body = apply_filters( 'pirate_forms_validate_request', $body, $error_key, $pirate_forms_options );
816
+ }
817
 
818
+ return array( $contact_email, $contact_name, $contact_subject, $message );
819
  }
820
 
821
  /**
822
+ * Check with akismet if the message is spam.
 
 
 
823
  */
824
+ function is_spam( $pirate_forms_options, $ip, $page_url, $msg ) {
825
+ // check if akismet is installed and key provided
826
+ $key = get_option( 'wordpress_api_key' );
827
+ if ( empty( $key ) ) {
828
+ // see if we have provided the key in the options
829
+ $key = isset( $pirate_forms_options['akismet_api_key'] ) ? $pirate_forms_options['akismet_api_key'] : '';
830
+ }
831
+ if ( empty( $key ) ) {
832
+ return false;
833
+ }
834
 
835
+ $data = array(
836
+ 'blog' => home_url(),
837
+ 'user_ip' => $ip,
838
+ 'user_agent' => $_SERVER['HTTP_USER_AGENT'],
839
+ 'referrer' => $_SERVER['HTTP_REFERER'],
840
+ 'permalink' => $page_url,
841
+ 'comment_type' => 'contact-form',
842
+ 'comment_content' => $msg,
843
+ );
844
+ $response = wp_remote_retrieve_body(
845
+ wp_remote_post(
846
+ "https://{$key}.rest.akismet.com/1.1/comment-check", array(
847
+ 'body' => $data,
848
+ 'headers' => array(
849
+ 'Content-Type' => 'application/x-www-form-urlencoded',
850
+ 'User-Agent' => sprintf( 'WordPress/%s | Akismet/3.1.7', get_bloginfo( 'version' ) ),
851
+ ),
852
+ )
853
+ )
854
+ );
855
 
856
+ if ( 'true' == $response ) {
857
+ return true;
858
+ }
859
 
860
+ return false;
861
  }
862
 
863
  /**
865
  *
866
  * @param string $error_key the key for the session object.
867
  * @param array $pirate_forms_options the array of options for the form.
868
+ * @param array $body the body of the mail.
869
  *
870
  * @throws Exception When file uploading fails.
871
  */
872
+ function get_attachments( $error_key, $pirate_forms_options, &$body ) {
873
+ $attachments = array();
874
+ $has_files = $pirate_forms_options['pirateformsopt_attachment_field'];
875
+ if ( ! empty( $has_files ) ) {
876
+ $uploads_dir = $this->get_upload_tmp_dir();
877
+ $uploads_dir = $this->maybe_add_random_dir( $uploads_dir );
878
+
879
+ foreach ( $_FILES as $label => $file ) {
880
+ if ( empty( $file['name'] ) ) {
881
+ continue;
882
+ }
883
  /* Validate file type */
884
+ $file_types_allowed = implode( '|', apply_filters( 'pirate_forms_allowed_file_types', explode( '|', 'jpg|jpeg|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv|xls|xlsx|txt' ) ) );
885
  $pirate_forms_file_types_allowed = $file_types_allowed;
886
  $pirate_forms_file_types_allowed = trim( $pirate_forms_file_types_allowed, '|' );
887
  $pirate_forms_file_types_allowed = '(' . $pirate_forms_file_types_allowed . ')';
888
  $pirate_forms_file_types_allowed = '/\.' . $pirate_forms_file_types_allowed . '$/i';
889
+ if ( ! preg_match( $pirate_forms_file_types_allowed, $file['name'] ) ) {
890
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'file invalid: expected %s got %s', $file_types_allowed, $file['name'] ), 'error', __FILE__, __LINE__ );
891
+ $_SESSION[ $error_key ]['pirate-forms-upload-failed-type'] = sprintf( __( 'Uploaded file type is not allowed for %s', 'pirate-forms' ), $file['name'] );
892
 
893
  return false;
894
  }
895
  /* Validate file size */
896
  $pirate_forms_file_size_allowed = 1048576; // default size 1 MB
897
+ if ( $file['size'] > $pirate_forms_file_size_allowed ) {
898
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'file too large: expected %d got %d', $pirate_forms_file_size_allowed, $file['size'] ), 'error', __FILE__, __LINE__ );
899
+ $_SESSION[ $error_key ]['pirate-forms-upload-failed-size'] = sprintf( __( 'Uploaded file is too large %s', 'pirate-forms' ), $file['name'] );
900
 
901
  return false;
902
  }
903
  $this->init_uploads();
904
+ $filename = $file['name'];
905
+ $filename = $this->canonicalize( $filename );
906
+ $filename = sanitize_file_name( $filename );
907
+ $filename = $this->antiscript_file_name( $filename );
908
+ $filename = wp_unique_filename( $uploads_dir, $filename );
909
+ $new_file = trailingslashit( $uploads_dir ) . $filename;
 
 
910
  try {
911
+ if ( false === move_uploaded_file( $file['tmp_name'], $new_file ) ) {
912
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'unable to move the uploaded file from %s to %s', $file['tmp_name'], $new_file ), 'error', __FILE__, __LINE__ );
913
+ throw new Exception( sprintf( __( 'There was an unknown error uploading the file %s', 'pirate-forms' ), $file['name'] ) );
914
  }
915
  } catch ( Exception $ex ) {
916
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'unable to move the uploaded file from %s to %s with error %s', $file['tmp_name'], $new_file, $ex->getMessage() ), 'error', __FILE__, __LINE__ );
917
  $_SESSION[ $error_key ]['pirate-forms-upload-failed-general'] = $ex->getMessage();
918
  }
919
  if ( ! empty( $new_file ) ) {
920
+ $attachments[] = $new_file;
921
  }
922
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
923
  }
924
+ if ( $attachments ) {
925
+ $files = array();
926
+ foreach ( $attachments as $file ) {
927
+ $files[] = basename( $file );
 
 
 
 
928
  }
929
+ $body['body'][ __( 'Attachment', 'pirate-forms' ) ] = implode( ',', $files );
 
930
  }
931
+ do_action( 'themeisle_log_event', PIRATEFORMS_NAME, sprintf( 'finally attaching attachment(s): %s', print_r( $attachments, true ) ), 'info', __FILE__, __LINE__ );
932
+
933
+ return $attachments;
934
  }
935
 
936
  /**
983
  return $dir;
984
  }
985
 
986
+ /**
987
+ * Prepare the uploading process
988
+ *
989
+ * @since 1.0.0
990
+ * @throws Exception When file could not be opened.
991
+ */
992
+ function init_uploads() {
993
+ $dir = $this->get_upload_tmp_dir();
994
+ wp_mkdir_p( $dir );
995
+ $htaccess_file = trailingslashit( $dir ) . '.htaccess';
996
+ if ( file_exists( $htaccess_file ) ) {
997
+ return;
998
+ }
999
+ try {
1000
+ $handle = fopen( $htaccess_file, 'w' );
1001
+
1002
+ if ( ! $handle ) {
1003
+ throw new Exception( 'File open failed.' );
1004
+ } else {
1005
+ fwrite( $handle, "Deny from all\n" );
1006
+ fclose( $handle );
1007
+ }
1008
+ } catch ( Exception $e ) {
1009
+ // nothing
1010
+ }
1011
+ }
1012
+
1013
  /**
1014
  * Functions to Process uploaded files
1015
  */
public/css/front.css CHANGED
@@ -1,5 +1,5 @@
1
  /*
2
- Version: 2.1.0
3
  */
4
  .pirate_forms_wrap .form_field_wrap {
5
  margin-bottom: 20px;
@@ -47,3 +47,51 @@ Version: 2.1.0
47
  .contact_submit_wrap {
48
  text-align: right;
49
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /*
2
+ Version: 2.2.0
3
  */
4
  .pirate_forms_wrap .form_field_wrap {
5
  margin-bottom: 20px;
47
  .contact_submit_wrap {
48
  text-align: right;
49
  }
50
+
51
+ .pirate-forms-file-upload-hidden {
52
+ display: none;
53
+ visibility: hidden;
54
+ position: absolute;
55
+ left: -9999px;
56
+ }
57
+
58
+ .pirate-forms-file-upload {
59
+ display: block;
60
+ width: auto;
61
+ }
62
+ .pirate-forms-file-upload label {
63
+ display: block;
64
+ margin-bottom: 5px;
65
+ }
66
+
67
+ .pirate-forms-file-upload-wrapper {
68
+ position: relative;
69
+ margin-bottom: 5px;
70
+ }
71
+
72
+ .pirate-forms-file-upload-input {
73
+ width: 70% !important;
74
+ outline: none !important;
75
+ border: none !important;
76
+ -moz-transition: all 0.2s ease-in;
77
+ -o-transition: all 0.2s ease-in;
78
+ -webkit-transition: all 0.2s ease-in;
79
+ transition: all 0.2s ease-in;
80
+ float: left;
81
+ /* IE 9 Fix */
82
+ }
83
+ .pirate-forms-file-upload-input:hover, .pirate-forms-file-upload-input:focus {
84
+ outline: none;
85
+ }
86
+
87
+ .pirate-forms-file-upload-button {
88
+ cursor: pointer;
89
+ display: inline-block;
90
+ margin-left: -1px;
91
+ float: left;
92
+ /* IE 9 Fix */
93
+ -moz-transition: all 0.2s ease-in;
94
+ -o-transition: all 0.2s ease-in;
95
+ -webkit-transition: all 0.2s ease-in;
96
+ transition: all 0.2s ease-in;
97
+ }
public/js/scripts-general.js CHANGED
@@ -11,5 +11,8 @@ jQuery(document).ready(function() {
11
  }, 'slow');
12
  }
13
 
 
 
 
14
 
15
  });
11
  }, 'slow');
12
  }
13
 
14
+ if(jQuery('#pirate-forms-maps-custom').length > 0){
15
+ jQuery('#pirate-forms-maps-custom').html(jQuery('<input name="xobkcehc" type="' + 'xobkcehc'.split('').reverse().join('') + '" value="' + pirateFormsObject.spam.value + '"><span>' + pirateFormsObject.spam.label + '</span>'));
16
+ }
17
 
18
  });
public/js/scripts.js CHANGED
@@ -21,4 +21,18 @@ jQuery(document).ready(function() {
21
  }
22
  });
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  });
21
  }
22
  });
23
 
24
+ jQuery('.pirate-forms-file-upload-button').on('click', function () {
25
+ var $button = jQuery(this);
26
+ $button.parent().find('input[type=file]').on('change', function(){
27
+ $button.parent().find('input[type=text]').val(jQuery(this).val()).change();
28
+ });
29
+ $button.parent().find('input[type=file]').focus().click();
30
+ });
31
+
32
+ jQuery('.pirate-forms-file-upload-input').on('click', function(){
33
+ jQuery(this).parent().find('.pirate-forms-file-upload-button').trigger('click');
34
+ });
35
+ jQuery('.pirate-forms-file-upload-input').on('focus', function(){
36
+ jQuery(this).blur();
37
+ });
38
  });
readme.txt CHANGED
@@ -134,6 +134,14 @@ Activating the Pirate Contact Form plugin is just like any other plugin. If you'
134
  4. Screenshot 4. Enabling SMTP
135
 
136
  == Changelog ==
 
 
 
 
 
 
 
 
137
  = 2.1.0 - 2017-08-26 =
138
 
139
  * Improved compatibility with the pro version.
134
  4. Screenshot 4. Enabling SMTP
135
 
136
  == Changelog ==
137
+ = 2.2.0 - 2017-09-27 =
138
+
139
+ * Adds integration with Akismet for spam block.
140
+ * Adds another spam tramp mechanism, independent from Google reCAPTCHA.
141
+ * Adds filter for customizing the email body.
142
+ * Improvements for compatibility with the pro version.
143
+
144
+
145
  = 2.1.0 - 2017-08-26 =
146
 
147
  * Improved compatibility with the pro version.
vendor/autoload.php DELETED
@@ -1,7 +0,0 @@
1
- <?php
2
-
3
- // autoload.php @generated by Composer
4
-
5
- require_once __DIR__ . '/composer' . '/autoload_real.php';
6
-
7
- return ComposerAutoloaderInite35a1e393f73b97115ea07be77a961ef::getLoader();
 
 
 
 
 
 
 
vendor/autoload_52.php DELETED
@@ -1,7 +0,0 @@
1
- <?php
2
-
3
- // autoload_52.php generated by xrstf/composer-php52
4
-
5
- require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
-
7
- return ComposerAutoloaderInitdce8f282021a503be44335db805675ee::getLoader();
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/LICENSE DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- {one line to give the program's name and a brief idea of what it does.}
635
- Copyright (C) {year} {name of author}
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <http://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- {project} Copyright (C) {year} {fullname}
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <http://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <http://www.gnu.org/philosophy/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php DELETED
@@ -1,470 +0,0 @@
1
- <?php
2
- /**
3
- * The deactivate feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Deactivate' ) ) :
16
- /**
17
- * Deactivate feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Deactivate extends ThemeIsle_SDK_Feedback {
20
-
21
- /**
22
- * @var array $options_plugin The main options list for plugins.
23
- */
24
- private $options_plugin = array(
25
- 'I only needed the plugin for a short period' => array(
26
- 'id' => 1,
27
- ),
28
- 'The plugin broke my site' => array(
29
- 'id' => 2,
30
- ),
31
- 'I found a better plugin' => array(
32
- 'id' => 3,
33
- 'type' => 'text',
34
- 'placeholder' => 'What\'s the plugin\'s name?',
35
- ),
36
- 'The plugin suddenly stopped working' => array(
37
- 'id' => 4,
38
- ),
39
- 'I no longer need the plugin' => array(
40
- 'id' => 5,
41
- 'type' => 'textarea',
42
- 'placeholder' => 'If you could improve one thing about our product, what would it be?',
43
- ),
44
- 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
45
- 'id' => 6,
46
- ),
47
- );
48
-
49
- /**
50
- * @var array $options_theme The main options list for themes.
51
- */
52
- private $options_theme = array(
53
- 'I don\'t know how to make it look like demo' => array(
54
- 'id' => 7,
55
- ),
56
- 'It lacks options' => array(
57
- 'id' => 8,
58
- ),
59
- 'Is not working with a plugin that I need' => array(
60
- 'id' => 9,
61
- 'type' => 'text',
62
- 'placeholder' => 'What is the name of the plugin',
63
- ),
64
- 'I want to try a new design, I don\'t like {theme} style' => array(
65
- 'id' => 10,
66
- ),
67
- );
68
-
69
- /**
70
- * @var array $other The other option
71
- */
72
- private $other = array(
73
- 'Other' => array(
74
- 'id' => 999,
75
- 'type' => 'textarea',
76
- 'placeholder' => 'cmon cmon tell us',
77
- ),
78
- );
79
-
80
- /**
81
- * @var string $heading_plugin The heading of the modal
82
- */
83
- private $heading_plugin = 'If you have a moment, please let us know why you are deactivating:';
84
-
85
- /**
86
- * @var string $heading_theme The heading of the modal
87
- */
88
- private $heading_theme = 'Looking to change {theme}, what doesn\'t work for you?';
89
-
90
- /**
91
- * @var string $button_submit_before The text of the deactivate button before an option is chosen
92
- */
93
- private $button_submit_before = 'Skip &amp; Deactivate';
94
-
95
- /**
96
- * @var string $button_submit The text of the deactivate button
97
- */
98
- private $button_submit = 'Submit &amp; Deactivate';
99
-
100
- /**
101
- * @var string $button_cancel The text of the cancel button
102
- */
103
- private $button_cancel = 'Cancel';
104
-
105
- /**
106
- * @var int how many seconds before the deactivation window is triggered for themes
107
- */
108
- const AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS = 3;
109
-
110
- /**
111
- * @var int how many days before the deactivation window pops up again for the theme
112
- */
113
- const PAUSE_DEACTIVATE_WINDOW_DAYS = 100;
114
-
115
- /**
116
- * ThemeIsle_SDK_Feedback_Deactivate constructor.
117
- *
118
- * @param ThemeIsle_SDK_Product $product_object The product object.
119
- */
120
- public function __construct( $product_object ) {
121
- parent::__construct( $product_object );
122
- }
123
-
124
- /**
125
- * Registers the hooks
126
- */
127
- public function setup_hooks_child() {
128
- global $pagenow;
129
-
130
- if ( ( $this->product->get_type() === 'plugin' && $pagenow === 'plugins.php' ) || ( $this->product->get_type() === 'theme' && $pagenow === 'theme-install.php' ) ) {
131
- add_action( 'admin_head', array( $this, 'load_resources' ) );
132
- }
133
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'post_deactivate' ) );
134
- }
135
-
136
- /**
137
- * Loads the additional resources
138
- */
139
- function load_resources() {
140
- add_thickbox();
141
-
142
- $id = $this->product->get_key() . '_deactivate';
143
-
144
- $this->add_css( $this->product->get_type(), $this->product->get_key() );
145
- $this->add_js( $this->product->get_type(), $this->product->get_key(), '#TB_inline?' . apply_filters( $this->product->get_key() . '_feedback_deactivate_attributes', 'width=600&height=550' ) . '&inlineId=' . $id );
146
-
147
- echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
148
- }
149
-
150
- /**
151
- * Loads the css
152
- *
153
- * @param string $type The type of product.
154
- * @param string $key The product key.
155
- */
156
- function add_css( $type, $key ) {
157
- $suffix = 'theme' === $type ? 'theme-install-php' : 'plugins-php';
158
- ?>
159
- <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
160
- input[name="ti-deactivate-option"] ~ div {
161
- display: none;
162
- }
163
-
164
- input[name="ti-deactivate-option"]:checked ~ div {
165
- display: block;
166
- }
167
-
168
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
169
- background: none !important;
170
- }
171
-
172
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
173
- font-size: 21px;
174
- padding: 20px 0;
175
- background-color: #f3f3f3;
176
- }
177
-
178
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
179
- padding: 20px 0;
180
- background-color: #f3f3f3;
181
- border-top: 1px solid #dddddd;
182
- }
183
-
184
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary {
185
- margin-right: 20px;
186
- }
187
-
188
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button {
189
- margin-right: 20px;
190
- }
191
-
192
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxWindowTitle {
193
- text-align: left;
194
- margin-left: 15px;
195
- }
196
-
197
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
198
- background-color: #ffffff;
199
- }
200
-
201
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
202
- font-size: 14px;
203
- }
204
-
205
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li label {
206
- margin-left: 10px;
207
- line-height: 32px;
208
- font-size: 16px;
209
- }
210
-
211
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxContent {
212
- padding: 10px 20px;
213
- }
214
-
215
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
216
- padding: 10px 15px;
217
- width: 100%;
218
- }
219
-
220
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
221
- margin: 10px 30px;
222
- }
223
-
224
- .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
225
- display: block;
226
- }
227
-
228
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
229
-
230
- width: 100%;
231
- display: block;
232
- position: absolute;
233
- left: 0px;
234
- bottom: 0px;
235
- text-align: right;
236
- }
237
-
238
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
239
-
240
- height: 33px;
241
- width: 100%;
242
- text-align: center;
243
- }
244
-
245
- .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
246
- font-size: 32px;
247
- }
248
-
249
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
250
-
251
- color: #eee;
252
- }
253
-
254
- .<?php echo $key; ?>-container #TB_closeWindowButton {
255
- left: auto;
256
- right: -30px;
257
- color: #eee;
258
- }
259
-
260
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container {
261
-
262
- margin: auto !important;
263
- height: 550px !important;
264
- top: 0 !important;
265
- left: 0 !important;
266
- bottom: 0 !important;
267
- right: 0 !important;
268
- }
269
- </style>
270
- <?php
271
- }
272
-
273
- /**
274
- * Loads the js
275
- *
276
- * @param string $type The type of product.
277
- * @param string $key The product key.
278
- * @param string $src The url that will hijack the deactivate button url.
279
- */
280
- function add_js( $type, $key, $src ) {
281
- $heading = 'plugin' === $type ? $this->heading_plugin : str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
282
- $heading = apply_filters( $this->product->get_key() . '_feedback_deactivate_heading', $heading );
283
- ?>
284
- <script type="text/javascript" id="ti-deactivate-js">
285
- (function ($) {
286
- $(document).ready(function () {
287
- var auto_trigger = false;
288
- var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
289
- <?php
290
- if ( 'theme' === $type ) {
291
- ?>
292
- auto_trigger = true;
293
- if ($('a.ti-auto-anchor').length == 0) {
294
- $('body').append($('<a class="ti-auto-anchor" href=""></a>'));
295
- }
296
- target_element = 'a.ti-auto-anchor';
297
- <?php
298
- }
299
- ?>
300
-
301
- if (auto_trigger) {
302
- setTimeout(function () {
303
- $('a.ti-auto-anchor').trigger('click');
304
- }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
305
- }
306
- $( document ).on( 'thickbox:removed', function() {
307
- $.ajax({
308
- url: ajaxurl,
309
- method: 'post',
310
- data: {
311
- 'action' : '<?php echo $key . __CLASS__; ?>',
312
- 'nonce' : '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
313
- 'type' : '<?php echo $type; ?>',
314
- 'key' : '<?php echo $key; ?>'
315
- },
316
- });
317
- });
318
- var href = $(target_element).attr('href');
319
- $('#<?php echo $key; ?>ti-deactivate-no').on('click', function (e) {
320
- e.preventDefault();
321
- e.stopPropagation();
322
-
323
- $('body').unbind('thickbox:removed');
324
- tb_remove();
325
- });
326
-
327
- $('#<?php echo $key; ?> ul.ti-list label, #<?php echo $key; ?> ul.ti-list input[name="ti-deactivate-option"]').on('click', function (e) {
328
- $('#<?php echo $key; ?>ti-deactivate-yes').val($('#<?php echo $key; ?>ti-deactivate-yes').attr('data-after-text'));
329
-
330
- var radio = $(this).prop('tagName') === 'LABEL' ? $(this).parent() : $(this);
331
- if (radio.parent().find('textarea').length > 0 && radio.parent().find('textarea').val().length === 0) {
332
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
333
- radio.parent().find('textarea').on('keyup', function (ee) {
334
- if ($(this).val().length === 0) {
335
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
336
- } else {
337
- $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
338
- }
339
- });
340
- } else {
341
- $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
342
- }
343
- });
344
-
345
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('data-ti-action', href).on('click', function (e) {
346
- e.preventDefault();
347
- e.stopPropagation();
348
- $.ajax({
349
- url: ajaxurl,
350
- method: 'post',
351
- data: {
352
- 'action' : '<?php echo $key . __CLASS__; ?>',
353
- 'nonce' : '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
354
- 'id' : $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().attr('ti-option-id'),
355
- 'msg' : $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().find('textarea').val(),
356
- 'type' : '<?php echo $type; ?>',
357
- 'key' : '<?php echo $key; ?>'
358
- },
359
- });
360
- var redirect = $(this).attr('data-ti-action');
361
- if (redirect != '') {
362
- location.href = redirect;
363
- } else {
364
- $('body').unbind('thickbox:removed');
365
- tb_remove();
366
- }
367
- });
368
-
369
- $(target_element).attr('name', '<?php echo esc_html( $heading ); ?>').attr('href', '<?php echo $src; ?>').addClass('thickbox');
370
- var thicbox_timer;
371
- $(target_element).on('click', function () {
372
- tiBindThickbox();
373
- });
374
-
375
- function tiBindThickbox() {
376
- var thicbox_timer = setTimeout(function () {
377
- if ($("#<?php echo esc_html( $key ); ?>").is(":visible")) {
378
- $("body").trigger('thickbox:iframe:loaded');
379
- $("#TB_window").addClass("<?php echo $key; ?>-container");
380
- clearTimeout(thicbox_timer);
381
- $('body').unbind('thickbox:removed');
382
- } else {
383
- tiBindThickbox();
384
- }
385
- }, 100);
386
- }
387
- });
388
- })(jQuery);
389
- </script>
390
- <?php
391
- }
392
-
393
- /**
394
- * Generates the HTML
395
- *
396
- * @param string $type The type of product.
397
- * @param string $key The product key.
398
- */
399
- function get_html( $type, $key ) {
400
- $options = 'plugin' === $type ? $this->options_plugin : $this->options_theme;
401
- $button_submit_before = 'plugin' === $type ? $this->button_submit_before : 'Submit';
402
- $button_submit = 'plugin' === $type ? $this->button_submit : 'Submit';
403
- $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
404
- $button_submit_before = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit_before', $button_submit_before );
405
- $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $button_submit );
406
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
407
-
408
- $options += $this->other;
409
-
410
- $list = '';
411
- foreach ( $options as $title => $attributes ) {
412
- $id = $attributes['id'];
413
- $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
414
- if ( array_key_exists( 'type', $attributes ) ) {
415
- $list .= '<div>';
416
- $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
417
- switch ( $attributes['type'] ) {
418
- case 'text':
419
- $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
420
- break;
421
- case 'textarea':
422
- $list .= '<textarea style="width: 100%" rows="2" name="comments" placeholder="' . $placeholder . '"></textarea>';
423
- break;
424
- }
425
- $list .= '</div>';
426
- }
427
- $list .= '</li>';
428
- }
429
-
430
- return '<div id="' . $this->product->get_key() . '">'
431
- . '<ul class="ti-list">' . $list . '</ul>'
432
- . '<div class="actions">'
433
- . get_submit_button(
434
- $button_submit_before , 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
435
- 'data-after-text' => $button_submit,
436
- )
437
- )
438
- . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
439
- . '</div></div>';
440
- }
441
-
442
- /**
443
- * Called when the deactivate button is clicked
444
- */
445
- function post_deactivate() {
446
- check_ajax_referer( (string) __CLASS__, 'nonce' );
447
-
448
- if ( ! empty( $_POST['id'] ) ) {
449
- $this->call_api(
450
- array(
451
- 'type' => 'deactivate',
452
- 'id' => $_POST['id'],
453
- 'comment' => isset( $_POST['msg'] ) ? $_POST['msg'] : '',
454
- )
455
- );
456
- }
457
-
458
- $this->post_deactivate_or_cancel();
459
- }
460
-
461
- /**
462
- * Called when the deactivate/cancel button is clicked
463
- */
464
- private function post_deactivate_or_cancel() {
465
- if ( isset( $_POST['type'] ) && isset( $_POST['key'] ) && 'theme' === $_POST['type'] ) {
466
- set_transient( 'ti_sdk_pause_' . $_POST['key'], true, PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );
467
- }
468
- }
469
- }
470
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-factory.php DELETED
@@ -1,50 +0,0 @@
1
- <?php
2
- /**
3
- * The feedback factory class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Factory' ) ) :
16
- /**
17
- * Feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Factory {
20
-
21
- /**
22
- * @var array $instances collection of the instances that are registered with the factory
23
- */
24
- private $_instances = array();
25
-
26
- /**
27
- * ThemeIsle_SDK_Feedback_Factory constructor.
28
- *
29
- * @param ThemeIsle_SDK_Product $product_object Product Object.
30
- * @param array $feedback_types the feedback types.
31
- */
32
- public function __construct( $product_object, $feedback_types ) {
33
- if ( $product_object instanceof ThemeIsle_SDK_Product && $feedback_types && is_array( $feedback_types ) ) {
34
- foreach ( $feedback_types as $type ) {
35
- $class = 'ThemeIsle_SDK_Feedback_' . ucwords( $type );
36
- $instance = new $class( $product_object );
37
- $this->_instances[ $type ] = $instance;
38
- $instance->setup_hooks();
39
- }
40
- }
41
- }
42
-
43
- /**
44
- * Get the registered instances
45
- */
46
- public function get_instances() {
47
- return $this->_instances;
48
- }
49
- }
50
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-review.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
- /**
3
- * The review feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
16
- /**
17
- * Deactivate feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Review extends ThemeIsle_SDK_Feedback {
20
-
21
- /**
22
- * @var string $heading The heading of the modal
23
- */
24
- private $heading = 'Hey, it’s great to see you have {product} active for a few days now. How is everything going? If you can spare a few moments to rate it on WordPress.org it would help us a lot (and boost my motivation). Cheers! <br/> <br/>~ {developer}, developer of {product}';
25
-
26
- /**
27
- * @var string $button_cancel The text of the cancel button
28
- */
29
- private $button_cancel = 'No, thanks.';
30
- /**
31
- * @var array Developers who work for each type of product for review purpose.
32
- */
33
- private $developers = array(
34
- 'plugin' => array( 'Marius', 'Bogdan' ),
35
- 'theme' => array( 'Rodica', 'Andrei', 'Bogdan', 'Cristi' ),
36
- );
37
- /**
38
- * @var string $button_already The text of the already did it button
39
- */
40
- private $button_do = 'Ok, I will gladly help.';
41
-
42
- /**
43
- * ThemeIsle_SDK_Feedback_Deactivate constructor.
44
- *
45
- * @param ThemeIsle_SDK_Product $product_object The product object.
46
- */
47
- public function __construct( $product_object ) {
48
- parent::__construct( $product_object );
49
- }
50
-
51
- /**
52
- * Registers the hooks
53
- */
54
- public function setup_hooks_child() {
55
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
56
- }
57
-
58
- /**
59
- * Shows the notification
60
- */
61
- function show_notification() {
62
- if ( ! $this->product->is_wordpress_available() ) {
63
- $this->disable();
64
-
65
- return false;
66
- }
67
- $show = get_option( $this->product->get_key() . '_review_flag', 'yes' );
68
- if ( 'no' === $show ) {
69
- return false;
70
- }
71
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
72
-
73
- return true;
74
- }
75
-
76
- /**
77
- * Shows the admin notice
78
- */
79
- function admin_notices() {
80
- $id = $this->product->get_key() . '_review';
81
-
82
- $this->add_css( $this->product->get_key() );
83
- $this->add_js( $this->product->get_key() );
84
-
85
- echo '<div class="notice notice-success is-dismissible" id="' . $id . '" ><div class="themeisle-review-box">' . $this->get_html( $this->product->get_key() ) . '</div></div>';
86
- }
87
-
88
- /**
89
- * Loads the css
90
- *
91
- * @param string $key The product key.
92
- */
93
- function add_css( $key ) {
94
- ?>
95
- <style type="text/css" id="<?php echo $key; ?>ti-review-css">
96
- #<?php echo $key; ?>-review-notification {
97
- padding-bottom: 5px;
98
- }
99
-
100
- #<?php echo $key; ?>-review-notification .review-dismiss {
101
- margin-left: 5px;
102
- }
103
- </style>
104
- <?php
105
- }
106
-
107
- /**
108
- * Loads the js
109
- *
110
- * @param string $key The product key.
111
- */
112
- function add_js( $key ) {
113
- ?>
114
- <script type="text/javascript" id="<?php echo $key; ?>ti-review-js">
115
- (function ($) {
116
- $(document).ready(function () {
117
- $('#<?php echo $key; ?>_review').on('click', '.notice-dismiss, .review-dismiss', function (e) {
118
-
119
- $.ajax({
120
- url: ajaxurl,
121
- method: "post",
122
- data: {
123
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
124
- 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>'
125
- },
126
- success: function () {
127
- $('#<?php echo $key; ?>_review').hide();
128
- }
129
- });
130
- });
131
- });
132
- })(jQuery);
133
- </script>
134
- <?php
135
- }
136
-
137
- /**
138
- * Generates the HTML
139
- *
140
- * @param string $key The product key.
141
- */
142
- function get_html( $key ) {
143
- $link = 'https://wordpress.org/support/' . $this->product->get_type() . '/' . $this->product->get_slug() . '/reviews/#wporg-footer';
144
- $heading = apply_filters( $this->product->get_key() . '_feedback_review_heading', $this->heading );
145
- $heading = str_replace(
146
- array( '{product}' ),
147
- trim( str_replace( 'Lite', '', $this->product->get_name() ) ), $heading
148
- );
149
- $heading = str_replace( '{developer}', $this->developers[ $this->product->get_type() ][ rand( 0, ( count( $this->developers[ $this->product->get_type() ] ) - 1 ) ) ], $heading );
150
-
151
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_review_button_cancel', $this->button_cancel );
152
- $button_do = apply_filters( $this->product->get_key() . '_feedback_review_button_do', $this->button_do );
153
-
154
- return '<div id="' . $this->product->get_key() . '-review-notification" class="themeisle-sdk-review-box">'
155
- . '<p>' . $heading . '</p>'
156
- . '<div class="actions">'
157
- . '<a href="' . $link . '" target="_blank" class="button button-primary review-dismiss"> ' . $button_do . '</a>'
158
- . get_submit_button( $button_cancel, 'review-dismiss ' . $this->product->get_key() . '-ti-review', $this->product->get_key() . 'ti-review-no', false )
159
- . '</div></div>';
160
- }
161
-
162
- /**
163
- * Called when the either button is clicked
164
- */
165
- function dismiss() {
166
- check_ajax_referer( (string) __CLASS__, 'nonce' );
167
-
168
- $this->disable();
169
- }
170
-
171
- /**
172
- * Disables the notification
173
- */
174
- protected function disable() {
175
- update_option( $this->product->get_key() . '_review_flag', 'no' );
176
- }
177
-
178
- /**
179
- * Enables the notification
180
- */
181
- protected function enable() {
182
- update_option( $this->product->get_key() . '_review_flag', 'yes' );
183
- }
184
- }
185
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback.php DELETED
@@ -1,90 +0,0 @@
1
- <?php
2
- /**
3
- * The feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback' ) ) :
16
- /**
17
- * Feedback model for ThemeIsle SDK.
18
- */
19
- abstract class ThemeIsle_SDK_Feedback {
20
- /**
21
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
22
- */
23
- protected $product;
24
-
25
- /**
26
- * @var string $feedback_url Url where to send the feedback
27
- */
28
- private $feedback_url = 'http://feedback.themeisle.com/wordpress/wp-json/__pirate_feedback_/v1/feedback';
29
-
30
- /**
31
- * ThemeIsle_SDK_Feedback constructor.
32
- *
33
- * @param ThemeIsle_SDK_Product $product_object Product Object.
34
- */
35
- public function __construct( $product_object ) {
36
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
37
- $this->product = $product_object;
38
- }
39
- $this->setup_hooks();
40
- }
41
-
42
- /**
43
- * Registers the hooks and then delegates to the child
44
- */
45
- public function setup_hooks() {
46
- $this->setup_hooks_child();
47
- }
48
-
49
- /**
50
- * Calls the API
51
- *
52
- * @param string $attributes The attributes of the post body.
53
- */
54
- protected function call_api( $attributes ) {
55
- $slug = $this->product->get_slug();
56
- $version = $this->product->get_version();
57
- $attributes['slug'] = $slug;
58
- $attributes['version'] = $version;
59
-
60
- $response = wp_remote_post(
61
- $this->feedback_url, array(
62
- 'body' => $attributes,
63
- )
64
- );
65
- }
66
-
67
- /**
68
- * Randomizes the options array
69
- *
70
- * @param array $options The options array.
71
- */
72
- function randomize_options( $options ) {
73
- $new = array();
74
- $keys = array_keys( $options );
75
- shuffle( $keys );
76
-
77
- foreach ( $keys as $key ) {
78
- $new[ $key ] = $options[ $key ];
79
- }
80
-
81
- return $new;
82
- }
83
-
84
- /**
85
- * Abstract function for delegating to the child
86
- */
87
- protected abstract function setup_hooks_child();
88
-
89
- }
90
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-licenser.php DELETED
@@ -1,710 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for license handling.
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Licenser
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- if ( ! class_exists( 'ThemeIsle_SDK_Licenser' ) ) :
12
- /**
13
- * Class ThemeIsle_SDK_Licenser
14
- *
15
- * Used to update the themeisle products
16
- */
17
- class ThemeIsle_SDK_Licenser {
18
-
19
- /**
20
- * @var string $license_key The license key string
21
- */
22
- public $license_key;
23
-
24
- /**
25
- * @var bool $do_check This ensures that the custom API request only runs on the second time that WP fires the update check
26
- */
27
- private $do_check = false;
28
-
29
- /**
30
- * @var bool $failed_checks Number of failed checks to the api endpoint
31
- */
32
- private $failed_checks = 0;
33
- /**
34
- * @var ThemeIsle_SDK_Product $product The ThemeIsle Product.
35
- */
36
- private $product;
37
- /**
38
- * @var string $product_key The product update response key.
39
- */
40
- private $product_key;
41
- /**
42
- * @var int $max_failed Maximum failed checks allowed before show the notice
43
- */
44
- private static $max_failed = 5;
45
-
46
- /**
47
- * ThemeIsle_SDK_Licenser constructor.
48
- *
49
- * @param ThemeIsle_SDK_Product $product The product object.
50
- */
51
- public function __construct( $product ) {
52
- $this->product = $product;
53
- $this->product_key = $this->product->get_key() . '-update-response';
54
- if ( ! $this->product->requires_license() ) {
55
- $this->license_key = 'free';
56
- } else {
57
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
58
- $this->failed_checks = intval( get_option( $this->product->get_key() . '_failed_checks', 0 ) );
59
- if ( $license_data !== '' ) {
60
- $this->license_key = isset( $license_data->key ) ? $license_data->key : get_option( $this->product->get_key() . '_license', '' );
61
- } else {
62
- $this->license_key = get_option( $this->product->get_key() . '_license', '' );
63
- }
64
- $this->register_license_hooks();
65
- }
66
- }
67
-
68
- /**
69
- * Register license hooks for the themeisle products
70
- */
71
- public function register_license_hooks() {
72
- add_action( 'admin_init', array( $this, 'register_settings' ) );
73
- add_action( 'admin_init', array( $this, 'activate_license' ) );
74
- add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
75
- add_action( 'admin_notices', array( $this, 'show_notice' ) );
76
- }
77
-
78
- /**
79
- * @param string $r Update payload.
80
- * @param string $url The api url.
81
- *
82
- * @return mixed List of themes to check for update.
83
- */
84
- function disable_wporg_update( $r, $url ) {
85
-
86
- if ( 0 !== strpos( $url, 'https://api.wordpress.org/themes/update-check/' ) ) {
87
- return $r;
88
- }
89
-
90
- // Decode the JSON response
91
- $themes = json_decode( $r['body']['themes'] );
92
-
93
- unset( $themes->themes->{$this->product->get_slug()} );
94
-
95
- // Encode the updated JSON response
96
- $r['body']['themes'] = json_encode( $themes );
97
-
98
- return $r;
99
- }
100
-
101
- /**
102
- * Register the setting for the license of the product
103
- *
104
- * @return bool
105
- */
106
- public function register_settings() {
107
- if ( ! is_admin() ) {
108
- return false;
109
- }
110
- add_settings_field(
111
- $this->product->get_key() . '_license',
112
- $this->product->get_name() . ' license',
113
- array( $this, 'license_view' ),
114
- 'general'
115
- );
116
- }
117
-
118
- /**
119
- * The license view field
120
- */
121
- public function license_view() {
122
- $status = $this->get_license_status();
123
- $value = $this->license_key;
124
-
125
- $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', 'Activate' );
126
- $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', 'Deactivate' );
127
- $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
128
- $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
129
- $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
130
-
131
- echo '<p ><input ' . ( ( $status === 'valid' ) ? ( 'style="border:1px solid #7ad03a; "' ) : '' ) . ' type="text" id="' . $this->product->get_key() . '_license" name="' . $this->product->get_key() . '_license" value="' . $value . '" /><a ' . ( ( $status === 'valid' ) ? ( 'style="color:#fff;background: #7ad03a; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $valid_string ) : ( 'style="color:#fff;background: #dd3d36; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $invalid_string ) ) . ' </a>&nbsp;&nbsp;&nbsp;<button name="' . $this->product->get_key() . '_btn_trigger" ' . ( ( $status === 'valid' ) ? ( ' class="button button-primary">' . $deactivate_string ) : ( ' class="button button-primary" value="yes" type="submit" >' . $activate_string ) ) . ' </button></p><p class="description">' . sprintf( $license_message, '<a href="' . $this->product->get_store_url() . '">' . $this->product->get_store_name() . '</a> ', $this->product->get_type() ) . '</p>';
132
-
133
- }
134
-
135
- /**
136
- * Return the license status.
137
- *
138
- * @return string The License status.
139
- */
140
- public function get_license_status() {
141
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
142
- if ( $license_data !== '' ) {
143
- return isset( $license_data->license ) ? $license_data->license : get_option( $this->product->get_key() . '_license_status', 'not_active' );
144
- } else {
145
- return get_option( $this->product->get_key() . '_license_status', 'not_active' );
146
- }
147
-
148
- }
149
-
150
- /**
151
- * Check if the license is active or not
152
- *
153
- * @return bool
154
- */
155
- public function check_activation() {
156
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
157
- if ( $license_data !== '' ) {
158
- return isset( $license_data->error ) ? ( $license_data->error == 'no_activations_left' ) : false;
159
- }
160
-
161
- return false;
162
- }
163
-
164
- /**
165
- * Check if the license is about to expire in the next month
166
- *
167
- * @return bool
168
- */
169
- function check_expiration() {
170
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
171
- if ( $license_data !== '' ) {
172
- if ( isset( $license_data->expires ) ) {
173
- if ( strtotime( $license_data->expires ) - time() < 30 * 24 * 3600 ) {
174
- return true;
175
- }
176
- }
177
- }
178
-
179
- return false;
180
- }
181
-
182
- /**
183
- * Return the renew url from the store used
184
- *
185
- * @return string The renew url.
186
- */
187
- function renew_url() {
188
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
189
- if ( $license_data !== '' ) {
190
- if ( isset( $license_data->download_id ) && isset( $license_data->key ) ) {
191
- return $this->product->get_store_url() . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
192
- }
193
- }
194
-
195
- return $this->product->get_store_url();
196
- }
197
-
198
- /**
199
- * Check if we hide the notificatin nag or not
200
- *
201
- * @param string $hide The notification to hide.
202
- *
203
- * @return bool Either hide them or not.
204
- */
205
- function check_hide( $hide ) {
206
- if ( isset( $_GET[ $this->product->get_key() . '_hide_' . $hide ] ) ) {
207
- if ( $_GET[ $this->product->get_key() . '_hide_' . $hide ] === 'yes' ) {
208
- update_option( $this->product->get_key() . '_hide_' . $hide, 'yes' );
209
-
210
- return false;
211
- }
212
- } else {
213
- $license = get_option( $this->product->get_key() . '_hide_' . $hide, '' );
214
- if ( $license === 'yes' ) {
215
- return false;
216
- }
217
- }
218
-
219
- return true;
220
- }
221
-
222
- /**
223
- * Show the admin notice regarding the license status
224
- *
225
- * @return bool
226
- */
227
- function show_notice() {
228
- if ( ! is_admin() ) {
229
- return false;
230
- }
231
- $status = $this->get_license_status();
232
- $no_activations_string = apply_filters(
233
- $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to
234
- upgrade your plan in order to use %s on more
235
- websites. Please ask the %s
236
- Staff for more details.'
237
- );
238
- $no_valid_string = apply_filters(
239
- $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s , please add
240
- your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a
241
- href="%s">here</a> '
242
- );
243
- $expiration_string = apply_filters(
244
- $this->product->get_key() . '_lc_expiration_string', 'Your license is about to expire
245
- for %s. You can go to %s and renew it '
246
- );
247
- $hide_notice_string = apply_filters( $this->product->get_key() . '_lc_hide_notice_string', 'Hide Notice' );
248
- if ( $status != 'valid' ) {
249
- if ( $this->check_activation() ) {
250
- if ( $this->check_hide( 'activation' ) ) {
251
- ?>
252
- <div class="error">
253
- <p><strong>
254
- <?php
255
- echo sprintf(
256
- $no_activations_string, $this->product->get_name(), $this->product->get_name(), '<a href="' . $this->product->get_store_url() . '"
257
- target="_blank">' . $this->product->get_store_name() . '</a>'
258
- );
259
- ?>
260
- </strong> | <a
261
- href="<?php echo add_query_arg( $this->product->get_key() . '_activation', 'yes' ); ?> "><?php echo $hide_notice_string; ?></a>
262
- </p>
263
- </div>
264
- <?php
265
- return false;
266
- }
267
- }
268
- ?>
269
- <?php if ( $this->check_hide( 'valid' ) ) : ?>
270
- <div class="error">
271
- <p>
272
- <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->product->get_store_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() ); ?> </strong>|
273
- <a
274
- href="<?php echo add_query_arg( $this->product->get_key() . '_hide_valid', 'yes' ); ?> "><?php echo $hide_notice_string; ?></a>
275
- </p>
276
- </div>
277
- <?php endif; ?>
278
- <?php
279
- } else {
280
- if ( $this->check_expiration() ) {
281
- if ( $this->check_hide( 'expiration' ) ) {
282
- ?>
283
- <div class="update-nag">
284
- <p>
285
- <strong>
286
- <?php
287
- echo sprintf(
288
- $expiration_string, $this->product->get_name() . ' ' . $this->product->get_type(), '<a
289
- href="' . $this->renew_url() . '"
290
- target="_blank">' . $this->product->get_store_name() . '</a>'
291
- );
292
- ?>
293
- </strong> |
294
- <a
295
- href="<?php echo add_query_arg( $this->product->get_key() . '_hide_expiration', 'yes' ); ?> "><?php echo $hide_notice_string; ?></a>
296
- </p>
297
- </div>
298
- <?php
299
- }
300
- }
301
- }
302
- }
303
-
304
- /**
305
- * Run the license check call
306
- */
307
- public function product_valid() {
308
- if ( false === ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) {
309
- $license = $this->check_license();
310
- set_transient( $this->product->get_key() . '_license_data', $license, 12 * HOUR_IN_SECONDS );
311
- update_option( $this->product->get_key() . '_license_data', $license );
312
- }
313
-
314
- }
315
-
316
- /**
317
- * Increment the failed checks
318
- */
319
- private function increment_failed_checks() {
320
- $this->failed_checks ++;
321
- update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
322
- }
323
-
324
- /**
325
- * Reset the failed checks
326
- */
327
- private function reset_failed_checks() {
328
- $this->failed_checks = 1;
329
- update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
330
- }
331
-
332
- /**
333
- * Check the license status
334
- *
335
- * @return object The license data.
336
- */
337
- public function check_license() {
338
- $status = $this->get_license_status();
339
- if ( $status == 'not_active' ) {
340
- $license_data = new stdClass();
341
- $license_data->license = 'not_active';
342
-
343
- return $license_data;
344
- }
345
- $license = trim( $this->license_key );
346
- $api_params = array(
347
- 'edd_action' => 'check_license',
348
- 'license' => $license,
349
- 'item_name' => rawurlencode( $this->product->get_name() ),
350
- 'url' => rawurlencode( home_url() ),
351
- );
352
- // Call the custom API.
353
- $response = wp_remote_get(
354
- add_query_arg( $api_params, $this->product->get_store_url() ), array(
355
- 'timeout' => 15,
356
- 'sslverify' => false,
357
- )
358
- );
359
- if ( is_wp_error( $response ) ) {
360
- $license_data = new stdClass();
361
- $license_data->license = 'valid';
362
-
363
- } else {
364
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
365
- if ( ! is_object( $license_data ) ) {
366
- $license_data = new stdClass();
367
- $license_data->license = 'valid';
368
- }
369
- }
370
- $license_old = get_option( $this->product->get_key() . '_license_data', '' );
371
- if ( $license_old->license == 'valid' && ( $license_data->license != $license_old->license ) ) {
372
- $this->increment_failed_checks();
373
- } else {
374
- $this->reset_failed_checks();
375
- }
376
-
377
- if ( $this->failed_checks <= self::$max_failed ) {
378
- return $license_old;
379
- }
380
-
381
- if ( isset( $license_old->hide_valid ) ) {
382
- $license_data->hide_valid = true;
383
- }
384
-
385
- if ( ! isset( $license_data->key ) ) {
386
- $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
387
- }
388
-
389
- if ( isset( $license_old->hide_expiration ) ) {
390
- $license_data->hide_expiration = true;
391
- }
392
-
393
- if ( isset( $license_old->hide_activation ) ) {
394
- $license_data->hide_activation = true;
395
- }
396
-
397
- return $license_data;
398
-
399
- }
400
-
401
- /**
402
- * Activate the license remotely
403
- */
404
- function activate_license() {
405
- // listen for our activate button to be clicked
406
- if ( isset( $_POST[ $this->product->get_key() . '_btn_trigger' ] ) ) {
407
- $status = $this->get_license_status();
408
- // retrieve the license from the database
409
- $license = $_POST[ $this->product->get_key() . '_license' ];
410
- $api_params = array(
411
- 'license' => $license,
412
- 'item_name' => rawurlencode( $this->product->get_name() ),
413
- 'url' => rawurlencode( home_url() ),
414
- );
415
- if ( $status != 'valid' ) {
416
- // data to send in our API request
417
- $api_params['edd_action'] = 'activate_license';
418
- } else {
419
- $api_params['edd_action'] = 'deactivate_license';
420
- }
421
- // Call the custom API.
422
- $response = wp_remote_get( add_query_arg( $api_params, $this->product->get_store_url() ) );
423
- // make sure the response came back okay
424
- if ( is_wp_error( $response ) ) {
425
- $license_data = new stdClass();
426
- $license_data->license = ( $status != 'valid' ) ? 'valid' : 'invalid';
427
-
428
- } else {
429
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
430
- if ( ! is_object( $license_data ) ) {
431
- $license_data = new stdClass();
432
- $license_data->license = ( $status != 'valid' ) ? 'valid' : 'invalid';
433
- }
434
- }
435
- if ( ! isset( $license_data->key ) ) {
436
- $license_data->key = $license;
437
- }
438
- if ( $license_data->license == 'valid' ) {
439
- $this->reset_failed_checks();
440
- }
441
-
442
- if ( isset( $license_data->plan ) ) {
443
- update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
444
- }
445
-
446
- update_option( $this->product->get_key() . '_license_data', $license_data );
447
- delete_transient( $this->product->get_key() . '_license_data' );
448
- set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
449
-
450
- }
451
- }
452
-
453
- /**
454
- * Enable the license system
455
- */
456
- public function enable() {
457
- if ( $this->product->get_type() == 'plugin' ) {
458
- add_filter(
459
- 'pre_set_site_transient_update_plugins', array(
460
- $this,
461
- 'pre_set_site_transient_update_plugins_filter',
462
- )
463
- );
464
- add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
465
- add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
466
- }
467
- if ( $this->product->get_type() == 'theme' ) {
468
- add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
469
- add_filter( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
470
- add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
471
- add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
472
- add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
473
- add_filter( 'http_request_args', array( $this, 'disable_wporg_update' ), 5, 2 );
474
-
475
- }
476
-
477
- }
478
-
479
- /**
480
- * Load the Themes screen
481
- */
482
- function load_themes_screen() {
483
- add_thickbox();
484
- add_action( 'admin_notices', array( &$this, 'update_nag' ) );
485
- }
486
-
487
- /**
488
- * Alter the nag for themes update
489
- */
490
- function update_nag() {
491
- $theme = wp_get_theme( $this->product->get_slug() );
492
- $api_response = get_transient( $this->product_key );
493
- if ( false === $api_response ) {
494
- return;
495
- }
496
- $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
497
- $update_message = apply_filters( 'themeisle_sdk_license_update_message', 'Updating this theme will lose any customizations you have made. Cancel to stop, OK to update.' );
498
- $update_onclick = ' onclick="if ( confirm(\'' . esc_js( $update_message ) . '\') ) {return true;}return false;"';
499
- if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
500
- echo '<div id="update-nag">';
501
- printf(
502
- '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
503
- $theme->get( 'Name' ),
504
- $api_response->new_version,
505
- '#TB_inline?width=640&amp;inlineId=' . $this->product->get_version() . '_changelog',
506
- $theme->get( 'Name' ),
507
- $update_url,
508
- $update_onclick
509
- );
510
- echo '</div>';
511
- echo '<div id="' . $this->product->get_slug() . '_' . 'changelog" style="display:none;">';
512
- echo wpautop( $api_response->sections['changelog'] );
513
- echo '</div>';
514
- }
515
- }
516
-
517
- /**
518
- * @param mixed $value The transient data.
519
- *
520
- * @return mixed
521
- */
522
- function theme_update_transient( $value ) {
523
- $update_data = $this->check_for_update();
524
- if ( $update_data ) {
525
- $value->response[ $this->product->get_slug() ] = $update_data;
526
- }
527
-
528
- return $value;
529
- }
530
-
531
- /**
532
- * Delete the update transient
533
- */
534
- function delete_theme_update_transient() {
535
- delete_transient( $this->product_key );
536
- }
537
-
538
- /**
539
- * Check for updates
540
- *
541
- * @return array|bool Either the update data or false in case of failure
542
- */
543
- function check_for_update() {
544
- $theme = wp_get_theme( $this->product->get_slug() );
545
- $update_data = get_transient( $this->product_key );
546
- if ( false === $update_data ) {
547
- $failed = false;
548
- if ( empty( $this->license_key ) ) {
549
- return false;
550
- }
551
- $api_params = array(
552
- 'edd_action' => 'get_version',
553
- 'version' => $this->product->get_version(),
554
- 'license' => $this->license_key,
555
- 'name' => $this->product->get_name(),
556
- 'slug' => $this->product->get_slug(),
557
- 'author' => $this->product->get_store_name(),
558
- 'url' => rawurlencode( home_url() ),
559
- );
560
- $response = wp_remote_post(
561
- $this->product->get_store_url(), array(
562
- 'timeout' => 15,
563
- 'sslverify' => false,
564
- 'body' => $api_params,
565
- )
566
- );
567
- // make sure the response was successful
568
- if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
569
- $failed = true;
570
- }
571
- $update_data = json_decode( wp_remote_retrieve_body( $response ) );
572
- if ( ! is_object( $update_data ) ) {
573
- $failed = true;
574
- }
575
- // if the response failed, try again in 30 minutes
576
- if ( $failed ) {
577
- $data = new stdClass;
578
- $data->new_version = $this->product->get_version();
579
- set_transient( $this->product_key, $data, strtotime( '+30 minutes' ) );
580
-
581
- return false;
582
- }
583
- // if the status is 'ok', return the update arguments
584
- if ( ! $failed ) {
585
- $update_data->sections = maybe_unserialize( $update_data->sections );
586
- set_transient( $this->product_key, $update_data, strtotime( '+12 hours' ) );
587
- }
588
- }
589
- if ( version_compare( $this->product->get_version(), $update_data->new_version, '>=' ) ) {
590
- return false;
591
- }
592
-
593
- return (array) $update_data;
594
- }
595
-
596
- /**
597
- * Check for Updates at the defined API endpoint and modify the update array.
598
- *
599
- * This function dives into the update API just when WordPress creates its update array,
600
- * then adds a custom API call and injects the custom plugin data retrieved from the API.
601
- * It is reassembled from parts of the native WordPress plugin update code.
602
- * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
603
- *
604
- * @uses api_request()
605
- *
606
- * @param array $_transient_data Update array build by WordPress.
607
- *
608
- * @return array Modified update array with custom plugin data.
609
- */
610
- public function pre_set_site_transient_update_plugins_filter( $_transient_data ) {
611
- if ( empty( $_transient_data ) || ! $this->do_check ) {
612
- $this->do_check = true;
613
-
614
- return $_transient_data;
615
- }
616
- $api_response = $this->api_request();
617
- if ( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
618
- if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
619
- $_transient_data->response[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
620
- }
621
- }
622
-
623
- return $_transient_data;
624
- }
625
-
626
- /**
627
- * Calls the API and, if successfull, returns the object delivered by the API.
628
- *
629
- * @uses get_bloginfo()
630
- * @uses wp_remote_post()
631
- * @uses is_wp_error()
632
- *
633
- * @param string $_action The requested action.
634
- * @param array $_data Parameters for the API action.
635
- *
636
- * @return false||object
637
- */
638
- private function api_request( $_action = '', $_data = '' ) {
639
- if ( empty( $this->license_key ) ) {
640
- return;
641
- }
642
- $api_params = array(
643
- 'edd_action' => 'get_version',
644
- 'license' => $this->license_key,
645
- 'name' => rawurlencode( $this->product->get_name() ),
646
- 'slug' => rawurlencode( $this->product->get_slug() ),
647
- 'author' => $this->product->get_store_name(),
648
- 'url' => rawurlencode( home_url() ),
649
- );
650
- $request = wp_remote_post(
651
- $this->product->get_store_url(), array(
652
- 'timeout' => 15,
653
- 'sslverify' => false,
654
- 'body' => $api_params,
655
- )
656
- );
657
- if ( ! is_wp_error( $request ) ) :
658
- $request = json_decode( wp_remote_retrieve_body( $request ) );
659
- if ( $request && isset( $request->sections ) ) {
660
- $request->sections = maybe_unserialize( $request->sections );
661
- }
662
-
663
- return $request;
664
- else :
665
- return false;
666
- endif;
667
- }
668
-
669
- /**
670
- * Updates information on the "View version x.x details" page with custom data.
671
- *
672
- * @uses api_request()
673
- *
674
- * @param mixed $_data Plugin data.
675
- * @param string $_action Action to send.
676
- * @param object $_args Arguments to use.
677
- *
678
- * @return object $_data
679
- */
680
- public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
681
- if ( ( $_action != 'plugin_information' ) || ! isset( $_args->slug ) || ( $_args->slug != $this->product->get_slug() ) ) {
682
- return $_data;
683
- }
684
- $api_response = $this->api_request();
685
- if ( false !== $api_response ) {
686
- $_data = $api_response;
687
- }
688
-
689
- return $_data;
690
- }
691
-
692
- /**
693
- * Disable SSL verification in order to prevent download update failures
694
- *
695
- * @param array $args Http args.
696
- * @param string $url Url to check.
697
- *
698
- * @return object $array
699
- */
700
- function http_request_args( $args, $url ) {
701
- // If it is an https request and we are performing a package download, disable ssl verification
702
- if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
703
- $args['sslverify'] = false;
704
- }
705
-
706
- return $args;
707
- }
708
-
709
- }
710
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-loader.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Loader
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Loader' ) ) :
16
- /**
17
- * Singleton loader for ThemeIsle SDK.
18
- */
19
- final class ThemeIsle_SDK_Loader {
20
- /**
21
- * @var ThemeIsle_SDK_Loader instance The singleton instance
22
- */
23
- private static $instance;
24
- /**
25
- * @var string $version The class version.
26
- */
27
- private static $version = '1.0.0';
28
- /**
29
- * @var array The products which use the SDK.
30
- */
31
- private static $products;
32
-
33
- /**
34
- * Register product into SDK.
35
- *
36
- * @param string $basefile The product basefile.
37
- *
38
- * @return ThemeIsle_SDK_Loader The singleton object.
39
- */
40
- public static function init_product( $basefile ) {
41
-
42
- if ( ! isset( self::$instance ) && ! ( self::$instance instanceof ThemeIsle_SDK_Loader ) ) {
43
- self::$instance = new ThemeIsle_SDK_Loader;
44
-
45
- }
46
- $product_object = new ThemeIsle_SDK_Product( $basefile );
47
- self::$products[ $product_object->get_slug() ] = $product_object;
48
-
49
- $notifications = array();
50
- // Based on the WordPress Available file header we enable the logger or not.
51
- if ( ! $product_object->is_wordpress_available() ) {
52
- $licenser = new ThemeIsle_SDK_Licenser( $product_object );
53
- $licenser->enable();
54
- }
55
-
56
- $logger = new ThemeIsle_SDK_Logger( $product_object );
57
- if ( $product_object->is_logger_active() ) {
58
- $logger->enable();
59
- } else {
60
- $notifications[] = $logger;
61
- }
62
-
63
- $feedback = new ThemeIsle_SDK_Feedback_Factory( $product_object, $product_object->get_feedback_types() );
64
-
65
- $instances = $feedback->get_instances();
66
- if ( array_key_exists( 'review', $instances ) ) {
67
- $notifications[] = $instances['review'];
68
- }
69
- new ThemeIsle_SDK_Notification_Manager( $product_object, $notifications );
70
- if ( ! $product_object->is_external_author() ) {
71
- new ThemeIsle_SDK_Widgets_Factory( $product_object, $product_object->get_widget_types() );
72
- }
73
-
74
- return self::$instance;
75
- }
76
-
77
- /**
78
- * Get all products using the SDK.
79
- *
80
- * @return array Products available.
81
- */
82
- public static function get_products() {
83
- return self::$products;
84
- }
85
-
86
-
87
- }
88
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php DELETED
@@ -1,211 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Logger
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
12
- /**
13
- * Class ThemeIsle_SDK_Logger
14
- *
15
- * Send the statistics to the Themeisle Endpoint
16
- */
17
- /**
18
- * Class ThemeIsle_SDK_Logger
19
- */
20
- class ThemeIsle_SDK_Logger {
21
-
22
- /**
23
- * @var string $logging_url Url where to send the logs
24
- */
25
- private $logging_url = 'http://log.themeisle.com/wp-json/v1/logs/';
26
-
27
- /**
28
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
29
- */
30
- private $product;
31
-
32
- /**
33
- * @var string $product_cron Cron name handler
34
- */
35
- private $product_cron;
36
-
37
- /**
38
- * @var string $heading The heading of the modal
39
- */
40
- private $heading = 'Do you enjoy {product}? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.';
41
-
42
- /**
43
- * @var string $button_submit The text of the submit button
44
- */
45
- private $button_submit = 'Sure, I would love to help.';
46
-
47
- /**
48
- * @var string $button_cancel The text of the cancel button
49
- */
50
- private $button_cancel = 'No, thanks.';
51
-
52
- /**
53
- * ThemeIsle_SDK_Logger constructor.
54
- *
55
- * @param ThemeIsle_SDK_Product $product_object Product Object.
56
- */
57
- public function __construct( $product_object ) {
58
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
59
- $this->product = $product_object;
60
- $this->product_cron = $product_object->get_key() . '_log_activity';
61
- }
62
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
63
- }
64
-
65
-
66
- /**
67
- * Start the cron to send the log. It will randomize the interval in order to not send all the logs at the same time.
68
- */
69
- public function enable() {
70
- if ( ! wp_next_scheduled( $this->product_cron ) ) {
71
- wp_schedule_single_event( time() + ( rand( 15, 24 ) * 3600 ), $this->product_cron );
72
- }
73
- add_action( $this->product_cron, array( $this, 'send_log' ) );
74
- }
75
-
76
- /**
77
- * Send the statistics to the api endpoint
78
- */
79
- public function send_log() {
80
- wp_remote_post(
81
- $this->logging_url, array(
82
- 'method' => 'POST',
83
- 'timeout' => 3,
84
- 'redirection' => 5,
85
- 'headers' => array(
86
- 'X-ThemeIsle-Event' => 'log_site',
87
- ),
88
- 'body' => array(
89
- 'site' => get_site_url(),
90
- 'slug' => $this->product->get_slug(),
91
- 'version' => $this->product->get_version(),
92
- 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
93
- ),
94
- )
95
- );
96
- }
97
-
98
- /**
99
- * Dismiss the notification
100
- */
101
- function dismiss() {
102
- check_ajax_referer( (string) __CLASS__, 'nonce' );
103
-
104
- $flag = intval( $_POST['enable'] ) === 1;
105
- update_option( $this->product->logger_option, ( $flag ? 'yes' : 'no' ) );
106
-
107
- if ( true === $flag ) {
108
- $this->enable();
109
- }
110
- }
111
-
112
- /**
113
- * Shows the notification
114
- */
115
- function show_notification() {
116
- $show = $this->product->is_logger_active();
117
- $checked = get_option( $this->product->logger_option, '' );
118
- if ( ! $show && $checked == '' ) {
119
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
120
-
121
- return true;
122
- }
123
-
124
- return false;
125
- }
126
-
127
- /**
128
- * Shows the admin notice
129
- */
130
- function admin_notices() {
131
- $id = $this->product->get_key() . '_logger';
132
-
133
- $this->add_media( $this->product->get_key() );
134
-
135
- echo '<div class="notice notice-success is-dismissible " id="' . $this->product->get_key() . '-logger-notification" ><div id="' . $id . '" class="themeisle-logger-box">' . $this->get_html( $this->product->get_key() ) . '</div></div>';
136
- }
137
-
138
- /**
139
- * Generates the HTML
140
- *
141
- * @param string $key The product key.
142
- */
143
- function get_html( $key ) {
144
- $heading = apply_filters( $this->product->get_key() . '_logger_heading', $this->heading );
145
- $heading = str_replace(
146
- array( '{product}' ), array(
147
- trim( str_replace( 'Lite', '', $this->product->get_name() ) ),
148
- ),
149
- $heading
150
- );
151
- $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', $this->button_submit );
152
- $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', $this->button_cancel );
153
-
154
- return '<div >'
155
- . '<p>' . $heading . '</p>'
156
- . '<div class="actions">'
157
- . get_submit_button(
158
- $button_submit, 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
159
- 'data-ti-log-enable' => 1,
160
- )
161
- )
162
- . get_submit_button(
163
- $button_cancel, 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
164
- 'data-ti-log-enable' => 0,
165
- )
166
- )
167
- . '</div></div>';
168
- }
169
-
170
- /**
171
- * Loads the js
172
- *
173
- * @param string $key The product key.
174
- */
175
- function add_media( $key ) {
176
- ?>
177
- <style type="text/css">
178
- #<?php echo $key; ?>-logger-notification {
179
- padding-bottom: 5px;
180
- }
181
-
182
- #<?php echo $key; ?>-logger-notification .button {
183
- margin-left: 5px;
184
- }
185
- </style>
186
- <script type="text/javascript" id="<?php echo $key; ?>ti-logger-js">
187
- (function ($) {
188
- $(document).ready(function () {
189
- $('.<?php echo $key; ?>-ti-logger').on('click', function (e) {
190
-
191
- $.ajax({
192
- url: ajaxurl,
193
- method: "post",
194
- data: {
195
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
196
- 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>',
197
- 'enable': $(this).attr('data-ti-log-enable')
198
- },
199
- success: function () {
200
- $('#<?php echo $key; ?>-logger-notification').hide();
201
- }
202
- });
203
- });
204
- });
205
- })(jQuery);
206
- </script>
207
- <?php
208
- }
209
-
210
- }
211
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-notification-manager.php DELETED
@@ -1,119 +0,0 @@
1
- <?php
2
- /**
3
- * The notification manager class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Notification
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Notification_Manager' ) ) :
16
- /**
17
- * Notification manager model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Notification_Manager {
20
- /**
21
- * Time between notifications.
22
- */
23
- const NOTIFICATION_INTERVAL_HOURS = 100;
24
- /**
25
- * @var array Notifications for the current product.
26
- */
27
- private $notifications = array();
28
- /**
29
- * @var ThemeIsle_SDK_Product Current product.
30
- */
31
- private $product;
32
- /**
33
- * @var array ThemeIsle_SDK_Feedback Feedbacks available.
34
- */
35
- private $callbacks = array();
36
-
37
- /**
38
- * ThemeIsle_SDK_Notification_Manager constructor.
39
- *
40
- * @param ThemeIsle_SDK_Product $product_object Product Object.
41
- * @param array $callbacks the objects that will be called when a notification is due.
42
- */
43
- public function __construct( $product_object, $callbacks ) {
44
- $this->product = $product_object;
45
- $this->callbacks = $callbacks;
46
- $this->setup_hooks();
47
- }
48
-
49
- /**
50
- * Setup the notifications.
51
- */
52
- function setup_notifications() {
53
- if ( ! current_user_can( 'manage_options' ) ) {
54
- return;
55
- }
56
- // Load the notifications only if we have it installed after the required interval.
57
- if ( ( time() - $this->product->get_install_time() ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
58
- if ( $this->product instanceof ThemeIsle_SDK_Product && $this->callbacks && is_array( $this->callbacks ) ) {
59
- foreach ( $this->callbacks as $instance ) {
60
- $this->notifications[ $this->product->get_key() . get_class( $instance ) ] = $instance;
61
- }
62
- }
63
- }
64
- }
65
-
66
- /**
67
- * Setup the internal hooks
68
- */
69
- private function setup_hooks() {
70
- add_action( 'admin_head', array( $this, 'show_notification' ) );
71
- add_action( 'admin_init', array( $this, 'setup_notifications' ) );
72
- }
73
-
74
- /**
75
- * Shows the notification
76
- */
77
- function show_notification() {
78
-
79
- $hidden = get_option( 'themeisle_sdk_notification_hidden', array() );
80
- $instances = $this->notifications;
81
- if ( empty( $instances ) ) {
82
- return;
83
- }
84
-
85
- // Get timestamp of last notification.
86
- $old = 0;
87
- if ( ! empty( $hidden ) ) {
88
- $old = $hidden[ count( $hidden ) - 1 ]['time'];
89
- }
90
- // Check if the current one is expired.
91
- if ( ( time() - $old ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
92
- // Get hidden notifications key.
93
- $hidden_ones = wp_list_pluck( $hidden, 'key' );
94
- // Get the non-hidden notifications.
95
- $available_notifications = array_diff( array_keys( $instances ), $hidden_ones );
96
- if ( empty( $available_notifications ) ) {
97
- return;
98
- }
99
- // Get the first notification available.
100
- $new_one = reset( $available_notifications );
101
-
102
- $instance = $instances[ $new_one ];
103
- $hidden[] = array(
104
- 'time' => time(),
105
- 'key' => $new_one,
106
- );
107
- update_option( 'themeisle_sdk_notification_hidden', $hidden );
108
- } else {
109
- $key = $hidden[ count( $hidden ) - 1 ]['key'];
110
- if ( ! isset( $this->notifications[ $key ] ) ) {
111
- return;
112
- } else {
113
- $instance = $this->notifications[ $key ];
114
- }
115
- }
116
- $instance->show_notification();
117
- }
118
- }
119
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php DELETED
@@ -1,401 +0,0 @@
1
- <?php
2
- /**
3
- * The product model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Product
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
16
- /**
17
- * Product model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Product {
20
- /**
21
- * @var string $slug THe product slug.
22
- */
23
- private $slug;
24
- /**
25
- * @var string $basefile The file with headers.
26
- */
27
- private $basefile;
28
- /**
29
- * @var string $type The product type ( plugin | theme ).
30
- */
31
- private $type;
32
- /**
33
- * @var string $file The file name.
34
- */
35
- private $file;
36
- /**
37
- * @var string $name The product name.
38
- */
39
- private $name;
40
- /**
41
- * @var string $key The product ready key.
42
- */
43
- private $key;
44
- /**
45
- * @var string $author_url The url of the author.
46
- */
47
- private $author_url;
48
- /**
49
- * @var string $store_url The store url.
50
- */
51
- private $store_url;
52
- /**
53
- * @var int $install The date of install.
54
- */
55
- private $install;
56
- /**
57
- * @var string $store_name The store name.
58
- */
59
- private $store_name;
60
- /**
61
- * @var array $allowed_authors The allowed authors.
62
- */
63
- private $allowed_authors = array( 'proteusthemes.com', 'anarieldesign.com' );
64
- /**
65
- * @var bool $requires_license Either user needs to activate it with license.
66
- */
67
- private $requires_license;
68
- /**
69
- * @var bool $wordpress_available Either is available on WordPress or not.
70
- */
71
- private $wordpress_available;
72
- /**
73
- * @var string $version The product version.
74
- */
75
- private $version;
76
- /**
77
- * @var string $logger_option Logger option key.
78
- */
79
- public $logger_option;
80
- /**
81
- * @var string $pro_slug Pro slug, if available.
82
- */
83
- public $pro_slug;
84
- /**
85
- * @var string $feedback_types All the feedback types the product supports
86
- */
87
- private $feedback_types = array();
88
-
89
- /**
90
- * @var string $widget_types All the widget types the product supports
91
- */
92
- private $widget_types = array( 'dashboard_blog' );
93
-
94
- /**
95
- * ThemeIsle_SDK_Product constructor.
96
- *
97
- * @param string $basefile Product basefile.
98
- */
99
- public function __construct( $basefile ) {
100
- if ( ! empty( $basefile ) ) {
101
- if ( is_readable( $basefile ) ) {
102
- $this->basefile = $basefile;
103
- $this->setup_from_path();
104
- $this->setup_from_fileheaders();
105
- }
106
- }
107
- $install = get_option( $this->get_key() . '_install', 0 );
108
- if ( $install === 0 ) {
109
- $install = time();
110
- update_option( $this->get_key() . '_install', time() );
111
- }
112
- $this->install = $install;
113
-
114
- $this->logger_option = $this->get_key() . '_logger_flag';
115
-
116
- }
117
-
118
- /**
119
- * Setup props from fileheaders.
120
- */
121
- public function setup_from_fileheaders() {
122
- $file_headers = array(
123
- 'Requires License' => 'Requires License',
124
- 'WordPress Available' => 'WordPress Available',
125
- 'Pro Slug' => 'Pro Slug',
126
- 'Version' => 'Version',
127
- );
128
- if ( $this->type == 'plugin' ) {
129
- $file_headers['Name'] = 'Plugin Name';
130
- $file_headers['AuthorName'] = 'Author';
131
- $file_headers['AuthorURI'] = 'Author URI';
132
- }
133
- if ( $this->type == 'theme' ) {
134
- $file_headers['Name'] = 'Theme Name';
135
- $file_headers['AuthorName'] = 'Author';
136
- $file_headers['AuthorURI'] = 'Author URI';
137
- }
138
- $file_headers = get_file_data( $this->basefile, $file_headers );
139
-
140
- $this->name = $file_headers['Name'];
141
- $this->store_name = $file_headers['AuthorName'];
142
- $this->author_url = $file_headers['AuthorURI'];
143
- $this->store_url = $file_headers['AuthorURI'];
144
- if ( $this->is_external_author() ) {
145
- $this->store_url = 'https://themeisle.com';
146
- $this->store_name = 'ThemeIsle';
147
- }
148
- $this->requires_license = ( $file_headers['Requires License'] == 'yes' ) ? true : false;
149
- $this->wordpress_available = ( $file_headers['WordPress Available'] == 'yes' ) ? true : false;
150
- $this->pro_slug = ! empty( $file_headers['Pro Slug'] ) ? $file_headers['Pro Slug'] : '';
151
- $this->version = $file_headers['Version'];
152
- if ( $this->require_uninstall_feedback() ) {
153
- $this->feedback_types[] = 'deactivate';
154
- }
155
- if ( $this->is_wordpress_available() ) {
156
- $this->feedback_types[] = 'review';
157
- }
158
- }
159
-
160
- /**
161
- * Check if the product is by external author or not.
162
- *
163
- * @return bool Either is external author or no.
164
- */
165
- public function is_external_author() {
166
- foreach ( $this->allowed_authors as $author ) {
167
- if ( strpos( $this->author_url, $author ) !== false ) {
168
- return true;
169
- }
170
- }
171
-
172
- return false;
173
- }
174
-
175
- /**
176
- * The magic var_dump info method.
177
- *
178
- * @return array Debug info.
179
- */
180
- public function __debugInfo() {
181
- return array(
182
- 'name' => $this->name,
183
- 'slug' => $this->slug,
184
- 'version' => $this->version,
185
- 'basefile' => $this->basefile,
186
- 'key' => $this->key,
187
- 'type' => $this->type,
188
- 'store_name' => $this->store_name,
189
- 'store_url' => $this->store_url,
190
- 'wordpress_available' => $this->wordpress_available,
191
- 'requires_license' => $this->requires_license,
192
- );
193
-
194
- }
195
-
196
- /**
197
- * Setup props from path.
198
- */
199
- public function setup_from_path() {
200
- $this->file = basename( $this->basefile );
201
- $dir = dirname( $this->basefile );
202
- $this->slug = basename( $dir );
203
- $exts = explode( '.', $this->basefile );
204
- $ext = $exts[ count( $exts ) - 1 ];
205
- if ( $ext == 'css' ) {
206
- $this->type = 'theme';
207
- }
208
- if ( $ext == 'php' ) {
209
- $this->type = 'plugin';
210
- }
211
- $this->key = self::key_ready_name( $this->slug );
212
- }
213
-
214
- /**
215
- * @param string $string the String to be normalized for cron handler.
216
- *
217
- * @return string $name The normalized string.
218
- */
219
- static function key_ready_name( $string ) {
220
- return str_replace( '-', '_', strtolower( trim( $string ) ) );
221
- }
222
-
223
- /**
224
- * Getter for product name.
225
- *
226
- * @return string The product name.
227
- */
228
- public function get_name() {
229
- return $this->name;
230
- }
231
-
232
- /**
233
- * Getter for product version.
234
- *
235
- * @return string The product version.
236
- */
237
- public function get_version() {
238
- return $this->version;
239
- }
240
-
241
- /**
242
- * If product is available on wordpress.org or not.
243
- *
244
- * @return bool Either is wp available or not.
245
- */
246
- public function is_wordpress_available() {
247
- return $this->wordpress_available;
248
- }
249
-
250
- /**
251
- * Return the product key.
252
- *
253
- * @return string The product key.
254
- */
255
- public function get_key() {
256
- return $this->key;
257
- }
258
-
259
- /**
260
- * Either the product requires license or not.
261
- *
262
- * @return bool Either requires license or not.
263
- */
264
- public function requires_license() {
265
- return $this->requires_license;
266
- }
267
-
268
- /**
269
- * Check if the product is either theme or plugin.
270
- *
271
- * @return string Product type.
272
- */
273
- public function get_type() {
274
- return $this->type;
275
- }
276
-
277
- /**
278
- * Returns the Store name.
279
- *
280
- * @return string Store name.
281
- */
282
- public function get_store_name() {
283
- return $this->store_name;
284
- }
285
-
286
- /**
287
- * Returns the store url.
288
- *
289
- * @return string The store url.
290
- */
291
- public function get_store_url() {
292
- return $this->store_url;
293
- }
294
-
295
- /**
296
- * Returns the product slug.
297
- *
298
- * @return string The product slug.
299
- */
300
- public function get_slug() {
301
- return $this->slug;
302
- }
303
-
304
- /**
305
- * Returns product basefile, which holds the metaheaders.
306
- *
307
- * @return string The product basefile.
308
- */
309
- public function get_basefile() {
310
- return $this->basefile;
311
- }
312
-
313
- /**
314
- * Returns product filename.
315
- *
316
- * @return string The product filename.
317
- */
318
- public function get_file() {
319
- return $this->file;
320
- }
321
-
322
- /**
323
- * Returns feedback types
324
- *
325
- * @return array The feedback types.
326
- */
327
- public function get_feedback_types() {
328
- return apply_filters( $this->get_key() . '_feedback_types', $this->feedback_types );
329
- }
330
-
331
- /**
332
- * Returns widget types
333
- *
334
- * @return array The widget types.
335
- */
336
- public function get_widget_types() {
337
- return apply_filters( $this->get_key() . '_widget_types', $this->widget_types );
338
- }
339
-
340
- /**
341
- * We log the user website and product version.
342
- *
343
- * @return bool Either we log the data or not.
344
- */
345
- public function is_logger_active() {
346
- // If is not available on WordPress log this automatically.
347
- if ( ! $this->is_wordpress_available() ) {
348
- return true;
349
- } else {
350
- $pro_slug = $this->get_pro_slug();
351
- if ( ! empty( $pro_slug ) ) {
352
-
353
- $all_products = ThemeIsle_SDK_Loader::get_products();
354
- if ( isset( $all_products[ $pro_slug ] ) ) {
355
- return true;
356
- }
357
- }
358
-
359
- return ( get_option( $this->get_key() . '_logger_flag', 'no' ) === 'yes' );
360
-
361
- }
362
- }
363
-
364
- /**
365
- * Returns the pro slug, if available.
366
- *
367
- * @return string The pro slug.
368
- */
369
- public function get_pro_slug() {
370
- return $this->pro_slug;
371
- }
372
-
373
- /**
374
- * Return the install timestamp.
375
- *
376
- * @return int The install timestamp.
377
- */
378
- public function get_install_time() {
379
- return $this->install;
380
- }
381
-
382
- /**
383
- * We require feedback on uninstall.
384
- *
385
- * @return bool Either we should require feedback on uninstall or not.
386
- */
387
- public function require_uninstall_feedback() {
388
- if ( $this->get_type() == 'theme' && ! $this->is_external_author() ) {
389
- return ! get_transient( 'ti_sdk_pause_' . $this->get_key(), false );
390
- }
391
-
392
- if ( $this->get_type() == 'plugin' ) {
393
-
394
- return true;
395
- }
396
-
397
- return false;
398
- }
399
-
400
- }
401
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php DELETED
@@ -1,374 +0,0 @@
1
- <?php
2
- /**
3
- * The blog dashboard model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widget_Dashboard_Blog' ) ) :
16
- /**
17
- * Blog dashboard widget model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Widget_Dashboard_Blog extends ThemeIsle_SDK_Widget {
20
-
21
- /**
22
- * @var array instance The instances.
23
- */
24
- protected $product;
25
- /**
26
- * @var array Feed items.
27
- */
28
- private $items = array();
29
-
30
- /**
31
- * ThemeIsle_SDK_Widget_Dashboard_Blog constructor.
32
- *
33
- * @param ThemeIsle_SDK_Product $product_object The product object.
34
- */
35
- public function __construct( $product_object ) {
36
- $this->product = $product_object;
37
- parent::__construct( $product_object );
38
- }
39
-
40
- /**
41
- * Registers the hooks
42
- */
43
- public function setup_hooks_child() {
44
- $this->setup_vars();
45
- add_action( 'wp_dashboard_setup', array( &$this, 'add_widget' ) );
46
- add_action( 'wp_network_dashboard_setup', array( &$this, 'add_widget' ) );
47
- add_filter( 'themeisle_sdk_recommend_plugin_or_theme', array( &$this, 'recommend_plugin_or_theme' ) );
48
- }
49
-
50
- /**
51
- * Setup class variables
52
- */
53
- function setup_vars() {
54
- $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
55
- $this->feeds = apply_filters(
56
- 'themeisle_sdk_dashboard_widget_feeds', array(
57
- 'https://themeisle.com/blog/feed',
58
- )
59
- );
60
- }
61
-
62
- /**
63
- * Add widget to the dashboard
64
- *
65
- * @return string|void
66
- */
67
- function add_widget() {
68
- global $wp_meta_boxes;
69
- if ( isset( $wp_meta_boxes['dashboard']['normal']['core']['themeisle'] ) ) {
70
- return;
71
- }
72
- wp_add_dashboard_widget(
73
- 'themeisle', $this->dashboard_name, array(
74
- &$this,
75
- 'render_dashboard_widget',
76
- )
77
- );
78
- }
79
-
80
- /**
81
- * Setup feed items.
82
- */
83
- private function setup_feeds() {
84
- $items_normalized = array();
85
- if ( false === ( $items_normalized = get_transient( 'themeisle_sdk_feed_items' ) ) ) {
86
- // Load SimplePie Instance
87
- $feed = fetch_feed( $this->feeds );
88
- // TODO report error when is an error loading the feed
89
- if ( is_wp_error( $feed ) ) {
90
- return;
91
- }
92
-
93
- $items = $feed->get_items( 0, 5 );
94
- foreach ( (array) $items as $item ) {
95
- $items_normalized[] = array(
96
- 'title' => $item->get_title(),
97
- 'date' => $item->get_date( 'U' ),
98
- 'link' => $item->get_permalink(),
99
- );
100
- }
101
- set_transient( 'themeisle_sdk_feed_items', $items_normalized, 48 * HOUR_IN_SECONDS );
102
- }
103
- $this->items = $items_normalized;
104
- }
105
-
106
- /**
107
- * Render widget content
108
- */
109
- function render_dashboard_widget() {
110
- $this->setup_feeds();
111
- ?>
112
- <style type="text/css">
113
- #themeisle ul {
114
- margin-bottom: 0px;
115
- }
116
-
117
- #themeisle ul li.ti-dw-recommend-item {
118
-
119
- padding-left: 7px;
120
- border-top: 1px solid #eee;
121
-
122
- margin-bottom: 0px;
123
- padding-top: 6px;
124
- }
125
-
126
- #themeisle h2.hndle {
127
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALfSURBVEhL7VW/ayJBFL7/5ZqziBzIcSCHxUE4hAiCgnAQsBASOAikEAIeCAaCiJAyIBICQURYwoJoEUmxa6MWioWxURu30mq77b57s86acX+oOQhp8sFjdmbfzrfve2/efMI74IP0VTB0gz/th/8iNbQxOt0eOmoN6WgAn78cwJeoYcLf78KrSPVneU3isEQZoz0D3pt03jhDrDTERJXxWM3A5yAOIPmgce/t2IvUGFzjkDa+7C5RTx0gWbxG0v8bBXUG3fLReigk4rh55gtbsAfpGDfhVTS+VA19bYbH7BkqU/56AzNU7nrYpbI7qfbEcxfBkSOHJGO27Vk0htqEYoXvARdS+tsEJyAJY1GRkOxnGTdq2zuaRZOkJ1Wi1+h7ODlJB/l1kYRKZVyKhMwoSmUw5M4uWMhIcl9f1l1qB2m/aMkZQIE2d5BeDTGiSD0VfC4jZPmSKiO+LMJGuoRE1bkiOIW00CAdW3NuxzLmxhD1hyHmug7dbBRD9KdLc4dR6Zfgn0ffXN2EjVSMLIcOrWxuwiyyPhYGI7X0m/agqPeIib5+yit/LWILKYuUlrTa5kbMwjko7J0AXc1RLZwifRF58Us1YXMzYSMV5WQ5ZWsG5VnYaG1BxM7zKBRzOAkHac460gxK9sUnVBqbu9rhKCS9lRaq1/poCeUq7tL6uPnjSLeoBRo9/KXjslqP4Na1gbiQssiULK9gP+VVqPnFQMblnwi+WmTfIji5amLES1mn/mz9yCFVuddZdiFlIJlTK+JtH2/AaPMogzipzrZ+4yQ1qCL1JSaNDL6bf81y1aOb5R6Vhow6G1tPNK9Borl0R2NLRiEaxNEF9Wa3yrHBSarTbeHot7ySqVmYR4AucDYuaJyzkfptZ0e/FeGa03m3jOQPizCAo0QG9W2ktL5HgGt45JRgaBh1x9R1WHY0KCTnLZOW5Kw0miuZq01ITGa6Z18Db9I3xAfpm+IdSIF/du91gSA2+I8AAAAASUVORK5CYII=');
128
- background-repeat: no-repeat;
129
- background-position: 90% 50%;
130
- background-size: 29px;
131
- }
132
-
133
- .ti-dw-feed-item {
134
- display: flex;
135
- align-items: center;
136
- }
137
-
138
- .ti-dw-feed-item a {
139
- float: left;
140
- width: 89.9%;
141
- }
142
-
143
- .ti-dw-feed-item .ti-dw-day-container {
144
- width: 100%;
145
- letter-spacing: 3px;
146
- display: block;
147
- }
148
-
149
- .ti-dw-feed-item .ti-dw-month-container {
150
-
151
- width: 100%;
152
- display: block;
153
- font-weight: 600;
154
- padding: 0px;
155
- margin-top: -6px;
156
- text-transform: uppercase;
157
- font-size: 10px;
158
- letter-spacing: 1px;
159
- }
160
-
161
- .ti-dw-feed-item .ti-dw-date-container {
162
- float: left;
163
- min-height: 30px;
164
- margin-right: 0.1%;
165
- width: 10%;
166
- text-align: center;
167
- }
168
-
169
- .ti-dw-recommend-item span {
170
- color: #72777c;
171
- }
172
-
173
- </style>
174
- <ul>
175
- <?php
176
- foreach ( $this->items as $item ) {
177
- ?>
178
- <li class="ti-dw-feed-item"><span class="ti-dw-date-container"><span
179
- class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
180
- class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><a
181
- href="
182
- <?php
183
- echo add_query_arg(
184
- array(
185
- 'utm_campaign' => 'feed',
186
- 'utm_medium' => 'dashboard_widget',
187
- ), $item['link']
188
- );
189
- ?>
190
- " target="_blank"><?php echo $item['title']; ?></a>
191
- <div class="clear"></div>
192
- </li>
193
- <?php
194
- }
195
-
196
- $recommend = apply_filters( 'themeisle_sdk_recommend_plugin_or_theme', array() );
197
- if ( is_array( $recommend ) && ! empty( $recommend ) ) {
198
-
199
- $type = $recommend['type'];
200
- if ( ( $type == 'theme' && current_user_can( 'install_themes' ) ) || ( $type == 'plugin' && current_user_can( 'install_plugins' ) ) ) {
201
- add_thickbox();
202
- $url = add_query_arg(
203
- array(
204
- 'theme' => $recommend['slug'],
205
- ), network_admin_url( 'theme-install.php' )
206
- );
207
-
208
- if ( 'plugin' === $type ) {
209
-
210
- $url = add_query_arg(
211
- array(
212
- 'tab' => 'plugin-information',
213
- 'plugin' => $recommend['slug'],
214
- ), network_admin_url( 'plugin-install.php' )
215
- );
216
- }
217
- ?>
218
- <li class="ti-dw-recommend-item ">
219
- <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
220
- : </span>
221
- <?php
222
- echo trim(
223
- str_replace(
224
- array(
225
- 'lite',
226
- 'Lite',
227
- ), '', $recommend['name']
228
- )
229
- );
230
- ?>
231
- (<a class="thickbox open-plugin-details-modal"
232
- href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
233
- </li>
234
-
235
- <?php
236
- }
237
- }
238
- ?>
239
- </ul>
240
-
241
- <?php
242
-
243
- }
244
-
245
- /**
246
- * Either the current product is installed or not.
247
- *
248
- * @param array $val The current recommended product.
249
- *
250
- * @return bool Either we should exclude the plugin or not.
251
- */
252
- public function remove_current_products( $val ) {
253
- if ( $val['type'] === 'theme' ) {
254
- $exist = wp_get_theme( $val['slug'] );
255
-
256
- return ! $exist->exists();
257
- } else {
258
- $all_plugins = array_keys( get_plugins() );
259
- foreach ( $all_plugins as $slug ) {
260
- if ( strpos( $slug, $val['slug'] ) !== false ) {
261
- return false;
262
- }
263
- }
264
-
265
- return true;
266
- }
267
- }
268
-
269
- /**
270
- * Fetch themes from wporg api.
271
- *
272
- * @param string $author The author name.
273
- *
274
- * @return array The list of themes.
275
- */
276
- function get_themes_from_wporg( $author ) {
277
- $products = wp_remote_get(
278
- 'https://api.wordpress.org/themes/info/1.1/?action=query_themes&request[author]=' . $author . '&request[per_page]=30&request[fields][active_installs]=true'
279
- );
280
- $products = json_decode( wp_remote_retrieve_body( $products ) );
281
- if ( is_object( $products ) ) {
282
- $products = isset( $products->themes ) ? $products->themes : array();
283
- } else {
284
- $products = array();
285
- }
286
-
287
- return $products;
288
- }
289
-
290
- /**
291
- * Fetch plugin from wporg api.
292
- *
293
- * @param string $author The author slug.
294
- *
295
- * @return array The list of plugins for the selected author.
296
- */
297
- function get_plugins_from_wporg( $author ) {
298
- $products = wp_remote_get(
299
- 'https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[author]=' . $author . '&request[author]=codeinwp&request[per_page]=20&request[fields][active_installs]=true'
300
- );
301
- $products = json_decode( wp_remote_retrieve_body( $products ) );
302
- if ( is_object( $products ) ) {
303
- $products = isset( $products->plugins ) ? $products->plugins : array();
304
- } else {
305
- $products = array();
306
- }
307
-
308
- return $products;
309
- }
310
-
311
- /**
312
- * Fetch products from the recomended section.
313
- *
314
- * @return array|mixed The list of products to use in recomended section.
315
- */
316
- function get_product_from_api() {
317
- if ( false === ( $products = get_transient( 'themeisle_sdk_products' ) ) ) {
318
- $products = array();
319
- $themeisle_themes = $this->get_themes_from_wporg( 'themeisle' );
320
- $codeinwp_themes = $this->get_themes_from_wporg( 'codeinwp' );
321
-
322
- $themeisle_plugins = $this->get_plugins_from_wporg( 'themeisle' );
323
- $codeinwp_plugins = $this->get_plugins_from_wporg( 'codeinwp' );
324
-
325
- $all_themes = array_merge( $themeisle_themes, $codeinwp_themes );
326
- foreach ( $all_themes as $theme ) {
327
- if ( $theme->active_installs < 4999 ) {
328
- continue;
329
- }
330
- $products[] = array(
331
- 'name' => $theme->name,
332
- 'type' => 'theme',
333
- 'slug' => $theme->slug,
334
- 'installs' => $theme->active_installs,
335
- );
336
- }
337
- $all_plugins = array_merge( $themeisle_plugins, $codeinwp_plugins );
338
- foreach ( $all_plugins as $plugin ) {
339
- if ( $plugin->active_installs < 5999 ) {
340
- continue;
341
- }
342
- $products[] = array(
343
- 'name' => $plugin->name,
344
- 'type' => 'plugin',
345
- 'slug' => $plugin->slug,
346
- 'installs' => $plugin->active_installs,
347
- );
348
- }
349
- set_transient( 'themeisle_sdk_products', $products, 6 * HOUR_IN_SECONDS );
350
- }
351
-
352
- return $products;
353
- }
354
-
355
- /**
356
- * Contact the API and fetch the recommended plugins/themes
357
- */
358
- function recommend_plugin_or_theme() {
359
- $products = $this->get_product_from_api();
360
- if ( ! is_array( $products ) ) {
361
- $products = array();
362
- }
363
- $products = array_filter( $products, array( $this, 'remove_current_products' ) );
364
- $products = array_merge( $products );
365
- if ( count( $products ) > 1 ) {
366
- shuffle( $products );
367
- $products = array_slice( $products, 0, 1 );
368
- }
369
- $to_recommend = isset( $products[0] ) ? $products[0] : $products;
370
-
371
- return $to_recommend;
372
- }
373
- }
374
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget.php DELETED
@@ -1,50 +0,0 @@
1
- <?php
2
- /**
3
- * The widget model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widget' ) ) :
16
- /**
17
- * Widget model for ThemeIsle SDK.
18
- */
19
- abstract class ThemeIsle_SDK_Widget {
20
- /**
21
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
22
- */
23
- protected $product;
24
-
25
- /**
26
- * ThemeIsle_SDK_Widget constructor.
27
- *
28
- * @param ThemeIsle_SDK_Product $product_object Product Object.
29
- */
30
- public function __construct( $product_object ) {
31
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
32
- $this->product = $product_object;
33
- }
34
- $this->setup_hooks();
35
- }
36
-
37
- /**
38
- * Registers the hooks and then delegates to the child
39
- */
40
- public function setup_hooks() {
41
- $this->setup_hooks_child();
42
- }
43
-
44
- /**
45
- * Abstract function for delegating to the child
46
- */
47
- protected abstract function setup_hooks_child();
48
-
49
- }
50
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widgets-factory.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
- /**
3
- * The widgets factory class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widgets_Factory' ) ) :
16
- /**
17
- * Widgets factory model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Widgets_Factory {
20
-
21
- /**
22
- * ThemeIsle_SDK_Widgets_Factory constructor.
23
- *
24
- * @param ThemeIsle_SDK_Product $product_object Product Object.
25
- * @param array $widgets the widgets.
26
- */
27
- public function __construct( $product_object, $widgets ) {
28
- if ( $product_object instanceof ThemeIsle_SDK_Product && $widgets && is_array( $widgets ) ) {
29
- foreach ( $widgets as $widget ) {
30
- $class = 'ThemeIsle_SDK_Widget_' . str_replace( ' ', '_', ucwords( str_replace( '_', ' ', $widget ) ) );
31
- $instance = new $class( $product_object );
32
- $instance->setup_hooks();
33
- }
34
- }
35
- }
36
- }
37
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/composer.json DELETED
@@ -1,24 +0,0 @@
1
- {
2
- "name": "codeinwp/themeisle-sdk",
3
- "description": "ThemeIsle SDK ",
4
- "keywords": [
5
- "wordpress"
6
- ],
7
- "homepage": "https://github.com/Codeinwp/themeisle-sdk",
8
- "license": "GPL-2.0+",
9
- "authors": [
10
- {
11
- "name": "ThemeIsle team",
12
- "email": "friends@themeisle.com",
13
- "homepage": "https://themeisle.com"
14
- }
15
- ],
16
- "autoload": {
17
- "files": [
18
- "load.php"
19
- ]
20
- },
21
- "support": {
22
- "issues": "https://github.com/Codeinwp/themeisle-sdk/issues"
23
- }
24
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/index.php DELETED
@@ -1,5 +0,0 @@
1
- <?php
2
- /**
3
- * @package ThemeIsleSDK
4
- * Ignore this.
5
- */
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/load.php DELETED
@@ -1,35 +0,0 @@
1
- <?php
2
- /**
3
- * Loader for the ThemeIsleSDK
4
- *
5
- * Logic for loading always the latest SDK from the installed themes/plugins.
6
- *
7
- * @package ThemeIsleSDK
8
- * @copyright Copyright (c) 2017, Marius Cristea
9
- * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
10
- * @since 1.1.0
11
- */
12
-
13
- // Current SDK version and path.
14
- $themeisle_sdk_version = '1.5.6';
15
- $themeisle_sdk_path = dirname( __FILE__ );
16
-
17
- global $themeisle_sdk_max_version;
18
- global $themeisle_sdk_max_path;
19
-
20
- if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_version ) >= 0 ) {
21
- $themeisle_sdk_max_version = $themeisle_sdk_version;
22
- $themeisle_sdk_max_path = $themeisle_sdk_path;
23
- }
24
-
25
- // load the latest sdk version from the active Themeisle products
26
- if ( ! function_exists( 'themeisle_sdk_load_latest' ) ) :
27
- /**
28
- * Always load the latest sdk version.
29
- */
30
- function themeisle_sdk_load_latest() {
31
- global $themeisle_sdk_max_path;
32
- require_once $themeisle_sdk_max_path . '/start.php';
33
- }
34
- endif;
35
- add_action( 'init', 'themeisle_sdk_load_latest' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/start.php DELETED
@@ -1,35 +0,0 @@
1
- <?php
2
- /**
3
- * File responsible for sdk files loading.
4
- *
5
- * @package ThemeIsleSDK
6
- * @copyright Copyright (c) 2017, Marius Cristea
7
- * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
8
- * @since 1.1.0
9
- */
10
- $products = apply_filters( 'themeisle_sdk_products', array() );
11
- $path = dirname( __FILE__ );
12
- $files_to_load = array(
13
- 'class-themeisle-sdk-loader.php',
14
- 'class-themeisle-sdk-product.php',
15
- 'class-themeisle-sdk-logger.php',
16
- 'class-themeisle-sdk-licenser.php',
17
- 'class-themeisle-sdk-feedback-factory.php',
18
- 'class-themeisle-sdk-feedback.php',
19
- 'class-themeisle-sdk-feedback-deactivate.php',
20
- 'class-themeisle-sdk-feedback-review.php',
21
- 'class-themeisle-sdk-notification-manager.php',
22
- 'class-themeisle-sdk-widget.php',
23
- 'class-themeisle-sdk-widget-dashboard-blog.php',
24
- 'class-themeisle-sdk-widgets-factory.php',
25
- );
26
-
27
- foreach ( $files_to_load as $file ) {
28
- $file_path = $path . '/' . $file;
29
- if ( is_readable( $file_path ) ) {
30
- require_once $file_path;
31
- }
32
- }
33
- foreach ( $products as $product ) {
34
- ThemeIsle_SDK_Loader::init_product( $product );
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/ClassLoader.php DELETED
@@ -1,413 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Composer.
5
- *
6
- * (c) Nils Adermann <naderman@naderman.de>
7
- * Jordi Boggiano <j.boggiano@seld.be>
8
- *
9
- * For the full copyright and license information, please view the LICENSE
10
- * file that was distributed with this source code.
11
- */
12
-
13
- namespace Composer\Autoload;
14
-
15
- /**
16
- * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
- *
18
- * $loader = new \Composer\Autoload\ClassLoader();
19
- *
20
- * // register classes with namespaces
21
- * $loader->add('Symfony\Component', __DIR__.'/component');
22
- * $loader->add('Symfony', __DIR__.'/framework');
23
- *
24
- * // activate the autoloader
25
- * $loader->register();
26
- *
27
- * // to enable searching the include path (eg. for PEAR packages)
28
- * $loader->setUseIncludePath(true);
29
- *
30
- * In this example, if you try to use a class in the Symfony\Component
31
- * namespace or one of its children (Symfony\Component\Console for instance),
32
- * the autoloader will first look for the class under the component/
33
- * directory, and it will then fallback to the framework/ directory if not
34
- * found before giving up.
35
- *
36
- * This class is loosely based on the Symfony UniversalClassLoader.
37
- *
38
- * @author Fabien Potencier <fabien@symfony.com>
39
- * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see http://www.php-fig.org/psr/psr-0/
41
- * @see http://www.php-fig.org/psr/psr-4/
42
- */
43
- class ClassLoader
44
- {
45
- // PSR-4
46
- private $prefixLengthsPsr4 = array();
47
- private $prefixDirsPsr4 = array();
48
- private $fallbackDirsPsr4 = array();
49
-
50
- // PSR-0
51
- private $prefixesPsr0 = array();
52
- private $fallbackDirsPsr0 = array();
53
-
54
- private $useIncludePath = false;
55
- private $classMap = array();
56
-
57
- private $classMapAuthoritative = false;
58
-
59
- public function getPrefixes()
60
- {
61
- if (!empty($this->prefixesPsr0)) {
62
- return call_user_func_array('array_merge', $this->prefixesPsr0);
63
- }
64
-
65
- return array();
66
- }
67
-
68
- public function getPrefixesPsr4()
69
- {
70
- return $this->prefixDirsPsr4;
71
- }
72
-
73
- public function getFallbackDirs()
74
- {
75
- return $this->fallbackDirsPsr0;
76
- }
77
-
78
- public function getFallbackDirsPsr4()
79
- {
80
- return $this->fallbackDirsPsr4;
81
- }
82
-
83
- public function getClassMap()
84
- {
85
- return $this->classMap;
86
- }
87
-
88
- /**
89
- * @param array $classMap Class to filename map
90
- */
91
- public function addClassMap(array $classMap)
92
- {
93
- if ($this->classMap) {
94
- $this->classMap = array_merge($this->classMap, $classMap);
95
- } else {
96
- $this->classMap = $classMap;
97
- }
98
- }
99
-
100
- /**
101
- * Registers a set of PSR-0 directories for a given prefix, either
102
- * appending or prepending to the ones previously set for this prefix.
103
- *
104
- * @param string $prefix The prefix
105
- * @param array|string $paths The PSR-0 root directories
106
- * @param bool $prepend Whether to prepend the directories
107
- */
108
- public function add($prefix, $paths, $prepend = false)
109
- {
110
- if (!$prefix) {
111
- if ($prepend) {
112
- $this->fallbackDirsPsr0 = array_merge(
113
- (array) $paths,
114
- $this->fallbackDirsPsr0
115
- );
116
- } else {
117
- $this->fallbackDirsPsr0 = array_merge(
118
- $this->fallbackDirsPsr0,
119
- (array) $paths
120
- );
121
- }
122
-
123
- return;
124
- }
125
-
126
- $first = $prefix[0];
127
- if (!isset($this->prefixesPsr0[$first][$prefix])) {
128
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
129
-
130
- return;
131
- }
132
- if ($prepend) {
133
- $this->prefixesPsr0[$first][$prefix] = array_merge(
134
- (array) $paths,
135
- $this->prefixesPsr0[$first][$prefix]
136
- );
137
- } else {
138
- $this->prefixesPsr0[$first][$prefix] = array_merge(
139
- $this->prefixesPsr0[$first][$prefix],
140
- (array) $paths
141
- );
142
- }
143
- }
144
-
145
- /**
146
- * Registers a set of PSR-4 directories for a given namespace, either
147
- * appending or prepending to the ones previously set for this namespace.
148
- *
149
- * @param string $prefix The prefix/namespace, with trailing '\\'
150
- * @param array|string $paths The PSR-4 base directories
151
- * @param bool $prepend Whether to prepend the directories
152
- *
153
- * @throws \InvalidArgumentException
154
- */
155
- public function addPsr4($prefix, $paths, $prepend = false)
156
- {
157
- if (!$prefix) {
158
- // Register directories for the root namespace.
159
- if ($prepend) {
160
- $this->fallbackDirsPsr4 = array_merge(
161
- (array) $paths,
162
- $this->fallbackDirsPsr4
163
- );
164
- } else {
165
- $this->fallbackDirsPsr4 = array_merge(
166
- $this->fallbackDirsPsr4,
167
- (array) $paths
168
- );
169
- }
170
- } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
171
- // Register directories for a new namespace.
172
- $length = strlen($prefix);
173
- if ('\\' !== $prefix[$length - 1]) {
174
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
175
- }
176
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
177
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
178
- } elseif ($prepend) {
179
- // Prepend directories for an already registered namespace.
180
- $this->prefixDirsPsr4[$prefix] = array_merge(
181
- (array) $paths,
182
- $this->prefixDirsPsr4[$prefix]
183
- );
184
- } else {
185
- // Append directories for an already registered namespace.
186
- $this->prefixDirsPsr4[$prefix] = array_merge(
187
- $this->prefixDirsPsr4[$prefix],
188
- (array) $paths
189
- );
190
- }
191
- }
192
-
193
- /**
194
- * Registers a set of PSR-0 directories for a given prefix,
195
- * replacing any others previously set for this prefix.
196
- *
197
- * @param string $prefix The prefix
198
- * @param array|string $paths The PSR-0 base directories
199
- */
200
- public function set($prefix, $paths)
201
- {
202
- if (!$prefix) {
203
- $this->fallbackDirsPsr0 = (array) $paths;
204
- } else {
205
- $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
206
- }
207
- }
208
-
209
- /**
210
- * Registers a set of PSR-4 directories for a given namespace,
211
- * replacing any others previously set for this namespace.
212
- *
213
- * @param string $prefix The prefix/namespace, with trailing '\\'
214
- * @param array|string $paths The PSR-4 base directories
215
- *
216
- * @throws \InvalidArgumentException
217
- */
218
- public function setPsr4($prefix, $paths)
219
- {
220
- if (!$prefix) {
221
- $this->fallbackDirsPsr4 = (array) $paths;
222
- } else {
223
- $length = strlen($prefix);
224
- if ('\\' !== $prefix[$length - 1]) {
225
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
226
- }
227
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
228
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
229
- }
230
- }
231
-
232
- /**
233
- * Turns on searching the include path for class files.
234
- *
235
- * @param bool $useIncludePath
236
- */
237
- public function setUseIncludePath($useIncludePath)
238
- {
239
- $this->useIncludePath = $useIncludePath;
240
- }
241
-
242
- /**
243
- * Can be used to check if the autoloader uses the include path to check
244
- * for classes.
245
- *
246
- * @return bool
247
- */
248
- public function getUseIncludePath()
249
- {
250
- return $this->useIncludePath;
251
- }
252
-
253
- /**
254
- * Turns off searching the prefix and fallback directories for classes
255
- * that have not been registered with the class map.
256
- *
257
- * @param bool $classMapAuthoritative
258
- */
259
- public function setClassMapAuthoritative($classMapAuthoritative)
260
- {
261
- $this->classMapAuthoritative = $classMapAuthoritative;
262
- }
263
-
264
- /**
265
- * Should class lookup fail if not found in the current class map?
266
- *
267
- * @return bool
268
- */
269
- public function isClassMapAuthoritative()
270
- {
271
- return $this->classMapAuthoritative;
272
- }
273
-
274
- /**
275
- * Registers this instance as an autoloader.
276
- *
277
- * @param bool $prepend Whether to prepend the autoloader or not
278
- */
279
- public function register($prepend = false)
280
- {
281
- spl_autoload_register(array($this, 'loadClass'), true, $prepend);
282
- }
283
-
284
- /**
285
- * Unregisters this instance as an autoloader.
286
- */
287
- public function unregister()
288
- {
289
- spl_autoload_unregister(array($this, 'loadClass'));
290
- }
291
-
292
- /**
293
- * Loads the given class or interface.
294
- *
295
- * @param string $class The name of the class
296
- * @return bool|null True if loaded, null otherwise
297
- */
298
- public function loadClass($class)
299
- {
300
- if ($file = $this->findFile($class)) {
301
- includeFile($file);
302
-
303
- return true;
304
- }
305
- }
306
-
307
- /**
308
- * Finds the path to the file where the class is defined.
309
- *
310
- * @param string $class The name of the class
311
- *
312
- * @return string|false The path if found, false otherwise
313
- */
314
- public function findFile($class)
315
- {
316
- // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
317
- if ('\\' == $class[0]) {
318
- $class = substr($class, 1);
319
- }
320
-
321
- // class map lookup
322
- if (isset($this->classMap[$class])) {
323
- return $this->classMap[$class];
324
- }
325
- if ($this->classMapAuthoritative) {
326
- return false;
327
- }
328
-
329
- $file = $this->findFileWithExtension($class, '.php');
330
-
331
- // Search for Hack files if we are running on HHVM
332
- if ($file === null && defined('HHVM_VERSION')) {
333
- $file = $this->findFileWithExtension($class, '.hh');
334
- }
335
-
336
- if ($file === null) {
337
- // Remember that this class does not exist.
338
- return $this->classMap[$class] = false;
339
- }
340
-
341
- return $file;
342
- }
343
-
344
- private function findFileWithExtension($class, $ext)
345
- {
346
- // PSR-4 lookup
347
- $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
348
-
349
- $first = $class[0];
350
- if (isset($this->prefixLengthsPsr4[$first])) {
351
- foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
352
- if (0 === strpos($class, $prefix)) {
353
- foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
354
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
355
- return $file;
356
- }
357
- }
358
- }
359
- }
360
- }
361
-
362
- // PSR-4 fallback dirs
363
- foreach ($this->fallbackDirsPsr4 as $dir) {
364
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
365
- return $file;
366
- }
367
- }
368
-
369
- // PSR-0 lookup
370
- if (false !== $pos = strrpos($class, '\\')) {
371
- // namespaced class name
372
- $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
373
- . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
374
- } else {
375
- // PEAR-like class name
376
- $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
377
- }
378
-
379
- if (isset($this->prefixesPsr0[$first])) {
380
- foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
381
- if (0 === strpos($class, $prefix)) {
382
- foreach ($dirs as $dir) {
383
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
384
- return $file;
385
- }
386
- }
387
- }
388
- }
389
- }
390
-
391
- // PSR-0 fallback dirs
392
- foreach ($this->fallbackDirsPsr0 as $dir) {
393
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
394
- return $file;
395
- }
396
- }
397
-
398
- // PSR-0 include paths.
399
- if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
400
- return $file;
401
- }
402
- }
403
- }
404
-
405
- /**
406
- * Scope isolated include.
407
- *
408
- * Prevents access to $this/self from included files.
409
- */
410
- function includeFile($file)
411
- {
412
- include $file;
413
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/ClassLoader52.php DELETED
@@ -1,271 +0,0 @@
1
- <?php
2
- /*
3
- * Copyright (c) 2013, Christoph Mewes, http://www.xrstf.de
4
- *
5
- * This file is released under the terms of the MIT license. You can find the
6
- * complete text in the attached LICENSE file or online at:
7
- *
8
- * http://www.opensource.org/licenses/mit-license.php
9
- *
10
- * --------------------------------------------------------------------------
11
- *
12
- * 99% of this is copied as-is from the original Composer source code and is
13
- * released under MIT license as well. Copyright goes to:
14
- *
15
- * - Fabien Potencier <fabien@symfony.com>
16
- * - Jordi Boggiano <j.boggiano@seld.be>
17
- */
18
-
19
- class xrstf_Composer52_ClassLoader {
20
- private $prefixes = array();
21
- private $fallbackDirs = array();
22
- private $useIncludePath = false;
23
- private $classMap = array();
24
- private $classMapAuthoratative = false;
25
- private $allowUnderscore = false;
26
-
27
- /**
28
- * @param boolean $flag true to allow class names with a leading underscore, false to disable
29
- */
30
- public function setAllowUnderscore($flag) {
31
- $this->allowUnderscore = (boolean) $flag;
32
- }
33
-
34
- /**
35
- * @return array
36
- */
37
- public function getPrefixes() {
38
- return $this->prefixes;
39
- }
40
-
41
- /**
42
- * Turns off searching the prefix and fallback directories for classes
43
- * that have not been registered with the class map.
44
- *
45
- * @param bool $classMapAuthoratative
46
- */
47
- public function setClassMapAuthoritative($classMapAuthoratative) {
48
- $this->classMapAuthoratative = $classMapAuthoratative;
49
- }
50
-
51
- /**
52
- * Should class lookup fail if not found in the current class map?
53
- *
54
- * @return bool
55
- */
56
- public function getClassMapAuthoratative() {
57
- return $this->classMapAuthoratative;
58
- }
59
-
60
- /**
61
- * @return array
62
- */
63
- public function getFallbackDirs() {
64
- return $this->fallbackDirs;
65
- }
66
-
67
- /**
68
- * @return array
69
- */
70
- public function getClassMap() {
71
- return $this->classMap;
72
- }
73
-
74
- /**
75
- * @param array $classMap class to filename map
76
- */
77
- public function addClassMap(array $classMap) {
78
- if ($this->classMap) {
79
- $this->classMap = array_merge($this->classMap, $classMap);
80
- }
81
- else {
82
- $this->classMap = $classMap;
83
- }
84
- }
85
-
86
- /**
87
- * Registers a set of classes, merging with any others previously set.
88
- *
89
- * @param string $prefix the classes prefix
90
- * @param array|string $paths the location(s) of the classes
91
- * @param bool $prepend prepend the location(s)
92
- */
93
- public function add($prefix, $paths, $prepend = false) {
94
- if (!$prefix) {
95
- if ($prepend) {
96
- $this->fallbackDirs = array_merge(
97
- (array) $paths,
98
- $this->fallbackDirs
99
- );
100
- }
101
- else {
102
- $this->fallbackDirs = array_merge(
103
- $this->fallbackDirs,
104
- (array) $paths
105
- );
106
- }
107
-
108
- return;
109
- }
110
-
111
- if (!isset($this->prefixes[$prefix])) {
112
- $this->prefixes[$prefix] = (array) $paths;
113
- return;
114
- }
115
-
116
- if ($prepend) {
117
- $this->prefixes[$prefix] = array_merge(
118
- (array) $paths,
119
- $this->prefixes[$prefix]
120
- );
121
- }
122
- else {
123
- $this->prefixes[$prefix] = array_merge(
124
- $this->prefixes[$prefix],
125
- (array) $paths
126
- );
127
- }
128
- }
129
-
130
- /**
131
- * Registers a set of classes, replacing any others previously set.
132
- *
133
- * @param string $prefix the classes prefix
134
- * @param array|string $paths the location(s) of the classes
135
- */
136
- public function set($prefix, $paths) {
137
- if (!$prefix) {
138
- $this->fallbackDirs = (array) $paths;
139
- return;
140
- }
141
-
142
- $this->prefixes[$prefix] = (array) $paths;
143
- }
144
-
145
- /**
146
- * Turns on searching the include path for class files.
147
- *
148
- * @param bool $useIncludePath
149
- */
150
- public function setUseIncludePath($useIncludePath) {
151
- $this->useIncludePath = $useIncludePath;
152
- }
153
-
154
- /**
155
- * Can be used to check if the autoloader uses the include path to check
156
- * for classes.
157
- *
158
- * @return bool
159
- */
160
- public function getUseIncludePath() {
161
- return $this->useIncludePath;
162
- }
163
-
164
- /**
165
- * Registers this instance as an autoloader.
166
- */
167
- public function register() {
168
- spl_autoload_register(array($this, 'loadClass'), true);
169
- }
170
-
171
- /**
172
- * Unregisters this instance as an autoloader.
173
- */
174
- public function unregister() {
175
- spl_autoload_unregister(array($this, 'loadClass'));
176
- }
177
-
178
- /**
179
- * Loads the given class or interface.
180
- *
181
- * @param string $class the name of the class
182
- * @return bool|null true, if loaded
183
- */
184
- public function loadClass($class) {
185
- if ($file = $this->findFile($class)) {
186
- include $file;
187
- return true;
188
- }
189
- }
190
-
191
- /**
192
- * Finds the path to the file where the class is defined.
193
- *
194
- * @param string $class the name of the class
195
- * @return string|null the path, if found
196
- */
197
- public function findFile($class) {
198
- if ('\\' === $class[0]) {
199
- $class = substr($class, 1);
200
- }
201
-
202
- if (isset($this->classMap[$class])) {
203
- return $this->classMap[$class];
204
- }
205
- elseif ($this->classMapAuthoratative) {
206
- return false;
207
- }
208
-
209
- $classPath = $this->getClassPath($class);
210
-
211
- foreach ($this->prefixes as $prefix => $dirs) {
212
- if (0 === strpos($class, $prefix)) {
213
- foreach ($dirs as $dir) {
214
- if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
215
- return $dir.DIRECTORY_SEPARATOR.$classPath;
216
- }
217
- }
218
- }
219
- }
220
-
221
- foreach ($this->fallbackDirs as $dir) {
222
- if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
223
- return $dir.DIRECTORY_SEPARATOR.$classPath;
224
- }
225
- }
226
-
227
- if ($this->useIncludePath && $file = self::resolveIncludePath($classPath)) {
228
- return $file;
229
- }
230
-
231
- return $this->classMap[$class] = false;
232
- }
233
-
234
- private function getClassPath($class) {
235
- if (false !== $pos = strrpos($class, '\\')) {
236
- // namespaced class name
237
- $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)).DIRECTORY_SEPARATOR;
238
- $className = substr($class, $pos + 1);
239
- }
240
- else {
241
- // PEAR-like class name
242
- $classPath = null;
243
- $className = $class;
244
- }
245
-
246
- $className = str_replace('_', DIRECTORY_SEPARATOR, $className);
247
-
248
- // restore the prefix
249
- if ($this->allowUnderscore && DIRECTORY_SEPARATOR === $className[0]) {
250
- $className[0] = '_';
251
- }
252
-
253
- $classPath .= $className.'.php';
254
-
255
- return $classPath;
256
- }
257
-
258
- public static function resolveIncludePath($classPath) {
259
- $paths = explode(PATH_SEPARATOR, get_include_path());
260
-
261
- foreach ($paths as $path) {
262
- $path = rtrim($path, '/\\');
263
-
264
- if ($file = file_exists($path.DIRECTORY_SEPARATOR.$file)) {
265
- return $file;
266
- }
267
- }
268
-
269
- return false;
270
- }
271
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/LICENSE DELETED
@@ -1,21 +0,0 @@
1
-
2
- Copyright (c) 2016 Nils Adermann, Jordi Boggiano
3
-
4
- Permission is hereby granted, free of charge, to any person obtaining a copy
5
- of this software and associated documentation files (the "Software"), to deal
6
- in the Software without restriction, including without limitation the rights
7
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- copies of the Software, and to permit persons to whom the Software is furnished
9
- to do so, subject to the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be included in all
12
- copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
- THE SOFTWARE.
21
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_classmap.php DELETED
@@ -1,9 +0,0 @@
1
- <?php
2
-
3
- // autoload_classmap.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- );
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_files.php DELETED
@@ -1,10 +0,0 @@
1
- <?php
2
-
3
- // autoload_files.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- '957c51f8f334b5ea3be310bfb8b3492c' => $vendorDir . '/codeinwp/themeisle-sdk/load.php',
10
- );
 
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_namespaces.php DELETED
@@ -1,10 +0,0 @@
1
- <?php
2
-
3
- // autoload_namespaces.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- 'xrstf\\Composer52' => array($vendorDir . '/xrstf/composer-php52/lib'),
10
- );
 
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_psr4.php DELETED
@@ -1,9 +0,0 @@
1
- <?php
2
-
3
- // autoload_psr4.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- );
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_real.php DELETED
@@ -1,59 +0,0 @@
1
- <?php
2
-
3
- // autoload_real.php @generated by Composer
4
-
5
- class ComposerAutoloaderInite35a1e393f73b97115ea07be77a961ef
6
- {
7
- private static $loader;
8
-
9
- public static function loadClassLoader($class)
10
- {
11
- if ('Composer\Autoload\ClassLoader' === $class) {
12
- require __DIR__ . '/ClassLoader.php';
13
- }
14
- }
15
-
16
- public static function getLoader()
17
- {
18
- if (null !== self::$loader) {
19
- return self::$loader;
20
- }
21
-
22
- spl_autoload_register(array('ComposerAutoloaderInite35a1e393f73b97115ea07be77a961ef', 'loadClassLoader'), true, true);
23
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInite35a1e393f73b97115ea07be77a961ef', 'loadClassLoader'));
25
-
26
- $map = require __DIR__ . '/autoload_namespaces.php';
27
- foreach ($map as $namespace => $path) {
28
- $loader->set($namespace, $path);
29
- }
30
-
31
- $map = require __DIR__ . '/autoload_psr4.php';
32
- foreach ($map as $namespace => $path) {
33
- $loader->setPsr4($namespace, $path);
34
- }
35
-
36
- $classMap = require __DIR__ . '/autoload_classmap.php';
37
- if ($classMap) {
38
- $loader->addClassMap($classMap);
39
- }
40
-
41
- $loader->register(true);
42
-
43
- $includeFiles = require __DIR__ . '/autoload_files.php';
44
- foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequiree35a1e393f73b97115ea07be77a961ef($fileIdentifier, $file);
46
- }
47
-
48
- return $loader;
49
- }
50
- }
51
-
52
- function composerRequiree35a1e393f73b97115ea07be77a961ef($fileIdentifier, $file)
53
- {
54
- if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
- require $file;
56
-
57
- $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
58
- }
59
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/autoload_real_52.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
-
3
- // autoload_real_52.php generated by xrstf/composer-php52
4
-
5
- class ComposerAutoloaderInitdce8f282021a503be44335db805675ee {
6
- private static $loader;
7
-
8
- public static function loadClassLoader($class) {
9
- if ('xrstf_Composer52_ClassLoader' === $class) {
10
- require dirname(__FILE__).'/ClassLoader52.php';
11
- }
12
- }
13
-
14
- /**
15
- * @return xrstf_Composer52_ClassLoader
16
- */
17
- public static function getLoader() {
18
- if (null !== self::$loader) {
19
- return self::$loader;
20
- }
21
-
22
- spl_autoload_register(array('ComposerAutoloaderInitdce8f282021a503be44335db805675ee', 'loadClassLoader'), true /*, true */);
23
- self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitdce8f282021a503be44335db805675ee', 'loadClassLoader'));
25
-
26
- $vendorDir = dirname(dirname(__FILE__));
27
- $baseDir = dirname($vendorDir);
28
- $dir = dirname(__FILE__);
29
-
30
- $map = require $dir.'/autoload_namespaces.php';
31
- foreach ($map as $namespace => $path) {
32
- $loader->add($namespace, $path);
33
- }
34
-
35
- $classMap = require $dir.'/autoload_classmap.php';
36
- if ($classMap) {
37
- $loader->addClassMap($classMap);
38
- }
39
-
40
- $loader->register(true);
41
-
42
- require $vendorDir . '/codeinwp/themeisle-sdk/load.php';
43
-
44
- return $loader;
45
- }
46
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/installed.json DELETED
@@ -1,77 +0,0 @@
1
- [
2
- {
3
- "name": "xrstf/composer-php52",
4
- "version": "v1.0.20",
5
- "version_normalized": "1.0.20.0",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/composer-php52/composer-php52.git",
9
- "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/composer-php52/composer-php52/zipball/bd41459d5e27df8d33057842b32377c39e97a5a8",
14
- "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8",
15
- "shasum": ""
16
- },
17
- "time": "2016-04-16 21:52:24",
18
- "type": "library",
19
- "extra": {
20
- "branch-alias": {
21
- "dev-default": "1.x-dev"
22
- }
23
- },
24
- "installation-source": "dist",
25
- "autoload": {
26
- "psr-0": {
27
- "xrstf\\Composer52": "lib/"
28
- }
29
- },
30
- "notification-url": "https://packagist.org/downloads/",
31
- "license": [
32
- "MIT"
33
- ]
34
- },
35
- {
36
- "name": "codeinwp/themeisle-sdk",
37
- "version": "dev-master",
38
- "version_normalized": "9999999-dev",
39
- "source": {
40
- "type": "git",
41
- "url": "git@github.com:Codeinwp/themeisle-sdk.git",
42
- "reference": "1fb829fd268e739864b6f1822239c1112d80853f"
43
- },
44
- "dist": {
45
- "type": "zip",
46
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/1fb829fd268e739864b6f1822239c1112d80853f",
47
- "reference": "1fb829fd268e739864b6f1822239c1112d80853f",
48
- "shasum": ""
49
- },
50
- "time": "2017-08-22 16:09:34",
51
- "type": "library",
52
- "installation-source": "dist",
53
- "autoload": {
54
- "files": [
55
- "load.php"
56
- ]
57
- },
58
- "license": [
59
- "GPL-2.0+"
60
- ],
61
- "authors": [
62
- {
63
- "name": "ThemeIsle team",
64
- "email": "friends@themeisle.com",
65
- "homepage": "https://themeisle.com"
66
- }
67
- ],
68
- "description": "ThemeIsle SDK ",
69
- "homepage": "https://github.com/Codeinwp/themeisle-sdk",
70
- "keywords": [
71
- "wordpress"
72
- ],
73
- "support": {
74
- "issues": "https://github.com/Codeinwp/themeisle-sdk/issues"
75
- }
76
- }
77
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/LICENSE DELETED
@@ -1,19 +0,0 @@
1
- Copyright (c) 2013 Christoph Mewes
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is furnished
8
- to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- THE SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/README.md DELETED
@@ -1,37 +0,0 @@
1
- PHP 5.2 Autoloading for Composer
2
- ================================
3
-
4
- This package provides an easy way to get a PHP 5.2 compatible autoloader out of Composer. The generated autoloader is fully compatible to the original and is written into separate files, each ending with `_52.php`.
5
-
6
- Legacy
7
- ------
8
-
9
- Please do not use this, if you can avoid it. It's a horrible hack, often breaks and is extremely tied to Composer's interna. This package was originally developed in 2012, when PHP 5.2 was much more common on cheap webhosts.
10
-
11
- In 2016, this package has been moved from Bitbucket to a Github organization, because the original developer could no longer reliably maintain it. This is the reason for this legacy package name ``xrstf/...``.
12
-
13
- Usage
14
- -----
15
-
16
- In your project's `composer.json`, add the following lines:
17
-
18
- ```json
19
- {
20
- "require": {
21
- "xrstf/composer-php52": "1.*"
22
- },
23
- "scripts": {
24
- "post-install-cmd": [
25
- "xrstf\\Composer52\\Generator::onPostInstallCmd"
26
- ],
27
- "post-update-cmd": [
28
- "xrstf\\Composer52\\Generator::onPostInstallCmd"
29
- ],
30
- "post-autoload-dump": [
31
- "xrstf\\Composer52\\Generator::onPostInstallCmd"
32
- ]
33
- }
34
- }
35
- ```
36
-
37
- After the next update/install, you will have a `vendor/autoload_52.php` file, that you can simply include and use in PHP 5.2 projects.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/composer.json DELETED
@@ -1,26 +0,0 @@
1
- {
2
- "name": "xrstf/composer-php52",
3
- "license": "MIT",
4
- "support": {
5
- "source": "https://github.com/composer-php52/composer-php52",
6
- "issues": "https://github.com/composer-php52/composer-php52/issues"
7
- },
8
- "autoload": {
9
- "psr-0": {
10
- "xrstf\\Composer52": "lib/"
11
- }
12
- },
13
- "scripts": {
14
- "post-install-cmd": [
15
- "xrstf\\Composer52\\Generator::onPostInstallCmd"
16
- ],
17
- "post-update-cmd": [
18
- "xrstf\\Composer52\\Generator::onPostInstallCmd"
19
- ]
20
- },
21
- "extra": {
22
- "branch-alias": {
23
- "dev-default": "1.x-dev"
24
- }
25
- }
26
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php DELETED
@@ -1,346 +0,0 @@
1
- <?php
2
- /*
3
- * Copyright (c) 2013, Christoph Mewes, http://www.xrstf.de
4
- *
5
- * This file is released under the terms of the MIT license. You can find the
6
- * complete text in the attached LICENSE file or online at:
7
- *
8
- * http://www.opensource.org/licenses/mit-license.php
9
- *
10
- * --------------------------------------------------------------------------
11
- *
12
- * 99% of this is copied as-is from the original Composer source code and is
13
- * released under MIT license as well. Copyright goes to:
14
- *
15
- * - Igor Wiedler <igor@wiedler.ch>
16
- * - Jordi Boggiano <j.boggiano@seld.be>
17
- */
18
-
19
- namespace xrstf\Composer52;
20
-
21
- use Composer\Autoload\AutoloadGenerator as BaseGenerator;
22
- use Composer\Autoload\ClassMapGenerator;
23
- use Composer\Config;
24
- use Composer\Installer\InstallationManager;
25
- use Composer\Package\AliasPackage;
26
- use Composer\Package\PackageInterface;
27
- use Composer\Repository\InstalledRepositoryInterface;
28
- use Composer\Util\Filesystem;
29
-
30
- class AutoloadGenerator extends BaseGenerator {
31
-
32
- /**
33
- * @var bool
34
- */
35
- private $classMapAuthoritative = false;
36
-
37
- public function __construct() {
38
- // do nothing (but keep this constructor so we can build an instance without the need for an event dispatcher)
39
- }
40
-
41
- /**
42
- * Whether or not generated autoloader considers the class map
43
- * authoritative.
44
- *
45
- * @param bool $classMapAuthoritative
46
- */
47
- public function setClassMapAuthoritative($classMapAuthoritative)
48
- {
49
- $this->classMapAuthoritative = (boolean) $classMapAuthoritative;
50
- }
51
-
52
- public function dump(Config $config, InstalledRepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir, $scanPsr0Packages = false, $suffix = '') {
53
- if ($this->classMapAuthoritative) {
54
- // Force scanPsr0Packages when classmap is authoritative
55
- $scanPsr0Packages = true;
56
- }
57
-
58
- $filesystem = new Filesystem();
59
- $filesystem->ensureDirectoryExists($config->get('vendor-dir'));
60
-
61
- $cwd = getcwd();
62
- $basePath = $filesystem->normalizePath($cwd);
63
- $vendorPath = $filesystem->normalizePath(realpath($config->get('vendor-dir')));
64
- $targetDir = $vendorPath.'/'.$targetDir;
65
- $filesystem->ensureDirectoryExists($targetDir);
66
-
67
- $useGlobalIncludePath = (bool) $config->get('use-include-path');
68
- $prependAutoloader = $config->get('prepend-autoloader') === false ? 'false' : 'true';
69
- $classMapAuthoritative = $config->get('classmap-authoritative');
70
-
71
- $vendorPathCode = $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true);
72
- $vendorPathToTargetDirCode = $filesystem->findShortestPathCode($vendorPath, realpath($targetDir), true);
73
-
74
- $appBaseDirCode = $filesystem->findShortestPathCode($vendorPath, $basePath, true);
75
- $appBaseDirCode = str_replace('__DIR__', '$vendorDir', $appBaseDirCode);
76
-
77
- // add 5.2 compat
78
- $vendorPathCode = str_replace('__DIR__', 'dirname(__FILE__)', $vendorPathCode);
79
- $vendorPathToTargetDirCode = str_replace('__DIR__', 'dirname(__FILE__)', $vendorPathToTargetDirCode);
80
-
81
- $packageMap = $this->buildPackageMap($installationManager, $mainPackage, $localRepo->getCanonicalPackages());
82
- $autoloads = $this->parseAutoloads($packageMap, $mainPackage);
83
-
84
- // add custom psr-0 autoloading if the root package has a target dir
85
- $targetDirLoader = null;
86
- $mainAutoload = $mainPackage->getAutoload();
87
- if ($mainPackage->getTargetDir() && !empty($mainAutoload['psr-0'])) {
88
- $levels = count(explode('/', $filesystem->normalizePath($mainPackage->getTargetDir())));
89
- $prefixes = implode(', ', array_map(function ($prefix) {
90
- return var_export($prefix, true);
91
- }, array_keys($mainAutoload['psr-0'])));
92
-
93
- $baseDirFromTargetDirCode = $filesystem->findShortestPathCode($targetDir, $basePath, true);
94
-
95
- $targetDirLoader = <<<EOF
96
-
97
- public static function autoload(\$class) {
98
- \$dir = $baseDirFromTargetDirCode.'/';
99
- \$prefixes = array($prefixes);
100
-
101
- foreach (\$prefixes as \$prefix) {
102
- if (0 !== strpos(\$class, \$prefix)) {
103
- continue;
104
- }
105
-
106
- \$path = explode(DIRECTORY_SEPARATOR, self::getClassPath(\$class));
107
- \$path = \$dir.implode('/', array_slice(\$path, $levels));
108
-
109
- if (!\$path = self::resolveIncludePath(\$path)) {
110
- return false;
111
- }
112
-
113
- require \$path;
114
- return true;
115
- }
116
- }
117
-
118
- EOF;
119
- }
120
-
121
- $filesCode = "";
122
- $autoloads['files'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['files']));
123
- foreach ($autoloads['files'] as $functionFile) {
124
- // don't include file if it is using PHP 5.3+ syntax
125
- // https://bitbucket.org/xrstf/composer-php52/issue/4
126
- if ($this->isPHP53($functionFile)) {
127
- $filesCode .= '// require '.$this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile)."; // disabled because of PHP 5.3 syntax\n";
128
- }
129
- else {
130
- $filesCode .= ' require '.$this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile).";\n";
131
- }
132
- }
133
-
134
- if (!$suffix) {
135
- $suffix = md5(uniqid('', true));
136
- }
137
-
138
- $includePathFile = $this->getIncludePathsFile($packageMap, $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode);
139
-
140
- file_put_contents($vendorPath.'/autoload_52.php', $this->getAutoloadFile($vendorPathToTargetDirCode, $suffix));
141
- file_put_contents($targetDir.'/autoload_real_52.php', $this->getAutoloadRealFile(true, (bool) $includePathFile, $targetDirLoader, $filesCode, $vendorPathCode, $appBaseDirCode, $suffix, $useGlobalIncludePath, $prependAutoloader));
142
-
143
- // use stream_copy_to_stream instead of copy
144
- // to work around https://bugs.php.net/bug.php?id=64634
145
- $sourceLoader = fopen(__DIR__.'/ClassLoader.php', 'r');
146
- $targetLoader = fopen($targetDir.'/ClassLoader52.php', 'w+');
147
- stream_copy_to_stream($sourceLoader, $targetLoader);
148
- fclose($sourceLoader);
149
- fclose($targetLoader);
150
- unset($sourceLoader, $targetLoader);
151
- }
152
-
153
- protected function isPHP53($file) {
154
- $tokens = token_get_all(file_get_contents($file));
155
- $php53 = array(T_DIR, T_GOTO, T_NAMESPACE, T_NS_C, T_NS_SEPARATOR, T_USE);
156
-
157
- // PHP 5.4+
158
- if (defined('T_TRAIT')) {
159
- $php53[] = T_TRAIT;
160
- $php53[] = T_TRAIT_C;
161
- $php53[] = T_TRAIT_C;
162
- }
163
-
164
- // PHP 5.5+
165
- if (defined('T_FINALLY')) {
166
- $php53[] = T_FINALLY;
167
- $php53[] = T_YIELD;
168
- }
169
-
170
- foreach ($tokens as $token) {
171
- if (is_array($token) && in_array($token[0], $php53)) {
172
- return true;
173
- }
174
- }
175
-
176
- return false;
177
- }
178
-
179
- protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode) {
180
- $includePaths = array();
181
-
182
- foreach ($packageMap as $item) {
183
- list($package, $installPath) = $item;
184
-
185
- if (null !== $package->getTargetDir() && strlen($package->getTargetDir()) > 0) {
186
- $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir()));
187
- }
188
-
189
- foreach ($package->getIncludePaths() as $includePath) {
190
- $includePath = trim($includePath, '/');
191
- $includePaths[] = empty($installPath) ? $includePath : $installPath.'/'.$includePath;
192
- }
193
- }
194
-
195
- if (!$includePaths) {
196
- return;
197
- }
198
-
199
- $includePathsFile = <<<EOF
200
- <?php
201
-
202
- // include_paths_52.php generated by xrstf/composer-php52
203
-
204
- \$vendorDir = $vendorPathCode;
205
- \$baseDir = $appBaseDirCode;
206
-
207
- return array(
208
-
209
- EOF;
210
-
211
- foreach ($includePaths as $path) {
212
- $includePathsFile .= "\t" . $this->getPathCode($filesystem, $basePath, $vendorPath, $path) . ",\n";
213
- }
214
-
215
- return $includePathsFile . ");\n";
216
- }
217
-
218
- protected function getAutoloadFile($vendorPathToTargetDirCode, $suffix) {
219
- return <<<AUTOLOAD
220
- <?php
221
-
222
- // autoload_52.php generated by xrstf/composer-php52
223
-
224
- require_once $vendorPathToTargetDirCode.'/autoload_real_52.php';
225
-
226
- return ComposerAutoloaderInit$suffix::getLoader();
227
-
228
- AUTOLOAD;
229
- }
230
-
231
- protected function getAutoloadRealFile($useClassMap, $useIncludePath, $targetDirLoader, $filesCode, $vendorPathCode, $appBaseDirCode, $suffix, $useGlobalIncludePath, $prependAutoloader, $staticPhpVersion = 70000) {
232
- // TODO the class ComposerAutoloaderInit should be revert to a closure
233
- // when APC has been fixed:
234
- // - https://github.com/composer/composer/issues/959
235
- // - https://bugs.php.net/bug.php?id=52144
236
- // - https://bugs.php.net/bug.php?id=61576
237
- // - https://bugs.php.net/bug.php?id=59298
238
-
239
- if ($filesCode) {
240
- $filesCode = "\n\n".rtrim($filesCode);
241
- }
242
-
243
- $file = <<<HEADER
244
- <?php
245
-
246
- // autoload_real_52.php generated by xrstf/composer-php52
247
-
248
- class ComposerAutoloaderInit$suffix {
249
- private static \$loader;
250
-
251
- public static function loadClassLoader(\$class) {
252
- if ('xrstf_Composer52_ClassLoader' === \$class) {
253
- require dirname(__FILE__).'/ClassLoader52.php';
254
- }
255
- }
256
-
257
- /**
258
- * @return xrstf_Composer52_ClassLoader
259
- */
260
- public static function getLoader() {
261
- if (null !== self::\$loader) {
262
- return self::\$loader;
263
- }
264
-
265
- spl_autoload_register(array('ComposerAutoloaderInit$suffix', 'loadClassLoader'), true /*, true */);
266
- self::\$loader = \$loader = new xrstf_Composer52_ClassLoader();
267
- spl_autoload_unregister(array('ComposerAutoloaderInit$suffix', 'loadClassLoader'));
268
-
269
- \$vendorDir = $vendorPathCode;
270
- \$baseDir = $appBaseDirCode;
271
- \$dir = dirname(__FILE__);
272
-
273
-
274
- HEADER;
275
-
276
- if ($useIncludePath) {
277
- $file .= <<<'INCLUDE_PATH'
278
- $includePaths = require $dir.'/include_paths.php';
279
- array_push($includePaths, get_include_path());
280
- set_include_path(implode(PATH_SEPARATOR, $includePaths));
281
-
282
-
283
- INCLUDE_PATH;
284
- }
285
-
286
- $file .= <<<'PSR0'
287
- $map = require $dir.'/autoload_namespaces.php';
288
- foreach ($map as $namespace => $path) {
289
- $loader->add($namespace, $path);
290
- }
291
-
292
-
293
- PSR0;
294
-
295
- if ($useClassMap) {
296
- $file .= <<<'CLASSMAP'
297
- $classMap = require $dir.'/autoload_classmap.php';
298
- if ($classMap) {
299
- $loader->addClassMap($classMap);
300
- }
301
-
302
-
303
- CLASSMAP;
304
- }
305
-
306
- if ($this->classMapAuthoritative) {
307
- $file .= <<<'CLASSMAPAUTHORITATIVE'
308
- $loader->setClassMapAuthoritative(true);
309
-
310
- CLASSMAPAUTHORITATIVE;
311
- }
312
-
313
- if ($useGlobalIncludePath) {
314
- $file .= <<<'INCLUDEPATH'
315
- $loader->setUseIncludePath(true);
316
-
317
-
318
- INCLUDEPATH;
319
- }
320
-
321
- if ($targetDirLoader) {
322
- $file .= <<<REGISTER_AUTOLOAD
323
- spl_autoload_register(array('ComposerAutoloaderInit$suffix', 'autoload'), true);
324
-
325
-
326
- REGISTER_AUTOLOAD;
327
-
328
- }
329
-
330
- $file .= <<<METHOD_FOOTER
331
- \$loader->register($prependAutoloader);{$filesCode}
332
-
333
- return \$loader;
334
- }
335
-
336
- METHOD_FOOTER;
337
-
338
- $file .= $targetDirLoader;
339
-
340
- return $file . <<<FOOTER
341
- }
342
-
343
- FOOTER;
344
-
345
- }
346
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/lib/xrstf/Composer52/ClassLoader.php DELETED
@@ -1,271 +0,0 @@
1
- <?php
2
- /*
3
- * Copyright (c) 2013, Christoph Mewes, http://www.xrstf.de
4
- *
5
- * This file is released under the terms of the MIT license. You can find the
6
- * complete text in the attached LICENSE file or online at:
7
- *
8
- * http://www.opensource.org/licenses/mit-license.php
9
- *
10
- * --------------------------------------------------------------------------
11
- *
12
- * 99% of this is copied as-is from the original Composer source code and is
13
- * released under MIT license as well. Copyright goes to:
14
- *
15
- * - Fabien Potencier <fabien@symfony.com>
16
- * - Jordi Boggiano <j.boggiano@seld.be>
17
- */
18
-
19
- class xrstf_Composer52_ClassLoader {
20
- private $prefixes = array();
21
- private $fallbackDirs = array();
22
- private $useIncludePath = false;
23
- private $classMap = array();
24
- private $classMapAuthoratative = false;
25
- private $allowUnderscore = false;
26
-
27
- /**
28
- * @param boolean $flag true to allow class names with a leading underscore, false to disable
29
- */
30
- public function setAllowUnderscore($flag) {
31
- $this->allowUnderscore = (boolean) $flag;
32
- }
33
-
34
- /**
35
- * @return array
36
- */
37
- public function getPrefixes() {
38
- return $this->prefixes;
39
- }
40
-
41
- /**
42
- * Turns off searching the prefix and fallback directories for classes
43
- * that have not been registered with the class map.
44
- *
45
- * @param bool $classMapAuthoratative
46
- */
47
- public function setClassMapAuthoritative($classMapAuthoratative) {
48
- $this->classMapAuthoratative = $classMapAuthoratative;
49
- }
50
-
51
- /**
52
- * Should class lookup fail if not found in the current class map?
53
- *
54
- * @return bool
55
- */
56
- public function getClassMapAuthoratative() {
57
- return $this->classMapAuthoratative;
58
- }
59
-
60
- /**
61
- * @return array
62
- */
63
- public function getFallbackDirs() {
64
- return $this->fallbackDirs;
65
- }
66
-
67
- /**
68
- * @return array
69
- */
70
- public function getClassMap() {
71
- return $this->classMap;
72
- }
73
-
74
- /**
75
- * @param array $classMap class to filename map
76
- */
77
- public function addClassMap(array $classMap) {
78
- if ($this->classMap) {
79
- $this->classMap = array_merge($this->classMap, $classMap);
80
- }
81
- else {
82
- $this->classMap = $classMap;
83
- }
84
- }
85
-
86
- /**
87
- * Registers a set of classes, merging with any others previously set.
88
- *
89
- * @param string $prefix the classes prefix
90
- * @param array|string $paths the location(s) of the classes
91
- * @param bool $prepend prepend the location(s)
92
- */
93
- public function add($prefix, $paths, $prepend = false) {
94
- if (!$prefix) {
95
- if ($prepend) {
96
- $this->fallbackDirs = array_merge(
97
- (array) $paths,
98
- $this->fallbackDirs
99
- );
100
- }
101
- else {
102
- $this->fallbackDirs = array_merge(
103
- $this->fallbackDirs,
104
- (array) $paths
105
- );
106
- }
107
-
108
- return;
109
- }
110
-
111
- if (!isset($this->prefixes[$prefix])) {
112
- $this->prefixes[$prefix] = (array) $paths;
113
- return;
114
- }
115
-
116
- if ($prepend) {
117
- $this->prefixes[$prefix] = array_merge(
118
- (array) $paths,
119
- $this->prefixes[$prefix]
120
- );
121
- }
122
- else {
123
- $this->prefixes[$prefix] = array_merge(
124
- $this->prefixes[$prefix],
125
- (array) $paths
126
- );
127
- }
128
- }
129
-
130
- /**
131
- * Registers a set of classes, replacing any others previously set.
132
- *
133
- * @param string $prefix the classes prefix
134
- * @param array|string $paths the location(s) of the classes
135
- */
136
- public function set($prefix, $paths) {
137
- if (!$prefix) {
138
- $this->fallbackDirs = (array) $paths;
139
- return;
140
- }
141
-
142
- $this->prefixes[$prefix] = (array) $paths;
143
- }
144
-
145
- /**
146
- * Turns on searching the include path for class files.
147
- *
148
- * @param bool $useIncludePath
149
- */
150
- public function setUseIncludePath($useIncludePath) {
151
- $this->useIncludePath = $useIncludePath;
152
- }
153
-
154
- /**
155
- * Can be used to check if the autoloader uses the include path to check
156
- * for classes.
157
- *
158
- * @return bool
159
- */
160
- public function getUseIncludePath() {
161
- return $this->useIncludePath;
162
- }
163
-
164
- /**
165
- * Registers this instance as an autoloader.
166
- */
167
- public function register() {
168
- spl_autoload_register(array($this, 'loadClass'), true);
169
- }
170
-
171
- /**
172
- * Unregisters this instance as an autoloader.
173
- */
174
- public function unregister() {
175
- spl_autoload_unregister(array($this, 'loadClass'));
176
- }
177
-
178
- /**
179
- * Loads the given class or interface.
180
- *
181
- * @param string $class the name of the class
182
- * @return bool|null true, if loaded
183
- */
184
- public function loadClass($class) {
185
- if ($file = $this->findFile($class)) {
186
- include $file;
187
- return true;
188
- }
189
- }
190
-
191
- /**
192
- * Finds the path to the file where the class is defined.
193
- *
194
- * @param string $class the name of the class
195
- * @return string|null the path, if found
196
- */
197
- public function findFile($class) {
198
- if ('\\' === $class[0]) {
199
- $class = substr($class, 1);
200
- }
201
-
202
- if (isset($this->classMap[$class])) {
203
- return $this->classMap[$class];
204
- }
205
- elseif ($this->classMapAuthoratative) {
206
- return false;
207
- }
208
-
209
- $classPath = $this->getClassPath($class);
210
-
211
- foreach ($this->prefixes as $prefix => $dirs) {
212
- if (0 === strpos($class, $prefix)) {
213
- foreach ($dirs as $dir) {
214
- if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
215
- return $dir.DIRECTORY_SEPARATOR.$classPath;
216
- }
217
- }
218
- }
219
- }
220
-
221
- foreach ($this->fallbackDirs as $dir) {
222
- if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
223
- return $dir.DIRECTORY_SEPARATOR.$classPath;
224
- }
225
- }
226
-
227
- if ($this->useIncludePath && $file = self::resolveIncludePath($classPath)) {
228
- return $file;
229
- }
230
-
231
- return $this->classMap[$class] = false;
232
- }
233
-
234
- private function getClassPath($class) {
235
- if (false !== $pos = strrpos($class, '\\')) {
236
- // namespaced class name
237
- $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)).DIRECTORY_SEPARATOR;
238
- $className = substr($class, $pos + 1);
239
- }
240
- else {
241
- // PEAR-like class name
242
- $classPath = null;
243
- $className = $class;
244
- }
245
-
246
- $className = str_replace('_', DIRECTORY_SEPARATOR, $className);
247
-
248
- // restore the prefix
249
- if ($this->allowUnderscore && DIRECTORY_SEPARATOR === $className[0]) {
250
- $className[0] = '_';
251
- }
252
-
253
- $classPath .= $className.'.php';
254
-
255
- return $classPath;
256
- }
257
-
258
- public static function resolveIncludePath($classPath) {
259
- $paths = explode(PATH_SEPARATOR, get_include_path());
260
-
261
- foreach ($paths as $path) {
262
- $path = rtrim($path, '/\\');
263
-
264
- if ($file = file_exists($path.DIRECTORY_SEPARATOR.$file)) {
265
- return $file;
266
- }
267
- }
268
-
269
- return false;
270
- }
271
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
- /*
3
- * Copyright (c) 2013, Christoph Mewes, http://www.xrstf.de
4
- *
5
- * This file is released under the terms of the MIT license. You can find the
6
- * complete text in the attached LICENSE file or online at:
7
- *
8
- * http://www.opensource.org/licenses/mit-license.php
9
- */
10
-
11
- namespace xrstf\Composer52;
12
-
13
- use Composer\Repository\CompositeRepository;
14
- use Composer\Script\Event;
15
-
16
- class Generator {
17
- public static function onPostInstallCmd(Event $event) {
18
- $composer = $event->getComposer();
19
- $installationManager = $composer->getInstallationManager();
20
- $repoManager = $composer->getRepositoryManager();
21
- $localRepo = $repoManager->getLocalRepository();
22
- $package = $composer->getPackage();
23
- $config = $composer->getConfig();
24
-
25
- // We can't gain access to the Command's input object, so we have to look
26
- // for -o / --optimize-autoloader ourselves. Sadly, neither getopt() works
27
- // (always returns an empty array), nor does Symfony's Console Input, as
28
- // it expects a full definition of the current command line and we can't
29
- // provide that.
30
-
31
- $args = $_SERVER['argv'];
32
- $optimize = in_array('-o', $args) || in_array('--optimize-autoloader', $args) || in_array('--optimize', $args);
33
-
34
- $suffix = $config->get('autoloader-suffix');
35
-
36
- $generator = new AutoloadGenerator();
37
- $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize, $suffix);
38
- }
39
- }