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
@@ -21,49 +21,20 @@ module DiasporaFederation
21
21
  # slap_xml = Slap.generate_xml(author_id, author_privkey, entity)
22
22
  #
23
23
  # @example Parsing a Salmon Slap
24
- # slap = Slap.from_xml(slap_xml)
25
- # author_pubkey = however_you_retrieve_the_authors_public_key(slap.author_id)
24
+ # entity = Slap.from_xml(slap_xml).payload
26
25
  #
27
- # entity = slap.entity(author_pubkey)
26
+ # @deprecated
28
27
  class Slap
29
- # the author of the slap
30
- # @overload author_id
31
- # @return [String] the author diaspora id
32
- # @overload author_id=
33
- # @param [String] the author diaspora id
34
- attr_accessor :author_id
35
-
36
- # the key and iv if it is an encrypted slap
37
- # @param [Hash] value hash containing the key and iv
38
- attr_writer :cipher_params
39
-
40
28
  # Namespaces
41
- NS = {d: Salmon::XMLNS, me: MagicEnvelope::XMLNS}
42
-
43
- # Returns new instance of the Entity that is contained within the XML of
44
- # this Slap.
45
- #
46
- # The first time this is called, a public key has to be specified to verify
47
- # the Magic Envelope signature. On repeated calls, the key may be omitted.
48
- #
49
- # @see MagicEnvelope.unenvelop
50
- #
51
- # @param [OpenSSL::PKey::RSA] pubkey public key for validating the signature
52
- # @return [Entity] entity instance from the XML
53
- # @raise [ArgumentError] if the public key is of the wrong type
54
- def entity(pubkey=nil)
55
- return @entity unless @entity.nil?
56
-
57
- raise ArgumentError unless pubkey.instance_of?(OpenSSL::PKey::RSA)
58
- @entity = MagicEnvelope.unenvelop(@magic_envelope, pubkey, @cipher_params)
59
- @entity
60
- end
29
+ NS = {d: Salmon::XMLNS, me: MagicEnvelope::XMLNS}.freeze
61
30
 
62
31
  # Parses an unencrypted Salmon XML string and returns a new instance of
63
- # {Slap} populated with the XML data.
32
+ # {MagicEnvelope} with the XML data.
64
33
  #
65
34
  # @param [String] slap_xml Salmon XML
66
- # @return [Slap] new Slap instance
35
+ #
36
+ # @return [MagicEnvelope] magic envelope instance with payload and sender
37
+ #
67
38
  # @raise [ArgumentError] if the argument is not a String
68
39
  # @raise [MissingAuthor] if the +author_id+ element is missing from the XML
69
40
  # @raise [MissingMagicEnvelope] if the +me:env+ element is missing from the XML
@@ -71,25 +42,23 @@ module DiasporaFederation
71
42
  raise ArgumentError unless slap_xml.instance_of?(String)
72
43
  doc = Nokogiri::XML::Document.parse(slap_xml)
73
44
 
74
- Slap.new.tap do |slap|
75
- author_elem = doc.at_xpath("d:diaspora/d:header/d:author_id", Slap::NS)
76
- raise MissingAuthor if author_elem.nil? || author_elem.content.empty?
77
- slap.author_id = author_elem.content
45
+ author_elem = doc.at_xpath("d:diaspora/d:header/d:author_id", Slap::NS)
46
+ raise MissingAuthor if author_elem.nil? || author_elem.content.empty?
47
+ sender = author_elem.content
78
48
 
79
- slap.add_magic_env_from_doc(doc)
80
- end
49
+ MagicEnvelope.unenvelop(magic_env_from_doc(doc), sender)
81
50
  end
82
51
 
83
52
  # Creates an unencrypted Salmon Slap and returns the XML string.
84
53
  #
85
54
  # @param [String] author_id Diaspora* handle of the author
86
- # @param [OpenSSL::PKey::RSA] pkey sender private_key for signing the magic envelope
55
+ # @param [OpenSSL::PKey::RSA] privkey sender private_key for signing the magic envelope
87
56
  # @param [Entity] entity payload
88
57
  # @return [String] Salmon XML string
89
58
  # @raise [ArgumentError] if any of the arguments is not the correct type
90
- def self.generate_xml(author_id, pkey, entity)
59
+ def self.generate_xml(author_id, privkey, entity)
91
60
  raise ArgumentError unless author_id.instance_of?(String) &&
92
- pkey.instance_of?(OpenSSL::PKey::RSA) &&
61
+ privkey.instance_of?(OpenSSL::PKey::RSA) &&
93
62
  entity.is_a?(Entity)
94
63
 
95
64
  build_xml do |xml|
@@ -97,7 +66,7 @@ module DiasporaFederation
97
66
  xml.author_id(author_id)
98
67
  }
99
68
 
100
- MagicEnvelope.new(pkey, entity).envelop(xml)
69
+ xml.parent << MagicEnvelope.new(entity, author_id).envelop(privkey)
101
70
  end
102
71
  end
103
72
 
@@ -107,22 +76,22 @@ module DiasporaFederation
107
76
  # {http://www.rubydoc.info/gems/nokogiri/Nokogiri/XML/Builder Nokogiri::XML::Builder}
108
77
  # @return [String] Slap XML
109
78
  def self.build_xml
110
- builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
79
+ Nokogiri::XML::Builder.new(encoding: "UTF-8") {|xml|
111
80
  xml.diaspora("xmlns" => Salmon::XMLNS, "xmlns:me" => MagicEnvelope::XMLNS) {
112
81
  yield xml
113
82
  }
114
- end
115
- builder.to_xml
83
+ }.to_xml
116
84
  end
117
85
 
118
86
  # Parses the magic envelop from the document.
119
87
  #
120
88
  # @param [Nokogiri::XML::Document] doc Salmon XML Document
121
- def add_magic_env_from_doc(doc)
122
- @magic_envelope = doc.at_xpath("d:diaspora/me:env", Slap::NS).tap do |env|
89
+ def self.magic_env_from_doc(doc)
90
+ doc.at_xpath("d:diaspora/me:env", Slap::NS).tap do |env|
123
91
  raise MissingMagicEnvelope if env.nil?
124
92
  end
125
93
  end
94
+ private_class_method :magic_env_from_doc
126
95
  end
127
96
  end
128
97
  end
@@ -11,6 +11,7 @@ module DiasporaFederation
11
11
  # </XML>
12
12
  #
13
13
  # (The +post+ element is there for historic reasons...)
14
+ # @deprecated
14
15
  module XmlPayload
15
16
  # Encapsulates an Entity inside the wrapping xml structure
16
17
  # and returns the XML Object.
@@ -39,122 +40,22 @@ module DiasporaFederation
39
40
  # @return [Entity] re-constructed Entity instance
40
41
  # @raise [ArgumentError] if the argument is not an
41
42
  # {http://www.rubydoc.info/gems/nokogiri/Nokogiri/XML/Element Nokogiri::XML::Element}
42
- # @raise [InvalidStructure] if the XML doesn't look like the wrapper XML
43
43
  # @raise [UnknownEntity] if the class for the entity contained inside the
44
44
  # XML can't be found
45
45
  def self.unpack(xml)
46
46
  raise ArgumentError, "only Nokogiri::XML::Element allowed" unless xml.instance_of?(Nokogiri::XML::Element)
47
- raise Salmon::InvalidStructure unless wrap_valid?(xml)
48
47
 
49
- data = xml.at_xpath("post/*[1]")
50
- klass_name = entity_class_name(data.name)
51
- raise Salmon::UnknownEntity, "'#{klass_name}' not found" unless Entities.const_defined?(klass_name)
48
+ data = xml_wrapped?(xml) ? xml.at_xpath("post/*[1]") : xml
52
49
 
