From 95b534c5cee56602dffcc11121908c0f518cab6d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 15 Sep 2010 14:09:23 -0700 Subject: Move standalone plugin files into subdirectories so they can have locale data, etc added to them at leisure. --- plugins/Linkback/LinkbackPlugin.php | 249 ++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 plugins/Linkback/LinkbackPlugin.php (limited to 'plugins/Linkback/LinkbackPlugin.php') diff --git a/plugins/Linkback/LinkbackPlugin.php b/plugins/Linkback/LinkbackPlugin.php new file mode 100644 index 000000000..8e44beae1 --- /dev/null +++ b/plugins/Linkback/LinkbackPlugin.php @@ -0,0 +1,249 @@ +. + * + * @category Plugin + * @package StatusNet + * @author Evan Prodromou + * @copyright 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('STATUSNET')) { + exit(1); +} + +require_once('Auth/Yadis/Yadis.php'); + +define('LINKBACKPLUGIN_VERSION', '0.1'); + +/** + * Plugin to do linkbacks for notices containing URLs + * + * After new notices are saved, we check their text for URLs. If there + * are URLs, we test each URL to see if it supports any + * + * @category Plugin + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + * @see Event + */ + +class LinkbackPlugin extends Plugin +{ + var $notice = null; + + function __construct() + { + parent::__construct(); + } + + function onHandleQueuedNotice($notice) + { + if ($notice->is_local == 1) { + // Try to avoid actually mucking with the + // notice content + $c = $notice->content; + $this->notice = $notice; + // Ignoring results + common_replace_urls_callback($c, + array($this, 'linkbackUrl')); + } + return true; + } + + function linkbackUrl($url) + { + common_log(LOG_DEBUG,"Attempting linkback for " . $url); + + $orig = $url; + $url = htmlspecialchars_decode($orig); + $scheme = parse_url($url, PHP_URL_SCHEME); + if (!in_array($scheme, array('http', 'https'))) { + return $orig; + } + + // XXX: Do a HEAD first to save some time/bandwidth + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $result = $fetcher->get($url, + array('User-Agent: ' . $this->userAgent(), + 'Accept: application/html+xml,text/html')); + + if (!in_array($result->status, array('200', '206'))) { + return $orig; + } + + $pb = null; + $tb = null; + + if (array_key_exists('X-Pingback', $result->headers)) { + $pb = $result->headers['X-Pingback']; + } else if (preg_match('//', + $result->body, + $match)) { + $pb = $match[1]; + } + + if (!empty($pb)) { + $this->pingback($result->final_url, $pb); + } else { + $tb = $this->getTrackback($result->body, $result->final_url); + if (!empty($tb)) { + $this->trackback($result->final_url, $tb); + } + } + + return $orig; + } + + function pingback($url, $endpoint) + { + $args = array($this->notice->uri, $url); + + if (!extension_loaded('xmlrpc')) { + if (!dl('xmlrpc.so')) { + common_log(LOG_ERR, "Can't pingback; xmlrpc extension not available."); + return; + } + } + + $request = HTTPClient::start(); + try { + $response = $request->post($endpoint, + array('Content-Type: text/xml'), + xmlrpc_encode_request('pingback.ping', $args)); + $response = xmlrpc_decode($response->getBody()); + if (xmlrpc_is_fault($response)) { + common_log(LOG_WARNING, + "Pingback error for '$url' ($endpoint): ". + "$response[faultString] ($response[faultCode])"); + } else { + common_log(LOG_INFO, + "Pingback success for '$url' ($endpoint): ". + "'$response'"); + } + } catch (HTTP_Request2_Exception $e) { + common_log(LOG_WARNING, + "Pingback request failed for '$url' ($endpoint)"); + } + } + + // Largely cadged from trackback_cls.php by + // Ran Aroussi , GPL2 or any later version + // http://phptrackback.sourceforge.net/ + + function getTrackback($text, $url) + { + if (preg_match_all('/()/sm', $text, $match, PREG_SET_ORDER)) { + for ($i = 0; $i < count($match); $i++) { + if (preg_match('|dc:identifier="' . preg_quote($url) . '"|ms', $match[$i][1])) { + $rdf_array[] = trim($match[$i][1]); + } + } + + // Loop through the RDFs array and extract trackback URIs + + $tb_array = array(); // <- holds list of trackback URIs + + if (!empty($rdf_array)) { + + for ($i = 0; $i < count($rdf_array); $i++) { + if (preg_match('/trackback:ping="([^"]+)"/', $rdf_array[$i], $array)) { + $tb_array[] = trim($array[1]); + break; + } + } + } + + // Return Trackbacks + + if (empty($tb_array)) { + return null; + } else { + return $tb_array[0]; + } + } + + if (preg_match_all('/(]*?rel=[\'"]trackback[\'"][^>]*?>)/', $text, $match)) { + foreach ($match[1] as $atag) { + if (preg_match('/href=[\'"]([^\'"]*?)[\'"]/', $atag, $url)) { + return $url[1]; + } + } + } + + return null; + + } + + function trackback($url, $endpoint) + { + $profile = $this->notice->getProfile(); + + $args = array('title' => sprintf(_('%1$s\'s status on %2$s'), + $profile->nickname, + common_exact_date($this->notice->created)), + 'excerpt' => $this->notice->content, + 'url' => $this->notice->uri, + 'blog_name' => $profile->nickname); + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $result = $fetcher->post($endpoint, + http_build_query($args), + array('User-Agent: ' . $this->userAgent())); + + if ($result->status != '200') { + common_log(LOG_WARNING, + "Trackback error for '$url' ($endpoint): ". + "$result->body"); + } else { + common_log(LOG_INFO, + "Trackback success for '$url' ($endpoint): ". + "'$result->body'"); + } + } + + function userAgent() + { + return 'LinkbackPlugin/'.LINKBACKPLUGIN_VERSION . + ' StatusNet/' . STATUSNET_VERSION; + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'Linkback', + 'version' => LINKBACKPLUGIN_VERSION, + 'author' => 'Evan Prodromou', + 'homepage' => 'http://status.net/wiki/Plugin:Linkback', + 'rawdescription' => + _m('Notify blog authors when their posts have been linked in '. + 'microblog notices using '. + 'Pingback '. + 'or Trackback protocols.')); + return true; + } +} -- cgit v1.2.3-54-g00ecf From 500f8e5a8727bc09e0b935813482881a468af10b Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 20 Sep 2010 20:54:30 +0200 Subject: * i18n/L10n updates. * remove superfluous whitespace. --- plugins/FirePHP/FirePHPPlugin.php | 1 - plugins/GeoURL/GeoURLPlugin.php | 3 --- plugins/Geonames/GeonamesPlugin.php | 7 ----- plugins/Gravatar/GravatarPlugin.php | 1 - plugins/Imap/imapmanager.php | 2 +- plugins/LdapCommon/LdapCommon.php | 22 +++++++--------- plugins/LdapCommon/MemcacheSchemaCache.php | 42 +++++++++++++++--------------- plugins/LilUrl/LilUrlPlugin.php | 3 +-- plugins/Linkback/LinkbackPlugin.php | 2 -- plugins/Memcache/MemcachePlugin.php | 7 ----- 10 files changed, 32 insertions(+), 58 deletions(-) (limited to 'plugins/Linkback/LinkbackPlugin.php') diff --git a/plugins/FirePHP/FirePHPPlugin.php b/plugins/FirePHP/FirePHPPlugin.php index d984ec1af..27f760c81 100644 --- a/plugins/FirePHP/FirePHPPlugin.php +++ b/plugins/FirePHP/FirePHPPlugin.php @@ -69,4 +69,3 @@ class FirePHPPlugin extends Plugin return true; } } - diff --git a/plugins/GeoURL/GeoURLPlugin.php b/plugins/GeoURL/GeoURLPlugin.php index 01178f39c..91da81a5a 100644 --- a/plugins/GeoURL/GeoURLPlugin.php +++ b/plugins/GeoURL/GeoURLPlugin.php @@ -46,7 +46,6 @@ if (!defined('STATUSNET')) { * * @seeAlso Location */ - class GeoURLPlugin extends Plugin { public $ping = 'http://geourl.org/ping/'; @@ -58,7 +57,6 @@ class GeoURLPlugin extends Plugin * * @return boolean event handler flag */ - function onEndShowHeadElements($action) { $name = $action->trimmed('action'); @@ -94,7 +92,6 @@ class GeoURLPlugin extends Plugin * * @return boolean event handler flag */ - function onHandleQueuedNotice(&$notice) { if ($notice->is_local == 1) { diff --git a/plugins/Geonames/GeonamesPlugin.php b/plugins/Geonames/GeonamesPlugin.php index 3815a31fa..310641ce6 100644 --- a/plugins/Geonames/GeonamesPlugin.php +++ b/plugins/Geonames/GeonamesPlugin.php @@ -46,7 +46,6 @@ if (!defined('STATUSNET')) { * * @seeAlso Location */ - class GeonamesPlugin extends Plugin { const LOCATION_NS = 1; @@ -71,7 +70,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue (results in $location) */ - function onLocationFromName($name, $language, &$location) { $loc = $this->getCache(array('name' => $name, @@ -129,7 +127,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue (results in $location) */ - function onLocationFromId($id, $ns, $language, &$location) { if ($ns != self::LOCATION_NS) { @@ -198,7 +195,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue (results in $location) */ - function onLocationFromLatLon($lat, $lon, $language, &$location) { // Make sure they're canonical @@ -276,7 +272,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue */ - function onLocationNameLanguage($location, $language, &$name) { if ($location->location_ns != self::LOCATION_NS) { @@ -344,7 +339,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue */ - function onLocationUrl($location, &$url) { if ($location->location_ns != self::LOCATION_NS) { @@ -368,7 +362,6 @@ class GeonamesPlugin extends Plugin * * @return boolean whether to continue */ - function onLocationRdfUrl($location, &$url) { if ($location->location_ns != self::LOCATION_NS) { diff --git a/plugins/Gravatar/GravatarPlugin.php b/plugins/Gravatar/GravatarPlugin.php index e4782cb9f..dd8ff7217 100644 --- a/plugins/Gravatar/GravatarPlugin.php +++ b/plugins/Gravatar/GravatarPlugin.php @@ -132,7 +132,6 @@ class GravatarPlugin extends Plugin return false; } - function gravatar_save() { $cur = common_current_user(); diff --git a/plugins/Imap/imapmanager.php b/plugins/Imap/imapmanager.php index 68b8b7d87..e2f8c6d54 100644 --- a/plugins/Imap/imapmanager.php +++ b/plugins/Imap/imapmanager.php @@ -44,7 +44,7 @@ class ImapManager extends IoManager */ public static function get() { - throw new Exception('ImapManager should be created using it\'s constructor, not the static get method'); + throw new Exception(_m('ImapManager should be created using its constructor, not the using the static get method.')); } /** diff --git a/plugins/LdapCommon/LdapCommon.php b/plugins/LdapCommon/LdapCommon.php index 1f1647a75..7dea1f0ed 100644 --- a/plugins/LdapCommon/LdapCommon.php +++ b/plugins/LdapCommon/LdapCommon.php @@ -60,13 +60,13 @@ class LdapCommon $this->ldap_config = $this->get_ldap_config(); if(!isset($this->host)){ - throw new Exception("must specify a host"); + throw new Exception(_m("A host must be specified.")); } if(!isset($this->basedn)){ - throw new Exception("must specify a basedn"); + throw new Exception(_m('"basedn" must be specified.')); } if(!isset($this->attributes['username'])){ - throw new Exception("username attribute must be set."); + throw new Exception(_m('The username attribute must be set.')); } } @@ -173,7 +173,7 @@ class LdapCommon $ldap = $this->get_ldap_connection($config); $entry = $this->get_user($username,array(),$ldap); - + $newCryptedPassword = $this->hashPassword($newpassword, $this->password_encoding); if ($newCryptedPassword===false) { return false; @@ -254,15 +254,14 @@ class LdapCommon * @return string The hashed password. * */ - - function hashPassword( $passwordClear, $encodageType ) + function hashPassword( $passwordClear, $encodageType ) { $encodageType = strtolower( $encodageType ); switch( $encodageType ) { - case 'crypt': - $cryptedPassword = '{CRYPT}' . crypt($passwordClear,$this->randomSalt(2)); + case 'crypt': + $cryptedPassword = '{CRYPT}' . crypt($passwordClear,$this->randomSalt(2)); break; - + case 'ext_des': // extended des crypt. see OpenBSD crypt man page. if ( ! defined( 'CRYPT_EXT_DES' ) || CRYPT_EXT_DES == 0 ) {return FALSE;} //Your system crypt library does not support extended DES encryption. @@ -345,8 +344,7 @@ class LdapCommon * @param int $length The length of the salt string to generate. * @return string The generated salt string. */ - - function randomSalt( $length ) + function randomSalt( $length ) { $possible = '0123456789'. 'abcdefghijklmnopqrstuvwxyz'. @@ -360,10 +358,8 @@ class LdapCommon return $str; } - } class LdapInvalidCredentialsException extends Exception { - } diff --git a/plugins/LdapCommon/MemcacheSchemaCache.php b/plugins/LdapCommon/MemcacheSchemaCache.php index 4ee2e8e16..960164fd3 100644 --- a/plugins/LdapCommon/MemcacheSchemaCache.php +++ b/plugins/LdapCommon/MemcacheSchemaCache.php @@ -1,5 +1,5 @@ c = $cfg['c']; @@ -57,18 +57,18 @@ class MemcacheSchemaCache implements Net_LDAP2_SchemaCache } /** - * Store a schema object in the cache - * - * This method will be called, if Net_LDAP2 has fetched a fresh - * schema object from LDAP and wants to init or refresh the cache. - * - * To invalidate the cache and cause Net_LDAP2 to refresh the cache, - * you can call this method with null or false as value. - * The next call to $ldap->schema() will then refresh the caches object. - * - * @param mixed $schema The object that should be cached - * @return true|Net_LDAP2_Error|false - */ + * Store a schema object in the cache + * + * This method will be called, if Net_LDAP2 has fetched a fresh + * schema object from LDAP and wants to init or refresh the cache. + * + * To invalidate the cache and cause Net_LDAP2 to refresh the cache, + * you can call this method with null or false as value. + * The next call to $ldap->schema() will then refresh the caches object. + * + * @param mixed $schema The object that should be cached + * @return true|Net_LDAP2_Error|false + */ public function storeSchema($schema) { return $this->c->set($this->cacheKey, $schema); } diff --git a/plugins/LilUrl/LilUrlPlugin.php b/plugins/LilUrl/LilUrlPlugin.php index 1c3d6f84b..bd98026fe 100644 --- a/plugins/LilUrl/LilUrlPlugin.php +++ b/plugins/LilUrl/LilUrlPlugin.php @@ -40,7 +40,7 @@ class LilUrlPlugin extends UrlShortenerPlugin function onInitializePlugin(){ parent::onInitializePlugin(); if(!isset($this->serviceUrl)){ - throw new Exception("must specify a serviceUrl"); + throw new Exception(_m('A serviceUrl must be specified.')); } } @@ -71,4 +71,3 @@ class LilUrlPlugin extends UrlShortenerPlugin return true; } } - diff --git a/plugins/Linkback/LinkbackPlugin.php b/plugins/Linkback/LinkbackPlugin.php index 8e44beae1..797572d7f 100644 --- a/plugins/Linkback/LinkbackPlugin.php +++ b/plugins/Linkback/LinkbackPlugin.php @@ -49,7 +49,6 @@ define('LINKBACKPLUGIN_VERSION', '0.1'); * * @see Event */ - class LinkbackPlugin extends Plugin { var $notice = null; @@ -154,7 +153,6 @@ class LinkbackPlugin extends Plugin // Largely cadged from trackback_cls.php by // Ran Aroussi , GPL2 or any later version // http://phptrackback.sourceforge.net/ - function getTrackback($text, $url) { if (preg_match_all('/()/sm', $text, $match, PREG_SET_ORDER)) { diff --git a/plugins/Memcache/MemcachePlugin.php b/plugins/Memcache/MemcachePlugin.php index c3ca5c135..f0c473c31 100644 --- a/plugins/Memcache/MemcachePlugin.php +++ b/plugins/Memcache/MemcachePlugin.php @@ -48,7 +48,6 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ - class MemcachePlugin extends Plugin { static $cacheInitialized = false; @@ -70,7 +69,6 @@ class MemcachePlugin extends Plugin * * @return boolean flag value */ - function onInitializePlugin() { if (self::$cacheInitialized) { @@ -101,7 +99,6 @@ class MemcachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheGet(&$key, &$value) { $this->_ensureConn(); @@ -121,7 +118,6 @@ class MemcachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success) { $this->_ensureConn(); @@ -160,7 +156,6 @@ class MemcachePlugin extends Plugin * * @return boolean hook success */ - function onStartCacheDelete(&$key, &$success) { $this->_ensureConn(); @@ -194,7 +189,6 @@ class MemcachePlugin extends Plugin * * @return void */ - private function _ensureConn() { if (empty($this->_conn)) { @@ -253,4 +247,3 @@ class MemcachePlugin extends Plugin return true; } } - -- cgit v1.2.3-54-g00ecf