]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/finishaddopenid.php
change controlyourself.ca to status.net
[quix0rs-gnu-social.git] / actions / finishaddopenid.php
index 78aa67d89e039f5b6f3b3f7ffa5179a2910c949a..f8d88587d584f18058bb497ad6ec75b1ddb65435 100644 (file)
@@ -1,9 +1,12 @@
 <?php
-/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
+/**
+ * StatusNet, the distributed open-source microblogging tool
  *
- * This program is free software: you can redistribute it and/or modify
+ * Complete adding an OpenID
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Settings
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2008-2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/openid.php';
+
+/**
+ * Complete adding an OpenID
+ *
+ * Handle the return from an OpenID verification
+ *
+ * @category Settings
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
  */
 
-if (!defined('LACONICA')) { exit(1); }
-
-require_once(INSTALLDIR.'/lib/openid.php');
-
-class FinishaddopenidAction extends Action {
-
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_t('Not logged in.'));
-               } else {
-                       $this->try_login();
-               }
-       }
-
-       function try_login() {
-
-               $consumer =& oid_consumer();
-
-               $response = $consumer->complete(common_local_url('finishaddopenid'));
-
-               if ($response->status == Auth_OpenID_CANCEL) {
-                       $this->message(_t('OpenID authentication cancelled.'));
-                       return;
-               } else if ($response->status == Auth_OpenID_FAILURE) {
-                       // Authentication failed; display the error message.
-                       $this->message(_t('OpenID authentication failed: ') . $response->message);
-               } else if ($response->status == Auth_OpenID_SUCCESS) {
-                       
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $display;
-
-                       $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
-
-                       if ($sreg_resp) {
-                               $sreg = $sreg_resp->contents();
-                       }
-
-                       $cur =& common_current_user();
-                       $other = $this->get_user($canonical);
-                       
-                       if ($other) {
-                               if ($other->id == $cur->id) {
-                                       $this->message(_t('You already have this OpenID!'));
-                               } else {
-                                       $this->message(_t('Someone else already has this OpenID.'));
-                               }
-                               return;
-                       }
-
-                       # start a transaction
-                       
-                       $cur->query('BEGIN');
-                       
-                       $result = oid_link_user($cur->id, $display, $canonical);
-                       
-                       if (!$result) {
-                               $this->message(_t('Error connecting user.'));
-                               return;
-                       }
-                       if ($sreg) {
-                               if (!$this->update_user($cur, $sreg)) {
-                                       $this->message(_t('Error updating profile'));
-                                       return;
-                               }
-                       }
-                       
-                       # success!
-                       
-                       $cur->query('COMMIT');
-
-                       oid_set_last($display);
-                       
-                       common_redirect(common_local_url('openidsettings'));
-               }
-       }
-
-       function message($msg) {
-               common_show_header(_t('OpenID Login'));
-               common_element('p', NULL, $msg);
-               common_show_footer();
-       }
-
-       function get_user($canonical) {
-               $user = NULL;
-               $oid = User_openid::staticGet('canonical', $canonical);
-               if ($oid) {
-                       $user = User::staticGet('id', $oid->user_id);
-               }
-               return $user;
-       }
-
-       function update_user(&$user, $sreg) {
-
-               $profile =& $user->getProfile();
-
-               $orig_profile = clone($profile);
-
-               if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
-                       $profile->fullname = $sreg['fullname'];
-               }
-
-               if ($sreg['country']) {
-                       if ($sreg['postcode']) {
-                               # XXX: use postcode to get city and region
-                               # XXX: also, store postcode somewhere -- it's valuable!
-                               $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
-                       } else {
-                               $profile->location = $sreg['country'];
-                       }
-               }
-
-               # XXX save language if it's passed
-               # XXX save timezone if it's passed
-
-               if (!$profile->update($orig_profile)) {
-                       common_server_error(_t('Error saving the profile.'));
-                       return false;
-               }
-
-               $orig_user = clone($user);
-
-               if ($sreg['email'] && Validate::email($sreg['email'], true)) {
-                       $user->email = $sreg['email'];
-               }
-
-               if (!$user->update($orig_user)) {
-                       common_server_error(_t('Error saving the user.'));
-                       return false;
-               }
-               
-               return true;
-       }
+class FinishaddopenidAction extends Action
+{
+    var $msg = null;
+
+    /**
+     * Handle the redirect back from OpenID confirmation
+     *
+     * Check to see if the user's logged in, and then try
+     * to use the OpenID login system.
+     *
+     * @param array $args $_REQUEST arguments
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            $this->clientError(_('Not logged in.'));
+        } else {
+            $this->tryLogin();
+        }
+    }
+
+    /**
+     * Try to log in using OpenID
+     *
+     * Check the OpenID for validity; potentially store it.
+     *
+     * @return void
+     */
+
+    function tryLogin()
+    {
+        $consumer =& oid_consumer();
+
+        $response = $consumer->complete(common_local_url('finishaddopenid'));
+
+        if ($response->status == Auth_OpenID_CANCEL) {
+            $this->message(_('OpenID authentication cancelled.'));
+            return;
+        } else if ($response->status == Auth_OpenID_FAILURE) {
+            // Authentication failed; display the error message.
+            $this->message(sprintf(_('OpenID authentication failed: %s'),
+                                   $response->message));
+        } else if ($response->status == Auth_OpenID_SUCCESS) {
+
+            $display   = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $display;
+
+            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+
+            if ($sreg_resp) {
+                $sreg = $sreg_resp->contents();
+            }
+
+            $cur =& common_current_user();
+
+            $other = oid_get_user($canonical);
+
+            if ($other) {
+                if ($other->id == $cur->id) {
+                    $this->message(_('You already have this OpenID!'));
+                } else {
+                    $this->message(_('Someone else already has this OpenID.'));
+                }
+                return;
+            }
+
+            // start a transaction
+
+            $cur->query('BEGIN');
+
+            $result = oid_link_user($cur->id, $canonical, $display);
+
+            if (!$result) {
+                $this->message(_('Error connecting user.'));
+                return;
+            }
+            if ($sreg) {
+                if (!oid_update_user($cur, $sreg)) {
+                    $this->message(_('Error updating profile'));
+                    return;
+                }
+            }
+
+            // success!
+
+            $cur->query('COMMIT');
+
+            oid_set_last($display);
+
+            common_redirect(common_local_url('openidsettings'), 303);
+        }
+    }
+
+    /**
+     * Show a failure message
+     *
+     * Something went wrong. Save the message, and show the page.
+     *
+     * @param string $msg Error message to show
+     *
+     * @return void
+     */
+
+    function message($msg)
+    {
+        $this->message = $msg;
+        $this->showPage();
+    }
+
+    /**
+     * Title of the page
+     *
+     * @return string title
+     */
+
+    function title()
+    {
+        return _('OpenID Login');
+    }
+
+    /**
+     * Show error message
+     *
+     * @return void
+     */
+
+    function showPageNotice()
+    {
+        if ($this->message) {
+            $this->element('p', 'error', $this->message);
+        }
+    }
 }