From 9aa90fc14e6f1e6f43b9ca17ff1b14d2dac094b4 Mon Sep 17 00:00:00 2001 From: Lai Power Date: Fri, 6 Nov 2020 15:42:39 +0000 Subject: [PATCH] installed plugin `Companion Auto Update` version 3.7.1.1 --- .../companion-auto-update/admin/dashboard.php | 616 ++++++++ .../companion-auto-update/admin/log.php | 19 + .../admin/pluginlist.php | 185 +++ .../companion-auto-update/admin/rollback.php | 2 + .../companion-auto-update/admin/status.php | 404 +++++ .../backend/images/check.svg | 55 + .../backend/images/email.svg | 96 ++ .../backend/images/help.svg | 67 + .../backend/images/interval.svg | 69 + .../backend/images/love.svg | 116 ++ .../backend/images/settings.svg | 124 ++ .../backend/images/support.svg | 102 ++ .../backend/images/update.svg | 91 ++ .../backend/images/welcome.svg | 181 +++ .../companion-auto-update/backend/style.css | 546 +++++++ .../backend/warningbar.css | 11 + .../companion-auto-update/cau_emails.php | 468 ++++++ .../companion-auto-update/cau_functions.php | 1375 +++++++++++++++++ .../companion-auto-update.php | 442 ++++++ .../plugins/companion-auto-update/index.php | 2 + .../languages/companion-auto-update.pot | 62 + .../companion-auto-update/languages/index.php | 4 + .../plugins/companion-auto-update/readme.txt | 150 ++ 23 files changed, 5187 insertions(+) create mode 100644 wp-content/plugins/companion-auto-update/admin/dashboard.php create mode 100644 wp-content/plugins/companion-auto-update/admin/log.php create mode 100644 wp-content/plugins/companion-auto-update/admin/pluginlist.php create mode 100644 wp-content/plugins/companion-auto-update/admin/rollback.php create mode 100644 wp-content/plugins/companion-auto-update/admin/status.php create mode 100644 wp-content/plugins/companion-auto-update/backend/images/check.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/email.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/help.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/interval.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/love.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/settings.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/support.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/update.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/images/welcome.svg create mode 100644 wp-content/plugins/companion-auto-update/backend/style.css create mode 100644 wp-content/plugins/companion-auto-update/backend/warningbar.css create mode 100644 wp-content/plugins/companion-auto-update/cau_emails.php create mode 100644 wp-content/plugins/companion-auto-update/cau_functions.php create mode 100644 wp-content/plugins/companion-auto-update/companion-auto-update.php create mode 100644 wp-content/plugins/companion-auto-update/index.php create mode 100644 wp-content/plugins/companion-auto-update/languages/companion-auto-update.pot create mode 100644 wp-content/plugins/companion-auto-update/languages/index.php create mode 100644 wp-content/plugins/companion-auto-update/readme.txt 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 '

'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' – + '.__( 'We need you to update to the latest database version', 'companion-auto-update' ).'. '.__( 'Run updater now', 'companion-auto-update' ).'

'; +} + +// Update log DB is empty +if ( cau_updateLogDBisEmpty() ) { + echo '

'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' – + '.__( 'We need to add some information to your database', 'companion-auto-update' ).'. '.__( 'Run updater now', 'companion-auto-update' ).'

'; +} + +// 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 '
+
+
+ +

'.__( 'Welcome to Companion Auto Update', 'companion-auto-update' ).'

+
+

'.__( 'You\'re set and ready to go', 'companion-auto-update' ).'

+

'.__( 'The plugin is all set and ready to go with the recommended settings, but if you\'d like you can change them below.' ).'

+
+

'.__( 'Get Started' ).': '.__( 'Update filter', 'companion-auto-update' ).'   |   + '.__( 'More Actions' ).': '.__('Give feedback', 'companion-auto-update').' - '.__( 'Help us translate', 'companion-auto-update' ).'

+ +
+
'; +} + +$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(); + +?> + +
+ +
+ +
+ +

