ccs 0.2.0 → 1.0.0.rc1

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
- SHA1:
3
- metadata.gz: 3f41c587aec81ba6914fde371c7645779d220d63
4
- data.tar.gz: 01c7949ac8d27300b681841b13b9a51cb9104de3
2
+ SHA256:
3
+ metadata.gz: 0efddd17f5cf6cc4dda4edc407ec58993d82d34d508132228a4af0f3a2ff216a
4
+ data.tar.gz: 654cd5f1e367d4c6c7a251666015d2896051e6bc84734a483f90b2af04f713e6
5
5
  SHA512:
6
- metadata.gz: 7b49503f5dd0556a88568bad93e9755e47d7bbc851d7855647d291f9771d69492af08f7a51eff302b096fa1ed2ea9f149eb4b5d777aae56659b5b6c7e80d9b3c
7
- data.tar.gz: a993d334971f5a8989eff75fad704a6f45d2b8e1ec35b7c07073cd01d05291ec0a64bb2a351d4ba5d07ae1b50497ef6691e7c125a3bba87b94a42e1a71b6597b
6
+ metadata.gz: 19d2e3f9349f122a9fa05a6fd41ee24cc37bc08f06448236313e6236e82020bdfc1b1eefaa4160f0d30b5287420509f337880794484d89a7dc59b6ab446a6923
7
+ data.tar.gz: 60e209b81064b9813907722cc81c53574ac9ac493a7c6c0dcdca162cc59c9fc5b0ddd277415cd931f7d735ba22084a65aa16c9d76705107fe05e9f14cae45e81
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
55
55
  ## Enforcement
56
56
 
57
57
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at hello@pipello.io. All
58
+ reported by contacting the project team at me@tkowalewski.pl. All
59
59
  complaints will be reviewed and investigated and will result in a response that
60
60
  is deemed necessary and appropriate to the circumstances. The project team is
61
61
  obligated to maintain confidentiality with regard to the reporter of an incident.
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 pipello.io
3
+ Copyright (c) 2017 me@tkowalewski.pl
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -23,13 +23,13 @@ Or install it yourself as:
23
23
 
24
24
  ## Development
25
25
 
26
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
26
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
27
27
 
28
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
28
+ To install this gem onto your local machine, run `bin/rake install`. To release a new version, update the version number in `version.rb`, and then run `bin/rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
29
29
 
30
30
  ## Contributing
31
31
 
32
- Bug reports and pull requests are welcome on GitHub at https://github.com/pipello/ccs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
32
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tkowalewski/ccs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
33
33
 
34
34
 
35
35
  ## License
data/exe/ccs ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'ccs'
6
+ require 'yaml'
7
+ require 'optparse'
8
+ require 'io/console'
9
+
10
+ options = {
11
+ 'access_token' => ENV['CCS_ACCESS_TOKEN'],
12
+ 'secret_token' => ENV['CCS_SECRET_TOKEN']
13
+ }
14
+
15
+ option_parser = OptionParser.new
16
+ option_parser.banner = 'Usage: ccs [OPTIONS] <(LocalPath|STDIN)|(CCSUri|Uri)> <(CCSUri|Uri)|(LocalPath|STDOUT)>'
17
+ option_parser.separator ''
18
+ option_parser.separator 'Configuration Control System (CCS)'
19
+ option_parser.separator ''
20
+ option_parser.separator 'Options:'
21
+
22
+ option_parser.on('-c CONFIGURATION', '--configuration CONFIGURATION', String, 'Path to configuration file') do |v|
23
+ options['configuration'] = v
24
+ end
25
+
26
+ option_parser.on('-a CCS_ACCESS_TOKEN', '--access-token CCS_ACCESS_TOKEN', String, 'CCS Access Token') do |v|
27
+ options['access_token'] = v
28
+ end
29
+
30
+ option_parser.on('-s CCS_SECRET_TOKEN', '--secret-token CCS_SECRET_TOKEN', String, 'CCS Secret Token') do |v|
31
+ options['secret_token'] = v
32
+ end
33
+
34
+ option_parser.separator ''
35
+ option_parser.separator 'Configure via environment variables'
36
+ option_parser.separator ' CCS_ACCESS_TOKEN'
37
+ option_parser.separator ' CCS_SECRET_TOKEN'
38
+
39
+ option_parser.separator ''
40
+ option_parser.separator 'Examples:'
41
+ option_parser.separator ' Download to STDOUT'
42
+ option_parser.separator ' ccs ccs://workspace-name/0.1.0/path/to/file.yml -'
43
+ option_parser.separator ' ccs http://host.tld:9292/workspace-name/0.1.0/path/to/file.yml -'
44
+ option_parser.separator ' ccs https://host.tld/workspace-name/0.1.0/path/to/file.yml -'
45
+ option_parser.separator ' Download to local file'
46
+ option_parser.separator ' ccs ccs://workspace-name/0.1.0/path/to/file.yml /local/path/to/file.yml'
47
+ option_parser.separator ' Upload local file'
48
+ option_parser.separator ' ccs /local/path/to/file.yml ccs://workspace-name/0.1.0/path/to/file.yml'
49
+ option_parser.separator ' Upload content from STDIN'
50
+ option_parser.separator ' echo "{ a: 1 }" | ccs - ccs://workspace-name/0.1.0/path/to/file.yml'
51
+ option_parser.separator ' cat /local/path/to/file.yml | ccs - ccs://workspace-name/0.1.0/path/to/file.yml'
52
+ option_parser.separator ''
53
+
54
+ option_parser.separator format('Version: %<version>s', version: Ccs::VERSION)
55
+
56
+ arguments = option_parser.parse!
57
+
58
+ unless options.values.any?
59
+ puts option_parser
60
+ exit(1)
61
+ end
62
+
63
+ options = YAML.safe_load File.read(options.delete('configuration')) if options.key?('configuration')
64
+
65
+ raise OptionParser::MissingArgument, 'access_token' unless options['access_token']
66
+ raise OptionParser::MissingArgument, 'secret_token' unless options['secret_token']
67
+ raise OptionParser::MissingArgument, 'source' unless arguments.fetch(0, nil)
68
+ raise OptionParser::MissingArgument, 'destination' unless arguments.fetch(1, nil)
69
+
70
+ exit(1) unless Ccs::Application.new(arguments[0], arguments[1], options['access_token'], options['secret_token']).run
data/lib/ccs.rb CHANGED
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'json'
3
5
  require 'openssl'
4
6
  require 'base64'
7
+ require 'uri'
5
8
 
6
9
  require 'ccs/version'
7
- require 'ccs/downloader'
10
+ require 'ccs/encrypter'
8
11
  require 'ccs/decrypter'
12
+ require 'ccs/uploader'
13
+ require 'ccs/downloader'
9
14
  require 'ccs/configuration_file'
15
+ require 'ccs/application'
10
16
 
11
- module Ccs
12
- end
17
+ module Ccs; end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Application
5
+ def initialize(source, destination, access_token, secret_token)
6
+ @source = source
7
+ @destination = destination
8
+ @access_token = access_token
9
+ @secret_token = secret_token
10
+ end
11
+
12
+ def run
13
+ download? ? download : upload
14
+ end
15
+
16
+ private
17
+
18
+ def download?
19
+ @source.match?(%r{\A(ccs|https?):\/\/})
20
+ end
21
+
22
+ def download
23
+ content = ConfigurationFile.new(@source, @access_token, @secret_token).download
24
+ return unless content
25
+
26
+ (@destination.eql?('-') ? STDOUT : File.new(@destination, 'w')).print content
27
+ end
28
+
29
+ def upload
30
+ content = @source.eql?('-') ? STDIN.read : File.read(@source)
31
+ ConfigurationFile.new(@destination, @access_token, @secret_token).upload(content)
32
+ end
33
+ end
34
+ end
@@ -1,29 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
4
  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]
5
+ def initialize(uri, access_token, secret_token)
6
+ @uri = build_uri(uri)
7
+ @access_token = access_token
8
+ @secret_token = secret_token
13
9
  end
14
10
 
15
- def to_path
16
- Pathname.new path
11
+ def upload(content)
12
+ Uploader.new(@uri, content, @access_token, @secret_token).call
17
13
  end
18
14
 
19
- def to_s
20
- format 'ccs://%s/%s', version, path
15
+ def download
16
+ Downloader.new(@uri, @access_token, @secret_token).call
21
17
  end
22
18
 
23
19
  private
24
20
 
25
- def parts
26
- @parts ||= @uri.sub('ccs://', '').split('/', 2)
21
+ def build_uri(uri)
22
+ URI uri.sub('ccs://', 'https://api.occson.com/')
27
23
  end
28
24
  end
29
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
4
  class Decrypter
3
5
  def initialize(passphrase, content)
@@ -5,7 +7,7 @@ module Ccs
5
7
  @content = content
6
8
  end
7
9
 
8
- def decrypt
10
+ def call
9
11
  decryptor.pkcs5_keyivgen(@passphrase, ciphertext_salt, 1)
10
12
  result = decryptor.update(encrypted)
11
13
  result << decryptor.final
@@ -1,36 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
4
  class Downloader
3
- def initialize(token, configuration_file)
4
- @token = token
5
- @configuration_file = configuration_file
5
+ def initialize(uri, access_token, secret_token)
6
+ @uri = uri
7
+ @access_token = access_token
8
+ @secret_token = secret_token
6
9
  end
7
10
 
8
- def download
11
+ def call
9
12
  response = http.request(request)
13
+ body = response.body
14
+ return unless response.code.eql? '200'
15
+ json = JSON.parse body
10
16
 
11
- return unless response.class == Net::HTTPOK
12
-
13
- JSON.parse(response.body)
17
+ Decrypter.new(@secret_token, json['encrypted_content']).call
14
18
  end
15
19
 
16
20
  private
17
21
 
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
22
  def http
23
- Net::HTTP.new(uri.host, uri.port).tap do |http|
24
- http.use_ssl = uri.scheme == 'https'
25
- end
23
+ Net::HTTP.new(@uri.host, @uri.port)
26
24
  end
27
25
 
28
26
  def request
29
- Net::HTTP::Get.new(uri.path, headers)
27
+ Net::HTTP::Get.new(@uri.path, headers)
30
28
  end
31
29
 
32
30
  def headers
33
- { 'Authorization' => format('Token token=%s', @token) }
31
+ {
32
+ 'Authorization' => format('Token token=%<access_token>s', access_token: @access_token),
33
+ 'Content-Type' => 'application/json'
34
+ }
34
35
  end
35
36
  end
36
37
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Encrypter
5
+ def initialize(passphrase, content, salt)
6
+ @passphrase = passphrase
7
+ @content = content
8
+ @salt = salt
9
+ end
10
+
11
+ def call
12
+ encryptor.pkcs5_keyivgen(@passphrase, @salt, 1)
13
+ encrypted = encryptor.update(@content)
14
+ encrypted << encryptor.final
15
+
16
+ openssl_salted_ciphertext = 'Salted__' + @salt + encrypted
17
+ Base64.strict_encode64(openssl_salted_ciphertext)
18
+ end
19
+
20
+ private
21
+
22
+ def encryptor
23
+ @encryptor ||= OpenSSL::Cipher::AES.new(256, :CBC).encrypt
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Uploader
5
+ def initialize(uri, content, access_token, secret_token)
6
+ @uri = uri
7
+ @content = content
8
+ @access_token = access_token
9
+ @secret_token = secret_token
10
+ end
11
+
12
+ def call
13
+ request.body = { encrypted_content: encrypted_content }.to_json
14
+ http.request(request).code.eql? '201'
15
+ end
16
+
17
+ private
18
+
19
+ def http
20
+ Net::HTTP.new(@uri.host, @uri.port)
21
+ end
22
+
23
+ def request
24
+ @request ||= Net::HTTP::Post.new(@uri.path, headers)
25
+ end
26
+
27
+ def headers
28
+ {
29
+ 'Authorization' => format('Token token=%<access_token>s', access_token: @access_token),
30
+ 'Content-Type' => 'application/json'
31
+ }
32
+ end
33
+
34
+ def encrypted_content
35
+ @encrypted_content ||= Encrypter.new(@secret_token, @content, salt).call
36
+ end
37
+
38
+ def salt
39
+ @access_token[0...8]
40
+ end
41
+ end
42
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
- VERSION = '0.2.0'.freeze
4
+ VERSION = '1.0.0.rc1'
3
5
  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.2.0
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
- - pipello.io
7
+ - tkowalewski
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-14 00:00:00.000000000 Z
11
+ date: 2018-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,59 +16,143 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: 1.16.1
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: 1.16.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: inch
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.11.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.11.3
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '10.0'
61
+ version: 12.3.0
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '10.0'
68
+ version: 12.3.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: reek
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.7.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 4.7.3
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: rspec
43
85
  requirement: !ruby/object:Gem::Requirement
44
86
  requirements:
45
87
  - - "~>"
46
88
  - !ruby/object:Gem::Version
47
- version: '3.0'
89
+ version: 3.7.0
48
90
  type: :development
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
94
  - - "~>"
53
95
  - !ruby/object:Gem::Version
54
- version: '3.0'
96
+ version: 3.7.0
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rubocop
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: 0.44.1
103
+ version: 0.52.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.52.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.15.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.15.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 3.3.0
62
132
  type: :development
63
133
  prerelease: false
64
134
  version_requirements: !ruby/object:Gem::Requirement
65
135
  requirements:
66
136
  - - "~>"
67
137
  - !ruby/object:Gem::Version
68
- version: 0.44.1
138
+ version: 3.3.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.8.7.5
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.8.7.5
69
153
  description: ''
70
154
  email:
71
- - hello@pipello.io
155
+ - me@tkowalewski.pl
72
156
  executables:
73
157
  - ccs
74
158
  extensions: []
@@ -78,13 +162,16 @@ files:
78
162
  - CODE_OF_CONDUCT.md
79
163
  - LICENSE.txt
80
164
  - README.md
81
- - bin/ccs
165
+ - exe/ccs
82
166
  - lib/ccs.rb
167
+ - lib/ccs/application.rb
83
168
  - lib/ccs/configuration_file.rb
84
169
  - lib/ccs/decrypter.rb
85
170
  - lib/ccs/downloader.rb
171
+ - lib/ccs/encrypter.rb
172
+ - lib/ccs/uploader.rb
86
173
  - lib/ccs/version.rb
87
- homepage: https://github.com/pipello/ccs
174
+ homepage: https://github.com/tkowalewski/ccs
88
175
  licenses:
89
176
  - MIT
90
177
  metadata: {}
@@ -99,13 +186,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
186
  version: '0'
100
187
  required_rubygems_version: !ruby/object:Gem::Requirement
101
188
  requirements:
102
- - - ">="
189
+ - - ">"
103
190
  - !ruby/object:Gem::Version
104
- version: '0'
191
+ version: 1.3.1
105
192
  requirements: []
106
193
  rubyforge_project:
107
- rubygems_version: 2.5.2
194
+ rubygems_version: 2.7.3
108
195
  signing_key:
109
196
  specification_version: 4
110
- summary: ''
197
+ summary: Configuration Control System (CCS)
111
198
  test_files: []
data/bin/ccs DELETED
@@ -1,57 +0,0 @@
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