Fix #2196 - Respond with 201 when Salmon accepted, 400 when unverified Fix #2629 - Correctly handle confirm_domain? for local accounts Unify rules for extracting author acct from XML, prefer <email>, fall back to <name> + <uri> (see also #2017, #2172)master
parent
dd9d57300b
commit
bafd22ecf4
@ -0,0 +1,21 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
module AuthorExtractor |
||||
def author_from_xml(xml) |
||||
# Try <email> for acct |
||||
acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: TagManager::XMLNS)&.content |
||||
|
||||
# Try <name> + <uri> |
||||
if acct.blank? |
||||
username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: TagManager::XMLNS)&.content |
||||
uri = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS)&.content |
||||
|
||||
return nil if username.blank? || uri.blank? |
||||
|
||||
domain = Addressable::URI.parse(uri).normalize.host |
||||
acct = "#{username}@#{domain}" |
||||
end |
||||
|
||||
FollowRemoteAccountService.new.call(acct) |
||||
end |
||||
end |
@ -0,0 +1,26 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class VerifySalmonService < BaseService |
||||
include AuthorExtractor |
||||
|
||||
def call(payload) |
||||
body = salmon.unpack(payload) |
||||
|
||||
xml = Nokogiri::XML(body) |
||||
xml.encoding = 'utf-8' |
||||
|
||||
account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)) |
||||
|
||||
if account.nil? |
||||
false |
||||
else |
||||
salmon.verify(payload, account.keypair) |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def salmon |
||||
@salmon ||= OStatus2::Salmon.new |
||||
end |
||||
end |
Loading…
Reference in new issue