diaspora_federation 0.1.9 → 0.2.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +34 -0
  3. data/lib/diaspora_federation/discovery/discovery.rb +2 -2
  4. data/lib/diaspora_federation/discovery/h_card.rb +2 -10
  5. data/lib/diaspora_federation/discovery/host_meta.rb +1 -1
  6. data/lib/diaspora_federation/discovery/web_finger.rb +47 -87
  7. data/lib/diaspora_federation/discovery/xrd_document.rb +20 -7
  8. data/lib/diaspora_federation/entities/account_migration.rb +74 -0
  9. data/lib/diaspora_federation/entities/comment.rb +0 -4
  10. data/lib/diaspora_federation/entities/event_participation.rb +0 -8
  11. data/lib/diaspora_federation/entities/like.rb +6 -10
  12. data/lib/diaspora_federation/entities/message.rb +14 -49
  13. data/lib/diaspora_federation/entities/participation.rb +23 -13
  14. data/lib/diaspora_federation/entities/poll_participation.rb +0 -4
  15. data/lib/diaspora_federation/entities/profile.rb +5 -0
  16. data/lib/diaspora_federation/entities/related_entity.rb +17 -0
  17. data/lib/diaspora_federation/entities/relayable.rb +82 -113
  18. data/lib/diaspora_federation/entities/relayable_retraction.rb +4 -43
  19. data/lib/diaspora_federation/entities/request.rb +4 -12
  20. data/lib/diaspora_federation/entities/reshare.rb +11 -7
  21. data/lib/diaspora_federation/entities/retraction.rb +4 -5
  22. data/lib/diaspora_federation/entities/signable.rb +54 -0
  23. data/lib/diaspora_federation/entities/signed_retraction.rb +4 -44
  24. data/lib/diaspora_federation/entities.rb +2 -0
  25. data/lib/diaspora_federation/entity.rb +74 -96
  26. data/lib/diaspora_federation/federation/fetcher.rb +1 -1
  27. data/lib/diaspora_federation/federation/receiver.rb +1 -1
  28. data/lib/diaspora_federation/federation/sender/hydra_wrapper.rb +37 -12
  29. data/lib/diaspora_federation/federation/sender.rb +2 -2
  30. data/lib/diaspora_federation/parsers/base_parser.rb +61 -0
  31. data/lib/diaspora_federation/parsers/json_parser.rb +60 -0
  32. data/lib/diaspora_federation/parsers/relayable_json_parser.rb +25 -0
  33. data/lib/diaspora_federation/parsers/relayable_xml_parser.rb +22 -0
  34. data/lib/diaspora_federation/parsers/xml_parser.rb +84 -0
  35. data/lib/diaspora_federation/parsers.rb +13 -0
  36. data/lib/diaspora_federation/properties_dsl.rb +1 -1
  37. data/lib/diaspora_federation/salmon/encrypted_magic_envelope.rb +1 -1
  38. data/lib/diaspora_federation/salmon/encrypted_slap.rb +2 -99
  39. data/lib/diaspora_federation/salmon/magic_envelope.rb +3 -19
  40. data/lib/diaspora_federation/salmon/slap.rb +1 -42
  41. data/lib/diaspora_federation/salmon/xml_payload.rb +0 -19
  42. data/lib/diaspora_federation/schemas/federation_entities.json +379 -0
  43. data/lib/diaspora_federation/validators/account_deletion_validator.rb +1 -1
  44. data/lib/diaspora_federation/validators/account_migration_validator.rb +12 -0
  45. data/lib/diaspora_federation/validators/contact_validator.rb +2 -2
  46. data/lib/diaspora_federation/validators/conversation_validator.rb +1 -1
  47. data/lib/diaspora_federation/validators/event_validator.rb +1 -1
  48. data/lib/diaspora_federation/validators/h_card_validator.rb +2 -5
  49. data/lib/diaspora_federation/validators/message_validator.rb +1 -1
  50. data/lib/diaspora_federation/validators/participation_validator.rb +1 -1
  51. data/lib/diaspora_federation/validators/person_validator.rb +2 -2
  52. data/lib/diaspora_federation/validators/photo_validator.rb +1 -1
  53. data/lib/diaspora_federation/validators/profile_validator.rb +1 -1
  54. data/lib/diaspora_federation/validators/related_entity_validator.rb +1 -1
  55. data/lib/diaspora_federation/validators/relayable_validator.rb +1 -1
  56. data/lib/diaspora_federation/validators/reshare_validator.rb +2 -2
  57. data/lib/diaspora_federation/validators/retraction_validator.rb +1 -1
  58. data/lib/diaspora_federation/validators/rules/boolean.rb +2 -2
  59. data/lib/diaspora_federation/validators/status_message_validator.rb +1 -1
  60. data/lib/diaspora_federation/validators/web_finger_validator.rb +5 -6
  61. data/lib/diaspora_federation/validators.rb +1 -5
  62. data/lib/diaspora_federation/version.rb +1 -1
  63. data/lib/diaspora_federation.rb +6 -2
  64. metadata +14 -11
  65. data/lib/diaspora_federation/validators/relayable_retraction_validator.rb +0 -15
  66. data/lib/diaspora_federation/validators/request_validator.rb +0 -12
  67. data/lib/diaspora_federation/validators/signed_retraction_validator.rb +0 -15
  68. data/lib/tasks/build.rake +0 -14
  69. data/lib/tasks/diaspora_federation_tasks.rake +0 -4
  70. data/lib/tasks/rails4.rake +0 -15
  71. data/lib/tasks/tests.rake +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fb70171e9f0da5caca67a60e3e2a7a8533d4103
