Module: Smaak

Defined in:
lib/smaak.rb,
lib/smaak/utils.rb,
lib/smaak/client.rb,
lib/smaak/crypto.rb,
lib/smaak/server.rb,
lib/smaak/version.rb,
lib/smaak/associate.rb,
lib/smaak/cavage_04.rb,
lib/smaak/auth_message.rb,
lib/smaak/smaak_service.rb,
lib/smaak/adaptors/rack_adaptor.rb,
lib/smaak/adaptors/net_http_adaptor.rb

Defined Under Namespace

Classes: Associate, AuthMessage, Cavage04, Client, Crypto, NetHttpAdaptor, RackAdaptor, Server, SmaakService, Utils

Constant Summary collapse

DEFAULT_TOKEN_LIFE =
2
VERSION =
"0.2.2"
@@adaptors =
{ Net::HTTPRequest => NetHttpAdaptor, Rack::Request => RackAdaptor}

Class Method Summary collapse

Class Method Details

.adaptorsObject



25
26
27
# File 'lib/smaak.rb', line 25

def self.adaptors
  @@adaptors
end

.add_request_adaptor(request_clazz, adaptor_clazz) ⇒ Object



29
30
31
# File 'lib/smaak.rb', line 29

def self.add_request_adaptor(request_clazz, adaptor_clazz)
  @@adaptors[request_clazz] = adaptor_clazz
end

.create_adaptor(request) ⇒ Object

Raises:

  • (ArgumentError)


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

def self.create_adaptor(request)
  @@adaptors.each do |r, a|
    return a.new(request) if request.is_a? r
  end
  raise ArgumentError.new("Unknown request class #{request.class}. Add an adaptor using Smaak.add_request_adaptor.")
end

.headers_to_be_signedObject



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

def self.headers_to_be_signed
  [ "x-smaak-recipient",
    "x-smaak-identifier",
    "x-smaak-route-info",
    "x-smaak-psk",
    "x-smaak-expires",
    "x-smaak-nonce",
    "x-smaak-encrypt" ]
end

.select_specification(adaptor, specification) ⇒ Object

Raises:

  • (ArgumentError)


40
41
42
43
44
# File 'lib/smaak.rb', line 40

def self.select_specification(adaptor, specification)
  raise ArgumentError.new("Adaptor must be provided") if adaptor.nil?
  return Cavage04.new(adaptor) if specification == Smaak::Cavage04::SPECIFICATION
  raise ArgumentError.new("Unknown specification")
end

.sign_authorization_headers(key, auth_message, adaptor, specification = Smaak::Cavage04::SPECIFICATION) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/smaak.rb', line 46

def self.sign_authorization_headers(key, auth_message, adaptor, specification = Smaak::Cavage04::SPECIFICATION)
  specification = Smaak.select_specification(adaptor, specification)

  signature_headers = specification.compile_signature_headers(auth_message)
  signature_data = Smaak::Crypto.sign_data(signature_headers, key)
  signature = Smaak::Crypto.encode64(signature_data)
  specification.compile_auth_header(signature)
  specification.adaptor
end

.verify_authorization_headers(adaptor, pubkey) ⇒ Object

Raises:

  • (ArgumentError)


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/smaak.rb', line 56

def self.verify_authorization_headers(adaptor, pubkey)
  raise ArgumentError.new("Key is required") if pubkey.nil?
  signature_headers, signature = Smaak.get_signature_data_from_request(adaptor)
  if signature.nil?
    puts "[smaak error]: could not extract signature"
    return false
  end
  if signature_headers.nil?
    puts "[smaak error]: could not extract signature headers"
    return false
  end
  verified = Smaak::Crypto.verify_signature(signature, Smaak::Crypto.encode64(signature_headers), pubkey)
  puts "[smaak error]: verification of headers and signature using pubkey failed" unless verified
  verified
end