]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge mmn's 'nightly' changes
authorMikael Nordfeldth <mmn@hethane.se>
Mon, 18 Aug 2014 08:23:18 +0000 (10:23 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Mon, 18 Aug 2014 08:23:18 +0000 (10:23 +0200)
24 files changed:
actions/apitimelineuser.php
classes/File.php
classes/Profile.php
htaccess.sample
lib/apiaction.php
lib/attachmentlist.php
lib/attachmentlistitem.php
lib/inlineattachmentlist.php
lib/installer.php
lib/siteprofile.php
lib/util.php
plugins/Event/classes/RSVP.php
plugins/TwitterBridge/TwitterBridgePlugin.php
plugins/TwitterBridge/actions/twitterauthorization.php
plugins/TwitterBridge/actions/twitterlogin.php
plugins/TwitterBridge/actions/twittersettings.php
plugins/TwitterBridge/daemons/synctwitterfriends.php
plugins/TwitterBridge/daemons/twitterstatusfetcher.php
plugins/TwitterBridge/lib/tweetinqueuehandler.php
plugins/TwitterBridge/lib/twitterimport.php
plugins/TwitterBridge/lib/twitterqueuehandler.php
plugins/TwitterBridge/tweetctlqueuehandler.php
theme/base/css/display.css
theme/neo/css/display.css

index c0894c5dbaa69491eae1725def746626f66bd477..97462452f22c0642453df81aedb56df3e2213fea 100644 (file)
@@ -59,6 +59,8 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 {
     var $notices = null;
 
+    var $next_id = null;
+
     /**
      * Take arguments for running
      *
@@ -124,6 +126,24 @@ class ApiTimelineUserAction extends ApiBareAuthAction
         $suplink = common_local_url('sup', null, null, $this->target->id);
         header('X-SUP-ID: ' . $suplink);
 
+
+        // paging links
+        $nextUrl = !empty($this->next_id)
+                    ? common_local_url('ApiTimelineUser',
+                                    array('format' => $this->format,
+                                          'id' => $this->target->id),
+                                    array('max_id' => $this->next_id))
+                    : null;
+        $lastNotice = $this->notices[0];
+        $lastId     = $lastNotice->id;
+        $prevUrl = common_local_url('ApiTimelineUser',
+                                    array('format' => $this->format,
+                                          'id' => $this->target->id),
+                                    array('since_id' => $lastId));
+        $firstUrl = common_local_url('ApiTimelineUser',
+                                    array('format' => $this->format,
+                                          'id' => $this->target->id));
+
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
@@ -150,37 +170,18 @@ class ApiTimelineUserAction extends ApiBareAuthAction
             // change too quickly!
 
             if (!empty($this->next_id)) {
-                $nextUrl = common_local_url('ApiTimelineUser',
-                                            array('format' => 'atom',
-                                                  'id' => $this->target->id),
-                                            array('max_id' => $this->next_id));
-
                 $atom->addLink($nextUrl,
                                array('rel' => 'next',
                                      'type' => 'application/atom+xml'));
             }
 
             if (($this->page > 1 || !empty($this->max_id)) && !empty($this->notices)) {
-
-                $lastNotice = $this->notices[0];
-                $lastId     = $lastNotice->id;
-
-                $prevUrl = common_local_url('ApiTimelineUser',
-                                            array('format' => 'atom',
-                                                  'id' => $this->target->id),
-                                            array('since_id' => $lastId));
-
                 $atom->addLink($prevUrl,
                                array('rel' => 'prev',
                                      'type' => 'application/atom+xml'));
             }
 
             if ($this->page > 1 || !empty($this->since_id) || !empty($this->max_id)) {
-
-                $firstUrl = common_local_url('ApiTimelineUser',
-                                            array('format' => 'atom',
-                                                  'id' => $this->target->id));
-
                 $atom->addLink($firstUrl,
                                array('rel' => 'first',
                                      'type' => 'application/atom+xml'));
@@ -201,7 +202,23 @@ class ApiTimelineUserAction extends ApiBareAuthAction
             $doc->addLink($link, 'alternate', 'text/html');
             $doc->addItemsFromNotices($this->notices);
 
-            // XXX: Add paging extension?
+            if (!empty($this->next_id)) {
+                $doc->addLink($nextUrl,
+                               array('rel' => 'next',
+                                     'type' => ActivityStreamJSONDocument::CONTENT_TYPE));
+            }
+
+            if (($this->page > 1 || !empty($this->max_id)) && !empty($this->notices)) {
+                $doc->addLink($prevUrl,
+                               array('rel' => 'prev',
+                                     'type' => ActivityStreamJSONDocument::CONTENT_TYPE));
+            }
+
+            if ($this->page > 1 || !empty($this->since_id) || !empty($this->max_id)) {
+                $doc->addLink($firstUrl,
+                               array('rel' => 'first',
+                                     'type' => ActivityStreamJSONDocument::CONTENT_TYPE));
+            }
 
             $this->raw($doc->asString());
             break;
index b834036405aba6a3b85c21c5028ac19d924db243..210e758419570c8044bba27429f0ca5ecdb1dde8 100644 (file)
@@ -352,30 +352,21 @@ class File extends Managed_DataObject
 
     function getEnclosure(){
         $enclosure = (object) array();
-        $enclosure->title=$this->title;
-        $enclosure->url=$this->url;
-        $enclosure->title=$this->title;
-        $enclosure->date=$this->date;
-        $enclosure->modified=$this->modified;
-        $enclosure->size=$this->size;
-        $enclosure->mimetype=$this->mimetype;
-
-        if (!isset($this->filename)) {
-            $notEnclosureMimeTypes = array(null,'text/html','application/xhtml+xml');
-            $mimetype = $this->mimetype;
-            if($mimetype != null){
-                $mimetype = strtolower($this->mimetype);
-            }
-            $semicolon = strpos($mimetype,';');
-            if($semicolon){
-                $mimetype = substr($mimetype,0,$semicolon);
-            }
-            if (in_array($mimetype, $notEnclosureMimeTypes)) {
-                Event::handle('FileEnclosureMetadata', array($this, &$enclosure));
-            }
+        foreach (array('title', 'url', 'date', 'modified', 'size', 'mimetype') as $key) {
+            $enclosure->$key = $this->$key;
+        }
+
+        $needMoreMetadataMimetypes = array(null, 'text/html', 'application/xhtml+xml');
+
+        if (!isset($this->filename) && in_array(common_bare_mime($enclosure->mimetype), $needMoreMetadataMimetypes)) {
+            // This fetches enclosure metadata for non-local links with unset/HTML mimetypes,
+            // which may be enriched through oEmbed or similar (implemented as plugins)
+            Event::handle('FileEnclosureMetadata', array($this, &$enclosure));
         }
-        if (empty($enclosure->mimetype)) {
-            // This means we don't know what it is, so it can't be an enclosure!
+        if (empty($enclosure->mimetype) || in_array(common_bare_mime($enclosure->mimetype), $needMoreMetadataMimetypes)) {
+            // This means we either don't know what it is, so it can't
+            // be shown as an enclosure, or it is an HTML link which
+            // does not link to a resource with further metadata.
             throw new ServerException('Unknown enclosure mimetype, not enough metadata');
         }
         return $enclosure;
@@ -550,4 +541,11 @@ class File extends Managed_DataObject
         // And finally remove the entry from the database
         return parent::delete($useWhere);
     }
+
+    public function getTitle()
+    {
+        $title = $this->title ?: $this->filename;
+
+        return $title ?: null;
+    }
 }
index 94f83ab788a1ca388168d1bfb80dec1251c2ccb1..1af29b262090c11d94de624f6ad1feff7d073a73 100644 (file)
@@ -1324,6 +1324,7 @@ class Profile extends Managed_DataObject
             $object->id     = $this->getUri();
             $object->title  = $this->getBestName();
             $object->link   = $this->getUrl();
+            $object->summary = $this->getDescription();
 
             try {
                 $avatar = Avatar::getUploaded($this);
@@ -1390,6 +1391,11 @@ class Profile extends Managed_DataObject
         return $this->nickname;
     }
 
+    public function getDescription()
+    {
+        return $this->bio;
+    }
+
     /**
      * Returns the best URI for a profile. Plugins may override.
      *
index fb191cc7e8cf2e1082c6b0137641d68673697601..90e18e72e678e68a818b5051d73dd26a0477a937 100644 (file)
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule (.*) index.php?p=$1 [L,QSA]
+
+  ## You can also use PATHINFO by using this RewriteRule instead:
+  # RewriteRule (.*) index.php/$1 [L,QSA]
 </IfModule>
 
 <FilesMatch "\.(ini)">
+  # For mod_access_compat in Apache <2.4
   Order allow,deny
-</FilesMatch>
 
+  # Use this instead for Apache >2.4 (mod_authz_host)
+  # Require all denied
+</FilesMatch>
index d945d532d013969e139b73a40ff7bdf0d7700ff5..b55647e445d2022654b2167a2b68fb251f9242a6 100644 (file)
@@ -127,6 +127,7 @@ class ApiAction extends Action
     var $since_id  = null;
     var $source    = null;
     var $callback  = null;
+    var $format    = null;
 
     var $access    = self::READ_ONLY;  // read (default) or read-write
 
index 6609cb40daecc66c64492d02bcbf7338b3772d4d..d6cfda6f95961b4f3bd74be7a1a52d384df947bc 100644 (file)
@@ -74,18 +74,28 @@ class AttachmentList extends Widget
      */
     function show()
     {
-       $att = $this->notice->attachments();
-        if (empty($att)) return 0;
+       $attachments = $this->notice->attachments();
+        $representable = false;
+        foreach ($attachments as $key=>$att) {
+            // Only show attachments representable with a title
+            if ($att->getTitle() === null) {
+                unset($attachments[$key]);
+            }
+        }
+        if (!count($attachments)) {
+            return 0;
+        }
+
         $this->showListStart();
 
-        foreach ($att as $n=>$attachment) {
-            $item = $this->newListItem($attachment);
+        foreach ($attachments as $att) {
+            $item = $this->newListItem($att);
             $item->show();
         }
 
         $this->showListEnd();
 
-        return count($att);
+        return count($attachments);
     }
 
     function showListStart()
index 025ffa9fd6a7cefb019ad178d7bfac476308a69b..3764c827cb2f7ea459f4db9ceb99601177274531 100644 (file)
@@ -63,7 +63,7 @@ class AttachmentListItem extends Widget
     }
 
     function title() {
-        return $this->attachment->title ?: $this->attachment->filename;
+        return $this->attachment->getTitle();
     }
 
     function linkTitle() {
index 04fddf3b304b3d35c6b74cf010bda124fca53df1..d760400487605ddc92f42fccac005e61b3d9b0b4 100644 (file)
@@ -35,12 +35,8 @@ class InlineAttachmentList extends AttachmentList
 {
     function showListStart()
     {
-        $this->out->elementStart('div', array('class' => 'attachments'));
-    }
-
-    function showListEnd()
-    {
-        $this->out->elementEnd('div');
+        $this->out->element('h2', null, _('Attachments'));
+        parent::showListStart();
     }
 
     /**
@@ -59,20 +55,8 @@ class InlineAttachmentList extends AttachmentList
 class InlineAttachmentListItem extends AttachmentListItem
 {
     function showLink() {
-        $this->out->elementStart('a', $this->linkAttr());
+        $this->out->element('a', $this->linkAttr(), $this->title());
         $this->showRepresentation();
-        $this->out->elementEnd('a');
-    }
-
-    /**
-     * Build HTML attributes for the link
-     * @return array
-     */
-    function linkAttr()
-    {
-        $attr = parent::linkAttr();
-        $attr['class'] = 'attachment-thumbnail';
-        return $attr;
     }
 
     /**
@@ -84,7 +68,7 @@ class InlineAttachmentListItem extends AttachmentListItem
     {
         // XXX: RDFa
         // TODO: add notice_type class e.g., notice_video, notice_image
-        $this->out->elementStart('span', array('class' => 'inline-attachment'));
+        $this->out->elementStart('li', array('class' => 'inline-attachment'));
     }
 
     /**
@@ -96,6 +80,6 @@ class InlineAttachmentListItem extends AttachmentListItem
      */
     function showEnd()
     {
-        $this->out->elementEnd('span');
+        $this->out->elementEnd('li');
     }
 }
index dc4c7786a8d007c93155ad9f75a85e637f924573..cea7d29ec7df621801ffaeb934fc5fd7462b65ed 100644 (file)
@@ -293,6 +293,11 @@ abstract class Installer
             }
         }
 
+        if (!$conn instanceof DB_common) {
+            // Is not the right instance
+            throw new Exception('Cannot connect to database: ' . $conn->getMessage());
+        }
+
         $res = $this->updateStatus("Creating database tables...");
         if (!$this->createCoreTables($conn)) {
             $this->updateStatus("Error creating tables.", true);
index d2a4a00204d34f33ba48c1998be2467f740bed1a..569a4bbaf8d56f9eb987821784352822e137c8f2 100644 (file)
@@ -230,8 +230,6 @@ class SingleuserSite extends SiteProfileSettings
                 'core'    => self::corePlugins(),
                 'default' => array_merge(self::defaultPlugins(), array(
                     'MobileProfile'           => array(),
-                    'TwitterBridge'           => array(),
-                    'FacebookBridge'          => array(),
                 )),
                 'disable-Directory' => 1,
             ),
index fd89bb491cd44d2e3351854ae16654029b783ae1..08a0cdea2fac9f736e164ac0e01e0a3f1bccd2c9 100644 (file)
@@ -1820,6 +1820,15 @@ function common_get_mime_media($type)
     return strtolower($tmp[0]);
 }
 
