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.
- checksums.yaml +4 -4
- data/lib/diaspora_federation.rb +103 -18
- data/lib/diaspora_federation/discovery/discovery.rb +1 -1
- data/lib/diaspora_federation/discovery/h_card.rb +4 -5
- data/lib/diaspora_federation/discovery/host_meta.rb +1 -1
- data/lib/diaspora_federation/discovery/web_finger.rb +8 -8
- data/lib/diaspora_federation/discovery/xrd_document.rb +6 -7
- data/lib/diaspora_federation/entities.rb +21 -10
- data/lib/diaspora_federation/entities/account_deletion.rb +7 -3
- data/lib/diaspora_federation/entities/comment.rb +13 -10
- data/lib/diaspora_federation/entities/contact.rb +29 -0
- data/lib/diaspora_federation/entities/conversation.rb +5 -6
- data/lib/diaspora_federation/entities/like.rb +10 -18
- data/lib/diaspora_federation/entities/message.rb +6 -12
- data/lib/diaspora_federation/entities/participation.rb +8 -16
- data/lib/diaspora_federation/entities/person.rb +6 -2
- data/lib/diaspora_federation/entities/photo.rb +3 -3
- data/lib/diaspora_federation/entities/poll_participation.rb +6 -12
- data/lib/diaspora_federation/entities/post.rb +37 -0
- data/lib/diaspora_federation/entities/profile.rb +7 -3
- data/lib/diaspora_federation/entities/relayable.rb +169 -65
- data/lib/diaspora_federation/entities/relayable_retraction.rb +33 -32
- data/lib/diaspora_federation/entities/request.rb +20 -6
- data/lib/diaspora_federation/entities/reshare.rb +5 -27
- data/lib/diaspora_federation/entities/retraction.rb +6 -6
- data/lib/diaspora_federation/entities/signed_retraction.rb +32 -26
- data/lib/diaspora_federation/entities/status_message.rb +2 -22
- data/lib/diaspora_federation/entity.rb +137 -38
- data/lib/diaspora_federation/federation.rb +9 -0
- data/lib/diaspora_federation/federation/fetcher.rb +26 -0
- data/lib/diaspora_federation/federation/receiver.rb +41 -0
- data/lib/diaspora_federation/federation/receiver/abstract_receiver.rb +35 -0
- data/lib/diaspora_federation/federation/receiver/exceptions.rb +13 -0
- data/lib/diaspora_federation/federation/receiver/private.rb +15 -0
- data/lib/diaspora_federation/federation/receiver/public.rb +9 -0
- data/lib/diaspora_federation/federation/sender.rb +33 -0
- data/lib/diaspora_federation/federation/sender/hydra_wrapper.rb +92 -0
- data/lib/diaspora_federation/{fetcher.rb → http_client.rb} +6 -6
- data/lib/diaspora_federation/properties_dsl.rb +51 -14
- data/lib/diaspora_federation/salmon.rb +2 -1
- data/lib/diaspora_federation/salmon/aes.rb +1 -1
- data/lib/diaspora_federation/salmon/encrypted_magic_envelope.rb +61 -0
- data/lib/diaspora_federation/salmon/encrypted_slap.rb +69 -50
- data/lib/diaspora_federation/salmon/exceptions.rb +8 -14
- data/lib/diaspora_federation/salmon/magic_envelope.rb +80 -39
- data/lib/diaspora_federation/salmon/slap.rb +20 -51
- data/lib/diaspora_federation/salmon/xml_payload.rb +5 -104
- data/lib/diaspora_federation/validators.rb +22 -16
- data/lib/diaspora_federation/validators/account_deletion_validator.rb +1 -1
- data/lib/diaspora_federation/validators/comment_validator.rb +0 -4
- data/lib/diaspora_federation/validators/contact_validator.rb +13 -0
- data/lib/diaspora_federation/validators/conversation_validator.rb +2 -2
- data/lib/diaspora_federation/validators/like_validator.rb +1 -3
- data/lib/diaspora_federation/validators/message_validator.rb +0 -4
- data/lib/diaspora_federation/validators/participation_validator.rb +1 -5
- data/lib/diaspora_federation/validators/person_validator.rb +1 -1
- data/lib/diaspora_federation/validators/photo_validator.rb +2 -2
- data/lib/diaspora_federation/validators/poll_participation_validator.rb +0 -4
- data/lib/diaspora_federation/validators/profile_validator.rb +1 -1
- data/lib/diaspora_federation/validators/relayable_retraction_validator.rb +1 -1
- data/lib/diaspora_federation/validators/relayable_validator.rb +2 -0
- data/lib/diaspora_federation/validators/request_validator.rb +3 -2
- data/lib/diaspora_federation/validators/reshare_validator.rb +3 -3
- data/lib/diaspora_federation/validators/retraction_validator.rb +2 -2
- data/lib/diaspora_federation/validators/rules/guid.rb +16 -7
- data/lib/diaspora_federation/validators/signed_retraction_validator.rb +1 -1
- data/lib/diaspora_federation/validators/status_message_validator.rb +2 -2
- data/lib/diaspora_federation/version.rb +1 -1
- metadata +20 -11
- data/lib/diaspora_federation/receiver.rb +0 -28
- data/lib/diaspora_federation/receiver/private.rb +0 -19
- data/lib/diaspora_federation/receiver/public.rb +0 -13
- data/lib/diaspora_federation/signing.rb +0 -56
@@ -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 :
|
8
|
-
rule :
|
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 :
|
7
|
+
rule :root_author, %i(not_empty diaspora_id)
|
8
8
|
|
9
9
|
rule :root_guid, :guid
|
10
10
|
|
11
|
-
rule :
|
11
|
+
rule :author, %i(not_empty diaspora_id)
|
12
12
|
|
13
|
-
rule :
|
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 :
|
7
|
+
rule :author, %i(not_empty diaspora_id)
|
8
8
|
|
9
|
-
rule :
|
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
|
@@ -4,9 +4,9 @@ module DiasporaFederation
|
|
4
4
|
class StatusMessageValidator < Validation::Validator
|
5
5
|
include Validation
|
6
6
|
|
7
|
-
rule :
|
7
|
+
rule :author, %i(not_empty diaspora_id)
|
8
8
|
|
9
|
-
rule :
|
9
|
+
rule :guid, :guid
|
10
10
|
|
11
11
|
rule :public, :boolean
|
12
12
|
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.
|
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-
|
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.
|
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.
|
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
|
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
|
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/
|
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
|