? .bakery.module.swp
? .git
Index: bakery.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/bakery/bakery.module,v
retrieving revision 1.52.4.12
diff -u -F '^f' -r1.52.4.12 bakery.module
--- bakery.module	16 Nov 2010 23:25:38 -0000	1.52.4.12
+++ bakery.module	2 Dec 2010 18:34:21 -0000
@@ -1087,62 +1087,83 @@ function bakery_eat_thinmint_cookie() {
  * @return The newly created local UID or FALSE.
  */
 function bakery_request_account($name) {
+  global $base_url;
+
   $existing_account = user_load(array('name' => $name));
-  if (!$existing_account) {
-    $master = variable_get('bakery_master', 'http://drupal.org/');
-    $key = variable_get('bakery_key', '');
+  // We return FALSE in cases that the account already exists locally or if
+  // there was an error along the way of requesting and creating it.
+  if ($existing_account) {
+    return FALSE;
+  }
 
-    $payload = array();
-    $payload['name'] = $name;
-    $payload['timestamp'] = $_SERVER['REQUEST_TIME'];
-    $payload['signature'] = hash_hmac('sha256', $payload['name'] . '/' . $payload['timestamp'], $key);
-    $payload = drupal_query_string_encode(array('gingerbread' => bakery_mix(serialize($payload), 1)));
-    // Make request to master for account information.
-    $result = drupal_http_request($master . 'bakery/create', array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'), 'POST', $payload);
-    // Parse result and create account.
-    if ($result->code != 200) {
-      $message = $result->data;
-      watchdog('bakery', 'Received response !code from master with message @message', array('!code' => $result->code, '@message' => $message), WATCHDOG_ERROR);
-    }
-    else {
-      // Create account.
-      $cookie = unserialize(bakery_mix($result->data, 0));
-      $key = variable_get('bakery_key', '');
-      $signature = hash_hmac('sha256', $cookie['name'] . '/' . $cookie['timestamp'], $key);
-
-      if ($signature == $cookie['signature']) {
-        // Valid response.
-        $new_account = array(
-          'name' => $cookie['name'],
-          'pass' => user_password(),
-          'mail' => $cookie['mail'],
-          'status' => 1,
-          'init' => $master . 'user/' . $cookie['uid'] . '/edit',
-        );
-        // Add any supported sync fields.
-        foreach (variable_get('bakery_supported_fields', array('mail' => 'mail', 'name' => 'name')) as $type => $enabled) {
-          if ($enabled && isset($cookie[$type])) {
-            $new_account[$type] = $cookie[$type];
-          }
-        }
-        // Create account.
-        $account = user_save(NULL, $new_account);
-        if ($account) {
-          watchdog('bakery', 'Created account for @name', array('@name' => $name));
-          return $account->uid;
-        }
-        else {
-          watchdog('bakery', 'Unable to create account for @name', array('@name' => $name), WATCHDOG_ERROR);
-        }
-      }
-      else {
-        // Invalid response.
-        watchdog('bakery', 'Invalid response from master when attempting to create local account for @name', array('@name' => $name), WATCHDOG_ERROR);
-      }
+  $master = variable_get('bakery_master', 'http://drupal.org/');
+  $key = variable_get('bakery_key', '');
+
+  // Save a stub account so we have a slave UID to send.
+  $new_account = array(
+    'name' => $name,
+    'pass' => user_password(),
+    'status' => 0,
+    'init' => 'bakery_temp/' . mt_rand(),
+  );
+  $account = user_save(NULL, $new_account);
+  if (!$account) {
+    watchdog('bakery', 'Unable to create stub account for @name', array('@name' => $name), WATCHDOG_ERROR);
+    return FALSE;
+  }
+
+  $payload = array();
+  $payload['name'] = $name;
+  $payload['slave'] = rtrim($base_url, '/') . '/'; // Match how slaves are set on the master.
+  $payload['uid'] = $account->uid;
+  $payload['timestamp'] = $_SERVER['REQUEST_TIME'];
+  $payload['signature'] = hash_hmac('sha256', $payload['name'] . '/' . $payload['timestamp'], $key);
+  $payload = drupal_query_string_encode(array('gingerbread' => bakery_mix(serialize($payload), 1)));
+  // Make request to master for account information.
+  $result = drupal_http_request($master . 'bakery/create', array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'), 'POST', $payload);
+  // Parse result and create account.
+  if ($result->code != 200) {
+    $message = $result->data;
+    watchdog('bakery', 'Received response !code from master with message @message', array('!code' => $result->code, '@message' => $message), WATCHDOG_ERROR);
+    user_delete(array(), $account->uid);
+    return FALSE;
+  }
+
+  // Create account.
+  $cookie = unserialize(bakery_mix($result->data, 0));
+  $key = variable_get('bakery_key', '');
+  $signature = hash_hmac('sha256', $cookie['name'] . '/' . $cookie['timestamp'], $key);
+
+  if ($signature != $cookie['signature']) {
+    // Invalid response.
+    watchdog('bakery', 'Invalid response from master when attempting to create local account for @name', array('@name' => $name), WATCHDOG_ERROR);
+    user_delete(array(), $account->uid);
+    return FALSE;
+  }
+
+  // Valid response. Fill in details from master.
+  $new_account = array(
+    'name' => $cookie['name'],
+    'pass' => user_password(),
+    'mail' => $cookie['mail'],
+    'status' => 1,
+    'init' => $master . 'user/' . $cookie['uid'] . '/edit',
+  );
+  // Add any supported sync fields.
+  foreach (variable_get('bakery_supported_fields', array('mail' => 'mail', 'name' => 'name')) as $type => $enabled) {
+    if ($enabled && isset($cookie[$type])) {
+      $new_account[$type] = $cookie[$type];
     }
   }
-  // We return FALSE in cases that the account already exists locally or if
-  // there was an error along the way of requesting and creating it.
+  // Create account.
+  $account = user_save($account, $new_account);
+  if ($account) {
+    watchdog('bakery', 'Created account for @name', array('@name' => $name));
+    return $account->uid;
+  }
+
+  watchdog('bakery', 'Unable to create account for @name', array('@name' => $name), WATCHDOG_ERROR);
+  user_delete(array(), $account->uid);
   return FALSE;
 }
 
@@ -1150,10 +1171,10 @@ function bakery_request_account($name) {
  * Validate the account information request.
  */
 function bakery_taste_gingerbread_cookie() {
-  $payload = $_POST['gingerbread'];
   $valid = FALSE;
 
-  if ($payload) {
+  if (isset($_POST['gingerbread'])) {
+    $payload = $_POST['gingerbread'];
     $cookie = unserialize(bakery_mix($payload, 0));
     $key = variable_get('bakery_key', '');
     $signature = hash_hmac('sha256', $cookie['name'] . '/' . $cookie['timestamp'], $key);
@@ -1161,6 +1182,8 @@ function bakery_taste_gingerbread_cookie
     if ($signature == $cookie['signature'] && $cookie['timestamp'] + variable_get('bakery_freshness', '3600') >= $_SERVER['REQUEST_TIME']) {
       $valid = TRUE;
       $_SESSION['bakery']['name'] = $cookie['name'];
+      $_SESSION['bakery']['slave'] = $cookie['slave'];
+      $_SESSION['bakery']['uid'] = $cookie['uid'];
     }
   }
 
@@ -1174,10 +1197,16 @@ function bakery_eat_gingerbread_cookie()
   // Session was set in validate.
   $name = $_SESSION['bakery']['name'];
   unset($_SESSION['bakery']['name']);
+  $slave = $_SESSION['bakery']['slave'];
+  unset($_SESSION['bakery']['slave']);
+  $slave_uid = $_SESSION['bakery']['uid'];
+  unset($_SESSION['bakery']['uid']);
   $key = variable_get('bakery_key', '');
 
   $account = user_load(array('name' => $name));
   if ($account) {
+    _bakery_save_slave_uid($account, $slave, $slave_uid);
+
     $payload = array();
     $payload['name'] = $account->name;
     $payload['mail'] = $account->mail;
