mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-12-23 13:33:18 +00:00
51aa17052f
Prevent outbox from returning an actor object so other federation software does not attempt to send inbox requests until the inbox is fully supported.
138 lines
3.5 KiB
PHP
138 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Auth;
|
|
use App\Profile;
|
|
use League\Fractal;
|
|
use Illuminate\Http\Request;
|
|
use App\Util\Lexer\Nickname;
|
|
use App\Util\Webfinger\Webfinger;
|
|
use App\Transformer\ActivityPub\{
|
|
ProfileOutbox,
|
|
ProfileTransformer
|
|
};
|
|
use App\Jobs\RemoteFollowPipeline\RemoteFollowPipeline;
|
|
|
|
class FederationController extends Controller
|
|
{
|
|
public function authCheck()
|
|
{
|
|
if(!Auth::check()) {
|
|
abort(403);
|
|
}
|
|
return;
|
|
}
|
|
|
|
public function remoteFollow()
|
|
{
|
|
$this->authCheck();
|
|
return view('federation.remotefollow');
|
|
}
|
|
|
|
public function remoteFollowStore(Request $request)
|
|
{
|
|
$this->authCheck();
|
|
$this->validate($request, [
|
|
'url' => 'required|string'
|
|
]);
|
|
|
|
if(config('pixelfed.remote_follow_enabled') !== true) {
|
|
abort(403);
|
|
}
|
|
|
|
$follower = Auth::user()->profile;
|
|
$url = $request->input('url');
|
|
|
|
RemoteFollowPipeline::dispatch($follower, $url);
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function nodeinfoWellKnown()
|
|
{
|
|
$res = [
|
|
'links' => [
|
|
[
|
|
'href' => config('pixelfed.nodeinfo.url'),
|
|
'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0'
|
|
]
|
|
]
|
|
];
|
|
return response()->json($res);
|
|
}
|
|
|
|
public function nodeinfo()
|
|
{
|
|
$res = [
|
|
'metadata' => [
|
|
'nodeName' => config('app.name'),
|
|
'software' => [
|
|
'homepage' => 'https://pixelfed.org',
|
|
'github' => 'https://github.com/pixelfed',
|
|
'follow' => 'https://mastodon.social/@pixelfed'
|
|
],
|
|
/*
|
|
TODO: Custom Features for Trending
|
|
'customFeatures' => [
|
|
'trending' => [
|
|
'description' => 'Trending API for federated discovery',
|
|
'api' => [
|
|
'url' => null,
|
|
'docs' => null
|
|
],
|
|
],
|
|
],
|
|
*/
|
|
],
|
|
'openRegistrations' => config('pixelfed.open_registration'),
|
|
'protocols' => [
|
|
'activitypub'
|
|
],
|
|
'services' => [
|
|
'inbound' => [],
|
|
'outbound' => []
|
|
],
|
|
'software' => [
|
|
'name' => 'PixelFed',
|
|
'version' => config('pixelfed.version')
|
|
],
|
|
'usage' => [
|
|
'localPosts' => \App\Status::whereLocal(true)->count(),
|
|
'users' => [
|
|
'total' => \App\User::count()
|
|
]
|
|
],
|
|
'version' => '2.0'
|
|
];
|
|
|
|
return response()->json($res);
|
|
}
|
|
|
|
|
|
public function webfinger(Request $request)
|
|
{
|
|
$this->validate($request, ['resource'=>'required']);
|
|
$resource = $request->input('resource');
|
|
$parsed = Nickname::normalizeProfileUrl($resource);
|
|
$username = $parsed['username'];
|
|
$user = Profile::whereUsername($username)->firstOrFail();
|
|
$webfinger = (new Webfinger($user))->generate();
|
|
return response()->json($webfinger);
|
|
}
|
|
|
|
public function userOutbox(Request $request, $username)
|
|
{
|
|
if(config('pixelfed.activitypub_enabled') == false) {
|
|
abort(403);
|
|
}
|
|
|
|
$user = Profile::whereNull('remote_url')->whereUsername($username)->firstOrFail();
|
|
$timeline = $user->statuses()->orderBy('created_at','desc')->paginate(10);
|
|
$fractal = new Fractal\Manager();
|
|
$resource = new Fractal\Resource\Item($user, new ProfileOutbox);
|
|
$res = $fractal->createData($resource)->toArray();
|
|
return response()->json($res['data']);
|
|
}
|
|
|
|
}
|