? .bakery.install.swp
? .bakery.module.swp
Index: bakery.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/bakery/Attic/bakery.install,v
retrieving revision 1.1.4.3
diff -u -F '^f' -r1.1.4.3 bakery.install
--- bakery.install	28 Oct 2010 20:40:20 -0000	1.1.4.3
+++ bakery.install	11 Nov 2010 01:54:19 -0000
@@ -1,6 +1,43 @@
 <?php
 // $Id: bakery.install,v 1.1.4.3 2010/10/28 20:40:20 greggles Exp $
 
+function bakery_schema() {
+  return array(
+    'bakery_user' => array(
+      'description' => 'Keep track of UID on subsites, master only.',
+      'fields' => array(
+        'uid' => array(
+          'description' => 'User ID on master site.',
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'slave' => array(
+          'description' => 'Slave site.',
+          'type' => 'varchar',
+          'length' => 128,
+          'not null' => TRUE,
+        ),
+        'slave_uid' => array(
+          'description' => 'User ID on slave site.',
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('uid', 'slave'),
+    ),
+  );
+}
+
+function bakery_install() {
+  drupal_install_schema('bakery');
+}
+
+function bakery_uninstall() {
+  drupal_uninstall_schema('bakery');
+}
+
 /**
  * Delete aliases we no longer needed.
  */
@@ -26,3 +63,37 @@ function bakery_update_6002() {
 
   return $ret;
 }
+
+/**
+ * Add {bakery_user}.
+ */
+function bakery_update_6003() {
+  $return = array();
+
+  db_create_table($return, 'bakery_user', array(
+    'description' => 'Keep track of UID on subsites, master only.',
+    'fields' => array(
+      'uid' => array(
+        'description' => 'User ID on master site.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'slave' => array(
+        'description' => 'Slave site.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+      ),
+      'slave_uid' => array(
+        'description' => 'User ID on slave site.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('uid', 'slave'),
+  ));
+
+  return $return;
+}
Index: bakery.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/bakery/bakery.module,v
retrieving revision 1.52.4.9
diff -u -F '^f' -r1.52.4.9 bakery.module
--- bakery.module	1 Nov 2010 22:31:41 -0000	1.52.4.9
+++ bakery.module	11 Nov 2010 01:54:19 -0000
@@ -150,6 +150,9 @@ function bakery_user($op, &$array, &$acc
           drupal_set_message($message);
         }
         watchdog('bakery', $message);
+
+        // Save UID provided by slave site.
+        _bakery_save_slave_uid($account, $slave, $result->headers['X-Drupal-bakery-UID']);
       }
     }
   }
@@ -294,6 +297,8 @@ function bakery_form_alter(&$form, $form
  * Submit handler for the password reset form.
  */
 function _bakery_reset_submit($form, &$form_state) {
+  global $base_url;
+
   // If we're here it means the user has validated their email correctly.
   $master = variable_get('bakery_master', 'http://drupal.org/');
   $key = variable_get('bakery_key', '');
@@ -305,6 +310,8 @@ function _bakery_reset_submit($form, &$f
   if ($account->login == 0) {
     $payload = array();
     $payload['name'] = $account->name;
+    $payload['slave'] = $base_url;
+    $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('thinmint' => bakery_mix(serialize($payload), 1)));
@@ -970,6 +977,8 @@ function bakery_eat_stroopwafel_cookie()
     $message = t('Account not found on %slave.', array('%slave' => variable_get('site_name', '')));
   }
   else {
+    drupal_set_header('X-Drupal-bakery-UID: ' . $account->uid);
+
     $fields = array();
     foreach (variable_get('bakery_supported_fields', array('mail' => 'mail', 'name' => 'name')) as $type => $value) {
       if ($value) {
@@ -997,10 +1006,10 @@ function bakery_eat_stroopwafel_cookie()
  * Verify the validation request.
  */
 function bakery_taste_thinmint_cookie() {
-  $payload = $_POST['thinmint'];
   $valid = FALSE;
 
-  if ($payload) {
+  if (isset($_POST['thinmint'])) {
+    $payload = $_POST['thinmint'];
     $cookie = unserialize(bakery_mix($payload, 0));
     $key = variable_get('bakery_key', '');
     $signature = hash_hmac('sha256', $cookie['name'] . '/' . $cookie['timestamp'], $key);
@@ -1008,6 +1017,8 @@ function bakery_taste_thinmint_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'];
     }
   }
 
@@ -1021,10 +1032,17 @@ function bakery_eat_thinmint_cookie() {
   // Session was set in validate.
   $name = $_SESSION['bakery']['name'];
   unset($_SESSION['bakery']['name']);
+  $slave = $_SESSION['bakery']['slave'];
+  unset($_SESSION['bakery']['slave']);
+  $uid = $_SESSION['bakery']['uid'];
+  unset($_SESSION['bakery']['uid']);
 
   $account = user_load(array('name' => $name));
   if ($account) {
     db_query("UPDATE {users} SET login = %d WHERE uid = %d", $_SERVER['REQUEST_TIME'], $account->uid);
+
+    // Save UID provided by slave site.
+    _bakery_save_slave_uid($account, $slave, $uid);
   }
 }
 
@@ -1391,3 +1409,24 @@ function bakery_uncrumble_submit($form, 
   drupal_set_message(t('Your account has been repaired.'));
   $form_state['redirect'] = 'user';
 }
+
+/**
+ * Save UID provided by a slave site. Should only be used on the master site.
+ *
+ * @param $account
+ *   A local user object.
+ * @param $slave
+ *   The URL of the slave site.
+ * @param $slave_uid
+ *   The corresponding UID on the slave site.
+ */
+function _bakery_save_slave_uid($account, $slave, $slave_uid) {
+  if (variable_get('bakery_is_master', 0) && !empty($slave_uid) && in_array($slave, variable_get('bakery_slaves', array())) && !db_result(db_query_range("SELECT 1 FROM {bakery_user} WHERE uid = %d AND slave = '%s'", $account->uid, $slave, 0, 1))) {
+    $row = array(
+      'uid' => $account->uid,
+      'slave' => $slave,
+      'slave_uid' => $slave_uid,
+    );
+    drupal_write_record('bakery_user', $row);
+  };
+}
