keen 0.9.4 → 0.9.5

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: 982be161aadc1fa73c08a841f36a4056657904c0
4
- data.tar.gz: 53ec16352023fac9586003cd097381368e626498
3
+ metadata.gz: a1699510fc2d24980d980c0fc72cd2a8b95db715
4
+ data.tar.gz: a50d16fe6edff311e4482217a96a89f812b81988
5
5
  SHA512:
6
- metadata.gz: fae9fcb9b63d095474b685b872df14c25689251feb04e895c4c23af2f0da6f6002f53b5474473116b9df0032520f890b6ab8292c64668d187a521d8fc2103001
7
- data.tar.gz: 782c04eafab7b4f49cf20fd70892c408767491608f20c3426bf66d316956f82d64e2cea8f858cdd3290c001aedbd1cd94b277d34086520713cbf2332fda0580f
6
+ metadata.gz: 8d4e6b05301f89eaf477bc95f4b9297ac22ca96706e3133458cccdff0bd2a2a0d0a6f6c377273e5358bee1924a0a52376068e8d34f4fcc875ec20d959a816ec3
7
+ data.tar.gz: eea17f8068313eefcb15f2c23460f23fccf212e1464e12050ee18f2069980d344581cb39228c38838a02f8363ab6bc0988b62b39cb488e019f9a70b1a092d5f5
data/README.md CHANGED
@@ -412,6 +412,9 @@ If you want some bot protection, check out the [Voight-Kampff](https://github.co
412
412
 
413
413
  ### Changelog
414
414
 
415
+ ##### 0.9.5
416
+ + Fix bug with scoped key generation not working with newer Keen projects.
417
+
415
418
  ##### 0.9.4
416
419
  + Add SDK support for Saved Queries
417
420
  + Removed support for Ruby MRI 1.8.7
@@ -3,42 +3,35 @@ require 'digest'
3
3
  require 'base64'
4
4
 
5
5
  module Keen
6
- module AESHelper
6
+ class AESHelper
7
7
 
8
- BLOCK_SIZE = 32
8
+ class << self
9
+ def aes256_decrypt(key, iv_plus_encrypted)
10
+ aes = OpenSSL::Cipher::AES.new(256, :CBC)
11
+ iv = iv_plus_encrypted[0, aes.key_len]
12
+ encrypted = iv_plus_encrypted[aes.key_len, iv_plus_encrypted.length]
13
+ aes.decrypt
14
+ aes.key = unhexlify(key)
15
+ aes.iv = unhexlify(iv)
16
+ aes.update(unhexlify(encrypted)) + aes.final
17
+ end
9
18
 
10
- def aes256_encrypt(key, plaintext, iv = nil)
11
- aes = OpenSSL::Cipher::AES.new(256, :CBC)
12
- aes.encrypt
13
- aes.key = key
14
- aes.iv = iv unless iv.nil?
15
- iv ||= aes.random_iv
16
- [aes.update(plaintext) + aes.final, iv]
17
- end
18
-
19
- def aes256_decrypt(key, iv_plus_encrypted)
20
- iv = iv_plus_encrypted[0, 16]
21
- encrypted = iv_plus_encrypted[16, iv_plus_encrypted.length]
22
- aes = OpenSSL::Cipher::AES.new(256, :CBC)
23
- aes.decrypt
24
- aes.key = key
25
- aes.iv = iv
26
- aes.update(encrypted) + aes.final
27
- end
19
+ def aes256_encrypt(key, plaintext, iv = nil)
20
+ aes = OpenSSL::Cipher::AES.new(256, :CBC)
21
+ aes.encrypt
22
+ aes.key = unhexlify(key)
23
+ aes.iv = iv unless iv.nil?
24
+ iv ||= aes.random_iv
25
+ hexlify(iv) + hexlify(aes.update(plaintext) + aes.final)
26
+ end
28
27
 
29
- def hexlify(msg)
30
- msg.unpack('H*')[0]
31
- end
32
-
33
- def unhexlify(msg)
34
- [msg].pack('H*')
35
- end
28
+ def hexlify(msg)
29
+ msg.unpack('H*')[0]
30
+ end
36
31
 
37
- def pad(msg)
38
- pad_len = BLOCK_SIZE - (msg.length % BLOCK_SIZE)
39
- padding = pad_len.chr * pad_len
40
- padded = msg + padding
41
- padded
32
+ def unhexlify(msg)
33
+ [msg].pack('H*')
34
+ end
42
35
  end
43
36
  end
44
37
  end
@@ -0,0 +1,50 @@
1
+ require 'openssl'
2
+ require 'digest'
3
+ require 'base64'
4
+
5
+ module Keen
6
+ class AESHelperOld
7
+
8
+ BLOCK_SIZE = 32
9
+
10
+ class << self
11
+ def aes256_decrypt(key, iv_plus_encrypted)
12
+ padded_key = pad(key)
13
+ unhexed_iv_plus_encrypted = unhexlify(iv_plus_encrypted)
14
+ iv = unhexed_iv_plus_encrypted[0, 16]
15
+ encrypted = unhexed_iv_plus_encrypted[16, unhexed_iv_plus_encrypted.length]
16
+ aes = OpenSSL::Cipher::AES.new(256, :CBC)
17
+ aes.decrypt
18
+ aes.key = padded_key
19
+ aes.iv = iv
20
+ aes.update(encrypted) + aes.final
21
+ end
22
+
23
+ def aes256_encrypt(key, plaintext, iv = nil)
24
+ padded_key = pad(key)
25
+ aes = OpenSSL::Cipher::AES.new(256, :CBC)
26
+ aes.encrypt
27
+ aes.key = padded_key
28
+ aes.iv = iv unless iv.nil?
29
+ iv ||= aes.random_iv
30
+ encrypted = aes.update(plaintext) + aes.final
31
+ hexlify(iv) + hexlify(encrypted)
32
+ end
33
+
34
+ def hexlify(msg)
35
+ msg.unpack('H*')[0]
36
+ end
37
+
38
+ def unhexlify(msg)
39
+ [msg].pack('H*')
40
+ end
41
+
42
+ def pad(msg)
43
+ pad_len = BLOCK_SIZE - (msg.length % BLOCK_SIZE)
44
+ padding = pad_len.chr * pad_len
45
+ padded = msg + padding
46
+ padded
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,19 +1,20 @@
1
1
  require 'multi_json'
2
2
  require 'keen/aes_helper'
3
+ require 'keen/aes_helper_old'
3
4
 
4
5
  module Keen
5
6
  class ScopedKey
6
- include AESHelper
7
- extend AESHelper
8
7
 
9
8
  attr_accessor :api_key
10
9
  attr_accessor :data
11
10
 
12
11
  class << self
13
12
  def decrypt!(api_key, scoped_key)
14
- encrypted = unhexlify(scoped_key)
15
- padded_api_key = pad(api_key)
16
- decrypted = aes256_decrypt(padded_api_key, encrypted)
13
+ if api_key.length == 64
14
+ decrypted = Keen::AESHelper.aes256_decrypt(api_key, scoped_key)
15
+ else
16
+ decrypted = Keen::AESHelperOld.aes256_decrypt(api_key, scoped_key)
17
+ end
17
18
  data = MultiJson.load(decrypted)
18
19
  self.new(api_key, data)
19
20
  end
@@ -26,9 +27,11 @@ module Keen
26
27
 
27
28
  def encrypt!(iv = nil)
28
29
  json_str = MultiJson.dump(self.data)
29
- padded_api_key = pad(self.api_key)
30
- encrypted, iv = aes256_encrypt(padded_api_key, json_str, iv)
31
- hexlify(iv) + hexlify(encrypted)
30
+ if self.api_key.length == 64
31
+ Keen::AESHelper.aes256_encrypt(self.api_key, json_str, iv)
32
+ else
33
+ Keen::AESHelperOld.aes256_encrypt(self.api_key, json_str, iv)
34
+ end
32
35
  end
33
36
  end
34
37
  end
data/lib/keen/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Keen
2
- VERSION = "0.9.4"
2
+ VERSION = "0.9.5"
3
3
  end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Keen::ScopedKey do
4
+ let(:api_key) { "ab428324dbdbcfe744" }
5
+ let(:bad_api_key) { "badbadbadbad" }
6
+ let(:data) { {
7
+ "filters" => [{
8
+ "property_name" => "accountId",
9
+ "operator" => "eq",
10
+ "property_value" => "123456"
11
+ }]
12
+ }}
13
+ let(:new_scoped_key) { Keen::ScopedKey.new(api_key, data) }
14
+
15
+ describe "constructor" do
16
+ it "should retain the api_key" do
17
+ new_scoped_key.api_key.should == api_key
18
+ end
19
+
20
+ it "should retain the data" do
21
+ new_scoped_key.data.should == data
22
+ end
23
+ end
24
+
25
+ describe "encrypt! and decrypt!" do
26
+ it "should encrypt and hex encode the data using the api key" do
27
+ encrypted_str = new_scoped_key.encrypt!
28
+ other_api_key = Keen::ScopedKey.decrypt!(api_key, encrypted_str)
29
+ other_api_key.data.should == data
30
+ end
31
+
32
+ describe "when an IV is not provided" do
33
+ it "should not produce the same encrypted key text" do
34
+ new_scoped_key.encrypt!.should_not == (new_scoped_key.encrypt!)
35
+ end
36
+ end
37
+
38
+ describe "when an IV is provided" do
39
+ it "should produce the same encrypted key text for a " do
40
+ iv = "\0" * 32
41
+ new_scoped_key.encrypt!(iv).should == (new_scoped_key.encrypt!(iv))
42
+ end
43
+
44
+ it "should raise error when an invalid IV is supplied" do
45
+ iv = "fakeiv"
46
+ expect { new_scoped_key.encrypt!(iv) }.to raise_error(OpenSSL::Cipher::CipherError)
47
+ end
48
+ end
49
+
50
+ it "should not decrypt the scoped key with a bad api key" do
51
+ encrypted_str = new_scoped_key.encrypt!
52
+ expect {
53
+ other_api_key = Keen::ScopedKey.decrypt!(bad_api_key, encrypted_str)
54
+ }.to raise_error(OpenSSL::Cipher::CipherError)
55
+ end
56
+ end
57
+ end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Keen::ScopedKey do
4
- let(:api_key) { "ab428324dbdbcfe744" }
5
- let(:bad_api_key) { "badbadbadbad" }
4
+ let(:api_key) { "24077ACBCB198BAAA2110EDDB673282F8E34909FD823A15C55A6253A664BE368" }
5
+ let(:bad_api_key) { "24077ACBCB198BAAA2110EDDB673282F8E34909FD823A15C55A6253A664BE369" }
6
6
  let(:data) { {
7
7
  "filters" => [{
8
8
  "property_name" => "accountId",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kleissner
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-13 00:00:00.000000000 Z
12
+ date: 2016-02-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -155,6 +155,7 @@ files:
155
155
  - keen.gemspec
156
156
  - lib/keen.rb
157
157
  - lib/keen/aes_helper.rb
158
+ - lib/keen/aes_helper_old.rb
158
159
  - lib/keen/client.rb
159
160
  - lib/keen/client/maintenance_methods.rb
160
161
  - lib/keen/client/publishing_methods.rb
@@ -172,6 +173,7 @@ files:
172
173
  - spec/keen/client_spec.rb
173
174
  - spec/keen/keen_spec.rb
174
175
  - spec/keen/saved_query_spec.rb
176
+ - spec/keen/scoped_key_old_spec.rb
175
177
  - spec/keen/scoped_key_spec.rb
176
178
  - spec/keen/spec_helper.rb
177
179
  - spec/spec_helper.rb
@@ -197,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
199
  version: '0'
198
200
  requirements: []
199
201
  rubyforge_project:
200
- rubygems_version: 2.4.8
202
+ rubygems_version: 2.4.5
201
203
  signing_key:
202
204
  specification_version: 4
203
205
  summary: Keen IO API Client
@@ -211,6 +213,7 @@ test_files:
211
213
  - spec/keen/client_spec.rb
212
214
  - spec/keen/keen_spec.rb
213
215
  - spec/keen/saved_query_spec.rb
216
+ - spec/keen/scoped_key_old_spec.rb
214
217
  - spec/keen/scoped_key_spec.rb
215
218
  - spec/keen/spec_helper.rb
216
219
  - spec/spec_helper.rb