ccs 0.1.0 → 0.2.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: 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: