diaspora_federation 0.0.13 → 0.1.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -32
  3. data/lib/diaspora_federation.rb +9 -31
  4. data/lib/diaspora_federation/discovery/h_card.rb +8 -15
  5. data/lib/diaspora_federation/discovery/host_meta.rb +2 -4
  6. data/lib/diaspora_federation/discovery/web_finger.rb +11 -11
  7. data/lib/diaspora_federation/discovery/xrd_document.rb +4 -8
  8. data/lib/diaspora_federation/entities.rb +2 -0
  9. data/lib/diaspora_federation/entities/account_deletion.rb +5 -0
  10. data/lib/diaspora_federation/entities/comment.rb +3 -6
  11. data/lib/diaspora_federation/entities/contact.rb +5 -0
  12. data/lib/diaspora_federation/entities/conversation.rb +10 -1
  13. data/lib/diaspora_federation/entities/message.rb +29 -4
  14. data/lib/diaspora_federation/entities/participation.rb +24 -0
  15. data/lib/diaspora_federation/entities/poll_participation.rb +3 -6
  16. data/lib/diaspora_federation/entities/profile.rb +5 -0
  17. data/lib/diaspora_federation/entities/related_entity.rb +33 -0
  18. data/lib/diaspora_federation/entities/relayable.rb +55 -40
  19. data/lib/diaspora_federation/entities/relayable_retraction.rb +21 -12
  20. data/lib/diaspora_federation/entities/request.rb +6 -2
  21. data/lib/diaspora_federation/entities/reshare.rb +5 -0
  22. data/lib/diaspora_federation/entities/retraction.rb +37 -0
  23. data/lib/diaspora_federation/entities/signed_retraction.rb +16 -5
  24. data/lib/diaspora_federation/entities/status_message.rb +11 -0
  25. data/lib/diaspora_federation/entity.rb +73 -30
  26. data/lib/diaspora_federation/federation/fetcher.rb +11 -1
  27. data/lib/diaspora_federation/federation/receiver.rb +10 -0
  28. data/lib/diaspora_federation/federation/receiver/abstract_receiver.rb +18 -4
  29. data/lib/diaspora_federation/federation/receiver/exceptions.rb +4 -0
  30. data/lib/diaspora_federation/federation/receiver/public.rb +10 -0
  31. data/lib/diaspora_federation/federation/sender.rb +1 -1
  32. data/lib/diaspora_federation/http_client.rb +1 -2
  33. data/lib/diaspora_federation/logging.rb +6 -0
  34. data/lib/diaspora_federation/properties_dsl.rb +4 -2
  35. data/lib/diaspora_federation/salmon/encrypted_magic_envelope.rb +2 -2
  36. data/lib/diaspora_federation/salmon/encrypted_slap.rb +3 -5
  37. data/lib/diaspora_federation/salmon/exceptions.rb +1 -1
  38. data/lib/diaspora_federation/salmon/magic_envelope.rb +16 -17
  39. data/lib/diaspora_federation/salmon/slap.rb +1 -2
  40. data/lib/diaspora_federation/salmon/xml_payload.rb +1 -2
  41. data/lib/diaspora_federation/validators.rb +2 -0
  42. data/lib/diaspora_federation/validators/conversation_validator.rb +2 -0
  43. data/lib/diaspora_federation/validators/message_validator.rb +2 -2
  44. data/lib/diaspora_federation/validators/participation_validator.rb +3 -2
  45. data/lib/diaspora_federation/validators/poll_validator.rb +1 -0
  46. data/lib/diaspora_federation/validators/related_entity_validator.rb +12 -0
  47. data/lib/diaspora_federation/validators/relayable_retraction_validator.rb +1 -1
  48. data/lib/diaspora_federation/validators/relayable_validator.rb +1 -0
  49. data/lib/diaspora_federation/validators/retraction_validator.rb +1 -1
  50. data/lib/diaspora_federation/validators/rules/diaspora_id.rb +8 -11
  51. data/lib/diaspora_federation/validators/rules/diaspora_id_count.rb +1 -1
  52. data/lib/diaspora_federation/validators/signed_retraction_validator.rb +1 -1
  53. data/lib/diaspora_federation/validators/status_message_validator.rb +2 -0
  54. data/lib/diaspora_federation/validators/web_finger_validator.rb +2 -2
  55. data/lib/diaspora_federation/version.rb +1 -1
  56. metadata +9 -7
@@ -58,7 +58,7 @@ module DiasporaFederation
58
58
  # @param [Hash] data entity data
59
59
  # @return [Hash] hash with resolved aliases
60
60
  def resolv_aliases(data)
61
- Hash[data.map {|name, value|
61
+ data.map {|name, value|
62
62
  if class_prop_aliases.has_key? name
63
63
  prop_name = class_prop_aliases[name]
64
64
  raise InvalidData, "only use '#{name}' OR '#{prop_name}'" if data.has_key? prop_name
@@ -66,7 +66,7 @@ module DiasporaFederation
66
66
  else
67
67
  [name, value]
68
68
  end
69
- }]
69
+ }.to_h
70
70
  end
71
71
 
72
72
  # @return [Symbol] alias for the xml-generation/parsing
@@ -144,7 +144,9 @@ module DiasporaFederation
144
144
  # @param [Symbol] alias_name alias name
145
145
  def define_alias(name, alias_name)
146
146
  class_prop_aliases[alias_name] = name
147
+ # rubocop:disable Style/Alias
147
148
  instance_eval { alias_method alias_name, name }
149
+ # rubocop:enable Style/Alias
148
150
  end
149
151
 
150
152
  # Raised, if the name is of an unexpected type
@@ -36,7 +36,7 @@ module DiasporaFederation
36
36
  key = AES.generate_key_and_iv
37
37
  encrypted_env = AES.encrypt(magic_env.to_xml, key[:key], key[:iv])
38
38
 
39
- encoded_key = Hash[key.map {|k, v| [k, Base64.strict_encode64(v)] }]
39
+ encoded_key = key.map {|k, v| [k, Base64.strict_encode64(v)] }.to_h
40
40
  encrypted_key = Base64.strict_encode64(pubkey.public_encrypt(JSON.generate(encoded_key)))
41
41
 
42
42
  JSON.generate(aes_key: encrypted_key, encrypted_magic_envelope: encrypted_env)
@@ -51,7 +51,7 @@ module DiasporaFederation
51
51
  encrypted_json = JSON.parse(encrypted_env)
52
52
 
53
53
  encoded_key = JSON.parse(privkey.private_decrypt(Base64.decode64(encrypted_json["aes_key"])))
54
- key = Hash[encoded_key.map {|k, v| [k, Base64.decode64(v)] }]
54
+ key = encoded_key.map {|k, v| [k, Base64.decode64(v)] }.to_h
55
55
 
56
56
  xml = AES.decrypt(encrypted_json["encrypted_magic_envelope"], key["key"], key["iv"])
57
57
  Nokogiri::XML::Document.parse(xml).root
@@ -140,7 +140,7 @@ module DiasporaFederation
140
140
  # @param [String] data base64 encoded, encrypted header data
141
141
  # @param [OpenSSL::PKey::RSA] privkey private key for decryption
142
142
  # @return [Hash] { iv: "...", aes_key: "...", author_id: "..." }
143
- def self.header_data(data, privkey)
143
+ private_class_method def self.header_data(data, privkey)
144
144
  header_elem = decrypt_header(data, privkey)
145
145
  raise InvalidHeader unless header_elem.name == "decrypted_header"
146
146
 
@@ -150,20 +150,18 @@ module DiasporaFederation
150
150
 
151
151
  {iv: iv, aes_key: key, author_id: author_id}
152
152
  end
153
- private_class_method :header_data
154
153
 
155
154
  # decrypts the xml header
156
155
  # @param [String] data base64 encoded, encrypted header data
157
156
  # @param [OpenSSL::PKey::RSA] privkey private key for decryption
158
157
  # @return [Nokogiri::XML::Element] header xml document
159
- def self.decrypt_header(data, privkey)
158
+ private_class_method def self.decrypt_header(data, privkey)
160
159
  cipher_header = JSON.parse(Base64.decode64(data))
161
160
  key = JSON.parse(privkey.private_decrypt(Base64.decode64(cipher_header["aes_key"])))
162
161
 
163
162
  xml = AES.decrypt(cipher_header["ciphertext"], Base64.decode64(key["key"]), Base64.decode64(key["iv"]))
164
163
  Nokogiri::XML::Document.parse(xml).root
165
164
  end
166
- private_class_method :decrypt_header
167
165
 
