| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace App\Jobs\SharePipeline; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use Cache, Log; | 
					
						
							|  |  |  | use Illuminate\Support\Facades\Redis; | 
					
						
							|  |  |  | use App\{Status, Notification}; | 
					
						
							|  |  |  | use Illuminate\Bus\Queueable; | 
					
						
							|  |  |  | use Illuminate\Contracts\Queue\ShouldQueue; | 
					
						
							|  |  |  | use Illuminate\Foundation\Bus\Dispatchable; | 
					
						
							|  |  |  | use Illuminate\Queue\InteractsWithQueue; | 
					
						
							|  |  |  | use Illuminate\Queue\SerializesModels; | 
					
						
							|  |  |  | use League\Fractal; | 
					
						
							|  |  |  | use League\Fractal\Serializer\ArraySerializer; | 
					
						
							|  |  |  | use App\Transformer\ActivityPub\Verb\UndoAnnounce; | 
					
						
							|  |  |  | use GuzzleHttp\{Pool, Client, Promise}; | 
					
						
							|  |  |  | use App\Util\ActivityPub\HttpSignature; | 
					
						
							| 
									
										
										
										
											2022-03-11 06:34:34 +00:00
										 |  |  | use App\Services\ReblogService; | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | use App\Services\StatusService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UndoSharePipeline implements ShouldQueue | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; | 
					
						
							|  |  |  | 	protected $status; | 
					
						
							|  |  |  | 	public $deleteWhenMissingModels = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function __construct(Status $status) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->status = $status; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function handle() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$status = $this->status; | 
					
						
							|  |  |  | 		$actor = $status->profile; | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 		$parent = Status::find($status->reblog_of_id); | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 		if($parent) { | 
					
						
							|  |  |  | 			$target = $parent->profile_id; | 
					
						
							|  |  |  | 			ReblogService::removePostReblog($parent->id, $status->id); | 
					
						
							| 
									
										
										
										
											2022-03-11 06:34:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 			if($parent->reblogs_count > 0) { | 
					
						
							|  |  |  | 				$parent->reblogs_count = $parent->reblogs_count - 1; | 
					
						
							|  |  |  | 				$parent->save(); | 
					
						
							|  |  |  | 				StatusService::del($parent->id); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 			$notification = Notification::whereProfileId($target) | 
					
						
							|  |  |  | 				->whereActorId($status->profile_id) | 
					
						
							|  |  |  | 				->whereAction('share') | 
					
						
							|  |  |  | 				->whereItemId($status->reblog_of_id) | 
					
						
							|  |  |  | 				->whereItemType('App\Status') | 
					
						
							|  |  |  | 				->first(); | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 			if($notification) { | 
					
						
							|  |  |  | 				$notification->forceDelete(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 		if ($status->uri != null) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 		if(config_cache('federation.activitypub.enabled') == false) { | 
					
						
							|  |  |  | 			return $status->delete(); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return $this->remoteAnnounceDeliver(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function remoteAnnounceDeliver() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if(config_cache('federation.activitypub.enabled') == false) { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$status = $this->status; | 
					
						
							|  |  |  | 		$profile = $status->profile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$fractal = new Fractal\Manager(); | 
					
						
							|  |  |  | 		$fractal->setSerializer(new ArraySerializer()); | 
					
						
							|  |  |  | 		$resource = new Fractal\Resource\Item($status, new UndoAnnounce()); | 
					
						
							|  |  |  | 		$activity = $fractal->createData($resource)->toArray(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$audience = $status->profile->getAudienceInbox(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(empty($audience) || $status->scope != 'public') { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$payload = json_encode($activity); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$client = new Client([ | 
					
						
							|  |  |  | 			'timeout'  => config('federation.activitypub.delivery.timeout') | 
					
						
							|  |  |  | 		]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 07:15:41 +00:00
										 |  |  | 		$version = config('pixelfed.version'); | 
					
						
							|  |  |  | 		$appUrl = config('app.url'); | 
					
						
							|  |  |  | 		$userAgent = "(Pixelfed/{$version}; +{$appUrl})"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$requests = function($audience) use ($client, $activity, $profile, $payload, $userAgent) { | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 			foreach($audience as $url) { | 
					
						
							| 
									
										
										
										
											2022-05-02 14:36:12 +00:00
										 |  |  | 				$headers = HttpSignature::sign($profile, $url, $activity, [ | 
					
						
							|  |  |  | 					'Content-Type'	=> 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', | 
					
						
							| 
									
										
										
										
											2023-01-31 07:15:41 +00:00
										 |  |  | 					'User-Agent'	=> $userAgent, | 
					
						
							| 
									
										
										
										
											2022-05-02 14:36:12 +00:00
										 |  |  | 				]); | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 				yield function() use ($client, $url, $headers, $payload) { | 
					
						
							|  |  |  | 					return $client->postAsync($url, [ | 
					
						
							|  |  |  | 						'curl' => [ | 
					
						
							|  |  |  | 							CURLOPT_HTTPHEADER => $headers, | 
					
						
							|  |  |  | 							CURLOPT_POSTFIELDS => $payload, | 
					
						
							|  |  |  | 							CURLOPT_HEADER => true | 
					
						
							|  |  |  | 						] | 
					
						
							|  |  |  | 					]); | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$pool = new Pool($client, $requests($audience), [ | 
					
						
							|  |  |  | 			'concurrency' => config('federation.activitypub.delivery.concurrency'), | 
					
						
							|  |  |  | 			'fulfilled' => function ($response, $index) { | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			'rejected' => function ($reason, $index) { | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$promise = $pool->promise(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$promise->wait(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 09:27:23 +00:00
										 |  |  | 		$status->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return 1; | 
					
						
							| 
									
										
										
										
											2021-06-29 04:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |