reflect 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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