Ticket #2731: Fix for regression in posting to remote groups (regression in 2d4e0693c8)

Changes in 2d4e0693c8 changed Ostatus_profile::filterReplies() (which sorts out the local, remote, and group recipients on incoming remote messages) from checking for remote profiles with a safe call to Ostatus_profile::staticGet() to calls through Ostatus_profile::ensureProfileURL() and Ostatus_profile::ensureWebfinger(), which throw exceptions and thus abort processing.
Since this was done before checking for local groups, the filter would fail when the ensure* functions determined it was looking at a local group and rightfully refused to create a remote group profile for it.

Changing the calls to the ensure* functions was done so we can record remote reply recipients for future reply-to-reply processing (the staticGet() call was a cheaper way to do a lookup when we knew we only actually had to process groups that somebody signed up to); most important fix is simply to actually check for the exception! :)

Here I'm changing the order of processing so we do the local group lookup first -- where it's nice and safe -- and then when we do the remote checks, we'll go ahead and gracefully skip that entry if the full remote lookup fails, so we'll still process any following recipients.
This commit is contained in:
Brion Vibber 2010-09-16 14:43:27 -07:00
parent b98abc3ae7
commit 097d0bd2fa

View File

@ -703,23 +703,7 @@ class Ostatus_profile extends Memcached_DataObject
continue; continue;
} }
// Is the recipient a remote group?
$oprofile = Ostatus_profile::ensureProfileURI($recipient);
if ($oprofile) {
if ($oprofile->isGroup()) {
// Deliver to local members of this remote group.
// @fixme sender verification?
$groups[] = $oprofile->group_id;
} else {
// may be canonicalized or something
$replies[] = $oprofile->uri;
}
continue;
}
// Is the recipient a local group? // Is the recipient a local group?
// @fixme uri on user_group isn't reliable yet
// $group = User_group::staticGet('uri', $recipient); // $group = User_group::staticGet('uri', $recipient);
$id = OStatusPlugin::localGroupFromUrl($recipient); $id = OStatusPlugin::localGroupFromUrl($recipient);
if ($id) { if ($id) {
@ -738,7 +722,22 @@ class Ostatus_profile extends Memcached_DataObject
} }
} }
common_log(LOG_DEBUG, "Skipping reply to unrecognized profile $recipient"); // Is the recipient a remote user or group?
try {
$oprofile = Ostatus_profile::ensureProfileURI($recipient);
if ($oprofile->isGroup()) {
// Deliver to local members of this remote group.
// @fixme sender verification?
$groups[] = $oprofile->group_id;
} else {
// may be canonicalized or something
$replies[] = $oprofile->uri;
}
continue;
} catch (Exception $e) {
// Neither a recognizable local nor remote user!
common_log(LOG_DEBUG, "Skipping reply to unrecognized profile $recipient: " . $e->getMessage());
}
} }
$attention_uris = $replies; $attention_uris = $replies;