4
- data.tar.gz: 14afcd1f7fd459b80be5d5c67ca50f1ed305ac68
3
+ metadata.gz: 0143fd95b478d62bc2fb26b136df5103c0074fce
4
+ data.tar.gz: 919d5d547e686a4994305c8a42514762072784be
5
5
  SHA512:
6
- metadata.gz: 56d87b03ae620f4511ed66f36db940ab0e96dde88aa666ee81163a3809471235c93ef999d6292f47037a482d544a5eda2a5146dd40fafcaaf7542a3ea10fad25
7
- data.tar.gz: 38697f0098416ee7baea799dc87216e7059808101e8c0f5b79027c037ecadf2ec56e726553d70668533696d5c47a8b0030b80581caef44560a2a99d1de88f9a1
6
+ metadata.gz: 40f7824b9fa501dee9fe1683ec5ab33ee22e6da144d5a55d278252c4f365893ee9478ff97e9113ada59d9fb722ddb69fa35eaf63abdfc247200de63e05ba4418
7
+ data.tar.gz: fb88dd79852c1bb5ff77260165bdaca7ae10745205cd1baa2719033b43b7f8cba97ede1136e323e7f9e3c30121d08a32ee6065f71495759549e7c872acf96457
data/Changelog.md CHANGED
@@ -1,3 +1,37 @@
1
+ # 0.2.0
2
+
3
+ ## Features
4
+
5
+ * Add JSON support to entities [#52](https://github.com/diaspora/diaspora_federation/pull/52)
6
+ * Add `AccountMigration` entity [#54](https://github.com/diaspora/diaspora_federation/pull/54)
7
+ * Add `public` flag to `Profile` entity [#59](https://github.com/diaspora/diaspora_federation/pull/59)
8
+ * Allow to generate WebFinger with additional data [#61](https://github.com/diaspora/diaspora_federation/pull/61) [1b9dfc8](https://github.com/diaspora/diaspora_federation/commit/1b9dfc812e8b63c64a2d98db8999cae21d102c87)
9
+ * Provide RFC 7033 WebFinger [#63](https://github.com/diaspora/diaspora_federation/pull/63)
10
+ * Validate the author of the root post for a reshare [92ce4ea](https://github.com/diaspora/diaspora_federation/commit/92ce4eacf842f7a2fa74f298407062a4e0c891a3)
11
+
12
+ ## Refactor
13
+
14
+ * Replace `factory_girl` with `fabrication` [184954e](https://github.com/diaspora/diaspora_federation/commit/184954e09ce72242cb7ec06c15fed0ad7b6c57c6)
15
+ * Use `actionpack` as dependency instead of `rails` (for `diaspora_federation-rails`) [f860a62](https://github.com/diaspora/diaspora_federation/commit/f860a62382999dcf0adaf41a24b50b74611f6ed9)
16
+ * Remove old backward-compatibility from WebFinger [#60](https://github.com/diaspora/diaspora_federation/pull/60)
17
+ * Make optional properties optional when generating WebFinger [#61](https://github.com/diaspora/diaspora_federation/pull/61) [5fef763](https://github.com/diaspora/diaspora_federation/commit/5fef7633c3aaf47db2592749e506f40b581c0371)
18
+ * Make `Message` entity non-relayable (see [#36](https://github.com/diaspora/diaspora_federation/issues/36)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [b7167b9](https://github.com/diaspora/diaspora_federation/commit/b7167b9fde4d614fb8f7510720918e029d3624f4)
19
+ * Make `Participation` entity non-relayable (see [#35](https://github.com/diaspora/diaspora_federation/issues/35)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [41ebe13](https://github.com/diaspora/diaspora_federation/commit/41ebe13126a28b95dbe5acc5db3939ee9dae7e4b)
20
+ * Remove legacy signature order and order by property order in entity (see [#26](https://github.com/diaspora/diaspora_federation/issues/26)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [87033e4](https://github.com/diaspora/diaspora_federation/commit/87033e4cd63f7d237b9d02d95b739e971d205ea1)
21
+ * Send new property names in XML (see [#29](https://github.com/diaspora/diaspora_federation/issues/29)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [52a8c89](https://github.com/diaspora/diaspora_federation/commit/52a8c89d4c0f1f66b188ab4a2ac36ffafb0bfa1a)
22
+ * Send unwrapped entities (see [#28](https://github.com/diaspora/diaspora_federation/issues/28)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [221d87d](https://github.com/diaspora/diaspora_federation/commit/221d87d7fe664bde8718182178cb31ba532977c6)
23
+ * Send the raw magic envelope and new encrypted magic envelope with crypt-json-wrapper (see [#30](https://github.com/diaspora/diaspora_federation/issues/30)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [1f99518](https://github.com/diaspora/diaspora_federation/commit/1f99518706e6bef3dca51453bf571373cd389942) [e5b2ef7](https://github.com/diaspora/diaspora_federation/commit/e5b2ef71e8cfa299874e3f80175526b8999839f7)
24
+ * Remove sign-code and prevent creation of `SignedRetraction` and `RelayableRetraction` (see [#27](https://github.com/diaspora/diaspora_federation/issues/27)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [cd3a7ab](https://github.com/diaspora/diaspora_federation/commit/cd3a7abf4d778f7e3139bcb73a42a9dc4cbcb835)
25
+ * Rename `xml_order` to `signature_order` on relayables [b510ed8](https://github.com/diaspora/diaspora_federation/commit/b510ed868f12e15fd5c7b91909cc35281efeb10e)
26
+ * Prevent creation of `Request` entity (see [#32](https://github.com/diaspora/diaspora_federation/issues/32)) [#62](https://github.com/diaspora/diaspora_federation/pull/62) [deed1c3](https://github.com/diaspora/diaspora_federation/commit/deed1c3f3ea76658074a4e34f534a12f083e8622)
27
+ * Don't check `parent_author_signature` and don't check the `author_signature` when the author is the parent author for relayables (see [#64](https://github.com/diaspora/diaspora_federation/issues/64)) [#65](https://github.com/diaspora/diaspora_federation/pull/65) [6817579](https://github.com/diaspora/diaspora_federation/commit/681757907204885735bc60b18929938ec2ad04bb) [57edc8b](https://github.com/diaspora/diaspora_federation/commit/57edc8baabcf884b0ac5395266ffe148cff5da1d)
28
+ * Add `created_at` to `Comment` entity [#67](https://github.com/diaspora/diaspora_federation/pull/67)
29
+ * Improve logging when validation fails [c0ea38d](https://github.com/diaspora/diaspora_federation/commit/c0ea38d258ccd76a7499bff0197434d8e42768e8)
30
+
31
+ ## Bug fixes
32
+
33
+ * Fix issues when used without rails [ed2c2b7](https://github.com/diaspora/diaspora_federation/commit/ed2c2b7f47b91c308321076344459aee839318a8) [b25e229](https://github.com/diaspora/diaspora_federation/commit/b25e2293b0b83bc083bccdbf1523ee691dbb7b2e) [6615233](https://github.com/diaspora/diaspora_federation/commit/66152337f2b47c1cf6639646f55d21f69fe99708)
34
+
1
35
  # 0.1.9
2
36
 
3
37
  ## Bug fixes
@@ -74,10 +74,10 @@ module DiasporaFederation
74
74
 
75
75
  def person
76
76
  @person ||= Entities::Person.new(
77
- guid: hcard.guid || webfinger.guid,
77
+ guid: hcard.guid,
78
78
  diaspora_id: diaspora_id,
79
79
  url: webfinger.seed_url,
80
- exported_key: hcard.public_key || webfinger.public_key,
80
+ exported_key: hcard.public_key,
81
81
  profile: profile
82
82
  )
83
83
  end
@@ -160,15 +160,14 @@ module DiasporaFederation
160
160
  doc = parse_html_and_validate(html_string)
161
161
 
162
162
  new(
163
- guid: guid_from_doc(doc),
163
+ guid: content_from_doc(doc, :uid),
164
164
  nickname: content_from_doc(doc, :nickname),
165
165
  full_name: content_from_doc(doc, :fn),
166
166
  photo_large_url: photo_from_doc(doc, :photo),
167
167
  photo_medium_url: photo_from_doc(doc, :photo_medium),
168
168
  photo_small_url: photo_from_doc(doc, :photo_small),
169
169
  searchable: (content_from_doc(doc, :searchable) == "true"),
170
- # TODO: public key is new and can be missing
171
- public_key: (content_from_doc(doc, :key) unless element_from_doc(doc, :key).nil?),
170
+ public_key: content_from_doc(doc, :key),
172
171
 
173
172
  # TODO: remove first_name and last_name!
174
173
  first_name: content_from_doc(doc, :given_name),
@@ -276,13 +275,6 @@ module DiasporaFederation
276
275
  private_class_method def self.photo_from_doc(doc, photo_selector)
277
276
  element_from_doc(doc, photo_selector)["src"]
278
277
  end
279
-
280
- # @deprecated hack for old hcard
281
- # @todo remove this when all pods have the new generator
282
- private_class_method def self.guid_from_doc(doc)
283
- uid_element = element_from_doc(doc, :uid)
284
- uid_element.content unless uid_element[:class].include? "nickname"
285
- end
286
278
  end
287
279
  end
288
280
  end
@@ -26,7 +26,7 @@ module DiasporaFederation
26
26
  end
27
27
 
28
28
  # URL fragment to append to the base URL
29
- WEBFINGER_SUFFIX = "/webfinger?q={uri}".freeze
29
+ WEBFINGER_SUFFIX = "/.well-known/webfinger.xml?resource={uri}".freeze
30
30
 
31
31
  # Returns the WebFinger URL that was used to build this instance (either from
32
32
  # xml or by giving a base URL).
@@ -9,14 +9,11 @@ module DiasporaFederation
9
9
  # @example Creating a WebFinger document from a person hash
10
10
  # wf = WebFinger.new(
11
11
  # acct_uri: "acct:user@server.example",
12
- # alias_url: "https://server.example/people/0123456789abcdef",
13
12
  # hcard_url: "https://server.example/hcard/users/user",
14
13
  # seed_url: "https://server.example/",
15
14
  # profile_url: "https://server.example/u/user",
16
15
  # atom_url: "https://server.example/public/user.atom",
17
- # salmon_url: "https://server.example/receive/users/0123456789abcdef",
18
- # guid: "0123456789abcdef",
19
- # public_key: "-----BEGIN PUBLIC KEY-----\nABCDEF==\n-----END PUBLIC KEY-----"
16
+ # salmon_url: "https://server.example/receive/users/0123456789abcdef"
20
17
  # )
21
18
  # xml_string = wf.to_xml
22
19
  #
@@ -37,11 +34,6 @@ module DiasporaFederation
37
34
  # @return [String]
38
35
  property :acct_uri, :string
39
36
 
40
- # @!attribute [r] alias_url
41
- # @note could be nil
42
- # @return [String] link to the users profile
43
- property :alias_url, :string
44
-
45
37
  # @!attribute [r] hcard_url
46
38
  # @return [String] link to the +hCard+
47
39
  property :hcard_url, :string
@@ -52,7 +44,7 @@ module DiasporaFederation
52
44
 
53
45
  # @!attribute [r] profile_url
54
46
  # @return [String] link to the users profile
55
- property :profile_url, :string
47
+ property :profile_url, :string, default: nil
56
48
 
57
49
  # @!attribute [r] atom_url
58
50
  # This atom feed is an Activity Stream of the user's public posts. diaspora*
@@ -63,42 +55,18 @@ module DiasporaFederation
63
55
  # Note that this feed MAY also be made available through the PubSubHubbub
64
56
  # mechanism by supplying a <link rel="hub"> in the atom feed itself.
65
57
  # @return [String] atom feed url
66
- property :atom_url, :string
58
+ property :atom_url, :string, default: nil
67
59
 
68
60
  # @!attribute [r] salmon_url
69
61
  # @note could be nil
70
62
  # @return [String] salmon endpoint url
71
63
  # @see https://cdn.rawgit.com/salmon-protocol/salmon-protocol/master/draft-panzer-salmon-00.html#SMLR
72
64
  # Panzer draft for Salmon, paragraph 3.3
73
- property :salmon_url, :string
65
+ property :salmon_url, :string, default: nil
74
66
 
75
67
  # @!attribute [r] subscribe_url
76
68
  # This url is used to find another user on the home-pod of the user in the webfinger.
77
- property :subscribe_url, :string
78
-
79
- # @!attribute [r] guid
80
- # @deprecated Either convert these to +Property+ elements or move to the
81
- # +hCard+, which actually has fields for an +UID+ defined in the +vCard+
82
- # specification (will affect older diaspora* installations).
83
- #
84
- # @see HCard#guid
85
- # @see Entities::Person#guid
86
- # @return [String] guid
87
- property :guid, :string
88
-
89
- # @!attribute [r] public_key
90
- # @deprecated Either convert these to +Property+ elements or move to the
91
- # +hCard+, which actually has fields for an +KEY+ defined in the +vCard+
92
- # specification (will affect older diaspora* installations).
93
- #
94
- # @see HCard#public_key
95
- #
96
- # When a user is created on the pod, the pod MUST generate a pgp keypair
97
- # for them. This key is used for signing messages. The format is a
98
- # DER-encoded PKCS#1 key beginning with the text
99
- # "-----BEGIN PUBLIC KEY-----" and ending with "-----END PUBLIC KEY-----".
100
- # @return [String] public key
101
- property :public_key, :string
69
+ property :subscribe_url, :string, default: nil
102
70
 
103
71
  # +hcard_url+ link relation
104
72
  REL_HCARD = "http://microformats.org/profile/hcard".freeze
@@ -106,12 +74,6 @@ module DiasporaFederation
106
74
  # +seed_url+ link relation
107
75
  REL_SEED = "http://joindiaspora.com/seed_location".freeze
108
76
 
109
- # @deprecated This should be a +Property+ or moved to the +hCard+, but +Link+
110
- # is inappropriate according to the specification (will affect older
111
- # diaspora* installations).
112
- # +guid+ link relation
113
- REL_GUID = "http://joindiaspora.com/guid".freeze
114
-
115
77
  # +profile_url+ link relation.
116
78
  # @note This might just as well be an +Alias+ instead of a +Link+.
117
79
  REL_PROFILE = "http://webfinger.net/rel/profile-page".freeze
@@ -125,22 +87,31 @@ module DiasporaFederation
125
87
  # +subscribe_url+ link relation
126
88
  REL_SUBSCRIBE = "http://ostatus.org/schema/1.0/subscribe".freeze
127
89
 
128
- # @deprecated This should be a +Property+ or moved to the +hcard+, but +Link+
129
- # is inappropriate according to the specification (will affect older
130
- # diaspora* installations).
131
- # +pubkey+ link relation
132
- REL_PUBKEY = "diaspora-public-key".freeze
90
+ # Additional WebFinger data
91
+ # @return [Hash] additional elements
92
+ attr_reader :additional_data
93
+
94
+ # Initializes a new WebFinger Entity
95
+ #
96
+ # @param [Hash] data WebFinger data
97
+ # @param [Hash] additional_data additional WebFinger data
98
+ # @option additional_data [Array<String>] :aliases additional aliases
99
+ # @option additional_data [Hash] :properties properties
100
+ # @option additional_data [Array<Hash>] :links additional link elements
101
+ # @see DiasporaFederation::Entity#initialize
102
+ def initialize(data, additional_data={})
103
+ @additional_data = additional_data
104
+ super(data)
105
+ end
133
106
 
134
107
  # Creates the XML string from the current WebFinger instance
135
108
  # @return [String] XML string
136
109
  def to_xml
137
- doc = XrdDocument.new
138
- doc.subject = @acct_uri
139
- doc.aliases << @alias_url
140
-
141
- add_links_to(doc)
110
+ to_xrd.to_xml
111
+ end
142
112
 
143
- doc.to_xml
113
+ def to_json
114
+ to_xrd.to_json
144
115
  end
145
116
 
146
117
  # Creates a WebFinger instance from the given XML string
@@ -152,23 +123,16 @@ module DiasporaFederation
152
123
 
153
124
  links = data[:links]
154
125
 
155
- # TODO: remove! public key is deprecated in webfinger
156
- public_key = parse_link(links, REL_PUBKEY)
157
-
158
126
  new(
159
127
  acct_uri: data[:subject],
160
- alias_url: parse_alias(data[:aliases]),
128
+
161
129
  hcard_url: parse_link(links, REL_HCARD),
162
130
  seed_url: parse_link(links, REL_SEED),
163
131
  profile_url: parse_link(links, REL_PROFILE),
164
132
  atom_url: parse_link(links, REL_ATOM),
165
133
  salmon_url: parse_link(links, REL_SALMON),
166
134
 
167
- subscribe_url: parse_link_template(links, REL_SUBSCRIBE),
168
-
169
- # TODO: remove me! ##########
170
- guid: parse_link(links, REL_GUID),
171
- public_key: (Base64.strict_decode64(public_key) if public_key)
135
+ subscribe_url: parse_link_template(links, REL_SUBSCRIBE)
172
136
  )
173
137
  end
174
138
 
@@ -191,25 +155,31 @@ module DiasporaFederation
191
155
  end
192
156
  end
193
157
 
158
+ def to_xrd
159
+ XrdDocument.new.tap do |xrd|
160
+ xrd.subject = acct_uri
161
+ xrd.aliases.concat(additional_data[:aliases]) if additional_data[:aliases]
162
+ xrd.properties.merge!(additional_data[:properties]) if additional_data[:properties]
163
+
164
+ add_links_to(xrd)
165
+ end
166
+ end
167
+
194
168
  def add_links_to(doc)
195
- doc.links << {rel: REL_HCARD, type: "text/html", href: @hcard_url}
196
- doc.links << {rel: REL_SEED, type: "text/html", href: @seed_url}
169
+ doc.links << {rel: REL_HCARD, type: "text/html", href: hcard_url}
170
+ doc.links << {rel: REL_SEED, type: "text/html", href: seed_url}
197
171
 
198
- # TODO: remove me! ##############
199
- doc.links << {rel: REL_GUID, type: "text/html", href: @guid}
200
- ##################################
172
+ add_optional_links_to(doc)
201
173
 
202
- doc.links << {rel: REL_PROFILE, type: "text/html", href: @profile_url}
203
- doc.links << {rel: REL_ATOM, type: "application/atom+xml", href: @atom_url}
204
- doc.links << {rel: REL_SALMON, href: @salmon_url}
174
+ doc.links.concat(additional_data[:links]) if additional_data[:links]
175
+ end
205
176
 
206
- doc.links << {rel: REL_SUBSCRIBE, template: @subscribe_url}
177
+ def add_optional_links_to(doc)
178
+ doc.links << {rel: REL_PROFILE, type: "text/html", href: profile_url} if profile_url
179
+ doc.links << {rel: REL_ATOM, type: "application/atom+xml", href: atom_url} if atom_url
180
+ doc.links << {rel: REL_SALMON, href: salmon_url} if salmon_url
207
181
 
208
- # TODO: remove me! ##############
209
- doc.links << {rel: REL_PUBKEY,
210
- type: "RSA",
211
- href: Base64.strict_encode64(@public_key)}
212
- ##################################
182
+ doc.links << {rel: REL_SUBSCRIBE, template: subscribe_url} if subscribe_url
213
183
  end
214
184
 
215
185
  private_class_method def self.find_link(links, rel)
@@ -225,16 +195,6 @@ module DiasporaFederation
225
195
  element = find_link(links, rel)
226
196
  element ? element[:template] : nil
227
197
  end
228
-
229
- # This method is used to parse the alias_url from the XML.
230
- # * redmatrix has sometimes no alias, return nil
231
- # * old pods had quotes around the alias url, this can be removed later
232
- # * friendica has two aliases and the first is with "acct:": return only an URL starting with http (or https)
233
- private_class_method def self.parse_alias(aliases)
234
- return nil unless aliases
235
- # TODO: Old pods had quotes around alias. Remove the +map+ in next line, when all pods use this gem
236
- aliases.map {|a| a.gsub(/\A"|"\Z/, "") }.find {|a| a.start_with?("http") }
237
- end
238
198
  end
239
199
  end
240
200
  end
@@ -32,7 +32,7 @@ module DiasporaFederation
32
32
  XMLNS = "http://docs.oasis-open.org/ns/xri/xrd-1.0".freeze
33
33
 
34
34
  # +Link+ element attributes
35
- LINK_ATTRS = %i(rel type href template).freeze
35
+ LINK_ATTRS = %i[rel type href template].freeze
36
36
 
37
37
  # format string for datetime (+Expires+ element)
38
38
  DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ".freeze
@@ -69,9 +69,9 @@ module DiasporaFederation
69
69
  def to_xml
70
70
  Nokogiri::XML::Builder.new(encoding: "UTF-8") {|xml|
71
71
  xml.XRD("xmlns" => XMLNS) {
72
- xml.Expires(@expires.strftime(DATETIME_FORMAT)) if @expires.instance_of?(DateTime)
72
+ xml.Expires(expires.strftime(DATETIME_FORMAT)) if expires.instance_of?(DateTime)
73
73
 
74
- xml.Subject(@subject) if !@subject.nil? && !@subject.empty?
74
+ xml.Subject(subject) if !subject.nil? && !subject.empty?
75
75
 
76
76
  add_aliases_to(xml)
77
77
  add_properties_to(xml)
@@ -80,6 +80,16 @@ module DiasporaFederation
80
80
  }.to_xml
81
81
  end
82
82
 
83
+ def to_json
84
+ {
85
+ subject: subject,
86
+ expires: expires,
87
+ aliases: (aliases if aliases.any?),
88
+ links: (links if links.any?),
89
+ properties: (properties if properties.any?)
90
+ }.reject {|_, v| v.nil? }
91
+ end
92
+
83
93
  # Parse the XRD document from the given string and create a hash containing
84
94
  # the extracted data.
85
95
  #
@@ -107,23 +117,26 @@ module DiasporaFederation
107
117
 
108
118
  private
109
119
 
120
+ attr_reader :expires
121
+ attr_reader :subject
122
+
110
123
  NS = {xrd: XMLNS}.freeze
111
124
 
112
125
  def add_aliases_to(xml)
113
- @aliases.each do |a|
126
+ aliases.each do |a|
114
127
  next if !a.instance_of?(String) || a.empty?
115
128
  xml.Alias(a.to_s)
116
129
  end
117
130
  end
118
131
 
119
132
  def add_properties_to(xml)
120
- @properties.each do |type, val|
133
+ properties.each do |type, val|
121
134
  xml.Property(val.to_s, type: type)
122
135
  end
123
136
  end
124
137
 
125
138
  def add_links_to(xml)
126
- @links.each do |l|
139
+ links.each do |l|
127
140
  attrs = {}
128
141
  LINK_ATTRS.each do |attr|
129
142
  attrs[attr.to_s] = l[attr] if l.key?(attr)
@@ -135,7 +148,7 @@ module DiasporaFederation
135
148
  private_class_method def self.parse_xrd_document(xrd_doc)
136
149
  raise ArgumentError unless xrd_doc.instance_of?(String)
137
150
 
138
- doc = Nokogiri::XML::Document.parse(xrd_doc)
151
+ doc = Nokogiri::XML(xrd_doc)
139
152
  raise InvalidDocument, "Not an XRD document" if !doc.root || doc.root.name != "XRD"
140
153
  doc
141
154
  end
@@ -0,0 +1,74 @@
1
+ module DiasporaFederation
2
+ module Entities
3
+ # This entity is sent when a person changes their diaspora* ID (e.g. when a user migration
4
+ # from one to another pod happens).
5
+ #
6
+ # @see Validators::AccountMigrationValidator
7
+ class AccountMigration < Entity
8
+ include Signable
9
+
10
+ # @!attribute [r] author
11
+ # The old diaspora* ID of the person who changes their ID
12
+ # @see Person#author
13
+ # @return [String] author diaspora* ID
14
+ property :author, :string
15
+
16
+ # @!attribute [r] profile
17
+ # Holds new updated profile of a person, including diaspora* ID
18
+ # @return [Person] person new data
19
+ entity :profile, Entities::Profile
20
+
21
+ # @!attribute [r] signature
22
+ # Signature that validates original and target diaspora* IDs with the new key of person
23
+ # @return [String] signature
24
+ property :signature, :string, default: nil
25
+
26
+ # @return [String] string representation of this object
27
+ def to_s
28
+ "AccountMigration:#{author}:#{profile.author}"
29
+ end
30
+
31
+ # Shortcut for calling super method with sensible arguments
32
+ #
33
+ # @see DiasporaFederation::Entities::Signable#verify_signature
34
+ def verify_signature
35
+ super(profile.author, :signature)
36
+ end
37
+
38
+ # Calls super and additionally does signature verification for the instantiated entity.
39
+ #
40
+ # @see DiasporaFederation::Entity.from_hash
41
+ def self.from_hash(*args)
42
+ super.tap(&:verify_signature)
43
+ end
44
+
45
+ private
46
+
47
+ # @see DiasporaFederation::Entities::Signable#signature_data
48
+ def signature_data
49
+ to_s
50
+ end
51
+
52
+ def enriched_properties
53
+ super.tap do |hash|
54
+ hash[:signature] = signature || sign_with_new_key
55
+ end
56
+ end
57
+
58
+ # Sign with new user's key
59
+ # @raise [NewPrivateKeyNotFound] if the new user's private key is not found
60
+ # @return [String] A Base64 encoded signature of #signature_data with key
61
+ def sign_with_new_key
62
+ privkey = DiasporaFederation.callbacks.trigger(:fetch_private_key, profile.author)
63
+ raise NewPrivateKeyNotFound, "author=#{profile.author} obj=#{self}" if privkey.nil?
64
+ sign_with_key(privkey).tap do
65
+ logger.info "event=sign status=complete signature=signature author=#{profile.author} obj=#{self}"
66
+ end
67
+ end
68
+
69
+ # Raised, if creating the signature fails, because the new private key of a user was not found
70
+ class NewPrivateKeyNotFound < RuntimeError
71
+ end
72
+ end
73
+ end
74
+ end
@@ -4,10 +4,6 @@ module DiasporaFederation
4
4
  #
5
5
  # @see Validators::CommentValidator
6
6
  class Comment < Entity
7
- # Old signature order
8
- # @deprecated
9
- LEGACY_SIGNATURE_ORDER = %i(guid parent_guid text author).freeze
10
-
11
7
  # The {Comment} parent is a {Post}
12
8
  PARENT_TYPE = "Post".freeze
13
9
 
@@ -4,19 +4,11 @@ module DiasporaFederation
4
4
  #
5
5
  # @see Validators::EventParticipationValidator
6
6
  class EventParticipation < Entity
7
- # Old signature order
8
- # @deprecated
9
- LEGACY_SIGNATURE_ORDER = %i(author guid parent_guid status).freeze
10
-
11
7
  # The {EventParticipation} parent is an {Event}
12
8
  PARENT_TYPE = "Event".freeze
13
9
 
14
10
  include Relayable
15
11
 
16
- # Redefine the author property without +diaspora_handle+ +xml_name+
17
- # @deprecated Can be removed after XMLs are generated with new names
18
- property :author, :string
19
-
20
12
  # @!attribute [r] status
21
13
  # The participation status of the user
22
14
  # "accepted", "declined" or "tentative"
@@ -4,24 +4,20 @@ module DiasporaFederation
4
4
  #
5
5
  # @see Validators::LikeValidator
6
6
  class Like < Entity
7
- # Old signature order
8
- # @deprecated
9
- LEGACY_SIGNATURE_ORDER = %i(positive guid parent_type parent_guid author).freeze
10
-
11
7
  include Relayable
12
8
 
13
- # @!attribute [r] positive
14
- # If +true+ set a like, if +false+, set a dislike (dislikes are currently not
15
- # implemented in the diaspora* frontend).
16
- # @return [Boolean] is it a like or a dislike
17
- property :positive, :boolean
18
-
19
9
  # @!attribute [r] parent_type
20
10
  # A string describing the type of the parent
21
11
  # Can be "Post" or "Comment" (Comments are currently not implemented in the
22
12
  # diaspora* frontend).
23
13
  # @return [String] parent type
24
14
  property :parent_type, :string, xml_name: :target_type
15
+
16
+ # @!attribute [r] positive
17
+ # If +true+ set a like, if +false+, set a dislike (dislikes are currently not
18
+ # implemented in the diaspora* frontend).
19
+ # @return [Boolean] is it a like or a dislike
20
+ property :positive, :boolean
25
21
  end
26
22
  end
27
23
  end
@@ -4,11 +4,17 @@ module DiasporaFederation
4
4
  #
5
5
  # @see Validators::MessageValidator
6
6
  class Message < Entity
7
- # Old signature order
8
- # @deprecated
9
- LEGACY_SIGNATURE_ORDER = %i(guid parent_guid text created_at author conversation_guid).freeze
10
-
11
- include Relayable
7
+ # @!attribute [r] author
8
+ # The diaspora* ID of the author
9
+ # @see Person#author
10
+ # @return [String] diaspora* ID
11
+ property :author, :string, xml_name: :diaspora_handle
12
+
13
+ # @!attribute [r] guid
14
+ # A random string of at least 16 chars
15
+ # @see Validation::Rule::Guid
16
+ # @return [String] guid
17
+ property :guid, :string
12
18
 
13
19
  # @!attribute [r] text
14
20
  # Text of the message composed by a user
@@ -26,50 +32,9 @@ module DiasporaFederation
26
32
  # @return [String] conversation guid
27
33
  property :conversation_guid, :string
28
34
 
29
- # It is only valid to receive a {Message} from the author itself,
30
- # or from the author of the parent {Conversation} if the author signature is valid.
31
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
32
- def sender_valid?(sender)
33
- sender == author || (sender == parent_author && verify_author_signature)
34
- end
35
-
36
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
37
- def to_h
38
- super.tap {|hash| hash[:created_at] = created_at.utc.iso8601 }
39
- end
40
-
41
- private
42
-
43
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
44
- def verify_author_signature
45
- verify_signature(author, :author_signature)
46
- true
47
- end
48
-
49
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
50
- def parent_author
51
- parent = DiasporaFederation.callbacks.trigger(:fetch_related_entity, "Conversation", conversation_guid)
52
- raise Federation::Fetcher::NotFetchable, "parent of #{self} not found" unless parent
53
- parent.author
54
- end
55
-
56
- # old timestamp format, because this signature is only used from old pods which also relay with old format
57
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
58
- def normalize_property(name, value)
59
- if name == :created_at
60
- value.to_s
61
- else
62
- super
63
- end
64
- end
65
-
66
- # Default implementation, don't verify signatures for a {Message}.
67
- # @see Entity.populate_entity
68
- # @deprecated remove after {Message} doesn't include {Relayable} anymore
69
- # @param [Nokogiri::XML::Element] root_node xml nodes
70
- # @return [Entity] instance
71
- private_class_method def self.populate_entity(root_node)
72
- new({parent_guid: nil, parent: nil}.merge(entity_data(root_node)))
35
+ # @return [String] string representation of this object
36
+ def to_s
37
+ "#{super}:#{conversation_guid}"
73
38
  end
74
39
  end
75
40
  end