168
166
  # encrypt the header xml with an AES cipher and encrypt the cipher params
169
167
  # with the recipients public_key
@@ -201,7 +199,7 @@ module DiasporaFederation
201
199
  # @param [Hash] hash { key: "...", iv: "..." }
202
200
  # @return [Hash] encoded hash: { key: "...", iv: "..." }
203
201
  def strict_base64_encode(hash)
204
- Hash[hash.map {|k, v| [k, Base64.strict_encode64(v)] }]
202
+ hash.map {|k, v| [k, Base64.strict_encode64(v)] }.to_h
205
203
  end
206
204
  end
207
205
  end
@@ -15,7 +15,7 @@ module DiasporaFederation
15
15
  class MissingHeader < RuntimeError
16
16
  end
17
17
 
18
- # Raised if the decrypted header has an unexpected XML structure
18
+ # Raised, if the decrypted header has an unexpected XML structure
19
19
  # @deprecated
20
20
  class InvalidHeader < RuntimeError
21
21
  end
@@ -19,8 +19,10 @@ module DiasporaFederation
19
19
  # When parsing the XML of an incoming Magic Envelope {MagicEnvelope.unenvelop}
20
20
  # is used.
21
21
  #
22
- # @see http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-magicsig-01.html
22
+ # @see https://cdn.rawgit.com/salmon-protocol/salmon-protocol/master/draft-panzer-magicsig-01.html
23
23
  class MagicEnvelope
24
+ include Logging
25
+
24
26
  # encoding used for the payload data
25
27
  ENCODING = "base64url".freeze
26
28
 
@@ -123,6 +125,8 @@ module DiasporaFederation
123
125
 
124
126
  data = read_and_decrypt_data(magic_env, cipher_params)
125
127
 
128
+ logger.debug "unenvelop message from #{sender}:\n#{data}"
129
+
126
130
  new(XmlPayload.unpack(Nokogiri::XML::Document.parse(data).root), sender)
127
131
  end
128
132
 
@@ -131,7 +135,9 @@ module DiasporaFederation
131
135
  # the payload data as string
132
136
  # @return [String] payload data
133
137
  def payload_data
134
- @payload_data ||= XmlPayload.pack(@payload).to_xml.strip
138
+ @payload_data ||= XmlPayload.pack(@payload).to_xml.strip.tap do |data|
139
+ logger.debug "send payload:\n#{data}"
140
+ end
135
141
  end
136
142
 
137
143
  def key_id
@@ -159,74 +165,67 @@ module DiasporaFederation
159
165
  end
160
166
 
161
167
  # @param [Nokogiri::XML::Element] env magic envelope XML
162
- def self.envelope_valid?(env)
168
+ private_class_method def self.envelope_valid?(env)
163
169
  (env.instance_of?(Nokogiri::XML::Element) &&
164
170
  env.name == "env" &&
165
171
  !env.at_xpath("me:data").content.empty? &&
166
172
  !env.at_xpath("me:sig").content.empty?)
167
173
  end
168
- private_class_method :envelope_valid?
169
174
 
170
175
  # @param [Nokogiri::XML::Element] env magic envelope XML
171
176
  # @param [String] sender diaspora-ID of the sender or nil
172
177
  # @return [Boolean]
173
- def self.signature_valid?(env, sender)
178
+ private_class_method def self.signature_valid?(env, sender)
174
179
  subject = sig_subject([Base64.urlsafe_decode64(env.at_xpath("me:data").content),
175
180
  env.at_xpath("me:data")["type"],
176
181
  env.at_xpath("me:encoding").content,
177
182
  env.at_xpath("me:alg").content])
178
183
 
179
- sender_key = DiasporaFederation.callbacks.trigger(:fetch_public_key_by_diaspora_id, sender)
184
+ sender_key = DiasporaFederation.callbacks.trigger(:fetch_public_key, sender)
180
185
  raise SenderKeyNotFound unless sender_key
181
186
 
182
187
  sig = Base64.urlsafe_decode64(env.at_xpath("me:sig").content)
183
188
  sender_key.verify(DIGEST, sig, subject)
184
189
  end
185
- private_class_method :signature_valid?
186
190
 
187
191
  # reads the +key_id+ from the magic envelope
188
192
  # @param [Nokogiri::XML::Element] env magic envelope XML
189
193
  # @return [String] diaspora-ID of the sender
