created parametrable webfinger
This commit is contained in:
parent
6be59fc867
commit
2bbcb3b36b
6 changed files with 80 additions and 12 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,6 +3,8 @@
|
||||||
##
|
##
|
||||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
appsettings.*.json
|
||||||
|
|
||||||
# User-specific files
|
# User-specific files
|
||||||
*.rsuser
|
*.rsuser
|
||||||
*.suo
|
*.suo
|
||||||
|
|
|
@ -2,44 +2,86 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using BirdsiteLive.Models;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace BirdsiteLive.Controllers
|
namespace BirdsiteLive.Controllers
|
||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
public class WellKnownController : ControllerBase
|
public class WellKnownController : ControllerBase
|
||||||
{
|
{
|
||||||
#region Ctor
|
private readonly InstanceSettings _settings;
|
||||||
public WellKnownController()
|
|
||||||
{
|
|
||||||
|
|
||||||
|
#region Ctor
|
||||||
|
public WellKnownController(IOptions<InstanceSettings> settings)
|
||||||
|
{
|
||||||
|
_settings = settings.Value;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
[Route("/.well-known/webfinger")]
|
[Route("/.well-known/webfinger")]
|
||||||
public WebFingerResult Webfinger(string resource = null)
|
public IActionResult Webfinger(string resource = null)
|
||||||
{
|
{
|
||||||
var acct = resource.Split("acct:")[1];
|
var acct = resource.Split("acct:")[1].Trim();
|
||||||
|
|
||||||
|
string name = null;
|
||||||
|
string domain = null;
|
||||||
|
|
||||||
return new WebFingerResult()
|
var splitAcct = acct.Split('@', StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
var atCount = acct.Count(x => x == '@');
|
||||||
|
if (atCount == 1 && acct.StartsWith('@'))
|
||||||
{
|
{
|
||||||
subject = $"acct:{acct}",
|
name = splitAcct[1];
|
||||||
|
}
|
||||||
|
else if (atCount == 1 || atCount == 2)
|
||||||
|
{
|
||||||
|
name = splitAcct[0];
|
||||||
|
domain = splitAcct[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return BadRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(domain) && domain != _settings.Domain)
|
||||||
|
return NotFound();
|
||||||
|
|
||||||
|
//TODO: check if twitter user exists
|
||||||
|
|
||||||
|
var result = new WebFingerResult()
|
||||||
|
{
|
||||||
|
subject = $"acct:{name}@{_settings.Domain}",
|
||||||
|
aliases = new []
|
||||||
|
{
|
||||||
|
$"https://{_settings.Domain}/@{name}",
|
||||||
|
$"https://{_settings.Domain}/users/{name}"
|
||||||
|
},
|
||||||
links = new List<WebFingerLink>
|
links = new List<WebFingerLink>
|
||||||
{
|
{
|
||||||
|
new WebFingerLink()
|
||||||
|
{
|
||||||
|
rel = "http://webfinger.net/rel/profile-page",
|
||||||
|
type = "text/html",
|
||||||
|
href = $"https://{_settings.Domain}/@{name}"
|
||||||
|
},
|
||||||
new WebFingerLink()
|
new WebFingerLink()
|
||||||
{
|
{
|
||||||
rel = "self",
|
rel = "self",
|
||||||
type = "application/activity+json",
|
type = "application/activity+json",
|
||||||
href = "https://d150a079.ngrok.io/actor"
|
href = $"https://{_settings.Domain}/users/{name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return new JsonResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WebFingerResult
|
public class WebFingerResult
|
||||||
{
|
{
|
||||||
public string subject { get; set; }
|
public string subject { get; set; }
|
||||||
|
public string[] aliases { get; set; }
|
||||||
public List<WebFingerLink> links { get; set; } = new List<WebFingerLink>();
|
public List<WebFingerLink> links { get; set; } = new List<WebFingerLink>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
src/BirdsiteLive/Models/InstanceSettings.cs
Normal file
7
src/BirdsiteLive/Models/InstanceSettings.cs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
namespace BirdsiteLive.Models
|
||||||
|
{
|
||||||
|
public class InstanceSettings
|
||||||
|
{
|
||||||
|
public string Domain { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using BirdsiteLive.Models;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.HttpsPolicy;
|
using Microsoft.AspNetCore.HttpsPolicy;
|
||||||
|
@ -13,9 +14,17 @@ namespace BirdsiteLive
|
||||||
{
|
{
|
||||||
public class Startup
|
public class Startup
|
||||||
{
|
{
|
||||||
public Startup(IConfiguration configuration)
|
public Startup(IWebHostEnvironment env)
|
||||||
{
|
{
|
||||||
Configuration = configuration;
|
Console.WriteLine($"EnvironmentName {env.EnvironmentName}");
|
||||||
|
|
||||||
|
var builder = new ConfigurationBuilder()
|
||||||
|
.SetBasePath(env.ContentRootPath)
|
||||||
|
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
|
||||||
|
.AddJsonFile($"appsettings.{env.EnvironmentName.ToLowerInvariant()}.json", optional: true)
|
||||||
|
.AddEnvironmentVariables();
|
||||||
|
if (env.IsDevelopment()) builder.AddUserSecrets<Startup>();
|
||||||
|
Configuration = builder.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IConfiguration Configuration { get; }
|
public IConfiguration Configuration { get; }
|
||||||
|
@ -23,6 +32,8 @@ namespace BirdsiteLive
|
||||||
// This method gets called by the runtime. Use this method to add services to the container.
|
// This method gets called by the runtime. Use this method to add services to the container.
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
|
services.Configure<InstanceSettings>(Configuration.GetSection("Instance"));
|
||||||
|
|
||||||
services.AddControllersWithViews();
|
services.AddControllersWithViews();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +50,7 @@ namespace BirdsiteLive
|
||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
}
|
}
|
||||||
app.UseHttpsRedirection();
|
//app.UseHttpsRedirection();
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
|
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
|
|
|
@ -5,5 +5,8 @@
|
||||||
"Microsoft": "Warning",
|
"Microsoft": "Warning",
|
||||||
"Microsoft.Hosting.Lifetime": "Information"
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Instance": {
|
||||||
|
"Domain": "domain.name"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,5 +6,8 @@
|
||||||
"Microsoft.Hosting.Lifetime": "Information"
|
"Microsoft.Hosting.Lifetime": "Information"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*",
|
||||||
|
"Instance": {
|
||||||
|
"Domain": "domain.name"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue