From f879f4e2f8c81f67b0a0c471c94ebed686939c49 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 14 May 2009 15:26:34 -0400
Subject: [PATCH] Trigger 'create_identity' when creating a new user; Allow 'create_user' hook to abort the operation

---
 program/include/rcmail.php               |    7 +++++++
 program/steps/settings/save_identity.inc |    2 +-
 program/include/rcube_user.php           |   29 +++++++++++++++++++++--------
 3 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 6ed0950..06f50a1 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -491,6 +491,13 @@
         // get existing mailboxes (but why?)
         // $a_mailboxes = $this->imap->list_mailboxes();
       }
+      else {
+        raise_error(array(
+          'code' => 600,
+          'type' => 'php',
+          'message' => "Failed to create a user record. Maybe aborted by a plugin?"
+          ), true, false);        
+      }
     }
     else {
       raise_error(array(
diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php
index 79721d5..da819c7 100644
--- a/program/include/rcube_user.php
+++ b/program/include/rcube_user.php
@@ -353,6 +353,10 @@
     $data = $rcmail->plugins->exec_hook('create_user', array('user'=>$user, 'user_name'=>$user_name, 'user_email'=>$user_email));
     $user_name = $data['user_name'];
     $user_email = $data['user_email'];
+    
+    // plugin aborted this operation
+    if ($data['abort'])
+      return false;
 
     $dbh = $rcmail->get_dbh();
 
@@ -392,14 +396,23 @@
       // create new identities records
       $standard = 1;
       foreach ($email_list as $email) {
-        $dbh->query(
-            "INSERT INTO ".get_table_name('identities')."
-              (user_id, del, standard, name, email)
-             VALUES (?, 0, ?, ?, ?)",
-            $user_id,
-            $standard,
-            strip_newlines($user_name),
-            preg_replace('/^@/', $user . '@', $email));
+        $plugin = $RCMAIL->plugins->exec_hook('create_identity', array('record' => array(
+          'login' => true,
+          'user_id' => $user_id,
+          'name' => strip_newlines($user_name),
+          'email' => $email,
+          'standard' => $standard)));
+          
+        if (!$plugin['abort'] && $plugin['record']['name'] && $plugin['record']['email']) {
+          $dbh->query(
+              "INSERT INTO ".get_table_name('identities')."
+                (user_id, del, standard, name, email)
+               VALUES (?, 0, ?, ?, ?)",
+              $user_id,
+              $plugin['record']['standard'],
+              $plugin['record']['name'],
+              $plugin['record']['email']);
+        }
         $standard = 0;
       }
     }
diff --git a/program/steps/settings/save_identity.inc b/program/steps/settings/save_identity.inc
index 754e86c..900c2d3 100644
--- a/program/steps/settings/save_identity.inc
+++ b/program/steps/settings/save_identity.inc
@@ -92,7 +92,7 @@
   if (IDENTITIES_LEVEL == 1)
     $save_data['email'] = $RCMAIL->user->get_username();
 
-  $plugin = $RCMAIL->plugins->exec_hook('create_identity', array('id' => $iid, 'record' => $save_data));
+  $plugin = $RCMAIL->plugins->exec_hook('create_identity', array('record' => $save_data));
   $save_data = $plugin['record'];
 
   if (!$plugin['abort'] && $save_data['email'] && ($insert_id = $USER->insert_identity($save_data)))

--
Gitblit v1.9.1