Birst_Command 0.4.0 → 0.5.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: 2fcfeb6fbba597581204ab786c08a523038a34dd
4
- data.tar.gz: 3aa45b83a061a5375c33d1a25caa0f7f9a242d2a
3
+ metadata.gz: 6bad6616cef05fab628640a4acabc9b7c219baf4
4
+ data.tar.gz: d4e2bf27651cf4ef20d1038b064ee8f7f4b83bbe
5
5
  SHA512:
6
- metadata.gz: 06dc2ba21870c94529450d603469d216b77cbfd307d2b8ec2784404320273d367e40715dcd22d9a1a0597b9e6dae8ec8aab05c6e875745f84dfad97161350d38
7
- data.tar.gz: 58252f327c73d797487fe37cb8e9f901400454c46495df153751ee12efbfb82f9a65c6c6baecc918ff2cda63d51b5ab9ad13d4efc63cb131111fb096c733d7e4
6
+ metadata.gz: b3d0ba0d5ad7a2609aefde09576f90fe927a3caaeba804967510cfce381271878069e9524d1e72502c6b777c61a84ffa9376771ba715888a35bbe5af81372e5f
7
+ data.tar.gz: fa825d4847ec8e2d6dc06b7af1992e6e3f352f030649e64135bb622f51a3d5d5e156b7d38e5fa7f104ed7daae657350ea70f1a8c3521504923042c2222f46077
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.required_ruby_version = '~> 2'
18
18
  s.add_runtime_dependency "savon", ["~> 2.0"]
19
19
  s.add_runtime_dependency "httpclient", ["~> 2.3"]
20
+ s.add_runtime_dependency "envcrypt", ["~> 0.1"]
20
21
 
21
22
  s.files = `git ls-files`.split("\n")
22
23
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
  gem 'savon', '~> 2.0'
3
3
  gem 'httpclient'
4
+ gem 'envcrypt', '~> 0.1'
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  Birst_Command
2
2
  ====================
