? 407726.patch
? 616490_services_hash_coder_d6.patch
? 626280.patch
Index: services/user_service/user_service.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/services/services/user_service/Attic/user_service.inc,v
retrieving revision 1.1.2.8.2.1
diff -u -p -r1.1.2.8.2.1 user_service.inc
--- services/user_service/user_service.inc	5 Sep 2009 13:57:59 -0000	1.1.2.8.2.1
+++ services/user_service/user_service.inc	24 Nov 2009 01:40:42 -0000
@@ -122,19 +122,67 @@ function user_service_logout() {
  * Save user details.
  *
  * @param $user_data
- *   Object. The user object with all user data.
+ *   The user array with all user data. This can be used to
+ *   save core user data, or alternately profile information, with
+ *   the addition of the 'category' key.
+ * @return
+ *   The user's uid, or a services error.
  */
 function user_service_save($account) {
+  // Needed for drupal_execute().
+  module_load_include('inc', 'node', 'node.pages');
+
   // if uid is present then update, otherwise insert
   $update = user_load($account['uid']);	
-  $account = isset($update->uid) ? user_save($update,$account) : user_save('', $account);  
-  if (!$account) {
-    return services_error(t('Error on saving the user.'), 500);
+  $form_state = array();
+  if (!isset($update->uid)) {
+    // register a new user
+    $form_state['values']['name'] = $account['name'];
+    $form_state['values']['mail'] = $account['mail'];
+    $form_state['values']['pass']['pass1'] = $account['pass'];
+    $form_state['values']['pass']['pass2'] = $account['pass'];
+    $form_state['values']['op'] = t('Create new account');
+    $ret = drupal_execute('user_register', $form_state);
   }
+  else {
+    // Needed for user_profile_form().
+    module_load_include('inc', 'user', 'user.pages');
+
+    // If a profile category was passed in, use it. Otherwise default
+    // to 'account' (for saving core user data.)
+    $category = 'account';
+    if (isset($account['category'])) {
+      $category = $account['category'];
+      unset($account['category']);
+    }
+    
+    // Any logged in user is by default authenticated,
+    // and leaving this role set in the user's roles array
+    // causes big problems because of a FAPI hack that controls
+    // this checkbox. Therefore we just force it to 0 here.
+    if (isset($account['roles'][2])) {
+      $account['roles'][2] = 0;
+    }
 
-  // Everything went right.
-  // Return the user ID
-  return $account->uid;
+    // Drop any passed in values into the $account var. Anything
+    // unused by the form just gets ignored.
+    foreach ($account as $key => $value) {
+      $form_state['values'][$key] = $value;
+    }
+
+    $form_state['values']['op'] = 'Save';
+    $form_state['values']['_category'] = $category;
+    $form_state['values']['_account'] = $account;
+    $ret = drupal_execute('user_profile_form', $form_state, (object) $account, $category);
+  }
+
+  // Error if needed.
+  if ($errors = form_get_errors()) {
+    return services_error(implode("\n", $errors), 401);
+  }
+  else {
+    return $form_state['user']->uid;
+  }
 }
 
 /**
