]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
Fixes #4764: Twitter login supports persistent and referrer forwarding
authorSteve Clay <steve@mrclay.org>
Mon, 6 Aug 2012 01:03:35 +0000 (21:03 -0400)
committerSteve Clay <steve@mrclay.org>
Mon, 6 Aug 2012 01:03:35 +0000 (21:03 -0400)
actions/login.php
engine/classes/ElggSession.php
mod/twitter_api/lib/twitter_api.php
mod/twitter_api/start.php
mod/twitter_api/views/default/twitter_api/css.php
mod/twitter_api/views/default/twitter_api/js.php [new file with mode: 0644]
mod/twitter_api/views/default/twitter_api/login.php

index ea7fb350877545c83671be5925246040637c9dba..1e5e92ede37b9df7806cd5003a09758dee2d23e6 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 // set forward url
-if (isset($_SESSION['last_forward_from']) && $_SESSION['last_forward_from']) {
+if (!empty($_SESSION['last_forward_from'])) {
        $forward_url = $_SESSION['last_forward_from'];
        unset($_SESSION['last_forward_from']);
 } elseif (get_input('returntoreferer')) {
@@ -19,7 +19,7 @@ if (isset($_SESSION['last_forward_from']) && $_SESSION['last_forward_from']) {
 
 $username = get_input('username');
 $password = get_input('password', null, false);
-$persistent = get_input("persistent", false);
+$persistent = (bool) get_input("persistent");
 $result = false;
 
 if (empty($username) || empty($password)) {
index 13a33736cc555cac0ffd8644a1e0bfda16318020..9750f063ea35b45c89f454ca3c0c80fa55cb0897 100644 (file)
@@ -54,7 +54,7 @@ class ElggSession implements ArrayAccess {
         *
         * @param mixed $key Name
         *
-        * @return void
+        * @return mixed
         */
        function offsetGet($key) {
                if (!ElggSession::$__localcache) {
@@ -98,7 +98,7 @@ class ElggSession implements ArrayAccess {
         *
         * @param int $offset Offset
         *
-        * @return int
+        * @return bool
         */
        function offsetExists($offset) {
                if (isset(ElggSession::$__localcache[$offset])) {
@@ -112,6 +112,8 @@ class ElggSession implements ArrayAccess {
                if ($this->offsetGet($offset)) {
                        return true;
                }
+
+               return false;
        }
 
 
@@ -132,10 +134,10 @@ class ElggSession implements ArrayAccess {
         * @param string $key   Name
         * @param mixed  $value Value
         *
-        * @return mixed
+        * @return void
         */
        function set($key, $value) {
-               return $this->offsetSet($key, $value);
+               $this->offsetSet($key, $value);
        }
 
        /**
@@ -143,9 +145,9 @@ class ElggSession implements ArrayAccess {
         *
         * @param string $key Name
         *
-        * @return bool
+        * @return void
         */
        function del($key) {
-               return $this->offsetUnset($key);
+               $this->offsetUnset($key);
        }
 }
index fbce00d34e88047019e6eb0fef598fe8cd1e2288..81c9c6628ba6d59627aca6625faf1793f23506b2 100644 (file)
@@ -29,6 +29,8 @@ function twitter_api_allow_sign_on_with_twitter() {
  * This includes the login URL as the callback
  */
 function twitter_api_forward() {
+       global $SESSION;
+
        // sanity check
        if (!twitter_api_allow_sign_on_with_twitter()) {
                forward();
@@ -37,6 +39,18 @@ function twitter_api_forward() {
        $callback = elgg_normalize_url("twitter_api/login");
        $request_link = twitter_api_get_authorize_url($callback);
 
+       // capture metadata about login to persist through redirects
+       $login_metadata = array(
+               'persistent' => (bool) get_input("persistent"),
+       );
+       // capture referrer if in site, but not the twitter_api
+       if (!empty($_SERVER['HTTP_REFERER'])
+                       && 0 === strpos($_SERVER['HTTP_REFERER'], elgg_get_site_url())
+                       && 0 !== strpos($_SERVER['HTTP_REFERER'], elgg_get_site_url() . 'twitter_api/')) {
+               $login_metadata['forward'] = $_SERVER['HTTP_REFERER'];
+       }
+       $SESSION['twitter_api_login_metadata'] = $login_metadata;
+
        forward($request_link, 'twitter_api');
 }
 
@@ -55,6 +69,8 @@ function twitter_api_forward() {
  * the Twitter OAuth data.
  */
 function twitter_api_login() {
+       /* @var ElggSession $SESSION */
+       global $SESSION;
 
        // sanity check
        if (!twitter_api_allow_sign_on_with_twitter()) {
@@ -62,6 +78,20 @@ function twitter_api_login() {
        }
 
        $token = twitter_api_get_access_token(get_input('oauth_verifier'));
+
+       $persistent = false;
+       $forward = '';
+
+       // fetch login metadata from session
+       $login_metadata = $SESSION['twitter_api_login_metadata'];
+       unset($SESSION['twitter_api_login_metadata']);
+       if (!empty($login_metadata['persistent'])) {
+               $persistent = true;
+       }
+       if (!empty($login_metadata['forward'])) {
+               $forward = $login_metadata['forward'];
+       }
+
        if (!isset($token['oauth_token']) or !isset($token['oauth_token_secret'])) {
                register_error(elgg_echo('twitter_api:login:error'));
                forward();
@@ -81,13 +111,13 @@ function twitter_api_login() {
        $users = elgg_get_entities_from_plugin_user_settings($options);
 
        if ($users) {
-               if (count($users) == 1 && login($users[0])) {
-                       system_message(elgg_echo('twitter_api:login:success'));                 
+               if (count($users) == 1 && login($users[0], $persistent)) {
+                       system_message(elgg_echo('twitter_api:login:success'));
+                       forward($forward);
                } else {
                        register_error(elgg_echo('twitter_api:login:error'));
+                       forward();
                }
-               
-               forward(elgg_get_site_url());
        } else {
                $consumer_key = elgg_get_plugin_setting('consumer_key', 'twitter_api');
                $consumer_secret = elgg_get_plugin_setting('consumer_secret', 'twitter_api');
@@ -301,9 +331,11 @@ function twitter_api_get_authorize_url($callback = NULL, $login = true) {
 /**
  * Returns the access token to use in twitter calls.
  *
- * @param unknown_type $oauth_verifier
+ * @param bool $oauth_verifier
+ * @return array
  */
 function twitter_api_get_access_token($oauth_verifier = FALSE) {
+       /* @var ElggSession $SESSION */
        global $SESSION;
 
        $consumer_key = elgg_get_plugin_setting('consumer_key', 'twitter_api');
@@ -312,7 +344,7 @@ function twitter_api_get_access_token($oauth_verifier = FALSE) {
        // retrieve stored tokens
        $oauth_token = $SESSION['twitter_api']['oauth_token'];
        $oauth_token_secret = $SESSION['twitter_api']['oauth_token_secret'];
-       $SESSION->offsetUnset('twitter_api');
+       unset($SESSION['twitter_api']);
 
        // fetch an access token
        $api = new TwitterOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
index 08bce54794d2230cfaa592af4afa6e8ef1551d11..e6221de6badbcf1a265b4631628439e2725afcd2 100644 (file)
@@ -20,6 +20,7 @@ function twitter_api_init() {
        //elgg_extend_view('metatags', 'twitter_api/metatags');
        elgg_extend_view('css/elgg', 'twitter_api/css');
        elgg_extend_view('css/admin', 'twitter_api/css');
+       elgg_extend_view('js/elgg', 'twitter_api/js');
 
        // sign on with twitter
        if (twitter_api_allow_sign_on_with_twitter()) {
@@ -60,7 +61,7 @@ function twitter_api_pagehandler_deprecated($page) {
  * Serves pages for twitter.
  *
  * @param array $page
- * @return void
+ * @return bool
  */
 function twitter_api_pagehandler($page) {
        if (!isset($page[0])) {
@@ -131,14 +132,15 @@ function twitter_api_tweet($hook, $type, $returnvalue, $params) {
 
        // send tweet
        $api = new TwitterOAuth($consumer_key, $consumer_secret, $access_key, $access_secret);
-       $response = $api->post('statuses/update', array('status' => $params['message']));
+       $api->post('statuses/update', array('status' => $params['message']));
 }
 
 /**
  * Get tweets for a user.
  *
- * @param int   $user_id The Elgg user GUID
+ * @param int   $user_guid The Elgg user GUID
  * @param array $options
+ * @return array
  */
 function twitter_api_fetch_tweets($user_guid, $options = array()) {
        // check admin settings
@@ -167,6 +169,7 @@ function twitter_api_fetch_tweets($user_guid, $options = array()) {
  * @param string $type
  * @param array  $return_value
  * @param array  $params
+ * @return array
  */
 function twitter_api_public_pages($hook, $type, $return_value, $params) {
        $return_value[] = 'twitter_api/forward';
index 04bbed66852a157dc8208ffd59412b546039e0fc..2d081d361da968650f5f45376e1e2a0ac5c02742 100644 (file)
@@ -4,7 +4,7 @@
  */
 ?>
 
-#login_with_twitter {
+.login_with_twitter {
        padding: 10px 0 0 0;
 }
 
diff --git a/mod/twitter_api/views/default/twitter_api/js.php b/mod/twitter_api/views/default/twitter_api/js.php
new file mode 100644 (file)
index 0000000..6083970
--- /dev/null
@@ -0,0 +1,16 @@
+<?php if (0): ?><script><? endif; ?>
+
+// add ?persistent to login link
+elgg.register_hook_handler('init', 'system', function() {
+       $('form.elgg-form-login').each(function () {
+               var link = $('.login_with_twitter a', this).get(0),
+                       $input = $('input[name="persistent"]', this);
+               function sync() {
+                       link.href = link.href.replace(/\?.*/, '') + ($input[0].checked ? '?persistent' : '');
+               }
+               if (link && $input.length) {
+                       sync();
+                       $input.change(sync);
+               }
+       });
+});
index 17bd76d5668d13085ddd4cc9af9839d1e680fa0c..7b4b4ecb1633b48e203b9d5498242fb1d7ab0a53 100644 (file)
@@ -7,7 +7,7 @@ $url = elgg_get_site_url() . 'twitter_api/forward';
 $img_url = elgg_get_site_url() . 'mod/twitter_api/graphics/sign-in-with-twitter-d.png';
 
 $login = <<<__HTML
-<div id="login_with_twitter">
+<div class="login_with_twitter">
        <a href="$url">
                <img src="$img_url" alt="Twitter" />
        </a>