mongo 2.5.3 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +3 -2
  6. data/lib/mongo.rb +2 -2
  7. data/lib/mongo/address.rb +10 -2
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +26 -5
  10. data/lib/mongo/address/unix.rb +1 -1
  11. data/lib/mongo/auth.rb +10 -3
  12. data/lib/mongo/auth/cr.rb +4 -1
  13. data/lib/mongo/auth/cr/conversation.rb +4 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  16. data/lib/mongo/auth/roles.rb +1 -1
  17. data/lib/mongo/auth/scram.rb +24 -7
  18. data/lib/mongo/auth/scram/conversation.rb +52 -19
  19. data/lib/mongo/auth/stringprep.rb +114 -0
  20. data/lib/mongo/auth/stringprep/profiles/sasl.rb +73 -0
  21. data/lib/mongo/auth/stringprep/tables.rb +3232 -0
  22. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +174 -0
  23. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1170 -0
  24. data/lib/mongo/auth/user.rb +14 -3
  25. data/lib/mongo/auth/user/view.rb +1 -1
  26. data/lib/mongo/auth/x509.rb +1 -1
  27. data/lib/mongo/auth/x509/conversation.rb +1 -1
  28. data/lib/mongo/bson.rb +1 -1
  29. data/lib/mongo/bulk_write.rb +8 -8
  30. data/lib/mongo/bulk_write/combineable.rb +1 -1
  31. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  32. data/lib/mongo/bulk_write/result.rb +1 -1
  33. data/lib/mongo/bulk_write/result_combiner.rb +4 -4
  34. data/lib/mongo/bulk_write/transformable.rb +1 -1
  35. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  36. data/lib/mongo/bulk_write/validatable.rb +1 -1
  37. data/lib/mongo/client.rb +115 -24
  38. data/lib/mongo/cluster.rb +17 -10
  39. data/lib/mongo/cluster/app_metadata.rb +7 -1
  40. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  41. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  42. data/lib/mongo/cluster/topology.rb +12 -2
  43. data/lib/mongo/cluster/topology/replica_set.rb +9 -1
  44. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  45. data/lib/mongo/cluster/topology/single.rb +1 -1
  46. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  47. data/lib/mongo/collection.rb +75 -19
  48. data/lib/mongo/collection/view.rb +1 -1
  49. data/lib/mongo/collection/view/aggregation.rb +1 -1
  50. data/lib/mongo/collection/view/builder.rb +1 -1
  51. data/lib/mongo/collection/view/builder/aggregation.rb +3 -3
  52. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  53. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  54. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  55. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  56. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  57. data/lib/mongo/collection/view/change_stream.rb +193 -17
  58. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -20
  59. data/lib/mongo/collection/view/explainable.rb +1 -1
  60. data/lib/mongo/collection/view/immutable.rb +1 -1
  61. data/lib/mongo/collection/view/iterable.rb +2 -2
  62. data/lib/mongo/collection/view/map_reduce.rb +1 -1
  63. data/lib/mongo/collection/view/readable.rb +108 -29
  64. data/lib/mongo/collection/view/writable.rb +3 -3
  65. data/lib/mongo/cursor.rb +44 -4
  66. data/lib/mongo/cursor/builder.rb +1 -1
  67. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  68. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  69. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  70. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  71. data/lib/mongo/database.rb +46 -3
  72. data/lib/mongo/database/view.rb +11 -11
  73. data/lib/mongo/dbref.rb +1 -1
  74. data/lib/mongo/error.rb +57 -1
  75. data/lib/mongo/error/bulk_write_error.rb +2 -2
  76. data/lib/mongo/error/change_stream_resumable.rb +37 -0
  77. data/lib/mongo/error/closed_stream.rb +1 -1
  78. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  79. data/lib/mongo/error/failed_stringprep_validation.rb +38 -0
  80. data/lib/mongo/error/file_not_found.rb +1 -1
  81. data/lib/mongo/error/insufficient_iteration_count.rb +38 -0
  82. data/lib/mongo/error/invalid_application_name.rb +1 -1
  83. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  84. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  85. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  86. data/lib/mongo/error/invalid_database_name.rb +1 -1
  87. data/lib/mongo/error/invalid_document.rb +1 -1
  88. data/lib/mongo/error/invalid_file.rb +1 -1
  89. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  90. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  91. data/lib/mongo/error/invalid_nonce.rb +1 -1
  92. data/lib/mongo/error/invalid_read_option.rb +35 -0
  93. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  94. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  95. data/lib/mongo/error/invalid_session.rb +1 -1
  96. data/lib/mongo/error/invalid_signature.rb +1 -1
  97. data/lib/mongo/error/invalid_transaction_operation.rb +82 -0
  98. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  99. data/lib/mongo/error/invalid_update_document.rb +1 -1
  100. data/lib/mongo/error/invalid_uri.rb +1 -1
  101. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  102. data/lib/mongo/error/max_bson_size.rb +1 -1
  103. data/lib/mongo/error/max_message_size.rb +1 -1
  104. data/lib/mongo/error/mismatched_domain.rb +1 -1
  105. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  106. data/lib/mongo/error/missing_resume_token.rb +1 -1
  107. data/lib/mongo/error/multi_index_drop.rb +1 -1
  108. data/lib/mongo/error/need_primary_server.rb +1 -1
  109. data/lib/mongo/error/no_server_available.rb +1 -1
  110. data/lib/mongo/error/no_srv_records.rb +1 -1
  111. data/lib/mongo/error/operation_failure.rb +108 -14
  112. data/lib/mongo/error/parser.rb +50 -1
  113. data/lib/mongo/error/socket_error.rb +5 -2
  114. data/lib/mongo/error/socket_timeout_error.rb +5 -2
  115. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  116. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  117. data/lib/mongo/error/unexpected_response.rb +1 -1
  118. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  119. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  120. data/lib/mongo/error/unsupported_collation.rb +1 -1
  121. data/lib/mongo/error/unsupported_features.rb +1 -1
  122. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  123. data/lib/mongo/error/write_retryable.rb +27 -0
  124. data/lib/mongo/event.rb +10 -9
  125. data/lib/mongo/event/base.rb +33 -0
  126. data/lib/mongo/event/description_changed.rb +2 -2
  127. data/lib/mongo/event/listeners.rb +1 -1
  128. data/lib/mongo/event/member_discovered.rb +4 -2
  129. data/lib/mongo/event/primary_elected.rb +2 -2
  130. data/lib/mongo/event/publisher.rb +1 -1
  131. data/lib/mongo/event/standalone_discovered.rb +2 -2
  132. data/lib/mongo/event/subscriber.rb +1 -1
  133. data/lib/mongo/grid.rb +1 -1
  134. data/lib/mongo/grid/file.rb +1 -1
  135. data/lib/mongo/grid/file/chunk.rb +3 -3
  136. data/lib/mongo/grid/file/info.rb +26 -3
  137. data/lib/mongo/grid/fs_bucket.rb +1 -1
  138. data/lib/mongo/grid/stream.rb +1 -1
  139. data/lib/mongo/grid/stream/read.rb +1 -1
  140. data/lib/mongo/grid/stream/write.rb +1 -1
  141. data/lib/mongo/index.rb +1 -1
  142. data/lib/mongo/index/view.rb +1 -1
  143. data/lib/mongo/loggable.rb +1 -1
  144. data/lib/mongo/logger.rb +1 -1
  145. data/lib/mongo/monitoring.rb +99 -62
  146. data/lib/mongo/monitoring/command_log_subscriber.rb +2 -2
  147. data/lib/mongo/monitoring/event.rb +2 -1
  148. data/lib/mongo/monitoring/event/command_failed.rb +19 -6
  149. data/lib/mongo/monitoring/event/command_started.rb +14 -3
  150. data/lib/mongo/monitoring/event/command_succeeded.rb +5 -3
  151. data/lib/mongo/monitoring/event/secure.rb +1 -1
  152. data/lib/mongo/monitoring/event/server_closed.rb +2 -2
  153. data/lib/mongo/monitoring/event/server_description_changed.rb +2 -2
  154. data/lib/mongo/monitoring/event/server_opening.rb +11 -2
  155. data/lib/mongo/monitoring/event/topology_changed.rb +13 -2
  156. data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
  157. data/lib/mongo/monitoring/event/topology_opening.rb +11 -2
  158. data/lib/mongo/monitoring/publishable.rb +10 -6
  159. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  160. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  161. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  162. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  163. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  164. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  165. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  166. data/lib/mongo/operation/create/op_msg.rb +9 -0
  167. data/lib/mongo/operation/create_index/op_msg.rb +9 -0
  168. data/lib/mongo/operation/create_user/command.rb +1 -1
  169. data/lib/mongo/operation/create_user/op_msg.rb +10 -1
  170. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  171. data/lib/mongo/operation/distinct/op_msg.rb +9 -0
  172. data/lib/mongo/operation/drop/op_msg.rb +9 -0
  173. data/lib/mongo/operation/drop_database/op_msg.rb +9 -0
  174. data/lib/mongo/operation/drop_index/op_msg.rb +9 -0
  175. data/lib/mongo/operation/explain/op_msg.rb +3 -0
  176. data/lib/mongo/operation/find/op_msg.rb +3 -0
  177. data/lib/mongo/operation/get_more.rb +1 -1
  178. data/lib/mongo/operation/get_more/command.rb +1 -1
  179. data/lib/mongo/operation/get_more/legacy.rb +1 -1
  180. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  181. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  182. data/lib/mongo/operation/indexes/result.rb +1 -1
  183. data/lib/mongo/operation/insert/bulk_result.rb +32 -2
  184. data/lib/mongo/operation/insert/op_msg.rb +3 -0
  185. data/lib/mongo/operation/insert/result.rb +1 -1
  186. data/lib/mongo/operation/kill_cursors/op_msg.rb +9 -0
  187. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  188. data/lib/mongo/operation/list_collections/result.rb +5 -1
  189. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  190. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  191. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  192. data/lib/mongo/operation/remove_user/op_msg.rb +9 -0
  193. data/lib/mongo/operation/result.rb +27 -14
  194. data/lib/mongo/operation/shared/executable.rb +1 -0
  195. data/lib/mongo/operation/shared/sessions_supported.rb +78 -7
  196. data/lib/mongo/operation/shared/specifiable.rb +18 -2
  197. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  198. data/lib/mongo/operation/update/op_msg.rb +3 -0
  199. data/lib/mongo/operation/update_user/command.rb +1 -1
  200. data/lib/mongo/operation/update_user/op_msg.rb +10 -1
  201. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  202. data/lib/mongo/options.rb +1 -1
  203. data/lib/mongo/options/mapper.rb +1 -1
  204. data/lib/mongo/options/redacted.rb +1 -1
  205. data/lib/mongo/protocol/bit_vector.rb +1 -1
  206. data/lib/mongo/protocol/compressed.rb +1 -1
  207. data/lib/mongo/protocol/delete.rb +1 -1
  208. data/lib/mongo/protocol/get_more.rb +7 -7
  209. data/lib/mongo/protocol/insert.rb +1 -1
  210. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  211. data/lib/mongo/protocol/message.rb +5 -5
  212. data/lib/mongo/protocol/msg.rb +9 -7
  213. data/lib/mongo/protocol/query.rb +1 -1
  214. data/lib/mongo/protocol/registry.rb +1 -1
  215. data/lib/mongo/protocol/reply.rb +10 -10
  216. data/lib/mongo/protocol/serializers.rb +1 -1
  217. data/lib/mongo/protocol/update.rb +1 -1
  218. data/lib/mongo/retryable.rb +22 -14
  219. data/lib/mongo/server.rb +1 -1
  220. data/lib/mongo/server/connectable.rb +1 -1
  221. data/lib/mongo/server/connection.rb +16 -4
  222. data/lib/mongo/server/connection_pool.rb +1 -1
  223. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  224. data/lib/mongo/server/context.rb +1 -1
  225. data/lib/mongo/server/description.rb +14 -2
  226. data/lib/mongo/server/description/features.rb +10 -9
  227. data/lib/mongo/server/description/inspector.rb +1 -1
  228. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  229. data/lib/mongo/server/description/inspector/member_discovered.rb +1 -1
  230. data/lib/mongo/server/description/inspector/primary_elected.rb +1 -1
  231. data/lib/mongo/server/description/inspector/standalone_discovered.rb +1 -1
  232. data/lib/mongo/server/monitor.rb +15 -3
  233. data/lib/mongo/server/monitor/connection.rb +1 -1
  234. data/lib/mongo/server_selector.rb +1 -1
  235. data/lib/mongo/server_selector/nearest.rb +1 -1
  236. data/lib/mongo/server_selector/primary.rb +1 -1
  237. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  238. data/lib/mongo/server_selector/secondary.rb +1 -1
  239. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  240. data/lib/mongo/server_selector/selectable.rb +7 -2
  241. data/lib/mongo/session.rb +389 -12
  242. data/lib/mongo/session/server_session.rb +7 -2
  243. data/lib/mongo/session/session_pool.rb +1 -1
  244. data/lib/mongo/socket.rb +1 -1
  245. data/lib/mongo/socket/ssl.rb +1 -1
  246. data/lib/mongo/socket/tcp.rb +1 -1
  247. data/lib/mongo/socket/unix.rb +1 -1
  248. data/lib/mongo/uri.rb +6 -4
  249. data/lib/mongo/uri/srv_protocol.rb +1 -1
  250. data/lib/mongo/version.rb +2 -2
  251. data/lib/mongo/write_concern.rb +1 -1
  252. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  253. data/lib/mongo/write_concern/normalizable.rb +1 -1
  254. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  255. data/mongo.gemspec +4 -1
  256. data/spec/atlas/atlas_connectivity_spec.rb +54 -0
  257. data/spec/integration/bulk_insert_spec.rb +78 -0
  258. data/spec/integration/change_stream_spec.rb +365 -0
  259. data/spec/integration/command_monitoring_spec.rb +92 -0
  260. data/spec/lite_spec_helper.rb +63 -0
  261. data/spec/mongo/address/ipv6_spec.rb +29 -1
  262. data/spec/mongo/address_spec.rb +34 -0
  263. data/spec/mongo/auth/scram/conversation_spec.rb +326 -120
  264. data/spec/mongo/auth/scram/negotiation_spec.rb +574 -0
  265. data/spec/mongo/auth/scram_spec.rb +107 -38
  266. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +113 -0
  267. data/spec/mongo/auth/stringprep_spec.rb +188 -0
  268. data/spec/mongo/auth/user/view_spec.rb +5 -2
  269. data/spec/mongo/auth/user_spec.rb +1 -1
  270. data/spec/mongo/bulk_write/result_spec.rb +120 -0
  271. data/spec/mongo/bulk_write_spec.rb +42 -2
  272. data/spec/mongo/client_spec.rb +121 -9
  273. data/spec/mongo/cluster/app_metadata_spec.rb +14 -1
  274. data/spec/mongo/cluster/topology_spec.rb +1 -23
  275. data/spec/mongo/collection/view/change_stream_spec.rb +62 -180
  276. data/spec/mongo/collection_spec.rb +45 -12
  277. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -7
  278. data/spec/mongo/cursor_spec.rb +2 -2
  279. data/spec/mongo/database_spec.rb +3 -3
  280. data/spec/mongo/docs_examples_spec.rb +194 -0
  281. data/spec/mongo/error/operation_failure_spec.rb +152 -0
  282. data/spec/mongo/error/parser_spec.rb +127 -0
  283. data/spec/mongo/grid/fs_bucket_spec.rb +32 -0
  284. data/spec/mongo/grid/stream/write_spec.rb +40 -1
  285. data/spec/mongo/monitoring/event/command_failed_spec.rb +30 -0
  286. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -4
  287. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +29 -7
  288. data/spec/mongo/monitoring_spec.rb +28 -3
  289. data/spec/mongo/protocol/get_more_spec.rb +2 -2
  290. data/spec/mongo/retryable_spec.rb +252 -34
  291. data/spec/mongo/retryable_writes_spec.rb +468 -544
  292. data/spec/mongo/server/connection_spec.rb +5 -5
  293. data/spec/mongo/server/description_spec.rb +23 -6
  294. data/spec/mongo/session/server_session_spec.rb +2 -2
  295. data/spec/mongo/session/session_pool_spec.rb +2 -2
  296. data/spec/mongo/transactions_examples_spec.rb +227 -0
  297. data/spec/mongo/transactions_spec.rb +44 -0
  298. data/spec/spec_helper.rb +135 -49
  299. data/spec/spec_tests/change_streams_spec.rb +42 -0
  300. data/spec/{mongo → spec_tests}/command_monitoring_spec.rb +8 -2
  301. data/spec/{mongo → spec_tests}/connection_string_spec.rb +1 -1
  302. data/spec/{mongo → spec_tests}/crud_spec.rb +5 -7
  303. data/spec/{mongo → spec_tests}/dns_seedlist_discovery_spec.rb +1 -1
  304. data/spec/{mongo → spec_tests}/gridfs_spec.rb +0 -0
  305. data/spec/{mongo → spec_tests}/max_staleness_spec.rb +0 -0
  306. data/spec/spec_tests/retryable_writes_spec.rb +78 -0
  307. data/spec/{mongo → spec_tests}/sdam_monitoring_spec.rb +4 -3
  308. data/spec/{mongo → spec_tests}/sdam_spec.rb +7 -7
  309. data/spec/{mongo → spec_tests}/server_selection_rtt_spec.rb +0 -0
  310. data/spec/{mongo → spec_tests}/server_selection_spec.rb +0 -0
  311. data/spec/support/authorization.rb +18 -6
  312. data/spec/support/change_streams.rb +265 -0
  313. data/spec/support/change_streams/operation.rb +62 -0
  314. data/spec/support/change_streams_tests/change-streams-errors.yml +53 -0
  315. data/spec/support/change_streams_tests/change-streams.yml +299 -0
  316. data/spec/support/command_monitoring.rb +1 -1
  317. data/spec/support/command_monitoring/bulkWrite.yml +4 -28
  318. data/spec/support/command_monitoring/command.yml +19 -0
  319. data/spec/support/command_monitoring/find.yml +17 -19
  320. data/spec/support/command_monitoring/insertMany.yml +2 -8
  321. data/spec/support/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
  322. data/spec/support/connection_string.rb +1 -1
  323. data/spec/support/constraints.rb +56 -0
  324. data/spec/support/crud.rb +9 -4
  325. data/spec/support/crud/read.rb +24 -3
  326. data/spec/support/crud/write.rb +7 -2
  327. data/spec/support/crud_tests/read/count-collation.yml +12 -2
  328. data/spec/support/crud_tests/read/count.yml +43 -5
  329. data/spec/support/gridfs.rb +1 -1
  330. data/spec/support/primary_socket.rb +21 -0
  331. data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +90 -0
  332. data/spec/support/retryable_writes_tests/bulkWrite.yml +99 -1
  333. data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +50 -0
  334. data/spec/support/retryable_writes_tests/deleteOne.yml +10 -1
  335. data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +50 -0
  336. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +39 -30
  337. data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +54 -0
  338. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +9 -0
  339. data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +54 -0
  340. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +9 -0
  341. data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +59 -0
  342. data/spec/support/retryable_writes_tests/insertMany.yml +11 -6
  343. data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +471 -0
  344. data/spec/support/retryable_writes_tests/insertOne.yml +9 -0
  345. data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +58 -0
  346. data/spec/support/retryable_writes_tests/replaceOne.yml +9 -0
  347. data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +58 -0
  348. data/spec/support/retryable_writes_tests/updateOne.yml +71 -53
  349. data/spec/support/sdam/rs/normalize_case_me.yml +100 -0
  350. data/spec/support/sdam/sharded/compatible.yml +38 -0
  351. data/spec/support/sdam/sharded/mongos_disconnect.yml +9 -3
  352. data/spec/support/sdam/sharded/multiple_mongoses.yml +6 -2
  353. data/spec/support/sdam/sharded/non_mongos_removed.yml +6 -2
  354. data/spec/support/sdam/sharded/too_new.yml +36 -0
  355. data/spec/support/sdam/sharded/too_old.yml +36 -0
  356. data/spec/support/sdam/single/compatible.yml +26 -0
  357. data/spec/support/sdam/single/direct_connection_external_ip.yml +3 -1
  358. data/spec/support/sdam/single/direct_connection_mongos.yml +3 -1
  359. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +3 -1
  360. data/spec/support/sdam/single/direct_connection_rsprimary.yml +3 -1
  361. data/spec/support/sdam/single/direct_connection_rssecondary.yml +3 -1
  362. data/spec/support/sdam/single/direct_connection_slave.yml +3 -1
  363. data/spec/support/sdam/single/direct_connection_standalone.yml +3 -1
  364. data/spec/support/sdam/single/not_ok_response.yml +6 -2
  365. data/spec/support/sdam/single/standalone_removed.yml +3 -1
  366. data/spec/support/sdam/single/too_new.yml +26 -0
  367. data/spec/support/sdam/single/too_old.yml +24 -0
  368. data/spec/support/shared/session.rb +107 -0
  369. data/spec/support/transactions.rb +391 -0
  370. data/spec/support/transactions/operation.rb +373 -0
  371. data/spec/support/transactions_tests/abort.yml +403 -0
  372. data/spec/support/transactions_tests/bulk.yml +267 -0
  373. data/spec/support/transactions_tests/causal-consistency.yml +173 -0
  374. data/spec/support/transactions_tests/commit.yml +593 -0
  375. data/spec/support/transactions_tests/delete.yml +184 -0
  376. data/spec/support/transactions_tests/error-labels.yml +948 -0
  377. data/spec/support/transactions_tests/errors.yml +125 -0
  378. data/spec/support/transactions_tests/findOneAndDelete.yml +126 -0
  379. data/spec/support/transactions_tests/findOneAndReplace.yml +140 -0
  380. data/spec/support/transactions_tests/findOneAndUpdate.yml +228 -0
  381. data/spec/support/transactions_tests/insert.yml +264 -0
  382. data/spec/support/transactions_tests/isolation.yml +125 -0
  383. data/spec/support/transactions_tests/read-pref.yml +340 -0
  384. data/spec/support/transactions_tests/reads.yml +298 -0
  385. data/spec/support/transactions_tests/retryable-abort.yml +1292 -0
  386. data/spec/support/transactions_tests/retryable-commit.yml +1332 -0
  387. data/spec/support/transactions_tests/retryable-writes.yml +208 -0
  388. data/spec/support/transactions_tests/run-command.yml +189 -0
  389. data/spec/support/transactions_tests/transaction-options.yml +877 -0
  390. data/spec/support/transactions_tests/update.yml +246 -0
  391. data/spec/support/transactions_tests/write-concern.yml +236 -0
  392. metadata +494 -359
  393. metadata.gz.sig +0 -0
  394. data/lib/csasl/csasl.bundle +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 13c197c0761d6af2fd32db77e0f9a91ae09175a4
