1
0
Fork 0

Webfinger example

This commit is contained in:
Alex Kotov 2023-05-10 15:30:58 +04:00
parent badce25aec
commit 44239bc5d4
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
1 changed files with 75 additions and 1 deletions

View File

@ -19,18 +19,25 @@ module Diversipub
private
# rubocop:disable Metrics/MethodLength
def builder
@builder ||= Rack::Builder.new.tap do |builder|
builder.use Rack::Head
builder.use Rack::ShowExceptions
builder.use Rack::ShowStatus
builder.use Rack::ContentLength
builder.use Rack::Static, **rack_static_kwargs
builder.use Rack::Protection, except: %i[session_hijacking]
builder.map '/.well-known/webfinger' do
run Webfinger.new
end
builder.use Rack::Static, **rack_static_kwargs
builder.run rest
end
end
# rubocop:enable Metrics/MethodLength
def rack_static_kwargs
@rack_static_kwargs ||= {
cascade: true,
@ -43,5 +50,72 @@ module Diversipub
def rest
@rest ||= ->(_) { [200, {}, ['Hello, World!']] }
end
##
# Webfinger endpoint.
#
class Webfinger
JRD_JSON = 'application/jrd+json'
ACCT_RU = 'acct:ru@causa-arcana.com'
ACCT_EN = 'acct:en@causa-arcana.com'
RU = {
subject: ACCT_RU,
aliases: [].freeze,
links: [
{
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/html',
href: 'https://causa-arcana.com/ru/blog/feed.html',
},
{
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/gemini; charset=utf-8',
href: 'gemini://causa-arcana.com/ru/blog/feed.gmi',
},
].freeze,
}.freeze
EN = {
subject: ACCT_EN,
aliases: [].freeze,
links: [
{
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/html',
href: 'https://causa-arcana.com/en/blog/feed.html',
},
{
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/gemini; charset=utf-8',
href: 'gemini://causa-arcana.com/en/blog/feed.gmi',
},
].freeze,
}.freeze
def call(env)
request = Rack::Request.new env
resource = request.params['resource']
data =
case resource
when ACCT_RU then RU
when ACCT_EN then EN
else
raise 'Unknown resource'
end
[
200,
{
Rack::CONTENT_TYPE => JRD_JSON,
},
[
data.to_json,
],
]
end
end
end
end