rbmk 0.1.0.a → 0.1.0.b

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: 915c433f207ea0656ded0512c10507183ba35211
4
- data.tar.gz: 8ee0b1ef7c46e215b298783d0597dd6d085368f0
3
+ metadata.gz: e1099ee731e3c1c408f0489dd03bc02e6a5256e3
4
+ data.tar.gz: a9e3cec5e9f6899f7883d20e790f61b953d90ddc
5
5
  SHA512:
6
- metadata.gz: 9fe9a3bce2171a3b8466f6034d0569ccbb691fe2aee9a161b2ffed4d5695e9bbd68e7b8662d71284a01952cca1c6bbafee621a5f914f589918c3edb915ad359c
7
- data.tar.gz: 8fa2b7a9794a4a6bbfb8d25b279445c87a4d20d8936e70fd57c292cd808895bc44e7dcde0eaf14f495c6d2d700b5067dbe57ed1ab1c276c2ad2d20680edbfd7a
6
+ metadata.gz: 23278488b01fdbb876067fd2dd64e14038aafb6657d13769f22d9392f1cdc4e9ba9a0f20d905fb8adc6c61b19ee7d248ecfdf0f030d48ee660dc10f4a3b38813
7
+ data.tar.gz: 2a3b4d58d04c4635fdcc575b839a22eb77831978472a4c52ab85817125e99b2594f24076ac083ce9d2917c9ce3eb58002c47c3bd0d77bba0aa72dea7ac4283cd
data/examples/rbmk.rb CHANGED
@@ -18,26 +18,22 @@ module RBMK::Logger
18
18
  def self.level; ::Logger::DEBUG end
19
19
  end
20
20
 
21
- # The magic! You can transform the found entries here
21
+ # The magic! You can transform the LDAP operations
22
22
  #
23
- module RBMK
23
+ module RBMK::Transform
24
+
24
25
  # For example, we can add a fooBar attribute to any resulting object
25
26
  #
26
- def self.hack_entries entries
27
+ def self.entries entries
27
28
  entries.map do |entry|
28
29
  entry.merge 'fooBar' => 'baz'
29
30
  end
30
31
  end
31
32
 
32
- # In this example we drop fooBar attribute from anywhere in the search
33
+ # In this example we override atrributes in the request so that all of them are requested all the time
33
34
  #
34
- def self.hack_filter filter
35
- op = filter.shift
36
- case op
37
- when :true, :false, :undef then [op]
38
- when :not, :and, :or then [op] + filter.map { |sf| hack_filter sf }.compact
39
- else (filter.first =~ /\Afoobar\z/i) ? nil : [op] + filter
40
- end
35
+ def self.search opts
36
+ opts.merge attrs: ['*', '+']
41
37
  end
42
38
 
43
39
  end
@@ -18,19 +18,20 @@ end
18
18
 
19
19
 
20
20
  class LDAP::Server::Filter
21
- def self.to_rfc filter
22
- raise ArgumentError, 'Array expected' unless filter.is_a? Array
23
- raise ArgumentError, 'Filter is empty' if filter.empty?
21
+ def self.to_rfc preserved_filter
22
+ raise ArgumentError, 'Array expected' unless preserved_filter.is_a? Array
23
+ raise ArgumentError, 'Filter is empty' if preserved_filter.empty?
24
+ filter = preserved_filter.clone
24
25
  op = filter.shift
25
26
  res = case op
26
27
  when :not then
27
- raise 'Empty subfilter' if (sf = to_rfc filter).empty?
28
+ raise 'Empty subfilter' if (sf = send(__method__, filter)).empty?
28
29
  '!%s' % sf
29
30
  when :and then
30
- raise 'Empty subfilter' if (sf = filter.map { |f| to_rfc(f) }.join).empty?
31
+ raise 'Empty subfilter' if (sf = filter.map { |f| send(__method__, f) }.join).empty?
31
32
  '&%s' % sf
32
33
  when :or
