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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8195355dc7c3a4cc55fb41608d89c917f613ad7d
4
- data.tar.gz: 40ffa0b99ac7b34ae6e74310ceb7441188d76256
3
+ metadata.gz: c19959d955848ed6dba916e9322a5836a1504a1f
4
+ data.tar.gz: 03ecdcd55ec0bcb6a7ad7f01e9a05c5a69c054f0
5
5
  SHA512:
6
- metadata.gz: 9cd4a2ae7c8e72e656e307fc95e0a8ed604036c99d7d2685866760adbb26038949a21d160c65c5701f760d82126d0de0bf82349bf3ef0e740bcfd467920645c7
7
- data.tar.gz: aedb80cdd4c7f38ab93fa4272b73cddc21cff62e97b4ebcc4d63cf3e67a78275193adf2370a5194140715b2cf6b9332722a738fb8ffb6f2c8403625da67a3eaa
6
+ metadata.gz: b801cbd8173de872767de212cea59f3b127e0b355f6497976da0149a3bc3be5bbe41b5e4edac2b8449883c9f9bd5daa61e8b2f0f3008d0a4b8eb1f6a8226b72e
7
+ data.tar.gz: fa0ff3ade3b04900bd7b2dcdaed532866a64e4b5751253f462c0d484e03b80a1ca4c7f19ebbc394509c4aaabc259c715d2da8568eb1fda88943615187c4faa4c
@@ -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/request_error'
8
- require 'reflect/client'
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'
@@ -9,5 +9,12 @@ module Reflect
9
9
  @op = op
10
10
  @value = value
11
11
  end
12
+
13
+ def to_json(*a)
14
+ h = { field: field, op: op }
15
+ h[value.is_a?(Array) ? 'any' : 'value'] = value
16
+
17
+ h.to_json(*a)
18
+ end
12
19
  end
13
20
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Reflect
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -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 then
22
+ if s.respond_to? :specification_version
23
23
  s.specification_version = 3
24
+ end
24
25
 
25
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
- s.add_runtime_dependency(%q<httparty>, [">= 0"])
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.2.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: httparty
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: '0'
27
- - !ruby/object:Gem::Dependency
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: 10.1.0
41
- - !ruby/object:Gem::Dependency
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: '5.3'
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/request_error.rb
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.6.10
63
+ rubygems_version: 2.5.2.1
87
64
  signing_key:
88
65
  specification_version: 3
89
66
  summary: Reflect.io API Ruby client
@@ -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
@@ -1,4 +0,0 @@
1
- module Reflect
2
- class RequestError < StandardError
3
- end
4
- end