53
- klass = Entities.const_get(klass_name)
54
- populate_entity(klass, data)
50
+ Entity.entity_class(data.name).from_xml(data)
55
51
  end
56
52
 
57
- private
58
-
59
53
  # @param [Nokogiri::XML::Element] element
60
- def self.wrap_valid?(element)
54
+ def self.xml_wrapped?(element)
61
55
  (element.name == "XML" && !element.at_xpath("post").nil? &&
62
56
  !element.at_xpath("post").children.empty?)
63
57
  end
64
- private_class_method :wrap_valid?
65
-
66
- # Transform the given String from the lowercase underscored version to a
67
- # camelized variant, used later for getting the Class constant.
68
- #
69
- # @param [String] term "snake_case" class name
70
- # @return [String] "CamelCase" class name
71
- def self.entity_class_name(term)
72
- term.to_s.tap do |string|
73
- raise Salmon::InvalidEntityName, "'#{string}' is invalid" unless string =~ /^[a-z]*(_[a-z]*)*$/
74
- string.sub!(/^[a-z]/, &:upcase)
75
- string.gsub!(/_([a-z])/) { Regexp.last_match[1].upcase }
76
- end
77
- end
78
- private_class_method :entity_class_name
79
-
80
- # Construct a new instance of the given Entity and populate the properties
81
- # with the attributes found in the XML.
82
- # Works recursively on nested Entities and Arrays thereof.
83
- #
84
- # @param [Class] klass entity class
85
- # @param [Nokogiri::XML::Element] root_node xml nodes
86
- # @return [Entity] instance
87
- def self.populate_entity(klass, root_node)
88
- # Use all known properties to build the Entity. All other elements are respected
89
- # and attached to resulted hash as string. It is intended to build a hash
90
- # invariable of an Entity definition, in order to support receiving objects
91
- # from the future versions of Diaspora, where new elements may have been added.
92
- data = Hash[root_node.element_children.map { |child|
93
- xml_name = child.name
94
- property = klass.class_props.find {|prop| prop[:xml_name].to_s == xml_name }
95
- if property
96
- parse_element_from_node(property[:name], property[:type], xml_name, root_node)
97
- else
98
- [xml_name, child.text]
99
- end
100
- }]
101
-
102
- if klass.included_modules.include?(Entities::Relayable)
103
- Entities::Relayable.verify_signatures(data, klass)
104
- end
105
-
106
- klass.new(data)
107
- end
108
- private_class_method :populate_entity
109
-
110
- # @param [Symbol] name property name
111
- # @param [Class] type target type to parse
112
- # @param [String] xml_name xml tag to parse
113
- # @param [Nokogiri::XML::Element] node XML node to parse
114
- # @return [Array<Symbol, Object>] parsed data
115
- def self.parse_element_from_node(name, type, xml_name, node)
116
- if type == String
117
- [name, parse_string_from_node(xml_name, node)]
118
- elsif type.instance_of?(Array)
119
- [name, parse_array_from_node(type, node)]
120
- elsif type.ancestors.include?(Entity)
121
- [name, parse_entity_from_node(type, node)]
122
- end
123
- end
124
- private_class_method :parse_element_from_node
125
-
126
- # create simple entry in data hash
127
- #
128
- # @param [String] name xml tag to parse
129
- # @param [Nokogiri::XML::Element] root_node XML root_node to parse
130
- # @return [String] data
131
- def self.parse_string_from_node(name, root_node)
132
- node = root_node.xpath(name.to_s)
133
- node.first.text if node.any?
134
- end
135
- private_class_method :parse_string_from_node
136
-
137
- # create an entry in the data hash for the nested entity
138
- #
139
- # @param [Class] type target type to parse
140
- # @param [Nokogiri::XML::Element] root_node XML node to parse
141
- # @return [Entity] parsed child entity
142
- def self.parse_entity_from_node(type, root_node)
143
- node = root_node.xpath(type.entity_name)
144
- populate_entity(type, node.first) if node.any?
145
- end
146
- private_class_method :parse_entity_from_node
147
-
148
- # collect all nested children of that type and create an array in the data hash
149
- #
150
- # @param [Array<Class>] type target type to parse
151
- # @param [Nokogiri::XML::Element] root_node XML node to parse
152
- # @return [Array<Entity>] array with parsed child entities
153
- def self.parse_array_from_node(type, root_node)
154
- node = root_node.xpath(type.first.entity_name)
155
- node.map {|child| populate_entity(type.first, child) }
156
- end
157
- private_class_method :parse_array_from_node
58
+ private_class_method :xml_wrapped?
158
59
  end
159
60
  end
160
61
  end
@@ -19,11 +19,11 @@ end
19
19
  require "diaspora_federation/validators/rules/birthday"
20
20
  require "diaspora_federation/validators/rules/boolean"
21
21
  require "diaspora_federation/validators/rules/diaspora_id"
22
+ require "diaspora_federation/validators/rules/diaspora_id_count"
22
23
  require "diaspora_federation/validators/rules/guid"
23
24
  require "diaspora_federation/validators/rules/not_nil"
24
25
  require "diaspora_federation/validators/rules/public_key"
25
26
  require "diaspora_federation/validators/rules/tag_count"
26
- require "diaspora_federation/validators/rules/diaspora_id_count"
27
27
 
28
28
  module DiasporaFederation
29
29
  # Validators to perform basic sanity-checks on {DiasporaFederation::Entities federation entities}.
@@ -34,25 +34,31 @@ module DiasporaFederation
34
34
  end
35
35
  end
36
36
 
37
+ # abstract types
37
38
  require "diaspora_federation/validators/relayable_validator"
39
+
40
+ # types
41
+ require "diaspora_federation/validators/account_deletion_validator"
42
+ require "diaspora_federation/validators/comment_validator"
43
+ require "diaspora_federation/validators/contact_validator"
44
+ require "diaspora_federation/validators/conversation_validator"
38
45
  require "diaspora_federation/validators/h_card_validator"
39
- require "diaspora_federation/validators/person_validator"
40
- require "diaspora_federation/validators/profile_validator"
41
- require "diaspora_federation/validators/web_finger_validator"
42
- require "diaspora_federation/validators/request_validator"
43
- require "diaspora_federation/validators/photo_validator"
44
- require "diaspora_federation/validators/location_validator"
45
- require "diaspora_federation/validators/status_message_validator"
46
- require "diaspora_federation/validators/participation_validator"
47
46
  require "diaspora_federation/validators/like_validator"
48
- require "diaspora_federation/validators/comment_validator"
49
- require "diaspora_federation/validators/account_deletion_validator"
47
+ require "diaspora_federation/validators/location_validator"
50
48
  require "diaspora_federation/validators/message_validator"
51
- require "diaspora_federation/validators/conversation_validator"
52
- require "diaspora_federation/validators/relayable_retraction_validator"
49
+ require "diaspora_federation/validators/participation_validator"
50
+ require "diaspora_federation/validators/person_validator"
51
+ require "diaspora_federation/validators/photo_validator"
52
+ require "diaspora_federation/validators/poll_answer_validator"
53
+ require "diaspora_federation/validators/poll_participation_validator"
54
+ require "diaspora_federation/validators/poll_validator"
55
+ require "diaspora_federation/validators/profile_validator"
53
56
  require "diaspora_federation/validators/reshare_validator"
54
57
  require "diaspora_federation/validators/retraction_validator"
58
+ require "diaspora_federation/validators/status_message_validator"
59
+ require "diaspora_federation/validators/web_finger_validator"
60
+
61
+ # deprecated
62
+ require "diaspora_federation/validators/relayable_retraction_validator"
63
+ require "diaspora_federation/validators/request_validator"
55
64
  require "diaspora_federation/validators/signed_retraction_validator"
