trocla 0.2.0 → 0.2.1

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: 5013d3c6ab75dc39bbbb5f7c8a77b19f7b5bed1c
4
- data.tar.gz: bffc23e9979133c7303c7fde6b4b7a24fe367f8b
3
+ metadata.gz: 6a30592b5fe0cb877e7020fb82130f82f268092f
4
+ data.tar.gz: 66ffb4cc0e40748893b4d5252bae9dbc0ab5ef92
5
5
  SHA512:
6
- metadata.gz: 009e2b762c641a8f10be76d673a3860b98cd3dd91a27b77da5d0775c9312da26f454c1c54a039bc9011d25c6c77dd6813b87007e0a71dcab35839fb09d5a3457
7
- data.tar.gz: e873f4ac50bebf1ab00eddb06b3c9cca0040783a46195391f7064cebba0b2c47648454cef391e20831c405ff6280d2354f249050eb5605452f8e1f3f5becbdc7
6
+ metadata.gz: fd70d9212f4e9c3edf09fd8fcc18b21cb5be10cb1bcd0a0425619d09e9d26102d86fc6a3b298cf53039396f476dc14fd1de28fe52db7285020e4f38bc3fb8717
7
+ data.tar.gz: 264bbb90b3ee22407c239633d2fe949e9634aab726c13cf10c2b79346ad91add53f6f98f7a8a608b98881e7d4e5d1807a6c1ce3533e65060fddef15b2d35a9ec
data/Gemfile CHANGED
@@ -27,6 +27,7 @@ group :development do
27
27
  gem "rspec", "~> 2.4"
28
28
  gem "rdoc", "~> 3.8"
29
29
  gem "jeweler", "~> 1.6"
30
+ gem "addressable", "~> 2.3.8"
30
31
  end
31
32
  gem 'rspec-pending_for'
32
33
  end
data/README.md CHANGED
@@ -69,6 +69,7 @@ Valid global options are:
69
69
  * profiles: a profile name or an array of profiles matching a profile_name in your configuration. Learn more about profiles below.
70
70
  * random: boolean - Whether we allow creation of random passwords or we expect a password to be preset. Default: true - or whatever you define in your global settings.
71
71
  * expires: An integer indicating the amount of seconds a value (e.g. password) is available. After expiration a value will not be available anymore and trying to `get` this key will return no value (nil). Meaning that calling create after expiration, would create a new password automatically. There is more about expiration in the storage backends section.
72
+ * render: A hash providing flags for formats to render the output specifially. This is a global option, but support depends on a per format basis.
72
73
 
73
74
  Example:
74
75
 
