summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/apifriendshipsdestroy.php9
-rw-r--r--lib/command.php29
-rw-r--r--lib/subs.php32
-rw-r--r--plugins/OStatus/actions/salmon.php76
4 files changed, 94 insertions, 52 deletions
diff --git a/actions/apifriendshipsdestroy.php b/actions/apifriendshipsdestroy.php
index 91c6fd032..d48a57756 100644
--- a/actions/apifriendshipsdestroy.php
+++ b/actions/apifriendshipsdestroy.php
@@ -124,12 +124,9 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction
return;
}
- $result = subs_unsubscribe_user($this->user, $this->other->nickname);
-
- if (is_string($result)) {
- $this->clientError($result, 403, $this->format);
- return;
- }
+ // throws an exception on error
+ Subscription::cancel($this->user->getProfile(),
+ $this->other->getProfile());
$this->initDocument($this->format);
$this->showProfile($this->other, $this->format);
diff --git a/lib/command.php b/lib/command.php
index 2a51fd687..ea7b60372 100644
--- a/lib/command.php
+++ b/lib/command.php
@@ -548,12 +548,19 @@ class SubCommand extends Command
return;
}
- $result = subs_subscribe_user($this->user, $this->other);
+ $otherUser = User::staticGet('nickname', $this->other);
- if ($result == 'true') {
+ if (empty($otherUser)) {
+ $channel->error($this->user, _('No such user'));
+ return;
+ }
+
+ try {
+ Subscription::start($this->user->getProfile(),
+ $otherUser->getProfile());
$channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
- } else {
- $channel->error($this->user, $result);
+ } catch (Exception $e) {
+ $channel->error($this->user, $e->getMessage());
}
}
}
@@ -576,12 +583,18 @@ class UnsubCommand extends Command
return;
}
- $result=subs_unsubscribe_user($this->user, $this->other);
+ $otherUser = User::staticGet('nickname', $this->other);
- if ($result) {
+ if (empty($otherUser)) {
+ $channel->error($this->user, _('No such user'));
+ }
+
+ try {
+ Subscription::cancel($this->user->getProfile(),
+ $otherUser->getProfile());
$channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
- } else {
- $channel->error($this->user, $result);
+ } catch (Exception $e) {
+ $channel->error($this->user, $e->getMessage());
}
}
}
diff --git a/lib/subs.php b/lib/subs.php
index 5376e21bd..1c240c475 100644
--- a/lib/subs.php
+++ b/lib/subs.php
@@ -19,22 +19,6 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
-/* Subscribe $user to nickname $other_nickname
- Returns true or an error message.
-*/
-
-function subs_subscribe_user($user, $other_nickname)
-{
-
- $other = User::staticGet('nickname', $other_nickname);
-
- if (!$other) {
- return _('No such user.');
- }
-
- return subs_subscribe_to($user, $other);
-}
-
/* Subscribe user $user to other user $other.
* Note: $other must be a local user, not a remote profile.
* Because the other way is quite a bit more complicated.
@@ -50,22 +34,6 @@ function subs_subscribe_to($user, $other)
}
}
-/* Unsubscribe $user from nickname $other_nickname
- Returns true or an error message.
-*/
-
-function subs_unsubscribe_user($user, $other_nickname)
-{
-
- $other = User::staticGet('nickname', $other_nickname);
-
- if (!$other) {
- return _('No such user.');
- }
-
- return subs_unsubscribe_to($user, $other->getProfile());
-}
-
function subs_unsubscribe_to($user, $other)
{
try {
diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php
index 1ed322ed2..7a4474ff6 100644
--- a/plugins/OStatus/actions/salmon.php
+++ b/plugins/OStatus/actions/salmon.php
@@ -63,11 +63,7 @@ class SalmonAction extends Action
// XXX: check that document element is Atom entry
// XXX: check the signature
- $entries = $dom->getElementsByTagNameNS(Activity::ATOM, 'entry');
- if ($entries && $entries->length) {
- // @fixme is it legit to have multiple entries?
- $this->act = new Activity($entries->item(0), $dom->documentElement);
- }
+ $this->act = new Activity($dom->documentElement);
return true;
}
@@ -122,7 +118,28 @@ class SalmonAction extends Action
case ActivityObject::COMMENT:
break;
default:
- throw new Exception("Can't handle that kind of post.");
+ throw new ClientException("Can't handle that kind of post.");
+ }
+
+ // Notice must either be a) in reply to a notice by this user
+ // or b) to the attention of this user
+
+ $context = $this->act->context;
+
+ if (!empty($context->replyToID)) {
+ $notice = Notice::staticGet('uri', $context->replyToID);
+ 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");
+ }
+ } else if (!empty($context->attention)) {
+ if (!in_array($context->attention, $this->user->uri)) {
+ throw new ClientException("To the attention of user(s) not including this one!");
+ }
+ } else {
+ throw new ClientException("Not to anyone in reply to anything!");
}
$profile = $this->ensureProfile();
@@ -133,6 +150,7 @@ class SalmonAction extends Action
* We've gotten a follow/subscribe notification from a remote user.
* Save a subscription relationship for them.
*/
+
function handleFollow()
{
$oprofile = $this->ensureProfile();
@@ -165,8 +183,54 @@ class SalmonAction extends Action
* Remote user likes one of our posts.
* Confirm the post is ours, and save a local favorite event.
*/
+
function handleFavorite()
{
+ // WORST VARIABLE NAME EVER
+ $object = $this->act->object;
+
+ switch ($this->act->object->type) {
+ case ActivityObject::ARTICLE:
+ case ActivityObject::BLOGENTRY:
+ case ActivityObject::NOTE:
+ case ActivityObject::STATUS:
+ case ActivityObject::COMMENT:
+ break;
+ default:
+ throw new ClientException("Can't handle that kind of object for liking/faving.");
+ }
+
+ $notice = Notice::staticGet('uri', $object->id);
+
+ if (empty($notice)) {
+ throw new ClientException("Notice with ID $object->id unknown.");
+ }
+
+ if ($notice->profile_id != $this->user->id) {
+ throw new ClientException("Notice with ID $object->id not posted by $this->user->id.");
+ }
+
+ $profile = $this->ensureProfile();
+
+ $old = Fave::pkeyGet(array('user_id' => $profile->id,
+ 'notice_id' => $notice->id));
+
+ if (!empty($old)) {
+ throw new ClientException("We already know that's a fave!");
+ }
+
+ $fave = new Fave();
+
+ // @fixme need to change this attribute name, maybe references
+ $fave->user_id = $profile->id;
+ $fave->notice_id = $notice->id;
+
+ $result = $fave->insert();
+
+ if (!$result) {
+ common_log_db_error($fave, 'INSERT', __FILE__);
+ throw new ServerException('Could not save new favorite.');
+ }
}
/**