]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
OStatus: save file records for enclosures
authorBrion Vibber <brion@pobox.com>
Wed, 3 Mar 2010 00:30:09 +0000 (16:30 -0800)
committerBrion Vibber <brion@pobox.com>
Wed, 3 Mar 2010 00:36:08 +0000 (16:36 -0800)
Also stripping id from foreign HTML messages (could interfere with UI) and disabled failing attachment popup for a.attachment links that don't have a proper id, so you can click through instead of getting an error.

Issues:
* any other links aren't marked and saved
* inconsistent behavior between local and remote attachments (local displays in lightbox, remote doesn't)
* if the enclosure'd object isn't referenced in the content, you won't be offered a link to it in our UI

classes/File.php
classes/Notice.php
js/util.js
lib/activity.php
plugins/OStatus/classes/Ostatus_profile.php

index 189e04ce021d77dc74a29ee14dbb64df118b4c2e..1b8ef1b3eea15f957b82736a38e6e73838355e94 100644 (file)
@@ -286,5 +286,12 @@ class File extends Memcached_DataObject
         }
         return $enclosure;
     }
+
+    // quick back-compat hack, since there's still code using this
+    function isEnclosure()
+    {
+        $enclosure = $this->getEnclosure();
+        return !empty($enclosure);
+    }
 }
 
index 63dc9689727cdc41920c3f45fae26434d90884e0..c1263c782101536acafbc0490e34b48f97092950 100644 (file)
@@ -211,6 +211,8 @@ class Notice extends Memcached_DataObject
      *                              extracting ! tags from content
      *              array 'tags' list of hashtag strings to save with the notice
      *                           in place of extracting # tags from content
+     *              array 'urls' list of attached/referred URLs to save with the
+     *                           notice in place of extracting links from content
      * @fixme tag override
      *
      * @return Notice
@@ -380,8 +382,11 @@ class Notice extends Memcached_DataObject
             $notice->saveTags();
         }
 
-        // @fixme pass in data for URLs too?
-        $notice->saveUrls();
+        if (isset($urls)) {
+            $notice->saveKnownUrls($urls);
+        } else {
+            $notice->saveUrls();
+        }
 
         // Prepare inbox delivery, may be queued to background.
         $notice->distribute();
@@ -427,6 +432,25 @@ class Notice extends Memcached_DataObject
         common_replace_urls_callback($this->content, array($this, 'saveUrl'), $this->id);
     }
 
+    /**
+     * Save the given URLs as related links/attachments to the db
+     *
+     * follow redirects and save all available file information
+     * (mimetype, date, size, oembed, etc.)
+     *
+     * @return void
+     */
+    function saveKnownUrls($urls)
+    {
+        // @fixme validation?
+        foreach ($urls as $url) {
+            File::processNew($url, $this->id);
+        }
+    }
+
+    /**
+     * @private callback
+     */
     function saveUrl($data) {
         list($url, $notice_id) = $data;
         File::processNew($url, $notice_id);
index d08c46fe6494ab7f95217f00738ef095a7d56a09..3efda0d7b97a610bb0c03ab02647558a3af0709f 100644 (file)
@@ -423,8 +423,11 @@ var SN = { // StatusNet
             };
 
             notice.find('a.attachment').click(function() {
-                $().jOverlay({url: $('address .url')[0].href+'attachment/' + ($(this).attr('id').substring('attachment'.length + 1)) + '/ajax'});
-                return false;
+                var attachId = ($(this).attr('id').substring('attachment'.length + 1));
+                if (attachId) {
+                    $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'});
+                    return false;
+                }
             });
 
             if ($('#shownotice').length == 0) {
index b2015321386ae454df53ce32587c3d26f8fe2e0c..ce14fa254607eec1e8d0a504b1bade0e22c25e59 100644 (file)
@@ -1044,6 +1044,7 @@ class Activity
     public $id;      // ID of the activity
     public $title;   // title of the activity
     public $categories = array(); // list of AtomCategory objects
+    public $enclosures = array(); // list of enclosure URL references
 
     /**
      * Turns a regular old Atom <entry> into a magical activity
@@ -1140,6 +1141,10 @@ class Activity
                 $this->categories[] = new AtomCategory($catEl);
             }
         }
+
+        foreach (ActivityUtils::getLinks($entry, 'enclosure') as $link) {
+            $this->enclosures[] = $link->getAttribute('href');
+        }
     }
 
     /**
index a33e95d932c02f7faea0c4f7ee3f56eb9ac788d6..059c19e7c27af12a6b62990c46744b193155278d 100644 (file)
@@ -550,7 +550,8 @@ class Ostatus_profile extends Memcached_DataObject
                         'rendered' => $rendered,
                         'replies' => array(),
                         'groups' => array(),
-                        'tags' => array());
+                        'tags' => array(),
+                        'urls' => array());
 
         // Check for optional attributes...
 
@@ -595,6 +596,12 @@ class Ostatus_profile extends Memcached_DataObject
             }
         }
 
+        // Atom enclosures -> attachment URLs
+        foreach ($activity->enclosures as $href) {
+            // @fixme save these locally or....?
+            $options['urls'][] = $href;
+        }
+
         try {
             $saved = Notice::saveNew($oprofile->profile_id,
                                      $content,
@@ -620,7 +627,8 @@ class Ostatus_profile extends Memcached_DataObject
     protected function purify($html)
     {
         require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php';
-        $config = array('safe' => 1);
+        $config = array('safe' => 1,
+                        'deny_attribute' => 'id,style,on*');
         return htmLawed($html, $config);
     }