]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/File.php
Merge commit 'origin/testing' into 0.9.x
[quix0rs-gnu-social.git] / classes / File.php
index e04a9d5255ad50c85c840e3563e58ed0017610b9..4ecd3b959aa9aaef12f4e459decbb173b8f0f7a6 100644 (file)
@@ -80,7 +80,14 @@ class File extends Memcached_DataObject
         if (isset($redir_data['type'])
             && (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21)))
             && ($oembed_data = File_oembed::_getOembed($given_url))) {
+
+            $fo = File_oembed::staticGet('file_id', $file_id);
+
+            if (empty($fo)) {
                 File_oembed::saveNew($oembed_data, $file_id);
+            } else {
+                common_log(LOG_WARNING, "Strangely, a File_oembed object exists for new file $file_id", __FILE__);
+            }
         }
         return $x;
     }
@@ -162,15 +169,33 @@ class File extends Memcached_DataObject
     {
         require_once 'MIME/Type/Extension.php';
         $mte = new MIME_Type_Extension();
-        $ext = $mte->getExtension($mimetype);
+        try {
+            $ext = $mte->getExtension($mimetype);
+        } catch ( Exception $e) {
+            $ext = strtolower(preg_replace('/\W/', '', $mimetype));
+        }
         $nickname = $profile->nickname;
         $datestamp = strftime('%Y%m%dT%H%M%S', time());
         $random = strtolower(common_confirmation_code(32));
         return "$nickname-$datestamp-$random.$ext";
     }
 
+    /**
+     * Validation for as-saved base filenames
+     */
+    static function validFilename($filename)
+    {
+        return preg_match('/^[A-Za-z0-9._-]+$/', $filename);
+    }
+
+    /**
+     * @throws ClientException on invalid filename
+     */
     static function path($filename)
     {
+        if (!self::validFilename($filename)) {
+            throw new ClientException("Invalid filename");
+        }
         $dir = common_config('attachments', 'dir');
 
         if ($dir[strlen($dir)-1] != '/') {
@@ -182,25 +207,46 @@ class File extends Memcached_DataObject
 
     static function url($filename)
     {
-        $path = common_config('attachments', 'path');
-
-        if ($path[strlen($path)-1] != '/') {
-            $path .= '/';
+        if (!self::validFilename($filename)) {
+            throw new ClientException("Invalid filename");
         }
+        if(common_config('site','private')) {
 
-        if ($path[0] != '/') {
-            $path = '/'.$path;
-        }
+            return common_local_url('getfile',
+                                array('filename' => $filename));
 
-        $server = common_config('attachments', 'server');
+        } else {
+            $path = common_config('attachments', 'path');
 
-        if (empty($server)) {
-            $server = common_config('site', 'server');
-        }
+            if ($path[strlen($path)-1] != '/') {
+                $path .= '/';
+            }
 
-        // XXX: protocol
+            if ($path[0] != '/') {
+                $path = '/'.$path;
+            }
 
-        return 'http://'.$server.$path.$filename;
+            $server = common_config('attachments', 'server');
+
+            if (empty($server)) {
+                $server = common_config('site', 'server');
+            }
+
+            $ssl = common_config('attachments', 'ssl');
+
+            if (is_null($ssl)) { // null -> guess
+                if (common_config('site', 'ssl') == 'always' &&
+                    !common_config('attachments', 'server')) {
+                    $ssl = true;
+                } else {
+                    $ssl = false;
+                }
+            }
+
+            $protocol = ($ssl) ? 'https' : 'http';
+
+            return $protocol.'://'.$server.$path.$filename;
+        }
     }
 
     function getEnclosure(){
@@ -237,10 +283,19 @@ class File extends Memcached_DataObject
                         if($oembed->modified) $enclosure->modified=$oembed->modified;
                         unset($oembed->size);
                     }
+                } else {
+                    return false;
                 }
             }
         }
         return $enclosure;
     }
+
+    // quick back-compat hack, since there's still code using this
+    function isEnclosure()
+    {
+        $enclosure = $this->getEnclosure();
+        return !empty($enclosure);
+    }
 }