33
- raise 'Empty subfilter' if (sf = filter.map { |f| to_rfc(f) }.join).empty?
34
+ raise 'Empty subfilter' if (sf = filter.map { |f| send(__method__, f) }.join).empty?
34
35
  '!%s' % sf
35
36
 
36
37
  when :true then 'objectClass=*'
@@ -57,7 +58,7 @@ end
57
58
 
58
59
 
59
60
 
60
- require 'rbmk'
61
+ require 'rbmk/transform'
61
62
  module RBMK
62
63
  class Operation < LDAP::Server::Operation
63
64
 
@@ -143,27 +144,43 @@ class Operation < LDAP::Server::Operation
143
144
  end
144
145
 
145
146
 
146
-
147
+ # --------------------------------------------------------------------------
147
148
  # Okay, now the actual code
148
149
  #
150
+ def initialize conn, mid
151
+ super conn, mid
152
+ @orig = {}
153
+ @transformed = {}
154
+ end
155
+
149
156
  def simple_bind version, dn, password
150
- RBMK.context[:binddn] = {orig: dn}
151
- version, dn, password = transformed(simple_bind: [version, dn, password])
152
- RBMK.context[:binddn][:hacked] = dn
153
- $log.info sprintf('Bind v%i, dn: %p -> %p', version, RBMK.context[:binddn][:orig], RBMK.context[:binddn][:hacked])
154
- @server.bind version, dn, password
157
+ orig = {version: version, dn: dn, password: password}
158
+ opts = transformed __method__ => orig.clone
159
+ $log.info sprintf('Bind version: %s, dn: %s',
160
+ log_chunk(orig, opts, '%i', :version),
161
+ log_chunk(orig, opts, '%p', :dn)
162
+ )
163
+ @server.bind *opts.values_at(:version, :dn, :password)
155
164
  rescue LDAP::ResultError
156
165
  $!.log_debug
157
166
  raise $!
158
167
  end
159
168
 
160
- def search basedn, scope, deref, filter
161
- RBMK.context[:filter] = {orig: filter, hacked: transformed(filter: filter)}
162
- filter = LDAP::Server::Filter.to_rfc RBMK.context[:filter][:hacked]
163
- $log.info sprintf('Search %p from %p, scope: %i, deref: %i, attrs: %p, no_values: %s, max: %i', filter, basedn, scope, deref, @attributes, @typesOnly, (@sizelimit.to_i rescue 0))
164
- entries = @server.ldap.search_ext2 basedn, scope, filter, ['*', '+'], @typesOnly, nil, nil, 0, 0, (@sizelimit.to_i rescue 0)
165
- #require 'pp'
166
- #pp entries
169
+ def search base, scope, deref, filter
170
+ orig = {filter_array: filter, base: base, scope: scope, deref: deref, attrs: @attributes, vals: (not @typesOnly), limit: (@sizelimit.to_i rescue 0)}
171
+ opts = transformed __method__ => orig.clone
172
+ orig[:filter_string] = LDAP::Server::Filter.to_rfc orig[:filter_array]
173
+ opts[:filter_string] = LDAP::Server::Filter.to_rfc opts[:filter_array]
174
+ $log.info sprintf('Search %s from %s, scope: %s, deref: %s, attrs: %s, vals: %s, limit: %s',
175
+ log_chunk(orig, opts, '%p', :filter_string),
176
+ log_chunk(orig, opts, '%p', :base),
177
+ log_chunk(orig, opts, '%i', :scope),
178
+ log_chunk(orig, opts, '%i', :deref),
179
+ log_chunk(orig, opts, '%p', :attrs),
180
+ log_chunk(orig, opts, '%s', :vals),
181
+ log_chunk(orig, opts, '%i', :limit),
182
+ )
183
+ entries = @server.ldap.search_ext2(*opts.values_at(:base, :scope, :filter_string, :attrs), (not opts[:vals]), nil, nil, 0, 0, opts[:limit])
167
184
  transformed(entries: entries).each { |entry| send_SearchResultEntry entry.delete('dn').first, entry }
168
185
  rescue LDAP::ResultError
169
186
  @server.handle_ldap_error
