ccs 0.1.0 → 0.2.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: 91592fadeafdbef241a22d259602f272c3f2d52d
4
- data.tar.gz: 5f3f9bbe40025705e2292408c41eed99ed77a651
3
+ metadata.gz: 3f41c587aec81ba6914fde371c7645779d220d63
4
+ data.tar.gz: 01c7949ac8d27300b681841b13b9a51cb9104de3
5
5
  SHA512:
6
- metadata.gz: 5b187ca0d2164d74bf3de85b07f91b7c3ed3c5dcdf2be4807358a31eb134ad4eea92ee214a41810e80702eb06f540a4f93734f3227541812a6f0b9129af4435f
7
- data.tar.gz: 765bc7800c4794200a8c102708407997644f068af8f9fb29196096fe095b74245984da60f1a86af8db3e5417a02a570e967d5f85c8c10e8448b06515fef6fc36
6
+ metadata.gz: 7b49503f5dd0556a88568bad93e9755e47d7bbc851d7855647d291f9771d69492af08f7a51eff302b096fa1ed2ea9f149eb4b5d777aae56659b5b6c7e80d9b3c
7
+ data.tar.gz: a993d334971f5a8989eff75fad704a6f45d2b8e1ec35b7c07073cd01d05291ec0a64bb2a351d4ba5d07ae1b50497ef6691e7c125a3bba87b94a42e1a71b6597b
data/bin/ccs ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ccs'
4
+ require 'optparse'
5
+ require 'io/console'
6
+
7
+ options = {}
8
+
9
+ opt_parser = OptionParser.new do |opt|
10
+ opt.banner = 'Usage: ccs [OPTIONS] <CCSUri> <LocalPath|STDOUT>'
11
+ opt.separator ''
12
+ opt.separator 'Options:'
13
+
14
+ opt.on('-t TOKEN', '--token TOKEN', String, 'API Token') do |v|
15
+ options[:token] = v
16
+ end
17
+
18
+ opt.on('-d', '--decrypt', 'Ask for passphrase and decrypt') do |v|
19
+ options[:decrypt] = v
20
+ end
21
+
22
+ opt.on('-h','--help', 'help') do
23
+ puts opt_parser
24
+ end
25
+
26
+ opt.separator ''
27
+ opt.separator 'Examples:'
28
+ opt.separator ' ccs -t 8b5a196e-a116-4c64-8472-f7c6e1c2de3b ccs://0.1.0/path/to/file.yml'
29
+ opt.separator ' ccs -t 8b5a196e-a116-4c64-8472-f7c6e1c2de3b ccs://0.1.0/path/to/file.yml local/path/to/file.yml'
30
+
31
+ opt.separator ''
32
+ opt.separator format('Version: %s', Ccs::VERSION)
33
+ end
34
+
35
+ arguments = opt_parser.parse!
36
+
37
+ if ARGV.empty?
38
+ puts opt_parser
39
+ exit(-1)
40
+ end
41
+
42
+ raise OptionParser::MissingArgument if options[:token].nil?
43
+ raise OptionParser::MissingArgument if arguments[0].nil?
44
+
45
+ configuration_file = Ccs::ConfigurationFile.new(arguments[0])
46
+ destination = arguments[1] ? File.new(arguments[1], 'w') : STDOUT
47
+
48
+ json = Ccs::Downloader.new(options[:token], configuration_file).download
49
+
50
+ if options[:decrypt]
51
+ print 'Passphrase: '
52
+ passphrase = STDIN.noecho(&:gets)
53
+
54
+ destination.puts Ccs::Decrypter.new(passphrase.chomp, json['encrypted_content']).decrypt
55
+ else
56
+ destination.puts json['encrypted_content']
57
+ end
data/lib/ccs.rb CHANGED
@@ -1,4 +1,12 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'openssl'
4
+ require 'base64'
5
+
1
6
  require 'ccs/version'
7
+ require 'ccs/downloader'
8
+ require 'ccs/decrypter'
9
+ require 'ccs/configuration_file'
2
10
 
3
11
  module Ccs
4
12
  end
@@ -0,0 +1,29 @@
1
+ module Ccs
2
+ class ConfigurationFile
3
+ def initialize(uri)
4
+ @uri = uri
5
+ end
6
+
7
+ def version
8
+ parts[0]
9
+ end
10
+
11
+ def path
12
+ parts[1]
13
+ end
14
+
15
+ def to_path
16
+ Pathname.new path
17
+ end
18
+
19
+ def to_s
20
+ format 'ccs://%s/%s', version, path
21
+ end
22
+
23
+ private
24
+
25
+ def parts
26
+ @parts ||= @uri.sub('ccs://', '').split('/', 2)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module Ccs
2
+ class Decrypter
3
+ def initialize(passphrase, content)
4
+ @passphrase = passphrase
5
+ @content = content
6
+ end
7
+
8
+ def decrypt
9
+ decryptor.pkcs5_keyivgen(@passphrase, ciphertext_salt, 1)
10
+ result = decryptor.update(encrypted)
11
+ result << decryptor.final
12
+ end
13
+
14
+ private
15
+
16
+ def decryptor
17
+ @decryptor ||= OpenSSL::Cipher::AES.new(256, :CBC).decrypt
18
+ end
19
+
20
+ def openssl_salted_ciphertext
21
+ @openssl_salted_ciphertext ||= Base64.strict_decode64 @content
22
+ end
23
+
24
+ def ciphertext_salt
25
+ openssl_salted_ciphertext[8..15]
26
+ end
27
+
28
+ def encrypted
29
+ openssl_salted_ciphertext[16..-1]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ module Ccs
2
+ class Downloader
3
+ def initialize(token, configuration_file)
4
+ @token = token
5
+ @configuration_file = configuration_file
6
+ end
7
+
8
+ def download
9
+ response = http.request(request)
10
+
11
+ return unless response.class == Net::HTTPOK
12
+
13
+ JSON.parse(response.body)
14
+ end
15
+
16
+ private
17
+
18
+ def uri
19
+ @uri ||= URI format('https://pipello.io/api/v1/ccs/%s/%s', @configuration_file.version, @configuration_file.path)
20
+ end
21
+
22
+ def http
23
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
24
+ http.use_ssl = uri.scheme == 'https'
25
+ end
26
+ end
27
+
28
+ def request
29
+ Net::HTTP::Get.new(uri.path, headers)
30
+ end
31
+
32
+ def headers
33
+ { 'Authorization' => format('Token token=%s', @token) }
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Ccs
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ccs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pipello.io
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-01 00:00:00.000000000 Z
11
+ date: 2017-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -69,7 +69,8 @@ dependencies:
69
69
  description: ''
70
70
  email:
71
71
  - hello@pipello.io
72
- executables: []
72
+ executables:
73
+ - ccs
73
74
  extensions: []
74
75
  extra_rdoc_files: []
75
76
  files:
@@ -77,7 +78,11 @@ files:
77
78
  - CODE_OF_CONDUCT.md
78
79
  - LICENSE.txt
79
80
  - README.md
81
+ - bin/ccs
80
82
  - lib/ccs.rb
83
+ - lib/ccs/configuration_file.rb
84
+ - lib/ccs/decrypter.rb
85
+ - lib/ccs/downloader.rb
81
86
  - lib/ccs/version.rb
82
87
  homepage: https://github.com/pipello/ccs
83
88
  licenses: