diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b2da511..95b4820a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -84,6 +84,8 @@
- Update AdminApiController, fix postgres support ([84fb59d0](https://github.com/pixelfed/pixelfed/commit/84fb59d0))
- Update StatusReplyPipeline, fix comment counts ([164aa577](https://github.com/pixelfed/pixelfed/commit/164aa577))
- Update ComposeModal, add Alt Text button to caption screen ([4db48188](https://github.com/pixelfed/pixelfed/commit/4db48188))
+- Update AccountService, fix actor cache invalidation ([498b46f7](https://github.com/pixelfed/pixelfed/commit/498b46f7))
+- Update SharePipeline, fix share handling and notification generation ([83e1e203](https://github.com/pixelfed/pixelfed/commit/83e1e203))
- ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.11.4 (2022-10-04)](https://github.com/pixelfed/pixelfed/compare/v0.11.3...v0.11.4)
diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php
index 0c44fd47..cd999318 100644
--- a/app/Http/Controllers/Api/ApiV1Controller.php
+++ b/app/Http/Controllers/Api/ApiV1Controller.php
@@ -2814,9 +2814,7 @@ class ApiV1Controller extends Controller
'visibility' => 'public'
]);
- if($share->wasRecentlyCreated == true) {
- SharePipeline::dispatch($share);
- }
+ SharePipeline::dispatch($share)->onQueue('low');
StatusService::del($status->id);
ReblogService::add($user->profile_id, $status->id);
@@ -2858,7 +2856,7 @@ class ApiV1Controller extends Controller
return $this->json($res);
}
- UndoSharePipeline::dispatch($reblog);
+ UndoSharePipeline::dispatch($reblog)->onQueue('low');
ReblogService::del($user->profile_id, $status->id);
$res = StatusService::getMastodon($status->id);
diff --git a/app/Http/Controllers/BookmarkController.php b/app/Http/Controllers/BookmarkController.php
index 59ffeab3..f5f59457 100644
--- a/app/Http/Controllers/BookmarkController.php
+++ b/app/Http/Controllers/BookmarkController.php
@@ -31,7 +31,7 @@ class BookmarkController extends Controller
abort_if(
$profile->id !== $status->profile_id && !FollowerService::follows($profile->id, $status->profile_id),
404,
- 'Error: Cannot bookmark private posts from accounts you do not follow.'
+ 'Error: You cannot bookmark private posts from accounts you do not follow.'
);
}
diff --git a/app/Jobs/SharePipeline/SharePipeline.php b/app/Jobs/SharePipeline/SharePipeline.php
index cd54b90e..2cc807ac 100644
--- a/app/Jobs/SharePipeline/SharePipeline.php
+++ b/app/Jobs/SharePipeline/SharePipeline.php
@@ -58,47 +58,32 @@ class SharePipeline implements ShouldQueue
return;
}
- $exists = Notification::whereProfileId($target->id)
- ->whereActorId($status->profile_id)
- ->whereAction('share')
- ->whereItemId($status->reblog_of_id)
- ->whereItemType('App\Status')
- ->exists();
-
if($target->id === $status->profile_id) {
$this->remoteAnnounceDeliver();
return true;
}
- if($exists === true) {
- return true;
- }
-
- $this->remoteAnnounceDeliver();
-
ReblogService::addPostReblog($parent->id, $status->id);
- $parent->reblogs_count = $parent->shares()->count();
+ $parent->reblogs_count = $parent->reblogs_count + 1;
$parent->save();
StatusService::del($parent->id);
- try {
- $notification = new Notification;
- $notification->profile_id = $target->id;
- $notification->actor_id = $actor->id;
- $notification->action = 'share';
- $notification->message = $status->shareToText();
- $notification->rendered = $status->shareToHtml();
- $notification->item_id = $status->reblog_of_id ?? $status->id;
- $notification->item_type = "App\Status";
- $notification->save();
+ Notification::firstOrCreate(
+ [
+ 'profile_id' => $target->id,
+ 'actor_id' => $actor->id,
+ 'action' => 'share',
+ 'item_type' => 'App\Status',
+ 'item_id' => $status->reblog_of_id ?? $status->id,
+ ],
+ [
+ 'message' => $status->shareToText(),
+ 'rendered' => $status->shareToHtml()
+ ]
+ );
- $redis = Redis::connection();
- $key = config('cache.prefix').':user.'.$status->profile_id.'.notifications';
- $redis->lpush($key, $notification->id);
- } catch (Exception $e) {
- Log::error($e);
- }
+ return $this->remoteAnnounceDeliver();
}
public function remoteAnnounceDeliver()
diff --git a/app/Jobs/SharePipeline/UndoSharePipeline.php b/app/Jobs/SharePipeline/UndoSharePipeline.php
index 596d4d2d..d63f909b 100644
--- a/app/Jobs/SharePipeline/UndoSharePipeline.php
+++ b/app/Jobs/SharePipeline/UndoSharePipeline.php
@@ -33,35 +33,39 @@ class UndoSharePipeline implements ShouldQueue
{
$status = $this->status;
$actor = $status->profile;
- $parent = $status->parent();
- $target = $status->parent()->profile;
+ $parent = Status::find($status->reblog_of_id);
- ReblogService::removePostReblog($parent->id, $status->id);
+ if($parent) {
+ $target = $parent->profile_id;
+ ReblogService::removePostReblog($parent->id, $status->id);
- if ($status->uri !== null) {
+ if($parent->reblogs_count > 0) {
+ $parent->reblogs_count = $parent->reblogs_count - 1;
+ $parent->save();
+ StatusService::del($parent->id);
+ }
+
+ $notification = Notification::whereProfileId($target)
+ ->whereActorId($status->profile_id)
+ ->whereAction('share')
+ ->whereItemId($status->reblog_of_id)
+ ->whereItemType('App\Status')
+ ->first();
+
+ if($notification) {
+ $notification->forceDelete();
+ }
+ }
+
+ if ($status->uri != null) {
return;
}
- if($target->domain === null) {
- Notification::whereProfileId($target->id)
- ->whereActorId($status->profile_id)
- ->whereAction('share')
- ->whereItemId($status->reblog_of_id)
- ->whereItemType('App\Status')
- ->delete();
+ if(config_cache('federation.activitypub.enabled') == false) {
+ return $status->delete();
+ } else {
+ return $this->remoteAnnounceDeliver();
}
-
- $this->remoteAnnounceDeliver();
-
- if($parent->reblogs_count > 0) {
- $parent->reblogs_count = $parent->reblogs_count - 1;
- $parent->save();
- StatusService::del($parent->id);
- }
-
- $status->forceDelete();
-
- return 1;
}
public function remoteAnnounceDeliver()
@@ -124,5 +128,8 @@ class UndoSharePipeline implements ShouldQueue
$promise->wait();
+ $status->delete();
+
+ return 1;
}
}
diff --git a/app/Notification.php b/app/Notification.php
index ebd6f641..b0877978 100644
--- a/app/Notification.php
+++ b/app/Notification.php
@@ -16,7 +16,7 @@ class Notification extends Model
*/
protected $dates = ['deleted_at'];
- protected $fillable = ['*'];
+ protected $guarded = [];
public function actor()
{
diff --git a/app/Util/ActivityPub/Inbox.php b/app/Util/ActivityPub/Inbox.php
index c8fa9500..6b658643 100644
--- a/app/Util/ActivityPub/Inbox.php
+++ b/app/Util/ActivityPub/Inbox.php
@@ -569,13 +569,9 @@ class Inbox
return;
}
- if(Helpers::validateLocalUrl($activity) == false) {
- return;
- }
-
$parent = Helpers::statusFetch($activity);
- if(empty($parent)) {
+ if(!$parent || empty($parent)) {
return;
}
@@ -590,15 +586,18 @@ class Inbox
'type' => 'share'
]);
- Notification::firstOrCreate([
- 'profile_id' => $parent->profile->id,
- 'actor_id' => $actor->id,
- 'action' => 'share',
- 'message' => $status->replyToText(),
- 'rendered' => $status->replyToHtml(),
- 'item_id' => $parent->id,
- 'item_type' => 'App\Status'
- ]);
+ Notification::firstOrCreate(
+ [
+ 'profile_id' => $parent->profile_id,
+ 'actor_id' => $actor->id,
+ 'action' => 'share',
+ 'item_id' => $parent->id,
+ 'item_type' => 'App\Status',
+ ], [
+ 'message' => $status->replyToText(),
+ 'rendered' => $status->replyToHtml(),
+ ]
+ );
$parent->reblogs_count = $parent->reblogs_count + 1;
$parent->save();
diff --git a/app/Util/ActivityPub/Validator/Announce.php b/app/Util/ActivityPub/Validator/Announce.php
index b6f89eec..d862fe9d 100644
--- a/app/Util/ActivityPub/Validator/Announce.php
+++ b/app/Util/ActivityPub/Validator/Announce.php
@@ -11,18 +11,15 @@ class Announce {
{
$valid = Validator::make($payload, [
'@context' => 'required',
- 'id' => 'required|string',
+ 'id' => 'required|url',
'type' => [
'required',
Rule::in(['Announce'])
],
'actor' => 'required|url',
- 'published' => 'required|date',
- 'to' => 'required',
- 'cc' => 'required',
'object' => 'required|url'
])->passes();
return $valid;
}
-}
\ No newline at end of file
+}
diff --git a/public/img/pixelfed-icon-black.svg b/public/img/pixelfed-icon-black.svg
index 32c7e52f..449c9d34 100644
--- a/public/img/pixelfed-icon-black.svg
+++ b/public/img/pixelfed-icon-black.svg
@@ -1,14 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/img/pixelfed-icon-color.svg b/public/img/pixelfed-icon-color.svg
index dfaf03fb..ee0ba331 100644
--- a/public/img/pixelfed-icon-color.svg
+++ b/public/img/pixelfed-icon-color.svg
@@ -1,101 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/img/pixelfed-icon-grey.svg b/public/img/pixelfed-icon-grey.svg
index 0bac224d..c4f8a49b 100644
--- a/public/img/pixelfed-icon-grey.svg
+++ b/public/img/pixelfed-icon-grey.svg
@@ -1,14 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/img/pixelfed-icon-white.svg b/public/img/pixelfed-icon-white.svg
new file mode 100644
index 00000000..f61b9471
--- /dev/null
+++ b/public/img/pixelfed-icon-white.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/Unit/ActivityPub/Verb/AnnounceTest.php b/tests/Unit/ActivityPub/Verb/AnnounceTest.php
index c38fffb3..91a4fdfe 100644
--- a/tests/Unit/ActivityPub/Verb/AnnounceTest.php
+++ b/tests/Unit/ActivityPub/Verb/AnnounceTest.php
@@ -53,22 +53,6 @@ class AnnounceTest extends TestCase
'object' => 'https://example.org/p/bob/100000000000000',
];
- $this->invalidDate = [
- '@context' => 'https://www.w3.org/ns/activitystreams',
- 'id' => 'https://example.org/users/alice/statuses/100000000000001/activity',
- 'type' => 'Announce',
- 'actor' => 'https://example.org/users/alice',
- 'published' => '2018-12-31T23:59:59ZEZE',
- 'to' => [
- 'https://www.w3.org/ns/activitystreams#Public'
- ],
- 'cc' => [
- 'https://example.org/users/bob',
- 'https://example.org/users/alice/followers'
- ],
- 'object' => 'https://example.org/p/bob/100000000000000',
- ];
-
$this->contextMissing = [
'id' => 'https://example.org/users/alice/statuses/100000000000001/activity',
'type' => 'Announce',
@@ -84,25 +68,6 @@ class AnnounceTest extends TestCase
'object' => 'https://example.org/p/bob/100000000000000',
];
- $this->audienceMissing = [
- 'id' => 'https://example.org/users/alice/statuses/100000000000001/activity',
- 'type' => 'Announce',
- 'actor' => 'https://example.org/users/alice',
- 'published' => '2018-12-31T23:59:59Z',
- 'object' => 'https://example.org/p/bob/100000000000000',
- ];
-
- $this->audienceMissing2 = [
- '@context' => 'https://www.w3.org/ns/activitystreams',
- 'id' => 'https://example.org/users/alice/statuses/100000000000001/activity',
- 'type' => 'Announce',
- 'actor' => 'https://example.org/users/alice',
- 'published' => '2018-12-31T23:59:59Z',
- 'to' => null,
- 'cc' => null,
- 'object' => 'https://example.org/p/bob/100000000000000',
- ];
-
$this->invalidActor = [
'@context' => 'https://www.w3.org/ns/activitystreams',
'id' => 'https://example.org/users/alice/statuses/100000000000001/activity',
@@ -185,25 +150,12 @@ class AnnounceTest extends TestCase
$this->assertFalse(Announce::validate($this->invalidAnnounce));
}
- /** @test */
- public function invalid_date()
- {
- $this->assertFalse(Announce::validate($this->invalidDate));
- }
-
/** @test */
public function context_missing()
{
$this->assertFalse(Announce::validate($this->contextMissing));
}
- /** @test */
- public function audience_missing()
- {
- $this->assertFalse(Announce::validate($this->audienceMissing));
- $this->assertFalse(Announce::validate($this->audienceMissing2));
- }
-
/** @test */
public function invalid_actor()
{