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)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$sender = Profile::staticGet($this->profile_id);
|
||||
|
||||
foreach (array_unique($uris) as $uri) {
|
||||
|
||||
$user = User::staticGet('uri', $uri);
|
||||
$profile = Profile::fromURI($uri);
|
||||
|
||||
if (!empty($user)) {
|
||||
if ($user->hasBlocked($sender)) {
|
||||
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 (empty($profile)) {
|
||||
common_log(LOG_WARNING, "Unable to determine profile for URI '$uri'");
|
||||
continue;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -960,4 +960,25 @@ class Profile extends Memcached_DataObject
|
||||
|
||||
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;
|
||||
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
|
||||
// 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;
|
||||
|
||||
@ -79,8 +80,9 @@ class UsersalmonAction extends SalmonAction
|
||||
if (empty($notice)) {
|
||||
throw new ClientException("In reply to unknown notice");
|
||||
}
|
||||
if ($notice->profile_id != $this->user->id) {
|
||||
throw new ClientException("In reply to a notice not by this user");
|
||||
if ($notice->profile_id != $this->user->id &&
|
||||
!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)) {
|
||||
if (!in_array($this->user->uri, $context->attention) &&
|
||||
|
@ -700,14 +700,16 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
}
|
||||
|
||||
// Is the recipient a remote group?
|
||||
$oprofile = Ostatus_profile::staticGet('uri', $recipient);
|
||||
$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 {
|
||||
common_log(LOG_DEBUG, "Skipping reply to remote profile $recipient");
|
||||
// may be canonicalized or something
|
||||
$replies[] = $oprofile->uri;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -1764,6 +1766,37 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user