Merge commit 'origin/master' into account
[platal.git] / include / googleapps.inc.php
index e6d6943..bb78823 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
 function post_queue_u_create($job) {
     global $globals;
 
-    // Retrieves the user parameters (userid and forlife).
+    // Retrieves the user parameters (GoogleApps username and user_id).
     $parameters = json_decode($job['j_parameters'], true);
-    $forlife = isset($parameters['username']) ? $parameters['username'] : null;
-    $userid = $job['q_recipient_id'];
-    if (!$forlife || !$userid) {
+    $username = isset($parameters['username']) ? $parameters['username'] : null;
+    if (!($user = User::getSilent($username))) {
         return;
     }
 
     // Adds a redirection to the Google Apps delivery address, if requested by
     // the user at creation time.
-    $account = new GoogleAppsAccount($userid, $forlife);
+    $account = new GoogleAppsAccount($user);
     if ($account->activate_mail_redirection) {
         require_once('emails.inc.php');
-        $storage = new MailStorageGoogleApps($userid);
-        $storage->enable();
+        $storage = new EmailStorage($user, 'googleapps');
+        $storage->activate();
     }
 
     // Sends the 'account created' email to the user, with basic documentation.
-    $res = XDB::query(
-        "SELECT  FIND_IN_SET('femme', u.flags), prenom
-           FROM  auth_user_md5 AS u
-     INNER JOIN  aliases AS a ON (a.id = u.user_id)
-          WHERE  a.alias = {?}",
-        $forlife);
-    list($sexe, $prenom) = $res->fetchOneRow();
-
     $mailer = new PlMailer('googleapps/create.mail.tpl');
     $mailer->assign('account', $account);
-    $mailer->assign('email', $forlife . '@' . $globals->mail->domain);
+    $mailer->assign('email', $user->bestEmail());
     $mailer->assign('googleapps_domain', $globals->mailstorage->googleapps_domain);
-    $mailer->assign('prenom', $prenom);
-    $mailer->assign('sexe', $sexe);
+    $mailer->assign('prenom', $user->displayName());
+    $mailer->assign('sexe', $user->isFemale());
     $mailer->send();
 }
 
@@ -66,36 +57,27 @@ function post_queue_u_update($job) {
     // to the Google Apps delivery address, provided the account is active (it might
     // have been deleted between the unsuspension and the post-queue processing).
     $parameters = json_decode($job['j_parameters'], true);
-    $forlife = isset($parameters['username']) ? $parameters['username'] : null;
-    $userid = $job['q_recipient_id'];
-    if (!$forlife || !$userid) {
+    $username = isset($parameters['username']) ? $parameters['username'] : null;
+    if (!($user = User::getSilent($username))) {
         return;
     }
 
     if (isset($parameters['suspended']) && $parameters['suspended'] == false) {
         require_once('emails.inc.php');
-        $account = new GoogleAppsAccount($userid, $forlife);
+        $account = new GoogleAppsAccount($user);
         if ($account->active()) {
             // Re-adds the email redirection (if the user did request it).
             if ($account->activate_mail_redirection) {
-                $storage = new MailStorageGoogleApps($userid);
-                $storage->enable();
+                $storage = new EmailStorage($user, 'googleapps');
+                $storage->activate();
             }
 
             // Sends an email to the account owner.
-            $res = XDB::query(
-                "SELECT  FIND_IN_SET('femme', u.flags), prenom
-                   FROM  auth_user_md5 AS u
-             INNER JOIN  aliases AS a ON (a.id = u.user_id)
-                  WHERE  a.alias = {?}",
-                $forlife);
-            list($sexe, $prenom) = $res->fetchOneRow();
-
             $mailer = new PlMailer('googleapps/unsuspend.mail.tpl');
             $mailer->assign('account', $account);
-            $mailer->assign('email', $forlife . '@' . $globals->mail->domain);
-            $mailer->assign('prenom', $prenom);
-            $mailer->assign('sexe', $sexe);
+            $mailer->assign('email', $user->bestEmail());
+            $mailer->assign('prenom', $user->displayName());
+            $mailer->assign('sexe', $user->isFemale());
             $mailer->send();
         }
     }
@@ -107,8 +89,8 @@ function post_queue_u_update($job) {
 // TODO(vincent.zanotti): add the url of gappsd, when available.
 class GoogleAppsAccount
 {
-    // User identification: user id, and forlife.
-    private $uid;
+    // User identification: user id, and hruid.
+    private $user;
     public $g_account_name;
 
     // Local account parameters.
@@ -116,6 +98,7 @@ class GoogleAppsAccount
     public $activate_mail_redirection;
 
     // Account status, obtained from Google Apps provisioning & reporting APIs.
+    public $g_account_id;
     public $g_status;
     public $g_suspension;
     public $r_disk_usage;
@@ -124,6 +107,9 @@ class GoogleAppsAccount
     public $r_last_webmail;
     public $reporting_date;
 
+    // Nicknames (aliases) registered for that user, lazily loaded.
+    public $nicknames;
+
     // Pending requests in the gappsd job queue (cf. top note).
     public $pending_create;
     public $pending_delete;
@@ -138,29 +124,30 @@ class GoogleAppsAccount
 
     // Constructs the account object, by retrieving all informations from the
     // GApps account table, from GApps job queue, and from plat/al validation queue.
-    public function __construct($uid, $account_name = NULL)
+    public function __construct(User &$user)
     {
-        if ($account_name == NULL) {
-            require_once 'user.func.inc.php';
-            $account_name = get_user_forlife($uid, '_silent_user_callback');
+        $this->user = &$user;
+        if (!$this->user || !$this->user->login()) {
+            return;
         }
 
-        $this->uid = $uid;
-        $this->g_account_name = $account_name;
+        // TODO: switch to multi-domain Google Apps, and use $this->user->forlifeEmail()
+        // as Google Apps idenfiant (requires changes in gappsd).
+        $this->g_account_name = $this->user->login();
         $this->g_status = NULL;
 
         $res = XDB::query(
             "SELECT  l_sync_password, l_activate_mail_redirection,
-                     g_account_name, g_status, g_suspension, r_disk_usage,
+                     g_account_name, g_account_id, g_status, g_suspension, r_disk_usage,
                      UNIX_TIMESTAMP(r_creation) as r_creation,
                      UNIX_TIMESTAMP(r_last_login) as r_last_login,
                      UNIX_TIMESTAMP(r_last_webmail) as r_last_webmail
                FROM  gapps_accounts
-              WHERE  g_account_name = {?}",
-            $account_name);
+              WHERE  g_account_name = {?}", $this->g_account_name);
         if ($account = $res->fetchOneAssoc()) {
             $this->sync_password = $account['l_sync_password'];
             $this->activate_mail_redirection = $account['l_activate_mail_redirection'];
+            $this->g_account_id = $account['g_account_id'];
             $this->g_status = $account['g_status'];
             $this->g_suspension = $account['g_suspension'];
             $this->r_disk_usage = $account['r_disk_usage'];
@@ -190,8 +177,7 @@ class GoogleAppsAccount
                FROM  gapps_queue
               WHERE  q_recipient_id = {?} AND
                      p_status IN ('idle', 'active', 'softfail')
-           GROUP BY  j_type",
-            $this->uid);
+           GROUP BY  j_type", $this->user->id());
         $pending = $res->fetchOneAssoc();
         $this->pending_create = $pending['pending_create'];
         $this->pending_update = $pending['pending_update'];
@@ -209,7 +195,7 @@ class GoogleAppsAccount
     {
         require_once('validations.inc.php');
         $this->pending_validation_unsuspend =
-            Validate::get_typed_requests_count($this->uid, 'gapps-unsuspend');
+            Validate::get_typed_requests_count($this->user->id(), 'gapps-unsuspend');
     }
 
     // Retrieves all the pending update job in the gappsd queue for the current
@@ -222,8 +208,7 @@ class GoogleAppsAccount
                FROM  gapps_queue
               WHERE  q_recipient_id = {?} AND
                      p_status IN ('idle', 'active', 'softfail') AND
-                     j_type = 'u_update'",
-            $this->uid);
+                     j_type = 'u_update'", $this->user->id());
         while ($update = $res->next()) {
             $update_data = json_decode($update["j_parameters"], true);
 
@@ -242,7 +227,7 @@ class GoogleAppsAccount
     // Creates a queue job of the @p type, for the user represented by this
     // GoogleAppsAccount object, using @p parameters. @p parameters is supposed
     // to be a one-dimension array of key-value mappings.
-    // The created job as a 'normal' priority, and is scheduled for immediate
+    // The created job as a 'immediate' priority, and is scheduled for immediate
     // execution.
     private function create_queue_job($type, $parameters) {
         $parameters["username"] = $this->g_account_name;
@@ -250,10 +235,10 @@ class GoogleAppsAccount
             "INSERT  INTO gapps_queue
                 SET  q_owner_id = {?}, q_recipient_id = {?},
                      p_entry_date = NOW(), p_notbefore_date = NOW(),
-                     p_priority = 'normal',
+                     p_priority = 'immediate',
                      j_type = {?}, j_parameters = {?}",
             S::v('uid'),
-            $this->uid,
+            $this->user->id(),
             $type,
             json_encode($parameters));
     }
@@ -278,6 +263,21 @@ class GoogleAppsAccount
         return $this->g_status == 'disabled';
     }
 
+    // Loads and returns the list of nicknames for the user.
+    public function nicknames()
+    {
+        if ($this->nicknames == null) {
+            $res = XDB::query(
+                "SELECT  g_nickname
+                   FROM  gapps_nicknames
+                  WHERE  g_account_name = {?}
+               ORDER BY  g_nickname",
+                $this->g_account_name);
+            $this->nicknames = $res->fetchColumn();
+        }
+        return $this->nicknames;
+    }
+
 
     // Changes the GoogleApps password.
     public function set_password($password) {
@@ -287,6 +287,7 @@ class GoogleAppsAccount
 
         if (!$this->pending_update_password) {
             $this->create_queue_job('u_update', array('password' => $password));
+            $this->pending_update_password = true;
         }
     }
 
@@ -316,6 +317,11 @@ class GoogleAppsAccount
         if (!$this->pending_update_suspension) {
             $this->create_queue_job('u_update', array('suspended' => true));
             $this->pending_update_suspension = true;
+            XDB::execute(
+                "UPDATE  gapps_accounts
+                    SET  g_status = 'disabled'
+                  WHERE  g_account_name = {?} AND g_status = 'active'",
+                $this->g_account_name);
         }
     }
 
@@ -336,7 +342,7 @@ class GoogleAppsAccount
 
         if (!$this->pending_update_suspension && !$this->pending_validation_unsuspend) {
             require_once('validations.inc.php');
-            $unsuspend = new GoogleAppsUnsuspendReq($this->uid);
+            $unsuspend = new GoogleAppsUnsuspendReq($this->user);
             $unsuspend->submit();
             $this->pending_validation_unsuspend = true;
         }
@@ -351,18 +357,7 @@ class GoogleAppsAccount
 
         if (!$this->pending_update_suspension) {
             if ($this->sync_password) {
-                $res = XDB::query(
-                    "SELECT  password
-                       FROM  auth_user_md5
-                      WHERE  user_id = {?}",
-                    $this->uid);
-                $password = ($res->numRows() > 0 ? $res->fetchOneCell() : false);
-            } else {
-                $password = false;
-            }
-
-            if ($password) {
-                $this->create_queue_job('u_update', array('suspended' => false, 'password' => $password));
+                $this->create_queue_job('u_update', array('suspended' => false, 'password' => $this->user->password()));
             } else {
                 $this->create_queue_job('u_update', array('suspended' => false));
             }
@@ -373,19 +368,22 @@ class GoogleAppsAccount
     }
 
     // Creates a new Google Apps account with the @p local parameters.
-    public function create($password_sync, $password, $redirect_mails) {
+    public function create($password_sync, $password, $redirect_mails)
+    {
         if ($this->g_status != NULL) {
             return;
         }
 
         if (!$this->pending_create) {
             // Retrieves information on the new account.
-            $res = XDB::query(
-                "SELECT  nom, nom_usage, prenom
-                   FROM  auth_user_md5
-                  WHERE  user_id = {?}",
-                $this->uid);
-            list($nom, $nom_usage, $prenom) = $res->fetchOneRow();
+            // TODO: retreive first_name and last_name from the profile.
+            if (!$user->hasProfile()) {
+                $prenom = $user->displayName();
+                $nom    = $user->fullName();
+            } else {
+                $prenom = $user->profile()->firstName();
+                $nom    = $user->profile()->lastName();
+            }
 
             // Adds an 'unprovisioned' entry in the gapps_accounts table.
             XDB::execute(
@@ -397,12 +395,11 @@ class GoogleAppsAccount
                          g_first_name = {?},
                          g_last_name = {?},
                          g_status = 'unprovisioned'",
-                $this->uid,
+                $this->user->id(),
                 $password_sync,
                 $redirect_mails,
                 $this->g_account_name,
-                $prenom,
-                ($nom_usage ? $nom_usage : $nom));
+                $prenom, $nom);
 
             // Adds the creation job in the GApps queue.
             $this->create_queue_job(
@@ -410,12 +407,12 @@ class GoogleAppsAccount
                 array(
                     'username' => $this->g_account_name,
                     'first_name' => $prenom,
-                    'last_name' => ($nom_usage ? $nom_usage : $nom),
+                    'last_name' => $nom,
                     'password' => $password,
                 ));
 
             // Updates the GoogleAppsAccount status.
-            $this->__construct($this->uid, $this->g_account_name);
+            $this->__construct($this->user);
         }
     }
 
@@ -436,7 +433,7 @@ class GoogleAppsAccount
             "SELECT  g_admin
                FROM  gapps_accounts
               WHERE  l_userid = {?} AND g_status = 'active'", $uid);
-        return ($res->numRows() > 0 ? (bool)$res->fetchOneRow() : false);
+        return ($res->numRows() > 0 ? (bool)$res->fetchOneCell() : false);
     }
 }