Commit ee73d35e authored by Eugen Rochko's avatar Eugen Rochko

Incoming Salmon requests can be turned into follows and unfollows

parent fa337501
......@@ -11,3 +11,9 @@ The core ideals of this project are:
- Ease of deployment. The end-goal of this project is to be distributable as a Docker image.
**Current status of the project is early development. Documentation, licensing information &co will be added later**
## Configuration
- `LOCAL_DOMAIN` should be the domain/hostname of your instance. This is **absolutely required** as it is used for generating unique IDs for everything federation-related
- `LOCAL_HTTPS` set it to `true` if HTTPS works on your website. This is used to generate canonical URLs, which is also important when generating and parsing federation-related IDs
- `HUB_URL` should be the URL of the PubsubHubbub service that your instance is going to use. By default it is the open service of Superfeedr
class ProcessInteractionService
include ApplicationHelper
def call(envelope, target_account)
body = salmon.unpack(envelope)
xml = Nokogiri::XML(body)
return if !involves_target_account(xml, target_account) || xml.at_xpath('//xmlns:author/xmlns:name').nil? || xml.at_xpath('//xmlns:author/xmlns:uri').nil?
return unless involves_target_account?(xml, target_account) && contains_author?(xml)
username = xml.at_xpath('//xmlns:author/xmlns:name').content
url = xml.at_xpath('//xmlns:author/xmlns:uri').content
username = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').content
url = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').content
domain = Addressable::URI.parse(url).host
account = Account.find_by(username: username, domain: domain)
if account.nil?
account = follow_remote_account_service.("acct:#{username}@#{domain}")
return if account.nil?
end
if salmon.verify(envelope, account.keypair)
verb = xml.at_path('//activity:verb').content
case verb
when 'http://activitystrea.ms/schema/1.0/follow', 'follow'
case get_verb(xml)
when :follow
account.follow!(target_account)
when 'http://activitystrea.ms/schema/1.0/unfollow', 'unfollow'
when :unfollow
account.unfollow!(target_account)
when :favorite
# todo: a favourite
when :post
# todo: a reply
when :share
# todo: a reblog
end
end
end
private
def involves_target_account(target_account)
# todo
def contains_author?(xml)
!(xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name').nil? || xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri').nil?)
end
def involves_target_account?(xml, account)
targeted_at_account?(xml, account) || mentions_account?(xml, account)
end
def targeted_at_account?(xml, account)
target_id = xml.at_xpath('/xmlns:entry/activity:object/xmlns:id')
!target_id.nil? && target_id.content == profile_url(name: account.username)
end
def mentions_account?(xml, account)
xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]').each do |mention_link|
return true if mention_link.attribute('ref') == profile_url(name: account.username)
end
false
end
def get_verb(xml)
verb = xml.at_xpath('//activity:verb').content.gsub 'http://activitystrea.ms/schema/1.0/', ''
verb.to_sym
end
def salmon
......
LOCAL_DOMAIN = ENV['LOCAL_DOMAIN'] || 'localhost'
HUB_URL = ENV['HUB_URL'] || 'https://pubsubhubbub.superfeedr.com'
LOCAL_DOMAIN = ENV['LOCAL_DOMAIN'] || 'localhost'
HUB_URL = ENV['HUB_URL'] || 'https://pubsubhubbub.superfeedr.com'
CANONICAL_PROTOCOL = ENV['LOCAL_HTTPS'] == 'true' ? 'https://' : 'http://'
Rails.application.configure do
config.action_mailer.default_url_options = { host: LOCAL_DOMAIN }
config.action_mailer.default_url_options = { host: LOCAL_DOMAIN, protocol: CANONICAL_PROTOCOL }
end
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment