2020-03-21 03:29:36 -04:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
2020-03-21 17:11:35 -04:00
|
|
|
|
using BirdsiteLive.Models;
|
2020-03-21 18:58:23 -04:00
|
|
|
|
using BirdsiteLive.Twitter;
|
2020-03-21 03:29:36 -04:00
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2020-03-21 17:11:35 -04:00
|
|
|
|
using Microsoft.Extensions.Options;
|
2020-03-21 03:29:36 -04:00
|
|
|
|
|
|
|
|
|
namespace BirdsiteLive.Controllers
|
|
|
|
|
{
|
|
|
|
|
[ApiController]
|
|
|
|
|
public class WellKnownController : ControllerBase
|
|
|
|
|
{
|
2020-03-21 18:58:23 -04:00
|
|
|
|
private readonly ITwitterService _twitterService;
|
2020-03-21 17:11:35 -04:00
|
|
|
|
private readonly InstanceSettings _settings;
|
|
|
|
|
|
2020-03-21 03:29:36 -04:00
|
|
|
|
#region Ctor
|
2020-03-21 18:58:23 -04:00
|
|
|
|
public WellKnownController(IOptions<InstanceSettings> settings, ITwitterService twitterService)
|
2020-03-21 03:29:36 -04:00
|
|
|
|
{
|
2020-03-21 18:58:23 -04:00
|
|
|
|
_twitterService = twitterService;
|
2020-03-21 17:11:35 -04:00
|
|
|
|
_settings = settings.Value;
|
2020-03-21 03:29:36 -04:00
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
[Route("/.well-known/webfinger")]
|
2020-03-21 17:11:35 -04:00
|
|
|
|
public IActionResult Webfinger(string resource = null)
|
2020-03-21 03:29:36 -04:00
|
|
|
|
{
|
2020-03-21 17:11:35 -04:00
|
|
|
|
var acct = resource.Split("acct:")[1].Trim();
|
|
|
|
|
|
|
|
|
|
string name = null;
|
|
|
|
|
string domain = null;
|
|
|
|
|
|
|
|
|
|
var splitAcct = acct.Split('@', StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
|
|
|
|
|
|
var atCount = acct.Count(x => x == '@');
|
|
|
|
|
if (atCount == 1 && acct.StartsWith('@'))
|
|
|
|
|
{
|
|
|
|
|
name = splitAcct[1];
|
|
|
|
|
}
|
|
|
|
|
else if (atCount == 1 || atCount == 2)
|
|
|
|
|
{
|
|
|
|
|
name = splitAcct[0];
|
|
|
|
|
domain = splitAcct[1];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return BadRequest();
|
|
|
|
|
}
|
2020-03-21 03:29:36 -04:00
|
|
|
|
|
2020-03-21 17:11:35 -04:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(domain) && domain != _settings.Domain)
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
|
|
|
//TODO: check if twitter user exists
|
2020-03-21 03:29:36 -04:00
|
|
|
|
|
2020-03-21 17:11:35 -04:00
|
|
|
|
var result = new WebFingerResult()
|
2020-03-21 03:29:36 -04:00
|
|
|
|
{
|
2020-03-21 17:11:35 -04:00
|
|
|
|
subject = $"acct:{name}@{_settings.Domain}",
|
|
|
|
|
aliases = new []
|
|
|
|
|
{
|
|
|
|
|
$"https://{_settings.Domain}/@{name}",
|
|
|
|
|
$"https://{_settings.Domain}/users/{name}"
|
|
|
|
|
},
|
2020-03-21 03:29:36 -04:00
|
|
|
|
links = new List<WebFingerLink>
|
|
|
|
|
{
|
2020-03-21 17:11:35 -04:00
|
|
|
|
new WebFingerLink()
|
|
|
|
|
{
|
|
|
|
|
rel = "http://webfinger.net/rel/profile-page",
|
|
|
|
|
type = "text/html",
|
|
|
|
|
href = $"https://{_settings.Domain}/@{name}"
|
|
|
|
|
},
|
2020-03-21 03:29:36 -04:00
|
|
|
|
new WebFingerLink()
|
|
|
|
|
{
|
|
|
|
|
rel = "self",
|
|
|
|
|
type = "application/activity+json",
|
2020-03-21 17:11:35 -04:00
|
|
|
|
href = $"https://{_settings.Domain}/users/{name}"
|
2020-03-21 03:29:36 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
2020-03-21 17:11:35 -04:00
|
|
|
|
|
|
|
|
|
return new JsonResult(result);
|
2020-03-21 03:29:36 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class WebFingerResult
|
|
|
|
|
{
|
|
|
|
|
public string subject { get; set; }
|
2020-03-21 17:11:35 -04:00
|
|
|
|
public string[] aliases { get; set; }
|
2020-03-21 03:29:36 -04:00
|
|
|
|
public List<WebFingerLink> links { get; set; } = new List<WebFingerLink>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class WebFingerLink
|
|
|
|
|
{
|
|
|
|
|
public string rel { get; set; }
|
|
|
|
|
public string type { get; set; }
|
|
|
|
|
public string href { get; set; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|