Companion Auto Update - Version 3.8.5

Version Description

(March 17, 2022) = * New: Added more checks on the status page and added an explanation to some of them. * New: Added an list of delayed updates on the status page to help with troubleshooting. * Tweak: Made some improvements to the update delay feature. * Tweak: Added a notice to explain that update delay does not work with WordPress update currently. * Tweak: Improved code on the status page to be more reliable.

Download this release

Release Info

Developer Papin
Plugin Icon 128x128 Companion Auto Update
Version 3.8.5
Comparing to
See all releases

Code changes from version 3.8.4 to 3.8.5

Files changed (46) hide show
  1. admin/dashboard.php +40 -39
  2. admin/log.php +18 -18
  3. admin/pluginlist.php +184 -184
  4. admin/rollback.php +2 -2
  5. admin/status.php +435 -405
  6. backend/images/check.svg +55 -55
  7. backend/images/email.svg +95 -95
  8. backend/images/help.svg +67 -67
  9. backend/images/interval.svg +68 -68
  10. backend/images/love.svg +116 -116
  11. backend/images/settings.svg +123 -123
  12. backend/images/support.svg +101 -101
  13. backend/images/update.svg +90 -90
  14. backend/images/welcome.svg +180 -180
  15. backend/style.css +7 -0
  16. backend/warningbar.css +10 -10
  17. cau_emails.php +525 -525
  18. cau_functions.php +1439 -1440
  19. companion-auto-update.php +51 -98
  20. index.php +1 -1
  21. languages/companion-auto-update.pot +61 -61
  22. languages/index.php +4 -4
  23. readme.txt +13 -5
  24. trunk/admin/dashboard.php +0 -578
  25. trunk/admin/log.php +0 -19
  26. trunk/admin/pluginlist.php +0 -185
  27. trunk/admin/rollback.php +0 -2
  28. trunk/admin/status.php +0 -405
  29. trunk/backend/images/check.svg +0 -55
  30. trunk/backend/images/email.svg +0 -96
  31. trunk/backend/images/help.svg +0 -67
  32. trunk/backend/images/interval.svg +0 -69
  33. trunk/backend/images/love.svg +0 -116
  34. trunk/backend/images/settings.svg +0 -124
  35. trunk/backend/images/support.svg +0 -102
  36. trunk/backend/images/update.svg +0 -91
  37. trunk/backend/images/welcome.svg +0 -181
  38. trunk/backend/style.css +0 -575
  39. trunk/backend/warningbar.css +0 -11
  40. trunk/cau_emails.php +0 -525
  41. trunk/cau_functions.php +0 -1441
  42. trunk/companion-auto-update.php +0 -467
  43. trunk/index.php +0 -2
  44. trunk/languages/companion-auto-update.pot +0 -62
  45. trunk/languages/index.php +0 -4
  46. trunk/readme.txt +0 -170
admin/dashboard.php CHANGED
@@ -26,10 +26,10 @@ if( isset( $_POST['submit'] ) ) {
26
  $table_name = $wpdb->prefix . "auto_updates";
27
 
28
  // Auto updater
29
- $plugins = isset( $_POST['plugins'] ) ? sanitize_text_field( $_POST['plugins'] ) : '';
30
- $themes = isset( $_POST['themes'] ) ? sanitize_text_field( $_POST['themes'] ) : '';
31
- $minor = isset( $_POST['minor'] ) ? sanitize_text_field( $_POST['minor'] ) : '';
32
- $major = isset( $_POST['major'] ) ? sanitize_text_field( $_POST['major'] ) : '';
33
  $translations = isset( $_POST['translations'] ) ? sanitize_text_field( $_POST['translations'] ) : '';
34
 
35
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugins'", $plugins ) );
@@ -39,11 +39,11 @@ if( isset( $_POST['submit'] ) ) {
39
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'translations'", $translations ) );
40
 
41
  // Emails
42
- $send = isset( $_POST['cau_send'] ) ? sanitize_text_field( $_POST['cau_send'] ) : '';
43
  $sendupdate = isset( $_POST['cau_send_update'] ) ? sanitize_text_field( $_POST['cau_send_update'] ) : '';
44
  $sendoutdated = isset( $_POST['cau_send_outdated'] ) ? sanitize_text_field( $_POST['cau_send_outdated'] ) : '';
45
- $wpemails = isset( $_POST['wpemails'] ) ? sanitize_text_field( $_POST['wpemails'] ) : '';
46
- $email = isset( $_POST['cau_email'] ) ? sanitize_text_field( $_POST['cau_email'] ) : '';
47
  $html_or_text = isset( $_POST['html_or_text'] ) ? sanitize_text_field( $_POST['html_or_text'] ) : 'html';
48
  $dbupdateemails = isset( $_POST['dbupdateemails'] ) ? sanitize_text_field( $_POST['dbupdateemails'] ) : '';
49
 
@@ -56,8 +56,8 @@ if( isset( $_POST['submit'] ) ) {
56
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'dbupdateemails'", $dbupdateemails ) );
57
 
58
  // Advanced
59
- $allow_editor = isset( $_POST['allow_editor'] ) ? sanitize_text_field( $_POST['allow_editor'] ) : '';
60
- $allow_author = isset( $_POST['allow_author'] ) ? sanitize_text_field( $_POST['allow_author'] ) : '';
61
  $advanced_info_emails = isset( $_POST['advanced_info_emails'] ) ? sanitize_text_field( $_POST['advanced_info_emails'] ) : '';
62
  $plugin_links_emails = isset( $_POST['plugin_links_emails'] ) ? sanitize_text_field( $_POST['plugin_links_emails'] ) : '';
63
 
@@ -67,8 +67,8 @@ if( isset( $_POST['submit'] ) ) {
67
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugin_links_emails'", $plugin_links_emails ) );
68
 
69
  // Delay
70
- $update_delay = isset( $_POST['update_delay'] ) ? sanitize_text_field( $_POST['update_delay'] ) : '';
71
- $update_delay_days = isset( $_POST['update_delay_days'] ) ? sanitize_text_field( $_POST['update_delay_days'] ) : '';
72
 
73
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay'", $update_delay ) );
74
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay_days'", $update_delay_days ) );
@@ -76,9 +76,9 @@ if( isset( $_POST['submit'] ) ) {
76
  // Intervals
77
 
78
  // Set variables
79
- $plugin_sc = sanitize_text_field( $_POST['plugin_schedule'] );
80
- $theme_sc = sanitize_text_field( $_POST['theme_schedule'] );
81
- $core_sc = sanitize_text_field( $_POST['core_schedule'] );
82
  $schedule_mail = sanitize_text_field( $_POST['update_notifications'] );
83
  $outdated_notifier = sanitize_text_field( $_POST['outdated_notifier'] );
84
 
@@ -97,11 +97,11 @@ if( isset( $_POST['submit'] ) ) {
97
  // Plugins
98
  if( $plugin_sc == 'daily' ) {
99
 
100
- $date = date( 'Y-m-d' );
101
- $hours = sanitize_text_field( $_POST['plugin_schedule-sethour'] );
102
- $minutes = sanitize_text_field( $_POST['plugin_schedule-setminutes'] );
103
- $seconds = date( 's' );
104
- $fullDate = $date.' '.$hours.':'.$minutes.':'.$seconds;
105
  $pluginSetTime = strtotime( $fullDate );
106
 
107
  wp_schedule_event( $pluginSetTime, $plugin_sc, 'wp_update_plugins' );
@@ -119,11 +119,11 @@ if( isset( $_POST['submit'] ) ) {
119
  // Themes
120
  if( $theme_sc == 'daily' ) {
121
 
122
- $dateT = date( 'Y-m-d' );
123
- $hoursT = sanitize_text_field( $_POST['theme_schedule-sethour'] );
124
- $minutesT = sanitize_text_field( $_POST['theme_schedule-setminutes'] );
125
- $secondsT = date( 's' );
126
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
127
  $themeSetTime = strtotime( $fullDateT );
128
 
129
  wp_schedule_event( $themeSetTime, $theme_sc, 'wp_update_themes' );
@@ -139,11 +139,11 @@ if( isset( $_POST['submit'] ) ) {
139
  // Core
140
  if( $core_sc == 'daily' ) {
141
 
142
- $dateC = date( 'Y-m-d' );
143
- $hoursC = sanitize_text_field( $_POST['core_schedule-sethour'] );
144
- $minutesC = sanitize_text_field( $_POST['core_schedule-setminutes'] );
145
- $secondsC = date( 's' );
146
- $fullDateC = $dateC.' '.$hoursC.':'.$minutesC.':'.$secondsC;
147
  $coreSetTime = strtotime( $fullDateC );
148
 
149
  wp_schedule_event( $coreSetTime, $core_sc, 'wp_version_check' );
@@ -157,11 +157,11 @@ if( isset( $_POST['submit'] ) ) {
157
  // Update notifications
158
  if( $schedule_mail == 'daily' ) {
159
 
160
- $dateT = date( 'Y-m-d' );
161
- $hoursT = sanitize_text_field( $_POST['update_notifications-sethour'] );
162
- $minutesT = sanitize_text_field( $_POST['update_notifications-setminutes'] );
163
- $secondsT = date( 's' );
164
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
165
  $emailSetTime = strtotime( $fullDateT );
166
 
167
  wp_schedule_event( $emailSetTime, $schedule_mail, 'cau_set_schedule_mail' );
@@ -175,11 +175,11 @@ if( isset( $_POST['submit'] ) ) {
175
  // Outdated notifications
176
  if( $outdated_notifier == 'daily' ) {
177
 
178
- $dateT = date( 'Y-m-d' );
179
- $hoursT = sanitize_text_field( $_POST['outdated_notifier-sethour'] );
180
- $minutesT = sanitize_text_field( $_POST['outdated_notifier-setminutes'] );
181
- $secondsT = date( 's' );
182
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
183
  $emailSetTime = strtotime( $fullDateT );
184
 
185
  wp_schedule_event( $emailSetTime, $outdated_notifier, 'cau_outdated_notifier' );
@@ -464,6 +464,7 @@ $cs_hooks_t = wp_get_schedule( 'cau_custom_hooks_themes' );
464
  <td>
465
  <input type="number" min="0" max="31" name="update_delay_days" id="update_delay_days" class="regular-text" value="<?php echo cau_get_db_value( 'update_delay_days' ); ?>" />
466
  <p><?php _e( 'For how many days should updates be put on hold?', 'companion-auto-update' ); ?></p>
 
467
  </td>
468
  </tr>
469
  </tbody>
26
  $table_name = $wpdb->prefix . "auto_updates";
27
 
28
  // Auto updater
29
+ $plugins = isset( $_POST['plugins'] ) ? sanitize_text_field( $_POST['plugins'] ) : '';
30
+ $themes = isset( $_POST['themes'] ) ? sanitize_text_field( $_POST['themes'] ) : '';
31
+ $minor = isset( $_POST['minor'] ) ? sanitize_text_field( $_POST['minor'] ) : '';
32
+ $major = isset( $_POST['major'] ) ? sanitize_text_field( $_POST['major'] ) : '';
33
  $translations = isset( $_POST['translations'] ) ? sanitize_text_field( $_POST['translations'] ) : '';
34
 
35
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugins'", $plugins ) );
39
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'translations'", $translations ) );
40
 
41
  // Emails
42
+ $send = isset( $_POST['cau_send'] ) ? sanitize_text_field( $_POST['cau_send'] ) : '';
43
  $sendupdate = isset( $_POST['cau_send_update'] ) ? sanitize_text_field( $_POST['cau_send_update'] ) : '';
44
  $sendoutdated = isset( $_POST['cau_send_outdated'] ) ? sanitize_text_field( $_POST['cau_send_outdated'] ) : '';
45
+ $wpemails = isset( $_POST['wpemails'] ) ? sanitize_text_field( $_POST['wpemails'] ) : '';
46
+ $email = isset( $_POST['cau_email'] ) ? sanitize_text_field( $_POST['cau_email'] ) : '';
47
  $html_or_text = isset( $_POST['html_or_text'] ) ? sanitize_text_field( $_POST['html_or_text'] ) : 'html';
48
  $dbupdateemails = isset( $_POST['dbupdateemails'] ) ? sanitize_text_field( $_POST['dbupdateemails'] ) : '';
49
 
56
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'dbupdateemails'", $dbupdateemails ) );
57
 
58
  // Advanced
59
+ $allow_editor = isset( $_POST['allow_editor'] ) ? sanitize_text_field( $_POST['allow_editor'] ) : '';
60
+ $allow_author = isset( $_POST['allow_author'] ) ? sanitize_text_field( $_POST['allow_author'] ) : '';
61
  $advanced_info_emails = isset( $_POST['advanced_info_emails'] ) ? sanitize_text_field( $_POST['advanced_info_emails'] ) : '';
62
  $plugin_links_emails = isset( $_POST['plugin_links_emails'] ) ? sanitize_text_field( $_POST['plugin_links_emails'] ) : '';
63
 
67
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugin_links_emails'", $plugin_links_emails ) );
68
 
69
  // Delay
70
+ $update_delay = isset( $_POST['update_delay'] ) ? sanitize_text_field( $_POST['update_delay'] ) : '';
71
+ $update_delay_days = isset( $_POST['update_delay_days'] ) ? sanitize_text_field( $_POST['update_delay_days'] ) : '';
72
 
73
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay'", $update_delay ) );
74
  $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay_days'", $update_delay_days ) );
76
  // Intervals
77
 
78
  // Set variables
79
+ $plugin_sc = sanitize_text_field( $_POST['plugin_schedule'] );
80
+ $theme_sc = sanitize_text_field( $_POST['theme_schedule'] );
81
+ $core_sc = sanitize_text_field( $_POST['core_schedule'] );
82
  $schedule_mail = sanitize_text_field( $_POST['update_notifications'] );
83
  $outdated_notifier = sanitize_text_field( $_POST['outdated_notifier'] );
84
 
97
  // Plugins
98
  if( $plugin_sc == 'daily' ) {
99
 
100
+ $date = date( 'Y-m-d' );
101
+ $hours = sanitize_text_field( $_POST['plugin_schedule-sethour'] );
102
+ $minutes = sanitize_text_field( $_POST['plugin_schedule-setminutes'] );
103
+ $seconds = date( 's' );
104
+ $fullDate = $date.' '.$hours.':'.$minutes.':'.$seconds;
105
  $pluginSetTime = strtotime( $fullDate );
106
 
107
  wp_schedule_event( $pluginSetTime, $plugin_sc, 'wp_update_plugins' );
119
  // Themes
120
  if( $theme_sc == 'daily' ) {
121
 
122
+ $dateT = date( 'Y-m-d' );
123
+ $hoursT = sanitize_text_field( $_POST['theme_schedule-sethour'] );
124
+ $minutesT = sanitize_text_field( $_POST['theme_schedule-setminutes'] );
125
+ $secondsT = date( 's' );
126
+ $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
127
  $themeSetTime = strtotime( $fullDateT );
128
 
129
  wp_schedule_event( $themeSetTime, $theme_sc, 'wp_update_themes' );
139
  // Core
140
  if( $core_sc == 'daily' ) {
141
 
142
+ $dateC = date( 'Y-m-d' );
143
+ $hoursC = sanitize_text_field( $_POST['core_schedule-sethour'] );
144
+ $minutesC = sanitize_text_field( $_POST['core_schedule-setminutes'] );
145
+ $secondsC = date( 's' );
146
+ $fullDateC = $dateC.' '.$hoursC.':'.$minutesC.':'.$secondsC;
147
  $coreSetTime = strtotime( $fullDateC );
148
 
149
  wp_schedule_event( $coreSetTime, $core_sc, 'wp_version_check' );
157
  // Update notifications
158
  if( $schedule_mail == 'daily' ) {
159
 
160
+ $dateT = date( 'Y-m-d' );
161
+ $hoursT = sanitize_text_field( $_POST['update_notifications-sethour'] );
162
+ $minutesT = sanitize_text_field( $_POST['update_notifications-setminutes'] );
163
+ $secondsT = date( 's' );
164
+ $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
165
  $emailSetTime = strtotime( $fullDateT );
166
 
167
  wp_schedule_event( $emailSetTime, $schedule_mail, 'cau_set_schedule_mail' );
175
  // Outdated notifications
176
  if( $outdated_notifier == 'daily' ) {
177
 
178
+ $dateT = date( 'Y-m-d' );
179
+ $hoursT = sanitize_text_field( $_POST['outdated_notifier-sethour'] );
180
+ $minutesT = sanitize_text_field( $_POST['outdated_notifier-setminutes'] );
181
+ $secondsT = date( 's' );
182
+ $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
183
  $emailSetTime = strtotime( $fullDateT );
184
 
185
  wp_schedule_event( $emailSetTime, $outdated_notifier, 'cau_outdated_notifier' );
464
  <td>
465
  <input type="number" min="0" max="31" name="update_delay_days" id="update_delay_days" class="regular-text" value="<?php echo cau_get_db_value( 'update_delay_days' ); ?>" />
466
  <p><?php _e( 'For how many days should updates be put on hold?', 'companion-auto-update' ); ?></p>
467
+ <p><small><strong>Please note:</strong> Delaying updates does not work with WordPress updates yet.</small></p>
468
  </td>
469
  </tr>
470
  </tbody>
admin/log.php CHANGED
@@ -1,19 +1,19 @@
1
- <?php
2
- if( isset( $_GET['filter'] ) ) {
3
- $filter = $_GET['filter'];
4
- } else {
5
- $filter = 'all';
6
- }
7
- ?>
8
-
9
- <ul class="subsubsub">
10
- <li><a <?php if( $filter == 'all' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=all' ); ?>'><?php _e( 'View full changelog', 'companion-auto-update' ); ?></a></li> |
11
- <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
12
- <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li> |
13
- <li><a <?php if( $filter == 'translations' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=translations' ); ?>'><?php _e( 'Translations', 'companion-auto-update' ); ?></a></li>
14
- </ul>
15
-
16
- <div class='cau_spacing'></div>
17
-
18
- <?php
19
  cau_fetch_log( 'all', 'table' );
1
+ <?php
2
+ if( isset( $_GET['filter'] ) ) {
3
+ $filter = $_GET['filter'];
4
+ } else {
5
+ $filter = 'all';
6
+ }
7
+ ?>
8
+
9
+ <ul class="subsubsub">
10
+ <li><a <?php if( $filter == 'all' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=all' ); ?>'><?php _e( 'View full changelog', 'companion-auto-update' ); ?></a></li> |
11
+ <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
12
+ <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li> |
13
+ <li><a <?php if( $filter == 'translations' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=translations' ); ?>'><?php _e( 'Translations', 'companion-auto-update' ); ?></a></li>
14
+ </ul>
15
+
16
+ <div class='cau_spacing'></div>
17
+
18
+ <?php
19
  cau_fetch_log( 'all', 'table' );
admin/pluginlist.php CHANGED
@@ -1,185 +1,185 @@
1
- <?php
2
-
3
- // Get selected filter type
4
- if( isset( $_GET['filter'] ) ) {
5
- $filter = sanitize_key( $_GET['filter'] );
6
- } else {
7
- $filter = 'plugins';
8
- }
9
-
10
- // Select correct database row
11
- switch ( $filter ) {
12
- case 'themes':
13
- $db_table = 'notUpdateListTh';
14
- $filter_name = __( 'Themes', 'companion-auto-update' );
15
- $filterFunction = wp_get_themes();
16
- break;
17
- case 'plugins':
18
- $db_table = 'notUpdateList';
19
- $filter_name = __( 'Plugins', 'companion-auto-update' );
20
- $filterFunction = get_plugins();
21
- break;
22
- default:
23
- $db_table = 'notUpdateList';
24
- $filter_name = __( 'Plugins', 'companion-auto-update' );
25
- $filterFunction = get_plugins();
26
- break;
27
- }
28
-
29
- ?>
30
-
31
- <ul class="subsubsub">
32
- <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
33
- <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li>
34
- </ul>
35
-
36
- <div style='clear: both;'></div>
37
-
38
- <?php if( $filter == 'themes' ) { ?>
39
- <div id="message" class="cau">
40
- We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update.
41
- </div>
42
- <?php } ?>
43
-
44
- <p><?php echo sprintf( esc_html__( 'Prevent certain %s from updating automatically. %s that you select here will be skipped by Companion Auto Update and will require manual updating.', 'companion-auto-update' ), strtolower( $filter_name ), $filter_name ); ?></p>
45
-
46
- <?php
47
-
48
- global $wpdb;
49
- $table_name = $wpdb->prefix."auto_updates";
50
-
51
- // Save list
52
- if( isset( $_POST['submit'] ) ) {
53
-
54
- check_admin_referer( 'cau_save_pluginlist' );
55
-
56
- $noUpdateList = '';
57
- $i = 0;
58
- $noUpdateCount = 0;
59
-
60
- if( isset( $_POST['post'] ) ) {
61
- $noUpdateCount = count( $_POST['post'] );
62
- }
63
-
64
- if( $noUpdateCount > 0 ) {
65
- foreach ( $_POST['post'] as $key ) {
66
- $noUpdateList .= sanitize_text_field( $key );
67
- $i++;
68
- if( $i != $noUpdateCount ) $noUpdateList .= ', ';
69
- }
70
- }
71
-
72
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = '%s'", $noUpdateList, $db_table ) );
73
- echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( '%1$s %2$s have been added to the no-update-list', 'companion-auto-update' ), $noUpdateCount, strtolower( $filter_name ) ).'.</p></div>';
74
- }
75
-
76
-
77
- // Reset list
78
- if( isset( $_POST['reset'] ) ) {
79
-
80
- check_admin_referer( 'cau_save_pluginlist' );
81
-
82
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = %s", "", $db_table ) );
83
- echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( 'The no-update-list has been reset, all %s will be auto-updated from now on', 'companion-auto-update' ), strtolower( $filter_name ) ).'.</p></div>';
84
- }
85
-
86
-
87
- ?>
88
-
89
- <form method="POST">
90
-
91
- <div class='pluginListButtons'>
92
- <?php submit_button(); ?>
93
- <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
94
- </div>
95
-
96
- <table class="wp-list-table widefat autoupdate striped">
97
- <thead>
98
- <tr>
99
- <td>&nbsp;</td>
100
- <th class="head-plugin"><strong><?php _e( 'Name', 'companion-auto-update' ); ?></strong></th>
101
- <th class="head-status"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
102
- <th class="head-description"><strong><?php _e( 'Description' ); ?></strong></th>
103
- </tr>
104
- </thead>
105
-
106
- <tbody id="the-list">
107
-
108
- <?php
109
-
110
- foreach ( $filterFunction as $key => $value ) {
111
-
112
- $slug = $key;
113
- $explosion = explode( '/', $slug );
114
- $actualSlug = array_shift( $explosion );
115
- $slug_hash = md5( $slug[0] );
116
-
117
- if( $filter == 'themes' ) {
118
-
119
- $theme = wp_get_theme( $actualSlug );
120
- $name = $theme->get( 'Name' );
121
- $description = $theme->get( 'Description' );
122
-
123
- } else {
124
-
125
- foreach ( $value as $k => $v ) {
126
-
127
- if( $k == "Name" ) $name = $v;
128
- if( $k == "Description" ) $description = $v;
129
-
130
- }
131
-
132
- }
133
-
134
- if( in_array( $actualSlug, donotupdatelist( $filter ) ) ) {
135
-
136
- $class = 'inactive';
137
- $checked = 'CHECKED';
138
- $statusicon = 'no';
139
- $statusName = 'disabled';
140
-
141
- } else {
142
-
143
- $class = 'active';
144
- $checked = '';
145
- $statusicon = 'yes';
146
- $statusName = 'enabled';
147
- }
148
-
149
- echo '<tr id="post-'.$slug_hash.'" class="'.$class.'">
150
-
151
- <th class="check-column">
152
- <label class="screen-reader-text" for="cb-select-'.$slug_hash.'">Select '. $name .'</label>
153
- <input id="cb-select-'.$slug_hash.'" type="checkbox" name="post[]" value="'.$actualSlug.'" '.$checked.' ><label></label>
154
- <div class="locked-indicator"></div>
155
- </th>
156
-
157
- <td class="column-name">
158
- <p style="margin-bottom: 0px;"><strong>'. $name .'</strong></p>
159
- <small class="description" style="opacity: 0.5; margin-bottom: 3px;">'.$actualSlug.'</small>
160
- </td>
161
-
162
- <td class="cau_hide_on_mobile column-status">
163
- <p><span class="nowrap">'.__( 'Auto Updater', 'companion-auto-update' ).': <span class="cau_'.$statusName.'"><span class="dashicons dashicons-'.$statusicon.'"></span></span></span></p>
164
- </td>
165
-
166
- <td class="cau_hide_on_mobile column-description">
167
- <p>'.$description.'</p>
168
- </td>
169
-
170
- </tr>';
171
-
172
- }
173
- ?>
174
-
175
- </tbody>
176
- </table>
177
-
178
- <?php wp_nonce_field( 'cau_save_pluginlist' ); ?>
179
-
180
- <div class='pluginListButtons'>
181
- <?php submit_button(); ?>
182
- <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
183
- </div>
184
-
185
  </form>
1
+ <?php
2
+
3
+ // Get selected filter type
4
+ if( isset( $_GET['filter'] ) ) {
5
+ $filter = sanitize_key( $_GET['filter'] );
6
+ } else {
7
+ $filter = 'plugins';
8
+ }
9
+
10
+ // Select correct database row
11
+ switch ( $filter ) {
12
+ case 'themes':
13
+ $db_table = 'notUpdateListTh';
14
+ $filter_name = __( 'Themes', 'companion-auto-update' );
15
+ $filterFunction = wp_get_themes();
16
+ break;
17
+ case 'plugins':
18
+ $db_table = 'notUpdateList';
19
+ $filter_name = __( 'Plugins', 'companion-auto-update' );
20
+ $filterFunction = get_plugins();
21
+ break;
22
+ default:
23
+ $db_table = 'notUpdateList';
24
+ $filter_name = __( 'Plugins', 'companion-auto-update' );
25
+ $filterFunction = get_plugins();
26
+ break;
27
+ }
28
+
29
+ ?>
30
+
31
+ <ul class="subsubsub">
32
+ <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
33
+ <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li>
34
+ </ul>
35
+
36
+ <div style='clear: both;'></div>
37
+
38
+ <?php if( $filter == 'themes' ) { ?>
39
+ <div id="message" class="cau">
40
+ We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update.
41
+ </div>
42
+ <?php } ?>
43
+
44
+ <p><?php echo sprintf( esc_html__( 'Prevent certain %s from updating automatically. %s that you select here will be skipped by Companion Auto Update and will require manual updating.', 'companion-auto-update' ), strtolower( $filter_name ), $filter_name ); ?></p>
45
+
46
+ <?php
47
+
48
+ global $wpdb;
49
+ $table_name = $wpdb->prefix."auto_updates";
50
+
51
+ // Save list
52
+ if( isset( $_POST['submit'] ) ) {
53
+
54
+ check_admin_referer( 'cau_save_pluginlist' );
55
+
56
+ $noUpdateList = '';
57
+ $i = 0;
58
+ $noUpdateCount = 0;
59
+
60
+ if( isset( $_POST['post'] ) ) {
61
+ $noUpdateCount = count( $_POST['post'] );
62
+ }
63
+
64
+ if( $noUpdateCount > 0 ) {
65
+ foreach ( $_POST['post'] as $key ) {
66
+ $noUpdateList .= sanitize_text_field( $key );
67
+ $i++;
68
+ if( $i != $noUpdateCount ) $noUpdateList .= ', ';
69
+ }
70
+ }
71
+
72
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = '%s'", $noUpdateList, $db_table ) );
73
+ echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( '%1$s %2$s have been added to the no-update-list', 'companion-auto-update' ), $noUpdateCount, strtolower( $filter_name ) ).'.</p></div>';
74
+ }
75
+
76
+
77
+ // Reset list
78
+ if( isset( $_POST['reset'] ) ) {
79
+
80
+ check_admin_referer( 'cau_save_pluginlist' );
81
+
82
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = %s", "", $db_table ) );
83
+ echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( 'The no-update-list has been reset, all %s will be auto-updated from now on', 'companion-auto-update' ), strtolower( $filter_name ) ).'.</p></div>';
84
+ }
85
+
86
+
87
+ ?>
88
+
89
+ <form method="POST">
90
+
91
+ <div class='pluginListButtons'>
92
+ <?php submit_button(); ?>
93
+ <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
94
+ </div>
95
+
96
+ <table class="wp-list-table widefat autoupdate striped">
97
+ <thead>
98
+ <tr>
99
+ <td>&nbsp;</td>
100
+ <th class="head-plugin"><strong><?php _e( 'Name', 'companion-auto-update' ); ?></strong></th>
101
+ <th class="head-status"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
102
+ <th class="head-description"><strong><?php _e( 'Description' ); ?></strong></th>
103
+ </tr>
104
+ </thead>
105
+
106
+ <tbody id="the-list">
107
+
108
+ <?php
109
+
110
+ foreach ( $filterFunction as $key => $value ) {
111
+
112
+ $slug = $key;
113
+ $explosion = explode( '/', $slug );
114
+ $actualSlug = array_shift( $explosion );
115
+ $slug_hash = md5( $slug[0] );
116
+
117
+ if( $filter == 'themes' ) {
118
+
119
+ $theme = wp_get_theme( $actualSlug );
120
+ $name = $theme->get( 'Name' );
121
+ $description = $theme->get( 'Description' );
122
+
123
+ } else {
124
+
125
+ foreach ( $value as $k => $v ) {
126
+
127
+ if( $k == "Name" ) $name = $v;
128
+ if( $k == "Description" ) $description = $v;
129
+
130
+ }
131
+
132
+ }
133
+
134
+ if( in_array( $actualSlug, donotupdatelist( $filter ) ) ) {
135
+
136
+ $class = 'inactive';
137
+ $checked = 'CHECKED';
138
+ $statusicon = 'no';
139
+ $statusName = 'disabled';
140
+
141
+ } else {
142
+
143
+ $class = 'active';
144
+ $checked = '';
145
+ $statusicon = 'yes';
146
+ $statusName = 'enabled';
147
+ }
148
+
149
+ echo '<tr id="post-'.$slug_hash.'" class="'.$class.'">
150
+
151
+ <th class="check-column">
152
+ <label class="screen-reader-text" for="cb-select-'.$slug_hash.'">Select '. $name .'</label>
153
+ <input id="cb-select-'.$slug_hash.'" type="checkbox" name="post[]" value="'.$actualSlug.'" '.$checked.' ><label></label>
154
+ <div class="locked-indicator"></div>
155
+ </th>
156
+
157
+ <td class="column-name">
158
+ <p style="margin-bottom: 0px;"><strong>'. $name .'</strong></p>
159
+ <small class="description" style="opacity: 0.5; margin-bottom: 3px;">'.$actualSlug.'</small>
160
+ </td>
161
+
162
+ <td class="cau_hide_on_mobile column-status">
163
+ <p><span class="nowrap">'.__( 'Auto Updater', 'companion-auto-update' ).': <span class="cau_'.$statusName.'"><span class="dashicons dashicons-'.$statusicon.'"></span></span></span></p>
164
+ </td>
165
+
166
+ <td class="cau_hide_on_mobile column-description">
167
+ <p>'.$description.'</p>
168
+ </td>
169
+
170
+ </tr>';
171
+
172
+ }
173
+ ?>
174
+
175
+ </tbody>
176
+ </table>
177
+
178
+ <?php wp_nonce_field( 'cau_save_pluginlist' ); ?>
179
+
180
+ <div class='pluginListButtons'>
181
+ <?php submit_button(); ?>
182
+ <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
183
+ </div>
184
+
185
  </form>
admin/rollback.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
- // Currently working on this
1
+ <?php
2
+ // Currently working on this
admin/status.php CHANGED
@@ -1,405 +1,435 @@
1
- <?php
2
-
3
- // Update the database
4
- if( isset( $_GET['run'] ) && $_GET['run'] == 'db_update' ) {
5
- cau_manual_update();
6
- echo '<div id="message" class="updated"><p><b>'.__( 'Database update completed' ).'</b></p></div>';
7
- }
8
-
9
- if( isset( $_GET['run'] ) && $_GET['run'] == 'db_info_update' ) {
10
- cau_savePluginInformation();
11
- echo '<div id="message" class="updated"><p><b>'.__( 'Database information update completed' ).'</b></p></div>';
12
- }
13
-
14
- if( isset( $_GET['ignore_report'] ) ) {
15
-
16
- $report_to_ignore = sanitize_text_field( $_GET['ignore_report'] );
17
- $allowedValues = array( 'seo', 'cron' );
18
-
19
- if( !in_array( $report_to_ignore, $allowedValues ) ) {
20
- wp_die( 'Trying to cheat eh?' );
21
- } else {
22
- global $wpdb;
23
- $table_name = $wpdb->prefix . "auto_updates";
24
- $wpdb->query( $wpdb->prepare( "UPDATE {$table_name} SET onoroff = %s WHERE name = 'ignore_$report_to_ignore'", 'yes' ) );
25
- $__ignored = __( 'This report will now be ignored', 'companion-auto-update' );
26
- echo "<div id='message' class='updated'><p><b>$__ignored</b></p></div>";
27
- }
28
-
29
- }
30
-
31
-
32
-
33
- // Variables
34
- $dateFormat = get_option( 'date_format' );
35
- $dateFormat .= ' '.get_option( 'time_format' );
36
- global $wpdb;
37
- $table_name = $wpdb->prefix . "auto_updates";
38
- $schedules = wp_get_schedules();
39
- $interval_names = cau_wp_get_schedules();
40
-
41
- ?>
42
-
43
- <div class="cau_status_page">
44
-
45
- <table class="cau_status_list widefat striped">
46
-
47
- <thead>
48
- <tr>
49
- <th class="cau_status_name"><strong><?php _e( 'Auto Updater', 'companion-auto-update' ); ?></strong></th>
50
- <th class="cau_status_active_state"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
51
- <th class="cau_status_interval"><strong><?php _e( 'Interval', 'companion-auto-update' ); ?></strong></th>
52
- <th class="cau_status_next"><strong><?php _e( 'Next', 'companion-auto-update' ); ?></strong></th>
53
- </tr>
54
- </thead>
55
-
56
- <tbody id="the-list">
57
- <?php
58
-
59
- $auto_updaters = array(
60
- 'plugins' => __( 'Plugins', 'companion-auto-update' ),
61
- 'themes' => __( 'Themes', 'companion-auto-update' ),
62
- 'minor' => __( 'Core (Minor)', 'companion-auto-update' ),
63
- 'major' => __( 'Core (Major)', 'companion-auto-update' )
64
- );
65
-
66
- $eventNames = array(
67
- 'plugins' => 'wp_update_plugins',
68
- 'themes' => 'wp_update_themes',
69
- 'minor' => 'wp_version_check',
70
- 'major' => 'wp_version_check'
71
- );
72
-
73
- foreach ( $auto_updaters as $key => $value ) {
74
-
75
- if( cau_get_db_value( $key ) == 'on' ) {
76
- $__status = 'enabled';
77
- $__icon = 'yes-alt';
78
- $__text = __( 'Enabled', 'companion-auto-update' );
79
- $__interval = $interval_names[wp_get_schedule( $eventNames[$key] )];
80
- $__next = date_i18n( $dateFormat, wp_next_scheduled( $eventNames[$key] ) );
81
- } else {
82
- $__status = 'disabled';
83
- $__icon = 'marker';
84
- $__text = __( 'Disabled', 'companion-auto-update' );
85
- $__interval = '&dash;';
86
- $__next = '&dash;';
87
- }
88
-
89
- $__nxt = __( 'Next', 'companion-auto-update' );
90
-
91
- echo "<tr>
92
- <td class='cau_status_name'>$value</td>
93
- <td class='cau_status_active_state'><span class='cau_$__status'><span class='dashicons dashicons-$__icon'></span> $__text</span></td>
94
- <td class='cau_status_interval'>$__interval</td>
95
- <td class='cau_status_next'><span class='cau_mobile_prefix'>$__nxt: </span>$__next</td>
96
- </tr>";
97
- }
98
-
99
- ?>
100
- </tbody>
101
-
102
- </table>
103
-
104
- <table class="cau_status_list widefat striped">
105
-
106
- <thead>
107
- <tr>
108
- <th class="cau_status_name"><strong><?php _e( 'Email Notifications', 'companion-auto-update' ); ?></strong></th>
109
- <th class="cau_status_active_state"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
110
- <th class="cau_status_interval"><strong><?php _e( 'Interval', 'companion-auto-update' ); ?></strong></th>
111
- <th class="cau_status_next"><strong><?php _e( 'Next', 'companion-auto-update' ); ?></strong></th>
112
- </tr>
113
- </thead>
114
-
115
- <tbody id="the-list">
116
- <?php
117
-
118
- $other_events = array(
119
- 'send' => __( 'Update available', 'companion-auto-update' ),
120
- 'sendupdate' => __( 'Successful update', 'companion-auto-update' ),
121
- 'wpemails' => __( 'Core notifications', 'companion-auto-update' )
122
- );
123
-
124
- $other_eventNames = array(
125
- 'send' => 'cau_set_schedule_mail',
126
- 'sendupdate' => 'cau_set_schedule_mail',
127
- 'wpemails' => 'cau_set_schedule_mail',
128
- );
129
-
130
- foreach ( $other_events as $key => $value ) {
131
-
132
- if( cau_get_db_value( $key ) == 'on' ) {
133
- $__status = 'enabled';
134
- $__icon = 'yes-alt';
135
- $__text = __( 'Enabled', 'companion-auto-update' );
136
- $__interval = $interval_names[wp_get_schedule( $other_eventNames[$key] )];
137
- $__next = date_i18n( $dateFormat, wp_next_scheduled( $other_eventNames[$key] ) );
138
- } else {
139
- $__status = 'warning';
140
- $__icon = 'marker';
141
- $__text = __( 'Disabled', 'companion-auto-update' );
142
- $__interval = '&dash;';
143
- $__next = '&dash;';
144
- }
145
-
146
- $__nxt = __( 'Next', 'companion-auto-update' );
147
-
148
- echo "<tr>
149
- <td class='cau_status_name'>$value</td>
150
- <td class='cau_status_active_state'><span class='cau_$__status'><span class='dashicons dashicons-$__icon'></span> $__text</span></td>
151
- <td class='cau_status_interval'>$__interval</td>
152
- <td class='cau_status_next'><span class='cau_mobile_prefix'>$__nxt: </span>$__next</td>
153
- </tr>";
154
- }
155
-
156
- ?>
157
- </tbody>
158
-
159
- </table>
160
-
161
- <table class="cau_status_list widefat striped cau_status_warnings">
162
-
163
- <thead>
164
- <tr>
165
- <th class="cau_plugin_issue_name" colspan="4"><strong><?php _e( 'Status' ); ?></strong></th>
166
- </tr>
167
- </thead>
168
-
169
- <tbody id="the-list">
170
-
171
- <tr>
172
- <td><?php _e( 'Auto updates', 'companion-auto-update' ); ?></td>
173
- <?php if ( checkAutomaticUpdaterDisabled() ) { ?>
174
- <td class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'All automatic updates are disabled', 'companion-auto-update' ); ?></span></td>
175
- <td>
176
- <form method="POST">
177
- <?php wp_nonce_field( 'cau_fixit' ); ?>
178
- <button type="submit" name="fixit" class="button button-primary"><?php _e( 'Fix it', 'companion-auto-update' ); ?></button>
179
- <a href="https://codeermeneer.nl/documentation/known-issues-fixes/#updates_disabled" target="_blank" class="button"><?php _e( 'How to fix this', 'companion-auto-update' ); ?></a>
180
- </form>
181
- </td>
182
- <?php } else { ?>
183
- <td class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
184
- <td></td>
185
- <?php } ?>
186
- <td></td>
187
- </tr>
188
-
189
- <tr>
190
- <td><?php _e( 'Connection with WordPress.org', 'companion-auto-update' ); ?></td>
191
- <?php if( wp_http_supports( array( 'ssl' ) ) == '1' ) {
192
- $__text = __( 'No issues detected', 'companion-auto-update' );
193
- echo "<td colspan='3' class='cau_status_active_state'><span class='cau_enabled'><span class='dashicons dashicons-yes-alt'></span> $__text</span></td>";
194
- } else {
195
- $__text = __( 'Disabled', 'companion-auto-update' );
196
- echo "<td colspan='3' class='cau_status_active_state'><span class='cau_disabled'><span class='dashicons dashicons-no'></span> $__text</span></td>";
197
- } ?>
198
- </tr>
199
-
200
- <tr <?php if( cau_get_db_value( 'ignore_seo' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
201
- <td><?php _e( 'Search Engine Visibility', 'companion-auto-update' ); ?></td>
202
- <?php if( get_option( 'blog_public' ) == 0 ) { ?>
203
- <td colspan="2" class="cau_status_active_state">
204
- <span class='cau_warning'><span class="dashicons dashicons-warning"></span></span>
205
- <?php _e( 'You’ve chosen to discourage Search Engines from indexing your site. Auto-updating works best on sites with more traffic, consider enabling indexing for your site.', 'companion-auto-update' ); ?>
206
- </td>
207
- <td>
208
- <a href="<?php echo admin_url( 'options-reading.php' ); ?>" class="button"><?php _e( 'Fix it', 'companion-auto-update' ); ?></a>
209
- <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=seo" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
210
- </td>
211
- <?php } else { ?>
212
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
213
- <?php } ?>
214
- </tr>
215
-
216
- <tr <?php if( cau_get_db_value( 'ignore_cron' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
217
- <td><?php _e( 'Cronjobs', 'companion-auto-update' ); ?></td>
218
- <?php if( checkCronjobsDisabled() ) { ?>
219
- <td class="cau_status_active_state"><span class='cau_warning'><span class="dashicons dashicons-warning"></span> <?php _e( 'Disabled', 'companion-auto-update' ); ?></span></td>
220
- <td><code>DISABLE_WP_CRON true</code></td>
221
- <td>
222
- <a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a>
223
- <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=cron" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
224
- </td>
225
- <?php } else { ?>
226
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
227
- <?php } ?>
228
- </tr>
229
-
230
- <tr>
231
- <td>wp_version_check</td>
232
- <?php if ( !has_filter( 'wp_version_check', 'wp_version_check' ) ) { ?>
233
- <td colspan="2" class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'A plugin has prevented updates by disabling wp_version_check', 'companion-auto-update' ); ?></span></td>
234
- <td><a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a></td>
235
- <?php } else { ?>
236
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected' , 'companion-auto-update' ); ?></span></td>
237
- <?php } ?>
238
- </tr>
239
-
240
- <tr>
241
- <td>VCS</td>
242
- <td colspan="3" class="cau_status_active_state"><span class='cau_<?php echo cau_test_is_vcs_checkout( ABSPATH )['status']; ?>'><span class="dashicons dashicons-<?php echo cau_test_is_vcs_checkout( ABSPATH )['icon']; ?>"></span> <?php echo cau_test_is_vcs_checkout( ABSPATH )['description']; ?></span></td>
243
- </tr>
244
-
245
- </tbody>
246
-
247
- </table>
248
-
249
- <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
250
-
251
- <thead>
252
- <tr>
253
- <th colspan="4"><strong><?php _e( 'Systeminfo', 'companion-auto-update' ); ?></strong></th>
254
- </tr>
255
- </thead>
256
-
257
- <tbody id="the-list">
258
- <tr>
259
- <td>WordPress</td>
260
- <td><?php echo get_bloginfo( 'version' ); ?></td>
261
- <td></td>
262
- <td></td>
263
- </tr>
264
- <tr>
265
- <td>PHP</td>
266
- <td><?php echo phpversion(); ?></td>
267
- <td></td>
268
- <td></td>
269
- </tr>
270
- <tr <?php if( cau_incorrectDatabaseVersion() ) { echo "class='inactive'"; } ?>>
271
- <td>Database</td>
272
- <td><?php echo get_option( "cau_db_version" ); ?> <code>(Latest: <?php echo cau_db_version(); ?>)</code></td>
273
- <td></td>
274
- <td></td>
275
- </tr>
276
- <tr>
277
- <td class="cau_status_name"><?php _e( 'Timezone' ); ?></td>
278
- <td class="cau_status_active_state"><?php echo cau_get_proper_timezone(); ?> (GMT <?php echo get_option('gmt_offset'); ?>) - <?php echo date_default_timezone_get(); ?></td>
279
- <td></td>
280
- <td></td>
281
- </tr>
282
- </tbody>
283
-
284
- </table>
285
-
286
- <?php
287
- // If has incomptable plugins
288
- if( cau_incompatiblePlugins() ) { ?>
289
-
290
- <table class="cau_status_list no_column_width widefat striped cau_status_warnings">
291
-
292
- <thead>
293
- <tr>
294
- <th class="cau_plugin_issue_name" colspan="4"><strong><?php _e( 'Possible plugin issues', 'companion-auto-update' ); ?></strong></th>
295
- </tr>
296
- </thead>
297
-
298
- <tbody id="the-list">
299
- <?php
300
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
301
- if( is_plugin_active( $key ) ) {
302
- echo '<tr>
303
- <td class="cau_plugin_issue_name"><strong>'.$key.'</strong></td>
304
- <td colspan="2" class="cau_plugin_issue_explain">'.$value.'</td>
305
- <td class="cau_plugin_issue_fixit"><a href="https://codeermeneer.nl/documentation/known-issues-fixes/#plugins" target="_blank" class="button">'.__( 'How to fix this', 'companion-auto-update' ).'</a></td>
306
- </tr>';
307
- }
308
- }
309
- ?>
310
- </tbody>
311
-
312
- </table>
313
-
314
- <?php } ?>
315
-
316
- <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
317
-
318
- <thead>
319
- <tr>
320
- <th><strong><?php _e( 'Advanced info', 'companion-auto-update' ); ?></strong> &dash; <?php _e( 'For when you need our help fixing an issue.', 'companion-auto-update' ); ?></th>
321
- </tr>
322
- </thead>
323
- <tbody id="the-list">
324
- <tr>
325
- <td>
326
- <div class='button button-primary toggle_advanced_button'><?php _e( 'Toggle', 'companion-auto-update' ); ?></div>
327
-
328
- <div class='toggle_advanced_content' style='display: none;'>
329
- <?php
330
- global $wpdb;
331
- $autoupdates = $wpdb->prefix."auto_updates";
332
- $cau_configs = $wpdb->get_results( "SELECT * FROM $autoupdates" );
333
- array_push( $cau_configs, "WordPress: ".get_bloginfo( 'version' ) );
334
- array_push( $cau_configs, "PHP: ".phpversion() );
335
- array_push( $cau_configs, "DB: ".get_option( "cau_db_version" ).' / '.cau_db_version() );
336
-
337
- echo "<textarea style='width: 100%; height: 750px;'>";
338
- print_r( $cau_configs );
339
- echo "</textarea>";
340
- ?>
341
- </div>
342
- </td>
343
- </tr>
344
- </tbody>
345
- </table>
346
-
347
- <script>jQuery( '.toggle_advanced_button' ).click( function() { jQuery( '.toggle_advanced_content' ).toggle(); });</script>
348
-
349
- </div>
350
-
351
- <?php
352
-
353
- // Remove the line
354
- if( isset( $_POST['fixit'] ) ) {
355
- check_admin_referer( 'cau_fixit' );
356
- cau_removeErrorLine();
357
- }
358
-
359
- // Get wp-config location
360
- function cau_configFile() {
361
-
362
- // Config file
363
- if ( file_exists( ABSPATH . 'wp-config.php') ) {
364
- $conFile = ABSPATH . 'wp-config.php';
365
- } else {
366
- $conFile = dirname(ABSPATH) . '/wp-config.php';
367
- }
368
-
369
- return $conFile;
370
-
371
- }
372
-
373
- // Change the AUTOMATIC_UPDATER_DISABLED line
374
- function cau_removeErrorLine() {
375
-
376
- // Config file
377
- $conFile = cau_configFile();
378
-
379
- // Lines to check and replace
380
- $revLine = "define('AUTOMATIC_UPDATER_DISABLED', false);"; // We could just remove the line, but replacing it will be safer
381
- $posibleLines = array( "define( 'AUTOMATIC_UPDATER_DISABLED', true );", "define( 'AUTOMATIC_UPDATER_DISABLED', minor );" ); // The two base options
382
- foreach ( $posibleLines as $value ) array_push( $posibleLines, strtolower( $value ) ); // Support lowercase variants
383
- foreach ( $posibleLines as $value ) array_push( $posibleLines, str_replace( ' ', '', $value ) ); // For variants without spaces
384
-
385
- $melding = __( "We couldn't fix the error for you. Please contact us for further support", 'companion-auto-update' ).'.';
386
- $meldingS = 'error';
387
-
388
- // Check for each string if it exists
389
- foreach ( $posibleLines as $key => $string ) {
390
-
391
- if( strpos( file_get_contents( $conFile ), $string ) !== false) {
392
- $contents = file_get_contents( $conFile );
393
- $contents = str_replace( $string, $revLine, $contents );
394
- file_put_contents( $conFile, $contents );
395
- $melding = __( "We've fixed the error for you", 'companion-auto-update' ).' :)';
396
- $meldingS = 'updated';
397
- }
398
-
399
- }
400
-
401
- echo "<div id='message' class='$meldingS'><p><strong>$melding</strong></p></div>";
402
-
403
- }
404
-
405
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Define globals
4
+ global $wpdb;
5
+
6
+ // Define variables
7
+ $dateFormat = get_option( 'date_format' );
8
+ $dateFormat .= ' '.get_option( 'time_format' );
9
+ $table_name = $wpdb->prefix . "auto_updates";
10
+ $schedules = wp_get_schedules();
11
+ $interval_names = cau_wp_get_schedules();
12
+
13
+ // Update the database
14
+ if( isset( $_GET['run'] ) && $_GET['run'] == 'db_update' ) {
15
+ cau_manual_update();
16
+ echo '<div id="message" class="updated"><p><b>'.__( 'Database update completed' ).'</b></p></div>';
17
+ }
18
+
19
+ if( isset( $_GET['run'] ) && $_GET['run'] == 'db_info_update' ) {
20
+ cau_savePluginInformation();
21
+ echo '<div id="message" class="updated"><p><b>'.__( 'Database information update completed' ).'</b></p></div>';
22
+ }
23
+
24
+ if( isset( $_GET['ignore_report'] ) ) {
25
+
26
+ $report_to_ignore = sanitize_text_field( $_GET['ignore_report'] );
27
+ $allowedValues = array( 'seo', 'cron' );
28
+
29
+ if( !in_array( $report_to_ignore, $allowedValues ) ) {
30
+
31
+ wp_die( 'Trying to cheat eh?' );
32
+
33
+ } else {
34
+
35
+ $table_name = $wpdb->prefix . "auto_updates";
36
+ $wpdb->query( $wpdb->prepare( "UPDATE {$table_name} SET onoroff = %s WHERE name = 'ignore_$report_to_ignore'", 'yes' ) );
37
+ $__ignored = __( 'This report will now be ignored', 'companion-auto-update' );
38
+ echo "<div id='message' class='updated'><p><b>$__ignored</b></p></div>";
39
+
40
+ }
41
+
42
+ }
43
+
44
+ ?>
45
+
46
+
47
+
48
+ <div class="cau_status_page">
49
+
50
+ <?php
51
+
52
+ $events = array(
53
+ 0 => array(
54
+ 'name' => __( 'Events', 'companion-auto-update' ),
55
+ 'fields' => array(
56
+ 'plugins' => __( 'Plugins', 'companion-auto-update' ),
57
+ 'themes' => __( 'Themes', 'companion-auto-update' ),
58
+ 'minor' => __( 'Core (Minor)', 'companion-auto-update' ),
59
+ 'major' => __( 'Core (Major)', 'companion-auto-update' ),
60
+ 'send' => __( 'Update available', 'companion-auto-update' ),
61
+ 'sendupdate' => __( 'Successful update', 'companion-auto-update' ),
62
+ 'wpemails' => __( 'Core notifications', 'companion-auto-update' ),
63
+ 'update_delay' => __( 'Log updater', 'companion-auto-update' ),
64
+ ),
65
+ 'values' => array(
66
+ 'plugins' => 'wp_update_plugins',
67
+ 'themes' => 'wp_update_themes',
68
+ 'minor' => 'wp_version_check',
69
+ 'major' => 'wp_version_check',
70
+ 'send' => 'cau_set_schedule_mail',
71
+ 'sendupdate' => 'cau_set_schedule_mail',
72
+ 'wpemails' => 'cau_set_schedule_mail',
73
+ 'update_delay' => 'cau_log_updater',
74
+ ),
75
+ 'explain' => array(
76
+ 'plugins' => __('Auto update plugins?', 'companion-auto-update'),
77
+ 'themes' => __('Auto update themes?', 'companion-auto-update'),
78
+ 'minor' => __('Auto update minor core updates?', 'companion-auto-update'),
79
+ 'major' => __('Auto update major core updates?', 'companion-auto-update'),
80
+ 'send' => __( 'Will notify you of available updates.', 'companion-auto-update' ),
81
+ 'sendupdate' => __( 'Will notify you after successful updates.', 'companion-auto-update' ),
82
+ 'wpemails' => __( 'The default WordPress notifications.', 'companion-auto-update' ),
83
+ 'update_delay' => __( 'Will keep track of the update log and make sure updates are delayed when needed.', 'companion-auto-update' ),
84
+ )
85
+ ),
86
+ );
87
+
88
+ $__sta = __( 'Status', 'companion-auto-update' );
89
+ $__int = __( 'Interval', 'companion-auto-update' );
90
+ $__nxt = __( 'Next', 'companion-auto-update' );
91
+
92
+ foreach( $events as $event => $info ) {
93
+
94
+ echo "<table class='cau_status_list widefat striped'>
95
+
96
+ <thead>
97
+ <tr>
98
+ <th class='cau_status_name' colspan='2'><strong>{$info['name']}</strong></th>
99
+ <th class='cau_status_active_state'><strong>{$__sta}</strong></th>
100
+ <th class='cau_status_interval'><strong>{$__int}</strong></th>
101
+ <th class='cau_status_next'><strong>{$__nxt}</strong></th>
102
+ </tr>
103
+ </thead>
104
+
105
+ <tbody id='the-list'>";
106
+
107
+ foreach ( $info['fields'] as $key => $value ) {
108
+
109
+ $is_on = ( cau_get_db_value( $key ) == 'on' && wp_get_schedule( $info['values'][$key] ) ) ? true : false;
110
+ $__status = $is_on ? 'enabled' : 'warning';
111
+ $__icon = $is_on ? 'yes-alt' : 'marker';
112
+ $__text = $is_on ? __( 'Enabled', 'companion-auto-update' ) : __( 'Disabled', 'companion-auto-update' );
113
+ $__interval = $is_on ? $interval_names[wp_get_schedule( $info['values'][$key] )] : '&dash;';
114
+ $__next = $is_on ? date_i18n( $dateFormat, wp_next_scheduled( $info['values'][$key] ) ) : '&dash;';
115
+ $__exp = !empty( $info['explain'][$key] ) ? '<br /><small>'.$info['explain'][$key].'</small>' : '';
116
+ $__nxt = __( 'Next', 'companion-auto-update' );
117
+
118
+ echo "<tr>
119
+ <td class='cau_status_icon'><span class='dashicons dashicons-$__icon cau_$__status'></span></td>
120
+ <td class='cau_status_name'><strong>$value</strong>$__exp</td>
121
+ <td class='cau_status_active_state'><span class='cau_$__status'>$__text</span></td>
122
+ <td class='cau_status_interval'>$__interval</td>
123
+ <td class='cau_status_next'><span class='cau_mobile_prefix'>$__nxt: </span>$__next</td>
124
+ </tr>";
125
+
126
+ }
127
+
128
+ echo "</tbody>
129
+
130
+ </table>";
131
+
132
+ }
133
+
134
+ ?>
135
+
136
+ <table class="cau_status_list widefat striped cau_status_warnings">
137
+
138
+ <thead>
139
+ <tr>
140
+ <th class="cau_plugin_issue_name" colspan="5"><strong><?php _e( 'Status' ); ?></strong></th>
141
+ </tr>
142
+ </thead>
143
+
144
+ <tbody id="the-list">
145
+
146
+ <!-- checkAutomaticUpdaterDisabled -->
147
+ <tr>
148
+ <td class='cau_status_icon'><span class="dashicons dashicons-update"></span></td>
149
+ <td><?php _e( 'Auto updates', 'companion-auto-update' ); ?></td>
150
+ <?php if ( checkAutomaticUpdaterDisabled() ) { ?>
151
+ <td class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'All automatic updates are disabled', 'companion-auto-update' ); ?></span></td>
152
+ <td>
153
+ <form method="POST">
154
+ <?php wp_nonce_field( 'cau_fixit' ); ?>
155
+ <button type="submit" name="fixit" class="button button-primary"><?php _e( 'Fix it', 'companion-auto-update' ); ?></button>
156
+ <a href="https://codeermeneer.nl/documentation/known-issues-fixes/#updates_disabled" target="_blank" class="button"><?php _e( 'How to fix this', 'companion-auto-update' ); ?></a>
157
+ </form>
158
+ </td>
159
+ <?php } else { ?>
160
+ <td class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
161
+ <td></td>
162
+ <?php } ?>
163
+ <td></td>
164
+ </tr>
165
+
166
+ <!-- Connection with WP.org -->
167
+ <tr>
168
+ <td class='cau_status_icon'><span class="dashicons dashicons-wordpress"></span></td>
169
+ <td><?php _e( 'Connection with WordPress.org', 'companion-auto-update' ); ?></td>
170
+ <?php if( wp_http_supports( array( 'ssl' ) ) == '1' ) {
171
+ $__text = __( 'No issues detected', 'companion-auto-update' );
172
+ echo "<td colspan='3' class='cau_status_active_state'><span class='cau_enabled'><span class='dashicons dashicons-yes-alt'></span> $__text</span></td>";
173
+ } else {
174
+ $__text = __( 'Disabled', 'companion-auto-update' );
175
+ echo "<td colspan='3' class='cau_status_active_state'><span class='cau_disabled'><span class='dashicons dashicons-no'></span> $__text</span></td>";
176
+ }
177
+ ?>
178
+ </tr>
179
+
180
+ <!-- ignore_seo check -->
181
+ <tr <?php if( cau_get_db_value( 'ignore_seo' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
182
+ <td class='cau_status_icon'><span class="dashicons dashicons-search"></span></td>
183
+ <td><?php _e( 'Search Engine Visibility', 'companion-auto-update' ); ?></td>
184
+ <?php if( get_option( 'blog_public' ) == 0 ) { ?>
185
+ <td colspan="2" class="cau_status_active_state">
186
+ <span class='cau_warning'><span class="dashicons dashicons-warning"></span></span>
187
+ <?php _e( 'You’ve chosen to discourage Search Engines from indexing your site. Auto-updating works best on sites with more traffic, consider enabling indexing for your site.', 'companion-auto-update' ); ?>
188
+ </td>
189
+ <td>
190
+ <a href="<?php echo admin_url( 'options-reading.php' ); ?>" class="button"><?php _e( 'Fix it', 'companion-auto-update' ); ?></a>
191
+ <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=seo" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
192
+ </td>
193
+ <?php } else { ?>
194
+ <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
195
+ <?php } ?>
196
+ </tr>
197
+
198
+ <!-- ignore_cron check -->
199
+ <tr <?php if( cau_get_db_value( 'ignore_cron' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
200
+ <td class='cau_status_icon'><span class="dashicons dashicons-admin-generic"></span></td>
201
+ <td><?php _e( 'Cronjobs', 'companion-auto-update' ); ?></td>
202
+ <?php if( checkCronjobsDisabled() ) { ?>
203
+ <td class="cau_status_active_state"><span class='cau_warning'><span class="dashicons dashicons-warning"></span> <?php _e( 'Disabled', 'companion-auto-update' ); ?></span></td>
204
+ <td><code>DISABLE_WP_CRON true</code></td>
205
+ <td>
206
+ <a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a>
207
+ <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=cron" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
208
+ </td>
209
+ <?php } else { ?>
210
+ <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
211
+ <?php } ?>
212
+ </tr>
213
+
214
+ <!-- wp_version_check -->
215
+ <tr>
216
+ <td class='cau_status_icon'><span class="dashicons dashicons-wordpress-alt"></span></td>
217
+ <td>wp_version_check</td>
218
+ <?php if ( !has_filter( 'wp_version_check', 'wp_version_check' ) ) { ?>
219
+ <td colspan="2" class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'A plugin has prevented updates by disabling wp_version_check', 'companion-auto-update' ); ?></span></td>
220
+ <td><a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a></td>
221
+ <?php } else { ?>
222
+ <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected' , 'companion-auto-update' ); ?></span></td>
223
+ <?php } ?>
224
+ </tr>
225
+
226
+ <!-- VCD -->
227
+ <tr>
228
+ <td class='cau_status_icon'><span class="dashicons dashicons-open-folder"></span></td>
229
+ <td>VCS</td>
230
+ <td colspan="3" class="cau_status_active_state"><span class='cau_<?php echo cau_test_is_vcs_checkout( ABSPATH )['status']; ?>'><span class="dashicons dashicons-<?php echo cau_test_is_vcs_checkout( ABSPATH )['icon']; ?>"></span> <?php echo cau_test_is_vcs_checkout( ABSPATH )['description']; ?></span></td>
231
+ </tr>
232
+
233
+ </tbody>
234
+
235
+ </table>
236
+
237
+ <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
238
+ <thead>
239
+ <tr>
240
+ <th colspan="5"><strong><?php _e( 'Systeminfo', 'companion-auto-update' ); ?></strong></th>
241
+ </tr>
242
+ </thead>
243
+
244
+ <tbody id="the-list">
245
+
246
+ <tr>
247
+ <td class='cau_status_icon'><span class="dashicons dashicons-wordpress"></span></td>
248
+ <td>WordPress</td>
249
+ <td><?php echo get_bloginfo( 'version' ); ?></td>
250
+ <td></td>
251
+ <td></td>
252
+ </tr>
253
+
254
+ <tr <?php if( version_compare( PHP_VERSION, '5.1.0', '<' ) ) { echo "class='inactive'"; } ?>>
255
+ <td class='cau_status_icon'><span class="dashicons dashicons-media-code"></span></td>
256
+ <td>PHP</td>
257
+ <td><?php echo phpversion(); ?> <code>(Required: 5.1.0 or up)</code></td>
258
+ <td></td>
259
+ <td></td>
260
+ </tr>
261
+
262
+ <tr <?php if( cau_incorrectDatabaseVersion() ) { echo "class='inactive'"; } ?>>
263
+ <td class='cau_status_icon'><span class="dashicons dashicons-database"></span></td>
264
+ <td>Database</td>
265
+ <td><?php echo get_option( "cau_db_version" ); ?> <code>(Latest: <?php echo cau_db_version(); ?>)</code></td>
266
+ <td></td>
267
+ <td></td>
268
+ </tr>
269
+
270
+ <tr>
271
+ <td class='cau_status_icon'><span class="dashicons dashicons-calendar"></span></td>
272
+ <td class="cau_status_name"><?php _e( 'Timezone' ); ?></td>
273
+ <td class="cau_status_active_state"><?php echo cau_get_proper_timezone(); ?> (GMT <?php echo get_option('gmt_offset'); ?>) - <?php echo date_default_timezone_get(); ?></td>
274
+ <td></td>
275
+ <td></td>
276
+ </tr>
277
+
278
+ </tbody>
279
+
280
+ </table>
281
+
282
+ <?php
283
+
284
+ // If has incomptable plugins
285
+ if( cau_incompatiblePlugins() ) { ?>
286
+
287
+ <table class="cau_status_list no_column_width widefat striped cau_status_warnings">
288
+ <thead>
289
+ <tr>
290
+ <th class="cau_plugin_issue_name" colspan="4"><strong><?php _e( 'Possible plugin issues', 'companion-auto-update' ); ?></strong></th>
291
+ </tr>
292
+ </thead>
293
+
294
+ <tbody id="the-list">
295
+ <?php
296
+
297
+ foreach ( cau_incompatiblePluginlist() as $key => $value ) {
298
+ if( is_plugin_active( $key ) ) {
299
+ echo '<tr>
300
+ <td class="cau_plugin_issue_name"><strong>'.$key.'</strong></td>
301
+ <td colspan="2" class="cau_plugin_issue_explain">'.$value.'</td>
302
+ <td class="cau_plugin_issue_fixit"><a href="https://codeermeneer.nl/documentation/known-issues-fixes/#plugins" target="_blank" class="button">'.__( 'How to fix this', 'companion-auto-update' ).'</a></td>
303
+ </tr>';
304
+ }
305
+ }
306
+
307
+ ?>
308
+ </tbody>
309
+
310
+ </table>
311
+
312
+ <?php } ?>
313
+
314
+ <!-- Advanced info -->
315
+ <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
316
+
317
+ <thead>
318
+ <tr>
319
+ <th><strong><?php _e( 'Advanced info', 'companion-auto-update' ); ?></strong> &dash; <?php _e( 'For when you need our help fixing an issue.', 'companion-auto-update' ); ?></th>
320
+ </tr>
321
+ </thead>
322
+
323
+ <tbody id="the-list">
324
+ <tr>
325
+ <td>
326
+ <div class='button button-primary toggle_advanced_button'><?php _e( 'Toggle', 'companion-auto-update' ); ?></div>
327
+ <div class='toggle_advanced_content' style='display: none;'>
328
+ <?php
329
+ $cau_configs = $wpdb->get_results( "SELECT * FROM $table_name" );
330
+ array_push( $cau_configs, "WordPress: ".get_bloginfo( 'version' ) );
331
+ array_push( $cau_configs, "PHP: ".phpversion() );
332
+ array_push( $cau_configs, "DB: ".get_option( "cau_db_version" ).' / '.cau_db_version() );
333
+ echo "<textarea style='width: 100%; height: 750px;'>";
334
+ print_r( $cau_configs );
335
+ echo "</textarea>";
336
+ ?>
337
+ </div>
338
+ </td>
339
+ </tr>
340
+ </tbody>
341
+
342
+ </table>
343
+
344
+ <script>jQuery( '.toggle_advanced_button' ).click( function() { jQuery( '.toggle_advanced_content' ).toggle(); });</script>
345
+
346
+ <!-- Delay updates -->
347
+ <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
348
+
349
+ <thead>
350
+ <tr>
351
+ <th><strong><?php _e( 'Delay updates', 'companion-auto-update' ); ?></strong> &dash; <?php echo ( cau_get_db_value( 'update_delay' ) == 'on' ) ? __( 'Enabled', 'companion-auto-update' ).' ('.sprintf( esc_html__( '%s days', 'companion-auto-update' ).')', cau_get_db_value( 'update_delay_days' ) ) : __( 'Disabled', 'companion-auto-update' ); ?></th>
352
+ <th><?php _e( 'Till', 'companion-auto-update' ); ?></th>
353
+ </tr>
354
+ </thead>
355
+
356
+ <tbody id="the-list">
357
+ <?php
358
+
359
+ $updateLog = "{$wpdb->prefix}update_log";
360
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
361
+
362
+ foreach ( $put_on_hold as $plugin ) {
363
+
364
+ $__name = $plugin->slug;
365
+ $__poh = $plugin->put_on_hold;
366
+ $__udd = ( cau_get_db_value( 'update_delay_days' ) != '' ) ? cau_get_db_value( 'update_delay_days' ) : '2';
367
+ $__date = date_i18n( $dateFormat, strtotime( "+".$__udd." days", $__poh ) );
368
+
369
+ echo "<tr>
370
+ <td>{$__name}</td>
371
+ <td>{$__date}</td>
372
+ </tr>";
373
+ }
374
+
375
+ echo empty( $put_on_hold ) ? "<tr><td>".__( 'No plugins have been put on hold.', 'companion-auto-update' )."</td></tr>" : "";
376
+
377
+ ?>
378
+ </tbody>
379
+
380
+ </table>
381
+
382
+ </div>
383
+
384
+ <?php
385
+ // Remove the line
386
+ if( isset( $_POST['fixit'] ) ) {
387
+ check_admin_referer( 'cau_fixit' );
388
+ cau_removeErrorLine();
389
+ }
390
+
391
+ // Get wp-config location
392
+ function cau_configFile() {
393
+
394
+ // Config file
395
+ if ( file_exists( ABSPATH . 'wp-config.php') ) {
396
+ $conFile = ABSPATH . 'wp-config.php';
397
+ } else {
398
+ $conFile = dirname(ABSPATH) . '/wp-config.php';
399
+ }
400
+
401
+ return $conFile;
402
+
403
+ }
404
+
405
+ // Change the AUTOMATIC_UPDATER_DISABLED line
406
+ function cau_removeErrorLine() {
407
+
408
+ // Config file
409
+ $conFile = cau_configFile();
410
+
411
+ // Lines to check and replace
412
+ $revLine = "define('AUTOMATIC_UPDATER_DISABLED', false);"; // We could just remove the line, but replacing it will be safer
413
+ $posibleLines = array( "define( 'AUTOMATIC_UPDATER_DISABLED', true );", "define( 'AUTOMATIC_UPDATER_DISABLED', minor );" ); // The two base options
414
+ foreach ( $posibleLines as $value ) array_push( $posibleLines, strtolower( $value ) ); // Support lowercase variants
415
+ foreach ( $posibleLines as $value ) array_push( $posibleLines, str_replace( ' ', '', $value ) ); // For variants without spaces
416
+
417
+ $melding = __( "We couldn't fix the error for you. Please contact us for further support", 'companion-auto-update' ).'.';
418
+ $meldingS = 'error';
419
+
420
+ // Check for each string if it exists
421
+ foreach ( $posibleLines as $key => $string ) {
422
+
423
+ if( strpos( file_get_contents( $conFile ), $string ) !== false) {
424
+ $contents = file_get_contents( $conFile );
425
+ $contents = str_replace( $string, $revLine, $contents );
426
+ file_put_contents( $conFile, $contents );
427
+ $melding = __( "We've fixed the error for you", 'companion-auto-update' ).' :)';
428
+ $meldingS = 'updated';
429
+ }
430
+
431
+ }
432
+
433
+ echo "<div id='message' class='$meldingS'><p><strong>$melding</strong></p></div>";
434
+
435
+ }
backend/images/check.svg CHANGED
@@ -1,55 +1,55 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- height="417pt"
11
- viewBox="0 -46 417.81333 417"
12
- width="417pt"
13
- version="1.1"
14
- id="svg4"
15
- sodipodi:docname="check.svg"
16
- inkscape:version="0.92.0 r15299">
17
- <metadata
18
- id="metadata10">
19
- <rdf:RDF>
20
- <cc:Work
21
- rdf:about="">
22
- <dc:format>image/svg+xml</dc:format>
23
- <dc:type
24
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
- </cc:Work>
26
- </rdf:RDF>
27
- </metadata>
28
- <defs
29
- id="defs8" />
30
- <sodipodi:namedview
31
- pagecolor="#ffffff"
32
- bordercolor="#666666"
33
- borderopacity="1"
34
- objecttolerance="10"
35
- gridtolerance="10"
36
- guidetolerance="10"
37
- inkscape:pageopacity="0"
38
- inkscape:pageshadow="2"
39
- inkscape:window-width="2560"
40
- inkscape:window-height="1017"
41
- id="namedview6"
42
- showgrid="false"
43
- inkscape:zoom="0.42446043"
44
- inkscape:cx="278"
45
- inkscape:cy="278"
46
- inkscape:window-x="-8"
47
- inkscape:window-y="-8"
48
- inkscape:window-maximized="1"
49
- inkscape:current-layer="svg4" />
50
- <path
51
- d="m 185.111,248.00297 c -2.2287,2.2418 -5.26943,3.49257 -8.42804,3.49257 -3.15861,0 -6.19935,-1.25077 -8.42805,-3.49257 l -67.30869,-67.31961 c -6.985172,-6.98517 -6.985172,-18.31207 0,-25.28413 l 8.42805,-8.43023 c 6.98735,-6.98518 18.30114,-6.98518 25.28632,0 l 42.02237,42.02454 113.55053,-113.552722 c 6.98736,-6.985172 18.31207,-6.985172 25.28633,0 l 8.42805,8.43023 c 6.98516,6.985175 6.98516,18.309882 0,25.284142 z m 0,0"
52
- id="path2"
53
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.55881381"
54
- inkscape:connector-curvature="0" />
55
- </svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4
+ xmlns:cc="http://creativecommons.org/ns#"
5
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
+ xmlns:svg="http://www.w3.org/2000/svg"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
+ height="417pt"
11
+ viewBox="0 -46 417.81333 417"
12
+ width="417pt"
13
+ version="1.1"
14
+ id="svg4"
15
+ sodipodi:docname="check.svg"
16
+ inkscape:version="0.92.0 r15299">
17
+ <metadata
18
+ id="metadata10">
19
+ <rdf:RDF>
20
+ <cc:Work
21
+ rdf:about="">
22
+ <dc:format>image/svg+xml</dc:format>
23
+ <dc:type
24
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
+ </cc:Work>
26
+ </rdf:RDF>
27
+ </metadata>
28
+ <defs
29
+ id="defs8" />
30
+ <sodipodi:namedview
31
+ pagecolor="#ffffff"
32
+ bordercolor="#666666"
33
+ borderopacity="1"
34
+ objecttolerance="10"
35
+ gridtolerance="10"
36
+ guidetolerance="10"
37
+ inkscape:pageopacity="0"
38
+ inkscape:pageshadow="2"
39
+ inkscape:window-width="2560"
40
+ inkscape:window-height="1017"
41
+ id="namedview6"
42
+ showgrid="false"
43
+ inkscape:zoom="0.42446043"
44
+ inkscape:cx="278"
45
+ inkscape:cy="278"
46
+ inkscape:window-x="-8"
47
+ inkscape:window-y="-8"
48
+ inkscape:window-maximized="1"
49
+ inkscape:current-layer="svg4" />
50
+ <path
51
+ d="m 185.111,248.00297 c -2.2287,2.2418 -5.26943,3.49257 -8.42804,3.49257 -3.15861,0 -6.19935,-1.25077 -8.42805,-3.49257 l -67.30869,-67.31961 c -6.985172,-6.98517 -6.985172,-18.31207 0,-25.28413 l 8.42805,-8.43023 c 6.98735,-6.98518 18.30114,-6.98518 25.28632,0 l 42.02237,42.02454 113.55053,-113.552722 c 6.98736,-6.985172 18.31207,-6.985172 25.28633,0 l 8.42805,8.43023 c 6.98516,6.985175 6.98516,18.309882 0,25.284142 z m 0,0"
52
+ id="path2"
53
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.55881381"
54
+ inkscape:connector-curvature="0" />
55
+ </svg>
backend/images/email.svg CHANGED
@@ -1,96 +1,96 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="email.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.6608998"
38
- inkscape:cx="-110.05455"
39
- inkscape:cy="410.34145"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1"
44
- borderlayer="true" /><path
45
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
46
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
47
- id="path2"
48
- inkscape:connector-curvature="0" /><g
49
- id="g8"
50
- transform="scale(1.3026177)" /><g
51
- id="g10"
52
- transform="scale(1.3026177)" /><g
53
- id="g12"
54
- transform="scale(1.3026177)" /><g
55
- id="g14"
56
- transform="scale(1.3026177)" /><g
57
- id="g16"
58
- transform="scale(1.3026177)" /><g
59
- id="g18"
60
- transform="scale(1.3026177)" /><g
61
- id="g20"
62
- transform="scale(1.3026177)" /><g
63
- id="g22"
64
- transform="scale(1.3026177)" /><g
65
- id="g24"
66
- transform="scale(1.3026177)" /><g
67
- id="g26"
68
- transform="scale(1.3026177)" /><g
69
- id="g28"
70
- transform="scale(1.3026177)" /><g
71
- id="g30"
72
- transform="scale(1.3026177)" /><g
73
- id="g32"
74
- transform="scale(1.3026177)" /><g
75
- id="g34"
76
- transform="scale(1.3026177)" /><g
77
- id="g36"
78
- transform="scale(1.3026177)" /><path
79
- inkscape:connector-curvature="0"
80
- d="m 281.76716,529.19554 c 27.99462,9.77382 58.38437,-1.99616 72.99376,-26.55557 L 241.14037,462.9714 c -3.82831,28.32342 12.63218,56.45033 40.62679,66.22414 z m 0,0"
81
- id="path4"
82
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
83
- inkscape:connector-curvature="0"
84
- d="m 454.97461,381.50764 c -0.0736,-0.0257 -0.11887,-0.0415 -0.18687,-0.0653 -59.67543,-20.8346 -91.29336,-86.33378 -70.45084,-146.03188 5.72511,-16.39813 14.92428,-30.59236 26.36198,-42.26448 -3.29602,-1.51283 -6.65995,-2.92233 -10.15928,-4.14406 -59.766,-20.86622 -125.15573,10.65649 -146.03184,70.45084 l -15.05215,43.11307 c -10.68122,30.59363 -34.17187,54.79029 -64.63445,66.47768 -10.17733,3.96817 -17.38414,13.4202 -18.20325,24.79116 -0.9164,13.28721 8.329,25.17993 20.89938,29.56865 l 251.64586,87.85762 c 13.1706,4.59829 28.58431,0.40642 35.75467,-11.56127 5.54241,-9.2518 5.48702,-20.48337 0.002,-29.68445 -15.90548,-26.7325 -19.22019,-58.96007 -9.94599,-88.50764 z m 0,0"
85
- id="path6"
86
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
87
- inkscape:connector-curvature="0"
88
- d="m 569.88056,300.18973 c -14.90587,42.69409 -61.59697,65.2195 -104.29102,50.31364 -42.69409,-14.90587 -65.21947,-61.59696 -50.3136,-104.29106 14.90586,-42.69403 61.59693,-65.21944 104.29101,-50.31357 42.69406,14.90586 65.21947,61.59694 50.31361,104.29099 z m 0,0"
89
- id="path8"
90
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><rect
91
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
92
- id="rect4504"
93
- width="768.56519"
94
- height="678.05548"
95
- x="-61.99469"
96
  y="-11.059112" /></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 505 505"
17
+ style="enable-background:new 0 0 505 505;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="email.svg"
20
+ inkscape:version="0.92.0 r15299"><metadata
21
+ id="metadata43"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs41" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1017"
35
+ id="namedview39"
36
+ showgrid="false"
37
+ inkscape:zoom="0.6608998"
38
+ inkscape:cx="-110.05455"
39
+ inkscape:cy="410.34145"
40
+ inkscape:window-x="-8"
41
+ inkscape:window-y="-8"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1"
44
+ borderlayer="true" /><path
45
+ style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
46
+ d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
47
+ id="path2"
48
+ inkscape:connector-curvature="0" /><g
49
+ id="g8"
50
+ transform="scale(1.3026177)" /><g
51
+ id="g10"
52
+ transform="scale(1.3026177)" /><g
53
+ id="g12"
54
+ transform="scale(1.3026177)" /><g
55
+ id="g14"
56
+ transform="scale(1.3026177)" /><g
57
+ id="g16"
58
+ transform="scale(1.3026177)" /><g
59
+ id="g18"
60
+ transform="scale(1.3026177)" /><g
61
+ id="g20"
62
+ transform="scale(1.3026177)" /><g
63
+ id="g22"
64
+ transform="scale(1.3026177)" /><g
65
+ id="g24"
66
+ transform="scale(1.3026177)" /><g
67
+ id="g26"
68
+ transform="scale(1.3026177)" /><g
69
+ id="g28"
70
+ transform="scale(1.3026177)" /><g
71
+ id="g30"
72
+ transform="scale(1.3026177)" /><g
73
+ id="g32"
74
+ transform="scale(1.3026177)" /><g
75
+ id="g34"
76
+ transform="scale(1.3026177)" /><g
77
+ id="g36"
78
+ transform="scale(1.3026177)" /><path
79
+ inkscape:connector-curvature="0"
80
+ d="m 281.76716,529.19554 c 27.99462,9.77382 58.38437,-1.99616 72.99376,-26.55557 L 241.14037,462.9714 c -3.82831,28.32342 12.63218,56.45033 40.62679,66.22414 z m 0,0"
81
+ id="path4"
82
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
83
+ inkscape:connector-curvature="0"
84
+ d="m 454.97461,381.50764 c -0.0736,-0.0257 -0.11887,-0.0415 -0.18687,-0.0653 -59.67543,-20.8346 -91.29336,-86.33378 -70.45084,-146.03188 5.72511,-16.39813 14.92428,-30.59236 26.36198,-42.26448 -3.29602,-1.51283 -6.65995,-2.92233 -10.15928,-4.14406 -59.766,-20.86622 -125.15573,10.65649 -146.03184,70.45084 l -15.05215,43.11307 c -10.68122,30.59363 -34.17187,54.79029 -64.63445,66.47768 -10.17733,3.96817 -17.38414,13.4202 -18.20325,24.79116 -0.9164,13.28721 8.329,25.17993 20.89938,29.56865 l 251.64586,87.85762 c 13.1706,4.59829 28.58431,0.40642 35.75467,-11.56127 5.54241,-9.2518 5.48702,-20.48337 0.002,-29.68445 -15.90548,-26.7325 -19.22019,-58.96007 -9.94599,-88.50764 z m 0,0"
85
+ id="path6"
86
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
87
+ inkscape:connector-curvature="0"
88
+ d="m 569.88056,300.18973 c -14.90587,42.69409 -61.59697,65.2195 -104.29102,50.31364 -42.69409,-14.90587 -65.21947,-61.59696 -50.3136,-104.29106 14.90586,-42.69403 61.59693,-65.21944 104.29101,-50.31357 42.69406,14.90586 65.21947,61.59694 50.31361,104.29099 z m 0,0"
89
+ id="path8"
90
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><rect
91
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
92
+ id="rect4504"
93
+ width="768.56519"
94
+ height="678.05548"
95
+ x="-61.99469"
96
  y="-11.059112" /></svg>
backend/images/help.svg CHANGED
@@ -1,67 +1,67 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- height="512pt"
11
- viewBox="0 0 512 512"
12
- width="512pt"
13
- version="1.1"
14
- id="svg6"
15
- sodipodi:docname="help.svg"
16
- inkscape:version="0.92.0 r15299">
17
- <metadata
18
- id="metadata12">
19
- <rdf:RDF>
20
- <cc:Work
21
- rdf:about="">
22
- <dc:format>image/svg+xml</dc:format>
23
- <dc:type
24
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
- </cc:Work>
26
- </rdf:RDF>
27
- </metadata>
28
- <defs
29
- id="defs10" />
30
- <sodipodi:namedview
31
- pagecolor="#ffffff"
32
- bordercolor="#666666"
33
- borderopacity="1"
34
- objecttolerance="10"
35
- gridtolerance="10"
36
- guidetolerance="10"
37
- inkscape:pageopacity="0"
38
- inkscape:pageshadow="2"
39
- inkscape:window-width="2560"
40
- inkscape:window-height="1017"
41
- id="namedview8"
42
- showgrid="false"
43
- inkscape:zoom="0.69140625"
44
- inkscape:cx="132.67442"
45
- inkscape:cy="151.29307"
46
- inkscape:window-x="1912"
47
- inkscape:window-y="-8"
48
- inkscape:window-maximized="1"
49
- inkscape:current-layer="svg6" />
50
- <path
51
- d="m 494.10169,605.28813 h -320 c -53.02344,0 -95.999997,-42.97656 -95.999997,-96 v -320 c 0,-53.02344 42.976557,-95.999997 95.999997,-95.999997 h 320 c 53.02344,0 96,42.976557 96,95.999997 v 320 c 0,53.02344 -42.97656,96 -96,96 z m 0,0"
52
- id="path2"
53
- style="fill:#ded1f2;fill-opacity:1"
54
- inkscape:connector-curvature="0" />
55
- <path
56
- d="m 334.10169,221.28813 c -70.57422,0 -128,57.42578 -128,128 0,70.57422 57.42578,128 128,128 70.57422,0 128,-57.42578 128,-128 0,-70.57422 -57.42578,-128 -128,-128 z m 56,138.67188 h -45.32812 v 45.32812 c 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 v -45.32812 h -45.32813 c -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 h 45.32813 v -45.32813 c 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 5.88672,0 10.67188,4.78515 10.67188,10.67187 v 45.32813 h 45.32812 c 5.88672,0 10.67188,4.78515 10.67188,10.67187 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 z m 0,0"
57
- id="path4"
58
- style="fill:#9178b7;fill-opacity:1"
59
- inkscape:connector-curvature="0" />
60
- <rect
61
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:4.51278925;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
62
- id="rect4504"
63
- width="614.39001"
64
- height="545.42297"
65
- x="38.296513"
66
- y="74.407166" />
67
- </svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4
+ xmlns:cc="http://creativecommons.org/ns#"
5
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
+ xmlns:svg="http://www.w3.org/2000/svg"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
+ height="512pt"
11
+ viewBox="0 0 512 512"
12
+ width="512pt"
13
+ version="1.1"
14
+ id="svg6"
15
+ sodipodi:docname="help.svg"
16
+ inkscape:version="0.92.0 r15299">
17
+ <metadata
18
+ id="metadata12">
19
+ <rdf:RDF>
20
+ <cc:Work
21
+ rdf:about="">
22
+ <dc:format>image/svg+xml</dc:format>
23
+ <dc:type
24
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
+ </cc:Work>
26
+ </rdf:RDF>
27
+ </metadata>
28
+ <defs
29
+ id="defs10" />
30
+ <sodipodi:namedview
31
+ pagecolor="#ffffff"
32
+ bordercolor="#666666"
33
+ borderopacity="1"
34
+ objecttolerance="10"
35
+ gridtolerance="10"
36
+ guidetolerance="10"
37
+ inkscape:pageopacity="0"
38
+ inkscape:pageshadow="2"
39
+ inkscape:window-width="2560"
40
+ inkscape:window-height="1017"
41
+ id="namedview8"
42
+ showgrid="false"
43
+ inkscape:zoom="0.69140625"
44
+ inkscape:cx="132.67442"
45
+ inkscape:cy="151.29307"
46
+ inkscape:window-x="1912"
47
+ inkscape:window-y="-8"
48
+ inkscape:window-maximized="1"
49
+ inkscape:current-layer="svg6" />
50
+ <path
51
+ d="m 494.10169,605.28813 h -320 c -53.02344,0 -95.999997,-42.97656 -95.999997,-96 v -320 c 0,-53.02344 42.976557,-95.999997 95.999997,-95.999997 h 320 c 53.02344,0 96,42.976557 96,95.999997 v 320 c 0,53.02344 -42.97656,96 -96,96 z m 0,0"
52
+ id="path2"
53
+ style="fill:#ded1f2;fill-opacity:1"
54
+ inkscape:connector-curvature="0" />
55
+ <path
56
+ d="m 334.10169,221.28813 c -70.57422,0 -128,57.42578 -128,128 0,70.57422 57.42578,128 128,128 70.57422,0 128,-57.42578 128,-128 0,-70.57422 -57.42578,-128 -128,-128 z m 56,138.67188 h -45.32812 v 45.32812 c 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 v -45.32812 h -45.32813 c -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 h 45.32813 v -45.32813 c 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 5.88672,0 10.67188,4.78515 10.67188,10.67187 v 45.32813 h 45.32812 c 5.88672,0 10.67188,4.78515 10.67188,10.67187 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 z m 0,0"
57
+ id="path4"
58
+ style="fill:#9178b7;fill-opacity:1"
59
+ inkscape:connector-curvature="0" />
60
+ <rect
61
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:4.51278925;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
62
+ id="rect4504"
63
+ width="614.39001"
64
+ height="545.42297"
65
+ x="38.296513"
66
+ y="74.407166" />
67
+ </svg>
backend/images/interval.svg CHANGED
@@ -1,69 +1,69 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512 512"
17
- style="enable-background:new 0 0 512 512;"
18
- xml:space="preserve"
19
- width="512"
20
- height="512"
21
- sodipodi:docname="interval.svg"
22
- inkscape:version="0.92.0 r15299"><metadata
23
- id="metadata39"><rdf:RDF><cc:Work
24
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
25
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
26
- id="defs37" /><sodipodi:namedview
27
- pagecolor="#ffffff"
28
- bordercolor="#666666"
29
- borderopacity="1"
30
- objecttolerance="10"
31
- gridtolerance="10"
32
- guidetolerance="10"
33
- inkscape:pageopacity="0"
34
- inkscape:pageshadow="2"
35
- inkscape:window-width="2560"
36
- inkscape:window-height="1017"
37
- id="namedview35"
38
- showgrid="false"
39
- inkscape:zoom="0.46093749"
40
- inkscape:cx="369.01074"
41
- inkscape:cy="360.3966"
42
- inkscape:window-x="1912"
43
- inkscape:window-y="-8"
44
- inkscape:window-maximized="1"
45
- inkscape:current-layer="g32" /><g
46
- id="g32"><circle
47
- cx="388.33899"
48
- cy="373.15256"
49
- r="326.50848"
50
- id="circle2"
51
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.27542377" /><path
52
- d="m 388.33899,124.4449 c -137.13356,0 -248.70763,111.57407 -248.70763,248.70763 0,137.13356 111.57407,249.98305 248.70763,249.98305 137.13356,0 248.70763,-112.84949 248.70763,-249.98305 0,-137.13356 -111.57407,-248.70763 -248.70763,-248.70763 z"
53
- id="path6"
54
- inkscape:connector-curvature="0"
55
- style="fill:#eceff1;fill-opacity:1;stroke-width:1.27542377" /><path
56
- d="m 388.33899,200.97033 c -10.57454,0 -19.13136,8.55682 -19.13136,19.13135 v 191.31356 c 0,10.57454 8.55682,19.13136 19.13136,19.13136 10.57454,0 19.13135,-8.55682 19.13135,-19.13136 V 220.10168 c 0,-10.57453 -8.55681,-19.13135 -19.13135,-19.13135 z"
57
- id="path10"
58
- inkscape:connector-curvature="0"
59
- style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><path
60
- d="M 503.12712,354.02118 H 388.33899 350.07628 c -10.57454,0 -19.13136,8.55681 -19.13136,19.13135 0,10.57454 8.55682,19.13136 19.13136,19.13136 h 38.26271 114.78813 c 10.57454,0 19.13136,-8.55682 19.13136,-19.13136 0,-10.57454 -8.55682,-19.13135 -19.13136,-19.13135 z"
61
- id="path14"
62
- inkscape:connector-curvature="0"
63
- style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><rect
64
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
65
- id="rect4504"
66
- width="768.56519"
67
- height="678.05548"
68
- x="-17.638517"
69
  y="36.294277" /></g></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 512 512"
17
+ style="enable-background:new 0 0 512 512;"
18
+ xml:space="preserve"
19
+ width="512"
20
+ height="512"
21
+ sodipodi:docname="interval.svg"
22
+ inkscape:version="0.92.0 r15299"><metadata
23
+ id="metadata39"><rdf:RDF><cc:Work
24
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
25
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
26
+ id="defs37" /><sodipodi:namedview
27
+ pagecolor="#ffffff"
28
+ bordercolor="#666666"
29
+ borderopacity="1"
30
+ objecttolerance="10"
31
+ gridtolerance="10"
32
+ guidetolerance="10"
33
+ inkscape:pageopacity="0"
34
+ inkscape:pageshadow="2"
35
+ inkscape:window-width="2560"
36
+ inkscape:window-height="1017"
37
+ id="namedview35"
38
+ showgrid="false"
39
+ inkscape:zoom="0.46093749"
40
+ inkscape:cx="369.01074"
41
+ inkscape:cy="360.3966"
42
+ inkscape:window-x="1912"
43
+ inkscape:window-y="-8"
44
+ inkscape:window-maximized="1"
45
+ inkscape:current-layer="g32" /><g
46
+ id="g32"><circle
47
+ cx="388.33899"
48
+ cy="373.15256"
49
+ r="326.50848"
50
+ id="circle2"
51
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.27542377" /><path
52
+ d="m 388.33899,124.4449 c -137.13356,0 -248.70763,111.57407 -248.70763,248.70763 0,137.13356 111.57407,249.98305 248.70763,249.98305 137.13356,0 248.70763,-112.84949 248.70763,-249.98305 0,-137.13356 -111.57407,-248.70763 -248.70763,-248.70763 z"
53
+ id="path6"
54
+ inkscape:connector-curvature="0"
55
+ style="fill:#eceff1;fill-opacity:1;stroke-width:1.27542377" /><path
56
+ d="m 388.33899,200.97033 c -10.57454,0 -19.13136,8.55682 -19.13136,19.13135 v 191.31356 c 0,10.57454 8.55682,19.13136 19.13136,19.13136 10.57454,0 19.13135,-8.55682 19.13135,-19.13136 V 220.10168 c 0,-10.57453 -8.55681,-19.13135 -19.13135,-19.13135 z"
57
+ id="path10"
58
+ inkscape:connector-curvature="0"
59
+ style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><path
60
+ d="M 503.12712,354.02118 H 388.33899 350.07628 c -10.57454,0 -19.13136,8.55681 -19.13136,19.13135 0,10.57454 8.55682,19.13136 19.13136,19.13136 h 38.26271 114.78813 c 10.57454,0 19.13136,-8.55682 19.13136,-19.13136 0,-10.57454 -8.55682,-19.13135 -19.13136,-19.13135 z"
61
+ id="path14"
62
+ inkscape:connector-curvature="0"
63
+ style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><rect
64
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
65
+ id="rect4504"
66
+ width="768.56519"
67
+ height="678.05548"
68
+ x="-17.638517"
69
  y="36.294277" /></g></svg>
backend/images/love.svg CHANGED
@@ -1,116 +1,116 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- id="Capa_1"
11
- enable-background="new 0 0 512 512"
12
- height="512"
13
- viewBox="0 0 512 512"
14
- width="512"
15
- version="1.1"
16
- sodipodi:docname="love.svg"
17
- inkscape:version="0.92.0 r15299">
18
- <metadata
19
- id="metadata97">
20
- <rdf:RDF>
21
- <cc:Work
22
- rdf:about="">
23
- <dc:format>image/svg+xml</dc:format>
24
- <dc:type
25
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
26
- </cc:Work>
27
- </rdf:RDF>
28
- </metadata>
29
- <defs
30
- id="defs95" />
31
- <sodipodi:namedview
32
- pagecolor="#ffffff"
33
- bordercolor="#666666"
34
- borderopacity="1"
35
- objecttolerance="10"
36
- gridtolerance="10"
37
- guidetolerance="10"
38
- inkscape:pageopacity="0"
39
- inkscape:pageshadow="2"
40
- inkscape:window-width="2560"
41
- inkscape:window-height="1017"
42
- id="namedview93"
43
- showgrid="false"
44
- inkscape:zoom="0.4609375"
45
- inkscape:cx="-161.41471"
46
- inkscape:cy="87.761635"
47
- inkscape:window-x="1912"
48
- inkscape:window-y="-8"
49
- inkscape:window-maximized="1"
50
- inkscape:current-layer="g88" />
51
- <g
52
- id="g90">
53
- <g
54
- id="g88"
55
- transform="matrix(1.941682,0,0,1.941682,-258.91443,105.22034)">
56
- <g
57
- id="g52"
58
- style="fill:#eceff1;fill-opacity:1">
59
- <path
60
- d="m 182.795,15.986 v 165.382 c 0,8.829 7.157,15.986 15.986,15.986 h 20.359 c 2.854,0 5.364,1.885 6.16,4.626 l 11.126,38.317 c 1.404,4.836 7.578,6.242 10.938,2.491 l 38.788,-43.3 c 1.217,-1.358 2.954,-2.134 4.778,-2.134 h 192.658 c 8.829,0 15.986,-7.157 15.986,-15.986 V 15.986 C 499.573,7.157 492.416,0 483.587,0 H 198.781 c -8.829,0 -15.986,7.157 -15.986,15.986 z"
61
- id="path50"
62
- inkscape:connector-curvature="0"
63
- style="fill:#eceff1;fill-opacity:1" />
64
- </g>
65
- <g
66
- id="g64"
67
- style="fill:#9178b7;fill-opacity:1">
68
- <path
69
- d="m 256.62,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 224.327,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.364,-2.758 5.296,-2.758 6.657,0 z"
70
- id="path58"
71
- inkscape:connector-curvature="0"
72
- style="fill:#9178b7;fill-opacity:1" />
73
- <path
74
- d="m 344.511,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 312.22,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.362,-2.758 5.294,-2.758 6.655,0 z"
75
- id="path60"
76
- inkscape:connector-curvature="0"
77
- style="fill:#9178b7;fill-opacity:1" />
78
- <path
79
- d="m 432.402,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.874,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 L 430.8,87.398 c -1.081,-0.568 -2.372,-0.568 -3.453,0 L 414.5,94.152 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 400.109,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.363,-2.758 5.296,-2.758 6.657,0 z"
80
- id="path62"
81
- inkscape:connector-curvature="0"
82
- style="fill:#9178b7;fill-opacity:1" />
83
- </g>
84
- <g
85
- id="g76" />
86
- <g
87
- id="g86">
88
- <g
89
- id="g80"
90
- style="fill:#90a4ae;fill-opacity:1">
91
- <path
92
- d="M 459.163,137.933 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 238.174 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
93
- id="path78"
94
- inkscape:connector-curvature="0"
95
- style="fill:#90a4ae;fill-opacity:1" />
96
- </g>
97
- <g
98
- id="g84"
99
- style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1">
100
- <path
101
- d="M 340.076,167.863 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 119.087 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
102
- id="path82"
103
- inkscape:connector-curvature="0"
104
- style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1" />
105
- </g>
106
- </g>
107
- <rect
108
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:2.89835215;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
109
- id="rect4504"
110
- width="395.82443"
111
- height="349.21036"
112
- x="139.90385"
113
- y="-53.375328" />
114
- </g>
115
- </g>
116
- </svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4
+ xmlns:cc="http://creativecommons.org/ns#"
5
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
+ xmlns:svg="http://www.w3.org/2000/svg"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
+ id="Capa_1"
11
+ enable-background="new 0 0 512 512"
12
+ height="512"
13
+ viewBox="0 0 512 512"
14
+ width="512"
15
+ version="1.1"
16
+ sodipodi:docname="love.svg"
17
+ inkscape:version="0.92.0 r15299">
18
+ <metadata
19
+ id="metadata97">
20
+ <rdf:RDF>
21
+ <cc:Work
22
+ rdf:about="">
23
+ <dc:format>image/svg+xml</dc:format>
24
+ <dc:type
25
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
26
+ </cc:Work>
27
+ </rdf:RDF>
28
+ </metadata>
29
+ <defs
30
+ id="defs95" />
31
+ <sodipodi:namedview
32
+ pagecolor="#ffffff"
33
+ bordercolor="#666666"
34
+ borderopacity="1"
35
+ objecttolerance="10"
36
+ gridtolerance="10"
37
+ guidetolerance="10"
38
+ inkscape:pageopacity="0"
39
+ inkscape:pageshadow="2"
40
+ inkscape:window-width="2560"
41
+ inkscape:window-height="1017"
42
+ id="namedview93"
43
+ showgrid="false"
44
+ inkscape:zoom="0.4609375"
45
+ inkscape:cx="-161.41471"
46
+ inkscape:cy="87.761635"
47
+ inkscape:window-x="1912"
48
+ inkscape:window-y="-8"
49
+ inkscape:window-maximized="1"
50
+ inkscape:current-layer="g88" />
51
+ <g
52
+ id="g90">
53
+ <g
54
+ id="g88"
55
+ transform="matrix(1.941682,0,0,1.941682,-258.91443,105.22034)">
56
+ <g
57
+ id="g52"
58
+ style="fill:#eceff1;fill-opacity:1">
59
+ <path
60
+ d="m 182.795,15.986 v 165.382 c 0,8.829 7.157,15.986 15.986,15.986 h 20.359 c 2.854,0 5.364,1.885 6.16,4.626 l 11.126,38.317 c 1.404,4.836 7.578,6.242 10.938,2.491 l 38.788,-43.3 c 1.217,-1.358 2.954,-2.134 4.778,-2.134 h 192.658 c 8.829,0 15.986,-7.157 15.986,-15.986 V 15.986 C 499.573,7.157 492.416,0 483.587,0 H 198.781 c -8.829,0 -15.986,7.157 -15.986,15.986 z"
61
+ id="path50"
62
+ inkscape:connector-curvature="0"
63
+ style="fill:#eceff1;fill-opacity:1" />
64
+ </g>
65
+ <g
66
+ id="g64"
67
+ style="fill:#9178b7;fill-opacity:1">
68
+ <path
69
+ d="m 256.62,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 224.327,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.364,-2.758 5.296,-2.758 6.657,0 z"
70
+ id="path58"
71
+ inkscape:connector-curvature="0"
72
+ style="fill:#9178b7;fill-opacity:1" />
73
+ <path
74
+ d="m 344.511,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 312.22,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.362,-2.758 5.294,-2.758 6.655,0 z"
75
+ id="path60"
76
+ inkscape:connector-curvature="0"
77
+ style="fill:#9178b7;fill-opacity:1" />
78
+ <path
79
+ d="m 432.402,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.874,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 L 430.8,87.398 c -1.081,-0.568 -2.372,-0.568 -3.453,0 L 414.5,94.152 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 400.109,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.363,-2.758 5.296,-2.758 6.657,0 z"
80
+ id="path62"
81
+ inkscape:connector-curvature="0"
82
+ style="fill:#9178b7;fill-opacity:1" />
83
+ </g>
84
+ <g
85
+ id="g76" />
86
+ <g
87
+ id="g86">
88
+ <g
89
+ id="g80"
90
+ style="fill:#90a4ae;fill-opacity:1">
91
+ <path
92
+ d="M 459.163,137.933 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 238.174 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
93
+ id="path78"
94
+ inkscape:connector-curvature="0"
95
+ style="fill:#90a4ae;fill-opacity:1" />
96
+ </g>
97
+ <g
98
+ id="g84"
99
+ style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1">
100
+ <path
101
+ d="M 340.076,167.863 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 119.087 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
102
+ id="path82"
103
+ inkscape:connector-curvature="0"
104
+ style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1" />
105
+ </g>
106
+ </g>
107
+ <rect
108
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:2.89835215;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
109
+ id="rect4504"
110
+ width="395.82443"
111
+ height="349.21036"
112
+ x="139.90385"
113
+ y="-53.375328" />
114
+ </g>
115
+ </g>
116
+ </svg>
backend/images/settings.svg CHANGED
@@ -1,124 +1,124 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="settings.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.3304499"
38
- inkscape:cx="-433.02666"
39
- inkscape:cy="120.52743"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1" /><path
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
- id="path2"
47
- inkscape:connector-curvature="0" /><g
48
- id="g8"
49
- transform="scale(1.3026177)" /><g
50
- id="g10"
51
- transform="scale(1.3026177)" /><g
52
- id="g12"
53
- transform="scale(1.3026177)" /><g
54
- id="g14"
55
- transform="scale(1.3026177)" /><g
56
- id="g16"
57
- transform="scale(1.3026177)" /><g
58
- id="g18"
59
- transform="scale(1.3026177)" /><g
60
- id="g20"
61
- transform="scale(1.3026177)" /><g
62
- id="g22"
63
- transform="scale(1.3026177)" /><g
64
- id="g24"
65
- transform="scale(1.3026177)" /><g
66
- id="g26"
67
- transform="scale(1.3026177)" /><g
68
- id="g28"
69
- transform="scale(1.3026177)" /><g
70
- id="g30"
71
- transform="scale(1.3026177)" /><g
72
- id="g32"
73
- transform="scale(1.3026177)" /><g
74
- id="g34"
75
- transform="scale(1.3026177)" /><g
76
- id="g36"
77
- transform="scale(1.3026177)" /><g
78
- transform="translate(107.14129,82.560247)"
79
- id="g8-7"
80
- style="fill:#90a4ae;fill-opacity:1" /><g
81
- transform="translate(107.14129,82.560247)"
82
- id="g48" /><g
83
- transform="translate(107.14129,82.560247)"
84
- id="g50" /><g
85
- transform="translate(107.14129,82.560247)"
86
- id="g52" /><g
87
- transform="translate(107.14129,82.560247)"
88
- id="g54" /><g
89
- transform="translate(107.14129,82.560247)"
90
- id="g56" /><g
91
- transform="translate(107.14129,82.560247)"
92
- id="g58" /><g
93
- transform="translate(107.14129,82.560247)"
94
- id="g60" /><g
95
- transform="translate(107.14129,82.560247)"
96
- id="g62" /><g
97
- transform="translate(107.14129,82.560247)"
98
- id="g64" /><g
99
- transform="translate(107.14129,82.560247)"
100
- id="g66" /><g
101
- transform="translate(107.14129,82.560247)"
102
- id="g68" /><g
103
- transform="translate(107.14129,82.560247)"
104
- id="g70" /><g
105
- transform="translate(107.14129,82.560247)"
106
- id="g72" /><g
107
- transform="translate(107.14129,82.560247)"
108
- id="g74" /><g
109
- transform="translate(107.14129,82.560247)"
110
- id="g76" /><path
111
- inkscape:connector-curvature="0"
112
- d="m 407.30702,633.58604 h -30.82827 c -24.93373,0 -45.22015,-20.28545 -45.22015,-45.21919 v -10.42958 c -10.60035,-3.38666 -20.89946,-7.66173 -30.79371,-12.78202 l -7.39118,7.39117 c -17.90135,17.92343 -46.57672,17.39768 -63.95808,-0.007 L 207.3268,550.75171 c -17.41207,-17.39287 -17.91288,-46.05864 0.006,-63.95809 l 7.38543,-7.38542 c -5.12029,-9.89424 -9.3944,-20.19143 -12.78202,-30.79371 h -10.42863 c -24.93276,0 -45.21918,-20.28546 -45.21918,-45.21918 v -30.82908 c 0,-24.93372 20.28642,-45.21919 45.22014,-45.21919 h 10.42862 c 3.38764,-10.60132 7.66174,-20.89946 12.78203,-30.79371 l -7.39118,-7.39022 c -17.90807,-17.88889 -17.41399,-46.55754 0.006,-63.95809 l 21.79075,-21.78979 c 17.42166,-17.44565 46.0903,-17.88122 63.95713,0.006 l 7.38447,7.38446 c 9.89423,-5.11933 20.19335,-9.3944 30.7937,-12.78202 v -10.42863 c 0,-24.93373 20.28546,-45.21918 45.22014,-45.21918 h 30.82827 c 24.93373,0 45.21919,20.28545 45.21919,45.21918 v 10.42958 c 10.60035,3.38667 20.89946,7.66174 30.7937,12.78203 l 7.39119,-7.39118 c 17.90135,-17.92343 46.57672,-17.39768 63.95809,0.007 l 21.78882,21.78787 c 17.41207,17.39289 17.91287,46.05866 -0.009,63.9581 l -7.38543,7.38542 c 5.12029,9.89425 9.3944,20.19143 12.78202,30.79371 h 10.42864 c 24.93372,0 45.22013,20.28546 45.22013,45.21919 v 30.8292 c 0,24.93373 -20.28641,45.21919 -45.22013,45.21919 h -10.42864 c -3.38762,10.60132 -7.66173,20.89946 -12.78202,30.7937 l 7.39119,7.39119 c 17.90806,17.88888 17.41397,46.55754 -0.009,63.95809 l -21.79074,21.78978 c -17.42166,17.44565 -46.09031,17.88122 -63.95713,-0.006 l -7.38447,-7.38447 c -9.89424,5.11933 -20.19335,9.3944 -30.7937,12.78202 v 10.42959 c 0,24.93181 -20.28546,45.21726 -45.22014,45.21726 z M 305.27626,534.93141 c 13.74525,8.12896 28.53914,14.27005 43.97005,18.2525 6.35504,1.63961 10.79512,7.37104 10.79512,13.93426 v 21.24868 c 0,9.06341 7.37486,16.43733 16.43827,16.43733 h 30.82828 c 9.0634,0 16.43827,-7.37392 16.43827,-16.43733 v -21.24868 c 0,-6.56322 4.44008,-12.29465 10.79512,-13.93426 15.43091,-3.98245 30.2248,-10.12354 43.97005,-18.2525 5.65564,-3.34445 12.8559,-2.43494 17.50224,2.21141 l 15.05101,15.05196 c 6.48934,6.49702 16.91029,6.34639 23.24039,0.007 l 21.80417,-21.80321 c 6.31474,-6.30707 6.5258,-16.72994 0.009,-23.24136 L 541.06052,492.0995 c -4.6454,-4.64538 -5.5549,-11.8466 -2.21141,-17.50128 8.12895,-13.7443 14.26908,-28.53818 18.25154,-43.97005 1.64057,-6.35504 7.37199,-10.79416 13.93425,-10.79416 h 21.24774 c 9.06341,0 16.43827,-7.37391 16.43827,-16.43732 v -30.82921 c 0,-9.06341 -7.37486,-16.43731 -16.43827,-16.43731 H 571.0349 c -6.56322,0 -12.29368,-4.44009 -13.93425,-10.79416 -3.98246,-15.43188 -10.12355,-30.22576 -18.25154,-43.97005 -3.34349,-5.65468 -2.43399,-12.8559 2.21141,-17.50129 l 15.05195,-15.05195 c 6.50661,-6.49895 6.3368,-16.91798 0.009,-23.24136 l -21.80131,-21.80239 c -6.31955,-6.32818 -16.74241,-6.51334 -23.24136,-0.006 l -15.05675,15.05771 c -4.64539,4.64634 -11.84853,5.55586 -17.50224,2.21141 -13.74526,-8.12897 -28.53914,-14.27005 -43.97006,-18.25251 -6.35502,-1.6396 -10.79512,-7.37103 -10.79512,-13.93426 v -21.2506 c 0,-9.06341 -7.37486,-16.43733 -16.43827,-16.43733 h -30.82827 c -9.06341,0 -16.43828,7.37392 -16.43828,16.43733 v 21.24868 c 0,6.56323 -4.44008,12.29467 -10.79512,13.93427 -15.43091,3.98245 -30.22479,10.12354 -43.97004,18.2525 -5.6566,3.34348 -12.85686,2.43398 -17.50225,-2.21141 L 272.73141,223.7668 c -6.48936,-6.49702 -16.91126,-6.34639 -23.2404,-0.007 l -21.80418,21.80322 c -6.31473,6.30707 -6.5258,16.72898 -0.006,23.24136 l 15.05771,15.05771 c 4.64538,4.64539 5.55489,11.84661 2.2114,17.50128 -8.12896,13.7443 -14.26909,28.53818 -18.25154,43.97005 -1.64056,6.35503 -7.372,10.79415 -13.93426,10.79415 h -21.24868 c -9.06341,9.7e-4 -16.43829,7.37488 -16.43829,16.43829 v 30.82921 c 0,9.06341 7.37488,16.43731 16.43829,16.43731 h 21.24772 c 6.56322,0 12.2937,4.44008 13.93426,10.79416 3.98245,15.43188 10.12354,30.22576 18.25154,43.97005 3.34349,5.65468 2.43398,12.8559 -2.2114,17.50129 l -15.05196,15.05195 c -6.50662,6.49895 -6.33681,16.91798 -0.006,23.24136 l 21.80225,21.80225 c 6.31954,6.32818 16.74241,6.51335 23.24136,0.006 l 15.05674,-15.05771 c 3.42313,-3.42215 10.54472,-6.32625 17.50321,-2.21044 z"
113
- id="path2-7"
114
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><path
115
- inkscape:connector-curvature="0"
116
- d="m 391.89337,494.85747 c -58.9328,0 -106.87666,-47.94482 -106.87666,-106.87664 0,-58.93182 47.94386,-106.87664 106.87666,-106.87664 58.93278,0 106.87664,47.94482 106.87664,106.87664 0,58.93182 -47.94386,106.87664 -106.87664,106.87664 z m 0,-184.97142 c -43.06248,0 -78.0948,35.03329 -78.0948,78.09478 0,43.0615 35.03328,78.09478 78.0948,78.09478 43.0615,0 78.09478,-35.03328 78.09478,-78.09478 0,-43.06149 -35.03232,-78.09478 -78.09478,-78.09478 z"
117
- id="path4-6"
118
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><rect
119
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
120
- id="rect4504"
121
- width="768.56519"
122
- height="678.05548"
123
- x="-25.146145"
124
  y="32.319691" /></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 505 505"
17
+ style="enable-background:new 0 0 505 505;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="settings.svg"
20
+ inkscape:version="0.92.0 r15299"><metadata
21
+ id="metadata43"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs41" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1017"
35
+ id="namedview39"
36
+ showgrid="false"
37
+ inkscape:zoom="0.3304499"
38
+ inkscape:cx="-433.02666"
39
+ inkscape:cy="120.52743"
40
+ inkscape:window-x="-8"
41
+ inkscape:window-y="-8"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><path
44
+ style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
+ d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
+ id="path2"
47
+ inkscape:connector-curvature="0" /><g
48
+ id="g8"
49
+ transform="scale(1.3026177)" /><g
50
+ id="g10"
51
+ transform="scale(1.3026177)" /><g
52
+ id="g12"
53
+ transform="scale(1.3026177)" /><g
54
+ id="g14"
55
+ transform="scale(1.3026177)" /><g
56
+ id="g16"
57
+ transform="scale(1.3026177)" /><g
58
+ id="g18"
59
+ transform="scale(1.3026177)" /><g
60
+ id="g20"
61
+ transform="scale(1.3026177)" /><g
62
+ id="g22"
63
+ transform="scale(1.3026177)" /><g
64
+ id="g24"
65
+ transform="scale(1.3026177)" /><g
66
+ id="g26"
67
+ transform="scale(1.3026177)" /><g
68
+ id="g28"
69
+ transform="scale(1.3026177)" /><g
70
+ id="g30"
71
+ transform="scale(1.3026177)" /><g
72
+ id="g32"
73
+ transform="scale(1.3026177)" /><g
74
+ id="g34"
75
+ transform="scale(1.3026177)" /><g
76
+ id="g36"
77
+ transform="scale(1.3026177)" /><g
78
+ transform="translate(107.14129,82.560247)"
79
+ id="g8-7"
80
+ style="fill:#90a4ae;fill-opacity:1" /><g
81
+ transform="translate(107.14129,82.560247)"
82
+ id="g48" /><g
83
+ transform="translate(107.14129,82.560247)"
84
+ id="g50" /><g
85
+ transform="translate(107.14129,82.560247)"
86
+ id="g52" /><g
87
+ transform="translate(107.14129,82.560247)"
88
+ id="g54" /><g
89
+ transform="translate(107.14129,82.560247)"
90
+ id="g56" /><g
91
+ transform="translate(107.14129,82.560247)"
92
+ id="g58" /><g
93
+ transform="translate(107.14129,82.560247)"
94
+ id="g60" /><g
95
+ transform="translate(107.14129,82.560247)"
96
+ id="g62" /><g
97
+ transform="translate(107.14129,82.560247)"
98
+ id="g64" /><g
99
+ transform="translate(107.14129,82.560247)"
100
+ id="g66" /><g
101
+ transform="translate(107.14129,82.560247)"
102
+ id="g68" /><g
103
+ transform="translate(107.14129,82.560247)"
104
+ id="g70" /><g
105
+ transform="translate(107.14129,82.560247)"
106
+ id="g72" /><g
107
+ transform="translate(107.14129,82.560247)"
108
+ id="g74" /><g
109
+ transform="translate(107.14129,82.560247)"
110
+ id="g76" /><path
111
+ inkscape:connector-curvature="0"
112
+ d="m 407.30702,633.58604 h -30.82827 c -24.93373,0 -45.22015,-20.28545 -45.22015,-45.21919 v -10.42958 c -10.60035,-3.38666 -20.89946,-7.66173 -30.79371,-12.78202 l -7.39118,7.39117 c -17.90135,17.92343 -46.57672,17.39768 -63.95808,-0.007 L 207.3268,550.75171 c -17.41207,-17.39287 -17.91288,-46.05864 0.006,-63.95809 l 7.38543,-7.38542 c -5.12029,-9.89424 -9.3944,-20.19143 -12.78202,-30.79371 h -10.42863 c -24.93276,0 -45.21918,-20.28546 -45.21918,-45.21918 v -30.82908 c 0,-24.93372 20.28642,-45.21919 45.22014,-45.21919 h 10.42862 c 3.38764,-10.60132 7.66174,-20.89946 12.78203,-30.79371 l -7.39118,-7.39022 c -17.90807,-17.88889 -17.41399,-46.55754 0.006,-63.95809 l 21.79075,-21.78979 c 17.42166,-17.44565 46.0903,-17.88122 63.95713,0.006 l 7.38447,7.38446 c 9.89423,-5.11933 20.19335,-9.3944 30.7937,-12.78202 v -10.42863 c 0,-24.93373 20.28546,-45.21918 45.22014,-45.21918 h 30.82827 c 24.93373,0 45.21919,20.28545 45.21919,45.21918 v 10.42958 c 10.60035,3.38667 20.89946,7.66174 30.7937,12.78203 l 7.39119,-7.39118 c 17.90135,-17.92343 46.57672,-17.39768 63.95809,0.007 l 21.78882,21.78787 c 17.41207,17.39289 17.91287,46.05866 -0.009,63.9581 l -7.38543,7.38542 c 5.12029,9.89425 9.3944,20.19143 12.78202,30.79371 h 10.42864 c 24.93372,0 45.22013,20.28546 45.22013,45.21919 v 30.8292 c 0,24.93373 -20.28641,45.21919 -45.22013,45.21919 h -10.42864 c -3.38762,10.60132 -7.66173,20.89946 -12.78202,30.7937 l 7.39119,7.39119 c 17.90806,17.88888 17.41397,46.55754 -0.009,63.95809 l -21.79074,21.78978 c -17.42166,17.44565 -46.09031,17.88122 -63.95713,-0.006 l -7.38447,-7.38447 c -9.89424,5.11933 -20.19335,9.3944 -30.7937,12.78202 v 10.42959 c 0,24.93181 -20.28546,45.21726 -45.22014,45.21726 z M 305.27626,534.93141 c 13.74525,8.12896 28.53914,14.27005 43.97005,18.2525 6.35504,1.63961 10.79512,7.37104 10.79512,13.93426 v 21.24868 c 0,9.06341 7.37486,16.43733 16.43827,16.43733 h 30.82828 c 9.0634,0 16.43827,-7.37392 16.43827,-16.43733 v -21.24868 c 0,-6.56322 4.44008,-12.29465 10.79512,-13.93426 15.43091,-3.98245 30.2248,-10.12354 43.97005,-18.2525 5.65564,-3.34445 12.8559,-2.43494 17.50224,2.21141 l 15.05101,15.05196 c 6.48934,6.49702 16.91029,6.34639 23.24039,0.007 l 21.80417,-21.80321 c 6.31474,-6.30707 6.5258,-16.72994 0.009,-23.24136 L 541.06052,492.0995 c -4.6454,-4.64538 -5.5549,-11.8466 -2.21141,-17.50128 8.12895,-13.7443 14.26908,-28.53818 18.25154,-43.97005 1.64057,-6.35504 7.37199,-10.79416 13.93425,-10.79416 h 21.24774 c 9.06341,0 16.43827,-7.37391 16.43827,-16.43732 v -30.82921 c 0,-9.06341 -7.37486,-16.43731 -16.43827,-16.43731 H 571.0349 c -6.56322,0 -12.29368,-4.44009 -13.93425,-10.79416 -3.98246,-15.43188 -10.12355,-30.22576 -18.25154,-43.97005 -3.34349,-5.65468 -2.43399,-12.8559 2.21141,-17.50129 l 15.05195,-15.05195 c 6.50661,-6.49895 6.3368,-16.91798 0.009,-23.24136 l -21.80131,-21.80239 c -6.31955,-6.32818 -16.74241,-6.51334 -23.24136,-0.006 l -15.05675,15.05771 c -4.64539,4.64634 -11.84853,5.55586 -17.50224,2.21141 -13.74526,-8.12897 -28.53914,-14.27005 -43.97006,-18.25251 -6.35502,-1.6396 -10.79512,-7.37103 -10.79512,-13.93426 v -21.2506 c 0,-9.06341 -7.37486,-16.43733 -16.43827,-16.43733 h -30.82827 c -9.06341,0 -16.43828,7.37392 -16.43828,16.43733 v 21.24868 c 0,6.56323 -4.44008,12.29467 -10.79512,13.93427 -15.43091,3.98245 -30.22479,10.12354 -43.97004,18.2525 -5.6566,3.34348 -12.85686,2.43398 -17.50225,-2.21141 L 272.73141,223.7668 c -6.48936,-6.49702 -16.91126,-6.34639 -23.2404,-0.007 l -21.80418,21.80322 c -6.31473,6.30707 -6.5258,16.72898 -0.006,23.24136 l 15.05771,15.05771 c 4.64538,4.64539 5.55489,11.84661 2.2114,17.50128 -8.12896,13.7443 -14.26909,28.53818 -18.25154,43.97005 -1.64056,6.35503 -7.372,10.79415 -13.93426,10.79415 h -21.24868 c -9.06341,9.7e-4 -16.43829,7.37488 -16.43829,16.43829 v 30.82921 c 0,9.06341 7.37488,16.43731 16.43829,16.43731 h 21.24772 c 6.56322,0 12.2937,4.44008 13.93426,10.79416 3.98245,15.43188 10.12354,30.22576 18.25154,43.97005 3.34349,5.65468 2.43398,12.8559 -2.2114,17.50129 l -15.05196,15.05195 c -6.50662,6.49895 -6.33681,16.91798 -0.006,23.24136 l 21.80225,21.80225 c 6.31954,6.32818 16.74241,6.51335 23.24136,0.006 l 15.05674,-15.05771 c 3.42313,-3.42215 10.54472,-6.32625 17.50321,-2.21044 z"
113
+ id="path2-7"
114
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><path
115
+ inkscape:connector-curvature="0"
116
+ d="m 391.89337,494.85747 c -58.9328,0 -106.87666,-47.94482 -106.87666,-106.87664 0,-58.93182 47.94386,-106.87664 106.87666,-106.87664 58.93278,0 106.87664,47.94482 106.87664,106.87664 0,58.93182 -47.94386,106.87664 -106.87664,106.87664 z m 0,-184.97142 c -43.06248,0 -78.0948,35.03329 -78.0948,78.09478 0,43.0615 35.03328,78.09478 78.0948,78.09478 43.0615,0 78.09478,-35.03328 78.09478,-78.09478 0,-43.06149 -35.03232,-78.09478 -78.09478,-78.09478 z"
117
+ id="path4-6"
118
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><rect
119
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
120
+ id="rect4504"
121
+ width="768.56519"
122
+ height="678.05548"
123
+ x="-25.146145"
124
  y="32.319691" /></svg>
backend/images/support.svg CHANGED
@@ -1,102 +1,102 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Capa_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512 512"
17
- style="enable-background:new 0 0 512 512;"
18
- xml:space="preserve"
19
- sodipodi:docname="support.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata75"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs73" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="2560"
34
- inkscape:window-height="1017"
35
- id="namedview71"
36
- showgrid="false"
37
- inkscape:zoom="0.92187498"
38
- inkscape:cx="127.5288"
39
- inkscape:cy="162.24021"
40
- inkscape:window-x="1912"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="g22" /><path
44
- style="fill:#9178b7;fill-opacity:1;stroke:none"
45
- d="m 374.18666,111.86429 c -136.624,0 -247.29601,110.672 -247.29601,247.296 0,136.624 110.67201,247.296 247.29601,247.296 136.624,0 247.296,-110.672 247.296,-247.296 0,-136.624 -110.672,-247.296 -247.296,-247.296 z m 0,368.576 c -66.928,0 -121.12,-54.336 -121.12,-121.264 0,-66.928 54.192,-121.12 121.12,-121.12 66.928,0 121.264,54.192 121.264,121.12 0.016,66.912 -54.336,121.264 -121.264,121.264 z"
46
- id="path10"
47
- inkscape:connector-curvature="0" /><g
48
- id="g22"
49
- transform="translate(81.305295,78.237171)"
50
- style="stroke:none"><path
51
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
52
- d="m 195.61736,53.531119 53.776,114.448001 c 13.504,-5.2 28.128,-8.16 43.488,-8.16 15.344,0 29.968,2.96 43.488,8.16 l 53.776,-114.448001 c -29.856,-12.784 -62.72,-19.904 -97.264,-19.904 -34.544,0 -67.408,7.12 -97.264,19.904 z"
53
- id="path14"
54
- inkscape:connector-curvature="0" /><path
55
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
56
- d="m 171.76136,280.92312 c 0,-15.36 2.976,-29.984 8.176,-43.488 l -114.448003,-53.776 c -12.784,29.856 -19.904,62.72 -19.904,97.264 0,34.544 7.12,67.408 19.904,97.264 l 114.432003,-53.776 c -5.184,-13.52 -8.16,-28.144 -8.16,-43.488 z"
57
- id="path16"
58
- inkscape:connector-curvature="0" /><path
59
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
60
- d="m 390.14536,508.31512 -53.728,-114.32 c -13.536,5.216 -28.176,8.208 -43.536,8.208 -15.376,0 -30.016,-2.992 -43.552,-8.208 l -53.728,114.336 c 29.856,12.784 62.72,19.904 97.264,19.904 34.56,-0.016 67.424,-7.136 97.28,-19.92 z"
61
- id="path18"
62
- inkscape:connector-curvature="0" /><path
63
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
64
- d="m 414.16136,280.92312 c 0,15.36 -2.976,30 -8.208,43.536 l 114.32,53.728 c 12.784,-29.856 19.904,-62.72 19.904,-97.264 0,-34.544 -7.12,-67.408 -19.904,-97.264 l -114.336,53.728 c 5.232,13.52 8.224,28.176 8.224,43.536 z"
65
- id="path20"
66
- inkscape:connector-curvature="0" /><rect
67
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
68
- id="rect4504"
69
- width="768.56519"
70
- height="678.05548"
71
- x="-178.1302"
72
- y="-39.773388" /></g><g
73
- id="g40"
74
- transform="translate(81.305295,78.237171)" /><g
75
- id="g42"
76
- transform="translate(81.305295,78.237171)" /><g
77
- id="g44"
78
- transform="translate(81.305295,78.237171)" /><g
79
- id="g46"
80
- transform="translate(81.305295,78.237171)" /><g
81
- id="g48"
82
- transform="translate(81.305295,78.237171)" /><g
83
- id="g50"
84
- transform="translate(81.305295,78.237171)" /><g
85
- id="g52"
86
- transform="translate(81.305295,78.237171)" /><g
87
- id="g54"
88
- transform="translate(81.305295,78.237171)" /><g
89
- id="g56"
90
- transform="translate(81.305295,78.237171)" /><g
91
- id="g58"
92
- transform="translate(81.305295,78.237171)" /><g
93
- id="g60"
94
- transform="translate(81.305295,78.237171)" /><g
95
- id="g62"
96
- transform="translate(81.305295,78.237171)" /><g
97
- id="g64"
98
- transform="translate(81.305295,78.237171)" /><g
99
- id="g66"
100
- transform="translate(81.305295,78.237171)" /><g
101
- id="g68"
102
  transform="translate(81.305295,78.237171)" /></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Capa_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 512 512"
17
+ style="enable-background:new 0 0 512 512;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="support.svg"
20
+ inkscape:version="0.92.0 r15299"><metadata
21
+ id="metadata75"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs73" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="2560"
34
+ inkscape:window-height="1017"
35
+ id="namedview71"
36
+ showgrid="false"
37
+ inkscape:zoom="0.92187498"
38
+ inkscape:cx="127.5288"
39
+ inkscape:cy="162.24021"
40
+ inkscape:window-x="1912"
41
+ inkscape:window-y="-8"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="g22" /><path
44
+ style="fill:#9178b7;fill-opacity:1;stroke:none"
45
+ d="m 374.18666,111.86429 c -136.624,0 -247.29601,110.672 -247.29601,247.296 0,136.624 110.67201,247.296 247.29601,247.296 136.624,0 247.296,-110.672 247.296,-247.296 0,-136.624 -110.672,-247.296 -247.296,-247.296 z m 0,368.576 c -66.928,0 -121.12,-54.336 -121.12,-121.264 0,-66.928 54.192,-121.12 121.12,-121.12 66.928,0 121.264,54.192 121.264,121.12 0.016,66.912 -54.336,121.264 -121.264,121.264 z"
46
+ id="path10"
47
+ inkscape:connector-curvature="0" /><g
48
+ id="g22"
49
+ transform="translate(81.305295,78.237171)"
50
+ style="stroke:none"><path
51
+ style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
52
+ d="m 195.61736,53.531119 53.776,114.448001 c 13.504,-5.2 28.128,-8.16 43.488,-8.16 15.344,0 29.968,2.96 43.488,8.16 l 53.776,-114.448001 c -29.856,-12.784 -62.72,-19.904 -97.264,-19.904 -34.544,0 -67.408,7.12 -97.264,19.904 z"
53
+ id="path14"
54
+ inkscape:connector-curvature="0" /><path
55
+ style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
56
+ d="m 171.76136,280.92312 c 0,-15.36 2.976,-29.984 8.176,-43.488 l -114.448003,-53.776 c -12.784,29.856 -19.904,62.72 -19.904,97.264 0,34.544 7.12,67.408 19.904,97.264 l 114.432003,-53.776 c -5.184,-13.52 -8.16,-28.144 -8.16,-43.488 z"
57
+ id="path16"
58
+ inkscape:connector-curvature="0" /><path
59
+ style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
60
+ d="m 390.14536,508.31512 -53.728,-114.32 c -13.536,5.216 -28.176,8.208 -43.536,8.208 -15.376,0 -30.016,-2.992 -43.552,-8.208 l -53.728,114.336 c 29.856,12.784 62.72,19.904 97.264,19.904 34.56,-0.016 67.424,-7.136 97.28,-19.92 z"
61
+ id="path18"
62
+ inkscape:connector-curvature="0" /><path
63
+ style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
64
+ d="m 414.16136,280.92312 c 0,15.36 -2.976,30 -8.208,43.536 l 114.32,53.728 c 12.784,-29.856 19.904,-62.72 19.904,-97.264 0,-34.544 -7.12,-67.408 -19.904,-97.264 l -114.336,53.728 c 5.232,13.52 8.224,28.176 8.224,43.536 z"
65
+ id="path20"
66
+ inkscape:connector-curvature="0" /><rect
67
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
68
+ id="rect4504"
69
+ width="768.56519"
70
+ height="678.05548"
71
+ x="-178.1302"
72
+ y="-39.773388" /></g><g
73
+ id="g40"
74
+ transform="translate(81.305295,78.237171)" /><g
75
+ id="g42"
76
+ transform="translate(81.305295,78.237171)" /><g
77
+ id="g44"
78
+ transform="translate(81.305295,78.237171)" /><g
79
+ id="g46"
80
+ transform="translate(81.305295,78.237171)" /><g
81
+ id="g48"
82
+ transform="translate(81.305295,78.237171)" /><g
83
+ id="g50"
84
+ transform="translate(81.305295,78.237171)" /><g
85
+ id="g52"
86
+ transform="translate(81.305295,78.237171)" /><g
87
+ id="g54"
88
+ transform="translate(81.305295,78.237171)" /><g
89
+ id="g56"
90
+ transform="translate(81.305295,78.237171)" /><g
91
+ id="g58"
92
+ transform="translate(81.305295,78.237171)" /><g
93
+ id="g60"
94
+ transform="translate(81.305295,78.237171)" /><g
95
+ id="g62"
96
+ transform="translate(81.305295,78.237171)" /><g
97
+ id="g64"
98
+ transform="translate(81.305295,78.237171)" /><g
99
+ id="g66"
100
+ transform="translate(81.305295,78.237171)" /><g
101
+ id="g68"
102
  transform="translate(81.305295,78.237171)" /></svg>
backend/images/update.svg CHANGED
@@ -1,91 +1,91 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="update.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="2560"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.6608998"
38
- inkscape:cx="-41.965565"
39
- inkscape:cy="289.29436"
40
- inkscape:window-x="1912"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1" /><path
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
- id="path2"
47
- inkscape:connector-curvature="0" /><path
48
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
49
- d="m 287.44822,389.59968 h 18.51868 c 14.33706,0 22.46138,-16.36813 13.85915,-27.83776 l -72.64104,-95.81927 c -6.92957,-9.19961 -20.78872,-9.19961 -27.71829,0 l -72.64105,95.81927 c -8.7217,11.46963 -0.4779,27.83776 13.85915,27.83776 h 16.72655 c 26.04564,120.07278 140.50308,170.25245 226.16694,142.7731 7.52694,-2.3895 6.09324,-13.50072 -1.91161,-14.09809 -78.97324,-5.73482 -122.58176,-74.55265 -114.21848,-128.67501 z"
50
- id="path4"
51
- inkscape:connector-curvature="0" /><path
52
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
53
- d="m 424.84493,322.69346 h -18.51869 c -14.33705,0 -22.46137,16.36813 -13.85914,27.83777 l 72.64104,95.93875 c 6.92957,9.19961 20.78871,9.19961 27.71829,0 l 72.64104,-95.93875 c 8.7217,-11.46964 0.4779,-27.83777 -13.85914,-27.83777 H 534.88177 C 508.71666,202.62069 394.25922,152.44102 308.59536,179.92036 c -7.52695,2.38951 -6.09324,13.50072 1.91161,14.0981 79.09271,5.73482 122.70123,74.55265 114.33796,128.675 z"
54
- id="path6"
55
- inkscape:connector-curvature="0" /><g
56
- id="g8"
57
- transform="scale(1.3026177)" /><g
58
- id="g10"
59
- transform="scale(1.3026177)" /><g
60
- id="g12"
61
- transform="scale(1.3026177)" /><g
62
- id="g14"
63
- transform="scale(1.3026177)" /><g
64
- id="g16"
65
- transform="scale(1.3026177)" /><g
66
- id="g18"
67
- transform="scale(1.3026177)" /><g
68
- id="g20"
69
- transform="scale(1.3026177)" /><g
70
- id="g22"
71
- transform="scale(1.3026177)" /><g
72
- id="g24"
73
- transform="scale(1.3026177)" /><g
74
- id="g26"
75
- transform="scale(1.3026177)" /><g
76
- id="g28"
77
- transform="scale(1.3026177)" /><g
78
- id="g30"
79
- transform="scale(1.3026177)" /><g
80
- id="g32"
81
- transform="scale(1.3026177)" /><g
82
- id="g34"
83
- transform="scale(1.3026177)" /><g
84
- id="g36"
85
- transform="scale(1.3026177)" /><rect
86
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
87
- id="rect4504"
88
- width="768.56519"
89
- height="678.05548"
90
- x="-71.073227"
91
  y="-6.5198488" /></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 505 505"
17
+ style="enable-background:new 0 0 505 505;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="update.svg"
20
+ inkscape:version="0.92.0 r15299"><metadata
21
+ id="metadata43"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs41" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="2560"
34
+ inkscape:window-height="1017"
35
+ id="namedview39"
36
+ showgrid="false"
37
+ inkscape:zoom="0.6608998"
38
+ inkscape:cx="-41.965565"
39
+ inkscape:cy="289.29436"
40
+ inkscape:window-x="1912"
41
+ inkscape:window-y="-8"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><path
44
+ style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
+ d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
+ id="path2"
47
+ inkscape:connector-curvature="0" /><path
48
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
49
+ d="m 287.44822,389.59968 h 18.51868 c 14.33706,0 22.46138,-16.36813 13.85915,-27.83776 l -72.64104,-95.81927 c -6.92957,-9.19961 -20.78872,-9.19961 -27.71829,0 l -72.64105,95.81927 c -8.7217,11.46963 -0.4779,27.83776 13.85915,27.83776 h 16.72655 c 26.04564,120.07278 140.50308,170.25245 226.16694,142.7731 7.52694,-2.3895 6.09324,-13.50072 -1.91161,-14.09809 -78.97324,-5.73482 -122.58176,-74.55265 -114.21848,-128.67501 z"
50
+ id="path4"
51
+ inkscape:connector-curvature="0" /><path
52
+ style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
53
+ d="m 424.84493,322.69346 h -18.51869 c -14.33705,0 -22.46137,16.36813 -13.85914,27.83777 l 72.64104,95.93875 c 6.92957,9.19961 20.78871,9.19961 27.71829,0 l 72.64104,-95.93875 c 8.7217,-11.46964 0.4779,-27.83777 -13.85914,-27.83777 H 534.88177 C 508.71666,202.62069 394.25922,152.44102 308.59536,179.92036 c -7.52695,2.38951 -6.09324,13.50072 1.91161,14.0981 79.09271,5.73482 122.70123,74.55265 114.33796,128.675 z"
54
+ id="path6"
55
+ inkscape:connector-curvature="0" /><g
56
+ id="g8"
57
+ transform="scale(1.3026177)" /><g
58
+ id="g10"
59
+ transform="scale(1.3026177)" /><g
60
+ id="g12"
61
+ transform="scale(1.3026177)" /><g
62
+ id="g14"
63
+ transform="scale(1.3026177)" /><g
64
+ id="g16"
65
+ transform="scale(1.3026177)" /><g
66
+ id="g18"
67
+ transform="scale(1.3026177)" /><g
68
+ id="g20"
69
+ transform="scale(1.3026177)" /><g
70
+ id="g22"
71
+ transform="scale(1.3026177)" /><g
72
+ id="g24"
73
+ transform="scale(1.3026177)" /><g
74
+ id="g26"
75
+ transform="scale(1.3026177)" /><g
76
+ id="g28"
77
+ transform="scale(1.3026177)" /><g
78
+ id="g30"
79
+ transform="scale(1.3026177)" /><g
80
+ id="g32"
81
+ transform="scale(1.3026177)" /><g
82
+ id="g34"
83
+ transform="scale(1.3026177)" /><g
84
+ id="g36"
85
+ transform="scale(1.3026177)" /><rect
86
+ style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
87
+ id="rect4504"
88
+ width="768.56519"
89
+ height="678.05548"
90
+ x="-71.073227"
91
  y="-6.5198488" /></svg>
backend/images/welcome.svg CHANGED
@@ -1,181 +1,181 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Capa_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512.001 512.001"
17
- style="enable-background:new 0 0 512.001 512.001;"
18
- xml:space="preserve"
19
- sodipodi:docname="welcome.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata99"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs97" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview95"
36
- showgrid="false"
37
- inkscape:zoom="1.3037256"
38
- inkscape:cx="154.95189"
39
- inkscape:cy="223.3697"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Capa_1" /><circle
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:0.8621738"
45
- cx="256.00003"
46
- cy="252.93185"
47
- r="220.71649"
48
- id="circle2" /><g
49
- id="g20"
50
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
51
- style="fill:#34abe0"
52
- d="m 469.869,206.196 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -11.259 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.259 c -0.001,3.883 -3.148,7.029 -7.029,7.029 z"
53
- id="path4"
54
- inkscape:connector-curvature="0" /><path
55
- style="fill:#34abe0"
56
- d="m 469.869,263.776 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 245.49 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.258 c -0.001,3.881 -3.148,7.028 -7.029,7.028 z"
57
- id="path6"
58
- inkscape:connector-curvature="0" /><path
59
- style="fill:#34abe0"
60
- d="m 504.288,229.358 h -11.259 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.259 c 3.882,0 7.029,3.147 7.029,7.029 0,3.881 -3.148,7.029 -7.029,7.029 z"
61
- id="path8"
62
- inkscape:connector-curvature="0" /><path
63
- style="fill:#34abe0"
64
- d="M 446.707,229.358 H 435.45 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.258 c 3.882,0 7.029,3.147 7.029,7.029 -0.002,3.881 -3.148,7.029 -7.03,7.029 z"
65
- id="path10"
66
- inkscape:connector-curvature="0" /><path
67
- style="fill:#34abe0"
68
- d="m 391.867,22.724 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 7.029 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.883 -3.147,7.029 -7.029,7.029 z"
69
- id="path12"
70
- inkscape:connector-curvature="0" /><path
71
- style="fill:#34abe0"
72
- d="m 391.867,67.048 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -8.666 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.882 -3.147,7.029 -7.029,7.029 z"
73
- id="path14"
74
- inkscape:connector-curvature="0" /><path
75
- style="fill:#34abe0"
76
- d="m 418.362,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
77
- id="path16"
78
- inkscape:connector-curvature="0" /><path
79
- style="fill:#34abe0"
80
- d="m 374.038,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
81
- id="path18"
82
- inkscape:connector-curvature="0" /></g><path
83
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
84
- d="m 298.98111,139.77931 c -1.09841,0 -2.21061,-0.29831 -3.21073,-0.92511 -2.83569,-1.77694 -3.69529,-5.51619 -1.9192,-8.35187 8.88986,-14.19398 16.29077,-28.09049 21.99663,-41.303308 1.32689,-3.071925 4.89112,-4.486752 7.96563,-3.160729 3.07192,1.326886 4.48762,4.893699 3.15987,7.965625 -5.94815,13.774092 -13.63787,28.218092 -22.85278,42.931942 -1.14842,1.83643 -3.12107,2.84345 -5.13942,2.84345 z"
85
- id="path22"
86
- inkscape:connector-curvature="0" /><path
87
- style="fill:#34abe0;stroke-width:0.8621738"
88
- d="m 221.49065,234.60809 c -1.61572,0 -3.22798,-0.64233 -4.42037,-1.91403 -2.28993,-2.44081 -2.1675,-6.27489 0.27331,-8.56569 0.27849,-0.26124 28.13963,-26.53427 55.9456,-63.72931 2.00368,-2.6805 5.80157,-3.2297 8.48293,-1.22514 2.68049,2.00368 3.22884,5.80156 1.22514,8.48291 -28.47845,38.09258 -56.19562,64.21816 -57.36214,65.3114 -1.17083,1.09583 -2.65895,1.63986 -4.14447,1.63986 z"
89
- id="path24"
90
- inkscape:connector-curvature="0" /><path
91
- style="fill:#f9f9f9;stroke-width:0.8621738"
92
- d="m 275.09631,243.34881 c -1.64503,0 -3.28488,-0.6656 -4.47986,-1.97782 -2.25372,-2.47358 -2.07784,-6.30594 0.3966,-8.5614 28.21033,-25.71433 84.0654,-71.36126 141.18269,-88.17193 3.20988,-0.94408 6.57925,0.89148 7.52419,4.10223 0.94495,3.21073 -0.89149,6.57924 -4.10222,7.52419 -54.78597,16.12438 -108.99946,60.49098 -136.43987,85.50264 -1.16308,1.05961 -2.62446,1.58209 -4.08153,1.58209 z"
93
- id="path26"
94
- inkscape:connector-curvature="0" /><g
95
- id="g32"
96
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
97
- style="fill:#9178b7;fill-opacity:1"
98
- d="m 290.023,308.794 c -2.069,0 -4.119,-0.909 -5.507,-2.655 -2.416,-3.039 -1.91,-7.461 1.128,-9.875 2.334,-1.855 58.024,-45.266 133.17,-30.816 3.812,0.732 6.308,4.417 5.575,8.229 -0.732,3.813 -4.415,6.314 -8.229,5.575 -68.879,-13.246 -121.248,27.602 -121.769,28.017 -1.292,1.025 -2.835,1.525 -4.368,1.525 z"
99
- id="path28"
100
- inkscape:connector-curvature="0" /><path
101
- style="fill:#9178b7;fill-opacity:1"
102
- d="m 194.779,177.404 c -1.061,0 -2.137,-0.24 -3.148,-0.749 -3.469,-1.742 -4.869,-5.966 -3.126,-9.435 11.361,-22.624 23.205,-58.429 15.111,-100.516 -0.734,-3.812 1.763,-7.496 5.575,-8.229 3.811,-0.734 7.496,1.763 8.229,5.575 8.84,45.966 -4.013,84.906 -16.353,109.479 -1.234,2.456 -3.713,3.875 -6.288,3.875 z"
103
- id="path30"
104
- inkscape:connector-curvature="0" /></g><path
105
- style="fill:#f9f9f9;stroke-width:0.8621738"
106
- d="m 282.19114,351.70423 -99.61988,49.64742 -57.9993,28.91818 C 95.167528,408.4413 71.374975,379.46881 55.771353,345.91991 l 9.59427,-19.25148 45.683997,-91.6646 18.10738,-36.33287 z"
107
- id="path34"
108
- inkscape:connector-curvature="0" /><g
109
- id="g42"
110
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
111
- style="fill:#9178b7;fill-opacity:1"
112
- d="M 76.667,438.689 C 54.839,417.258 36.825,391.94 23.764,363.864 v -0.01 l 11.139,-22.329 z"
113
- id="path38"
114
- inkscape:connector-curvature="0" /><polygon
115
- style="fill:#9178b7;fill-opacity:1"
116
- points="170.839,428.138 152.074,384.51 87.885,235.211 108.888,193.068 237.301,321.481 286.379,370.559 "
117
- id="polygon40" /></g><path
118
- style="fill:#f9f9f9;stroke-width:0.8621738"
119
- d="M 268.15494,353.91226 126.94639,212.70371 c -6.84393,-6.84395 -6.84393,-17.93926 0,-24.78319 v 0 c 6.84394,-6.84394 17.93925,-6.84394 24.78318,0 l 141.2077,141.20769 c 6.84394,6.84393 6.84394,17.93925 0,24.78318 v 0 c -6.84308,6.84394 -17.93925,6.84394 -24.78233,8.7e-4 z"
120
- id="path46"
121
- inkscape:connector-curvature="0" /><circle
122
- style="fill:#f9f9f9;stroke-width:0.8621738"
123
- cx="176.15497"
124
- cy="142.5831"
125
- r="6.0602198"
126
- id="circle50" /><circle
127
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
128
- cx="257.1355"
129
- cy="119.44839"
130
- r="6.0602198"
131
- id="circle52" /><circle
132
- style="fill:#34abe0;stroke-width:0.8621738"
133
- cx="356.29495"
134
- cy="137.62819"
135
- r="6.0602198"
136
- id="circle54" /><g
137
- id="g60"
138
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><circle
139
- style="fill:#f9f9f9"
140
- cx="372.328"
141
- cy="323.53201"
142
- r="7.0289998"
143
- id="circle56" /><path
144
- style="fill:#f9f9f9"
145
- d="m 254.9,10.029 8.735,7.769 c 0.739,0.657 1.753,0.909 2.714,0.673 L 277.7,15.68 c 2.418,-0.595 4.468,1.841 3.469,4.122 l -4.69,10.708 c -0.397,0.906 -0.322,1.949 0.199,2.789 l 6.163,9.934 c 1.312,2.116 -0.371,4.818 -2.848,4.574 L 268.36,46.656 c -0.984,-0.097 -1.953,0.296 -2.59,1.051 l -7.543,8.931 c -1.607,1.902 -4.697,1.136 -5.23,-1.296 l -2.5,-11.42 c -0.211,-0.965 -0.885,-1.766 -1.8,-2.139 l -10.824,-4.415 c -2.305,-0.94 -2.532,-4.116 -0.383,-5.374 l 10.088,-5.907 c 0.854,-0.499 1.406,-1.387 1.479,-2.373 l 0.854,-11.659 c 0.178,-2.483 3.128,-3.681 4.989,-2.026 z"
146
- id="path58"
147
- inkscape:connector-curvature="0" /></g><path
148
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
149
- d="m 454.29051,92.257154 5.2722,11.110836 c 0.44574,0.93977 1.32516,1.60019 2.35201,1.76486 l 12.14113,1.95542 c 2.58566,0.41643 3.57199,3.61768 1.66831,5.41703 l -8.93729,8.44672 c -0.75613,0.71474 -1.11134,1.75453 -0.95184,2.7831 l 1.89161,12.15148 c 0.40263,2.58824 -2.3365,4.51434 -4.63592,3.25987 l -10.79527,-5.89036 c -0.91391,-0.49834 -2.01232,-0.51559 -2.94088,-0.0448 l -10.97202,5.55411 c -2.33649,1.18291 -5.01613,-0.82682 -4.53331,-3.40213 l 2.26579,-12.08682 c 0.19226,-1.02253 -0.13278,-2.07352 -0.86562,-2.81069 l -8.67261,-8.71916 c -1.84677,-1.85712 -0.76303,-5.02561 1.83384,-5.36272 l 12.19545,-1.58036 c 1.03117,-0.13364 1.93127,-0.76648 2.40633,-1.69159 l 5.61276,-10.941845 c 1.19323,-2.331318 4.54279,-2.278727 5.66533,0.08708 z"
150
- id="path62"
151
- inkscape:connector-curvature="0" /><g
152
- id="g64"
153
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
154
- id="g66"
155
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
156
- id="g68"
157
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
158
- id="g70"
159
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
160
- id="g72"
161
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
162
- id="g74"
163
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
164
- id="g76"
165
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
166
- id="g78"
167
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
168
- id="g80"
169
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
170
- id="g82"
171
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
172
- id="g84"
173
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
174
- id="g86"
175
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
176
- id="g88"
177
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
178
- id="g90"
179
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
180
- id="g92"
181
  transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /></svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Capa_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 512.001 512.001"
17
+ style="enable-background:new 0 0 512.001 512.001;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="welcome.svg"
20
+ inkscape:version="0.92.0 r15299"><metadata
21
+ id="metadata99"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs97" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1017"
35
+ id="namedview95"
36
+ showgrid="false"
37
+ inkscape:zoom="1.3037256"
38
+ inkscape:cx="154.95189"
39
+ inkscape:cy="223.3697"
40
+ inkscape:window-x="-8"
41
+ inkscape:window-y="-8"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Capa_1" /><circle
44
+ style="fill:#ded1f2;fill-opacity:1;stroke-width:0.8621738"
45
+ cx="256.00003"
46
+ cy="252.93185"
47
+ r="220.71649"
48
+ id="circle2" /><g
49
+ id="g20"
50
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
51
+ style="fill:#34abe0"
52
+ d="m 469.869,206.196 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -11.259 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.259 c -0.001,3.883 -3.148,7.029 -7.029,7.029 z"
53
+ id="path4"
54
+ inkscape:connector-curvature="0" /><path
55
+ style="fill:#34abe0"
56
+ d="m 469.869,263.776 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 245.49 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.258 c -0.001,3.881 -3.148,7.028 -7.029,7.028 z"
57
+ id="path6"
58
+ inkscape:connector-curvature="0" /><path
59
+ style="fill:#34abe0"
60
+ d="m 504.288,229.358 h -11.259 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.259 c 3.882,0 7.029,3.147 7.029,7.029 0,3.881 -3.148,7.029 -7.029,7.029 z"
61
+ id="path8"
62
+ inkscape:connector-curvature="0" /><path
63
+ style="fill:#34abe0"
64
+ d="M 446.707,229.358 H 435.45 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.258 c 3.882,0 7.029,3.147 7.029,7.029 -0.002,3.881 -3.148,7.029 -7.03,7.029 z"
65
+ id="path10"
66
+ inkscape:connector-curvature="0" /><path
67
+ style="fill:#34abe0"
68
+ d="m 391.867,22.724 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 7.029 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.883 -3.147,7.029 -7.029,7.029 z"
69
+ id="path12"
70
+ inkscape:connector-curvature="0" /><path
71
+ style="fill:#34abe0"
72
+ d="m 391.867,67.048 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -8.666 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.882 -3.147,7.029 -7.029,7.029 z"
73
+ id="path14"
74
+ inkscape:connector-curvature="0" /><path
75
+ style="fill:#34abe0"
76
+ d="m 418.362,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
77
+ id="path16"
78
+ inkscape:connector-curvature="0" /><path
79
+ style="fill:#34abe0"
80
+ d="m 374.038,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
81
+ id="path18"
82
+ inkscape:connector-curvature="0" /></g><path
83
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
84
+ d="m 298.98111,139.77931 c -1.09841,0 -2.21061,-0.29831 -3.21073,-0.92511 -2.83569,-1.77694 -3.69529,-5.51619 -1.9192,-8.35187 8.88986,-14.19398 16.29077,-28.09049 21.99663,-41.303308 1.32689,-3.071925 4.89112,-4.486752 7.96563,-3.160729 3.07192,1.326886 4.48762,4.893699 3.15987,7.965625 -5.94815,13.774092 -13.63787,28.218092 -22.85278,42.931942 -1.14842,1.83643 -3.12107,2.84345 -5.13942,2.84345 z"
85
+ id="path22"
86
+ inkscape:connector-curvature="0" /><path
87
+ style="fill:#34abe0;stroke-width:0.8621738"
88
+ d="m 221.49065,234.60809 c -1.61572,0 -3.22798,-0.64233 -4.42037,-1.91403 -2.28993,-2.44081 -2.1675,-6.27489 0.27331,-8.56569 0.27849,-0.26124 28.13963,-26.53427 55.9456,-63.72931 2.00368,-2.6805 5.80157,-3.2297 8.48293,-1.22514 2.68049,2.00368 3.22884,5.80156 1.22514,8.48291 -28.47845,38.09258 -56.19562,64.21816 -57.36214,65.3114 -1.17083,1.09583 -2.65895,1.63986 -4.14447,1.63986 z"
89
+ id="path24"
90
+ inkscape:connector-curvature="0" /><path
91
+ style="fill:#f9f9f9;stroke-width:0.8621738"
92
+ d="m 275.09631,243.34881 c -1.64503,0 -3.28488,-0.6656 -4.47986,-1.97782 -2.25372,-2.47358 -2.07784,-6.30594 0.3966,-8.5614 28.21033,-25.71433 84.0654,-71.36126 141.18269,-88.17193 3.20988,-0.94408 6.57925,0.89148 7.52419,4.10223 0.94495,3.21073 -0.89149,6.57924 -4.10222,7.52419 -54.78597,16.12438 -108.99946,60.49098 -136.43987,85.50264 -1.16308,1.05961 -2.62446,1.58209 -4.08153,1.58209 z"
93
+ id="path26"
94
+ inkscape:connector-curvature="0" /><g
95
+ id="g32"
96
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
97
+ style="fill:#9178b7;fill-opacity:1"
98
+ d="m 290.023,308.794 c -2.069,0 -4.119,-0.909 -5.507,-2.655 -2.416,-3.039 -1.91,-7.461 1.128,-9.875 2.334,-1.855 58.024,-45.266 133.17,-30.816 3.812,0.732 6.308,4.417 5.575,8.229 -0.732,3.813 -4.415,6.314 -8.229,5.575 -68.879,-13.246 -121.248,27.602 -121.769,28.017 -1.292,1.025 -2.835,1.525 -4.368,1.525 z"
99
+ id="path28"
100
+ inkscape:connector-curvature="0" /><path
101
+ style="fill:#9178b7;fill-opacity:1"
102
+ d="m 194.779,177.404 c -1.061,0 -2.137,-0.24 -3.148,-0.749 -3.469,-1.742 -4.869,-5.966 -3.126,-9.435 11.361,-22.624 23.205,-58.429 15.111,-100.516 -0.734,-3.812 1.763,-7.496 5.575,-8.229 3.811,-0.734 7.496,1.763 8.229,5.575 8.84,45.966 -4.013,84.906 -16.353,109.479 -1.234,2.456 -3.713,3.875 -6.288,3.875 z"
103
+ id="path30"
104
+ inkscape:connector-curvature="0" /></g><path
105
+ style="fill:#f9f9f9;stroke-width:0.8621738"
106
+ d="m 282.19114,351.70423 -99.61988,49.64742 -57.9993,28.91818 C 95.167528,408.4413 71.374975,379.46881 55.771353,345.91991 l 9.59427,-19.25148 45.683997,-91.6646 18.10738,-36.33287 z"
107
+ id="path34"
108
+ inkscape:connector-curvature="0" /><g
109
+ id="g42"
110
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
111
+ style="fill:#9178b7;fill-opacity:1"
112
+ d="M 76.667,438.689 C 54.839,417.258 36.825,391.94 23.764,363.864 v -0.01 l 11.139,-22.329 z"
113
+ id="path38"
114
+ inkscape:connector-curvature="0" /><polygon
115
+ style="fill:#9178b7;fill-opacity:1"
116
+ points="170.839,428.138 152.074,384.51 87.885,235.211 108.888,193.068 237.301,321.481 286.379,370.559 "
117
+ id="polygon40" /></g><path
118
+ style="fill:#f9f9f9;stroke-width:0.8621738"
119
+ d="M 268.15494,353.91226 126.94639,212.70371 c -6.84393,-6.84395 -6.84393,-17.93926 0,-24.78319 v 0 c 6.84394,-6.84394 17.93925,-6.84394 24.78318,0 l 141.2077,141.20769 c 6.84394,6.84393 6.84394,17.93925 0,24.78318 v 0 c -6.84308,6.84394 -17.93925,6.84394 -24.78233,8.7e-4 z"
120
+ id="path46"
121
+ inkscape:connector-curvature="0" /><circle
122
+ style="fill:#f9f9f9;stroke-width:0.8621738"
123
+ cx="176.15497"
124
+ cy="142.5831"
125
+ r="6.0602198"
126
+ id="circle50" /><circle
127
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
128
+ cx="257.1355"
129
+ cy="119.44839"
130
+ r="6.0602198"
131
+ id="circle52" /><circle
132
+ style="fill:#34abe0;stroke-width:0.8621738"
133
+ cx="356.29495"
134
+ cy="137.62819"
135
+ r="6.0602198"
136
+ id="circle54" /><g
137
+ id="g60"
138
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><circle
139
+ style="fill:#f9f9f9"
140
+ cx="372.328"
141
+ cy="323.53201"
142
+ r="7.0289998"
143
+ id="circle56" /><path
144
+ style="fill:#f9f9f9"
145
+ d="m 254.9,10.029 8.735,7.769 c 0.739,0.657 1.753,0.909 2.714,0.673 L 277.7,15.68 c 2.418,-0.595 4.468,1.841 3.469,4.122 l -4.69,10.708 c -0.397,0.906 -0.322,1.949 0.199,2.789 l 6.163,9.934 c 1.312,2.116 -0.371,4.818 -2.848,4.574 L 268.36,46.656 c -0.984,-0.097 -1.953,0.296 -2.59,1.051 l -7.543,8.931 c -1.607,1.902 -4.697,1.136 -5.23,-1.296 l -2.5,-11.42 c -0.211,-0.965 -0.885,-1.766 -1.8,-2.139 l -10.824,-4.415 c -2.305,-0.94 -2.532,-4.116 -0.383,-5.374 l 10.088,-5.907 c 0.854,-0.499 1.406,-1.387 1.479,-2.373 l 0.854,-11.659 c 0.178,-2.483 3.128,-3.681 4.989,-2.026 z"
146
+ id="path58"
147
+ inkscape:connector-curvature="0" /></g><path
148
+ style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
149
+ d="m 454.29051,92.257154 5.2722,11.110836 c 0.44574,0.93977 1.32516,1.60019 2.35201,1.76486 l 12.14113,1.95542 c 2.58566,0.41643 3.57199,3.61768 1.66831,5.41703 l -8.93729,8.44672 c -0.75613,0.71474 -1.11134,1.75453 -0.95184,2.7831 l 1.89161,12.15148 c 0.40263,2.58824 -2.3365,4.51434 -4.63592,3.25987 l -10.79527,-5.89036 c -0.91391,-0.49834 -2.01232,-0.51559 -2.94088,-0.0448 l -10.97202,5.55411 c -2.33649,1.18291 -5.01613,-0.82682 -4.53331,-3.40213 l 2.26579,-12.08682 c 0.19226,-1.02253 -0.13278,-2.07352 -0.86562,-2.81069 l -8.67261,-8.71916 c -1.84677,-1.85712 -0.76303,-5.02561 1.83384,-5.36272 l 12.19545,-1.58036 c 1.03117,-0.13364 1.93127,-0.76648 2.40633,-1.69159 l 5.61276,-10.941845 c 1.19323,-2.331318 4.54279,-2.278727 5.66533,0.08708 z"
150
+ id="path62"
151
+ inkscape:connector-curvature="0" /><g
152
+ id="g64"
153
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
154
+ id="g66"
155
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
156
+ id="g68"
157
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
158
+ id="g70"
159
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
160
+ id="g72"
161
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
162
+ id="g74"
163
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
164
+ id="g76"
165
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
166
+ id="g78"
167
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
168
+ id="g80"
169
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
170
+ id="g82"
171
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
172
+ id="g84"
173
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
174
+ id="g86"
175
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
176
+ id="g88"
177
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
178
+ id="g90"
179
+ transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
180
+ id="g92"
181
  transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /></svg>
backend/style.css CHANGED
@@ -295,6 +295,13 @@ table.cau_status_list:not(.no_column_width) th, table.cau_status_list:not(.no_co
295
  .cau_mobile_prefix {
296
  display: none;
297
  }
 
 
 
 
 
 
 
298
 
299
  /* Rollback list */
300
  table.rollbacklist {
295
  .cau_mobile_prefix {
296
  display: none;
297
  }
298
+ table.cau_status_list .cau_status_icon {
299
+ width: 50px!important;
300
+ }
301
+ table.cau_status_list .cau_status_icon .dashicons, table.cau_status_list .cau_status_icon .dashicons-before:before {
302
+ height: 25px;
303
+ font-size: 2em;
304
+ }
305
 
306
  /* Rollback list */
307
  table.rollbacklist {
backend/warningbar.css CHANGED
@@ -1,11 +1,11 @@
1
- #wpadminbar #wp-admin-bar-cau-has-issues .ab-icon:before {
2
- /*content: "\f463";*/
3
- content: "\f332";
4
- top: 3px;
5
- }
6
- #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-low {
7
- /*color: #FFBA00;*/
8
- }
9
- #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-high {
10
- color: #FF0000;
11
  }
1
+ #wpadminbar #wp-admin-bar-cau-has-issues .ab-icon:before {
2
+ /*content: "\f463";*/
3
+ content: "\f332";
4
+ top: 3px;
5
+ }
6
+ #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-low {
7
+ /*color: #FFBA00;*/
8
+ }
9
+ #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-high {
10
+ color: #FF0000;
11
  }
cau_emails.php CHANGED
@@ -1,525 +1,525 @@
1
- <?php
2
-
3
- // Check if emails should be send or not
4
- function cau_check_updates_mail() {
5
-
6
- // Notify of pending updates
7
- if( cau_get_db_value( 'send' ) == 'on' ) {
8
- cau_list_theme_updates(); // Check for theme updates
9
- cau_list_plugin_updates(); // Check for plugin updates
10
- }
11
-
12
- // Notify of completed updates
13
- if( cau_get_db_value( 'sendupdate' ) == 'on' && cau_get_db_value( 'plugins' ) == 'on' ) {
14
- cau_plugin_updated(); // Check for updated plugins
15
- }
16
-
17
- // Notify of required db update
18
- if( cau_get_db_value( 'dbupdateemails' ) == 'on' ) {
19
- cau_notify_outofdate_db();
20
- }
21
-
22
- }
23
-
24
- // Notify of out of date software
25
- function cau_outdated_notifier_mail() {
26
- if( cau_get_db_value( 'sendoutdated' ) == 'on' ) {
27
- cau_list_outdated_software(); // Check for oudated plugins
28
- }
29
- }
30
-
31
- // Ge the emailadresses it should be send to
32
- function cau_set_email() {
33
-
34
- $emailArray = array();
35
-
36
- if( cau_get_db_value( 'email' ) == '' ) {
37
- array_push( $emailArray, get_option('admin_email') );
38
- } else {
39
- $emailAdresses = cau_get_db_value( 'email' );
40
- $list = explode( ", ", $emailAdresses );
41
- foreach ( $list as $key ) {
42
- array_push( $emailArray, $list );
43
- }
44
- }
45
-
46
- return $emailArray;
47
-
48
- }
49
-
50
- // Mail format
51
- function cau_is_html() {
52
-
53
- // Check if cau_get_db_value() function exists.
54
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
55
-
56
- // Check if html
57
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
58
- $html = true;
59
- } else {
60
- $html = false;
61
- }
62
-
63
- }
64
-
65
- // Set the content for the emails about pending updates
66
- function cau_outdated_message( $single, $plural, $list ) {
67
-
68
- // WP version
69
- $wpversion = get_bloginfo( 'version' );
70
-
71
- // Base text
72
- $text = sprintf( esc_html__( "You have %s on your WordPress site at %s that have not been tested with the latest 3 major releases of WordPress.", "companion-auto-update" ), $plural, get_site_url() );
73
- $text .= "\n";
74
- $text .= "\n";
75
-
76
- // The list
77
- if( !empty( $list ) ) {
78
-
79
- $text .= sprintf( esc_html__( "The following %s have not been tested with WordPress %s:", "companion-auto-update" ), $plural, $wpversion );
80
- $text .= "\n";
81
- $text .= "\n";
82
-
83
- foreach ( $list as $plugin => $version ) {
84
- if( $version == '' ) $version = __( "Unknown", "companion-auto-update" );
85
- $text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
86
- }
87
-
88
- }
89
-
90
- return $text;
91
-
92
- }
93
-
94
- // Set the content for the emails about pending updates
95
- function cau_pending_message( $single, $plural, $list ) {
96
-
97
- // What markup to use
98
- if( cau_is_html() ) $break = '<br />';
99
- else $break = "\n";
100
-
101
- // Base text
102
- $text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
103
- $text .= $break;
104
-
105
- if( !empty( $list ) ) {
106
-
107
- $text .= $break;
108
- $text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
109
- $text .= $break;
110
-
111
- if( cau_is_html() ) $text .= "<ol>";
112
- foreach ( $list as $key => $value ) {
113
- if( cau_is_html() ) {
114
- $text .= "<li>$value</li>";
115
- } else {
116
- $text .= "-$value\n";
117
- }
118
- }
119
- if( cau_is_html() ) $text .= "</ol>";
120
-
121
- $text .= $break;
122
- }
123
-
124
- $text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
125
- $text .= $break;
126
-
127
- // End
128
- $text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' );
129
-
130
- return $text;
131
-
132
- }
133
-
134
- // Set the content for the emails about recent updates
135
- function cau_updated_message( $type, $updatedList ) {
136
-
137
- // What markup to use
138
- if( cau_is_html() ) $break = '<br />';
139
- else $break = "\n";
140
-
141
- // The message
142
- $text = sprintf( esc_html__(
143
- 'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part.
144
- For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
145
- ), $type, get_site_url() );
146
-
147
- $text .= $break;
148
- $text .= $break;
149
- $text .= sprintf( esc_html__(
150
- 'The following %1$s have been updated:', 'companion-auto-update'
151
- ), $type );
152
-
153
- $text .= $break;
154
- $text .= $updatedList;
155
-
156
- $text .= $break;
157
- $text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" );
158
-
159
- return $text;
160
-
161
- }
162
-
163
- // Checks if plugins are out of date
164
- function cau_list_outdated_software() {
165
-
166
- // Check if cau_get_db_value() function exists.
167
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
168
-
169
- // Set up mail
170
- $subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
171
- $type = __( 'plugin', 'companion-auto-update' );
172
- $type_plural = __( 'plugins', 'companion-auto-update' );
173
- $message = cau_outdated_message( $type, $type_plural, cau_list_outdated() );
174
-
175
- // Send to all addresses
176
- foreach ( cau_set_email() as $key => $value ) {
177
- foreach ( $value as $k => $v ) {
178
- wp_mail( $v, $subject, $message );
179
- }
180
- break;
181
- }
182
-
183
- }
184
-
185
- // Checks if theme updates are available
186
- function cau_list_theme_updates() {
187
-
188
- global $wpdb;
189
- $table_name = $wpdb->prefix . "auto_updates";
190
-
191
- $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
192
- foreach ( $configs as $config ) {
193
-
194
- if( $config->onoroff != 'on' ) {
195
-
196
- require_once ABSPATH . '/wp-admin/includes/update.php';
197
- $themes = get_theme_updates();
198
- $list = array();
199
-
200
- if ( !empty( $themes ) ) {
201
-
202
- foreach ( $themes as $stylesheet => $theme ) {
203
- array_push( $list, $theme->get( 'Name' ) );
204
- }
205
-
206
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
207
- $type = __('theme', 'companion-auto-update');
208
- $type_plural = __('themes', 'companion-auto-update');
209
- $message = cau_pending_message( $type, $type_plural, $list );
210
-
211
- foreach ( cau_set_email() as $key => $value) {
212
- foreach ($value as $k => $v) {
213
- wp_mail( $v, $subject, $message );
214
- }
215
- break;
216
- }
217
- }
218
-
219
- }
220
-
221
- }
222
-
223
- }
224
-
225
- // Checks if plugin updates are available
226
- function cau_list_plugin_updates() {
227
-
228
- global $wpdb;
229
- $table_name = $wpdb->prefix . "auto_updates";
230
-
231
- $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
232
- foreach ( $configs as $config ) {
233
-
234
- if( $config->onoroff != 'on' ) {
235
-
236
- require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
237
-
238
- if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
239
- $plugins = get_plugin_updates();
240
-
241
- if ( !empty( $plugins ) ) {
242
-
243
- $list = array();
244
- foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
245
- $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
246
- $name = $plugin_data->Name;
247
- array_push( $list, $name );
248
- }
249
-
250
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
251
- $type = __( 'plugin', 'companion-auto-update' );
252
- $type_plural = __( 'plugins', 'companion-auto-update' );
253
- $message = cau_pending_message( $type, $type_plural, $list );
254
-
255
- foreach ( cau_set_email() as $key => $value) {
256
- foreach ($value as $k => $v) {
257
- wp_mail( $v, $subject, $message );
258
- }
259
- break;
260
- }
261
- }
262
-
263
- }
264
-
265
- }
266
- }
267
-
268
- // Alerts when plugin has been updated
269
- function cau_plugin_updated() {
270
-
271
- // Check if cau_get_db_value() function exists.
272
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
273
-
274
- // Set the correct timezone for emails
275
- date_default_timezone_set( cau_get_proper_timezone() );
276
-
277
- // Create arrays
278
- $pluginNames = array();
279
- $pluginDates = array();
280
- $pluginVersion = array();
281
- $pluginSlug = array();
282
- $pluginTimes = array();
283
- $themeNames = array();
284
- $themeDates = array();
285
- $themeTimes = array();
286
-
287
- // Where to look for plugins
288
- $plugdir = plugin_dir_path( __DIR__ );
289
- if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists.
290
- $allPlugins = get_plugins();
291
-
292
- // Where to look for themes
293
- $themedir = get_theme_root();
294
- $allThemes = wp_get_themes();
295
-
296
- // Mail schedule
297
- $schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
298
-
299
- // Loop trough all plugins
300
- foreach ( $allPlugins as $key => $value ) {
301
-
302
- // Get plugin data
303
- $fullPath = $plugdir.'/'.$key;
304
- $getFile = $path_parts = pathinfo( $fullPath );
305
- $pluginData = get_plugin_data( $fullPath );
306
-
307
- // Get the slug
308
- $explosion = explode( '/', $key );
309
- $actualSlug = array_shift( $explosion );
310
-
311
- // Get last update date
312
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
313
-
314
- switch ( $schedule_mail ) {
315
- case 'hourly':
316
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
317
- break;
318
- case 'twicedaily':
319
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
320
- break;
321
- default:
322
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
323
- break;
324
- }
325
-
326
- $dateFormat = get_option( 'date_format' );
327
- $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
328
- $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
329
-
330
- if( $fileDate >= $lastday ) {
331
-
332
- // Get plugin name
333
- foreach ( $pluginData as $dataKey => $dataValue ) {
334
- if( $dataKey == 'Name') {
335
- array_push( $pluginNames , $dataValue );
336
- }
337
- if( $dataKey == 'Version') {
338
- array_push( $pluginVersion , $dataValue );
339
- }
340
- }
341
-
342
- array_push( $pluginDates, $fileDate );
343
- array_push( $pluginSlug, $actualSlug );
344
- array_push( $pluginTimes, $timestamp );
345
- }
346
-
347
- }
348
-
349
- // Loop trough all themes
350
- foreach ( $allThemes as $key => $value ) {
351
-
352
- // Get theme data
353
- $fullPath = $themedir.'/'.$key;
354
- $getFile = $path_parts = pathinfo( $fullPath );
355
-
356
- // Get last update date
357
- $dateFormat = get_option( 'date_format' );
358
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
359
-
360
- if( $schedule_mail == 'hourly' ) {
361
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
362
- } elseif( $schedule_mail == 'twicedaily' ) {
363
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
364
- } elseif( $schedule_mail == 'daily' ) {
365
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
366
- }
367
-
368
- $dateFormat = get_option( 'date_format' );
369
- $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
370
- $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
371
-
372
- if( $fileDate >= $lastday ) {
373
- array_push( $themeNames, $path_parts['filename'] );
374
- array_push( $themeDates, $fileDate );
375
- array_push( $themeTimes, $timestamp );
376
- }
377
-
378
- }
379
-
380
- $totalNumP = 0;
381
- $totalNumT = 0;
382
- $updatedListP = '';
383
- $updatedListT = '';
384
-
385
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
386
- $updatedListP .= '<ol>';
387
- $updatedListT .= '<ol>';
388
- }
389
-
390
- foreach ( $pluginDates as $key => $value ) {
391
-
392
- // Set up some var
393
- $plugin_name = $pluginNames[$key];
394
- $plugin_slug = $pluginSlug[$key];
395
- $to_version = __( "to version", "companion-auto-update" ).' '.$pluginVersion[$key];
396
- $more_info_arr = array( __( "Time of update", "companion-auto-update" ) => $pluginTimes[$key] );
397
-
398
- // Plugin links
399
- if( cau_get_db_value( 'plugin_links_emails' ) == 'on' ) {
400
- $more_info_arr[__( "Plugin details", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
401
- $more_info_arr[__( "Release notes", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/#developers'>".__( "Visit", "companion-auto-update" )."</a>";
402
- $more_info_arr[__( "Support", "companion-auto-update" )] = "<a href='https://wordpress.org/support/plugin/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
403
- }
404
-
405
- // Email format
406
- $use_html = ( cau_get_db_value( 'html_or_text' ) == 'html' ) ? true : false;
407
-
408
- // Email content
409
- $updatedListP .= $use_html ? "<li>" : "-"; // Start row
410
-
411
- $updatedListP .= $use_html ? "<strong>{$plugin_name}</strong> " : "{$plugin_name} "; // Show plugin name
412
- $updatedListP .= $to_version; // To version
413
-
414
- // Get advanced info
415
- if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) {
416
- foreach( $more_info_arr as $label => $value ) {
417
- $updatedListP .= $use_html ? "<br />{$label}: {$value}" : "\n{$label}: {$value}";
418
- }
419
- }
420
-
421
- $updatedListP .= $use_html ? "</li>" : "\n"; // End row
422
-
423
- $totalNumP++;
424
- }
425
-
426
- foreach ( $themeNames as $key => $value ) {
427
-
428
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
429
-
430
- $more_info = '';
431
- if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "<br /><span style='opacity: 0.5;'>".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key]."</span>";
432
- $updatedListT .= "<li><strong>".$themeNames[$key]."</strong>".$more_info."</li>";
433
-
434
- } else {
435
- $updatedListT .= "- ".$themeNames[$key]."\n";
436
- }
437
-
438
- $totalNumT++;
439
- }
440
-
441
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
442
- $updatedListP .= '</ol>';
443
- $updatedListT .= '</ol>';
444
- }
445
-
446
- // Set the email content type
447
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
448
- function cau_mail_content_type() {
449
- return 'text/html';
450
- }
451
- add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
452
- }
453
-
454
- // If plugins have been updated, send email
455
- if( $totalNumP > 0 ) {
456
-
457
- // E-mail content
458
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
459
- $type = __('plugins', 'companion-auto-update');
460
- $message = cau_updated_message( $type, $updatedListP );
461
-
462
- // Send to all addresses
463
- foreach ( cau_set_email() as $key => $value) {
464
- foreach ($value as $k => $v) {
465
- wp_mail( $v, $subject, $message );
466
- }
467
- break;
468
- }
469
-
470
- }
471
-
472
- // If themes have been updated, send email
473
- if( $totalNumT > 0 ) {
474
-
475
- // E-mail content
476
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
477
- $type = __('themes', 'companion-auto-update');
478
- $message = cau_updated_message( $type, $updatedListT );
479
-
480
- // Send to all addresses
481
- foreach ( cau_set_email() as $key => $value) {
482
- foreach ($value as $k => $v) {
483
- wp_mail( $v, $subject, $message );
484
- }
485
- break;
486
- }
487
-
488
- }
489
-
490
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
491
-
492
- // Prevent duplicate emails by setting the event again
493
- if( $totalNumT > 0 OR $totalNumP > 0 ) {
494
- if( $schedule_mail == 'hourly' ) {
495
- wp_clear_scheduled_hook('cau_set_schedule_mail');
496
- wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
497
- }
498
- }
499
-
500
- }
501
-
502
- function cau_notify_outofdate_db() {
503
-
504
- // Check if cau_get_db_value() function exists.
505
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
506
-
507
- // Database requires an update
508
- if ( cau_incorrectDatabaseVersion() ) {
509
-
510
- // Set up mail
511
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'We need your help with something', 'companion-auto-update' );
512
- $message = __( 'Hi there! We need your help updating the database of Companion Auto Update to the latest version. No rush, old features will continue to work but some new features might not work until you update the database.', 'companion-auto-update' );
513
-
514
- // Send to all addresses
515
- foreach ( cau_set_email() as $key => $value ) {
516
- foreach ( $value as $k => $v ) {
517
- wp_mail( $v, $subject, $message );
518
- }
519
- break;
520
- }
521
-
522
- }
523
-
524
- }
525
-
1
+ <?php
2
+
3
+ // Check if emails should be send or not
4
+ function cau_check_updates_mail() {
5
+
6
+ // Notify of pending updates
7
+ if( cau_get_db_value( 'send' ) == 'on' ) {
8
+ cau_list_theme_updates(); // Check for theme updates
9
+ cau_list_plugin_updates(); // Check for plugin updates
10
+ }
11
+
12
+ // Notify of completed updates
13
+ if( cau_get_db_value( 'sendupdate' ) == 'on' && cau_get_db_value( 'plugins' ) == 'on' ) {
14
+ cau_plugin_updated(); // Check for updated plugins
15
+ }
16
+
17
+ // Notify of required db update
18
+ if( cau_get_db_value( 'dbupdateemails' ) == 'on' ) {
19
+ cau_notify_outofdate_db();
20
+ }
21
+
22
+ }
23
+
24
+ // Notify of out of date software
25
+ function cau_outdated_notifier_mail() {
26
+ if( cau_get_db_value( 'sendoutdated' ) == 'on' ) {
27
+ cau_list_outdated_software(); // Check for oudated plugins
28
+ }
29
+ }
30
+
31
+ // Ge the emailadresses it should be send to
32
+ function cau_set_email() {
33
+
34
+ $emailArray = array();
35
+
36
+ if( cau_get_db_value( 'email' ) == '' ) {
37
+ array_push( $emailArray, get_option('admin_email') );
38
+ } else {
39
+ $emailAdresses = cau_get_db_value( 'email' );
40
+ $list = explode( ", ", $emailAdresses );
41
+ foreach ( $list as $key ) {
42
+ array_push( $emailArray, $list );
43
+ }
44
+ }
45
+
46
+ return $emailArray;
47
+
48
+ }
49
+
50
+ // Mail format
51
+ function cau_is_html() {
52
+
53
+ // Check if cau_get_db_value() function exists.
54
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
55
+
56
+ // Check if html
57
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
58
+ $html = true;
59
+ } else {
60
+ $html = false;
61
+ }
62
+
63
+ }
64
+
65
+ // Set the content for the emails about pending updates
66
+ function cau_outdated_message( $single, $plural, $list ) {
67
+
68
+ // WP version
69
+ $wpversion = get_bloginfo( 'version' );
70
+
71
+ // Base text
72
+ $text = sprintf( esc_html__( "You have %s on your WordPress site at %s that have not been tested with the latest 3 major releases of WordPress.", "companion-auto-update" ), $plural, get_site_url() );
73
+ $text .= "\n";
74
+ $text .= "\n";
75
+
76
+ // The list
77
+ if( !empty( $list ) ) {
78
+
79
+ $text .= sprintf( esc_html__( "The following %s have not been tested with WordPress %s:", "companion-auto-update" ), $plural, $wpversion );
80
+ $text .= "\n";
81
+ $text .= "\n";
82
+
83
+ foreach ( $list as $plugin => $version ) {
84
+ if( $version == '' ) $version = __( "Unknown", "companion-auto-update" );
85
+ $text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
86
+ }
87
+
88
+ }
89
+
90
+ return $text;
91
+
92
+ }
93
+
94
+ // Set the content for the emails about pending updates
95
+ function cau_pending_message( $single, $plural, $list ) {
96
+
97
+ // What markup to use
98
+ if( cau_is_html() ) $break = '<br />';
99
+ else $break = "\n";
100
+
101
+ // Base text
102
+ $text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
103
+ $text .= $break;
104
+
105
+ if( !empty( $list ) ) {
106
+
107
+ $text .= $break;
108
+ $text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
109
+ $text .= $break;
110
+
111
+ if( cau_is_html() ) $text .= "<ol>";
112
+ foreach ( $list as $key => $value ) {
113
+ if( cau_is_html() ) {
114
+ $text .= "<li>$value</li>";
115
+ } else {
116
+ $text .= "-$value\n";
117
+ }
118
+ }
119
+ if( cau_is_html() ) $text .= "</ol>";
120
+
121
+ $text .= $break;
122
+ }
123
+
124
+ $text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
125
+ $text .= $break;
126
+
127
+ // End
128
+ $text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' );
129
+
130
+ return $text;
131
+
132
+ }
133
+
134
+ // Set the content for the emails about recent updates
135
+ function cau_updated_message( $type, $updatedList ) {
136
+
137
+ // What markup to use
138
+ if( cau_is_html() ) $break = '<br />';
139
+ else $break = "\n";
140
+
141
+ // The message
142
+ $text = sprintf( esc_html__(
143
+ 'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part.
144
+ For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
145
+ ), $type, get_site_url() );
146
+
147
+ $text .= $break;
148
+ $text .= $break;
149
+ $text .= sprintf( esc_html__(
150
+ 'The following %1$s have been updated:', 'companion-auto-update'
151
+ ), $type );
152
+
153
+ $text .= $break;
154
+ $text .= $updatedList;
155
+
156
+ $text .= $break;
157
+ $text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" );
158
+
159
+ return $text;
160
+
161
+ }
162
+
163
+ // Checks if plugins are out of date
164
+ function cau_list_outdated_software() {
165
+
166
+ // Check if cau_get_db_value() function exists.
167
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
168
+
169
+ // Set up mail
170
+ $subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
171
+ $type = __( 'plugin', 'companion-auto-update' );
172
+ $type_plural = __( 'plugins', 'companion-auto-update' );
173
+ $message = cau_outdated_message( $type, $type_plural, cau_list_outdated() );
174
+
175
+ // Send to all addresses
176
+ foreach ( cau_set_email() as $key => $value ) {
177
+ foreach ( $value as $k => $v ) {
178
+ wp_mail( $v, $subject, $message );
179
+ }
180
+ break;
181
+ }
182
+
183
+ }
184
+
185
+ // Checks if theme updates are available
186
+ function cau_list_theme_updates() {
187
+
188
+ global $wpdb;
189
+ $table_name = $wpdb->prefix . "auto_updates";
190
+
191
+ $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
192
+ foreach ( $configs as $config ) {
193
+
194
+ if( $config->onoroff != 'on' ) {
195
+
196
+ require_once ABSPATH . '/wp-admin/includes/update.php';
197
+ $themes = get_theme_updates();
198
+ $list = array();
199
+
200
+ if ( !empty( $themes ) ) {
201
+
202
+ foreach ( $themes as $stylesheet => $theme ) {
203
+ array_push( $list, $theme->get( 'Name' ) );
204
+ }
205
+
206
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
207
+ $type = __('theme', 'companion-auto-update');
208
+ $type_plural = __('themes', 'companion-auto-update');
209
+ $message = cau_pending_message( $type, $type_plural, $list );
210
+
211
+ foreach ( cau_set_email() as $key => $value) {
212
+ foreach ($value as $k => $v) {
213
+ wp_mail( $v, $subject, $message );
214
+ }
215
+ break;
216
+ }
217
+ }
218
+
219
+ }
220
+
221
+ }
222
+
223
+ }
224
+
225
+ // Checks if plugin updates are available
226
+ function cau_list_plugin_updates() {
227
+
228
+ global $wpdb;
229
+ $table_name = $wpdb->prefix . "auto_updates";
230
+
231
+ $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
232
+ foreach ( $configs as $config ) {
233
+
234
+ if( $config->onoroff != 'on' ) {
235
+
236
+ require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
237
+
238
+ if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
239
+ $plugins = get_plugin_updates();
240
+
241
+ if ( !empty( $plugins ) ) {
242
+
243
+ $list = array();
244
+ foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
245
+ $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
246
+ $name = $plugin_data->Name;
247
+ array_push( $list, $name );
248
+ }
249
+
250
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
251
+ $type = __( 'plugin', 'companion-auto-update' );
252
+ $type_plural = __( 'plugins', 'companion-auto-update' );
253
+ $message = cau_pending_message( $type, $type_plural, $list );
254
+
255
+ foreach ( cau_set_email() as $key => $value) {
256
+ foreach ($value as $k => $v) {
257
+ wp_mail( $v, $subject, $message );
258
+ }
259
+ break;
260
+ }
261
+ }
262
+
263
+ }
264
+
265
+ }
266
+ }
267
+
268
+ // Alerts when plugin has been updated
269
+ function cau_plugin_updated() {
270
+
271
+ // Check if cau_get_db_value() function exists.
272
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
273
+
274
+ // Set the correct timezone for emails
275
+ date_default_timezone_set( cau_get_proper_timezone() );
276
+
277
+ // Create arrays
278
+ $pluginNames = array();
279
+ $pluginDates = array();
280
+ $pluginVersion = array();
281
+ $pluginSlug = array();
282
+ $pluginTimes = array();
283
+ $themeNames = array();
284
+ $themeDates = array();
285
+ $themeTimes = array();
286
+
287
+ // Where to look for plugins
288
+ $plugdir = plugin_dir_path( __DIR__ );
289
+ if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists.
290
+ $allPlugins = get_plugins();
291
+
292
+ // Where to look for themes
293
+ $themedir = get_theme_root();
294
+ $allThemes = wp_get_themes();
295
+
296
+ // Mail schedule
297
+ $schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
298
+
299
+ // Loop trough all plugins
300
+ foreach ( $allPlugins as $key => $value ) {
301
+
302
+ // Get plugin data
303
+ $fullPath = $plugdir.'/'.$key;
304
+ $getFile = $path_parts = pathinfo( $fullPath );
305
+ $pluginData = get_plugin_data( $fullPath );
306
+
307
+ // Get the slug
308
+ $explosion = explode( '/', $key );
309
+ $actualSlug = array_shift( $explosion );
310
+
311
+ // Get last update date
312
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
313
+
314
+ switch ( $schedule_mail ) {
315
+ case 'hourly':
316
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
317
+ break;
318
+ case 'twicedaily':
319
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
320
+ break;
321
+ default:
322
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
323
+ break;
324
+ }
325
+
326
+ $dateFormat = get_option( 'date_format' );
327
+ $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
328
+ $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
329
+
330
+ if( $fileDate >= $lastday ) {
331
+
332
+ // Get plugin name
333
+ foreach ( $pluginData as $dataKey => $dataValue ) {
334
+ if( $dataKey == 'Name') {
335
+ array_push( $pluginNames , $dataValue );
336
+ }
337
+ if( $dataKey == 'Version') {
338
+ array_push( $pluginVersion , $dataValue );
339
+ }
340
+ }
341
+
342
+ array_push( $pluginDates, $fileDate );
343
+ array_push( $pluginSlug, $actualSlug );
344
+ array_push( $pluginTimes, $timestamp );
345
+ }
346
+
347
+ }
348
+
349
+ // Loop trough all themes
350
+ foreach ( $allThemes as $key => $value ) {
351
+
352
+ // Get theme data
353
+ $fullPath = $themedir.'/'.$key;
354
+ $getFile = $path_parts = pathinfo( $fullPath );
355
+
356
+ // Get last update date
357
+ $dateFormat = get_option( 'date_format' );
358
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
359
+
360
+ if( $schedule_mail == 'hourly' ) {
361
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
362
+ } elseif( $schedule_mail == 'twicedaily' ) {
363
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
364
+ } elseif( $schedule_mail == 'daily' ) {
365
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
366
+ }
367
+
368
+ $dateFormat = get_option( 'date_format' );
369
+ $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
370
+ $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
371
+
372
+ if( $fileDate >= $lastday ) {
373
+ array_push( $themeNames, $path_parts['filename'] );
374
+ array_push( $themeDates, $fileDate );
375
+ array_push( $themeTimes, $timestamp );
376
+ }
377
+
378
+ }
379
+
380
+ $totalNumP = 0;
381
+ $totalNumT = 0;
382
+ $updatedListP = '';
383
+ $updatedListT = '';
384
+
385
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
386
+ $updatedListP .= '<ol>';
387
+ $updatedListT .= '<ol>';
388
+ }
389
+
390
+ foreach ( $pluginDates as $key => $value ) {
391
+
392
+ // Set up some var
393
+ $plugin_name = $pluginNames[$key];
394
+ $plugin_slug = $pluginSlug[$key];
395
+ $to_version = __( "to version", "companion-auto-update" ).' '.$pluginVersion[$key];
396
+ $more_info_arr = array( __( "Time of update", "companion-auto-update" ) => $pluginTimes[$key] );
397
+
398
+ // Plugin links
399
+ if( cau_get_db_value( 'plugin_links_emails' ) == 'on' ) {
400
+ $more_info_arr[__( "Plugin details", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
401
+ $more_info_arr[__( "Release notes", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/#developers'>".__( "Visit", "companion-auto-update" )."</a>";
402
+ $more_info_arr[__( "Support", "companion-auto-update" )] = "<a href='https://wordpress.org/support/plugin/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
403
+ }
404
+
405
+ // Email format
406
+ $use_html = ( cau_get_db_value( 'html_or_text' ) == 'html' ) ? true : false;
407
+
408
+ // Email content
409
+ $updatedListP .= $use_html ? "<li>" : "-"; // Start row
410
+
411
+ $updatedListP .= $use_html ? "<strong>{$plugin_name}</strong> " : "{$plugin_name} "; // Show plugin name
412
+ $updatedListP .= $to_version; // To version
413
+
414
+ // Get advanced info
415
+ if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) {
416
+ foreach( $more_info_arr as $label => $value ) {
417
+ $updatedListP .= $use_html ? "<br />{$label}: {$value}" : "\n{$label}: {$value}";
418
+ }
419
+ }
420
+
421
+ $updatedListP .= $use_html ? "</li>" : "\n"; // End row
422
+
423
+ $totalNumP++;
424
+ }
425
+
426
+ foreach ( $themeNames as $key => $value ) {
427
+
428
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
429
+
430
+ $more_info = '';
431
+ if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "<br /><span style='opacity: 0.5;'>".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key]."</span>";
432
+ $updatedListT .= "<li><strong>".$themeNames[$key]."</strong>".$more_info."</li>";
433
+
434
+ } else {
435
+ $updatedListT .= "- ".$themeNames[$key]."\n";
436
+ }
437
+
438
+ $totalNumT++;
439
+ }
440
+
441
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
442
+ $updatedListP .= '</ol>';
443
+ $updatedListT .= '</ol>';
444
+ }
445
+
446
+ // Set the email content type
447
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
448
+ function cau_mail_content_type() {
449
+ return 'text/html';
450
+ }
451
+ add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
452
+ }
453
+
454
+ // If plugins have been updated, send email
455
+ if( $totalNumP > 0 ) {
456
+
457
+ // E-mail content
458
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
459
+ $type = __('plugins', 'companion-auto-update');
460
+ $message = cau_updated_message( $type, $updatedListP );
461
+
462
+ // Send to all addresses
463
+ foreach ( cau_set_email() as $key => $value) {
464
+ foreach ($value as $k => $v) {
465
+ wp_mail( $v, $subject, $message );
466
+ }
467
+ break;
468
+ }
469
+
470
+ }
471
+
472
+ // If themes have been updated, send email
473
+ if( $totalNumT > 0 ) {
474
+
475
+ // E-mail content
476
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
477
+ $type = __('themes', 'companion-auto-update');
478
+ $message = cau_updated_message( $type, $updatedListT );
479
+
480
+ // Send to all addresses
481
+ foreach ( cau_set_email() as $key => $value) {
482
+ foreach ($value as $k => $v) {
483
+ wp_mail( $v, $subject, $message );
484
+ }
485
+ break;
486
+ }
487
+
488
+ }
489
+
490
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
491
+
492
+ // Prevent duplicate emails by setting the event again
493
+ if( $totalNumT > 0 OR $totalNumP > 0 ) {
494
+ if( $schedule_mail == 'hourly' ) {
495
+ wp_clear_scheduled_hook('cau_set_schedule_mail');
496
+ wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
497
+ }
498
+ }
499
+
500
+ }
501
+
502
+ function cau_notify_outofdate_db() {
503
+
504
+ // Check if cau_get_db_value() function exists.
505
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
506
+
507
+ // Database requires an update
508
+ if ( cau_incorrectDatabaseVersion() ) {
509
+
510
+ // Set up mail
511
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'We need your help with something', 'companion-auto-update' );
512
+ $message = __( 'Hi there! We need your help updating the database of Companion Auto Update to the latest version. No rush, old features will continue to work but some new features might not work until you update the database.', 'companion-auto-update' );
513
+
514
+ // Send to all addresses
515
+ foreach ( cau_set_email() as $key => $value ) {
516
+ foreach ( $value as $k => $v ) {
517
+ wp_mail( $v, $subject, $message );
518
+ }
519
+ break;
520
+ }
521
+
522
+ }
523
+
524
+ }
525
+
cau_functions.php CHANGED
@@ -1,1441 +1,1440 @@
1
- <?php
2
-
3
- // What user rights can edit plugin settings?
4
- function cau_allowed_user_rights() {
5
-
6
- // Current user
7
- $user = wp_get_current_user();
8
-
9
- // Allow roles
10
- $allowed_roles = array( 'administrator' );
11
- if( cau_get_db_value( 'allow_editor' ) == 'on' ) array_push( $allowed_roles, 'editor' );
12
- if( cau_get_db_value( 'allow_author' ) == 'on' ) array_push( $allowed_roles, 'author' );
13
-
14
- // Check
15
- if ( array_intersect( $allowed_roles, $user->roles ) ) {
16
- return true;
17
- } else {
18
- return false;
19
- }
20
- }
21
-
22
- // Get database value
23
- function cau_get_db_value( $name, $table = 'auto_updates' ) {
24
-
25
- global $wpdb;
26
- $table_name = $wpdb->prefix.$table;
27
- $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE name = '%s'", $name ) );
28
- foreach ( $cau_configs as $config ) return $config->onoroff;
29
-
30
- }
31
-
32
- // Get database value
33
- function cau_get_plugininfo( $check, $field ) {
34
-
35
- global $wpdb;
36
- $table_name = $wpdb->prefix.'update_log';
37
- $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) );
38
- foreach ( $cau_configs as $config ) return $config->$field;
39
-
40
- }
41
-
42
- // Get the set timezone
43
- function cau_get_proper_timezone() {
44
-
45
- // WP 5.3 adds the wp_timezone_string function
46
- if ( !function_exists( 'wp_timezone_string' ) ) {
47
- $timezone = get_option( 'timezone_string' );
48
- } else {
49
- $timezone = wp_timezone_string();
50
- }
51
-
52
- // Should fix an reported issue
53
- if( $timezone == '+00:00' ) {
54
- $timezone = 'UTC';
55
- }
56
-
57
- return $timezone;
58
-
59
- }
60
-
61
- // Copy of the wp_timezone_string for < 5.3 compat
62
- if ( !function_exists( 'wp_timezone_string' ) ) {
63
- function wp_timezone_string() {
64
- $timezone_string = get_option( 'timezone_string' );
65
-
66
- if ( $timezone_string ) {
67
- return $timezone_string;
68
- }
69
-
70
- $offset = (float) get_option( 'gmt_offset' );
71
- $hours = (int) $offset;
72
- $minutes = ( $offset - $hours );
73
-
74
- $sign = ( $offset < 0 ) ? '-' : '+';
75
- $abs_hour = abs( $hours );
76
- $abs_mins = abs( $minutes * 60 );
77
- $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
78
-
79
- return $tz_offset;
80
- }
81
- }
82
-
83
- // List of incompatible plugins
84
- function cau_incompatiblePluginlist() {
85
-
86
- // Pluginlist, write as Plugin path => Issue
87
- $pluginList = array(
88
- 'better-wp-security/better-wp-security.php' => "<span class='cau_disabled'><span class='dashicons dashicons-no'></span></span> May block auto-updating for everything.",
89
- 'updraftplus/updraftplus.php' => "<span class='cau_warning'><span class='dashicons dashicons-warning'></span></span> By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. <u>Causes no issues with other plugins.</u>"
90
- );
91
-
92
- return $pluginList;
93
-
94
- }
95
- function cau_incompatiblePlugins() {
96
-
97
- $return = false;
98
-
99
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
100
- if( is_plugin_active( $key ) ) {
101
- $return = true;
102
- }
103
- }
104
-
105
- return $return;
106
-
107
- }
108
-
109
- // Check if has issues
110
- function cau_pluginHasIssues() {
111
-
112
- $return = false;
113
-
114
- if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) {
115
- $return = true;
116
- }
117
-
118
- if( checkAutomaticUpdaterDisabled() ) {
119
- $return = true;
120
- }
121
-
122
- if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) {
123
- $return = true;
124
- }
125
-
126
- if( cau_incorrectDatabaseVersion() ) {
127
- $return = true;
128
- }
129
-
130
- return $return;
131
- }
132
- function cau_pluginIssueLevels() {
133
-
134
- if( checkAutomaticUpdaterDisabled() ) {
135
- $level = 'high';
136
- } else {
137
- $level = 'low';
138
- }
139
-
140
- return $level;
141
- }
142
- function cau_pluginIssueCount() {
143
-
144
- $count = 0;
145
-
146
- if( get_option( 'blog_public' ) == 0 ) {
147
- $count++;
148
- }
149
- if( checkAutomaticUpdaterDisabled() ) {
150
- $count++;
151
- }
152
- if( checkCronjobsDisabled() ) {
153
- $count++;
154
- }
155
- if( cau_incompatiblePlugins() ) {
156
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
157
- if( is_plugin_active( $key ) ) {
158
- $count++;
159
- }
160
- }
161
- }
162
-
163
- return $count;
164
- }
165
- function cau_incorrectDatabaseVersion() {
166
- if( get_option( "cau_db_version" ) != cau_db_version() ) {
167
- return true;
168
- } else {
169
- return false;
170
- }
171
- }
172
-
173
- // Run custom hooks on plugin update
174
- function cau_run_custom_hooks_p() {
175
-
176
- // Check if function exists
177
- if ( ! function_exists( 'get_plugins' ) ) {
178
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
179
- }
180
-
181
- // Create array
182
- $allDates = array();
183
-
184
- // Where to look for plugins
185
- $dirr = plugin_dir_path( __DIR__ );
186
- $listOfAll = get_plugins();
187
-
188
- // Number of updates
189
- $numOfUpdates = 0;
190
-
191
- // Loop trough all plugins
192
- foreach ( $listOfAll as $key => $value ) {
193
-
194
- // Get data
195
- $fullPath = $dirr.'/'.$key;
196
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
197
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
198
- $updateSched = wp_get_schedule( 'wp_update_plugins' );
199
-
200
- // Check when the last update was
201
- if( $updateSched == 'hourly' ) {
202
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
203
- } elseif( $updateSched == 'twicedaily' ) {
204
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
205
- } elseif( $updateSched == 'daily' ) {
206
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
207
- } elseif( $updateSched == 'weekly' ) {
208
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
209
- } elseif( $updateSched == 'monthly' ) {
210
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
211
- } else {
212
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
213
- }
214
-
215
- $update_time = wp_next_scheduled( 'wp_update_plugins' );
216
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
217
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
218
-
219
- if( $fileDate >= $lastday ) {
220
-
221
- // Push to array
222
- array_push( $allDates, $fileDate );
223
-
224
- // Update info
225
- if( $fileTime > $range_start && $fileTime < $range_end ) {
226
- $status = __( 'Automatic', 'companion-auto-update' );
227
- } else {
228
- $status = __( 'Manual', 'companion-auto-update' );
229
- }
230
-
231
- $numOfUpdates++;
232
-
233
- cau_updatePluginInformation( $key, $status );
234
-
235
- }
236
-
237
- }
238
-
239
- // If there have been plugin updates run hook
240
- if( $numOfUpdates >= 1 ) {
241
- do_action( 'cau_after_plugin_update' );
242
- }
243
-
244
- }
245
-
246
- // Run custom hooks on theme update
247
- function cau_run_custom_hooks_t() {
248
-
249
- // Create array
250
- $allDates = array();
251
-
252
- // Where to look for plugins
253
- $dirr = get_theme_root();
254
- $listOfAll = wp_get_themes();
255
-
256
- // Loop trough all plugins
257
- foreach ( $listOfAll as $key => $value) {
258
-
259
- // Get data
260
- $fullPath = $dirr.'/'.$key;
261
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
262
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
263
- $updateSched = wp_get_schedule( 'wp_update_themes' );
264
-
265
- // Check when the last update was
266
- if( $updateSched == 'hourly' ) {
267
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
268
- } elseif( $updateSched == 'twicedaily' ) {
269
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
270
- } elseif( $updateSched == 'daily' ) {
271
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
272
- } elseif( $updateSched == 'weekly' ) {
273
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
274
- } elseif( $updateSched == 'monthly' ) {
275
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
276
- } else {
277
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
278
- }
279
-
280
- $update_time = wp_next_scheduled( 'wp_update_themes' );
281
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
282
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
283
-
284
- if( $fileDate >= $lastday ) {
285
-
286
- // Push to array
287
- array_push( $allDates, $fileDate );
288
-
289
- // Update info
290
- if( $fileTime > $range_start && $fileTime < $range_end ) {
291
- $status = __( 'Automatic', 'companion-auto-update' );
292
- } else {
293
- $status = __( 'Manual', 'companion-auto-update' );
294
- }
295
- cau_updatePluginInformation( $key, $status );
296
-
297
- }
298
-
299
- }
300
-
301
- $totalNum = 0;
302
-
303
- // Count number of updated plugins
304
- foreach ( $allDates as $key => $value ) $totalNum++;
305
-
306
- // If there have been plugin updates run hook
307
- if( $totalNum > 0 ) {
308
- do_action( 'cau_after_theme_update' );
309
- }
310
-
311
- }
312
-
313
- // Run custom hooks on core update
314
- function cau_run_custom_hooks_c() {
315
-
316
- // Create array
317
- $totalNum = 0;
318
-
319
- // Get data
320
- $fullPath = ABSPATH.'wp-includes/version.php';
321
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
322
- $updateSched = wp_get_schedule( 'wp_version_check' );
323
-
324
- // Check when the last update was
325
- if( $updateSched == 'hourly' ) {
326
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
327
- } elseif( $updateSched == 'twicedaily' ) {
328
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
329
- } elseif( $updateSched == 'daily' ) {
330
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
331
- } elseif( $updateSched == 'weekly' ) {
332
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
333
- } elseif( $updateSched == 'monthly' ) {
334
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
335
- } else {
336
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
337
- }
338
-
339
- // Check manual or automatic
340
- $update_time = wp_next_scheduled( 'wp_version_check' );
341
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
342
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
343
-
344
- if( $fileDate >= $lastday ) {
345
-
346
- // Update info
347
- if( $fileDate > $range_start && $fileDate < $range_end ) {
348
- $status = __( 'Automatic', 'companion-auto-update' );
349
- } else {
350
- $status = __( 'Manual', 'companion-auto-update' );
351
- }
352
- cau_updatePluginInformation( 'core', $status );
353
-
354
- $totalNum++;
355
-
356
- }
357
-
358
- // If there have been plugin updates run hook
359
- if( $totalNum > 0 ) {
360
- do_action( 'cau_after_core_update' );
361
- }
362
-
363
- }
364
-
365
- // Check if automatic updating is disabled globally
366
- function checkAutomaticUpdaterDisabled() {
367
-
368
- // I mean, I know this can be done waaaay better but I's quite late and I need to push a fix so take it or leave it untill I decide to fix this :)
369
-
370
- if ( defined( 'automatic_updater_disabled' ) ) {
371
- if( doing_filter( 'automatic_updater_disabled' ) ) {
372
- return true;
373
- } elseif( constant( 'automatic_updater_disabled' ) == 'true' ) {
374
- return true;
375
- } elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) {
376
- return true;
377
- } else {
378
- return false;
379
- }
380
-
381
- } else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
382
- if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
383
- return true;
384
- } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) {
385
- return true;
386
- } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) {
387
- return true;
388
- } else {
389
- return false;
390
- }
391
-
392
- } else {
393
- return false;
394
- }
395
-
396
- }
397
-
398
- // Check if cronjobs are disabled
399
- function checkCronjobsDisabled() {
400
-
401
- if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) {
402
- return true;
403
- } else {
404
- return false;
405
- }
406
-
407
- }
408
-
409
- // Menu location
410
- function cau_menloc( $after = '' ) {
411
- return 'tools.php'.$after;
412
- }
413
- function cau_url( $tab = '' ) {
414
- return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) );
415
- }
416
-
417
- // Get the active tab
418
- function active_tab( $page, $identifier = 'tab' ) {
419
- echo _active_tab( $page, $identifier );
420
- }
421
- function _active_tab( $page, $identifier = 'tab' ) {
422
-
423
- if( !isset( $_GET[ $identifier ] ) ) {
424
- $cur_page = '';
425
- } else {
426
- $cur_page = $_GET[ $identifier ];
427
- }
428
-
429
- if( $page == $cur_page ) {
430
- return 'nav-tab-active';
431
- }
432
-
433
- }
434
-
435
- // Get the active subtab
436
- function active_subtab( $page, $identifier = 'tab' ) {
437
-
438
- if( !isset( $_GET[ $identifier ] ) ) {
439
- $cur_page = '';
440
- } else {
441
- $cur_page = $_GET[ $identifier ];
442
- }
443
-
444
- if( $page == $cur_page ) {
445
- echo 'current';
446
- }
447
-
448
- }
449
-
450
- // List of plugins that should not be updated
451
- function donotupdatelist( $filter = 'plugins' ) {
452
-
453
- // Select correct database row
454
- switch ( $filter ) {
455
- case 'themes':
456
- $db_table = 'notUpdateListTh';
457
- break;
458
- case 'plugins':
459
- $db_table = 'notUpdateList';
460
- break;
461
- default:
462
- $db_table = 'notUpdateList';
463
- break;
464
- }
465
-
466
- // Create list
467
- global $wpdb;
468
- $table_name = $wpdb->prefix."auto_updates";
469
- $config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'");
470
-
471
- $list = $config[0]->onoroff;
472
- $list = explode( ", ", $list );
473
- $returnList = array();
474
-
475
- foreach ( $list as $key ) array_push( $returnList, $key );
476
-
477
- return $returnList;
478
-
479
- }
480
- function plugins_donotupdatelist() {
481
-
482
- // Base array
483
- $array = array();
484
-
485
- // Filtered plugins
486
- $filteredplugins = donotupdatelist( 'plugins' );
487
- foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin );
488
-
489
- // Plugin added to the delay list
490
- $delayedplugins = cau_delayed_updates__formated();
491
- foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin );
492
-
493
- // Return array
494
- return $array;
495
- }
496
- function themes_donotupdatelist() {
497
- return donotupdatelist( 'themes' );
498
- }
499
-
500
- // Show the update log
501
- function cau_fetch_log( $limit, $format = 'simple' ) {
502
-
503
- // Database
504
- global $wpdb;
505
- $updateLog = "update_log";
506
- $updateLogDB = $wpdb->prefix.$updateLog;
507
-
508
- // Filter log
509
- if( isset( $_GET['filter'] ) ) {
510
- $filter = $_GET['filter'];
511
- } else {
512
- $filter = 'all';
513
- }
514
-
515
- switch( $filter ) {
516
-
517
- case 'plugins':
518
- $plugins = true;
519
- $themes = false;
520
- $core = false;
521
- $translations = false;
522
- break;
523
-
524
- case 'themes':
525
- $plugins = false;
526
- $themes = true;
527
- $core = false;
528
- $translations = false;
529
- break;
530
-
531
- case 'translations':
532
- $plugins = false;
533
- $themes = false;
534
- $core = false;
535
- $translations = true;
536
- break;
537
-
538
- default:
539
- $plugins = true;
540
- $themes = true;
541
- $core = true;
542
- $translations = false;
543
- break;
544
- }
545
-
546
- // Create arrays
547
- $pluginNames = array();
548
- $pluginVersion = array();
549
- $pluginDates = array();
550
- $pluginDatesF = array();
551
- $plugslug = array();
552
- $type = array();
553
- $method = array();
554
-
555
- // Date format
556
- $dateFormat = get_option( 'date_format' );
557
-
558
- // PLUGINS
559
- if( $plugins ) {
560
-
561
- // Check if function exists
562
- if ( ! function_exists( 'get_plugins' ) ) {
563
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
564
- }
565
-
566
- // Where to look for plugins
567
- $plugdir = plugin_dir_path( __DIR__ );
568
- $allPlugins = get_plugins();
569
-
570
- // Loop trough all plugins
571
- foreach ( $allPlugins as $key => $value) {
572
-
573
- // Get plugin data
574
- $fullPath = $plugdir.'/'.$key;
575
- $getFile = $path_parts = pathinfo( $fullPath );
576
- $pluginData = get_plugin_data( $fullPath );
577
- $pluginSlug = explode( "/", plugin_basename( $key ) );
578
- $pluginSlug = $pluginSlug[0];
579
-
580
- array_push( $plugslug , $pluginSlug );
581
-
582
- // Automatic or Manual (non-db-version)
583
- $date_tod = date ( 'ydm' );
584
- $fileDay = date ( 'ydm', filemtime( $fullPath ) );
585
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
586
- $updateSched = wp_next_scheduled( 'wp_update_plugins' );
587
- $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
588
- $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
589
-
590
- if( $date_tod == $fileDay ) {
591
-
592
- if( $fileTime > $range_start && $fileTime < $range_end ) {
593
- $status = __( 'Automatic', 'companion-auto-update' );
594
- } else {
595
- $status = __( 'Manual', 'companion-auto-update' );
596
- }
597
-
598
- array_push( $method , $status );
599
-
600
- } else {
601
-
602
- // Get info from database
603
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
604
- array_push( $method , cau_get_plugininfo( $key, 'method' ) );
605
- } else {
606
- array_push( $method , '-' );
607
- }
608
-
609
- }
610
-
611
- // Get plugin name
612
- foreach ( $pluginData as $dataKey => $dataValue ) {
613
- if( $dataKey == 'Name') {
614
- array_push( $pluginNames , $dataValue );
615
- }
616
- if( $dataKey == 'Version') {
617
- array_push( $pluginVersion , $dataValue );
618
- }
619
- }
620
-
621
- // Get last update date
622
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
623
- if( $format == 'table' ) {
624
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
625
- $fileDateF .= ' &dash; '.date( 'H:i', filemtime( $fullPath ) );
626
- } else {
627
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
628
- }
629
- array_push( $pluginDates, $fileDate );
630
- array_push( $pluginDatesF, $fileDateF );
631
- array_push( $type, 'Plugin' );
632
-
633
- }
634
-
635
- }
636
-
637
- // THEMES
638
- if( $themes ) {
639
-
640
- // Where to look for themes
641
- $themedir = get_theme_root();
642
- $allThemes = wp_get_themes();
643
-
644
- // Loop trough all themes
645
- foreach ( $allThemes as $key => $value) {
646
-
647
- // Get theme data
648
- $fullPath = $themedir.'/'.$key;
649
- $getFile = $path_parts = pathinfo( $fullPath );
650
-
651
- // Get theme name
652
- $theme_data = wp_get_theme( $path_parts['filename'] );
653
- $themeName = $theme_data->get( 'Name' );
654
- $themeVersion = $theme_data->get( 'Version' );
655
- array_push( $pluginNames , $themeName );
656
- array_push( $pluginVersion , $themeVersion );
657
-
658
- // Automatic or Manual (non-db-version)
659
- $date_tod = date ( 'ydm' );
660
- $fileDay = date ( 'ydm', filemtime( $fullPath ) );
661
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
662
- $updateSched = wp_next_scheduled( 'wp_update_themes' );
663
- $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
664
- $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
665
-
666
- if( $date_tod == $fileDay ) {
667
-
668
- if( $fileTime > $range_start && $fileTime < $range_end ) {
669
- $status = __( 'Automatic', 'companion-auto-update' );
670
- } else {
671
- $status = __( 'Manual', 'companion-auto-update' );
672
- }
673
-
674
- array_push( $method , $status );
675
-
676
- } else {
677
-
678
- // Get info from database
679
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
680
- array_push( $method , cau_get_plugininfo( $key, 'method' ) );
681
- } else {
682
- array_push( $method , '-' );
683
- }
684
-
685
- }
686
-
687
- // Get last update date
688
- $fileDate = date( 'YmdHi', filemtime( $fullPath ) );
689
-
690
- if( $format == 'table' ) {
691
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
692
- $fileDateF .= ' &dash; '.date ( 'H:i', filemtime( $fullPath ) );
693
- } else {
694
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
695
- }
696
-
697
- array_push( $pluginDates, $fileDate );
698
- array_push( $pluginDatesF, $fileDateF );
699
- array_push( $type, 'Theme' );
700
- array_push( $plugslug , '' );
701
-
702
- }
703
-
704
- }
705
-
706
- // TRANSLATIONS
707
- if( $translations ) {
708
-
709
- // There is no way (at this time) to check if someone changed this link, so therefore it won't work when it's changed, sorry
710
- $transFolder = get_home_path().'wp-content/languages';
711
- if( file_exists( $transFolder ) ) {
712
-
713
- $allThemTranslations = array();
714
- $allThemTypes = array();
715
-
716
- $pt = __( 'Plugin translations', 'companion-auto-update' );
717
- $tt = __( 'Theme translations', 'companion-auto-update' );
718
- $ct = __( 'Core translations', 'companion-auto-update' );
719
-
720
- // Plugin translations
721
- $files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE );
722
- foreach( $files as $file ) {
723
- array_push( $allThemTranslations, $file );
724
- array_push( $allThemTypes, $pt );
725
- }
726
-
727
- // Theme translations
728
- $files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE );
729
- foreach( $files as $file ) {
730
- array_push( $allThemTranslations, $file );
731
- array_push( $allThemTypes, $tt );
732
- }
733
-
734
- // Core translations
735
- $files = glob( $transFolder.'/*.{mo}', GLOB_BRACE );
736
- foreach( $files as $file ) {
737
- array_push( $allThemTranslations, $file );
738
- array_push( $allThemTypes, $ct );
739
- }
740
-
741
- foreach( $allThemTranslations as $key => $trans_file ) {
742
-
743
- $transDate = date( 'YmdHi', filemtime( $trans_file ) );
744
-
745
- if( $format == 'table' ) {
746
- $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
747
- $transDateF .= ' &dash; '.date ( 'H:i', filemtime( $trans_file ) );
748
- } else {
749
- $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
750
- }
751
-
752
- $trans_name = basename( $trans_file );
753
- $trans_name = str_replace( "-", " ", $trans_name );
754
- $trans_name = str_replace( ".mo", "", $trans_name );
755
- $trans_name = str_replace( ".json", "", $trans_name );
756
- $trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 );
757
- $trans_name = str_replace( $trans_lang, "", $trans_name );
758
- $trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 );
759
-
760
- // Push
761
- array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang );
762
- array_push( $type, $allThemTypes[$key] );
763
- array_push( $pluginVersion, '-' );
764
- array_push( $pluginDates, $transDate );
765
- array_push( $pluginDatesF, $transDateF );
766
- array_push( $plugslug , '' );
767
- array_push( $method , '-' );
768
-
769
- }
770
-
771
- } else {
772
-
773
- $transDate = date('YmdHi');
774
- $transDateF = 'Could not read translations date.';
775
-
776
- array_push( $pluginNames, 'Translations' );
777
- array_push( $type, $trans_type.' translations' );
778
- array_push( $pluginVersion, '-' );
779
- array_push( $pluginDates, $transDate );
780
- array_push( $pluginDatesF, $transDateF );
781
- array_push( $plugslug , '' );
782
-
783
- // Get info from database
784
- array_push( $method , '-' );
785
-
786
- }
787
-
788
- }
789
-
790
- // CORE
791
- if( $core ) {
792
-
793
- $coreFile = ABSPATH.'wp-includes/version.php';
794
- $updateSched = wp_next_scheduled( 'wp_version_check' );
795
-
796
- if( file_exists( $coreFile ) ) {
797
-
798
- $coreDate = date( 'YmdHi', filemtime( $coreFile ) );
799
-
800
- if( $format == 'table' ) {
801
- $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
802
- $coreDateF .= ' &dash; '.date ( 'H:i', filemtime( $coreFile ) );
803
- } else {
804
- $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
805
- }
806
-
807
- // Automatic or Manual (non-db-version)
808
- $date_tod = date ( 'ydm' );
809
- $fileDay = date ( 'ydm', filemtime( $coreFile ) );
810
- $fileTime = date ( 'Hi', filemtime( $coreFile ) );
811
- $update_time = wp_next_scheduled( 'wp_version_check' );
812
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
813
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
814
-
815
- if( $date_tod == $fileDay ) {
816
-
817
- if( $fileTime > $range_start && $fileTime < $range_end ) {
818
- $methodVal = __( 'Automatic', 'companion-auto-update' );
819
- } else {
820
- $methodVal = __( 'Manual', 'companion-auto-update' );
821
- }
822
-
823
- } else {
824
-
825
- // Get info from database
826
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
827
- $methodVal = cau_get_plugininfo( 'core', 'method' );
828
- } else {
829
- $methodVal = '';
830
- }
831
-
832
- }
833
-
834
-
835
- } else {
836
- $coreDate = date('YmdHi');
837
- $coreDateF = 'Could not read core date.';
838
- }
839
-
840
- array_push( $pluginNames, 'WordPress' );
841
- array_push( $type, 'WordPress' );
842
- array_push( $pluginVersion, get_bloginfo( 'version' ) );
843
- array_push( $pluginDates, $coreDate );
844
- array_push( $pluginDatesF, $coreDateF );
845
- array_push( $plugslug , '' );
846
-
847
- // Get info from database
848
- array_push( $method , $methodVal );
849
-
850
- }
851
-
852
- // Sort array by date
853
- arsort( $pluginDates );
854
-
855
- if( $limit == 'all' ) {
856
- $limit = 999;
857
- }
858
-
859
- $listClasses = 'wp-list-table widefat autoupdate autoupdatelog';
860
-
861
- if( $format == 'table' ) {
862
- $listClasses .= ' autoupdatelog striped';
863
- } else {
864
- $listClasses .= ' autoupdatewidget';
865
- }
866
-
867
- echo '<table class="'.$listClasses.'">';
868
-
869
- // Show the last updated plugins
870
- if( $format == 'table' ) {
871
-
872
- echo '<thead>
873
- <tr>
874
- <th><strong>'.__( 'Name', 'companion-auto-update' ).'</strong></th>';
875
- if( !$translations ) echo '<th><strong>'.__( 'To version', 'companion-auto-update' ).'</strong></th>';
876
- echo '<th><strong>'.__( 'Type', 'companion-auto-update' ).'</strong></th>
877
- <th><strong>'.__( 'Last updated on', 'companion-auto-update' ).'</strong></th>
878
- <th><strong>'.__( 'Update method', 'companion-auto-update' ).'</strong></th>
879
- </tr>
880
- </thead>';
881
-
882
- }
883
-
884
- echo '<tbody id="the-list">';
885
-
886
- $loopings = 0;
887
-
888
- foreach ( $pluginDates as $key => $value ) {
889
-
890
- if( $loopings < $limit ) {
891
-
892
- echo '<tr>';
893
-
894
- if( $format == 'table' ) {
895
- $pluginName = $pluginNames[$key];
896
- } else {
897
- $pluginName = substr( $pluginNames[$key], 0, 25);
898
- if( strlen( $pluginNames[$key] ) > 25 ) {
899
- $pluginName .= '...';
900
- }
901
- }
902
-
903
- echo '<td class="column-updatetitle"><p><strong title="'. $pluginNames[$key] .'">'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'</strong></p></td>';
904
-
905
- if( $format == 'table' ) {
906
-
907
- if( $type[$key] == 'Plugin' ) {
908
- $thisType = __( 'Plugin', 'companion-auto-update' );
909
- } else if( $type[$key] == 'Theme' ) {
910
- $thisType = __( 'Theme', 'companion-auto-update' );
911
- } else {
912
- $thisType = $type[$key];
913
- }
914
-
915
- if( !$translations ) echo '<td class="cau_hide_on_mobile column-version" style="min-width: 100px;"><p>'. $pluginVersion[$key] .'</p></td>';
916
- echo '<td class="cau_hide_on_mobile column-description"><p>'. $thisType .'</p></td>';
917
-
918
- }
919
-
920
- echo '<td class="column-date" style="min-width: 100px;"><p>'. $pluginDatesF[$key] .'</p></td>';
921
-
922
- if( $format == 'table' ) {
923
- echo '<td class="column-method"><p>'. $method[$key] .'</p></td>';
924
- }
925
-
926
- echo '</tr>';
927
-
928
- $loopings++;
929
-
930
- }
931
-
932
- }
933
-
934
- echo "</tbody></table>";
935
-
936
- }
937
-
938
- // Get the proper changelog URL
939
- function cau_getChangelogUrl( $type, $name, $plugslug ) {
940
-
941
- switch( $type ) {
942
- case 'WordPress':
943
- $url = '';
944
- break;
945
- case 'Plugin':
946
- $url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'&section=changelog&TB_iframe=true&width=772&height=772' );
947
- break;
948
- case 'Theme':
949
- $url = '';
950
- break;
951
- }
952
-
953
- if( !empty( $url ) ) {
954
- return '<a href="'.$url.'" class="thickbox open-plugin-details-modal" aria-label="More information about '.$name.'" data-title="'.$name.'">'.$name.'</a>';
955
- } else {
956
- return $name;
957
- }
958
-
959
- }
960
-
961
- // Only update plugins which are enabled
962
- function cau_dontUpdatePlugins( $update, $item ) {
963
-
964
- $plugins = plugins_donotupdatelist();
965
-
966
- if ( in_array( $item->slug, $plugins ) ) {
967
- return false; // Don't update these plugins
968
- } else {
969
- return true; // Always update these plugins
970
- }
971
-
972
-
973
- }
974
- function cau_dontUpdateThemes( $update, $item ) {
975
-
976
- $themes = themes_donotupdatelist();
977
-
978
- if ( in_array( $item->slug, $themes ) ) {
979
- return false; // Don't update these themes
980
- } else {
981
- return true; // Always update these themes
982
- }
983
-
984
-
985
- }
986
-
987
- // Get plugin information of repository
988
- function cau_plugin_info( $slug, $what ) {
989
-
990
- $slug = sanitize_title( $slug );
991
- $cau_transient_name = 'cau' . $slug;
992
- $cau_info = get_transient( $cau_transient_name );
993
-
994
- if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
995
- $cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );
996
-
997
- if ( ! $cau_info or is_wp_error( $cau_info ) ) {
998
- return false;
999
- }
1000
-
1001
- set_transient( $cau_transient_name, $cau_info, 3600 );
1002
-
1003
- switch ( $what ) {
1004
- case 'versions':
1005
- return $cau_info->versions;
1006
- break;
1007
- case 'version':
1008
- return $cau_info->version;
1009
- break;
1010
- case 'name':
1011
- return $cau_info->name;
1012
- break;
1013
- case 'slug':
1014
- return $cau_info->slug;
1015
- break;
1016
- }
1017
-
1018
- }
1019
-
1020
- // Get list of outdated plugins
1021
- function cau_list_outdated() {
1022
-
1023
- $outdatedList = array();
1024
-
1025
- // Check if function exists
1026
- if ( ! function_exists( 'get_plugins' ) ) {
1027
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1028
- }
1029
-
1030
- if( !function_exists( 'plugins_api' ) ) {
1031
- require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
1032
- }
1033
-
1034
- foreach ( get_plugins() as $key => $value) {
1035
-
1036
- $slug = $key;
1037
- $explosion = explode( '/', $slug );
1038
- $actualSlug = array_shift( $explosion );
1039
-
1040
- // Get plugin name
1041
- foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v;
1042
-
1043
- // Get plugins tested up to version
1044
- $api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ), 'tested' => true ) );
1045
-
1046
- // Version compare
1047
- $tested_version = substr( $api->tested, 0, 3 ); // Format version number
1048
-
1049
- // Check if "tested up to" version number is set
1050
- if( $tested_version != '' ) {
1051
-
1052
- $current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number
1053
- $version_difference = ( (int)$current_version - (int)$tested_version ); // Get the difference
1054
- // $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) );
1055
-
1056
- if( $version_difference >= '0.3' ) {
1057
- $outdatedList[$name] = substr( $api->tested, 0, 3 );
1058
- }
1059
-
1060
- } else {
1061
- $outdatedList[$name] = ''; // We'll catch this when sending the e-mail
1062
- }
1063
-
1064
- }
1065
-
1066
- return $outdatedList;
1067
-
1068
- }
1069
-
1070
- // Better version compare
1071
- function cau_version_compare( $ver1, $ver2, $operator = null ) {
1072
- $p = '#(\.0+)+($|-)#';
1073
- $ver1 = preg_replace( $p, '', $ver1 );
1074
- $ver2 = preg_replace( $p, '', $ver2 );
1075
- return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 );
1076
- }
1077
-
1078
- // Get plugin information of currently installed plugins
1079
- function cau_active_plugin_info( $slug, $what ) {
1080
-
1081
- // Check if function exists
1082
- if ( ! function_exists( 'get_plugins' ) ) {
1083
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1084
- }
1085
-
1086
- $allPlugins = get_plugins();
1087
-
1088
- foreach ($allPlugins as $key => $value) {
1089
- $thisSlug = explode('/', $key);
1090
- $thisSlugE = $thisSlug[0];
1091
- if( $thisSlug == $slug ) {
1092
-
1093
- if( $what == 'version' ) return $value['Version'];
1094
-
1095
- }
1096
- }
1097
-
1098
- }
1099
-
1100
- // Remove update nag when major updates are disabled
1101
- function cau_hideUpdateNag() {
1102
- if( cau_get_db_value( 'major' ) != 'on' ) {
1103
- remove_action( 'admin_notices', 'update_nag', 3 );
1104
- remove_action( 'network_admin_notices', 'maintenance_nag', 10 );
1105
- }
1106
- }
1107
- add_action( 'admin_head', 'cau_hideUpdateNag', 100 );
1108
-
1109
- // Add more intervals to event schedules
1110
- function cau_addMoreIntervals( $schedules ) {
1111
-
1112
- // Add a weekly interval.
1113
- $schedules['weekly'] = array(
1114
- 'interval' => 604800,
1115
- 'display' => __( 'Every week', 'companion-auto-update' ),
1116
- );
1117
-
1118
- // Add a twice montly interval.
1119
- $schedules['twice_monthly'] = array(
1120
- 'interval' => 1209600,
1121
- 'display' => __( 'Every 2 weeks', 'companion-auto-update' ),
1122
- );
1123
-
1124
- // Add a montly interval.
1125
- $schedules['once_monthly'] = array(
1126
- 'interval' => 2419200,
1127
- 'display' => __( 'Every 4 weeks', 'companion-auto-update' ),
1128
- );
1129
-
1130
- return $schedules;
1131
-
1132
- }
1133
- add_filter( 'cron_schedules', 'cau_addMoreIntervals' );
1134
-
1135
- // Get only unique schedules
1136
- function cau_wp_get_schedules() {
1137
-
1138
- // Start variables
1139
- $availableIntervals = wp_get_schedules();
1140
- $array_unique = array();
1141
- $intervalTimes = array();
1142
- $intervalNames = array();
1143
- $intervalUniques = array();
1144
- $counter = 0;
1145
-
1146
- // Get all intervals
1147
- foreach ( $availableIntervals as $key => $value ) {
1148
-
1149
- // Do a bunch of checks to format them the right way
1150
- foreach ( $value as $display => $interval ) {
1151
-
1152
- if( $display == 'interval' ) {
1153
-
1154
- if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, required by a bunch of handles of this plugin
1155
-
1156
- $intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily")
1157
- $intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items
1158
-
1159
- // Format display name in a proper way
1160
- $numOfMinutes = ($interval/60);
1161
- $identifier = __( 'minutes', 'companion-auto-update' );
1162
-
1163
- // I just know there's an easier way for this, but I can't come up with it and this works so...
1164
- if( $interval >= (60*60) ) {
1165
- $numOfMinutes = ($numOfMinutes/60);
1166
- $identifier = __( 'hours', 'companion-auto-update' );
1167
- }
1168
- if( $interval >= (60*60*24) ) {
1169
- $numOfMinutes = ($numOfMinutes/24);
1170
- $identifier = __( 'days', 'companion-auto-update' );
1171
- }
1172
- if( $interval >= (60*60*24*7) ) {
1173
- $numOfMinutes = ($numOfMinutes/7);
1174
- $identifier = __( 'weeks', 'companion-auto-update' );
1175
- }
1176
- if( $interval >= (60*60*24*7*(52/12)) ) {
1177
- $numOfMinutes = ($numOfMinutes/(52/12));
1178
- $identifier = __( 'months', 'companion-auto-update' );
1179
- }
1180
-
1181
- $display = sprintf( esc_html__( 'Every %s %s', 'companion-auto-update' ), round( $numOfMinutes, 2 ), $identifier ); // Translateble
1182
- $intervalNames[$counter] = $display; // Add the display name (i.e. "Once a month" or "Once Daily")
1183
-
1184
- $counter++; // Make sure the next interval gets a new "key" value
1185
- }
1186
-
1187
- }
1188
-
1189
- }
1190
-
1191
- // Sort the interval from smallest to largest
1192
- asort( $intervalUniques );
1193
-
1194
- // Prevent duplicates
1195
- foreach ( array_unique( $intervalUniques ) as $key => $value ) {
1196
- // $value is the timestamp
1197
- // $intervalTimes[$key] is the backend name
1198
- // $intervalNames[$key] is the display name
1199
- $array_unique[$intervalTimes[$key]] = $intervalNames[$key];
1200
- }
1201
-
1202
- // Return the array
1203
- return $array_unique;
1204
-
1205
- }
1206
-
1207
- // Check if the update log db is empty
1208
- function cau_updateLogDBisEmpty() {
1209
-
1210
- global $wpdb;
1211
- $updateDB = "update_log";
1212
- $updateLog = $wpdb->prefix.$updateDB;
1213
- $row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" );
1214
-
1215
- if( $row_count > 0 ) {
1216
- return false;
1217
- } else {
1218
- return true;
1219
- }
1220
- }
1221
-
1222
- // Plugin information to DB
1223
- function cau_savePluginInformation( $method = 'New' ) {
1224
-
1225
- // Check if function exists
1226
- if ( ! function_exists( 'get_plugins' ) ) {
1227
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1228
- }
1229
-
1230
- // Set variables
1231
- global $wpdb;
1232
- $updateDB = "update_log";
1233
- $updateLog = $wpdb->prefix.$updateDB;
1234
- $allPlugins = get_plugins();
1235
- $allThemes = wp_get_themes();
1236
-
1237
- // Loop trough all themes
1238
- foreach ( $allThemes as $key => $value ) {
1239
- if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1240
- }
1241
-
1242
- // Loop trough all plugins
1243
- foreach ( $allPlugins as $key => $value ) {
1244
- if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1245
- }
1246
-
1247
- // Core
1248
- if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) );
1249
-
1250
- }
1251
-
1252
- function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) {
1253
-
1254
- global $wpdb;
1255
- $updateDB = "update_log";
1256
- $updateLog = $wpdb->prefix.$updateDB;
1257
- $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) );
1258
-
1259
- }
1260
-
1261
- function cau_siteHealthSignature() {
1262
- return '<p style="font-size: 12px; color: #707070;">'.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'</p>';
1263
- }
1264
-
1265
- function cau_add_siteHealthTest( $tests ) {
1266
- $tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' );
1267
- return $tests;
1268
- }
1269
- add_filter( 'site_status_tests', 'cau_add_siteHealthTest' );
1270
-
1271
- function cau_disabled_test() {
1272
-
1273
- $result = array(
1274
- 'label' => __( 'Auto updating is enabled', 'companion-auto-update' ),
1275
- 'status' => 'good',
1276
- 'badge' => array(
1277
- 'label' => __( 'Security' ),
1278
- 'color' => 'blue',
1279
- ),
1280
- 'description' => sprintf( '<p>%s</p>', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ),
1281
- 'actions' => '',
1282
- 'test' => 'cau_disabled',
1283
- );
1284
-
1285
- if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) {
1286
- $result['status'] = 'critical';
1287
- $result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' );
1288
- $result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' );
1289
- $result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' );
1290
- $result['actions'] .= sprintf( '<p><a href="%s">%s</a>', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) );
1291
- }
1292
-
1293
- $result['actions'] .= cau_siteHealthSignature();
1294
-
1295
- return $result;
1296
- }
1297
-
1298
- // Check for version control
1299
- function cau_test_is_vcs_checkout( $context ) {
1300
-
1301
- $context_dirs = array( ABSPATH );
1302
- $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
1303
- $check_dirs = array();
1304
- $result = array();
1305
-
1306
- foreach ( $context_dirs as $context_dir ) {
1307
- // Walk up from $context_dir to the root.
1308
- do {
1309
- $check_dirs[] = $context_dir;
1310
-
1311
- // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
1312
- if ( $context_dir == dirname( $context_dir ) )
1313
- break;
1314
-
1315
- // Continue one level at a time.
1316
- } while ( $context_dir = dirname( $context_dir ) );
1317
- }
1318
-
1319
- $check_dirs = array_unique( $check_dirs );
1320
-
1321
- // Search all directories we've found for evidence of version control.
1322
- foreach ( $vcs_dirs as $vcs_dir ) {
1323
- foreach ( $check_dirs as $check_dir ) {
1324
- if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
1325
- break 2;
1326
- }
1327
- }
1328
- }
1329
-
1330
- if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) {
1331
- $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>automatic_updates_is_vcs_checkout</code>" );
1332
- $result['icon'] = 'warning';
1333
- $result['status'] = 'info';
1334
- } else if ( $checkout ) {
1335
- $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>$vcs_dir</code>" );
1336
- $result['icon'] = 'no';
1337
- $result['status'] = 'disabled';
1338
- } else {
1339
- $result['description'] = __( 'No issues detected' , 'companion-auto-update' );
1340
- $result['icon'] = 'yes-alt';
1341
- $result['status'] = 'enabled';
1342
- }
1343
-
1344
- return $result;
1345
- }
1346
-
1347
- // Check if plugins need to be delayed
1348
- function cau_check_delayed() {
1349
- if( cau_get_db_value( 'update_delay' ) == 'on' ) {
1350
- cau_hold_updates();
1351
- cau_unhold_updates();
1352
- } else {
1353
- cau_unhold_all_updates();
1354
- }
1355
- }
1356
-
1357
- // List of all delayed plugins
1358
- function cau_delayed_updates() {
1359
-
1360
- global $wpdb;
1361
- $plugin_list = array();
1362
- $updateLog = $wpdb->prefix."update_log";
1363
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1364
- foreach ( $put_on_hold as $plugin ) {
1365
- array_push( $plugin_list, $plugin->slug );
1366
- }
1367
- return $plugin_list;
1368
-
1369
- }
1370
-
1371
- // List of all delayed plugins for the update function
1372
- function cau_delayed_updates__formated() {
1373
-
1374
- $plugin_list = array();
1375
- foreach ( cau_delayed_updates() as $plugin ) {
1376
- $explosion = explode( '/', $plugin );
1377
- $short_slug = array_shift( $explosion );
1378
- array_push( $plugin_list, $short_slug );
1379
- }
1380
- return $plugin_list;
1381
-
1382
- }
1383
-
1384
- // Add "put on hold" timestamp to the database if it hasn't been set yet
1385
- function cau_hold_updates() {
1386
-
1387
- if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
1388
- $plugins = get_plugin_updates();
1389
-
1390
- if ( !empty( $plugins ) ) {
1391
- $list = array();
1392
- foreach ( (array)$plugins as $plugin_file => $plugin_data ) {
1393
- if( !in_array( $plugin_file, cau_delayed_updates() ) ) {
1394
- global $wpdb;
1395
- $updateDB = "update_log";
1396
- $updateLog = $wpdb->prefix.$updateDB;
1397
- $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) );
1398
- }
1399
- }
1400
- }
1401
- }
1402
-
1403
- // Remove plugins from "put on hold" after x days
1404
- function cau_unhold_updates() {
1405
-
1406
- if( cau_get_db_value( 'update_delay_days' ) != '' ) {
1407
- $after_x_days = cau_get_db_value( 'update_delay_days' );
1408
- } else {
1409
- $after_x_days = '2';
1410
- }
1411
-
1412
- global $wpdb;
1413
-
1414
- $today = strtotime( "now" );
1415
- $updateLog = $wpdb->prefix."update_log";
1416
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1417
-
1418
- foreach ( $put_on_hold as $plugin ) {
1419
-
1420
- $plugin_file = $plugin->slug;
1421
- $put_on_hold_date = $plugin->put_on_hold;
1422
- $remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date );
1423
-
1424
- if( $remove_after <= $today ) {
1425
- $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1426
- }
1427
-
1428
- }
1429
-
1430
- }
1431
-
1432
- // Remove all plugins from "put on hold" if option is disabled
1433
- function cau_unhold_all_updates() {
1434
- global $wpdb;
1435
- $updateLog = $wpdb->prefix."update_log";
1436
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1437
- foreach ( $put_on_hold as $plugin ) {
1438
- $plugin_file = $plugin->slug;
1439
- $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1440
- }
1441
  }
1
+ <?php
2
+
3
+ // What user rights can edit plugin settings?
4
+ function cau_allowed_user_rights() {
5
+
6
+ // Current user
7
+ $user = wp_get_current_user();
8
+
9
+ // Allow roles
10
+ $allowed_roles = array( 'administrator' );
11
+ if( cau_get_db_value( 'allow_editor' ) == 'on' ) array_push( $allowed_roles, 'editor' );
12
+ if( cau_get_db_value( 'allow_author' ) == 'on' ) array_push( $allowed_roles, 'author' );
13
+
14
+ // Check
15
+ if ( array_intersect( $allowed_roles, $user->roles ) ) {
16
+ return true;
17
+ } else {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ // Get database value
23
+ function cau_get_db_value( $name, $table = 'auto_updates' ) {
24
+
25
+ global $wpdb;
26
+ $table_name = $wpdb->prefix.$table;
27
+ $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE name = '%s'", $name ) );
28
+ foreach ( $cau_configs as $config ) return $config->onoroff;
29
+
30
+ }
31
+
32
+ // Get database value
33
+ function cau_get_plugininfo( $check, $field ) {
34
+
35
+ global $wpdb;
36
+ $table_name = $wpdb->prefix.'update_log';
37
+ $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) );
38
+ foreach ( $cau_configs as $config ) return $config->$field;
39
+
40
+ }
41
+
42
+ // Get the set timezone
43
+ function cau_get_proper_timezone() {
44
+
45
+ // WP 5.3 adds the wp_timezone_string function
46
+ if ( !function_exists( 'wp_timezone_string' ) ) {
47
+ $timezone = get_option( 'timezone_string' );
48
+ } else {
49
+ $timezone = wp_timezone_string();
50
+ }
51
+
52
+ // Should fix an reported issue
53
+ if( $timezone == '+00:00' ) {
54
+ $timezone = 'UTC';
55
+ }
56
+
57
+ return $timezone;
58
+
59
+ }
60
+
61
+ // Copy of the wp_timezone_string for < 5.3 compat
62
+ if ( !function_exists( 'wp_timezone_string' ) ) {
63
+ function wp_timezone_string() {
64
+ $timezone_string = get_option( 'timezone_string' );
65
+
66
+ if ( $timezone_string ) {
67
+ return $timezone_string;
68
+ }
69
+
70
+ $offset = (float) get_option( 'gmt_offset' );
71
+ $hours = (int) $offset;
72
+ $minutes = ( $offset - $hours );
73
+
74
+ $sign = ( $offset < 0 ) ? '-' : '+';
75
+ $abs_hour = abs( $hours );
76
+ $abs_mins = abs( $minutes * 60 );
77
+ $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
78
+
79
+ return $tz_offset;
80
+ }
81
+ }
82
+
83
+ // List of incompatible plugins
84
+ function cau_incompatiblePluginlist() {
85
+
86
+ // Pluginlist, write as Plugin path => Issue
87
+ $pluginList = array(
88
+ 'better-wp-security/better-wp-security.php' => "<span class='cau_disabled'><span class='dashicons dashicons-no'></span></span> May block auto-updating for everything.",
89
+ 'updraftplus/updraftplus.php' => "<span class='cau_warning'><span class='dashicons dashicons-warning'></span></span> By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. <u>Causes no issues with other plugins.</u>"
90
+ );
91
+
92
+ return $pluginList;
93
+
94
+ }
95
+ function cau_incompatiblePlugins() {
96
+
97
+ $return = false;
98
+
99
+ foreach ( cau_incompatiblePluginlist() as $key => $value ) {
100
+ if( is_plugin_active( $key ) ) {
101
+ $return = true;
102
+ }
103
+ }
104
+
105
+ return $return;
106
+
107
+ }
108
+
109
+ // Check if has issues
110
+ function cau_pluginHasIssues() {
111
+
112
+ $return = false;
113
+
114
+ if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) {
115
+ $return = true;
116
+ }
117
+
118
+ if( checkAutomaticUpdaterDisabled() ) {
119
+ $return = true;
120
+ }
121
+
122
+ if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) {
123
+ $return = true;
124
+ }
125
+
126
+ if( cau_incorrectDatabaseVersion() ) {
127
+ $return = true;
128
+ }
129
+
130
+ return $return;
131
+ }
132
+ function cau_pluginIssueLevels() {
133
+
134
+ if( checkAutomaticUpdaterDisabled() ) {
135
+ $level = 'high';
136
+ } else {
137
+ $level = 'low';
138
+ }
139
+
140
+ return $level;
141
+ }
142
+ function cau_pluginIssueCount() {
143
+
144
+ $count = 0;
145
+
146
+ // blog_public check
147
+ if( get_option( 'blog_public' ) == 0 ) $count++;
148
+
149
+ // checkAutomaticUpdaterDisabled
150
+ if( checkAutomaticUpdaterDisabled() ) $count++;
151
+
152
+ // checkCronjobsDisabled
153
+ if( checkCronjobsDisabled() ) $count++;
154
+
155
+ // cau_incorrectDatabaseVersion
156
+ if( cau_incorrectDatabaseVersion() ) $count++;
157
+
158
+ // cau_incompatiblePlugins
159
+ if( cau_incompatiblePlugins() ) {
160
+ foreach ( cau_incompatiblePluginlist() as $key => $value ) {
161
+ if( is_plugin_active( $key ) ) {
162
+ $count++;
163
+ }
164
+ }
165
+ }
166
+
167
+ return $count;
168
+ }
169
+ function cau_incorrectDatabaseVersion() {
170
+ if( get_option( "cau_db_version" ) != cau_db_version() ) {
171
+ return true;
172
+ } else {
173
+ return false;
174
+ }
175
+ }
176
+
177
+ // Run custom hooks on plugin update
178
+ function cau_run_custom_hooks_p() {
179
+
180
+ // Check if function exists
181
+ if ( ! function_exists( 'get_plugins' ) ) {
182
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
183
+ }
184
+
185
+ // Create array
186
+ $allDates = array();
187
+
188
+ // Where to look for plugins
189
+ $dirr = plugin_dir_path( __DIR__ );
190
+ $listOfAll = get_plugins();
191
+
192
+ // Number of updates
193
+ $numOfUpdates = 0;
194
+
195
+ // Loop trough all plugins
196
+ foreach ( $listOfAll as $key => $value ) {
197
+
198
+ // Get data
199
+ $fullPath = $dirr.'/'.$key;
200
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
201
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
202
+ $updateSched = wp_get_schedule( 'wp_update_plugins' );
203
+
204
+ // Check when the last update was
205
+ if( $updateSched == 'hourly' ) {
206
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
207
+ } elseif( $updateSched == 'twicedaily' ) {
208
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
209
+ } elseif( $updateSched == 'daily' ) {
210
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
211
+ } elseif( $updateSched == 'weekly' ) {
212
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
213
+ } elseif( $updateSched == 'monthly' ) {
214
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
215
+ } else {
216
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
217
+ }
218
+
219
+ $update_time = wp_next_scheduled( 'wp_update_plugins' );
220
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
221
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
222
+
223
+ if( $fileDate >= $lastday ) {
224
+
225
+ // Push to array
226
+ array_push( $allDates, $fileDate );
227
+
228
+ // Update info
229
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
230
+ $status = __( 'Automatic', 'companion-auto-update' );
231
+ } else {
232
+ $status = __( 'Manual', 'companion-auto-update' );
233
+ }
234
+
235
+ $numOfUpdates++;
236
+
237
+ cau_updatePluginInformation( $key, $status );
238
+
239
+ }
240
+
241
+ }
242
+
243
+ // If there have been plugin updates run hook
244
+ if( $numOfUpdates >= 1 ) {
245
+ do_action( 'cau_after_plugin_update' );
246
+ }
247
+
248
+ }
249
+
250
+ // Run custom hooks on theme update
251
+ function cau_run_custom_hooks_t() {
252
+
253
+ // Create array
254
+ $allDates = array();
255
+
256
+ // Where to look for plugins
257
+ $dirr = get_theme_root();
258
+ $listOfAll = wp_get_themes();
259
+
260
+ // Loop trough all plugins
261
+ foreach ( $listOfAll as $key => $value) {
262
+
263
+ // Get data
264
+ $fullPath = $dirr.'/'.$key;
265
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
266
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
267
+ $updateSched = wp_get_schedule( 'wp_update_themes' );
268
+
269
+ // Check when the last update was
270
+ if( $updateSched == 'hourly' ) {
271
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
272
+ } elseif( $updateSched == 'twicedaily' ) {
273
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
274
+ } elseif( $updateSched == 'daily' ) {
275
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
276
+ } elseif( $updateSched == 'weekly' ) {
277
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
278
+ } elseif( $updateSched == 'monthly' ) {
279
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
280
+ } else {
281
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
282
+ }
283
+
284
+ $update_time = wp_next_scheduled( 'wp_update_themes' );
285
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
286
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
287
+
288
+ if( $fileDate >= $lastday ) {
289
+
290
+ // Push to array
291
+ array_push( $allDates, $fileDate );
292
+
293
+ // Update info
294
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
295
+ $status = __( 'Automatic', 'companion-auto-update' );
296
+ } else {
297
+ $status = __( 'Manual', 'companion-auto-update' );
298
+ }
299
+ cau_updatePluginInformation( $key, $status );
300
+
301
+ }
302
+
303
+ }
304
+
305
+ $totalNum = 0;
306
+
307
+ // Count number of updated plugins
308
+ foreach ( $allDates as $key => $value ) $totalNum++;
309
+
310
+ // If there have been plugin updates run hook
311
+ if( $totalNum > 0 ) {
312
+ do_action( 'cau_after_theme_update' );
313
+ }
314
+
315
+ }
316
+
317
+ // Run custom hooks on core update
318
+ function cau_run_custom_hooks_c() {
319
+
320
+ // Create array
321
+ $totalNum = 0;
322
+
323
+ // Get data
324
+ $fullPath = ABSPATH.'wp-includes/version.php';
325
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
326
+ $updateSched = wp_get_schedule( 'wp_version_check' );
327
+
328
+ // Check when the last update was
329
+ if( $updateSched == 'hourly' ) {
330
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
331
+ } elseif( $updateSched == 'twicedaily' ) {
332
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
333
+ } elseif( $updateSched == 'daily' ) {
334
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
335
+ } elseif( $updateSched == 'weekly' ) {
336
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
337
+ } elseif( $updateSched == 'monthly' ) {
338
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
339
+ } else {
340
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
341
+ }
342
+
343
+ // Check manual or automatic
344
+ $update_time = wp_next_scheduled( 'wp_version_check' );
345
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
346
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
347
+
348
+ if( $fileDate >= $lastday ) {
349
+
350
+ // Update info
351
+ if( $fileDate > $range_start && $fileDate < $range_end ) {
352
+ $status = __( 'Automatic', 'companion-auto-update' );
353
+ } else {
354
+ $status = __( 'Manual', 'companion-auto-update' );
355
+ }
356
+ cau_updatePluginInformation( 'core', $status );
357
+
358
+ $totalNum++;
359
+
360
+ }
361
+
362
+ // If there have been plugin updates run hook
363
+ if( $totalNum > 0 ) {
364
+ do_action( 'cau_after_core_update' );
365
+ }
366
+
367
+ }
368
+
369
+ // Check if automatic updating is disabled globally
370
+ function checkAutomaticUpdaterDisabled() {
371
+
372
+ // I mean, I know this can be done waaaay better but I's quite late and I need to push a fix so take it or leave it untill I decide to fix this :)
373
+
374
+ if ( defined( 'automatic_updater_disabled' ) ) {
375
+ if( doing_filter( 'automatic_updater_disabled' ) ) {
376
+ return true;
377
+ } elseif( constant( 'automatic_updater_disabled' ) == 'true' ) {
378
+ return true;
379
+ } elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) {
380
+ return true;
381
+ } else {
382
+ return false;
383
+ }
384
+
385
+ } else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
386
+ if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
387
+ return true;
388
+ } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) {
389
+ return true;
390
+ } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) {
391
+ return true;
392
+ } else {
393
+ return false;
394
+ }
395
+
396
+ } else {
397
+ return false;
398
+ }
399
+
400
+ }
401
+
402
+ // Check if cronjobs are disabled
403
+ function checkCronjobsDisabled() {
404
+
405
+ if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) {
406
+ return true;
407
+ } else {
408
+ return false;
409
+ }
410
+
411
+ }
412
+
413
+ // Menu location
414
+ function cau_menloc( $after = '' ) {
415
+ return 'tools.php'.$after;
416
+ }
417
+ function cau_url( $tab = '' ) {
418
+ return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) );
419
+ }
420
+
421
+ // Get the active tab
422
+ function active_tab( $page, $identifier = 'tab' ) {
423
+ echo _active_tab( $page, $identifier );
424
+ }
425
+ function _active_tab( $page, $identifier = 'tab' ) {
426
+
427
+ if( !isset( $_GET[ $identifier ] ) ) {
428
+ $cur_page = '';
429
+ } else {
430
+ $cur_page = $_GET[ $identifier ];
431
+ }
432
+
433
+ if( $page == $cur_page ) {
434
+ return 'nav-tab-active';
435
+ }
436
+
437
+ }
438
+
439
+ // Get the active subtab
440
+ function active_subtab( $page, $identifier = 'tab' ) {
441
+
442
+ if( !isset( $_GET[ $identifier ] ) ) {
443
+ $cur_page = '';
444
+ } else {
445
+ $cur_page = $_GET[ $identifier ];
446
+ }
447
+
448
+ if( $page == $cur_page ) {
449
+ echo 'current';
450
+ }
451
+
452
+ }
453
+
454
+ // List of plugins that should not be updated
455
+ function donotupdatelist( $filter = 'plugins' ) {
456
+
457
+ // Select correct database row
458
+ switch ( $filter ) {
459
+ case 'themes':
460
+ $db_table = 'notUpdateListTh';
461
+ break;
462
+ case 'plugins':
463
+ $db_table = 'notUpdateList';
464
+ break;
465
+ default:
466
+ $db_table = 'notUpdateList';
467
+ break;
468
+ }
469
+
470
+ // Create list
471
+ global $wpdb;
472
+ $table_name = $wpdb->prefix."auto_updates";
473
+ $config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'");
474
+
475
+ $list = $config[0]->onoroff;
476
+ $list = explode( ", ", $list );
477
+ $returnList = array();
478
+
479
+ foreach ( $list as $key ) array_push( $returnList, $key );
480
+
481
+ return $returnList;
482
+
483
+ }
484
+ function plugins_donotupdatelist() {
485
+
486
+ // Base array
487
+ $array = array();
488
+
489
+ // Filtered plugins
490
+ $filteredplugins = donotupdatelist( 'plugins' );
491
+ foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin );
492
+
493
+ // Plugin added to the delay list
494
+ $delayedplugins = cau_delayed_updates__formated();
495
+ foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin );
496
+
497
+ // Return array
498
+ return $array;
499
+ }
500
+ function themes_donotupdatelist() {
501
+ return donotupdatelist( 'themes' );
502
+ }
503
+
504
+ // Show the update log
505
+ function cau_fetch_log( $limit, $format = 'simple' ) {
506
+
507
+ // Database
508
+ global $wpdb;
509
+ $updateLog = "update_log";
510
+ $updateLogDB = $wpdb->prefix.$updateLog;
511
+
512
+ // Filter log
513
+ if( isset( $_GET['filter'] ) ) {
514
+ $filter = $_GET['filter'];
515
+ } else {
516
+ $filter = 'all';
517
+ }
518
+
519
+ switch( $filter ) {
520
+
521
+ case 'plugins':
522
+ $plugins = true;
523
+ $themes = false;
524
+ $core = false;
525
+ $translations = false;
526
+ break;
527
+
528
+ case 'themes':
529
+ $plugins = false;
530
+ $themes = true;
531
+ $core = false;
532
+ $translations = false;
533
+ break;
534
+
535
+ case 'translations':
536
+ $plugins = false;
537
+ $themes = false;
538
+ $core = false;
539
+ $translations = true;
540
+ break;
541
+
542
+ default:
543
+ $plugins = true;
544
+ $themes = true;
545
+ $core = true;
546
+ $translations = false;
547
+ break;
548
+ }
549
+
550
+ // Create arrays
551
+ $pluginNames = array();
552
+ $pluginVersion = array();
553
+ $pluginDates = array();
554
+ $pluginDatesF = array();
555
+ $plugslug = array();
556
+ $type = array();
557
+ $method = array();
558
+
559
+ // Date format
560
+ $dateFormat = get_option( 'date_format' );
561
+
562
+ // PLUGINS
563
+ if( $plugins ) {
564
+
565
+ // Check if function exists
566
+ if ( ! function_exists( 'get_plugins' ) ) {
567
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
568
+ }
569
+
570
+ // Where to look for plugins
571
+ $plugdir = plugin_dir_path( __DIR__ );
572
+ $allPlugins = get_plugins();
573
+
574
+ // Loop trough all plugins
575
+ foreach ( $allPlugins as $key => $value) {
576
+
577
+ // Get plugin data
578
+ $fullPath = $plugdir.'/'.$key;
579
+ $getFile = $path_parts = pathinfo( $fullPath );
580
+ $pluginData = get_plugin_data( $fullPath );
581
+ $pluginSlug = explode( "/", plugin_basename( $key ) );
582
+ $pluginSlug = $pluginSlug[0];
583
+
584
+ array_push( $plugslug , $pluginSlug );
585
+
586
+ // Automatic or Manual (non-db-version)
587
+ $date_tod = date ( 'ydm' );
588
+ $fileDay = date ( 'ydm', filemtime( $fullPath ) );
589
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
590
+ $updateSched = wp_next_scheduled( 'wp_update_plugins' );
591
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
592
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
593
+
594
+ if( $date_tod == $fileDay ) {
595
+
596
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
597
+ $status = __( 'Automatic', 'companion-auto-update' );
598
+ } else {
599
+ $status = __( 'Manual', 'companion-auto-update' );
600
+ }
601
+
602
+ array_push( $method , $status );
603
+
604
+ } else {
605
+
606
+ // Get info from database
607
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
608
+ array_push( $method , cau_get_plugininfo( $key, 'method' ) );
609
+ } else {
610
+ array_push( $method , '-' );
611
+ }
612
+
613
+ }
614
+
615
+ // Get plugin name
616
+ foreach ( $pluginData as $dataKey => $dataValue ) {
617
+ if( $dataKey == 'Name') {
618
+ array_push( $pluginNames , $dataValue );
619
+ }
620
+ if( $dataKey == 'Version') {
621
+ array_push( $pluginVersion , $dataValue );
622
+ }
623
+ }
624
+
625
+ // Get last update date
626
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
627
+ if( $format == 'table' ) {
628
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
629
+ $fileDateF .= ' &dash; '.date( 'H:i', filemtime( $fullPath ) );
630
+ } else {
631
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
632
+ }
633
+ array_push( $pluginDates, $fileDate );
634
+ array_push( $pluginDatesF, $fileDateF );
635
+ array_push( $type, 'Plugin' );
636
+
637
+ }
638
+
639
+ }
640
+
641
+ // THEMES
642
+ if( $themes ) {
643
+
644
+ // Where to look for themes
645
+ $themedir = get_theme_root();
646
+ $allThemes = wp_get_themes();
647
+
648
+ // Loop trough all themes
649
+ foreach ( $allThemes as $key => $value) {
650
+
651
+ // Get theme data
652
+ $fullPath = $themedir.'/'.$key;
653
+ $getFile = $path_parts = pathinfo( $fullPath );
654
+
655
+ // Get theme name
656
+ $theme_data = wp_get_theme( $path_parts['filename'] );
657
+ $themeName = $theme_data->get( 'Name' );
658
+ $themeVersion = $theme_data->get( 'Version' );
659
+ array_push( $pluginNames , $themeName );
660
+ array_push( $pluginVersion , $themeVersion );
661
+
662
+ // Automatic or Manual (non-db-version)
663
+ $date_tod = date ( 'ydm' );
664
+ $fileDay = date ( 'ydm', filemtime( $fullPath ) );
665
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
666
+ $updateSched = wp_next_scheduled( 'wp_update_themes' );
667
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
668
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
669
+
670
+ if( $date_tod == $fileDay ) {
671
+
672
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
673
+ $status = __( 'Automatic', 'companion-auto-update' );
674
+ } else {
675
+ $status = __( 'Manual', 'companion-auto-update' );
676
+ }
677
+
678
+ array_push( $method , $status );
679
+
680
+ } else {
681
+
682
+ // Get info from database
683
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
684
+ array_push( $method , cau_get_plugininfo( $key, 'method' ) );
685
+ } else {
686
+ array_push( $method , '-' );
687
+ }
688
+
689
+ }
690
+
691
+ // Get last update date
692
+ $fileDate = date( 'YmdHi', filemtime( $fullPath ) );
693
+
694
+ if( $format == 'table' ) {
695
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
696
+ $fileDateF .= ' &dash; '.date ( 'H:i', filemtime( $fullPath ) );
697
+ } else {
698
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
699
+ }
700
+
701
+ array_push( $pluginDates, $fileDate );
702
+ array_push( $pluginDatesF, $fileDateF );
703
+ array_push( $type, 'Theme' );
704
+ array_push( $plugslug , '' );
705
+
706
+ }
707
+
708
+ }
709
+
710
+ // TRANSLATIONS
711
+ if( $translations ) {
712
+
713
+ // There is no way (at this time) to check if someone changed this link, so therefore it won't work when it's changed, sorry
714
+ $transFolder = get_home_path().'wp-content/languages';
715
+ if( file_exists( $transFolder ) ) {
716
+
717
+ $allThemTranslations = array();
718
+ $allThemTypes = array();
719
+
720
+ $pt = __( 'Plugin translations', 'companion-auto-update' );
721
+ $tt = __( 'Theme translations', 'companion-auto-update' );
722
+ $ct = __( 'Core translations', 'companion-auto-update' );
723
+
724
+ // Plugin translations
725
+ $files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE );
726
+ foreach( $files as $file ) {
727
+ array_push( $allThemTranslations, $file );
728
+ array_push( $allThemTypes, $pt );
729
+ }
730
+
731
+ // Theme translations
732
+ $files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE );
733
+ foreach( $files as $file ) {
734
+ array_push( $allThemTranslations, $file );
735
+ array_push( $allThemTypes, $tt );
736
+ }
737
+
738
+ // Core translations
739
+ $files = glob( $transFolder.'/*.{mo}', GLOB_BRACE );
740
+ foreach( $files as $file ) {
741
+ array_push( $allThemTranslations, $file );
742
+ array_push( $allThemTypes, $ct );
743
+ }
744
+
745
+ foreach( $allThemTranslations as $key => $trans_file ) {
746
+
747
+ $transDate = date( 'YmdHi', filemtime( $trans_file ) );
748
+
749
+ if( $format == 'table' ) {
750
+ $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
751
+ $transDateF .= ' &dash; '.date ( 'H:i', filemtime( $trans_file ) );
752
+ } else {
753
+ $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
754
+ }
755
+
756
+ $trans_name = basename( $trans_file );
757
+ $trans_name = str_replace( "-", " ", $trans_name );
758
+ $trans_name = str_replace( ".mo", "", $trans_name );
759
+ $trans_name = str_replace( ".json", "", $trans_name );
760
+ $trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 );
761
+ $trans_name = str_replace( $trans_lang, "", $trans_name );
762
+ $trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 );
763
+
764
+ // Push
765
+ array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang );
766
+ array_push( $type, $allThemTypes[$key] );
767
+ array_push( $pluginVersion, '-' );
768
+ array_push( $pluginDates, $transDate );
769
+ array_push( $pluginDatesF, $transDateF );
770
+ array_push( $plugslug , '' );
771
+ array_push( $method , '-' );
772
+
773
+ }
774
+
775
+ } else {
776
+
777
+ $transDate = date('YmdHi');
778
+ $transDateF = 'Could not read translations date.';
779
+
780
+ array_push( $pluginNames, 'Translations' );
781
+ array_push( $type, $trans_type.' translations' );
782
+ array_push( $pluginVersion, '-' );
783
+ array_push( $pluginDates, $transDate );
784
+ array_push( $pluginDatesF, $transDateF );
785
+ array_push( $plugslug , '' );
786
+
787
+ // Get info from database
788
+ array_push( $method , '-' );
789
+
790
+ }
791
+
792
+ }
793
+
794
+ // CORE
795
+ if( $core ) {
796
+
797
+ $coreFile = ABSPATH.'wp-includes/version.php';
798
+ $updateSched = wp_next_scheduled( 'wp_version_check' );
799
+
800
+ if( file_exists( $coreFile ) ) {
801
+
802
+ $coreDate = date( 'YmdHi', filemtime( $coreFile ) );
803
+
804
+ if( $format == 'table' ) {
805
+ $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
806
+ $coreDateF .= ' &dash; '.date ( 'H:i', filemtime( $coreFile ) );
807
+ } else {
808
+ $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
809
+ }
810
+
811
+ // Automatic or Manual (non-db-version)
812
+ $date_tod = date ( 'ydm' );
813
+ $fileDay = date ( 'ydm', filemtime( $coreFile ) );
814
+ $fileTime = date ( 'Hi', filemtime( $coreFile ) );
815
+ $update_time = wp_next_scheduled( 'wp_version_check' );
816
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
817
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
818
+
819
+ if( $date_tod == $fileDay ) {
820
+
821
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
822
+ $methodVal = __( 'Automatic', 'companion-auto-update' );
823
+ } else {
824
+ $methodVal = __( 'Manual', 'companion-auto-update' );
825
+ }
826
+
827
+ } else {
828
+
829
+ // Get info from database
830
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
831
+ $methodVal = cau_get_plugininfo( 'core', 'method' );
832
+ } else {
833
+ $methodVal = '';
834
+ }
835
+
836
+ }
837
+
838
+
839
+ } else {
840
+ $coreDate = date('YmdHi');
841
+ $coreDateF = 'Could not read core date.';
842
+ }
843
+
844
+ array_push( $pluginNames, 'WordPress' );
845
+ array_push( $type, 'WordPress' );
846
+ array_push( $pluginVersion, get_bloginfo( 'version' ) );
847
+ array_push( $pluginDates, $coreDate );
848
+ array_push( $pluginDatesF, $coreDateF );
849
+ array_push( $plugslug , '' );
850
+
851
+ // Get info from database
852
+ array_push( $method , $methodVal );
853
+
854
+ }
855
+
856
+ // Sort array by date
857
+ arsort( $pluginDates );
858
+
859
+ if( $limit == 'all' ) {
860
+ $limit = 999;
861
+ }
862
+
863
+ $listClasses = 'wp-list-table widefat autoupdate autoupdatelog';
864
+
865
+ if( $format == 'table' ) {
866
+ $listClasses .= ' autoupdatelog striped';
867
+ } else {
868
+ $listClasses .= ' autoupdatewidget';
869
+ }
870
+
871
+ echo '<table class="'.$listClasses.'">';
872
+
873
+ // Show the last updated plugins
874
+ if( $format == 'table' ) {
875
+
876
+ echo '<thead>
877
+ <tr>
878
+ <th><strong>'.__( 'Name', 'companion-auto-update' ).'</strong></th>';
879
+ if( !$translations ) echo '<th><strong>'.__( 'To version', 'companion-auto-update' ).'</strong></th>';
880
+ echo '<th><strong>'.__( 'Type', 'companion-auto-update' ).'</strong></th>
881
+ <th><strong>'.__( 'Last updated on', 'companion-auto-update' ).'</strong></th>
882
+ <th><strong>'.__( 'Update method', 'companion-auto-update' ).'</strong></th>
883
+ </tr>
884
+ </thead>';
885
+
886
+ }
887
+
888
+ echo '<tbody id="the-list">';
889
+
890
+ $loopings = 0;
891
+
892
+ foreach ( $pluginDates as $key => $value ) {
893
+
894
+ if( $loopings < $limit ) {
895
+
896
+ echo '<tr>';
897
+
898
+ if( $format == 'table' ) {
899
+ $pluginName = $pluginNames[$key];
900
+ } else {
901
+ $pluginName = substr( $pluginNames[$key], 0, 25);
902
+ if( strlen( $pluginNames[$key] ) > 25 ) {
903
+ $pluginName .= '...';
904
+ }
905
+ }
906
+
907
+ echo '<td class="column-updatetitle"><p><strong title="'. $pluginNames[$key] .'">'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'</strong></p></td>';
908
+
909
+ if( $format == 'table' ) {
910
+
911
+ if( $type[$key] == 'Plugin' ) {
912
+ $thisType = __( 'Plugin', 'companion-auto-update' );
913
+ } else if( $type[$key] == 'Theme' ) {
914
+ $thisType = __( 'Theme', 'companion-auto-update' );
915
+ } else {
916
+ $thisType = $type[$key];
917
+ }
918
+
919
+ if( !$translations ) echo '<td class="cau_hide_on_mobile column-version" style="min-width: 100px;"><p>'. $pluginVersion[$key] .'</p></td>';
920
+ echo '<td class="cau_hide_on_mobile column-description"><p>'. $thisType .'</p></td>';
921
+
922
+ }
923
+
924
+ echo '<td class="column-date" style="min-width: 100px;"><p>'. $pluginDatesF[$key] .'</p></td>';
925
+
926
+ if( $format == 'table' ) {
927
+ echo '<td class="column-method"><p>'. $method[$key] .'</p></td>';
928
+ }
929
+
930
+ echo '</tr>';
931
+
932
+ $loopings++;
933
+
934
+ }
935
+
936
+ }
937
+
938
+ echo "</tbody></table>";
939
+
940
+ }
941
+
942
+ // Get the proper changelog URL
943
+ function cau_getChangelogUrl( $type, $name, $plugslug ) {
944
+
945
+ switch( $type ) {
946
+ case 'WordPress':
947
+ $url = '';
948
+ break;
949
+ case 'Plugin':
950
+ $url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'&section=changelog&TB_iframe=true&width=772&height=772' );
951
+ break;
952
+ case 'Theme':
953
+ $url = '';
954
+ break;
955
+ }
956
+
957
+ if( !empty( $url ) ) {
958
+ return '<a href="'.$url.'" class="thickbox open-plugin-details-modal" aria-label="More information about '.$name.'" data-title="'.$name.'">'.$name.'</a>';
959
+ } else {
960
+ return $name;
961
+ }
962
+
963
+ }
964
+
965
+ // Only update plugins which are enabled
966
+ function cau_dontUpdatePlugins( $update, $item ) {
967
+
968
+ $plugins = plugins_donotupdatelist();
969
+
970
+ if ( in_array( $item->slug, $plugins ) ) {
971
+ return false; // Don't update these plugins
972
+ } else {
973
+ return true; // Always update these plugins
974
+ }
975
+
976
+
977
+ }
978
+ function cau_dontUpdateThemes( $update, $item ) {
979
+
980
+ $themes = themes_donotupdatelist();
981
+
982
+ if ( in_array( $item->slug, $themes ) ) {
983
+ return false; // Don't update these themes
984
+ } else {
985
+ return true; // Always update these themes
986
+ }
987
+
988
+
989
+ }
990
+
991
+ // Get plugin information of repository
992
+ function cau_plugin_info( $slug, $what ) {
993
+
994
+ $slug = sanitize_title( $slug );
995
+ $cau_transient_name = 'cau' . $slug;
996
+ $cau_info = get_transient( $cau_transient_name );
997
+
998
+ if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
999
+ $cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );
1000
+
1001
+ if ( ! $cau_info or is_wp_error( $cau_info ) ) {
1002
+ return false;
1003
+ }
1004
+
1005
+ set_transient( $cau_transient_name, $cau_info, 3600 );
1006
+
1007
+ switch ( $what ) {
1008
+ case 'versions':
1009
+ return $cau_info->versions;
1010
+ break;
1011
+ case 'version':
1012
+ return $cau_info->version;
1013
+ break;
1014
+ case 'name':
1015
+ return $cau_info->name;
1016
+ break;
1017
+ case 'slug':
1018
+ return $cau_info->slug;
1019
+ break;
1020
+ }
1021
+
1022
+ }
1023
+
1024
+ // Get list of outdated plugins
1025
+ function cau_list_outdated() {
1026
+
1027
+ $outdatedList = array();
1028
+
1029
+ // Check if function exists
1030
+ if ( ! function_exists( 'get_plugins' ) ) {
1031
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
1032
+ }
1033
+
1034
+ if( !function_exists( 'plugins_api' ) ) {
1035
+ require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
1036
+ }
1037
+
1038
+ foreach ( get_plugins() as $key => $value) {
1039
+
1040
+ $slug = $key;
1041
+ $explosion = explode( '/', $slug );
1042
+ $actualSlug = array_shift( $explosion );
1043
+
1044
+ // Get plugin name
1045
+ foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v;
1046
+
1047
+ // Get plugins tested up to version
1048
+ $api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ), 'tested' => true ) );
1049
+
1050
+ // Version compare
1051
+ $tested_version = substr( $api->tested, 0, 3 ); // Format version number
1052
+
1053
+ // Check if "tested up to" version number is set
1054
+ if( $tested_version != '' ) {
1055
+
1056
+ $current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number
1057
+ $version_difference = ( (int)$current_version - (int)$tested_version ); // Get the difference
1058
+ // $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) );
1059
+
1060
+ if( $version_difference >= '0.3' ) {
1061
+ $outdatedList[$name] = substr( $api->tested, 0, 3 );
1062
+ }
1063
+
1064
+ } else {
1065
+ $outdatedList[$name] = ''; // We'll catch this when sending the e-mail
1066
+ }
1067
+
1068
+ }
1069
+
1070
+ return $outdatedList;
1071
+
1072
+ }
1073
+
1074
+ // Better version compare
1075
+ function cau_version_compare( $ver1, $ver2, $operator = null ) {
1076
+ $p = '#(\.0+)+($|-)#';
1077
+ $ver1 = preg_replace( $p, '', $ver1 );
1078
+ $ver2 = preg_replace( $p, '', $ver2 );
1079
+ return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 );
1080
+ }
1081
+
1082
+ // Get plugin information of currently installed plugins
1083
+ function cau_active_plugin_info( $slug, $what ) {
1084
+
1085
+ // Check if function exists
1086
+ if ( ! function_exists( 'get_plugins' ) ) {
1087
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
1088
+ }
1089
+
1090
+ $allPlugins = get_plugins();
1091
+
1092
+ foreach ($allPlugins as $key => $value) {
1093
+ $thisSlug = explode('/', $key);
1094
+ $thisSlugE = $thisSlug[0];
1095
+ if( $thisSlug == $slug ) {
1096
+
1097
+ if( $what == 'version' ) return $value['Version'];
1098
+
1099
+ }
1100
+ }
1101
+
1102
+ }
1103
+
1104
+ // Remove update nag when major updates are disabled
1105
+ function cau_hideUpdateNag() {
1106
+ if( cau_get_db_value( 'major' ) != 'on' ) {
1107
+ remove_action( 'admin_notices', 'update_nag', 3 );
1108
+ remove_action( 'network_admin_notices', 'maintenance_nag', 10 );
1109
+ }
1110
+ }
1111
+ add_action( 'admin_head', 'cau_hideUpdateNag', 100 );
1112
+
1113
+ // Add more intervals to event schedules
1114
+ function cau_addMoreIntervals( $schedules ) {
1115
+
1116
+ // Add a weekly interval.
1117
+ $schedules['weekly'] = array(
1118
+ 'interval' => 604800,
1119
+ 'display' => __( 'Every week', 'companion-auto-update' ),
1120
+ );
1121
+
1122
+ // Add a twice montly interval.
1123
+ $schedules['twice_monthly'] = array(
1124
+ 'interval' => 1209600,
1125
+ 'display' => __( 'Every 2 weeks', 'companion-auto-update' ),
1126
+ );
1127
+
1128
+ // Add a montly interval.
1129
+ $schedules['once_monthly'] = array(
1130
+ 'interval' => 2419200,
1131
+ 'display' => __( 'Every 4 weeks', 'companion-auto-update' ),
1132
+ );
1133
+
1134
+ return $schedules;
1135
+
1136
+ }
1137
+ add_filter( 'cron_schedules', 'cau_addMoreIntervals' );
1138
+
1139
+ // Get only unique schedules
1140
+ function cau_wp_get_schedules() {
1141
+
1142
+ // Start variables
1143
+ $availableIntervals = wp_get_schedules();
1144
+ $array_unique = array();
1145
+ $intervalTimes = array();
1146
+ $intervalNames = array();
1147
+ $intervalUniques = array();
1148
+ $counter = 0;
1149
+
1150
+ // Get all intervals
1151
+ foreach ( $availableIntervals as $key => $value ) {
1152
+
1153
+ // Do a bunch of checks to format them the right way
1154
+ foreach ( $value as $display => $interval ) {
1155
+
1156
+ if( $display == 'interval' ) {
1157
+
1158
+ if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, required by a bunch of handles of this plugin
1159
+
1160
+ $intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily")
1161
+ $intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items
1162
+
1163
+ // Format display name in a proper way
1164
+ $numOfMinutes = ($interval/60);
1165
+ $identifier = __( 'minutes', 'companion-auto-update' );
1166
+
1167
+ // I just know there's an easier way for this, but I can't come up with it and this works so...
1168
+ if( $interval >= (60*60) ) {
1169
+ $numOfMinutes = ($numOfMinutes/60);
1170
+ $identifier = __( 'hours', 'companion-auto-update' );
1171
+ }
1172
+ if( $interval >= (60*60*24) ) {
1173
+ $numOfMinutes = ($numOfMinutes/24);
1174
+ $identifier = __( 'days', 'companion-auto-update' );
1175
+ }
1176
+ if( $interval >= (60*60*24*7) ) {
1177
+ $numOfMinutes = ($numOfMinutes/7);
1178
+ $identifier = __( 'weeks', 'companion-auto-update' );
1179
+ }
1180
+ if( $interval >= (60*60*24*7*(52/12)) ) {
1181
+ $numOfMinutes = ($numOfMinutes/(52/12));
1182
+ $identifier = __( 'months', 'companion-auto-update' );
1183
+ }
1184
+
1185
+ $display = sprintf( esc_html__( 'Every %s %s', 'companion-auto-update' ), round( $numOfMinutes, 2 ), $identifier ); // Translateble
1186
+ $intervalNames[$counter] = $display; // Add the display name (i.e. "Once a month" or "Once Daily")
1187
+
1188
+ $counter++; // Make sure the next interval gets a new "key" value
1189
+ }
1190
+
1191
+ }
1192
+
1193
+ }
1194
+
1195
+ // Sort the interval from smallest to largest
1196
+ asort( $intervalUniques );
1197
+
1198
+ // Prevent duplicates
1199
+ foreach ( array_unique( $intervalUniques ) as $key => $value ) {
1200
+ // $value is the timestamp
1201
+ // $intervalTimes[$key] is the backend name
1202
+ // $intervalNames[$key] is the display name
1203
+ $array_unique[$intervalTimes[$key]] = $intervalNames[$key];
1204
+ }
1205
+
1206
+ // Return the array
1207
+ return $array_unique;
1208
+
1209
+ }
1210
+
1211
+ // Check if the update log db is empty
1212
+ function cau_updateLogDBisEmpty() {
1213
+
1214
+ global $wpdb;
1215
+ $updateDB = "update_log";
1216
+ $updateLog = $wpdb->prefix.$updateDB;
1217
+ $row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" );
1218
+
1219
+ if( $row_count > 0 ) {
1220
+ return false;
1221
+ } else {
1222
+ return true;
1223
+ }
1224
+ }
1225
+
1226
+ // Plugin information to DB
1227
+ function cau_savePluginInformation( $method = 'New' ) {
1228
+
1229
+ // Check if function exists
1230
+ if ( ! function_exists( 'get_plugins' ) ) {
1231
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
1232
+ }
1233
+
1234
+ // Set variables
1235
+ global $wpdb;
1236
+ $updateDB = "update_log";
1237
+ $updateLog = $wpdb->prefix.$updateDB;
1238
+ $allPlugins = get_plugins();
1239
+ $allThemes = wp_get_themes();
1240
+
1241
+ // Loop trough all themes
1242
+ foreach ( $allThemes as $key => $value ) {
1243
+ if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1244
+ }
1245
+
1246
+ // Loop trough all plugins
1247
+ foreach ( $allPlugins as $key => $value ) {
1248
+ if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1249
+ }
1250
+
1251
+ // Core
1252
+ if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) );
1253
+
1254
+ }
1255
+
1256
+ function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) {
1257
+
1258
+ global $wpdb;
1259
+ $updateDB = "update_log";
1260
+ $updateLog = $wpdb->prefix.$updateDB;
1261
+ $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) );
1262
+
1263
+ }
1264
+
1265
+ function cau_siteHealthSignature() {
1266
+ return '<p style="font-size: 12px; color: #707070;">'.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'</p>';
1267
+ }
1268
+
1269
+ function cau_add_siteHealthTest( $tests ) {
1270
+ $tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' );
1271
+ return $tests;
1272
+ }
1273
+ add_filter( 'site_status_tests', 'cau_add_siteHealthTest' );
1274
+
1275
+ function cau_disabled_test() {
1276
+
1277
+ $result = array(
1278
+ 'label' => __( 'Auto updating is enabled', 'companion-auto-update' ),
1279
+ 'status' => 'good',
1280
+ 'badge' => array(
1281
+ 'label' => __( 'Security' ),
1282
+ 'color' => 'blue',
1283
+ ),
1284
+ 'description' => sprintf( '<p>%s</p>', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ),
1285
+ 'actions' => '',
1286
+ 'test' => 'cau_disabled',
1287
+ );
1288
+
1289
+ if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) {
1290
+ $result['status'] = 'critical';
1291
+ $result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' );
1292
+ $result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' );
1293
+ $result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' );
1294
+ $result['actions'] .= sprintf( '<p><a href="%s">%s</a>', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) );
1295
+ }
1296
+
1297
+ $result['actions'] .= cau_siteHealthSignature();
1298
+
1299
+ return $result;
1300
+ }
1301
+
1302
+ // Check for version control
1303
+ function cau_test_is_vcs_checkout( $context ) {
1304
+
1305
+ $context_dirs = array( ABSPATH );
1306
+ $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
1307
+ $check_dirs = array();
1308
+ $result = array();
1309
+
1310
+ foreach ( $context_dirs as $context_dir ) {
1311
+ // Walk up from $context_dir to the root.
1312
+ do {
1313
+ $check_dirs[] = $context_dir;
1314
+
1315
+ // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
1316
+ if ( $context_dir == dirname( $context_dir ) )
1317
+ break;
1318
+
1319
+ // Continue one level at a time.
1320
+ } while ( $context_dir = dirname( $context_dir ) );
1321
+ }
1322
+
1323
+ $check_dirs = array_unique( $check_dirs );
1324
+
1325
+ // Search all directories we've found for evidence of version control.
1326
+ foreach ( $vcs_dirs as $vcs_dir ) {
1327
+ foreach ( $check_dirs as $check_dir ) {
1328
+ if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
1329
+ break 2;
1330
+ }
1331
+ }
1332
+ }
1333
+
1334
+ if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) {
1335
+ $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>automatic_updates_is_vcs_checkout</code>" );
1336
+ $result['icon'] = 'warning';
1337
+ $result['status'] = 'info';
1338
+ } else if ( $checkout ) {
1339
+ $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>$vcs_dir</code>" );
1340
+ $result['icon'] = 'no';
1341
+ $result['status'] = 'disabled';
1342
+ } else {
1343
+ $result['description'] = __( 'No issues detected' , 'companion-auto-update' );
1344
+ $result['icon'] = 'yes-alt';
1345
+ $result['status'] = 'enabled';
1346
+ }
1347
+
1348
+ return $result;
1349
+ }
1350
+
1351
+ // Check if plugins need to be delayed
1352
+ function cau_check_delayed() {
1353
+ if( cau_get_db_value( 'update_delay' ) == 'on' ) {
1354
+ cau_hold_updates();
1355
+ cau_unhold_updates();
1356
+ } else {
1357
+ cau_unhold_all_updates();
1358
+ }
1359
+ }
1360
+
1361
+ // List of all delayed plugins
1362
+ function cau_delayed_updates() {
1363
+
1364
+ global $wpdb;
1365
+ $plugin_list = array();
1366
+ $updateLog = $wpdb->prefix."update_log";
1367
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1368
+ foreach ( $put_on_hold as $plugin ) {
1369
+ array_push( $plugin_list, $plugin->slug );
1370
+ }
1371
+ return $plugin_list;
1372
+
1373
+ }
1374
+
1375
+ // List of all delayed plugins for the update function
1376
+ function cau_delayed_updates__formated() {
1377
+
1378
+ $plugin_list = array();
1379
+ foreach ( cau_delayed_updates() as $plugin ) {
1380
+ $explosion = explode( '/', $plugin );
1381
+ $short_slug = array_shift( $explosion );
1382
+ array_push( $plugin_list, $short_slug );
1383
+ }
1384
+ return $plugin_list;
1385
+
1386
+ }
1387
+
1388
+ // Add "put on hold" timestamp to the database if it hasn't been set yet
1389
+ function cau_hold_updates() {
1390
+
1391
+ if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
1392
+ $plugins = get_plugin_updates();
1393
+
1394
+ if ( !empty( $plugins ) ) {
1395
+ $list = array();
1396
+ foreach ( (array)$plugins as $plugin_file => $plugin_data ) {
1397
+ if( !in_array( $plugin_file, cau_delayed_updates() ) ) {
1398
+ global $wpdb;
1399
+ $updateLog = "{$wpdb->prefix}update_log";
1400
+ $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) );
1401
+ }
1402
+ }
1403
+ }
1404
+ }
1405
+
1406
+ // Remove plugins from "put on hold" after x days
1407
+ function cau_unhold_updates() {
1408
+
1409
+
1410
+ global $wpdb;
1411
+
1412
+ $after_x_days = ( cau_get_db_value( 'update_delay_days' ) != '' ) ? cau_get_db_value( 'update_delay_days' ) : '2';
1413
+ $today = strtotime( "now" );
1414
+ $updateLog = "{$wpdb->prefix}update_log";
1415
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1416
+
1417
+ foreach ( $put_on_hold as $plugin ) {
1418
+
1419
+ $plugin_file = $plugin->slug;
1420
+ $put_on_hold_date = $plugin->put_on_hold;
1421
+ $remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date );
1422
+
1423
+ if( $remove_after <= $today ) {
1424
+ $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1425
+ }
1426
+
1427
+ }
1428
+
1429
+ }
1430
+
1431
+ // Remove all plugins from "put on hold" if option is disabled
1432
+ function cau_unhold_all_updates() {
1433
+ global $wpdb;
1434
+ $updateLog = "{$wpdb->prefix}update_log";
1435
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1436
+ foreach ( $put_on_hold as $plugin ) {
1437
+ $plugin_file = $plugin->slug;
1438
+ $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1439
+ }
 
1440
  }
companion-auto-update.php CHANGED
@@ -1,9 +1,10 @@
1
  <?php
 
2
  /*
3
  * Plugin Name: Companion Auto Update
4
  * Plugin URI: http://codeermeneer.nl/portfolio/companion-auto-update/
5
  * Description: This plugin auto updates all plugins, all themes and the wordpress core.
6
- * Version: 3.8.4
7
  * Author: Papin Schipper
8
  * Author URI: http://codeermeneer.nl/
9
  * Contributors: papin
@@ -26,6 +27,7 @@ add_action( 'init', 'cau_init' );
26
 
27
  // Set up the database and required schedules
28
  function cau_install( $network_wide ) {
 
29
  if ( is_multisite() && $network_wide ) {
30
  global $wpdb;
31
  $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
@@ -37,12 +39,14 @@ function cau_install( $network_wide ) {
37
  } else {
38
  cau_database_creation();
39
  }
 
40
  if (! wp_next_scheduled ( 'cau_set_schedule_mail' )) wp_schedule_event( time(), 'daily', 'cau_set_schedule_mail'); // Set schedule for basic notifcations
41
  if (! wp_next_scheduled ( 'cau_custom_hooks_plugins' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_plugins'); // Run custom hooks on plugin updates
42
  if (! wp_next_scheduled ( 'cau_custom_hooks_themes' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_themes'); // Run custom hooks on theme updates
43
  if (! wp_next_scheduled ( 'cau_log_updater' )) wp_schedule_event( ( time() - 1800 ), 'daily', 'cau_log_updater'); // Keep the log up to date
44
  if (! wp_next_scheduled ( 'cau_outdated_notifier' )) wp_schedule_event( time(), 'daily', 'cau_outdated_notifier'); // Set schedule for basic notifcations
45
  }
 
46
  add_action( 'cau_set_schedule_mail', 'cau_check_updates_mail' );
47
  add_action( 'cau_outdated_notifier', 'cau_outdated_notifier_mail' );
48
  add_action( 'wp_update_plugins', 'cau_run_custom_hooks_p' );
@@ -62,6 +66,7 @@ function cau_pluginActivateWelcome() {
62
  }
63
  register_activation_hook(__FILE__, 'cau_pluginActivateWelcome');
64
 
 
65
  function cau_pluginRedirectWelcomeScreen() {
66
  if ( get_option( 'cau_redirectToWelcomeScreen', false ) ) {
67
  delete_option( 'cau_redirectToWelcomeScreen' );
@@ -81,35 +86,22 @@ function cau_donateUrl() {
81
  function cau_db_version() {
82
  return '3.8.3';
83
  }
 
84
  function cau_database_creation() {
85
 
86
  global $wpdb;
87
 
88
  // Plugin db info
89
- $cau_db_version = cau_db_version();
90
- $autoupdates = $wpdb->prefix."auto_updates";
91
- $updateLog = $wpdb->prefix."update_log";
92
 
93
  // WordPress db info
94
- $charset_collate = $wpdb->get_charset_collate();
95
 
96
  // DB table creation queries
97
- $sql = "CREATE TABLE $autoupdates (
98
- id INT(9) NOT NULL AUTO_INCREMENT,
99
- name VARCHAR(255) NOT NULL,
100
- onoroff TEXT NOT NULL,
101
- UNIQUE KEY id (id)
102
- ) $charset_collate;";
103
-
104
- $sql2 = "CREATE TABLE $updateLog (
105
- id INT(9) NOT NULL AUTO_INCREMENT,
106
- slug VARCHAR(255) NOT NULL,
107
- oldVersion VARCHAR(10) NOT NULL,
108
- newVersion VARCHAR(10) NOT NULL,
109
- method VARCHAR(10) NOT NULL,
110
- put_on_hold VARCHAR(100) DEFAULT '0',
111
- UNIQUE KEY id (id)
112
- ) $charset_collate;";
113
 
114
  // Create DB tables
115
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
@@ -121,23 +113,18 @@ function cau_database_creation() {
121
 
122
  // Insert data
123
  cau_install_data();
124
-
125
  }
126
 
127
  // Check if database table exists before creating
128
  function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_updates' ) {
129
 
130
  global $wpdb;
131
- $table_name = $wpdb->prefix.$db_table;
132
 
133
- $rows = $wpdb->get_col( "SELECT COUNT(*) as num_rows FROM {$table_name} WHERE {$id} = '{$whattocheck}'" );
134
- $check = $rows[0];
 
135
 
136
- if( $check > 0 ) {
137
- return true;
138
- } else {
139
- return false;
140
- }
141
 
142
  }
143
 
@@ -145,6 +132,7 @@ function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_upda
145
  function cau_install_data() {
146
 
147
  global $wpdb;
 
148
  $table_name = $wpdb->prefix . "auto_updates";
149
  $toemail = get_option('admin_email');
150
 
@@ -200,11 +188,12 @@ function cau_remove() {
200
  wp_clear_scheduled_hook( 'cau_custom_hooks_themes' );
201
  wp_clear_scheduled_hook( 'cau_log_updater' );
202
 
203
- // Restore WordPress default update functionality
204
  add_filter( 'plugins_auto_update_enabled', '__return_true' );
205
  add_filter( 'themes_auto_update_enabled', '__return_true' );
206
  add_filter( 'auto_plugin_update_send_email', '__return_true' );
207
  add_filter( 'auto_theme_update_send_email', '__return_true' );
 
208
  }
209
  register_deactivation_hook( __FILE__, 'cau_remove' );
210
 
@@ -226,13 +215,13 @@ function cau_update_db_check() {
226
  $db_charset = constant( 'DB_CHARSET' );
227
  $wpdb->query( "ALTER TABLE $autoupdates CONVERT TO CHARACTER SET $db_charset" );
228
  $wpdb->query( "ALTER TABLE $updateLog CONVERT TO CHARACTER SET $db_charset" );
229
-
230
  }
231
-
232
  update_option( "cau_db_version", $cau_db_version );
 
233
  }
234
 
235
  }
 
236
  add_action( 'upgrader_process_complete', 'cau_update_db_check' );
237
 
238
  // Manual update
@@ -250,19 +239,15 @@ function register_cau_menu_page() {
250
  add_action( 'admin_menu', 'register_cau_menu_page' );
251
 
252
  // Settings page
253
- function cau_frontend() { ?>
254
-
255
- <div class='wrap cau_content_wrap cau_content'>
256
-
257
- <h1 class="wp-heading-inline"><?php _e( 'Companion Auto Update', 'companion-auto-update' ); ?></h1>
258
 
259
- <hr class="wp-header-end">
260
-
261
- <?php
262
 
263
  // Make sure the correct timezone is used
264
  date_default_timezone_set( cau_get_proper_timezone() );
265
-
266
  // Allow only access to these pages
267
  $allowedPages = array(
268
  'dashboard' => __( 'Dashboard' ),
@@ -273,17 +258,13 @@ function cau_frontend() { ?>
273
 
274
  // Show subtabs
275
  echo "<h2 class='nav-tab-wrapper wp-clearfix'>";
 
276
  foreach ( $allowedPages as $page => $title ) {
277
  echo "<a href='".cau_url( $page )."' id='tab-".$page."' class='nav-tab "._active_tab( $page )."'>".$title;
278
- if( $page == 'status' ) {
279
- if( cau_pluginHasIssues() ) {
280
- echo "<span class='cau_melding level-".cau_pluginIssueLevels()."'></span>";
281
- } else {
282
- echo "<span class='cau_melding level-okay'></span>";
283
- }
284
- }
285
  echo "</a>";
286
  }
 
287
  echo "</h2>";
288
 
289
  // Show page content
@@ -300,11 +281,9 @@ function cau_frontend() { ?>
300
  wp_die( 'You\'re not allowed to view <strong>'.$requestedPage.'</strong>.' );
301
  }
302
 
303
- ?>
304
-
305
- </div>
306
 
307
- <?php }
308
 
309
  // Add a widget to the dashboard.
310
  function cau_add_widget() {
@@ -312,28 +291,18 @@ function cau_add_widget() {
312
  }
313
  add_action( 'wp_dashboard_setup', 'cau_add_widget' );
314
 
 
315
  function cau_widget() {
316
-
317
  echo '<style>table.autoupdatewidget { border: 0px solid transparent; border-bottom: 1px solid #EEEEEE; margin: 0 -12px; width: calc(100% + 24px); } table.autoupdatewidget tr td { border-top: 1px solid #EEEEEE; padding: 9px 12px 5px 12px; background: #FAFAFA; } .cau_divide { display: inline-block; color: #E7E0DF; padding: 0 2px; } </style>';
318
  echo '<p>'.__('Below are the last 7 updates ran on this site. Includes plugins and themes, both automatically updated and manually updated.', 'companion-auto-update').'</p>';
319
  cau_fetch_log( '7' );
320
- echo '<p>
321
- <a href="'.cau_url( 'log' ).'">'.__('View full changelog', 'companion-auto-update').'</a>
322
- <span class="cau_divide">|</span>
323
- <a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a>
324
- </p>';
325
-
326
  }
327
 
328
  // Load admin styles
329
  function load_cau_global_styles( $hook ) {
330
-
331
- // Plugin scripts
332
- wp_enqueue_style( 'cau_admin_styles', plugins_url( 'backend/style.css' , __FILE__ ) );
333
-
334
- // Check for issues
335
- wp_enqueue_style( 'cau_warning_styles', plugins_url( 'backend/warningbar.css' , __FILE__ ) );
336
-
337
  }
338
  add_action( 'admin_enqueue_scripts', 'load_cau_global_styles', 99 );
339
 
@@ -347,7 +316,6 @@ function load_cau_page_styles( $hook ) {
347
  wp_enqueue_style( 'thickbox' );
348
  wp_enqueue_script( 'thickbox' );
349
  wp_enqueue_script( 'plugin-install' );
350
-
351
  }
352
  add_action( 'admin_enqueue_scripts', 'load_cau_page_styles', 100 );
353
 
@@ -360,7 +328,7 @@ function cau_settings_link( $links ) {
360
  $settings_link = '<a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a>';
361
  $settings_link2 = '<a href="https://translate.wordpress.org/projects/wp-plugins/companion-auto-update">'.__( 'Help us translate', 'companion-auto-update' ).'</a>';
362
  $settings_link3 = '<a href="'.cau_donateUrl().'">'.__( 'Donate to help development', 'companion-auto-update' ).'</a>';
363
-
364
  array_unshift( $links, $settings_link2 );
365
  array_unshift( $links, $settings_link3 );
366
  if( cau_allowed_user_rights() ) array_unshift( $links, $settings_link );
@@ -374,11 +342,9 @@ add_filter( "plugin_action_links_$plugin", "cau_settings_link" );
374
  // Auto Update Class
375
  class CAU_auto_update {
376
 
 
377
  public function __construct() {
378
-
379
- // Enable Update filters
380
  add_action( 'plugins_loaded', array( &$this, 'CAU_auto_update_filters' ), 1 );
381
-
382
  }
383
 
384
  public function CAU_auto_update_filters() {
@@ -428,13 +394,9 @@ class CAU_auto_update {
428
  // WP Email Config
429
  $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'wpemails'");
430
  foreach ( $configs as $config ) {
431
- if( $config->onoroff == 'on' ) {
432
- add_filter( 'auto_core_update_send_email', '__return_true' ); // Core updates
433
- } else {
434
- add_filter( 'auto_core_update_send_email', '__return_false' ); // Core updates
435
- }
436
  }
437
-
438
 
439
  }
440
 
@@ -443,25 +405,16 @@ new CAU_auto_update();
443
 
444
  // Check for issues
445
  function cau_checkForIssues( $admin_bar ) {
446
-
447
- if( cau_pluginHasIssues() && is_admin() ) {
448
-
449
- if( cau_pluginIssueLevels() == 'high' ) {
450
- $cauWaningBarTitle = __( 'Companion Auto Update ran into a critical error. View the status log for more info.', 'companion-auto-update' );
451
-
452
- $admin_bar->add_menu( array(
453
- 'id' => 'cau-has-issues',
454
- 'title' => '<span class="ab-icon"></span><span class="cau-level-'.cau_pluginIssueLevels().'">'.cau_pluginIssueCount().'</span>',
455
- 'href' => cau_url( 'status' ),
456
- 'meta' => array(
457
- 'target' => '_self',
458
- 'title' => $cauWaningBarTitle,
459
- ),
460
- ));
461
-
462
- }
463
-
464
  }
465
-
466
  }
467
- add_action( 'admin_bar_menu', 'cau_checkForIssues', 150 );
1
  <?php
2
+
3
  /*
4
  * Plugin Name: Companion Auto Update
5
  * Plugin URI: http://codeermeneer.nl/portfolio/companion-auto-update/
6
  * Description: This plugin auto updates all plugins, all themes and the wordpress core.
7
+ * Version: 3.8.5
8
  * Author: Papin Schipper
9
  * Author URI: http://codeermeneer.nl/
10
  * Contributors: papin
27
 
28
  // Set up the database and required schedules
29
  function cau_install( $network_wide ) {
30
+
31
  if ( is_multisite() && $network_wide ) {
32
  global $wpdb;
33
  $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
39
  } else {
40
  cau_database_creation();
41
  }
42
+
43
  if (! wp_next_scheduled ( 'cau_set_schedule_mail' )) wp_schedule_event( time(), 'daily', 'cau_set_schedule_mail'); // Set schedule for basic notifcations
44
  if (! wp_next_scheduled ( 'cau_custom_hooks_plugins' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_plugins'); // Run custom hooks on plugin updates
45
  if (! wp_next_scheduled ( 'cau_custom_hooks_themes' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_themes'); // Run custom hooks on theme updates
46
  if (! wp_next_scheduled ( 'cau_log_updater' )) wp_schedule_event( ( time() - 1800 ), 'daily', 'cau_log_updater'); // Keep the log up to date
47
  if (! wp_next_scheduled ( 'cau_outdated_notifier' )) wp_schedule_event( time(), 'daily', 'cau_outdated_notifier'); // Set schedule for basic notifcations
48
  }
49
+
50
  add_action( 'cau_set_schedule_mail', 'cau_check_updates_mail' );
51
  add_action( 'cau_outdated_notifier', 'cau_outdated_notifier_mail' );
52
  add_action( 'wp_update_plugins', 'cau_run_custom_hooks_p' );
66
  }
67
  register_activation_hook(__FILE__, 'cau_pluginActivateWelcome');
68
 
69
+ // Redirect to welcome screen on activation of plugin
70
  function cau_pluginRedirectWelcomeScreen() {
71
  if ( get_option( 'cau_redirectToWelcomeScreen', false ) ) {
72
  delete_option( 'cau_redirectToWelcomeScreen' );
86
  function cau_db_version() {
87
  return '3.8.3';
88
  }
89
+
90
  function cau_database_creation() {
91
 
92
  global $wpdb;
93
 
94
  // Plugin db info
95
+ $cau_db_version = cau_db_version();
96
+ $autoupdates = $wpdb->prefix."auto_updates";
97
+ $updateLog = $wpdb->prefix."update_log";
98
 
99
  // WordPress db info
100
+ $charset_collate = $wpdb->get_charset_collate();
101
 
102
  // DB table creation queries
103
+ $sql = "CREATE TABLE $autoupdates ( id INT(9) NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, onoroff TEXT NOT NULL, UNIQUE KEY id (id) ) $charset_collate;";
104
+ $sql2 = "CREATE TABLE $updateLog ( id INT(9) NOT NULL AUTO_INCREMENT, slug VARCHAR(255) NOT NULL, oldVersion VARCHAR(10) NOT NULL, newVersion VARCHAR(10) NOT NULL, method VARCHAR(10) NOT NULL, put_on_hold VARCHAR(100) DEFAULT '0', UNIQUE KEY id (id) ) $charset_collate;";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
  // Create DB tables
107
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
113
 
114
  // Insert data
115
  cau_install_data();
 
116
  }
117
 
118
  // Check if database table exists before creating
119
  function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_updates' ) {
120
 
121
  global $wpdb;
 
122
 
123
+ $table_name = $wpdb->prefix.$db_table;
124
+ $rows = $wpdb->get_col( "SELECT COUNT(*) as num_rows FROM {$table_name} WHERE {$id} = '{$whattocheck}'" );
125
+ $check = $rows[0];
126
 
127
+ return ( $check > 0 ) ? true : false;
 
 
 
 
128
 
129
  }
130
 
132
  function cau_install_data() {
133
 
134
  global $wpdb;
135
+
136
  $table_name = $wpdb->prefix . "auto_updates";
137
  $toemail = get_option('admin_email');
138
 
188
  wp_clear_scheduled_hook( 'cau_custom_hooks_themes' );
189
  wp_clear_scheduled_hook( 'cau_log_updater' );
190
 
191
+ // Restore WordPress 5.5 default update functionality
192
  add_filter( 'plugins_auto_update_enabled', '__return_true' );
193
  add_filter( 'themes_auto_update_enabled', '__return_true' );
194
  add_filter( 'auto_plugin_update_send_email', '__return_true' );
195
  add_filter( 'auto_theme_update_send_email', '__return_true' );
196
+
197
  }
198
  register_deactivation_hook( __FILE__, 'cau_remove' );
199
 
215
  $db_charset = constant( 'DB_CHARSET' );
216
  $wpdb->query( "ALTER TABLE $autoupdates CONVERT TO CHARACTER SET $db_charset" );
217
  $wpdb->query( "ALTER TABLE $updateLog CONVERT TO CHARACTER SET $db_charset" );
 
218
  }
 
219
  update_option( "cau_db_version", $cau_db_version );
220
+
221
  }
222
 
223
  }
224
+
225
  add_action( 'upgrader_process_complete', 'cau_update_db_check' );
226
 
227
  // Manual update
239
  add_action( 'admin_menu', 'register_cau_menu_page' );
240
 
241
  // Settings page
242
+ function cau_frontend() {
 
 
 
 
243
 
244
+ echo "<div class='wrap cau_content_wrap cau_content'>
245
+ <h1 class='wp-heading-inline'>".__( 'Companion Auto Update', 'companion-auto-update' )."</h1>
246
+ <hr class='wp-header-end'>";
247
 
248
  // Make sure the correct timezone is used
249
  date_default_timezone_set( cau_get_proper_timezone() );
250
+
251
  // Allow only access to these pages
252
  $allowedPages = array(
253
  'dashboard' => __( 'Dashboard' ),
258
 
259
  // Show subtabs
260
  echo "<h2 class='nav-tab-wrapper wp-clearfix'>";
261
+
262
  foreach ( $allowedPages as $page => $title ) {
263
  echo "<a href='".cau_url( $page )."' id='tab-".$page."' class='nav-tab "._active_tab( $page )."'>".$title;
264
+ if( $page == 'status' ) echo cau_pluginHasIssues() ? "<span class='cau_melding level-".cau_pluginIssueLevels()."'></span>" : "<span class='cau_melding level-okay'></span>"; // Show status icon
 
 
 
 
 
 
265
  echo "</a>";
266
  }
267
+
268
  echo "</h2>";
269
 
270
  // Show page content
281
  wp_die( 'You\'re not allowed to view <strong>'.$requestedPage.'</strong>.' );
282
  }
283
 
284
+ echo '</div>';
 
 
285
 
286
+ }
287
 
288
  // Add a widget to the dashboard.
289
  function cau_add_widget() {
291
  }
292
  add_action( 'wp_dashboard_setup', 'cau_add_widget' );
293
 
294
+ // Widget content
295
  function cau_widget() {
 
296
  echo '<style>table.autoupdatewidget { border: 0px solid transparent; border-bottom: 1px solid #EEEEEE; margin: 0 -12px; width: calc(100% + 24px); } table.autoupdatewidget tr td { border-top: 1px solid #EEEEEE; padding: 9px 12px 5px 12px; background: #FAFAFA; } .cau_divide { display: inline-block; color: #E7E0DF; padding: 0 2px; } </style>';
297
  echo '<p>'.__('Below are the last 7 updates ran on this site. Includes plugins and themes, both automatically updated and manually updated.', 'companion-auto-update').'</p>';
298
  cau_fetch_log( '7' );
299
+ echo '<p><a href="'.cau_url( 'log' ).'">'.__( 'View full changelog', 'companion-auto-update' ).'</a> <span class="cau_divide">|</span> <a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a></p>';
 
 
 
 
 
300
  }
301
 
302
  // Load admin styles
303
  function load_cau_global_styles( $hook ) {
304
+ wp_enqueue_style( 'cau_admin_styles', plugins_url( 'backend/style.css' , __FILE__ ) ); // Plugin scripts
305
+ wp_enqueue_style( 'cau_warning_styles', plugins_url( 'backend/warningbar.css' , __FILE__ ) ); // Check for issues
 
 
 
 
 
306
  }
307
  add_action( 'admin_enqueue_scripts', 'load_cau_global_styles', 99 );
308
 
316
  wp_enqueue_style( 'thickbox' );
317
  wp_enqueue_script( 'thickbox' );
318
  wp_enqueue_script( 'plugin-install' );
 
319
  }
320
  add_action( 'admin_enqueue_scripts', 'load_cau_page_styles', 100 );
321
 
328
  $settings_link = '<a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a>';
329
  $settings_link2 = '<a href="https://translate.wordpress.org/projects/wp-plugins/companion-auto-update">'.__( 'Help us translate', 'companion-auto-update' ).'</a>';
330
  $settings_link3 = '<a href="'.cau_donateUrl().'">'.__( 'Donate to help development', 'companion-auto-update' ).'</a>';
331
+
332
  array_unshift( $links, $settings_link2 );
333
  array_unshift( $links, $settings_link3 );
334
  if( cau_allowed_user_rights() ) array_unshift( $links, $settings_link );
342
  // Auto Update Class
343
  class CAU_auto_update {
344
 
345
+ // Enable Update filters
346
  public function __construct() {
 
 
347
  add_action( 'plugins_loaded', array( &$this, 'CAU_auto_update_filters' ), 1 );
 
348
  }
349
 
350
  public function CAU_auto_update_filters() {
394
  // WP Email Config
395
  $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'wpemails'");
396
  foreach ( $configs as $config ) {
397
+ if( $config->onoroff == 'on' ) add_filter( 'auto_core_update_send_email', '__return_true', 1 ); // Turn on
398
+ else add_filter( 'auto_core_update_send_email', '__return_false', 1 ); // Turn off
 
 
 
399
  }
 
400
 
401
  }
402
 
405
 
406
  // Check for issues
407
  function cau_checkForIssues( $admin_bar ) {
408
+ if( cau_pluginHasIssues() && is_admin() && cau_pluginIssueLevels() == 'high' ) {
409
+ $admin_bar->add_menu( array(
410
+ 'id' => 'cau-has-issues',
411
+ 'title' => '<span class="ab-icon"></span><span class="cau-level-'.cau_pluginIssueLevels().'">'.cau_pluginIssueCount().'</span>',
412
+ 'href' => cau_url( 'status' ),
413
+ 'meta' => array(
414
+ 'target' => '_self',
415
+ 'title' => __( 'Companion Auto Update ran into a critical error. View the status log for more info.', 'companion-auto-update' ),
416
+ ),
417
+ ));
 
 
 
 
 
 
 
 
418
  }
 
419
  }
420
+ add_action( 'admin_bar_menu', 'cau_checkForIssues', 150 );
index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  # Silence is golden.
1
+ <?php
2
  # Silence is golden.
languages/companion-auto-update.pot CHANGED
@@ -1,62 +1,62 @@
1
- # Copyright (C) 2016 Companion Auto Update
2
- # This file is distributed under the same license as the Companion Auto Update package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Companion Auto Update 1.0\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/companion-auto-"
7
- "update\n"
8
- "POT-Creation-Date: 2016-05-24 08:16:37+00:00\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
-
16
- #: companion_portfolio.php:96
17
- msgid "Auto Updater"
18
- msgstr ""
19
-
20
- #: companion_portfolio.php:122
21
- msgid "Auto update plugins?"
22
- msgstr ""
23
-
24
- #: companion_portfolio.php:122
25
- msgid "Auto update themes?"
26
- msgstr ""
27
-
28
- #: companion_portfolio.php:122
29
- msgid "Auto update minor core updates?"
30
- msgstr ""
31
-
32
- #: companion_portfolio.php:122
33
- msgid "Auto update major core updates?"
34
- msgstr ""
35
-
36
- #: companion_portfolio.php:125
37
- msgid "Settings saved"
38
- msgstr ""
39
-
40
- #: companion_portfolio.php:125
41
- msgid "Settings"
42
- msgstr ""
43
-
44
- #. Plugin Name of the plugin/theme
45
- msgid "Companion Auto Update"
46
- msgstr ""
47
-
48
- #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
49
- #. Plugin URI of the plugin/theme
50
- #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
51
- #. Author URI of the plugin/theme
52
- msgid "https://qreative-web.com"
53
- msgstr ""
54
-
55
- #. Description of the plugin/theme
56
- msgid ""
57
- "This plugin auto updates all plugins, all themes and the wordpress core."
58
- msgstr ""
59
-
60
- #. Author of the plugin/theme
61
- msgid "Qreative-Web"
62
  msgstr ""
1
+ # Copyright (C) 2016 Companion Auto Update
2
+ # This file is distributed under the same license as the Companion Auto Update package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Companion Auto Update 1.0\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/companion-auto-"
7
+ "update\n"
8
+ "POT-Creation-Date: 2016-05-24 08:16:37+00:00\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+
16
+ #: companion_portfolio.php:96
17
+ msgid "Auto Updater"
18
+ msgstr ""
19
+
20
+ #: companion_portfolio.php:122
21
+ msgid "Auto update plugins?"
22
+ msgstr ""
23
+
24
+ #: companion_portfolio.php:122
25
+ msgid "Auto update themes?"
26
+ msgstr ""
27
+
28
+ #: companion_portfolio.php:122
29
+ msgid "Auto update minor core updates?"
30
+ msgstr ""
31
+
32
+ #: companion_portfolio.php:122
33
+ msgid "Auto update major core updates?"
34
+ msgstr ""
35
+
36
+ #: companion_portfolio.php:125
37
+ msgid "Settings saved"
38
+ msgstr ""
39
+
40
+ #: companion_portfolio.php:125
41
+ msgid "Settings"
42
+ msgstr ""
43
+
44
+ #. Plugin Name of the plugin/theme
45
+ msgid "Companion Auto Update"
46
+ msgstr ""
47
+
48
+ #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
49
+ #. Plugin URI of the plugin/theme
50
+ #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
51
+ #. Author URI of the plugin/theme
52
+ msgid "https://qreative-web.com"
53
+ msgstr ""
54
+
55
+ #. Description of the plugin/theme
56
+ msgid ""
57
+ "This plugin auto updates all plugins, all themes and the wordpress core."
58
+ msgstr ""
59
+
60
+ #. Author of the plugin/theme
61
+ msgid "Qreative-Web"
62
  msgstr ""
languages/index.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php
2
- /**
3
- * Nothing to see here
4
- */
1
+ <?php
2
+ /**
3
+ * Nothing to see here
4
+ */
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: Papin, qweb
3
  Donate link: https://www.paypal.me/dakel/10/
4
  Tags: auto, automatic, background, update, updates, updating, automatic updates, automatic background updates, easy update, wordpress update, theme update, plugin update, up-to-date, security, update latest version, update core, update wp, update wp core, major updates, minor updates, update to new version, update core, update plugin, update plugins, update plugins automatically, update theme, plugin, theme, advance, control, mail, notifations, enable
5
  Requires at least: 3.6.0
6
- Tested up to: 5.9
7
  Requires PHP: 5.1
8
- Stable tag: 3.8.3
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -17,10 +17,13 @@ Companion Auto Update is a powerful and completely free plugin that allows you t
17
 
18
  We understand that you might not always be able to check if your WordPress site has any updates that need to be installed. Especially when you maintain multiple websites keeping them up-to-date can be a lot of work. This plugin can help you with that. We'll keep your site up-to-date and keep you posted about what's happening and notify you when we need your help with something.
19
 
 
 
20
  = Main features =
21
  1. Auto-updating for plugins, themes, core and translation files
 
22
  1. Filter plugins and themes to not be updated
23
- 1. E-mail notifications about old software, pending updates and complete updates
24
  1. An update log with all updates
25
  1. Option to delay automatic updates with an x number of days
26
 
@@ -35,8 +38,6 @@ Sometimes developers will push an update that will cause errors on your site, th
35
  We want you to know what's happening on your website. This plugin offers settings for various email notifications. We can send you an email when an update is available, when a plugin has been updated or when wordpress has been updated.
36
  But if you don't want to recieve emails about this you can still log in and view the changelog to see what happened.
37
 
38
- If you have a feature suggestion or idea you’d like to see in the plugin, we’d love to hear about it! [Suggest a Feature](https://codeermeneer.nl/contact/)
39
-
40
  == Installation ==
41
 
42
  How to install Companion Auto Update
@@ -81,6 +82,13 @@ So obviously, some of you wondered what the difference would be between the defa
81
 
82
  == Changelog ==
83
 
 
 
 
 
 
 
 
84
  = 3.8.4 (February 2, 2022) =
85
  * Tweak: Fixed a few styling errors with WP5.9
86
 
3
  Donate link: https://www.paypal.me/dakel/10/
4
  Tags: auto, automatic, background, update, updates, updating, automatic updates, automatic background updates, easy update, wordpress update, theme update, plugin update, up-to-date, security, update latest version, update core, update wp, update wp core, major updates, minor updates, update to new version, update core, update plugin, update plugins, update plugins automatically, update theme, plugin, theme, advance, control, mail, notifations, enable
5
  Requires at least: 3.6.0
6
+ Tested up to: 6.0
7
  Requires PHP: 5.1
8
+ Stable tag: 3.8.5
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
17
 
18
  We understand that you might not always be able to check if your WordPress site has any updates that need to be installed. Especially when you maintain multiple websites keeping them up-to-date can be a lot of work. This plugin can help you with that. We'll keep your site up-to-date and keep you posted about what's happening and notify you when we need your help with something.
19
 
20
+ If you have a feature suggestion or idea you’d like to see in the plugin, we’d love to hear about it! [Suggest a Feature](https://codeermeneer.nl/contact/)
21
+
22
  = Main features =
23
  1. Auto-updating for plugins, themes, core and translation files
24
+ 1. Set at what time you wish to update
25
  1. Filter plugins and themes to not be updated
26
+ 1. E-mail notifications about old software, pending updates and completed updates
27
  1. An update log with all updates
28
  1. Option to delay automatic updates with an x number of days
29
 
38
  We want you to know what's happening on your website. This plugin offers settings for various email notifications. We can send you an email when an update is available, when a plugin has been updated or when wordpress has been updated.
39
  But if you don't want to recieve emails about this you can still log in and view the changelog to see what happened.
40
 
 
 
41
  == Installation ==
42
 
43
  How to install Companion Auto Update
82
 
83
  == Changelog ==
84
 
85
+ = 3.8.5 (March 17, 2022) =
86
+ * New: Added more checks on the status page and added an explanation to some of them.
87
+ * New: Added an list of delayed updates on the status page to help with troubleshooting.
88
+ * Tweak: Made some improvements to the update delay feature.
89
+ * Tweak: Added a notice to explain that update delay does not work with WordPress update currently.
90
+ * Tweak: Improved code on the status page to be more reliable.
91
+
92
  = 3.8.4 (February 2, 2022) =
93
  * Tweak: Fixed a few styling errors with WP5.9
94
 
trunk/admin/dashboard.php DELETED
@@ -1,578 +0,0 @@
1
- <?php
2
-
3
- // Event schedules failed
4
- if ( !wp_next_scheduled ( 'cau_set_schedule_mail' ) ) {
5
- echo '<div id="message" class="error"><p><b>'.__( 'Companion Auto Update was not able to set the event for sending you emails, please re-activate the plugin in order to set the event', 'companion-auto-update' ).'.</b></p></div>';
6
- }
7
-
8
- // Database requires an update
9
- if ( cau_incorrectDatabaseVersion() ) {
10
- echo '<div id="message" class="error"><p><b>'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' &ndash;</b>
11
- '.__( 'We need you to update to the latest database version', 'companion-auto-update' ).'. <a href="'.cau_url( 'status' ).'&run=db_update" class="button button-alt" style="background: #FFF;">'.__( 'Run updater now', 'companion-auto-update' ).'</a></p></div>';
12
- }
13
-
14
- // Update log DB is empty
15
- if ( cau_updateLogDBisEmpty() ) {
16
- echo '<div id="message" class="error"><p><b>'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' &ndash;</b>
17
- '.__( 'We need to add some information to your database', 'companion-auto-update' ).'. <a href="'.cau_url( 'status' ).'&run=db_info_update" class="button button-alt" style="background: #FFF;">'.__( 'Run updater now', 'companion-auto-update' ).'</a></p></div>';
18
- }
19
-
20
- // Save settings
21
- if( isset( $_POST['submit'] ) ) {
22
-
23
- check_admin_referer( 'cau_save_settings' );
24
-
25
- global $wpdb;
26
- $table_name = $wpdb->prefix . "auto_updates";
27
-
28
- // Auto updater
29
- $plugins = isset( $_POST['plugins'] ) ? sanitize_text_field( $_POST['plugins'] ) : '';
30
- $themes = isset( $_POST['themes'] ) ? sanitize_text_field( $_POST['themes'] ) : '';
31
- $minor = isset( $_POST['minor'] ) ? sanitize_text_field( $_POST['minor'] ) : '';
32
- $major = isset( $_POST['major'] ) ? sanitize_text_field( $_POST['major'] ) : '';
33
- $translations = isset( $_POST['translations'] ) ? sanitize_text_field( $_POST['translations'] ) : '';
34
-
35
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugins'", $plugins ) );
36
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'themes'", $themes ) );
37
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'minor'", $minor ) );
38
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'major'", $major ) );
39
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'translations'", $translations ) );
40
-
41
- // Emails
42
- $send = isset( $_POST['cau_send'] ) ? sanitize_text_field( $_POST['cau_send'] ) : '';
43
- $sendupdate = isset( $_POST['cau_send_update'] ) ? sanitize_text_field( $_POST['cau_send_update'] ) : '';
44
- $sendoutdated = isset( $_POST['cau_send_outdated'] ) ? sanitize_text_field( $_POST['cau_send_outdated'] ) : '';
45
- $wpemails = isset( $_POST['wpemails'] ) ? sanitize_text_field( $_POST['wpemails'] ) : '';
46
- $email = isset( $_POST['cau_email'] ) ? sanitize_text_field( $_POST['cau_email'] ) : '';
47
- $html_or_text = isset( $_POST['html_or_text'] ) ? sanitize_text_field( $_POST['html_or_text'] ) : 'html';
48
- $dbupdateemails = isset( $_POST['dbupdateemails'] ) ? sanitize_text_field( $_POST['dbupdateemails'] ) : '';
49
-
50
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'email'", $email ) );
51
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'send'", $send ) );
52
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendupdate'", $sendupdate ) );
53
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendoutdated'", $sendoutdated ) );
54
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'wpemails'", $wpemails ) );
55
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'html_or_text'", $html_or_text ) );
56
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'dbupdateemails'", $dbupdateemails ) );
57
-
58
- // Advanced
59
- $allow_editor = isset( $_POST['allow_editor'] ) ? sanitize_text_field( $_POST['allow_editor'] ) : '';
60
- $allow_author = isset( $_POST['allow_author'] ) ? sanitize_text_field( $_POST['allow_author'] ) : '';
61
- $advanced_info_emails = isset( $_POST['advanced_info_emails'] ) ? sanitize_text_field( $_POST['advanced_info_emails'] ) : '';
62
- $plugin_links_emails = isset( $_POST['plugin_links_emails'] ) ? sanitize_text_field( $_POST['plugin_links_emails'] ) : '';
63
-
64
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_editor'", $allow_editor ) );
65
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_author'", $allow_author ) );
66
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'advanced_info_emails'", $advanced_info_emails ) );
67
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugin_links_emails'", $plugin_links_emails ) );
68
-
69
- // Delay
70
- $update_delay = isset( $_POST['update_delay'] ) ? sanitize_text_field( $_POST['update_delay'] ) : '';
71
- $update_delay_days = isset( $_POST['update_delay_days'] ) ? sanitize_text_field( $_POST['update_delay_days'] ) : '';
72
-
73
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay'", $update_delay ) );
74
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay_days'", $update_delay_days ) );
75
-
76
- // Intervals
77
-
78
- // Set variables
79
- $plugin_sc = sanitize_text_field( $_POST['plugin_schedule'] );
80
- $theme_sc = sanitize_text_field( $_POST['theme_schedule'] );
81
- $core_sc = sanitize_text_field( $_POST['core_schedule'] );
82
- $schedule_mail = sanitize_text_field( $_POST['update_notifications'] );
83
- $outdated_notifier = sanitize_text_field( $_POST['outdated_notifier'] );
84
-
85
- // First clear schedules
86
- wp_clear_scheduled_hook('wp_update_plugins');
87
- wp_clear_scheduled_hook('wp_update_themes');
88
- wp_clear_scheduled_hook('wp_version_check');
89
- wp_clear_scheduled_hook('cau_set_schedule_mail');
90
- wp_clear_scheduled_hook('cau_custom_hooks_plugins');
91
- wp_clear_scheduled_hook('cau_custom_hooks_themes');
92
- wp_clear_scheduled_hook('cau_log_updater');
93
- wp_clear_scheduled_hook('cau_outdated_notifier');
94
-
95
- // Then set the new times
96
-
97
- // Plugins
98
- if( $plugin_sc == 'daily' ) {
99
-
100
- $date = date( 'Y-m-d' );
101
- $hours = sanitize_text_field( $_POST['plugin_schedule-sethour'] );
102
- $minutes = sanitize_text_field( $_POST['plugin_schedule-setminutes'] );
103
- $seconds = date( 's' );
104
- $fullDate = $date.' '.$hours.':'.$minutes.':'.$seconds;
105
- $pluginSetTime = strtotime( $fullDate );
106
-
107
- wp_schedule_event( $pluginSetTime, $plugin_sc, 'wp_update_plugins' );
108
- wp_schedule_event( $pluginSetTime, $plugin_sc, 'cau_custom_hooks_plugins' );
109
- wp_schedule_event( ( $pluginSetTime - 1800 ), $plugin_sc, 'cau_log_updater' );
110
-
111
- } else {
112
-
113
- wp_schedule_event( time(), $plugin_sc, 'wp_update_plugins' );
114
- wp_schedule_event( time(), $plugin_sc, 'cau_custom_hooks_plugins' );
115
- wp_schedule_event( ( time() - 1800 ), $plugin_sc, 'cau_log_updater' );
116
-
117
- }
118
-
119
- // Themes
120
- if( $theme_sc == 'daily' ) {
121
-
122
- $dateT = date( 'Y-m-d' );
123
- $hoursT = sanitize_text_field( $_POST['theme_schedule-sethour'] );
124
- $minutesT = sanitize_text_field( $_POST['theme_schedule-setminutes'] );
125
- $secondsT = date( 's' );
126
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
127
- $themeSetTime = strtotime( $fullDateT );
128
-
129
- wp_schedule_event( $themeSetTime, $theme_sc, 'wp_update_themes' );
130
- wp_schedule_event( $themeSetTime, $theme_sc, 'cau_custom_hooks_themes' );
131
-
132
- } else {
133
-
134
- wp_schedule_event( time(), $theme_sc, 'wp_update_themes' );
135
- wp_schedule_event( time(), $theme_sc, 'cau_custom_hooks_themes' );
136
-
137
- }
138
-
139
- // Core
140
- if( $core_sc == 'daily' ) {
141
-
142
- $dateC = date( 'Y-m-d' );
143
- $hoursC = sanitize_text_field( $_POST['core_schedule-sethour'] );
144
- $minutesC = sanitize_text_field( $_POST['core_schedule-setminutes'] );
145
- $secondsC = date( 's' );
146
- $fullDateC = $dateC.' '.$hoursC.':'.$minutesC.':'.$secondsC;
147
- $coreSetTime = strtotime( $fullDateC );
148
-
149
- wp_schedule_event( $coreSetTime, $core_sc, 'wp_version_check' );
150
-
151
- } else {
152
-
153
- wp_schedule_event( time(), $core_sc, 'wp_version_check' );
154
-
155
- }
156
-
157
- // Update notifications
158
- if( $schedule_mail == 'daily' ) {
159
-
160
- $dateT = date( 'Y-m-d' );
161
- $hoursT = sanitize_text_field( $_POST['update_notifications-sethour'] );
162
- $minutesT = sanitize_text_field( $_POST['update_notifications-setminutes'] );
163
- $secondsT = date( 's' );
164
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
165
- $emailSetTime = strtotime( $fullDateT );
166
-
167
- wp_schedule_event( $emailSetTime, $schedule_mail, 'cau_set_schedule_mail' );
168
-
169
- } else {
170
-
171
- wp_schedule_event( time(), $schedule_mail, 'cau_set_schedule_mail' );
172
-
173
- }
174
-
175
- // Outdated notifications
176
- if( $outdated_notifier == 'daily' ) {
177
-
178
- $dateT = date( 'Y-m-d' );
179
- $hoursT = sanitize_text_field( $_POST['outdated_notifier-sethour'] );
180
- $minutesT = sanitize_text_field( $_POST['outdated_notifier-setminutes'] );
181
- $secondsT = date( 's' );
182
- $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
183
- $emailSetTime = strtotime( $fullDateT );
184
-
185
- wp_schedule_event( $emailSetTime, $outdated_notifier, 'cau_outdated_notifier' );
186
-
187
- } else {
188
-
189
- wp_schedule_event( time(), $outdated_notifier, 'cau_outdated_notifier' );
190
-
191
- }
192
-
193
-
194
- echo '<div id="message" class="updated"><p><b>'.__( 'Settings saved.' ).'</b></p></div>';
195
-
196
- }
197
-
198
- if( isset( $_GET['welcome'] ) ) {
199
-
200
- echo '<div class="welcome-to-cau welcome-bg" style="margin-bottom: 0px;">
201
- <div class="welcome-image">
202
- </div><div class="welcome-content">
203
-
204
- <h3>'.__( 'Welcome to Companion Auto Update', 'companion-auto-update' ).'</h3>
205
- <br />
206
- <p><strong>'.__( 'You\'re set and ready to go', 'companion-auto-update' ).'</strong></p>
207
- <p>'.__( 'The plugin is all set and ready to go with the recommended settings, but if you\'d like you can change them below.' ).'</p>
208
- <br />
209
- <p><strong>'.__( 'Get Started' ).': </strong> <a href="'.cau_url( 'pluginlist' ).'">'.__( 'Update filter', 'companion-auto-update' ).'</a> &nbsp; | &nbsp;
210
- <strong>'.__( 'More Actions' ).': </strong> <a href="http://codeermeneer.nl/cau_poll/" target="_blank">'.__('Give feedback', 'companion-auto-update').'</a> - <a href="https://translate.wordpress.org/projects/wp-plugins/companion-auto-update/" target="_blank">'.__( 'Help us translate', 'companion-auto-update' ).'</a></p>
211
-
212
- </div>
213
- </div>';
214
- }
215
-
216
- $cs_hooks_p = wp_get_schedule( 'cau_custom_hooks_plugins' );
217
- $cs_hooks_t = wp_get_schedule( 'cau_custom_hooks_themes' );
218
-
219
- ?>
220
-
221
- <div class="cau-dashboard cau-column-wide">
222
-
223
- <form method="POST">
224
-
225
- <div class="welcome-to-cau update-bg cau-dashboard-box">
226
-
227
- <h2 class="title"><?php _e('Auto Updater', 'companion-auto-update');?></h2>
228
-
229
- <table class="form-table">
230
- <tr>
231
- <td>
232
- <fieldset>
233
-
234
- <?php
235
-
236
- echo '<p><input id="plugins" name="plugins" type="checkbox"';
237
- if( cau_get_db_value( 'plugins' ) == 'on' ) echo 'checked';
238
- echo '/> <label for="plugins">'.__('Auto update plugins?', 'companion-auto-update').'</label></p>';
239
-
240
- echo '<p><input id="themes" name="themes" type="checkbox"';
241
- if( cau_get_db_value( 'themes' ) == 'on' ) echo 'checked';
242
- echo '/> <label for="themes">'.__('Auto update themes?', 'companion-auto-update').'</label></p>';
243
-
244
- echo '<p><input id="minor" name="minor" type="checkbox"';
245
- if( cau_get_db_value( 'minor' ) == 'on' ) echo 'checked';
246
- echo '/> <label for="minor">'.__('Auto update minor core updates?', 'companion-auto-update').' <code class="majorMinorExplain">5.3.0 > 5.3.1</code></label></p>';
247
-
248
- echo '<p><input id="major" name="major" type="checkbox"';
249
- if( cau_get_db_value( 'major' ) == 'on' ) echo 'checked';
250
- echo '/> <label for="major">'.__('Auto update major core updates?', 'companion-auto-update').' <code class="majorMinorExplain">5.3.0 > 5.4.0</code></label></p>';
251
-
252
- echo '<p><input id="translations" name="translations" type="checkbox"';
253
- if( cau_get_db_value( 'translations' ) == 'on' ) echo 'checked';
254
- echo '/> <label for="translations">'.__('Auto update translation files?', 'companion-auto-update').'</label></p>';
255
-
256
- ?>
257
-
258
- </fieldset>
259
- </td>
260
- </tr>
261
- </table>
262
-
263
- </div>
264
-
265
- <div class="welcome-to-cau email-bg cau-dashboard-box">
266
-
267
- <h2 class="title"><?php _e( 'Email Notifications', 'companion-auto-update' );?></h2>
268
-
269
- <?php
270
- if( cau_get_db_value( 'email' ) == '' ) $toemail = get_option('admin_email');
271
- else $toemail = cau_get_db_value( 'email' );
272
- ?>
273
-
274
- <table class="form-table">
275
- <tr>
276
- <th scope="row"><?php _e( 'Update notifications', 'companion-auto-update' );?></th>
277
- <td>
278
- <p>
279
- <input id="cau_send_update" name="cau_send_update" type="checkbox" <?php if( cau_get_db_value( 'sendupdate' ) == 'on' ) { echo 'checked'; } ?> />
280
- <label for="cau_send_update"><?php _e( 'Send me emails when something has been updated.', 'companion-auto-update' );?></label>
281
- </p>
282
- <p>
283
- <input id="cau_send" name="cau_send" type="checkbox" <?php if( cau_get_db_value( 'send' ) == 'on' ) { echo 'checked'; } ?> />
284
- <label for="cau_send"><?php _e('Send me emails when an update is available.', 'companion-auto-update');?></label>
285
- </p>
286
- </td>
287
- </tr>
288
- <tr>
289
- <th scope="row"><?php _e( 'Check for outdated software', 'companion-auto-update' );?></th>
290
- <td>
291
- <p>
292
- <input id="cau_send_outdated" name="cau_send_outdated" type="checkbox" <?php if( cau_get_db_value( 'sendoutdated' ) == 'on' ) { echo 'checked'; } ?> />
293
- <label for="cau_send_outdated"><?php _e( 'Be notified of plugins that have not been tested with the 3 latest major versions of WordPress.', 'companion-auto-update' );?></label>
294
- </p>
295
- </td>
296
- </tr>
297
- <tr>
298
- <th scope="row"><?php _e( 'Email Address', 'companion-auto-update' );?></th>
299
- <td>
300
- <p>
301
- <label for="cau_email"><?php _e( 'To', 'companion-auto-update' ); ?>:</label>
302
- <input type="text" name="cau_email" id="cau_email" class="regular-text" placeholder="<?php echo get_option('admin_email'); ?>" value="<?php echo esc_html( $toemail ); ?>" />
303
- </p>
304
-
305
- <p class="description"><?php _e('Seperate email addresses using commas.', 'companion-auto-update');?></p>
306
- </td>
307
- </tr>
308
- <tr>
309
- <th scope="row"><?php _e( 'Use HTML in emails?', 'companion-auto-update' );?></th>
310
- <td>
311
- <p>
312
- <select id='html_or_text' name='html_or_text'>
313
- <option value='html' <?php if( cau_get_db_value( 'html_or_text' ) == 'html' ) { echo "SELECTED"; } ?>><?php _e( 'Use HTML', 'companion-auto-update' ); ?></option>
314
- <option value='text' <?php if( cau_get_db_value( 'html_or_text' ) == 'text' ) { echo "SELECTED"; } ?>><?php _e( 'Use plain text', 'companion-auto-update' ); ?></option>
315
- </select>
316
- </p>
317
- </td>
318
- </tr>
319
- <tr>
320
- <th scope="row"><?php _e( 'Show more info in emails', 'companion-auto-update' );?></th>
321
- <td>
322
- <p>
323
- <label for="advanced_info_emails"><input name="advanced_info_emails" type="checkbox" id="advanced_info_emails" <?php if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) { echo "CHECKED"; } ?>> <?php _e( 'Show the time of the update', 'companion-auto-update' ); ?></label>
324
- </p>
325
- <p>
326
- <label for="plugin_links_emails"><input name="plugin_links_emails" type="checkbox" id="plugin_links_emails" <?php if( cau_get_db_value( 'plugin_links_emails' ) == 'on' ) { echo "CHECKED"; } ?>> <?php _e( 'Show links to WordPress.org pages', 'companion-auto-update' ); ?></label>
327
- </p>
328
- </td>
329
- </tr>
330
- <tr>
331
- <th scope="row">
332
- <?php _e( 'WordPress notifications', 'companion-auto-update' );?>
333
- <span class='cau_tooltip'><span class="dashicons dashicons-editor-help"></span>
334
- <span class='cau_tooltip_text'>
335
- <?php _e( 'Core notifications are handled by WordPress and not by this plugin. You can only disable them, changing your email address in the settings above will not affect these notifications.', 'companion-auto-update' );?>
336
- </span>
337
- </span>
338
- </th>
339
- <td>
340
- <p>
341
- <input id="wpemails" name="wpemails" type="checkbox" <?php if( cau_get_db_value( 'wpemails' ) == 'on' ) { echo 'checked'; } ?> />
342
- <label for="wpemails"><?php _e( 'By default WordPress sends an email when a core update has occurred. Uncheck this box to disable these emails.', 'companion-auto-update' ); ?></label>
343
- </p>
344
- </td>
345
- </tr>
346
- <tr>
347
- <th scope="row"><?php _e( 'Database update required', 'companion-auto-update' );?></th>
348
- <td>
349
- <p>
350
- <input id="dbupdateemails" name="dbupdateemails" type="checkbox" <?php if( cau_get_db_value( 'dbupdateemails' ) == 'on' ) { echo 'checked'; } ?> />
351
- <label for="dbupdateemails"><?php _e( 'Sometimes we\'ll need your help updating our database version to the latest version, check this box to allow us to send you an email about this.', 'companion-auto-update' ); ?></label>
352
- </p>
353
- </td>
354
- </tr>
355
- </table>
356
-
357
- </div>
358
-
359
- <div class="welcome-to-cau interval-bg cau-dashboard-box" style="overflow: hidden;">
360
-
361
- <h2 class="title"><?php _e( 'Intervals', 'companion-auto-update' );?></h2>
362
-
363
- <?php
364
-
365
- function cau_show_interval_selection( $identiefier, $schedule ) {
366
-
367
- // Get the info
368
- $setValue = wp_get_schedule( $schedule );
369
- $setTime = wp_next_scheduled( $schedule );
370
- $setHour = date( 'H' , $setTime );
371
- $setMinutes = date( 'i' , $setTime );
372
-
373
- // Show interval selection
374
- echo "<p>";
375
- echo "<select name='$identiefier' id='$identiefier' class='schedule_interval wide interval_scheduler' data-timeblock='$identiefier'>";
376
- foreach ( cau_wp_get_schedules() as $key => $value ) {
377
- echo "<option "; if( $setValue == $key ) { echo "selected "; } echo "value='".$key."'>".$value."</option>";
378
- }
379
- echo "</select>";
380
- echo "</p>";
381
-
382
- // Set the time when daily is selected
383
- echo "<div class='timeblock-$identiefier' style='display: none;'>";
384
-
385
- echo "<div class='cau_schedule_input'>
386
- <input type='number' min='0' max='23' name='".$identiefier."-sethour' value='$setHour' maxlength='2' >
387
- </div><div class='cau_schedule_input_div'>
388
- :
389
- </div><div class='cau_schedule_input'>
390
- <input type='number' min='0' max='59' name='".$identiefier."-setminutes' value='$setMinutes' maxlength='2' >
391
- </div><div class='cau_shedule_notation'>
392
- <span class='cau_tooltip'><span class='dashicons dashicons-editor-help'></span>
393
- <span class='cau_tooltip_text'>".__( 'At what time should the updater run? Only works when set to <u>daily</u>.', 'companion-auto-update' )." - ".__( 'Time notation: 24H', 'companion-auto-update' )."</span>
394
- </span>
395
- </div>";
396
-
397
- echo "</div>";
398
-
399
- }
400
-
401
- ?>
402
-
403
- <div class="welcome-column">
404
-
405
- <h4><?php _e( 'Plugin update interval', 'companion-auto-update' );?></h4>
406
- <?php cau_show_interval_selection( 'plugin_schedule', 'wp_update_plugins' ); ?>
407
-
408
- </div>
409
-
410
- <div class="welcome-column">
411
-
412
- <h4><?php _e( 'Theme update interval', 'companion-auto-update' );?></h4>
413
- <?php cau_show_interval_selection( 'theme_schedule', 'wp_update_themes' ); ?>
414
-
415
- </div>
416
-
417
- <div class="welcome-column">
418
-
419
- <h4><?php _e( 'Core update interval', 'companion-auto-update' );?></h4>
420
- <?php cau_show_interval_selection( 'core_schedule', 'wp_version_check' ); ?>
421
-
422
- </div>
423
-
424
- <p></p>
425
-
426
- <div class="welcome-column">
427
-
428
- <h4><?php _e( 'Update notifications', 'companion-auto-update' );?></h4>
429
- <?php cau_show_interval_selection( 'update_notifications', 'cau_set_schedule_mail' ); ?>
430
-
431
- </div>
432
-
433
- <div class="welcome-column">
434
-
435
- <h4><?php _e( 'Outdated software', 'companion-auto-update' );?></h4>
436
- <?php cau_show_interval_selection( 'outdated_notifier', 'cau_outdated_notifier' ); ?>
437
-
438
- </div>
439
-
440
- </div>
441
-
442
- <div class="welcome-to-cau advanced-bg cau-dashboard-box">
443
-
444
- <h2 class="title"><?php _e( 'Advanced settings', 'companion-auto-update' ); ?></h2>
445
-
446
- <table class="form-table">
447
- <tbody>
448
- <tr>
449
- <th scope="row"><label><?php _e( 'Allow access to:', 'companion-auto-update' ); ?></label></th>
450
- <td>
451
- <p><label for="allow_administrator"><input name="allow_administrator" type="checkbox" id="allow_administrator" disabled="" checked=""><?php _e( 'Administrator', 'companion-auto-update' ); ?></label></p>
452
- <p><label for="allow_editor"><input name="allow_editor" type="checkbox" id="allow_editor" <?php if( cau_get_db_value( 'allow_editor' ) == 'on' ) { echo "CHECKED"; } ?>><?php _e( 'Editor', 'companion-auto-update' ); ?></label></p>
453
- <p><label for="allow_author"><input name="allow_author" type="checkbox" id="allow_author" <?php if( cau_get_db_value( 'allow_author' ) == 'on' ) { echo "CHECKED"; } ?>><?php _e( 'Author', 'companion-auto-update' ); ?></label></p>
454
- </td>
455
- </tr>
456
- <tr>
457
- <th scope="row"><label><?php _e( 'Delay updates', 'companion-auto-update' ); ?></label></th>
458
- <td>
459
- <p><label for="update_delay"><input name="update_delay" type="checkbox" id="update_delay" <?php if( cau_get_db_value( 'update_delay' ) == 'on' ) { echo "CHECKED"; } ?>><?php _e( 'Delay updates', 'companion-auto-update' ); ?></label></p>
460
- </td>
461
- </tr>
462
- <tr id='update_delay_days_block' <?php if( cau_get_db_value( 'update_delay' ) != 'on' ) { echo "class='disabled_option'"; } ?>>
463
- <th scope="row"><label><?php _e( 'Number of days', 'companion-auto-update' ); ?></label></th>
464
- <td>
465
- <input type="number" min="0" max="31" name="update_delay_days" id="update_delay_days" class="regular-text" value="<?php echo cau_get_db_value( 'update_delay_days' ); ?>" />
466
- <p><?php _e( 'For how many days should updates be put on hold?', 'companion-auto-update' ); ?></p>
467
- </td>
468
- </tr>
469
- </tbody>
470
- </table>
471
-
472
- </div>
473
-
474
- <?php wp_nonce_field( 'cau_save_settings' ); ?>
475
-
476
- <div class="cau_save_button">
477
- <?php submit_button(); ?>
478
- </div>
479
- <div class="cau_save_button__space"></div>
480
-
481
- <script>jQuery( '.cau-dashboard input, .cau-dashboard select, .cau-dashboard textarea' ).on( 'change', function() { jQuery('.cau_save_button').addClass( 'fixed_button' ); } );</script>
482
-
483
- </form>
484
-
485
- </div><div class="cau-column-small">
486
-
487
- <div class="welcome-to-cau help-bg cau-dashboard-box">
488
- <div class="welcome-column welcome-column.welcome-column-half">
489
- <h3 class="support-sidebar-title"><?php _e( 'Help' ); ?></h3>
490
- <ul class="support-sidebar-list">
491
- <li><a href="https://codeermeneer.nl/stuffs/faq-auto-updater/" target="_blank"><?php _e( 'Frequently Asked Questions', 'companion-auto-update' ); ?></a></li>
492
- <li><a href="https://wordpress.org/support/plugin/companion-auto-update" target="_blank"><?php _e( 'Support Forums' ); ?></a></li>
493
- </ul>
494
-
495
- <h3 class="support-sidebar-title"><?php _e( 'Want to contribute?', 'companion-auto-update' ); ?></h3>
496
- <ul class="support-sidebar-list">
497
- <li><a href="http://codeermeneer.nl/cau_poll/" target="_blank"><?php _e( 'Give feedback', 'companion-auto-update' ); ?></a></li>
498
- <li><a href="https://codeermeneer.nl/blog/companion-auto-update-and-its-future/" target="_blank"><?php _e( 'Feature To-Do List', 'companion-auto-update' ); ?></a></li>
499
- <li><a href="https://translate.wordpress.org/projects/wp-plugins/companion-auto-update/" target="_blank"><?php _e( 'Help us translate', 'companion-auto-update' ); ?></a></li>
500
- </ul>
501
- </div>
502
- <div class="welcome-column welcome-column.welcome-column-half">
503
- <h3 class="support-sidebar-title"><?php _e( 'Developer?', 'companion-auto-update' ); ?></h3>
504
- <ul class="support-sidebar-list">
505
- <li><a href="https://codeermeneer.nl/documentation/auto-update/" target="_blank"><?php _e( 'Documentation' ); ?></a></li>
506
- </ul>
507
- </div>
508
- </div>
509
-
510
- <div class="welcome-to-cau support-bg cau-dashboard-box">
511
- <div class="welcome-column welcome-column">
512
- <h3><?php _e('Support', 'companion-auto-update');?></h3>
513
- <p><?php _e('Feel free to reach out to us if you have any questions or feedback.', 'companion-auto-update'); ?></p>
514
- <p><a href="https://codeermeneer.nl/contact/" target="_blank" class="button button-primary"><?php _e( 'Contact us', 'companion-auto-update' ); ?></a></p>
515
- <p><a href="https://codeermeneer.nl/plugins/" target="_blank" class="button button-alt"><?php _e('Check out our other plugins', 'companion-auto-update');?></a></p>
516
- </div>
517
- </div>
518
-
519
- <div class="welcome-to-cau love-bg cau-show-love cau-dashboard-box">
520
- <h3><?php _e( 'Like our plugin?', 'companion-auto-update' ); ?></h3>
521
- <p><?php _e('Companion Auto Update is free to use. It has required a great deal of time and effort to develop and you can help support this development by making a small donation.<br />You get useful software and we get to carry on making it better.', 'companion-auto-update'); ?></p>
522
- <a href="https://wordpress.org/support/plugin/companion-auto-update/reviews/#new-post" target="_blank" class="button button-alt button-hero">
523
- <?php _e('Rate us (5 stars?)', 'companion-auto-update'); ?>
524
- </a>
525
- <a href="<?php echo cau_donateUrl(); ?>" target="_blank" class="button button-primary button-hero">
526
- <?php _e('Donate to help development', 'companion-auto-update'); ?>
527
- </a>
528
- <p style="font-size: 12px; color: #BDBDBD;"><?php _e( 'Donations via PayPal. Amount can be changed.', 'companion-auto-update'); ?></p>
529
- </div>
530
-
531
- <div class="welcome-to-cau cau-dashboard-box">
532
- <h3><span style='background: #EBE3F7; color: #BCADD3; padding: 1px 5px; border-radius: 3px; font-size: .8em'>Plugin Promotion</span></h3>
533
- <h3>Keep your site fast with our Revision Manager</h3>
534
- <p>Post Revisions are great, but will also slow down your site. Take back control over revisions with Companion Revision Manager!</p>
535
- <a href="https://codeermeneer.nl/portfolio/plugin/companion-revision-manager/" target="_blank" class="button button-alt">Read more</a>
536
- </div>
537
-
538
- </div>
539
-
540
- <style>
541
- .disabled_option {
542
- opacity: .5;
543
- }
544
- </style>
545
-
546
- <script type="text/javascript">
547
-
548
- jQuery( '#update_delay' ).change( function() {
549
- jQuery( '#update_delay_days_block' ).toggleClass( 'disabled_option' );
550
- });
551
-
552
- jQuery( '.interval_scheduler' ).change( function() {
553
-
554
- var selected = jQuery(this).val(); // Selected value
555
- var timeblock = jQuery(this).data( 'timeblock' ); // Corresponding time block
556
-
557
- if( selected == 'daily' ) {
558
- jQuery( '.timeblock-'+timeblock ).show();
559
- } else {
560
- jQuery( '.timeblock-'+timeblock ).hide();
561
- }
562
-
563
- });
564
-
565
- jQuery( '.interval_scheduler' ).each( function() {
566
-
567
- var selected = jQuery(this).val(); // Selected value
568
- var timeblock = jQuery(this).data( 'timeblock' ); // Corresponding time block
569
-
570
- if( selected == 'daily' ) {
571
- jQuery( '.timeblock-'+timeblock ).show();
572
- } else {
573
- jQuery( '.timeblock-'+timeblock ).hide();
574
- }
575
-
576
- });
577
-
578
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/admin/log.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- if( isset( $_GET['filter'] ) ) {
3
- $filter = $_GET['filter'];
4
- } else {
5
- $filter = 'all';
6
- }
7
- ?>
8
-
9
- <ul class="subsubsub">
10
- <li><a <?php if( $filter == 'all' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=all' ); ?>'><?php _e( 'View full changelog', 'companion-auto-update' ); ?></a></li> |
11
- <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
12
- <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li> |
13
- <li><a <?php if( $filter == 'translations' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'log&filter=translations' ); ?>'><?php _e( 'Translations', 'companion-auto-update' ); ?></a></li>
14
- </ul>
15
-
16
- <div class='cau_spacing'></div>
17
-
18
- <?php
19
- cau_fetch_log( 'all', 'table' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/admin/pluginlist.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
-
3
- // Get selected filter type
4
- if( isset( $_GET['filter'] ) ) {
5
- $filter = sanitize_key( $_GET['filter'] );
6
- } else {
7
- $filter = 'plugins';
8
- }
9
-
10
- // Select correct database row
11
- switch ( $filter ) {
12
- case 'themes':
13
- $db_table = 'notUpdateListTh';
14
- $filter_name = __( 'Themes', 'companion-auto-update' );
15
- $filterFunction = wp_get_themes();
16
- break;
17
- case 'plugins':
18
- $db_table = 'notUpdateList';
19
- $filter_name = __( 'Plugins', 'companion-auto-update' );
20
- $filterFunction = get_plugins();
21
- break;
22
- default:
23
- $db_table = 'notUpdateList';
24
- $filter_name = __( 'Plugins', 'companion-auto-update' );
25
- $filterFunction = get_plugins();
26
- break;
27
- }
28
-
29
- ?>
30
-
31
- <ul class="subsubsub">
32
- <li><a <?php if( $filter == 'plugins' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=plugins' ); ?>'><?php _e( 'Plugins', 'companion-auto-update' ); ?></a></li> |
33
- <li><a <?php if( $filter == 'themes' ) { echo "class='current'"; } ?> href='<?php echo cau_url( 'pluginlist&filter=themes' ); ?>'><?php _e( 'Themes', 'companion-auto-update' ); ?></a></li>
34
- </ul>
35
-
36
- <div style='clear: both;'></div>
37
-
38
- <?php if( $filter == 'themes' ) { ?>
39
- <div id="message" class="cau">
40
- We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update.
41
- </div>
42
- <?php } ?>
43
-
44
- <p><?php echo sprintf( esc_html__( 'Prevent certain %s from updating automatically. %s that you select here will be skipped by Companion Auto Update and will require manual updating.', 'companion-auto-update' ), strtolower( $filter_name ), $filter_name ); ?></p>
45
-
46
- <?php
47
-
48
- global $wpdb;
49
- $table_name = $wpdb->prefix."auto_updates";
50
-
51
- // Save list
52
- if( isset( $_POST['submit'] ) ) {
53
-
54
- check_admin_referer( 'cau_save_pluginlist' );
55
-
56
- $noUpdateList = '';
57
- $i = 0;
58
- $noUpdateCount = 0;
59
-
60
- if( isset( $_POST['post'] ) ) {
61
- $noUpdateCount = count( $_POST['post'] );
62
- }
63
-
64
- if( $noUpdateCount > 0 ) {
65
- foreach ( $_POST['post'] as $key ) {
66
- $noUpdateList .= sanitize_text_field( $key );
67
- $i++;
68
- if( $i != $noUpdateCount ) $noUpdateList .= ', ';
69
- }
70
- }
71
-
72
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = '%s'", $noUpdateList, $db_table ) );
73
- echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( '%1$s %2$s have been added to the no-update-list', 'companion-auto-update' ), $noUpdateCount, strtolower( $filter_name ) ).'.</p></div>';
74
- }
75
-
76
-
77
- // Reset list
78
- if( isset( $_POST['reset'] ) ) {
79
-
80
- check_admin_referer( 'cau_save_pluginlist' );
81
-
82
- $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = %s", "", $db_table ) );
83
- echo '<div id="message" class="updated"><p><b>'.__( 'Succes', 'companion-auto-update' ).' &ndash;</b> '.sprintf( esc_html__( 'The no-update-list has been reset, all %s will be auto-updated from now on', 'companion-auto-update' ), strtolower( $filter_name ) ).'.</p></div>';
84
- }
85
-
86
-
87
- ?>
88
-
89
- <form method="POST">
90
-
91
- <div class='pluginListButtons'>
92
- <?php submit_button(); ?>
93
- <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
94
- </div>
95
-
96
- <table class="wp-list-table widefat autoupdate striped">
97
- <thead>
98
- <tr>
99
- <td>&nbsp;</td>
100
- <th class="head-plugin"><strong><?php _e( 'Name', 'companion-auto-update' ); ?></strong></th>
101
- <th class="head-status"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
102
- <th class="head-description"><strong><?php _e( 'Description' ); ?></strong></th>
103
- </tr>
104
- </thead>
105
-
106
- <tbody id="the-list">
107
-
108
- <?php
109
-
110
- foreach ( $filterFunction as $key => $value ) {
111
-
112
- $slug = $key;
113
- $explosion = explode( '/', $slug );
114
- $actualSlug = array_shift( $explosion );
115
- $slug_hash = md5( $slug[0] );
116
-
117
- if( $filter == 'themes' ) {
118
-
119
- $theme = wp_get_theme( $actualSlug );
120
- $name = $theme->get( 'Name' );
121
- $description = $theme->get( 'Description' );
122
-
123
- } else {
124
-
125
- foreach ( $value as $k => $v ) {
126
-
127
- if( $k == "Name" ) $name = $v;
128
- if( $k == "Description" ) $description = $v;
129
-
130
- }
131
-
132
- }
133
-
134
- if( in_array( $actualSlug, donotupdatelist( $filter ) ) ) {
135
-
136
- $class = 'inactive';
137
- $checked = 'CHECKED';
138
- $statusicon = 'no';
139
- $statusName = 'disabled';
140
-
141
- } else {
142
-
143
- $class = 'active';
144
- $checked = '';
145
- $statusicon = 'yes';
146
- $statusName = 'enabled';
147
- }
148
-
149
- echo '<tr id="post-'.$slug_hash.'" class="'.$class.'">
150
-
151
- <th class="check-column">
152
- <label class="screen-reader-text" for="cb-select-'.$slug_hash.'">Select '. $name .'</label>
153
- <input id="cb-select-'.$slug_hash.'" type="checkbox" name="post[]" value="'.$actualSlug.'" '.$checked.' ><label></label>
154
- <div class="locked-indicator"></div>
155
- </th>
156
-
157
- <td class="column-name">
158
- <p style="margin-bottom: 0px;"><strong>'. $name .'</strong></p>
159
- <small class="description" style="opacity: 0.5; margin-bottom: 3px;">'.$actualSlug.'</small>
160
- </td>
161
-
162
- <td class="cau_hide_on_mobile column-status">
163
- <p><span class="nowrap">'.__( 'Auto Updater', 'companion-auto-update' ).': <span class="cau_'.$statusName.'"><span class="dashicons dashicons-'.$statusicon.'"></span></span></span></p>
164
- </td>
165
-
166
- <td class="cau_hide_on_mobile column-description">
167
- <p>'.$description.'</p>
168
- </td>
169
-
170
- </tr>';
171
-
172
- }
173
- ?>
174
-
175
- </tbody>
176
- </table>
177
-
178
- <?php wp_nonce_field( 'cau_save_pluginlist' ); ?>
179
-
180
- <div class='pluginListButtons'>
181
- <?php submit_button(); ?>
182
- <input type='submit' name='reset' id='reset' class='button button-alt' value='<?php _e( "Reset list", "companion-auto-update" ); ?>'>
183
- </div>
184
-
185
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/admin/rollback.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- // Currently working on this
 
 
trunk/admin/status.php DELETED
@@ -1,405 +0,0 @@
1
- <?php
2
-
3
- // Update the database
4
- if( isset( $_GET['run'] ) && $_GET['run'] == 'db_update' ) {
5
- cau_manual_update();
6
- echo '<div id="message" class="updated"><p><b>'.__( 'Database update completed' ).'</b></p></div>';
7
- }
8
-
9
- if( isset( $_GET['run'] ) && $_GET['run'] == 'db_info_update' ) {
10
- cau_savePluginInformation();
11
- echo '<div id="message" class="updated"><p><b>'.__( 'Database information update completed' ).'</b></p></div>';
12
- }
13
-
14
- if( isset( $_GET['ignore_report'] ) ) {
15
-
16
- $report_to_ignore = sanitize_text_field( $_GET['ignore_report'] );
17
- $allowedValues = array( 'seo', 'cron' );
18
-
19
- if( !in_array( $report_to_ignore, $allowedValues ) ) {
20
- wp_die( 'Trying to cheat eh?' );
21
- } else {
22
- global $wpdb;
23
- $table_name = $wpdb->prefix . "auto_updates";
24
- $wpdb->query( $wpdb->prepare( "UPDATE {$table_name} SET onoroff = %s WHERE name = 'ignore_$report_to_ignore'", 'yes' ) );
25
- $__ignored = __( 'This report will now be ignored', 'companion-auto-update' );
26
- echo "<div id='message' class='updated'><p><b>$__ignored</b></p></div>";
27
- }
28
-
29
- }
30
-
31
-
32
-
33
- // Variables
34
- $dateFormat = get_option( 'date_format' );
35
- $dateFormat .= ' '.get_option( 'time_format' );
36
- global $wpdb;
37
- $table_name = $wpdb->prefix . "auto_updates";
38
- $schedules = wp_get_schedules();
39
- $interval_names = cau_wp_get_schedules();
40
-
41
- ?>
42
-
43
- <div class="cau_status_page">
44
-
45
- <table class="cau_status_list widefat striped">
46
-
47
- <thead>
48
- <tr>
49
- <th class="cau_status_name"><strong><?php _e( 'Auto Updater', 'companion-auto-update' ); ?></strong></th>
50
- <th class="cau_status_active_state"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
51
- <th class="cau_status_interval"><strong><?php _e( 'Interval', 'companion-auto-update' ); ?></strong></th>
52
- <th class="cau_status_next"><strong><?php _e( 'Next', 'companion-auto-update' ); ?></strong></th>
53
- </tr>
54
- </thead>
55
-
56
- <tbody id="the-list">
57
- <?php
58
-
59
- $auto_updaters = array(
60
- 'plugins' => __( 'Plugins', 'companion-auto-update' ),
61
- 'themes' => __( 'Themes', 'companion-auto-update' ),
62
- 'minor' => __( 'Core (Minor)', 'companion-auto-update' ),
63
- 'major' => __( 'Core (Major)', 'companion-auto-update' )
64
- );
65
-
66
- $eventNames = array(
67
- 'plugins' => 'wp_update_plugins',
68
- 'themes' => 'wp_update_themes',
69
- 'minor' => 'wp_version_check',
70
- 'major' => 'wp_version_check'
71
- );
72
-
73
- foreach ( $auto_updaters as $key => $value ) {
74
-
75
- if( cau_get_db_value( $key ) == 'on' ) {
76
- $__status = 'enabled';
77
- $__icon = 'yes-alt';
78
- $__text = __( 'Enabled', 'companion-auto-update' );
79
- $__interval = $interval_names[wp_get_schedule( $eventNames[$key] )];
80
- $__next = date_i18n( $dateFormat, wp_next_scheduled( $eventNames[$key] ) );
81
- } else {
82
- $__status = 'disabled';
83
- $__icon = 'marker';
84
- $__text = __( 'Disabled', 'companion-auto-update' );
85
- $__interval = '&dash;';
86
- $__next = '&dash;';
87
- }
88
-
89
- $__nxt = __( 'Next', 'companion-auto-update' );
90
-
91
- echo "<tr>
92
- <td class='cau_status_name'>$value</td>
93
- <td class='cau_status_active_state'><span class='cau_$__status'><span class='dashicons dashicons-$__icon'></span> $__text</span></td>
94
- <td class='cau_status_interval'>$__interval</td>
95
- <td class='cau_status_next'><span class='cau_mobile_prefix'>$__nxt: </span>$__next</td>
96
- </tr>";
97
- }
98
-
99
- ?>
100
- </tbody>
101
-
102
- </table>
103
-
104
- <table class="cau_status_list widefat striped">
105
-
106
- <thead>
107
- <tr>
108
- <th class="cau_status_name"><strong><?php _e( 'Email Notifications', 'companion-auto-update' ); ?></strong></th>
109
- <th class="cau_status_active_state"><strong><?php _e( 'Status', 'companion-auto-update' ); ?></strong></th>
110
- <th class="cau_status_interval"><strong><?php _e( 'Interval', 'companion-auto-update' ); ?></strong></th>
111
- <th class="cau_status_next"><strong><?php _e( 'Next', 'companion-auto-update' ); ?></strong></th>
112
- </tr>
113
- </thead>
114
-
115
- <tbody id="the-list">
116
- <?php
117
-
118
- $other_events = array(
119
- 'send' => __( 'Update available', 'companion-auto-update' ),
120
- 'sendupdate' => __( 'Successful update', 'companion-auto-update' ),
121
- 'wpemails' => __( 'Core notifications', 'companion-auto-update' )
122
- );
123
-
124
- $other_eventNames = array(
125
- 'send' => 'cau_set_schedule_mail',
126
- 'sendupdate' => 'cau_set_schedule_mail',
127
- 'wpemails' => 'cau_set_schedule_mail',
128
- );
129
-
130
- foreach ( $other_events as $key => $value ) {
131
-
132
- if( cau_get_db_value( $key ) == 'on' ) {
133
- $__status = 'enabled';
134
- $__icon = 'yes-alt';
135
- $__text = __( 'Enabled', 'companion-auto-update' );
136
- $__interval = $interval_names[wp_get_schedule( $other_eventNames[$key] )];
137
- $__next = date_i18n( $dateFormat, wp_next_scheduled( $other_eventNames[$key] ) );
138
- } else {
139
- $__status = 'warning';
140
- $__icon = 'marker';
141
- $__text = __( 'Disabled', 'companion-auto-update' );
142
- $__interval = '&dash;';
143
- $__next = '&dash;';
144
- }
145
-
146
- $__nxt = __( 'Next', 'companion-auto-update' );
147
-
148
- echo "<tr>
149
- <td class='cau_status_name'>$value</td>
150
- <td class='cau_status_active_state'><span class='cau_$__status'><span class='dashicons dashicons-$__icon'></span> $__text</span></td>
151
- <td class='cau_status_interval'>$__interval</td>
152
- <td class='cau_status_next'><span class='cau_mobile_prefix'>$__nxt: </span>$__next</td>
153
- </tr>";
154
- }
155
-
156
- ?>
157
- </tbody>
158
-
159
- </table>
160
-
161
- <table class="cau_status_list widefat striped cau_status_warnings">
162
-
163
- <thead>
164
- <tr>
165
- <th class="cau_plugin_issue_name" colspan="4"><strong><?php _e( 'Status' ); ?></strong></th>
166
- </tr>
167
- </thead>
168
-
169
- <tbody id="the-list">
170
-
171
- <tr>
172
- <td><?php _e( 'Auto updates', 'companion-auto-update' ); ?></td>
173
- <?php if ( checkAutomaticUpdaterDisabled() ) { ?>
174
- <td class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'All automatic updates are disabled', 'companion-auto-update' ); ?></span></td>
175
- <td>
176
- <form method="POST">
177
- <?php wp_nonce_field( 'cau_fixit' ); ?>
178
- <button type="submit" name="fixit" class="button button-primary"><?php _e( 'Fix it', 'companion-auto-update' ); ?></button>
179
- <a href="https://codeermeneer.nl/documentation/known-issues-fixes/#updates_disabled" target="_blank" class="button"><?php _e( 'How to fix this', 'companion-auto-update' ); ?></a>
180
- </form>
181
- </td>
182
- <?php } else { ?>
183
- <td class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
184
- <td></td>
185
- <?php } ?>
186
- <td></td>
187
- </tr>
188
-
189
- <tr>
190
- <td><?php _e( 'Connection with WordPress.org', 'companion-auto-update' ); ?></td>
191
- <?php if( wp_http_supports( array( 'ssl' ) ) == '1' ) {
192
- $__text = __( 'No issues detected', 'companion-auto-update' );
193
- echo "<td colspan='3' class='cau_status_active_state'><span class='cau_enabled'><span class='dashicons dashicons-yes-alt'></span> $__text</span></td>";
194
- } else {
195
- $__text = __( 'Disabled', 'companion-auto-update' );
196
- echo "<td colspan='3' class='cau_status_active_state'><span class='cau_disabled'><span class='dashicons dashicons-no'></span> $__text</span></td>";
197
- } ?>
198
- </tr>
199
-
200
- <tr <?php if( cau_get_db_value( 'ignore_seo' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
201
- <td><?php _e( 'Search Engine Visibility', 'companion-auto-update' ); ?></td>
202
- <?php if( get_option( 'blog_public' ) == 0 ) { ?>
203
- <td colspan="2" class="cau_status_active_state">
204
- <span class='cau_warning'><span class="dashicons dashicons-warning"></span></span>
205
- <?php _e( 'You’ve chosen to discourage Search Engines from indexing your site. Auto-updating works best on sites with more traffic, consider enabling indexing for your site.', 'companion-auto-update' ); ?>
206
- </td>
207
- <td>
208
- <a href="<?php echo admin_url( 'options-reading.php' ); ?>" class="button"><?php _e( 'Fix it', 'companion-auto-update' ); ?></a>
209
- <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=seo" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
210
- </td>
211
- <?php } else { ?>
212
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
213
- <?php } ?>
214
- </tr>
215
-
216
- <tr <?php if( cau_get_db_value( 'ignore_cron' ) == 'yes' ) { echo "class='report_hidden'"; } ?> >
217
- <td><?php _e( 'Cronjobs', 'companion-auto-update' ); ?></td>
218
- <?php if( checkCronjobsDisabled() ) { ?>
219
- <td class="cau_status_active_state"><span class='cau_warning'><span class="dashicons dashicons-warning"></span> <?php _e( 'Disabled', 'companion-auto-update' ); ?></span></td>
220
- <td><code>DISABLE_WP_CRON true</code></td>
221
- <td>
222
- <a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a>
223
- <a href="<?php echo cau_url( 'status' ); ?>&ignore_report=cron" class="button button-alt"><?php _e( 'Ignore this report', 'companion-auto-update' ); ?></a>
224
- </td>
225
- <?php } else { ?>
226
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected', 'companion-auto-update' ); ?></span></td>
227
- <?php } ?>
228
- </tr>
229
-
230
- <tr>
231
- <td>wp_version_check</td>
232
- <?php if ( !has_filter( 'wp_version_check', 'wp_version_check' ) ) { ?>
233
- <td colspan="2" class="cau_status_active_state"><span class='cau_disabled'><span class="dashicons dashicons-no"></span> <?php _e( 'A plugin has prevented updates by disabling wp_version_check', 'companion-auto-update' ); ?></span></td>
234
- <td><a href="https://codeermeneer.nl/contact/" class="button"><?php _e( 'Contact for support', 'companion-auto-update' ); ?></a></td>
235
- <?php } else { ?>
236
- <td colspan="3" class="cau_status_active_state"><span class='cau_enabled'><span class="dashicons dashicons-yes-alt"></span> <?php _e( 'No issues detected' , 'companion-auto-update' ); ?></span></td>
237
- <?php } ?>
238
- </tr>
239
-
240
- <tr>
241
- <td>VCS</td>
242
- <td colspan="3" class="cau_status_active_state"><span class='cau_<?php echo cau_test_is_vcs_checkout( ABSPATH )['status']; ?>'><span class="dashicons dashicons-<?php echo cau_test_is_vcs_checkout( ABSPATH )['icon']; ?>"></span> <?php echo cau_test_is_vcs_checkout( ABSPATH )['description']; ?></span></td>
243
- </tr>
244
-
245
- </tbody>
246
-
247
- </table>
248
-
249
- <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
250
-
251
- <thead>
252
- <tr>
253
- <th colspan="4"><strong><?php _e( 'Systeminfo', 'companion-auto-update' ); ?></strong></th>
254
- </tr>
255
- </thead>
256
-
257
- <tbody id="the-list">
258
- <tr>
259
- <td>WordPress</td>
260
- <td><?php echo get_bloginfo( 'version' ); ?></td>
261
- <td></td>
262
- <td></td>
263
- </tr>
264
- <tr>
265
- <td>PHP</td>
266
- <td><?php echo phpversion(); ?></td>
267
- <td></td>
268
- <td></td>
269
- </tr>
270
- <tr <?php if( cau_incorrectDatabaseVersion() ) { echo "class='inactive'"; } ?>>
271
- <td>Database</td>
272
- <td><?php echo get_option( "cau_db_version" ); ?> <code>(Latest: <?php echo cau_db_version(); ?>)</code></td>
273
- <td></td>
274
- <td></td>
275
- </tr>
276
- <tr>
277
- <td class="cau_status_name"><?php _e( 'Timezone' ); ?></td>
278
- <td class="cau_status_active_state"><?php echo cau_get_proper_timezone(); ?> (GMT <?php echo get_option('gmt_offset'); ?>) - <?php echo date_default_timezone_get(); ?></td>
279
- <td></td>
280
- <td></td>
281
- </tr>
282
- </tbody>
283
-
284
- </table>
285
-
286
- <?php
287
- // If has incomptable plugins
288
- if( cau_incompatiblePlugins() ) { ?>
289
-
290
- <table class="cau_status_list no_column_width widefat striped cau_status_warnings">
291
-
292
- <thead>
293
- <tr>
294
- <th class="cau_plugin_issue_name" colspan="4"><strong><?php _e( 'Possible plugin issues', 'companion-auto-update' ); ?></strong></th>
295
- </tr>
296
- </thead>
297
-
298
- <tbody id="the-list">
299
- <?php
300
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
301
- if( is_plugin_active( $key ) ) {
302
- echo '<tr>
303
- <td class="cau_plugin_issue_name"><strong>'.$key.'</strong></td>
304
- <td colspan="2" class="cau_plugin_issue_explain">'.$value.'</td>
305
- <td class="cau_plugin_issue_fixit"><a href="https://codeermeneer.nl/documentation/known-issues-fixes/#plugins" target="_blank" class="button">'.__( 'How to fix this', 'companion-auto-update' ).'</a></td>
306
- </tr>';
307
- }
308
- }
309
- ?>
310
- </tbody>
311
-
312
- </table>
313
-
314
- <?php } ?>
315
-
316
- <table class="autoupdate cau_status_list widefat striped cau_status_warnings">
317
-
318
- <thead>
319
- <tr>
320
- <th><strong><?php _e( 'Advanced info', 'companion-auto-update' ); ?></strong> &dash; <?php _e( 'For when you need our help fixing an issue.', 'companion-auto-update' ); ?></th>
321
- </tr>
322
- </thead>
323
- <tbody id="the-list">
324
- <tr>
325
- <td>
326
- <div class='button button-primary toggle_advanced_button'><?php _e( 'Toggle', 'companion-auto-update' ); ?></div>
327
-
328
- <div class='toggle_advanced_content' style='display: none;'>
329
- <?php
330
- global $wpdb;
331
- $autoupdates = $wpdb->prefix."auto_updates";
332
- $cau_configs = $wpdb->get_results( "SELECT * FROM $autoupdates" );
333
- array_push( $cau_configs, "WordPress: ".get_bloginfo( 'version' ) );
334
- array_push( $cau_configs, "PHP: ".phpversion() );
335
- array_push( $cau_configs, "DB: ".get_option( "cau_db_version" ).' / '.cau_db_version() );
336
-
337
- echo "<textarea style='width: 100%; height: 750px;'>";
338
- print_r( $cau_configs );
339
- echo "</textarea>";
340
- ?>
341
- </div>
342
- </td>
343
- </tr>
344
- </tbody>
345
- </table>
346
-
347
- <script>jQuery( '.toggle_advanced_button' ).click( function() { jQuery( '.toggle_advanced_content' ).toggle(); });</script>
348
-
349
- </div>
350
-
351
- <?php
352
-
353
- // Remove the line
354
- if( isset( $_POST['fixit'] ) ) {
355
- check_admin_referer( 'cau_fixit' );
356
- cau_removeErrorLine();
357
- }
358
-
359
- // Get wp-config location
360
- function cau_configFile() {
361
-
362
- // Config file
363
- if ( file_exists( ABSPATH . 'wp-config.php') ) {
364
- $conFile = ABSPATH . 'wp-config.php';
365
- } else {
366
- $conFile = dirname(ABSPATH) . '/wp-config.php';
367
- }
368
-
369
- return $conFile;
370
-
371
- }
372
-
373
- // Change the AUTOMATIC_UPDATER_DISABLED line
374
- function cau_removeErrorLine() {
375
-
376
- // Config file
377
- $conFile = cau_configFile();
378
-
379
- // Lines to check and replace
380
- $revLine = "define('AUTOMATIC_UPDATER_DISABLED', false);"; // We could just remove the line, but replacing it will be safer
381
- $posibleLines = array( "define( 'AUTOMATIC_UPDATER_DISABLED', true );", "define( 'AUTOMATIC_UPDATER_DISABLED', minor );" ); // The two base options
382
- foreach ( $posibleLines as $value ) array_push( $posibleLines, strtolower( $value ) ); // Support lowercase variants
383
- foreach ( $posibleLines as $value ) array_push( $posibleLines, str_replace( ' ', '', $value ) ); // For variants without spaces
384
-
385
- $melding = __( "We couldn't fix the error for you. Please contact us for further support", 'companion-auto-update' ).'.';
386
- $meldingS = 'error';
387
-
388
- // Check for each string if it exists
389
- foreach ( $posibleLines as $key => $string ) {
390
-
391
- if( strpos( file_get_contents( $conFile ), $string ) !== false) {
392
- $contents = file_get_contents( $conFile );
393
- $contents = str_replace( $string, $revLine, $contents );
394
- file_put_contents( $conFile, $contents );
395
- $melding = __( "We've fixed the error for you", 'companion-auto-update' ).' :)';
396
- $meldingS = 'updated';
397
- }
398
-
399
- }
400
-
401
- echo "<div id='message' class='$meldingS'><p><strong>$melding</strong></p></div>";
402
-
403
- }
404
-
405
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/check.svg DELETED
@@ -1,55 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- height="417pt"
11
- viewBox="0 -46 417.81333 417"
12
- width="417pt"
13
- version="1.1"
14
- id="svg4"
15
- sodipodi:docname="check.svg"
16
- inkscape:version="0.92.0 r15299">
17
- <metadata
18
- id="metadata10">
19
- <rdf:RDF>
20
- <cc:Work
21
- rdf:about="">
22
- <dc:format>image/svg+xml</dc:format>
23
- <dc:type
24
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
- </cc:Work>
26
- </rdf:RDF>
27
- </metadata>
28
- <defs
29
- id="defs8" />
30
- <sodipodi:namedview
31
- pagecolor="#ffffff"
32
- bordercolor="#666666"
33
- borderopacity="1"
34
- objecttolerance="10"
35
- gridtolerance="10"
36
- guidetolerance="10"
37
- inkscape:pageopacity="0"
38
- inkscape:pageshadow="2"
39
- inkscape:window-width="2560"
40
- inkscape:window-height="1017"
41
- id="namedview6"
42
- showgrid="false"
43
- inkscape:zoom="0.42446043"
44
- inkscape:cx="278"
45
- inkscape:cy="278"
46
- inkscape:window-x="-8"
47
- inkscape:window-y="-8"
48
- inkscape:window-maximized="1"
49
- inkscape:current-layer="svg4" />
50
- <path
51
- d="m 185.111,248.00297 c -2.2287,2.2418 -5.26943,3.49257 -8.42804,3.49257 -3.15861,0 -6.19935,-1.25077 -8.42805,-3.49257 l -67.30869,-67.31961 c -6.985172,-6.98517 -6.985172,-18.31207 0,-25.28413 l 8.42805,-8.43023 c 6.98735,-6.98518 18.30114,-6.98518 25.28632,0 l 42.02237,42.02454 113.55053,-113.552722 c 6.98736,-6.985172 18.31207,-6.985172 25.28633,0 l 8.42805,8.43023 c 6.98516,6.985175 6.98516,18.309882 0,25.284142 z m 0,0"
52
- id="path2"
53
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.55881381"
54
- inkscape:connector-curvature="0" />
55
- </svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/email.svg DELETED
@@ -1,96 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="email.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.6608998"
38
- inkscape:cx="-110.05455"
39
- inkscape:cy="410.34145"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1"
44
- borderlayer="true" /><path
45
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
46
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
47
- id="path2"
48
- inkscape:connector-curvature="0" /><g
49
- id="g8"
50
- transform="scale(1.3026177)" /><g
51
- id="g10"
52
- transform="scale(1.3026177)" /><g
53
- id="g12"
54
- transform="scale(1.3026177)" /><g
55
- id="g14"
56
- transform="scale(1.3026177)" /><g
57
- id="g16"
58
- transform="scale(1.3026177)" /><g
59
- id="g18"
60
- transform="scale(1.3026177)" /><g
61
- id="g20"
62
- transform="scale(1.3026177)" /><g
63
- id="g22"
64
- transform="scale(1.3026177)" /><g
65
- id="g24"
66
- transform="scale(1.3026177)" /><g
67
- id="g26"
68
- transform="scale(1.3026177)" /><g
69
- id="g28"
70
- transform="scale(1.3026177)" /><g
71
- id="g30"
72
- transform="scale(1.3026177)" /><g
73
- id="g32"
74
- transform="scale(1.3026177)" /><g
75
- id="g34"
76
- transform="scale(1.3026177)" /><g
77
- id="g36"
78
- transform="scale(1.3026177)" /><path
79
- inkscape:connector-curvature="0"
80
- d="m 281.76716,529.19554 c 27.99462,9.77382 58.38437,-1.99616 72.99376,-26.55557 L 241.14037,462.9714 c -3.82831,28.32342 12.63218,56.45033 40.62679,66.22414 z m 0,0"
81
- id="path4"
82
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
83
- inkscape:connector-curvature="0"
84
- d="m 454.97461,381.50764 c -0.0736,-0.0257 -0.11887,-0.0415 -0.18687,-0.0653 -59.67543,-20.8346 -91.29336,-86.33378 -70.45084,-146.03188 5.72511,-16.39813 14.92428,-30.59236 26.36198,-42.26448 -3.29602,-1.51283 -6.65995,-2.92233 -10.15928,-4.14406 -59.766,-20.86622 -125.15573,10.65649 -146.03184,70.45084 l -15.05215,43.11307 c -10.68122,30.59363 -34.17187,54.79029 -64.63445,66.47768 -10.17733,3.96817 -17.38414,13.4202 -18.20325,24.79116 -0.9164,13.28721 8.329,25.17993 20.89938,29.56865 l 251.64586,87.85762 c 13.1706,4.59829 28.58431,0.40642 35.75467,-11.56127 5.54241,-9.2518 5.48702,-20.48337 0.002,-29.68445 -15.90548,-26.7325 -19.22019,-58.96007 -9.94599,-88.50764 z m 0,0"
85
- id="path6"
86
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><path
87
- inkscape:connector-curvature="0"
88
- d="m 569.88056,300.18973 c -14.90587,42.69409 -61.59697,65.2195 -104.29102,50.31364 -42.69409,-14.90587 -65.21947,-61.59696 -50.3136,-104.29106 14.90586,-42.69403 61.59693,-65.21944 104.29101,-50.31357 42.69406,14.90586 65.21947,61.59694 50.31361,104.29099 z m 0,0"
89
- id="path8"
90
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.53536594" /><rect
91
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
92
- id="rect4504"
93
- width="768.56519"
94
- height="678.05548"
95
- x="-61.99469"
96
- y="-11.059112" /></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/help.svg DELETED
@@ -1,67 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- height="512pt"
11
- viewBox="0 0 512 512"
12
- width="512pt"
13
- version="1.1"
14
- id="svg6"
15
- sodipodi:docname="help.svg"
16
- inkscape:version="0.92.0 r15299">
17
- <metadata
18
- id="metadata12">
19
- <rdf:RDF>
20
- <cc:Work
21
- rdf:about="">
22
- <dc:format>image/svg+xml</dc:format>
23
- <dc:type
24
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
25
- </cc:Work>
26
- </rdf:RDF>
27
- </metadata>
28
- <defs
29
- id="defs10" />
30
- <sodipodi:namedview
31
- pagecolor="#ffffff"
32
- bordercolor="#666666"
33
- borderopacity="1"
34
- objecttolerance="10"
35
- gridtolerance="10"
36
- guidetolerance="10"
37
- inkscape:pageopacity="0"
38
- inkscape:pageshadow="2"
39
- inkscape:window-width="2560"
40
- inkscape:window-height="1017"
41
- id="namedview8"
42
- showgrid="false"
43
- inkscape:zoom="0.69140625"
44
- inkscape:cx="132.67442"
45
- inkscape:cy="151.29307"
46
- inkscape:window-x="1912"
47
- inkscape:window-y="-8"
48
- inkscape:window-maximized="1"
49
- inkscape:current-layer="svg6" />
50
- <path
51
- d="m 494.10169,605.28813 h -320 c -53.02344,0 -95.999997,-42.97656 -95.999997,-96 v -320 c 0,-53.02344 42.976557,-95.999997 95.999997,-95.999997 h 320 c 53.02344,0 96,42.976557 96,95.999997 v 320 c 0,53.02344 -42.97656,96 -96,96 z m 0,0"
52
- id="path2"
53
- style="fill:#ded1f2;fill-opacity:1"
54
- inkscape:connector-curvature="0" />
55
- <path
56
- d="m 334.10169,221.28813 c -70.57422,0 -128,57.42578 -128,128 0,70.57422 57.42578,128 128,128 70.57422,0 128,-57.42578 128,-128 0,-70.57422 -57.42578,-128 -128,-128 z m 56,138.67188 h -45.32812 v 45.32812 c 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 v -45.32812 h -45.32813 c -5.88672,0 -10.67187,-4.78516 -10.67187,-10.67188 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 h 45.32813 v -45.32813 c 0,-5.88672 4.78515,-10.67187 10.67187,-10.67187 5.88672,0 10.67188,4.78515 10.67188,10.67187 v 45.32813 h 45.32812 c 5.88672,0 10.67188,4.78515 10.67188,10.67187 0,5.88672 -4.78516,10.67188 -10.67188,10.67188 z m 0,0"
57
- id="path4"
58
- style="fill:#9178b7;fill-opacity:1"
59
- inkscape:connector-curvature="0" />
60
- <rect
61
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:4.51278925;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
62
- id="rect4504"
63
- width="614.39001"
64
- height="545.42297"
65
- x="38.296513"
66
- y="74.407166" />
67
- </svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/interval.svg DELETED
@@ -1,69 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512 512"
17
- style="enable-background:new 0 0 512 512;"
18
- xml:space="preserve"
19
- width="512"
20
- height="512"
21
- sodipodi:docname="interval.svg"
22
- inkscape:version="0.92.0 r15299"><metadata
23
- id="metadata39"><rdf:RDF><cc:Work
24
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
25
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
26
- id="defs37" /><sodipodi:namedview
27
- pagecolor="#ffffff"
28
- bordercolor="#666666"
29
- borderopacity="1"
30
- objecttolerance="10"
31
- gridtolerance="10"
32
- guidetolerance="10"
33
- inkscape:pageopacity="0"
34
- inkscape:pageshadow="2"
35
- inkscape:window-width="2560"
36
- inkscape:window-height="1017"
37
- id="namedview35"
38
- showgrid="false"
39
- inkscape:zoom="0.46093749"
40
- inkscape:cx="369.01074"
41
- inkscape:cy="360.3966"
42
- inkscape:window-x="1912"
43
- inkscape:window-y="-8"
44
- inkscape:window-maximized="1"
45
- inkscape:current-layer="g32" /><g
46
- id="g32"><circle
47
- cx="388.33899"
48
- cy="373.15256"
49
- r="326.50848"
50
- id="circle2"
51
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.27542377" /><path
52
- d="m 388.33899,124.4449 c -137.13356,0 -248.70763,111.57407 -248.70763,248.70763 0,137.13356 111.57407,249.98305 248.70763,249.98305 137.13356,0 248.70763,-112.84949 248.70763,-249.98305 0,-137.13356 -111.57407,-248.70763 -248.70763,-248.70763 z"
53
- id="path6"
54
- inkscape:connector-curvature="0"
55
- style="fill:#eceff1;fill-opacity:1;stroke-width:1.27542377" /><path
56
- d="m 388.33899,200.97033 c -10.57454,0 -19.13136,8.55682 -19.13136,19.13135 v 191.31356 c 0,10.57454 8.55682,19.13136 19.13136,19.13136 10.57454,0 19.13135,-8.55682 19.13135,-19.13136 V 220.10168 c 0,-10.57453 -8.55681,-19.13135 -19.13135,-19.13135 z"
57
- id="path10"
58
- inkscape:connector-curvature="0"
59
- style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><path
60
- d="M 503.12712,354.02118 H 388.33899 350.07628 c -10.57454,0 -19.13136,8.55681 -19.13136,19.13135 0,10.57454 8.55682,19.13136 19.13136,19.13136 h 38.26271 114.78813 c 10.57454,0 19.13136,-8.55682 19.13136,-19.13136 0,-10.57454 -8.55682,-19.13135 -19.13136,-19.13135 z"
61
- id="path14"
62
- inkscape:connector-curvature="0"
63
- style="fill:#90a4ae;fill-opacity:1;stroke-width:1.27542377" /><rect
64
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
65
- id="rect4504"
66
- width="768.56519"
67
- height="678.05548"
68
- x="-17.638517"
69
- y="36.294277" /></g></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/love.svg DELETED
@@ -1,116 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
9
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
10
- id="Capa_1"
11
- enable-background="new 0 0 512 512"
12
- height="512"
13
- viewBox="0 0 512 512"
14
- width="512"
15
- version="1.1"
16
- sodipodi:docname="love.svg"
17
- inkscape:version="0.92.0 r15299">
18
- <metadata
19
- id="metadata97">
20
- <rdf:RDF>
21
- <cc:Work
22
- rdf:about="">
23
- <dc:format>image/svg+xml</dc:format>
24
- <dc:type
25
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
26
- </cc:Work>
27
- </rdf:RDF>
28
- </metadata>
29
- <defs
30
- id="defs95" />
31
- <sodipodi:namedview
32
- pagecolor="#ffffff"
33
- bordercolor="#666666"
34
- borderopacity="1"
35
- objecttolerance="10"
36
- gridtolerance="10"
37
- guidetolerance="10"
38
- inkscape:pageopacity="0"
39
- inkscape:pageshadow="2"
40
- inkscape:window-width="2560"
41
- inkscape:window-height="1017"
42
- id="namedview93"
43
- showgrid="false"
44
- inkscape:zoom="0.4609375"
45
- inkscape:cx="-161.41471"
46
- inkscape:cy="87.761635"
47
- inkscape:window-x="1912"
48
- inkscape:window-y="-8"
49
- inkscape:window-maximized="1"
50
- inkscape:current-layer="g88" />
51
- <g
52
- id="g90">
53
- <g
54
- id="g88"
55
- transform="matrix(1.941682,0,0,1.941682,-258.91443,105.22034)">
56
- <g
57
- id="g52"
58
- style="fill:#eceff1;fill-opacity:1">
59
- <path
60
- d="m 182.795,15.986 v 165.382 c 0,8.829 7.157,15.986 15.986,15.986 h 20.359 c 2.854,0 5.364,1.885 6.16,4.626 l 11.126,38.317 c 1.404,4.836 7.578,6.242 10.938,2.491 l 38.788,-43.3 c 1.217,-1.358 2.954,-2.134 4.778,-2.134 h 192.658 c 8.829,0 15.986,-7.157 15.986,-15.986 V 15.986 C 499.573,7.157 492.416,0 483.587,0 H 198.781 c -8.829,0 -15.986,7.157 -15.986,15.986 z"
61
- id="path50"
62
- inkscape:connector-curvature="0"
63
- style="fill:#eceff1;fill-opacity:1" />
64
- </g>
65
- <g
66
- id="g64"
67
- style="fill:#9178b7;fill-opacity:1">
68
- <path
69
- d="m 256.62,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 224.327,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.364,-2.758 5.296,-2.758 6.657,0 z"
70
- id="path58"
71
- inkscape:connector-curvature="0"
72
- style="fill:#9178b7;fill-opacity:1" />
73
- <path
74
- d="m 344.511,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.875,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 l -12.847,-6.754 c -1.081,-0.568 -2.372,-0.568 -3.453,0 l -12.847,6.754 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 312.22,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.362,-2.758 5.294,-2.758 6.655,0 z"
75
- id="path60"
76
- inkscape:connector-curvature="0"
77
- style="fill:#9178b7;fill-opacity:1" />
78
- <path
79
- d="m 432.402,39.06 6.423,13.015 c 0.54,1.095 1.585,1.854 2.794,2.03 l 14.363,2.087 c 3.043,0.442 4.259,4.182 2.056,6.329 l -10.393,10.131 c -0.874,0.852 -1.274,2.081 -1.067,3.284 l 2.453,14.305 c 0.52,3.031 -2.662,5.343 -5.384,3.911 L 430.8,87.398 c -1.081,-0.568 -2.372,-0.568 -3.453,0 L 414.5,94.152 c -2.722,1.431 -5.904,-0.88 -5.384,-3.911 l 2.453,-14.305 c 0.206,-1.204 -0.193,-2.432 -1.067,-3.284 L 400.109,62.521 c -2.202,-2.147 -0.987,-5.887 2.056,-6.329 l 14.363,-2.087 c 1.209,-0.176 2.253,-0.935 2.794,-2.03 l 6.423,-13.015 c 1.363,-2.758 5.296,-2.758 6.657,0 z"
80
- id="path62"
81
- inkscape:connector-curvature="0"
82
- style="fill:#9178b7;fill-opacity:1" />
83
- </g>
84
- <g
85
- id="g76" />
86
- <g
87
- id="g86">
88
- <g
89
- id="g80"
90
- style="fill:#90a4ae;fill-opacity:1">
91
- <path
92
- d="M 459.163,137.933 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 238.174 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
93
- id="path78"
94
- inkscape:connector-curvature="0"
95
- style="fill:#90a4ae;fill-opacity:1" />
96
- </g>
97
- <g
98
- id="g84"
99
- style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1">
100
- <path
101
- d="M 340.076,167.863 H 220.989 c -4.142,0 -7.5,-3.358 -7.5,-7.5 0,-4.142 3.358,-7.5 7.5,-7.5 h 119.087 c 4.142,0 7.5,3.358 7.5,7.5 0,4.142 -3.358,7.5 -7.5,7.5 z"
102
- id="path82"
103
- inkscape:connector-curvature="0"
104
- style="fill:#90a4ae;fill-opacity:1;stroke:none;stroke-opacity:1" />
105
- </g>
106
- </g>
107
- <rect
108
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:2.89835215;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
109
- id="rect4504"
110
- width="395.82443"
111
- height="349.21036"
112
- x="139.90385"
113
- y="-53.375328" />
114
- </g>
115
- </g>
116
- </svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/settings.svg DELETED
@@ -1,124 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="settings.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.3304499"
38
- inkscape:cx="-433.02666"
39
- inkscape:cy="120.52743"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1" /><path
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
- id="path2"
47
- inkscape:connector-curvature="0" /><g
48
- id="g8"
49
- transform="scale(1.3026177)" /><g
50
- id="g10"
51
- transform="scale(1.3026177)" /><g
52
- id="g12"
53
- transform="scale(1.3026177)" /><g
54
- id="g14"
55
- transform="scale(1.3026177)" /><g
56
- id="g16"
57
- transform="scale(1.3026177)" /><g
58
- id="g18"
59
- transform="scale(1.3026177)" /><g
60
- id="g20"
61
- transform="scale(1.3026177)" /><g
62
- id="g22"
63
- transform="scale(1.3026177)" /><g
64
- id="g24"
65
- transform="scale(1.3026177)" /><g
66
- id="g26"
67
- transform="scale(1.3026177)" /><g
68
- id="g28"
69
- transform="scale(1.3026177)" /><g
70
- id="g30"
71
- transform="scale(1.3026177)" /><g
72
- id="g32"
73
- transform="scale(1.3026177)" /><g
74
- id="g34"
75
- transform="scale(1.3026177)" /><g
76
- id="g36"
77
- transform="scale(1.3026177)" /><g
78
- transform="translate(107.14129,82.560247)"
79
- id="g8-7"
80
- style="fill:#90a4ae;fill-opacity:1" /><g
81
- transform="translate(107.14129,82.560247)"
82
- id="g48" /><g
83
- transform="translate(107.14129,82.560247)"
84
- id="g50" /><g
85
- transform="translate(107.14129,82.560247)"
86
- id="g52" /><g
87
- transform="translate(107.14129,82.560247)"
88
- id="g54" /><g
89
- transform="translate(107.14129,82.560247)"
90
- id="g56" /><g
91
- transform="translate(107.14129,82.560247)"
92
- id="g58" /><g
93
- transform="translate(107.14129,82.560247)"
94
- id="g60" /><g
95
- transform="translate(107.14129,82.560247)"
96
- id="g62" /><g
97
- transform="translate(107.14129,82.560247)"
98
- id="g64" /><g
99
- transform="translate(107.14129,82.560247)"
100
- id="g66" /><g
101
- transform="translate(107.14129,82.560247)"
102
- id="g68" /><g
103
- transform="translate(107.14129,82.560247)"
104
- id="g70" /><g
105
- transform="translate(107.14129,82.560247)"
106
- id="g72" /><g
107
- transform="translate(107.14129,82.560247)"
108
- id="g74" /><g
109
- transform="translate(107.14129,82.560247)"
110
- id="g76" /><path
111
- inkscape:connector-curvature="0"
112
- d="m 407.30702,633.58604 h -30.82827 c -24.93373,0 -45.22015,-20.28545 -45.22015,-45.21919 v -10.42958 c -10.60035,-3.38666 -20.89946,-7.66173 -30.79371,-12.78202 l -7.39118,7.39117 c -17.90135,17.92343 -46.57672,17.39768 -63.95808,-0.007 L 207.3268,550.75171 c -17.41207,-17.39287 -17.91288,-46.05864 0.006,-63.95809 l 7.38543,-7.38542 c -5.12029,-9.89424 -9.3944,-20.19143 -12.78202,-30.79371 h -10.42863 c -24.93276,0 -45.21918,-20.28546 -45.21918,-45.21918 v -30.82908 c 0,-24.93372 20.28642,-45.21919 45.22014,-45.21919 h 10.42862 c 3.38764,-10.60132 7.66174,-20.89946 12.78203,-30.79371 l -7.39118,-7.39022 c -17.90807,-17.88889 -17.41399,-46.55754 0.006,-63.95809 l 21.79075,-21.78979 c 17.42166,-17.44565 46.0903,-17.88122 63.95713,0.006 l 7.38447,7.38446 c 9.89423,-5.11933 20.19335,-9.3944 30.7937,-12.78202 v -10.42863 c 0,-24.93373 20.28546,-45.21918 45.22014,-45.21918 h 30.82827 c 24.93373,0 45.21919,20.28545 45.21919,45.21918 v 10.42958 c 10.60035,3.38667 20.89946,7.66174 30.7937,12.78203 l 7.39119,-7.39118 c 17.90135,-17.92343 46.57672,-17.39768 63.95809,0.007 l 21.78882,21.78787 c 17.41207,17.39289 17.91287,46.05866 -0.009,63.9581 l -7.38543,7.38542 c 5.12029,9.89425 9.3944,20.19143 12.78202,30.79371 h 10.42864 c 24.93372,0 45.22013,20.28546 45.22013,45.21919 v 30.8292 c 0,24.93373 -20.28641,45.21919 -45.22013,45.21919 h -10.42864 c -3.38762,10.60132 -7.66173,20.89946 -12.78202,30.7937 l 7.39119,7.39119 c 17.90806,17.88888 17.41397,46.55754 -0.009,63.95809 l -21.79074,21.78978 c -17.42166,17.44565 -46.09031,17.88122 -63.95713,-0.006 l -7.38447,-7.38447 c -9.89424,5.11933 -20.19335,9.3944 -30.7937,12.78202 v 10.42959 c 0,24.93181 -20.28546,45.21726 -45.22014,45.21726 z M 305.27626,534.93141 c 13.74525,8.12896 28.53914,14.27005 43.97005,18.2525 6.35504,1.63961 10.79512,7.37104 10.79512,13.93426 v 21.24868 c 0,9.06341 7.37486,16.43733 16.43827,16.43733 h 30.82828 c 9.0634,0 16.43827,-7.37392 16.43827,-16.43733 v -21.24868 c 0,-6.56322 4.44008,-12.29465 10.79512,-13.93426 15.43091,-3.98245 30.2248,-10.12354 43.97005,-18.2525 5.65564,-3.34445 12.8559,-2.43494 17.50224,2.21141 l 15.05101,15.05196 c 6.48934,6.49702 16.91029,6.34639 23.24039,0.007 l 21.80417,-21.80321 c 6.31474,-6.30707 6.5258,-16.72994 0.009,-23.24136 L 541.06052,492.0995 c -4.6454,-4.64538 -5.5549,-11.8466 -2.21141,-17.50128 8.12895,-13.7443 14.26908,-28.53818 18.25154,-43.97005 1.64057,-6.35504 7.37199,-10.79416 13.93425,-10.79416 h 21.24774 c 9.06341,0 16.43827,-7.37391 16.43827,-16.43732 v -30.82921 c 0,-9.06341 -7.37486,-16.43731 -16.43827,-16.43731 H 571.0349 c -6.56322,0 -12.29368,-4.44009 -13.93425,-10.79416 -3.98246,-15.43188 -10.12355,-30.22576 -18.25154,-43.97005 -3.34349,-5.65468 -2.43399,-12.8559 2.21141,-17.50129 l 15.05195,-15.05195 c 6.50661,-6.49895 6.3368,-16.91798 0.009,-23.24136 l -21.80131,-21.80239 c -6.31955,-6.32818 -16.74241,-6.51334 -23.24136,-0.006 l -15.05675,15.05771 c -4.64539,4.64634 -11.84853,5.55586 -17.50224,2.21141 -13.74526,-8.12897 -28.53914,-14.27005 -43.97006,-18.25251 -6.35502,-1.6396 -10.79512,-7.37103 -10.79512,-13.93426 v -21.2506 c 0,-9.06341 -7.37486,-16.43733 -16.43827,-16.43733 h -30.82827 c -9.06341,0 -16.43828,7.37392 -16.43828,16.43733 v 21.24868 c 0,6.56323 -4.44008,12.29467 -10.79512,13.93427 -15.43091,3.98245 -30.22479,10.12354 -43.97004,18.2525 -5.6566,3.34348 -12.85686,2.43398 -17.50225,-2.21141 L 272.73141,223.7668 c -6.48936,-6.49702 -16.91126,-6.34639 -23.2404,-0.007 l -21.80418,21.80322 c -6.31473,6.30707 -6.5258,16.72898 -0.006,23.24136 l 15.05771,15.05771 c 4.64538,4.64539 5.55489,11.84661 2.2114,17.50128 -8.12896,13.7443 -14.26909,28.53818 -18.25154,43.97005 -1.64056,6.35503 -7.372,10.79415 -13.93426,10.79415 h -21.24868 c -9.06341,9.7e-4 -16.43829,7.37488 -16.43829,16.43829 v 30.82921 c 0,9.06341 7.37488,16.43731 16.43829,16.43731 h 21.24772 c 6.56322,0 12.2937,4.44008 13.93426,10.79416 3.98245,15.43188 10.12354,30.22576 18.25154,43.97005 3.34349,5.65468 2.43398,12.8559 -2.2114,17.50129 l -15.05196,15.05195 c -6.50662,6.49895 -6.33681,16.91798 -0.006,23.24136 l 21.80225,21.80225 c 6.31954,6.32818 16.74241,6.51335 23.24136,0.006 l 15.05674,-15.05771 c 3.42313,-3.42215 10.54472,-6.32625 17.50321,-2.21044 z"
113
- id="path2-7"
114
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><path
115
- inkscape:connector-curvature="0"
116
- d="m 391.89337,494.85747 c -58.9328,0 -106.87666,-47.94482 -106.87666,-106.87664 0,-58.93182 47.94386,-106.87664 106.87666,-106.87664 58.93278,0 106.87664,47.94482 106.87664,106.87664 0,58.93182 -47.94386,106.87664 -106.87664,106.87664 z m 0,-184.97142 c -43.06248,0 -78.0948,35.03329 -78.0948,78.09478 0,43.0615 35.03328,78.09478 78.0948,78.09478 43.0615,0 78.09478,-35.03328 78.09478,-78.09478 0,-43.06149 -35.03232,-78.09478 -78.09478,-78.09478 z"
117
- id="path4-6"
118
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.95939529" /><rect
119
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
120
- id="rect4504"
121
- width="768.56519"
122
- height="678.05548"
123
- x="-25.146145"
124
- y="32.319691" /></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/support.svg DELETED
@@ -1,102 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Capa_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512 512"
17
- style="enable-background:new 0 0 512 512;"
18
- xml:space="preserve"
19
- sodipodi:docname="support.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata75"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs73" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="2560"
34
- inkscape:window-height="1017"
35
- id="namedview71"
36
- showgrid="false"
37
- inkscape:zoom="0.92187498"
38
- inkscape:cx="127.5288"
39
- inkscape:cy="162.24021"
40
- inkscape:window-x="1912"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="g22" /><path
44
- style="fill:#9178b7;fill-opacity:1;stroke:none"
45
- d="m 374.18666,111.86429 c -136.624,0 -247.29601,110.672 -247.29601,247.296 0,136.624 110.67201,247.296 247.29601,247.296 136.624,0 247.296,-110.672 247.296,-247.296 0,-136.624 -110.672,-247.296 -247.296,-247.296 z m 0,368.576 c -66.928,0 -121.12,-54.336 -121.12,-121.264 0,-66.928 54.192,-121.12 121.12,-121.12 66.928,0 121.264,54.192 121.264,121.12 0.016,66.912 -54.336,121.264 -121.264,121.264 z"
46
- id="path10"
47
- inkscape:connector-curvature="0" /><g
48
- id="g22"
49
- transform="translate(81.305295,78.237171)"
50
- style="stroke:none"><path
51
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
52
- d="m 195.61736,53.531119 53.776,114.448001 c 13.504,-5.2 28.128,-8.16 43.488,-8.16 15.344,0 29.968,2.96 43.488,8.16 l 53.776,-114.448001 c -29.856,-12.784 -62.72,-19.904 -97.264,-19.904 -34.544,0 -67.408,7.12 -97.264,19.904 z"
53
- id="path14"
54
- inkscape:connector-curvature="0" /><path
55
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
56
- d="m 171.76136,280.92312 c 0,-15.36 2.976,-29.984 8.176,-43.488 l -114.448003,-53.776 c -12.784,29.856 -19.904,62.72 -19.904,97.264 0,34.544 7.12,67.408 19.904,97.264 l 114.432003,-53.776 c -5.184,-13.52 -8.16,-28.144 -8.16,-43.488 z"
57
- id="path16"
58
- inkscape:connector-curvature="0" /><path
59
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
60
- d="m 390.14536,508.31512 -53.728,-114.32 c -13.536,5.216 -28.176,8.208 -43.536,8.208 -15.376,0 -30.016,-2.992 -43.552,-8.208 l -53.728,114.336 c 29.856,12.784 62.72,19.904 97.264,19.904 34.56,-0.016 67.424,-7.136 97.28,-19.92 z"
61
- id="path18"
62
- inkscape:connector-curvature="0" /><path
63
- style="fill:#eceff1;fill-opacity:1;stroke:#eceff1;stroke-opacity:1"
64
- d="m 414.16136,280.92312 c 0,15.36 -2.976,30 -8.208,43.536 l 114.32,53.728 c 12.784,-29.856 19.904,-62.72 19.904,-97.264 0,-34.544 -7.12,-67.408 -19.904,-97.264 l -114.336,53.728 c 5.232,13.52 8.224,28.176 8.224,43.536 z"
65
- id="path20"
66
- inkscape:connector-curvature="0" /><rect
67
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
68
- id="rect4504"
69
- width="768.56519"
70
- height="678.05548"
71
- x="-178.1302"
72
- y="-39.773388" /></g><g
73
- id="g40"
74
- transform="translate(81.305295,78.237171)" /><g
75
- id="g42"
76
- transform="translate(81.305295,78.237171)" /><g
77
- id="g44"
78
- transform="translate(81.305295,78.237171)" /><g
79
- id="g46"
80
- transform="translate(81.305295,78.237171)" /><g
81
- id="g48"
82
- transform="translate(81.305295,78.237171)" /><g
83
- id="g50"
84
- transform="translate(81.305295,78.237171)" /><g
85
- id="g52"
86
- transform="translate(81.305295,78.237171)" /><g
87
- id="g54"
88
- transform="translate(81.305295,78.237171)" /><g
89
- id="g56"
90
- transform="translate(81.305295,78.237171)" /><g
91
- id="g58"
92
- transform="translate(81.305295,78.237171)" /><g
93
- id="g60"
94
- transform="translate(81.305295,78.237171)" /><g
95
- id="g62"
96
- transform="translate(81.305295,78.237171)" /><g
97
- id="g64"
98
- transform="translate(81.305295,78.237171)" /><g
99
- id="g66"
100
- transform="translate(81.305295,78.237171)" /><g
101
- id="g68"
102
- transform="translate(81.305295,78.237171)" /></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/update.svg DELETED
@@ -1,91 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Layer_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 505 505"
17
- style="enable-background:new 0 0 505 505;"
18
- xml:space="preserve"
19
- sodipodi:docname="update.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata43"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs41" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="2560"
34
- inkscape:window-height="1017"
35
- id="namedview39"
36
- showgrid="false"
37
- inkscape:zoom="0.6608998"
38
- inkscape:cx="-41.965565"
39
- inkscape:cy="289.29436"
40
- inkscape:window-x="1912"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Layer_1" /><path
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:1.194754"
45
- d="m 54.471192,356.14658 c 0,-166.66819 135.007198,-301.675388 301.675388,-301.675388 166.5487,0 301.67538,135.007198 301.67538,301.675388 0,166.66817 -135.12668,301.67538 -301.67538,301.67538 -166.66819,0 -301.675388,-135.00721 -301.675388,-301.67538 z"
46
- id="path2"
47
- inkscape:connector-curvature="0" /><path
48
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
49
- d="m 287.44822,389.59968 h 18.51868 c 14.33706,0 22.46138,-16.36813 13.85915,-27.83776 l -72.64104,-95.81927 c -6.92957,-9.19961 -20.78872,-9.19961 -27.71829,0 l -72.64105,95.81927 c -8.7217,11.46963 -0.4779,27.83776 13.85915,27.83776 h 16.72655 c 26.04564,120.07278 140.50308,170.25245 226.16694,142.7731 7.52694,-2.3895 6.09324,-13.50072 -1.91161,-14.09809 -78.97324,-5.73482 -122.58176,-74.55265 -114.21848,-128.67501 z"
50
- id="path4"
51
- inkscape:connector-curvature="0" /><path
52
- style="fill:#9178b7;fill-opacity:1;stroke-width:1.194754"
53
- d="m 424.84493,322.69346 h -18.51869 c -14.33705,0 -22.46137,16.36813 -13.85914,27.83777 l 72.64104,95.93875 c 6.92957,9.19961 20.78871,9.19961 27.71829,0 l 72.64104,-95.93875 c 8.7217,-11.46964 0.4779,-27.83777 -13.85914,-27.83777 H 534.88177 C 508.71666,202.62069 394.25922,152.44102 308.59536,179.92036 c -7.52695,2.38951 -6.09324,13.50072 1.91161,14.0981 79.09271,5.73482 122.70123,74.55265 114.33796,128.675 z"
54
- id="path6"
55
- inkscape:connector-curvature="0" /><g
56
- id="g8"
57
- transform="scale(1.3026177)" /><g
58
- id="g10"
59
- transform="scale(1.3026177)" /><g
60
- id="g12"
61
- transform="scale(1.3026177)" /><g
62
- id="g14"
63
- transform="scale(1.3026177)" /><g
64
- id="g16"
65
- transform="scale(1.3026177)" /><g
66
- id="g18"
67
- transform="scale(1.3026177)" /><g
68
- id="g20"
69
- transform="scale(1.3026177)" /><g
70
- id="g22"
71
- transform="scale(1.3026177)" /><g
72
- id="g24"
73
- transform="scale(1.3026177)" /><g
74
- id="g26"
75
- transform="scale(1.3026177)" /><g
76
- id="g28"
77
- transform="scale(1.3026177)" /><g
78
- id="g30"
79
- transform="scale(1.3026177)" /><g
80
- id="g32"
81
- transform="scale(1.3026177)" /><g
82
- id="g34"
83
- transform="scale(1.3026177)" /><g
84
- id="g36"
85
- transform="scale(1.3026177)" /><rect
86
- style="opacity:0.5;fill:#ffffff;fill-opacity:0.78431373;fill-rule:evenodd;stroke:none;stroke-width:5.62767839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
87
- id="rect4504"
88
- width="768.56519"
89
- height="678.05548"
90
- x="-71.073227"
91
- y="-6.5198488" /></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/images/welcome.svg DELETED
@@ -1,181 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- version="1.1"
13
- id="Capa_1"
14
- x="0px"
15
- y="0px"
16
- viewBox="0 0 512.001 512.001"
17
- style="enable-background:new 0 0 512.001 512.001;"
18
- xml:space="preserve"
19
- sodipodi:docname="welcome.svg"
20
- inkscape:version="0.92.0 r15299"><metadata
21
- id="metadata99"><rdf:RDF><cc:Work
22
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
24
- id="defs97" /><sodipodi:namedview
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1"
28
- objecttolerance="10"
29
- gridtolerance="10"
30
- guidetolerance="10"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:window-width="1920"
34
- inkscape:window-height="1017"
35
- id="namedview95"
36
- showgrid="false"
37
- inkscape:zoom="1.3037256"
38
- inkscape:cx="154.95189"
39
- inkscape:cy="223.3697"
40
- inkscape:window-x="-8"
41
- inkscape:window-y="-8"
42
- inkscape:window-maximized="1"
43
- inkscape:current-layer="Capa_1" /><circle
44
- style="fill:#ded1f2;fill-opacity:1;stroke-width:0.8621738"
45
- cx="256.00003"
46
- cy="252.93185"
47
- r="220.71649"
48
- id="circle2" /><g
49
- id="g20"
50
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
51
- style="fill:#34abe0"
52
- d="m 469.869,206.196 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -11.259 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.259 c -0.001,3.883 -3.148,7.029 -7.029,7.029 z"
53
- id="path4"
54
- inkscape:connector-curvature="0" /><path
55
- style="fill:#34abe0"
56
- d="m 469.869,263.776 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 245.49 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 11.258 c -0.001,3.881 -3.148,7.028 -7.029,7.028 z"
57
- id="path6"
58
- inkscape:connector-curvature="0" /><path
59
- style="fill:#34abe0"
60
- d="m 504.288,229.358 h -11.259 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.259 c 3.882,0 7.029,3.147 7.029,7.029 0,3.881 -3.148,7.029 -7.029,7.029 z"
61
- id="path8"
62
- inkscape:connector-curvature="0" /><path
63
- style="fill:#34abe0"
64
- d="M 446.707,229.358 H 435.45 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 11.258 c 3.882,0 7.029,3.147 7.029,7.029 -0.002,3.881 -3.148,7.029 -7.03,7.029 z"
65
- id="path10"
66
- inkscape:connector-curvature="0" /><path
67
- style="fill:#34abe0"
68
- d="m 391.867,22.724 c -3.882,0 -7.029,-3.147 -7.029,-7.029 V 7.029 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.883 -3.147,7.029 -7.029,7.029 z"
69
- id="path12"
70
- inkscape:connector-curvature="0" /><path
71
- style="fill:#34abe0"
72
- d="m 391.867,67.048 c -3.882,0 -7.029,-3.147 -7.029,-7.029 v -8.666 c 0,-3.882 3.147,-7.029 7.029,-7.029 3.882,0 7.029,3.147 7.029,7.029 v 8.666 c 0,3.882 -3.147,7.029 -7.029,7.029 z"
73
- id="path14"
74
- inkscape:connector-curvature="0" /><path
75
- style="fill:#34abe0"
76
- d="m 418.362,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
77
- id="path16"
78
- inkscape:connector-curvature="0" /><path
79
- style="fill:#34abe0"
80
- d="m 374.038,40.553 h -8.666 c -3.882,0 -7.029,-3.147 -7.029,-7.029 0,-3.882 3.147,-7.029 7.029,-7.029 h 8.666 c 3.882,0 7.029,3.147 7.029,7.029 0,3.882 -3.147,7.029 -7.029,7.029 z"
81
- id="path18"
82
- inkscape:connector-curvature="0" /></g><path
83
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
84
- d="m 298.98111,139.77931 c -1.09841,0 -2.21061,-0.29831 -3.21073,-0.92511 -2.83569,-1.77694 -3.69529,-5.51619 -1.9192,-8.35187 8.88986,-14.19398 16.29077,-28.09049 21.99663,-41.303308 1.32689,-3.071925 4.89112,-4.486752 7.96563,-3.160729 3.07192,1.326886 4.48762,4.893699 3.15987,7.965625 -5.94815,13.774092 -13.63787,28.218092 -22.85278,42.931942 -1.14842,1.83643 -3.12107,2.84345 -5.13942,2.84345 z"
85
- id="path22"
86
- inkscape:connector-curvature="0" /><path
87
- style="fill:#34abe0;stroke-width:0.8621738"
88
- d="m 221.49065,234.60809 c -1.61572,0 -3.22798,-0.64233 -4.42037,-1.91403 -2.28993,-2.44081 -2.1675,-6.27489 0.27331,-8.56569 0.27849,-0.26124 28.13963,-26.53427 55.9456,-63.72931 2.00368,-2.6805 5.80157,-3.2297 8.48293,-1.22514 2.68049,2.00368 3.22884,5.80156 1.22514,8.48291 -28.47845,38.09258 -56.19562,64.21816 -57.36214,65.3114 -1.17083,1.09583 -2.65895,1.63986 -4.14447,1.63986 z"
89
- id="path24"
90
- inkscape:connector-curvature="0" /><path
91
- style="fill:#f9f9f9;stroke-width:0.8621738"
92
- d="m 275.09631,243.34881 c -1.64503,0 -3.28488,-0.6656 -4.47986,-1.97782 -2.25372,-2.47358 -2.07784,-6.30594 0.3966,-8.5614 28.21033,-25.71433 84.0654,-71.36126 141.18269,-88.17193 3.20988,-0.94408 6.57925,0.89148 7.52419,4.10223 0.94495,3.21073 -0.89149,6.57924 -4.10222,7.52419 -54.78597,16.12438 -108.99946,60.49098 -136.43987,85.50264 -1.16308,1.05961 -2.62446,1.58209 -4.08153,1.58209 z"
93
- id="path26"
94
- inkscape:connector-curvature="0" /><g
95
- id="g32"
96
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
97
- style="fill:#9178b7;fill-opacity:1"
98
- d="m 290.023,308.794 c -2.069,0 -4.119,-0.909 -5.507,-2.655 -2.416,-3.039 -1.91,-7.461 1.128,-9.875 2.334,-1.855 58.024,-45.266 133.17,-30.816 3.812,0.732 6.308,4.417 5.575,8.229 -0.732,3.813 -4.415,6.314 -8.229,5.575 -68.879,-13.246 -121.248,27.602 -121.769,28.017 -1.292,1.025 -2.835,1.525 -4.368,1.525 z"
99
- id="path28"
100
- inkscape:connector-curvature="0" /><path
101
- style="fill:#9178b7;fill-opacity:1"
102
- d="m 194.779,177.404 c -1.061,0 -2.137,-0.24 -3.148,-0.749 -3.469,-1.742 -4.869,-5.966 -3.126,-9.435 11.361,-22.624 23.205,-58.429 15.111,-100.516 -0.734,-3.812 1.763,-7.496 5.575,-8.229 3.811,-0.734 7.496,1.763 8.229,5.575 8.84,45.966 -4.013,84.906 -16.353,109.479 -1.234,2.456 -3.713,3.875 -6.288,3.875 z"
103
- id="path30"
104
- inkscape:connector-curvature="0" /></g><path
105
- style="fill:#f9f9f9;stroke-width:0.8621738"
106
- d="m 282.19114,351.70423 -99.61988,49.64742 -57.9993,28.91818 C 95.167528,408.4413 71.374975,379.46881 55.771353,345.91991 l 9.59427,-19.25148 45.683997,-91.6646 18.10738,-36.33287 z"
107
- id="path34"
108
- inkscape:connector-curvature="0" /><g
109
- id="g42"
110
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><path
111
- style="fill:#9178b7;fill-opacity:1"
112
- d="M 76.667,438.689 C 54.839,417.258 36.825,391.94 23.764,363.864 v -0.01 l 11.139,-22.329 z"
113
- id="path38"
114
- inkscape:connector-curvature="0" /><polygon
115
- style="fill:#9178b7;fill-opacity:1"
116
- points="170.839,428.138 152.074,384.51 87.885,235.211 108.888,193.068 237.301,321.481 286.379,370.559 "
117
- id="polygon40" /></g><path
118
- style="fill:#f9f9f9;stroke-width:0.8621738"
119
- d="M 268.15494,353.91226 126.94639,212.70371 c -6.84393,-6.84395 -6.84393,-17.93926 0,-24.78319 v 0 c 6.84394,-6.84394 17.93925,-6.84394 24.78318,0 l 141.2077,141.20769 c 6.84394,6.84393 6.84394,17.93925 0,24.78318 v 0 c -6.84308,6.84394 -17.93925,6.84394 -24.78233,8.7e-4 z"
120
- id="path46"
121
- inkscape:connector-curvature="0" /><circle
122
- style="fill:#f9f9f9;stroke-width:0.8621738"
123
- cx="176.15497"
124
- cy="142.5831"
125
- r="6.0602198"
126
- id="circle50" /><circle
127
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
128
- cx="257.1355"
129
- cy="119.44839"
130
- r="6.0602198"
131
- id="circle52" /><circle
132
- style="fill:#34abe0;stroke-width:0.8621738"
133
- cx="356.29495"
134
- cy="137.62819"
135
- r="6.0602198"
136
- id="circle54" /><g
137
- id="g60"
138
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)"><circle
139
- style="fill:#f9f9f9"
140
- cx="372.328"
141
- cy="323.53201"
142
- r="7.0289998"
143
- id="circle56" /><path
144
- style="fill:#f9f9f9"
145
- d="m 254.9,10.029 8.735,7.769 c 0.739,0.657 1.753,0.909 2.714,0.673 L 277.7,15.68 c 2.418,-0.595 4.468,1.841 3.469,4.122 l -4.69,10.708 c -0.397,0.906 -0.322,1.949 0.199,2.789 l 6.163,9.934 c 1.312,2.116 -0.371,4.818 -2.848,4.574 L 268.36,46.656 c -0.984,-0.097 -1.953,0.296 -2.59,1.051 l -7.543,8.931 c -1.607,1.902 -4.697,1.136 -5.23,-1.296 l -2.5,-11.42 c -0.211,-0.965 -0.885,-1.766 -1.8,-2.139 l -10.824,-4.415 c -2.305,-0.94 -2.532,-4.116 -0.383,-5.374 l 10.088,-5.907 c 0.854,-0.499 1.406,-1.387 1.479,-2.373 l 0.854,-11.659 c 0.178,-2.483 3.128,-3.681 4.989,-2.026 z"
146
- id="path58"
147
- inkscape:connector-curvature="0" /></g><path
148
- style="fill:#9178b7;fill-opacity:1;stroke-width:0.8621738"
149
- d="m 454.29051,92.257154 5.2722,11.110836 c 0.44574,0.93977 1.32516,1.60019 2.35201,1.76486 l 12.14113,1.95542 c 2.58566,0.41643 3.57199,3.61768 1.66831,5.41703 l -8.93729,8.44672 c -0.75613,0.71474 -1.11134,1.75453 -0.95184,2.7831 l 1.89161,12.15148 c 0.40263,2.58824 -2.3365,4.51434 -4.63592,3.25987 l -10.79527,-5.89036 c -0.91391,-0.49834 -2.01232,-0.51559 -2.94088,-0.0448 l -10.97202,5.55411 c -2.33649,1.18291 -5.01613,-0.82682 -4.53331,-3.40213 l 2.26579,-12.08682 c 0.19226,-1.02253 -0.13278,-2.07352 -0.86562,-2.81069 l -8.67261,-8.71916 c -1.84677,-1.85712 -0.76303,-5.02561 1.83384,-5.36272 l 12.19545,-1.58036 c 1.03117,-0.13364 1.93127,-0.76648 2.40633,-1.69159 l 5.61276,-10.941845 c 1.19323,-2.331318 4.54279,-2.278727 5.66533,0.08708 z"
150
- id="path62"
151
- inkscape:connector-curvature="0" /><g
152
- id="g64"
153
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
154
- id="g66"
155
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
156
- id="g68"
157
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
158
- id="g70"
159
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
160
- id="g72"
161
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
162
- id="g74"
163
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
164
- id="g76"
165
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
166
- id="g78"
167
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
168
- id="g80"
169
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
170
- id="g82"
171
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
172
- id="g84"
173
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
174
- id="g86"
175
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
176
- id="g88"
177
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
178
- id="g90"
179
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /><g
180
- id="g92"
181
- transform="matrix(0.86217384,0,0,0.86217384,35.283516,32.215367)" /></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/style.css DELETED
@@ -1,575 +0,0 @@
1
- /* Default Stylings */
2
- .nowrap {
3
- white-space: nowrap;
4
- }
5
- .cau_spacing {
6
- height: 25px;
7
- }
8
- .cau_support_buttons {
9
- display: inline-block;
10
- }
11
-
12
- /* Welcome screen */
13
- .welcome-to-cau {
14
- background: #FFF;
15
- border: 1px solid #CCD0D4;
16
- margin: 25px 0;
17
- padding: 30px;
18
- background-size: 140px;
19
- background-position: left bottom;
20
- background-repeat: no-repeat;
21
- box-shadow: 0 1px 1px rgba(0,0,0,.04);
22
- }
23
- .welcome-to-cau .welcome-image {
24
- display: inline-block;
25
- vertical-align: middle;
26
- width: 100px;
27
- height: 100px;
28
- background-image: url('images/welcome.svg');
29
- background-size: contain;
30
- background-position: center;
31
- box-sizing: border-box;
32
- }
33
- .welcome-to-cau .welcome-content {
34
- display: inline-block;
35
- vertical-align: middle;
36
- width: calc(100% - 100px);
37
- padding-left: 25px;
38
- box-sizing: border-box;
39
- }
40
- .welcome-to-cau .welcome-content strong {
41
- color: #000;
42
- }
43
- .welcome-to-cau .welcome-content p {
44
- margin: 2px 0;
45
- }
46
- .welcome-to-cau.help-bg {
47
- background-image: url('images/help.svg');
48
- }
49
- .welcome-to-cau.support-bg {
50
- background-image: url('images/support.svg');
51
- }
52
- .welcome-to-cau.love-bg {
53
- background-image: url('images/love.svg');
54
- }
55
- .welcome-to-cau.update-bg {
56
- background-image: url('images/update.svg');
57
- }
58
- .welcome-to-cau.email-bg {
59
- background-image: url('images/email.svg');
60
- }
61
- .welcome-to-cau.interval-bg {
62
- background-image: url('images/interval.svg');
63
- }
64
- .welcome-to-cau.advanced-bg {
65
- background-image: url('images/settings.svg');
66
- }
67
- .welcome-to-cau h2 {
68
- margin: 0;
69
- margin-bottom: 25px;
70
- font-size: 21px;
71
- font-weight: 400;
72
- line-height: 1.2;
73
- }
74
- .welcome-to-cau h2.title {
75
- margin-bottom: 10px;
76
- }
77
- .welcome-to-cau h3 {
78
- font-size: 16px;
79
- margin-top: 0;
80
- }
81
- .welcome-to-cau a {
82
- text-decoration: none;
83
- }
84
- .welcome-to-cau .welcome-column {
85
- display: inline-block;
86
- vertical-align: top;
87
- box-sizing: border-box;
88
- }
89
- .welcome-to-cau.cau-show-love .welcome-column {
90
- vertical-align: middle;
91
- }
92
- .welcome-to-cau .welcome-column.welcome-column-first {
93
- display: block;
94
- width: 100%;
95
- }
96
- .first-column {
97
- padding-left: 140px;
98
- }
99
- .welcome-to-cau .welcome-column.welcome-column-half {
100
- width: 50%;
101
- }
102
- .welcome-to-cau .welcome-column.welcome-column-third {
103
- width: 33%;
104
- }
105
- .welcome-to-cau .welcome-column.welcome-column-quarter {
106
- width: 25%;
107
- }
108
- .welcome-to-cau a.minimal-button {
109
- display: inline-block;
110
- padding: 5px;
111
- }
112
- select.schedule_interval {
113
- max-width: 90%;
114
- width: 225px;
115
- }
116
- .cau_save_button.fixed_button {
117
- background: #FFF;
118
- box-sizing: border-box;
119
- position: fixed;
120
- width: 100%;
121
- right: 0;
122
- bottom: 0;
123
- margin-left: -25px;
124
- z-index: 1001;
125
- padding: 5px;
126
- box-shadow: 0 -8px 16px 0 rgb(85 93 102 / 30%);
127
- }
128
- .cau_save_button.fixed_button p.submit {
129
- display: block;
130
- text-align: center;
131
- font-weight: bold;
132
- margin: 0;
133
- padding: 0;
134
- }
135
- .cau_save_button.fixed_button p.submit input {
136
- width: 100%;
137
- max-width: 250px;
138
- height: 100%;
139
- padding: 5px;
140
- }
141
- .cau_save_button__space {
142
- height: 75px;
143
- }
144
-
145
- /* Overwrite core UI */
146
- /*.cau_content input[type="checkbox"]:checked::before {
147
- content: "";
148
- background: url( 'images/check.svg' );
149
- background-size: contain;
150
- background-position: center center;
151
- }*/
152
- .cau_content a {
153
- color: #9178B7;
154
- }
155
- .cau_content a.nav-tab {
156
- color: #23282D;
157
- }
158
- .cau_content .button-primary {
159
- background-color: #9178B7!important;
160
- border-color: #9178B7!important;
161
- }
162
- .cau_content .button-alt {
163
- color: #9178B7!important;
164
- border-color: #9178B7!important;
165
- }
166
- .cau_content .button-hero {
167
- font-weight: 500;
168
- padding: 2px 15px!important;
169
- }
170
- #message.cau {
171
- background: #FFF;
172
- border: 1px solid #CCD0D4;
173
- border-left-width: 4px;
174
- border-left-color: #9178B7;
175
- box-shadow: 0 1px 1px rgba(0,0,0,.04);
176
- margin: 25px 0px 5px 0;
177
- padding: 15px;
178
- }
179
- #message.cau a, #message.cau strong {
180
- color: #9178B7;
181
- }
182
-
183
- /* Dashboard */
184
- .cau-column-wide {
185
- box-sizing: border-box;
186
- display: inline-block;
187
- vertical-align: top;
188
- width: calc(100% - 450px);
189
- padding-right: 25px;
190
- }
191
- .cau-column-small {
192
- display: inline-block;
193
- vertical-align: top;
194
- width: 450px;
195
- }
196
- .cau-dashboard-box {
197
- background-position: right bottom;
198
- }
199
- .cau-column-wide .cau-dashboard-box {
200
- padding-right: 125px;
201
- }
202
- .cau-dashboard-box a {
203
- margin-left: 0px;
204
- margin-top: 10px;
205
- }
206
- .cau-dashboard-box .welcome-column {
207
- padding-right: 25px;
208
- }
209
- .support-sidebar-list {
210
- margin-bottom: 25px;
211
- }
212
- .cau_content .nav-tab {
213
- position: relative;
214
- }
215
- .cau_content .nav-tab .cau_melding {
216
- display: inline-block;
217
- width: 11px;
218
- height: 11px;
219
- border-radius: 10px;
220
- margin-left: 5px;
221
- position: relative;
222
- bottom: -1px;
223
- }
224
- .cau_content .nav-tab .cau_melding.level-okay {
225
- background: #7AD03A;
226
- }
227
- .cau_content .nav-tab .cau_melding.level-low {
228
- background: #FFBA00;
229
- }
230
- .cau_content .nav-tab .cau_melding.level-high {
231
- background: #FF0000;
232
- }
233
-
234
- /* Table Styling */
235
- .cau_content .widefat td {
236
- vertical-align: middle!important;
237
- }
238
- table.autoupdate th.head-plugin {
239
- min-width: 250px;
240
- }
241
- table.autoupdate th.head-status {
242
- min-width: 150px;
243
- }
244
- table.autoupdate th.check-column {
245
- position: relative;
246
- min-width: 55px;
247
- }
248
- table.autoupdate tr.inactive {
249
- background: #FEF7F1;
250
- }
251
- table.autoupdate tr.active .check-column {
252
- border-left: 3px solid transparent;
253
- }
254
- table.autoupdate tr.inactive .check-column {
255
- border-left: 3px solid #D54E21;
256
- }
257
- table.autoupdate tr.inactive td.column-status p {
258
- color: #BF3D3C;
259
- }
260
- table.autoupdate tr.active td.column-status p {
261
- color: #000;
262
- }
263
- table.autoupdate tr td.column-description p {
264
- overflow: hidden;
265
- max-height: 18px;
266
- }
267
-
268
- /* Update Log */
269
- table.autoupdatelog {
270
- margin-top: 25px;
271
- }
272
- table.autoupdatelog strong {
273
- color: #000;
274
- }
275
- table.autoupdatelog .dashicons {
276
- color: #00A0D2;
277
- }
278
-
279
- /* Status */
280
- table.cau_status_list {
281
- margin-top: 25px;
282
- }
283
- table.cau_status_list:not(.no_column_width) th, table.cau_status_list:not(.no_column_width) td {
284
- width: 25%;
285
- }
286
- .cau_enabled {
287
- color: #7AD03A;
288
- }
289
- .cau_disabled {
290
- color: #FF0000;
291
- }
292
- .cau_warning {
293
- color: #FFBA00;
294
- }
295
- .cau_mobile_prefix {
296
- display: none;
297
- }
298
-
299
- /* Rollback list */
300
- table.rollbacklist {
301
- max-width: 650px;
302
- }
303
- table.rollbacklist td {
304
- vertical-align: middle;
305
- }
306
- table.rollbacklist td a.versionselectbutton {
307
- display: inline-block;
308
- width: 100px;
309
- text-align: center;
310
- }
311
-
312
- /* Plugin list */
313
- .pluginListButtons {
314
- display: block;
315
- padding: 15px 0;
316
- }
317
- .pluginListButtons p.submit {
318
- display: inline-block;
319
- margin: 0!important;
320
- padding: 0!important;
321
- }
322
- .cau_content #the-list input[type="checkbox"]:not(:checked), .cau_content #the-list input[type="checkbox"]:checked {
323
- width: 45px;
324
- height: 45px;
325
- position: absolute;
326
- top: 0;
327
- bottom: 0;
328
- z-index: 100;
329
- display: block;
330
- opacity: 0;
331
- }
332
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label, .cau_content #the-list input[type="checkbox"]:checked + label {
333
- position: absolute;
334
- top: 15px;
335
- left: 12px;
336
- cursor: pointer;
337
- }
338
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label:before, .cau_content #the-list input[type="checkbox"]:checked + label:before, .cau_content #the-list input[type="checkbox"]:not(:checked) + label:after, .cau_content #the-list input[type="checkbox"]:checked + label:after {
339
- content: '';
340
- position: absolute;
341
- }
342
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label:before, .cau_content #the-list input[type="checkbox"]:checked + label:before {
343
- left: 0;
344
- top: -3px;
345
- width: 30px;
346
- height: 16px;
347
- background: transparent;
348
- border: 2px solid #9178B7;
349
- border-radius: 15px;
350
- transition: background-color .2s;
351
- }
352
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label:after, .cau_content #the-list input[type="checkbox"]:checked + label:after {
353
- width: 8px;
354
- height: 8px;
355
- transition: all .2s;
356
- border-radius: 500px;
357
- background: transparent;
358
- border: 2px solid #9178B7;
359
- top: 1px;
360
- left: 5px;
361
- }
362
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label:before {
363
- background: #9178B7;
364
- border: 2px solid #9178B7;
365
- }
366
- .cau_content #the-list input[type="checkbox"]:not(:checked) + label:after {
367
- background: #9178B7;
368
- border-color: #FFF;
369
- left: 18px;
370
- }
371
-
372
- /* Scheduling */
373
- .cau_schedule_input {
374
- display: inline-block;
375
- vertical-align: middle;
376
- width: 50px;
377
- padding-top: 5px;
378
- }
379
- .cau_schedule_input input {
380
- max-width: 100%;
381
- text-align: center;
382
- }
383
- .cau_schedule_input_div {
384
- display: inline-block;
385
- vertical-align: middle;
386
- padding: 0 6px;
387
- font-weight: bold;
388
- }
389
- .cau_shedule_notation {
390
- display: inline-block;
391
- vertical-align: middle;
392
- width: 125px;
393
- padding-left: 5px;
394
- }
395
- .cau_shedule_notation .dashicons {
396
- position: relative;
397
- bottom: -5px;
398
- }
399
-
400
- /* Tooltip */
401
- .cau_tooltip {
402
- position: relative;
403
- }
404
- .cau_tooltip .cau_tooltip_text {
405
- visibility: hidden;
406
- background-color: rgba(0,0,0,0.7);
407
- color: #FFF;
408
- text-align: left;
409
- font-size: 14px;
410
- padding: 15px;
411
- border-radius: 6px;
412
- position: absolute;
413
- z-index: 1;
414
- width: 240px;
415
- bottom: 100%;
416
- left: 50%;
417
- margin-left: -60px;
418
- margin-bottom: 10px;
419
- opacity: 0;
420
- transition: .3s;
421
- font-weight: normal;
422
- }
423
- .cau_tooltip:hover .cau_tooltip_text {
424
- visibility: visible;
425
- opacity: 1;
426
- }
427
- .cau_tooltip .cau_tooltip_text::after {
428
- content: " ";
429
- position: absolute;
430
- top: 100%;
431
- left: 50%;
432
- margin-left: -75px;
433
- border-width: 5px;
434
- border-style: solid;
435
- border-color: rgba(0,0,0,0.7) transparent transparent transparent;
436
- }
437
-
438
- /* Responsive */
439
- @media screen and (max-width: 1400px) {
440
-
441
- .cau-column-wide {
442
- width: calc(100% - 350px);
443
- }
444
- .cau-column-small {
445
- width: 350px;
446
- }
447
- .welcome-to-cau .welcome-column.welcome-column-quarter {
448
- width: 50%;
449
- padding-bottom: 35px;
450
- }
451
- .cau-column-small .welcome-to-cau {
452
- background-image: none;
453
- }
454
-
455
- }
456
- @media screen and (max-width: 1150px) {
457
-
458
- .cau-column-wide, .cau-column-small {
459
- width: 100%;
460
- padding: 0;
461
- }
462
-
463
- }
464
- @media screen and (max-width: 1000px) {
465
-
466
- /* Basics */
467
- .cau_hide_on_mobile, table.autoupdate thead {
468
- display: none!important;
469
- }
470
- .form-table td fieldset p {
471
- display: block;
472
- padding: 5px 0;
473
- }
474
- .form-table td fieldset input[type="checkbox"] {
475
- display: inline-block;
476
- vertical-align: middle;
477
- width: 25px;
478
- }
479
- .form-table td fieldset label {
480
- display: inline-block;
481
- vertical-align: middle;
482
- width: calc(100% - 40px);
483
- box-sizing: border-box;
484
- padding-left: 5px;
485
- }
486
- .cau_content .nav-tab-wrapper {
487
- position: relative;
488
- top: -20px;
489
- border-bottom: 1px solid #CCC!important;
490
- padding-bottom: 15px!important;
491
- margin-bottom: 0px!important;
492
- }
493
- .cau_content .nav-tab {
494
- font-size: 12px;
495
- margin: 5px 5px 0 0!important;
496
- box-sizing: border-box;
497
- text-align: center;
498
- }
499
-
500
- /* Scheduling */
501
- .cau_schedule_input {
502
- width: 75px;
503
- }
504
-
505
- /* Custom buttons */
506
- .cau-button {
507
- display: block;
508
- text-align: center;
509
- margin: 5px 0;
510
- }
511
- .cau-button .dashicons {
512
- float: left;
513
- }
514
-
515
- /* Dashboard */
516
- .welcome-to-cau {
517
- background-position: right bottom;
518
- }
519
- .welcome-to-cau.love-bg {
520
- background-image: none;
521
- }
522
- .welcome-to-cau .welcome-column {
523
- min-width: 100%;
524
- }
525
- .welcome-to-cau .welcome-column.welcome-column-first {
526
- padding-left: 0px;
527
- }
528
- .cau-column-wide .cau-dashboard-box {
529
- padding-right: 30px;
530
- padding-bottom: 125px
531
- }
532
- .majorMinorExplain {
533
- display: none;
534
- }
535
-
536
- /* Status */
537
- table.cau_status_list .cau_status_name {
538
- display: inline-block;
539
- width: 50%;
540
- box-sizing: border-box;
541
- font-weight: 500;
542
- }
543
- table.cau_status_list .cau_status_interval {
544
- display: none;
545
- }
546
- table.cau_status_list th.cau_status_next {
547
- display: none;
548
- }
549
- table.cau_status_list td.cau_status_next {
550
- display: block;
551
- width: 100%;
552
- }
553
- table.cau_status_list .cau_status_active_state {
554
- display: inline-block;
555
- width: 50%;
556
- box-sizing: border-box;
557
- text-align: right;
558
- }
559
- .cau_mobile_prefix {
560
- display: inline-block;
561
- padding-right: 5px;
562
- }
563
- table.cau_status_list.cau_status_warnings td {
564
- display: block;
565
- width: 100%;
566
- box-sizing: border-box;
567
- }
568
- table.cau_status_list.cau_status_warnings th.cau_plugin_issue_explain, table.cau_status_list.cau_status_warnings th.cau_plugin_issue_fixit {
569
- display: none;
570
- }
571
- table.cau_status_list.cau_status_warnings td.cau_plugin_issue_name {
572
- font-weight: 500;
573
- }
574
-
575
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/backend/warningbar.css DELETED
@@ -1,11 +0,0 @@
1
- #wpadminbar #wp-admin-bar-cau-has-issues .ab-icon:before {
2
- /*content: "\f463";*/
3
- content: "\f332";
4
- top: 3px;
5
- }
6
- #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-low {
7
- /*color: #FFBA00;*/
8
- }
9
- #wpadminbar #wp-admin-bar-cau-has-issues .cau-level-high {
10
- color: #FF0000;
11
- }
 
 
 
 
 
 
 
 
 
 
 
trunk/cau_emails.php DELETED
@@ -1,525 +0,0 @@
1
- <?php
2
-
3
- // Check if emails should be send or not
4
- function cau_check_updates_mail() {
5
-
6
- // Notify of pending updates
7
- if( cau_get_db_value( 'send' ) == 'on' ) {
8
- cau_list_theme_updates(); // Check for theme updates
9
- cau_list_plugin_updates(); // Check for plugin updates
10
- }
11
-
12
- // Notify of completed updates
13
- if( cau_get_db_value( 'sendupdate' ) == 'on' && cau_get_db_value( 'plugins' ) == 'on' ) {
14
- cau_plugin_updated(); // Check for updated plugins
15
- }
16
-
17
- // Notify of required db update
18
- if( cau_get_db_value( 'dbupdateemails' ) == 'on' ) {
19
- cau_notify_outofdate_db();
20
- }
21
-
22
- }
23
-
24
- // Notify of out of date software
25
- function cau_outdated_notifier_mail() {
26
- if( cau_get_db_value( 'sendoutdated' ) == 'on' ) {
27
- cau_list_outdated_software(); // Check for oudated plugins
28
- }
29
- }
30
-
31
- // Ge the emailadresses it should be send to
32
- function cau_set_email() {
33
-
34
- $emailArray = array();
35
-
36
- if( cau_get_db_value( 'email' ) == '' ) {
37
- array_push( $emailArray, get_option('admin_email') );
38
- } else {
39
- $emailAdresses = cau_get_db_value( 'email' );
40
- $list = explode( ", ", $emailAdresses );
41
- foreach ( $list as $key ) {
42
- array_push( $emailArray, $list );
43
- }
44
- }
45
-
46
- return $emailArray;
47
-
48
- }
49
-
50
- // Mail format
51
- function cau_is_html() {
52
-
53
- // Check if cau_get_db_value() function exists.
54
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
55
-
56
- // Check if html
57
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
58
- $html = true;
59
- } else {
60
- $html = false;
61
- }
62
-
63
- }
64
-
65
- // Set the content for the emails about pending updates
66
- function cau_outdated_message( $single, $plural, $list ) {
67
-
68
- // WP version
69
- $wpversion = get_bloginfo( 'version' );
70
-
71
- // Base text
72
- $text = sprintf( esc_html__( "You have %s on your WordPress site at %s that have not been tested with the latest 3 major releases of WordPress.", "companion-auto-update" ), $plural, get_site_url() );
73
- $text .= "\n";
74
- $text .= "\n";
75
-
76
- // The list
77
- if( !empty( $list ) ) {
78
-
79
- $text .= sprintf( esc_html__( "The following %s have not been tested with WordPress %s:", "companion-auto-update" ), $plural, $wpversion );
80
- $text .= "\n";
81
- $text .= "\n";
82
-
83
- foreach ( $list as $plugin => $version ) {
84
- if( $version == '' ) $version = __( "Unknown", "companion-auto-update" );
85
- $text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
86
- }
87
-
88
- }
89
-
90
- return $text;
91
-
92
- }
93
-
94
- // Set the content for the emails about pending updates
95
- function cau_pending_message( $single, $plural, $list ) {
96
-
97
- // What markup to use
98
- if( cau_is_html() ) $break = '<br />';
99
- else $break = "\n";
100
-
101
- // Base text
102
- $text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
103
- $text .= $break;
104
-
105
- if( !empty( $list ) ) {
106
-
107
- $text .= $break;
108
- $text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
109
- $text .= $break;
110
-
111
- if( cau_is_html() ) $text .= "<ol>";
112
- foreach ( $list as $key => $value ) {
113
- if( cau_is_html() ) {
114
- $text .= "<li>$value</li>";
115
- } else {
116
- $text .= "-$value\n";
117
- }
118
- }
119
- if( cau_is_html() ) $text .= "</ol>";
120
-
121
- $text .= $break;
122
- }
123
-
124
- $text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
125
- $text .= $break;
126
-
127
- // End
128
- $text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' );
129
-
130
- return $text;
131
-
132
- }
133
-
134
- // Set the content for the emails about recent updates
135
- function cau_updated_message( $type, $updatedList ) {
136
-
137
- // What markup to use
138
- if( cau_is_html() ) $break = '<br />';
139
- else $break = "\n";
140
-
141
- // The message
142
- $text = sprintf( esc_html__(
143
- 'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part.
144
- For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
145
- ), $type, get_site_url() );
146
-
147
- $text .= $break;
148
- $text .= $break;
149
- $text .= sprintf( esc_html__(
150
- 'The following %1$s have been updated:', 'companion-auto-update'
151
- ), $type );
152
-
153
- $text .= $break;
154
- $text .= $updatedList;
155
-
156
- $text .= $break;
157
- $text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" );
158
-
159
- return $text;
160
-
161
- }
162
-
163
- // Checks if plugins are out of date
164
- function cau_list_outdated_software() {
165
-
166
- // Check if cau_get_db_value() function exists.
167
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
168
-
169
- // Set up mail
170
- $subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
171
- $type = __( 'plugin', 'companion-auto-update' );
172
- $type_plural = __( 'plugins', 'companion-auto-update' );
173
- $message = cau_outdated_message( $type, $type_plural, cau_list_outdated() );
174
-
175
- // Send to all addresses
176
- foreach ( cau_set_email() as $key => $value ) {
177
- foreach ( $value as $k => $v ) {
178
- wp_mail( $v, $subject, $message );
179
- }
180
- break;
181
- }
182
-
183
- }
184
-
185
- // Checks if theme updates are available
186
- function cau_list_theme_updates() {
187
-
188
- global $wpdb;
189
- $table_name = $wpdb->prefix . "auto_updates";
190
-
191
- $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
192
- foreach ( $configs as $config ) {
193
-
194
- if( $config->onoroff != 'on' ) {
195
-
196
- require_once ABSPATH . '/wp-admin/includes/update.php';
197
- $themes = get_theme_updates();
198
- $list = array();
199
-
200
- if ( !empty( $themes ) ) {
201
-
202
- foreach ( $themes as $stylesheet => $theme ) {
203
- array_push( $list, $theme->get( 'Name' ) );
204
- }
205
-
206
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
207
- $type = __('theme', 'companion-auto-update');
208
- $type_plural = __('themes', 'companion-auto-update');
209
- $message = cau_pending_message( $type, $type_plural, $list );
210
-
211
- foreach ( cau_set_email() as $key => $value) {
212
- foreach ($value as $k => $v) {
213
- wp_mail( $v, $subject, $message );
214
- }
215
- break;
216
- }
217
- }
218
-
219
- }
220
-
221
- }
222
-
223
- }
224
-
225
- // Checks if plugin updates are available
226
- function cau_list_plugin_updates() {
227
-
228
- global $wpdb;
229
- $table_name = $wpdb->prefix . "auto_updates";
230
-
231
- $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
232
- foreach ( $configs as $config ) {
233
-
234
- if( $config->onoroff != 'on' ) {
235
-
236
- require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
237
-
238
- if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
239
- $plugins = get_plugin_updates();
240
-
241
- if ( !empty( $plugins ) ) {
242
-
243
- $list = array();
244
- foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
245
- $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
246
- $name = $plugin_data->Name;
247
- array_push( $list, $name );
248
- }
249
-
250
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
251
- $type = __( 'plugin', 'companion-auto-update' );
252
- $type_plural = __( 'plugins', 'companion-auto-update' );
253
- $message = cau_pending_message( $type, $type_plural, $list );
254
-
255
- foreach ( cau_set_email() as $key => $value) {
256
- foreach ($value as $k => $v) {
257
- wp_mail( $v, $subject, $message );
258
- }
259
- break;
260
- }
261
- }
262
-
263
- }
264
-
265
- }
266
- }
267
-
268
- // Alerts when plugin has been updated
269
- function cau_plugin_updated() {
270
-
271
- // Check if cau_get_db_value() function exists.
272
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
273
-
274
- // Set the correct timezone for emails
275
- date_default_timezone_set( cau_get_proper_timezone() );
276
-
277
- // Create arrays
278
- $pluginNames = array();
279
- $pluginDates = array();
280
- $pluginVersion = array();
281
- $pluginSlug = array();
282
- $pluginTimes = array();
283
- $themeNames = array();
284
- $themeDates = array();
285
- $themeTimes = array();
286
-
287
- // Where to look for plugins
288
- $plugdir = plugin_dir_path( __DIR__ );
289
- if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists.
290
- $allPlugins = get_plugins();
291
-
292
- // Where to look for themes
293
- $themedir = get_theme_root();
294
- $allThemes = wp_get_themes();
295
-
296
- // Mail schedule
297
- $schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
298
-
299
- // Loop trough all plugins
300
- foreach ( $allPlugins as $key => $value ) {
301
-
302
- // Get plugin data
303
- $fullPath = $plugdir.'/'.$key;
304
- $getFile = $path_parts = pathinfo( $fullPath );
305
- $pluginData = get_plugin_data( $fullPath );
306
-
307
- // Get the slug
308
- $explosion = explode( '/', $key );
309
- $actualSlug = array_shift( $explosion );
310
-
311
- // Get last update date
312
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
313
-
314
- switch ( $schedule_mail ) {
315
- case 'hourly':
316
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
317
- break;
318
- case 'twicedaily':
319
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
320
- break;
321
- default:
322
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
323
- break;
324
- }
325
-
326
- $dateFormat = get_option( 'date_format' );
327
- $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
328
- $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
329
-
330
- if( $fileDate >= $lastday ) {
331
-
332
- // Get plugin name
333
- foreach ( $pluginData as $dataKey => $dataValue ) {
334
- if( $dataKey == 'Name') {
335
- array_push( $pluginNames , $dataValue );
336
- }
337
- if( $dataKey == 'Version') {
338
- array_push( $pluginVersion , $dataValue );
339
- }
340
- }
341
-
342
- array_push( $pluginDates, $fileDate );
343
- array_push( $pluginSlug, $actualSlug );
344
- array_push( $pluginTimes, $timestamp );
345
- }
346
-
347
- }
348
-
349
- // Loop trough all themes
350
- foreach ( $allThemes as $key => $value ) {
351
-
352
- // Get theme data
353
- $fullPath = $themedir.'/'.$key;
354
- $getFile = $path_parts = pathinfo( $fullPath );
355
-
356
- // Get last update date
357
- $dateFormat = get_option( 'date_format' );
358
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
359
-
360
- if( $schedule_mail == 'hourly' ) {
361
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
362
- } elseif( $schedule_mail == 'twicedaily' ) {
363
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
364
- } elseif( $schedule_mail == 'daily' ) {
365
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
366
- }
367
-
368
- $dateFormat = get_option( 'date_format' );
369
- $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
370
- $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) );
371
-
372
- if( $fileDate >= $lastday ) {
373
- array_push( $themeNames, $path_parts['filename'] );
374
- array_push( $themeDates, $fileDate );
375
- array_push( $themeTimes, $timestamp );
376
- }
377
-
378
- }
379
-
380
- $totalNumP = 0;
381
- $totalNumT = 0;
382
- $updatedListP = '';
383
- $updatedListT = '';
384
-
385
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
386
- $updatedListP .= '<ol>';
387
- $updatedListT .= '<ol>';
388
- }
389
-
390
- foreach ( $pluginDates as $key => $value ) {
391
-
392
- // Set up some var
393
- $plugin_name = $pluginNames[$key];
394
- $plugin_slug = $pluginSlug[$key];
395
- $to_version = __( "to version", "companion-auto-update" ).' '.$pluginVersion[$key];
396
- $more_info_arr = array( __( "Time of update", "companion-auto-update" ) => $pluginTimes[$key] );
397
-
398
- // Plugin links
399
- if( cau_get_db_value( 'plugin_links_emails' ) == 'on' ) {
400
- $more_info_arr[__( "Plugin details", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
401
- $more_info_arr[__( "Release notes", "companion-auto-update" )] = "<a href='https://wordpress.org/plugins/{$plugin_slug}/#developers'>".__( "Visit", "companion-auto-update" )."</a>";
402
- $more_info_arr[__( "Support", "companion-auto-update" )] = "<a href='https://wordpress.org/support/plugin/{$plugin_slug}/'>".__( "Visit", "companion-auto-update" )."</a>";
403
- }
404
-
405
- // Email format
406
- $use_html = ( cau_get_db_value( 'html_or_text' ) == 'html' ) ? true : false;
407
-
408
- // Email content
409
- $updatedListP .= $use_html ? "<li>" : "-"; // Start row
410
-
411
- $updatedListP .= $use_html ? "<strong>{$plugin_name}</strong> " : "{$plugin_name} "; // Show plugin name
412
- $updatedListP .= $to_version; // To version
413
-
414
- // Get advanced info
415
- if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) {
416
- foreach( $more_info_arr as $label => $value ) {
417
- $updatedListP .= $use_html ? "<br />{$label}: {$value}" : "\n{$label}: {$value}";
418
- }
419
- }
420
-
421
- $updatedListP .= $use_html ? "</li>" : "\n"; // End row
422
-
423
- $totalNumP++;
424
- }
425
-
426
- foreach ( $themeNames as $key => $value ) {
427
-
428
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
429
-
430
- $more_info = '';
431
- if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "<br /><span style='opacity: 0.5;'>".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key]."</span>";
432
- $updatedListT .= "<li><strong>".$themeNames[$key]."</strong>".$more_info."</li>";
433
-
434
- } else {
435
- $updatedListT .= "- ".$themeNames[$key]."\n";
436
- }
437
-
438
- $totalNumT++;
439
- }
440
-
441
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
442
- $updatedListP .= '</ol>';
443
- $updatedListT .= '</ol>';
444
- }
445
-
446
- // Set the email content type
447
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
448
- function cau_mail_content_type() {
449
- return 'text/html';
450
- }
451
- add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
452
- }
453
-
454
- // If plugins have been updated, send email
455
- if( $totalNumP > 0 ) {
456
-
457
- // E-mail content
458
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
459
- $type = __('plugins', 'companion-auto-update');
460
- $message = cau_updated_message( $type, $updatedListP );
461
-
462
- // Send to all addresses
463
- foreach ( cau_set_email() as $key => $value) {
464
- foreach ($value as $k => $v) {
465
- wp_mail( $v, $subject, $message );
466
- }
467
- break;
468
- }
469
-
470
- }
471
-
472
- // If themes have been updated, send email
473
- if( $totalNumT > 0 ) {
474
-
475
- // E-mail content
476
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
477
- $type = __('themes', 'companion-auto-update');
478
- $message = cau_updated_message( $type, $updatedListT );
479
-
480
- // Send to all addresses
481
- foreach ( cau_set_email() as $key => $value) {
482
- foreach ($value as $k => $v) {
483
- wp_mail( $v, $subject, $message );
484
- }
485
- break;
486
- }
487
-
488
- }
489
-
490
- if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
491
-
492
- // Prevent duplicate emails by setting the event again
493
- if( $totalNumT > 0 OR $totalNumP > 0 ) {
494
- if( $schedule_mail == 'hourly' ) {
495
- wp_clear_scheduled_hook('cau_set_schedule_mail');
496
- wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
497
- }
498
- }
499
-
500
- }
501
-
502
- function cau_notify_outofdate_db() {
503
-
504
- // Check if cau_get_db_value() function exists.
505
- if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
506
-
507
- // Database requires an update
508
- if ( cau_incorrectDatabaseVersion() ) {
509
-
510
- // Set up mail
511
- $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'We need your help with something', 'companion-auto-update' );
512
- $message = __( 'Hi there! We need your help updating the database of Companion Auto Update to the latest version. No rush, old features will continue to work but some new features might not work until you update the database.', 'companion-auto-update' );
513
-
514
- // Send to all addresses
515
- foreach ( cau_set_email() as $key => $value ) {
516
- foreach ( $value as $k => $v ) {
517
- wp_mail( $v, $subject, $message );
518
- }
519
- break;
520
- }
521
-
522
- }
523
-
524
- }
525
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/cau_functions.php DELETED
@@ -1,1441 +0,0 @@
1
- <?php
2
-
3
- // What user rights can edit plugin settings?
4
- function cau_allowed_user_rights() {
5
-
6
- // Current user
7
- $user = wp_get_current_user();
8
-
9
- // Allow roles
10
- $allowed_roles = array( 'administrator' );
11
- if( cau_get_db_value( 'allow_editor' ) == 'on' ) array_push( $allowed_roles, 'editor' );
12
- if( cau_get_db_value( 'allow_author' ) == 'on' ) array_push( $allowed_roles, 'author' );
13
-
14
- // Check
15
- if ( array_intersect( $allowed_roles, $user->roles ) ) {
16
- return true;
17
- } else {
18
- return false;
19
- }
20
- }
21
-
22
- // Get database value
23
- function cau_get_db_value( $name, $table = 'auto_updates' ) {
24
-
25
- global $wpdb;
26
- $table_name = $wpdb->prefix.$table;
27
- $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE name = '%s'", $name ) );
28
- foreach ( $cau_configs as $config ) return $config->onoroff;
29
-
30
- }
31
-
32
- // Get database value
33
- function cau_get_plugininfo( $check, $field ) {
34
-
35
- global $wpdb;
36
- $table_name = $wpdb->prefix.'update_log';
37
- $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) );
38
- foreach ( $cau_configs as $config ) return $config->$field;
39
-
40
- }
41
-
42
- // Get the set timezone
43
- function cau_get_proper_timezone() {
44
-
45
- // WP 5.3 adds the wp_timezone_string function
46
- if ( !function_exists( 'wp_timezone_string' ) ) {
47
- $timezone = get_option( 'timezone_string' );
48
- } else {
49
- $timezone = wp_timezone_string();
50
- }
51
-
52
- // Should fix an reported issue
53
- if( $timezone == '+00:00' ) {
54
- $timezone = 'UTC';
55
- }
56
-
57
- return $timezone;
58
-
59
- }
60
-
61
- // Copy of the wp_timezone_string for < 5.3 compat
62
- if ( !function_exists( 'wp_timezone_string' ) ) {
63
- function wp_timezone_string() {
64
- $timezone_string = get_option( 'timezone_string' );
65
-
66
- if ( $timezone_string ) {
67
- return $timezone_string;
68
- }
69
-
70
- $offset = (float) get_option( 'gmt_offset' );
71
- $hours = (int) $offset;
72
- $minutes = ( $offset - $hours );
73
-
74
- $sign = ( $offset < 0 ) ? '-' : '+';
75
- $abs_hour = abs( $hours );
76
- $abs_mins = abs( $minutes * 60 );
77
- $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
78
-
79
- return $tz_offset;
80
- }
81
- }
82
-
83
- // List of incompatible plugins
84
- function cau_incompatiblePluginlist() {
85
-
86
- // Pluginlist, write as Plugin path => Issue
87
- $pluginList = array(
88
- 'better-wp-security/better-wp-security.php' => "<span class='cau_disabled'><span class='dashicons dashicons-no'></span></span> May block auto-updating for everything.",
89
- 'updraftplus/updraftplus.php' => "<span class='cau_warning'><span class='dashicons dashicons-warning'></span></span> By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. <u>Causes no issues with other plugins.</u>"
90
- );
91
-
92
- return $pluginList;
93
-
94
- }
95
- function cau_incompatiblePlugins() {
96
-
97
- $return = false;
98
-
99
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
100
- if( is_plugin_active( $key ) ) {
101
- $return = true;
102
- }
103
- }
104
-
105
- return $return;
106
-
107
- }
108
-
109
- // Check if has issues
110
- function cau_pluginHasIssues() {
111
-
112
- $return = false;
113
-
114
- if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) {
115
- $return = true;
116
- }
117
-
118
- if( checkAutomaticUpdaterDisabled() ) {
119
- $return = true;
120
- }
121
-
122
- if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) {
123
- $return = true;
124
- }
125
-
126
- if( cau_incorrectDatabaseVersion() ) {
127
- $return = true;
128
- }
129
-
130
- return $return;
131
- }
132
- function cau_pluginIssueLevels() {
133
-
134
- if( checkAutomaticUpdaterDisabled() ) {
135
- $level = 'high';
136
- } else {
137
- $level = 'low';
138
- }
139
-
140
- return $level;
141
- }
142
- function cau_pluginIssueCount() {
143
-
144
- $count = 0;
145
-
146
- if( get_option( 'blog_public' ) == 0 ) {
147
- $count++;
148
- }
149
- if( checkAutomaticUpdaterDisabled() ) {
150
- $count++;
151
- }
152
- if( checkCronjobsDisabled() ) {
153
- $count++;
154
- }
155
- if( cau_incompatiblePlugins() ) {
156
- foreach ( cau_incompatiblePluginlist() as $key => $value ) {
157
- if( is_plugin_active( $key ) ) {
158
- $count++;
159
- }
160
- }
161
- }
162
-
163
- return $count;
164
- }
165
- function cau_incorrectDatabaseVersion() {
166
- if( get_option( "cau_db_version" ) != cau_db_version() ) {
167
- return true;
168
- } else {
169
- return false;
170
- }
171
- }
172
-
173
- // Run custom hooks on plugin update
174
- function cau_run_custom_hooks_p() {
175
-
176
- // Check if function exists
177
- if ( ! function_exists( 'get_plugins' ) ) {
178
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
179
- }
180
-
181
- // Create array
182
- $allDates = array();
183
-
184
- // Where to look for plugins
185
- $dirr = plugin_dir_path( __DIR__ );
186
- $listOfAll = get_plugins();
187
-
188
- // Number of updates
189
- $numOfUpdates = 0;
190
-
191
- // Loop trough all plugins
192
- foreach ( $listOfAll as $key => $value ) {
193
-
194
- // Get data
195
- $fullPath = $dirr.'/'.$key;
196
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
197
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
198
- $updateSched = wp_get_schedule( 'wp_update_plugins' );
199
-
200
- // Check when the last update was
201
- if( $updateSched == 'hourly' ) {
202
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
203
- } elseif( $updateSched == 'twicedaily' ) {
204
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
205
- } elseif( $updateSched == 'daily' ) {
206
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
207
- } elseif( $updateSched == 'weekly' ) {
208
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
209
- } elseif( $updateSched == 'monthly' ) {
210
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
211
- } else {
212
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
213
- }
214
-
215
- $update_time = wp_next_scheduled( 'wp_update_plugins' );
216
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
217
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
218
-
219
- if( $fileDate >= $lastday ) {
220
-
221
- // Push to array
222
- array_push( $allDates, $fileDate );
223
-
224
- // Update info
225
- if( $fileTime > $range_start && $fileTime < $range_end ) {
226
- $status = __( 'Automatic', 'companion-auto-update' );
227
- } else {
228
- $status = __( 'Manual', 'companion-auto-update' );
229
- }
230
-
231
- $numOfUpdates++;
232
-
233
- cau_updatePluginInformation( $key, $status );
234
-
235
- }
236
-
237
- }
238
-
239
- // If there have been plugin updates run hook
240
- if( $numOfUpdates >= 1 ) {
241
- do_action( 'cau_after_plugin_update' );
242
- }
243
-
244
- }
245
-
246
- // Run custom hooks on theme update
247
- function cau_run_custom_hooks_t() {
248
-
249
- // Create array
250
- $allDates = array();
251
-
252
- // Where to look for plugins
253
- $dirr = get_theme_root();
254
- $listOfAll = wp_get_themes();
255
-
256
- // Loop trough all plugins
257
- foreach ( $listOfAll as $key => $value) {
258
-
259
- // Get data
260
- $fullPath = $dirr.'/'.$key;
261
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
262
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
263
- $updateSched = wp_get_schedule( 'wp_update_themes' );
264
-
265
- // Check when the last update was
266
- if( $updateSched == 'hourly' ) {
267
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
268
- } elseif( $updateSched == 'twicedaily' ) {
269
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
270
- } elseif( $updateSched == 'daily' ) {
271
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
272
- } elseif( $updateSched == 'weekly' ) {
273
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
274
- } elseif( $updateSched == 'monthly' ) {
275
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
276
- } else {
277
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
278
- }
279
-
280
- $update_time = wp_next_scheduled( 'wp_update_themes' );
281
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
282
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
283
-
284
- if( $fileDate >= $lastday ) {
285
-
286
- // Push to array
287
- array_push( $allDates, $fileDate );
288
-
289
- // Update info
290
- if( $fileTime > $range_start && $fileTime < $range_end ) {
291
- $status = __( 'Automatic', 'companion-auto-update' );
292
- } else {
293
- $status = __( 'Manual', 'companion-auto-update' );
294
- }
295
- cau_updatePluginInformation( $key, $status );
296
-
297
- }
298
-
299
- }
300
-
301
- $totalNum = 0;
302
-
303
- // Count number of updated plugins
304
- foreach ( $allDates as $key => $value ) $totalNum++;
305
-
306
- // If there have been plugin updates run hook
307
- if( $totalNum > 0 ) {
308
- do_action( 'cau_after_theme_update' );
309
- }
310
-
311
- }
312
-
313
- // Run custom hooks on core update
314
- function cau_run_custom_hooks_c() {
315
-
316
- // Create array
317
- $totalNum = 0;
318
-
319
- // Get data
320
- $fullPath = ABSPATH.'wp-includes/version.php';
321
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
322
- $updateSched = wp_get_schedule( 'wp_version_check' );
323
-
324
- // Check when the last update was
325
- if( $updateSched == 'hourly' ) {
326
- $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
327
- } elseif( $updateSched == 'twicedaily' ) {
328
- $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
329
- } elseif( $updateSched == 'daily' ) {
330
- $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
331
- } elseif( $updateSched == 'weekly' ) {
332
- $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
333
- } elseif( $updateSched == 'monthly' ) {
334
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
335
- } else {
336
- $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
337
- }
338
-
339
- // Check manual or automatic
340
- $update_time = wp_next_scheduled( 'wp_version_check' );
341
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
342
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
343
-
344
- if( $fileDate >= $lastday ) {
345
-
346
- // Update info
347
- if( $fileDate > $range_start && $fileDate < $range_end ) {
348
- $status = __( 'Automatic', 'companion-auto-update' );
349
- } else {
350
- $status = __( 'Manual', 'companion-auto-update' );
351
- }
352
- cau_updatePluginInformation( 'core', $status );
353
-
354
- $totalNum++;
355
-
356
- }
357
-
358
- // If there have been plugin updates run hook
359
- if( $totalNum > 0 ) {
360
- do_action( 'cau_after_core_update' );
361
- }
362
-
363
- }
364
-
365
- // Check if automatic updating is disabled globally
366
- function checkAutomaticUpdaterDisabled() {
367
-
368
- // I mean, I know this can be done waaaay better but I's quite late and I need to push a fix so take it or leave it untill I decide to fix this :)
369
-
370
- if ( defined( 'automatic_updater_disabled' ) ) {
371
- if( doing_filter( 'automatic_updater_disabled' ) ) {
372
- return true;
373
- } elseif( constant( 'automatic_updater_disabled' ) == 'true' ) {
374
- return true;
375
- } elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) {
376
- return true;
377
- } else {
378
- return false;
379
- }
380
-
381
- } else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
382
- if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
383
- return true;
384
- } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) {
385
- return true;
386
- } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) {
387
- return true;
388
- } else {
389
- return false;
390
- }
391
-
392
- } else {
393
- return false;
394
- }
395
-
396
- }
397
-
398
- // Check if cronjobs are disabled
399
- function checkCronjobsDisabled() {
400
-
401
- if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) {
402
- return true;
403
- } else {
404
- return false;
405
- }
406
-
407
- }
408
-
409
- // Menu location
410
- function cau_menloc( $after = '' ) {
411
- return 'tools.php'.$after;
412
- }
413
- function cau_url( $tab = '' ) {
414
- return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) );
415
- }
416
-
417
- // Get the active tab
418
- function active_tab( $page, $identifier = 'tab' ) {
419
- echo _active_tab( $page, $identifier );
420
- }
421
- function _active_tab( $page, $identifier = 'tab' ) {
422
-
423
- if( !isset( $_GET[ $identifier ] ) ) {
424
- $cur_page = '';
425
- } else {
426
- $cur_page = $_GET[ $identifier ];
427
- }
428
-
429
- if( $page == $cur_page ) {
430
- return 'nav-tab-active';
431
- }
432
-
433
- }
434
-
435
- // Get the active subtab
436
- function active_subtab( $page, $identifier = 'tab' ) {
437
-
438
- if( !isset( $_GET[ $identifier ] ) ) {
439
- $cur_page = '';
440
- } else {
441
- $cur_page = $_GET[ $identifier ];
442
- }
443
-
444
- if( $page == $cur_page ) {
445
- echo 'current';
446
- }
447
-
448
- }
449
-
450
- // List of plugins that should not be updated
451
- function donotupdatelist( $filter = 'plugins' ) {
452
-
453
- // Select correct database row
454
- switch ( $filter ) {
455
- case 'themes':
456
- $db_table = 'notUpdateListTh';
457
- break;
458
- case 'plugins':
459
- $db_table = 'notUpdateList';
460
- break;
461
- default:
462
- $db_table = 'notUpdateList';
463
- break;
464
- }
465
-
466
- // Create list
467
- global $wpdb;
468
- $table_name = $wpdb->prefix."auto_updates";
469
- $config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'");
470
-
471
- $list = $config[0]->onoroff;
472
- $list = explode( ", ", $list );
473
- $returnList = array();
474
-
475
- foreach ( $list as $key ) array_push( $returnList, $key );
476
-
477
- return $returnList;
478
-
479
- }
480
- function plugins_donotupdatelist() {
481
-
482
- // Base array
483
- $array = array();
484
-
485
- // Filtered plugins
486
- $filteredplugins = donotupdatelist( 'plugins' );
487
- foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin );
488
-
489
- // Plugin added to the delay list
490
- $delayedplugins = cau_delayed_updates__formated();
491
- foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin );
492
-
493
- // Return array
494
- return $array;
495
- }
496
- function themes_donotupdatelist() {
497
- return donotupdatelist( 'themes' );
498
- }
499
-
500
- // Show the update log
501
- function cau_fetch_log( $limit, $format = 'simple' ) {
502
-
503
- // Database
504
- global $wpdb;
505
- $updateLog = "update_log";
506
- $updateLogDB = $wpdb->prefix.$updateLog;
507
-
508
- // Filter log
509
- if( isset( $_GET['filter'] ) ) {
510
- $filter = $_GET['filter'];
511
- } else {
512
- $filter = 'all';
513
- }
514
-
515
- switch( $filter ) {
516
-
517
- case 'plugins':
518
- $plugins = true;
519
- $themes = false;
520
- $core = false;
521
- $translations = false;
522
- break;
523
-
524
- case 'themes':
525
- $plugins = false;
526
- $themes = true;
527
- $core = false;
528
- $translations = false;
529
- break;
530
-
531
- case 'translations':
532
- $plugins = false;
533
- $themes = false;
534
- $core = false;
535
- $translations = true;
536
- break;
537
-
538
- default:
539
- $plugins = true;
540
- $themes = true;
541
- $core = true;
542
- $translations = false;
543
- break;
544
- }
545
-
546
- // Create arrays
547
- $pluginNames = array();
548
- $pluginVersion = array();
549
- $pluginDates = array();
550
- $pluginDatesF = array();
551
- $plugslug = array();
552
- $type = array();
553
- $method = array();
554
-
555
- // Date format
556
- $dateFormat = get_option( 'date_format' );
557
-
558
- // PLUGINS
559
- if( $plugins ) {
560
-
561
- // Check if function exists
562
- if ( ! function_exists( 'get_plugins' ) ) {
563
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
564
- }
565
-
566
- // Where to look for plugins
567
- $plugdir = plugin_dir_path( __DIR__ );
568
- $allPlugins = get_plugins();
569
-
570
- // Loop trough all plugins
571
- foreach ( $allPlugins as $key => $value) {
572
-
573
- // Get plugin data
574
- $fullPath = $plugdir.'/'.$key;
575
- $getFile = $path_parts = pathinfo( $fullPath );
576
- $pluginData = get_plugin_data( $fullPath );
577
- $pluginSlug = explode( "/", plugin_basename( $key ) );
578
- $pluginSlug = $pluginSlug[0];
579
-
580
- array_push( $plugslug , $pluginSlug );
581
-
582
- // Automatic or Manual (non-db-version)
583
- $date_tod = date ( 'ydm' );
584
- $fileDay = date ( 'ydm', filemtime( $fullPath ) );
585
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
586
- $updateSched = wp_next_scheduled( 'wp_update_plugins' );
587
- $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
588
- $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
589
-
590
- if( $date_tod == $fileDay ) {
591
-
592
- if( $fileTime > $range_start && $fileTime < $range_end ) {
593
- $status = __( 'Automatic', 'companion-auto-update' );
594
- } else {
595
- $status = __( 'Manual', 'companion-auto-update' );
596
- }
597
-
598
- array_push( $method , $status );
599
-
600
- } else {
601
-
602
- // Get info from database
603
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
604
- array_push( $method , cau_get_plugininfo( $key, 'method' ) );
605
- } else {
606
- array_push( $method , '-' );
607
- }
608
-
609
- }
610
-
611
- // Get plugin name
612
- foreach ( $pluginData as $dataKey => $dataValue ) {
613
- if( $dataKey == 'Name') {
614
- array_push( $pluginNames , $dataValue );
615
- }
616
- if( $dataKey == 'Version') {
617
- array_push( $pluginVersion , $dataValue );
618
- }
619
- }
620
-
621
- // Get last update date
622
- $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
623
- if( $format == 'table' ) {
624
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
625
- $fileDateF .= ' &dash; '.date( 'H:i', filemtime( $fullPath ) );
626
- } else {
627
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
628
- }
629
- array_push( $pluginDates, $fileDate );
630
- array_push( $pluginDatesF, $fileDateF );
631
- array_push( $type, 'Plugin' );
632
-
633
- }
634
-
635
- }
636
-
637
- // THEMES
638
- if( $themes ) {
639
-
640
- // Where to look for themes
641
- $themedir = get_theme_root();
642
- $allThemes = wp_get_themes();
643
-
644
- // Loop trough all themes
645
- foreach ( $allThemes as $key => $value) {
646
-
647
- // Get theme data
648
- $fullPath = $themedir.'/'.$key;
649
- $getFile = $path_parts = pathinfo( $fullPath );
650
-
651
- // Get theme name
652
- $theme_data = wp_get_theme( $path_parts['filename'] );
653
- $themeName = $theme_data->get( 'Name' );
654
- $themeVersion = $theme_data->get( 'Version' );
655
- array_push( $pluginNames , $themeName );
656
- array_push( $pluginVersion , $themeVersion );
657
-
658
- // Automatic or Manual (non-db-version)
659
- $date_tod = date ( 'ydm' );
660
- $fileDay = date ( 'ydm', filemtime( $fullPath ) );
661
- $fileTime = date ( 'Hi', filemtime( $fullPath ) );
662
- $updateSched = wp_next_scheduled( 'wp_update_themes' );
663
- $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
664
- $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
665
-
666
- if( $date_tod == $fileDay ) {
667
-
668
- if( $fileTime > $range_start && $fileTime < $range_end ) {
669
- $status = __( 'Automatic', 'companion-auto-update' );
670
- } else {
671
- $status = __( 'Manual', 'companion-auto-update' );
672
- }
673
-
674
- array_push( $method , $status );
675
-
676
- } else {
677
-
678
- // Get info from database
679
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
680
- array_push( $method , cau_get_plugininfo( $key, 'method' ) );
681
- } else {
682
- array_push( $method , '-' );
683
- }
684
-
685
- }
686
-
687
- // Get last update date
688
- $fileDate = date( 'YmdHi', filemtime( $fullPath ) );
689
-
690
- if( $format == 'table' ) {
691
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
692
- $fileDateF .= ' &dash; '.date ( 'H:i', filemtime( $fullPath ) );
693
- } else {
694
- $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
695
- }
696
-
697
- array_push( $pluginDates, $fileDate );
698
- array_push( $pluginDatesF, $fileDateF );
699
- array_push( $type, 'Theme' );
700
- array_push( $plugslug , '' );
701
-
702
- }
703
-
704
- }
705
-
706
- // TRANSLATIONS
707
- if( $translations ) {
708
-
709
- // There is no way (at this time) to check if someone changed this link, so therefore it won't work when it's changed, sorry
710
- $transFolder = get_home_path().'wp-content/languages';
711
- if( file_exists( $transFolder ) ) {
712
-
713
- $allThemTranslations = array();
714
- $allThemTypes = array();
715
-
716
- $pt = __( 'Plugin translations', 'companion-auto-update' );
717
- $tt = __( 'Theme translations', 'companion-auto-update' );
718
- $ct = __( 'Core translations', 'companion-auto-update' );
719
-
720
- // Plugin translations
721
- $files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE );
722
- foreach( $files as $file ) {
723
- array_push( $allThemTranslations, $file );
724
- array_push( $allThemTypes, $pt );
725
- }
726
-
727
- // Theme translations
728
- $files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE );
729
- foreach( $files as $file ) {
730
- array_push( $allThemTranslations, $file );
731
- array_push( $allThemTypes, $tt );
732
- }
733
-
734
- // Core translations
735
- $files = glob( $transFolder.'/*.{mo}', GLOB_BRACE );
736
- foreach( $files as $file ) {
737
- array_push( $allThemTranslations, $file );
738
- array_push( $allThemTypes, $ct );
739
- }
740
-
741
- foreach( $allThemTranslations as $key => $trans_file ) {
742
-
743
- $transDate = date( 'YmdHi', filemtime( $trans_file ) );
744
-
745
- if( $format == 'table' ) {
746
- $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
747
- $transDateF .= ' &dash; '.date ( 'H:i', filemtime( $trans_file ) );
748
- } else {
749
- $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
750
- }
751
-
752
- $trans_name = basename( $trans_file );
753
- $trans_name = str_replace( "-", " ", $trans_name );
754
- $trans_name = str_replace( ".mo", "", $trans_name );
755
- $trans_name = str_replace( ".json", "", $trans_name );
756
- $trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 );
757
- $trans_name = str_replace( $trans_lang, "", $trans_name );
758
- $trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 );
759
-
760
- // Push
761
- array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang );
762
- array_push( $type, $allThemTypes[$key] );
763
- array_push( $pluginVersion, '-' );
764
- array_push( $pluginDates, $transDate );
765
- array_push( $pluginDatesF, $transDateF );
766
- array_push( $plugslug , '' );
767
- array_push( $method , '-' );
768
-
769
- }
770
-
771
- } else {
772
-
773
- $transDate = date('YmdHi');
774
- $transDateF = 'Could not read translations date.';
775
-
776
- array_push( $pluginNames, 'Translations' );
777
- array_push( $type, $trans_type.' translations' );
778
- array_push( $pluginVersion, '-' );
779
- array_push( $pluginDates, $transDate );
780
- array_push( $pluginDatesF, $transDateF );
781
- array_push( $plugslug , '' );
782
-
783
- // Get info from database
784
- array_push( $method , '-' );
785
-
786
- }
787
-
788
- }
789
-
790
- // CORE
791
- if( $core ) {
792
-
793
- $coreFile = ABSPATH.'wp-includes/version.php';
794
- $updateSched = wp_next_scheduled( 'wp_version_check' );
795
-
796
- if( file_exists( $coreFile ) ) {
797
-
798
- $coreDate = date( 'YmdHi', filemtime( $coreFile ) );
799
-
800
- if( $format == 'table' ) {
801
- $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
802
- $coreDateF .= ' &dash; '.date ( 'H:i', filemtime( $coreFile ) );
803
- } else {
804
- $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
805
- }
806
-
807
- // Automatic or Manual (non-db-version)
808
- $date_tod = date ( 'ydm' );
809
- $fileDay = date ( 'ydm', filemtime( $coreFile ) );
810
- $fileTime = date ( 'Hi', filemtime( $coreFile ) );
811
- $update_time = wp_next_scheduled( 'wp_version_check' );
812
- $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
813
- $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
814
-
815
- if( $date_tod == $fileDay ) {
816
-
817
- if( $fileTime > $range_start && $fileTime < $range_end ) {
818
- $methodVal = __( 'Automatic', 'companion-auto-update' );
819
- } else {
820
- $methodVal = __( 'Manual', 'companion-auto-update' );
821
- }
822
-
823
- } else {
824
-
825
- // Get info from database
826
- if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
827
- $methodVal = cau_get_plugininfo( 'core', 'method' );
828
- } else {
829
- $methodVal = '';
830
- }
831
-
832
- }
833
-
834
-
835
- } else {
836
- $coreDate = date('YmdHi');
837
- $coreDateF = 'Could not read core date.';
838
- }
839
-
840
- array_push( $pluginNames, 'WordPress' );
841
- array_push( $type, 'WordPress' );
842
- array_push( $pluginVersion, get_bloginfo( 'version' ) );
843
- array_push( $pluginDates, $coreDate );
844
- array_push( $pluginDatesF, $coreDateF );
845
- array_push( $plugslug , '' );
846
-
847
- // Get info from database
848
- array_push( $method , $methodVal );
849
-
850
- }
851
-
852
- // Sort array by date
853
- arsort( $pluginDates );
854
-
855
- if( $limit == 'all' ) {
856
- $limit = 999;
857
- }
858
-
859
- $listClasses = 'wp-list-table widefat autoupdate autoupdatelog';
860
-
861
- if( $format == 'table' ) {
862
- $listClasses .= ' autoupdatelog striped';
863
- } else {
864
- $listClasses .= ' autoupdatewidget';
865
- }
866
-
867
- echo '<table class="'.$listClasses.'">';
868
-
869
- // Show the last updated plugins
870
- if( $format == 'table' ) {
871
-
872
- echo '<thead>
873
- <tr>
874
- <th><strong>'.__( 'Name', 'companion-auto-update' ).'</strong></th>';
875
- if( !$translations ) echo '<th><strong>'.__( 'To version', 'companion-auto-update' ).'</strong></th>';
876
- echo '<th><strong>'.__( 'Type', 'companion-auto-update' ).'</strong></th>
877
- <th><strong>'.__( 'Last updated on', 'companion-auto-update' ).'</strong></th>
878
- <th><strong>'.__( 'Update method', 'companion-auto-update' ).'</strong></th>
879
- </tr>
880
- </thead>';
881
-
882
- }
883
-
884
- echo '<tbody id="the-list">';
885
-
886
- $loopings = 0;
887
-
888
- foreach ( $pluginDates as $key => $value ) {
889
-
890
- if( $loopings < $limit ) {
891
-
892
- echo '<tr>';
893
-
894
- if( $format == 'table' ) {
895
- $pluginName = $pluginNames[$key];
896
- } else {
897
- $pluginName = substr( $pluginNames[$key], 0, 25);
898
- if( strlen( $pluginNames[$key] ) > 25 ) {
899
- $pluginName .= '...';
900
- }
901
- }
902
-
903
- echo '<td class="column-updatetitle"><p><strong title="'. $pluginNames[$key] .'">'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'</strong></p></td>';
904
-
905
- if( $format == 'table' ) {
906
-
907
- if( $type[$key] == 'Plugin' ) {
908
- $thisType = __( 'Plugin', 'companion-auto-update' );
909
- } else if( $type[$key] == 'Theme' ) {
910
- $thisType = __( 'Theme', 'companion-auto-update' );
911
- } else {
912
- $thisType = $type[$key];
913
- }
914
-
915
- if( !$translations ) echo '<td class="cau_hide_on_mobile column-version" style="min-width: 100px;"><p>'. $pluginVersion[$key] .'</p></td>';
916
- echo '<td class="cau_hide_on_mobile column-description"><p>'. $thisType .'</p></td>';
917
-
918
- }
919
-
920
- echo '<td class="column-date" style="min-width: 100px;"><p>'. $pluginDatesF[$key] .'</p></td>';
921
-
922
- if( $format == 'table' ) {
923
- echo '<td class="column-method"><p>'. $method[$key] .'</p></td>';
924
- }
925
-
926
- echo '</tr>';
927
-
928
- $loopings++;
929
-
930
- }
931
-
932
- }
933
-
934
- echo "</tbody></table>";
935
-
936
- }
937
-
938
- // Get the proper changelog URL
939
- function cau_getChangelogUrl( $type, $name, $plugslug ) {
940
-
941
- switch( $type ) {
942
- case 'WordPress':
943
- $url = '';
944
- break;
945
- case 'Plugin':
946
- $url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'&section=changelog&TB_iframe=true&width=772&height=772' );
947
- break;
948
- case 'Theme':
949
- $url = '';
950
- break;
951
- }
952
-
953
- if( !empty( $url ) ) {
954
- return '<a href="'.$url.'" class="thickbox open-plugin-details-modal" aria-label="More information about '.$name.'" data-title="'.$name.'">'.$name.'</a>';
955
- } else {
956
- return $name;
957
- }
958
-
959
- }
960
-
961
- // Only update plugins which are enabled
962
- function cau_dontUpdatePlugins( $update, $item ) {
963
-
964
- $plugins = plugins_donotupdatelist();
965
-
966
- if ( in_array( $item->slug, $plugins ) ) {
967
- return false; // Don't update these plugins
968
- } else {
969
- return true; // Always update these plugins
970
- }
971
-
972
-
973
- }
974
- function cau_dontUpdateThemes( $update, $item ) {
975
-
976
- $themes = themes_donotupdatelist();
977
-
978
- if ( in_array( $item->slug, $themes ) ) {
979
- return false; // Don't update these themes
980
- } else {
981
- return true; // Always update these themes
982
- }
983
-
984
-
985
- }
986
-
987
- // Get plugin information of repository
988
- function cau_plugin_info( $slug, $what ) {
989
-
990
- $slug = sanitize_title( $slug );
991
- $cau_transient_name = 'cau' . $slug;
992
- $cau_info = get_transient( $cau_transient_name );
993
-
994
- if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
995
- $cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );
996
-
997
- if ( ! $cau_info or is_wp_error( $cau_info ) ) {
998
- return false;
999
- }
1000
-
1001
- set_transient( $cau_transient_name, $cau_info, 3600 );
1002
-
1003
- switch ( $what ) {
1004
- case 'versions':
1005
- return $cau_info->versions;
1006
- break;
1007
- case 'version':
1008
- return $cau_info->version;
1009
- break;
1010
- case 'name':
1011
- return $cau_info->name;
1012
- break;
1013
- case 'slug':
1014
- return $cau_info->slug;
1015
- break;
1016
- }
1017
-
1018
- }
1019
-
1020
- // Get list of outdated plugins
1021
- function cau_list_outdated() {
1022
-
1023
- $outdatedList = array();
1024
-
1025
- // Check if function exists
1026
- if ( ! function_exists( 'get_plugins' ) ) {
1027
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1028
- }
1029
-
1030
- if( !function_exists( 'plugins_api' ) ) {
1031
- require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
1032
- }
1033
-
1034
- foreach ( get_plugins() as $key => $value) {
1035
-
1036
- $slug = $key;
1037
- $explosion = explode( '/', $slug );
1038
- $actualSlug = array_shift( $explosion );
1039
-
1040
- // Get plugin name
1041
- foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v;
1042
-
1043
- // Get plugins tested up to version
1044
- $api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ), 'tested' => true ) );
1045
-
1046
- // Version compare
1047
- $tested_version = substr( $api->tested, 0, 3 ); // Format version number
1048
-
1049
- // Check if "tested up to" version number is set
1050
- if( $tested_version != '' ) {
1051
-
1052
- $current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number
1053
- $version_difference = ( (int)$current_version - (int)$tested_version ); // Get the difference
1054
- // $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) );
1055
-
1056
- if( $version_difference >= '0.3' ) {
1057
- $outdatedList[$name] = substr( $api->tested, 0, 3 );
1058
- }
1059
-
1060
- } else {
1061
- $outdatedList[$name] = ''; // We'll catch this when sending the e-mail
1062
- }
1063
-
1064
- }
1065
-
1066
- return $outdatedList;
1067
-
1068
- }
1069
-
1070
- // Better version compare
1071
- function cau_version_compare( $ver1, $ver2, $operator = null ) {
1072
- $p = '#(\.0+)+($|-)#';
1073
- $ver1 = preg_replace( $p, '', $ver1 );
1074
- $ver2 = preg_replace( $p, '', $ver2 );
1075
- return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 );
1076
- }
1077
-
1078
- // Get plugin information of currently installed plugins
1079
- function cau_active_plugin_info( $slug, $what ) {
1080
-
1081
- // Check if function exists
1082
- if ( ! function_exists( 'get_plugins' ) ) {
1083
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1084
- }
1085
-
1086
- $allPlugins = get_plugins();
1087
-
1088
- foreach ($allPlugins as $key => $value) {
1089
- $thisSlug = explode('/', $key);
1090
- $thisSlugE = $thisSlug[0];
1091
- if( $thisSlug == $slug ) {
1092
-
1093
- if( $what == 'version' ) return $value['Version'];
1094
-
1095
- }
1096
- }
1097
-
1098
- }
1099
-
1100
- // Remove update nag when major updates are disabled
1101
- function cau_hideUpdateNag() {
1102
- if( cau_get_db_value( 'major' ) != 'on' ) {
1103
- remove_action( 'admin_notices', 'update_nag', 3 );
1104
- remove_action( 'network_admin_notices', 'maintenance_nag', 10 );
1105
- }
1106
- }
1107
- add_action( 'admin_head', 'cau_hideUpdateNag', 100 );
1108
-
1109
- // Add more intervals to event schedules
1110
- function cau_addMoreIntervals( $schedules ) {
1111
-
1112
- // Add a weekly interval.
1113
- $schedules['weekly'] = array(
1114
- 'interval' => 604800,
1115
- 'display' => __( 'Every week', 'companion-auto-update' ),
1116
- );
1117
-
1118
- // Add a twice montly interval.
1119
- $schedules['twice_monthly'] = array(
1120
- 'interval' => 1209600,
1121
- 'display' => __( 'Every 2 weeks', 'companion-auto-update' ),
1122
- );
1123
-
1124
- // Add a montly interval.
1125
- $schedules['once_monthly'] = array(
1126
- 'interval' => 2419200,
1127
- 'display' => __( 'Every 4 weeks', 'companion-auto-update' ),
1128
- );
1129
-
1130
- return $schedules;
1131
-
1132
- }
1133
- add_filter( 'cron_schedules', 'cau_addMoreIntervals' );
1134
-
1135
- // Get only unique schedules
1136
- function cau_wp_get_schedules() {
1137
-
1138
- // Start variables
1139
- $availableIntervals = wp_get_schedules();
1140
- $array_unique = array();
1141
- $intervalTimes = array();
1142
- $intervalNames = array();
1143
- $intervalUniques = array();
1144
- $counter = 0;
1145
-
1146
- // Get all intervals
1147
- foreach ( $availableIntervals as $key => $value ) {
1148
-
1149
- // Do a bunch of checks to format them the right way
1150
- foreach ( $value as $display => $interval ) {
1151
-
1152
- if( $display == 'interval' ) {
1153
-
1154
- if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, required by a bunch of handles of this plugin
1155
-
1156
- $intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily")
1157
- $intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items
1158
-
1159
- // Format display name in a proper way
1160
- $numOfMinutes = ($interval/60);
1161
- $identifier = __( 'minutes', 'companion-auto-update' );
1162
-
1163
- // I just know there's an easier way for this, but I can't come up with it and this works so...
1164
- if( $interval >= (60*60) ) {
1165
- $numOfMinutes = ($numOfMinutes/60);
1166
- $identifier = __( 'hours', 'companion-auto-update' );
1167
- }
1168
- if( $interval >= (60*60*24) ) {
1169
- $numOfMinutes = ($numOfMinutes/24);
1170
- $identifier = __( 'days', 'companion-auto-update' );
1171
- }
1172
- if( $interval >= (60*60*24*7) ) {
1173
- $numOfMinutes = ($numOfMinutes/7);
1174
- $identifier = __( 'weeks', 'companion-auto-update' );
1175
- }
1176
- if( $interval >= (60*60*24*7*(52/12)) ) {
1177
- $numOfMinutes = ($numOfMinutes/(52/12));
1178
- $identifier = __( 'months', 'companion-auto-update' );
1179
- }
1180
-
1181
- $display = sprintf( esc_html__( 'Every %s %s', 'companion-auto-update' ), round( $numOfMinutes, 2 ), $identifier ); // Translateble
1182
- $intervalNames[$counter] = $display; // Add the display name (i.e. "Once a month" or "Once Daily")
1183
-
1184
- $counter++; // Make sure the next interval gets a new "key" value
1185
- }
1186
-
1187
- }
1188
-
1189
- }
1190
-
1191
- // Sort the interval from smallest to largest
1192
- asort( $intervalUniques );
1193
-
1194
- // Prevent duplicates
1195
- foreach ( array_unique( $intervalUniques ) as $key => $value ) {
1196
- // $value is the timestamp
1197
- // $intervalTimes[$key] is the backend name
1198
- // $intervalNames[$key] is the display name
1199
- $array_unique[$intervalTimes[$key]] = $intervalNames[$key];
1200
- }
1201
-
1202
- // Return the array
1203
- return $array_unique;
1204
-
1205
- }
1206
-
1207
- // Check if the update log db is empty
1208
- function cau_updateLogDBisEmpty() {
1209
-
1210
- global $wpdb;
1211
- $updateDB = "update_log";
1212
- $updateLog = $wpdb->prefix.$updateDB;
1213
- $row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" );
1214
-
1215
- if( $row_count > 0 ) {
1216
- return false;
1217
- } else {
1218
- return true;
1219
- }
1220
- }
1221
-
1222
- // Plugin information to DB
1223
- function cau_savePluginInformation( $method = 'New' ) {
1224
-
1225
- // Check if function exists
1226
- if ( ! function_exists( 'get_plugins' ) ) {
1227
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
1228
- }
1229
-
1230
- // Set variables
1231
- global $wpdb;
1232
- $updateDB = "update_log";
1233
- $updateLog = $wpdb->prefix.$updateDB;
1234
- $allPlugins = get_plugins();
1235
- $allThemes = wp_get_themes();
1236
-
1237
- // Loop trough all themes
1238
- foreach ( $allThemes as $key => $value ) {
1239
- if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1240
- }
1241
-
1242
- // Loop trough all plugins
1243
- foreach ( $allPlugins as $key => $value ) {
1244
- if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
1245
- }
1246
-
1247
- // Core
1248
- if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) );
1249
-
1250
- }
1251
-
1252
- function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) {
1253
-
1254
- global $wpdb;
1255
- $updateDB = "update_log";
1256
- $updateLog = $wpdb->prefix.$updateDB;
1257
- $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) );
1258
-
1259
- }
1260
-
1261
- function cau_siteHealthSignature() {
1262
- return '<p style="font-size: 12px; color: #707070;">'.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'</p>';
1263
- }
1264
-
1265
- function cau_add_siteHealthTest( $tests ) {
1266
- $tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' );
1267
- return $tests;
1268
- }
1269
- add_filter( 'site_status_tests', 'cau_add_siteHealthTest' );
1270
-
1271
- function cau_disabled_test() {
1272
-
1273
- $result = array(
1274
- 'label' => __( 'Auto updating is enabled', 'companion-auto-update' ),
1275
- 'status' => 'good',
1276
- 'badge' => array(
1277
- 'label' => __( 'Security' ),
1278
- 'color' => 'blue',
1279
- ),
1280
- 'description' => sprintf( '<p>%s</p>', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ),
1281
- 'actions' => '',
1282
- 'test' => 'cau_disabled',
1283
- );
1284
-
1285
- if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) {
1286
- $result['status'] = 'critical';
1287
- $result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' );
1288
- $result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' );
1289
- $result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' );
1290
- $result['actions'] .= sprintf( '<p><a href="%s">%s</a>', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) );
1291
- }
1292
-
1293
- $result['actions'] .= cau_siteHealthSignature();
1294
-
1295
- return $result;
1296
- }
1297
-
1298
- // Check for version control
1299
- function cau_test_is_vcs_checkout( $context ) {
1300
-
1301
- $context_dirs = array( ABSPATH );
1302
- $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
1303
- $check_dirs = array();
1304
- $result = array();
1305
-
1306
- foreach ( $context_dirs as $context_dir ) {
1307
- // Walk up from $context_dir to the root.
1308
- do {
1309
- $check_dirs[] = $context_dir;
1310
-
1311
- // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
1312
- if ( $context_dir == dirname( $context_dir ) )
1313
- break;
1314
-
1315
- // Continue one level at a time.
1316
- } while ( $context_dir = dirname( $context_dir ) );
1317
- }
1318
-
1319
- $check_dirs = array_unique( $check_dirs );
1320
-
1321
- // Search all directories we've found for evidence of version control.
1322
- foreach ( $vcs_dirs as $vcs_dir ) {
1323
- foreach ( $check_dirs as $check_dir ) {
1324
- if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
1325
- break 2;
1326
- }
1327
- }
1328
- }
1329
-
1330
- if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) {
1331
- $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>automatic_updates_is_vcs_checkout</code>" );
1332
- $result['icon'] = 'warning';
1333
- $result['status'] = 'info';
1334
- } else if ( $checkout ) {
1335
- $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>$vcs_dir</code>" );
1336
- $result['icon'] = 'no';
1337
- $result['status'] = 'disabled';
1338
- } else {
1339
- $result['description'] = __( 'No issues detected' , 'companion-auto-update' );
1340
- $result['icon'] = 'yes-alt';
1341
- $result['status'] = 'enabled';
1342
- }
1343
-
1344
- return $result;
1345
- }
1346
-
1347
- // Check if plugins need to be delayed
1348
- function cau_check_delayed() {
1349
- if( cau_get_db_value( 'update_delay' ) == 'on' ) {
1350
- cau_hold_updates();
1351
- cau_unhold_updates();
1352
- } else {
1353
- cau_unhold_all_updates();
1354
- }
1355
- }
1356
-
1357
- // List of all delayed plugins
1358
- function cau_delayed_updates() {
1359
-
1360
- global $wpdb;
1361
- $plugin_list = array();
1362
- $updateLog = $wpdb->prefix."update_log";
1363
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1364
- foreach ( $put_on_hold as $plugin ) {
1365
- array_push( $plugin_list, $plugin->slug );
1366
- }
1367
- return $plugin_list;
1368
-
1369
- }
1370
-
1371
- // List of all delayed plugins for the update function
1372
- function cau_delayed_updates__formated() {
1373
-
1374
- $plugin_list = array();
1375
- foreach ( cau_delayed_updates() as $plugin ) {
1376
- $explosion = explode( '/', $plugin );
1377
- $short_slug = array_shift( $explosion );
1378
- array_push( $plugin_list, $short_slug );
1379
- }
1380
- return $plugin_list;
1381
-
1382
- }
1383
-
1384
- // Add "put on hold" timestamp to the database if it hasn't been set yet
1385
- function cau_hold_updates() {
1386
-
1387
- if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php';
1388
- $plugins = get_plugin_updates();
1389
-
1390
- if ( !empty( $plugins ) ) {
1391
- $list = array();
1392
- foreach ( (array)$plugins as $plugin_file => $plugin_data ) {
1393
- if( !in_array( $plugin_file, cau_delayed_updates() ) ) {
1394
- global $wpdb;
1395
- $updateDB = "update_log";
1396
- $updateLog = $wpdb->prefix.$updateDB;
1397
- $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) );
1398
- }
1399
- }
1400
- }
1401
- }
1402
-
1403
- // Remove plugins from "put on hold" after x days
1404
- function cau_unhold_updates() {
1405
-
1406
- if( cau_get_db_value( 'update_delay_days' ) != '' ) {
1407
- $after_x_days = cau_get_db_value( 'update_delay_days' );
1408
- } else {
1409
- $after_x_days = '2';
1410
- }
1411
-
1412
- global $wpdb;
1413
-
1414
- $today = strtotime( "now" );
1415
- $updateLog = $wpdb->prefix."update_log";
1416
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1417
-
1418
- foreach ( $put_on_hold as $plugin ) {
1419
-
1420
- $plugin_file = $plugin->slug;
1421
- $put_on_hold_date = $plugin->put_on_hold;
1422
- $remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date );
1423
-
1424
- if( $remove_after <= $today ) {
1425
- $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1426
- }
1427
-
1428
- }
1429
-
1430
- }
1431
-
1432
- // Remove all plugins from "put on hold" if option is disabled
1433
- function cau_unhold_all_updates() {
1434
- global $wpdb;
1435
- $updateLog = $wpdb->prefix."update_log";
1436
- $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
1437
- foreach ( $put_on_hold as $plugin ) {
1438
- $plugin_file = $plugin->slug;
1439
- $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
1440
- }
1441
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/companion-auto-update.php DELETED
@@ -1,467 +0,0 @@
1
- <?php
2
- /*
3
- * Plugin Name: Companion Auto Update
4
- * Plugin URI: http://codeermeneer.nl/portfolio/companion-auto-update/
5
- * Description: This plugin auto updates all plugins, all themes and the wordpress core.
6
- * Version: 3.8.4
7
- * Author: Papin Schipper
8
- * Author URI: http://codeermeneer.nl/
9
- * Contributors: papin
10
- * License: GPLv2 or later
11
- * License URI: https://www.gnu.org/licenses/gpl-2.0.html
12
- * Text Domain: companion-auto-update
13
- * Domain Path: /languages/
14
- */
15
-
16
- // Disable direct access
17
- defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
18
-
19
- // Load translations
20
- function cau_init() {
21
- load_plugin_textdomain( 'companion-auto-update', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); // Load language files (for backwards compat mostly)
22
- add_filter( 'plugins_auto_update_enabled', '__return_false' ); // Turn off default WP5.5 plugin update features to avoid confusion
23
- add_filter( 'themes_auto_update_enabled', '__return_false' ); // Turn off default WP5.5 theme update features to avoid confusion
24
- }
25
- add_action( 'init', 'cau_init' );
26
-
27
- // Set up the database and required schedules
28
- function cau_install( $network_wide ) {
29
- if ( is_multisite() && $network_wide ) {
30
- global $wpdb;
31
- $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
32
- foreach ( $blog_ids as $blog_id ) {
33
- switch_to_blog( $blog_id );
34
- cau_database_creation();
35
- restore_current_blog();
36
- }
37
- } else {
38
- cau_database_creation();
39
- }
40
- if (! wp_next_scheduled ( 'cau_set_schedule_mail' )) wp_schedule_event( time(), 'daily', 'cau_set_schedule_mail'); // Set schedule for basic notifcations
41
- if (! wp_next_scheduled ( 'cau_custom_hooks_plugins' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_plugins'); // Run custom hooks on plugin updates
42
- if (! wp_next_scheduled ( 'cau_custom_hooks_themes' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_themes'); // Run custom hooks on theme updates
43
- if (! wp_next_scheduled ( 'cau_log_updater' )) wp_schedule_event( ( time() - 1800 ), 'daily', 'cau_log_updater'); // Keep the log up to date
44
- if (! wp_next_scheduled ( 'cau_outdated_notifier' )) wp_schedule_event( time(), 'daily', 'cau_outdated_notifier'); // Set schedule for basic notifcations
45
- }
46
- add_action( 'cau_set_schedule_mail', 'cau_check_updates_mail' );
47
- add_action( 'cau_outdated_notifier', 'cau_outdated_notifier_mail' );
48
- add_action( 'wp_update_plugins', 'cau_run_custom_hooks_p' );
49
- add_action( 'wp_update_themes', 'cau_run_custom_hooks_t' );
50
- add_action( 'wp_version_check', 'cau_run_custom_hooks_c' );
51
-
52
- // Hourly event to keep the log up to date
53
- function cau_keep_log_uptodate() {
54
- cau_savePluginInformation(); // Check for new plugins and themes
55
- cau_check_delayed(); // Check for plugin delays
56
- }
57
- add_action( 'cau_log_updater', 'cau_keep_log_uptodate' );
58
-
59
- // Redirect to welcome screen on activation of plugin
60
- function cau_pluginActivateWelcome() {
61
- add_option( 'cau_redirectToWelcomeScreen', true );
62
- }
63
- register_activation_hook(__FILE__, 'cau_pluginActivateWelcome');
64
-
65
- function cau_pluginRedirectWelcomeScreen() {
66
- if ( get_option( 'cau_redirectToWelcomeScreen', false ) ) {
67
- delete_option( 'cau_redirectToWelcomeScreen' );
68
- if( !isset( $_GET['activate-multi'] ) ) {
69
- wp_redirect( admin_url( cau_menloc().'?page=cau-settings&welcome=1' ) );
70
- }
71
- }
72
- }
73
- add_action( 'admin_init', 'cau_pluginRedirectWelcomeScreen' );
74
-
75
- // Donate url
76
- function cau_donateUrl() {
77
- return 'https://www.paypal.me/dakel/10/';
78
- }
79
-
80
- // Database version
81
- function cau_db_version() {
82
- return '3.8.3';
83
- }
84
- function cau_database_creation() {
85
-
86
- global $wpdb;
87
-
88
- // Plugin db info
89
- $cau_db_version = cau_db_version();
90
- $autoupdates = $wpdb->prefix."auto_updates";
91
- $updateLog = $wpdb->prefix."update_log";
92
-
93
- // WordPress db info
94
- $charset_collate = $wpdb->get_charset_collate();
95
-
96
- // DB table creation queries
97
- $sql = "CREATE TABLE $autoupdates (
98
- id INT(9) NOT NULL AUTO_INCREMENT,
99
- name VARCHAR(255) NOT NULL,
100
- onoroff TEXT NOT NULL,
101
- UNIQUE KEY id (id)
102
- ) $charset_collate;";
103
-
104
- $sql2 = "CREATE TABLE $updateLog (
105
- id INT(9) NOT NULL AUTO_INCREMENT,
106
- slug VARCHAR(255) NOT NULL,
107
- oldVersion VARCHAR(10) NOT NULL,
108
- newVersion VARCHAR(10) NOT NULL,
109
- method VARCHAR(10) NOT NULL,
110
- put_on_hold VARCHAR(100) DEFAULT '0',
111
- UNIQUE KEY id (id)
112
- ) $charset_collate;";
113
-
114
- // Create DB tables
115
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
116
- dbDelta( $sql );
117
- dbDelta( $sql2 );
118
-
119
- // Database version
120
- add_option( "cau_db_version", "$cau_db_version" );
121
-
122
- // Insert data
123
- cau_install_data();
124
-
125
- }
126
-
127
- // Check if database table exists before creating
128
- function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_updates' ) {
129
-
130
- global $wpdb;
131
- $table_name = $wpdb->prefix.$db_table;
132
-
133
- $rows = $wpdb->get_col( "SELECT COUNT(*) as num_rows FROM {$table_name} WHERE {$id} = '{$whattocheck}'" );
134
- $check = $rows[0];
135
-
136
- if( $check > 0 ) {
137
- return true;
138
- } else {
139
- return false;
140
- }
141
-
142
- }
143
-
144
- // Insert date into database
145
- function cau_install_data() {
146
-
147
- global $wpdb;
148
- $table_name = $wpdb->prefix . "auto_updates";
149
- $toemail = get_option('admin_email');
150
-
151
- // Update configs
152
- if( !cau_check_if_exists( 'plugins' ) ) $wpdb->insert( $table_name, array( 'name' => 'plugins', 'onoroff' => 'on' ) );
153
- if( !cau_check_if_exists( 'themes' ) ) $wpdb->insert( $table_name, array( 'name' => 'themes', 'onoroff' => 'on' ) );
154
- if( !cau_check_if_exists( 'minor' ) ) $wpdb->insert( $table_name, array( 'name' => 'minor', 'onoroff' => 'on' ) );
155
- if( !cau_check_if_exists( 'major' ) ) $wpdb->insert( $table_name, array( 'name' => 'major', 'onoroff' => '' ) );
156
-
157
- // Email configs
158
- if( !cau_check_if_exists( 'email' ) ) $wpdb->insert( $table_name, array( 'name' => 'email', 'onoroff' => '' ) );
159
- if( !cau_check_if_exists( 'send' ) ) $wpdb->insert( $table_name, array( 'name' => 'send', 'onoroff' => '' ) );
160
- if( !cau_check_if_exists( 'sendupdate' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendupdate', 'onoroff' => '' ) );
161
- if( !cau_check_if_exists( 'sendoutdated' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendoutdated', 'onoroff' => '' ) );
162
-
163
- // Advanced
164
- if( !cau_check_if_exists( 'notUpdateList' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateList', 'onoroff' => '' ) );
165
- if( !cau_check_if_exists( 'translations' ) ) $wpdb->insert( $table_name, array( 'name' => 'translations', 'onoroff' => 'on' ) );
166
- if( !cau_check_if_exists( 'wpemails' ) ) $wpdb->insert( $table_name, array( 'name' => 'wpemails', 'onoroff' => 'on' ) );
167
- if( !cau_check_if_exists( 'notUpdateListTh' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateListTh', 'onoroff' => '' ) );
168
-
169
- // Stuff
170
- if( !cau_check_if_exists( 'html_or_text' ) ) $wpdb->insert( $table_name, array( 'name' => 'html_or_text', 'onoroff' => 'html' ) );
171
- if( !cau_check_if_exists( 'dbupdateemails' ) ) $wpdb->insert( $table_name, array( 'name' => 'dbupdateemails', 'onoroff' => '' ) );
172
-
173
- // Advanced
174
- if( !cau_check_if_exists( 'allow_administrator' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_administrator', 'onoroff' => 'on' ) );
175
- if( !cau_check_if_exists( 'allow_editor' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_editor', 'onoroff' => '' ) );
176
- if( !cau_check_if_exists( 'allow_author' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_author', 'onoroff' => '' ) );
177
- if( !cau_check_if_exists( 'ignore_seo' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_seo', 'onoroff' => '' ) );
178
- if( !cau_check_if_exists( 'ignore_cron' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_cron', 'onoroff' => '' ) );
179
- if( !cau_check_if_exists( 'advanced_info_emails' ) ) $wpdb->insert( $table_name, array( 'name' => 'advanced_info_emails', 'onoroff' => '' ) );
180
- if( !cau_check_if_exists( 'update_delay' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay', 'onoroff' => '' ) );
181
- if( !cau_check_if_exists( 'update_delay_days' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay_days', 'onoroff' => '' ) );
182
- if( !cau_check_if_exists( 'plugin_links_emails' ) ) $wpdb->insert( $table_name, array( 'name' => 'plugin_links_emails', 'onoroff' => '' ) );
183
-
184
- }
185
- register_activation_hook( __FILE__, 'cau_install' );
186
-
187
- // Clear everything on deactivation
188
- function cau_remove() {
189
-
190
- // Delete tables
191
- global $wpdb;
192
- $autoupdates = $wpdb->prefix."auto_updates";
193
- $updateLog = $wpdb->prefix."update_log";
194
- $wpdb->query( "DROP TABLE IF EXISTS $autoupdates" );
195
- $wpdb->query( "DROP TABLE IF EXISTS $updateLog" );
196
-
197
- // Clear schedules
198
- wp_clear_scheduled_hook( 'cau_set_schedule_mail' );
199
- wp_clear_scheduled_hook( 'cau_custom_hooks_plugins' );
200
- wp_clear_scheduled_hook( 'cau_custom_hooks_themes' );
201
- wp_clear_scheduled_hook( 'cau_log_updater' );
202
-
203
- // Restore WordPress default update functionality
204
- add_filter( 'plugins_auto_update_enabled', '__return_true' );
205
- add_filter( 'themes_auto_update_enabled', '__return_true' );
206
- add_filter( 'auto_plugin_update_send_email', '__return_true' );
207
- add_filter( 'auto_theme_update_send_email', '__return_true' );
208
- }
209
- register_deactivation_hook( __FILE__, 'cau_remove' );
210
-
211
- // Update
212
- function cau_update_db_check() {
213
-
214
- $cau_db_version = cau_db_version();
215
-
216
- if ( get_site_option( 'cau_db_version' ) != $cau_db_version ) {
217
-
218
- cau_database_creation();
219
-
220
- // In 3.7.2 we've added $wpdb->get_charset_collate
221
- if( get_site_option( 'cau_db_version' ) < '3.7.2' ) {
222
-
223
- global $wpdb;
224
- $autoupdates = $wpdb->prefix."auto_updates";
225
- $updateLog = $wpdb->prefix."update_log";
226
- $db_charset = constant( 'DB_CHARSET' );
227
- $wpdb->query( "ALTER TABLE $autoupdates CONVERT TO CHARACTER SET $db_charset" );
228
- $wpdb->query( "ALTER TABLE $updateLog CONVERT TO CHARACTER SET $db_charset" );
229
-
230
- }
231
-
232
- update_option( "cau_db_version", $cau_db_version );
233
- }
234
-
235
- }
236
- add_action( 'upgrader_process_complete', 'cau_update_db_check' );
237
-
238
- // Manual update
239
- function cau_manual_update() {
240
- cau_update_db_check();
241
- }
242
-
243
- // Load custom functions
244
- require_once( plugin_dir_path( __FILE__ ) . 'cau_functions.php' );
245
-
246
- // Add plugin to menu
247
- function register_cau_menu_page() {
248
- if( cau_allowed_user_rights() ) add_submenu_page( cau_menloc() , __( 'Auto Updater', 'companion-auto-update' ), __( 'Auto Updater', 'companion-auto-update' ), 'manage_options', 'cau-settings', 'cau_frontend' );
249
- }
250
- add_action( 'admin_menu', 'register_cau_menu_page' );
251
-
252
- // Settings page
253
- function cau_frontend() { ?>
254
-
255
- <div class='wrap cau_content_wrap cau_content'>
256
-
257
- <h1 class="wp-heading-inline"><?php _e( 'Companion Auto Update', 'companion-auto-update' ); ?></h1>
258
-
259
- <hr class="wp-header-end">
260
-
261
- <?php
262
-
263
- // Make sure the correct timezone is used
264
- date_default_timezone_set( cau_get_proper_timezone() );
265
-
266
- // Allow only access to these pages
267
- $allowedPages = array(
268
- 'dashboard' => __( 'Dashboard' ),
269
- 'pluginlist' => __( 'Update filter', 'companion-auto-update' ),
270
- 'log' => __( 'Update log', 'companion-auto-update' ),
271
- 'status' => __( 'Status', 'companion-auto-update' ),
272
- );
273
-
274
- // Show subtabs
275
- echo "<h2 class='nav-tab-wrapper wp-clearfix'>";
276
- foreach ( $allowedPages as $page => $title ) {
277
- echo "<a href='".cau_url( $page )."' id='tab-".$page."' class='nav-tab "._active_tab( $page )."'>".$title;
278
- if( $page == 'status' ) {
279
- if( cau_pluginHasIssues() ) {
280
- echo "<span class='cau_melding level-".cau_pluginIssueLevels()."'></span>";
281
- } else {
282
- echo "<span class='cau_melding level-okay'></span>";
283
- }
284
- }
285
- echo "</a>";
286
- }
287
- echo "</h2>";
288
-
289
- // Show page content
290
- if( !isset( $_GET['tab'] ) ) {
291
- $requestedPage = 'dashboard';
292
- echo "<script>jQuery('#tab-dashboard').addClass('nav-tab-active');</script>"; // Set active tab class
293
- } else {
294
- $requestedPage = sanitize_key( $_GET['tab'] );
295
- }
296
-
297
- if( array_key_exists( $requestedPage, $allowedPages ) ) {
298
- require_once( plugin_dir_path( __FILE__ ) . 'admin/'.$requestedPage.'.php' );
299
- } else {
300
- wp_die( 'You\'re not allowed to view <strong>'.$requestedPage.'</strong>.' );
301
- }
302
-
303
- ?>
304
-
305
- </div>
306
-
307
- <?php }
308
-
309
- // Add a widget to the dashboard.
310
- function cau_add_widget() {
311
- if ( cau_allowed_user_rights() ) wp_add_dashboard_widget( 'cau-update-log', __('Update log', 'companion-auto-update'), 'cau_widget' );
312
- }
313
- add_action( 'wp_dashboard_setup', 'cau_add_widget' );
314
-
315
- function cau_widget() {
316
-
317
- echo '<style>table.autoupdatewidget { border: 0px solid transparent; border-bottom: 1px solid #EEEEEE; margin: 0 -12px; width: calc(100% + 24px); } table.autoupdatewidget tr td { border-top: 1px solid #EEEEEE; padding: 9px 12px 5px 12px; background: #FAFAFA; } .cau_divide { display: inline-block; color: #E7E0DF; padding: 0 2px; } </style>';
318
- echo '<p>'.__('Below are the last 7 updates ran on this site. Includes plugins and themes, both automatically updated and manually updated.', 'companion-auto-update').'</p>';
319
- cau_fetch_log( '7' );
320
- echo '<p>
321
- <a href="'.cau_url( 'log' ).'">'.__('View full changelog', 'companion-auto-update').'</a>
322
- <span class="cau_divide">|</span>
323
- <a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a>
324
- </p>';
325
-
326
- }
327
-
328
- // Load admin styles
329
- function load_cau_global_styles( $hook ) {
330
-
331
- // Plugin scripts
332
- wp_enqueue_style( 'cau_admin_styles', plugins_url( 'backend/style.css' , __FILE__ ) );
333
-
334
- // Check for issues
335
- wp_enqueue_style( 'cau_warning_styles', plugins_url( 'backend/warningbar.css' , __FILE__ ) );
336
-
337
- }
338
- add_action( 'admin_enqueue_scripts', 'load_cau_global_styles', 99 );
339
-
340
- // Load admin styles
341
- function load_cau_page_styles( $hook ) {
342
-
343
- // Only load on plugins' pages
344
- if( $hook != 'tools_page_cau-settings' && $hook != 'index_page_cau-settings' ) return;
345
-
346
- // WordPress scripts we need
347
- wp_enqueue_style( 'thickbox' );
348
- wp_enqueue_script( 'thickbox' );
349
- wp_enqueue_script( 'plugin-install' );
350
-
351
- }
352
- add_action( 'admin_enqueue_scripts', 'load_cau_page_styles', 100 );
353
-
354
- // Send e-mails
355
- require_once( plugin_dir_path( __FILE__ ) . 'cau_emails.php' );
356
-
357
- // Add settings link on plugin page
358
- function cau_settings_link( $links ) {
359
-
360
- $settings_link = '<a href="'.cau_url( 'dashboard' ).'">'.__( 'Settings' ).'</a>';
361
- $settings_link2 = '<a href="https://translate.wordpress.org/projects/wp-plugins/companion-auto-update">'.__( 'Help us translate', 'companion-auto-update' ).'</a>';
362
- $settings_link3 = '<a href="'.cau_donateUrl().'">'.__( 'Donate to help development', 'companion-auto-update' ).'</a>';
363
-
364
- array_unshift( $links, $settings_link2 );
365
- array_unshift( $links, $settings_link3 );
366
- if( cau_allowed_user_rights() ) array_unshift( $links, $settings_link );
367
-
368
- return $links;
369
-
370
- }
371
- $plugin = plugin_basename(__FILE__);
372
- add_filter( "plugin_action_links_$plugin", "cau_settings_link" );
373
-
374
- // Auto Update Class
375
- class CAU_auto_update {
376
-
377
- public function __construct() {
378
-
379
- // Enable Update filters
380
- add_action( 'plugins_loaded', array( &$this, 'CAU_auto_update_filters' ), 1 );
381
-
382
- }
383
-
384
- public function CAU_auto_update_filters() {
385
-
386
- global $wpdb;
387
- $table_name = $wpdb->prefix . "auto_updates";
388
-
389
- // Disable WP emails
390
- add_filter( 'auto_plugin_update_send_email', '__return_false' ); // Plugin updates
391
- add_filter( 'auto_theme_update_send_email', '__return_false' ); // Theme updates
392
-
393
- // Enable for major updates
394
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'major'");
395
- foreach ( $configs as $config ) {
396
- if( $config->onoroff == 'on' ) add_filter( 'allow_major_auto_core_updates', '__return_true', 1 ); // Turn on
397
- else add_filter( 'allow_major_auto_core_updates', '__return_false', 1 ); // Turn off
398
- }
399
-
400
- // Enable for minor updates
401
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'minor'");
402
- foreach ( $configs as $config ) {
403
- if( $config->onoroff == 'on' ) add_filter( 'allow_minor_auto_core_updates', '__return_true', 1 ); // Turn on
404
- else add_filter( 'allow_minor_auto_core_updates', '__return_false', 1 ); // Turn off
405
- }
406
-
407
- // Enable for plugins
408
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'plugins'");
409
- foreach ( $configs as $config ) {
410
- if( $config->onoroff == 'on' ) add_filter( 'auto_update_plugin', 'cau_dontUpdatePlugins', 10, 2 ); // Turn on
411
- else add_filter( 'auto_update_plugin', '__return_false', 1 ); // Turn off
412
- }
413
-
414
- // Enable for themes
415
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'themes'");
416
- foreach ( $configs as $config ) {
417
- if( $config->onoroff == 'on' ) add_filter( 'auto_update_theme', '__return_true' ); // Turn on
418
- else add_filter( 'auto_update_theme', '__return_false', 1 ); // Turn off
419
- }
420
-
421
- // Enable for translation files
422
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'translations'");
423
- foreach ( $configs as $config ) {
424
- if( $config->onoroff == 'on' ) add_filter( 'auto_update_translation', '__return_true', 1 ); // Turn on
425
- else add_filter( 'auto_update_translation', '__return_false', 1 ); // Turn off
426
- }
427
-
428
- // WP Email Config
429
- $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'wpemails'");
430
- foreach ( $configs as $config ) {
431
- if( $config->onoroff == 'on' ) {
432
- add_filter( 'auto_core_update_send_email', '__return_true' ); // Core updates
433
- } else {
434
- add_filter( 'auto_core_update_send_email', '__return_false' ); // Core updates
435
- }
436
- }
437
-
438
-
439
- }
440
-
441
- }
442
- new CAU_auto_update();
443
-
444
- // Check for issues
445
- function cau_checkForIssues( $admin_bar ) {
446
-
447
- if( cau_pluginHasIssues() && is_admin() ) {
448
-
449
- if( cau_pluginIssueLevels() == 'high' ) {
450
- $cauWaningBarTitle = __( 'Companion Auto Update ran into a critical error. View the status log for more info.', 'companion-auto-update' );
451
-
452
- $admin_bar->add_menu( array(
453
- 'id' => 'cau-has-issues',
454
- 'title' => '<span class="ab-icon"></span><span class="cau-level-'.cau_pluginIssueLevels().'">'.cau_pluginIssueCount().'</span>',
455
- 'href' => cau_url( 'status' ),
456
- 'meta' => array(
457
- 'target' => '_self',
458
- 'title' => $cauWaningBarTitle,
459
- ),
460
- ));
461
-
462
- }
463
-
464
- }
465
-
466
- }
467
- add_action( 'admin_bar_menu', 'cau_checkForIssues', 150 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/index.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- # Silence is golden.
 
 
trunk/languages/companion-auto-update.pot DELETED
@@ -1,62 +0,0 @@
1
- # Copyright (C) 2016 Companion Auto Update
2
- # This file is distributed under the same license as the Companion Auto Update package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Companion Auto Update 1.0\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/companion-auto-"
7
- "update\n"
8
- "POT-Creation-Date: 2016-05-24 08:16:37+00:00\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
-
16
- #: companion_portfolio.php:96
17
- msgid "Auto Updater"
18
- msgstr ""
19
-
20
- #: companion_portfolio.php:122
21
- msgid "Auto update plugins?"
22
- msgstr ""
23
-
24
- #: companion_portfolio.php:122
25
- msgid "Auto update themes?"
26
- msgstr ""
27
-
28
- #: companion_portfolio.php:122
29
- msgid "Auto update minor core updates?"
30
- msgstr ""
31
-
32
- #: companion_portfolio.php:122
33
- msgid "Auto update major core updates?"
34
- msgstr ""
35
-
36
- #: companion_portfolio.php:125
37
- msgid "Settings saved"
38
- msgstr ""
39
-
40
- #: companion_portfolio.php:125
41
- msgid "Settings"
42
- msgstr ""
43
-
44
- #. Plugin Name of the plugin/theme
45
- msgid "Companion Auto Update"
46
- msgstr ""
47
-
48
- #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
49
- #. Plugin URI of the plugin/theme
50
- #. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
51
- #. Author URI of the plugin/theme
52
- msgid "https://qreative-web.com"
53
- msgstr ""
54
-
55
- #. Description of the plugin/theme
56
- msgid ""
57
- "This plugin auto updates all plugins, all themes and the wordpress core."
58
- msgstr ""
59
-
60
- #. Author of the plugin/theme
61
- msgid "Qreative-Web"
62
- msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/languages/index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- /**
3
- * Nothing to see here
4
- */
 
 
 
 
trunk/readme.txt DELETED
@@ -1,170 +0,0 @@
1
- === Companion Auto Update ===
2
- Contributors: Papin, qweb
3
- Donate link: https://www.paypal.me/dakel/10/
4
- Tags: auto, automatic, background, update, updates, updating, automatic updates, automatic background updates, easy update, wordpress update, theme update, plugin update, up-to-date, security, update latest version, update core, update wp, update wp core, major updates, minor updates, update to new version, update core, update plugin, update plugins, update plugins automatically, update theme, plugin, theme, advance, control, mail, notifations, enable
5
- Requires at least: 3.6.0
6
- Tested up to: 5.9
7
- Requires PHP: 5.1
8
- Stable tag: 3.8.4
9
- License: GPLv2 or later
10
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
-
12
- Manage all updates on your WordPress site. Stay in the know with several optional e-mail notifications and logs. For free.
13
-
14
- == Description ==
15
-
16
- Companion Auto Update is a powerful and completely free plugin that allows you to manage all the updates on your WordPress site. Our aim is to give you the best control over these updates and stay in the know at all times.
17
-
18
- We understand that you might not always be able to check if your WordPress site has any updates that need to be installed. Especially when you maintain multiple websites keeping them up-to-date can be a lot of work. This plugin can help you with that. We'll keep your site up-to-date and keep you posted about what's happening and notify you when we need your help with something.
19
-
20
- = Main features =
21
- 1. Auto-updating for plugins, themes, core and translation files
22
- 1. Filter plugins and themes to not be updated
23
- 1. E-mail notifications about old software, pending updates and complete updates
24
- 1. An update log with all updates
25
- 1. Option to delay automatic updates with an x number of days
26
-
27
- = Full control over everything =
28
- Full control, that's what this plugin is all about. With this plugin you can enable (or disable) automatic updating for plugins, themes, WordPress core updates (both minor and major can be changed separately) and for translation files. Don't want to run the updater for all plugins? Don't worry, just disable auto updating for the plugins you'd like to skip and we can even notify you when there's an update for these plugins so you can go and update them yourself.
29
-
30
- = Scheduling =
31
- By default we'll check for updates twice a day but you can change this to several different options if you'd like. When choosing to update on a daily basis you can even select at what time you'd like it to run. Besides the updaters you can also schedule te notifications, want to update every hour but only recieve notifications once a day? No problem!
32
- Sometimes developers will push an update that will cause errors on your site, they'll often fix it within a day but if the updater has run in the mean time it can cause all kinds of issues. Now you can choose to delay updates with an x number of days to prevent this from happening.
33
-
34
- = Know what's happening =
35
- We want you to know what's happening on your website. This plugin offers settings for various email notifications. We can send you an email when an update is available, when a plugin has been updated or when wordpress has been updated.
36
- But if you don't want to recieve emails about this you can still log in and view the changelog to see what happened.
37
-
38
- If you have a feature suggestion or idea you’d like to see in the plugin, we’d love to hear about it! [Suggest a Feature](https://codeermeneer.nl/contact/)
39
-
40
- == Installation ==
41
-
42
- How to install Companion Auto Update
43
-
44
- = Manual install =
45
- 1. Download Companion Auto Update.
46
- 1. Upload the 'Companion Auto Update' directory to your '/wp-content/plugins/' directory.
47
- 1. Activate Companion Auto Update from your Plugins page.
48
-
49
- = Via WordPress =
50
- 1. Search for 'Companion Auto Update'.
51
- 1. Click install.
52
- 1. Activate.
53
-
54
- = Settings =
55
- Settings can be found trough Tools > Auto Updater
56
-
57
- == Frequently Asked Questions ==
58
-
59
- = Check our website for the FAQ =
60
-
61
- [https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/](https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/)
62
-
63
- = What features can I expect to see in the future? =
64
-
65
- Your feedback is what made this plugin what is and what it’ll become so keep the feedback coming! To see what features you've suggested and what we're working on [read our blogpost here](https://codeermeneer.nl/blog/companion-auto-update-and-its-future/)
66
-
67
- = What's the difference between WordPress 5.5 and this plugin? =
68
-
69
- WordPress 5.5 was released recently and it packs tons of new features. One of those features is auto-updates for plugins and themes. Something Companion Auto Update does too.
70
- So obviously, some of you wondered what the difference would be between the default WordPress method and the one offered by Companion Auto Update and I figured I’d quickly write a blog about it, explaining the differences.
71
-
72
- [You can read this blogpost here](https://codeermeneer.nl/blog/wordpress-5-5-versus-companion-auto-update/)
73
-
74
-
75
- == Screenshots ==
76
-
77
- 1. Full control over what to update and when to recieve notifications
78
- 2. Disable auto-updating for certain plugins and/or themes
79
- 3. Advanced scheduling options for updating and notifcations
80
- 4. Keep track of updates with the update log
81
-
82
- == Changelog ==
83
-
84
- = 3.8.4 (February 2, 2022) =
85
- * Tweak: Fixed a few styling errors with WP5.9
86
-
87
- = 3.8.3 (December 9, 2021) =
88
- * New: Plugin update e-mails now have an option to link to a few important pages
89
- * Fix: Error: Undefined index: dbupdateemails
90
- * Fix: Error: A non-numeric value encountered
91
-
92
- = 3.8.2 (July 1, 2021) =
93
- * Fix: Error: Call to undefined function get_plugin_updates()
94
-
95
- = 3.8.1 (June 4, 2021) =
96
- * New: Be notified when we need your help updating to a new database version [Feature Request](https://wordpress.org/support/topic/feature-request-839/)
97
- * Tweak: Made some under the hood performance improvements
98
-
99
- = 3.8.0 (January 14, 2021) =
100
- * New: Better handling of plugins with an unknown WP version
101
- * New: More intervals for notifications
102
- * Fix: Call to undefined function errors
103
-
104
- = 3.7.1.1 (November 2, 2020) =
105
- * Fix: Type in wp_next_scheduled
106
-
107
- = 3.7.1 (October 30, 2020) =
108
- * Fix: PHP Warning: strtotime() expects parameter 2 to be integer, string given
109
-
110
- = 3.7 (September 8, 2020) =
111
- * New: Delay updates with an x number of days
112
- * New: Be notified of plugins that have not been tested with the latest 3 major releases of WordPress.
113
- * New: Choose to see more info in the emails (like the time at which the update happened)
114
- * Fix: "Contact for support" button will work again
115
- * Fix: Fixed a few PHP errors
116
- * Tweak: Made improvements to the "Fix it" button for the "All automatic updates are disabled" error.
117
- * Tweak: You can now choose to ignore the "Search Engine Visibility" and "Cronjobs" warnings
118
- * Tweak: Reports on the Site Health page will only show a summary and point to the status page for more information and possible fixes
119
- * Tweak: Removed cronjob check and Search Engine Visibility check from site health
120
- * Tweak: E-mails are now fully translatable
121
- * Tweak: Renamed Core notifications to WordPress notifications
122
- * Tweak: WordPress plugin and theme update notifications are now disabled
123
-
124
- Also: Check out what features we're working on at [our blogpost](https://codeermeneer.nl/blog/companion-auto-update-and-its-future/)
125
-
126
- = 3.6 (August 12, 2020) =
127
- * New: Added an "after core update" hook [More info](https://codeermeneer.nl/documentation/codex-auto-updater/)
128
- * New: Select which userroles can access settings. (Defaults to only administrators)
129
- * Tweak: Added Theme and Core update method the log
130
- * Tweak: Few WordPress 5.5 improvements
131
-
132
- = 3.5.5 (August 5, 2020) =
133
- * Fix: Added better multisite support
134
- * Tweak: We've added a bunch more checks to the status page and you can now see more passed checks.
135
- * Support for WordPress 5.5
136
-
137
- = 3.5.4.1 (June 20, 2020) =
138
- * Fix: Sometimes the hour settings for intervals wouldn't show up
139
-
140
- = 3.5.4 (June 19, 2020) =
141
- * New: See translations in the update log
142
- * New: We've added a few checks to WordPress' Site Health page
143
- * Fix: Error with Companion Auto Update Database Update
144
- * Fix: Schedule interval duplicates
145
-
146
- = 3.5.3 (June 5, 2020) =
147
- * New: We're working on a better update log. You should see the Update method (Manual/Automatic) in the log now. (Only works for Plugins right now)
148
- Please report any issues with this feature over at our sticky post: [Problems with the Update method in the new update log?](https://wordpress.org/support/topic/problems-with-the-update-method-in-the-new-update-log/)
149
- * Fix: Not able to see checks in boxes (reverted back to before it all went wrong)
150
- * Fix: Error date_default_timezone_set(): Timezone ID +00:00 is invalid
151
- * Tweak: The status tab will no longer show turned-off settings as an error
152
- * Tweak: Made some improvements to the "Update pending" emails, you can now see a list of all pending updates and go directly to the update page.
153
-
154
- = 3.5.2 (April 1, 2020) =
155
- * Fix: Not able to see checks in boxes
156
-
157
- = 3.5.1 (March 25, 2020) =
158
- * Tweak: You seem to like the new dashboard, we've fixed a few issues regarding the responsiveness of the design. We've also tweaked the icons to be a bit more transparant.
159
- * Tweak: We've added the release notes link to Plain text emails
160
- * Tweak: Fixed a few typos
161
- * Tweak: Various minor security improvements
162
-
163
- = 3.5.0 (March 5, 2020) =
164
- * New: In version 3.4.6 we've changed to HTML emails rather than plain text, in this version you can opt to change it back to plain text emails
165
- * Fix: We've 'fixed an issue where on occasion nothing would update
166
- * Tweak: Made some improvements to the "Fix it" button for the AUTOMATIC_UPDATER_DISABLED error
167
- * Tweak: We've changed the dashboard, moved both the settings page and de support page to the dashboard. Please let us know if you like this change or not.
168
- * Bug: We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update.
169
-
170
- [View full changelog](https://codeermeneer.nl/stuffs/auto-updater-changelog/)