Merge branch 'swat0' into 0.9.x
This commit is contained in:
commit
82b1d6daef
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) &&
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user