diaspora_federation 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/lib/diaspora_federation.rb +23 -4
- data/lib/diaspora_federation/discovery.rb +14 -0
- data/lib/diaspora_federation/discovery/discovery.rb +94 -0
- data/lib/diaspora_federation/{web_finger → discovery}/exceptions.rb +5 -1
- data/lib/diaspora_federation/{web_finger → discovery}/h_card.rb +29 -25
- data/lib/diaspora_federation/{web_finger → discovery}/host_meta.rb +13 -13
- data/lib/diaspora_federation/{web_finger → discovery}/web_finger.rb +24 -28
- data/lib/diaspora_federation/{web_finger → discovery}/xrd_document.rb +10 -11
- data/lib/diaspora_federation/entities.rb +12 -0
- data/lib/diaspora_federation/entities/person.rb +33 -0
- data/lib/diaspora_federation/entities/profile.rb +54 -0
- data/lib/diaspora_federation/entity.rb +62 -30
- data/lib/diaspora_federation/fetcher.rb +42 -0
- data/lib/diaspora_federation/logging.rb +4 -2
- data/lib/diaspora_federation/properties_dsl.rb +11 -2
- data/lib/diaspora_federation/validators.rb +38 -0
- data/lib/diaspora_federation/validators/h_card_validator.rb +30 -0
- data/lib/diaspora_federation/validators/person_validator.rb +18 -0
- data/lib/diaspora_federation/validators/profile_validator.rb +33 -0
- data/lib/diaspora_federation/validators/rules/birthday.rb +38 -0
- data/lib/diaspora_federation/validators/rules/boolean.rb +38 -0
- data/lib/diaspora_federation/validators/rules/diaspora_id.rb +46 -0
- data/lib/diaspora_federation/validators/rules/guid.rb +28 -0
- data/lib/diaspora_federation/validators/rules/nilable_uri.rb +19 -0
- data/lib/diaspora_federation/validators/rules/not_nil.rb +23 -0
- data/lib/diaspora_federation/validators/rules/public_key.rb +33 -0
- data/lib/diaspora_federation/validators/rules/tag_count.rb +34 -0
- data/lib/diaspora_federation/validators/web_finger_validator.rb +20 -0
- data/lib/diaspora_federation/version.rb +1 -1
- metadata +82 -8
- data/lib/diaspora_federation/web_finger.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c09fc18228d8f509ac6ee451d3f86514112cc959
|
4
|
+
data.tar.gz: 7176641baf249258ad914643fb3d0ed07121e481
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb127f2108104ba7a3191af13f2620b8f308df88a67671d488a2f61243c4e04cc11e5f5eb1d31fe5ffda66dee7c35f10d8e6ed5edc995e20b966241f537c1517
|
7
|
+
data.tar.gz: 0b8222a2035a70e4b92f2d599ef0d5ab34c7a17a3ad7b811f203f86e956f80c849ddab90a555b911d50db095c8346b6ab185f95b492b3ecf7b999d47c4cbd244
|
data/README.md
CHANGED
@@ -43,16 +43,16 @@ DiasporaFederation.configure do |config|
|
|
43
43
|
config.server_uri = AppConfig.pod_uri
|
44
44
|
|
45
45
|
config.define_callbacks do
|
46
|
-
on :
|
47
|
-
person = Person.
|
46
|
+
on :fetch_person_for_webfinger do |diaspora_id|
|
47
|
+
person = Person.find_local_by_diaspora_id(diaspora_id)
|
48
48
|
if person
|
49
|
-
DiasporaFederation::
|
49
|
+
DiasporaFederation::Discovery::WebFinger.new(
|
50
50
|
# ...
|
51
51
|
)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
on :
|
55
|
+
on :fetch_person_for_hcard do |guid|
|
56
56
|
# ...
|
57
57
|
end
|
58
58
|
end
|
data/lib/diaspora_federation.rb
CHANGED
@@ -3,16 +3,22 @@ require "diaspora_federation/logging"
|
|
3
3
|
require "diaspora_federation/callbacks"
|
4
4
|
require "diaspora_federation/properties_dsl"
|
5
5
|
require "diaspora_federation/entity"
|
6
|
+
require "diaspora_federation/validators"
|
6
7
|
|
7
|
-
require "diaspora_federation/
|
8
|
+
require "diaspora_federation/fetcher"
|
9
|
+
|
10
|
+
require "diaspora_federation/entities"
|
11
|
+
|
12
|
+
require "diaspora_federation/discovery"
|
8
13
|
|
9
14
|
# diaspora* federation library
|
10
15
|
module DiasporaFederation
|
11
16
|
extend Logging
|
12
17
|
|
13
18
|
@callbacks = Callbacks.new %i(
|
14
|
-
|
15
|
-
|
19
|
+
fetch_person_for_webfinger
|
20
|
+
fetch_person_for_hcard
|
21
|
+
save_person_after_webfinger
|
16
22
|
)
|
17
23
|
|
18
24
|
class << self
|
@@ -30,6 +36,12 @@ module DiasporaFederation
|
|
30
36
|
# config.server_uri = AppConfig.pod_uri
|
31
37
|
attr_accessor :server_uri
|
32
38
|
|
39
|
+
# Set the bundle of certificate authorities (CA) certificates
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
# config.certificate_authorities = AppConfig.environment.certificate_authorities.get
|
43
|
+
attr_accessor :certificate_authorities
|
44
|
+
|
33
45
|
# configure the federation library
|
34
46
|
#
|
35
47
|
# @example
|
@@ -63,10 +75,17 @@ module DiasporaFederation
|
|
63
75
|
# called from after_initialize
|
64
76
|
# @raise [ConfigurationError] if the configuration is incomplete or invalid
|
65
77
|
def validate_config
|
66
|
-
configuration_error "Missing
|
78
|
+
configuration_error "server_uri: Missing or invalid" unless @server_uri.respond_to? :host
|
79
|
+
|
80
|
+
configuration_error "certificate_authorities: Not configured" if @certificate_authorities.nil?
|
81
|
+
unless File.file? @certificate_authorities
|
82
|
+
configuration_error "certificate_authorities: File not found: #{@certificate_authorities}"
|
83
|
+
end
|
84
|
+
|
67
85
|
unless @callbacks.definition_complete?
|
68
86
|
configuration_error "Missing handlers for #{@callbacks.missing_handlers.join(', ')}"
|
69
87
|
end
|
88
|
+
|
70
89
|
logger.info "successfully configured the federation library"
|
71
90
|
end
|
72
91
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DiasporaFederation
|
2
|
+
# This module provides the namespace for the various classes implementing
|
3
|
+
# WebFinger and other protocols used for metadata discovery on remote servers
|
4
|
+
# in the Diaspora* network.
|
5
|
+
module Discovery
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
require "diaspora_federation/discovery/exceptions"
|
10
|
+
require "diaspora_federation/discovery/xrd_document"
|
11
|
+
require "diaspora_federation/discovery/host_meta"
|
12
|
+
require "diaspora_federation/discovery/web_finger"
|
13
|
+
require "diaspora_federation/discovery/h_card"
|
14
|
+
require "diaspora_federation/discovery/discovery"
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module DiasporaFederation
|
2
|
+
module Discovery
|
3
|
+
# This class contains the logic to fetch all data for the given diaspora ID
|
4
|
+
class Discovery
|
5
|
+
include DiasporaFederation::Logging
|
6
|
+
|
7
|
+
# @return [String] the diaspora ID of the account
|
8
|
+
attr_reader :diaspora_id
|
9
|
+
|
10
|
+
# create a discovery class for the diaspora-id
|
11
|
+
# @param [String] diaspora_id the diaspora id to discover
|
12
|
+
def initialize(diaspora_id)
|
13
|
+
@diaspora_id = clean_diaspora_id(diaspora_id)
|
14
|
+
end
|
15
|
+
|
16
|
+
# fetch all metadata for the account and saves it via callback
|
17
|
+
# @return [Person]
|
18
|
+
def fetch_and_save
|
19
|
+
logger.info "Fetch data for #{diaspora_id}"
|
20
|
+
|
21
|
+
unless diaspora_id == clean_diaspora_id(webfinger.acct_uri)
|
22
|
+
raise DiscoveryError, "Diaspora ID does not match: Wanted #{diaspora_id} but got" \
|
23
|
+
" #{clean_diaspora_id(webfinger.acct_uri)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person)
|
27
|
+
logger.info "successfully webfingered #{diaspora_id}"
|
28
|
+
person
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def clean_diaspora_id(diaspora_id)
|
34
|
+
diaspora_id.strip.sub("acct:", "").to_s.downcase
|
35
|
+
end
|
36
|
+
|
37
|
+
def get(url, http_fallback=false)
|
38
|
+
logger.info "Fetching #{url} for #{diaspora_id}"
|
39
|
+
response = Fetcher.get(url)
|
40
|
+
raise "Failed to fetch #{url}: #{response.status}" unless response.success?
|
41
|
+
response.body
|
42
|
+
rescue => e
|
43
|
+
if http_fallback && url.start_with?("https://")
|
44
|
+
logger.warn "Retry with http: #{url} for #{diaspora_id}: #{e.class}: #{e.message}"
|
45
|
+
url.sub!("https://", "http://")
|
46
|
+
retry
|
47
|
+
else
|
48
|
+
raise DiscoveryError, "Failed to fetch #{url} for #{diaspora_id}: #{e.class}: #{e.message}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def host_meta_url
|
53
|
+
domain = diaspora_id.split("@")[1]
|
54
|
+
"https://#{domain}/.well-known/host-meta"
|
55
|
+
end
|
56
|
+
|
57
|
+
def legacy_webfinger_url_from_host_meta
|
58
|
+
# this tries the xrd url with https first, then falls back to http
|
59
|
+
host_meta = HostMeta.from_xml get(host_meta_url, true)
|
60
|
+
host_meta.webfinger_template_url.gsub("{uri}", "acct:#{diaspora_id}")
|
61
|
+
end
|
62
|
+
|
63
|
+
def webfinger
|
64
|
+
@webfinger ||= WebFinger.from_xml get(legacy_webfinger_url_from_host_meta)
|
65
|
+
end
|
66
|
+
|
67
|
+
def hcard
|
68
|
+
@hcard ||= HCard.from_html get(webfinger.hcard_url)
|
69
|
+
end
|
70
|
+
|
71
|
+
def person
|
72
|
+
@person ||= Entities::Person.new(
|
73
|
+
guid: hcard.guid || webfinger.guid,
|
74
|
+
diaspora_id: diaspora_id,
|
75
|
+
url: webfinger.seed_url,
|
76
|
+
exported_key: hcard.public_key || webfinger.public_key,
|
77
|
+
profile: profile
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
def profile
|
82
|
+
Entities::Profile.new(
|
83
|
+
diaspora_id: diaspora_id,
|
84
|
+
first_name: hcard.first_name,
|
85
|
+
last_name: hcard.last_name,
|
86
|
+
image_url: hcard.photo_large_url,
|
87
|
+
image_url_medium: hcard.photo_medium_url,
|
88
|
+
image_url_small: hcard.photo_small_url,
|
89
|
+
searchable: hcard.searchable
|
90
|
+
)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module DiasporaFederation
|
2
|
-
module
|
2
|
+
module Discovery
|
3
3
|
# Raised, if the XML structure is invalid
|
4
4
|
class InvalidDocument < RuntimeError
|
5
5
|
end
|
@@ -11,5 +11,9 @@ module DiasporaFederation
|
|
11
11
|
# * if the html passed to {HCard.from_html} in some way is malformed, invalid or incomplete.
|
12
12
|
class InvalidData < RuntimeError
|
13
13
|
end
|
14
|
+
|
15
|
+
# Raised, if there is an error while discover a new person
|
16
|
+
class DiscoveryError < RuntimeError
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module DiasporaFederation
|
2
|
-
module
|
2
|
+
module Discovery
|
3
3
|
# This class provides the means of generating an parsing account data to and
|
4
4
|
# from the hCard format.
|
5
5
|
# hCard is based on +RFC 2426+ (vCard) which got superseded by +RFC 6350+.
|
@@ -15,17 +15,17 @@ module DiasporaFederation
|
|
15
15
|
#
|
16
16
|
# @example Creating a hCard document from a person hash
|
17
17
|
# hc = HCard.new(
|
18
|
-
# guid:
|
19
|
-
# nickname:
|
20
|
-
# full_name:
|
21
|
-
# seed_url:
|
22
|
-
# photo_large_url:
|
23
|
-
# photo_medium_url:
|
24
|
-
# photo_small_url:
|
25
|
-
#
|
26
|
-
# searchable:
|
27
|
-
# first_name:
|
28
|
-
# last_name:
|
18
|
+
# guid: "0123456789abcdef",
|
19
|
+
# nickname: "user",
|
20
|
+
# full_name: "User Name",
|
21
|
+
# seed_url: "https://server.example/",
|
22
|
+
# photo_large_url: "https://server.example/uploads/l.jpg",
|
23
|
+
# photo_medium_url: "https://server.example/uploads/m.jpg",
|
24
|
+
# photo_small_url: "https://server.example/uploads/s.jpg",
|
25
|
+
# public_key: "-----BEGIN PUBLIC KEY-----\nABCDEF==\n-----END PUBLIC KEY-----",
|
26
|
+
# searchable: true,
|
27
|
+
# first_name: "User",
|
28
|
+
# last_name: "Name"
|
29
29
|
# )
|
30
30
|
# html_string = hc.to_html
|
31
31
|
#
|
@@ -48,12 +48,12 @@ module DiasporaFederation
|
|
48
48
|
property :guid
|
49
49
|
|
50
50
|
# @!attribute [r] nickname
|
51
|
-
# the first part of the diaspora
|
51
|
+
# the first part of the diaspora ID
|
52
52
|
# @return [String] nickname
|
53
53
|
property :nickname
|
54
54
|
|
55
55
|
# @!attribute [r] full_name
|
56
|
-
#
|
56
|
+
# @return [String] display name of the user
|
57
57
|
property :full_name
|
58
58
|
|
59
59
|
# @!attribute [r] url
|
@@ -70,10 +70,8 @@ module DiasporaFederation
|
|
70
70
|
# DER-encoded PKCS#1 key beginning with the text
|
71
71
|
# "-----BEGIN PUBLIC KEY-----" and ending with "-----END PUBLIC KEY-----".
|
72
72
|
#
|
73
|
-
# @note the public key is new in the hcard and is optional now.
|
74
|
-
#
|
75
73
|
# @return [String] public key
|
76
|
-
property :public_key
|
74
|
+
property :public_key
|
77
75
|
|
78
76
|
# @!attribute [r] photo_large_url
|
79
77
|
# @return [String] url to the big avatar (300x300)
|
@@ -163,8 +161,8 @@ module DiasporaFederation
|
|
163
161
|
def self.from_html(html_string)
|
164
162
|
doc = parse_html_and_validate(html_string)
|
165
163
|
|
166
|
-
|
167
|
-
guid:
|
164
|
+
new(
|
165
|
+
guid: guid_from_doc(doc),
|
168
166
|
nickname: content_from_doc(doc, :nickname),
|
169
167
|
full_name: content_from_doc(doc, :fn),
|
170
168
|
url: element_from_doc(doc, :url)["href"],
|
@@ -172,15 +170,13 @@ module DiasporaFederation
|
|
172
170
|
photo_medium_url: photo_from_doc(doc, :photo_medium),
|
173
171
|
photo_small_url: photo_from_doc(doc, :photo_small),
|
174
172
|
searchable: (content_from_doc(doc, :searchable) == "true"),
|
173
|
+
# TODO: public key is new and can be missing
|
174
|
+
public_key: (content_from_doc(doc, :key) unless element_from_doc(doc, :key).nil?),
|
175
175
|
|
176
|
-
# TODO:
|
176
|
+
# TODO: remove first_name and last_name!
|
177
177
|
first_name: content_from_doc(doc, :given_name),
|
178
178
|
last_name: content_from_doc(doc, :family_name)
|
179
|
-
|
180
|
-
}
|
181
|
-
# TODO: public key is new and can be missing
|
182
|
-
data[:public_key] = content_from_doc(doc, :key) unless element_from_doc(doc, :key).nil?
|
183
|
-
new(data)
|
179
|
+
)
|
184
180
|
end
|
185
181
|
|
186
182
|
private
|
@@ -288,6 +284,14 @@ module DiasporaFederation
|
|
288
284
|
element_from_doc(doc, photo_selector)["src"]
|
289
285
|
end
|
290
286
|
private_class_method :photo_from_doc
|
287
|
+
|
288
|
+
# @deprecated hack for old hcard
|
289
|
+
# @todo remove this when all pods have the new generator
|
290
|
+
def self.guid_from_doc(doc)
|
291
|
+
uid_element = element_from_doc(doc, :uid)
|
292
|
+
uid_element.content unless uid_element[:class].include? "nickname"
|
293
|
+
end
|
294
|
+
private_class_method :guid_from_doc
|
291
295
|
end
|
292
296
|
end
|
293
297
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
module DiasporaFederation
|
3
|
-
module
|
3
|
+
module Discovery
|
4
4
|
# Generates and parses Host Meta documents.
|
5
5
|
#
|
6
6
|
# This is a minimal implementation of the standard, only to the degree of what
|
@@ -19,8 +19,14 @@ module DiasporaFederation
|
|
19
19
|
class HostMeta
|
20
20
|
private_class_method :new
|
21
21
|
|
22
|
+
# create a new host-meta instance
|
23
|
+
# @param [String] webfinger_url the webfinger-url
|
24
|
+
def initialize(webfinger_url)
|
25
|
+
@webfinger_url = webfinger_url
|
26
|
+
end
|
27
|
+
|
22
28
|
# URL fragment to append to the base URL
|
23
|
-
WEBFINGER_SUFFIX = "webfinger?q={uri}"
|
29
|
+
WEBFINGER_SUFFIX = "/webfinger?q={uri}"
|
24
30
|
|
25
31
|
# Returns the WebFinger URL that was used to build this instance (either from
|
26
32
|
# xml or by giving a base URL).
|
@@ -42,18 +48,14 @@ module DiasporaFederation
|
|
42
48
|
|
43
49
|
# Builds a new HostMeta instance and constructs the WebFinger URL from the
|
44
50
|
# given base URL by appending HostMeta::WEBFINGER_SUFFIX.
|
51
|
+
# @param [String, URL] base_url the base-url for the webfinger-url
|
45
52
|
# @return [HostMeta]
|
46
53
|
# @raise [InvalidData] if the webfinger url is malformed
|
47
54
|
def self.from_base_url(base_url)
|
48
|
-
|
49
|
-
|
50
|
-
base_url += "/" unless base_url.end_with?("/")
|
51
|
-
webfinger_url = base_url + WEBFINGER_SUFFIX
|
55
|
+
webfinger_url = "#{base_url.to_s.chomp('/')}#{WEBFINGER_SUFFIX}"
|
52
56
|
raise InvalidData, "invalid webfinger url: #{webfinger_url}" unless webfinger_url_valid?(webfinger_url)
|
53
57
|
|
54
|
-
|
55
|
-
hm.instance_variable_set(:@webfinger_url, webfinger_url)
|
56
|
-
hm
|
58
|
+
new(webfinger_url)
|
57
59
|
end
|
58
60
|
|
59
61
|
# Reads the given Host Meta XML document string and populates the
|
@@ -67,16 +69,14 @@ module DiasporaFederation
|
|
67
69
|
webfinger_url = webfinger_url_from_xrd(data)
|
68
70
|
raise InvalidData, "invalid webfinger url: #{webfinger_url}" unless webfinger_url_valid?(webfinger_url)
|
69
71
|
|
70
|
-
|
71
|
-
hm.instance_variable_set(:@webfinger_url, webfinger_url)
|
72
|
-
hm
|
72
|
+
new(webfinger_url)
|
73
73
|
end
|
74
74
|
|
75
75
|
# Applies some basic sanity-checking to the given URL
|
76
76
|
# @param [String] url validation subject
|
77
77
|
# @return [Boolean] validation result
|
78
78
|
def self.webfinger_url_valid?(url)
|
79
|
-
!url.nil? && url.instance_of?(String) && url =~ %r{^https
|
79
|
+
!url.nil? && url.instance_of?(String) && url =~ %r{^https?:\/\/.*\/.*\{uri\}.*}i
|
80
80
|
end
|
81
81
|
private_class_method :webfinger_url_valid?
|
82
82
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module DiasporaFederation
|
2
|
-
module
|
2
|
+
module Discovery
|
3
3
|
# The WebFinger document used for Diaspora* user discovery is based on an older
|
4
4
|
# draft of the specification you can find in the wiki of the "webfinger" project
|
5
5
|
# on {http://code.google.com/p/webfinger/wiki/WebFingerProtocol Google Code}
|
@@ -147,20 +147,23 @@ module DiasporaFederation
|
|
147
147
|
def self.from_xml(webfinger_xml)
|
148
148
|
data = parse_xml_and_validate(webfinger_xml)
|
149
149
|
|
150
|
-
|
150
|
+
links = data[:links]
|
151
|
+
|
152
|
+
# TODO: remove! public key is deprecated in webfinger
|
153
|
+
public_key = parse_link(links, REL_PUBKEY)
|
151
154
|
|
152
155
|
new(
|
153
156
|
acct_uri: data[:subject],
|
154
|
-
alias_url: data[:aliases].first,
|
155
|
-
hcard_url:
|
156
|
-
seed_url:
|
157
|
-
profile_url:
|
158
|
-
atom_url:
|
159
|
-
salmon_url:
|
157
|
+
alias_url: clean_alias(data[:aliases].first),
|
158
|
+
hcard_url: parse_link(links, REL_HCARD),
|
159
|
+
seed_url: parse_link(links, REL_SEED),
|
160
|
+
profile_url: parse_link(links, REL_PROFILE),
|
161
|
+
atom_url: parse_link(links, REL_ATOM),
|
162
|
+
salmon_url: parse_link(links, REL_SALMON),
|
160
163
|
|
161
164
|
# TODO: remove me! ##########
|
162
|
-
guid:
|
163
|
-
public_key: Base64.strict_decode64(public_key)
|
165
|
+
guid: parse_link(links, REL_GUID),
|
166
|
+
public_key: (Base64.strict_decode64(public_key) if public_key)
|
164
167
|
)
|
165
168
|
end
|
166
169
|
|
@@ -172,10 +175,10 @@ module DiasporaFederation
|
|
172
175
|
# @return [Hash] data XML data
|
173
176
|
# @raise [InvalidData] if the given XML string is invalid or incomplete
|
174
177
|
def self.parse_xml_and_validate(webfinger_xml)
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
178
|
+
XrdDocument.xml_data(webfinger_xml).tap do |data|
|
179
|
+
valid = data.key?(:subject) && data.key?(:aliases) && data.key?(:links)
|
180
|
+
raise InvalidData, "webfinger xml is incomplete" unless valid
|
181
|
+
end
|
179
182
|
end
|
180
183
|
private_class_method :parse_xml_and_validate
|
181
184
|
|
@@ -209,22 +212,15 @@ module DiasporaFederation
|
|
209
212
|
##################################
|
210
213
|
end
|
211
214
|
|
212
|
-
def self.
|
213
|
-
|
214
|
-
|
215
|
-
seed = parse_link(links, REL_SEED)
|
216
|
-
guid = parse_link(links, REL_GUID)
|
217
|
-
profile = parse_link(links, REL_PROFILE)
|
218
|
-
atom = parse_link(links, REL_ATOM)
|
219
|
-
salmon = parse_link(links, REL_SALMON)
|
220
|
-
pubkey = parse_link(links, REL_PUBKEY)
|
221
|
-
raise InvalidData, "webfinger xml is incomplete" unless [hcard, seed, guid, profile, atom, salmon, pubkey].all?
|
222
|
-
[hcard[:href], seed[:href], guid[:href], profile[:href], atom[:href], salmon[:href], pubkey[:href]]
|
215
|
+
def self.parse_link(links, rel)
|
216
|
+
element = links.find {|l| l[:rel] == rel }
|
217
|
+
element ? element[:href] : nil
|
223
218
|
end
|
224
|
-
private_class_method :
|
219
|
+
private_class_method :parse_link
|
225
220
|
|
226
|
-
|
227
|
-
|
221
|
+
# @deprecated remove this, when all pods use this gem for generation
|
222
|
+
def self.clean_alias(alias_string)
|
223
|
+
alias_string.gsub(/\A"|"\Z/, "")
|
228
224
|
end
|
229
225
|
private_class_method :parse_link
|
230
226
|
end
|