]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/util.php
The overloaded DB_DataObject function staticGet is now called getKV
[quix0rs-gnu-social.git] / lib / util.php
index 819dcc5058a5bffb9b1e886bc65af0d0a5b2c123..bda78afe13f9de41a21287b317a1b87393cb8795 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
+ * Copyright (C) 2008-2011, StatusNet, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
@@ -233,7 +233,13 @@ function common_check_user($nickname, $password)
     $authenticatedUser = false;
 
     if (Event::handle('StartCheckPassword', array($nickname, $password, &$authenticatedUser))) {
-        $user = User::staticGet('nickname', common_canonical_nickname($nickname));
+
+        if (common_is_email($nickname)) {
+            $user = User::getKV('email', common_canonical_email($nickname));
+        } else {
+            $user = User::getKV('nickname', common_canonical_nickname($nickname));
+        }
+
         if (!empty($user)) {
             if (!empty($password)) { // never allow login with blank password
                 if (0 == strcmp(common_munge_password($password, $user->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;
@@ -638,7 +644,7 @@ function common_linkify_mention($mention)
 
         $xs->elementStart('span', 'vcard');
         $xs->elementStart('a', $attrs);
-        $xs->element('span', 'fn nickname profile', $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));
@@ -754,17 +760,19 @@ function common_find_mentions($text, $notice)
         foreach ($hmatches[1] as $hmatch) {
 
             $tag = common_canonical_tag($hmatch[0]);
-
-            $tagged = Profile_tag::getTagged($sender->id, $tag);
-
-            $url = common_local_url('subscriptions',
-                                    array('nickname' => $sender->nickname,
-                                          'tag' => $tag));
-
-            $mentions[] = array('mentioned' => $tagged,
-                                'text' => $hmatch[0],
-                                'position' => $hmatch[1],
-                                'url' => $url);
+            $plist = Profile_list::getByTaggerAndTag($sender->id, $tag);
+            if (!empty($plist) && !$plist->private) {
+                $tagged = $sender->getTaggedSubscribers($tag);
+
+                $url = common_local_url('showprofiletag',
+                                        array('tagger' => $sender->nickname,
+                                              'tag' => $tag));
+
+                $mentions[] = array('mentioned' => $tagged,
+                                    'text' => $hmatch[0],
+                                    'position' => $hmatch[1],
+                                    'url' => $url);
+            }
         }
 
         Event::handle('EndFindMentions', array($sender, $text, &$mentions));
@@ -971,7 +979,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')) {
@@ -985,7 +993,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;
             }
@@ -1032,7 +1040,9 @@ 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);
 
@@ -1119,8 +1129,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)
@@ -1137,7 +1150,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(),
@@ -1204,9 +1217,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();
         }
@@ -1219,19 +1232,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 = 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;
 }
@@ -1293,11 +1309,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?)
 
@@ -1445,6 +1461,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',
@@ -1459,8 +1476,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')) {
@@ -1491,16 +1507,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)
@@ -1855,6 +1873,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.
@@ -1926,30 +1968,68 @@ function common_confirmation_code($bits)
 
 // convert markup to HTML
 
-function common_markup_to_html($c)
+function common_markup_to_html($c, $args=null)
 {
+    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('/%%user.(\w+)%%/e', "common_user_property('\\1')", $c);
     $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);
     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':
+        return $profile->getAvatar(AVATAR_STREAM_SIZE);
+        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)
@@ -2085,7 +2165,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;
@@ -2230,3 +2314,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)));
+}