=== modified file 'modules/user/user.install'
--- modules/user/user.install	2007-11-04 14:33:06 +0000
+++ modules/user/user.install	2007-11-22 15:37:20 +0000
@@ -282,3 +282,9 @@ function user_schema() {
   return $schema;
 }
 
+function user_update_1() {
+  $ret = array();
+  // pgsql only has a two op concat.
+  $ret[] = update_sql('UPDATE {users} SET pass = MD5(CONCAT(CONCAT(pass, init), created))');
+  return $ret;
+}

=== modified file 'modules/user/user.module'
--- modules/user/user.module	2007-11-20 13:44:38 +0000
+++ modules/user/user.module	2007-11-22 15:38:45 +0000
@@ -149,7 +149,8 @@ function user_load($array = array()) {
       $params[] = $value;
     }
     else if ($key == 'pass') {
-      $query[] = "pass = '%s'";
+      // postgresql only has a two op concat.
+      $query[] = "pass = MD5(CONCAT(CONCAT('%s', init), created))";
       $params[] = md5($value);
     }
     else {
@@ -202,7 +203,8 @@ function user_save($account, $array = ar
   if (is_object($account) && $account->uid) {
     user_module_invoke('update', $array, $account, $category);
     $query = '';
-    $data = unserialize(db_result(db_query('SELECT data FROM {users} WHERE uid = %d', $account->uid)));
+    $old_account = db_fetch_object(db_query('SELECT data, init, created FROM {users} WHERE uid = %d', $account->uid));
+    $data = unserialize($old_account->data);
     // Consider users edited by an administrator as logged in, if they haven't
     // already, so anonymous users can view the profile (if allowed).
     if (empty($array['access']) && empty($account->access) && user_access('administer users')) {
@@ -211,7 +213,7 @@ function user_save($account, $array = ar
     foreach ($array as $key => $value) {
       if ($key == 'pass' && !empty($value)) {
         $query .= "$key = '%s', ";
-        $v[] = md5($value);
+        $v[$key] = md5($value);
       }
       else if ((substr($key, 0, 4) !== 'auth') && ($key != 'pass')) {
         if (in_array($key, $user_fields)) {
@@ -230,6 +232,11 @@ function user_save($account, $array = ar
         }
       }
     }
+    if (isset($values['pass'])) {
+      $init = isset($values['init']) ? $values['init'] : $old_account->init;
+      $created = isset($values['created']) ? $values['created'] : $old_account->created;
+      $values['pass'] = md5($values['pass'] . $init . $created);
+    }
     $query .= "data = '%s' ";
     $v[] = serialize($data);
 
@@ -287,25 +294,28 @@ function user_save($account, $array = ar
       switch ($key) {
         case 'pass':
           $fields[] = $key;
-          $values[] = md5($value);
+          $values[$key] = md5($value);
           $s[] = "'%s'";
           break;
         case 'mode':       case 'sort':     case 'timezone':
         case 'threshold':  case 'created':  case 'access':
         case 'login':      case 'status':
           $fields[] = $key;
-          $values[] = $value;
+          $values[$key] = $value;
           $s[] = "%d";
           break;
         default:
           if (substr($key, 0, 4) !== 'auth' && in_array($key, $user_fields)) {
             $fields[] = $key;
-            $values[] = $value;
+            $values[$key] = $value;
             $s[] = "'%s'";
           }
           break;
       }
     }
+    if (isset($values['pass'])) {
+      $values['pass'] = md5($values['pass'] . (isset($values['init']) ? $values['init'] : '') . $values['created']);
+    }
     db_query('INSERT INTO {users} ('. implode(', ', $fields) .') VALUES ('. implode(', ', $s) .')', $values);
     $array['uid'] = db_last_insert_id('users', 'uid');
 