+ + + + + +
+
+ +

'; + + echo '

'; + + echo '

'; + + echo '

'; + + echo '

'; + + ?> + +
+
+ +
+ + + +
+ +

+ +
+ +

+

+ +

+
> + + + +
+ +
+ : +
+ +
+ + daily.', 'companion-auto-update'); ?> - + +
+ +
+ +
+ +

+

+ +

+
> + + + +
+ +
+ : +
+ +
+ + daily.', 'companion-auto-update'); ?> - + +
+
+ +
+ +

+

+ +

+
> + + + +
+ +
+ : +
+ +
+ + daily.', 'companion-auto-update'); ?> - + +
+
+ +
+ +

+

+ +

+
> + + + +
+ +
+ : +
+ +
+ + + +
+
+ +
+
+ +
+ +

+ + + + + + + + + + + + > + + + + +
+

+

+

+
+

+
+ +

+
+ +
+ + + + +
+ +
+ +
+
+

+
    +
  • +
  • +
+ +

+
    +
  • +
  • +
  • +
+
+
+

+
    +
  • +
+
+
+ +
+
+

+

+

+

+
+
+ +
+

+

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 ) ).'.

'; +} + + +?> + +
+ +
+ + +
+ + + + + + + + + + + + + + $value ) { + + $slug = $key; + $explosion = explode( '/', $slug ); + $actualSlug = array_shift( $explosion ); + $slug_hash = md5( $slug[0] ); + + if( $filter == 'themes' ) { + + $theme = wp_get_theme( $actualSlug ); + $name = $theme->get( 'Name' ); + $description = $theme->get( 'Description' ); + + } else { + + foreach ( $value as $k => $v ) { + + if( $k == "Name" ) $name = $v; + if( $k == "Description" ) $description = $v; + + } + + } + + if( in_array( $actualSlug, donotupdatelist( $filter ) ) ) { + + $class = 'inactive'; + $checked = 'CHECKED'; + $statusicon = 'no'; + $statusName = 'disabled'; + + } else { + + $class = 'active'; + $checked = ''; + $statusicon = 'yes'; + $statusName = 'enabled'; + } + + echo ' + + + + + + + + + + '; + + } + ?> + + +
 
+ + +
+
+

'. $name .'

+ '.$actualSlug.' +
+

'.__( 'Auto Updater', 'companion-auto-update' ).':

+
+

'.$description.'

+
+ + + +
+ + +
+ +
\ 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 "

$__ignored

"; + } + + } + + + + // 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 ) -
+ + + + + + + + + + + + + $value ) { + if( is_plugin_active( $key ) ) { + echo ' + + + + '; + } + } + ?> + + +
'.$key.''.$value.''.__( 'How to fix this', 'companion-auto-update' ).'
+ + + + + + + + + + + + + + + +
+
Toggle
+ + +
+ + + +
+ + $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 "

$melding

"; + +} + +?> \ 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 .= "
  1. $value
  2. "; + } 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 .= "
    1. + ".$pluginNames[$key]."
      + ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]." ".__( "Release notes", "companion-auto-update" )." + ".$more_info." +
    2. "; + + } 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 .= "
    3. ".$themeNames[$key]."".$more_info."
    4. "; + + } 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 ' + + '; + if( !$translations ) echo ''; + echo ' + + + + '; + + } + + 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 ''; + + 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 ''; + echo ''; + + } + + echo ''; + + if( $format == 'table' ) { + echo ''; + } + + echo ''; + + $loopings++; + + } + + } + + echo "
'.__( 'Name', 'companion-auto-update' ).''.__( 'To version', 'companion-auto-update' ).''.__( 'Type', 'companion-auto-update' ).''.__( 'Last updated on', 'companion-auto-update' ).''.__( 'Update method', 'companion-auto-update' ).'

'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'

'. $pluginVersion[$key] .'

'. $thisType .'

'. $pluginDatesF[$key] .'

'. $method[$key] .'

"; + +} + +// 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