blob: 66dca3d72b09778b4d306b4544951c75e27ef772 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
helpers do
def fetch url, accept = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
p url
response = `/run/current-system/sw/bin/curl --fail-with-body -sSL -H 'Accept: #{accept}' #{url}`
halt 400 unless $?.success?
JSON.parse(response)
end
# https://github.com/mastodon/mastodon/blob/main/app/lib/request.rb
def send_signed object, url
keypair = OpenSSL::PKey::RSA.new(File.read('private.pem'))
date = Time.now.utc.httpdate
sha256 = OpenSSL::Digest::SHA256.new
body = object.to_json
digest = "SHA-256=" + sha256.base64digest(body)
host = URI.parse(url).host
inbox = fetch(url)["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 + '"'
#p url
puts `/run/current-system/sw/bin/curl --fail-with-body -sSL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}`
#puts `/run/current-system/sw/bin/curl -iL -X POST -H 'Content-Type: application/activity+json' -H 'Host: #{host}' -H 'Date: #{date}' -H 'Digest: #{digest}' -H 'Signature: #{signed_header}' -d '#{body}' #{inbox}`
end
end
|