190
- def self.sender(env)
194
+ private_class_method def self.sender(env)
191
195
  key_id = env.at_xpath("me:sig")["key_id"]
192
196
  raise InvalidEnvelope, "no key_id" unless key_id # TODO: move to `envelope_valid?`
193
197
  Base64.urlsafe_decode64(key_id)
194
198
  end
195
- private_class_method :sender
196
199
 
197
200
  # constructs the signature subject.
198
201
  # the given array should consist of the data, data_type (mimetype), encoding
199
202
  # and the algorithm
200
203
  # @param [Array<String>] data_arr
201
204
  # @return [String] signature subject
202
- def self.sig_subject(data_arr)
205
+ private_class_method def self.sig_subject(data_arr)
203
206
  data_arr.map {|i| Base64.urlsafe_encode64(i) }.join(".")
204
207
  end
205
- private_class_method :sig_subject
206
208
 
207
209
  # @param [Nokogiri::XML::Element] magic_env magic envelope XML
208
210
  # @return [Boolean]
209
- def self.encoding_valid?(magic_env)
211
+ private_class_method def self.encoding_valid?(magic_env)
210
212
  magic_env.at_xpath("me:encoding").content == ENCODING
211
213
  end
212
- private_class_method :encoding_valid?
213
214
 
214
215
  # @param [Nokogiri::XML::Element] magic_env magic envelope XML
215
216
  # @return [Boolean]
216
- def self.algorithm_valid?(magic_env)
217
+ private_class_method def self.algorithm_valid?(magic_env)
217
218
  magic_env.at_xpath("me:alg").content == ALGORITHM
218
219
  end
219
- private_class_method :algorithm_valid?
220
220
 
221
221
  # @param [Nokogiri::XML::Element] magic_env magic envelope XML
222
222
  # @param [Hash] cipher_params hash containing the key and iv
223
223
  # @return [String] data
224
- def self.read_and_decrypt_data(magic_env, cipher_params)
224
+ private_class_method def self.read_and_decrypt_data(magic_env, cipher_params)
225
225
  data = Base64.urlsafe_decode64(magic_env.at_xpath("me:data").content)
226
226
  data = AES.decrypt(data, cipher_params[:key], cipher_params[:iv]) unless cipher_params.nil?
227
227
  data
228
228
  end
229
- private_class_method :read_and_decrypt_data
230
229
  end
231
230
  end
232
231
  end
@@ -86,12 +86,11 @@ module DiasporaFederation
86
86
  # Parses the magic envelop from the document.
87
87
  #
88
88
  # @param [Nokogiri::XML::Document] doc Salmon XML Document
89
- def self.magic_env_from_doc(doc)
89
+ private_class_method def self.magic_env_from_doc(doc)
90
90
  doc.at_xpath("d:diaspora/me:env", Slap::NS).tap do |env|
91
91
  raise MissingMagicEnvelope if env.nil?
92
92
  end
93
93
  end
94
- private_class_method :magic_env_from_doc
95
94
  end
96
95
  end
97
96
  end
@@ -51,11 +51,10 @@ module DiasporaFederation
51
51
  end
52
52
 
53
53
  # @param [Nokogiri::XML::Element] element
54
- def self.xml_wrapped?(element)
54
+ private_class_method def self.xml_wrapped?(element)
55
55
  (element.name == "XML" && !element.at_xpath("post").nil? &&
56
56
  !element.at_xpath("post").children.empty?)
57
57
  end
58
- private_class_method :xml_wrapped?
59
58
  end
60
59
  end
61
60
  end
@@ -34,6 +34,8 @@ module DiasporaFederation
34
34
  end
35
35
  end
36
36
 
37
+ require "diaspora_federation/validators/related_entity_validator"
38
+
37
39
  # abstract types
38
40
  require "diaspora_federation/validators/relayable_validator"
39
41
 
@@ -6,6 +6,8 @@ module DiasporaFederation
6
6
 
7
7
  rule :guid, :guid
8
8
 
9
+ rule :messages, :not_nil
10
+
9
11
  rule :author, %i(not_empty diaspora_id)
10
12
 
11
13
  rule :participants, diaspora_id_count: {maximum: 20}
@@ -4,8 +4,8 @@ module DiasporaFederation
4
4
  class MessageValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- include RelayableValidator
