diaspora_federation 0.0.12 → 0.0.13

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/lib/diaspora_federation.rb +103 -18
  3. data/lib/diaspora_federation/discovery/discovery.rb +1 -1
  4. data/lib/diaspora_federation/discovery/h_card.rb +4 -5
  5. data/lib/diaspora_federation/discovery/host_meta.rb +1 -1
  6. data/lib/diaspora_federation/discovery/web_finger.rb +8 -8
  7. data/lib/diaspora_federation/discovery/xrd_document.rb +6 -7
  8. data/lib/diaspora_federation/entities.rb +21 -10
  9. data/lib/diaspora_federation/entities/account_deletion.rb +7 -3
  10. data/lib/diaspora_federation/entities/comment.rb +13 -10
  11. data/lib/diaspora_federation/entities/contact.rb +29 -0
  12. data/lib/diaspora_federation/entities/conversation.rb +5 -6
  13. data/lib/diaspora_federation/entities/like.rb +10 -18
  14. data/lib/diaspora_federation/entities/message.rb +6 -12
  15. data/lib/diaspora_federation/entities/participation.rb +8 -16
  16. data/lib/diaspora_federation/entities/person.rb +6 -2
  17. data/lib/diaspora_federation/entities/photo.rb +3 -3
  18. data/lib/diaspora_federation/entities/poll_participation.rb +6 -12
  19. data/lib/diaspora_federation/entities/post.rb +37 -0
  20. data/lib/diaspora_federation/entities/profile.rb +7 -3
  21. data/lib/diaspora_federation/entities/relayable.rb +169 -65
  22. data/lib/diaspora_federation/entities/relayable_retraction.rb +33 -32
  23. data/lib/diaspora_federation/entities/request.rb +20 -6
  24. data/lib/diaspora_federation/entities/reshare.rb +5 -27
  25. data/lib/diaspora_federation/entities/retraction.rb +6 -6
  26. data/lib/diaspora_federation/entities/signed_retraction.rb +32 -26
  27. data/lib/diaspora_federation/entities/status_message.rb +2 -22
  28. data/lib/diaspora_federation/entity.rb +137 -38
  29. data/lib/diaspora_federation/federation.rb +9 -0
  30. data/lib/diaspora_federation/federation/fetcher.rb +26 -0
  31. data/lib/diaspora_federation/federation/receiver.rb +41 -0
  32. data/lib/diaspora_federation/federation/receiver/abstract_receiver.rb +35 -0
  33. data/lib/diaspora_federation/federation/receiver/exceptions.rb +13 -0
  34. data/lib/diaspora_federation/federation/receiver/private.rb +15 -0
  35. data/lib/diaspora_federation/federation/receiver/public.rb +9 -0
  36. data/lib/diaspora_federation/federation/sender.rb +33 -0
  37. data/lib/diaspora_federation/federation/sender/hydra_wrapper.rb +92 -0
  38. data/lib/diaspora_federation/{fetcher.rb → http_client.rb} +6 -6
  39. data/lib/diaspora_federation/properties_dsl.rb +51 -14
  40. data/lib/diaspora_federation/salmon.rb +2 -1
  41. data/lib/diaspora_federation/salmon/aes.rb +1 -1
  42. data/lib/diaspora_federation/salmon/encrypted_magic_envelope.rb +61 -0
  43. data/lib/diaspora_federation/salmon/encrypted_slap.rb +69 -50
  44. data/lib/diaspora_federation/salmon/exceptions.rb +8 -14
  45. data/lib/diaspora_federation/salmon/magic_envelope.rb +80 -39
  46. data/lib/diaspora_federation/salmon/slap.rb +20 -51
  47. data/lib/diaspora_federation/salmon/xml_payload.rb +5 -104
  48. data/lib/diaspora_federation/validators.rb +22 -16
  49. data/lib/diaspora_federation/validators/account_deletion_validator.rb +1 -1
  50. data/lib/diaspora_federation/validators/comment_validator.rb +0 -4
  51. data/lib/diaspora_federation/validators/contact_validator.rb +13 -0
  52. data/lib/diaspora_federation/validators/conversation_validator.rb +2 -2
  53. data/lib/diaspora_federation/validators/like_validator.rb +1 -3
  54. data/lib/diaspora_federation/validators/message_validator.rb +0 -4
  55. data/lib/diaspora_federation/validators/participation_validator.rb +1 -5
  56. data/lib/diaspora_federation/validators/person_validator.rb +1 -1
  57. data/lib/diaspora_federation/validators/photo_validator.rb +2 -2
  58. data/lib/diaspora_federation/validators/poll_participation_validator.rb +0 -4
  59. data/lib/diaspora_federation/validators/profile_validator.rb +1 -1
  60. data/lib/diaspora_federation/validators/relayable_retraction_validator.rb +1 -1
  61. data/lib/diaspora_federation/validators/relayable_validator.rb +2 -0
  62. data/lib/diaspora_federation/validators/request_validator.rb +3 -2
  63. data/lib/diaspora_federation/validators/reshare_validator.rb +3 -3
  64. data/lib/diaspora_federation/validators/retraction_validator.rb +2 -2
  65. data/lib/diaspora_federation/validators/rules/guid.rb +16 -7
  66. data/lib/diaspora_federation/validators/signed_retraction_validator.rb +1 -1
  67. data/lib/diaspora_federation/validators/status_message_validator.rb +2 -2
  68. data/lib/diaspora_federation/version.rb +1 -1
  69. metadata +20 -11
  70. data/lib/diaspora_federation/receiver.rb +0 -28
  71. data/lib/diaspora_federation/receiver/private.rb +0 -19
  72. data/lib/diaspora_federation/receiver/public.rb +0 -13
  73. data/lib/diaspora_federation/signing.rb +0 -56
@@ -4,7 +4,7 @@ module DiasporaFederation
4
4
  class ProfileValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :diaspora_id, :diaspora_id
7
+ rule :author, :diaspora_id
8
8
 
9
9
  # the name must not contain a semicolon because of mentions
10
10
  # @{<full_name> ; <diaspora_id>}
@@ -9,7 +9,7 @@ module DiasporaFederation
9
9
 
10
10
  rule :target_type, :not_empty
11
11
 
12
- rule :diaspora_id, %i(not_empty diaspora_id)
12
+ rule :author, %i(not_empty diaspora_id)
13
13
  end
14
14
  end
15
15
  end
@@ -6,6 +6,8 @@ module DiasporaFederation
6
6
  # @param [Validation::Validator] validator the validator in which it is included
7
7
  def self.included(validator)
8
8
  validator.class_eval do
9
+ rule :author, %i(not_empty diaspora_id)
10
+ rule :guid, :guid
9
11
  rule :parent_guid, :guid
10
12
  end
11
13
  end
@@ -1,11 +1,12 @@
1
1
  module DiasporaFederation
2
2
  module Validators
3
3
  # This validates a {Entities::Request}
4
+ # @deprecated the {Entities::Request} will be replaced with {Entities::Contact}
4
5
  class RequestValidator < Validation::Validator
5
6
  include Validation
6
7
 
7
- rule :sender_id, %i(not_empty diaspora_id)
8
- rule :recipient_id, %i(not_empty diaspora_id)
8
+ rule :author, %i(not_empty diaspora_id)
9
+ rule :recipient, %i(not_empty diaspora_id)
9
10
  end
10
11
  end
11
12
  end
@@ -4,13 +4,13 @@ module DiasporaFederation
4
4
  class ReshareValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :root_diaspora_id, %i(not_empty diaspora_id)
7
+ rule :root_author, %i(not_empty diaspora_id)
8
8
 
9
9
  rule :root_guid, :guid
10
10
 
11
- rule :guid, :guid
11
+ rule :author, %i(not_empty diaspora_id)
12
12
 
13
- rule :diaspora_id, %i(not_empty diaspora_id)
13
+ rule :guid, :guid
14
14
 
15
15
  rule :public, :boolean
16
16
  end
@@ -4,9 +4,9 @@ module DiasporaFederation
4
4
  class RetractionValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :target_guid, :guid
7
+ rule :author, %i(not_empty diaspora_id)
8
8
 
9
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :target_guid, :guid
10
10
 
11
11
  rule :target_type, :not_empty
12
12
  end
@@ -7,6 +7,21 @@ module Validation
7
7
  # * Numbers: 0-9
8
8
  # * Special chars: '-', '_', '@', '.' and ':'
9
9
  class Guid
10
+ # This rule can have a +nilable+ param
11
+ # @return [Hash] params
12
+ attr_reader :params
13
+
14
+ # create a new rule for guid validation
15
+ # @param [Hash] params
16
+ # @option params [Boolean] :nilable guid allowed to be nil
17
+ def initialize(params={})
18
+ if params.include?(:nilable) && !params[:nilable].is_a?(TrueClass) && !params[:nilable].is_a?(FalseClass)
19
+ raise ArgumentError, ":nilable needs to be a boolean"
20
+ end
21
+
22
+ @params = params
23
+ end
24
+
10
25
  # The error key for this rule
11
26
  # @return [Symbol] error key
12
27
  def error_key
@@ -15,13 +30,7 @@ module Validation
15
30
 
16
31
  # Determines if value is a valid +GUID+
17
32
  def valid_value?(value)
18
- value.is_a?(String) && value.downcase =~ /\A[0-9a-z\-_@.:]{16,}\z/
19
- end
20
-
21
- # This rule has no params
22
- # @return [Hash] params
23
- def params
24
- {}
33
+ params[:nilable] && value.nil? || value.is_a?(String) && value.downcase =~ /\A[0-9a-z\-_@.:]{16,}\z/
25
34
  end
26
35
  end
27
36
  end
@@ -9,7 +9,7 @@ module DiasporaFederation
9
9
 
10
10
  rule :target_type, :not_empty
11
11
 
12
- rule :diaspora_id, %i(not_empty diaspora_id)
12
+ rule :author, %i(not_empty diaspora_id)
13
13
  end
14
14
  end
15
15
  end
@@ -4,9 +4,9 @@ module DiasporaFederation
4
4
  class StatusMessageValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
7
+ rule :author, %i(not_empty diaspora_id)
8
8
 
9
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :guid, :guid
10
10
 
11
11
  rule :public, :boolean
12
12
  end
@@ -1,4 +1,4 @@
1
1
  module DiasporaFederation
2
2
  # the gem version
3
- VERSION = "0.0.12"
3
+ VERSION = "0.0.13".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.12
4
+ version: 0.0.13
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-01-23 00:00:00.000000000 Z
11
+ date: 2016-03-25 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.1
22
+ version: 1.6.7.2
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.1
32
+ version: 1.6.7.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: faraday
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0.7'
67
+ version: '1.0'
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0.7'
74
+ version: '1.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: valid
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -109,6 +109,7 @@ files:
109
109
  - lib/diaspora_federation/entities.rb
110
110
  - lib/diaspora_federation/entities/account_deletion.rb
111
111
  - lib/diaspora_federation/entities/comment.rb
112
+ - lib/diaspora_federation/entities/contact.rb
112
113
  - lib/diaspora_federation/entities/conversation.rb
113
114
  - lib/diaspora_federation/entities/like.rb
114
115
  - lib/diaspora_federation/entities/location.rb
@@ -119,6 +120,7 @@ files:
119
120
  - lib/diaspora_federation/entities/poll.rb
120
121
  - lib/diaspora_federation/entities/poll_answer.rb
121
122
  - lib/diaspora_federation/entities/poll_participation.rb
123
+ - lib/diaspora_federation/entities/post.rb
122
124
  - lib/diaspora_federation/entities/profile.rb
123
125
  - lib/diaspora_federation/entities/relayable.rb
124
126
  - lib/diaspora_federation/entities/relayable_retraction.rb
@@ -128,23 +130,30 @@ files:
128
130
  - lib/diaspora_federation/entities/signed_retraction.rb
129
131
  - lib/diaspora_federation/entities/status_message.rb
130
132
  - lib/diaspora_federation/entity.rb
131
- - lib/diaspora_federation/fetcher.rb
133
+ - lib/diaspora_federation/federation.rb
134
+ - lib/diaspora_federation/federation/fetcher.rb
135
+ - lib/diaspora_federation/federation/receiver.rb
136
+ - lib/diaspora_federation/federation/receiver/abstract_receiver.rb
137
+ - lib/diaspora_federation/federation/receiver/exceptions.rb
138
+ - lib/diaspora_federation/federation/receiver/private.rb
139
+ - lib/diaspora_federation/federation/receiver/public.rb
140
+ - lib/diaspora_federation/federation/sender.rb
141
+ - lib/diaspora_federation/federation/sender/hydra_wrapper.rb
142
+ - lib/diaspora_federation/http_client.rb
132
143
  - lib/diaspora_federation/logging.rb
133
144
  - lib/diaspora_federation/properties_dsl.rb
134
- - lib/diaspora_federation/receiver.rb
135
- - lib/diaspora_federation/receiver/private.rb
136
- - lib/diaspora_federation/receiver/public.rb
137
145
  - lib/diaspora_federation/salmon.rb
138
146
  - lib/diaspora_federation/salmon/aes.rb
147
+ - lib/diaspora_federation/salmon/encrypted_magic_envelope.rb
139
148
  - lib/diaspora_federation/salmon/encrypted_slap.rb
140
149
  - lib/diaspora_federation/salmon/exceptions.rb
141
150
  - lib/diaspora_federation/salmon/magic_envelope.rb
142
151
  - lib/diaspora_federation/salmon/slap.rb
143
152
  - lib/diaspora_federation/salmon/xml_payload.rb
144
- - lib/diaspora_federation/signing.rb
145
153
  - lib/diaspora_federation/validators.rb
