reflect 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/reflect.rb +2 -48
- data/lib/reflect/parameter.rb +7 -0
- data/lib/reflect/token.rb +80 -0
- data/lib/reflect/version.rb +1 -1
- data/reflect.gemspec +4 -16
- metadata +11 -34
- data/lib/reflect/client.rb +0 -61
- data/lib/reflect/request_error.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c19959d955848ed6dba916e9322a5836a1504a1f
|
4
|
+
data.tar.gz: 03ecdcd55ec0bcb6a7ad7f01e9a05c5a69c054f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b801cbd8173de872767de212cea59f3b127e0b355f6497976da0149a3bc3be5bbe41b5e4edac2b8449883c9f9bd5daa61e8b2f0f3008d0a4b8eb1f6a8226b72e
|
7
|
+
data.tar.gz: fa0ff3ade3b04900bd7b2dcdaed532866a64e4b5751253f462c0d484e03b80a1ca4c7f19ebbc394509c4aaabc259c715d2da8568eb1fda88943615187c4faa4c
|
data/lib/reflect.rb
CHANGED
@@ -1,51 +1,5 @@
|
|
1
1
|
$:.unshift(File.expand_path("../", __FILE__))
|
2
2
|
|
3
|
-
require 'openssl'
|
4
|
-
require 'base64'
|
5
|
-
|
6
3
|
require 'reflect/parameter'
|
7
|
-
require 'reflect/
|
8
|
-
require 'reflect/
|
9
|
-
|
10
|
-
module Reflect
|
11
|
-
def self._format_error_message(resp)
|
12
|
-
"An error occured with the request. Status: #{resp.response.code} Error: #{_extract_error_message(resp)}"
|
13
|
-
end
|
14
|
-
|
15
|
-
def self._extract_error_message(resp)
|
16
|
-
begin
|
17
|
-
json = JSON.parse(resp.body)
|
18
|
-
json["error"]
|
19
|
-
rescue JSON::ParserError
|
20
|
-
# TODO: Report this?
|
21
|
-
""
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.logger=(logger)
|
26
|
-
@logger = logger
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.logger
|
30
|
-
@logger ||= Logger.new("/dev/null")
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.generate_token(secret_key, parameters=[])
|
34
|
-
data = parameters.map do |param|
|
35
|
-
is_arr = param.value.is_a? Array
|
36
|
-
|
37
|
-
val = if !is_arr then param.value.to_s else '' end
|
38
|
-
vals = if is_arr then param.value.map(&:to_s).sort else [] end
|
39
|
-
|
40
|
-
JSON.generate([param.field, param.op, val, vals])
|
41
|
-
end
|
42
|
-
|
43
|
-
digest = OpenSSL::Digest.new('sha256')
|
44
|
-
hmac = OpenSSL::HMAC.new(secret_key, digest)
|
45
|
-
.update("V2\n")
|
46
|
-
.update(data.sort.join("\n"))
|
47
|
-
.digest
|
48
|
-
|
49
|
-
"=2=#{Base64.encode64(hmac).strip}"
|
50
|
-
end
|
51
|
-
end
|
4
|
+
require 'reflect/token'
|
5
|
+
require 'reflect/version'
|
data/lib/reflect/parameter.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'jwe'
|
3
|
+
|
4
|
+
module Reflect
|
5
|
+
|
6
|
+
class ProjectTokenBuilder
|
7
|
+
VIEW_IDENTIFIERS_CLAIM_NAME = 'http://reflect.io/s/v3/vid'
|
8
|
+
PARAMETERS_CLAIM_NAME = 'http://reflect.io/s/v3/p'
|
9
|
+
ATTRIBUTES_CLAIM_NAME = 'http://reflect.io/s/v3/a'
|
10
|
+
|
11
|
+
def initialize(access_key)
|
12
|
+
@access_key = access_key
|
13
|
+
|
14
|
+
@expiration = nil
|
15
|
+
@view_identifiers = []
|
16
|
+
@parameters = []
|
17
|
+
@attributes = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def expiration(expiration)
|
21
|
+
@expiration = expiration.to_i
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_view_identifier(id)
|
26
|
+
@view_identifiers << id
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_parameter(parameter)
|
31
|
+
@parameters << parameter
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_attribute(name, value)
|
36
|
+
@attributes[name] = value
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def build(secret_key)
|
41
|
+
key_bytes = secret_key.scan(/[0-9a-f]{4}/).map { |x| x.to_i(16) }
|
42
|
+
key = key_bytes.pack('n*')
|
43
|
+
|
44
|
+
now = Time.now.to_i
|
45
|
+
|
46
|
+
payload = {
|
47
|
+
:iat => now,
|
48
|
+
:nbf => now,
|
49
|
+
}
|
50
|
+
|
51
|
+
payload[:exp] = @expiration unless @expiration.nil?
|
52
|
+
|
53
|
+
payload[VIEW_IDENTIFIERS_CLAIM_NAME] = @view_identifiers unless @view_identifiers.empty?
|
54
|
+
payload[PARAMETERS_CLAIM_NAME] = @parameters unless @parameters.empty?
|
55
|
+
payload[ATTRIBUTES_CLAIM_NAME] = @attributes unless @attributes.empty?
|
56
|
+
|
57
|
+
# The default JWE encryption mechanism doesn't let us specify the
|
58
|
+
# additional header fields we need, so let's do it by hand.
|
59
|
+
header = {
|
60
|
+
alg: 'dir',
|
61
|
+
enc: 'A128GCM',
|
62
|
+
zip: 'DEF',
|
63
|
+
cty: 'JWT',
|
64
|
+
kid: @access_key,
|
65
|
+
}
|
66
|
+
|
67
|
+
zipped_payload = JWE::Zip.for(header[:zip]).new.send(:compress, JSON.generate(payload))
|
68
|
+
json_header = JSON.generate(header)
|
69
|
+
|
70
|
+
cipher = JWE::Enc.for(header[:enc]).new
|
71
|
+
cipher.cek = key
|
72
|
+
|
73
|
+
bin = cipher.encrypt(zipped_payload, JWE::Base64.jwe_encode(json_header))
|
74
|
+
encrypted_cek = JWE::Alg.for(header[:alg]).new(key).encrypt(cipher.cek)
|
75
|
+
|
76
|
+
JWE::Serialization::Compact.encode(json_header, encrypted_cek, cipher.iv, bin, cipher.tag)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/lib/reflect/version.rb
CHANGED
data/reflect.gemspec
CHANGED
@@ -19,23 +19,11 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.rubygems_version = "1.8.24"
|
20
20
|
s.summary = "Reflect.io API Ruby client"
|
21
21
|
|
22
|
-
if s.respond_to? :specification_version
|
22
|
+
if s.respond_to? :specification_version
|
23
23
|
s.specification_version = 3
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
s.add_development_dependency('rake', '~> 10.1.0')
|
28
|
-
s.add_development_dependency('minitest', '~> 5.3')
|
29
|
-
else
|
30
|
-
s.add_dependency(%q<httparty>, [">= 0"])
|
31
|
-
s.add_development_dependency('rake', '~> 10.1.0')
|
32
|
-
s.add_development_dependency('minitest', '~> 5.3')
|
33
|
-
end
|
34
|
-
else
|
35
|
-
s.add_dependency(%q<httparty>, [">= 0"])
|
36
|
-
s.add_development_dependency('rake', '~> 10.1.0')
|
37
|
-
s.add_development_dependency('minitest', '~> 5.3')
|
26
|
+
if s.respond_to? :add_runtime_dependency
|
27
|
+
s.add_runtime_dependency 'jwe', '~> 0.3', '>= 0.3.0'
|
38
28
|
end
|
39
29
|
end
|
40
|
-
|
41
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reflect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Heller
|
@@ -11,47 +11,25 @@ cert_chain: []
|
|
11
11
|
date: 2015-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: jwe
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
19
|
+
version: '0.3'
|
24
20
|
- - ">="
|
25
21
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
-
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 10.1.0
|
34
|
-
type: :development
|
22
|
+
version: 0.3.0
|
23
|
+
type: :runtime
|
35
24
|
prerelease: false
|
36
25
|
version_requirements: !ruby/object:Gem::Requirement
|
37
26
|
requirements:
|
38
27
|
- - "~>"
|
39
28
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
-
|
42
|
-
name: minitest
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '5.3'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
29
|
+
version: '0.3'
|
30
|
+
- - ">="
|
53
31
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
32
|
+
version: 0.3.0
|
55
33
|
description: Ruby client for Reflect.io
|
56
34
|
email: brad@reflect.io
|
57
35
|
executables: []
|
@@ -59,9 +37,8 @@ extensions: []
|
|
59
37
|
extra_rdoc_files: []
|
60
38
|
files:
|
61
39
|
- lib/reflect.rb
|
62
|
-
- lib/reflect/client.rb
|
63
40
|
- lib/reflect/parameter.rb
|
64
|
-
- lib/reflect/
|
41
|
+
- lib/reflect/token.rb
|
65
42
|
- lib/reflect/version.rb
|
66
43
|
- reflect.gemspec
|
67
44
|
homepage: http://github.com/reflect/reflect-rb
|
@@ -83,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
60
|
version: '0'
|
84
61
|
requirements: []
|
85
62
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.
|
63
|
+
rubygems_version: 2.5.2.1
|
87
64
|
signing_key:
|
88
65
|
specification_version: 3
|
89
66
|
summary: Reflect.io API Ruby client
|
data/lib/reflect/client.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'json'
|
3
|
-
require 'httparty'
|
4
|
-
require 'reflect/version'
|
5
|
-
|
6
|
-
module Reflect
|
7
|
-
class Client
|
8
|
-
include HTTParty
|
9
|
-
|
10
|
-
base_uri 'https://api.reflect.io'
|
11
|
-
|
12
|
-
def initialize(token)
|
13
|
-
@token = token
|
14
|
-
end
|
15
|
-
|
16
|
-
def get(path)
|
17
|
-
self.class.get(URI.encode(path), options)
|
18
|
-
end
|
19
|
-
|
20
|
-
def post(path, content)
|
21
|
-
self.class.post(URI.encode(path), options(body: dump(content)))
|
22
|
-
end
|
23
|
-
|
24
|
-
def put(path, content)
|
25
|
-
self.class.put(URI.encode(path), options(body: dump(content)))
|
26
|
-
end
|
27
|
-
|
28
|
-
def delete(path)
|
29
|
-
logger.debug { "[reflect] Sending DELETE #{URI.encode(path)}" }
|
30
|
-
self.class.delete(URI.encode(path), options)
|
31
|
-
end
|
32
|
-
|
33
|
-
def patch(path, content, headers={})
|
34
|
-
opts = options(body: dump(content))
|
35
|
-
opts[:headers].merge!(headers) unless headers.empty?
|
36
|
-
self.class.patch(path, opts)
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def options(opts={})
|
42
|
-
defaults = {
|
43
|
-
basic_auth: { username: '', password: @token },
|
44
|
-
headers: {
|
45
|
-
"User-Agent" => "Reflect Ruby API client v#{Reflect::VERSION}",
|
46
|
-
"Content-Type" => "application/json"
|
47
|
-
}
|
48
|
-
}
|
49
|
-
|
50
|
-
opts.merge(defaults)
|
51
|
-
end
|
52
|
-
|
53
|
-
def dump(obj)
|
54
|
-
JSON.dump(obj)
|
55
|
-
end
|
56
|
-
|
57
|
-
def logger
|
58
|
-
Reflect.logger
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|