]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' into 1.0.x
authorBrion Vibber <brion@pobox.com>
Thu, 7 Oct 2010 20:32:26 +0000 (13:32 -0700)
committerBrion Vibber <brion@pobox.com>
Thu, 7 Oct 2010 20:32:26 +0000 (13:32 -0700)
1  2 
lib/util.php
plugins/BitlyUrl/BitlyUrlPlugin.php
plugins/OStatus/OStatusPlugin.php

diff --combined lib/util.php
index df339d4b1e39e6058c84ea3d31becf2e1bb05210,c05fcf15a2a052ea86d1b6d961c1a2f1dc22da29..85d7c72f453fb59b58ecd671bb975409b17b081d
@@@ -145,6 -145,7 +145,6 @@@ function common_switch_locale($language
      textdomain("statusnet");
  }
  
 -
  function common_timezone()
  {
      if (common_logged_in()) {
      return common_config('site', 'timezone');
  }
  
 +function common_valid_language($lang)
 +{
 +    if ($lang) {
 +        // Validate -- we don't want to end up with a bogus code
 +        // left over from some old junk.
 +        foreach (common_config('site', 'languages') as $code => $info) {
 +            if ($info['lang'] == $lang) {
 +                return true;
 +            }
 +        }
 +    }
 +    return false;
 +}
 +
  function common_language()
  {
 +    // Allow ?uselang=xx override, very useful for debugging
 +    // and helping translators check usage and context.
 +    if (isset($_GET['uselang'])) {
 +        $uselang = strval($_GET['uselang']);
 +        if (common_valid_language($uselang)) {
 +            return $uselang;
 +        }
 +    }
 +
      // If there is a user logged in and they've set a language preference
      // then return that one...
      if (_have_config() && common_logged_in()) {
          $user = common_current_user();
 -        $user_language = $user->language;
 -
 -        if ($user->language) {
 -            // Validate -- we don't want to end up with a bogus code
 -            // left over from some old junk.
 -            foreach (common_config('site', 'languages') as $code => $info) {
 -                if ($info['lang'] == $user_language) {
 -                    return $user_language;
 -                }
 -            }
 +
 +        if (common_valid_language($user->language)) {
 +            return $user->language;
          }
      }
  
@@@ -916,21 -901,9 +916,21 @@@ function common_linkify($url) 
  
  function common_shorten_links($text, $always = false)
  {
 -    $maxLength = Notice::maxContent();
 -    if (!$always && ($maxLength == 0 || mb_strlen($text) <= $maxLength)) return $text;
 -    return common_replace_urls_callback($text, array('File_redirection', 'makeShort'));
 +    common_debug("common_shorten_links() called");
 +
 +    $user = common_current_user();
 +
 +    $maxLength = User_urlshortener_prefs::maxNoticeLength($user);
 +
 +    common_debug("maxLength = $maxLength");
 +
 +    if ($always || mb_strlen($text) > $maxLength) {
 +        common_debug("Forcing shortening");
 +        return common_replace_urls_callback($text, array('File_redirection', 'forceShort'));
 +    } else {
 +        common_debug("Not forcing shortening");
 +        return common_replace_urls_callback($text, array('File_redirection', 'makeShort'));
 +    }
  }
  
  /**
  function common_validate_utf8($str)
  {
      // preg_replace will return NULL on invalid UTF-8 input.
-     return preg_replace('//u', '', $str);
+     //
+     // Note: empty regex //u also caused NULL return on some
+     // production machines, but none of our test machines.
+     //
+     // This should be replaced with a more reliable check.
+     return preg_replace('/\x00/u', '', $str);
  }
  
  /**
@@@ -1298,8 -1276,14 +1303,8 @@@ function common_redirect($url, $code=30
      exit;
  }
  
 -function common_broadcast_notice($notice, $remote=false)
 -{
 -    // DO NOTHING!
 -}
 +// Stick the notice on the queue
  
 -/**
 - * Stick the notice on the queue.
 - */
  function common_enqueue_notice($notice)
  {
      static $localTransports = array('omb',
          $transports[] = 'plugin';
      }
  
 -    $xmpp = common_config('xmpp', 'enabled');
 -
 -    if ($xmpp) {
 -        $transports[] = 'jabber';
 -    }
 -
      // We can skip these for gatewayed notices.
      if ($notice->isLocal()) {
          $transports = array_merge($transports, $localTransports);
 -        if ($xmpp) {
 -            $transports[] = 'public';
 -        }
      }
  
      if (Event::handle('StartEnqueueNotice', array($notice, &$transports))) {
@@@ -1853,6 -1846,21 +1858,6 @@@ function common_session_token(
      return $_SESSION['token'];
  }
  
 -function common_cache_key($extra)
 -{
 -    return Cache::key($extra);
 -}
 -
 -function common_keyize($str)
 -{
 -    return Cache::keyize($str);
 -}
 -
 -function common_memcache()
 -{
 -    return Cache::instance();
 -}
 -
  function common_license_terms($uri)
  {
      if(preg_match('/creativecommons.org\/licenses\/([^\/]+)/', $uri, $matches)) {
@@@ -1893,42 -1901,30 +1898,42 @@@ function common_database_tablename($tab
  /**
   * Shorten a URL with the current user's configured shortening service,
   * or ur1.ca if configured, or not at all if no shortening is set up.
 - * Length is not considered.
   *
 - * @param string $long_url
 + * @param string  $long_url original URL
 + * @param boolean $force    Force shortening (used when notice is too long)
 + *
   * @return string may return the original URL if shortening failed
   *
   * @fixme provide a way to specify a particular shortener
   * @fixme provide a way to specify to use a given user's shortening preferences
   */
 -function common_shorten_url($long_url)
 +
 +function common_shorten_url($long_url, $force = false)
  {
 +    common_debug("Shortening URL '$long_url' (force = $force)");
 +
      $long_url = trim($long_url);
 +
      $user = common_current_user();
 -    if (empty($user)) {
 -        // common current user does not find a user when called from the XMPP daemon
 -        // therefore we'll set one here fix, so that XMPP given URLs may be shortened
 -        $shortenerName = 'ur1.ca';
 -    } else {
 -        $shortenerName = $user->urlshorteningservice;
 +
 +    $maxUrlLength = User_urlshortener_prefs::maxUrlLength($user);
 +    common_debug("maxUrlLength = $maxUrlLength");
 +
 +    // $force forces shortening even if it's not strictly needed
 +
 +    if (mb_strlen($long_url) < $maxUrlLength && !$force) {
 +        common_debug("Skipped shortening URL.");
 +        return $long_url;
      }
  
 -    if(Event::handle('StartShortenUrl', array($long_url,$shortenerName,&$shortenedUrl))){
 +    $shortenerName = User_urlshortener_prefs::urlShorteningService($user);
 +
 +    common_debug("Shortener name = '$shortenerName'");
 +
 +    if (Event::handle('StartShortenUrl', array($long_url, $shortenerName, &$shortenedUrl))) {
          //URL wasn't shortened, so return the long url
          return $long_url;
 -    }else{
 +    } else {
          //URL was shortened, so return the result
          return trim($shortenedUrl);
      }
index e1c8d3462eb9b40d69541bf87445b0a27e4262cf,93a35b3f384d85b52e2ed784560e37eed34a5b85..f4d987489ab0a6509a3ec1b2f1b83f692fa2bd29
@@@ -2,7 -2,7 +2,7 @@@
  /**
   * StatusNet, the distributed open-source microblogging tool
   *
-  * Plugin to push RSS/Atom updates to a PubSubHubBub hub
+  * Plugin to use bit.ly URL shortening services.
   *
   * PHP version 5
   *
@@@ -22,7 -22,9 +22,9 @@@
   * @category  Plugin
   * @package   StatusNet
   * @author    Craig Andrews <candrews@integralblue.com>
+  * @author    Brion Vibber <brion@status.net>
   * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
+  * @copyright 2010 StatusNet, Inc http://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/
   */
@@@ -31,28 -33,139 +33,137 @@@ if (!defined('STATUSNET')) 
      exit(1);
  }
  
 -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php';
 -
  class BitlyUrlPlugin extends UrlShortenerPlugin
  {
-     public $serviceUrl;
+     public $shortenerName = 'bit.ly';
+     public $serviceUrl = 'http://bit.ly/api?method=shorten&version=2.0.1&longUrl=%s';
+     public $login; // To set a site-default when admins or users don't override it.
+     public $apiKey;
  
      function onInitializePlugin(){
          parent::onInitializePlugin();
          if(!isset($this->serviceUrl)){
-             throw new Exception(_m("You must specify a serviceUrl."));
+             throw new Exception(_m("You must specify a serviceUrl for bit.ly shortening."));
          }
      }
  
+     /**
+      * Add bit.ly to the list of available URL shorteners if it's configured,
+      * otherwise leave it out.
+      *
+      * @param array $shorteners
+      * @return boolean hook return value
+      */
+     function onGetUrlShorteners(&$shorteners)
+     {
+         if ($this->getLogin() && $this->getApiKey()) {
+             return parent::onGetUrlShorteners($shorteners);
+         }
+         return true;
+     }
+     /**
+      * Short a URL
+      * @param url
+      * @return string shortened version of the url, or null if URL shortening failed
+      */
      protected function shorten($url) {
-         $response = $this->http_get($url);
-         if(!$response) return;
-         return current(json_decode($response)->results)->hashUrl;
+         $response = $this->query($url);
+         if ($this->isOk($url, $response)) {
+             return $this->decode($url, $response->getBody());
+         } else {
+             return null;
+         }
+     }
+     /**
+      * Get the user's or site-wide default bit.ly login name.
+      *
+      * @return string
+      */
+     protected function getLogin()
+     {
+         $login = common_config('bitly', 'default_login');
+         if (!$login) {
+             $login = $this->login;
+         }
+         return $login;
+     }
+     /**
+      * Get the user's or site-wide default bit.ly API key.
+      *
+      * @return string
+      */
+     protected function getApiKey()
+     {
+         $key = common_config('bitly', 'default_apikey');
+         if (!$key) {
+             $key = $this->apiKey;
+         }
+         return $key;
+     }
+     /**
+      * Inject API key into query before sending out...
+      *
+      * @param string $url
+      * @return HTTPResponse
+      */
+     protected function query($url)
+     {
+         // http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/shorten
+         $params = http_build_query(array(
+             'login' => $this->getLogin(),
+             'apiKey' => $this->getApiKey()), '', '&');
+         $serviceUrl = sprintf($this->serviceUrl, $url) . '&' . $params;
+         $request = HTTPClient::start();
+         return $request->get($serviceUrl);
+     }
+     /**
+      * JSON decode for API result
+      */
+     protected function decode($url, $body)
+     {
+         $json = json_decode($body, true);
+         return $json['results'][$url]['shortUrl'];
+     }
+     /**
+      * JSON decode for API result
+      */
+     protected function isOk($url, $response)
+     {
+         $code = 'unknown';
+         $msg = '';
+         if ($response->isOk()) {
+             $body = $response->getBody();
+             common_log(LOG_INFO, $body);
+             $json = json_decode($body, true);
+             if ($json['statusCode'] == 'OK') {
+                 $data = $json['results'][$url];
+                 if (isset($data['shortUrl'])) {
+                     return true;
+                 } else if (isset($data['statusCode']) && $data['statusCode'] == 'ERROR') {
+                     $code = $data['errorCode'];
+                     $msg = $data['errorMessage'];
+                 }
+             } else if ($json['statusCode'] == 'ERROR') {
+                 $code = $json['errorCode'];
+                 $msg = $json['errorMessage'];
+             }
+             common_log(LOG_ERR, "bit.ly returned error $code $msg for $url");
+         }
+         return false;
      }
  
      function onPluginVersion(&$versions)
      {
          $versions[] = array('name' => sprintf('BitlyUrl (%s)', $this->shortenerName),
                              'version' => STATUSNET_VERSION,
-                             'author' => 'Craig Andrews',
+                             'author' => 'Craig Andrews, Brion Vibber',
                              'homepage' => 'http://status.net/wiki/Plugin:BitlyUrl',
                              'rawdescription' =>
                              sprintf(_m('Uses <a href="http://%1$s/">%1$s</a> URL-shortener service.'),
  
          return true;
      }
+     /**
+      * Hook for RouterInitialized event.
+      *
+      * @param Net_URL_Mapper $m path-to-action mapper
+      * @return boolean hook return
+      */
+     function onRouterInitialized($m)
+     {
+         $m->connect('admin/bitly',
+                     array('action' => 'bitlyadminpanel'));
+         return true;
+     }
+     /**
+      * If the plugin's installed, this should be accessible to admins.
+      */
+     function onAdminPanelCheck($name, &$isOK)
+     {
+         if ($name == 'bitly') {
+             $isOK = true;
+             return false;
+         }
+         return true;
+     }
+     /**
+      * Add the bit.ly admin panel to the list...
+      */
+     function onEndAdminPanelNav($nav)
+     {
+         if (AdminPanelAction::canAdmin('bitly')) {
+             $action_name = $nav->action->trimmed('action');
+             $nav->out->menuItem(common_local_url('bitlyadminpanel'),
+                                 _m('bit.ly'),
+                                 _m('bit.ly URL shortening'),
+                                 $action_name == 'bitlyadminpanel',
+                                 'nav_bitly_admin_panel');
+         }
+         return true;
+     }
+     /**
+      * Automatically load the actions and libraries used by the plugin
+      *
+      * @param Class $cls the class
+      *
+      * @return boolean hook return
+      *
+      */
+     function onAutoload($cls)
+     {
+         $base = dirname(__FILE__);
+         $lower = strtolower($cls);
+         switch ($lower) {
+         case 'bitlyadminpanelaction':
+             require_once "$base/$lower.php";
+             return false;
+         default:
+             return true;
+         }
+     }
+     /**
+      * Internal hook point to check the default global credentials so
+      * the admin form knows if we have a fallback or not.
+      *
+      * @param string $login
+      * @param string $apiKey
+      * @return boolean hook return value
+      */
+     function onBitlyDefaultCredentials(&$login, &$apiKey)
+     {
+         $login = $this->login;
+         $apiKey = $this->apiKey;
+         return false;
+     }
  }
index f9e7adacddc6dde844673fed7406429c11839c51,9c6696439ae4db3cdd87a03aaa173b24fd0770b6..f7900110f3298d0ba4b6fdfc4e3a205cdb6c9248
@@@ -50,6 -50,8 +50,6 @@@ class OStatusPlugin extends Plugi
      function onRouterInitialized($m)
      {
          // Discovery actions
 -        $m->connect('.well-known/host-meta',
 -                    array('action' => 'hostmeta'));
          $m->connect('main/xrd',
                      array('action' => 'userxrd'));
          $m->connect('main/ownerxrd',
      {
          $group = User_group::staticGet('uri', $url);
          if ($group) {
-             $local = Local_group::staticGet('id', $group->id);
+             $local = Local_group::staticGet('group_id', $group->id);
              if ($local) {
                  return $group->id;
              }
  
          return true;
      }
 +
 +    function onStartHostMetaLinks(&$links) {
 +        $url = common_local_url('userxrd');
 +        $url.= '?uri={uri}';
 +        $links[] = array('rel' => Discovery::LRDD_REL,
 +                              'template' => $url,
 +                              'title' => array('Resource Descriptor'));
 +    }
  }