r509-middleware-certwriter 0.1

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.
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEVTCCAz2gAwIBAgIQK5l6hFau2oVFyjrq4Y3tYjANBgkqhkiG9w0BAQUFADBI
3
+ MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
4
+ FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTExMDIxNzAxMDkxM1oXDTExMDIx
5
+ ODAyMzYyNVowXDESMBAGA1UEAxMJbGFuZ3VpLnNoMRAwDgYDVQQHEwdDaGljYWdv
6
+ MREwDwYDVQQIEwhJbGxpbm9pczELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1BhdWwg
7
+ S2VocmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3/vt5cvm4ObA
8
+ AUoKXqjT9hWbN7c//piYtypGCvUWPqXElIWSpftMfmyIyujXGVx1TtpjSTX1VORB
9
+ J1N4ZmGsEnyS5Z4jw6kFtKBEA6avIezYfAwUU+GKL5xvJ2iuwPgVzrDwADD1lSio
10
+ worMdqeZMfClVBbeLPE1ZZQrj1YV4ywpfEUVNNkmYLxetT8WyGFmFopiQWv21v0u
11
+ BWfWa1c8wQMrLNSzDot76+CgqC/j9AFcfv75M77WktDlz8zFm142UUe0Clx3DzlO
12
+ k+OepGYLUhRZaGhiP56qW2kgQpeQ+Otiu7NrJP1oa6lP1inzr25aStWtt9+0uJAJ
13
+ LvHisvPV7QIDAQABo4IBJTCCASEwCQYDVR0TBAIwADAdBgNVHQ4EFgQUOnG63iFQ
14
+ miWaAnvO7ve38SmF2FEwHwYDVR0jBBgwFoAUQjK2FvoE/f5dS3rD/fdMQB1aQ68w
15
+ CwYDVR0PBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMDQGA1UdHwQtMCswKaAn
16
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NUQ0EuY3JsMEQGA1UdIAQ9
17
+ MDswOQYMYIZIAYb9ZAEBAgMBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly9zc2wudHJ1
18
+ c3R3YXZlLmNvbS9DQTA2BgNVHREELzAtgglsYW5ndWkuc2iCC3ZpY3RvbHkuY29t
19
+ ghNteXRlYW1nb3Ryb2JiZWQuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQB8t6JEw494
20
+ wMHyPN8K65PmImqdI4qL5W4T141vG+SnynSsyF2gdnwfWC8esoVOBK8LxSxq5dqL
21
+ 7DRWwJww5YELWhVGz9BMGqpsUQ8ea1EX2YRkguqhIs9Ox/D0zcE5T0t4CXAoqJoW
22
+ h1A3UBknOgHNtxbBcQUINITj+IIQ99yZdf/X5QnuyRxk+FheUtuR/PGSHi5s0GOh
23
+ aEysvcklQTZXaQ+yeq5mH9LrKlBaEgo2BWnzWuWbudNJ3Pn16MHE4hGesiO/ifu4
24
+ D4ZcDusOOKJISgellMBwEX9njm771lzcVrXrg8IxBwHAmbA5SlTd12DOhrViPuEC
25
+ DhMwdOfwCNq/
26
+ -----END CERTIFICATE-----
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDcTCCAlmgAwIBAgIVAOwRcCniDRHmYonGNci2hn7WEUjbMA0GCSqGSIb3DQEB
3
+ BQUAMFgxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwH
4
+ Q2hpY2FnbzERMA8GA1UECgwIcjUwOSBMTEMxETAPBgNVBAMMCMO8dGYuY29tMB4X
5
+ DTEyMDczMTA5NTk0OFoXDTEyMDgwNTE1NTk0OFowWDELMAkGA1UEBhMCVVMxETAP
6
+ BgNVBAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMREwDwYDVQQKDAhyNTA5
7
+ IExMQzERMA8GA1UEAwwIw7x0Zi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
8
+ ggEKAoIBAQCcM1YlpONMNoK+VZRe/fygehtQoNhc/NEvpD4g9z61jY9JrRAiS/sj
9
+ FqVYUyJIoQ8x2tpiJMqzTfdTXVbXdVi6iuDYGg6oiski3N8wa8Ya2FWEWS0nCdiM
10
+ AYCX5imyHY9qJqRCGo8mzFjdPQ1YL5qEIN8a7to82F81P9D+AWaPeXgvR/AuWNXo
11
+ ZTTWDxf2hHhBI00lMkQYk/JP//jq4vhArnvhP/NjQRMPv+Oc7/oKG0dPGp8IMVt0
12
+ B+Gus/Lte6GFqSt3A4j3JslUR7s5tZMvNoYCHTp70n3So28U7zSFjqtLZ0qYdMnw
13
+ +ysrVeemz4iUBjLFDuUoUFETLJCZxN4HAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMB
14
+ Af8wHQYDVR0OBBYEFIZITcrz5duBFkyK1USyvJn6dBh2MA0GCSqGSIb3DQEBBQUA
15
+ A4IBAQCFzmlRVaLjzo3CzETtNcg3rqItIugXX1xtVBYdmXE+OZu54zEUCKRphave
16
+ 4j/fjx7UVRlZJfkpxw77bXcOt+pgAuKogVv8b0jNVLI/IJSqpdLYRmNBmO/z5Tsn
17
+ bJ2anRLxYABxx3QiyxbteJ5kNyqkOXdC92YT0ajYcsI1PYr5bC+yc4oju3dkVHox
18
+ 6nbghWIZxbLq08DO3FwbTZk7OOERFYakntaEV7A9HI75pct9fR03lej86wthLCva
19
+ bf4jZw6fbLZTMK8AIGm0dSlkNWzN7XB6xDyxxYoCauZc+TBoZg4hXAzwfgZcX3Rr
20
+ MHJh+Ni/iMiCFSZPcZqauprdCldD
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDpzCCAo+gAwIBAgIFMUeGsoAwDQYJKoZIhvcNAQEFBQAwSDELMAkGA1UEBhMC
3
+ VVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5T
4
+ ZWN1cmVUcnVzdCBDQTAeFw0wOTA1MjkyMDM0NTdaFw0xMDA1MjkyMDM0NTdaMHcx
5
+ CzAJBgNVBAYTAlVTMREwDwYDVQQIEwhJbGxpbm9pczEQMA4GA1UEBxMHQ2hpY2Fn
6
+ bzEtMCsGA1UEChMkVHJ1c3R3YXZlIChUcnVzdHdhdmUgSG9sZGluZ3MsIEluYy4p
7
+ MRQwEgYDVQQDFAsqLnhyYW1wLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
8
+ gYEA16PhTcHPpJcvXj0sO+hYt4z2zKn5XRj0jrDpwzahxUWn0UWfsYxJHtOpSm/p
9
+ O8zM3aCv5YI+0DwVWhzkKzh15nL5XtiyhXz2CSg4IskVqYlHJwLN1TasYpiQ3chj
10
+ 0v33GGXg0JjCdX5XM8fl2K/MCHpl6HTNmxHVpr4sghyUBFUCAwEAAaOB7DCB6TAJ
11
+ BgNVHRMEAjAAMB0GA1UdDgQWBBSGo0yuScr4ea0rLYwuTnN/mmD5aDAfBgNVHSME
12
+ GDAWgBRCMrYW+gT9/l1LesP990xAHVpDrzALBgNVHQ8EBAMCBaAwEwYDVR0lBAww
13
+ CgYIKwYBBQUHAwEwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC5zZWN1cmV0
14
+ cnVzdC5jb20vU1RDQS5jcmwwRAYDVR0gBD0wOzA5BgxghkgBhv1kAQECAwEwKTAn
15
+ BggrBgEFBQcCARYbaHR0cDovL3NzbC50cnVzdHdhdmUuY29tL0NBMA0GCSqGSIb3
16
+ DQEBBQUAA4IBAQBxuF3OJYj4e/4flpn2xRB5HTZtdTJGa0xdhs4cuZfDaH1J26kS
17
+ D/DEJSjQijxMmRCkBFzjqet095Nxo/Gk4Ak+A6I49vWfg4EYEGfCHq95D40EoLUl
18
+ +P4n4SqGUWuHCdVue8V61qGhMv4t4aqaodO212oykfkwguX1t1QAqBisBd3trUJC
19
+ nqeHRdhPQfwSXbEgwPCnvS6QAngwg1BRCK5NJ2V2ybhaSHZLSzTV+n2sh03j2OAw
20
+ DX1jPcls0lN9TytLZJUkZJjgr/v2yYUlwEGC6ZMHE16ycVAbTxW94LBYKlsCpR3Q
21
+ kArWrEDOOBl5g0Va/FZliL046AN3EM2lYfWa
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,188 @@
1
+ # coding: utf-8
2
+ require "#{File.dirname(__FILE__)}/spec_helper"
3
+ require "sinatra"
4
+ require "logger"
5
+ require "fileutils"
6
+
7
+ class TestServer < Sinatra::Base
8
+ configure do
9
+ set :config_pool, nil
10
+ end
11
+
12
+ error StandardError do
13
+ env["sinatra.error"].message
14
+ end
15
+
16
+ get "/some/path/?" do
17
+ "return value"
18
+ end
19
+
20
+ post "/1/certificate/issue/?" do
21
+ if params["successful"]
22
+ if params["cert"]
23
+ params["cert"]
24
+ else
25
+ TestFixtures::CERT
26
+ end
27
+ elsif params["invalid_body"]
28
+ "invalid cert body"
29
+ else
30
+ raise StandardError.new("Error")
31
+ end
32
+ end
33
+
34
+ post "/1/certificate/revoke/?" do
35
+ if params["successful"]
36
+ "CRL"
37
+ else
38
+ raise StandardError.new("Error")
39
+ end
40
+ end
41
+
42
+ post "/1/certificate/unrevoke/?" do
43
+ if params["successful"]
44
+ "CRL"
45
+ else
46
+ raise StandardError.new("Error")
47
+ end
48
+ end
49
+ end
50
+
51
+ describe R509::Middleware::Certwriter do
52
+ before :all do
53
+ @temp_write_directory = File.join("spec", "temp_write_directory")
54
+ FileUtils.makedirs(@temp_write_directory)
55
+ end
56
+ before :each do
57
+ @logger = double("logger")
58
+ @config = double("config")
59
+ @ca_cert = double("ca_cert")
60
+ @config_pool = double("config_pool")
61
+ Dependo::Registry[:log] = @logger
62
+ end
63
+ after :each do
64
+ Dir.entries(@temp_write_directory).select{|x| not x.start_with?(".")}.each do |entry|
65
+ File.delete(File.join(@temp_write_directory, entry))
66
+ end
67
+ end
68
+ after :all do
69
+ Dir.delete(@temp_write_directory)
70
+ end
71
+
72
+ def app
73
+ test_server = TestServer
74
+ test_server.send(:set, :config_pool, @config_pool)
75
+
76
+ @app ||= R509::Middleware::Certwriter.new(test_server, @config)
77
+ end
78
+
79
+ context "some path" do
80
+ it "returns some return value" do
81
+ get "/some/path"
82
+ last_response.body.should == "return value"
83
+ end
84
+ end
85
+
86
+ context "issuing" do
87
+ it "intercepts issuance" do
88
+ filename = "langui.sh_testy_211653423715.pem"
89
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
90
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
91
+
92
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
93
+ last_response.status.should == 200
94
+ last_response.body.should == TestFixtures::CERT
95
+
96
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::CERT
97
+ end
98
+ it "no certwriter" do
99
+ filename = "langui.sh_testy_211653423715.pem"
100
+ @config.should_receive(:[]).with("certwriter").and_return(nil)
101
+ @logger.should_receive(:error).twice
102
+
103
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
104
+ last_response.status.should == 200
105
+ last_response.body.should == TestFixtures::CERT
106
+
107
+ File.exist?(File.join(@temp_write_directory, filename)).should == false
108
+ end
109
+ it "no certwriter path" do
110
+ filename = "langui.sh_testy_211653423715.pem"
111
+ @config.should_receive(:[]).with("certwriter").and_return({})
112
+ @logger.should_receive(:error).twice
113
+
114
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
115
+ last_response.status.should == 200
116
+ last_response.body.should == TestFixtures::CERT
117
+
118
+ File.exist?(File.join(@temp_write_directory, filename)).should == false
119
+ end
120
+ it "fails issuance" do
121
+ post "/1/certificate/issue/"
122
+ last_response.status.should == 500
123
+ end
124
+ it "invalid cert body" do
125
+ @logger.should_receive(:error).twice
126
+ post "/1/certificate/issue", :invalid_body => true
127
+ last_response.status.should == 200
128
+ last_response.body.should == "invalid cert body"
129
+ end
130
+ it "wildcard" do
131
+ filename = "STAR.xramp.com_testy_211653407360.pem"
132
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
133
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
134
+
135
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::WILDCARD, :ca => "testy"
136
+ last_response.status.should == 200
137
+ last_response.body.should == TestFixtures::WILDCARD
138
+
139
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::WILDCARD.chomp
140
+ end
141
+ it "san" do
142
+ filename = "langui.sh_testy_57953710177023404420300898930034339170.pem"
143
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
144
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
145
+
146
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::SAN, :ca => "testy"
147
+ last_response.status.should == 200
148
+ last_response.body.should == TestFixtures::SAN
149
+
150
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::SAN.chomp
151
+ end
152
+ it "non-ascii characters" do
153
+ filename = "tf.com_testy_1347710705410875939179018156461170725106572413147.pem"
154
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
155
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
156
+
157
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::UTF, :ca => "testy"
158
+ last_response.status.should == 200
159
+ last_response.body.should == TestFixtures::UTF
160
+
161
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::UTF.chomp
162
+ end
163
+ end
164
+
165
+ context "revoking" do
166
+ it "intercepts revoke" do
167
+ post "/1/certificate/revoke", :successful => true, :serial => 1234, :ca => "some_ca"
168
+ last_response.status.should == 200
169
+ last_response.body.should == "CRL"
170
+ end
171
+ it "fails to revoke" do
172
+ post "/1/certificate/revoke"
173
+ last_response.status.should == 500
174
+ end
175
+ end
176
+
177
+ context "unrevoking" do
178
+ it "intercepts unrevoke" do
179
+ post "/1/certificate/unrevoke", :successful => true, :serial => 1234, :ca => "some_ca"
180
+ last_response.status.should == 200
181
+ last_response.body.should == "CRL"
182
+ end
183
+ it "fails to unrevoke" do
184
+ post "/1/certificate/unrevoke"
185
+ last_response.status.should == 500
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,16 @@
1
+ if (RUBY_VERSION.split('.')[1].to_i > 8)
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ $:.unshift File.expand_path("../../lib", __FILE__)
7
+ $:.unshift File.expand_path("../", __FILE__)
8
+ require 'rubygems'
9
+ require 'fixtures'
10
+ require 'rspec'
11
+ require 'rack/test'
12
+ require 'r509/middleware/certwriter'
13
+
14
+ RSpec.configure do |conf|
15
+ conf.include Rack::Test::Methods
16
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: r509-middleware-certwriter
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Schulte
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: &2154591280 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2154591280
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack
27
+ requirement: &2154590760 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2154590760
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &2154590240 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2154590240
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &2154589800 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2154589800
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack-test
60
+ requirement: &2154589280 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2154589280
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: &2154604540 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2154604540
80
+ description: Rack middleware that writes issued certificates to disk
81
+ email: sirsean@gmail.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - README.md
87
+ - Rakefile
88
+ - lib/r509/middleware/certwriter/version.rb
89
+ - lib/r509/middleware/certwriter.rb
90
+ - spec/fixtures/cert1.pem
91
+ - spec/fixtures/san.pem
92
+ - spec/fixtures/utf.pem
93
+ - spec/fixtures/wildcard.pem
94
+ - spec/fixtures.rb
95
+ - spec/middleware_spec.rb
96
+ - spec/spec_helper.rb
97
+ - doc/_index.html
98
+ - doc/class_list.html
99
+ - doc/css/common.css
100
+ - doc/css/full_list.css
101
+ - doc/css/style.css
102
+ - doc/file.README.html
103
+ - doc/file_list.html
104
+ - doc/frames.html
105
+ - doc/index.html
106
+ - doc/js/app.js
107
+ - doc/js/full_list.js
108
+ - doc/js/jquery.js
109
+ - doc/method_list.html
110
+ - doc/R509/Middleware/Certwriter.html
111
+ - doc/R509/Middleware.html
112
+ - doc/R509.html
113
+ - doc/top-level-namespace.html
114
+ homepage: http://vikinghammer.com
115
+ licenses: []
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 1.8.6
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ segments:
133
+ - 0
134
+ hash: -1561366354408036506
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 1.8.10
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: Rack middleware that writes issued certificates to disk
141
+ test_files: []
142
+ has_rdoc: false