summaryrefslogtreecommitdiff
path: root/helpers.rb
diff options
context:
space:
mode:
Diffstat (limited to 'helpers.rb')
-rw-r--r--helpers.rb82
1 files changed, 43 insertions, 39 deletions
diff --git a/helpers.rb b/helpers.rb
index a51ea3d..fdbd894 100644
--- a/helpers.rb
+++ b/helpers.rb
@@ -1,78 +1,82 @@
-helpers do
+# frozen_string_literal: true
- def curl ext, url
+require 'English'
+helpers do
+ def curl(ext, url)
+ p url
response = `/run/current-system/sw/bin/curl --fail-with-body -sSL #{ext} #{url}`
- $?.success? ? response : nil
+ $CHILD_STATUS.success? ? response : nil
end
- def fetch url, accept = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
+ # def fetch(url, accept = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"')
+ def fetch(url, accept = 'application/activity+json')
response = curl("-H 'Accept: #{accept}'", url)
response ? JSON.parse(response) : nil
end
# https://github.com/mastodon/mastodon/blob/main/app/lib/request.rb
- def send_signed object#, url
-
+ # , url
+ def send_signed(object)
keypair = OpenSSL::PKey::RSA.new(File.read('private.pem'))
date = Time.now.utc.httpdate
body = object.to_json
- sha256 = OpenSSL::Digest::SHA256.new
- digest = "SHA-256=" + sha256.base64digest(body)
- jj object
- #(object['to'] + object['cc'] + object['bto'] + object['bcc']).uniq.each do |url|
- object['to'].uniq.each do |url|
- unless url == 'https://www.w3.org/ns/activitystreams#Public'
- host = URI.parse(url).host
- inbox = fetch(url)["inbox"]
- if inbox
- request_uri = URI(inbox).request_uri
+ sha256 = OpenSSL::Digest.new('SHA256')
+ digest = "SHA-256=#{sha256.base64digest(body)}"
+ recipients = [object['to'], object['cc'], object['bto'], object['bcc'], object['audience']].flatten.compact.uniq
+ recipients.each do |url|
+ next if url == 'https://www.w3.org/ns/activitystreams#Public'
+
+ host = URI.parse(url).host
+ inbox = fetch(url)['inbox']
+ if inbox
+ request_uri = URI(inbox).request_uri
- signed_string = "(request-target): post #{request_uri}\nhost: #{host}\ndate: #{date}\ndigest: #{digest}\ncontent-type: application/activity+json"
- signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))
- signed_header = 'keyId="' + ACTOR + '#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="' + signature + '"'
+ signed_string = "(request-target): post #{request_uri}\nhost: #{host}\ndate: #{date}\ndigest: #{digest}\ncontent-type: application/activity+json"
+ signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))
+ signed_header = "keyId=\"#{ACTOR}#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest content-type\",signature=\"#{signature}\""
- p curl("-X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}'", inbox)
- #$?.success?
- else
- p "No inbox for #{url}"
- end
+ curl(
+ "-X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}'", inbox
+ )
+ else
+ p "No inbox for #{url}"
end
end
-
end
def people
- File.read('cache/people.tsv').split("\n").collect {|l| l.chomp.split("\t")}
+ File.read('cache/people.tsv').split("\n").collect { |l| l.chomp.split("\t") }
end
- def mention actor
- person = people.select{|p| p[1] == actor}
+ def mention(actor)
+ person = people.select { |p| p[1] == actor }
if person.empty?
a = fetch(actor)
return nil unless a
- mention = "#{a["preferredUsername"]}@#{URI(actor).host}"
- File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"}
+
+ mention = "#{a['preferredUsername']}@#{URI(actor).host}"
+ File.open('cache/people.tsv', 'a') { |f| f.puts "#{mention}\t#{actor}" }
mention
else
person[0][0]
end
end
- def actor mention
+ def actor(mention)
mention = mention.sub(/^@/, '').chomp
- actors = people.select{|p| p[0] == mention}
+ actors = people.select { |p| p[0] == mention }
if actors.empty?
- user, server = mention.split("@")
- a = fetch("https://#{server}/.well-known/webfinger?resource=acct:#{mention}", "application/jrd+json")
+ _, server = mention.split('@')
+ a = fetch("https://#{server}/.well-known/webfinger?resource=acct:#{mention}", 'application/jrd+json')
return nil unless a
- actor = a["links"].select { |l|
- l["rel"] == "self"
- }[0]["href"]
- File.open('cache/people.tsv','a'){|f| f.puts "#{mention}\t#{actor}"}
+
+ actor = a['links'].select do |l|
+ l['rel'] == 'self'
+ end[0]['href']
+ File.open('cache/people.tsv', 'a') { |f| f.puts "#{mention}\t#{actor}" }
actor
else
actors[0][1]
end
end
-
end