146
154
  - lib/diaspora_federation/validators/account_deletion_validator.rb
147
155
  - lib/diaspora_federation/validators/comment_validator.rb
156
+ - lib/diaspora_federation/validators/contact_validator.rb
148
157
  - lib/diaspora_federation/validators/conversation_validator.rb
149
158
  - lib/diaspora_federation/validators/h_card_validator.rb
150
159
  - lib/diaspora_federation/validators/like_validator.rb
@@ -1,28 +0,0 @@
1
- module DiasporaFederation
2
- # Raised if failed to fetch a public key of the sender of the received message
3
- class SenderKeyNotFound < Exception
4
- end
5
-
6
- # Raised if recipient private key is missing for a private receive
7
- class RecipientKeyNotFound < Exception
8
- end
9
-
10
- # Common base for Private and Public receivers
11
- # @see Receiver::Public
12
- # @see Receiver::Private
13
- class Receiver
14
- def initialize(salmon_xml)
15
- @salmon_xml = salmon_xml
16
- end
17
-
18
- def receive!
19
- sender_id = slap.author_id
20
- public_key = DiasporaFederation.callbacks.trigger(:fetch_public_key_by_diaspora_id, sender_id)
21
- raise SenderKeyNotFound if public_key.nil?
22
- DiasporaFederation.callbacks.trigger(:save_entity_after_receive, slap.entity(public_key))
23
- end
24
- end
25
- end
26
-
27
- require "diaspora_federation/receiver/private"
28
- require "diaspora_federation/receiver/public"
@@ -1,19 +0,0 @@
1
- module DiasporaFederation
2
- class Receiver
3
- # Receiver::Private is used to receive private messages, which are addressed to a specific user, encrypted with his
4
- # public key and packed using Salmon::EncryptedSlap
5
- class Private < Receiver
6
- def initialize(salmon_xml, recipient_private_key)
7
- super(salmon_xml)
8
- raise RecipientKeyNotFound if recipient_private_key.nil?
9
- @recipient_private_key = recipient_private_key
10
- end
11
-
12
- protected
13
-
14
- def slap
15
- @salmon ||= Salmon::EncryptedSlap.from_xml(@salmon_xml, @recipient_private_key)
16
- end
17
- end
18
- end
19
- end
@@ -1,13 +0,0 @@
1
- module DiasporaFederation
2
- class Receiver
3
- # Receiver::Public is used to receive public messages, which are not addressed to a specific user, unencrypted
4
- # and packed using Salmon::Slap
5
- class Public < Receiver
6
- protected
7
-
8
- def slap
9
- @salmon ||= Salmon::Slap.from_xml(@salmon_xml)
10
- end
11
- end
12
- end
13
- end
@@ -1,56 +0,0 @@
1
- module DiasporaFederation
2
- # this module defines operations of signing an arbitrary hash with an arbitrary key
3
- module Signing
4
- extend Logging
5
-
6
- # Sign the data with the key
7
- #
8
- # @param [Hash] hash data to sign
9
- # @param [OpenSSL::PKey::RSA] key An RSA key
10
- # @return [String] A Base64 encoded signature of #signable_string with key
11
- def self.sign_with_key(hash, key)
12
- sig = Base64.strict_encode64(
13
- key.sign(
14
- OpenSSL::Digest::SHA256.new,
15
- signable_string(hash)
16
- )
17
- )
18
- logger.info "event=sign_with_key status=complete guid=#{hash[:guid]}"
19
- sig
20
- end
21
-
22
- # Check that signature is a correct signature
23
- #
24
- # @param [Hash] hash data to verify
25
- # @param [String] signature The signature to be verified.
26
- # @param [OpenSSL::PKey::RSA] key An RSA key
27
- # @return [Boolean]
28
- def self.verify_signature(hash, signature, key)
29
- if key.nil?
30
- logger.warn "event=verify_signature status=abort reason=no_key guid=#{hash[:guid]}"
31
- return false
32
- elsif signature.nil?
33
- logger.warn "event=verify_signature status=abort reason=no_signature guid=#{hash[:guid]}"
34
- return false
35
- end
36
-
37
- validity = key.verify(
38
- OpenSSL::Digest::SHA256.new,
39
- Base64.decode64(signature),
40
- signable_string(hash)
41
- )
42
- logger.info "event=verify_signature status=complete guid=#{hash[:guid]} validity=#{validity}"
43
- validity
44
- end
45
-
46
- private
47
-
48
- # @param [Hash] hash data to sign
49
- # @return [String] signature data string
50
- def self.signable_string(hash)
51
- hash.map { |name, value|
52
- value.to_s unless name.match(/signature/)
53
- }.compact.join(";")
54
- end
55
- end
56
- end