Skip to content

Commit 1338f16

Browse files
committed
RUBY-1021 Ensure options merged with client options are Options::Redacted instances
1 parent fec72a9 commit 1338f16

File tree

9 files changed

+42
-18
lines changed

9 files changed

+42
-18
lines changed

lib/mongo/client.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def inspect
185185
#
186186
# @since 2.0.0
187187
def read_preference
188-
@read_preference ||= ServerSelector.get((options[:read] || {}).merge(options))
188+
@read_preference ||= ServerSelector.get(Options::Redacted.new(options[:read] || {}).merge(options))
189189
end
190190

191191
# Use the database with the provided name. This will switch the current

lib/mongo/cluster.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def inspect
125125
#
126126
# @since 2.0.0
127127
def next_primary
128-
ServerSelector.get({ mode: :primary }.merge(options)).select_server(self)
128+
ServerSelector.get(Options::Redacted.new({ mode: :primary }.merge(options))).select_server(self)
129129
end
130130

131131
# Elect a primary server from the description that has just changed to a

lib/mongo/collection/view/readable.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,8 @@ def projection(document = nil)
298298
# @since 2.0.0
299299
def read(value = nil)
300300
return default_read if value.nil?
301-
configure(:read, value.is_a?(Hash) ? ServerSelector.get(value) : value)
301+
selector = value.is_a?(Hash) ? ServerSelector.get(Options::Redacted.new(value.merge(client.options))) : value
302+
configure(:read, selector)
302303
end
303304

304305
# Set whether to return only the indexed field or fields.

lib/mongo/database.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,7 @@ def collections
148148
#
149149
# @return [ Hash ] The result of the command execution.
150150
def command(operation, opts = {})
151-
if opts[:read]
152-
preference = ServerSelector.get(Options::Redacted.new(
153-
opts[:read]).merge(options))
154-
else
155-
preference = read_preference
156-
end
151+
preference = opts[:read] ? ServerSelector.get(Options::Redacted.new(opts[:read].merge(options))) : read_preference
157152
server = preference.select_server(cluster)
158153
Operation::Command.new({
159154
:selector => operation,

lib/mongo/grid/fs_bucket.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def upload_from_stream(filename, io, opts = {})
395395
# @since 2.1.0
396396
def read_preference
397397
@read_preference ||= @options[:read] ?
398-
ServerSelector.get((@options[:read] || {}).merge(database.options)) :
398+
ServerSelector.get(Options::Redacted.new((@options[:read] || {}).merge(database.options))) :
399399
database.read_preference
400400
end
401401

lib/mongo/grid/stream/read.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def closed?
134134
# @since 2.1.0
135135
def read_preference
136136
@read_preference ||= @options[:read] ?
137-
ServerSelector.get((@options[:read] || {}).merge(fs.options)) :
137+
ServerSelector.get(Options::Redacted.new((@options[:read] || {}).merge(fs.options))) :
138138
fs.read_preference
139139
end
140140

lib/mongo/server_selector/selectable.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ def ==(other)
6161
#
6262
# @since 2.0.0
6363
def initialize(options = {})
64+
@options = (options || {}).freeze
6465
tag_sets = options[:tag_sets] || []
6566
validate_tag_sets!(tag_sets)
66-
@tag_sets = tag_sets
67-
@options = options
67+
@tag_sets = tag_sets.freeze
6868
end
6969

7070
# Select a server from eligible candidates.

spec/mongo/client_spec.rb

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,15 @@
167167
['127.0.0.1:27017'],
168168
:read => { :mode => :primary },
169169
:local_threshold_ms => 10,
170-
:server_selection_timeout_ms => 10000,
170+
:server_selection_timeout => 10000,
171171
:database => TEST_DB
172172
)
173173
end
174174

175175
let(:options) do
176176
Mongo::Options::Redacted.new(:read => { :mode => :primary },
177177
:local_threshold_ms => 10,
178-
:server_selection_timeout_ms => 10000,
178+
:server_selection_timeout => 10000,
179179
:database => TEST_DB)
180180
end
181181

@@ -364,7 +364,8 @@
364364
let(:client) do
365365
described_class.new(['127.0.0.1:27017'],
366366
:database => TEST_DB,
367-
:read => mode)
367+
:read => mode,
368+
:server_selection_timeout => 2)
368369
end
369370

370371
let(:preference) do
@@ -382,7 +383,7 @@
382383
end
383384

384385
it 'passes the options to the read preference' do
385-
expect(preference.options[:database]).to eq(TEST_DB)
386+
expect(preference.options[:server_selection_timeout]).to eq(2)
386387
end
387388
end
388389

@@ -440,6 +441,33 @@
440441
expect(preference).to be_a(Mongo::ServerSelector::Primary)
441442
end
442443
end
444+
445+
context 'when the read preference is printed' do
446+
447+
let(:client) do
448+
described_class.new([ DEFAULT_ADDRESS ], options)
449+
end
450+
451+
let(:options) do
452+
{ user: 'Emily', password: 'sensitive_data', server_selection_timeout: 0.1 }
453+
end
454+
455+
before do
456+
allow(client.database.cluster).to receive(:single?).and_return(false)
457+
end
458+
459+
let(:error) do
460+
begin
461+
client.database.command(ping: 1)
462+
rescue => e
463+
e
464+
end
465+
end
466+
467+
it 'redacts sensitive client options' do
468+
expect(error.message).not_to match(options[:password])
469+
end
470+
end
443471
end
444472

445473
describe '#use' do

spec/mongo/grid/fs_bucket_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
end
5656

5757
let(:read_pref) do
58-
Mongo::ServerSelector.get(options[:read].merge(authorized_client.options))
58+
Mongo::ServerSelector.get(Mongo::Options::Redacted.new(options[:read].merge(authorized_client.options)))
5959
end
6060

6161
it 'sets the read preference' do

0 commit comments

Comments
 (0)