Changeset 1291

Show
Ignore:
Timestamp:
02/13/11 17:53:44 (2 years ago)
Author:
Torben Brodt
Message:

twitter oauth integration fixes

Location:
twitter
Files:
6 modified
1 moved

Legend:

Unmodified
Added
Removed
  • twitter/files/lib/data/twitter/Twitter.class.php

    r1290 r1291  
    11<?php 
    2 require_once(dirname(__FILE__).'/EpiCurl.php'); 
    3 require_once(dirname(__FILE__).'/EpiOAuth.php'); 
    4 require_once(dirname(__FILE__).'/EpiSequence.php'); 
    5 require_once(dirname(__FILE__).'/EpiTwitter.php'); 
     2require_once(dirname(__FILE__).'/EpiTwitter/EpiCurl.php'); 
     3require_once(dirname(__FILE__).'/EpiTwitter/EpiOAuth.php'); 
     4require_once(dirname(__FILE__).'/EpiTwitter/EpiTwitter.php'); 
    65 
    76/** 
    87 * 
     8 * @author      Torben Brodt 
     9 * @copyright   2010 easy-coding.de 
     10 * @license     GNU General Public License <http://opensource.org/licenses/gpl-3.0.html> 
     11 * @package     de.easy-coding.wcf.twitter 
    912 */ 
    1013class Twitter extends EpiTwitter { 
    1114 
    1215        /** 
     16         * @var string 
     17         */ 
     18        protected $userAgent      = 'TwitterWCF (http://trac.easy-coding.de/trac/wcf/wiki/Twitter)'; 
     19 
     20        /** 
     21         * remember these requests in session 
     22         * @var array<string> 
     23         */ 
     24        protected $cache = array( /*'/account/verify_credentials.json'*/); 
     25 
     26        /** 
    1327         * @var Twitter 
    1428         */ 
    15         protected $instance = null; 
     29        protected static $instance = null; 
    1630 
    1731        /** 
     
    2438                return self::$instance; 
    2539        } 
     40         
     41        public function getToken() { 
     42                return array( 
     43                        'oauth_token' => $this->token,  
     44                        'oauth_token_secret' => $this->tokenSecret 
     45                ); 
     46        } 
     47 
     48        /** 
     49         * @return boolean 
     50         */      
     51        public function startSession() { 
     52                $return = false; 
     53                 
     54                if(isset($_GET['oauth_token'])) { 
     55                        $this->setToken($_GET['oauth_token']); 
     56                        $token = $this->getAccessToken(); 
     57                        $this->setToken($token->oauth_token, $token->oauth_token_secret); 
     58                        $return = true; 
     59                } 
     60                 
     61                else if(WCF::getUser()->userID) { 
     62                        $me = TwitterUtil::getTwitterAccount(WCF::getUser()->userID); 
     63                        if($me) { 
     64                                $this->setToken($me['userToken'], $me['userSecret']); 
     65                                $return = true; 
     66                        } 
     67                } 
     68                return $return; 
     69        } 
     70         
     71        /** 
     72         * wraps some method calls with session based cache 
     73         * @override 
     74         */ 
     75        public function get($endpoint, $params = null) { 
     76                if(in_array($endpoint, $this->cache)) { 
     77                        $return = WCF::getSession()->getVar($endpoint); 
     78                        if(!empty($return)) { 
     79                                return $return; 
     80                        } 
     81                } 
     82                $return = parent::get($endpoint, $params); 
     83 
     84                if(in_array($endpoint, $this->cache)) { 
     85                        WCF::getSession()->register($endpoint, $return); 
     86                } 
     87                return $return; 
     88        } 
    2689} 
  • twitter/files/lib/page/TwitterPage.class.php

    r1179 r1291  
    11<?php 
    22require_once(WCF_DIR.'lib/page/AbstractPage.class.php'); 
     3require_once(WCF_DIR.'lib/data/twitter/Twitter.class.php'); 
     4require_once(WCF_DIR.'lib/util/TwitterUtil.class.php'); 
    35 
    46/** 
     
    1113class TwitterPage extends AbstractPage { 
    1214        public $templateName = 'twitter';  
    13         public $twitters = array(); 
    1415         
    1516        /** 
     
    1920                parent::readData(); 
    2021                 
    21                 $minLifetime = 0; 
    22                 $maxLifetime = 900; // 0:15h 
     22                if(isset($_GET['oauth_token'])) { 
     23                        $twitterObj = Twitter::getInstance(); 
     24                        $twitterObj->setToken($_GET['oauth_token']); 
     25                        $token = $twitterObj->getAccessToken(); 
     26                        $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret); 
    2327 
    24                 WCF::getCache()->addResource( 
    25                         'twitter.wcf',  
    26                         WCF_DIR.'cache/cache.twitter.wcf.php', 
    27                         WCF_DIR.'lib/system/cache/CacheBuilderTwitter.class.php', 
    28                         $minLifetime, 
    29                         $maxLifetime 
    30                 ); 
    31                          
    32                 $this->twitters = WCF::getCache()->get('twitter.wcf'); 
     28                        // save to cookies 
     29                        setcookie('oauth_token', $token->oauth_token); 
     30                        setcookie('oauth_token_secret', $token->oauth_token_secret); 
     31 
     32                        $twitterInfo= $twitterObj->get_accountVerify_credentials(); 
     33                        echo "<h1>Your twitter username is {$twitterInfo->screen_name} and your profile picture is <img src=\"{$twitterInfo->profile_image_url}\"></h1> 
     34                        <p><a href=\"random.php\">Go to another page and load your friends list from your cookie</p>"; 
     35                } 
    3336        } 
    3437         
     
    4043 
    4144                WCF::getTPL()->assign(array( 
    42                         'twitters' => $this->twitters, 
    4345                        'allowSpidersToIndexThisPage' => true 
    4446                )); 
     
    5254                require_once(WCF_DIR.'lib/page/util/menu/PageMenu.class.php'); 
    5355                PageMenu::setActiveMenuItem('wcf.twitter.title'); 
    54                  
    55                 // check permission 
    56                 WCF::getUser()->checkPermission('user.twitter.canViewTwitterPage'); 
    5756 
    5857                // check module options 
  • twitter/files/lib/system/event/listener/UserLoginTwitterListener.class.php

    r1286 r1291  
    2020                 
    2121                switch($className) { 
     22                        // login or register with twitter 
     23                        case 'UserLoginForm': 
     24                                // readData 
     25                                TwitterUtil::loginOrRegister($eventObj); 
     26                        break; 
     27                         
    2228                        // registered user links with twitter 
    2329                        case 'UserProfileEditForm': 
     
    2733                                } 
    2834                        break; 
     35                         
     36                        // password validations can be skipped if twitter auth is successfully 
     37                        case 'AccountManagementForm': 
     38                                // validate 
     39                                if($eventName == 'validate' && TwitterUtil::isValidTwitterUser()) { 
     40 
     41                                        // bypass password query with a little hack 
     42                                        $password = UserRegistrationUtil::getNewPassword((REGISTER_PASSWORD_MIN_LENGTH > 9 ? REGISTER_PASSWORD_MIN_LENGTH : 9)); 
     43                                        WCF::getUser()->password = StringUtil::getDoubleSaltedHash($password, WCF::getUser()->salt); 
     44                                        $eventObj->password = $password; 
     45                                } 
     46                                 
     47                                // hide password input 
     48                                else if($eventName == 'assignVariables' && TwitterUtil::hasTwitterAccount(WCF::getUser()->userID)) { 
     49                                        WCF::getTPL()->append('additionalFields', '<script type="text/javascript"> 
     50                                                $($("password").parentNode.parentNode).hide(); 
     51                                        </script>'); 
     52                                } 
     53                        break; 
    2954                } 
    3055        } 
  • twitter/files/lib/util/TwitterUtil.class.php

    r1290 r1291  
    4646         */ 
    4747        public static function hasTwitterAccount($userID) { 
    48                 $sql = "SELECT          utt.twitterID 
     48                $row = self::getTwitterAccount($userID); 
     49                return $row && $row['userToken'] && $row['userSecret']; 
     50        } 
     51 
     52        /** 
     53         * is there an existing user with given twitter id? 
     54         * 
     55         * @param       integer         $userID 
     56         * @return      boolean 
     57         */ 
     58        public static function getTwitterAccount($userID) { 
     59                $sql = "SELECT          utt.userToken, 
     60                                        utt.userSecret 
    4961                        FROM            wcf".WCF_N."_user_to_twitter utt 
    5062                        WHERE           utt.userID = ".intval($userID); 
     
    6173         * @return      boolean 
    6274         */ 
    63         protected static function addTwitterUser($me, $user) { 
     75        protected static function addTwitterUser($user, $me, $token) { 
    6476                $sql = "REPLACE INTO    wcf".WCF_N."_user_to_twitter 
    6577                                        (userID, userToken, userSecret) 
    6678                        VALUES          (".intval($user->userID).",  
    67                                         '".escapeString($me['oauth_token'])."',  
    68                                         '".escapeString($me['oauth_token_secret'])."')"; 
     79                                        '".escapeString($token['oauth_token'])."',  
     80                                        '".escapeString($token['oauth_token_secret'])."')"; 
    6981 
    7082                return WCF::getDB()->sendQuery($sql); 
     
    8496 
    8597                $me = null; 
    86                 $uid = array(); 
    8798 
    8899                // API call. 
    89                 try { 
    90                         $me = $twitterObj->get('/account/verify_credentials.json'); 
    91                 } catch (Exception $e) { 
    92                         error_log($e); 
     100                if($twitterObj->startSession()) { 
     101                        try { 
     102                                $me = $twitterObj->get('/account/verify_credentials.json'); 
     103                        } catch (Exception $e) { 
     104                                error_log($e); 
     105                        } 
    93106                } 
    94107 
    95108                // no permissions granted, ask for login 
    96109                if(!$me) { 
    97                         $loginUrl = $twitterObj->getAuthenticateUrl(); 
     110                        $proto = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] ? 'https://' : 'http://'; 
     111                        $loginUrl = $twitterObj->getAuthenticateUrl(null, array( 
     112                                'oauth_callback' => $proto.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] 
     113                        )); 
    98114 
    99115                        WCF::getTPL()->assign(array( 
     
    117133        public static function updateCurrentUser() { 
    118134                $me = null; 
    119                 $uid = array(); 
    120135                 
    121136                $twitterObj = Twitter::getInstance(); 
    122137 
    123138                // API call. 
    124                 try { 
    125                         $me = $twitterObj->get('/account/verify_credentials.json'); 
    126                 } catch (TwitterApiException $e) { 
    127                         error_log($e); 
     139                if($twitterObj->startSession()) { 
     140                        try { 
     141                                $me = $twitterObj->get('/account/verify_credentials.json'); 
     142                        } catch (Exception $e) { 
     143                                error_log($e); 
     144                        } 
    128145                } 
    129146 
    130147                // no permissions granted, ask for login 
    131148                if(!$me) { 
    132                         $loginUrl = $twitterObj->getAuthenticateUrl(); 
     149                        $proto = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] ? 'https://' : 'http://'; 
     150                        $loginUrl = $twitterObj->getAuthenticateUrl(null, array( 
     151                                'oauth_callback' => $proto.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] 
     152                        )); 
    133153 
    134154                        WCF::getTPL()->assign(array( 
     
    154174 
    155175                        // either user is new, oder just got a link, but add a twitter link 
    156                         self::addTwitterUser($me, $user); 
     176                        self::addTwitterUser($user, $me, Twitter::getInstance()->getToken()); 
    157177 
    158178                        return true; 
     
    163183                        WCF::getTPL()->append('additionalFields', '<fieldset> 
    164184                                <legend>'.WCF::getLanguage()->get('wcf.twitter.title').'</legend> 
    165                                 '.WCF::getLanguage()->get('wcf.twitter.status.connected').' 
     185                                <div class="formElement"> 
     186                                        <div class="formFieldLabel"> 
     187                                                <img src="'.RELATIVE_WCF_DIR.'icon/twitterM.png" alt="" /> 
     188                                        </div> 
     189                                        <div class="formField"> 
     190                                                '.WCF::getLanguage()->get('wcf.twitter.status.connected').' 
     191                                        </div> 
     192                                </div> 
    166193                        </fieldset>'); 
    167194                } 
     
    185212 
    186213                $me = null; 
    187                 $uid = array(); 
    188214 
    189215                // API call. 
    190                 try { 
    191                         $me = $twitterObj->get('/account/verify_credentials.json'); 
    192                 } catch (TwitterApiException $e) { 
    193                         error_log($e); 
     216                if($twitterObj->startSession()) { 
     217                        try { 
     218                                $me = $twitterObj->get('/account/verify_credentials.json'); 
     219                        } catch (Exception $e) { 
     220                                error_log($e); 
     221                        } 
    194222                } 
    195223 
    196224                // no permissions granted, ask for login 
    197225                if(!$me) { 
    198                         $loginUrl = $twitterObj->getAuthenticateUrl(); 
     226                        $proto = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] ? 'https://' : 'http://'; 
     227                        $loginUrl = $twitterObj->getAuthenticateUrl(null, array( 
     228                                'oauth_callback' => $proto.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] 
     229                        )); 
    199230 
    200231                        WCF::getTPL()->assign(array( 
     
    234265 
    235266                        // either user is new, oder just got a link, but add a twitter link 
    236                         self::addTwitterUser($me, $user); 
     267                        self::addTwitterUser($user, $me, Twitter::getInstance()->getToken()); 
    237268                } 
    238269 
  • twitter/install.sql

    r1290 r1291  
     1DROP TABLE IF EXISTS wcf1_twitter_account; 
     2CREATE TABLE wcf1_twitter_account ( 
     3        accountID BIGINT unsigned NOT NULL PRIMARY KEY, 
     4        name VARCHAR(255) NULL, 
     5        screen_name VARCHAR(255) NULL, 
     6        profile_image_url VARCHAR(255) NULL 
     7) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
     8 
    19DROP TABLE IF EXISTS wcf1_user_to_twitter; 
    210CREATE TABLE wcf1_user_to_twitter ( 
    3         userID INT(10) NOT NULL PRIMARY KEY, 
     11        userID INT(10) unsigned NOT NULL PRIMARY KEY, 
     12        accountID BIGINT unsigned NOT NULL, 
    413        userToken VARCHAR(64) NOT NULL, 
    514        userSecret VARCHAR(64) NOT NULL 
     
    817DROP TABLE IF EXISTS wcf1_twitter_message; 
    918CREATE TABLE wcf1_twitter_message ( 
    10         messageID INT(10) NOT NULL PRIMARY KEY, 
    11         userID INT(10) NOT NULL, 
    12         groupID INT(10) NOT NULL DEFAULT 0, 
    13         message TEXT NULL, 
    14         time INT(10) NOT NULL DE 
     19        messageID BIGINT unsigned NOT NULL PRIMARY KEY, 
     20        accountID BIGINT unsigned NOT NULL, 
     21        message VARCHAR(255) NULL, 
     22        time INT(10) NOT NULL DEFAULT 0, 
    1523        FULLTEXT KEY (message), 
    16         KEY (userID), 
     24        KEY (accountID) 
    1725) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  • twitter/package.xml

    r1290 r1291  
    2424                <files>files.tar</files> 
    2525                <templates>templates.tar</templates> 
     26                <sql>install.sql</sql> 
    2627 
    2728                <!-- config --> 
    2829                <options>options.xml</options> 
     30                <eventlistener>eventlistener.xml</eventlistener> 
    2931                <pagemenu>pagemenu.xml</pagemenu> 
    30                 <groupoptions>groupoptions.xml</groupoptions> 
    3132                <searchablemessagetypes>smt.xml</searchablemessagetypes> 
    3233 
  • twitter/templates/twitterLogin.tpl

    r1290 r1291  
    11<div class="formElement"> 
    22        <div class="formField"> 
    3                 <a href="{$loginUrl}">login to twitter</a> 
     3                <a href="{$loginUrl}"><img src="http://si0.twimg.com/images/dev/buttons/sign-in-with-twitter-l.png" alt="" /></a> 
    44        </div> 
    55</div>