8
-
7
+ rule :author, %i(not_empty diaspora_id)
8
+ rule :guid, :guid
9
9
  rule :conversation_guid, :guid
10
10
  end
11
11
  end
@@ -4,8 +4,9 @@ module DiasporaFederation
4
4
  class ParticipationValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- include RelayableValidator
8
-
7
+ rule :author, %i(not_empty diaspora_id)
8
+ rule :guid, :guid
9
+ rule :parent_guid, :guid
9
10
  rule :parent_type, [:not_empty, regular_expression: {regex: /\APost\z/}]
10
11
  end
11
12
  end
@@ -6,6 +6,7 @@ module DiasporaFederation
6
6
 
7
7
  rule :guid, :guid
8
8
  rule :question, [:not_empty, length: {maximum: 255}]
9
+ rule :poll_answers, length: {minimum: 2}
9
10
  end
10
11
  end
11
12
  end
@@ -0,0 +1,12 @@
1
+ module DiasporaFederation
2
+ module Validators
3
+ # This validates a {Entities::RelatedEntity}
4
+ class RelatedEntityValidator < Validation::Validator
5
+ include Validation
6
+
7
+ rule :author, %i(not_empty diaspora_id)
8
+ rule :local, :boolean
9
+ rule :public, :boolean
10
+ end
11
+ end
12
+ end
@@ -6,8 +6,8 @@ module DiasporaFederation
6
6
  include Validation
7
7
 
8
8
  rule :target_guid, :guid
9
-
10
9
  rule :target_type, :not_empty
10
+ rule :target, :not_nil
11
11
 
12
12
  rule :author, %i(not_empty diaspora_id)
13
13
  end
@@ -9,6 +9,7 @@ module DiasporaFederation
9
9
  rule :author, %i(not_empty diaspora_id)
10
10
  rule :guid, :guid
11
11
  rule :parent_guid, :guid
12
+ rule :parent, :not_nil
12
13
  end
13
14
  end
14
15
  end
@@ -7,8 +7,8 @@ module DiasporaFederation
7
7
  rule :author, %i(not_empty diaspora_id)
8
8
 
9
9
  rule :target_guid, :guid
10
-
11
10
  rule :target_type, :not_empty
11
+ rule :target, :not_nil
12
12
  end
13
13
  end
14
14
  end
@@ -2,23 +2,20 @@ module Validation
2
2
  module Rule
3
3
  # Diaspora ID validation rule
4
4
  #
5
- # This rule is based on https://github.com/zombor/Validator/blob/master/lib/validation/rule/email.rb
6
- # which was adapted from https://github.com/emmanuel/aequitas/blob/master/lib/aequitas/rule/format/email_address.rb
5
+ # A simple rule to validate the base structure of diaspora IDs.
7
6
  class DiasporaId
8
7
  # The Regex for a valid diaspora ID
9
8
  DIASPORA_ID = begin
10
9
  letter = "a-zA-Z"
11
10
  digit = "0-9"
11
+ hexadecimal = "[a-fA-F#{digit}]"
12
12
  username = "[#{letter}#{digit}\\-\\_\\.]+"
13
- atext = "[#{letter}#{digit}+\\=\\-\\_]"
14
- dot_atom = "#{atext}+([.]#{atext}*)*"
15
- no_ws_ctl = '\x01-\x08\x11\x12\x14-\x1f\x7f'
16
- text = '[\x01-\x09\x11\x12\x14-\x7f]'
17
- quoted_pair = "(\\x5c#{text})"
18
- dtext = "[#{no_ws_ctl}\\x21-\\x5a\\x5e-\\x7e]"
19
- dcontent = "(?:#{dtext}|#{quoted_pair})"
20
- domain_literal = "\\[#{dcontent}+\\]"
21
- domain = "(?:#{dot_atom}|#{domain_literal})"
13
+ hostname_part = "[#{letter}#{digit}\\-]"
14
+ hostname = "#{hostname_part}+([.]#{hostname_part}*)*"
15
+ ipv4 = "(?:[#{digit}]{1,3}\\.){3}[#{digit}]{1,3}"
16
+ ipv6 = "\\[(?:#{hexadecimal}{0,4}:){0,7}#{hexadecimal}{1,4}\\]"
17
+ ip_addr = "(?:#{ipv4}|#{ipv6})"
18
+ domain = "(?:#{hostname}|#{ip_addr})"
22
19
  port = "(:[#{digit}]+)?"
