fenris 0.0.5 → 0.0.6

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.
data/lib/fenris/client.rb CHANGED
@@ -109,8 +109,13 @@ module Fenris
109
109
  OpenSSL::Digest::SHA1.new(obj.to_der).to_s
110
110
  end
111
111
 
112
- def generate_csr
113
- subject = OpenSSL::X509::Name.parse "/DC=org/DC=fenris/CN=#{user_name}"
112
+ def generate_csr(provider)
113
+ if provider == :self
114
+ subject = OpenSSL::X509::Name.parse "/DC=org/DC=fenris/CN=#{user_name}"
115
+ else
116
+ subject = OpenSSL::X509::Name.parse "/DC=org/DC=fenris/CN=#{user_name}:#{provider}"
117
+ end
118
+ log "CSR: #{subject}"
114
119
  digest = OpenSSL::Digest::SHA1.new
115
120
  req = OpenSSL::X509::Request.new
116
121
  req.version = 0
@@ -130,13 +135,16 @@ module Fenris
130
135
  cert_cn = get_cn(consumer_cert)
131
136
  valid_peer_names = [ peer_name ] if peer_name
132
137
  valid_peer_names ||= consumers.map { |c| c["name"] }
133
- cn_ok = !!valid_peer_names.detect { |name| name == cert_cn }
138
+ consumer_cn,provider_cn = cert_cn.split ":"
139
+ provider_cn_ok = !!user_name
140
+ consumer_cn_ok = !!valid_peer_names.detect { |name| name == consumer_cn }
134
141
  cert_ok = !!consumer_cert.verify(broker.public_key)
135
- log "Consumer Cert CN '#{cert_cn}' in allowed_list? #{cn_ok}"
142
+ log "Consumer Cert CN '#{cert_cn}' displays correct provider? #{provider_cn_ok}"
143
+ log "Consumer Cert CN '#{cert_cn}' in allowed_list? #{consumer_cn_ok}"
136
144
  log "Consumer Cert Signed By Broker? '#{cert_ok}'"
137
- result = cn_ok and cert_ok
145
+ result = consumer_cn_ok and provider_cn_ok and cert_ok
138
146
  unless result
139
- log "Certificate verification failed. connection closed [#{cn_ok}] [#{cert_ok}]"
147
+ log "Certificate verification failed. connection closed [#{consumer_cn_ok}] [#{provider_cn_ok}] [#{cert_ok}]"
140
148
  peer_connection.close_connection if peer_connection
141
149
  end
142
150
  result
@@ -147,7 +155,8 @@ module Fenris
147
155
  log "Deleting socket '#{provider["binding"]}'."
148
156
  File.delete provider["binding"] if File.exists? provider["binding"]
149
157
  end
150
- [ cert_path, key_path ].each do |f|
158
+ ## TODO - gawd! ugly!
159
+ [ *providers.map { |c| c["name"] }.map { |provider| cert_path(provider) }, cert_path, key_path ].each do |f|
151
160
  if File.exists? f
152
161
  log "Deleting file #{f}"
153
162
  File.delete f
@@ -156,12 +165,15 @@ module Fenris
156
165
  end
157
166
 
158
167
  def save_keys
168
+ providers.map { |c| c["name"] }.each do |provider|
169
+ File.open(cert_path(provider),"w") { |f| f.write cert(provider).to_pem } unless File.exists? cert_path(provider)
170
+ end
159
171
  File.open(cert_path,"w") { |f| f.write cert.to_pem } unless File.exists? cert_path
160
172
  File.open(key_path,"w") { |f| f.write key.to_pem } unless File.exists? key_path
161
173
  end
162
174
 
163
- def gen_cert
164
- cert = OpenSSL::X509::Certificate.new(RestClient.post("#{@url}cert", :csr => generate_csr))
175
+ def gen_cert(provider)
176
+ cert = OpenSSL::X509::Certificate.new(RestClient.post("#{@url}cert", :csr => generate_csr(provider)))
165
177
  log "new cert received #{digest cert}"
