X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Futil.php;h=fdd678abdb1406c859acba5092faf1933274deac;hb=87370f0cb18aab5d2c5f7d1325f47692fa39ad90;hp=d48d4c18c59b485c6ded326c1d8493be6bda1fa8;hpb=ad86eb78d3dc395b438d1543a36eca509f53e9d4;p=quix0rs-gnu-social.git diff --git a/lib/util.php b/lib/util.php index d48d4c18c5..fdd678abdb 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1,7 +1,7 @@ id), @@ -309,7 +315,7 @@ function common_set_user($user) return true; } else if (is_string($user)) { $nickname = $user; - $user = User::staticGet('nickname', $nickname); + $user = User::getKV('nickname', $nickname); } else if (!($user instanceof User)) { return false; } @@ -407,7 +413,7 @@ function common_remembered_user() return null; } - $rm = Remember_me::staticGet($code); + $rm = Remember_me::getKV('code', $code); if (!$rm) { common_log(LOG_WARNING, 'No such remember code: ' . $code); @@ -421,7 +427,7 @@ function common_remembered_user() return null; } - $user = User::staticGet($rm->user_id); + $user = User::getKV('id', $rm->user_id); if (!$user) { common_log(LOG_WARNING, 'No such user for rememberme: ' . $rm->user_id); @@ -478,7 +484,7 @@ function common_current_user() common_ensure_session(); $id = isset($_SESSION['userid']) ? $_SESSION['userid'] : false; if ($id) { - $user = User::staticGet($id); + $user = User::getKV($id); if ($user) { $_cur = $user; return $_cur; @@ -579,8 +585,8 @@ function common_render_content($text, $notice) $r = common_render_text($text); $id = $notice->profile_id; $r = common_linkify_mentions($r, $notice); - $r = preg_replace('/(^|[\s\.\,\:\;]+)!(' . Nickname::DISPLAY_FMT . ')/e', - "'\\1!'.common_group_link($id, '\\2')", $r); + $r = preg_replace_callback('/(^|[\s\.\,\:\;]+)!(' . Nickname::DISPLAY_FMT . ')/', + function ($m) { return "{$m[1]}!".common_group_link($id, $m[2]); }, $r); return $r; } @@ -638,7 +644,7 @@ function common_linkify_mention($mention) $xs->elementStart('span', 'vcard'); $xs->elementStart('a', $attrs); - $xs->element('span', 'fn nickname', $mention['text']); + $xs->element('span', 'fn nickname mention', $mention['text']); $xs->elementEnd('a'); $xs->elementEnd('span'); @@ -669,7 +675,7 @@ function common_find_mentions($text, $notice) { $mentions = array(); - $sender = Profile::staticGet('id', $notice->profile_id); + $sender = Profile::getKV('id', $notice->profile_id); if (empty($sender)) { return $mentions; @@ -684,14 +690,14 @@ function common_find_mentions($text, $notice) // Is it a reply? if (!empty($notice) && !empty($notice->reply_to)) { - $originalNotice = Notice::staticGet('id', $notice->reply_to); + $originalNotice = Notice::getKV('id', $notice->reply_to); if (!empty($originalNotice)) { - $originalAuthor = Profile::staticGet('id', $originalNotice->profile_id); + $originalAuthor = Profile::getKV('id', $originalNotice->profile_id); $ids = $originalNotice->getReplies(); foreach ($ids as $id) { - $repliedTo = Profile::staticGet('id', $id); + $repliedTo = Profile::getKV('id', $id); if (!empty($repliedTo)) { $originalMentions[$repliedTo->nickname] = $repliedTo; } @@ -723,7 +729,7 @@ function common_find_mentions($text, $notice) } if (!empty($mentioned)) { - $user = User::staticGet('id', $mentioned->id); + $user = User::getKV('id', $mentioned->id); if ($user) { $url = common_local_url('userbyid', array('id' => $user->id)); @@ -806,7 +812,8 @@ function common_render_text($text) $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r); $r = common_replace_urls_callback($r, 'common_linkify'); - $r = preg_replace('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/ue', "'\\1#'.common_tag_link('\\2')", $r); + $r = preg_replace_callback('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/u', + function ($m) { return "{$m[1]}#".common_tag_link($m[2]); }, $r); // XXX: machine tags return $r; } @@ -973,7 +980,7 @@ function common_linkify($url) { // Check to see whether this is a known "attachment" URL. - $f = File::staticGet('url', $longurl); + $f = File::getKV('url', $longurl); if (empty($f)) { if (common_config('attachments', 'process_links')) { @@ -987,7 +994,7 @@ function common_linkify($url) { $is_attachment = true; $attachment_id = $f->id; - $thumb = File_thumbnail::staticGet('file_id', $f->id); + $thumb = File_thumbnail::getKV('file_id', $f->id); if (!empty($thumb)) { $has_thumb = true; } @@ -1034,11 +1041,13 @@ function common_linkify($url) { */ function common_shorten_links($text, $always = false, User $user=null) { - $user = common_current_user(); + if ($user === null) { + $user = common_current_user(); + } $maxLength = User_urlshortener_prefs::maxNoticeLength($user); - if ($always || mb_strlen($text) > $maxLength) { + if ($always || ($maxLength != -1 && mb_strlen($text) > $maxLength)) { return common_replace_urls_callback($text, array('File_redirection', 'forceShort'), $user); } else { return common_replace_urls_callback($text, array('File_redirection', 'makeShort'), $user); @@ -1121,8 +1130,11 @@ function common_tag_link($tag) function common_canonical_tag($tag) { + // only alphanum + $tag = preg_replace('/[^\pL\pN]/u', '', $tag); $tag = mb_convert_case($tag, MB_CASE_LOWER, "UTF-8"); - return str_replace(array('-', '_', '.'), '', $tag); + $tag = substr($tag, 0, 64); + return $tag; } function common_valid_profile_tag($str) @@ -1139,7 +1151,7 @@ function common_valid_profile_tag($str) */ function common_group_link($sender_id, $nickname) { - $sender = Profile::staticGet($sender_id); + $sender = Profile::getKV($sender_id); $group = User_group::getForNickname($nickname, $sender); if ($sender && $group && $sender->isMember($group)) { $attrs = array('href' => $group->permalink(), @@ -1150,7 +1162,7 @@ function common_group_link($sender_id, $nickname) $xs = new XMLStringer(); $xs->elementStart('span', 'vcard'); $xs->elementStart('a', $attrs); - $xs->element('span', 'fn nickname', $nickname); + $xs->element('span', 'fn nickname group', $nickname); $xs->elementEnd('a'); $xs->elementEnd('span'); return $xs->getString(); @@ -1206,9 +1218,9 @@ function common_relative_profile($sender, $nickname, $dt=null) return $recipient; } // If this is a local user, try to find a local user with that nickname. - $sender = User::staticGet($sender->id); + $sender = User::getKV($sender->id); if ($sender) { - $recipient_user = User::staticGet('nickname', $nickname); + $recipient_user = User::getKV('nickname', $nickname); if ($recipient_user) { return $recipient_user->getProfile(); } @@ -1221,19 +1233,22 @@ function common_relative_profile($sender, $nickname, $dt=null) function common_local_url($action, $args=null, $params=null, $fragment=null, $addSession=true) { - $r = Router::get(); - $path = $r->build($action, $args, $params, $fragment); + if (Event::handle('StartLocalURL', array(&$action, &$params, &$fragment, &$addSession, &$url))) { + $r = Router::get(); + $path = $r->build($action, $args, $params, $fragment); - $ssl = common_is_sensitive($action); + $ssl = StatusNet::isHTTPS() || common_is_sensitive($action); - if (common_config('site','fancy')) { - $url = common_path(mb_substr($path, 1), $ssl, $addSession); - } else { - if (mb_strpos($path, '/index.php') === 0) { - $url = common_path(mb_substr($path, 1), $ssl, $addSession); + if (common_config('site','fancy')) { + $url = common_path($path, $ssl, $addSession); } else { - $url = common_path('index.php'.$path, $ssl, $addSession); + if (mb_strpos($path, '/index.php') === 0) { + $url = common_path($path, $ssl, $addSession); + } else { + $url = common_path('index.php/'.$path, $ssl, $addSession); + } } + Event::handle('EndLocalURL', array(&$action, &$params, &$fragment, &$addSession, &$url)); } return $url; } @@ -1245,10 +1260,10 @@ function common_is_sensitive($action) 'register', 'passwordsettings', 'api', - 'ApiOauthRequestToken', - 'ApiOauthAccessToken', - 'ApiOauthAuthorize', - 'ApiOauthPin', + 'ApiOAuthRequestToken', + 'ApiOAuthAccessToken', + 'ApiOAuthAuthorize', + 'ApiOAuthPin', 'showapplication' ); $ssl = null; @@ -1295,11 +1310,11 @@ function common_inject_session($url, $serverpart = null) { if (common_have_session()) { - if (empty($serverpart)) { - $serverpart = parse_url($url, PHP_URL_HOST); - } + if (empty($serverpart)) { + $serverpart = parse_url($url, PHP_URL_HOST); + } - $currentServer = $_SERVER['HTTP_HOST']; + $currentServer = (array_key_exists('HTTP_HOST', $_SERVER)) ? $_SERVER['HTTP_HOST'] : null; // Are we pointing to another server (like an SSL server?) @@ -1447,6 +1462,7 @@ function common_redirect($url, $code=307) header('HTTP/1.1 '.$code.' '.$status[$code]); header("Location: $url"); + header("Connection: close"); $xo = new XMLOutputter(); $xo->startXML('a', @@ -1461,8 +1477,7 @@ function common_redirect($url, $code=307) function common_enqueue_notice($notice) { - static $localTransports = array('omb', - 'ping'); + static $localTransports = array('ping'); $transports = array(); if (common_config('sms', 'enabled')) { @@ -1493,16 +1508,18 @@ function common_enqueue_notice($notice) } /** - * Broadcast profile updates to OMB and other remote subscribers. + * Legacy function to broadcast profile updates to OMB remote subscribers. + * + * XXX: This probably needs killing, but there are several bits of code + * that broadcast profile changes that need to be dealt with. AFAIK + * this function is only used for OMB. -z * * Since this may be slow with a lot of subscribers or bad remote sites, * this is run through the background queues if possible. */ function common_broadcast_profile(Profile $profile) { - $qm = QueueManager::get(); - $qm->enqueue($profile, "profile"); - return true; + Event::handle('BroadcastProfile', array($profile)); } function common_profile_url($nickname) @@ -1857,6 +1874,30 @@ function common_config($main, $sub) array_key_exists($sub, $config[$main])) ? $config[$main][$sub] : false; } +function common_config_set($main, $sub, $value) +{ + global $config; + if (!array_key_exists($main, $config)) { + $config[$main] = array(); + } + $config[$main][$sub] = $value; +} + +function common_config_append($main, $sub, $value) +{ + global $config; + if (!array_key_exists($main, $config)) { + $config[$main] = array(); + } + if (!array_key_exists($sub, $config[$main])) { + $config[$main][$sub] = array(); + } + if (!is_array($config[$main][$sub])) { + $config[$main][$sub] = array($config[$main][$sub]); + } + array_push($config[$main][$sub], $value); +} + /** * Pull arguments from a GET/POST/REQUEST array with first-level input checks: * strips "magic quotes" slashes if necessary, and kills invalid UTF-8 strings. @@ -1928,30 +1969,72 @@ function common_confirmation_code($bits) // convert markup to HTML -function common_markup_to_html($c) +function common_markup_to_html($c, $args=null) { - $c = preg_replace('/%%action.(\w+)%%/e', "common_local_url('\\1')", $c); - $c = preg_replace('/%%doc.(\w+)%%/e', "common_local_url('doc', array('title'=>'\\1'))", $c); - $c = preg_replace('/%%(\w+).(\w+)%%/e', 'common_config(\'\\1\', \'\\2\')', $c); + if (is_null($args)) { + $args = array(); + } + + // XXX: not very efficient + + foreach ($args as $name => $value) { + $c = preg_replace('/%%arg.'.$name.'%%/', $value, $c); + } + + $c = preg_replace_callback('/%%user.(\w+)%%/', function ($m) { return common_user_property($m[1]); }, $c); + $c = preg_replace_callback('/%%action.(\w+)%%/', function ($m) { return common_local_url($m[1]); }, $c); + $c = preg_replace_callback('/%%doc.(\w+)%%/', function ($m) { return common_local_url('doc', array('title'=>$m[1])); }, $c); + $c = preg_replace_callback('/%%(\w+).(\w+)%%/', function ($m) { return common_config($m[1], $m[2]); }, $c); return Markdown($c); } -function common_profile_uri($profile) +function common_user_property($property) { - if (!$profile) { + $profile = Profile::current(); + + if (empty($profile)) { return null; } - $user = User::staticGet($profile->id); - if ($user) { - return $user->uri; + + switch ($property) { + case 'profileurl': + case 'nickname': + case 'fullname': + case 'location': + case 'bio': + return $profile->$property; + break; + case 'avatar': + try { + return $profile->getAvatar(AVATAR_STREAM_SIZE); + } catch (Exception $e) { + return null; + } + break; + case 'bestname': + return $profile->getBestName(); + break; + default: + return null; } +} - $remote = Remote_profile::staticGet($profile->id); - if ($remote) { - return $remote->uri; +function common_profile_uri($profile) +{ + $uri = null; + + if (!empty($profile)) { + if (Event::handle('StartCommonProfileURI', array($profile, &$uri))) { + $user = User::getKV($profile->id); + if (!empty($user)) { + $uri = $user->uri; + } + Event::handle('EndCommonProfileURI', array($profile, &$uri)); + } } + // XXX: this is a very bad profile! - return null; + return $uri; } function common_canonical_sms($sms) @@ -2072,7 +2155,7 @@ function common_shorten_url($long_url, User $user=null, $force = false) // $force forces shortening even if it's not strictly needed // I doubt URL shortening is ever 'strictly' needed. - ESP - if (mb_strlen($long_url) < $maxUrlLength && !$force) { + if (($maxUrlLength == -1 || mb_strlen($long_url) < $maxUrlLength) && !$force) { return $long_url; } @@ -2087,7 +2170,11 @@ function common_shorten_url($long_url, User $user=null, $force = false) } else { $shortenedUrl = common_local_url('redirecturl', array('id' => $f->id)); - return $shortenedUrl; + if ((mb_strlen($shortenedUrl) < mb_strlen($long_url)) || $force) { + return $shortenedUrl; + } else { + return $long_url; + } } } else { return $long_url; @@ -2232,3 +2319,36 @@ function common_log_perf_counters() } } } + +function common_is_email($str) +{ + return (strpos($str, '@') !== false); +} + +function common_init_stats() +{ + global $_mem, $_ts; + + $_mem = memory_get_usage(true); + $_ts = microtime(true); +} + +function common_log_delta($comment=null) +{ + global $_mem, $_ts; + + $mold = $_mem; + $told = $_ts; + + $_mem = memory_get_usage(true); + $_ts = microtime(true); + + $mtotal = $_mem - $mold; + $ttotal = $_ts - $told; + + if (empty($comment)) { + $comment = 'Delta'; + } + + common_debug(sprintf("%s: %d %d", $comment, $mtotal, round($ttotal * 1000000))); +}