fenris 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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: