HCard and WebFinger frozen after parsing

This commit is contained in:
Benjamin Neff 2015-07-09 02:16:11 +02:00
parent 88b67d9a83
commit 87509e7af2
4 changed files with 45 additions and 32 deletions

View file

@ -69,8 +69,11 @@ module DiasporaFederation
# for them. This key is used for signing messages. The format is a
# DER-encoded PKCS#1 key beginning with the text
# "-----BEGIN PUBLIC KEY-----" and ending with "-----END PUBLIC KEY-----".
#
# @note the public key is new in the hcard and is optional now.
#
# @return [String] public key
property :public_key
property :public_key, default: nil
# @!attribute [r] photo_large_url
# @return [String] url to the big avatar (300x300)
@ -160,24 +163,24 @@ module DiasporaFederation
def self.from_html(html_string)
doc = parse_html_and_validate(html_string)
hc = allocate
hc.instance_eval {
@guid = content_from_doc(doc, :uid)
@nickname = content_from_doc(doc, :nickname)
@full_name = content_from_doc(doc, :fn)
@url = element_from_doc(doc, :url)["href"]
@photo_large_url = photo_from_doc(doc, :photo)
@photo_medium_url = photo_from_doc(doc, :photo_medium)
@photo_small_url = photo_from_doc(doc, :photo_small)
@public_key = content_from_doc(doc, :key) unless element_from_doc(doc, :key).nil?
@searchable = content_from_doc(doc, :searchable) == "true"
data = {
guid: content_from_doc(doc, :uid),
nickname: content_from_doc(doc, :nickname),
full_name: content_from_doc(doc, :fn),
url: element_from_doc(doc, :url)["href"],
photo_large_url: photo_from_doc(doc, :photo),
photo_medium_url: photo_from_doc(doc, :photo_medium),
photo_small_url: photo_from_doc(doc, :photo_small),
searchable: (content_from_doc(doc, :searchable) == "true"),
# TODO: change me! ###################
@first_name = content_from_doc(doc, :given_name)
@last_name = content_from_doc(doc, :family_name)
first_name: content_from_doc(doc, :given_name),
last_name: content_from_doc(doc, :family_name)
#######################################
}
hc
# TODO: public key is new and can be missing
data[:public_key] = content_from_doc(doc, :key) unless element_from_doc(doc, :key).nil?
new(data)
end
private
@ -271,17 +274,20 @@ module DiasporaFederation
end
private_class_method :parse_html_and_validate
def element_from_doc(doc, selector)
def self.element_from_doc(doc, selector)
doc.at_css(SELECTORS[selector])
end
private_class_method :element_from_doc
def content_from_doc(doc, content_selector)
def self.content_from_doc(doc, content_selector)
element_from_doc(doc, content_selector).content
end
private_class_method :content_from_doc
def photo_from_doc(doc, photo_selector)
def self.photo_from_doc(doc, photo_selector)
element_from_doc(doc, photo_selector)["src"]
end
private_class_method :photo_from_doc
end
end
end

View file

@ -149,22 +149,19 @@ module DiasporaFederation
hcard_url, seed_url, guid, profile_url, atom_url, salmon_url, public_key = parse_links(data)
wf = allocate
wf.instance_eval {
@acct_uri = data[:subject]
@alias_url = data[:aliases].first
@hcard_url = hcard_url
@seed_url = seed_url
@profile_url = profile_url
@atom_url = atom_url
@salmon_url = salmon_url
new(
acct_uri: data[:subject],
alias_url: data[:aliases].first,
hcard_url: hcard_url,
seed_url: seed_url,
profile_url: profile_url,
atom_url: atom_url,
salmon_url: salmon_url,
# TODO: remove me! ##########
@guid = guid
@public_key = Base64.strict_decode64(public_key)
##############################
}
wf
guid: guid,
public_key: Base64.strict_decode64(public_key)
)
end
private

View file

@ -136,6 +136,11 @@ HTML
expect(hcard.last_name).to eq(person.last_name)
end
it "is frozen after parsing" do
hcard = WebFinger::HCard.from_html(html)
expect(hcard).to be_frozen
end
it "searchable is false, if it is empty in html" do
changed_html = html.sub(
"class=\"searchable\">#{person.searchable}<",

View file

@ -61,6 +61,11 @@ XML
expect(wf.public_key).to eq(person.serialized_public_key)
end
it "is frozen after parsing" do
wf = WebFinger::WebFinger.from_xml(xml)
expect(wf).to be_frozen
end
it "reads old-style XML" do
historic_xml = <<-XML
<?xml version="1.0" encoding="UTF-8"?>