@@ -201,9 +202,16 @@ Additional options are:
201
202
  openssl versions have a bug with [leading dots](https://rt.openssl.org/Ticket/Display.html?id=3562) for name
202
203
  constraints. So using them might not work everywhere as expected.
203
204
 
205
+ Output render options are:
206
+
207
+ certonly If set to true the x509 format will return only the certificate
208
+ keyonly If set to true the x509 format will return only the private key
209
+
204
210
  ## Installation
205
211
 
206
- Simply build and install the gem.
212
+ * Debian has trocla within its sid-release: `apt-get install trocla`
213
+ * For RHEL/CentOS 7 there is a [copr reporisotry](https://copr.fedoraproject.org/coprs/duritong/trocla/). Follow the help there to integrate the repository and install trocla.
214
+ * Trocla is also distributed as gem: `gem install trocla`
207
215
 
208
216
  ## Configuration
209
217
 
@@ -300,6 +308,10 @@ encryption_options:
300
308
 
301
309
  ## Update & Changes
302
310
 
311
+ ### to 0.2.1
312
+
313
+ 1. New Feature: Introduce a way to render specific formats, mainly this allows you to control the output of a specific format. See the x509 format for more information.
314
+
303
315
  ### to 0.2.0
304
316
 
305
317
  1. New feature profiles: Introduce profiles to make it easy to have a default set of properties. See the profiles section for more information.
@@ -0,0 +1,114 @@
1
+ # Generated from trocla-0.1.2.gem by gem2rpm -*- rpm-spec -*-
2
+ %global gem_name trocla
3
+
4
+ Name: rubygem-%{gem_name}
5
+ Version: 0.2.0
6
+ Release: 1%{?dist}
7
+ Summary: Trocla a simple password generator and storage
8
+ Group: Development/Languages
9
+ License: GPLv3
10
+ URL: https://tech.immerda.ch/2011/12/trocla-get-hashed-passwords-out-of-puppet-manifests/
11
+ Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem
12
+ Requires: rubygem-moneta
13
+ Requires: rubygem-bcrypt
14
+ Requires: rubygem-highline
15
+ BuildRequires: rubygem-moneta = 0.7.20
16
+ BuildRequires: rubygem-bcrypt
17
+ BuildRequires: rubygem-highline
18
+ BuildRequires: ruby(release)
19
+ BuildRequires: rubygems-devel
20
+ BuildRequires: ruby
21
+ # BuildRequires: rubygem(mocha)
22
+ # BuildRequires: rubygem(rspec) => 2.4
23
+ # BuildRequires: rubygem(rspec) < 3
24
+ # BuildRequires: rubygem(jeweler) => 1.6
25
+ # BuildRequires: rubygem(jeweler) < 2
26
+ BuildArch: noarch
27
+
28
+ %description
29
+ Trocla helps you to generate random passwords and to store them in various
30
+ formats (plain, MD5, bcrypt) for later retrival.
31
+
32
+
33
+ %package doc
34
+ Summary: Documentation for %{name}
35
+ Group: Documentation
36
+ Requires: %{name} = %{version}-%{release}
37
+ BuildArch: noarch
38
+
39
+ %description doc
40
+ Documentation for %{name}.
41
+
42
+ %prep
43
+ gem unpack %{SOURCE0}
44
+
45
+ %setup -q -D -T -n %{gem_name}-%{version}
46
+
47
+ gem spec %{SOURCE0} -l --ruby > %{gem_name}.gemspec
48
+
49
+ %build
50
+ # Create the gem as gem install only works on a gem file
51
+ gem build %{gem_name}.gemspec
52
+
53
+ # %%gem_install compiles any C extensions and installs the gem into ./%%gem_dir
54
+ # by default, so that we can move it into the buildroot in %%install
55
+ %gem_install
56
+
57
+ %install
58
+ mkdir -p %{buildroot}%{gem_dir}
59
+ cp -a .%{gem_dir}/* \
60
+ %{buildroot}%{gem_dir}/
61
+
62
+
63
+ mkdir -p %{buildroot}%{_bindir}
64
+ mkdir -p %{buildroot}%{_sysconfdir}
65
+ mkdir -p %{buildroot}/%{_sharedstatedir}/%{gem_name}
66
+ touch %{buildroot}/%{_sharedstatedir}/%{gem_name}/%{gem_name}_data.yaml
67
+
68
+ cp -pa .%{_bindir}/* \
69
+ %{buildroot}%{_bindir}/
70
+
71
+ chmod a+x %{buildroot}%{gem_instdir}/bin/%{gem_name}
72
+
73
+ cat <<EOF > %{buildroot}/%{_sysconfdir}/%{gem_name}rc.yaml
74
+ ---
75
+ adapter: :YAML
76
+ adapter_options:
77
+ :file: '%{_sharedstatedir}/%{gem_name}/%{gem_name}_data.yaml'
78
+ EOF
79
+
80
+ # Run the test suite
81
+ %check
82
+ pushd .%{gem_instdir}
83
+
84
+ popd
85
+
86
+ %files
87
+ %dir %{gem_instdir}
88
+ %{_bindir}/trocla
89
+ %{gem_instdir}/.rspec
90
+ %exclude %{gem_instdir}/.travis.yml
91
+ %exclude %{gem_instdir}/.rspec
92
+ %license %{gem_instdir}/LICENSE.txt
93
+ %{gem_instdir}/bin
94
+ %{gem_libdir}
95
+ %exclude %{gem_cache}
96
+ %{gem_spec}
97
+ %config(noreplace) %{_sysconfdir}/%{gem_name}rc.yaml
98
+ %dir %attr(755, root, root) %{_sharedstatedir}/%{gem_name}
99
+ %config(noreplace) %attr(660, root, root) %{_sharedstatedir}/%{gem_name}/%{gem_name}_data.yaml
100
+
101
+ %files doc
102
+ %doc %{gem_docdir}
103
+ %doc %{gem_instdir}/.document
104
+ %{gem_instdir}/Gemfile
105
+ %doc %{gem_instdir}/README.md
106
+ %{gem_instdir}/Rakefile
107
+ %{gem_instdir}/spec
108
+ %{gem_instdir}/trocla.gemspec
109
+
110
+ %changelog
111
+ * Mon Dec 21 2015 mh - 0.2.0-1
112
+ - Release of v0.2.0
113
+ * Sun Jun 21 2015 mh - 0.1.2-1
114
+ - Initial package
data/lib/VERSION CHANGED
@@ -1,4 +1,4 @@
1
1
  major:0
2
2
  minor:2
3
- patch:0
3
+ patch:1
4
4
  build:
@@ -49,6 +49,7 @@ class Trocla::Formats::X509 < Trocla::Formats::Base
49
49
  raise "Private key for #{subject} creation failed: #{e.message}"
50
50
  end
51
51
 
52
+ cert = nil
52
53
  if sign_with # certificate signed with CA
53
54
  begin
54
55
  ca_str = trocla.get_password(sign_with,'x509')
@@ -68,14 +69,12 @@ class Trocla::Formats::X509 < Trocla::Formats::Base
68
69
  end
69
70
 
70
71
  begin
71
- csr_cert = mkcert(caserial, request.subject, ca, request.public_key, days, altnames, name_constraints, become_ca)
72
- csr_cert.sign(cakey, signature(hash))
72
+ cert = mkcert(caserial, request.subject, ca, request.public_key, days, altnames, name_constraints, become_ca)
73
+ cert.sign(cakey, signature(hash))
73
74
  addserial(sign_with, caserial)
74
75
  rescue Exception => e
75
76
  raise "Certificate #{subject} signing failed: #{e.message}"
76
77
  end
77
-
78
- key.to_pem + csr_cert.to_pem
79
78
  else # self-signed certificate
80
79
  begin
81
80
  subj = OpenSSL::X509::Name.parse(subject)
@@ -84,12 +83,21 @@ class Trocla::Formats::X509 < Trocla::Formats::Base
84
83
  rescue Exception => e
85
84
  raise "Self-signed certificate #{subject} creation failed: #{e.message}"
86
85
  end
86
+ end
87
+ key.to_pem + cert.to_pem
88
+ end
87
89
 
88
- key.to_pem + cert.to_pem
90
+ def render(output,render_options={})
91
+ if render_options['keyonly']
92
+ OpenSSL::PKey::RSA.new(output).to_pem
93
+ elsif render_options['certonly']
94
+ OpenSSL::X509::Certificate.new(output).to_pem
95
+ else
96
+ super(output,render_options)
89
97
  end
90
98
  end
91
- private
92
99
 
100
+ private
93
101
  # nice help: https://gist.github.com/mitfik/1922961
94
102
 
95
103
  def signature(hash = 'sha2')
@@ -5,6 +5,9 @@ class Trocla::Formats
5
5
  def initialize(trocla)
6
6
  @trocla = trocla
7
7
  end
8
+ def render(output,render_options={})
9
+ output
10
+ end
8
11
  end
9
12
 
10
13
  class << self
data/lib/trocla.rb CHANGED
@@ -35,11 +35,14 @@ class Trocla
35
35
  elsif !options['random'] && plain_pwd.nil?
36
36
  raise "Password must be present as plaintext if you don't want a random password"
37
37
  end
38
- set_password(key,format,self.formats(format).format(plain_pwd,options),options)
38
+ set_password(key,
39
+ format,
40
+ self.formats(format).format(plain_pwd,options),
41
+ options)
39
42
  end
40
43
 
41
- def get_password(key, format)
42
- decrypt(store.get(key,format))
44
+ def get_password(key, format, options={})
45
+ render(format,decrypt(store.get(key,format)),options)
43
46
  end
44
47
 
45
48
  def reset_password(key,format,options={})
@@ -47,20 +50,20 @@ class Trocla
47
50
  password(key,format,options)
48
51
  end
49
52
 
50
- def delete_password(key,format=nil)
53
+ def delete_password(key,format=nil,options={})
51
54
  v = store.delete(key,format)
52
55
  if v.is_a?(Hash)
53
56
  Hash[*v.map do |f,encrypted_value|
54
- [f,decrypt(encrypted_value)]
57
+ [f,render(format,decrypt(encrypted_value),options)]
55
58
  end.flatten]
56
59
  else
57
- decrypt(v)
60
+ render(format,decrypt(v),options)
58
61
  end
59
62
  end
60
63
 
61
64
  def set_password(key,format,password,options={})
62
65
  store.set(key,format,encrypt(password),options)
63
- password
66
+ render(format,password,options)
64
67
  end
65
68
 
66
69
  def formats(format)
@@ -116,6 +119,14 @@ class Trocla
116
119
  encryption.decrypt(value)
117
120
  end
118
121
 
122
+ def render(format,output,options={})
123
+ if format && output && f=self.formats(format)
124
+ f.render(output,options['render']||{})
125
+ else
126
+ output
127
+ end
128
+ end
129
+
119
130
  def default_config
120
131
  require 'yaml'
121
132
  YAML.load(File.read(File.expand_path(File.join(File.dirname(__FILE__),'trocla','default_config.yaml'))))
@@ -90,6 +90,17 @@ describe "Trocla::Format::X509" do
90
90
  expect(ku).not_to match(/CRL Sign/)
91
91
  end
92
92
 
93
+ it 'supports fetching only the key' do
94
+ cert_str = @trocla.password('mycert', 'x509', cert_options.merge('render' => {'keyonly' => true }))
95
+ expect(cert_str).not_to match(/-----BEGIN CERTIFICATE-----/)
96
+ expect(cert_str).to match(/-----BEGIN RSA PRIVATE KEY-----/)
97
+ end
98
+ it 'supports fetching only the cert' do
99
+ cert_str = @trocla.password('mycert', 'x509', cert_options.merge('render' => {'certonly' => true }))
100
+ expect(cert_str).to match(/-----BEGIN CERTIFICATE-----/)
101
+ expect(cert_str).not_to match(/-----BEGIN RSA PRIVATE KEY-----/)
102
+ end
103
+
93
104
  it 'does not simply increment the serial' do
94
105
  cert_str = @trocla.password('mycert', 'x509', cert_options)
95
106
  cert1 = OpenSSL::X509::Certificate.new(cert_str)
data/trocla.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: trocla 0.2.0 ruby lib
5
+ # stub: trocla 0.2.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "trocla"
9
- s.version = "0.2.0"
9
+ s.version = "0.2.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["mh"]
14
- s.date = "2015-12-21"
14
+ s.date = "2016-01-27"
15
15
  s.description = "Trocla helps you to generate random passwords and to store them in various formats (plain, MD5, bcrypt) for later retrival."
16
16
  s.email = "mh+trocla@immerda.ch"
17
17
  s.executables = ["trocla"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "README.md",
29
29
  "Rakefile",
30
30
  "bin/trocla",
31
+ "ext/redhat/rubygem-trocla.spec",
31
32
  "lib/VERSION",
32
33
  "lib/trocla.rb",
33
34
  "lib/trocla/default_config.yaml",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trocla
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - mh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-21 00:00:00.000000000 Z
11
+ date: 2016-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: moneta
@@ -126,6 +126,7 @@ files:
126
126
  - README.md
127
127
  - Rakefile
128
128
  - bin/trocla
129
+ - ext/redhat/rubygem-trocla.spec
129
130
  - lib/VERSION
130
131
  - lib/trocla.rb
131
132
  - lib/trocla/default_config.yaml