Index: update_status.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/update_status/update_status.module,v retrieving revision 1.83.2.24 diff -u -p -r1.83.2.24 update_status.module --- update_status.module 1 Dec 2007 04:53:19 -0000 1.83.2.24 +++ update_status.module 22 Dec 2007 20:40:04 -0000 @@ -9,11 +9,15 @@ define('UPDATE_STATUS_CORE_VERSION', '5. define('UPDATE_STATUS_DEFAULT_URL', 'http://updates.drupal.org/release-history'); // These are internally used constants for this code, do not modify. -define('UPDATE_STATUS_CURRENT', 1); // Up to date. -define('UPDATE_STATUS_NOT_SECURE', 2); // Missing security update(s). -define('UPDATE_STATUS_NOT_CURRENT', 3); // New available, but not security. -define('UPDATE_STATUS_NOT_CHECKED', 4); // Can't compare for some reason. -define('UPDATE_STATUS_UNKNOWN', 5); // No available update data. +define('UPDATE_STATUS_NOT_SECURE', 1); // Missing security update(s). +define('UPDATE_STATUS_NOT_AVAILABLE', 2); // Release node unpublished. +define('UPDATE_STATUS_NOT_SUPPORTED', 3); // Release no longer supported. +define('UPDATE_STATUS_NOT_CURRENT', 4); // New available, but not security. +define('UPDATE_STATUS_CURRENT', 5); // Up to date. + +// Error conditions +define('UPDATE_STATUS_NOT_CHECKED', -1); // Can't compare for some reason. +define('UPDATE_STATUS_UNKNOWN', -2); // No available update data. /** * Implementation of hook_help(). @@ -330,13 +334,6 @@ function update_status_requirements($pha if ($available = update_status_get_available(FALSE)) { $data = update_status_calculate_project_data($available); switch ($data['drupal']['status']) { - case UPDATE_STATUS_NOT_CURRENT: - $requirements['update_status_core']['value'] = t('Out of date (version @version available)', array('@version' => $data['drupal']['recommended'])); - $requirements['update_status_core']['severity'] = $notification_level == 'all' ? REQUIREMENT_ERROR : REQUIREMENT_WARNING; - $requirements['update_status_core']['reason'] = UPDATE_STATUS_NOT_CURRENT; - $requirements['update_status_core']['description'] = _update_status_message_text('core', UPDATE_STATUS_NOT_CURRENT, TRUE); - break; - case UPDATE_STATUS_NOT_SECURE: $requirements['update_status_core']['value'] = t('Not secure! (version @version available)', array('@version' => $data['drupal']['recommended'])); $requirements['update_status_core']['severity'] = REQUIREMENT_ERROR; @@ -344,12 +341,32 @@ function update_status_requirements($pha $requirements['update_status_core']['description'] = _update_status_message_text('core', UPDATE_STATUS_NOT_SECURE, TRUE); break; + case UPDATE_STATUS_NOT_AVAILABLE: + $requirements['update_status_core']['value'] = t('Not available! (version @version recommended)', array('@version' => $data['drupal']['recommended'])); + $requirements['update_status_core']['severity'] = REQUIREMENT_ERROR; + $requirements['update_status_core']['reason'] = UPDATE_STATUS_NOT_AVAILABLE; + $requirements['update_status_core']['description'] = _update_status_message_text('core', UPDATE_STATUS_NOT_AVAILABLE, TRUE); + break; + + case UPDATE_STATUS_NOT_SUPPORTED: + // Impossible, core only ever has a single branch. + break; + + case UPDATE_STATUS_NOT_CURRENT: + $requirements['update_status_core']['value'] = t('Out of date (version @version available)', array('@version' => $data['drupal']['recommended'])); + $requirements['update_status_core']['severity'] = $notification_level == 'all' ? REQUIREMENT_ERROR : REQUIREMENT_WARNING; + $requirements['update_status_core']['reason'] = UPDATE_STATUS_NOT_CURRENT; + $requirements['update_status_core']['description'] = _update_status_message_text('core', UPDATE_STATUS_NOT_CURRENT, TRUE); + break; + default: $requirements['update_status_core']['value'] = t('Up to date'); break; } // We don't want to check drupal a second time. unset($data['drupal']); + $not_available = FALSE; + $not_supported = FALSE; $not_current = FALSE; if (!empty($data)) { $requirements['update_status_contrib']['title'] = t('Module update status'); @@ -357,19 +374,43 @@ function update_status_requirements($pha $requirements['update_status_contrib']['value'] = t('Up to date'); foreach (array_keys($data) as $project) { if (isset($available[$project])) { - if ($data[$project]['status'] == UPDATE_STATUS_NOT_SECURE) { - $requirements['update_status_contrib']['value'] = t('Not secure!'); - $requirements['update_status_contrib']['severity'] = REQUIREMENT_ERROR; - $requirements['update_status_contrib']['reason'] = UPDATE_STATUS_NOT_SECURE; - $requirements['update_status_contrib']['description'] = _update_status_message_text('contrib', UPDATE_STATUS_NOT_SECURE, TRUE); - break; - } - elseif ($data[$project]['status'] == UPDATE_STATUS_NOT_CURRENT) { - $not_current = TRUE; + switch ($data[$project]['status']) { + case UPDATE_STATUS_NOT_SECURE: + $requirements['update_status_contrib']['value'] = t('Not secure!'); + $requirements['update_status_contrib']['severity'] = REQUIREMENT_ERROR; + $requirements['update_status_contrib']['reason'] = UPDATE_STATUS_NOT_SECURE; + $requirements['update_status_contrib']['description'] = _update_status_message_text('contrib', UPDATE_STATUS_NOT_SECURE, TRUE); + // This is what we'll print, no need to continue the foreach. + break 2; + case UPDATE_STATUS_NOT_AVAILABLE: + $not_available = TRUE; + break; + case UPDATE_STATUS_NOT_SUPPORTED: + $not_supported = TRUE; + break; + case UPDATE_STATUS_NOT_CURRENT: + $not_current = TRUE; + break; } } } - if (!isset($requirements['update_status_contrib']['severity']) && $not_current) { + // Depending on what we saw, print out the right message. + if (isset($requirements['update_contrib']['severity'])) { + // We already found an insecure project, nothing more to say. + } + elseif ($not_available) { + $requirements['update_status_contrib']['severity'] = REQUIREMENT_ERROR; + $requirements['update_status_contrib']['value'] = t('Unavailable release'); + $requirements['update_status_contrib']['reason'] = UPDATE_STATUS_NOT_AVAILABLE; + $requirements['update_status_contrib']['description'] = _update_message_text('contrib', UPDATE_STATUS_NOT_AVAILABLE, TRUE); + } + elseif ($not_supported) { + $requirements['update_status_contrib']['severity'] = REQUIREMENT_ERROR; + $requirements['update_status_contrib']['value'] = t('Unsupported release'); + $requirements['update_status_contrib']['reason'] = UPDATE_STATUS_NOT_SUPPORTED; + $requirements['update_status_contrib']['description'] = _update_message_text('contrib', UPDATE_STATUS_NOT_SUPPORTED, TRUE); + } + elseif ($not_current) { $requirements['update_status_contrib']['severity'] = $notification_level == 'all' ? REQUIREMENT_ERROR : REQUIREMENT_WARNING; $requirements['update_status_contrib']['value'] = t('Out of date'); $requirements['update_status_contrib']['reason'] = UPDATE_STATUS_NOT_CURRENT; @@ -475,21 +516,37 @@ function update_status_system_submit($fo function _update_status_message_text($msg_type, $msg_reason, $report_link = FALSE) { $text = ''; switch ($msg_reason) { - case UPDATE_STATUS_NOT_CURRENT: + case UPDATE_STATUS_NOT_SECURE: if ($msg_type == 'core') { - $text = t('There are updates available for your version of Drupal. To ensure the proper functioning of your site, you should update as soon as possible.'); + $text = t('There is a security update available for your version of Drupal. To ensure the security of your server, you should update immediately!'); } else { - $text = t('There are updates available for one or more of your modules. To ensure the proper functioning of your site, you should update as soon as possible.'); + $text = t('There are security updates available for one or more of your modules. To ensure the security of your server, you should update immediately!'); } break; - case UPDATE_STATUS_NOT_SECURE: + case UPDATE_STATUS_NOT_AVAILABLE: if ($msg_type == 'core') { - $text = t('There is a security update available for your version of Drupal. To ensure the security of your server, you should update immediately!'); + $text = t('Your version of Drupal is no longer available. Upgrading is highly advised!'); } else { - $text = t('There are security updates available for one or more of your modules. To ensure the security of your server, you should update immediately!'); + $text = t('The installed version of at least one of your modules or themes is no longer available. Upgrading is highly advised!'); + } + break; + + case UPDATE_STATUS_NOT_SUPPORTED: + // Core only ever has a single branch, so this can never happen. + if ($msg_type != 'core') { + $text = t('The installed version of at least one of your modules or themes is no longer supported. Upgrading is highly advised! Please see the project homepage for more details.'); + } + break; + + case UPDATE_STATUS_NOT_CURRENT: + if ($msg_type == 'core') { + $text = t('There are updates available for your version of Drupal. To ensure the proper functioning of your site, you should update as soon as possible.'); + } + else { + $text = t('There are updates available for one or more of your modules. To ensure the proper functioning of your site, you should update as soon as possible.'); } break; } @@ -748,19 +805,48 @@ function update_status_calculate_project if (isset($available[$project])) { // Figure out the target major version. $existing_major = $project_info['existing_major']; - if (isset($available[$project]['default_major'])) { - $default_major = $available[$project]['default_major']; - $target_major = max($existing_major, $default_major); + if (isset($available[$project]['supported_majors']) && + in_array($existing_major, explode(',', $available[$project]['supported_majors']))) { + // Still supported, stay at the current major version. + $target_major = $existing_major; + } + elseif (isset($available[$project]['recommended_major'])) { + // Not supported, so find the best release from the recommended major. + $target_major = $available[$project]['recommended_major']; + } + elseif (isset($available[$project]['default_major'])) { + // Older release history XML file without supported or recommended. + $target_major = $available[$project]['default_major']; } else { + // Malformed XML file? Stick with the current version. $target_major = $existing_major; } + // Make sure we never tell the admin to downgrade. + $target_major = max($existing_major, $target_major); $version_patch_changed = ''; $patch = ''; foreach ($available[$project]['releases'] as $version => $release) { - // Ignore unpublished releases. + // First, if this is the existing release, check a few conditions. + if ($projects[$project]['existing_version'] == $version) { + if (isset($release['terms']) && + isset($release['terms']['Release type']) && + in_array('Insecure', $release['terms']['Release type'])) { + $projects[$project]['status'] = UPDATE_STATUS_NOT_SECURE; + } + elseif ($release['status'] != 'published') { + $projects[$project]['status'] = UPDATE_STATUS_NOT_AVAILABLE; + } + elseif (isset($release['terms']) && + isset($release['terms']['Release type']) && + in_array('Unsupported', $release['terms']['Release type'])) { + $projects[$project]['status'] = UPDATE_STATUS_NOT_SUPPORTED; + } + } + + // Otherwise, ignore unpublished releases. if ($release['status'] != 'published') { continue; } @@ -887,45 +973,41 @@ function update_status_calculate_project continue; } - // Then, check based upon type and site-wide error threshold setting. - $notification_level = variable_get('update_status_notification_threshold', 'all'); - - switch ($projects[$project]['type']) { - case 'official': - if ($projects[$project]['existing_version'] == $projects[$project]['recommended'] || $projects[$project]['existing_version'] == $projects[$project]['latest_version']) { - $projects[$project]['status'] = UPDATE_STATUS_CURRENT; - } - else { - if (!empty($projects[$project]['security updates'])) { - $projects[$project]['status'] = UPDATE_STATUS_NOT_SECURE; + // Figure out the status, based on what we've seen and the install type. + if (isset($projects[$project]['status'])) { + // Already know the status, nothing else to do. + } + elseif (!empty($projects[$project]['security updates'])) { + $projects[$project]['status'] = UPDATE_NOT_SECURE; + } + else { + switch ($projects[$project]['type']) { + case 'official': + if ($projects[$project]['existing_version'] == $projects[$project]['recommended'] || $projects[$project]['existing_version'] == $projects[$project]['latest_version']) { + $projects[$project]['status'] = UPDATE_STATUS_CURRENT; + } + else { + $projects[$project]['status'] = UPDATE_STATUS_NOT_CURRENT; + } + break; + case 'dev': + $latest = $available[$project]['releases'][$projects[$project]['latest_dev']]; + if (empty($projects[$project]['datestamp'])) { + $projects[$project]['status'] = UPDATE_STATUS_NOT_CHECKED; + $projects[$project]['reason'] = t('No filedate available'); + } + elseif (($projects[$project]['datestamp'] + 100 > $latest['date'])) { + $projects[$project]['status'] = UPDATE_STATUS_CURRENT; } else { $projects[$project]['status'] = UPDATE_STATUS_NOT_CURRENT; } - } - break; - case 'dev': - if (!empty($projects[$project]['security updates'])) { - $projects[$project]['status'] = UPDATE_STATUS_NOT_SECURE; break; - } - - $latest = $available[$project]['releases'][$projects[$project]['latest_dev']]; - if (empty($projects[$project]['datestamp'])) { - $projects[$project]['status'] = UPDATE_STATUS_NOT_CHECKED; - $projects[$project]['reason'] = t('No filedate available'); - } - elseif (($projects[$project]['datestamp'] + 100 > $latest['date'])) { - $projects[$project]['status'] = UPDATE_STATUS_CURRENT; - } - else { - $projects[$project]['status'] = UPDATE_STATUS_NOT_CURRENT; - } - break; - default: - $projects[$project]['status'] = UPDATE_STATUS_UNKNOWN; - $projects[$project]['reason'] = t('Invalid info'); + default: + $projects[$project]['status'] = UPDATE_STATUS_UNKNOWN; + $projects[$project]['reason'] = t('Invalid info'); + } } } else { @@ -965,9 +1047,11 @@ function theme_update_status_report($dat $icon = theme('image', 'misc/watchdog-ok.png'); break; case UPDATE_STATUS_NOT_SECURE: + case UPDATE_STATUS_NOT_AVAILABLE: + case UPDATE_STATUS_NOT_SUPPORTED: case UPDATE_STATUS_NOT_CURRENT: if ($notification_level == 'all' - || $project['status'] == UPDATE_STATUS_NOT_SECURE) { + || $project['status'] != UPDATE_STATUS_NOT_CURRENT) { $class = 'error'; $icon = theme('image', 'misc/watchdog-error.png'); break; @@ -981,16 +1065,30 @@ function theme_update_status_report($dat $row = '