123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832 |
- <?php
- function update_get_projects() {
- $projects = &drupal_static(__FUNCTION__, array());
- if (empty($projects)) {
-
- $projects = update_project_cache('update_project_projects');
- if (empty($projects)) {
-
- $module_data = system_rebuild_module_data();
- $theme_data = system_rebuild_theme_data();
- _update_process_info_list($projects, $module_data, 'module', TRUE);
- _update_process_info_list($projects, $theme_data, 'theme', TRUE);
- if (variable_get('update_check_disabled', FALSE)) {
- _update_process_info_list($projects, $module_data, 'module', FALSE);
- _update_process_info_list($projects, $theme_data, 'theme', FALSE);
- }
-
- drupal_alter('update_projects', $projects);
-
- _update_cache_set('update_project_projects', $projects, REQUEST_TIME + 3600);
- }
- }
- return $projects;
- }
- function _update_process_info_list(&$projects, $list, $project_type, $status) {
- foreach ($list as $file) {
-
-
- if ($status && !$file->status && !empty($file->sub_themes)) {
- foreach ($file->sub_themes as $key => $name) {
-
- if ($list[$key]->status) {
- $file->enabled_sub_themes[$key] = $name;
- }
- }
-
-
-
- if (empty($file->enabled_sub_themes)) {
- continue;
- }
- }
-
- elseif ($file->status != $status) {
- continue;
- }
-
- if (empty($file->info)) {
- continue;
- }
-
- if (!empty($file->info['hidden'])) {
- continue;
- }
-
- if (!isset($file->info['project'])) {
- $file->info['project'] = update_get_project_name($file);
- }
-
- if (empty($file->info['project'])) {
- continue;
- }
-
-
-
-
-
-
-
- if (!isset($file->info['_info_file_ctime'])) {
- $info_filename = dirname($file->uri) . '/' . $file->name . '.info';
- $file->info['_info_file_ctime'] = filectime($info_filename);
- }
- if (!isset($file->info['datestamp'])) {
- $file->info['datestamp'] = 0;
- }
- $project_name = $file->info['project'];
-
-
-
-
- if ($project_name == 'drupal') {
- $project_display_type = 'core';
- }
- else {
- $project_display_type = $project_type;
- }
- if (empty($status) && empty($file->enabled_sub_themes)) {
-
-
-
- $project_display_type .= '-disabled';
- }
-
-
- if ($project_name == 'drupal') {
-
- $sub_themes = array();
- $base_themes = array();
- }
- else {
-
- $sub_themes = !empty($file->enabled_sub_themes) ? $file->enabled_sub_themes : array();
-
- $base_themes = !empty($file->base_themes) ? $file->base_themes : array();
- }
- if (!isset($projects[$project_name])) {
-
-
- $projects[$project_name] = array(
- 'name' => $project_name,
-
-
- 'info' => update_filter_project_info($file->info),
- 'datestamp' => $file->info['datestamp'],
- 'includes' => array($file->name => $file->info['name']),
- 'project_type' => $project_display_type,
- 'project_status' => $status,
- 'sub_themes' => $sub_themes,
- 'base_themes' => $base_themes,
- );
- }
- elseif ($projects[$project_name]['project_type'] == $project_display_type) {
-
-
-
-
-
- $projects[$project_name]['includes'][$file->name] = $file->info['name'];
- $projects[$project_name]['info']['_info_file_ctime'] = max($projects[$project_name]['info']['_info_file_ctime'], $file->info['_info_file_ctime']);
- $projects[$project_name]['datestamp'] = max($projects[$project_name]['datestamp'], $file->info['datestamp']);
- if (!empty($sub_themes)) {
- $projects[$project_name]['sub_themes'] += $sub_themes;
- }
- if (!empty($base_themes)) {
- $projects[$project_name]['base_themes'] += $base_themes;
- }
- }
- elseif (empty($status)) {
-
-
-
-
- $projects[$project_name]['disabled'][$file->name] = $file->info['name'];
- }
- }
- }
- function update_get_project_name($file) {
- $project_name = '';
- if (isset($file->info['project'])) {
- $project_name = $file->info['project'];
- }
- elseif (isset($file->info['package']) && (strpos($file->info['package'], 'Core') === 0)) {
- $project_name = 'drupal';
- }
- return $project_name;
- }
- function update_process_project_info(&$projects) {
- foreach ($projects as $key => $project) {
-
- $install_type = 'official';
- $info = $project['info'];
- if (isset($info['version'])) {
-
- if (preg_match('@(dev|HEAD)@', $info['version'])) {
- $install_type = 'dev';
- }
-
-
-
- $matches = array();
- if (preg_match('/^(\d+\.x-)?(\d+)\..*$/', $info['version'], $matches)) {
- $info['major'] = $matches[2];
- }
- elseif (!isset($info['major'])) {
-
-
-
- $info['major'] = -1;
- }
- }
- else {
-
- $install_type = 'unknown';
- $info['version'] = t('Unknown');
- $info['major'] = -1;
- }
-
- $projects[$key]['existing_version'] = $info['version'];
- $projects[$key]['existing_major'] = $info['major'];
- $projects[$key]['install_type'] = $install_type;
- }
- }
- function update_calculate_project_data($available) {
-
- $projects = update_project_cache('update_project_data');
-
-
- if (!empty($projects)) {
- return $projects;
- }
- $projects = update_get_projects();
- update_process_project_info($projects);
- foreach ($projects as $project => $project_info) {
- if (isset($available[$project])) {
- update_calculate_project_update_status($project, $projects[$project], $available[$project]);
- }
- else {
- $projects[$project]['status'] = UPDATE_UNKNOWN;
- $projects[$project]['reason'] = t('No available releases found');
- }
- }
-
-
-
- drupal_alter('update_status', $projects);
-
- _update_cache_set('update_project_data', $projects, REQUEST_TIME + 3600);
- return $projects;
- }
- function update_calculate_project_update_status($unused, &$project_data, $available) {
- foreach (array('title', 'link') as $attribute) {
- if (!isset($project_data[$attribute]) && isset($available[$attribute])) {
- $project_data[$attribute] = $available[$attribute];
- }
- }
-
-
- if (isset($available['project_status'])) {
- switch ($available['project_status']) {
- case 'insecure':
- $project_data['status'] = UPDATE_NOT_SECURE;
- if (empty($project_data['extra'])) {
- $project_data['extra'] = array();
- }
- $project_data['extra'][] = array(
- 'class' => array('project-not-secure'),
- 'label' => t('Project not secure'),
- 'data' => t('This project has been labeled insecure by the Drupal security team, and is no longer available for download. Immediately disabling everything included by this project is strongly recommended!'),
- );
- break;
- case 'unpublished':
- case 'revoked':
- $project_data['status'] = UPDATE_REVOKED;
- if (empty($project_data['extra'])) {
- $project_data['extra'] = array();
- }
- $project_data['extra'][] = array(
- 'class' => array('project-revoked'),
- 'label' => t('Project revoked'),
- 'data' => t('This project has been revoked, and is no longer available for download. Disabling everything included by this project is strongly recommended!'),
- );
- break;
- case 'unsupported':
- $project_data['status'] = UPDATE_NOT_SUPPORTED;
- if (empty($project_data['extra'])) {
- $project_data['extra'] = array();
- }
- $project_data['extra'][] = array(
- 'class' => array('project-not-supported'),
- 'label' => t('Project not supported'),
- 'data' => t('This project is no longer supported, and is no longer available for download. Disabling everything included by this project is strongly recommended!'),
- );
- break;
- case 'not-fetched':
- $project_data['status'] = UPDATE_NOT_FETCHED;
- $project_data['reason'] = t('Failed to get available update data.');
- break;
- default:
-
-
- break;
- }
- }
- if (!empty($project_data['status'])) {
-
-
- $project_data['project_status'] = $available['project_status'];
- return;
- }
-
- $existing_major = $project_data['existing_major'];
- $supported_majors = array();
- if (isset($available['supported_majors'])) {
- $supported_majors = explode(',', $available['supported_majors']);
- }
- elseif (isset($available['default_major'])) {
-
- $supported_majors[] = $available['default_major'];
- }
- if (in_array($existing_major, $supported_majors)) {
-
- $target_major = $existing_major;
- }
- elseif (isset($available['recommended_major'])) {
-
-
-
-
- $target_major = $available['recommended_major'];
- $project_data['status'] = UPDATE_NOT_SUPPORTED;
- }
- elseif (isset($available['default_major'])) {
-
-
- $target_major = $available['default_major'];
- }
- else {
-
- $target_major = $existing_major;
- }
-
-
-
-
-
-
-
- $target_major = max($existing_major, $target_major);
- $release_patch_changed = '';
- $patch = '';
-
-
-
-
- if (!empty($available['fetch_status']) && $available['fetch_status'] == UPDATE_FETCH_PENDING) {
- $project_data['status'] = UPDATE_FETCH_PENDING;
- $project_data['reason'] = t('No available update data');
- $project_data['fetch_status'] = $available['fetch_status'];
- return;
- }
-
- if (empty($available['releases'])) {
- $project_data['status'] = UPDATE_UNKNOWN;
- $project_data['reason'] = t('No available releases found');
- return;
- }
- foreach ($available['releases'] as $version => $release) {
-
- if ($project_data['existing_version'] === $version) {
- if (isset($release['terms']['Release type']) &&
- in_array('Insecure', $release['terms']['Release type'])) {
- $project_data['status'] = UPDATE_NOT_SECURE;
- }
- elseif ($release['status'] == 'unpublished') {
- $project_data['status'] = UPDATE_REVOKED;
- if (empty($project_data['extra'])) {
- $project_data['extra'] = array();
- }
- $project_data['extra'][] = array(
- 'class' => array('release-revoked'),
- 'label' => t('Release revoked'),
- 'data' => t('Your currently installed release has been revoked, and is no longer available for download. Disabling everything included in this release or upgrading is strongly recommended!'),
- );
- }
- elseif (isset($release['terms']['Release type']) &&
- in_array('Unsupported', $release['terms']['Release type'])) {
- $project_data['status'] = UPDATE_NOT_SUPPORTED;
- if (empty($project_data['extra'])) {
- $project_data['extra'] = array();
- }
- $project_data['extra'][] = array(
- 'class' => array('release-not-supported'),
- 'label' => t('Release not supported'),
- 'data' => t('Your currently installed release is now unsupported, and is no longer available for download. Disabling everything included in this release or upgrading is strongly recommended!'),
- );
- }
- }
-
- if ($release['status'] == 'unpublished' ||
- (isset($release['terms']['Release type']) &&
- (in_array('Insecure', $release['terms']['Release type']) ||
- in_array('Unsupported', $release['terms']['Release type'])))) {
- continue;
- }
-
-
-
-
-
- if (isset($release['version_major']) && $release['version_major'] > $target_major) {
- if (in_array($release['version_major'], $supported_majors)) {
- if (!isset($project_data['also'])) {
- $project_data['also'] = array();
- }
- if (!isset($project_data['also'][$release['version_major']])) {
- $project_data['also'][$release['version_major']] = $version;
- $project_data['releases'][$version] = $release;
- }
- }
-
-
-
-
-
-
-
- continue;
- }
-
-
- if (!isset($project_data['latest_version'])
- && $release['version_major'] == $target_major) {
- $project_data['latest_version'] = $version;
- $project_data['releases'][$version] = $release;
- }
-
- if (!isset($project_data['dev_version'])
- && $release['version_major'] == $target_major
- && isset($release['version_extra'])
- && $release['version_extra'] == 'dev') {
- $project_data['dev_version'] = $version;
- $project_data['releases'][$version] = $release;
- }
-
-
- if (!isset($project_data['recommended'])
- && $release['version_major'] == $target_major
- && isset($release['version_patch'])) {
- if ($patch != $release['version_patch']) {
- $patch = $release['version_patch'];
- $release_patch_changed = $release;
- }
- if (empty($release['version_extra']) && $patch == $release['version_patch']) {
- $project_data['recommended'] = $release_patch_changed['version'];
- $project_data['releases'][$release_patch_changed['version']] = $release_patch_changed;
- }
- }
-
- if ($project_data['existing_version'] === $version) {
- break;
- }
-
-
-
-
-
-
- if ($project_data['install_type'] == 'dev') {
- if (empty($project_data['datestamp'])) {
-
- continue;
- }
- elseif (isset($release['date']) && ($project_data['datestamp'] + 100 > $release['date'])) {
-
- continue;
- }
- }
-
- if (isset($release['terms']['Release type'])
- && in_array('Security update', $release['terms']['Release type'])) {
- $project_data['security updates'][] = $release;
- }
- }
-
-
- if (!isset($project_data['recommended']) && isset($project_data['latest_version'])) {
- $project_data['recommended'] = $project_data['latest_version'];
- }
-
-
-
- if (!empty($project_data['security updates'])) {
-
- $project_data['status'] = UPDATE_NOT_SECURE;
- }
- if (isset($project_data['status'])) {
-
- return;
- }
-
-
- if (!isset($project_data['recommended'])) {
- $project_data['status'] = UPDATE_UNKNOWN;
- $project_data['reason'] = t('No available releases found');
- return;
- }
-
-
-
-
- if ($project_data['install_type'] == 'dev') {
- if (isset($project_data['dev_version']) && $available['releases'][$project_data['dev_version']]['date'] > $available['releases'][$project_data['latest_version']]['date']) {
- $project_data['latest_dev'] = $project_data['dev_version'];
- }
- else {
- $project_data['latest_dev'] = $project_data['latest_version'];
- }
- }
-
- switch ($project_data['install_type']) {
- case 'official':
- if ($project_data['existing_version'] === $project_data['recommended'] || $project_data['existing_version'] === $project_data['latest_version']) {
- $project_data['status'] = UPDATE_CURRENT;
- }
- else {
- $project_data['status'] = UPDATE_NOT_CURRENT;
- }
- break;
- case 'dev':
- $latest = $available['releases'][$project_data['latest_dev']];
- if (empty($project_data['datestamp'])) {
- $project_data['status'] = UPDATE_NOT_CHECKED;
- $project_data['reason'] = t('Unknown release date');
- }
- elseif (($project_data['datestamp'] + 100 > $latest['date'])) {
- $project_data['status'] = UPDATE_CURRENT;
- }
- else {
- $project_data['status'] = UPDATE_NOT_CURRENT;
- }
- break;
- default:
- $project_data['status'] = UPDATE_UNKNOWN;
- $project_data['reason'] = t('Invalid info');
- }
- }
- function update_project_cache($cid) {
- $projects = array();
-
-
- $q = $_GET['q'];
- $paths = array(
- 'admin/modules',
- 'admin/modules/update',
- 'admin/appearance',
- 'admin/appearance/update',
- 'admin/reports',
- 'admin/reports/updates',
- 'admin/reports/updates/update',
- 'admin/reports/status',
- 'admin/reports/updates/check',
- );
- if (in_array($q, $paths)) {
- _update_cache_clear($cid);
- }
- else {
- $cache = _update_cache_get($cid);
- if (!empty($cache->data) && $cache->expire > REQUEST_TIME) {
- $projects = $cache->data;
- }
- }
- return $projects;
- }
- function update_filter_project_info($info) {
- $whitelist = array(
- '_info_file_ctime',
- 'datestamp',
- 'major',
- 'name',
- 'package',
- 'project',
- 'project status url',
- 'version',
- );
- return array_intersect_key($info, drupal_map_assoc($whitelist));
- }
|