4
- data.tar.gz: 8c8c26637cfc0f51acfea88906da79376096d773
2
+ SHA256:
3
+ metadata.gz: 8c5dc91c26dc7d6d0a6c9f50e39c6d7b53130d08e75611d9f2a81162ed5a53e2
4
+ data.tar.gz: ceb6c12c3e4a7e5b9552fa8501b8faa6835ce110a6f32e6df8e8c65f53599b76
5
5
  SHA512:
6
- metadata.gz: 28f70edfe9d4c61a513b488f89ccf380f0148fe7f7c655ffb65202d6e0f03844a9e07c13919362656014593a21240398bbe24ed12744732b0cded6d8aa50bdcb
7
- data.tar.gz: 8a60151b258110900492b62ef55c0f39df7dea2c143a8d437210adb91181f58212ddc1ca4c3c84d08a90cdf4981c12f4de8c2f18be13d1ea2cdf7d03dec029e2
6
+ metadata.gz: 94c8eeb0c0afa60bd77ad0fc8139bfa818e9b3d1ac1d7e1656d92cf91e50d0481d3e9bb275bd3f5143b540036e5acc314e573e79c5891ad85003b05eadfc695e
7
+ data.tar.gz: 94e7a7f089b67ec901c8182f96d9a020ba67143b5e0823d3c39f0fa7dfa8cc7e0132a40df65a64c2c308b2d255316dbac4e20180b70bbeaa5680b3ef55e6f70e
Binary file
data.tar.gz.sig CHANGED
Binary file
data/LICENSE CHANGED
@@ -175,7 +175,7 @@
175
175
 
