diaspora_federation 0.2.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +25 -0
  3. data/lib/diaspora_federation/callbacks.rb +2 -0
  4. data/lib/diaspora_federation/discovery/discovery.rb +13 -22
  5. data/lib/diaspora_federation/discovery/exceptions.rb +2 -0
  6. data/lib/diaspora_federation/discovery/h_card.rb +3 -12
  7. data/lib/diaspora_federation/discovery/web_finger.rb +33 -36
  8. data/lib/diaspora_federation/discovery/xrd_document.rb +14 -15
  9. data/lib/diaspora_federation/discovery.rb +2 -1
  10. data/lib/diaspora_federation/entities/account_deletion.rb +3 -1
  11. data/lib/diaspora_federation/entities/account_migration/signable.rb +2 -0
  12. data/lib/diaspora_federation/entities/account_migration.rb +5 -1
  13. data/lib/diaspora_federation/entities/comment.rb +3 -1
  14. data/lib/diaspora_federation/entities/contact.rb +2 -0
  15. data/lib/diaspora_federation/entities/conversation.rb +4 -2
  16. data/lib/diaspora_federation/entities/embed.rb +2 -0
  17. data/lib/diaspora_federation/entities/event.rb +2 -0
  18. data/lib/diaspora_federation/entities/event_participation.rb +3 -1
  19. data/lib/diaspora_federation/entities/like.rb +3 -1
  20. data/lib/diaspora_federation/entities/location.rb +2 -0
  21. data/lib/diaspora_federation/entities/message.rb +3 -1
  22. data/lib/diaspora_federation/entities/participation.rb +5 -3
  23. data/lib/diaspora_federation/entities/person.rb +3 -1
  24. data/lib/diaspora_federation/entities/photo.rb +3 -1
  25. data/lib/diaspora_federation/entities/poll.rb +2 -0
  26. data/lib/diaspora_federation/entities/poll_answer.rb +2 -0
  27. data/lib/diaspora_federation/entities/poll_participation.rb +3 -1
  28. data/lib/diaspora_federation/entities/post.rb +3 -1
  29. data/lib/diaspora_federation/entities/profile.rb +3 -1
  30. data/lib/diaspora_federation/entities/related_entity.rb +3 -1
  31. data/lib/diaspora_federation/entities/relayable.rb +18 -31
  32. data/lib/diaspora_federation/entities/reshare.rb +4 -2
  33. data/lib/diaspora_federation/entities/retraction.rb +6 -4
  34. data/lib/diaspora_federation/entities/signable.rb +3 -1
  35. data/lib/diaspora_federation/entities/status_message.rb +3 -1
  36. data/lib/diaspora_federation/entities.rb +2 -5
  37. data/lib/diaspora_federation/entity.rb +15 -11
  38. data/lib/diaspora_federation/federation/diaspora_url_parser.rb +4 -1
  39. data/lib/diaspora_federation/federation/fetcher.rb +3 -0
  40. data/lib/diaspora_federation/federation/receiver/abstract_receiver.rb +2 -0
  41. data/lib/diaspora_federation/federation/receiver/exceptions.rb +2 -0
  42. data/lib/diaspora_federation/federation/receiver/private.rb +3 -0
  43. data/lib/diaspora_federation/federation/receiver/public.rb +2 -0
  44. data/lib/diaspora_federation/federation/receiver.rb +9 -16
  45. data/lib/diaspora_federation/federation/sender/hydra_wrapper.rb +2 -0
  46. data/lib/diaspora_federation/federation/sender.rb +3 -1
  47. data/lib/diaspora_federation/federation.rb +2 -0
  48. data/lib/diaspora_federation/http_client.rb +5 -2
  49. data/lib/diaspora_federation/logging.rb +8 -6
  50. data/lib/diaspora_federation/parsers/base_parser.rb +4 -0
  51. data/lib/diaspora_federation/parsers/json_parser.rb +9 -6
  52. data/lib/diaspora_federation/parsers/relayable_json_parser.rb +3 -0
  53. data/lib/diaspora_federation/parsers/relayable_xml_parser.rb +2 -0
  54. data/lib/diaspora_federation/parsers/xml_parser.rb +20 -8
  55. data/lib/diaspora_federation/parsers.rb +2 -0
  56. data/lib/diaspora_federation/properties_dsl.rb +8 -41
  57. data/lib/diaspora_federation/salmon/aes.rb +5 -3
  58. data/lib/diaspora_federation/salmon/encrypted_magic_envelope.rb +4 -2
  59. data/lib/diaspora_federation/salmon/exceptions.rb +2 -20
  60. data/lib/diaspora_federation/salmon/magic_envelope.rb +13 -10
  61. data/lib/diaspora_federation/salmon.rb +3 -4
  62. data/lib/diaspora_federation/validators/account_deletion_validator.rb +2 -0
  63. data/lib/diaspora_federation/validators/account_migration_validator.rb +2 -0
  64. data/lib/diaspora_federation/validators/comment_validator.rb +2 -0
  65. data/lib/diaspora_federation/validators/contact_validator.rb +2 -0
  66. data/lib/diaspora_federation/validators/conversation_validator.rb +2 -0
  67. data/lib/diaspora_federation/validators/embed_validator.rb +2 -0
  68. data/lib/diaspora_federation/validators/event_participation_validator.rb +2 -0
  69. data/lib/diaspora_federation/validators/event_validator.rb +2 -0
  70. data/lib/diaspora_federation/validators/h_card_validator.rb +2 -0
  71. data/lib/diaspora_federation/validators/like_validator.rb +2 -0
  72. data/lib/diaspora_federation/validators/location_validator.rb +2 -0
  73. data/lib/diaspora_federation/validators/message_validator.rb +2 -0
  74. data/lib/diaspora_federation/validators/optional_aware_validator.rb +3 -0
  75. data/lib/diaspora_federation/validators/participation_validator.rb +2 -0
  76. data/lib/diaspora_federation/validators/person_validator.rb +2 -0
  77. data/lib/diaspora_federation/validators/photo_validator.rb +2 -0
  78. data/lib/diaspora_federation/validators/poll_answer_validator.rb +2 -0
  79. data/lib/diaspora_federation/validators/poll_participation_validator.rb +2 -0
  80. data/lib/diaspora_federation/validators/poll_validator.rb +2 -0
  81. data/lib/diaspora_federation/validators/profile_validator.rb +2 -0
  82. data/lib/diaspora_federation/validators/related_entity_validator.rb +2 -0
  83. data/lib/diaspora_federation/validators/relayable_validator.rb +2 -0
  84. data/lib/diaspora_federation/validators/reshare_validator.rb +2 -0
  85. data/lib/diaspora_federation/validators/retraction_validator.rb +2 -0
  86. data/lib/diaspora_federation/validators/rules/birthday.rb +3 -1
  87. data/lib/diaspora_federation/validators/rules/boolean.rb +6 -5
  88. data/lib/diaspora_federation/validators/rules/diaspora_id.rb +3 -1
  89. data/lib/diaspora_federation/validators/rules/diaspora_id_list.rb +3 -0
  90. data/lib/diaspora_federation/validators/rules/guid.rb +3 -1
  91. data/lib/diaspora_federation/validators/rules/not_nil.rb +2 -0
  92. data/lib/diaspora_federation/validators/rules/public_key.rb +2 -0
  93. data/lib/diaspora_federation/validators/rules/tag_count.rb +2 -0
  94. data/lib/diaspora_federation/validators/status_message_validator.rb +2 -0
  95. data/lib/diaspora_federation/validators/web_finger_validator.rb +2 -0
  96. data/lib/diaspora_federation/validators.rb +2 -0
  97. data/lib/diaspora_federation/version.rb +3 -1
  98. data/lib/diaspora_federation.rb +3 -2
  99. metadata +16 -28
  100. data/lib/diaspora_federation/discovery/host_meta.rb +0 -90
  101. data/lib/diaspora_federation/entities/relayable_retraction.rb +0 -66
  102. data/lib/diaspora_federation/entities/request.rb +0 -31
  103. data/lib/diaspora_federation/entities/signed_retraction.rb +0 -43
  104. data/lib/diaspora_federation/salmon/encrypted_slap.rb +0 -109
  105. data/lib/diaspora_federation/salmon/slap.rb +0 -55
  106. data/lib/diaspora_federation/salmon/xml_payload.rb +0 -41
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents a poll and it is federated as an optional part of a status message.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents a poll answer and is federated as a part of the Poll entity.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents a participation in poll, i.e. it is issued when a user votes for an answer in a poll.
@@ -5,7 +7,7 @@ module DiasporaFederation
5
7
  # @see Validators::PollParticipationValidator
