pixelfed/app/Http/Controllers/FederationController.php

169 lines
5 KiB
PHP
Raw Normal View History

2018-05-28 23:50:14 +00:00
<?php
namespace App\Http\Controllers;
2019-06-10 00:51:54 +00:00
use App\Jobs\InboxPipeline\{
InboxWorker,
InboxValidator
};
2018-08-28 03:07:36 +00:00
use App\Jobs\RemoteFollowPipeline\RemoteFollowPipeline;
2019-03-02 03:08:52 +00:00
use App\{
AccountLog,
Like,
Profile,
Status,
User
2019-03-02 03:08:52 +00:00
};
2018-06-01 02:38:11 +00:00
use App\Util\Lexer\Nickname;
use App\Util\Webfinger\Webfinger;
2018-08-28 03:07:36 +00:00
use Auth;
use Cache;
use Carbon\Carbon;
use Illuminate\Http\Request;
use League\Fractal;
2019-12-21 06:15:15 +00:00
use App\Util\Site\Nodeinfo;
2019-06-10 00:51:54 +00:00
use App\Util\ActivityPub\{
Helpers,
2019-12-21 06:15:15 +00:00
HttpSignature,
Outbox
2019-06-10 00:51:54 +00:00
};
2020-02-22 11:33:35 +00:00
use Zttp\Zttp;
2018-05-28 23:50:14 +00:00
class FederationController extends Controller
{
public function nodeinfoWellKnown()
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.nodeinfo.enabled'), 404);
2020-11-18 21:19:02 +00:00
return response()->json(Nodeinfo::wellKnown())
->header('Access-Control-Allow-Origin','*');
2018-05-28 23:50:14 +00:00
}
public function nodeinfo()
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.nodeinfo.enabled'), 404);
2019-12-21 06:15:15 +00:00
return response()->json(Nodeinfo::get())
->header('Access-Control-Allow-Origin','*');
2018-08-28 03:07:36 +00:00
}
2018-06-01 02:38:11 +00:00
public function webfinger(Request $request)
{
2020-05-15 22:10:42 +00:00
abort_if(!config('federation.webfinger.enabled'), 400);
2019-06-09 23:15:35 +00:00
2020-05-15 22:10:42 +00:00
abort_if(!$request->filled('resource'), 400);
2018-08-28 03:07:36 +00:00
2018-12-24 21:36:25 +00:00
$resource = $request->input('resource');
$parsed = Nickname::normalizeProfileUrl($resource);
2019-07-16 01:22:48 +00:00
if($parsed['domain'] !== config('pixelfed.domain.app')) {
2020-05-15 22:10:42 +00:00
abort(400);
2019-07-16 01:22:48 +00:00
}
2018-12-24 21:36:25 +00:00
$username = $parsed['username'];
2019-07-16 01:22:48 +00:00
$profile = Profile::whereNull('domain')->whereUsername($username)->firstOrFail();
2018-12-24 21:36:25 +00:00
if($profile->status != null) {
return ProfileController::accountCheck($profile);
}
$webfinger = (new Webfinger($profile))->generate();
2018-08-28 03:07:36 +00:00
return response()->json($webfinger, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)
2020-11-18 21:19:02 +00:00
->header('Access-Control-Allow-Origin','*');
2018-06-01 02:38:11 +00:00
}
public function hostMeta(Request $request)
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.webfinger.enabled'), 404);
$path = route('well-known.webfinger');
$xml = '<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" type="application/xrd+xml" template="'.$path.'?resource={uri}"/></XRD>';
return response($xml)->header('Content-Type', 'application/xrd+xml');
}
2018-06-01 02:38:11 +00:00
public function userOutbox(Request $request, $username)
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.activitypub.enabled'), 404);
abort_if(!config('federation.activitypub.outbox'), 404);
2018-08-28 03:07:36 +00:00
2020-04-12 04:12:28 +00:00
$profile = Profile::whereNull('domain')
->whereNull('status')
->whereIsPrivate(false)
->whereUsername($username)
->firstOrFail();
$key = 'ap:outbox:latest_10:pid:' . $profile->id;
$ttl = now()->addMinutes(15);
$res = Cache::remember($key, $ttl, function() use($profile) {
return Outbox::get($profile);
});
return response(json_encode($res, JSON_UNESCAPED_SLASHES))->header('Content-Type', 'application/activity+json');
2018-06-01 02:38:11 +00:00
}
2018-07-24 03:20:46 +00:00
public function userInbox(Request $request, $username)
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.activitypub.enabled'), 404);
abort_if(!config('federation.activitypub.inbox'), 404);
$headers = $request->headers->all();
$payload = $request->getContent();
2020-05-22 23:03:33 +00:00
dispatch(new InboxValidator($username, $headers, $payload))->onQueue('high');
2018-12-30 04:50:37 +00:00
return;
}
2020-11-26 07:39:01 +00:00
public function sharedInbox(Request $request)
{
abort_if(!config('federation.activitypub.enabled'), 404);
abort_if(!config('federation.activitypub.sharedInbox'), 404);
$headers = $request->headers->all();
$payload = $request->getContent();
dispatch(new InboxWorker($headers, $payload))->onQueue('high');
return;
}
public function userFollowing(Request $request, $username)
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.activitypub.enabled'), 404);
2018-12-15 08:16:22 +00:00
$profile = Profile::whereNull('remote_url')
->whereUsername($username)
->whereIsPrivate(false)
->firstOrFail();
2019-06-10 01:23:13 +00:00
2018-12-24 21:36:25 +00:00
if($profile->status != null) {
2019-07-16 01:22:48 +00:00
abort(404);
2018-12-24 21:36:25 +00:00
}
2019-07-16 01:22:48 +00:00
$obj = [
'@context' => 'https://www.w3.org/ns/activitystreams',
'id' => $request->getUri(),
'type' => 'OrderedCollectionPage',
2019-07-16 01:22:48 +00:00
'totalItems' => 0,
'orderedItems' => []
];
return response()->json($obj);
}
public function userFollowers(Request $request, $username)
{
2019-06-09 23:15:35 +00:00
abort_if(!config('federation.activitypub.enabled'), 404);
2018-12-15 08:16:22 +00:00
$profile = Profile::whereNull('remote_url')
->whereUsername($username)
->whereIsPrivate(false)
->firstOrFail();
2019-06-10 01:23:13 +00:00
2018-12-24 21:36:25 +00:00
if($profile->status != null) {
2019-07-16 01:22:48 +00:00
abort(404);
2018-12-24 21:36:25 +00:00
}
2019-07-16 01:22:48 +00:00
$obj = [
'@context' => 'https://www.w3.org/ns/activitystreams',
'id' => $request->getUri(),
'type' => 'OrderedCollectionPage',
2019-07-16 01:22:48 +00:00
'totalItems' => 0,
'orderedItems' => []
];
2019-07-16 01:22:48 +00:00
return response()->json($obj);
2018-07-24 03:20:46 +00:00
}
2018-05-28 23:50:14 +00:00
}