federails 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +171 -7
- data/Rakefile +5 -5
- data/app/controllers/federails/application_controller.rb +19 -0
- data/app/controllers/federails/client/activities_controller.rb +21 -0
- data/app/controllers/federails/client/actors_controller.rb +37 -0
- data/app/controllers/federails/client/followings_controller.rb +93 -0
- data/app/controllers/federails/server/activities_controller.rb +65 -0
- data/app/controllers/federails/server/actors_controller.rb +34 -0
- data/app/controllers/federails/server/followings_controller.rb +18 -0
- data/app/controllers/federails/server/nodeinfo_controller.rb +22 -0
- data/app/controllers/federails/server/server_controller.rb +17 -0
- data/app/controllers/federails/server/web_finger_controller.rb +38 -0
- data/app/jobs/federails/notify_inbox_job.rb +12 -0
- data/app/mailers/federails/application_mailer.rb +2 -2
- data/app/models/concerns/federails/entity.rb +46 -0
- data/app/models/federails/activity.rb +40 -0
- data/app/models/federails/actor.rb +152 -0
- data/app/models/federails/following.rb +43 -0
- data/app/policies/federails/client/activity_policy.rb +6 -0
- data/app/policies/federails/client/actor_policy.rb +15 -0
- data/app/policies/federails/client/following_policy.rb +35 -0
- data/app/policies/federails/federails_policy.rb +59 -0
- data/app/policies/federails/server/activity_policy.rb +6 -0
- data/app/policies/federails/server/actor_policy.rb +23 -0
- data/app/policies/federails/server/following_policy.rb +6 -0
- data/app/views/federails/client/activities/_activity.html.erb +5 -0
- data/app/views/federails/client/activities/_activity.json.jbuilder +1 -0
- data/app/views/federails/client/activities/_index.json.jbuilder +1 -0
- data/app/views/federails/client/activities/feed.html.erb +4 -0
- data/app/views/federails/client/activities/feed.json.jbuilder +1 -0
- data/app/views/federails/client/activities/index.html.erb +5 -0
- data/app/views/federails/client/activities/index.json.jbuilder +1 -0
- data/app/views/federails/client/actors/_actor.json.jbuilder +14 -0
- data/app/views/federails/client/actors/_lookup_form.html.erb +5 -0
- data/app/views/federails/client/actors/index.html.erb +24 -0
- data/app/views/federails/client/actors/index.json.jbuilder +1 -0
- data/app/views/federails/client/actors/show.html.erb +100 -0
- data/app/views/federails/client/actors/show.json.jbuilder +1 -0
- data/app/views/federails/client/followings/_follow.html.erb +4 -0
- data/app/views/federails/client/followings/_follower.html.erb +7 -0
- data/app/views/federails/client/followings/_following.json.jbuilder +1 -0
- data/app/views/federails/client/followings/_form.html.erb +21 -0
- data/app/views/federails/client/followings/index.html.erb +29 -0
- data/app/views/federails/client/followings/index.json.jbuilder +1 -0
- data/app/views/federails/client/followings/show.html.erb +21 -0
- data/app/views/federails/client/followings/show.json.jbuilder +1 -0
- data/app/views/federails/server/activities/_activity.json.jbuilder +9 -0
- data/app/views/federails/server/activities/outbox.json.jbuilder +18 -0
- data/app/views/federails/server/activities/show.json.jbuilder +1 -0
- data/app/views/federails/server/actors/_actor.json.jbuilder +11 -0
- data/app/views/federails/server/actors/followers.json.jbuilder +18 -0
- data/app/views/federails/server/actors/following.json.jbuilder +18 -0
- data/app/views/federails/server/actors/show.json.jbuilder +1 -0
- data/app/views/federails/server/followings/_following.json.jbuilder +7 -0
- data/app/views/federails/server/followings/show.json.jbuilder +1 -0
- data/app/views/federails/server/nodeinfo/index.json.jbuilder +6 -0
- data/app/views/federails/server/nodeinfo/show.json.jbuilder +19 -0
- data/app/views/federails/server/web_finger/find.json.jbuilder +20 -0
- data/app/views/federails/server/web_finger/host_meta.xml.erb +5 -0
- data/config/routes.rb +43 -0
- data/db/migrate/20200712133150_create_federails_actors.rb +24 -0
- data/db/migrate/20200712143127_create_federails_followings.rb +14 -0
- data/db/migrate/20200712174938_create_federails_activities.rb +11 -0
- data/db/migrate/20240731145400_change_actor_entity_rel_to_polymorphic.rb +11 -0
- data/lib/federails/configuration.rb +88 -0
- data/lib/federails/engine.rb +6 -0
- data/lib/federails/utils/host.rb +54 -0
- data/lib/federails/version.rb +1 -1
- data/lib/federails.rb +33 -3
- data/lib/fediverse/inbox.rb +71 -0
- data/lib/fediverse/notifier.rb +21 -0
- data/lib/fediverse/request.rb +38 -0
- data/lib/fediverse/webfinger.rb +93 -0
- data/lib/generators/federails/install/USAGE +9 -0
- data/lib/generators/federails/install/install_generator.rb +10 -0
- data/lib/generators/federails/install/templates/federails.rb +1 -0
- data/lib/generators/federails/install/templates/federails.yml +23 -0
- data/lib/tasks/factory_bot.rake +15 -0
- metadata +165 -10
- data/app/views/layouts/federails/application.html.erb +0 -15
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday/follow_redirects'
|
3
|
+
|
4
|
+
require 'federails/utils/host'
|
5
|
+
|
6
|
+
module Fediverse
|
7
|
+
class Webfinger
|
8
|
+
class << self
|
9
|
+
ACCOUNT_REGEX = /(?<username>[a-z0-9\-_.]+)(?:@(?<domain>.*))?/
|
10
|
+
|
11
|
+
def split_resource_account(account)
|
12
|
+
/\Aacct:#{ACCOUNT_REGEX}\z/io.match account
|
13
|
+
end
|
14
|
+
|
15
|
+
def split_account(account)
|
16
|
+
/\A#{ACCOUNT_REGEX}\z/io.match account
|
17
|
+
end
|
18
|
+
|
19
|
+
def local_user?(account)
|
20
|
+
account[:username] && (account[:domain].nil? || (account[:domain] == Federails::Utils::Host.localhost))
|
21
|
+
end
|
22
|
+
|
23
|
+
def fetch_actor(username, domain)
|
24
|
+
fetch_actor_url webfinger(username, domain)
|
25
|
+
end
|
26
|
+
|
27
|
+
def fetch_actor_url(url)
|
28
|
+
webfinger_to_actor get_json url
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns actor id
|
32
|
+
def webfinger(username, domain)
|
33
|
+
scheme = Federails.configuration.force_ssl ? 'https' : 'http'
|
34
|
+
json = get_json "#{scheme}://#{domain}/.well-known/webfinger", resource: "acct:#{username}@#{domain}"
|
35
|
+
link = json['links'].find { |l| l['type'] == 'application/activity+json' }
|
36
|
+
|
37
|
+
link['href'] if link
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def webfinger_to_actor(data)
|
43
|
+
uri = URI.parse data['id']
|
44
|
+
server = uri.host
|
45
|
+
server += ":#{uri.port}" if uri.port && [80, 443].exclude?(uri.port)
|
46
|
+
Federails::Actor.new federated_url: data['id'],
|
47
|
+
username: data['preferredUsername'],
|
48
|
+
name: data['name'],
|
49
|
+
server: server,
|
50
|
+
inbox_url: data['inbox'],
|
51
|
+
outbox_url: data['outbox'],
|
52
|
+
followers_url: data['followers'],
|
53
|
+
followings_url: data['following'],
|
54
|
+
profile_url: data['url']
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_json(url, payload = {})
|
58
|
+
response = get(url, payload: payload, headers: { accept: 'application/json' })
|
59
|
+
|
60
|
+
if response.status != 200
|
61
|
+
Rails.logger.debug { "Unhandled status code #{response.status} for GET #{url}" }
|
62
|
+
raise ActiveRecord::RecordNotFound
|
63
|
+
end
|
64
|
+
|
65
|
+
JSON.parse(response.body)
|
66
|
+
rescue JSON::ParserError
|
67
|
+
Rails.logger.debug { "Invalid JSON response GET #{url}" }
|
68
|
+
|
69
|
+
raise ActiveRecord::RecordNotFound
|
70
|
+
end
|
71
|
+
|
72
|
+
# Only perform a GET request and throws an ActiveRecord::RecordNotFound
|
73
|
+
# on error.
|
74
|
+
# That's "ok-ish"; when an actor is unavailable, whatever the reason is, it's
|
75
|
+
# not found...
|
76
|
+
def get(url, payload: {}, headers: {})
|
77
|
+
connection = Faraday.new url: url, params: payload, headers: headers do |faraday|
|
78
|
+
faraday.response :follow_redirects # use Faraday::FollowRedirects::Middleware
|
79
|
+
faraday.adapter Faraday.default_adapter
|
80
|
+
end
|
81
|
+
|
82
|
+
begin
|
83
|
+
response = connection.get
|
84
|
+
rescue Faraday::ConnectionFailed
|
85
|
+
Rails.logger.debug { "Failed to reach server for GET #{url}" }
|
86
|
+
raise ActiveRecord::RecordNotFound
|
87
|
+
end
|
88
|
+
|
89
|
+
response
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Federails
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
4
|
+
|
5
|
+
def copy_files
|
6
|
+
copy_file 'federails.yml', 'config/federails.yml'
|
7
|
+
copy_file 'federails.rb', 'config/initializers/federails.rb'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Federails.config_from 'federails'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
defaults: &defaults
|
3
|
+
app_name:
|
4
|
+
app_version:
|
5
|
+
force_ssl: false
|
6
|
+
site_host: http://localhost
|
7
|
+
site_port: 3000
|
8
|
+
enable_discovery: true
|
9
|
+
app_layout: 'layouts/application'
|
10
|
+
server_routes_path: federation
|
11
|
+
client_routes_path: app
|
12
|
+
|
13
|
+
development:
|
14
|
+
<<: *defaults
|
15
|
+
|
16
|
+
test:
|
17
|
+
<<: *defaults
|
18
|
+
site_port: null
|
19
|
+
|
20
|
+
production:
|
21
|
+
<<: *defaults
|
22
|
+
force_ssl: true
|
23
|
+
site_port: 443
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :factory_bot do
|
2
|
+
desc 'Verify that all FactoryBot factories are valid'
|
3
|
+
task lint: :environment do
|
4
|
+
if Rails.env.test?
|
5
|
+
conn = ActiveRecord::Base.connection
|
6
|
+
conn.transaction do
|
7
|
+
FactoryBot.lint traits: true
|
8
|
+
raise ActiveRecord::Rollback
|
9
|
+
end
|
10
|
+
else
|
11
|
+
system("bundle exec rake app:factory_bot:lint RAILS_ENV='test'")
|
12
|
+
raise if $CHILD_STATUS.exitstatus.nonzero?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: federails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Tancoigne
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday-follow_redirects
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json-ld
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.2.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json-ld-preloaded
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.2.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.2.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: kaminari
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.2.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pundit
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.3.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.3.0
|
13
97
|
- !ruby/object:Gem::Dependency
|
14
98
|
name: rails
|
15
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,7 +108,7 @@ dependencies:
|
|
24
108
|
- - ">="
|
25
109
|
- !ruby/object:Gem::Version
|
26
110
|
version: 7.0.4
|
27
|
-
description:
|
111
|
+
description: An ActivityPub engine for Ruby on Rails
|
28
112
|
email:
|
29
113
|
- manu@experimentslabs.com
|
30
114
|
executables: []
|
@@ -36,15 +120,84 @@ files:
|
|
36
120
|
- app/assets/config/federails_manifest.js
|
37
121
|
- app/assets/stylesheets/federails/application.css
|
38
122
|
- app/controllers/federails/application_controller.rb
|
123
|
+
- app/controllers/federails/client/activities_controller.rb
|
124
|
+
- app/controllers/federails/client/actors_controller.rb
|
125
|
+
- app/controllers/federails/client/followings_controller.rb
|
126
|
+
- app/controllers/federails/server/activities_controller.rb
|
127
|
+
- app/controllers/federails/server/actors_controller.rb
|
128
|
+
- app/controllers/federails/server/followings_controller.rb
|
129
|
+
- app/controllers/federails/server/nodeinfo_controller.rb
|
130
|
+
- app/controllers/federails/server/server_controller.rb
|
131
|
+
- app/controllers/federails/server/web_finger_controller.rb
|
39
132
|
- app/helpers/federails/application_helper.rb
|
40
133
|
- app/jobs/federails/application_job.rb
|
134
|
+
- app/jobs/federails/notify_inbox_job.rb
|
41
135
|
- app/mailers/federails/application_mailer.rb
|
136
|
+
- app/models/concerns/federails/entity.rb
|
137
|
+
- app/models/federails/activity.rb
|
138
|
+
- app/models/federails/actor.rb
|
42
139
|
- app/models/federails/application_record.rb
|
43
|
-
- app/
|
140
|
+
- app/models/federails/following.rb
|
141
|
+
- app/policies/federails/client/activity_policy.rb
|
142
|
+
- app/policies/federails/client/actor_policy.rb
|
143
|
+
- app/policies/federails/client/following_policy.rb
|
144
|
+
- app/policies/federails/federails_policy.rb
|
145
|
+
- app/policies/federails/server/activity_policy.rb
|
146
|
+
- app/policies/federails/server/actor_policy.rb
|
147
|
+
- app/policies/federails/server/following_policy.rb
|
148
|
+
- app/views/federails/client/activities/_activity.html.erb
|
149
|
+
- app/views/federails/client/activities/_activity.json.jbuilder
|
150
|
+
- app/views/federails/client/activities/_index.json.jbuilder
|
151
|
+
- app/views/federails/client/activities/feed.html.erb
|
152
|
+
- app/views/federails/client/activities/feed.json.jbuilder
|
153
|
+
- app/views/federails/client/activities/index.html.erb
|
154
|
+
- app/views/federails/client/activities/index.json.jbuilder
|
155
|
+
- app/views/federails/client/actors/_actor.json.jbuilder
|
156
|
+
- app/views/federails/client/actors/_lookup_form.html.erb
|
157
|
+
- app/views/federails/client/actors/index.html.erb
|
158
|
+
- app/views/federails/client/actors/index.json.jbuilder
|
159
|
+
- app/views/federails/client/actors/show.html.erb
|
160
|
+
- app/views/federails/client/actors/show.json.jbuilder
|
161
|
+
- app/views/federails/client/followings/_follow.html.erb
|
162
|
+
- app/views/federails/client/followings/_follower.html.erb
|
163
|
+
- app/views/federails/client/followings/_following.json.jbuilder
|
164
|
+
- app/views/federails/client/followings/_form.html.erb
|
165
|
+
- app/views/federails/client/followings/index.html.erb
|
166
|
+
- app/views/federails/client/followings/index.json.jbuilder
|
167
|
+
- app/views/federails/client/followings/show.html.erb
|
168
|
+
- app/views/federails/client/followings/show.json.jbuilder
|
169
|
+
- app/views/federails/server/activities/_activity.json.jbuilder
|
170
|
+
- app/views/federails/server/activities/outbox.json.jbuilder
|
171
|
+
- app/views/federails/server/activities/show.json.jbuilder
|
172
|
+
- app/views/federails/server/actors/_actor.json.jbuilder
|
173
|
+
- app/views/federails/server/actors/followers.json.jbuilder
|
174
|
+
- app/views/federails/server/actors/following.json.jbuilder
|
175
|
+
- app/views/federails/server/actors/show.json.jbuilder
|
176
|
+
- app/views/federails/server/followings/_following.json.jbuilder
|
177
|
+
- app/views/federails/server/followings/show.json.jbuilder
|
178
|
+
- app/views/federails/server/nodeinfo/index.json.jbuilder
|
179
|
+
- app/views/federails/server/nodeinfo/show.json.jbuilder
|
180
|
+
- app/views/federails/server/web_finger/find.json.jbuilder
|
181
|
+
- app/views/federails/server/web_finger/host_meta.xml.erb
|
44
182
|
- config/routes.rb
|
183
|
+
- db/migrate/20200712133150_create_federails_actors.rb
|
184
|
+
- db/migrate/20200712143127_create_federails_followings.rb
|
185
|
+
- db/migrate/20200712174938_create_federails_activities.rb
|
186
|
+
- db/migrate/20240731145400_change_actor_entity_rel_to_polymorphic.rb
|
45
187
|
- lib/federails.rb
|
188
|
+
- lib/federails/configuration.rb
|
46
189
|
- lib/federails/engine.rb
|
190
|
+
- lib/federails/utils/host.rb
|
47
191
|
- lib/federails/version.rb
|
192
|
+
- lib/fediverse/inbox.rb
|
193
|
+
- lib/fediverse/notifier.rb
|
194
|
+
- lib/fediverse/request.rb
|
195
|
+
- lib/fediverse/webfinger.rb
|
196
|
+
- lib/generators/federails/install/USAGE
|
197
|
+
- lib/generators/federails/install/install_generator.rb
|
198
|
+
- lib/generators/federails/install/templates/federails.rb
|
199
|
+
- lib/generators/federails/install/templates/federails.yml
|
200
|
+
- lib/tasks/factory_bot.rake
|
48
201
|
- lib/tasks/federails_tasks.rake
|
49
202
|
homepage: https://experimentslabs.com
|
50
203
|
licenses:
|
@@ -52,7 +205,9 @@ licenses:
|
|
52
205
|
metadata:
|
53
206
|
rubygems_mfa_required: 'true'
|
54
207
|
homepage_uri: https://experimentslabs.com
|
55
|
-
|
208
|
+
source_code_uri: https://gitlab.com/experimentslabs/federails/
|
209
|
+
changelog_uri: https://gitlab.com/experimentslabs/federails/-/blob/main/CHANGELOG.md
|
210
|
+
post_install_message:
|
56
211
|
rdoc_options: []
|
57
212
|
require_paths:
|
58
213
|
- lib
|
@@ -60,15 +215,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
60
215
|
requirements:
|
61
216
|
- - ">="
|
62
217
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
218
|
+
version: 3.1.2
|
64
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
220
|
requirements:
|
66
221
|
- - ">="
|
67
222
|
- !ruby/object:Gem::Version
|
68
223
|
version: '0'
|
69
224
|
requirements: []
|
70
|
-
rubygems_version: 3.4.
|
71
|
-
signing_key:
|
225
|
+
rubygems_version: 3.4.15
|
226
|
+
signing_key:
|
72
227
|
specification_version: 4
|
73
|
-
summary:
|
228
|
+
summary: An ActivityPub engine for Ruby on Rails
|
74
229
|
test_files: []
|