6
8
  class PollParticipation < Entity
7
9
  # The {PollParticipation} parent is a {Poll}
8
- PARENT_TYPE = "Poll".freeze
10
+ PARENT_TYPE = "Poll"
9
11
 
10
12
  include Relayable
11
13
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This is a module that defines common properties for a post which
@@ -30,7 +32,7 @@ module DiasporaFederation
30
32
  # @param [Entity] entity the entity in which it is included
31
33
  def self.included(entity)
32
34
  entity.class_eval do
33
- property :author, :string, xml_name: :diaspora_handle
35
+ property :author, :string
34
36
  property :guid, :string
35
37
  property :created_at, :timestamp, default: -> { Time.now.utc }
36
38
  property :public, :boolean, default: false
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity contains all the profile data of a person.
@@ -12,7 +14,7 @@ module DiasporaFederation
12
14
  # Alias for author
13
15
  # @see Profile#author
14
16
  # @return [String] diaspora* ID
15
- property :author, :string, alias: :diaspora_id, xml_name: :diaspora_handle
17
+ property :author, :string, alias: :diaspora_id
16
18
 
17
19
  # @!attribute [r] edited_at
18
20
  # The timestamp when the profile was edited
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # Entity meta informations for a related entity (parent or target of
@@ -50,7 +52,7 @@ module DiasporaFederation
50
52
  end
