federails 0.2.0 → 0.3.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 +28 -2
- data/app/controllers/federails/client/activities_controller.rb +8 -2
- data/app/controllers/federails/client/actors_controller.rb +4 -1
- data/app/controllers/federails/client/followings_controller.rb +4 -2
- data/app/controllers/federails/client_controller.rb +9 -0
- data/app/controllers/federails/server/activities_controller.rb +6 -1
- data/app/controllers/federails/server/actors_controller.rb +5 -1
- data/app/controllers/federails/server/followings_controller.rb +1 -1
- data/app/controllers/federails/server/nodeinfo_controller.rb +11 -5
- data/app/controllers/federails/server/web_finger_controller.rb +5 -1
- data/app/controllers/federails/{application_controller.rb → server_controller.rb} +6 -3
- data/app/helpers/federails/{application_helper.rb → server_helper.rb} +1 -1
- data/app/models/concerns/federails/entity.rb +55 -14
- data/app/models/federails/actor.rb +3 -1
- data/app/policies/federails/client/activity_policy.rb +3 -0
- data/app/policies/federails/client/actor_policy.rb +1 -1
- data/app/policies/federails/client/following_policy.rb +2 -2
- data/app/policies/federails/federails_policy.rb +4 -0
- data/app/policies/federails/server/activity_policy.rb +3 -0
- data/app/views/federails/client/activities/_activity.html.erb +1 -1
- data/app/views/federails/client/activities/feed.html.erb +8 -1
- data/app/views/federails/client/activities/index.html.erb +1 -1
- data/app/views/federails/client/actors/index.html.erb +14 -0
- data/app/views/federails/client/actors/show.html.erb +101 -89
- data/app/views/federails/client/common/_client_links.html.erb +24 -0
- data/app/views/federails/client/followings/_follow_actions.html.erb +32 -0
- data/app/views/federails/client/followings/_form.html.erb +1 -0
- data/app/views/federails/server/actors/_actor.activitypub.jbuilder +7 -2
- data/app/views/federails/server/nodeinfo/show.nodeinfo.jbuilder +8 -7
- data/config/initializers/mime_types.rb +1 -1
- data/config/routes.rb +6 -2
- data/db/migrate/20200712133150_create_federails_actors.rb +3 -5
- data/lib/federails/configuration.rb +9 -30
- data/lib/federails/version.rb +1 -1
- data/lib/federails.rb +11 -4
- data/lib/fediverse/inbox.rb +33 -37
- data/lib/fediverse/notifier.rb +1 -1
- data/lib/generators/federails/copy_client_views/USAGE +8 -0
- data/lib/generators/federails/copy_client_views/copy_client_views_generator.rb +9 -0
- data/lib/generators/federails/install/install_generator.rb +2 -2
- data/lib/generators/federails/install/templates/federails.yml +2 -0
- metadata +10 -7
- data/app/controllers/federails/server/server_controller.rb +0 -17
- data/db/migrate/20240731145400_change_actor_entity_rel_to_polymorphic.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e489a0088b05ef80d9cc112164f054a030f0cb007406cb14789372a5a52c490f
|
4
|
+
data.tar.gz: b6832c622e5c33bf85f520839604a9e6e516821097d70bb6c6acb7df92f0d4b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59e24e51b83545daabfa7dc0c878183d8b0bc14276b559b529fb5ee48183739c49b1a1987eb4a5e8d0d795dcfbe6970d6a3478691f9a13cd12c399903df61695
|
7
|
+
data.tar.gz: 01f6e7bef60bd2d15e142b7b55fecf25dd76ab67571c994c3c8aae1eba23fbcc75d02fb03775131a070b3cc6c18021d33ce91bb8645e937d94c1425a0a7433a3
|
data/README.md
CHANGED
@@ -92,7 +92,7 @@ With `routes_path = 'federation'`, routes will be:
|
|
92
92
|
|
93
93
|
Some routes can be disabled in configuration if you don't want to expose particular features:
|
94
94
|
|
95
|
-
```
|
95
|
+
```rb
|
96
96
|
Federails.configure do |config|
|
97
97
|
# Disable routing for .well-known and nodeinfo
|
98
98
|
config.enable_discovery = false
|
@@ -107,7 +107,7 @@ end
|
|
107
107
|
By default, remote follow requests (where you press a follow button on another server and get redirected home to complete the follow)
|
108
108
|
will use the built-in client paths. If you're not using the client, or want to provide your own user interface, you can set the path like this, assuming that `new_follow_url` is a valid route in your app. A `uri` query parameter template will be automatically appended, you don't need to specify that.
|
109
109
|
|
110
|
-
```
|
110
|
+
```rb
|
111
111
|
Federails.configure do |config|
|
112
112
|
config.remote_follow_url_method = :new_follow_url
|
113
113
|
end
|
@@ -154,6 +154,32 @@ actor.following
|
|
154
154
|
#...
|
155
155
|
```
|
156
156
|
|
157
|
+
### Using the Federails client
|
158
|
+
|
159
|
+
Federails comes with a client, enabled by default, that provides basic views to display and interact with Federails data,
|
160
|
+
accessible on `/app` by default (changeable with the configuration option `client_routes_path`)
|
161
|
+
|
162
|
+
If it's a good starting point, it might be disabled once you made your own integration by setting `client_routes_path`
|
163
|
+
to a `nil` value.
|
164
|
+
|
165
|
+
If you want to override the client's views, copy them in your application:
|
166
|
+
|
167
|
+
```sh
|
168
|
+
rails generate federails:copy_client_views
|
169
|
+
```
|
170
|
+
|
171
|
+
## Common questions
|
172
|
+
|
173
|
+
- **I override the base controller and the links breaks in my layout**
|
174
|
+
|
175
|
+
Use `main_app.<url_helper>` for links to your application; `federails.<federails_url_helper>` for links to the Federails client.
|
176
|
+
- **I specified a custom layout and the links breaks in it**
|
177
|
+
|
178
|
+
Use `main_app.<url_helper>` for links to your application; `federails.<federails_url_helper>` for links to the Federails client.
|
179
|
+
- **I specified a custom layout and my helpers are not available**
|
180
|
+
|
181
|
+
You will have better results if you specify a `base_controller` from your application as Federails base controller is isolated from the main app and does not have access to its helpers.
|
182
|
+
|
157
183
|
## Contributing
|
158
184
|
|
159
185
|
Contributions are welcome, may it be issues, ideas, code or whatever you want to share. Please note:
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Federails
|
2
2
|
module Client
|
3
|
-
class ActivitiesController < Federails::
|
3
|
+
class ActivitiesController < Federails::ClientController
|
4
4
|
before_action :authenticate_user!, only: [:feed]
|
5
|
-
|
5
|
+
before_action :authorize_action!
|
6
6
|
|
7
7
|
# GET /app/activities
|
8
8
|
# GET /app/activities.json
|
@@ -16,6 +16,12 @@ module Federails
|
|
16
16
|
def feed
|
17
17
|
@activities = Activity.feed_for(current_user.actor)
|
18
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def authorize_action!
|
23
|
+
authorize(Federails::Activity, policy_class: Federails::Client::ActivityPolicy)
|
24
|
+
end
|
19
25
|
end
|
20
26
|
end
|
21
27
|
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
module Federails
|
2
2
|
module Client
|
3
|
-
class ActorsController < Federails::
|
3
|
+
class ActorsController < Federails::ClientController
|
4
4
|
before_action :set_actor, only: [:show]
|
5
5
|
|
6
6
|
# GET /app/actors
|
7
7
|
# GET /app/actors.json
|
8
8
|
def index
|
9
|
+
authorize Federails::Actor, policy_class: Federails::Client::ActorPolicy
|
10
|
+
|
9
11
|
@actors = policy_scope(Federails::Actor, policy_scope_class: Federails::Client::ActorPolicy::Scope).all
|
12
|
+
@actors = @actors.local if params[:local_only]
|
10
13
|
end
|
11
14
|
|
12
15
|
# GET /app/actors/1
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Federails
|
2
2
|
module Client
|
3
|
-
class FollowingsController < Federails::
|
3
|
+
class FollowingsController < Federails::ClientController
|
4
4
|
before_action :authenticate_user!
|
5
|
+
before_action :skip_authorization, only: [:new, :create]
|
5
6
|
before_action :set_following, only: [:accept, :destroy]
|
6
7
|
|
7
8
|
# GET /app/followings/new?uri={uri}
|
@@ -40,9 +41,10 @@ module Federails
|
|
40
41
|
# POST /app/followings/follow
|
41
42
|
# POST /app/followings/follow.json
|
42
43
|
def follow
|
44
|
+
authorize Federails::Following, policy_class: Federails::Client::FollowingPolicy
|
45
|
+
|
43
46
|
begin
|
44
47
|
@following = Following.new_from_account following_account_params, actor: current_user.actor
|
45
|
-
authorize @following, policy_class: Federails::Client::FollowingPolicy
|
46
48
|
rescue ::ActiveRecord::RecordNotFound
|
47
49
|
# Renders a 422 instead of a 404
|
48
50
|
respond_to do |format|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Federails
|
2
|
+
class ClientController < Federails.configuration.base_client_controller.constantize
|
3
|
+
include Pundit::Authorization
|
4
|
+
|
5
|
+
after_action :verify_authorized
|
6
|
+
|
7
|
+
layout Federails.configuration.app_layout if Federails.configuration.app_layout
|
8
|
+
end
|
9
|
+
end
|
@@ -2,12 +2,14 @@ require 'fediverse/inbox'
|
|
2
2
|
|
3
3
|
module Federails
|
4
4
|
module Server
|
5
|
-
class ActivitiesController < ServerController
|
5
|
+
class ActivitiesController < Federails::ServerController
|
6
6
|
before_action :set_activity, only: [:show]
|
7
7
|
|
8
8
|
# GET /federation/activities
|
9
9
|
# GET /federation/actors/1/outbox.json
|
10
10
|
def outbox
|
11
|
+
authorize Federails::Activity, policy_class: Federails::Server::ActivityPolicy
|
12
|
+
|
11
13
|
@actor = Actor.find_param(params[:actor_id])
|
12
14
|
@activities = policy_scope(Federails::Activity, policy_scope_class: Federails::Server::ActivityPolicy::Scope).where(actor: @actor).order(created_at: :desc)
|
13
15
|
@total_activities = @activities.count
|
@@ -19,6 +21,8 @@ module Federails
|
|
19
21
|
|
20
22
|
# POST /federation/actors/1/inbox
|
21
23
|
def create
|
24
|
+
skip_authorization
|
25
|
+
|
22
26
|
payload = payload_from_params
|
23
27
|
return head :unprocessable_entity unless payload
|
24
28
|
|
@@ -34,6 +38,7 @@ module Federails
|
|
34
38
|
# Use callbacks to share common setup or constraints between actions.
|
35
39
|
def set_activity
|
36
40
|
@activity = Actor.find_param(params[:actor_id]).activities.find_param(params[:id])
|
41
|
+
authorize @activity, policy_class: Federails::Server::ActivityPolicy
|
37
42
|
end
|
38
43
|
|
39
44
|
# Only allow a list of trusted parameters through.
|
@@ -1,17 +1,21 @@
|
|
1
1
|
module Federails
|
2
2
|
module Server
|
3
|
-
class ActorsController < ServerController
|
3
|
+
class ActorsController < Federails::ServerController
|
4
4
|
before_action :set_actor, only: [:show, :followers, :following]
|
5
5
|
|
6
6
|
# GET /federation/actors/1
|
7
7
|
# GET /federation/actors/1.json
|
8
8
|
def show; end
|
9
9
|
|
10
|
+
# GET /federation/actors/:id/followers
|
11
|
+
# GET /federation/actors/:id/followers.json
|
10
12
|
def followers
|
11
13
|
@actors = @actor.followers.order(created_at: :desc)
|
12
14
|
followings_queries
|
13
15
|
end
|
14
16
|
|
17
|
+
# GET /federation/actors/:id/followers
|
18
|
+
# GET /federation/actors/:id/followers.json
|
15
19
|
def following
|
16
20
|
@actors = @actor.follows.order(created_at: :desc)
|
17
21
|
followings_queries
|
@@ -1,19 +1,25 @@
|
|
1
1
|
module Federails
|
2
2
|
module Server
|
3
|
-
class NodeinfoController < ServerController
|
3
|
+
class NodeinfoController < Federails::ServerController
|
4
4
|
def index
|
5
|
+
skip_authorization
|
6
|
+
|
5
7
|
render formats: [:nodeinfo]
|
6
8
|
end
|
7
9
|
|
8
10
|
def show # rubocop:todo Metrics/AbcSize
|
11
|
+
skip_authorization
|
12
|
+
|
9
13
|
@total = @active_halfyear = @active_month = 0
|
14
|
+
@has_user_counts = false
|
10
15
|
Federails::Configuration.entity_types.each_value do |config|
|
11
|
-
next unless config[:
|
16
|
+
next unless (method = config[:user_count_method]&.to_sym)
|
12
17
|
|
18
|
+
@has_user_counts = true
|
13
19
|
model = config[:class]
|
14
|
-
@total += model.
|
15
|
-
@active_month += model.
|
16
|
-
@active_halfyear += model.
|
20
|
+
@total += model.send(method, nil)
|
21
|
+
@active_month += model.send(method, ((30.days.ago)...Time.current))
|
22
|
+
@active_halfyear += model.send(method, ((180.days.ago)...Time.current))
|
17
23
|
end
|
18
24
|
render formats: [:nodeinfo]
|
19
25
|
end
|
@@ -2,8 +2,10 @@ require 'fediverse/webfinger'
|
|
2
2
|
|
3
3
|
module Federails
|
4
4
|
module Server
|
5
|
-
class WebFingerController < ServerController
|
5
|
+
class WebFingerController < Federails::ServerController
|
6
6
|
def find
|
7
|
+
skip_authorization
|
8
|
+
|
7
9
|
resource = params.require(:resource)
|
8
10
|
case resource
|
9
11
|
when %r{^https?://.+}
|
@@ -19,6 +21,8 @@ module Federails
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def host_meta
|
24
|
+
skip_authorization
|
25
|
+
|
22
26
|
render formats: [:xrd]
|
23
27
|
end
|
24
28
|
|
@@ -1,10 +1,13 @@
|
|
1
1
|
module Federails
|
2
|
-
class
|
2
|
+
class ServerController < ::ActionController::Base # rubocop:disable Rails/ApplicationController
|
3
3
|
include Pundit::Authorization
|
4
4
|
|
5
|
-
|
5
|
+
after_action :verify_authorized
|
6
|
+
|
7
|
+
protect_from_forgery with: :null_session
|
8
|
+
helper Federails::ServerHelper
|
6
9
|
|
7
|
-
|
10
|
+
rescue_from ActiveRecord::RecordNotFound, with: :error_not_found
|
8
11
|
|
9
12
|
private
|
10
13
|
|
@@ -14,38 +14,79 @@ module Federails
|
|
14
14
|
set_callback :followed, :after, method
|
15
15
|
end
|
16
16
|
|
17
|
+
# Define a method that will be called after an activity has been received
|
18
|
+
# @param activity_type [String] The activity action to handle, e.g. 'Create'. If you specify '*', the handler will be called for any activity type.
|
19
|
+
# @param object_type [String] The object type to handle, e.g. 'Note'. If you specify '*', the handler will be called for any object type.
|
20
|
+
# @param method [Symbol] The name of the class method to call. The method will receive the complete activity payload as a parameter.
|
21
|
+
# @example
|
22
|
+
# after_activity_received 'Create', 'Note', :create_note
|
23
|
+
def self.after_activity_received(activity_type, object_type, method)
|
24
|
+
Fediverse::Inbox.register_handler(activity_type, object_type, self, method)
|
25
|
+
end
|
26
|
+
|
17
27
|
has_one :actor, class_name: 'Federails::Actor', as: :entity, dependent: :destroy
|
18
28
|
|
19
|
-
after_create :create_actor
|
29
|
+
after_create :create_actor, if: lambda {
|
30
|
+
raise("Entity not configured for #{self.class.name}. Did you use \"acts_as_federails_actor\"?") unless Federails::Configuration.entity_types.key? self.class.name
|
31
|
+
|
32
|
+
Federails::Configuration.entity_types[self.class.name][:auto_create_actors]
|
33
|
+
}
|
20
34
|
|
21
35
|
# Configures the mapping between entity and actor
|
22
36
|
# @param username_field [Symbol] The method or attribute name that returns the preferred username for ActivityPub
|
23
37
|
# @param name_field [Symbol] The method or attribute name that returns the preferred name for ActivityPub
|
24
38
|
# @param profile_url_method [Symbol] The route method name that will generate the profile URL for ActivityPub
|
25
39
|
# @param actor_type [String] The ActivityStreams Actor type for this entity; defaults to 'Person'
|
26
|
-
# @param
|
40
|
+
# @param user_count_method [Symbol] A class method to call to count active users. Leave unspecified to leave this
|
41
|
+
# entity out of user counts. Method signature should accept a single parameter which will specify a date range
|
42
|
+
# If parameter is nil, the total user count should be returned. If the parameter is specified, the number of users
|
43
|
+
# active during the time period should be returned.
|
44
|
+
# @param auto_create_actors [Boolean] Whether to automatically create an actor when the entity is created
|
27
45
|
# @example
|
28
46
|
# acts_as_federails_actor username_field: :username, name_field: :display_name, profile_url_method: :url_for, actor_type: 'Person'
|
47
|
+
# rubocop:disable Metrics/ParameterLists
|
29
48
|
def self.acts_as_federails_actor(
|
30
|
-
|
31
|
-
|
32
|
-
profile_url_method:
|
49
|
+
name_field:,
|
50
|
+
username_field:,
|
51
|
+
profile_url_method: nil,
|
33
52
|
actor_type: 'Person',
|
34
|
-
|
53
|
+
user_count_method: nil,
|
54
|
+
auto_create_actors: true
|
35
55
|
)
|
36
56
|
Federails::Configuration.register_entity(
|
37
57
|
self,
|
38
|
-
username_field:
|
39
|
-
name_field:
|
40
|
-
profile_url_method:
|
41
|
-
actor_type:
|
42
|
-
|
58
|
+
username_field: username_field,
|
59
|
+
name_field: name_field,
|
60
|
+
profile_url_method: profile_url_method,
|
61
|
+
actor_type: actor_type,
|
62
|
+
user_count_method: user_count_method,
|
63
|
+
auto_create_actors: auto_create_actors
|
43
64
|
)
|
44
65
|
end
|
66
|
+
# rubocop:enable Metrics/ParameterLists
|
45
67
|
|
46
|
-
#
|
47
|
-
#
|
48
|
-
|
68
|
+
# Add custom data to actor responses.
|
69
|
+
# Override in your own model to add extra data, which will be merged into the actor response
|
70
|
+
# generated by Federails. You can include extra `@context` for activitypub extensions and it will
|
71
|
+
# be merged with the main response context.
|
72
|
+
# @example
|
73
|
+
# def to_activitypub_object
|
74
|
+
# {
|
75
|
+
# "@context": {
|
76
|
+
# toot: "http://joinmastodon.org/ns#",
|
77
|
+
# attributionDomains: {
|
78
|
+
# "@id": "toot:attributionDomains",
|
79
|
+
# "@type": "@id"
|
80
|
+
# }
|
81
|
+
# },
|
82
|
+
# attributionDomains: [
|
83
|
+
# "example.com"
|
84
|
+
# ]
|
85
|
+
# }
|
86
|
+
# end
|
87
|
+
def to_activitypub_object
|
88
|
+
{}
|
89
|
+
end
|
49
90
|
|
50
91
|
private
|
51
92
|
|
@@ -91,7 +91,9 @@ module Federails
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def entity_configuration
|
94
|
-
Federails::Configuration.entity_types
|
94
|
+
raise("Entity not configured for #{entity_type}. Did you use \"acts_as_federails_actor\"?") unless Federails::Configuration.entity_types.key? entity_type
|
95
|
+
|
96
|
+
Federails::Configuration.entity_types[entity_type]
|
95
97
|
end
|
96
98
|
|
97
99
|
class << self
|
@@ -26,9 +26,9 @@ module Federails
|
|
26
26
|
private
|
27
27
|
|
28
28
|
def in_following?
|
29
|
-
return false
|
29
|
+
return false unless user_with_actor?
|
30
30
|
|
31
|
-
@record.actor_id == @user.actor
|
31
|
+
@record.actor_id == @user.actor&.id || @record.target_actor_id == @user.actor&.id
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -1,4 +1,11 @@
|
|
1
|
-
<h1>Your feed
|
1
|
+
<h1>Your feed</h1>
|
2
|
+
<p>
|
3
|
+
This is the list of activities from actors you follow.
|
4
|
+
</p>
|
5
|
+
|
6
|
+
<% if @activities.size.zero? %>
|
7
|
+
<p>There is nothing to display. Start following things!</p>
|
8
|
+
<% end %>
|
2
9
|
<% @activities.each do |activity| %>
|
3
10
|
<%= render 'activity', activity: activity %>
|
4
11
|
<% end %>
|
@@ -1,5 +1,14 @@
|
|
1
1
|
<h1>Listing actors</h1>
|
2
2
|
|
3
|
+
<section>
|
4
|
+
Filters:
|
5
|
+
<% if params[:local_only] %>
|
6
|
+
<%= link_to 'All actors', federails.client_actors_url %>
|
7
|
+
<% else %>
|
8
|
+
<%= link_to 'Only local actors', federails.client_actors_url(local_only: true) %>
|
9
|
+
<% end %>
|
10
|
+
</section>
|
11
|
+
|
3
12
|
<table>
|
4
13
|
<thead>
|
5
14
|
<tr>
|
@@ -11,6 +20,11 @@
|
|
11
20
|
</tr>
|
12
21
|
</thead>
|
13
22
|
<tbody>
|
23
|
+
<% if @actors.size.zero? %>
|
24
|
+
<tr>
|
25
|
+
<td colspan="5">There are no actors to display</td>
|
26
|
+
</tr>
|
27
|
+
<% end %>
|
14
28
|
<% @actors.each do |actor| %>
|
15
29
|
<tr>
|
16
30
|
<td><%= actor.name %></td>
|
@@ -1,100 +1,112 @@
|
|
1
|
-
<
|
1
|
+
<h1><%= @actor.name %></h1>
|
2
|
+
|
3
|
+
<section>
|
4
|
+
<%= render 'federails/client/followings/follow_actions', user: current_user, actor: @actor %>
|
5
|
+
</section>
|
6
|
+
|
7
|
+
<section>
|
8
|
+
<% if @actor.local? %>
|
9
|
+
<%= link_to 'All activities', federails.client_actor_activities_path(@actor) %>
|
10
|
+
<% elsif @actor.profile_url %>
|
11
|
+
<%= link_to 'Visit profile', @actor.profile_url %>
|
12
|
+
<% end %>
|
13
|
+
</section>
|
14
|
+
|
15
|
+
<section>
|
16
|
+
<h2>Actor details</h2>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
<b>Federated url:</b>
|
20
|
+
<%= @actor.federated_url %>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
<b>Username:</b>
|
25
|
+
<%= @actor.username %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
<p>
|
29
|
+
<b>Inbox URL:</b>
|
30
|
+
<%= @actor.inbox_url %>
|
31
|
+
</p>
|
32
|
+
|
33
|
+
<p>
|
34
|
+
<b>Outbox URL:</b>
|
35
|
+
<%= @actor.outbox_url %>
|
36
|
+
</p>
|
37
|
+
|
38
|
+
<p>
|
39
|
+
<b>Followers URL:</b>
|
40
|
+
<%= @actor.followers_url %>
|
41
|
+
</p>
|
42
|
+
|
43
|
+
<p>
|
44
|
+
<b>Followings URL:</b>
|
45
|
+
<%= @actor.followings_url %>
|
46
|
+
</p>
|
47
|
+
|
48
|
+
<p>
|
49
|
+
<b>Profile url:</b>
|
50
|
+
<% if @actor.profile_url %>
|
51
|
+
<%= link_to 'Profile', @actor.profile_url %>
|
52
|
+
<% end %>
|
53
|
+
</p>
|
2
54
|
|
3
|
-
<% if Federails::Client::FollowingPolicy.new(current_user, Federails::Following).create? %>
|
4
55
|
<p>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
<%
|
11
|
-
|
12
|
-
<%=
|
56
|
+
<b>Federation address:</b>
|
57
|
+
<%= @actor.at_address %>
|
58
|
+
</p>
|
59
|
+
|
60
|
+
<p>
|
61
|
+
<% if @actor.local? && @actor.entity_configuration[:profile_url_method] %>
|
62
|
+
<b>Home page:</b>
|
63
|
+
<%= link_to @actor.entity.send(@actor.entity_configuration[:username_field]),
|
64
|
+
Rails.application.routes.url_helpers.send(@actor.entity_configuration[:profile_url_method], @actor.entity)
|
65
|
+
%>
|
66
|
+
<% elsif @actor.profile_url %>
|
67
|
+
<b>Federation profile URL (JSON):</b>
|
68
|
+
<%= link_to @actor.name, @actor.profile_url %>
|
13
69
|
<% else %>
|
14
|
-
|
70
|
+
(No homepage)
|
15
71
|
<% end %>
|
16
72
|
</p>
|
17
|
-
|
18
|
-
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
</
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
<%= @actor.username %>
|
27
|
-
</p>
|
28
|
-
|
29
|
-
<p>
|
30
|
-
<b>Inbox URL:</b>
|
31
|
-
<%= @actor.inbox_url %>
|
32
|
-
</p>
|
33
|
-
|
34
|
-
<p>
|
35
|
-
<b>Outbox URL:</b>
|
36
|
-
<%= @actor.outbox_url %>
|
37
|
-
</p>
|
38
|
-
|
39
|
-
<p>
|
40
|
-
<b>Followers URL:</b>
|
41
|
-
<%= @actor.followers_url %>
|
42
|
-
</p>
|
43
|
-
|
44
|
-
<p>
|
45
|
-
<b>Followings URL:</b>
|
46
|
-
<%= @actor.followings_url %>
|
47
|
-
</p>
|
48
|
-
|
49
|
-
<p>
|
50
|
-
<b>Profile url:</b>
|
51
|
-
<% if @actor.profile_url %>
|
52
|
-
<%= link_to 'Profile', @actor.profile_url %>
|
73
|
+
</section>
|
74
|
+
|
75
|
+
<hr>
|
76
|
+
|
77
|
+
<section>
|
78
|
+
<h2>Follows <small>(<em>Who is followed?</em>)</small></h2>
|
79
|
+
|
80
|
+
<% if @actor.following_follows.size.zero? %>
|
81
|
+
<p><%= @actor.username %> follows nothing</p>
|
53
82
|
<% end %>
|
54
|
-
</p>
|
55
83
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
</
|
84
|
+
<% @actor.following_follows.each do |following| %>
|
85
|
+
<%= render 'federails/client/followings/follow', following: following %>
|
86
|
+
<% end %>
|
87
|
+
</section>
|
60
88
|
|
61
|
-
<
|
62
|
-
<
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
<%= link_to @actor.name, @actor.profile_url %>
|
67
|
-
<% else %>
|
68
|
-
(No homepage)
|
89
|
+
<section>
|
90
|
+
<h2>Followers <small>(<em>Who follows?</em>)</small></h2>
|
91
|
+
|
92
|
+
<% if @actor.following_followers.size.zero? %>
|
93
|
+
<p>Nothing follows <%= @actor.username %></p>
|
69
94
|
<% end %>
|
70
|
-
</p>
|
71
95
|
|
72
|
-
|
96
|
+
<% @actor.following_followers.each do |following| %>
|
97
|
+
<%= render 'federails/client/followings/follower', following: following %>
|
98
|
+
<% end %>
|
99
|
+
</section>
|
100
|
+
|
101
|
+
<section>
|
102
|
+
<%# FIXME: Fetch distant content somehow %>
|
103
|
+
<h2>10 last activities</h2>
|
73
104
|
|
74
|
-
|
75
|
-
<% if
|
76
|
-
|
77
|
-
<% end %>
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
<h2>Followers</h2>
|
84
|
-
<% @actor.following_followers.each do |following| %>
|
85
|
-
<%= render 'federails/client/followings/follower', following: following %>
|
86
|
-
<% end %>
|
87
|
-
|
88
|
-
<%= link_to 'Back', federails.client_actors_url %>
|
89
|
-
|
90
|
-
<!-- FIXME: Fetch distant content somehow -->
|
91
|
-
<h2>10 last activities</h2>
|
92
|
-
<% if @actor.local? %>
|
93
|
-
<%= link_to 'All', federails.client_actor_activities_path(@actor) %>
|
94
|
-
<% elsif @actor.profile_url %>
|
95
|
-
<%= link_to 'Visit profile', @actor.profile_url %>
|
96
|
-
<% end %>
|
97
|
-
|
98
|
-
<% @actor.activities.last(10).each do |activity| %>
|
99
|
-
<%= render 'federails/client/activities/activity', activity: activity %>
|
100
|
-
<% end %>
|
105
|
+
<% activities = @actor.activities.last(10) %>
|
106
|
+
<% if activities.size.zero? %>
|
107
|
+
<p>No activity to display</p>
|
108
|
+
<% end %>
|
109
|
+
<% activities.each do |activity| %>
|
110
|
+
<%= render 'federails/client/activities/activity', activity: activity %>
|
111
|
+
<% end %>
|
112
|
+
</section>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Federation:
|
2
|
+
|
3
|
+
<ul>
|
4
|
+
<%# Available publicly %>
|
5
|
+
<li><%= link_to 'Actors', federails.client_actors_url %></li>
|
6
|
+
<li><%= link_to 'Activities', federails.client_activities_url %></li>
|
7
|
+
|
8
|
+
<%# Available when user has an associated actor %>
|
9
|
+
<% if Federails::Client::ActivityPolicy.new(user, nil).feed? %>
|
10
|
+
<li><%= link_to 'Feed', federails.client_feed_url %></li>
|
11
|
+
<%end %>
|
12
|
+
|
13
|
+
<%# Available when user has an associated actor. The actor must exist to create the link %>
|
14
|
+
<% if Federails.actor_entity?(user) && user.actor.present? %>
|
15
|
+
<li><%= link_to "You (#{user.actor.username})", federails.client_actor_path(user.actor) %></li>
|
16
|
+
<% end %>
|
17
|
+
</ul>
|
18
|
+
|
19
|
+
<%# Debug information%>
|
20
|
+
<% if !Federails::actor_entity?(user) %>
|
21
|
+
<p><%= user.class.name %> is not configured to have an associated actor; you won't be allowed to follow or be followed</p>
|
22
|
+
<% elsif !user.actor.present? %>
|
23
|
+
<p>Your account does not have an associated actor; you won't be allowed to follow or be followed</p>
|
24
|
+
<% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<%#
|
2
|
+
Displays buttons to follow/revoke following on a given actor.
|
3
|
+
Requires variables:
|
4
|
+
- user (usually user)
|
5
|
+
- actor (target actor)
|
6
|
+
%>
|
7
|
+
<p>
|
8
|
+
<% if Federails::Client::FollowingPolicy.new(user, Federails::Following).create? %>
|
9
|
+
<% follow = user.actor.follows? actor %>
|
10
|
+
<% if actor.entity == user %>
|
11
|
+
<button type="button" role="button" disabled="disabled">That's you</button>
|
12
|
+
<% elsif follow %>
|
13
|
+
Already following (<%= follow.status %>)
|
14
|
+
<%= button_to 'Cancel', federails.client_following_path(follow), method: :delete %>
|
15
|
+
<% else %>
|
16
|
+
<%= button_to "Follow #{actor.username}", federails.follow_client_followings_path, params: { account: actor.at_address }, method: :post %>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<% followed = actor.follows? user.actor %>
|
20
|
+
<% if followed %>
|
21
|
+
<% if followed.pending? %>
|
22
|
+
<%= actor.username %> wants to follow you.
|
23
|
+
<%= button_to 'Accept request', federails.accept_client_following_path(followed), method: :put %>
|
24
|
+
<% else %>
|
25
|
+
<%= actor.username %> follows you.
|
26
|
+
<%= button_to 'Revoke', federails.client_following_path(followed), method: :delete %>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
<% else %>
|
30
|
+
<%= user.class.name %> is not configured to follow/be followed, or has no associated actor.
|
31
|
+
<% end %>
|
32
|
+
</p>
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
1
|
+
actor_data = actor.entity.to_activitypub_object
|
2
|
+
|
3
|
+
json.set! '@context', ([
|
2
4
|
'https://www.w3.org/ns/activitystreams',
|
3
5
|
'https://w3id.org/security/v1',
|
4
|
-
]
|
6
|
+
] + [
|
7
|
+
actor_data&.delete(:@context),
|
8
|
+
].flatten).compact
|
5
9
|
|
6
10
|
json.id actor.federated_url
|
7
11
|
json.name actor.name
|
@@ -19,3 +23,4 @@ if actor.public_key
|
|
19
23
|
json.publicKeyPem actor.public_key
|
20
24
|
end
|
21
25
|
end
|
26
|
+
json.merge! actor_data
|
@@ -9,11 +9,12 @@ json.protocols [
|
|
9
9
|
# http://nodeinfo.diaspora.software/ns/schema/2.0 for possible values
|
10
10
|
json.services inbound: [],
|
11
11
|
outbound: []
|
12
|
-
|
13
|
-
|
14
|
-
json.usage users: {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
}
|
12
|
+
json.openRegistrations Federails::Configuration.open_registrations
|
13
|
+
if @has_user_counts
|
14
|
+
json.usage users: {
|
15
|
+
total: @total,
|
16
|
+
activeMonth: @active_month,
|
17
|
+
activeHalfyear: @active_halfyear,
|
18
|
+
}
|
19
|
+
end
|
19
20
|
json.metadata({})
|
@@ -3,7 +3,7 @@ Mime::Type.register 'application/jrd+json', :jrd
|
|
3
3
|
Mime::Type.register 'application/xrd+xml', :xrd
|
4
4
|
|
5
5
|
# ActivityPub: https://www.w3.org/TR/activitypub/#retrieving-objects
|
6
|
-
Mime::Type.register 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', :activitypub, ['application/activity+json'
|
6
|
+
Mime::Type.register 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', :activitypub, ['application/activity+json']
|
7
7
|
|
8
8
|
# Nodeinfo: https://github.com/jhass/nodeinfo/blob/main/PROTOCOL.md#retrieval
|
9
9
|
Mime::Type.register 'application/json; profile="http://nodeinfo.diaspora.software/ns/schema/2.0#"', :nodeinfo
|
data/config/routes.rb
CHANGED
@@ -10,7 +10,11 @@ Federails::Engine.routes.draw do
|
|
10
10
|
|
11
11
|
if Federails.configuration.client_routes_path
|
12
12
|
scope Federails.configuration.client_routes_path, module: :client, as: :client do
|
13
|
-
resources :activities, only: [:index
|
13
|
+
resources :activities, only: [:index] do
|
14
|
+
collection do
|
15
|
+
get :feed, to: 'activities#feed'
|
16
|
+
end
|
17
|
+
end
|
14
18
|
resources :actors, only: [:index, :show] do
|
15
19
|
collection do
|
16
20
|
get :lookup, to: 'actors#lookup'
|
@@ -30,7 +34,7 @@ Federails::Engine.routes.draw do
|
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
|
-
scope Federails.configuration.server_routes_path, module: :server, as: :server do
|
37
|
+
scope Federails.configuration.server_routes_path, module: :server, as: :server, defaults: { format: :activitypub } do
|
34
38
|
resources :actors, only: [:show] do
|
35
39
|
member do
|
36
40
|
get :followers
|
@@ -11,14 +11,12 @@ class CreateFederailsActors < ActiveRecord::Migration[7.0]
|
|
11
11
|
t.string :followings_url
|
12
12
|
t.string :profile_url
|
13
13
|
|
14
|
-
t.
|
14
|
+
t.integer :entity_id, null: true
|
15
|
+
t.string :entity_type, null: true
|
15
16
|
|
16
17
|
t.timestamps
|
17
18
|
t.index :federated_url, unique: true
|
19
|
+
t.index [:entity_type, :entity_id], name: 'index_federails_actors_on_entity', unique: true
|
18
20
|
end
|
19
|
-
remove_foreign_key :federails_actors, :users if foreign_key_exists?(:federails_actors, :users)
|
20
|
-
remove_index :federails_actors, :user_id
|
21
|
-
add_index :federails_actors, :user_id, unique: true
|
22
|
-
add_foreign_key :federails_actors, :users
|
23
21
|
end
|
24
22
|
end
|
@@ -25,15 +25,14 @@ module Federails
|
|
25
25
|
mattr_accessor :enable_discovery
|
26
26
|
@@enable_discovery = true
|
27
27
|
|
28
|
-
#
|
28
|
+
# Does the site allow open registrations? (only used for nodeinfo reporting)
|
29
|
+
mattr_accessor :open_registrations
|
30
|
+
@@open_registrations = false
|
31
|
+
|
32
|
+
# Application layout
|
29
33
|
mattr_accessor :app_layout
|
30
34
|
@@app_layout = nil
|
31
35
|
|
32
|
-
# User class name
|
33
|
-
# @deprecated Kept for upgrade compatibility only
|
34
|
-
mattr_accessor :user_class
|
35
|
-
@@user_class = '::User'
|
36
|
-
|
37
36
|
# Route path for the federation URLs (to "Federails::Server::*" controllers)
|
38
37
|
mattr_accessor :server_routes_path
|
39
38
|
@@server_routes_path = :federation
|
@@ -42,34 +41,14 @@ module Federails
|
|
42
41
|
mattr_accessor :client_routes_path
|
43
42
|
@@client_routes_path = :app
|
44
43
|
|
44
|
+
# Default controller to use as base for client controllers
|
45
|
+
mattr_accessor :base_client_controller
|
46
|
+
@@base_client_controller = 'ActionController::Base'
|
47
|
+
|
45
48
|
# Route method for remote-following requests
|
46
49
|
mattr_accessor :remote_follow_url_method
|
47
50
|
@@remote_follow_url_method = 'federails.new_client_following_url'
|
48
51
|
|
49
|
-
# Method to use for links to user profiles
|
50
|
-
# @deprecated Set profile_url_method option on acts_as_federails_actor instead
|
51
|
-
mattr_accessor :user_profile_url_method
|
52
|
-
@@user_profile_url_method = nil
|
53
|
-
|
54
|
-
# Attribute in the user model to use as the user's name
|
55
|
-
# @deprecated Set name_field option on acts_as_federails_actor instead
|
56
|
-
#
|
57
|
-
# It only have sense if you have a separate username attribute
|
58
|
-
mattr_accessor :user_name_field
|
59
|
-
@@user_name_field = nil
|
60
|
-
|
61
|
-
# Attribute in the user model to use as the username for local actors
|
62
|
-
# @deprecated Set username_field option on acts_as_federails_actor instead
|
63
|
-
mattr_accessor :user_username_field
|
64
|
-
@@user_username_field = :id
|
65
|
-
|
66
|
-
##
|
67
|
-
# @return [String] Table used for user model
|
68
|
-
# @deprecated Kept for upgrade compatibility only
|
69
|
-
def self.user_table
|
70
|
-
@@user_class&.constantize&.table_name
|
71
|
-
end
|
72
|
-
|
73
52
|
def self.site_host=(value)
|
74
53
|
@@site_host = value
|
75
54
|
Federails::Engine.routes.default_url_options[:host] = value
|
data/lib/federails/version.rb
CHANGED
data/lib/federails.rb
CHANGED
@@ -23,15 +23,22 @@ module Federails
|
|
23
23
|
:site_host,
|
24
24
|
:site_port,
|
25
25
|
:enable_discovery,
|
26
|
+
:open_registrations,
|
26
27
|
:app_layout,
|
27
|
-
:user_class, # @deprecated
|
28
28
|
:server_routes_path,
|
29
29
|
:client_routes_path,
|
30
30
|
:remote_follow_url_method,
|
31
|
-
:
|
32
|
-
:user_name_field, # @deprecated
|
33
|
-
:user_username_field, # @deprecated
|
31
|
+
:base_client_controller,
|
34
32
|
].each { |key| Configuration.send :"#{key}=", config[key] if config.key?(key) }
|
35
33
|
end
|
34
|
+
|
35
|
+
# @return [Boolean] True if the given model is a possible entity
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# puts "Follow #{some_actor.name}" if actor_entity? current_user
|
39
|
+
def self.actor_entity?(class_or_instance)
|
40
|
+
klass = class_or_instance.is_a?(Class) ? class_or_instance.name : class_or_instance.class.name
|
41
|
+
Configuration.entity_types.key? klass
|
42
|
+
end
|
36
43
|
end
|
37
44
|
# rubocop:enable Style/ClassVars
|
data/lib/fediverse/inbox.rb
CHANGED
@@ -2,34 +2,33 @@ require 'fediverse/request'
|
|
2
2
|
|
3
3
|
module Fediverse
|
4
4
|
class Inbox
|
5
|
+
@@handlers = {} # rubocop:todo Style/ClassVars
|
5
6
|
class << self
|
7
|
+
def register_handler(activity_type, object_type, klass, method)
|
8
|
+
@@handlers[activity_type] ||= {}
|
9
|
+
@@handlers[activity_type][object_type] ||= {}
|
10
|
+
@@handlers[activity_type][object_type][klass] = method
|
11
|
+
end
|
12
|
+
|
6
13
|
def dispatch_request(payload)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
when 'Follow'
|
11
|
-
handle_create_follow_request payload
|
12
|
-
when 'Accept'
|
13
|
-
handle_accept_request payload
|
14
|
-
when 'Undo'
|
15
|
-
handle_undo_request payload
|
16
|
-
else
|
17
|
-
# FIXME: Fails silently
|
18
|
-
# raise NotImplementedError
|
19
|
-
Rails.logger.debug { "Unhandled activity type: #{payload['type']}" }
|
14
|
+
handlers = get_handlers(payload['type'], payload['object'].is_a?(Hash) ? payload.dig('object', 'type') : nil)
|
15
|
+
handlers.each_pair do |klass, method|
|
16
|
+
klass.send method, payload
|
20
17
|
end
|
18
|
+
return unless handlers.empty?
|
19
|
+
|
20
|
+
# FIXME: Fails silently
|
21
|
+
# raise NotImplementedError
|
22
|
+
Rails.logger.debug { "Unhandled activity type: #{payload['type']}" }
|
21
23
|
end
|
22
24
|
|
23
25
|
private
|
24
26
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
when 'Note'
|
31
|
-
handle_create_note activity
|
32
|
-
end
|
27
|
+
def get_handlers(activity_type, object_type)
|
28
|
+
{}.merge(@@handlers.dig(activity_type, object_type) || {})
|
29
|
+
.merge(@@handlers.dig(activity_type, '*') || {})
|
30
|
+
.merge(@@handlers.dig('*', '*') || {})
|
31
|
+
.merge(@@handlers.dig('*', object_type) || {})
|
33
32
|
end
|
34
33
|
|
35
34
|
def handle_create_follow_request(activity)
|
@@ -39,33 +38,30 @@ module Fediverse
|
|
39
38
|
Federails::Following.create! actor: actor, target_actor: target_actor, federated_url: activity['id']
|
40
39
|
end
|
41
40
|
|
42
|
-
def
|
43
|
-
|
44
|
-
Note.create! actor: actor, content: activity['content'], federated_url: activity['id']
|
45
|
-
end
|
41
|
+
def handle_accept_request(activity)
|
42
|
+
original_activity = Request.get(activity['object'])
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
raise
|
50
|
-
|
51
|
-
actor = Federails::Actor.find_or_create_by_object activity['actor']
|
52
|
-
target_actor = Federails::Actor.find_or_create_by_object activity['object']
|
53
|
-
raise 'Follow not accepted by target actor but by someone else' if payload['actor'] != target_actor.federated_url
|
44
|
+
actor = Federails::Actor.find_or_create_by_object original_activity['actor']
|
45
|
+
target_actor = Federails::Actor.find_or_create_by_object original_activity['object']
|
46
|
+
raise 'Follow not accepted by target actor but by someone else' if activity['actor'] != target_actor.federated_url
|
54
47
|
|
55
48
|
follow = Federails::Following.find_by actor: actor, target_actor: target_actor
|
56
49
|
follow.accept!
|
57
50
|
end
|
58
51
|
|
59
|
-
def handle_undo_request(
|
60
|
-
|
61
|
-
raise "Can't undo things that are not Follow" unless activity['type'] == 'Follow'
|
52
|
+
def handle_undo_request(activity)
|
53
|
+
original_activity = activity['object']
|
62
54
|
|
63
|
-
actor = Federails::Actor.find_or_create_by_object
|
64
|
-
target_actor = Federails::Actor.find_or_create_by_object
|
55
|
+
actor = Federails::Actor.find_or_create_by_object original_activity['actor']
|
56
|
+
target_actor = Federails::Actor.find_or_create_by_object original_activity['object']
|
65
57
|
|
66
58
|
follow = Federails::Following.find_by actor: actor, target_actor: target_actor
|
67
59
|
follow&.destroy
|
68
60
|
end
|
69
61
|
end
|
62
|
+
|
63
|
+
register_handler 'Follow', '*', self, :handle_create_follow_request
|
64
|
+
register_handler 'Accept', 'Follow', self, :handle_accept_request
|
65
|
+
register_handler 'Undo', 'Follow', self, :handle_undo_request
|
70
66
|
end
|
71
67
|
end
|
data/lib/fediverse/notifier.rb
CHANGED
@@ -17,7 +17,7 @@ module Fediverse
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def payload(activity)
|
20
|
-
Federails::
|
20
|
+
Federails::ServerController.renderer.new.render(
|
21
21
|
template: 'federails/server/activities/show',
|
22
22
|
assigns: { activity: activity },
|
23
23
|
format: :json
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Federails
|
2
|
+
class CopyClientViewsGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../../../../app/views', __dir__)
|
4
|
+
|
5
|
+
def copy_views
|
6
|
+
directory 'federails/client', Rails.root.join('app', 'views', 'federails', 'client')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -3,8 +3,8 @@ module Federails
|
|
3
3
|
source_root File.expand_path('templates', __dir__)
|
4
4
|
|
5
5
|
def copy_files
|
6
|
-
copy_file 'federails.yml', 'config
|
7
|
-
copy_file 'federails.rb', 'config
|
6
|
+
copy_file 'federails.yml', Rails.root.join('config', 'federails.yml')
|
7
|
+
copy_file 'federails.rb', Rails.root.join('config', 'initializers', 'federails.rb')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -6,9 +6,11 @@ defaults: &defaults
|
|
6
6
|
site_host: http://localhost
|
7
7
|
site_port: 3000
|
8
8
|
enable_discovery: true
|
9
|
+
open_registrations: false
|
9
10
|
app_layout: 'layouts/application'
|
10
11
|
server_routes_path: federation
|
11
12
|
client_routes_path: app
|
13
|
+
#base_client_controller: ::ActionController::Base
|
12
14
|
|
13
15
|
development:
|
14
16
|
<<: *defaults
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: federails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Tancoigne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -119,17 +119,17 @@ files:
|
|
119
119
|
- Rakefile
|
120
120
|
- app/assets/config/federails_manifest.js
|
121
121
|
- app/assets/stylesheets/federails/application.css
|
122
|
-
- app/controllers/federails/application_controller.rb
|
123
122
|
- app/controllers/federails/client/activities_controller.rb
|
124
123
|
- app/controllers/federails/client/actors_controller.rb
|
125
124
|
- app/controllers/federails/client/followings_controller.rb
|
125
|
+
- app/controllers/federails/client_controller.rb
|
126
126
|
- app/controllers/federails/server/activities_controller.rb
|
127
127
|
- app/controllers/federails/server/actors_controller.rb
|
128
128
|
- app/controllers/federails/server/followings_controller.rb
|
129
129
|
- app/controllers/federails/server/nodeinfo_controller.rb
|
130
|
-
- app/controllers/federails/server/server_controller.rb
|
131
130
|
- app/controllers/federails/server/web_finger_controller.rb
|
132
|
-
- app/
|
131
|
+
- app/controllers/federails/server_controller.rb
|
132
|
+
- app/helpers/federails/server_helper.rb
|
133
133
|
- app/jobs/federails/application_job.rb
|
134
134
|
- app/jobs/federails/notify_inbox_job.rb
|
135
135
|
- app/mailers/federails/application_mailer.rb
|
@@ -159,7 +159,9 @@ files:
|
|
159
159
|
- app/views/federails/client/actors/index.json.jbuilder
|
160
160
|
- app/views/federails/client/actors/show.html.erb
|
161
161
|
- app/views/federails/client/actors/show.json.jbuilder
|
162
|
+
- app/views/federails/client/common/_client_links.html.erb
|
162
163
|
- app/views/federails/client/followings/_follow.html.erb
|
164
|
+
- app/views/federails/client/followings/_follow_actions.html.erb
|
163
165
|
- app/views/federails/client/followings/_follower.html.erb
|
164
166
|
- app/views/federails/client/followings/_following.json.jbuilder
|
165
167
|
- app/views/federails/client/followings/_form.html.erb
|
@@ -185,7 +187,6 @@ files:
|
|
185
187
|
- db/migrate/20200712133150_create_federails_actors.rb
|
186
188
|
- db/migrate/20200712143127_create_federails_followings.rb
|
187
189
|
- db/migrate/20200712174938_create_federails_activities.rb
|
188
|
-
- db/migrate/20240731145400_change_actor_entity_rel_to_polymorphic.rb
|
189
190
|
- db/migrate/20241002094500_add_uuids.rb
|
190
191
|
- db/migrate/20241002094501_add_keypair_to_actors.rb
|
191
192
|
- lib/federails.rb
|
@@ -198,6 +199,8 @@ files:
|
|
198
199
|
- lib/fediverse/request.rb
|
199
200
|
- lib/fediverse/signature.rb
|
200
201
|
- lib/fediverse/webfinger.rb
|
202
|
+
- lib/generators/federails/copy_client_views/USAGE
|
203
|
+
- lib/generators/federails/copy_client_views/copy_client_views_generator.rb
|
201
204
|
- lib/generators/federails/install/USAGE
|
202
205
|
- lib/generators/federails/install/install_generator.rb
|
203
206
|
- lib/generators/federails/install/templates/federails.rb
|
@@ -227,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
230
|
- !ruby/object:Gem::Version
|
228
231
|
version: '0'
|
229
232
|
requirements: []
|
230
|
-
rubygems_version: 3.
|
233
|
+
rubygems_version: 3.3.7
|
231
234
|
signing_key:
|
232
235
|
specification_version: 4
|
233
236
|
summary: An ActivityPub engine for Ruby on Rails
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Federails
|
2
|
-
module Server
|
3
|
-
class ServerController < Federails::ApplicationController
|
4
|
-
protect_from_forgery with: :null_session
|
5
|
-
|
6
|
-
# def policy_scope(scope, policy_scope_class: nil)
|
7
|
-
# scope = [scope, :server] unless policy_scope_class
|
8
|
-
# super(scope, policy_scope_class: policy_scope_class)
|
9
|
-
# end
|
10
|
-
|
11
|
-
# def authorize(record, query = nil, policy_class: nil)
|
12
|
-
# record = [:server, record] unless policy_class
|
13
|
-
# super(record, query, policy_class: policy_class)
|
14
|
-
# end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class ChangeActorEntityRelToPolymorphic < ActiveRecord::Migration[7.0]
|
2
|
-
def change
|
3
|
-
remove_foreign_key :federails_actors, column: :user_id, to_table: Federails::Configuration.user_table
|
4
|
-
remove_index :federails_actors, :user_id, unique: true
|
5
|
-
change_table :federails_actors do |t|
|
6
|
-
t.rename :user_id, :entity_id
|
7
|
-
t.string :entity_type, null: true, default: Federails::Configuration.user_class&.demodulize
|
8
|
-
t.index [:entity_type, :entity_id], name: 'index_federails_actors_on_entity', unique: true
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|