Merge branch 'swat0' into 0.9.x

This commit is contained in:
Evan Prodromou 2010-09-02 16:58:55 -04:00
commit 82b1d6daef
6 changed files with 105 additions and 18 deletions

View File

@ -1019,25 +1019,31 @@ class Notice extends Memcached_DataObject
if (empty($uris)) { if (empty($uris)) {
return; return;
} }
$sender = Profile::staticGet($this->profile_id); $sender = Profile::staticGet($this->profile_id);
foreach (array_unique($uris) as $uri) { foreach (array_unique($uris) as $uri) {
$user = User::staticGet('uri', $uri); $profile = Profile::fromURI($uri);
if (!empty($user)) { if (empty($profile)) {
if ($user->hasBlocked($sender)) { common_log(LOG_WARNING, "Unable to determine profile for URI '$uri'");
continue; continue;
}
$reply = new Reply();
$reply->notice_id = $this->id;
$reply->profile_id = $user->id;
common_log(LOG_INFO, __METHOD__ . ": saving reply: notice $this->id to profile $user->id");
$id = $reply->insert();
} }
if ($profile->hasBlocked($sender)) {
common_log(LOG_INFO, "Not saving reply to profile {$profile->id} ($uri) from sender {$sender->id} because of a block.");
continue;
}
$reply = new Reply();
$reply->notice_id = $this->id;
$reply->profile_id = $profile->id;
common_log(LOG_INFO, __METHOD__ . ": saving reply: notice $this->id to profile $profile->id");
$id = $reply->insert();
} }
return; return;

View File

@ -960,4 +960,25 @@ class Profile extends Memcached_DataObject
return $feed; return $feed;
} }
static function fromURI($uri)
{
$profile = null;
if (Event::handle('StartGetProfileFromURI', array($uri, &$profile))) {
// Get a local user or remote (OMB 0.1) profile
$user = User::staticGet('uri', $uri);
if (!empty($user)) {
$profile = $user->getProfile();
} else {
$remote_profile = Remote_profile::staticGet('uri', $uri);
if (!empty($remote_profile)) {
$profile = Profile::staticGet('id', $remote_profile->profile_id);
}
}
Event::handle('EndGetProfileFromURI', array($uri, $profile));
}
return $profile;
}
} }

View File

@ -984,4 +984,18 @@ class OStatusPlugin extends Plugin
$feed = $oprofile->feeduri; $feed = $oprofile->feeduri;
return false; return false;
} }
function onStartGetProfileFromURI($uri, &$profile) {
// XXX: do discovery here instead (OStatus_profile::ensureProfileURI($uri))
$oprofile = Ostatus_profile::staticGet('uri', $uri);
if (!empty($oprofile) && !$oprofile->isGroup()) {
$profile = $oprofile->localProfile();
return false;
}
return true;
}
} }

View File

@ -71,6 +71,7 @@ class UsersalmonAction extends SalmonAction
// Notice must either be a) in reply to a notice by this user // Notice must either be a) in reply to a notice by this user
// or b) to the attention of this user // or b) to the attention of this user
// or c) in reply to a notice to the attention of this user
$context = $this->activity->context; $context = $this->activity->context;
@ -79,8 +80,9 @@ class UsersalmonAction extends SalmonAction
if (empty($notice)) { if (empty($notice)) {
throw new ClientException("In reply to unknown notice"); throw new ClientException("In reply to unknown notice");
} }
if ($notice->profile_id != $this->user->id) { if ($notice->profile_id != $this->user->id &&
throw new ClientException("In reply to a notice not by this user"); !in_array($this->user->id, $notice->getReplies())) {
throw new ClientException("In reply to a notice not by this user and not mentioning this user");
} }
} else if (!empty($context->attention)) { } else if (!empty($context->attention)) {
if (!in_array($this->user->uri, $context->attention) && if (!in_array($this->user->uri, $context->attention) &&

View File

@ -700,14 +700,16 @@ class Ostatus_profile extends Memcached_DataObject
} }
// Is the recipient a remote group? // Is the recipient a remote group?
$oprofile = Ostatus_profile::staticGet('uri', $recipient); $oprofile = Ostatus_profile::ensureProfileURI($recipient);
if ($oprofile) { if ($oprofile) {
if ($oprofile->isGroup()) { if ($oprofile->isGroup()) {
// Deliver to local members of this remote group. // Deliver to local members of this remote group.
// @fixme sender verification? // @fixme sender verification?
$groups[] = $oprofile->group_id; $groups[] = $oprofile->group_id;
} else { } else {
common_log(LOG_DEBUG, "Skipping reply to remote profile $recipient"); // may be canonicalized or something
$replies[] = $oprofile->uri;
} }
continue; continue;
} }
@ -1764,6 +1766,37 @@ class Ostatus_profile extends Memcached_DataObject
return $file; return $file;
} }
static function ensureProfileURI($uri)
{
$oprofile = null;
// First, try to query it
$oprofile = Ostatus_profile::staticGet('uri', $uri);
// If unfound, do discovery stuff
if (empty($oprofile)) {
if (preg_match("/^(\w+)\:(.*)/", $uri, $match)) {
$protocol = $match[1];
switch ($protocol) {
case 'http':
case 'https':
$oprofile = Ostatus_profile::ensureProfileURL($uri);
break;
case 'acct':
case 'mailto':
$rest = $match[2];
$oprofile = Ostatus_profile::ensureWebfinger($rest);
default:
common_log("Unrecognized URI protocol for profile: $protocol ($uri)");
break;
}
}
}
return $oprofile;
}
} }
/** /**

View File

@ -67,6 +67,17 @@ class OStatusQueueHandler extends QueueHandler
} }
} }
if (!empty($this->notice->reply_to)) {
$replyTo = Notice::staticGet('id', $this->notice->reply_to);
if (!empty($replyTo)) {
foreach($replyTo->getReplies() as $profile_id) {
$oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
if ($oprofile) {
$this->pingReply($oprofile);
}
}
}
}
return true; return true;
} }
@ -161,7 +172,7 @@ class OStatusQueueHandler extends QueueHandler
* Queue up direct feed update pushes to subscribers on our internal hub. * Queue up direct feed update pushes to subscribers on our internal hub.
* If there are a large number of subscriber sites, intermediate bulk * If there are a large number of subscriber sites, intermediate bulk
* distribution triggers may be queued. * distribution triggers may be queued.
* *
* @param string $atom update feed, containing only new/changed items * @param string $atom update feed, containing only new/changed items
* @param HubSub $sub open query of subscribers * @param HubSub $sub open query of subscribers
*/ */