From 44239bc5d4d5c714024fa12be2a612885d09fe38 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Wed, 10 May 2023 15:30:58 +0400 Subject: [PATCH] Webfinger example --- lib/diversipub/rack_app.rb | 76 +++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/lib/diversipub/rack_app.rb b/lib/diversipub/rack_app.rb index ace28ff..70a16ab 100644 --- a/lib/diversipub/rack_app.rb +++ b/lib/diversipub/rack_app.rb @@ -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