rbmk 0.1.0.a → 0.1.0.b

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.
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