]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge commit 'origin/master' into testing
authorBrion Vibber <brion@pobox.com>
Tue, 9 Mar 2010 19:27:30 +0000 (11:27 -0800)
committerBrion Vibber <brion@pobox.com>
Tue, 9 Mar 2010 19:27:30 +0000 (11:27 -0800)
actions/otp.php
lib/apiauth.php
lib/default.php
plugins/OStatus/classes/HubSub.php
plugins/OStatus/lib/feeddiscovery.php
scripts/flushsite.php [new file with mode: 0644]
scripts/importtwitteratom.php [new file with mode: 0644]

index acf84aee814216071c5f8087137997275cf88387..1e06603d43f6cfeb764d528c748925f2181bdbd4 100644 (file)
@@ -126,6 +126,8 @@ class OtpAction extends Action
         $this->lt->delete();
         $this->lt = null;
 
+        common_real_login(true);
+
         if ($this->rememberme) {
             common_rememberme($this->user);
         }
index 5090871cfe18a931600558e06c202b68e437d08b..f63c84d8f38d768e950c6b65b3b0361bbe45b989 100644 (file)
@@ -235,7 +235,11 @@ class ApiAuthAction extends ApiAction
     {
         $this->basicAuthProcessHeader();
 
-        $realm = common_config('site', 'name') . ' API';
+        $realm = common_config('api', 'realm');
+
+        if (empty($realm)) {
+            $realm = common_config('site', 'name') . ' API';
+        }
 
         if (!isset($this->auth_user_nickname) && $required) {
             header('WWW-Authenticate: Basic realm="' . $realm . '"');
index bdd78d4d8618cdc01edc7ab28d8692372c6db4c3..46d3d4774ff6dcb2453baa23c146d877f3e76c58 100644 (file)
@@ -293,4 +293,6 @@ $default =
         array('crawldelay' => 0,
               'disallow' => array('main', 'settings', 'admin', 'search', 'message')
               ),
+        'api' =>
+        array('realm' => null),
         );
index 3120a70f9fb39dd978c14482c59b79ed90abbbc4..c420b3eef8414826101910e08ec9f8e07bb1a642 100644 (file)
@@ -192,7 +192,7 @@ class HubSub extends Memcached_DataObject
 
         // Any existing query string parameters must be preserved
         $url = $this->callback;
-        if (strpos('?', $url) !== false) {
+        if (strpos($url, '?') !== false) {
             $url .= '&';
         } else {
             $url .= '?';
index 7afb71bdc16044ad8ec763e64f2b2d442df5a0ae..ff76b229e76923030f0d56242bb4467024b93dbf 100644 (file)
@@ -129,7 +129,7 @@ class FeedDiscovery
     function initFromResponse($response)
     {
         if (!$response->isOk()) {
-            throw new FeedSubBadResponseException($response->getCode());
+            throw new FeedSubBadResponseException($response->getStatus());
         }
 
         $sourceurl = $response->getUrl();
diff --git a/scripts/flushsite.php b/scripts/flushsite.php
new file mode 100644 (file)
index 0000000..b7f385a
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+$shortoptions = 'd';
+$longoptions = array('delete');
+
+$helptext = <<<END_OF_FLUSHSITE_HELP
+flushsite.php -s<sitename>
+Flush the site with the given name from memcached.
+
+END_OF_FLUSHSITE_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+$nickname = common_config('site', 'nickname');
+
+$sn = Status_network::memGet('nickname', $nickname);
+
+if (empty($sn)) {
+    print "No such site.\n";
+    exit(-1);
+}
+
+print "Flushing cache for {$nickname}...";
+$sn->decache();
+print "OK.\n";
\ No newline at end of file
diff --git a/scripts/importtwitteratom.php b/scripts/importtwitteratom.php
new file mode 100644 (file)
index 0000000..7316f21
--- /dev/null
@@ -0,0 +1,192 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+$shortoptions = 'i:n:f:';
+$longoptions = array('id=', 'nickname=', 'file=');
+
+$helptext = <<<END_OF_IMPORTTWITTERATOM_HELP
+importtwitteratom.php [options]
+import an Atom feed from Twitter as notices by a user
+
+  -i --id       ID of user to update
+  -n --nickname nickname of the user to update
+  -f --file     file to import (Atom-only for now)
+
+END_OF_IMPORTTWITTERATOM_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php';
+
+function getUser()
+{
+    $user = null;
+
+    if (have_option('i', 'id')) {
+        $id = get_option_value('i', 'id');
+        $user = User::staticGet('id', $id);
+        if (empty($user)) {
+            throw new Exception("Can't find user with id '$id'.");
+        }
+    } else if (have_option('n', 'nickname')) {
+        $nickname = get_option_value('n', 'nickname');
+        $user = User::staticGet('nickname', $nickname);
+        if (empty($user)) {
+            throw new Exception("Can't find user with nickname '$nickname'");
+        }
+    } else {
+        show_help();
+        exit(1);
+    }
+
+    return $user;
+}
+
+function getAtomFeedDocument()
+{
+    $filename = get_option_value('f', 'file');
+
+    if (empty($filename)) {
+        show_help();
+        exit(1);
+    }
+
+    if (!file_exists($filename)) {
+        throw new Exception("No such file '$filename'.");
+    }
+
+    if (!is_file($filename)) {
+        throw new Exception("Not a regular file: '$filename'.");
+    }
+
+    if (!is_readable($filename)) {
+        throw new Exception("File '$filename' not readable.");
+    }
+
+    $xml = file_get_contents($filename);
+
+    $dom = DOMDocument::loadXML($xml);
+
+    if ($dom->documentElement->namespaceURI != Activity::ATOM ||
+        $dom->documentElement->localName != 'feed') {
+        throw new Exception("'$filename' is not an Atom feed.");
+    }
+
+    return $dom;
+}
+
+function importActivityStream($user, $doc)
+{
+    $feed = $doc->documentElement;
+
+    $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
+
+    for ($i = $entries->length - 1; $i >= 0; $i--) {
+        $entry = $entries->item($i);
+        $activity = new Activity($entry, $feed);
+        $object = $activity->object;
+        if (!have_option('q', 'quiet')) {
+            print $activity->content . "\n";
+        }
+        $html = getTweetHtml($object->link);
+
+        $config = array('safe' => 1,
+                        'deny_attribute' => 'class,rel,id,style,on*');
+
+        $html = htmLawed($html, $config);
+
+        $content = html_entity_decode(strip_tags($html));
+
+        $notice = Notice::saveNew($user->id,
+                                  $content,
+                                  'importtwitter',
+                                  array('uri' => $object->id,
+                                        'url' => $object->link,
+                                        'rendered' => $html,
+                                        'created' => common_sql_date($activity->time),
+                                        'replies' => array(),
+                                        'groups' => array()));
+    }
+}
+
+function getTweetHtml($url)
+{
+    try {
+        $client = new HTTPClient();
+        $response = $client->get($url);
+    } catch (HTTP_Request2_Exception $e) {
+        print "ERROR: HTTP response " . $e->getMessage() . "\n";
+        return false;
+    }
+
+    if (!$response->isOk()) {
+        print "ERROR: HTTP response " . $response->getCode() . "\n";
+        return false;
+    }
+
+    $body = $response->getBody();
+
+    return tweetHtmlFromBody($body);
+}
+
+function tweetHtmlFromBody($body)
+{
+    $doc = DOMDocument::loadHTML($body);
+    $xpath = new DOMXPath($doc);
+
+    $spans = $xpath->query('//span[@class="entry-content"]');
+
+    if ($spans->length == 0) {
+        print "ERROR: No content in tweet page.\n";
+        return '';
+    }
+
+    $span = $spans->item(0);
+
+    $children = $span->childNodes;
+
+    $text = '';
+
+    for ($i = 0; $i < $children->length; $i++) {
+        $child = $children->item($i);
+        if ($child instanceof DOMElement &&
+            $child->tagName == 'a' &&
+            !preg_match('#^https?://#', $child->getAttribute('href'))) {
+            $child->setAttribute('href', 'http://twitter.com' . $child->getAttribute('href'));
+        }
+        $text .= $doc->saveXML($child);
+    }
+
+    return $text;
+}
+
+try {
+
+    $doc = getAtomFeedDocument();
+    $user = getUser();
+
+    importActivityStream($user, $doc);
+
+} catch (Exception $e) {
+    print $e->getMessage()."\n";
+    exit(1);
+}
+