3
+ [![Gem Version](https://badge.fury.io/rb/Birst_Command.svg)](http://badge.fury.io/rb/Birst_Command)
3
4
 
4
5
  Birst Command is a Ruby gem that allows you to build Ruby scripts that
5
6
  interface with the Birst Web API. It also comes with a simple command line
@@ -10,8 +11,8 @@ Birst user that needed to set up a very basic Ruby interface.
10
11
 
11
12
  # Installation & Setup
12
13
 
13
- **SPECIAL NOTE:** Password management has changed since version 0.3.0.
14
- It is now more secure but requires some new configuration.
14
+ **SPECIAL NOTE:** Password management has changed since version 0.4.0.
15
+ Read below for details.
15
16
 
16
17
  Prerequisites: Ruby > 2.0 and rubygems.
17
18
 
@@ -34,30 +35,26 @@ the username and password. (**Note**: do not use `login.bws.birst.com`
34
35
  since it does not use an updated WSDL; a specific app server must be
35
36
  specified). Since I have a strong aversion to storing passwords in
36
37
  plaintext, the password in the config file needs to use and encrypted
37
- password. Birst Command comes with a password encryptor that can be
38
+ password. Birst Command comes bundled with a password encryptor
39
+ called [Envcrypt](https://github.com/gnilrets/envcrypt) that can be
38
40
  executed via
39
41
 
40
42
  ````bash
41
- $ birstcl -e mypassword
43
+ $ envcrypt -s mypassword
42
44
  ````
43
45
 
44
46
  which should give an output similar to
45
47
  ````
46
- Set these keys as environment variables
47
- - Do not lose them or you will have to regenerate your password.
48
- - Keep them secure, your password is compromised if these keys are compromised.
49
- - Remove them as environment variables to generate new ones
50
- BIRST_COMMAND_IV="3Nn26chRPkclusqTHePpig=="
51
- BIRST_COMMAND_KEY="MWHa7gksYQaZTTq4snjyOnBDWUnKaVJq1VF4cv82MgA="
52
- BIRST_COMMAND_SALT="KI//0xfSrX4mdSpiSp69BQ=="
53
- ...
54
- Use this encrypted password in your .birstcl file: "JlCX9/RvHnGuWZWUcjTelg=="
48
+ Encrypted Secret: 2KwUMeJIqsjPWWF9Fw0I+w==
49
+ ENVCRYPT_KEY='V/V919RKnz8l2M002336bg==$ARoQfp/9pfv5kVN/ysRuStLuTWJFZhQF1f49xkHbcwQ=$YAjVhHOXlcagmZoFYgPWdQ=='
50
+ WARNING: It is critical that the key and encryption password be stored separately!
55
51
  ````
56
52
 
57
- Copy and paste the encrypted password into the config file. You will
58
- also need to ensure that the three environment variables are set as
59
- indicated above. If you're running in a development environment, you
60
- can include these in your bash `~/.profile` file.
53
+ Copy and paste the encrypted password (aka "secret') into the
54
+ `$HOME/.birstcl` config file. You will also need to ensure that the
55
+ `ENVCRYPT_KEY` environment variable is set as indicated above. If you're
56
+ running in a development environment, you can include these in your
57
+ bash `~/.profile` file.
61
58
 
62
59
  # Usage - Birst command line tool
63
60
 
@@ -227,3 +224,8 @@ entirely consistent in its use of camelCase for arguments (e.g.,
227
224
  `listUsersInSpace`). This inconsistency requires us to **submit
228
225
  commands as snake_case and arguments as the camelCase that Birst
229
226
  uses.**
227
+
228
+ # Changelog
229
+
230
+ * 0.5.0
231
+ * Migrated password handling to use Envcrypt
@@ -14,10 +14,6 @@ module BirstCL
14
14
  exit
15
15
  end
16
16
 
17
- if @options[:encrypt_password]
18
- encrypt_password(@options[:encrypt_password])
19
- end
20
-
21
17
  if @options[:command]
22
18
  read_config_file
23
19
  execute_command
@@ -44,11 +40,6 @@ module BirstCL
44
40
  exit
45
41
  end
46
42
 
47
- @options[:encrypt_password] = nil
48
- opts.on("-e","--encrypt_password <PASSWORD>","Generates an encrypted version of PASSWORD that needs to be placed in ~/.birstcl") do |opt|
49
- @options[:encrypt_password] = opt
50
- end
51
-
52
43
  @options[:command] = nil
53
44
  opts.on("-c","--command <COMMAND>","COMMAND is the snake_case Birst web API command") do |opt|
54
45
  @options[:command] = opt
@@ -88,15 +79,6 @@ module BirstCL
88
79
  Birst_Command::Config.read_config(@options[:config_full_path])
89
80
  end
90
81
 
91
- def encrypt_password(password)
92
- Birst_Command::Password.generate_keys(verbose: true)
93
- puts <<-EOF.unindent
94
- ...
95
- Use this encrypted password in your .birstcl file: "#{Birst_Command::Password.encrypt(password)}"
96
- EOF
97
- end
98
-
99
-
100
82
  def write_cookie_file(file_full_path)
101
83
  return nil if file_full_path.nil?
102
84
  File.open(file_full_path, 'w') {|f| f.write(Marshal.dump(@session_cookie)) }
@@ -4,10 +4,10 @@ require 'openssl'
4
4
  require 'base64'
5
5
  require 'securerandom'
6
6
  require 'json'
7
+ require 'envcrypt'
7
8
 
8
9
  require 'birst_command/config'
9
10
  require 'birst_command/core_additions'
10
11
  require 'birst_command/version'
11
- require 'birst_command/password'
12
12
  require 'birst_command/session'
13
13
 
@@ -34,12 +34,14 @@ module Birst_Command
34
34
 
35
35
 
36
36
  def login(use_cookie: nil)
37
+ crypt = Envcrypt::Envcrypter.new
38
+
37
39
  @auth_cookies = use_cookie
38
40
  @response = @client.call(:login,
39
41
  cookies: @auth_cookies,
40
42
  message: {
41
43
  username: @options[:username],
42
- password: Password.decrypt(@options[:password])
44
+ password: crypt.decrypt(@options[:password])
43
45
  })
44
46
 
45
47
  @auth_cookies = @response.http.cookies if @auth_cookies.nil?
@@ -1,3 +1,3 @@
1
1
  module Birst_Command
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -3,52 +3,19 @@ require "test_birst_command"
3
3
  class Test_password < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
- ENV['BIRST_COMMAND_IV'] = "3Ez9fL0Jlt/E1d7QlVtKdw=="
7
- ENV['BIRST_COMMAND_KEY'] = "N589Xi0YzzkE+bRGwp3yaoVk/lneYsLHdFP+366hwcY="
8
- ENV['BIRST_COMMAND_SALT'] = "AUkJj8QSmNW3QazpyNl7og=="
6
+ ENV['ENVCRYPT_KEY'] = '9Aqck/FZ0pCRkiw95VpxLw==$kxnYLOCo9qHDHHaTZM+fN73WVclDkRqO+uxSgzFzrpQ=$qoEtCm1BQWgc+WAxpotsrw=='
9
7
 
10
8
  @password = "mysecretpass"
11
- @encrypted = "dP5+BfQyTAvKOM6s1ik4zg=="
9
+ @encrypted = "MBTkxkMT8AbQupkOwtG9uQ=="
12
10
  end
13
11
 
14
12
  def teardown
15
13
  end
16
14
 
17
- def test_key_generation
18
- ENV['BIRST_COMMAND_IV'] = nil
19
- ENV['BIRST_COMMAND_KEY'] = nil
20
- ENV['BIRST_COMMAND_SALT'] = nil
21
-
22
- Password.generate_keys
23
-
24
- encrypted = Password.encrypt(@password)
25
- decrypted = Password.decrypt(encrypted)
26
-
27
- assert_equal @password, decrypted, "Wrong decrypted password"
28
- end
29
-
30
-
31
- def test_decryption_failure
32
- Password.generate_keys
33
-
34
- encrypted = Password.encrypt(@password)
35
- ENV['BIRST_COMMAND_SALT'] = SecureRandom.base64
36
-
37
- assert_raise OpenSSL::Cipher::CipherError do
38
- decrypted = Password.decrypt(encrypted)
39
- end
40
- end
41
-
42
-
43
- def test_encrypt
44
- assert_equal @encrypted, Password.encrypt(@password), "Expecting encrypted password #{@encrypted}"
45
- end
46
-
47
15
  def test_decrypt
48
- assert_equal @password, Password.decrypt(@encrypted), "Expecting decrypted password #{@password}"
16
+ crypt = Envcrypt::Envcrypter.new
17
+ assert_equal @password, crypt.decrypt(@encrypted), "Wrong decrypted password"
49
18
  end
50
-
51
-
52
19
  end
53
20
 
54
21
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Birst_Command
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sterling Paramore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-24 00:00:00.000000000 Z
11
+ date: 2014-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: envcrypt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
41
55
  description: Ruby interface to Birst web API
42
56
  email:
43
57
  - gnilrets@gmail.com
@@ -60,7 +74,6 @@ files:
60
74
  - lib/birst_command.rb
61
75
  - lib/birst_command/config.rb
62
76
  - lib/birst_command/core_additions.rb
63
- - lib/birst_command/password.rb
64
77
  - lib/birst_command/session.rb
65
78
  - lib/birst_command/version.rb
66
79
  - test/.gitignore
@@ -1,66 +0,0 @@
1
- module Birst_Command
2
- module Password
3
- extend self
4
-
5
- def generate_keys(verbose: false)
6
- iv = ENV['BIRST_COMMAND_IV'] || SecureRandom.base64
7
- key = ENV['BIRST_COMMAND_KEY'] || SecureRandom.base64(32)
8
- salt = ENV['BIRST_COMMAND_SALT'] || SecureRandom.base64
9
-
10
- if verbose
11
- puts <<-EOF.unindent
12
- Set these keys as environment variables
13
- - Do not lose them or you will have to regenerate your password.
14
- - Keep them secure, your password is compromised if these keys are compromised.
15
- - Remove them as environment variables to generate new ones
16
- BIRST_COMMAND_IV="#{iv}"
17
- BIRST_COMMAND_KEY="#{key}"
18
- BIRST_COMMAND_SALT="#{salt}"
19
- EOF
20
- end
21
-
22
- ENV['BIRST_COMMAND_IV'] = iv
23
- ENV['BIRST_COMMAND_KEY'] = key
24
- ENV['BIRST_COMMAND_SALT'] = salt
25
- end
26
-
27
- # Generate a new cipher for encryption or decryption
28
- def create_cipher(mode)
29
- iv = ENV['BIRST_COMMAND_IV'] || SecureRandom.base64
30
- key = ENV['BIRST_COMMAND_KEY'] || SecureRandom.base64(32)
31
- salt = ENV['BIRST_COMMAND_SALT'] || SecureRandom.base64
32
-
33
- cipher = OpenSSL::Cipher.new 'AES-128-CBC'
34
- cipher.send(mode)
35
- cipher.iv = iv
36
-
37
- digest = OpenSSL::Digest::SHA256.new
38
- key_len = cipher.key_len
39
- iter = 20000
40
- cipher.key = OpenSSL::PKCS5.pbkdf2_hmac(key, salt, iter, key_len, digest)
41
- cipher
42
- end
43
-
44
-
45
- # Returns a base64-obfuscated password to be stored in the config.json file
46
- def encrypt(pwd)
47
- cipher = create_cipher(:encrypt)
48
-
49
- encrypted = cipher.update pwd
50
- encrypted << cipher.final
51
-
52
- Base64.encode64(encrypted).chomp
53
- end
54
-
55
-
56
- # Returns a plaintext password
57
- def decrypt(encrypted_pwd)
58
- cipher = create_cipher(:decrypt)
59
-
60
- decrypted = cipher.update Base64.decode64(encrypted_pwd)
61
- decrypted << cipher.final
62
-
63
- decrypted
64
- end
65
- end
66
- end