public function getUrl()
{
// The risk is we start having empty urls and non-http uris...
- return $this->url ?: $this->uri;
+ // and we can't really handle any other protocol right now.
+ switch (true) {
+ 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:
+ common_debug('No URL available for notice: id='.$this->id);
+ throw new InvalidUrlException($this->url);
+ }
+ }
+
+ public function get_object_type($canonical=false) {
+ return $canonical
+ ? ActivityObject::canonicalType($this->object_type)
+ : $this->object_type;
}
public static function getByUri($uri)
* int 'location_ns' geoname namespace to interpret location_id
* int 'reply_to'; notice ID this is a reply to
* int 'repeat_of'; notice ID this is a repeat of
- * string 'uri' unique ID for notice; defaults to local notice URL
+ * string 'uri' unique ID for notice; a unique tag uri (can be url or anything too)
* string 'url' permalink to notice; defaults to local notice URL
* string 'rendered' rendered HTML version of content
* array 'replies' list of profile URIs for reply delivery in
$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;
$changed = false;
- if (empty($uri)) {
- $notice->uri = common_notice_uri($notice);
+ // 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,
+ 'objectType', $notice->get_object_type(true));
$changed = true;
}