56
- require "diaspora_federation/validators/poll_answer_validator"
57
- require "diaspora_federation/validators/poll_validator"
58
- require "diaspora_federation/validators/poll_participation_validator"
@@ -4,7 +4,7 @@ module DiasporaFederation
4
4
  class AccountDeletionValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :diaspora_id, %i(not_empty diaspora_id)
7
+ rule :author, %i(not_empty diaspora_id)
8
8
  end
9
9
  end
10
10
  end
@@ -4,14 +4,10 @@ module DiasporaFederation
4
4
  class CommentValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
8
-
9
7
  include RelayableValidator
10
8
 
11
9
  rule :text, [:not_empty,
12
10
  length: {maximum: 65_535}]
13
-
14
- rule :diaspora_id, %i(not_empty diaspora_id)
15
11
  end
16
12
  end
17
13
  end
@@ -0,0 +1,13 @@
1
+ module DiasporaFederation
2
+ module Validators
3
+ # This validates a {Entities::Contact}
4
+ class ContactValidator < Validation::Validator
5
+ include Validation
6
+
7
+ rule :author, %i(not_empty diaspora_id)
8
+ rule :recipient, %i(not_empty diaspora_id)
9
+ rule :following, :boolean
10
+ rule :sharing, :boolean
11
+ end
12
+ end
13
+ end
@@ -6,9 +6,9 @@ module DiasporaFederation
6
6
 
7
7
  rule :guid, :guid
8
8
 
9
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :author, %i(not_empty diaspora_id)
10
10
 
11
- rule :participant_ids, diaspora_id_count: {maximum: 20}
11
+ rule :participants, diaspora_id_count: {maximum: 20}
12
12
  end
13
13
  end
14
14
  end
@@ -4,11 +4,9 @@ module DiasporaFederation
4
4
  class LikeValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
8
-
9
7
  include RelayableValidator
10
8
 
11
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :parent_type, [:not_empty, regular_expression: {regex: /\A(Post|Comment)\z/}]
12
10
  end
13
11
  end
14
12
  end
@@ -4,12 +4,8 @@ module DiasporaFederation
4
4
  class MessageValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
8
-
9
7
  include RelayableValidator
10
8
 
11
- rule :diaspora_id, %i(not_empty diaspora_id)
12
-
13
9
  rule :conversation_guid, :guid
14
10
  end
15
11
  end
@@ -4,13 +4,9 @@ module DiasporaFederation
4
4
  class ParticipationValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
8
-
9
- rule :target_type, :not_empty
10
-
11
7
  include RelayableValidator
12
8
 
13
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :parent_type, [:not_empty, regular_expression: {regex: /\APost\z/}]
14
10
  end
15
11
  end
16
12
  end
@@ -6,7 +6,7 @@ module DiasporaFederation
6
6
 
7
7
  rule :guid, :guid
8
8
 
9
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :author, %i(not_empty diaspora_id)
10
10
 
11
11
  rule :url, %i(not_nil URI)
12
12
 
@@ -6,7 +6,7 @@ module DiasporaFederation
6
6
 
7
7
  rule :guid, :guid
8
8
 
9
- rule :diaspora_id, %i(not_empty diaspora_id)
9
+ rule :author, %i(not_empty diaspora_id)
10
10
 
11
11
  rule :public, :boolean
12
12
 
@@ -14,7 +14,7 @@ module DiasporaFederation
14
14
 
15
15
  rule :remote_photo_name, :not_empty
16
16
 
17
- rule :status_message_guid, :guid
17
+ rule :status_message_guid, guid: {nilable: true}
18
18
 
19
19
  rule :height, :numeric
20
20
 
@@ -4,12 +4,8 @@ module DiasporaFederation
4
4
  class PollParticipationValidator < Validation::Validator
5
5
  include Validation
6
6
 
7
- rule :guid, :guid
8
-
9
7
  include RelayableValidator
10
8
 
11
- rule :diaspora_id, %i(not_empty diaspora_id)
12
-
13
9
  rule :poll_answer_guid, :guid
14
10
  end
15
11
  end