+function common_bare_mime($mimetype)
+{
+    $mimetype = mb_strtolower($mimetype);
+    if ($semicolon = mb_strpos($mimetype, ';')) {
+        $mimetype = mb_substr($mimetype, 0, $semicolon);
+    }
+    return $mimetype;
+}
+
 function common_mime_type_match($type, $avail)
 {
     if(array_key_exists($type, $avail)) {
index 31ccf439ef9ac0812b4123ffa6d9208ddd4003f5..de3307fad4e4352ef6ca1c4bc3cfbc967e6e00e0 100644 (file)
@@ -226,7 +226,12 @@ class RSVP extends Managed_DataObject
 
     static function fromNotice(Notice $notice)
     {
-        return RSVP::getKV('uri', $notice->uri);
+        $rsvp = new RSVP();
+        $rsvp->uri = $notice->uri;
+        if (!$rsvp->find(true)) {
+            throw new NoResultException($rsvp);
+        }
+        return $rsvp;
     }
 
     static function forEvent(Happening $event)
index 3284d10563310c2aea47d9aaa115e45d96566a7a..8d14744090ab0c5a734e5264b40fba4a31c43c79 100644 (file)
@@ -30,7 +30,7 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once __DIR__ . '/twitter.php';
 
 /**
  * Plugin for sending and importing Twitter statuses
index aace7e4f09c67763003e1ebb26b0c2950960e0b8..ce6af091e2d5adcd61a8ccca503ad024417e7b52 100644 (file)
@@ -32,7 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Class for doing OAuth authentication against Twitter
index 379e136045d21dca566501418c5d57b9460135e0..ee00714c9f18f14f9adfb369da93b4b5cd6921b5 100644 (file)
@@ -32,7 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Page for logging in with Twitter
index cc3e34f345e15835c123ea21078443ffe37a1d29..37abb4d27297281e501313ab17a147d0fe246d45 100644 (file)
@@ -31,7 +31,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Settings for Twitter integration
index 651c4d34da145b59b2b74ebcd30c91cea559a6db..8b8ffbfd496bdbaaa0382f71c4bf12db2469a4a7 100755 (executable)
@@ -31,7 +31,7 @@ Batch script for synching local friends with Twitter friends.
 END_OF_TRIM_HELP;
 
 require_once INSTALLDIR . '/scripts/commandline.inc';
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Daemon to sync local friends with Twitter friends
index b4b78dc80af3fee43a0179b2904712c0ba3be90f..74fc77cd79a00b6a2e494c24e8cdff59a906b51f 100755 (executable)
@@ -39,7 +39,7 @@ END_OF_TRIM_HELP;
 require_once INSTALLDIR . '/scripts/commandline.inc';
 require_once INSTALLDIR . '/lib/common.php';
 require_once INSTALLDIR . '/lib/daemon.php';
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Fetch statuses from Twitter
index 0ab74803058d208f461ed69fd929faeef43b2ed7..cc0c05f9a669abbe2bfd4496c526021f2341dda4 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Queue handler to deal with incoming Twitter status updates, as retrieved by
index 41d8ac9d469831490498fd1b00af399928027f59..5258bfc2c981767bba9d297f33ef56905a3a08a3 100644 (file)
@@ -31,7 +31,7 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 /**
  * Encapsulation of the Twitter status -> notice incoming bridge import.
index 644ce17871eb83b6a14ead9a88fd8c4b8fa3235a..bba1b8b2bc80f00aae961646daa769e38e1abafc 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once dirname(__DIR__) . '/twitter.php';
 
 class TwitterQueueHandler extends QueueHandler
 {
index 4c8bef463ef5d94ecc4301a7b1640379286ef65f..d7636c373e64c4aa85cf5e210eee8ce673777fcb 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
+require_once __DIR__ . '/twitter.php';
 
 /**
  * Queue handler to deal with incoming Twitter status updates, as retrieved by
index 792501e28905fddae5634cb531229bca7a12dea9..1029850a1e654fa8b46144a802f420da1b36f759 100644 (file)
@@ -704,7 +704,7 @@ font-style:italic;
     min-height: 1em; 
 }
 
-#shownotice .notice .h-entry {,
+#shownotice .notice .h-entry {
     font-size:2.2em;
     min-height:123px;
     font-size: 1.6em;
@@ -812,6 +812,15 @@ position:static;
     top: 1em;
 }
 
+.notice.h-entry .attachments .inline-attachment * {
+    max-width: 100%;
+}
+.notice.h-entry .attachments .inline-attachment > a {
+    font-size: 0.88em;
+    line-height: 16px;
+    height: 16px;
+}
+
 #attachments {
 clear:both;
 float:left;
@@ -1991,8 +2000,6 @@ margin:0;
 #profile_search_results {
 display:block;
 border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
 max-height:800px;
 margin:10px 0;
 padding: 5px;
@@ -2061,8 +2068,6 @@ float:left;
     padding: 6px;
     margin: 4px 0px 0px 4px;
     border-top-left-radius: 7px;
-    -moz-border-radius-topleft: 7px;
-    -webkit-border-top-left-radius: 7px;
 }
 
 .oauth-desktop-mode fieldset {
@@ -2484,7 +2489,7 @@ display:none;
     list-style-type: none;
 }
 
-/*end of @media screen, projection, tv*/
+}/*end of @media screen, projection, tv*/
 
 
 @media print {
index dce214f07b029f6d5a9bc08781b3ba77cd9bd8fe..a46f296537db20e52e0ab8b04d68f8b33fc8ea2c 100644 (file)
@@ -442,7 +442,6 @@ h6 {font-size: 1em;}
     border: 1px solid #aaa;
     border-radius: 4px;
     box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4);
-    position: relative;
 }
 
 .notice-options .form_repeat.dialogbox legend {