51
53
 
52
54
  # never add {RelatedEntity} to json
53
- def to_json
55
+ def to_json(*_args)
54
56
  nil
55
57
  end
56
58
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This is a module that defines common properties for relayable entities
@@ -33,12 +35,6 @@ module DiasporaFederation
33
35
  # a target pod.
34
36
  # @return [String] author signature
35
37
  #
36
- # @!attribute [r] parent_author_signature
37
- # Contains a signature of the entity using the private key of the author of a parent post.
38
- # @deprecated This signature isn't required anymore, because we can check the signature from
39
- # the parent author in the MagicEnvelope.
40
- # @return [String] parent author signature
41
- #
42
38
  # @!attribute [r] parent
43
39
  # Meta information about the parent object
44
40
  # @return [RelatedEntity] parent entity
@@ -46,11 +42,10 @@ module DiasporaFederation
46
42
  # @param [Entity] klass the entity in which it is included
47
43
  def self.included(klass)
48
44
  klass.class_eval do
49
- property :author, :string, xml_name: :diaspora_handle
45
+ property :author, :string
50
46
  property :guid, :string
51
47
  property :parent_guid, :string
52
48
  property :author_signature, :string, default: nil
53
- property :parent_author_signature, :string, default: nil
54
49
  entity :parent, Entities::RelatedEntity
55
50
  end
56
51
 
@@ -65,7 +60,7 @@ module DiasporaFederation
65
60
  # @see DiasporaFederation::Entity#initialize
66
61
  def initialize(data, signature_order=nil, additional_data={})
67
62
  self.signature_order = signature_order if signature_order
68
- @additional_data = additional_data
63
+ self.additional_data = additional_data
69
64
 
70
65
  super(data)
71
66
  end
@@ -88,7 +83,7 @@ module DiasporaFederation
88
83
  "#{super}#{":#{parent_type}" if respond_to?(:parent_type)}:#{parent_guid}"
89
84
  end
90
85
 
