Class: Smaak::Cavage04

Inherits:
Object
  • Object
show all
Defined in:
lib/smaak/cavage_04.rb

Constant Summary collapse

SPECIFICATION =
"https://datatracker.ietf.org/doc/draft-cavage-http-signatures/04/"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(adaptor) ⇒ Cavage04

Returns a new instance of Cavage04.

Raises:

  • (ArgumentError)


9
10
11
12
13
# File 'lib/smaak/cavage_04.rb', line 9

def initialize(adaptor)
  raise ArgumentError.new("Must provide a valid request adaptor") if adaptor.nil?
  @adaptor = adaptor
  @headers_to_be_signed = Smaak::Cavage04.headers_to_be_signed + Smaak.headers_to_be_signed
end

Instance Attribute Details

#adaptorObject (readonly)

Returns the value of attribute adaptor.



6
7
8
# File 'lib/smaak/cavage_04.rb', line 6

def adaptor
  @adaptor
end

#headers_to_be_signedObject (readonly)

Returns the value of attribute headers_to_be_signed.



7
8
9
# File 'lib/smaak/cavage_04.rb', line 7

def headers_to_be_signed
  @headers_to_be_signed
end

Class Method Details

.headers_to_be_signedObject



15
16
17
18
19
20
21
# File 'lib/smaak/cavage_04.rb', line 15

def self.headers_to_be_signed
  [ "(request-target)",
    "host",
    "date",
    "digest",
    "content-length" ]
end

Instance Method Details

#compile_auth_header(signature) ⇒ Object

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
30
31
# File 'lib/smaak/cavage_04.rb', line 23

def compile_auth_header(signature)
  raise ArgumentError.new("invalid signature") unless Smaak::Utils.non_blank_string?(signature)
  ordered_headers = ""
  @adaptor.each_header do |header, _value|
    ordered_headers = "#{ordered_headers} #{header}" if @headers_to_be_signed.include?(header)
  end
  ordered_headers = ordered_headers[1..ordered_headers.size]
  @adaptor.set_header("authorization", "Signature keyId=\"rsa-key-1\",algorithm=\"rsa-sha256\", headers=\"#{ordered_headers}\", signature=\"#{signature}\"")
end

#compile_signature_headers(auth_message) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/smaak/cavage_04.rb', line 33

def compile_signature_headers(auth_message)
  set_adaptor_headers(auth_message)

  signature_headers = ""
  @adaptor.each_header do |header, value|
    signature_headers = append_header(signature_headers, "#{header}: #{value}") if @headers_to_be_signed.include? header
  end
  signature_headers = prepend_header("(request-target)", "#{@adaptor.method.downcase} #{@adaptor.path}", signature_headers)
end

#extract_signatureObject



54
55
56
57
# File 'lib/smaak/cavage_04.rb', line 54

def extract_signature
  @adaptor.header("authorization") =~ /signature=\"([^"]*)\"/
  $1
end

#extract_signature_headersObject



43
44
45
46
47
48
49
50
51
52
# File 'lib/smaak/cavage_04.rb', line 43

def extract_signature_headers
  @adaptor.header("authorization") =~ /headers=\"([^"]*)\",/
  headers_order = $1.split(' ')
  
  signature_headers = ""
  headers_order.each do |header|
    signature_headers = append_header(signature_headers, "#{header}: #{@adaptor.header(header)}")
  end
  signature_headers = prepend_header("(request-target)", "#{@adaptor.method.downcase} #{@adaptor.path}", signature_headers)
end