]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Notice.php
Improve ShownoticeAction remote redirect code
[quix0rs-gnu-social.git] / classes / Notice.php
index 56be89fb125d29679d577809e292c198941b576f..e46ed227a179cbb4cd4f9119a2b2bcb4a7e13ffd 100644 (file)
@@ -215,12 +215,16 @@ class Notice extends Managed_DataObject
         // The risk is we start having empty urls and non-http uris...
         // and we can't really handle any other protocol right now.
         switch (true) {
-        case common_valid_http_url($this->url):
+        case common_valid_http_url($this->url): // should we allow non-http/https URLs?
             return $this->url;
+        case $this->isLocal():
+            // let's generate a valid link to our locally available notice on demand
+            return common_local_url('shownotice', array('notice' => $this->id), null, null, false);
         case common_valid_http_url($this->uri):
             return $this->uri;
         default:
-            throw new ServerException('No URL available for notice.');
+            common_debug('No URL available for notice: id='.$this->id);
+            throw new InvalidUrlException($this->url);
         }
     }
 
@@ -424,6 +428,16 @@ class Notice extends Managed_DataObject
             $notice->created = common_sql_now();
         }
 
+        if (!$notice->isLocal()) {
+            // Only do these checks for non-local notices. Local notices will generate these values later.
+            if (!common_valid_http_url($url)) {
+                common_debug('Bad notice URL: ['.$url.'], URI: ['.$uri.']. Cannot link back to original! This is normal for shared notices etc.');
+            }
+            if (empty($uri)) {
+                throw new ServerException('No URI for remote notice. Cannot accept that.');
+            }
+        }
+
         $notice->content = $final;
 
         $notice->source = $source;
@@ -592,7 +606,9 @@ class Notice extends Managed_DataObject
 
             $changed = false;
 
-            if (empty($uri)) {
+            // We can only get here if it's a local notice, since remote notices
+            // should've bailed out earlier due to lacking a URI.
+            if (empty($notice->uri)) {
                 $notice->uri = sprintf('%s%s=%d:%s=%s',
                                     TagURI::mint(),
                                     'noticeId', $notice->id,