91
- def to_json
86
+ def to_json(*_args)
92
87
  super.merge!(property_order: signature_order).tap {|json_hash|
93
88
  missing_properties = json_hash[:property_order] - json_hash[:entity_data].keys
94
89
  missing_properties.each {|property|
@@ -100,9 +95,9 @@ module DiasporaFederation
100
95
  # The order for signing
101
96
  # @return [Array]
102
97
  def signature_order
103
- @signature_order || self.class.class_props.keys.reject {|key|
98
+ @signature_order || (self.class.class_props.keys.reject {|key|
104
99
  self.class.optional_props.include?(key) && public_send(key).nil?
105
- } - %i[author_signature parent_author_signature parent]
100
+ } - %i[author_signature parent])
106
101
  end
107
102
 
108
103
  private
@@ -113,19 +108,9 @@ module DiasporaFederation
113
108
  def sign_with_author
114
109
  privkey = DiasporaFederation.callbacks.trigger(:fetch_private_key, author)
115
110
  raise AuthorPrivateKeyNotFound, "author=#{author} obj=#{self}" if privkey.nil?
116
- sign_with_key(privkey).tap do
117
- logger.info "event=sign status=complete signature=author_signature author=#{author} obj=#{self}"
118
- end
119
- end
120
-
121
- # Sign with parent author key, if the parent author is local (if the private key is found)
122
- # @return [String] A Base64 encoded signature of #signature_data with key
123
- def sign_with_parent_author_if_available
124
- privkey = DiasporaFederation.callbacks.trigger(:fetch_private_key, parent.root.author)
125
- return unless privkey
126
111
 
127
112
  sign_with_key(privkey).tap do
128
- logger.info "event=sign status=complete signature=parent_author_signature obj=#{self}"
113
+ logger.info "event=sign status=complete signature=author_signature author=#{author} obj=#{self}"
129
114
  end
130
115
  end
131
116
 
@@ -135,8 +120,7 @@ module DiasporaFederation
135
120
  # @return [Hash] properties with updated signatures
136
121
  def enriched_properties
137
122
  super.merge(additional_data).tap do |hash|
138
- hash[:author_signature] = author_signature || sign_with_author
139
- hash.delete(:parent_author_signature)
123
+ hash[:author_signature] = author_signature || sign_with_author unless author == parent.root.author
140
124
  end
141
125
  end
142
126
 
@@ -144,19 +128,22 @@ module DiasporaFederation
144
128
  #
145
129
  # @return [Hash] sorted xml elements
146
130
  def xml_elements
147
- data = super.tap do |hash|
148
- hash[:parent_author_signature] = parent_author_signature || sign_with_parent_author_if_available.to_s
149
- end
150
- order = signature_order + %i[author_signature parent_author_signature]
151
- order.map {|element| [element, data[element].to_s] }.to_h
131
+ data = super
132
+ order = signature_order
133
+ order += %i[author_signature] unless author == parent.root.author
134
+ order.to_h {|element| [element, data[element].to_s] }
152
135
  end
153
136
 
154
137
  def signature_order=(order)
155
138
  prop_names = self.class.class_props.keys.map(&:to_s)
156
- @signature_order = order.reject {|name| name =~ /signature/ }
139
+ @signature_order = order.grep_v(/signature/)
157
140
  .map {|name| prop_names.include?(name) ? name.to_sym : name }
158
141
  end
159
142
 
143
+ def additional_data=(additional_data)
144
+ @additional_data = additional_data.reject {|name, _| name =~ /signature/ }
145
+ end
146
+
160
147
  # @return [String] signature data string
161
148
  def signature_data
162
149
  data = normalized_properties.merge(additional_data)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents the fact that a user reshared another user's post.
@@ -8,7 +10,7 @@ module DiasporaFederation
8
10
  # The diaspora* ID of the person who reshares the post
9
11
  # @see Person#author
10
12
  # @return [String] diaspora* ID
11
- property :author, :string, xml_name: :diaspora_handle
13
+ property :author, :string
12
14
 
13
15
  # @!attribute [r] guid
14
16
  # A random string of at least 16 chars
@@ -25,7 +27,7 @@ module DiasporaFederation
25
27
  # The diaspora* ID of the person who posted the original post
26
28
  # @see Person#author
27
29
  # @return [String] diaspora* ID
28
- property :root_author, :string, optional: true, xml_name: :root_diaspora_id
30
+ property :root_author, :string, optional: true
29
31
 
30
32
  # @!attribute [r] root_guid
31
33
  # Guid of the original post
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents a claim of deletion of a previously federated entity.
@@ -8,17 +10,17 @@ module DiasporaFederation
8
10
  # The diaspora* ID of the person who deletes the entity
9
11
  # @see Person#author
10
12
  # @return [String] diaspora* ID
11
- property :author, :string, xml_name: :diaspora_handle
13
+ property :author, :string
12
14
 
13
15
  # @!attribute [r] target_guid
14
16
  # Guid of the entity to be deleted
15
17
  # @return [String] target guid
16
- property :target_guid, :string, xml_name: :post_guid
18
+ property :target_guid, :string
17
19
 
18
20
  # @!attribute [r] target_type
19
21
  # A string describing the type of the target
20
22
  # @return [String] target type
21
- property :target_type, :string, xml_name: :type
23
+ property :target_type, :string
22
24
 
23
25
  # @!attribute [r] target
24
26
  # Target entity
@@ -28,7 +30,7 @@ module DiasporaFederation
28
30
  def sender_valid?(sender)
29
31
  case target_type
30
32
  when "Comment", "Like", "PollParticipation"
31
- sender == target.author || sender == target.root.author
33
+ [target.root.author, target.author].include?(sender)
32
34
  else
33
35
  sender == target.author
34
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # Signable is a module that encapsulates basic signature generation/verification flow for entities.
@@ -5,7 +7,7 @@ module DiasporaFederation
5
7
  include Logging
6
8
 
7
9
  # Digest instance used for signing
8
- DIGEST = OpenSSL::Digest::SHA256.new
10
+ DIGEST = OpenSSL::Digest.new("SHA256")
9
11
 
10
12
  # Sign the data with the key
11
13
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Entities
3
5
  # This entity represents a status message sent by a user.
@@ -9,7 +11,7 @@ module DiasporaFederation
9
11
  # @!attribute [r] text
10
12
  # Text of the status message composed by the user
11
13
  # @return [String] text of the status message
12
- property :text, :string, xml_name: :raw_message
14
+ property :text, :string
13
15
 
14
16
  # @!attribute [r] edited_at
15
17
  # The timestamp when the status message was edited
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  # This namespace contains all the entities used to encapsulate data that is
3
5
  # passed around in the diaspora* network as part of the federation protocol.
@@ -44,8 +46,3 @@ require "diaspora_federation/entities/message"
44
46
  require "diaspora_federation/entities/conversation"
45
47
 
46
48
  require "diaspora_federation/entities/retraction"
47
-
48
- # deprecated
49
- require "diaspora_federation/entities/request"
50
- require "diaspora_federation/entities/signed_retraction"
51
- require "diaspora_federation/entities/relayable_retraction"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  # +Entity+ is the base class for all other objects used to encapsulate data
3
5
  # for federation messages in the diaspora* network.
@@ -15,7 +17,6 @@ module DiasporaFederation
15
17
  # property :prop
16
18
  # property :optional, default: false
17
19
  # property :dynamic_default, default: -> { Time.now }
18
- # property :another_prop, xml_name: :another_name
19
20
  # entity :nested, NestedEntity
20
21
  # entity :multiple, [OtherEntity]
21
22
  # end
@@ -38,10 +39,10 @@ module DiasporaFederation
38
39
 
39
40
  # Invalid XML characters
40
41
  # @see https://www.w3.org/TR/REC-xml/#charsets "Extensible Markup Language (XML) 1.0"
41
- INVALID_XML_REGEX = /[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u{10000}-\u{10FFFF}]/
42
+ INVALID_XML_REGEX = /[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u{10000}-\u{10FFFF}]/.freeze
42
43
 
43
44
  # Regex to validate and find entity names
44
- ENTITY_NAME_REGEX = "[a-z]*(?:_[a-z]*)*".freeze
45
+ ENTITY_NAME_REGEX = "[a-z]*(?:_[a-z]*)*"
45
46
 
46
47
  # Initializes the Entity with the given attribute hash and freezes the created
47
48
  # instance it returns.
@@ -76,7 +77,7 @@ module DiasporaFederation
76
77
  # Nested entities are also converted to a Hash.
77
78
  # @return [Hash] entity data (mostly equal to the hash used for initialization).
78
79
  def to_h
79
- enriched_properties.map {|key, value|
80
+ enriched_properties.to_h {|key, value|
80
81
  type = self.class.class_props[key]
81
82
 
82
83
  if type.instance_of?(Symbol) || value.nil?
@@ -86,7 +87,7 @@ module DiasporaFederation
86
87
  elsif type.instance_of?(Array)
87
88
  [key, value.map(&:to_h)]
88
89
  end
89
- }.to_h
90
+ }
90
91
  end
91
92
 
92
93
  # Returns the XML representation for this entity constructed out of
@@ -96,7 +97,7 @@ module DiasporaFederation
96
97
  #
97
98
  # @return [Nokogiri::XML::Element] root element containing properties as child elements
98
99
  def to_xml
99
- doc = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new)
100
+ doc = Nokogiri::XML::Document.new
100
101
  Nokogiri::XML::Element.new(self.class.entity_name, doc).tap do |root_element|
101
102
  xml_elements.each do |name, value|
102
103
  add_property_to_xml(doc, root_element, name, value)
@@ -149,6 +150,7 @@ module DiasporaFederation
149
150
  # @return [Class] entity class
150
151
  def self.entity_class(entity_name)
151
152
  raise InvalidEntityName, "'#{entity_name}' is invalid" unless entity_name =~ /\A#{ENTITY_NAME_REGEX}\z/
153
+
152
154
  class_name = entity_name.sub(/\A[a-z]/, &:upcase)
153
155
  class_name.gsub!(/_([a-z])/) { Regexp.last_match[1].upcase }
154
156
 
@@ -169,7 +171,7 @@ module DiasporaFederation
169
171
 
170
172
  # Renders entity to a hash representation of the entity JSON format
171
173
  # @return [Hash] Returns a hash that is equal by structure to the entity in JSON format
172
- def to_json
174
+ def to_json(*_args)
173
175
  {
174
176
  entity_type: self.class.entity_name,
175
177
  entity_data: json_data
@@ -213,7 +215,7 @@ module DiasporaFederation
213
215
  end
214
216
 
215
217
  def setable_property?(type, val)
216
- setable_string?(type, val) || type == :timestamp && val.is_a?(Time)
218
+ setable_string?(type, val) || (type == :timestamp && val.is_a?(Time))
217
219
  end
218
220
 
219
221
  def setable_string?(type, val)
@@ -231,12 +233,14 @@ module DiasporaFederation
231
233
 
232
234
  def nilify(value)
233
235
  return nil if value.respond_to?(:empty?) && value.empty? && !value.instance_of?(Array)
236
+
234
237
  value
235
238
  end
236
239
 
237
240
  def instantiate_nested(name, value)
238
241
  if value.instance_of?(Array)
239
242
  return value unless value.first.instance_of?(Hash)
243
+
240
244
  value.map {|hash| self.class.class_props[name].first.new(hash) }
241
245
  elsif value.instance_of?(Hash)
242
246
  self.class.class_props[name].new(value)
@@ -269,7 +273,7 @@ module DiasporaFederation
269
273
  end
270
274
 
271
275
  def normalized_properties
272
- properties.map {|name, value| [name, normalize_property(name, value)] }.to_h
276
+ properties.to_h {|name, value| [name, normalize_property(name, value)] }
273
277
  end
274
278
 
275
279
  def normalize_property(name, value)
@@ -317,7 +321,7 @@ module DiasporaFederation
317
321
  # Generates a hash with entity properties which is put to the "entity_data"
318
322
  # field of a JSON serialized object.
319
323
  # @return [Hash] object properties in JSON format
320
- def json_data
324
+ def json_data # rubocop:disable Metrics/PerceivedComplexity
321
325
  enriched_properties.map {|key, value|
322
326
  type = self.class.class_props[key]
323
327
  next if optional_nil_value?(key, value)
@@ -326,7 +330,7 @@ module DiasporaFederation
326
330
  entity_data = value.to_json
327
331
  [key, entity_data] unless entity_data.nil?
328
332
  elsif type.instance_of?(Array)
329
- entity_data = value.nil? ? nil : value.map(&:to_json)
333
+ entity_data = value&.map(&:to_json)
330
334
  [key, entity_data] unless entity_data.nil?
331
335
  else
332
336
  [key, value]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  # This module is for parsing and fetching linked entities.
@@ -10,7 +12,7 @@ module DiasporaFederation
10
12
  (#{Validation::Rule::DiasporaId::DIASPORA_ID_REGEX})/
11
13
  (#{Entity::ENTITY_NAME_REGEX})/
12
14
  (#{Validation::Rule::Guid::VALID_CHARS})
13
- }ux
15
+ }ux.freeze
14
16
 
15
17
  # Parses all diaspora:// URLs from the text and fetches the entities from
16
18
  # the remote server if needed.
@@ -25,6 +27,7 @@ module DiasporaFederation
25
27
  private_class_method def self.fetch_entity(author, type, guid)
26
28
  class_name = Entity.entity_class(type).to_s.rpartition("::").last
27
29
  return if DiasporaFederation.callbacks.trigger(:fetch_related_entity, class_name, guid)
30
+
28
31
  Fetcher.fetch_public(author, type, guid)
29
32
  rescue => e # rubocop:disable Style/RescueStandardError
30
33
  logger.error "Failed to fetch linked entity #{type}:#{guid}: #{e.class}: #{e.message}"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  # This module is for fetching entities from other pods.
@@ -10,6 +12,7 @@ module DiasporaFederation
10
12
  def self.fetch_public(author, entity_type, guid)
11
13
  type = entity_name(entity_type).to_s
12
14
  raise "Already fetching ..." if fetching[type].include?(guid)
15
+
13
16
  fetch_from_url(author, type, guid)
14
17
  rescue => e # rubocop:disable Style/RescueStandardError
15
18
  raise NotFetchable, "Failed to fetch #{entity_type}:#{guid} from #{author}: #{e.class}: #{e.message}"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  module Receiver
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  module Receiver
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  module Receiver
@@ -7,6 +9,7 @@ module DiasporaFederation
7
9
 
8
10
  def validate
9
11
  raise RecipientRequired if recipient_id.nil?
12
+
10
13
  super
11
14
  end
12
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  module Receiver
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  # This module parses and receives entities.
@@ -6,14 +8,9 @@ module DiasporaFederation
6
8
 
7
9
  # Receive a public message
8
10
  # @param [String] data message to receive
9
- # @param [Boolean] legacy use old slap parser
10
- def self.receive_public(data, legacy=false)
11
- magic_env = if legacy
12
- Salmon::Slap.from_xml(data)
13
- else
14
- magic_env_xml = Nokogiri::XML(data).root
15
- Salmon::MagicEnvelope.unenvelop(magic_env_xml)
16
- end
11
+ def self.receive_public(data)
12
+ magic_env_xml = Nokogiri::XML(data).root
13
+ magic_env = Salmon::MagicEnvelope.unenvelop(magic_env_xml)
17
14
  Public.new(magic_env).receive
18
15
  rescue => e # rubocop:disable Style/RescueStandardError
19
16
  logger.error "failed to receive public message: #{e.class}: #{e.message}"
@@ -26,15 +23,11 @@ module DiasporaFederation
26
23
  # @param [OpenSSL::PKey::RSA] recipient_private_key recipient private key to decrypt the message
27
24
  # @param [Object] recipient_id the identifier to persist the entity for the correct user,
28
25
  # see +receive_entity+ callback
29
- # @param [Boolean] legacy use old slap parser
30
- def self.receive_private(data, recipient_private_key, recipient_id, legacy=false)
26
+ def self.receive_private(data, recipient_private_key, recipient_id)
31
27
  raise ArgumentError, "no recipient key provided" unless recipient_private_key.instance_of?(OpenSSL::PKey::RSA)
32
- magic_env = if legacy
33
- Salmon::EncryptedSlap.from_xml(data, recipient_private_key)
34
- else
35
- magic_env_xml = Salmon::EncryptedMagicEnvelope.decrypt(data, recipient_private_key)
36
- Salmon::MagicEnvelope.unenvelop(magic_env_xml)
37
- end
28
+
29
+ magic_env_xml = Salmon::EncryptedMagicEnvelope.decrypt(data, recipient_private_key)
30
+ magic_env = Salmon::MagicEnvelope.unenvelop(magic_env_xml)
38
31
  Private.new(magic_env, recipient_id).receive
39
32
  rescue => e # rubocop:disable Style/RescueStandardError
40
33
  logger.error "failed to receive private message for #{recipient_id}: #{e.class}: #{e.message}"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "typhoeus"
2
4
 
3
5
  module DiasporaFederation
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Federation
3
5
  # Federation logic to send messages to other pods
@@ -24,7 +26,7 @@ module DiasporaFederation
24
26
  def self.private(sender_id, obj_str, targets)
25
27
  hydra = HydraWrapper.new(sender_id, obj_str)
26
28
  targets.each {|url, json| hydra.insert_enc_magic_env_request(url, json) }
27
- hydra.send.map {|url| [url, targets[url]] }.to_h
29
+ hydra.send.to_h {|url| [url, targets[url]] }
28
30
  end
29
31
  end
30
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  # This module contains the federation logic
3
5
  module Federation
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "faraday"
2
- require "faraday_middleware/response/follow_redirects"
4
+ require "faraday/follow_redirects"
3
5
 
4
6
  module DiasporaFederation
5
7
  # A wrapper for {https://github.com/lostisland/faraday Faraday}
@@ -30,7 +32,8 @@ module DiasporaFederation
30
32
  }
31
33
 
32
34
  @connection = Faraday::Connection.new(options) do |builder|
33
- builder.use FaradayMiddleware::FollowRedirects, limit: DiasporaFederation.http_redirect_limit
35
+ builder.use Faraday::FollowRedirects::Middleware, limit: DiasporaFederation.http_redirect_limit
36
+
34
37
  builder.adapter Faraday.default_adapter
35
38
  end
36
39
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  # Logging module for the diaspora* federation
3
5
  #
@@ -15,15 +17,15 @@ module DiasporaFederation
15
17
  #
16
18
  # Use the logging-gem if available, else use a default logger.
17
19
  def logger
18
- @logger ||= begin
20
+ @logger ||= if defined?(::Logging::Logger)
19
21
  # Use logging-gem if available
20
- return ::Logging::Logger[self] if defined?(::Logging::Logger)
21
-
22
+ ::Logging::Logger[self]
23
+ elsif defined?(::Rails)
22
24
  # Use rails logger if running in rails and no logging-gem is available
23
- return ::Rails.logger if defined?(::Rails)
24
-
25
+ ::Rails.logger
26
+ else
25
27
  # fallback logger
26
- @logger = Logger.new(STDOUT)
28
+ @logger = Logger.new($stdout)
27
29
  @logger.level = Logger::INFO
28
30
  @logger
29
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Parsers
3
5
  # +BaseParser+ is an abstract class which is used for defining parsers for different
@@ -36,6 +38,7 @@ module DiasporaFederation
36
38
  text.to_i if text =~ /\A\d+\z/
37
39
  when :boolean
38
40
  return true if text =~ /\A(true|t|yes|y|1)\z/i
41
+
39
42
  false if text =~ /\A(false|f|no|n|0)\z/i
40
43
  else
41
44
  text
@@ -44,6 +47,7 @@ module DiasporaFederation
44
47
 
45
48
  def assert_parsability_of(entity_class)
46
49
  return if entity_class == entity_type.entity_name
50
+
47
51
  raise InvalidRootNode, "'#{entity_class}' can't be parsed by #{entity_type.name}"
48
52
  end
49
53