@@ -171,9 +188,24 @@ class Operation < LDAP::Server::Operation
171
188
 
172
189
  protected
173
190
 
191
+ def log_chunk orig, transformed, format, key
192
+ if orig[key] === transformed[key] then
193
+ format % orig[key]
194
+ else
195
+ sprintf "(#{format} -> #{format})", orig[key], transformed[key]
196
+ end
197
+ rescue
198
+ p orig, transformed, format, key
199
+ raise $!
200
+ end
201
+
174
202
  def transformed spec
175
203
  raise ArgumentError.new('Please provide a hash with exactly one key.') unless (spec.is_a? Hash) and (1 == spec.count)
176
- spec.each { |type, object| return RBMK.send "hack_#{type}".to_sym, object }
204
+ spec.each do |type, object|
205
+ @orig[type] = object
206
+ transformed = RBMK::Transform.send type, object
207
+ return @transformed[type] = transformed
208
+ end
177
209
  rescue
178
210
  $!.log
179
211
  object
@@ -0,0 +1,33 @@
1
+ module RBMK
2
+ module Transform
3
+
4
+ # Patch this method to transform incoming bind data.
5
+ # Expect a hash with these keys:
6
+ # :version LDAP protocol version; should probably be 3
7
+ # :dn Bind DN; like a "username"
8
+ # :password Cleartext! Verrrry sensitive!
9
+ def self.simple_bind opts
10
+ opts
11
+ end
12
+
13
+ # Patch this method to transform incoming search parameters.
14
+ # Expect a hash with these keys:
15
+ # :base Search base DN
16
+ # :scope 0 is base, 1 is onelevel, 2 is subtree
17
+ # :deref whether to follow aliases (no time to explain, read more otherwhere)
18
+ # :filter_array IMPORTANT: this is a parsed filter from Ldap::Server as an array-tree
19
+ # :attrs Attributes to be included in resulting objects
20
+ # :vals Whether to include values at all
21
+ # :limit Search will not return more than this amount of objects
22
+ def self.search opts
23
+ opts
24
+ end
25
+
26
+ # Patch this method to transform outbound found entries.
27
+ # Expect an array of hashes, each of which MUST have a 'dn' key
28
+ def self.found entries
29
+ entries
30
+ end
31
+
32
+ end
33
+ end
data/lib/rbmk/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module RBMK
2
- VERSION = '0.1.0.a'
3
- CODENAME = 'plan b'
2
+ VERSION = '0.1.0.b'
3
+ CODENAME = 'break the black ice'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbmk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.a
4
+ version: 0.1.0.b
5
5
  platform: ruby
6
6
  authors:
7
7
  - stronny red
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-23 00:00:00.000000000 Z
11
+ date: 2015-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-ldap
@@ -55,13 +55,13 @@ files:
55
55
  - README.md
56
56
  - bin/rbmk
57
57
  - examples/rbmk.rb
58
- - lib/rbmk.rb
59
58
  - lib/rbmk/exception.rb
60
59
  - lib/rbmk/logger.rb
61
60
  - lib/rbmk/operation.rb
62
61
  - lib/rbmk/peer.rb
63
62
  - lib/rbmk/server.rb
64
63
  - lib/rbmk/signal.rb
64
+ - lib/rbmk/transform.rb
65
65
  - lib/rbmk/upstream.rb
66
66
  - lib/rbmk/version.rb
67
67
  - lib/rbmk/worker.rb
data/lib/rbmk.rb DELETED
@@ -1,26 +0,0 @@
1
- module RBMK
2
-
3
- def self.context
4
- @context ||= {}
5
- end
6
-
7
- # Patch this method to hack incoming bind data
8
- #
9
- def self.hack_simple_bind data
10
- # version, dn, password = data
11
- data
12
- end
13
-
14
- # Patch this method to hack incoming search filters
15
- #
16
- def self.hack_filter filter
17
- filter
18
- end
19
-
20
- # Patch this method to hack outbound found entries
21
- #
22
- def self.hack_entries entries
23
- entries
24
- end
25
-
26
- end