mongo 2.11.4 → 2.12.3

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.
Files changed (357) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/README.md +2 -1
  6. data/lib/mongo.rb +3 -0
  7. data/lib/mongo/address.rb +44 -19
  8. data/lib/mongo/auth.rb +1 -0
  9. data/lib/mongo/auth/credential_cache.rb +51 -0
  10. data/lib/mongo/auth/scram/conversation.rb +20 -16
  11. data/lib/mongo/auth/user.rb +0 -8
  12. data/lib/mongo/auth/user/view.rb +4 -4
  13. data/lib/mongo/background_thread.rb +1 -1
  14. data/lib/mongo/bulk_write.rb +5 -5
  15. data/lib/mongo/client.rb +143 -14
  16. data/lib/mongo/client_encryption.rb +103 -0
  17. data/lib/mongo/cluster.rb +8 -4
  18. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  19. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +9 -7
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +40 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +179 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1229 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +289 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +315 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +23 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/bulk_write_error.rb +16 -14
  50. data/lib/mongo/error/crypt_error.rb +31 -0
  51. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  52. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  53. data/lib/mongo/error/kms_error.rb +22 -0
  54. data/lib/mongo/error/max_bson_size.rb +14 -3
  55. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  56. data/lib/mongo/error/no_server_available.rb +8 -3
  57. data/lib/mongo/error/notable.rb +0 -15
  58. data/lib/mongo/error/operation_failure.rb +1 -0
  59. data/lib/mongo/error/parser.rb +1 -1
  60. data/lib/mongo/grid/file.rb +5 -0
  61. data/lib/mongo/grid/file/chunk.rb +2 -0
  62. data/lib/mongo/grid/file/info.rb +3 -2
  63. data/lib/mongo/grid/fs_bucket.rb +15 -13
  64. data/lib/mongo/grid/stream/write.rb +9 -3
  65. data/lib/mongo/index/view.rb +3 -3
  66. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  67. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  68. data/lib/mongo/operation/collections_info.rb +6 -3
  69. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  70. data/lib/mongo/operation/find/op_msg.rb +4 -1
  71. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  72. data/lib/mongo/operation/insert/command.rb +3 -2
  73. data/lib/mongo/operation/insert/legacy.rb +3 -2
  74. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  75. data/lib/mongo/operation/result.rb +36 -27
  76. data/lib/mongo/operation/shared/executable.rb +11 -9
  77. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  78. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  79. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  80. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  81. data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
  82. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  83. data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
  84. data/lib/mongo/operation/shared/write.rb +17 -10
  85. data/lib/mongo/operation/update/op_msg.rb +1 -1
  86. data/lib/mongo/protocol/bit_vector.rb +2 -1
  87. data/lib/mongo/protocol/compressed.rb +6 -5
  88. data/lib/mongo/protocol/insert.rb +3 -1
  89. data/lib/mongo/protocol/message.rb +94 -15
  90. data/lib/mongo/protocol/msg.rb +207 -37
  91. data/lib/mongo/protocol/query.rb +7 -9
  92. data/lib/mongo/protocol/serializers.rb +43 -15
  93. data/lib/mongo/retryable.rb +1 -1
  94. data/lib/mongo/server.rb +10 -4
  95. data/lib/mongo/server/connection.rb +20 -9
  96. data/lib/mongo/server/connection_base.rb +118 -18
  97. data/lib/mongo/server/connection_common.rb +61 -0
  98. data/lib/mongo/server/connection_pool.rb +37 -1
  99. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  100. data/lib/mongo/server/description.rb +9 -11
  101. data/lib/mongo/server/monitor.rb +2 -0
  102. data/lib/mongo/server/monitor/connection.rb +3 -18
  103. data/lib/mongo/server/pending_connection.rb +2 -1
  104. data/lib/mongo/session.rb +3 -3
  105. data/lib/mongo/session/session_pool.rb +8 -3
  106. data/lib/mongo/socket.rb +29 -16
  107. data/lib/mongo/socket/ssl.rb +23 -8
  108. data/lib/mongo/socket/tcp.rb +12 -3
  109. data/lib/mongo/srv/monitor.rb +73 -42
  110. data/lib/mongo/srv/result.rb +0 -1
  111. data/lib/mongo/timeout.rb +49 -0
  112. data/lib/mongo/uri.rb +30 -1
  113. data/lib/mongo/uri/srv_protocol.rb +1 -1
  114. data/lib/mongo/version.rb +1 -1
  115. data/mongo.gemspec +1 -3
  116. data/spec/README.md +228 -7
  117. data/spec/integration/auth_spec.rb +53 -0
  118. data/spec/integration/bulk_write_spec.rb +19 -0
  119. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  120. data/spec/integration/client_construction_spec.rb +100 -1
  121. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
  122. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
  123. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
  124. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
  125. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
  126. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
  127. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
  128. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
  129. data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
  130. data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
  131. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  132. data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
  133. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  134. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
  135. data/spec/integration/client_side_encryption/views_spec.rb +44 -0
  136. data/spec/integration/client_update_spec.rb +154 -0
  137. data/spec/integration/command_monitoring_spec.rb +3 -1
  138. data/spec/integration/command_spec.rb +44 -10
  139. data/spec/integration/connection_spec.rb +57 -0
  140. data/spec/integration/crud_spec.rb +89 -0
  141. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  142. data/spec/integration/read_preference_spec.rb +26 -0
  143. data/spec/integration/reconnect_spec.rb +7 -6
  144. data/spec/integration/size_limit_spec.rb +111 -0
  145. data/spec/integration/srv_monitoring_spec.rb +16 -8
  146. data/spec/integration/zlib_compression_spec.rb +25 -0
  147. data/spec/kerberos/kerberos_spec.rb +87 -0
  148. data/spec/lite_spec_helper.rb +34 -29
  149. data/spec/mongo/auth/cr_spec.rb +8 -0
  150. data/spec/mongo/auth/ldap_spec.rb +5 -1
  151. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  152. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  153. data/spec/mongo/auth/scram_spec.rb +45 -35
  154. data/spec/mongo/auth/user/view_spec.rb +3 -6
  155. data/spec/mongo/auth/x509_spec.rb +5 -1
  156. data/spec/mongo/bulk_write/result_spec.rb +11 -7
  157. data/spec/mongo/client_construction_spec.rb +206 -2
  158. data/spec/mongo/client_encryption_spec.rb +405 -0
  159. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  160. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  161. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  162. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  163. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  164. data/spec/mongo/collection/view_spec.rb +1 -1
  165. data/spec/mongo/collection_spec.rb +28 -9
  166. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  167. data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
  168. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  169. data/spec/mongo/crypt/binary_spec.rb +115 -0
  170. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  171. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  172. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  173. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  174. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  175. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  176. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  177. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  178. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  179. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  180. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  181. data/spec/mongo/crypt/handle_spec.rb +232 -0
  182. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  183. data/spec/mongo/crypt/status_spec.rb +152 -0
  184. data/spec/mongo/cursor_spec.rb +24 -4
  185. data/spec/mongo/database_spec.rb +20 -0
  186. data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
  187. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  188. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  189. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  190. data/spec/mongo/error/notable_spec.rb +59 -0
  191. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  192. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  193. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  194. data/spec/mongo/operation/command_spec.rb +3 -3
  195. data/spec/mongo/operation/create_index_spec.rb +3 -3
  196. data/spec/mongo/operation/create_user_spec.rb +3 -3
  197. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  198. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  199. data/spec/mongo/operation/delete_spec.rb +7 -7
  200. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  201. data/spec/mongo/operation/find/legacy_spec.rb +2 -1
  202. data/spec/mongo/operation/get_more_spec.rb +1 -1
  203. data/spec/mongo/operation/indexes_spec.rb +1 -1
  204. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  205. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  206. data/spec/mongo/operation/insert_spec.rb +12 -12
  207. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  208. data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
  209. data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
  210. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  211. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  212. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  213. data/spec/mongo/operation/update_spec.rb +7 -7
  214. data/spec/mongo/operation/update_user_spec.rb +1 -1
  215. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  216. data/spec/mongo/protocol/delete_spec.rb +9 -8
  217. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  218. data/spec/mongo/protocol/insert_spec.rb +9 -8
  219. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  220. data/spec/mongo/protocol/msg_spec.rb +57 -53
  221. data/spec/mongo/protocol/query_spec.rb +12 -12
  222. data/spec/mongo/protocol/registry_spec.rb +1 -1
  223. data/spec/mongo/protocol/reply_spec.rb +1 -1
  224. data/spec/mongo/protocol/update_spec.rb +10 -9
  225. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  226. data/spec/mongo/server/connection_spec.rb +28 -7
  227. data/spec/mongo/socket_spec.rb +1 -1
  228. data/spec/mongo/srv/monitor_spec.rb +88 -69
  229. data/spec/mongo/timeout_spec.rb +85 -0
  230. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  231. data/spec/mongo/uri_spec.rb +52 -5
  232. data/spec/mongo/write_concern_spec.rb +13 -1
  233. data/spec/{support → runners}/auth.rb +14 -1
  234. data/spec/{support → runners}/change_streams.rb +1 -1
  235. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  236. data/spec/{support → runners}/cmap.rb +1 -1
  237. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  238. data/spec/{support → runners}/command_monitoring.rb +0 -0
  239. data/spec/runners/connection_string.rb +358 -4
  240. data/spec/{support → runners}/crud.rb +9 -9
  241. data/spec/{support → runners}/crud/context.rb +0 -0
  242. data/spec/{support → runners}/crud/operation.rb +7 -3
  243. data/spec/{support → runners}/crud/outcome.rb +0 -0
  244. data/spec/{support → runners}/crud/requirement.rb +1 -1
  245. data/spec/{support → runners}/crud/spec.rb +12 -1
  246. data/spec/{support → runners}/crud/test.rb +0 -0
  247. data/spec/{support → runners}/crud/test_base.rb +0 -0
  248. data/spec/{support → runners}/crud/verifier.rb +10 -12
  249. data/spec/{support → runners}/gridfs.rb +0 -0
  250. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  251. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  252. data/spec/{support → runners}/server_selection.rb +0 -0
  253. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  254. data/spec/{support → runners}/transactions.rb +9 -11
  255. data/spec/{support → runners}/transactions/context.rb +0 -0
  256. data/spec/{support → runners}/transactions/operation.rb +0 -0
  257. data/spec/{support → runners}/transactions/spec.rb +0 -0
  258. data/spec/{support → runners}/transactions/test.rb +37 -5
  259. data/spec/spec_helper.rb +0 -5
  260. data/spec/spec_tests/auth_spec.rb +3 -3
  261. data/spec/spec_tests/client_side_encryption_spec.rb +8 -0
  262. data/spec/spec_tests/connection_string_spec.rb +1 -1
  263. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  264. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  265. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  266. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  267. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  268. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  269. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  270. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  271. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  272. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  273. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  274. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  275. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  276. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  277. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  278. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  279. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  280. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  281. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  282. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  283. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  284. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  285. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  286. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  287. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  288. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  289. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  290. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  291. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  292. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  293. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  294. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  295. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  296. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  297. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  298. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  299. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  300. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  301. 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
  302. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  303. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  304. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  305. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  306. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  307. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  308. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  309. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  310. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  311. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  312. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  313. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  314. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  315. data/spec/spec_tests/uri_options_spec.rb +6 -8
  316. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  317. data/spec/support/certificates/README.md +4 -0
  318. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  319. data/spec/support/certificates/server-second-level.crt +52 -52
  320. data/spec/support/certificates/server-second-level.key +25 -25
  321. data/spec/support/certificates/server-second-level.pem +77 -77
  322. data/spec/support/client_registry.rb +19 -3
  323. data/spec/support/cluster_config.rb +9 -1
  324. data/spec/support/cluster_tools.rb +6 -1
  325. data/spec/support/common_shortcuts.rb +12 -0
  326. data/spec/support/constraints.rb +16 -0
  327. data/spec/support/crypt.rb +154 -0
  328. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  329. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  330. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  331. data/spec/support/crypt/corpus/corpus.json +3657 -0
  332. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  333. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  334. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  335. data/spec/support/crypt/external/external-key.json +31 -0
  336. data/spec/support/crypt/external/external-schema.json +19 -0
  337. data/spec/support/crypt/limits/limits-doc.json +102 -0
  338. data/spec/support/crypt/limits/limits-key.json +31 -0
  339. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  340. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  341. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  342. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  343. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  344. data/spec/support/lite_constraints.rb +19 -1
  345. data/spec/support/matchers.rb +19 -0
  346. data/spec/support/shared/protocol.rb +2 -0
  347. data/spec/support/spec_config.rb +53 -13
  348. data/spec/support/utils.rb +140 -10
  349. metadata +894 -687
  350. metadata.gz.sig +0 -0
  351. data/lib/mongo/cluster/srv_monitor.rb +0 -127
  352. data/lib/mongo/srv/warning_result.rb +0 -35
  353. data/spec/enterprise_auth/kerberos_spec.rb +0 -58
  354. data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
  355. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  356. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  357. data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,303 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ require_enterprise
