mongo 2.1.0.rc0 → 2.1.0
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 +4 -4
- checksums.yaml.gz.sig +5 -2
- data.tar.gz.sig +0 -0
- data/Rakefile +2 -2
- data/lib/mongo.rb +2 -1
- data/lib/mongo/address.rb +11 -5
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/user/view.rb +2 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write.rb +12 -9
- data/lib/mongo/bulk_write/transformable.rb +20 -5
- data/lib/mongo/client.rb +11 -11
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/collection.rb +21 -8
- data/lib/mongo/collection/view.rb +1 -0
- data/lib/mongo/collection/view/aggregation.rb +11 -5
- data/lib/mongo/collection/view/iterable.rb +6 -2
- data/lib/mongo/collection/view/map_reduce.rb +39 -5
- data/lib/mongo/collection/view/readable.rb +35 -30
- data/lib/mongo/collection/view/writable.rb +26 -18
- data/lib/mongo/database.rb +12 -2
- data/lib/mongo/database/view.rb +4 -3
- data/lib/mongo/dbref.rb +4 -4
- data/lib/mongo/grid/fs_bucket.rb +8 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/index/view.rb +2 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +9 -3
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +6 -3
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/operation.rb +31 -1
- data/lib/mongo/operation/commands/collections_info.rb +2 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +2 -1
- data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/read/query.rb +2 -0
- data/lib/mongo/operation/read/query/result.rb +40 -0
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/write/bulk/delete.rb +2 -2
- data/lib/mongo/operation/write/bulk/update.rb +3 -3
- data/lib/mongo/operation/write/delete.rb +2 -2
- data/lib/mongo/operation/write/update.rb +9 -4
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/protocol/insert.rb +25 -6
- data/lib/mongo/protocol/query.rb +45 -31
- data/lib/mongo/protocol/reply.rb +29 -6
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server.rb +16 -3
- data/lib/mongo/server/connectable.rb +21 -3
- data/lib/mongo/server/connection.rb +38 -4
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/monitor/connection.rb +2 -2
- data/lib/mongo/server_selector.rb +5 -0
- data/lib/mongo/server_selector/selectable.rb +16 -9
- data/lib/mongo/socket.rb +6 -2
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +11 -11
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +10 -10
- data/spec/mongo/client_spec.rb +101 -18
- data/spec/mongo/collection_spec.rb +44 -0
- data/spec/mongo/connection_string_spec.rb +36 -58
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +2 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +0 -16
- data/spec/mongo/operation/commands/command_spec.rb +0 -18
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -16
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -16
- data/spec/mongo/operation/write/bulk/update_spec.rb +6 -6
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/query_spec.rb +15 -1
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +32 -0
- data/spec/mongo/server/connection_spec.rb +37 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +24 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +2 -0
- data/spec/mongo/server_selector/nearest_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_spec.rb +8 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/secondary_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +68 -1
- data/spec/mongo/socket/ssl_spec.rb +29 -5
- data/spec/mongo/uri_spec.rb +20 -20
- data/spec/support/crud.rb +7 -1
- data/spec/support/matchers.rb +1 -1
- data/spec/support/shared/server_selector.rb +58 -2
- metadata +20 -5
- metadata.gz.sig +0 -0
data/lib/mongo/index.rb
CHANGED
data/lib/mongo/index/view.rb
CHANGED
|
@@ -76,7 +76,7 @@ module Mongo
|
|
|
76
76
|
#
|
|
77
77
|
# @since 2.0.0
|
|
78
78
|
def drop_one(name)
|
|
79
|
-
raise Error::MultiIndexDrop.new if name ==
|
|
79
|
+
raise Error::MultiIndexDrop.new if name == Index::ALL
|
|
80
80
|
drop_by_name(name)
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -89,7 +89,7 @@ module Mongo
|
|
|
89
89
|
#
|
|
90
90
|
# @since 2.0.0
|
|
91
91
|
def drop_all
|
|
92
|
-
drop_by_name(
|
|
92
|
+
drop_by_name(Index::ALL)
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
# Creates an index on the collection.
|
|
@@ -53,7 +53,9 @@ module Mongo
|
|
|
53
53
|
#
|
|
54
54
|
# @since 2.1.0
|
|
55
55
|
def started(event)
|
|
56
|
-
|
|
56
|
+
if logger.debug?
|
|
57
|
+
log_debug("#{prefix(event)} | STARTED | #{format_command(event.command)}")
|
|
58
|
+
end
|
|
57
59
|
end
|
|
58
60
|
|
|
59
61
|
# Handle the command succeeded event.
|
|
@@ -65,7 +67,9 @@ module Mongo
|
|
|
65
67
|
#
|
|
66
68
|
# @since 2.1.0
|
|
67
69
|
def succeeded(event)
|
|
68
|
-
|
|
70
|
+
if logger.debug?
|
|
71
|
+
log_debug("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
|
|
72
|
+
end
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
# Handle the command failed event.
|
|
@@ -77,7 +81,9 @@ module Mongo
|
|
|
77
81
|
#
|
|
78
82
|
# @since 2.1.0
|
|
79
83
|
def failed(event)
|
|
80
|
-
|
|
84
|
+
if logger.debug?
|
|
85
|
+
log_debug("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
|
|
86
|
+
end
|
|
81
87
|
end
|
|
82
88
|
|
|
83
89
|
private
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
require 'mongo/monitoring/event/secure'
|
|
15
16
|
require 'mongo/monitoring/event/command_started'
|
|
16
17
|
require 'mongo/monitoring/event/command_succeeded'
|
|
17
18
|
require 'mongo/monitoring/event/command_failed'
|
|
@@ -20,6 +20,7 @@ module Mongo
|
|
|
20
20
|
#
|
|
21
21
|
# @since 2.1.0
|
|
22
22
|
class CommandStarted
|
|
23
|
+
include Secure
|
|
23
24
|
|
|
24
25
|
# @return [ Server::Address ] address The server address.
|
|
25
26
|
attr_reader :address
|
|
@@ -57,7 +58,7 @@ module Mongo
|
|
|
57
58
|
@address = address
|
|
58
59
|
@request_id = request_id
|
|
59
60
|
@operation_id = operation_id
|
|
60
|
-
@command = command
|
|
61
|
+
@command = redacted(command_name, command)
|
|
61
62
|
end
|
|
62
63
|
|
|
63
64
|
# Create the event from a wire protocol message payload.
|
|
@@ -20,6 +20,7 @@ module Mongo
|
|
|
20
20
|
#
|
|
21
21
|
# @since 2.1.0
|
|
22
22
|
class CommandSucceeded
|
|
23
|
+
include Secure
|
|
23
24
|
|
|
24
25
|
# @return [ Server::Address ] address The server address.
|
|
25
26
|
attr_reader :address
|
|
@@ -61,7 +62,7 @@ module Mongo
|
|
|
61
62
|
@address = address
|
|
62
63
|
@request_id = request_id
|
|
63
64
|
@operation_id = operation_id
|
|
64
|
-
@reply = reply
|
|
65
|
+
@reply = redacted(command_name, reply)
|
|
65
66
|
@duration = duration
|
|
66
67
|
end
|
|
67
68
|
|
|
@@ -97,11 +98,13 @@ module Mongo
|
|
|
97
98
|
if reply_payload
|
|
98
99
|
reply = reply_payload[:reply]
|
|
99
100
|
if cursor = reply[:cursor]
|
|
100
|
-
|
|
101
|
+
if !cursor.key?(Collection::NS)
|
|
102
|
+
cursor.merge!(Collection::NS => namespace(command_payload))
|
|
103
|
+
end
|
|
101
104
|
end
|
|
102
105
|
reply
|
|
103
106
|
else
|
|
104
|
-
BSON::Document.new(
|
|
107
|
+
BSON::Document.new(Operation::Result::OK => 1)
|
|
105
108
|
end
|
|
106
109
|
end
|
|
107
110
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the 'License');
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an 'AS IS' BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Monitoring
|
|
17
|
+
module Event
|
|
18
|
+
|
|
19
|
+
# Provides behaviour to redact sensitive information from commands and
|
|
20
|
+
# replies.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.1.0
|
|
23
|
+
module Secure
|
|
24
|
+
|
|
25
|
+
# The list of commands that has the data redacted for security.
|
|
26
|
+
#
|
|
27
|
+
# @since 2.1.0
|
|
28
|
+
REDACTED_COMMANDS = [
|
|
29
|
+
'authenticate',
|
|
30
|
+
'saslStart',
|
|
31
|
+
'saslContinue',
|
|
32
|
+
'getnonce',
|
|
33
|
+
'createUser',
|
|
34
|
+
'updateUser',
|
|
35
|
+
'copydbgetnonce',
|
|
36
|
+
'copydbsaslstart',
|
|
37
|
+
'copydb'
|
|
38
|
+
].freeze
|
|
39
|
+
|
|
40
|
+
# Redact secure information from the document if it's command is in the
|
|
41
|
+
# list.
|
|
42
|
+
#
|
|
43
|
+
# @example Get the redacted document.
|
|
44
|
+
# secure.redacted(command_name, document)
|
|
45
|
+
#
|
|
46
|
+
# @param [ String, Symbol ] command_name The command name.
|
|
47
|
+
# @param [ BSON::Document ] document The document.
|
|
48
|
+
#
|
|
49
|
+
# @return [ BSON::Document ] The redacted document.
|
|
50
|
+
#
|
|
51
|
+
# @since 2.1.0
|
|
52
|
+
def redacted(command_name, document)
|
|
53
|
+
REDACTED_COMMANDS.include?(command_name.to_s) ? BSON::Document.new : document
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/mongo/operation.rb
CHANGED
|
@@ -20,4 +20,34 @@ require 'mongo/operation/read_preference'
|
|
|
20
20
|
require 'mongo/operation/read'
|
|
21
21
|
require 'mongo/operation/write'
|
|
22
22
|
require 'mongo/operation/commands'
|
|
23
|
-
require 'mongo/operation/kill_cursors'
|
|
23
|
+
require 'mongo/operation/kill_cursors'
|
|
24
|
+
|
|
25
|
+
module Mongo
|
|
26
|
+
module Operation
|
|
27
|
+
|
|
28
|
+
# The q field constant.
|
|
29
|
+
#
|
|
30
|
+
# @since 2.1.0
|
|
31
|
+
Q = 'q'.freeze
|
|
32
|
+
|
|
33
|
+
# The u field constant.
|
|
34
|
+
#
|
|
35
|
+
# @since 2.1.0
|
|
36
|
+
U = 'u'.freeze
|
|
37
|
+
|
|
38
|
+
# The limit field constant.
|
|
39
|
+
#
|
|
40
|
+
# @since 2.1.0
|
|
41
|
+
LIMIT = 'limit'.freeze
|
|
42
|
+
|
|
43
|
+
# The multi field constant.
|
|
44
|
+
#
|
|
45
|
+
# @since 2.1.0
|
|
46
|
+
MULTI = 'multi'.freeze
|
|
47
|
+
|
|
48
|
+
# The upsert field constant.
|
|
49
|
+
#
|
|
50
|
+
# @since 2.1.0
|
|
51
|
+
UPSERT = 'upsert'.freeze
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
module Operation
|
|
17
|
+
class CollectionsInfo
|
|
18
|
+
|
|
19
|
+
# Defines custom behaviour of results when query the system.namespaces
|
|
20
|
+
# collection.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.1.0
|
|
23
|
+
class Result < Operation::Result
|
|
24
|
+
|
|
25
|
+
# Get the namespace for the cursor.
|
|
26
|
+
#
|
|
27
|
+
# @example Get the namespace.
|
|
28
|
+
# result.namespace
|
|
29
|
+
#
|
|
30
|
+
# @return [ String ] The namespace.
|
|
31
|
+
#
|
|
32
|
+
# @since 2.1.0
|
|
33
|
+
def namespace
|
|
34
|
+
Database::NAMESPACES
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
module Operation
|
|
17
|
+
module Read
|
|
18
|
+
class Query
|
|
19
|
+
|
|
20
|
+
# Defines custom behaviour of results for a query.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.1.0
|
|
23
|
+
class Result < Operation::Result
|
|
24
|
+
|
|
25
|
+
# Determine if the query was a success.
|
|
26
|
+
#
|
|
27
|
+
# @example Was the query successful?
|
|
28
|
+
# result.successful?
|
|
29
|
+
#
|
|
30
|
+
# @return [ true, false ] If the query was successful.
|
|
31
|
+
#
|
|
32
|
+
# @since 2.0.0
|
|
33
|
+
def successful?
|
|
34
|
+
!query_failure?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -190,12 +190,24 @@ module Mongo
|
|
|
190
190
|
def successful?
|
|
191
191
|
return true if !acknowledged?
|
|
192
192
|
if first_document.has_key?(OK)
|
|
193
|
-
|
|
193
|
+
ok? && parser.message.empty?
|
|
194
194
|
else
|
|
195
195
|
!query_failure? && parser.message.empty?
|
|
196
196
|
end
|
|
197
197
|
end
|
|
198
198
|
|
|
199
|
+
# Check the first document's ok field.
|
|
200
|
+
#
|
|
201
|
+
# @example Check the ok field.
|
|
202
|
+
# result.ok?
|
|
203
|
+
#
|
|
204
|
+
# @return [ true, false ] If the command returned ok.
|
|
205
|
+
#
|
|
206
|
+
# @since 2.1.0
|
|
207
|
+
def ok?
|
|
208
|
+
first_document[OK] == 1
|
|
209
|
+
end
|
|
210
|
+
|
|
199
211
|
# Validate the result by checking for any errors.
|
|
200
212
|
#
|
|
201
213
|
# @note This only checks for errors with writes since authentication is
|
|
@@ -60,8 +60,8 @@ module Mongo
|
|
|
60
60
|
|
|
61
61
|
def messages
|
|
62
62
|
deletes.collect do |del|
|
|
63
|
-
opts = ( del[
|
|
64
|
-
Protocol::Delete.new(db_name, coll_name, del[
|
|
63
|
+
opts = ( del[Operation::LIMIT] || 0 ) <= 0 ? {} : { :flags => [ :single_remove ] }
|
|
64
|
+
Protocol::Delete.new(db_name, coll_name, del[Operation::Q], opts)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -69,9 +69,9 @@ module Mongo
|
|
|
69
69
|
def messages
|
|
70
70
|
updates.collect do |u|
|
|
71
71
|
opts = { :flags => [] }
|
|
72
|
-
opts[:flags] << :multi_update if !!u[
|
|
73
|
-
opts[:flags] << :upsert if !!u[
|
|
74
|
-
Protocol::Update.new(db_name, coll_name, u[
|
|
72
|
+
opts[:flags] << :multi_update if !!u[Operation::MULTI]
|
|
73
|
+
opts[:flags] << :upsert if !!u[Operation::UPSERT]
|
|
74
|
+
Protocol::Update.new(db_name, coll_name, u[Operation::Q], u[Operation::U], opts)
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
end
|
|
@@ -61,8 +61,8 @@ module Mongo
|
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def message
|
|
64
|
-
selector = delete[
|
|
65
|
-
opts = (delete[
|
|
64
|
+
selector = delete[Operation::Q]
|
|
65
|
+
opts = (delete[Operation::LIMIT] || 0) <= 0 ? {} : { :flags => [ :single_remove ] }
|
|
66
66
|
Protocol::Delete.new(db_name, coll_name, selector, opts)
|
|
67
67
|
end
|
|
68
68
|
end
|
|
@@ -65,10 +65,15 @@ module Mongo
|
|
|
65
65
|
|
|
66
66
|
def message
|
|
67
67
|
flags = []
|
|
68
|
-
flags << :multi_update if update[
|
|
69
|
-
flags << :upsert if update[
|
|
70
|
-
Protocol::Update.new(
|
|
71
|
-
|
|
68
|
+
flags << :multi_update if update[Operation::MULTI]
|
|
69
|
+
flags << :upsert if update[Operation::UPSERT]
|
|
70
|
+
Protocol::Update.new(
|
|
71
|
+
db_name,
|
|
72
|
+
coll_name,
|
|
73
|
+
update[Operation::Q],
|
|
74
|
+
update[Operation::U],
|
|
75
|
+
flags.empty? ? {} : { flags: flags }
|
|
76
|
+
)
|
|
72
77
|
end
|
|
73
78
|
end
|
|
74
79
|
end
|
data/lib/mongo/options.rb
CHANGED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
module Options
|
|
17
|
+
|
|
18
|
+
# Class for wrapping options that could be sensitive.
|
|
19
|
+
# When printed, the sensitive values will be redacted.
|
|
20
|
+
#
|
|
21
|
+
# @since 2.1.0
|
|
22
|
+
class Redacted < BSON::Document
|
|
23
|
+
|
|
24
|
+
# The options whose values will be redacted.
|
|
25
|
+
#
|
|
26
|
+
# @since 2.1.0
|
|
27
|
+
SENSITIVE_OPTIONS = [ :password,
|
|
28
|
+
:pwd ].freeze
|
|
29
|
+
|
|
30
|
+
# The replacement string used in place of the value for sensitive keys.
|
|
31
|
+
#
|
|
32
|
+
# @since 2.1.0
|
|
33
|
+
STRING_REPLACEMENT = '<REDACTED>'.freeze
|
|
34
|
+
|
|
35
|
+
# Get a string representation of the options.
|
|
36
|
+
#
|
|
37
|
+
# @return [ String ] The string representation of the options.
|
|
38
|
+
#
|
|
39
|
+
# @since 2.1.0
|
|
40
|
+
def inspect
|
|
41
|
+
redacted_string(:inspect)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Get a string representation of the options.
|
|
45
|
+
#
|
|
46
|
+
# @return [ String ] The string representation of the options.
|
|
47
|
+
#
|
|
48
|
+
# @since 2.1.0
|
|
49
|
+
def to_s
|
|
50
|
+
redacted_string(:to_s)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Whether these options contain a given key.
|
|
54
|
+
#
|
|
55
|
+
# @example Determine if the options contain a given key.
|
|
56
|
+
# options.has_key?(:name)
|
|
57
|
+
#
|
|
58
|
+
# @param [ String, Symbol ] key The key to check for existence.
|
|
59
|
+
#
|
|
60
|
+
# @return [ true, false ] If the options contain the given key.
|
|
61
|
+
#
|
|
62
|
+
# @since 2.1.0
|
|
63
|
+
def has_key?(key)
|
|
64
|
+
super(convert_key(key))
|
|
65
|
+
end
|
|
66
|
+
alias_method :key?, :has_key?
|
|
67
|
+
|
|
68
|
+
# Returns a new options object consisting of pairs for which the block returns false.
|
|
69
|
+
#
|
|
70
|
+
# @example Get a new options object with pairs for which the block returns false.
|
|
71
|
+
# new_options = options.reject { |k, v| k == 'database' }
|
|
72
|
+
#
|
|
73
|
+
# @yieldparam [ String, Object ] The key as a string and its value.
|
|
74
|
+
#
|
|
75
|
+
# @return [ Options::Redacted ] A new options object.
|
|
76
|
+
#
|
|
77
|
+
# @since 2.1.0
|
|
78
|
+
def reject(&block)
|
|
79
|
+
new_options = dup
|
|
80
|
+
new_options.reject!(&block) || new_options
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Only keeps pairs for which the block returns false.
|
|
84
|
+
#
|
|
85
|
+
# @example Remove pairs from this object for which the block returns true.
|
|
86
|
+
# options.reject! { |k, v| k == 'database' }
|
|
87
|
+
#
|
|
88
|
+
# @yieldparam [ String, Object ] The key as a string and its value.
|
|
89
|
+
#
|
|
90
|
+
# @return [ Options::Redacted, nil ] This object or nil if no changes were made.
|
|
91
|
+
#
|
|
92
|
+
# @since 2.1.0
|
|
93
|
+
def reject!
|
|
94
|
+
if block_given?
|
|
95
|
+
n_keys = keys.size
|
|
96
|
+
keys.each do |key|
|
|
97
|
+
delete(key) if yield(key, self[key])
|
|
98
|
+
end
|
|
99
|
+
n_keys == keys.size ? nil : self
|
|
100
|
+
else
|
|
101
|
+
to_enum
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Returns a new options object consisting of pairs for which the block returns true.
|
|
106
|
+
#
|
|
107
|
+
# @example Get a new options object with pairs for which the block returns true.
|
|
108
|
+
# ssl_options = options.select { |k, v| k =~ /ssl/ }
|
|
109
|
+
#
|
|
110
|
+
# @yieldparam [ String, Object ] The key as a string and its value.
|
|
111
|
+
#
|
|
112
|
+
# @return [ Options::Redacted ] A new options object.
|
|
113
|
+
#
|
|
114
|
+
# @since 2.1.0
|
|
115
|
+
def select(&block)
|
|
116
|
+
new_options = dup
|
|
117
|
+
new_options.select!(&block) || new_options
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Only keeps pairs for which the block returns true.
|
|
121
|
+
#
|
|
122
|
+
# @example Remove pairs from this object for which the block does not return true.
|
|
123
|
+
# options.select! { |k, v| k =~ /ssl/ }
|
|
124
|
+
#
|
|
125
|
+
# @yieldparam [ String, Object ] The key as a string and its value.
|
|
126
|
+
#
|
|
127
|
+
# @return [ Options::Redacted, nil ] This object or nil if no changes were made.
|
|
128
|
+
#
|
|
129
|
+
# @since 2.1.0
|
|
130
|
+
def select!
|
|
131
|
+
if block_given?
|
|
132
|
+
n_keys = keys.size
|
|
133
|
+
keys.each do |key|
|
|
134
|
+
delete(key) unless yield(key, self[key])
|
|
135
|
+
end
|
|
136
|
+
n_keys == keys.size ? nil : self
|
|
137
|
+
else
|
|
138
|
+
to_enum
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
def redacted_string(method)
|
|
145
|
+
'{' + reduce([]) do |list, (k, v)|
|
|
146
|
+
list << "#{k.send(method)}=>#{redact(k, v, method)}"
|
|
147
|
+
end.join(', ') + '}'
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def redact(k, v, method)
|
|
151
|
+
return STRING_REPLACEMENT if SENSITIVE_OPTIONS.include?(k.to_sym)
|
|
152
|
+
v.send(method)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|