keen 0.9.4 → 0.9.5

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: 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