166
178
  cert
167
179
  end
@@ -182,9 +194,10 @@ module Fenris
182
194
  @broker ||= OpenSSL::X509::Certificate.new(RestClient.get("#{@url}cert"))
183
195
  end
184
196
 
185
- def cert
186
- @cert ||= OpenSSL::X509::Certificate.new(File.read(cert_path)) rescue nil
187
- @cert ||= gen_cert
197
+ def cert(provider = :self)
198
+ @cert ||= {}
199
+ @cert[provider] ||= OpenSSL::X509::Certificate.new(File.read(cert_path(provider))) rescue nil
200
+ @cert[provider] ||= gen_cert(provider)
188
201
  end
189
202
 
190
203
  def key
@@ -192,8 +205,12 @@ module Fenris
192
205
  @key ||= gen_key
193
206
  end
194
207
 
195
- def cert_path
196
- ".#{user_name}.cert"
208
+ def cert_path(provider = :self)
209
+ if provider == :self
210
+ ".#{user_name}.cert"
211
+ else
212
+ ".#{user_name}:#{provider}.cert"
213
+ end
197
214
  end
198
215
 
199
216
  def key_path
data/lib/fenris/em.rb CHANGED
@@ -69,6 +69,7 @@ module Fenris
69
69
  EventMachine::__send__ *mkbinding(:connect, internal), Fenris::Connection do |provider|
70
70
  client.log "start proxying"
71
71
  provider.proxy consumer; consumer.proxy provider
72
+ provider.on_unbind { client.log "Connection closed" }
72
73
  end
73
74
  end
74
75
  end
@@ -119,7 +120,7 @@ module Fenris
119
120
  EventMachine::__send__ *mkbinding(:connect, provider), Fenris::Connection do |provider|
120
121
  client.log "Connection to the server made, starting ssl"
121
122
  provider.validate_peer { |pem| client.validate_peer pem, consumer, provider_name }
122
- provider.begin_ssl :key_file => client.key_path , :cert_file => client.cert_path do
123
+ provider.begin_ssl :key_file => client.key_path , :cert_file => client.cert_path(provider_name) do
123
124
  client.log "SSL complete - start proxying"
124
125
  provider.proxy consumer; consumer.proxy provider
125
126
  end
@@ -1,3 +1,3 @@
1
1
  module Fenris
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fenris
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 5
8
+ - 6
9
9
  prerelease: false
10
10
  platform: ruby
11
11
  authors:
@@ -13,12 +13,12 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2011-10-25 00:00:00.000000000 -07:00
16
+ date: 2011-10-26 00:00:00.000000000 -07:00
17
17
  default_executable:
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: eventmachine
21
- requirement: &2155110000 !ruby/object:Gem::Requirement
21
+ requirement: &2153842880 !ruby/object:Gem::Requirement
22
22
  none: false
23
23
  requirements:
24
24
  - - ! '>='
@@ -30,10 +30,10 @@ dependencies:
30
30
  - 10
31
31
  type: :runtime
32
32
  prerelease: false
33
- version_requirements: *2155110000
33
+ version_requirements: *2153842880
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: rest-client
36
- requirement: &2155108480 !ruby/object:Gem::Requirement
36
+ requirement: &2153842060 !ruby/object:Gem::Requirement
37
37
  none: false
38
38
  requirements:
39
39
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  - 7
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *2155108480
48
+ version_requirements: *2153842060
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: multi_json
51
- requirement: &2155106900 !ruby/object:Gem::Requirement
51
+ requirement: &2153841300 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -60,7 +60,7 @@ dependencies:
60
60
  - 3
61
61
  type: :runtime
62
62
  prerelease: false
63
- version_requirements: *2155106900
63
+ version_requirements: *2153841300
64
64
  description: An authentication and service location service.
65
65
  email: orion.henry@gmail.com
66
66
  executables: