diff options
Diffstat (limited to 'helpers.rb')
-rw-r--r-- | helpers.rb | 82 |
1 files changed, 43 insertions, 39 deletions
@@ -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 |