diaspora_federation 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
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