mongo 2.11.6 → 2.12.0.rc0
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 +2 -2
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +13 -2
- data/lib/mongo/auth.rb +1 -0
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/scram/conversation.rb +20 -16
- data/lib/mongo/auth/user.rb +0 -8
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bulk_write.rb +5 -5
- data/lib/mongo/client.rb +126 -11
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/cluster/srv_monitor.rb +1 -1
- data/lib/mongo/collection.rb +3 -3
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +12 -3
- data/lib/mongo/collection/view/iterable.rb +14 -5
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +7 -9
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +169 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1162 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +283 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +293 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +64 -32
- data/lib/mongo/database.rb +13 -6
- data/lib/mongo/database/view.rb +13 -4
- data/lib/mongo/dbref.rb +9 -2
- data/lib/mongo/error.rb +5 -1
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/max_bson_size.rb +14 -3
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/no_server_available.rb +8 -3
- data/lib/mongo/error/operation_failure.rb +1 -0
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/file/info.rb +2 -1
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/monitoring/event/command_started.rb +6 -1
- data/lib/mongo/operation/collections_info.rb +6 -3
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -1
- data/lib/mongo/operation/get_more/op_msg.rb +4 -1
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -3
- data/lib/mongo/operation/result.rb +36 -27
- data/lib/mongo/operation/shared/executable.rb +10 -8
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
- data/lib/mongo/operation/shared/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +72 -8
- data/lib/mongo/protocol/msg.rb +191 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +6 -2
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +81 -12
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -1
- data/lib/mongo/server/description.rb +9 -11
- data/lib/mongo/server/monitor.rb +2 -0
- data/lib/mongo/server/monitor/connection.rb +3 -18
- data/lib/mongo/server/pending_connection.rb +2 -1
- data/lib/mongo/session.rb +2 -2
- data/lib/mongo/session/session_pool.rb +8 -3
- data/lib/mongo/socket.rb +29 -16
- data/lib/mongo/socket/ssl.rb +23 -8
- data/lib/mongo/socket/tcp.rb +12 -3
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/README.md +134 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +76 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
- data/spec/integration/client_side_encryption/views_spec.rb +42 -0
- data/spec/integration/client_update_spec.rb +120 -0
- data/spec/integration/command_monitoring_spec.rb +3 -1
- data/spec/integration/command_spec.rb +44 -10
- data/spec/integration/connection_spec.rb +57 -0
- data/spec/integration/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +94 -0
- data/spec/integration/srv_monitoring_spec.rb +14 -6
- data/spec/lite_spec_helper.rb +31 -22
- data/spec/mongo/auth/cr_spec.rb +8 -0
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
- data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
- data/spec/mongo/auth/scram_spec.rb +45 -35
- data/spec/mongo/auth/x509_spec.rb +5 -1
- data/spec/mongo/client_construction_spec.rb +206 -3
- data/spec/mongo/client_encryption_spec.rb +408 -0
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
- data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +4 -33
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +198 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor_spec.rb +24 -4
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/operation_failure_spec.rb +6 -6
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +1 -1
- data/spec/mongo/operation/get_more_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/update/bulk_spec.rb +6 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +28 -7
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/timeout_spec.rb +85 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +52 -5
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +14 -1
- data/spec/{support → runners}/change_streams.rb +1 -1
- data/spec/{support → runners}/change_streams/operation.rb +0 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +0 -0
- data/spec/{support → runners}/command_monitoring.rb +0 -0
- data/spec/runners/connection_string.rb +358 -4
- data/spec/{support → runners}/crud.rb +9 -9
- data/spec/{support → runners}/crud/context.rb +0 -0
- data/spec/{support → runners}/crud/operation.rb +7 -3
- data/spec/{support → runners}/crud/outcome.rb +0 -0
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +12 -1
- data/spec/{support → runners}/crud/test.rb +0 -0
- data/spec/{support → runners}/crud/test_base.rb +0 -0
- data/spec/{support → runners}/crud/verifier.rb +10 -12
- data/spec/{support → runners}/gridfs.rb +0 -0
- data/spec/{support → runners}/sdam_monitoring.rb +0 -0
- data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +4 -4
- data/spec/{support → runners}/transactions/context.rb +0 -0
- data/spec/{support → runners}/transactions/operation.rb +0 -0
- data/spec/{support → runners}/transactions/spec.rb +0 -0
- data/spec/{support → runners}/transactions/test.rb +37 -5
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +3 -3
- data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/data/auth/connection-string.yml +13 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/uri_options_spec.rb +6 -8
- data/spec/stress/connection_pool_timing_spec.rb +6 -3
- data/spec/support/certificates/README.md +4 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +19 -3
- data/spec/support/cluster_config.rb +9 -1
- data/spec/support/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +140 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/lite_constraints.rb +17 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +43 -13
- data/spec/support/utils.rb +132 -10
- metadata +277 -81
- metadata.gz.sig +0 -0
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/zlib_compression_spec.rb +0 -25
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,103 @@
|
|
1
|
+
# Copyright (C) 2019 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
|
+
# ClientEncryption encapsulates explicit operations on a key vault
|
17
|
+
# collection that cannot be done directly on a MongoClient. It
|
18
|
+
# provides an API for explicitly encrypting and decrypting values,
|
19
|
+
# and creating data keys.
|
20
|
+
class ClientEncryption
|
21
|
+
# Create a new ClientEncryption object with the provided options.
|
22
|
+
#
|
23
|
+
# @param [ Mongo::Client ] key_vault_client A Mongo::Client
|
24
|
+
# that is connected to the MongoDB instance where the key vault
|
25
|
+
# collection is stored.
|
26
|
+
# @param [ Hash ] options The ClientEncryption options.
|
27
|
+
#
|
28
|
+
# @option options [ String ] :key_vault_namespace The name of the
|
29
|
+
# key vault collection in the format "database.collection".
|
30
|
+
# @option options [ Hash ] :kms_providers A hash of key management service
|
31
|
+
# configuration information. Valid hash keys are :local or :aws. There
|
32
|
+
# may be more than one KMS provider specified.
|
33
|
+
def initialize(key_vault_client, options={})
|
34
|
+
@encrypter = Crypt::ExplicitEncrypter.new(
|
35
|
+
key_vault_client,
|
36
|
+
options[:key_vault_namespace],
|
37
|
+
options[:kms_providers]
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Generates a data key used for encryption/decryption and stores
|
42
|
+
# that key in the KMS collection. The generated key is encrypted with
|
43
|
+
# the KMS master key.
|
44
|
+
#
|
45
|
+
# @param [ String ] kms_provider The KMS provider to use. Valid values are
|
46
|
+
# "aws" and "local".
|
47
|
+
# @params [ Hash ] options
|
48
|
+
#
|
49
|
+
# @option options [ Hash ] :master_key Information about the AWS master key.
|
50
|
+
# Required if kms_provider is "aws".
|
51
|
+
# - :region [ String ] The The AWS region of the master key (required).
|
52
|
+
# - :key [ String ] The Amazon Resource Name (ARN) of the master key (required).
|
53
|
+
# - :endpoint [ String ] An alternate host to send KMS requests to (optional).
|
54
|
+
# endpoint should be a host name with an optional port number separated
|
55
|
+
# by a colon (e.g. "kms.us-east-1.amazonaws.com" or
|
56
|
+
# "kms.us-east-1.amazonaws.com:443"). An endpoint in any other format
|
57
|
+
# will not be properly parsed.
|
58
|
+
# @option options [ Array<String> ] :key_alt_names An optional array of
|
59
|
+
# strings specifying alternate names for the new data key.
|
60
|
+
#
|
61
|
+
# @return [ BSON::Binary ] The 16-byte UUID of the new data key as a
|
62
|
+
# BSON::Binary object with type :uuid.
|
63
|
+
def create_data_key(kms_provider, options={})
|
64
|
+
@encrypter.create_and_insert_data_key(
|
65
|
+
kms_provider,
|
66
|
+
options
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Encrypts a value using the specified encryption key and algorithm.
|
71
|
+
#
|
72
|
+
# @param [ Object ] value The value to encrypt.
|
73
|
+
# @param [ Hash ] options
|
74
|
+
#
|
75
|
+
# @option options [ BSON::Binary ] :key_id A BSON::Binary object of type :uuid
|
76
|
+
# representing the UUID of the encryption key as it is stored in the key
|
77
|
+
# vault collection.
|
78
|
+
# @option options [ String ] :key_alt_name The alternate name for the
|
79
|
+
# encryption key.
|
80
|
+
# @option options [ String ] :algorithm The algorithm used to encrypt the value.
|
81
|
+
# Valid algorithms are "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
|
82
|
+
# or "AEAD_AES_256_CBC_HMAC_SHA_512-Random".
|
83
|
+
#
|
84
|
+
# @note The :key_id and :key_alt_name options are mutually exclusive. Only
|
85
|
+
# one is required to perform explicit encryption.
|
86
|
+
#
|
87
|
+
# @return [ BSON::Binary ] A BSON Binary object of subtype 6 (ciphertext)
|
88
|
+
# representing the encrypted value.
|
89
|
+
def encrypt(value, options={})
|
90
|
+
@encrypter.encrypt(value, options)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Decrypts a value that has already been encrypted.
|
94
|
+
#
|
95
|
+
# @param [ BSON::Binary ] value A BSON Binary object of subtype 6 (ciphertext)
|
96
|
+
# that will be decrypted.
|
97
|
+
#
|
98
|
+
# @return [ Object ] The decrypted value.
|
99
|
+
def decrypt(value)
|
100
|
+
@encrypter.decrypt(value)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/mongo/cluster.rb
CHANGED
@@ -258,8 +258,8 @@ module Mongo
|
|
258
258
|
# @return [ Object ] The cluster topology.
|
259
259
|
attr_reader :topology
|
260
260
|
|
261
|
-
# @return [ Mongo::Server::AppMetadata ] The application metadata, used for
|
262
|
-
# handshakes.
|
261
|
+
# @return [ Mongo::Server::AppMetadata ] The application metadata, used for
|
262
|
+
# connection handshakes.
|
263
263
|
#
|
264
264
|
# @since 2.4.0
|
265
265
|
attr_reader :app_metadata
|
@@ -76,10 +76,15 @@ module Mongo
|
|
76
76
|
#
|
77
77
|
# @since 2.3.0
|
78
78
|
def register_cursor(id)
|
79
|
-
if id
|
80
|
-
|
81
|
-
|
82
|
-
|
79
|
+
if id.nil?
|
80
|
+
raise ArgumentError, 'register_cursor called with nil cursor_id'
|
81
|
+
end
|
82
|
+
if id == 0
|
83
|
+
raise ArgumentError, 'register_cursor called with cursor_id=0'
|
84
|
+
end
|
85
|
+
|
86
|
+
@mutex.synchronize do
|
87
|
+
@active_cursors << id
|
83
88
|
end
|
84
89
|
end
|
85
90
|
|
@@ -94,6 +99,13 @@ module Mongo
|
|
94
99
|
#
|
95
100
|
# @since 2.3.0
|
96
101
|
def unregister_cursor(id)
|
102
|
+
if id.nil?
|
103
|
+
raise ArgumentError, 'unregister_cursor called with nil cursor_id'
|
104
|
+
end
|
105
|
+
if id == 0
|
106
|
+
raise ArgumentError, 'unregister_cursor called with cursor_id=0'
|
107
|
+
end
|
108
|
+
|
97
109
|
@mutex.synchronize do
|
98
110
|
@active_cursors.delete(id)
|
99
111
|
end
|
@@ -122,12 +134,12 @@ module Mongo
|
|
122
134
|
if server.features.find_command_enabled?
|
123
135
|
Cursor::Builder::KillCursorsCommand.update_cursors(op_spec, active_cursors_copy.to_a)
|
124
136
|
if Cursor::Builder::KillCursorsCommand.get_cursors_list(op_spec).size > 0
|
125
|
-
Operation::KillCursors.new(op_spec).execute(server)
|
137
|
+
Operation::KillCursors.new(op_spec).execute(server, client: nil)
|
126
138
|
end
|
127
139
|
else
|
128
140
|
Cursor::Builder::OpKillCursors.update_cursors(op_spec, active_cursors_copy.to_a)
|
129
141
|
if Cursor::Builder::OpKillCursors.get_cursors_list(op_spec).size > 0
|
130
|
-
Operation::KillCursors.new(op_spec).execute(server)
|
142
|
+
Operation::KillCursors.new(op_spec).execute(server, client: nil)
|
131
143
|
end
|
132
144
|
end
|
133
145
|
end
|
@@ -58,74 +58,26 @@ class Mongo::Cluster
|
|
58
58
|
def update_server_descriptions
|
59
59
|
servers_list.each do |server|
|
60
60
|
if server.address == updated_desc.address
|
61
|
-
|
61
|
+
@server_description_changed = server.description != updated_desc
|
62
|
+
|
62
63
|
# Always update server description, so that fields that do not
|
63
64
|
# affect description equality comparisons but are part of the
|
64
65
|
# description are updated.
|
65
66
|
server.update_description(updated_desc)
|
66
67
|
server.update_last_scan
|
67
|
-
|
68
|
-
#
|
69
|
-
# sdam flow
|
70
|
-
|
68
|
+
|
69
|
+
# If there was no content difference between descriptions, we
|
70
|
+
# still need to run sdam flow, but if the flow produces no change
|
71
|
+
# in topology we will omit sending events.
|
72
|
+
return true
|
71
73
|
end
|
72
74
|
end
|
73
75
|
false
|
74
76
|
end
|
75
77
|
|
76
78
|
def server_description_changed
|
77
|
-
|
78
|
-
|
79
|
-
then
|
80
|
-
# When the driver receives a description claiming to be a primary,
|
81
|
-
# we are obligated by spec tests to add and remove hosts in that
|
82
|
-
# description even if it also has a me mismatch. The me mismatch
|
83
|
-
# scenario though presents a number of problems:
|
84
|
-
#
|
85
|
-
# 1. Effectively, the server's address changes, meaning we cannot
|
86
|
-
# update the description of the server whose description change we
|
87
|
-
# are processing (instead servers are added and removed), but we
|
88
|
-
# behave to an extent as if we are updating the description, which
|
89
|
-
# causes a bunch of awkwardness.
|
90
|
-
# 2. The server for which we are processing the response will be
|
91
|
-
# removed from topology, which may cause the current thread to terminate
|
92
|
-
# prior to running the entire sdam flow. To deal with this we separate
|
93
|
-
# the removal event publication from actually removing the server
|
94
|
-
# from topology, which again complicates the flow.
|
95
|
-
|
96
|
-
# Primary-with-me-mismatch response could be the first one we receive
|
97
|
-
# when the topology is still unknown. Change to RS without primary
|
98
|
-
# in this case.
|
99
|
-
if topology.unknown?
|
100
|
-
@topology = Topology::ReplicaSetNoPrimary.new(
|
101
|
-
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
|
102
|
-
topology.monitoring, self)
|
103
|
-
end
|
104
|
-
|
105
|
-
servers = add_servers_from_desc(updated_desc)
|
106
|
-
# Spec tests require us to remove servers based on data in descrptions
|
107
|
-
# with me mismatches. The driver will be more resilient if it only
|
108
|
-
# removed servers from descriptions with matching mes.
|
109
|
-
remove_servers_not_in_desc(updated_desc)
|
110
|
-
|
111
|
-
servers.each do |server|
|
112
|
-
server.start_monitoring
|
113
|
-
end
|
114
|
-
|
115
|
-
# The rest of sdam flow assumes the server being removed is not the one
|
116
|
-
# whose description we are processing, and publishes description update
|
117
|
-
# event. Since we are removing the server whose response we are
|
118
|
-
# processing, do not publish description change event but mark it
|
119
|
-
# published (by assigning to @previous_desc).
|
120
|
-
do_remove(updated_desc.address.to_s)
|
121
|
-
@previous_desc = updated_desc
|
122
|
-
|
123
|
-
# We may have removed the current primary, check if there is a primary.
|
124
|
-
check_if_has_primary
|
125
|
-
# Publish topology change event.
|
126
|
-
commit_changes
|
127
|
-
disconnect_servers
|
128
|
-
return
|
79
|
+
@previous_server_descriptions = servers_list.map do |server|
|
80
|
+
[server.address.to_s, server.description]
|
129
81
|
end
|
130
82
|
|
131
83
|
unless update_server_descriptions
|
@@ -158,10 +110,16 @@ class Mongo::Cluster
|
|
158
110
|
end
|
159
111
|
when Topology::Sharded
|
160
112
|
unless updated_desc.unknown? || updated_desc.mongos?
|
113
|
+
log_warn(
|
114
|
+
"Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a MONGOS"
|
115
|
+
)
|
161
116
|
remove
|
162
117
|
end
|
163
118
|
when Topology::ReplicaSetWithPrimary
|
164
119
|
if updated_desc.standalone? || updated_desc.mongos?
|
120
|
+
log_warn(
|
121
|
+
"Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a replica set member"
|
122
|
+
)
|
165
123
|
remove
|
166
124
|
check_if_has_primary
|
167
125
|
elsif updated_desc.primary?
|
@@ -173,6 +131,9 @@ class Mongo::Cluster
|
|
173
131
|
end
|
174
132
|
when Topology::ReplicaSetNoPrimary
|
175
133
|
if updated_desc.standalone? || updated_desc.mongos?
|
134
|
+
log_warn(
|
135
|
+
"Removing server #{updated_desc.address.to_s} because it is a #{updated_desc.server_type.to_s.upcase} and not a replica set member"
|
136
|
+
)
|
176
137
|
remove
|
177
138
|
elsif updated_desc.primary?
|
178
139
|
# Here we change topology type to RS with primary, however
|
@@ -440,6 +401,16 @@ class Mongo::Cluster
|
|
440
401
|
end
|
441
402
|
|
442
403
|
def publish_description_change_event
|
404
|
+
# This method may be invoked when server description definitely changed
|
405
|
+
# but prior to the topology getting updated. Therefore we check both
|
406
|
+
# server description changes and overall topology changes. When this
|
407
|
+
# method is called at the end of SDAM flow as part of "commit changes"
|
408
|
+
# step, server description change is incorporated into the topology
|
409
|
+
# change.
|
410
|
+
unless @server_description_changed || topology_effectively_changed?
|
411
|
+
return
|
412
|
+
end
|
413
|
+
|
443
414
|
# updated_desc here may not be the description we received from
|
444
415
|
# the server - in case of a stale primary, the server reported itself
|
445
416
|
# as being a primary but updated_desc here will be unknown.
|
@@ -492,7 +463,7 @@ class Mongo::Cluster
|
|
492
463
|
start_pool_if_data_bearing
|
493
464
|
|
494
465
|
topology_changed_event_published = false
|
495
|
-
if topology.
|
466
|
+
if !topology.equal?(cluster.topology) || @need_topology_changed_event
|
496
467
|
# We are about to publish topology changed event.
|
497
468
|
# Recreate the topology instance to get its server descriptions
|
498
469
|
# up to date.
|
@@ -517,6 +488,10 @@ class Mongo::Cluster
|
|
517
488
|
return
|
518
489
|
end
|
519
490
|
|
491
|
+
unless topology_effectively_changed?
|
492
|
+
return
|
493
|
+
end
|
494
|
+
|
520
495
|
# If we are here, there has been a change in the server descriptions
|
521
496
|
# in our topology, but topology class has not changed.
|
522
497
|
# Publish the topology changed event and recreate the topology to
|
@@ -584,5 +559,26 @@ class Mongo::Cluster
|
|
584
559
|
def became_unknown?
|
585
560
|
updated_desc.unknown? && !original_desc.unknown?
|
586
561
|
end
|
562
|
+
|
563
|
+
# Returns whether topology meaningfully changed as a result of running
|
564
|
+
# SDAM flow.
|
565
|
+
#
|
566
|
+
# The spec defines topology equality through equality of topology types
|
567
|
+
# and server descriptions in each topology; this definition is not usable
|
568
|
+
# by us because our topology objects do not hold server descriptions and
|
569
|
+
# are instead "live". Thus we have to store the full list of server
|
570
|
+
# descriptions at the beginning of SDAM flow and compare them to the
|
571
|
+
# current ones.
|
572
|
+
def topology_effectively_changed?
|
573
|
+
unless topology.equal?(cluster.topology)
|
574
|
+
return true
|
575
|
+
end
|
576
|
+
|
577
|
+
server_descriptions = servers_list.map do |server|
|
578
|
+
[server.address.to_s, server.description]
|
579
|
+
end
|
580
|
+
|
581
|
+
@previous_server_descriptions != server_descriptions
|
582
|
+
end
|
587
583
|
end
|
588
584
|
end
|
@@ -87,7 +87,7 @@ module Mongo
|
|
87
87
|
rescue Resolv::ResolvTimeout => e
|
88
88
|
log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
|
89
89
|
return
|
90
|
-
rescue Timeout::Error
|
90
|
+
rescue ::Timeout::Error
|
91
91
|
log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname} (timeout=#{timeout})")
|
92
92
|
return
|
93
93
|
rescue Resolv::ResolvError => e
|
data/lib/mongo/collection.rb
CHANGED
@@ -249,7 +249,7 @@ module Mongo
|
|
249
249
|
db_name: database.name,
|
250
250
|
write_concern: write_concern,
|
251
251
|
session: session
|
252
|
-
}).execute(server)
|
252
|
+
}).execute(server, client: client)
|
253
253
|
end
|
254
254
|
end
|
255
255
|
|
@@ -275,7 +275,7 @@ module Mongo
|
|
275
275
|
db_name: database.name,
|
276
276
|
write_concern: write_concern,
|
277
277
|
session: session
|
278
|
-
}).execute(next_primary(nil, session))
|
278
|
+
}).execute(next_primary(nil, session), client: client)
|
279
279
|
end
|
280
280
|
rescue Error::OperationFailure => ex
|
281
281
|
raise ex unless ex.message =~ /ns not found/
|
@@ -545,7 +545,7 @@ module Mongo
|
|
545
545
|
:id_generator => client.options[:id_generator],
|
546
546
|
:session => session,
|
547
547
|
:txn_num => txn_num
|
548
|
-
).execute(server)
|
548
|
+
).execute(server, client: client)
|
549
549
|
end
|
550
550
|
end
|
551
551
|
end
|
@@ -119,7 +119,7 @@ module Mongo
|
|
119
119
|
# @option options :comment [ String ] Associate a comment with the query.
|
120
120
|
# @option options :batch_size [ Integer ] The number of docs to return in
|
121
121
|
# each response from MongoDB.
|
122
|
-
# @option options :
|
122
|
+
# @option options :projection [ Hash ] The fields to include or exclude in
|
123
123
|
# returned docs.
|
124
124
|
# @option options :hint [ Hash ] Override default index selection and force
|
125
125
|
# MongoDB to use a specific index for the query.
|
@@ -125,7 +125,7 @@ module Mongo
|
|
125
125
|
server = cluster.next_primary(nil, session)
|
126
126
|
end
|
127
127
|
validate_collation!(server)
|
128
|
-
initial_query_op(session).execute(server)
|
128
|
+
initial_query_op(session).execute(server, client: client)
|
129
129
|
end
|
130
130
|
|
131
131
|
def validate_collation!(server)
|
@@ -194,12 +194,21 @@ module Mongo
|
|
194
194
|
# @example Close the change stream.
|
195
195
|
# stream.close
|
196
196
|
#
|
197
|
-
# @
|
197
|
+
# @note This method attempts to close the cursor used by the change
|
198
|
+
# stream, which in turn closes the server-side change stream cursor.
|
199
|
+
# This method ignores any errors that occur when closing the
|
200
|
+
# server-side cursor.
|
201
|
+
#
|
202
|
+
# @return [ nil ] Always nil.
|
198
203
|
#
|
199
204
|
# @since 2.5.0
|
200
205
|
def close
|
201
206
|
unless closed?
|
202
|
-
begin
|
207
|
+
begin
|
208
|
+
@cursor.close
|
209
|
+
rescue Error::OperationFailure
|
210
|
+
# ignore
|
211
|
+
end
|
203
212
|
@cursor = nil
|
204
213
|
end
|
205
214
|
end
|
@@ -340,7 +349,7 @@ module Mongo
|
|
340
349
|
end
|
341
350
|
|
342
351
|
def send_initial_query(server, session)
|
343
|
-
initial_query_op(session).execute(server)
|
352
|
+
initial_query_op(session).execute(server, client: client)
|
344
353
|
end
|
345
354
|
|
346
355
|
def time_to_bson_timestamp(time)
|
@@ -55,14 +55,23 @@ module Mongo
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
#
|
58
|
+
# Cleans up resources associated with this query.
|
59
59
|
#
|
60
|
-
#
|
61
|
-
#
|
60
|
+
# If there is a server cursor associated with this query, it is
|
61
|
+
# closed by sending a KillCursors command to the server.
|
62
|
+
#
|
63
|
+
# @note This method propagates any errors that occur when closing the
|
64
|
+
# server-side cursor.
|
65
|
+
#
|
66
|
+
# @return [ nil ] Always nil.
|
67
|
+
#
|
68
|
+
# @raise [ Error::OperationFailure ] If the server cursor close fails.
|
62
69
|
#
|
63
70
|
# @since 2.1.0
|
64
71
|
def close_query
|
65
|
-
|
72
|
+
if @cursor
|
73
|
+
@cursor.close
|
74
|
+
end
|
66
75
|
end
|
67
76
|
alias :kill_cursors :close_query
|
68
77
|
|
@@ -86,7 +95,7 @@ module Mongo
|
|
86
95
|
|
87
96
|
def send_initial_query(server, session = nil)
|
88
97
|
validate_collation!(server, collation)
|
89
|
-
initial_query_op(server, session).execute(server)
|
98
|
+
initial_query_op(server, session).execute(server, client: client)
|
90
99
|
end
|
91
100
|
end
|
92
101
|
end
|