diff --git a/wp-content/plugins/companion-auto-update/admin/dashboard.php b/wp-content/plugins/companion-auto-update/admin/dashboard.php
new file mode 100644
index 0000000..8794f03
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/admin/dashboard.php
@@ -0,0 +1,616 @@
+
'.__( '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' ).'.
';
+}
+
+// Database requires an update
+if ( cau_incorrectDatabaseVersion() ) {
+ echo '';
+}
+
+// Update log DB is empty
+if ( cau_updateLogDBisEmpty() ) {
+ echo '';
+}
+
+// Save settings
+if( isset( $_POST['submit'] ) ) {
+
+ check_admin_referer( 'cau_save_settings' );
+
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+
+ // Auto updater
+ if( isset( $_POST['plugins'] ) ) $plugins = sanitize_text_field( $_POST['plugins'] ); else $plugins = '';
+ if( isset( $_POST['themes'] ) ) $themes = sanitize_text_field( $_POST['themes'] ); else $themes = '';
+ if( isset( $_POST['minor'] ) ) $minor = sanitize_text_field( $_POST['minor'] ); else $minor = '';
+ if( isset( $_POST['major'] ) ) $major = sanitize_text_field( $_POST['major'] ); else $major = '';
+ if( isset( $_POST['translations'] ) ) $translations = sanitize_text_field( $_POST['translations'] ); else $translations = '';
+
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugins'", $plugins ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'themes'", $themes ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'minor'", $minor ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'major'", $major ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'translations'", $translations ) );
+
+ // Emails
+ if( isset( $_POST['cau_send'] ) ) $send = sanitize_text_field( $_POST['cau_send'] ); else $send = '';
+ if( isset( $_POST['cau_send_update'] ) ) $sendupdate = sanitize_text_field( $_POST['cau_send_update'] ); else $sendupdate = '';
+ if( isset( $_POST['cau_send_outdated'] ) ) $sendoutdated = sanitize_text_field( $_POST['cau_send_outdated'] ); else $sendoutdated = '';
+ if( isset( $_POST['wpemails'] ) ) $wpemails = sanitize_text_field( $_POST['wpemails'] ); else $wpemails = '';
+ if( isset( $_POST['cau_email'] ) ) $email = sanitize_text_field( $_POST['cau_email'] );
+ if( isset( $_POST['html_or_text'] ) ) $html_or_text = sanitize_text_field( $_POST['html_or_text'] );
+
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'email'", $email ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'send'", $send ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendupdate'", $sendupdate ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendoutdated'", $sendoutdated ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'wpemails'", $wpemails ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'html_or_text'", $html_or_text ) );
+
+ // Advanced
+ if( isset( $_POST['allow_editor'] ) ) $allow_editor = sanitize_text_field( $_POST['allow_editor'] ); else $allow_editor = '';
+ if( isset( $_POST['allow_author'] ) ) $allow_author = sanitize_text_field( $_POST['allow_author'] ); else $allow_author = '';
+ if( isset( $_POST['advanced_info_emails'] ) ) $advanced_info_emails = sanitize_text_field( $_POST['advanced_info_emails'] ); else $advanced_info_emails = '';
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_editor'", $allow_editor ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_author'", $allow_author ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'advanced_info_emails'", $advanced_info_emails ) );
+
+ // Delay
+ if( isset( $_POST['update_delay'] ) ) $update_delay = sanitize_text_field( $_POST['update_delay'] ); else $update_delay = '';
+ if( isset( $_POST['update_delay_days'] ) ) $update_delay_days = sanitize_text_field( $_POST['update_delay_days'] ); else $update_delay_days = '';
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay'", $update_delay ) );
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay_days'", $update_delay_days ) );
+
+ // Intervals
+
+ // Set variables
+ $plugin_sc = sanitize_text_field( $_POST['plugin_schedule'] );
+ $theme_sc = sanitize_text_field( $_POST['theme_schedule'] );
+ $core_sc = sanitize_text_field( $_POST['core_schedule'] );
+ $schedule_mail = sanitize_text_field( $_POST['schedule_mail'] );
+ $html_or_text = sanitize_text_field( $_POST['html_or_text'] );
+
+ // First clear schedules
+ wp_clear_scheduled_hook('wp_update_plugins');
+ wp_clear_scheduled_hook('wp_update_themes');
+ wp_clear_scheduled_hook('wp_version_check');
+ wp_clear_scheduled_hook('cau_set_schedule_mail');
+ wp_clear_scheduled_hook('cau_custom_hooks_plugins');
+ wp_clear_scheduled_hook('cau_custom_hooks_themes');
+ wp_clear_scheduled_hook('cau_log_updater');
+
+ // Then set the new times
+
+ // Plugins
+ if( $plugin_sc == 'daily' ) {
+
+ $date = date( 'Y-m-d' );
+ $hours = sanitize_text_field( $_POST['pluginScheduleTimeH'] );
+ $minutes = sanitize_text_field( $_POST['pluginScheduleTimeM'] );
+ $seconds = date( 's' );
+ $fullDate = $date.' '.$hours.':'.$minutes.':'.$seconds;
+ $pluginSetTime = strtotime( $fullDate );
+
+ wp_schedule_event( $pluginSetTime, $plugin_sc, 'wp_update_plugins' );
+ wp_schedule_event( $pluginSetTime, $plugin_sc, 'cau_custom_hooks_plugins' );
+ wp_schedule_event( ( $pluginSetTime - 1800 ), $plugin_sc, 'cau_log_updater' );
+
+ } else {
+
+ wp_schedule_event( time(), $plugin_sc, 'wp_update_plugins' );
+ wp_schedule_event( time(), $plugin_sc, 'cau_custom_hooks_plugins' );
+ wp_schedule_event( ( time() - 1800 ), $plugin_sc, 'cau_log_updater' );
+
+ }
+
+ // Themes
+ if( $theme_sc == 'daily' ) {
+
+ $dateT = date( 'Y-m-d' );
+ $hoursT = sanitize_text_field( $_POST['ThemeScheduleTimeH'] );
+ $minutesT = sanitize_text_field( $_POST['ThemeScheduleTimeM'] );
+ $secondsT = date( 's' );
+ $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
+ $themeSetTime = strtotime( $fullDateT );
+
+ wp_schedule_event( $themeSetTime, $theme_sc, 'wp_update_themes' );
+ wp_schedule_event( $themeSetTime, $theme_sc, 'cau_custom_hooks_themes' );
+
+ } else {
+
+ wp_schedule_event( time(), $theme_sc, 'wp_update_themes' );
+ wp_schedule_event( time(), $theme_sc, 'cau_custom_hooks_themes' );
+
+ }
+
+ // Core
+ if( $core_sc == 'daily' ) {
+
+ $dateC = date( 'Y-m-d' );
+ $hoursC = sanitize_text_field( $_POST['CoreScheduleTimeH'] );
+ $minutesC = sanitize_text_field( $_POST['CoreScheduleTimeM'] );
+ $secondsC = date( 's' );
+ $fullDateC = $dateC.' '.$hoursC.':'.$minutesC.':'.$secondsC;
+ $coreSetTime = strtotime( $fullDateC );
+
+ wp_schedule_event( $coreSetTime, $core_sc, 'wp_version_check' );
+
+ } else {
+
+ wp_schedule_event( time(), $core_sc, 'wp_version_check' );
+
+ }
+
+ // Emails
+ if( $schedule_mail == 'daily' ) {
+
+ $dateT = date( 'Y-m-d' );
+ $hoursT = sanitize_text_field( $_POST['timeScheduleEmailTimeH'] );
+ $minutesT = sanitize_text_field( $_POST['timeScheduleEmailTimeM'] );
+ $secondsT = date( 's' );
+ $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT;
+ $emailSetTime = strtotime( $fullDateT );
+
+ wp_schedule_event( $emailSetTime, $schedule_mail, 'cau_set_schedule_mail' );
+
+ } else {
+
+ wp_schedule_event( time(), $schedule_mail, 'cau_set_schedule_mail' );
+
+ }
+
+ echo ''.__( 'Settings saved.' ).'
';
+
+}
+
+if( isset( $_GET['welcome'] ) ) {
+
+ echo '';
+}
+
+$plugin_schedule = wp_get_schedule( 'wp_update_plugins' );
+$theme_schedule = wp_get_schedule( 'wp_update_themes' );
+$core_schedule = wp_get_schedule( 'wp_version_check' );
+$schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
+$cs_hooks_p = wp_get_schedule( 'cau_custom_hooks_plugins' );
+$cs_hooks_t = wp_get_schedule( 'cau_custom_hooks_themes' );
+$availableIntervals = cau_wp_get_schedules();
+
+?>
+
+
+
+
+
+
+
+
+
+
You get useful software and we get to carry on making it better.', 'companion-auto-update'); ?>
+
+
+
+
+
+
+
Donations via PayPal. Amount can be changed.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/admin/log.php b/wp-content/plugins/companion-auto-update/admin/log.php
new file mode 100644
index 0000000..2ad84c2
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/admin/log.php
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+prefix."auto_updates";
+
+// Save list
+if( isset( $_POST['submit'] ) ) {
+
+ check_admin_referer( 'cau_save_pluginlist' );
+
+ $noUpdateList = '';
+ $i = 0;
+ $noUpdateCount = 0;
+
+ if( isset( $_POST['post'] ) ) {
+ $noUpdateCount = count( $_POST['post'] );
+ }
+
+ if( $noUpdateCount > 0 ) {
+ foreach ( $_POST['post'] as $key ) {
+ $noUpdateList .= sanitize_text_field( $key );
+ $i++;
+ if( $i != $noUpdateCount ) $noUpdateList .= ', ';
+ }
+ }
+
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = '%s'", $noUpdateList, $db_table ) );
+ echo ''.__( 'Succes', 'companion-auto-update' ).' – '.sprintf( esc_html__( '%1$s %2$s have been added to the no-update-list', 'companion-auto-update' ), $noUpdateCount, strtolower( $filter_name ) ).'.
';
+}
+
+
+// Reset list
+if( isset( $_POST['reset'] ) ) {
+
+ check_admin_referer( 'cau_save_pluginlist' );
+
+ $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = %s", "", $db_table ) );
+ echo ''.__( 'Succes', 'companion-auto-update' ).' – '.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 ) ).'.
';
+}
+
+
+?>
+
+
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/admin/rollback.php b/wp-content/plugins/companion-auto-update/admin/rollback.php
new file mode 100644
index 0000000..3d819f6
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/admin/rollback.php
@@ -0,0 +1,2 @@
+'.__( 'Database update completed' ).'
';
+ }
+
+ if( isset( $_GET['run'] ) && $_GET['run'] == 'db_info_update' ) {
+ cau_savePluginInformation();
+ echo ''.__( 'Database information update completed' ).'
';
+ }
+
+ if( isset( $_GET['ignore_report'] ) ) {
+
+ $report_to_ignore = sanitize_text_field( $_GET['ignore_report'] );
+ $allowedValues = array( 'seo', 'cron' );
+
+ if( !in_array( $report_to_ignore, $allowedValues ) ) {
+ wp_die( 'Trying to cheat eh?' );
+ } else {
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+ $wpdb->query( $wpdb->prepare( "UPDATE {$table_name} SET onoroff = %s WHERE name = 'ignore_$report_to_ignore'", 'yes' ) );
+ $__ignored = __( 'This report will now be ignored', 'companion-auto-update' );
+ echo "";
+ }
+
+ }
+
+
+
+ // Variables
+ $dateFormat = get_option( 'date_format' );
+ $dateFormat .= ' '.get_option( 'time_format' );
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+ $schedules = wp_get_schedules();
+
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __( 'Plugins', 'companion-auto-update' ),
+ 'themes' => __( 'Themes', 'companion-auto-update' ),
+ 'minor' => __( 'Core (Minor)', 'companion-auto-update' ),
+ 'major' => __( 'Core (Major)', 'companion-auto-update' )
+ );
+
+ $eventNames = array(
+ 'plugins' => 'wp_update_plugins',
+ 'themes' => 'wp_update_themes',
+ 'minor' => 'wp_version_check',
+ 'major' => 'wp_version_check'
+ );
+
+ foreach ( $auto_updaters as $key => $value ) {
+
+ if( cau_get_db_value( $key ) == 'on' ) {
+ $__status = 'enabled';
+ $__icon = 'yes-alt';
+ $__text = __( 'Enabled', 'companion-auto-update' );
+ $__interval = wp_get_schedule( $eventNames[$key] );
+ $__next = date_i18n( $dateFormat, wp_next_scheduled( $eventNames[$key] ) );
+ } else {
+ $__status = 'disabled';
+ $__icon = 'marker';
+ $__text = __( 'Disabled', 'companion-auto-update' );
+ $__interval = '‐';
+ $__next = '‐';
+ }
+
+ $__nxt = __( 'Next', 'companion-auto-update' );
+
+ echo "
+ $value
+ $__text
+ $__interval
+ $__nxt: $__next
+ ";
+ }
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __( 'Update available', 'companion-auto-update' ),
+ 'sendupdate' => __( 'Successful update', 'companion-auto-update' ),
+ 'wpemails' => __( 'Core notifications', 'companion-auto-update' )
+ );
+
+ $other_eventNames = array(
+ 'send' => 'cau_set_schedule_mail',
+ 'sendupdate' => 'cau_set_schedule_mail',
+ 'wpemails' => 'cau_set_schedule_mail',
+ );
+
+ foreach ( $other_events as $key => $value ) {
+
+ if( cau_get_db_value( $key ) == 'on' ) {
+ $__status = 'enabled';
+ $__icon = 'yes-alt';
+ $__text = __( 'Enabled', 'companion-auto-update' );
+ $__interval = wp_get_schedule( $other_eventNames[$key] );
+ $__next = date_i18n( $dateFormat, wp_next_scheduled( $other_eventNames[$key] ) );
+ } else {
+ $__status = 'warning';
+ $__icon = 'marker';
+ $__text = __( 'Disabled', 'companion-auto-update' );
+ $__interval = '‐';
+ $__next = '‐';
+ }
+
+ $__nxt = __( 'Next', 'companion-auto-update' );
+
+ echo "
+ $value
+ $__text
+ $__interval
+ $__nxt: $__next
+ ";
+ }
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $__text ";
+ } else {
+ $__text = __( 'Disabled', 'companion-auto-update' );
+ echo " $__text ";
+ } ?>
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+ DISABLE_WP_CRON true
+
+
+
+
+
+
+
+
+
+
+ wp_version_check
+
+
+
+
+
+
+
+
+
+ VCS
+ '>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WordPress
+
+
+
+
+
+ PHP
+
+
+
+
+ >
+ Database
+ (Latest: )
+
+
+
+
+
+ (GMT ) -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ‐
+
+
+
+
+
+ Toggle
+
+
+ prefix."auto_updates";
+ $cau_configs = $wpdb->get_results( "SELECT * FROM $autoupdates" );
+ array_push( $cau_configs, "WordPress: ".get_bloginfo( 'version' ) );
+ array_push( $cau_configs, "PHP: ".phpversion() );
+ array_push( $cau_configs, "DB: ".get_option( "cau_db_version" ).' / '.cau_db_version() );
+
+ echo "";
+ ?>
+
+
+
+
+
+
+
+
+
+
+ $string ) {
+
+ if( strpos( file_get_contents( $conFile ), $string ) !== false) {
+ $contents = file_get_contents( $conFile );
+ $contents = str_replace( $string, $revLine, $contents );
+ file_put_contents( $conFile, $contents );
+ $melding = __( "We've fixed the error for you", 'companion-auto-update' ).' :)';
+ $meldingS = 'updated';
+ }
+
+ }
+
+ echo "";
+
+}
+
+?>
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/check.svg b/wp-content/plugins/companion-auto-update/backend/images/check.svg
new file mode 100644
index 0000000..2d8faca
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/check.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
diff --git a/wp-content/plugins/companion-auto-update/backend/images/email.svg b/wp-content/plugins/companion-auto-update/backend/images/email.svg
new file mode 100644
index 0000000..e151727
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/email.svg
@@ -0,0 +1,96 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/help.svg b/wp-content/plugins/companion-auto-update/backend/images/help.svg
new file mode 100644
index 0000000..ab7018a
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/help.svg
@@ -0,0 +1,67 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
diff --git a/wp-content/plugins/companion-auto-update/backend/images/interval.svg b/wp-content/plugins/companion-auto-update/backend/images/interval.svg
new file mode 100644
index 0000000..9cd5226
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/interval.svg
@@ -0,0 +1,69 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/love.svg b/wp-content/plugins/companion-auto-update/backend/images/love.svg
new file mode 100644
index 0000000..f478fab
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/love.svg
@@ -0,0 +1,116 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wp-content/plugins/companion-auto-update/backend/images/settings.svg b/wp-content/plugins/companion-auto-update/backend/images/settings.svg
new file mode 100644
index 0000000..da74fbf
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/settings.svg
@@ -0,0 +1,124 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/support.svg b/wp-content/plugins/companion-auto-update/backend/images/support.svg
new file mode 100644
index 0000000..490713d
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/support.svg
@@ -0,0 +1,102 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/update.svg b/wp-content/plugins/companion-auto-update/backend/images/update.svg
new file mode 100644
index 0000000..bd39e44
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/update.svg
@@ -0,0 +1,91 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/images/welcome.svg b/wp-content/plugins/companion-auto-update/backend/images/welcome.svg
new file mode 100644
index 0000000..4bd2ac0
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/images/welcome.svg
@@ -0,0 +1,181 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/style.css b/wp-content/plugins/companion-auto-update/backend/style.css
new file mode 100644
index 0000000..d0876e8
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/style.css
@@ -0,0 +1,546 @@
+/* Default Stylings */
+.nowrap {
+ white-space: nowrap;
+}
+.cau_spacing {
+ height: 25px;
+}
+.cau_support_buttons {
+ display: inline-block;
+}
+
+/* Welcome screen */
+.welcome-to-cau {
+ background: #FFF;
+ border: 1px solid #CCD0D4;
+ margin: 25px 0;
+ padding: 30px;
+ background-size: 140px;
+ background-position: left bottom;
+ background-repeat: no-repeat;
+ box-shadow: 0 1px 1px rgba(0,0,0,.04);
+}
+.welcome-to-cau .welcome-image {
+ display: inline-block;
+ vertical-align: middle;
+ width: 100px;
+ height: 100px;
+ background-image: url('images/welcome.svg');
+ background-size: contain;
+ background-position: center;
+ box-sizing: border-box;
+}
+.welcome-to-cau .welcome-content {
+ display: inline-block;
+ vertical-align: middle;
+ width: calc(100% - 100px);
+ padding-left: 25px;
+ box-sizing: border-box;
+}
+.welcome-to-cau .welcome-content strong {
+ color: #000;
+}
+.welcome-to-cau .welcome-content p {
+ margin: 2px 0;
+}
+.welcome-to-cau.help-bg {
+ background-image: url('images/help.svg');
+}
+.welcome-to-cau.support-bg {
+ background-image: url('images/support.svg');
+}
+.welcome-to-cau.love-bg {
+ background-image: url('images/love.svg');
+}
+.welcome-to-cau.update-bg {
+ background-image: url('images/update.svg');
+}
+.welcome-to-cau.email-bg {
+ background-image: url('images/email.svg');
+}
+.welcome-to-cau.interval-bg {
+ background-image: url('images/interval.svg');
+}
+.welcome-to-cau.advanced-bg {
+ background-image: url('images/settings.svg');
+}
+.welcome-to-cau h2 {
+ margin: 0;
+ margin-bottom: 25px;
+ font-size: 21px;
+ font-weight: 400;
+ line-height: 1.2;
+}
+.welcome-to-cau h2.title {
+ margin-bottom: 10px;
+}
+.welcome-to-cau h3 {
+ font-size: 16px;
+ margin-top: 0;
+}
+.welcome-to-cau a {
+ text-decoration: none;
+}
+.welcome-to-cau .welcome-column {
+ display: inline-block;
+ vertical-align: top;
+ box-sizing: border-box;
+}
+.welcome-to-cau.cau-show-love .welcome-column {
+ vertical-align: middle;
+}
+.welcome-to-cau .welcome-column.welcome-column-first {
+ display: block;
+ width: 100%;
+}
+.first-column {
+ padding-left: 140px;
+}
+.welcome-to-cau .welcome-column.welcome-column-half {
+ width: 50%;
+}
+.welcome-to-cau .welcome-column.welcome-column-third {
+ width: 33%;
+}
+.welcome-to-cau .welcome-column.welcome-column-quarter {
+ width: 25%;
+}
+.welcome-to-cau a.minimal-button {
+ display: inline-block;
+ padding: 5px;
+}
+select.schedule_interval {
+ width: 90%;
+}
+
+/* Overwrite core UI */
+/*.cau_content input[type="checkbox"]:checked::before {
+ content: "";
+ background: url( 'images/check.svg' );
+ background-size: contain;
+ background-position: center center;
+}*/
+.cau_content a {
+ color: #9178B7;
+}
+.cau_content a.nav-tab {
+ color: #23282D;
+}
+.cau_content .button-primary {
+ background-color: #9178B7!important;
+ border-color: #9178B7!important;
+}
+.cau_content .button-alt {
+ color: #9178B7!important;
+ border-color: #9178B7!important;
+}
+.cau_content .button-hero {
+ font-weight: 500;
+ padding: 15px 30px!important;
+}
+#message.cau {
+ background: #FFF;
+ border: 1px solid #CCD0D4;
+ border-left-width: 4px;
+ border-left-color: #9178B7;
+ box-shadow: 0 1px 1px rgba(0,0,0,.04);
+ margin: 25px 0px 5px 0;
+ padding: 15px;
+}
+#message.cau a, #message.cau strong {
+ color: #9178B7;
+}
+
+/* Dashboard */
+.cau-column-wide {
+ box-sizing: border-box;
+ display: inline-block;
+ vertical-align: top;
+ width: calc(100% - 450px);
+ padding-right: 25px;
+}
+.cau-column-small {
+ display: inline-block;
+ vertical-align: top;
+ width: 450px;
+}
+.cau-dashboard-box {
+ background-position: right bottom;
+}
+.cau-column-wide .cau-dashboard-box {
+ padding-right: 125px;
+}
+.cau-dashboard-box a {
+ margin-left: 0px;
+ margin-top: 10px;
+}
+.cau-dashboard-box .welcome-column {
+ padding-right: 25px;
+}
+.support-sidebar-list {
+ margin-bottom: 25px;
+}
+.cau_content .nav-tab {
+ position: relative;
+}
+.cau_content .nav-tab .cau_melding {
+ display: inline-block;
+ width: 11px;
+ height: 11px;
+ border-radius: 10px;
+ margin-left: 5px;
+ position: relative;
+ bottom: -1px;
+}
+.cau_content .nav-tab .cau_melding.level-okay {
+ background: #7AD03A;
+}
+.cau_content .nav-tab .cau_melding.level-low {
+ background: #FFBA00;
+}
+.cau_content .nav-tab .cau_melding.level-high {
+ background: #FF0000;
+}
+
+/* Table Styling */
+.cau_content .widefat td {
+ vertical-align: middle!important;
+}
+table.autoupdate th.head-plugin {
+ min-width: 250px;
+}
+table.autoupdate th.head-status {
+ min-width: 150px;
+}
+table.autoupdate th.check-column {
+ position: relative;
+ min-width: 55px;
+}
+table.autoupdate tr.inactive {
+ background: #FEF7F1;
+}
+table.autoupdate tr.active .check-column {
+ border-left: 3px solid transparent;
+}
+table.autoupdate tr.inactive .check-column {
+ border-left: 3px solid #D54E21;
+}
+table.autoupdate tr.inactive td.column-status p {
+ color: #BF3D3C;
+}
+table.autoupdate tr.active td.column-status p {
+ color: #000;
+}
+table.autoupdate tr td.column-description p {
+ overflow: hidden;
+ max-height: 18px;
+}
+
+/* Update Log */
+table.autoupdatelog {
+ margin-top: 25px;
+}
+table.autoupdatelog strong {
+ color: #000;
+}
+table.autoupdatelog .dashicons {
+ color: #00A0D2;
+}
+
+/* Status */
+table.cau_status_list {
+ margin-top: 25px;
+}
+table.cau_status_list:not(.no_column_width) th, table.cau_status_list:not(.no_column_width) td {
+ width: 25%;
+}
+.cau_enabled {
+ color: #7AD03A;
+}
+.cau_disabled {
+ color: #FF0000;
+}
+.cau_warning {
+ color: #FFBA00;
+}
+.cau_mobile_prefix {
+ display: none;
+}
+
+/* Rollback list */
+table.rollbacklist {
+ max-width: 650px;
+}
+table.rollbacklist td {
+ vertical-align: middle;
+}
+table.rollbacklist td a.versionselectbutton {
+ display: inline-block;
+ width: 100px;
+ text-align: center;
+}
+
+/* Plugin list */
+.pluginListButtons {
+ display: block;
+ padding: 15px 0;
+}
+.pluginListButtons p.submit {
+ display: inline-block;
+ margin: 0!important;
+ padding: 0!important;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked), .cau_content #the-list input[type="checkbox"]:checked {
+ width: 45px;
+ height: 45px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 100;
+ display: block;
+ opacity: 0;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked) + label, .cau_content #the-list input[type="checkbox"]:checked + label {
+ position: absolute;
+ top: 15px;
+ left: 12px;
+ cursor: pointer;
+}
+.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 {
+ content: '';
+ position: absolute;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked) + label:before, .cau_content #the-list input[type="checkbox"]:checked + label:before {
+ left: 0;
+ top: -3px;
+ width: 30px;
+ height: 16px;
+ background: transparent;
+ border: 2px solid #9178B7;
+ border-radius: 15px;
+ transition: background-color .2s;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked) + label:after, .cau_content #the-list input[type="checkbox"]:checked + label:after {
+ width: 8px;
+ height: 8px;
+ transition: all .2s;
+ border-radius: 500px;
+ background: transparent;
+ border: 2px solid #9178B7;
+ top: 1px;
+ left: 5px;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked) + label:before {
+ background: #9178B7;
+ border: 2px solid #9178B7;
+}
+.cau_content #the-list input[type="checkbox"]:not(:checked) + label:after {
+ background: #9178B7;
+ border-color: #FFF;
+ left: 18px;
+}
+
+/* Scheduling */
+.cau_schedule_input {
+ display: inline-block;
+ vertical-align: middle;
+ width: 50px;
+ padding-top: 5px;
+}
+.cau_schedule_input input {
+ max-width: 100%;
+ text-align: center;
+}
+.cau_schedule_input_div {
+ display: inline-block;
+ vertical-align: middle;
+ padding: 0 6px;
+ font-weight: bold;
+}
+.cau_shedule_notation {
+ display: inline-block;
+ vertical-align: middle;
+ width: 125px;
+ padding-left: 5px;
+}
+.cau_shedule_notation .dashicons {
+ position: relative;
+ bottom: -5px;
+}
+
+/* Tooltip */
+.cau_tooltip {
+ position: relative;
+}
+.cau_tooltip .cau_tooltip_text {
+ visibility: hidden;
+ background-color: rgba(0,0,0,0.7);
+ color: #FFF;
+ text-align: left;
+ font-size: 14px;
+ padding: 15px;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 1;
+ width: 240px;
+ bottom: 100%;
+ left: 50%;
+ margin-left: -60px;
+ margin-bottom: 10px;
+ opacity: 0;
+ transition: .3s;
+ font-weight: normal;
+}
+.cau_tooltip:hover .cau_tooltip_text {
+ visibility: visible;
+ opacity: 1;
+}
+.cau_tooltip .cau_tooltip_text::after {
+ content: " ";
+ position: absolute;
+ top: 100%;
+ left: 50%;
+ margin-left: -75px;
+ border-width: 5px;
+ border-style: solid;
+ border-color: rgba(0,0,0,0.7) transparent transparent transparent;
+}
+
+/* Responsive */
+@media screen and (max-width: 1400px) {
+
+ .cau-column-wide {
+ width: calc(100% - 350px);
+ }
+ .cau-column-small {
+ width: 350px;
+ }
+ .welcome-to-cau .welcome-column.welcome-column-quarter {
+ width: 50%;
+ padding-bottom: 35px;
+ }
+ .cau-column-small .welcome-to-cau {
+ background-image: none;
+ }
+
+}
+@media screen and (max-width: 1150px) {
+
+ .cau-column-wide, .cau-column-small {
+ width: 100%;
+ padding: 0;
+ }
+
+}
+@media screen and (max-width: 1000px) {
+
+ /* Basics */
+ .cau_hide_on_mobile, table.autoupdate thead {
+ display: none!important;
+ }
+ .form-table td fieldset p {
+ display: block;
+ padding: 5px 0;
+ }
+ .form-table td fieldset input[type="checkbox"] {
+ display: inline-block;
+ vertical-align: middle;
+ width: 25px;
+ }
+ .form-table td fieldset label {
+ display: inline-block;
+ vertical-align: middle;
+ width: calc(100% - 40px);
+ box-sizing: border-box;
+ padding-left: 5px;
+ }
+ .cau_content .nav-tab-wrapper {
+ position: relative;
+ top: -20px;
+ border-bottom: 1px solid #CCC!important;
+ padding-bottom: 15px!important;
+ margin-bottom: 0px!important;
+ }
+ .cau_content .nav-tab {
+ font-size: 12px;
+ margin: 5px 5px 0 0!important;
+ box-sizing: border-box;
+ text-align: center;
+ }
+
+ /* Scheduling */
+ .cau_schedule_input {
+ width: 75px;
+ }
+
+ /* Custom buttons */
+ .cau-button {
+ display: block;
+ text-align: center;
+ margin: 5px 0;
+ }
+ .cau-button .dashicons {
+ float: left;
+ }
+
+ /* Dashboard */
+ .welcome-to-cau {
+ background-position: right bottom;
+ }
+ .welcome-to-cau.love-bg {
+ background-image: none;
+ }
+ .welcome-to-cau .welcome-column {
+ min-width: 100%;
+ }
+ .welcome-to-cau .welcome-column.welcome-column-first {
+ padding-left: 0px;
+ }
+ .cau-column-wide .cau-dashboard-box {
+ padding-right: 30px;
+ padding-bottom: 125px
+ }
+ .majorMinorExplain {
+ display: none;
+ }
+
+ /* Status */
+ table.cau_status_list .cau_status_name {
+ display: inline-block;
+ width: 50%;
+ box-sizing: border-box;
+ font-weight: 500;
+ }
+ table.cau_status_list .cau_status_interval {
+ display: none;
+ }
+ table.cau_status_list th.cau_status_next {
+ display: none;
+ }
+ table.cau_status_list td.cau_status_next {
+ display: block;
+ width: 100%;
+ }
+ table.cau_status_list .cau_status_active_state {
+ display: inline-block;
+ width: 50%;
+ box-sizing: border-box;
+ text-align: right;
+ }
+ .cau_mobile_prefix {
+ display: inline-block;
+ padding-right: 5px;
+ }
+ table.cau_status_list.cau_status_warnings td {
+ display: block;
+ width: 100%;
+ box-sizing: border-box;
+ }
+ table.cau_status_list.cau_status_warnings th.cau_plugin_issue_explain, table.cau_status_list.cau_status_warnings th.cau_plugin_issue_fixit {
+ display: none;
+ }
+ table.cau_status_list.cau_status_warnings td.cau_plugin_issue_name {
+ font-weight: 500;
+ }
+
+}
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/backend/warningbar.css b/wp-content/plugins/companion-auto-update/backend/warningbar.css
new file mode 100644
index 0000000..49663df
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/backend/warningbar.css
@@ -0,0 +1,11 @@
+#wpadminbar #wp-admin-bar-cau-has-issues .ab-icon:before {
+ /*content: "\f463";*/
+ content: "\f332";
+ top: 3px;
+}
+#wpadminbar #wp-admin-bar-cau-has-issues .cau-level-low {
+ /*color: #FFBA00;*/
+}
+#wpadminbar #wp-admin-bar-cau-has-issues .cau-level-high {
+ color: #FF0000;
+}
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/cau_emails.php b/wp-content/plugins/companion-auto-update/cau_emails.php
new file mode 100644
index 0000000..bae62c8
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/cau_emails.php
@@ -0,0 +1,468 @@
+ $version ) {
+ $text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
+ }
+
+ }
+
+ return $text;
+
+}
+
+// Set the content for the emails about pending updates
+function cau_pending_message( $single, $plural, $list ) {
+
+ // What markup to use
+ if( cau_is_html() ) $break = ' ';
+ else $break = "\n";
+
+ // Base text
+ $text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
+ $text .= $break;
+
+ if( !empty( $list ) ) {
+
+ $text .= $break;
+ $text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
+ $text .= $break;
+
+ if( cau_is_html() ) $text .= "";
+ foreach ( $list as $key => $value ) {
+ if( cau_is_html() ) {
+ $text .= "$value ";
+ } else {
+ $text .= "-$value\n";
+ }
+ }
+ if( cau_is_html() ) $text .= " ";
+
+ $text .= $break;
+ }
+
+ $text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
+ $text .= $break;
+
+ // End
+ $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' );
+
+ return $text;
+
+}
+
+// Set the content for the emails about recent updates
+function cau_updated_message( $type, $updatedList ) {
+
+ // What markup to use
+ if( cau_is_html() ) $break = ' ';
+ else $break = "\n";
+
+ // The message
+ $text = sprintf( esc_html__(
+ '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.
+For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
+ ), $type, get_site_url() );
+
+ $text .= $break;
+ $text .= $break;
+ $text .= sprintf( esc_html__(
+ 'The following %1$s have been updated:', 'companion-auto-update'
+ ), $type );
+
+ $text .= $break;
+ $text .= $updatedList;
+
+ $text .= $break;
+ $text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" );
+
+ return $text;
+
+}
+
+// Checks if plugins are out of date
+function cau_list_outdated_software() {
+
+ // Check if cau_get_db_value() function exists.
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
+
+ // Set up mail
+ $subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
+ $type = __( 'plugin', 'companion-auto-update' );
+ $type_plural = __( 'plugins', 'companion-auto-update' );
+ $message = cau_outdated_message( $type, $type_plural, cau_list_outdated() );
+
+ // Send to all addresses
+ foreach ( cau_set_email() as $key => $value ) {
+ foreach ( $value as $k => $v ) {
+ wp_mail( $v, $subject, $message );
+ }
+ break;
+ }
+
+}
+
+// Checks if theme updates are available
+function cau_list_theme_updates() {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+
+ $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
+ foreach ( $configs as $config ) {
+
+ if( $config->onoroff != 'on' ) {
+
+ require_once ABSPATH . '/wp-admin/includes/update.php';
+ $themes = get_theme_updates();
+ $list = array();
+
+ if ( !empty( $themes ) ) {
+
+ foreach ( $themes as $stylesheet => $theme ) {
+ array_push( $list, $theme->get( 'Name' ) );
+ }
+
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
+ $type = __('theme', 'companion-auto-update');
+ $type_plural = __('themes', 'companion-auto-update');
+ $message = cau_pending_message( $type, $type_plural, $list );
+
+ foreach ( cau_set_email() as $key => $value) {
+ foreach ($value as $k => $v) {
+ wp_mail( $v, $subject, $message );
+ }
+ break;
+ }
+ }
+
+ }
+
+ }
+
+}
+
+// Checks if plugin updates are available
+function cau_list_plugin_updates() {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+
+ $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
+ foreach ( $configs as $config ) {
+
+ if( $config->onoroff != 'on' ) {
+
+ require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
+ $plugins = get_plugin_updates();
+
+ if ( !empty( $plugins ) ) {
+
+ $list = array();
+ foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
+ $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
+ $name = $plugin_data->Name;
+ array_push( $list, $name );
+ }
+
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
+ $type = __( 'plugin', 'companion-auto-update' );
+ $type_plural = __( 'plugins', 'companion-auto-update' );
+ $message = cau_pending_message( $type, $type_plural, $list );
+
+ foreach ( cau_set_email() as $key => $value) {
+ foreach ($value as $k => $v) {
+ wp_mail( $v, $subject, $message );
+ }
+ break;
+ }
+ }
+
+ }
+
+ }
+}
+
+// Alerts when plugin has been updated
+function cau_plugin_updated() {
+
+ // Check if cau_get_db_value() function exists.
+ if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
+
+ // Set the correct timezone for emails
+ date_default_timezone_set( cau_get_proper_timezone() );
+
+ // Create arrays
+ $pluginNames = array();
+ $pluginDates = array();
+ $pluginVersion = array();
+ $pluginSlug = array();
+ $pluginTimes = array();
+ $themeNames = array();
+ $themeDates = array();
+ $themeTimes = array();
+
+ // Where to look for plugins
+ $plugdir = plugin_dir_path( __DIR__ );
+ if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists.
+ $allPlugins = get_plugins();
+
+ // Where to look for themes
+ $themedir = get_theme_root();
+ $allThemes = wp_get_themes();
+
+ // Mail schedule
+ $schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
+
+ // Loop trough all plugins
+ foreach ( $allPlugins as $key => $value ) {
+
+ // Get plugin data
+ $fullPath = $plugdir.'/'.$key;
+ $getFile = $path_parts = pathinfo( $fullPath );
+ $pluginData = get_plugin_data( $fullPath );
+
+ // Get the slug
+ $explosion = explode( '/', $key );
+ $actualSlug = array_shift( $explosion );
+
+ // Get last update date
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+
+ switch ( $schedule_mail ) {
+ case 'hourly':
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
+ break;
+ case 'twicedaily':
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
+ break;
+ default:
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
+ break;
+ }
+
+ $dateFormat = get_option( 'date_format' );
+ $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ $timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
+
+ if( $fileDate >= $lastday ) {
+
+ // Get plugin name
+ foreach ( $pluginData as $dataKey => $dataValue ) {
+ if( $dataKey == 'Name') {
+ array_push( $pluginNames , $dataValue );
+ }
+ if( $dataKey == 'Version') {
+ array_push( $pluginVersion , $dataValue );
+ }
+ }
+
+ array_push( $pluginDates, $fileDate );
+ array_push( $pluginSlug, $actualSlug );
+ array_push( $pluginTimes, $timestamp );
+ }
+
+ }
+
+ // Loop trough all themes
+ foreach ( $allThemes as $key => $value ) {
+
+ // Get theme data
+ $fullPath = $themedir.'/'.$key;
+ $getFile = $path_parts = pathinfo( $fullPath );
+
+ // Get last update date
+ $dateFormat = get_option( 'date_format' );
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+
+ if( $schedule_mail == 'hourly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
+ } elseif( $schedule_mail == 'twicedaily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
+ } elseif( $schedule_mail == 'daily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
+ }
+
+ $dateFormat = get_option( 'date_format' );
+ $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ $timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
+
+ if( $fileDate >= $lastday ) {
+ array_push( $themeNames, $path_parts['filename'] );
+ array_push( $themeDates, $fileDate );
+ array_push( $themeTimes, $timestamp );
+ }
+
+ }
+
+ $totalNumP = 0;
+ $totalNumT = 0;
+ $updatedListP = '';
+ $updatedListT = '';
+
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
+ $updatedListP .= '';
+ $updatedListT .= '';
+ }
+
+ foreach ( $pluginDates as $key => $value ) {
+
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
+
+ $more_info = '';
+ if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "".__( "Time of update", "companion-auto-update" ).": ".$pluginTimes[$key]." ";
+
+ $updatedListP .= "
+ ".$pluginNames[$key]."
+ ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]." ".__( "Release notes", "companion-auto-update" )."
+ ".$more_info."
+ ";
+
+ } else {
+
+ $updatedListP .= "- ".$pluginNames[$key]." ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]."\n";
+ $updatedListP .= " ".__( "Release notes", "companion-auto-update" ).": https://wordpress.org/plugins/".$pluginSlug[$key]."/#developers\n";
+
+ }
+
+ $totalNumP++;
+ }
+
+ foreach ( $themeNames as $key => $value ) {
+
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
+
+ $more_info = '';
+ if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key]." ";
+ $updatedListT .= "".$themeNames[$key]." ".$more_info." ";
+
+ } else {
+ $updatedListT .= "- ".$themeNames[$key]."\n";
+ }
+
+ $totalNumT++;
+ }
+
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
+ $updatedListP .= ' ';
+ $updatedListT .= ' ';
+ }
+
+ // Set the email content type
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
+ function cau_mail_content_type() {
+ return 'text/html';
+ }
+ add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
+ }
+
+ // If plugins have been updated, send email
+ if( $totalNumP > 0 ) {
+
+ // E-mail content
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
+ $type = __('plugins', 'companion-auto-update');
+ $message = cau_updated_message( $type, $updatedListP );
+
+ // Send to all addresses
+ foreach ( cau_set_email() as $key => $value) {
+ foreach ($value as $k => $v) {
+ wp_mail( $v, $subject, $message );
+ }
+ break;
+ }
+
+ }
+
+ // If themes have been updated, send email
+ if( $totalNumT > 0 ) {
+
+ // E-mail content
+ $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
+ $type = __('themes', 'companion-auto-update');
+ $message = cau_updated_message( $type, $updatedListT );
+
+ // Send to all addresses
+ foreach ( cau_set_email() as $key => $value) {
+ foreach ($value as $k => $v) {
+ wp_mail( $v, $subject, $message );
+ }
+ break;
+ }
+
+ }
+
+ if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
+
+ // Prevent duplicate emails by setting the event again
+ if( $totalNumT > 0 OR $totalNumP > 0 ) {
+ if( $schedule_mail == 'hourly' ) {
+ wp_clear_scheduled_hook('cau_set_schedule_mail');
+ wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
+ }
+ }
+
+}
diff --git a/wp-content/plugins/companion-auto-update/cau_functions.php b/wp-content/plugins/companion-auto-update/cau_functions.php
new file mode 100644
index 0000000..6a17bac
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/cau_functions.php
@@ -0,0 +1,1375 @@
+roles ) ) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+// Get database value
+function cau_get_db_value( $name, $table = 'auto_updates' ) {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix.$table;
+ $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE name = '%s'", $name ) );
+ foreach ( $cau_configs as $config ) return $config->onoroff;
+
+}
+
+// Get database value
+function cau_get_plugininfo( $check, $field ) {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix.'update_log';
+ $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) );
+ foreach ( $cau_configs as $config ) return $config->$field;
+
+}
+
+// Get the set timezone
+function cau_get_proper_timezone() {
+
+ // WP 5.3 adds the wp_timezone_string function
+ if ( !function_exists( 'wp_timezone_string' ) ) {
+ $timezone = get_option( 'timezone_string' );
+ } else {
+ $timezone = wp_timezone_string();
+ }
+
+ // Should fix an reported issue
+ if( $timezone == '+00:00' ) {
+ $timezone = 'UTC';
+ }
+
+ return $timezone;
+
+}
+
+// Copy of the wp_timezone_string for < 5.3 compat
+if ( !function_exists( 'wp_timezone_string' ) ) {
+ function wp_timezone_string() {
+ $timezone_string = get_option( 'timezone_string' );
+
+ if ( $timezone_string ) {
+ return $timezone_string;
+ }
+
+ $offset = (float) get_option( 'gmt_offset' );
+ $hours = (int) $offset;
+ $minutes = ( $offset - $hours );
+
+ $sign = ( $offset < 0 ) ? '-' : '+';
+ $abs_hour = abs( $hours );
+ $abs_mins = abs( $minutes * 60 );
+ $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
+
+ return $tz_offset;
+ }
+}
+
+// List of incompatible plugins
+function cau_incompatiblePluginlist() {
+
+ // Pluginlist, write as Plugin path => Issue
+ $pluginList = array(
+ 'better-wp-security/better-wp-security.php' => " May block auto-updating for everything.",
+ 'updraftplus/updraftplus.php' => " By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. Causes no issues with other plugins. "
+ );
+
+ return $pluginList;
+
+}
+function cau_incompatiblePlugins() {
+
+ $return = false;
+
+ foreach ( cau_incompatiblePluginlist() as $key => $value ) {
+ if( is_plugin_active( $key ) ) {
+ $return = true;
+ }
+ }
+
+ return $return;
+
+}
+
+// Check if has issues
+function cau_pluginHasIssues() {
+
+ $return = false;
+
+ if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) {
+ $return = true;
+ }
+
+ if( checkAutomaticUpdaterDisabled() ) {
+ $return = true;
+ }
+
+ if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) {
+ $return = true;
+ }
+
+ if( cau_incorrectDatabaseVersion() ) {
+ $return = true;
+ }
+
+ return $return;
+}
+function cau_pluginIssueLevels() {
+
+ if( checkAutomaticUpdaterDisabled() ) {
+ $level = 'high';
+ } else {
+ $level = 'low';
+ }
+
+ return $level;
+}
+function cau_pluginIssueCount() {
+
+ $count = 0;
+
+ if( get_option( 'blog_public' ) == 0 ) {
+ $count++;
+ }
+ if( checkAutomaticUpdaterDisabled() ) {
+ $count++;
+ }
+ if( checkCronjobsDisabled() ) {
+ $count++;
+ }
+ if( cau_incompatiblePlugins() ) {
+ foreach ( cau_incompatiblePluginlist() as $key => $value ) {
+ if( is_plugin_active( $key ) ) {
+ $count++;
+ }
+ }
+ }
+
+ return $count;
+}
+function cau_incorrectDatabaseVersion() {
+ if( get_option( "cau_db_version" ) != cau_db_version() ) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+// Run custom hooks on plugin update
+function cau_run_custom_hooks_p() {
+
+ // Create array
+ $allDates = array();
+
+ // Where to look for plugins
+ $dirr = plugin_dir_path( __DIR__ );
+ $listOfAll = get_plugins();
+
+ // Number of updates
+ $numOfUpdates = 0;
+
+ // Loop trough all plugins
+ foreach ( $listOfAll as $key => $value ) {
+
+ // Get data
+ $fullPath = $dirr.'/'.$key;
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
+ $updateSched = wp_get_schedule( 'wp_update_plugins' );
+
+ // Check when the last update was
+ if( $updateSched == 'hourly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
+ } elseif( $updateSched == 'twicedaily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
+ } elseif( $updateSched == 'daily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
+ } elseif( $updateSched == 'weekly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
+ } elseif( $updateSched == 'monthly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ } else {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ }
+
+ $update_time = wp_next_scheduled( 'wp_update_plugins' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
+
+ if( $fileDate >= $lastday ) {
+
+ // Push to array
+ array_push( $allDates, $fileDate );
+
+ // Update info
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
+ $status = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $status = __( 'Manual', 'companion-auto-update' );
+ }
+
+ $numOfUpdates++;
+
+ cau_updatePluginInformation( $key, $status );
+
+ }
+
+ }
+
+ // If there have been plugin updates run hook
+ if( $numOfUpdates >= 1 ) {
+ do_action( 'cau_after_plugin_update' );
+ }
+
+}
+
+// Run custom hooks on theme update
+function cau_run_custom_hooks_t() {
+
+ // Create array
+ $allDates = array();
+
+ // Where to look for plugins
+ $dirr = get_theme_root();
+ $listOfAll = wp_get_themes();
+
+ // Loop trough all plugins
+ foreach ( $listOfAll as $key => $value) {
+
+ // Get data
+ $fullPath = $dirr.'/'.$key;
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
+ $updateSched = wp_get_schedule( 'wp_update_themes' );
+
+ // Check when the last update was
+ if( $updateSched == 'hourly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
+ } elseif( $updateSched == 'twicedaily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
+ } elseif( $updateSched == 'daily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
+ } elseif( $updateSched == 'weekly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
+ } elseif( $updateSched == 'monthly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ } else {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ }
+
+ $update_time = wp_next_scheduled( 'wp_update_themes' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
+
+ if( $fileDate >= $lastday ) {
+
+ // Push to array
+ array_push( $allDates, $fileDate );
+
+ // Update info
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
+ $status = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $status = __( 'Manual', 'companion-auto-update' );
+ }
+ cau_updatePluginInformation( $key, $status );
+
+ }
+
+ }
+
+ $totalNum = 0;
+
+ // Count number of updated plugins
+ foreach ( $allDates as $key => $value ) $totalNum++;
+
+ // If there have been plugin updates run hook
+ if( $totalNum > 0 ) {
+ do_action( 'cau_after_theme_update' );
+ }
+
+}
+
+// Run custom hooks on core update
+function cau_run_custom_hooks_c() {
+
+ // Create array
+ $totalNum = 0;
+
+ // Get data
+ $fullPath = ABSPATH.'wp-includes/version.php';
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+ $updateSched = wp_get_schedule( 'wp_version_check' );
+
+ // Check when the last update was
+ if( $updateSched == 'hourly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
+ } elseif( $updateSched == 'twicedaily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
+ } elseif( $updateSched == 'daily' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
+ } elseif( $updateSched == 'weekly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
+ } elseif( $updateSched == 'monthly' ) {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ } else {
+ $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
+ }
+
+ // Check manual or automatic
+ $update_time = wp_next_scheduled( 'wp_version_check' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
+
+ if( $fileDate >= $lastday ) {
+
+ // Update info
+ if( $fileDate > $range_start && $fileDate < $range_end ) {
+ $status = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $status = __( 'Manual', 'companion-auto-update' );
+ }
+ cau_updatePluginInformation( 'core', $status );
+
+ $totalNum++;
+
+ }
+
+ // If there have been plugin updates run hook
+ if( $totalNum > 0 ) {
+ do_action( 'cau_after_core_update' );
+ }
+
+}
+
+// Check if automatic updating is disabled globally
+function checkAutomaticUpdaterDisabled() {
+
+ // 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 :)
+
+ if ( defined( 'automatic_updater_disabled' ) ) {
+ if( doing_filter( 'automatic_updater_disabled' ) ) {
+ return true;
+ } elseif( constant( 'automatic_updater_disabled' ) == 'true' ) {
+ return true;
+ } elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
+ if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
+ return true;
+ } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) {
+ return true;
+ } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+
+}
+
+// Check if cronjobs are disabled
+function checkCronjobsDisabled() {
+
+ if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) {
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+// Menu location
+function cau_menloc( $after = '' ) {
+ return 'tools.php'.$after;
+}
+function cau_url( $tab = '' ) {
+ return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) );
+}
+
+// Get the active tab
+function active_tab( $page, $identifier = 'tab' ) {
+ echo _active_tab( $page, $identifier );
+}
+function _active_tab( $page, $identifier = 'tab' ) {
+
+ if( !isset( $_GET[ $identifier ] ) ) {
+ $cur_page = '';
+ } else {
+ $cur_page = $_GET[ $identifier ];
+ }
+
+ if( $page == $cur_page ) {
+ return 'nav-tab-active';
+ }
+
+}
+
+// Get the active subtab
+function active_subtab( $page, $identifier = 'tab' ) {
+
+ if( !isset( $_GET[ $identifier ] ) ) {
+ $cur_page = '';
+ } else {
+ $cur_page = $_GET[ $identifier ];
+ }
+
+ if( $page == $cur_page ) {
+ echo 'current';
+ }
+
+}
+
+// List of plugins that should not be updated
+function donotupdatelist( $filter = 'plugins' ) {
+
+ // Select correct database row
+ switch ( $filter ) {
+ case 'themes':
+ $db_table = 'notUpdateListTh';
+ break;
+ case 'plugins':
+ $db_table = 'notUpdateList';
+ break;
+ default:
+ $db_table = 'notUpdateList';
+ break;
+ }
+
+ // Create list
+ global $wpdb;
+ $table_name = $wpdb->prefix."auto_updates";
+ $config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'");
+
+ $list = $config[0]->onoroff;
+ $list = explode( ", ", $list );
+ $returnList = array();
+
+ foreach ( $list as $key ) array_push( $returnList, $key );
+
+ return $returnList;
+
+}
+function plugins_donotupdatelist() {
+
+ // Base array
+ $array = array();
+
+ // Filtered plugins
+ $filteredplugins = donotupdatelist( 'plugins' );
+ foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin );
+
+ // Plugin added to the delay list
+ $delayedplugins = cau_delayed_updates__formated();
+ foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin );
+
+ // Return array
+ return $array;
+}
+function themes_donotupdatelist() {
+ return donotupdatelist( 'themes' );
+}
+
+// Show the update log
+function cau_fetch_log( $limit, $format = 'simple' ) {
+
+ // Database
+ global $wpdb;
+ $updateLog = "update_log";
+ $updateLogDB = $wpdb->prefix.$updateLog;
+
+ // Filter log
+ if( isset( $_GET['filter'] ) ) {
+ $filter = $_GET['filter'];
+ } else {
+ $filter = 'all';
+ }
+
+ switch( $filter ) {
+
+ case 'plugins':
+ $plugins = true;
+ $themes = false;
+ $core = false;
+ $translations = false;
+ break;
+
+ case 'themes':
+ $plugins = false;
+ $themes = true;
+ $core = false;
+ $translations = false;
+ break;
+
+ case 'translations':
+ $plugins = false;
+ $themes = false;
+ $core = false;
+ $translations = true;
+ break;
+
+ default:
+ $plugins = true;
+ $themes = true;
+ $core = true;
+ $translations = false;
+ break;
+ }
+
+ // Create arrays
+ $pluginNames = array();
+ $pluginVersion = array();
+ $pluginDates = array();
+ $pluginDatesF = array();
+ $plugslug = array();
+ $type = array();
+ $method = array();
+
+ // Date format
+ $dateFormat = get_option( 'date_format' );
+
+ // PLUGINS
+ if( $plugins ) {
+
+ // Where to look for plugins
+ $plugdir = plugin_dir_path( __DIR__ );
+ $allPlugins = get_plugins();
+
+ // Loop trough all plugins
+ foreach ( $allPlugins as $key => $value) {
+
+ // Get plugin data
+ $fullPath = $plugdir.'/'.$key;
+ $getFile = $path_parts = pathinfo( $fullPath );
+ $pluginData = get_plugin_data( $fullPath );
+ $pluginSlug = explode( "/", plugin_basename( $key ) );
+ $pluginSlug = $pluginSlug[0];
+
+ array_push( $plugslug , $pluginSlug );
+
+ // Automatic or Manual (non-db-version)
+ $date_tod = date ( 'ydm' );
+ $fileDay = date ( 'ydm', filemtime( $fullPath ) );
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
+ $updateSched = wp_next_scheduled( 'wp_update_plugins' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
+
+ if( $date_tod == $fileDay ) {
+
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
+ $status = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $status = __( 'Manual', 'companion-auto-update' );
+ }
+
+ array_push( $method , $status );
+
+ } else {
+
+ // Get info from database
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
+ array_push( $method , cau_get_plugininfo( $key, 'method' ) );
+ } else {
+ array_push( $method , '-' );
+ }
+
+ }
+
+ // Get plugin name
+ foreach ( $pluginData as $dataKey => $dataValue ) {
+ if( $dataKey == 'Name') {
+ array_push( $pluginNames , $dataValue );
+ }
+ if( $dataKey == 'Version') {
+ array_push( $pluginVersion , $dataValue );
+ }
+ }
+
+ // Get last update date
+ $fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
+ if( $format == 'table' ) {
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ $fileDateF .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
+ } else {
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ }
+ array_push( $pluginDates, $fileDate );
+ array_push( $pluginDatesF, $fileDateF );
+ array_push( $type, 'Plugin' );
+
+ }
+
+ }
+
+ // THEMES
+ if( $themes ) {
+
+ // Where to look for themes
+ $themedir = get_theme_root();
+ $allThemes = wp_get_themes();
+
+ // Loop trough all themes
+ foreach ( $allThemes as $key => $value) {
+
+ // Get theme data
+ $fullPath = $themedir.'/'.$key;
+ $getFile = $path_parts = pathinfo( $fullPath );
+
+ // Get theme name
+ $theme_data = wp_get_theme( $path_parts['filename'] );
+ $themeName = $theme_data->get( 'Name' );
+ $themeVersion = $theme_data->get( 'Version' );
+ array_push( $pluginNames , $themeName );
+ array_push( $pluginVersion , $themeVersion );
+
+ // Automatic or Manual (non-db-version)
+ $date_tod = date ( 'ydm' );
+ $fileDay = date ( 'ydm', filemtime( $fullPath ) );
+ $fileTime = date ( 'Hi', filemtime( $fullPath ) );
+ $updateSched = wp_next_scheduled( 'wp_update_themes' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
+
+ if( $date_tod == $fileDay ) {
+
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
+ $status = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $status = __( 'Manual', 'companion-auto-update' );
+ }
+
+ array_push( $method , $status );
+
+ } else {
+
+ // Get info from database
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
+ array_push( $method , cau_get_plugininfo( $key, 'method' ) );
+ } else {
+ array_push( $method , '-' );
+ }
+
+ }
+
+ // Get last update date
+ $fileDate = date( 'YmdHi', filemtime( $fullPath ) );
+
+ if( $format == 'table' ) {
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ $fileDateF .= ' ‐ '.date ( 'H:i', filemtime( $fullPath ) );
+ } else {
+ $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
+ }
+
+ array_push( $pluginDates, $fileDate );
+ array_push( $pluginDatesF, $fileDateF );
+ array_push( $type, 'Theme' );
+ array_push( $plugslug , '' );
+
+ }
+
+ }
+
+ // TRANSLATIONS
+ if( $translations ) {
+
+ // 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
+ $transFolder = get_home_path().'wp-content/languages';
+ if( file_exists( $transFolder ) ) {
+
+ $allThemTranslations = array();
+ $allThemTypes = array();
+
+ $pt = __( 'Plugin translations', 'companion-auto-update' );
+ $tt = __( 'Theme translations', 'companion-auto-update' );
+ $ct = __( 'Core translations', 'companion-auto-update' );
+
+ // Plugin translations
+ $files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE );
+ foreach( $files as $file ) {
+ array_push( $allThemTranslations, $file );
+ array_push( $allThemTypes, $pt );
+ }
+
+ // Theme translations
+ $files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE );
+ foreach( $files as $file ) {
+ array_push( $allThemTranslations, $file );
+ array_push( $allThemTypes, $tt );
+ }
+
+ // Core translations
+ $files = glob( $transFolder.'/*.{mo}', GLOB_BRACE );
+ foreach( $files as $file ) {
+ array_push( $allThemTranslations, $file );
+ array_push( $allThemTypes, $ct );
+ }
+
+ foreach( $allThemTranslations as $key => $trans_file ) {
+
+ $transDate = date( 'YmdHi', filemtime( $trans_file ) );
+
+ if( $format == 'table' ) {
+ $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
+ $transDateF .= ' ‐ '.date ( 'H:i', filemtime( $trans_file ) );
+ } else {
+ $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
+ }
+
+ $trans_name = basename( $trans_file );
+ $trans_name = str_replace( "-", " ", $trans_name );
+ $trans_name = str_replace( ".mo", "", $trans_name );
+ $trans_name = str_replace( ".json", "", $trans_name );
+ $trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 );
+ $trans_name = str_replace( $trans_lang, "", $trans_name );
+ $trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 );
+
+ // Push
+ array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang );
+ array_push( $type, $allThemTypes[$key] );
+ array_push( $pluginVersion, '-' );
+ array_push( $pluginDates, $transDate );
+ array_push( $pluginDatesF, $transDateF );
+ array_push( $plugslug , '' );
+ array_push( $method , '-' );
+
+ }
+
+ } else {
+
+ $transDate = date('YmdHi');
+ $transDateF = 'Could not read translations date.';
+
+ array_push( $pluginNames, 'Translations' );
+ array_push( $type, $trans_type.' translations' );
+ array_push( $pluginVersion, '-' );
+ array_push( $pluginDates, $transDate );
+ array_push( $pluginDatesF, $transDateF );
+ array_push( $plugslug , '' );
+
+ // Get info from database
+ array_push( $method , '-' );
+
+ }
+
+ }
+
+ // CORE
+ if( $core ) {
+
+ $coreFile = ABSPATH.'wp-includes/version.php';
+ $updateSched = wp_next_scheduled( 'wp_version_check' );
+
+ if( file_exists( $coreFile ) ) {
+
+ $coreDate = date( 'YmdHi', filemtime( $coreFile ) );
+
+ if( $format == 'table' ) {
+ $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
+ $coreDateF .= ' ‐ '.date ( 'H:i', filemtime( $coreFile ) );
+ } else {
+ $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
+ }
+
+ // Automatic or Manual (non-db-version)
+ $date_tod = date ( 'ydm' );
+ $fileDay = date ( 'ydm', filemtime( $coreFile ) );
+ $fileTime = date ( 'Hi', filemtime( $coreFile ) );
+ $update_time = wp_next_scheduled( 'wp_version_check' );
+ $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
+ $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
+
+ if( $date_tod == $fileDay ) {
+
+ if( $fileTime > $range_start && $fileTime < $range_end ) {
+ $methodVal = __( 'Automatic', 'companion-auto-update' );
+ } else {
+ $methodVal = __( 'Manual', 'companion-auto-update' );
+ }
+
+ } else {
+
+ // Get info from database
+ if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
+ $methodVal = cau_get_plugininfo( 'core', 'method' );
+ } else {
+ $methodVal = '';
+ }
+
+ }
+
+
+ } else {
+ $coreDate = date('YmdHi');
+ $coreDateF = 'Could not read core date.';
+ }
+
+ array_push( $pluginNames, 'WordPress' );
+ array_push( $type, 'WordPress' );
+ array_push( $pluginVersion, get_bloginfo( 'version' ) );
+ array_push( $pluginDates, $coreDate );
+ array_push( $pluginDatesF, $coreDateF );
+ array_push( $plugslug , '' );
+
+ // Get info from database
+ array_push( $method , $methodVal );
+
+ }
+
+ // Sort array by date
+ arsort( $pluginDates );
+
+ if( $limit == 'all' ) {
+ $limit = 999;
+ }
+
+ $listClasses = 'wp-list-table widefat autoupdate autoupdatelog';
+
+ if( $format == 'table' ) {
+ $listClasses .= ' autoupdatelog striped';
+ } else {
+ $listClasses .= ' autoupdatewidget';
+ }
+
+ echo '';
+
+ // Show the last updated plugins
+ if( $format == 'table' ) {
+
+ echo '
+
+ '.__( 'Name', 'companion-auto-update' ).' ';
+ if( !$translations ) echo ''.__( 'To version', 'companion-auto-update' ).' ';
+ echo ''.__( 'Type', 'companion-auto-update' ).'
+ '.__( 'Last updated on', 'companion-auto-update' ).'
+ '.__( 'Update method', 'companion-auto-update' ).'
+
+ ';
+
+ }
+
+ echo '';
+
+ $loopings = 0;
+
+ foreach ( $pluginDates as $key => $value ) {
+
+ if( $loopings < $limit ) {
+
+ echo '';
+
+ if( $format == 'table' ) {
+ $pluginName = $pluginNames[$key];
+ } else {
+ $pluginName = substr( $pluginNames[$key], 0, 25);
+ if( strlen( $pluginNames[$key] ) > 25 ) {
+ $pluginName .= '...';
+ }
+ }
+
+ echo ''.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'
';
+
+ if( $format == 'table' ) {
+
+ if( $type[$key] == 'Plugin' ) {
+ $thisType = __( 'Plugin', 'companion-auto-update' );
+ } else if( $type[$key] == 'Theme' ) {
+ $thisType = __( 'Theme', 'companion-auto-update' );
+ } else {
+ $thisType = $type[$key];
+ }
+
+ if( !$translations ) echo ''. $pluginVersion[$key] .'
';
+ echo ''. $thisType .'
';
+
+ }
+
+ echo ''. $pluginDatesF[$key] .'
';
+
+ if( $format == 'table' ) {
+ echo ''. $method[$key] .'
';
+ }
+
+ echo ' ';
+
+ $loopings++;
+
+ }
+
+ }
+
+ echo "
";
+
+}
+
+// Get the proper changelog URL
+function cau_getChangelogUrl( $type, $name, $plugslug ) {
+
+ switch( $type ) {
+ case 'WordPress':
+ $url = '';
+ break;
+ case 'Plugin':
+ $url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'§ion=changelog&TB_iframe=true&width=772&height=772' );
+ break;
+ case 'Theme':
+ $url = '';
+ break;
+ }
+
+ if( !empty( $url ) ) {
+ return ''.$name.' ';
+ } else {
+ return $name;
+ }
+
+}
+
+// Only update plugins which are enabled
+function cau_dontUpdatePlugins( $update, $item ) {
+
+ $plugins = plugins_donotupdatelist();
+
+ if ( in_array( $item->slug, $plugins ) ) {
+ return false; // Don't update these plugins
+ } else {
+ return true; // Always update these plugins
+ }
+
+
+}
+function cau_dontUpdateThemes( $update, $item ) {
+
+ $themes = themes_donotupdatelist();
+
+ if ( in_array( $item->slug, $themes ) ) {
+ return false; // Don't update these themes
+ } else {
+ return true; // Always update these themes
+ }
+
+
+}
+
+// Get plugin information of repository
+function cau_plugin_info( $slug, $what ) {
+
+ $slug = sanitize_title( $slug );
+ $cau_transient_name = 'cau' . $slug;
+ $cau_info = get_transient( $cau_transient_name );
+
+ if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
+ $cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );
+
+ if ( ! $cau_info or is_wp_error( $cau_info ) ) {
+ return false;
+ }
+
+ set_transient( $cau_transient_name, $cau_info, 3600 );
+
+ switch ( $what ) {
+ case 'versions':
+ return $cau_info->versions;
+ break;
+ case 'version':
+ return $cau_info->version;
+ break;
+ case 'name':
+ return $cau_info->name;
+ break;
+ case 'slug':
+ return $cau_info->slug;
+ break;
+ }
+
+}
+
+// Get list of outdated plugins
+function cau_list_outdated() {
+
+ $outdatedList = array();
+
+ foreach ( get_plugins() as $key => $value) {
+
+ $slug = $key;
+ $explosion = explode( '/', $slug );
+ $actualSlug = array_shift( $explosion );
+
+ // Get plugin name
+ foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v;
+
+ // Get plugins tested up to version
+ if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
+ $api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ) ) );
+
+ // Version compare
+ $tested_version = substr( $api->tested, 0, 3 ); // Format version number
+ $current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number
+ $version_difference = ($current_version - $tested_version); // Get the difference
+ // $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) );
+
+ if( $version_difference >= '0.3' ) {
+ $outdatedList[$name] = substr( $api->tested, 0, 3 );
+ }
+
+ }
+
+ return $outdatedList;
+
+}
+
+// Better version compare
+function cau_version_compare( $ver1, $ver2, $operator = null ) {
+ $p = '#(\.0+)+($|-)#';
+ $ver1 = preg_replace( $p, '', $ver1 );
+ $ver2 = preg_replace( $p, '', $ver2 );
+ return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 );
+}
+
+// Get plugin information of currently installed plugins
+function cau_active_plugin_info( $slug, $what ) {
+
+ $allPlugins = get_plugins();
+
+ foreach ($allPlugins as $key => $value) {
+ $thisSlug = explode('/', $key);
+ $thisSlugE = $thisSlug[0];
+ if( $thisSlug == $slug ) {
+
+ if( $what == 'version' ) return $value['Version'];
+
+ }
+ }
+
+}
+
+// Remove update nag when major updates are disabled
+function cau_hideUpdateNag() {
+ if( cau_get_db_value( 'major' ) != 'on' ) {
+ remove_action( 'admin_notices', 'update_nag', 3 );
+ remove_action( 'network_admin_notices', 'maintenance_nag', 10 );
+ }
+}
+add_action( 'admin_head', 'cau_hideUpdateNag', 100 );
+
+// Add more intervals to event schedules
+function cau_addMoreIntervals( $schedules ) {
+
+ // Add a weekly interval.
+ $schedules['weekly'] = array(
+ 'interval' => 604800,
+ 'display' => __( 'Once Weekly', 'companion-auto-update' ),
+ );
+
+ // Add a twice montly interval.
+ $schedules['twice_monthly'] = array(
+ 'interval' => 1317600,
+ 'display' => __( 'Twice a month', 'companion-auto-update' ),
+ );
+
+ // Add a montly interval.
+ $schedules['once_monthly'] = array(
+ 'interval' => 2635200,
+ 'display' => __( 'Once a month', 'companion-auto-update' ),
+ );
+
+ return $schedules;
+
+}
+add_filter( 'cron_schedules', 'cau_addMoreIntervals' );
+
+// Get only unique schedules
+function cau_wp_get_schedules() {
+
+ // Start variables
+ $availableIntervals = wp_get_schedules();
+ $array_unique = array();
+ $intervalTimes = array();
+ $intervalNames = array();
+ $intervalUniques = array();
+ $counter = 0;
+
+ // Get all intervals
+ foreach ( $availableIntervals as $key => $value ) {
+
+ // Do a bunch of checks to format them the right way
+ foreach ( $value as $display => $interval ) {
+
+ if( $display == 'display' ) {
+ $intervalNames[$counter] = $interval; // Add the display name (i.e. "Once a month" or "Once Daily")
+ $counter++; // Make sure the next interval gets a new "key" value
+ } else {
+ if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, requires by a bunch of handles of this plugin
+ $intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily")
+ $intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items
+ }
+
+ }
+
+ }
+
+ // Prevent duplicates
+ foreach ( array_unique( $intervalUniques ) as $key => $value ) {
+ // $value is the timestamp
+ // $intervalTimes[$key] is the backend name
+ // $intervalNames[$key] is the display name
+ $array_unique[$intervalTimes[$key]] = $intervalNames[$key];
+ }
+
+ // Return the array
+ return $array_unique;
+
+}
+
+// Check if the update log db is empty
+function cau_updateLogDBisEmpty() {
+
+ global $wpdb;
+ $updateDB = "update_log";
+ $updateLog = $wpdb->prefix.$updateDB;
+ $row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" );
+
+ if( $row_count > 0 ) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+// Plugin information to DB
+function cau_savePluginInformation( $method = 'New' ) {
+
+ global $wpdb;
+ $updateDB = "update_log";
+ $updateLog = $wpdb->prefix.$updateDB;
+ $allPlugins = get_plugins();
+ $allThemes = wp_get_themes();
+
+ // Loop trough all themes
+ foreach ( $allThemes as $key => $value ) {
+ if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
+ }
+
+ // Loop trough all plugins
+ foreach ( $allPlugins as $key => $value ) {
+ if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
+ }
+
+ // Core
+ if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) );
+
+}
+
+function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) {
+
+ global $wpdb;
+ $updateDB = "update_log";
+ $updateLog = $wpdb->prefix.$updateDB;
+ $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) );
+
+}
+
+function cau_siteHealthSignature() {
+ return ''.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'
';
+}
+
+function cau_add_siteHealthTest( $tests ) {
+ $tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' );
+ return $tests;
+}
+add_filter( 'site_status_tests', 'cau_add_siteHealthTest' );
+
+function cau_disabled_test() {
+
+ $result = array(
+ 'label' => __( 'Auto updating is enabled', 'companion-auto-update' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf( '%s
', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ),
+ 'actions' => '',
+ 'test' => 'cau_disabled',
+ );
+
+ if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) {
+ $result['status'] = 'critical';
+ $result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' );
+ $result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' );
+ $result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' );
+ $result['actions'] .= sprintf( '%s ', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) );
+ }
+
+ $result['actions'] .= cau_siteHealthSignature();
+
+ return $result;
+}
+
+// Check for version control
+function cau_test_is_vcs_checkout( $context ) {
+
+ $context_dirs = array( ABSPATH );
+ $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
+ $check_dirs = array();
+ $result = array();
+
+ foreach ( $context_dirs as $context_dir ) {
+ // Walk up from $context_dir to the root.
+ do {
+ $check_dirs[] = $context_dir;
+
+ // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
+ if ( $context_dir == dirname( $context_dir ) )
+ break;
+
+ // Continue one level at a time.
+ } while ( $context_dir = dirname( $context_dir ) );
+ }
+
+ $check_dirs = array_unique( $check_dirs );
+
+ // Search all directories we've found for evidence of version control.
+ foreach ( $vcs_dirs as $vcs_dir ) {
+ foreach ( $check_dirs as $check_dir ) {
+ if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
+ break 2;
+ }
+ }
+ }
+
+ if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) {
+ $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "$check_dir
", "automatic_updates_is_vcs_checkout
" );
+ $result['icon'] = 'warning';
+ $result['status'] = 'info';
+ } else if ( $checkout ) {
+ $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "$check_dir
", "$vcs_dir
" );
+ $result['icon'] = 'no';
+ $result['status'] = 'disabled';
+ } else {
+ $result['description'] = __( 'No issues detected' , 'companion-auto-update' );
+ $result['icon'] = 'yes-alt';
+ $result['status'] = 'enabled';
+ }
+
+ return $result;
+}
+
+// Check if plugins need to be delayed
+function cau_check_delayed() {
+ if( cau_get_db_value( 'update_delay' ) == 'on' ) {
+ cau_hold_updates();
+ cau_unhold_updates();
+ } else {
+ cau_unhold_all_updates();
+ }
+}
+
+// List of all delayed plugins
+function cau_delayed_updates() {
+
+ global $wpdb;
+ $plugin_list = array();
+ $updateLog = $wpdb->prefix."update_log";
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
+ foreach ( $put_on_hold as $plugin ) {
+ array_push( $plugin_list, $plugin->slug );
+ }
+ return $plugin_list;
+
+}
+
+// List of all delayed plugins for the update function
+function cau_delayed_updates__formated() {
+
+ $plugin_list = array();
+ foreach ( cau_delayed_updates() as $plugin ) {
+ $explosion = explode( '/', $plugin );
+ $short_slug = array_shift( $explosion );
+ array_push( $plugin_list, $short_slug );
+ }
+ return $plugin_list;
+
+}
+
+// Add "put on hold" timestamp to the database if it hasn't been set yet
+function cau_hold_updates() {
+
+ require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
+ $plugins = get_plugin_updates();
+
+ if ( !empty( $plugins ) ) {
+ $list = array();
+ foreach ( (array)$plugins as $plugin_file => $plugin_data ) {
+ if( !in_array( $plugin_file, cau_delayed_updates() ) ) {
+ global $wpdb;
+ $updateDB = "update_log";
+ $updateLog = $wpdb->prefix.$updateDB;
+ $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) );
+ }
+ }
+ }
+}
+
+// Remove plugins from "put on hold" after x days
+function cau_unhold_updates() {
+
+ if( cau_get_db_value( 'update_delay_days' ) != '' ) {
+ $after_x_days = cau_get_db_value( 'update_delay_days' );
+ } else {
+ $after_x_days = '2';
+ }
+
+ global $wpdb;
+
+ $today = strtotime( "now" );
+ $updateLog = $wpdb->prefix."update_log";
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
+
+ foreach ( $put_on_hold as $plugin ) {
+
+ $plugin_file = $plugin->slug;
+ $put_on_hold_date = $plugin->put_on_hold;
+ $remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date );
+
+ if( $remove_after <= $today ) {
+ $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
+ }
+
+ }
+
+}
+
+// Remove all plugins from "put on hold" if option is disabled
+function cau_unhold_all_updates() {
+ global $wpdb;
+ $updateLog = $wpdb->prefix."update_log";
+ $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
+ foreach ( $put_on_hold as $plugin ) {
+ $plugin_file = $plugin->slug;
+ $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
+ }
+}
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/companion-auto-update.php b/wp-content/plugins/companion-auto-update/companion-auto-update.php
new file mode 100644
index 0000000..367b879
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/companion-auto-update.php
@@ -0,0 +1,442 @@
+get_col( "SELECT blog_id FROM $wpdb->blogs" );
+ foreach ( $blog_ids as $blog_id ) {
+ switch_to_blog( $blog_id );
+ cau_database_creation();
+ restore_current_blog();
+ }
+ } else {
+ cau_database_creation();
+ }
+ if (! wp_next_scheduled ( 'cau_set_schedule_mail' )) wp_schedule_event( time(), 'daily', 'cau_set_schedule_mail'); // Set schedule for mail etc.
+ if (! wp_next_scheduled ( 'cau_custom_hooks_plugins' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_plugins'); // Run custom hooks on plugin updates
+ if (! wp_next_scheduled ( 'cau_custom_hooks_themes' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_themes'); // Run custom hooks on theme updates
+ if (! wp_next_scheduled ( 'cau_log_updater' )) wp_schedule_event( ( time() - 1800 ), 'daily', 'cau_log_updater'); // Keep the log up to date
+}
+add_action( 'cau_set_schedule_mail', 'cau_check_updates_mail' );
+add_action( 'wp_update_plugins', 'cau_run_custom_hooks_p' );
+add_action( 'wp_update_themes', 'cau_run_custom_hooks_t' );
+add_action( 'wp_version_check', 'cau_run_custom_hooks_c' );
+
+// Hourly event to keep the log up to date
+function cau_keep_log_uptodate() {
+ cau_savePluginInformation(); // Check for new plugins and themes
+ cau_check_delayed(); // Check for plugin delays
+}
+add_action( 'cau_log_updater', 'cau_keep_log_uptodate' );
+
+// Redirect to welcome screen on activation of plugin
+function cau_pluginActivateWelcome() {
+ add_option( 'cau_redirectToWelcomeScreen', true );
+}
+register_activation_hook(__FILE__, 'cau_pluginActivateWelcome');
+
+function cau_pluginRedirectWelcomeScreen() {
+ if ( get_option( 'cau_redirectToWelcomeScreen', false ) ) {
+ delete_option( 'cau_redirectToWelcomeScreen' );
+ if( !isset( $_GET['activate-multi'] ) ) {
+ wp_redirect( admin_url( cau_menloc().'?page=cau-settings&welcome=1' ) );
+ }
+ }
+}
+add_action( 'admin_init', 'cau_pluginRedirectWelcomeScreen' );
+
+// Donate url
+function cau_donateUrl() {
+ return 'https://www.paypal.me/dakel/10/';
+}
+
+// Database version
+function cau_db_version() {
+ return '3.7.0';
+}
+function cau_database_creation() {
+
+ global $wpdb;
+
+ $cau_db_version = cau_db_version();
+ $autoupdates = $wpdb->prefix."auto_updates";
+ $updateLog = $wpdb->prefix."update_log";
+
+ // Create db table
+ $sql = "CREATE TABLE $autoupdates (
+ id INT(9) NOT NULL AUTO_INCREMENT,
+ name VARCHAR(255) NOT NULL,
+ onoroff TEXT NOT NULL,
+ UNIQUE KEY id (id)
+ )";
+
+ // Create second db table
+ $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)
+ )";
+
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
+ dbDelta( $sql );
+ dbDelta( $sql2 );
+
+ // Database version
+ add_option( "cau_db_version", "$cau_db_version" );
+
+ // Insert data
+ cau_install_data();
+
+}
+
+// Check if database table exists before creating
+function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_updates' ) {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix.$db_table;
+
+ $rows = $wpdb->get_col( "SELECT COUNT(*) as num_rows FROM {$table_name} WHERE {$id} = '{$whattocheck}'" );
+ $check = $rows[0];
+
+ if( $check > 0 ) {
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+// Insert date into database
+function cau_install_data() {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+ $toemail = get_option('admin_email');
+
+ // Update configs
+ if( !cau_check_if_exists( 'plugins' ) ) $wpdb->insert( $table_name, array( 'name' => 'plugins', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'themes' ) ) $wpdb->insert( $table_name, array( 'name' => 'themes', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'minor' ) ) $wpdb->insert( $table_name, array( 'name' => 'minor', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'major' ) ) $wpdb->insert( $table_name, array( 'name' => 'major', 'onoroff' => '' ) );
+
+ // Email configs
+ if( !cau_check_if_exists( 'email' ) ) $wpdb->insert( $table_name, array( 'name' => 'email', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'send' ) ) $wpdb->insert( $table_name, array( 'name' => 'send', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'sendupdate' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendupdate', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'sendoutdated' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendoutdated', 'onoroff' => '' ) );
+
+ // Advanced
+ if( !cau_check_if_exists( 'notUpdateList' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateList', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'translations' ) ) $wpdb->insert( $table_name, array( 'name' => 'translations', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'wpemails' ) ) $wpdb->insert( $table_name, array( 'name' => 'wpemails', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'notUpdateListTh' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateListTh', 'onoroff' => '' ) );
+
+ // Stuff
+ if( !cau_check_if_exists( 'html_or_text' ) ) $wpdb->insert( $table_name, array( 'name' => 'html_or_text', 'onoroff' => 'html' ) );
+
+ // Advanced
+ if( !cau_check_if_exists( 'allow_administrator' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_administrator', 'onoroff' => 'on' ) );
+ if( !cau_check_if_exists( 'allow_editor' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_editor', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'allow_author' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_author', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'ignore_seo' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_seo', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'ignore_cron' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_cron', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'advanced_info_emails' ) ) $wpdb->insert( $table_name, array( 'name' => 'advanced_info_emails', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'update_delay' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay', 'onoroff' => '' ) );
+ if( !cau_check_if_exists( 'update_delay_days' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay_days', 'onoroff' => '' ) );
+
+}
+register_activation_hook( __FILE__, 'cau_install' );
+
+// Clear everything on deactivation
+function cau_remove() {
+
+ // Delete tables
+ global $wpdb;
+ $autoupdates = $wpdb->prefix."auto_updates";
+ $updateLog = $wpdb->prefix."update_log";
+ $wpdb->query( "DROP TABLE IF EXISTS $autoupdates" );
+ $wpdb->query( "DROP TABLE IF EXISTS $updateLog" );
+
+ // Clear schedules
+ wp_clear_scheduled_hook( 'cau_set_schedule_mail' );
+ wp_clear_scheduled_hook( 'cau_custom_hooks_plugins' );
+ wp_clear_scheduled_hook( 'cau_custom_hooks_themes' );
+ wp_clear_scheduled_hook( 'cau_log_updater' );
+
+ // Restore WordPress default update functionality
+ add_filter( 'plugins_auto_update_enabled', '__return_true' );
+ add_filter( 'themes_auto_update_enabled', '__return_true' );
+ add_filter( 'auto_plugin_update_send_email', '__return_true' );
+ add_filter( 'auto_theme_update_send_email', '__return_true' );
+}
+register_deactivation_hook( __FILE__, 'cau_remove' );
+
+// Update
+function cau_update_db_check() {
+ $cau_db_version = cau_db_version();
+ if ( get_site_option( 'cau_db_version' ) != $cau_db_version ) {
+ cau_database_creation();
+ update_option( "cau_db_version", $cau_db_version );
+ }
+}
+add_action( 'upgrader_process_complete', 'cau_update_db_check' );
+
+// Manual update
+function cau_manual_update() {
+ cau_update_db_check();
+}
+
+// Load custom functions
+require_once( plugin_dir_path( __FILE__ ) . 'cau_functions.php' );
+
+// Add plugin to menu
+function register_cau_menu_page() {
+ 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' );
+}
+add_action( 'admin_menu', 'register_cau_menu_page' );
+
+// Settings page
+function cau_frontend() { ?>
+
+
+
+
+
+
+
+ __( 'Dashboard' ),
+ 'pluginlist' => __( 'Update filter', 'companion-auto-update' ),
+ 'log' => __( 'Update log', 'companion-auto-update' ),
+ 'status' => __( 'Status', 'companion-auto-update' ),
+ );
+
+ // Show subtabs
+ echo "
";
+
+ // Show page content
+ if( !isset( $_GET['tab'] ) ) {
+ $requestedPage = 'dashboard';
+ echo ""; // Set active tab class
+ } else {
+ $requestedPage = sanitize_key( $_GET['tab'] );
+ }
+
+ if( array_key_exists( $requestedPage, $allowedPages ) ) {
+ require_once( plugin_dir_path( __FILE__ ) . 'admin/'.$requestedPage.'.php' );
+ } else {
+ wp_die( 'You\'re not allowed to view
'.$requestedPage.' .' );
+ }
+
+ ?>
+
+
+
+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; } ';
+ echo ''.__('Below are the last 7 updates ran on this site. Includes plugins and themes, both automatically updated and manually updated.', 'companion-auto-update').'
';
+ cau_fetch_log( '7' );
+ echo '
+ '.__('View full changelog', 'companion-auto-update').'
+ |
+ '.__( 'Settings' ).'
+
';
+
+}
+
+// Load admin styles
+function load_cau_global_styles( $hook ) {
+
+ // Plugin scripts
+ wp_enqueue_style( 'cau_admin_styles', plugins_url( 'backend/style.css' , __FILE__ ) );
+
+ // Check for issues
+ wp_enqueue_style( 'cau_warning_styles', plugins_url( 'backend/warningbar.css' , __FILE__ ) );
+
+}
+add_action( 'admin_enqueue_scripts', 'load_cau_global_styles', 99 );
+
+// Load admin styles
+function load_cau_page_styles( $hook ) {
+
+ // Only load on plugins' pages
+ if( $hook != 'tools_page_cau-settings' && $hook != 'index_page_cau-settings' ) return;
+
+ // WordPress scripts we need
+ wp_enqueue_style( 'thickbox' );
+ wp_enqueue_script( 'thickbox' );
+ wp_enqueue_script( 'plugin-install' );
+
+}
+add_action( 'admin_enqueue_scripts', 'load_cau_page_styles', 100 );
+
+// Send e-mails
+require_once( plugin_dir_path( __FILE__ ) . 'cau_emails.php' );
+
+// Add settings link on plugin page
+function cau_settings_link( $links ) {
+
+ $settings_link = ''.__( 'Settings' ).' ';
+ $settings_link2 = ''.__( 'Help us translate', 'companion-auto-update' ).' ';
+ $settings_link3 = ''.__( 'Donate to help development', 'companion-auto-update' ).' ';
+
+ array_unshift( $links, $settings_link2 );
+ array_unshift( $links, $settings_link3 );
+ if( cau_allowed_user_rights() ) array_unshift( $links, $settings_link );
+
+ return $links;
+
+}
+$plugin = plugin_basename(__FILE__);
+add_filter( "plugin_action_links_$plugin", "cau_settings_link" );
+
+// Auto Update Class
+class CAU_auto_update {
+
+ public function __construct() {
+
+ // Enable Update filters
+ add_action( 'plugins_loaded', array( &$this, 'CAU_auto_update_filters' ), 1 );
+
+ }
+
+ public function CAU_auto_update_filters() {
+
+ global $wpdb;
+ $table_name = $wpdb->prefix . "auto_updates";
+
+ // Disable WP emails
+ add_filter( 'auto_plugin_update_send_email', '__return_false' ); // Plugin updates
+ add_filter( 'auto_theme_update_send_email', '__return_false' ); // Theme updates
+
+ // Enable for major updates
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'major'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) add_filter( 'allow_major_auto_core_updates', '__return_true', 1 ); // Turn on
+ else add_filter( 'allow_major_auto_core_updates', '__return_false', 1 ); // Turn off
+ }
+
+ // Enable for minor updates
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'minor'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) add_filter( 'allow_minor_auto_core_updates', '__return_true', 1 ); // Turn on
+ else add_filter( 'allow_minor_auto_core_updates', '__return_false', 1 ); // Turn off
+ }
+
+ // Enable for plugins
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'plugins'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) add_filter( 'auto_update_plugin', 'cau_dontUpdatePlugins', 10, 2 ); // Turn on
+ else add_filter( 'auto_update_plugin', '__return_false', 1 ); // Turn off
+ }
+
+ // Enable for themes
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'themes'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) add_filter( 'auto_update_theme', '__return_true' ); // Turn on
+ else add_filter( 'auto_update_theme', '__return_false', 1 ); // Turn off
+ }
+
+ // Enable for translation files
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'translations'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) add_filter( 'auto_update_translation', '__return_true', 1 ); // Turn on
+ else add_filter( 'auto_update_translation', '__return_false', 1 ); // Turn off
+ }
+
+ // WP Email Config
+ $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'wpemails'");
+ foreach ( $configs as $config ) {
+ if( $config->onoroff == 'on' ) {
+ add_filter( 'auto_core_update_send_email', '__return_true' ); // Core updates
+ } else {
+ add_filter( 'auto_core_update_send_email', '__return_false' ); // Core updates
+ }
+ }
+
+
+ }
+
+}
+new CAU_auto_update();
+
+// Check for issues
+function cau_checkForIssues( $admin_bar ) {
+
+ if( cau_pluginHasIssues() && is_admin() ) {
+
+ if( cau_pluginIssueLevels() == 'high' ) {
+ $cauWaningBarTitle = __( 'Companion Auto Update ran into a critical error. View the status log for more info.', 'companion-auto-update' );
+
+ $admin_bar->add_menu( array(
+ 'id' => 'cau-has-issues',
+ 'title' => ''.cau_pluginIssueCount().' ',
+ 'href' => cau_url( 'status' ),
+ 'meta' => array(
+ 'target' => '_self',
+ 'title' => $cauWaningBarTitle,
+ ),
+ ));
+
+ }
+
+ }
+
+}
+add_action( 'admin_bar_menu', 'cau_checkForIssues', 150 );
diff --git a/wp-content/plugins/companion-auto-update/index.php b/wp-content/plugins/companion-auto-update/index.php
new file mode 100644
index 0000000..ef5b27f
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/index.php
@@ -0,0 +1,2 @@
+\n"
+"Language-Team: LANGUAGE \n"
+
+#: companion_portfolio.php:96
+msgid "Auto Updater"
+msgstr ""
+
+#: companion_portfolio.php:122
+msgid "Auto update plugins?"
+msgstr ""
+
+#: companion_portfolio.php:122
+msgid "Auto update themes?"
+msgstr ""
+
+#: companion_portfolio.php:122
+msgid "Auto update minor core updates?"
+msgstr ""
+
+#: companion_portfolio.php:122
+msgid "Auto update major core updates?"
+msgstr ""
+
+#: companion_portfolio.php:125
+msgid "Settings saved"
+msgstr ""
+
+#: companion_portfolio.php:125
+msgid "Settings"
+msgstr ""
+
+#. Plugin Name of the plugin/theme
+msgid "Companion Auto Update"
+msgstr ""
+
+#. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
+#. Plugin URI of the plugin/theme
+#. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-#
+#. Author URI of the plugin/theme
+msgid "https://qreative-web.com"
+msgstr ""
+
+#. Description of the plugin/theme
+msgid ""
+"This plugin auto updates all plugins, all themes and the wordpress core."
+msgstr ""
+
+#. Author of the plugin/theme
+msgid "Qreative-Web"
+msgstr ""
\ No newline at end of file
diff --git a/wp-content/plugins/companion-auto-update/languages/index.php b/wp-content/plugins/companion-auto-update/languages/index.php
new file mode 100644
index 0000000..26e7a54
--- /dev/null
+++ b/wp-content/plugins/companion-auto-update/languages/index.php
@@ -0,0 +1,4 @@
+ Auto Updater
+
+== Frequently Asked Questions ==
+
+= Check our website for the FAQ =
+
+[https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/](https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/)
+
+= What features can I expect to see in the future? =
+
+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/)
+
+= What's the difference between WordPress 5.5 and this plugin? =
+
+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.
+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.
+
+[You can read this blogpost here](https://codeermeneer.nl/blog/wordpress-5-5-versus-companion-auto-update/)
+
+
+== Screenshots ==
+
+1. Full control over what to update and when to recieve notifications
+2. Disable auto-updating for certain plugins and/or themes
+3. Advanced scheduling options for updating and notifcations
+4. Keep track of updates with the update log
+
+== Changelog ==
+
+= 3.7.1.1 (November 2, 2020) =
+* Fix: Type in wp_next_scheduled
+
+= 3.7.1 (October 30, 2020) =
+* Fix: PHP Warning: strtotime() expects parameter 2 to be integer, string given
+
+= 3.7 (September 8, 2020) =
+* New: Delay updates with an x number of days
+* New: Be notified of plugins that have not been tested with the latest 3 major releases of WordPress.
+* New: Choose to see more info in the emails (like the time at which the update happened)
+* Fix: "Contact for support" button will work again
+* Fix: Fixed a few PHP errors
+* Tweak: Made improvements to the "Fix it" button for the "All automatic updates are disabled" error.
+* Tweak: You can now choose to ignore the "Search Engine Visibility" and "Cronjobs" warnings
+* Tweak: Reports on the Site Health page will only show a summary and point to the status page for more information and possible fixes
+* Tweak: Removed cronjob check and Search Engine Visibility check from site health
+* Tweak: E-mails are now fully translatable
+* Tweak: Renamed Core notifications to WordPress notifications
+* Tweak: WordPress plugin and theme update notifications are now disabled
+
+Also: Check out what features we're working on at [our blogpost](https://codeermeneer.nl/blog/companion-auto-update-and-its-future/)
+
+= 3.6 (August 12, 2020) =
+* New: Added an "after core update" hook [More info](https://codeermeneer.nl/documentation/codex-auto-updater/)
+* New: Select which userroles can access settings. (Defaults to only administrators)
+* Tweak: Added Theme and Core update method the log
+* Tweak: Few WordPress 5.5 improvements
+
+= 3.5.5 (August 5, 2020) =
+* Fix: Added better multisite support
+* Tweak: We've added a bunch more checks to the status page and you can now see more passed checks.
+* Support for WordPress 5.5
+
+= 3.5.4.1 (June 20, 2020) =
+* Fix: Sometimes the hour settings for intervals wouldn't show up
+
+= 3.5.4 (June 19, 2020) =
+* New: See translations in the update log
+* New: We've added a few checks to WordPress' Site Health page
+* Fix: Error with Companion Auto Update Database Update
+* Fix: Schedule interval duplicates
+
+= 3.5.3 (June 5, 2020) =
+* 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)
+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/)
+* Fix: Not able to see checks in boxes (reverted back to before it all went wrong)
+* Fix: Error date_default_timezone_set(): Timezone ID +00:00 is invalid
+* Tweak: The status tab will no longer show turned-off settings as an error
+* 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.
+
+= 3.5.2 (April 1, 2020) =
+* Fix: Not able to see checks in boxes
+
+= 3.5.1 (March 25, 2020) =
+* 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.
+* Tweak: We've added the release notes link to Plain text emails
+* Tweak: Fixed a few typos
+* Tweak: Various minor security improvements
+
+= 3.5.0 (March 5, 2020) =
+* 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
+* Fix: We've 'fixed an issue where on occasion nothing would update
+* Tweak: Made some improvements to the "Fix it" button for the AUTOMATIC_UPDATER_DISABLED error
+* 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.
+* 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.
+
+[View full changelog](https://codeermeneer.nl/stuffs/auto-updater-changelog/)
\ No newline at end of file