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,46 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'support/lite_constraints'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.extend(LiteConstraints)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'Mongo::Crypt::Binding' do
|
9
|
+
describe 'helper methods' do
|
10
|
+
require_libmongocrypt
|
11
|
+
|
12
|
+
describe '#validate_document' do
|
13
|
+
context 'with BSON::Document data' do
|
14
|
+
it 'does not raise an exception' do
|
15
|
+
expect do
|
16
|
+
Mongo::Crypt::Binding.validate_document(BSON::Document.new)
|
17
|
+
end.not_to raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with Hash data' do
|
22
|
+
it 'does not raise an exception' do
|
23
|
+
expect do
|
24
|
+
Mongo::Crypt::Binding.validate_document({})
|
25
|
+
end.not_to raise_error
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with nil data' do
|
30
|
+
it 'raises an exception' do
|
31
|
+
expect do
|
32
|
+
Mongo::Crypt::Binding.validate_document(nil)
|
33
|
+
end.to raise_error(Mongo::Error::CryptError, /Attempted to pass nil data to libmongocrypt/)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with non-document data' do
|
38
|
+
it 'raises an exception' do
|
39
|
+
expect do
|
40
|
+
Mongo::Crypt::Binding.validate_document('not a bson document')
|
41
|
+
end.to raise_error(Mongo::Error::CryptError, /Attempted to pass invalid data to libmongocrypt/)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'support/lite_constraints'
|
3
|
+
require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.extend(LiteConstraints)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'Mongo::Crypt::Binding' do
|
10
|
+
describe 'mongocrypt_t binding' do
|
11
|
+
require_libmongocrypt
|
12
|
+
|
13
|
+
after do
|
14
|
+
Mongo::Crypt::Binding.mongocrypt_destroy(mongocrypt)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#mongocrypt_new' do
|
18
|
+
let(:mongocrypt) { Mongo::Crypt::Binding.mongocrypt_new }
|
19
|
+
|
20
|
+
it 'returns a pointer' do
|
21
|
+
expect(mongocrypt).to be_a_kind_of(FFI::Pointer)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#mongocrypt_setopt_kms_provider_local' do
|
26
|
+
let(:mongocrypt) { Mongo::Crypt::Binding.mongocrypt_new }
|
27
|
+
|
28
|
+
let(:binary) do
|
29
|
+
p = FFI::MemoryPointer.new(key_bytes.size)
|
30
|
+
.write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
|
31
|
+
|
32
|
+
Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
|
33
|
+
end
|
34
|
+
|
35
|
+
after do
|
36
|
+
Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with valid key' do
|
40
|
+
let(:key_bytes) { [114, 117, 98, 121] * 24 } # 96 bytes
|
41
|
+
|
42
|
+
it 'returns true' do
|
43
|
+
expect(Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)).to be true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'with invalid key' do
|
48
|
+
let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
|
49
|
+
|
50
|
+
it 'returns false' do
|
51
|
+
expect(Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)).to be false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#mongocrypt_init' do
|
57
|
+
let(:key_bytes) { [114, 117, 98, 121] * 24 } # 96 bytes
|
58
|
+
|
59
|
+
let(:binary) do
|
60
|
+
p = FFI::MemoryPointer.new(key_bytes.size)
|
61
|
+
.write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
|
62
|
+
|
63
|
+
Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:mongocrypt) do
|
67
|
+
mongocrypt = Mongo::Crypt::Binding.mongocrypt_new
|
68
|
+
Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)
|
69
|
+
|
70
|
+
mongocrypt
|
71
|
+
end
|
72
|
+
|
73
|
+
after do
|
74
|
+
Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with valid kms option' do
|
78
|
+
before do
|
79
|
+
MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns true' do
|
83
|
+
expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'without binding crypto hooks' do
|
88
|
+
it 'returns false' do
|
89
|
+
expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'with invalid kms option' do
|
94
|
+
before do
|
95
|
+
MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
|
96
|
+
end
|
97
|
+
|
98
|
+
let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
|
99
|
+
|
100
|
+
it 'returns false' do
|
101
|
+
expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '#mongocrypt_status' do
|
107
|
+
let(:status) { Mongo::Crypt::Binding.mongocrypt_status_new }
|
108
|
+
let(:mongocrypt) { mongocrypt = Mongo::Crypt::Binding.mongocrypt_new }
|
109
|
+
|
110
|
+
after do
|
111
|
+
Mongo::Crypt::Binding.mongocrypt_status_destroy(status)
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'for a new mongocrypt_t object' do
|
115
|
+
it 'returns an ok status' do
|
116
|
+
Mongo::Crypt::Binding.mongocrypt_status(mongocrypt, status)
|
117
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:ok)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'for a mongocrypt_t object with invalid kms options' do
|
122
|
+
let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
|
123
|
+
|
124
|
+
let(:binary) do
|
125
|
+
p = FFI::MemoryPointer.new(key_bytes.size)
|
126
|
+
.write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
|
127
|
+
|
128
|
+
Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
|
129
|
+
end
|
130
|
+
|
131
|
+
after do
|
132
|
+
Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'returns a error_client status' do
|
136
|
+
Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)
|
137
|
+
|
138
|
+
Mongo::Crypt::Binding.mongocrypt_status(mongocrypt, status)
|
139
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:error_client)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'support/lite_constraints'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.extend(LiteConstraints)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'Mongo::Crypt::Binding' do
|
9
|
+
describe 'mongocrypt_status_t binding' do
|
10
|
+
require_libmongocrypt
|
11
|
+
|
12
|
+
let(:status) { Mongo::Crypt::Binding.mongocrypt_status_new }
|
13
|
+
let(:message) { "Operation unauthorized" }
|
14
|
+
|
15
|
+
let(:status_with_info) do
|
16
|
+
Mongo::Crypt::Binding.mongocrypt_status_set(
|
17
|
+
status,
|
18
|
+
:error_client,
|
19
|
+
401,
|
20
|
+
message,
|
21
|
+
message.length + 1
|
22
|
+
)
|
23
|
+
|
24
|
+
status
|
25
|
+
end
|
26
|
+
|
27
|
+
after do
|
28
|
+
Mongo::Crypt::Binding.mongocrypt_status_destroy(status)
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#mongocrypt_status_new' do
|
32
|
+
it 'returns a pointer' do
|
33
|
+
expect(status).to be_a_kind_of(FFI::Pointer)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#mongocrypt_status_type' do
|
38
|
+
context 'when status has no type' do
|
39
|
+
it 'returns :ok/0' do
|
40
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:ok)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when status has type' do
|
45
|
+
it 'returns type' do
|
46
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_type(status_with_info)).to eq(:error_client)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#mongocrypt_status_code' do
|
52
|
+
context 'when status has no code' do
|
53
|
+
it 'returns 0' do
|
54
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_code(status)).to eq(0)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when status has code' do
|
59
|
+
it 'returns code' do
|
60
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_code(status_with_info)).to eq(401)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#mongocrypt_status_message' do
|
66
|
+
context 'when status has no message' do
|
67
|
+
it 'returns nil' do
|
68
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_message(status, nil)).to eq(nil)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when status has message' do
|
73
|
+
it 'returns message' do
|
74
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_message(status_with_info, nil)).to eq(message)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#mongocrypt_status_ok' do
|
80
|
+
context 'when status_type is not ok' do
|
81
|
+
it 'returns false' do
|
82
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_ok(status_with_info)).to be false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when status_type is ok' do
|
87
|
+
let(:message) { 'Operation successful' }
|
88
|
+
let(:status_with_info) do
|
89
|
+
Mongo::Crypt::Binding.mongocrypt_status_set(status, :ok, 200, message, message.length + 1)
|
90
|
+
status
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns true' do
|
94
|
+
expect(Mongo::Crypt::Binding.mongocrypt_status_ok(status_with_info)).to be true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'support/lite_constraints'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.extend(LiteConstraints)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'Mongo::Crypt::Binding' do
|
9
|
+
require_libmongocrypt
|
10
|
+
|
11
|
+
describe '#mongocrypt_version' do
|
12
|
+
let(:version) { Mongo::Crypt::Binding.mongocrypt_version(nil) }
|
13
|
+
|
14
|
+
it 'is a string' do
|
15
|
+
expect(version).to be_a_kind_of(String)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'is in the x.y.z-tag format' do
|
19
|
+
expect(version).to match(/\A(\d+.){2}(\d+)?(-[A-Za-z\+\d]+)?\z/)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
|
3
|
+
describe 'Mongo::Crypt::Binding' do
|
4
|
+
require_no_libmongocrypt
|
5
|
+
|
6
|
+
context 'when load fails' do
|
7
|
+
|
8
|
+
it 'retries loading at the next reference' do
|
9
|
+
lambda do
|
10
|
+
Mongo::Crypt::Binding
|
11
|
+
end.should raise_error(LoadError, /no path to libmongocrypt specified/)
|
12
|
+
|
13
|
+
# second load should also be attempted and should fail with the
|
14
|
+
# LoadError exception
|
15
|
+
lambda do
|
16
|
+
Mongo::Crypt::Binding
|
17
|
+
end.should raise_error(LoadError, /no path to libmongocrypt specified/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'base64'
|
3
|
+
require 'lite_spec_helper'
|
4
|
+
|
5
|
+
describe Mongo::Crypt::DataKeyContext do
|
6
|
+
require_libmongocrypt
|
7
|
+
include_context 'define shared FLE helpers'
|
8
|
+
|
9
|
+
let(:mongocrypt) do
|
10
|
+
Mongo::Crypt::Handle.new(kms_providers)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:io) { double("Mongo::Crypt::EncryptionIO") }
|
14
|
+
|
15
|
+
let(:context) { described_class.new(mongocrypt, io, kms_provider_name, options) }
|
16
|
+
let(:base_options) { {} }
|
17
|
+
let(:options) { base_options }
|
18
|
+
|
19
|
+
describe '#initialize' do
|
20
|
+
shared_examples 'it properly sets key_alt_names' do
|
21
|
+
context 'with one key_alt_names' do
|
22
|
+
let(:options) { base_options.merge(key_alt_names: ['keyAltName1']) }
|
23
|
+
|
24
|
+
it 'does not raise an exception' do
|
25
|
+
expect do
|
26
|
+
context
|
27
|
+
end.not_to raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with multiple key_alt_names' do
|
32
|
+
let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 'keyAltName2']) }
|
33
|
+
|
34
|
+
it 'does not raise an exception' do
|
35
|
+
expect do
|
36
|
+
context
|
37
|
+
end.not_to raise_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with empty key_alt_names' do
|
42
|
+
let(:options) { base_options.merge(key_alt_names: []) }
|
43
|
+
|
44
|
+
it 'does not raise an exception' do
|
45
|
+
expect do
|
46
|
+
context
|
47
|
+
end.not_to raise_error
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with invalid key_alt_names' do
|
52
|
+
let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 3]) }
|
53
|
+
|
54
|
+
it 'does raises an exception' do
|
55
|
+
expect do
|
56
|
+
context
|
57
|
+
end.to raise_error(ArgumentError, /All values of the :key_alt_names option Array must be Strings/)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with non-array key_alt_names' do
|
62
|
+
let(:options) { base_options.merge(key_alt_names: "keyAltName1") }
|
63
|
+
|
64
|
+
it 'does raises an exception' do
|
65
|
+
expect do
|
66
|
+
context
|
67
|
+
end.to raise_error(ArgumentError, /key_alt_names option must be an Array/)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'with invalid kms provider'do
|
73
|
+
let(:kms_providers) { local_kms_providers }
|
74
|
+
let(:kms_provider_name) { 'invalid' }
|
75
|
+
|
76
|
+
it 'raises an exception' do
|
77
|
+
expect do
|
78
|
+
context
|
79
|
+
end.to raise_exception(/invalid is an invalid kms provider/)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'with local kms provider and empty options' do
|
84
|
+
include_context 'with local kms_providers'
|
85
|
+
|
86
|
+
it_behaves_like 'it properly sets key_alt_names'
|
87
|
+
|
88
|
+
it 'does not raise an exception' do
|
89
|
+
expect do
|
90
|
+
context
|
91
|
+
end.not_to raise_error
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'with aws kms provider' do
|
96
|
+
include_context 'with AWS kms_providers'
|
97
|
+
|
98
|
+
let(:base_options) { { master_key: { region: 'us-east-2', key: 'arn' } } }
|
99
|
+
|
100
|
+
it_behaves_like 'it properly sets key_alt_names'
|
101
|
+
|
102
|
+
context 'with empty options' do
|
103
|
+
let(:options) { {} }
|
104
|
+
|
105
|
+
it 'raises an exception' do
|
106
|
+
expect do
|
107
|
+
context
|
108
|
+
end.to raise_error(ArgumentError, /options Hash must contain a key named :master_key with a Hash value/)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'with an invalid master key option' do
|
113
|
+
let(:options) { { master_key: 'key' } }
|
114
|
+
|
115
|
+
it 'raises an exception' do
|
116
|
+
expect do
|
117
|
+
context
|
118
|
+
end.to raise_error(ArgumentError, /:master_key option must be a Hash/)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'where master key is an empty hash' do
|
123
|
+
let(:options) { { master_key: {} } }
|
124
|
+
|
125
|
+
it 'raises an exception' do
|
126
|
+
expect do
|
127
|
+
context
|
128
|
+
end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'with a nil region option' do
|
133
|
+
let(:options) { { master_key: { region: nil } } }
|
134
|
+
|
135
|
+
it 'raises an exception' do
|
136
|
+
expect do
|
137
|
+
context
|
138
|
+
end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'with an invalid region option' do
|
143
|
+
let(:options) { { master_key: { region: 5 } } }
|
144
|
+
|
145
|
+
it 'raises an exception' do
|
146
|
+
expect do
|
147
|
+
context
|
148
|
+
end.to raise_error(ArgumentError, /5 is an invalid AWS master_key region/)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'with an invalid key option' do
|
153
|
+
let(:options) { { master_key: { region: 'us-east-2', key: nil } } }
|
154
|
+
|
155
|
+
it 'raises an exception' do
|
156
|
+
expect do
|
157
|
+
context
|
158
|
+
end.to raise_error(ArgumentError, /The value of :key option of the :master_key options hash cannot be nil/)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'with an invalid key option' do
|
163
|
+
let(:options) { { master_key: { region: 'us-east-2', key: 5 } } }
|
164
|
+
|
165
|
+
it 'raises an exception' do
|
166
|
+
expect do
|
167
|
+
context
|
168
|
+
end.to raise_error(ArgumentError, /5 is an invalid AWS master_key key/)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context 'with an invalid endpoint option' do
|
173
|
+
let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 5 } } }
|
174
|
+
|
175
|
+
it 'raises an exception' do
|
176
|
+
expect do
|
177
|
+
context
|
178
|
+
end.to raise_error(ArgumentError, /5 is an invalid AWS master_key endpoint/)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'with valid options' do
|
183
|
+
it 'does not raise an exception' do
|
184
|
+
expect do
|
185
|
+
context
|
186
|
+
end.not_to raise_error
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'with valid endpoint' do
|
191
|
+
let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'endpoint/to/kms' } } }
|
192
|
+
|
193
|
+
it 'does not raise an exception' do
|
194
|
+
expect do
|
195
|
+
context
|
196
|
+
end.not_to raise_error
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe '#run_state_machine' do
|
203
|
+
# TODO: test with AWS KMS provider
|
204
|
+
|
205
|
+
context 'with local KMS provider' do
|
206
|
+
include_context 'with local kms_providers'
|
207
|
+
|
208
|
+
it 'creates a data key' do
|
209
|
+
expect(context.run_state_machine).to be_a_kind_of(Hash)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|