176
176
  END OF TERMS AND CONDITIONS
177
177
 
178
- Copyright (C) 2009-2017 MongoDB, Inc.
178
+ Copyright (C) 2009-2018 MongoDB, Inc.
179
179
 
180
180
  Licensed under the Apache License, Version 2.0 (the "License");
181
181
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -5,7 +5,8 @@ The officially supported Ruby driver for [MongoDB](http://www.mongodb.org).
5
5
  Documentation
6
6
  -----
7
7
 
8
- Documentation is located [here](http://docs.mongodb.org/ecosystem/drivers/ruby/).
8
+ High level documentation and usage examples are located
9
+ [here](http://docs.mongodb.org/ecosystem/drivers/ruby/).
9
10
 
10
11
  API docs can be found [here](http://api.mongodb.org/ruby/).
11
12
 
@@ -65,7 +66,7 @@ Full release notes and release history are available [here](https://github.com/m
65
66
  License
66
67
  -----
67
68
 
68
- Copyright (C) 2009-2017 MongoDB, Inc.
69
+ Copyright (C) 2009-2018 MongoDB, Inc.
69
70
 
70
71
  Licensed under the Apache License, Version 2.0 (the "License");
71
72
  you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -27,11 +27,11 @@ require 'mongo/event'
27
27
  require 'mongo/address'
28
28
  require 'mongo/auth'
29
29
  require 'mongo/protocol'
30
- require 'mongo/client'
31
30
  require 'mongo/cluster'
32
31
  require 'mongo/cursor'
33
32
  require 'mongo/collection'
34
33
  require 'mongo/database'
34
+ require 'mongo/client' # Purposely out-of-order so that database is loaded first
35
35
  require 'mongo/dbref'
36
36
  require 'mongo/grid'
37
37
  require 'mongo/index'
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -159,7 +159,15 @@ module Mongo
159
159
  #
160
160
  # @since 2.0.0
161
161
  def to_s
162
- port ? "#{host}:#{port}" : host
162
+ if port
163
+ if host.include?(':')
164
+ "[#{host}]:#{port}"
165
+ else
166
+ "#{host}:#{port}"
167
+ end
168
+ else
169
+ host
170
+ end
163
171
  end
164
172
 
165
173
  # Connect a socket.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'ipaddr'
16
+
15
17
  module Mongo
16
18
  class Address
17
19
 
@@ -38,7 +40,7 @@ module Mongo
38
40
  # Parse an IPv6 address into its host and port.
39
41
  #
40
42
  # @example Parse the address.
41
- # IPv4.parse("[::1]:28011")
43
+ # IPv6.parse("[::1]:28011")
42
44
  #
43
45
  # @param [ String ] address The address to parse.
44
46
  #
@@ -46,9 +48,28 @@ module Mongo
46
48
  #
47
49
  # @since 2.0.0
48
50
  def self.parse(address)
49
- parts = address.match(/\[(.+)\]:?(.+)?/)
50
- host = parts[1]
51
- port = (parts[2] || 27017).to_i
51
+ # IPAddr's parser handles IP address only, not port.
52
+ # Therefore we need to handle the port ourselves
53
+ if address =~ /[\[\]]/
54
+ parts = address.match(/\A\[(.+)\](?::(\d+))?\z/)
55
+ if parts.nil?
56
+ raise ArgumentError, "Invalid IPv6 address: #{address}"
57
+ end
58
+ host = parts[1]
59
+ port = (parts[2] || 27017).to_i
60
+ else
61
+ host = address
62
+ port = 27017
63
+ end
64
+ # Validate host.
65
+ # This will raise IPAddr::InvalidAddressError
66
+ # on newer rubies which is a subclass of ArgumentError
67
+ # if host is invalid
68
+ begin
69
+ IPAddr.new(host)
70
+ rescue ArgumentError
71
+ raise ArgumentError, "Invalid IPv6 address: #{address}"
72
+ end
52
73
  [ host, port ]
53
74
  end
54
75
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ require 'mongo/auth/scram'
18
18
  require 'mongo/auth/user'
19
19
  require 'mongo/auth/x509'
20
20
  require 'mongo/auth/roles'
21
+ require 'mongo/auth/stringprep'
21
22
 
22
23
  module Mongo
23
24
 
@@ -49,7 +50,8 @@ module Mongo
49
50
  mongodb_cr: CR,
50
51
  mongodb_x509: X509,
51
52
  plain: LDAP,
52
- scram: SCRAM
53
+ scram: SCRAM,
54
+ scram256: SCRAM,
53
55
  }
54
56
 
55
57
  # Get the authorization strategy for the provided auth mechanism.
@@ -65,7 +67,12 @@ module Mongo
65
67
  def get(user)
66
68
  mechanism = user.mechanism
67
69
  raise InvalidMechanism.new(mechanism) if !SOURCES.has_key?(mechanism)
68
- SOURCES[mechanism].new(user)
70
+ case SOURCES[mechanism]
71
+ when SCRAM
72
+ SOURCES[mechanism].new(user, mechanism)
73
+ else
74
+ SOURCES[mechanism].new(user)
75
+ end
69
76
  end
70
77
 
71
78
  # Raised when trying to get an invalid authorization mechanism.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,6 +20,9 @@ module Mongo
20
20
  # Defines behaviour for MongoDB-CR authentication.
21
21
  #
22
22
  # @since 2.0.0
23
+ # @deprecated MONGODB-CR authentication mechanism is deprecated
24
+ # as of MongoDB 3.6. Support for it in the Ruby driver will be
25
+ # removed in driver version 3.0. Please use SCRAM instead.
23
26
  class CR
24
27
 
25
28
  # The authentication mechinism string.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,6 +20,9 @@ module Mongo
20
20
  # client and server.
21
21
  #
22
22
  # @since 2.0.0
23
+ # @deprecated MONGODB-CR authentication mechanism is deprecated
24
+ # as of MongoDB 3.6. Support for it in the Ruby driver will be
25
+ # removed in driver version 3.0. Please use SCRAM instead.
23
26
  class Conversation
24
27
 
25
28
  # The login message base.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -17,15 +17,29 @@ require 'mongo/auth/scram/conversation'
17
17
  module Mongo
18
18
  module Auth
19
19
 
20
- # Defines behaviour for SCRAM-SHA1 authentication.
20
+ # Defines behaviour for SCRAM authentication.
21
21
  #
22
22
  # @since 2.0.0
23
23
  class SCRAM
24
24
 
25
- # The authentication mechinism string.
25
+ # The authentication mechanism string for SCRAM-SHA-1.
26
26
  #
27
- # @since 2.0.0
28
- MECHANISM = 'SCRAM-SHA-1'.freeze
27
+ # @since 2.6.0
28
+ SCRAM_SHA_1_MECHANISM = 'SCRAM-SHA-1'.freeze
29
+
30
+ # The authentication mechanism string for SCRAM-SHA-256.
31
+ #
32
+ # @since 2.6.0
33
+ SCRAM_SHA_256_MECHANISM = 'SCRAM-SHA-256'.freeze
34
+
35
+
36
+ # Map the user-specified authentication mechanism to the proper names of the mechanisms.
37
+ #
38
+ # @since 2.6.0
39
+ MECHANISMS = {
40
+ scram: SCRAM_SHA_1_MECHANISM,
41
+ scram256: SCRAM_SHA_256_MECHANISM
42
+ }.freeze
29
43
 
30
44
  # @return [ Mongo::Auth::User ] The user to authenticate.
31
45
  attr_reader :user
@@ -49,12 +63,15 @@ module Mongo
49
63
  #
50
64
  # @param [ Mongo::Connection ] connection The connection to log into.
51
65
  # on.
66
+ # @param [ String ] mechanism The auth mechanism to use (either 'SCRAM-SHA-1' or
67
+ # 'SCRAM-SHA-256');
52
68
  #
53
69
  # @return [ Protocol::Message ] The authentication response.
54
70
  #
55
71
  # @since 2.0.0
56
- def login(connection)
57
- conversation = Conversation.new(user)
72
+ def login(connection, mechanism = nil)
73
+ mechanism ||= user.mechanism || :scram
74
+ conversation = Conversation.new(user, MECHANISMS[mechanism])
58
75
  reply = connection.dispatch([ conversation.start(connection) ])
59
76
  connection.update_cluster_time(Operation::Result.new(reply))
60
77
  reply = connection.dispatch([ conversation.continue(reply, connection) ])
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014 MongoDB Inc.
1
+ # Copyright (C) 2014-2018 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -40,11 +40,6 @@ module Mongo
40
40
  # @since 2.0.0
41
41
  CLIENT_KEY = 'Client Key'.freeze
42
42
 
43
- # The digest to use for encryption.
44
- #
45
- # @since 2.0.0
46
- DIGEST = OpenSSL::Digest::SHA1.new.freeze
47
-
48
43
  # The key for the done field in the responses.
49
44
  #
50
45
  # @since 2.0.0
@@ -60,6 +55,13 @@ module Mongo
60
55
  # @since 2.0.0
61
56
  ITERATIONS = /i=(\d+)/.freeze
62
57
 
58
+ # The minimum iteration count for SCRAM-SHA-256.
59
+ #
60
+ # @api private
61
+ #
62
+ # @since 2.6.0
63
+ MIN_ITER_COUNT = 4096
64
+
63
65
  # The payload field.
64
66
  #
65
67
  # @since 2.0.0
@@ -178,7 +180,7 @@ module Mongo
178
180
  # @since 2.0.0
179
181
  def start(connection = nil)
180
182
  if connection && connection.features.op_msg_enabled?
181
- selector = CLIENT_FIRST_MESSAGE.merge(payload: client_first_message, mechanism: SCRAM::MECHANISM)
183
+ selector = CLIENT_FIRST_MESSAGE.merge(payload: client_first_message, mechanism: @mechanism)
182
184
  selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
183
185
  cluster_time = connection.mongos? && connection.cluster_time
184
186
  selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
@@ -187,7 +189,7 @@ module Mongo
187
189
  Protocol::Query.new(
188
190
  user.auth_source,
189
191
  Database::COMMAND,
190
- CLIENT_FIRST_MESSAGE.merge(payload: client_first_message, mechanism: SCRAM::MECHANISM),
192
+ CLIENT_FIRST_MESSAGE.merge(payload: client_first_message, mechanism: @mechanism),
191
193
  limit: -1
192
194
  )
193
195
  end
@@ -208,15 +210,16 @@ module Mongo
208
210
  # Create the new conversation.
209
211
  #
210
212
  # @example Create the new conversation.
211
- # Conversation.new(user)
213
+ # Conversation.new(user, mechanism)
212
214
  #
213
215
  # @param [ Auth::User ] user The user to converse about.
214
216
  #
215
217
  # @since 2.0.0
216
- def initialize(user)
218
+ def initialize(user, mechanism)
217
219
  @user = user
218
220
  @nonce = SecureRandom.base64
219
221
  @client_key = user.send(:client_key)
222
+ @mechanism = mechanism
220
223
  end
221
224
 
222
225
  private
@@ -339,12 +342,23 @@ module Mongo
339
342
  #
340
343
  # @since 2.0.0
341
344
  def hi(data)
342
- OpenSSL::PKCS5.pbkdf2_hmac_sha1(
343
- data,
344
- Base64.strict_decode64(salt),
345
- iterations,
346
- digest.size
347
- )
345
+ case @mechanism
346
+ when SCRAM::SCRAM_SHA_256_MECHANISM
347
+ OpenSSL::PKCS5.pbkdf2_hmac(
348
+ data,
349
+ Base64.strict_decode64(salt),
350
+ iterations,
351
+ digest.size,
352
+ digest
353
+ )
354
+ else
355
+ OpenSSL::PKCS5.pbkdf2_hmac_sha1(
356
+ data,
357
+ Base64.strict_decode64(salt),
358
+ iterations,
359
+ digest.size
360
+ )
361
+ end
348
362
  end
349
363
 
350
364
  # HMAC algorithm implementation.
@@ -364,7 +378,12 @@ module Mongo
364
378
  #
365
379
  # @since 2.0.0
366
380
  def iterations
367
- @iterations ||= payload_data.match(ITERATIONS)[1].to_i
381
+ @iterations ||= payload_data.match(ITERATIONS)[1].to_i.tap do |i|
382
+ if i < MIN_ITER_COUNT
383
+ raise Error::InsufficientIterationCount.new(
384
+ Error::InsufficientIterationCount.message(MIN_ITER_COUNT, 1))
385
+ end
386
+ end
368
387
  end
369
388
 
370
389
  # Get the data from the returned payload.
@@ -402,7 +421,7 @@ module Mongo
402
421
  #
403
422
  # @since 2.0.0
404
423
  def salted_password
405
- @salted_password ||= hi(user.hashed_password)
424
+ @salted_password ||= hi(hashed_password)
406
425
  end
407
426
 
408
427
  # Server key algorithm implementation.
@@ -492,8 +511,22 @@ module Mongo
492
511
 
493
512
  private
494
513
 
514
+ def hashed_password
515
+ case @mechanism
516
+ when SCRAM::SCRAM_SHA_256_MECHANISM
517
+ user.sasl_prepped_hashed_password
518
+ else
519
+ user.hashed_password
520
+ end
521
+ end
522
+
495
523
  def digest
496
- @digest ||= OpenSSL::Digest::SHA1.new.freeze
524
+ @digest ||= case @mechanism
525
+ when SCRAM::SCRAM_SHA_256_MECHANISM
526
+ OpenSSL::Digest::SHA256.new.freeze
527
+ else
528
+ OpenSSL::Digest::SHA1.new.freeze
529
+ end
497
530
  end
498
531
  end
499
532
  end