Index: cron.php
===================================================================
RCS file: /cvs/drupal/drupal/cron.php,v
retrieving revision 1.36
diff -u -r1.36 cron.php
--- cron.php	9 Aug 2006 07:42:55 -0000	1.36
+++ cron.php	20 Feb 2008 16:21:13 -0000
@@ -8,4 +8,7 @@
 
 include_once './includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
-drupal_cron_run();
+global $user;
+if ($user->uid == 1 || (isset($_GET['cron_key']) && variable_get('cron_key', 'drupal') == $_GET['cron_key'])) {
+  drupal_cron_run();
+}
\ No newline at end of file
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.239
diff -u -r1.239 system.install
--- modules/system/system.install	20 Feb 2008 13:46:41 -0000	1.239
+++ modules/system/system.install	20 Feb 2008 16:21:14 -0000
@@ -169,12 +169,15 @@
         $description = $t('Cron has not run recently.') .' '. $help;
       }
     }
+    
+    $description .= ' '. $t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/reports/status/run-cron')));
+    $description .= '<br />'. $t('To run cron from outside the site, go to <a href="!cron">!cron</a>', array('!cron' => url('cron.php', array('absolute' => true, 'query' => 'cron_key='. variable_get('cron_key', 'drupal')))));
 
     $requirements['cron'] = array(
       'title' => $t('Cron maintenance tasks'),
       'severity' => $severity,
       'value' => $summary,
-      'description' => $description .' '. $t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/reports/status/run-cron'))),
+      'description' => $description
     );
   }
 
@@ -404,6 +407,26 @@
   db_query("INSERT INTO {variable} (name, value) VALUES ('%s','%s')", 'filter_html_1', 'i:1;');
 
   db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", 'node_options_forum', 'a:1:{i:0;s:6:"status";}');
+
+  // Copied from user.module::user_password but length hardcoded to 20 characters
+  
+  $allowable_characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
+
+  // Zero-based count of characters in the allowable list:
+  $len = strlen($allowable_characters) - 1;
+
+  // Declare the password as a blank string.
+  $cron_key = '';
+
+  // Loop the number of times specified by $length.
+  for ($i = 0; $i < 20; $i++) {
+
+    // Each iteration, pick a random character from the
+    // allowable string and append it to the password:
+    $cron_key .= $allowable_characters[mt_rand(0, $len)];
+  }
+  
+  db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", 'cron_key', serialize($cron_key));
 }
 
 /**