23
20
  addr_spec = "(#{username}\\@#{domain}#{port})?"
24
21
 
@@ -28,7 +28,7 @@ module Validation
28
28
  ids = value.split(";")
29
29
  return false unless ids.count <= params[:maximum]
30
30
  ids.each do |id|
31
- return false unless DiasporaId.new.valid_value?(id)
31
+ return false if DiasporaId::DIASPORA_ID.match(id).nil?
32
32
  end
33
33
  true
34
34
  end
@@ -6,8 +6,8 @@ module DiasporaFederation
6
6
  include Validation
7
7
 
8
8
  rule :target_guid, :guid
9
-
10
9
  rule :target_type, :not_empty
10
+ rule :target, :not_nil
11
11
 
12
12
  rule :author, %i(not_empty diaspora_id)
13
13
  end
@@ -8,6 +8,8 @@ module DiasporaFederation
8
8
 
9
9
  rule :guid, :guid
10
10
 
11
+ rule :photos, :not_nil
12
+
11
13
  rule :public, :boolean
12
14
  end
13
15
  end
@@ -12,8 +12,8 @@ module DiasporaFederation
12
12
  rule :alias_url, URI: %i(host path)
13
13
  rule :hcard_url, [:not_nil, URI: %i(host path)]
14
14
  rule :seed_url, %i(not_nil URI)
15
- rule :profile_url, [:not_nil, URI: %i(host path)]
16
- rule :atom_url, [:not_nil, URI: %i(host path)]
15
+ rule :profile_url, URI: %i(host path)
16
+ rule :atom_url, URI: %i(host path)
17
17
  rule :salmon_url, URI: %i(host path)
18
18
  end
19
19
  end
@@ -1,4 +1,4 @@
1
1
  module DiasporaFederation
2
2
  # the gem version
3
- VERSION = "0.0.13".freeze
3
+ VERSION = "0.1.0".freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diaspora_federation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Neff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2016-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '1.6'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.6.7.2
22
+ version: 1.6.8
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '1.6'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.6.7.2
32
+ version: 1.6.8
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: faraday
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +122,7 @@ files:
122
122
  - lib/diaspora_federation/entities/poll_participation.rb
123
123
  - lib/diaspora_federation/entities/post.rb
124
124
  - lib/diaspora_federation/entities/profile.rb
125
+ - lib/diaspora_federation/entities/related_entity.rb
125
126
  - lib/diaspora_federation/entities/relayable.rb
126
127
  - lib/diaspora_federation/entities/relayable_retraction.rb
127
128
  - lib/diaspora_federation/entities/request.rb
@@ -166,6 +167,7 @@ files:
166
167
  - lib/diaspora_federation/validators/poll_participation_validator.rb
167
168
  - lib/diaspora_federation/validators/poll_validator.rb
168
169
  - lib/diaspora_federation/validators/profile_validator.rb
170
+ - lib/diaspora_federation/validators/related_entity_validator.rb
169
171
  - lib/diaspora_federation/validators/relayable_retraction_validator.rb
170
172
  - lib/diaspora_federation/validators/relayable_validator.rb
171
173
  - lib/diaspora_federation/validators/request_validator.rb
@@ -186,7 +188,7 @@ files:
186
188
  - lib/tasks/build.rake
187
189
  - lib/tasks/diaspora_federation_tasks.rake
188
190
  - lib/tasks/tests.rake
189
- homepage: https://github.com/SuperTux88/diaspora_federation
191
+ homepage: https://github.com/diaspora/diaspora_federation
190
192
  licenses:
191
193
  - AGPL 3.0 - http://www.gnu.org/licenses/agpl-3.0.html
192
194
  metadata: {}
@@ -198,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
198
200
  requirements:
199
201
  - - "~>"
200
202
  - !ruby/object:Gem::Version
201
- version: '2.0'
203
+ version: '2.1'
202
204
  required_rubygems_version: !ruby/object:Gem::Requirement
203
205
  requirements:
204
206
  - - ">="
@@ -206,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
208
  version: '0'
207
209
  requirements: []
208
210
  rubyforge_project:
209
- rubygems_version: 2.4.6
211
+ rubygems_version: 2.4.8
210
212
  signing_key:
211
213
  specification_version: 4
212
214
  summary: diaspora* federation library