From aa96c3c1d9823382e9e6de0da5084fcc111f2ee5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 2 Dec 2010 10:56:44 -0800 Subject: Fix for tickets #2917, #2262: user URL shortening options not being applied in non-web channels common_shorten_links() can only access the web session's logged-in user, so never properly took user options into effect for posting via XMPP, API, mail, etc. Adds an optional $user parameter on common_shorten_links(), and a $user->shortenLinks() as a clearer interface for that. Tweaked some lower-level functions so $user gets passed down -- making the $notice_id param previously there for saving URLs at notice save time generalized a little. Note also ticket #2919: there's a lot of duplicate code calling the shortening, checking the length, and reporting near-identical error messages. These should be consolidated to aid in code and translation maintenance. --- lib/command.php | 4 ++-- lib/mailhandler.php | 2 +- lib/util.php | 59 +++++++++++++++++++++++++++++++++++++++++------------ lib/xmppmanager.php | 2 +- 4 files changed, 50 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/command.php b/lib/command.php index 2a8075e7b..3fb4d76c7 100644 --- a/lib/command.php +++ b/lib/command.php @@ -479,7 +479,7 @@ class MessageCommand extends Command return; } - $this->text = common_shorten_links($this->text); + $this->text = $this->user->shortenLinks($this->text); if (Message::contentTooLong($this->text)) { // XXX: i18n. Needs plural support. @@ -582,7 +582,7 @@ class ReplyCommand extends Command return; } - $this->text = common_shorten_links($this->text); + $this->text = $this->user->shortenLinks($this->text); if (Notice::contentTooLong($this->text)) { // XXX: i18n. Needs plural support. diff --git a/lib/mailhandler.php b/lib/mailhandler.php index 69eb26bdd..459657ffe 100644 --- a/lib/mailhandler.php +++ b/lib/mailhandler.php @@ -55,7 +55,7 @@ class MailHandler return true; } $msg = $this->cleanup_msg($msg); - $msg = common_shorten_links($msg); + $msg = $user->shortenLinks($msg); if (Notice::contentTooLong($msg)) { $this->error($from, sprintf(_('That\'s too long. Maximum notice size is %d character.', 'That\'s too long. Maximum notice size is %d characters.', diff --git a/lib/util.php b/lib/util.php index 42762b22f..26b20b5e1 100644 --- a/lib/util.php +++ b/lib/util.php @@ -789,7 +789,14 @@ function common_render_text($text) return $r; } -function common_replace_urls_callback($text, $callback, $notice_id = null) { +/** + * Find links in the given text and pass them to the given callback function. + * + * @param string $text + * @param function($text, $arg) $callback: return replacement text + * @param mixed $arg: optional argument will be passed on to the callback + */ +function common_replace_urls_callback($text, $callback, $arg = null) { // Start off with a regex $regex = '#'. '(?:^|[\s\<\>\(\)\[\]\{\}\\\'\\\";]+)(?![\@\!\#])'. @@ -830,10 +837,21 @@ function common_replace_urls_callback($text, $callback, $notice_id = null) { '#ixu'; //preg_match_all($regex,$text,$matches); //print_r($matches); - return preg_replace_callback($regex, curry('callback_helper',$callback,$notice_id) ,$text); + return preg_replace_callback($regex, curry('callback_helper',$callback,$arg) ,$text); } -function callback_helper($matches, $callback, $notice_id) { +/** + * Intermediate callback for common_replace_links(), helps resolve some + * ambiguous link forms before passing on to the final callback. + * + * @param array $matches + * @param callable $callback + * @param mixed $arg optional argument to pass on as second param to callback + * @return string + * + * @access private + */ +function callback_helper($matches, $callback, $arg=null) { $url=$matches[1]; $left = strpos($matches[0],$url); $right = $left+strlen($url); @@ -876,11 +894,7 @@ function callback_helper($matches, $callback, $notice_id) { } }while($original_url!=$url); - if(empty($notice_id)){ - $result = call_user_func_array($callback, array($url)); - }else{ - $result = call_user_func_array($callback, array(array($url,$notice_id)) ); - } + $result = call_user_func_array($callback, array($url, $arg)); return substr($matches[0],0,$left) . $result . substr($matches[0],$right); } @@ -980,11 +994,27 @@ function common_linkify($url) { return XMLStringer::estring('a', $attrs, $url); } -function common_shorten_links($text, $always = false) +/** + * Find and shorten links in a given chunk of text if it's longer than the + * configured notice content limit (or unconditionally). + * + * Side effects: may save file and file_redirection records for referenced URLs. + * + * Pass the $user option or call $user->shortenLinks($text) to ensure the proper + * user's options are used; otherwise the current web session user's setitngs + * will be used or ur1.ca if there is no active web login. + * + * @param string $text + * @param boolean $always (optional) + * @param User $user (optional) + * + * @return string + */ +function common_shorten_links($text, $always = false, User $user=null) { $maxLength = Notice::maxContent(); if (!$always && ($maxLength == 0 || mb_strlen($text) <= $maxLength)) return $text; - return common_replace_urls_callback($text, array('File_redirection', 'makeShort')); + return common_replace_urls_callback($text, array('File_redirection', 'makeShort'), $user); } /** @@ -2028,15 +2058,18 @@ function common_database_tablename($tablename) * Length is not considered. * * @param string $long_url + * @param User $user to specify a particular user's options * @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, User $user=null) { $long_url = trim($long_url); - $user = common_current_user(); + if (empty($user)) { + // Current web session + $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 diff --git a/lib/xmppmanager.php b/lib/xmppmanager.php index 238696664..585d044c7 100644 --- a/lib/xmppmanager.php +++ b/lib/xmppmanager.php @@ -398,7 +398,7 @@ class XmppManager extends IoManager function add_notice(&$user, &$pl) { $body = trim($pl['body']); - $content_shortened = common_shorten_links($body); + $content_shortened = $user->shortenLinks($body); if (Notice::contentTooLong($content_shortened)) { $from = jabber_normalize_jid($pl['from']); // TRANS: Response to XMPP source when it sent too long a message. -- cgit v1.2.3-54-g00ecf