X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2Factions%2Fgroupsalmon.php;h=d03803d620ee12f3f8975ed403515517c126cde9;hb=4ab995dd1ef9b1b4d22f27223a7d28b12895ff93;hp=64ae9f3cc0aefa68b42ed3fe7dd5742c4439f781;hpb=85528ccb1f5840a8c73f6c939f12d98bb3680cde;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php index 64ae9f3cc0..d03803d620 100644 --- a/plugins/OStatus/actions/groupsalmon.php +++ b/plugins/OStatus/actions/groupsalmon.php @@ -17,15 +17,14 @@ * along with this program. If not, see . */ -/** - * @package OStatusPlugin - * @author James Walker - */ - if (!defined('STATUSNET')) { exit(1); } +/** + * @package OStatusPlugin + * @author James Walker + */ class GroupsalmonAction extends SalmonAction { var $group = null; @@ -37,13 +36,24 @@ class GroupsalmonAction extends SalmonAction $id = $this->trimmed('id'); if (!$id) { - $this->clientError(_('No ID.')); + // TRANS: Client error. + $this->clientError(_m('No ID.')); } $this->group = User_group::staticGet('id', $id); if (empty($this->group)) { - $this->clientError(_('No such group.')); + // TRANS: Client error. + $this->clientError(_m('No such group.')); + } + + + $this->target = $this->group; + + $oprofile = Ostatus_profile::staticGet('group_id', $id); + if ($oprofile) { + // TRANS: Client error. + $this->clientError(_m('Cannot accept remote posts for a remote group.')); } return true; @@ -52,10 +62,10 @@ class GroupsalmonAction extends SalmonAction /** * We've gotten a post event on the Salmon backchannel, probably a reply. */ - function handlePost() { - switch ($this->act->object->type) { + // @fixme process all objects? + switch ($this->activity->objects[0]->type) { case ActivityObject::ARTICLE: case ActivityObject::BLOGENTRY: case ActivityObject::NOTE: @@ -63,24 +73,26 @@ class GroupsalmonAction extends SalmonAction case ActivityObject::COMMENT: break; default: - throw new ClientException("Can't handle that kind of post."); + // TRANS: Client exception. + throw new ClientException('Cannot handle that kind of post.'); } // Notice must be to the attention of this group - - $context = $this->act->context; + $context = $this->activity->context; if (empty($context->attention)) { + // TRANS: Client exception. throw new ClientException("Not to the attention of anyone."); } else { $uri = common_local_url('groupbyid', array('id' => $this->group->id)); - if (!in_array($context->attention, $uri)) { + if (!in_array($uri, $context->attention)) { + // TRANS: Client exception. throw new ClientException("Not to the attention of this group."); } } $profile = $this->ensureProfile(); - // @fixme save the post + $this->saveNotice(); } /** @@ -88,21 +100,86 @@ class GroupsalmonAction extends SalmonAction * Save a subscription relationship for them. */ + /** + * Postel's law: consider a "follow" notification as a "join". + */ function handleFollow() { - $this->handleJoin(); // ??? + $this->handleJoin(); } + /** + * Postel's law: consider an "unfollow" notification as a "leave". + */ function handleUnfollow() { + $this->handleLeave(); } /** * A remote user joined our group. + * @fixme move permission checks and event call into common code, + * currently we're doing the main logic in joingroup action + * and so have to repeat it here. */ - function handleJoin() { + $oprofile = $this->ensureProfile(); + if (!$oprofile) { + // TRANS: Client error. + $this->clientError(_m('Cannot read profile to set up group membership.')); + } + if ($oprofile->isGroup()) { + // TRANS: Client error. + $this->clientError(_m('Groups cannot join groups.')); + } + + common_log(LOG_INFO, "Remote profile {$oprofile->uri} joining local group {$this->group->nickname}"); + $profile = $oprofile->localProfile(); + + if ($profile->isMember($this->group)) { + // Already a member; we'll take it silently to aid in resolving + // inconsistencies on the other side. + return true; + } + + if (Group_block::isBlocked($this->group, $profile)) { + $this->clientError(_m('You have been blocked from that group by the admin.'), 403); + return false; + } + + try { + $profile->joinGroup($this->group); + } catch (Exception $e) { + // TRANS: Server error. %1$s is a profile URI, %2$s is a group nickname. + $this->serverError(sprintf(_m('Could not join remote user %1$s to group %2$s.'), + $oprofile->uri, $this->group->nickname)); + } } + /** + * A remote user left our group. + */ + function handleLeave() + { + $oprofile = $this->ensureProfile(); + if (!$oprofile) { + $this->clientError(_m('Cannot read profile to cancel group membership.')); + } + if ($oprofile->isGroup()) { + $this->clientError(_m('Groups cannot join groups.')); + } + + common_log(LOG_INFO, "Remote profile {$oprofile->uri} leaving local group {$this->group->nickname}"); + $profile = $oprofile->localProfile(); + + try { + $profile->leaveGroup($this->group); + } catch (Exception $e) { + // TRANS: Server error. %1$s is a profile URI, %2$s is a group nickname. + $this->serverError(sprintf(_m('Could not remove remote user %1$s from group %2$s.'), + $oprofile->uri, $this->group->nickname)); + return; + } + } }