? sites/default/files
? sites/default/settings.php
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.500
diff -u -p -r1.500 form.inc
--- includes/form.inc	4 Oct 2010 18:00:45 -0000	1.500
+++ includes/form.inc	5 Oct 2010 16:11:57 -0000
@@ -3137,6 +3137,23 @@ function form_pre_render_fieldset($eleme
   return $element;
 }
 
+/*
+ * Returns TRUE if the form has any fields required.
+ *
+ * @param $form
+ *   The form to be checked for required fields.
+ */
+function drupal_form_has_required ($form) {
+  if (isset($form['#required']) && $form['#required']) {
+    return TRUE;
+  }
+  foreach (element_children($form) as $key) {
+    if (drupal_form_has_required($form[$key])) {
+      return TRUE;
+    }
+  }
+}
+
 /**
  * Creates a group formatted as vertical tabs.
  *
@@ -3324,6 +3341,11 @@ function theme_textfield($variables) {
  * @ingroup themeable
  */
 function theme_form($variables) {
+  if (drupal_form_has_required($variables['element'])) {
+    // This is also used in the installer, pre-database setup.
+    $t = get_t();
+    $form_prefix = '<div class="form-required-info"><span class="form-required">*</span>'. $t(' indicates required fields') .'</div>';
+  }
   $element = $variables['element'];
   if (isset($element['#action'])) {
     $element['#attributes']['action'] = drupal_strip_dangerous_protocols($element['#action']);
@@ -3333,7 +3355,7 @@ function theme_form($variables) {
     $element['#attributes']['accept-charset'] = "UTF-8";
   }
   // Anonymous DIV to satisfy XHTML compliance.
-  return '<form' . drupal_attributes($element['#attributes']) . '><div>' . $element['#children'] . '</div></form>';
+  return '<form' . drupal_attributes($element['#attributes']) . '>'. $form_prefix .'<div>' . $element['#children'] . '</div></form>';
 }
 
 /**
