diaspora_federation 0.2.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +14 -2
  3. data/lib/diaspora_federation/callbacks.rb +2 -0
  4. data/lib/diaspora_federation/discovery/discovery.rb +11 -20
  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 +15 -13
  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 +17 -30
  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 +12 -8
  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 +2 -0
  47. data/lib/diaspora_federation/federation.rb +2 -0
  48. data/lib/diaspora_federation/http_client.rb +4 -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 +6 -1
  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 +18 -6
  55. data/lib/diaspora_federation/parsers.rb +2 -0
  56. data/lib/diaspora_federation/properties_dsl.rb +6 -39
  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 +9 -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 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]
131
+ data = super
132
+ order = signature_order
133
+ order += %i[author_signature] unless author == parent.root.author
151
134
  order.map {|element| [element, data[element].to_s] }.to_h
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.
@@ -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)
@@ -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
@@ -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_middleware"
3
5
 
4
6
  module DiasporaFederation
5
7
  # A wrapper for {https://github.com/lostisland/faraday Faraday}
@@ -30,7 +32,7 @@ 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.response :follow_redirects, limit: DiasporaFederation.http_redirect_limit
34
36
  builder.adapter Faraday.default_adapter
35
37
  end
36
38
 
@@ -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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Parsers
3
5
  # This is a parser of JSON serialized object. JSON object format is defined by
@@ -16,7 +18,7 @@ module DiasporaFederation
16
18
 
17
19
  def parse_entity_data(entity_data)
18
20
  hash = entity_data.map {|key, value|
19
- property = entity_type.find_property_for_xml_name(key)
21
+ property = entity_type.class_props.keys.find {|name| name.to_s == key }
20
22
  if property
21
23
  type = entity_type.class_props[property]
22
24
  [property, parse_element_from_value(type, entity_data[key])]
@@ -30,12 +32,14 @@ module DiasporaFederation
30
32
 
31
33
  def parse_element_from_value(type, value)
32
34
  return if value.nil?
35
+
33
36
  if %i[integer boolean timestamp].include?(type) && !value.is_a?(String)
34
37
  value
35
38
  elsif type.instance_of?(Symbol)
36
39
  parse_string(type, value)
37
40
  elsif type.instance_of?(Array)
38
41
  raise DeserializationError, "Expected array for #{type}" unless value.respond_to?(:map)
42
+
39
43
  value.map {|element|
40
44
  type.first.from_json(element)
41
45
  }
@@ -49,6 +53,7 @@ module DiasporaFederation
49
53
  prop if json_hash[prop].nil?
50
54
  }.compact.join(", ")
51
55
  raise DeserializationError, "Required properties are missing in JSON object: #{missing}" unless missing.empty?
56
+
52
57
  assert_parsability_of(json_hash["entity_type"])
53
58
  end
54
59
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Parsers
3
5
  # This is a parser of JSON serialized object, that is normally used for parsing data of relayables.
@@ -18,6 +20,7 @@ module DiasporaFederation
18
20
  def from_json_sanity_validation(json_hash)
19
21
  super
20
22
  return unless json_hash["property_order"].nil?
23
+
21
24
  raise DeserializationError, "Required property is missing in JSON object: property_order"
22
25
  end
23
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DiasporaFederation
2
4
  module Parsers
3
5
  # This is a parser of XML serialized object that is normally used for parsing data of relayables.