6
+ min_server_fcv '4.2'
7
+
8
+ # Diagnostics of leaked background threads only, these tests do not
9
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
10
+ clean_slate
11
+
12
+ include_context 'define shared FLE helpers'
13
+ include_context 'with local kms_providers'
14
+
15
+ let(:subscriber) { EventSubscriber.new }
16
+ let(:db_name) { 'auto_encryption' }
17
+
18
+ let(:encryption_client) do
19
+ new_local_client(
20
+ SpecConfig.instance.addresses,
21
+ SpecConfig.instance.test_options.merge(
22
+ auto_encryption_options: {
23
+ kms_providers: kms_providers,
24
+ key_vault_namespace: key_vault_namespace,
25
+ schema_map: { "auto_encryption.users" => schema_map },
26
+ # Spawn mongocryptd on non-default port for sharded cluster tests
27
+ extra_options: extra_options,
28
+ },
29
+ database: db_name
30
+ ),
31
+ ).tap do |client|
32
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
33
+ end
34
+ end
35
+
36
+ before(:each) do
37
+ key_vault_collection.drop
38
+ key_vault_collection.insert_one(data_key)
39
+
40
+ encryption_client['users'].drop
41
+ result = encryption_client['users'].insert_one(ssn: ssn, age: 23)
42
+ end
43
+
44
+ let(:started_event) do
45
+ subscriber.started_events.find do |event|
46
+ event.command_name == command_name && event.database_name == db_name
47
+ end
48
+ end
49
+
50
+ let(:succeeded_event) do
51
+ subscriber.succeeded_events.find do |event|
52
+ event.command_name == command_name && event.database_name == db_name
53
+ end
54
+ end
55
+
56
+ let(:key_vault_list_collections_event) do
57
+ subscriber.started_events.find do |event|
58
+ event.command_name == 'listCollections' && event.database_name == key_vault_db
59
+ end
60
+ end
61
+
62
+ shared_examples 'it has an encrypted key_vault_client' do
63
+ it 'registers a listCollections event on the key vault client' do
64
+ expect(key_vault_list_collections_event).not_to be_nil
65
+ expect(key_vault_list_collections_event.command['$db']).to eq(key_vault_db)
66
+ end
67
+ end
68
+
69
+ describe '#aggregate' do
70
+ let(:command_name) { 'aggregate' }
71
+
72
+ before do
73
+ encryption_client['users'].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
74
+ end
75
+
76
+ it 'has encrypted data in command monitoring' do
77
+ # Command started event occurs after ssn is encrypted
78
+ expect(
79
+ started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
80
+ ).to be_ciphertext
81
+
82
+ # Command succeeded event occurs before ssn is decrypted
83
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
84
+ end
85
+
86
+ it_behaves_like 'it has an encrypted key_vault_client'
87
+ end
88
+
89
+ describe '#count' do
90
+ let(:command_name) { 'count' }
91
+
92
+ before do
93
+ encryption_client['users'].count(ssn: ssn)
94
+ end
95
+
96
+ it 'has encrypted data in command monitoring' do
97
+ # Command started event occurs after ssn is encrypted
98
+ # Command succeeded event does not contain any data to be decrypted
99
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
100
+ end
101
+
102
+ it_behaves_like 'it has an encrypted key_vault_client'
103
+ end
104
+
105
+ describe '#distinct' do
106
+ let(:command_name) { 'distinct' }
107
+
108
+ before do
109
+ encryption_client['users'].distinct(:ssn)
110
+ end
111
+
112
+ it 'has encrypted data in command monitoring' do
113
+ # Command started event does not contain any data to be encrypted
114
+ # Command succeeded event occurs before ssn is decrypted
115
+ expect(succeeded_event.reply["values"].first).to be_ciphertext
116
+ end
117
+
118
+ it_behaves_like 'it has an encrypted key_vault_client'
119
+ end
120
+
121
+ describe '#delete_one' do
122
+ let(:command_name) { 'delete' }
123
+
124
+ before do
125
+ encryption_client['users'].delete_one(ssn: ssn)
126
+ end
127
+
128
+ it 'has encrypted data in command monitoring' do
129
+ # Command started event occurs after ssn is encrypted
130
+ # Command succeeded event does not contain any data to be decrypted
131
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
132
+ end
133
+
134
+ it_behaves_like 'it has an encrypted key_vault_client'
135
+ end
136
+
137
+ describe '#delete_many' do
138
+ let(:command_name) { 'delete' }
139
+
140
+ before do
141
+ encryption_client['users'].delete_many(ssn: ssn)
142
+ end
143
+
144
+ it 'has encrypted data in command monitoring' do
145
+ # Command started event occurs after ssn is encrypted
146
+ # Command succeeded event does not contain any data to be decrypted
147
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
148
+ end
149
+
150
+ it_behaves_like 'it has an encrypted key_vault_client'
151
+ end
152
+
153
+ describe '#find' do
154
+ let(:command_name) { 'find' }
155
+
156
+ before do
157
+ encryption_client['users'].find(ssn: ssn).first
158
+ end
159
+
160
+ it 'has encrypted data in command monitoring' do
161
+ # Command started event occurs after ssn is encrypted
162
+ expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
163
+
164
+ # Command succeeded event occurs before ssn is decrypted
165
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
166
+ end
167
+
168
+ it_behaves_like 'it has an encrypted key_vault_client'
169
+ end
170
+
171
+ describe '#find_one_and_delete' do
172
+ let(:command_name) { 'findAndModify' }
173
+
174
+ before do
175
+ encryption_client['users'].find_one_and_delete(ssn: ssn)
176
+ end
177
+
178
+ it 'has encrypted data in command monitoring' do
179
+ # Command started event occurs after ssn is encrypted
180
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
181
+
182
+ # Command succeeded event occurs before ssn is decrypted
183
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
184
+ end
185
+
186
+ it_behaves_like 'it has an encrypted key_vault_client'
187
+ end
188
+
189
+ describe '#find_one_and_replace' do
190
+ let(:command_name) { 'findAndModify' }
191
+
192
+ before do
193
+ encryption_client['users'].find_one_and_replace(
194
+ { ssn: ssn },
195
+ { ssn: '555-555-5555' }
196
+ )
197
+ end
198
+
199
+ it 'has encrypted data in command monitoring' do
200
+ # Command started event occurs after ssn is encrypted
201
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
202
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
203
+
204
+ # Command succeeded event occurs before ssn is decrypted
205
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
206
+ end
207
+
208
+ it_behaves_like 'it has an encrypted key_vault_client'
209
+ end
210
+
211
+ describe '#find_one_and_update' do
212
+ let(:command_name) { 'findAndModify' }
213
+
214
+ before do
215
+ encryption_client['users'].find_one_and_update(
216
+ { ssn: ssn },
217
+ { ssn: '555-555-5555' }
218
+ )
219
+ end
220
+
221
+ it 'has encrypted data in command monitoring' do
222
+
223
+ # Command started event occurs after ssn is encrypted
224
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
225
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
226
+
227
+ # Command succeeded event occurs before ssn is decrypted
228
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
229
+ end
230
+
231
+ it_behaves_like 'it has an encrypted key_vault_client'
232
+ end
233
+
234
+ describe '#insert_one' do
235
+ let(:command_name) { 'insert' }
236
+
237
+ before do
238
+ encryption_client['users'].insert_one(ssn: ssn)
239
+ end
240
+
241
+ it 'has encrypted data in command monitoring' do
242
+ # Command started event occurs after ssn is encrypted
243
+ # Command succeeded event does not contain any data to be decrypted
244
+ expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
245
+ end
246
+
247
+ it_behaves_like 'it has an encrypted key_vault_client'
248
+ end
249
+
250
+ describe '#replace_one' do
251
+ let(:command_name) { 'update' }
252
+
253
+ before do
254
+ encryption_client['users'].replace_one(
255
+ { ssn: ssn },
256
+ { ssn: '555-555-5555' }
257
+ )
258
+ end
259
+
260
+ it 'has encrypted data in command monitoring' do
261
+ # Command started event occurs after ssn is encrypted
262
+ # Command succeeded event does not contain any data to be decrypted
263
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
264
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
265
+ end
266
+
267
+ it_behaves_like 'it has an encrypted key_vault_client'
268
+ end
269
+
270
+ describe '#update_one' do
271
+ let(:command_name) { 'update' }
272
+
273
+ before do
274
+ encryption_client['users'].update_one({ ssn: ssn }, { ssn: '555-555-5555' })
275
+ end
276
+
277
+ it 'has encrypted data in command monitoring' do
278
+ # Command started event occurs after ssn is encrypted
279
+ # Command succeeded event does not contain any data to be decrypted
280
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
281
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
282
+ end
283
+
284
+ it_behaves_like 'it has an encrypted key_vault_client'
285
+ end
286
+
287
+ describe '#update_many' do
288
+ let(:command_name) { 'update' }
289
+
290
+ before do
291
+ # update_many does not support replacement-style updates
292
+ encryption_client['users'].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
293
+ end
294
+
295
+ it 'has encrypted data in command monitoring' do
296
+ # Command started event occurs after ssn is encrypted
297
+ # Command succeeded event does not contain any data to be decrypted
298
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
299
+ end
300
+
301
+ it_behaves_like 'it has an encrypted key_vault_client'
302
+ end
303
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ min_server_fcv '4.2'
6
+ require_enterprise
7
+
8
+ include_context 'define shared FLE helpers'
9
+ include_context 'with local kms_providers'
10
+
11
+ context 'with an invalid mongocryptd spawn path' do
12
+ let(:client) do
13
+ new_local_client(
14
+ SpecConfig.instance.addresses,
15
+ SpecConfig.instance.test_options.merge(
16
+ auto_encryption_options: {
17
+ kms_providers: kms_providers,
18
+ key_vault_namespace: key_vault_namespace,
19
+ schema_map: { 'auto_encryption.users' => schema_map },
20
+ extra_options: {
21
+ mongocryptd_spawn_path: 'echo hello world',
22
+ mongocryptd_spawn_args: []
23
+ }
24
+ },
25
+ database: 'auto_encryption'
26
+ ),
27
+ )
28
+ end
29
+
30
+ let(:server_selector) { double("ServerSelector") }
31
+ let(:cluster) { double("Cluster") }
32
+
33
+ before do
34
+ key_vault_collection.drop
35
+ key_vault_collection.insert_one(data_key)
36
+
37
+ allow(server_selector).to receive(:name)
38
+ allow(server_selector).to receive(:server_selection_timeout)
39
+ allow(server_selector).to receive(:local_threshold)
40
+ allow(cluster).to receive(:summary)
41
+
42
+ # Raise a server selection error on intent-to-encrypt commands to mock
43
+ # what would happen if mongocryptd hadn't already been spawned. It is
44
+ # necessary to mock this behavior because it is likely that another test
45
+ # will have already spawned mongocryptd, causing this test to fail.
46
+ allow_any_instance_of(Mongo::Database)
47
+ .to receive(:command)
48
+ .with(
49
+ hash_including(
50
+ 'insert' => 'users',
51
+ '$db' => 'auto_encryption',
52
+ 'ordered' => true,
53
+ 'lsid' => kind_of(Hash),
54
+ 'documents' => kind_of(Array),
55
+ 'jsonSchema' => kind_of(Hash),
56
+ 'isRemoteSchema' => false,
57
+ ),
58
+ { execution_options: { deserialize_as_bson: true } },
59
+ )
60
+ .and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
61
+ end
62
+
63
+ it 'raises an exception when trying to perform auto encryption' do
64
+ expect do
65
+ client['users'].insert_one(ssn: ssn)
66
+ end.to raise_error(
67
+ Mongo::Error::MongocryptdSpawnError,
68
+ /Failed to spawn mongocryptd at the path "echo hello world" with arguments/
69
+ )
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ max_server_version '4.0'
6
+
7
+ # Diagnostics of leaked background threads only, these tests do not
8
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
9
+ clean_slate
10
+
11
+ include_context 'define shared FLE helpers'
12
+
13
+ let(:encryption_client) do
14
+ new_local_client(
15
+ SpecConfig.instance.addresses,
16
+ SpecConfig.instance.test_options.merge(
17
+ auto_encryption_options: {
18
+ kms_providers: kms_providers,
19
+ key_vault_namespace: key_vault_namespace,
20
+ # Must use local schema map because server versions older than 4.2
21
+ # do not support jsonSchema collection validator.
22
+ schema_map: { 'auto_encryption.users' => schema_map },
23
+ bypass_auto_encryption: bypass_auto_encryption,
24
+ # Spawn mongocryptd on non-default port for sharded cluster tests
25
+ extra_options: extra_options,
26
+ },
27
+ database: 'auto_encryption'
28
+ ),
29
+ )
30
+ end
31
+
32
+ let(:bypass_auto_encryption) { false }
33
+ let(:client) { authorized_client.use('auto_encryption') }
34
+
35
+ let(:encrypted_ssn_binary) do
36
+ BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
37
+ end
38
+
39
+ shared_examples 'it decrypts but does not encrypt on wire version < 8' do
40
+ before do
41
+ client['users'].drop
42
+ client['users'].insert_one(ssn: encrypted_ssn_binary)
43
+
44
+ key_vault_collection.drop
45
+ key_vault_collection.insert_one(data_key)
46
+ end
47
+
48
+ it 'raises an exception when trying to encrypt' do
49
+ expect do
50
+ encryption_client['users'].find(ssn: ssn).first
51
+ end.to raise_error(Mongo::Error::CryptError, /Auto-encryption requires a minimum MongoDB version of 4.2/)
52
+ end
53
+
54
+ context 'with bypass_auto_encryption=true' do
55
+ let(:bypass_auto_encryption) { true }
56
+
57
+ it 'does not raise an exception but doesn\'t encrypt' do
58
+ document = encryption_client['users'].find(ssn: ssn).first
59
+ expect(document).to be_nil
60
+ end
61
+
62
+ it 'still decrypts' do
63
+ document = encryption_client['users'].find(ssn: encrypted_ssn_binary).first
64
+ # ssn field is still decrypted
65
+ expect(document['ssn']).to eq(ssn)
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'with AWS kms provider' do
71
+ include_context 'with AWS kms_providers'
72
+ it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
73
+ end
74
+
75
+ context 'with local kms provider' do
76
+ include_context 'with local kms_providers'
77
+ it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
78
+ end
79
+ end