mongo 2.23.0 → 2.24.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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +230 -275
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +148 -183
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation.rb +5 -10
  71. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  72. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  73. data/lib/mongo/collection/view/builder.rb +0 -1
  74. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  75. data/lib/mongo/collection/view/change_stream.rb +59 -58
  76. data/lib/mongo/collection/view/explainable.rb +11 -20
  77. data/lib/mongo/collection/view/immutable.rb +1 -3
  78. data/lib/mongo/collection/view/iterable.rb +35 -28
  79. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  80. data/lib/mongo/collection/view/readable.rb +50 -57
  81. data/lib/mongo/collection/view/writable.rb +56 -72
  82. data/lib/mongo/collection/view.rb +9 -8
  83. data/lib/mongo/collection.rb +63 -76
  84. data/lib/mongo/condition_variable.rb +4 -4
  85. data/lib/mongo/config/options.rb +0 -3
  86. data/lib/mongo/config/validators/option.rb +3 -5
  87. data/lib/mongo/config.rb +2 -4
  88. data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
  89. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  90. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  91. data/lib/mongo/crypt/binary.rb +5 -9
  92. data/lib/mongo/crypt/binding.rb +149 -155
  93. data/lib/mongo/crypt/context.rb +10 -17
  94. data/lib/mongo/crypt/data_key_context.rb +2 -7
  95. data/lib/mongo/crypt/encryption_io.rb +29 -39
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
  97. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  99. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  100. data/lib/mongo/crypt/handle.rb +42 -48
  101. data/lib/mongo/crypt/hooks.rb +12 -15
  102. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  103. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  104. data/lib/mongo/crypt/kms/aws.rb +0 -2
  105. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  106. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  107. data/lib/mongo/crypt/kms/azure.rb +0 -1
  108. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  109. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  110. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  111. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  112. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  113. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  114. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  115. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  116. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  117. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  118. data/lib/mongo/crypt/kms/local.rb +0 -1
  119. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  120. data/lib/mongo/crypt/kms.rb +14 -16
  121. data/lib/mongo/crypt/kms_context.rb +0 -2
  122. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  123. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  124. data/lib/mongo/crypt/status.rb +12 -14
  125. data/lib/mongo/crypt.rb +0 -1
  126. data/lib/mongo/csot_timeout_holder.rb +3 -2
  127. data/lib/mongo/cursor/kill_spec.rb +7 -10
  128. data/lib/mongo/cursor.rb +74 -64
  129. data/lib/mongo/cursor_host.rb +8 -10
  130. data/lib/mongo/database/view.rb +16 -37
  131. data/lib/mongo/database.rb +52 -56
  132. data/lib/mongo/dbref.rb +0 -1
  133. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  134. data/lib/mongo/error/auth_error.rb +0 -2
  135. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  136. data/lib/mongo/error/bulk_write_error.rb +7 -10
  137. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  138. data/lib/mongo/error/client_closed.rb +0 -2
  139. data/lib/mongo/error/closed_stream.rb +1 -4
  140. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  141. data/lib/mongo/error/connection_perished.rb +0 -2
  142. data/lib/mongo/error/connection_unavailable.rb +0 -2
  143. data/lib/mongo/error/credential_check_error.rb +0 -2
  144. data/lib/mongo/error/crypt_error.rb +0 -2
  145. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  146. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  147. data/lib/mongo/error/file_not_found.rb +0 -3
  148. data/lib/mongo/error/handshake_error.rb +0 -2
  149. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  150. data/lib/mongo/error/internal_driver_error.rb +0 -2
  151. data/lib/mongo/error/invalid_address.rb +0 -2
  152. data/lib/mongo/error/invalid_application_name.rb +0 -3
  153. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  154. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  155. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  156. data/lib/mongo/error/invalid_config_option.rb +0 -3
  157. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  158. data/lib/mongo/error/invalid_database_name.rb +1 -4
  159. data/lib/mongo/error/invalid_document.rb +1 -4
  160. data/lib/mongo/error/invalid_file.rb +0 -3
  161. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  162. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  163. data/lib/mongo/error/invalid_nonce.rb +0 -3
  164. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  165. data/lib/mongo/error/invalid_read_option.rb +0 -3
  166. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  167. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  168. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  169. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  170. data/lib/mongo/error/invalid_session.rb +1 -4
  171. data/lib/mongo/error/invalid_signature.rb +0 -3
  172. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  173. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  174. data/lib/mongo/error/invalid_update_document.rb +2 -5
  175. data/lib/mongo/error/invalid_uri.rb +1 -4
  176. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  177. data/lib/mongo/error/kms_error.rb +0 -2
  178. data/lib/mongo/error/labelable.rb +0 -3
  179. data/lib/mongo/error/lint_error.rb +0 -2
  180. data/lib/mongo/error/max_bson_size.rb +8 -11
  181. data/lib/mongo/error/max_message_size.rb +2 -5
  182. data/lib/mongo/error/mismatched_domain.rb +0 -2
  183. data/lib/mongo/error/missing_connection.rb +0 -2
  184. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  185. data/lib/mongo/error/missing_password.rb +0 -2
  186. data/lib/mongo/error/missing_resume_token.rb +1 -4
  187. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  188. data/lib/mongo/error/missing_service_id.rb +0 -2
  189. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  190. data/lib/mongo/error/multi_index_drop.rb +0 -3
  191. data/lib/mongo/error/need_primary_server.rb +0 -2
  192. data/lib/mongo/error/no_server_available.rb +3 -8
  193. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  194. data/lib/mongo/error/no_srv_records.rb +0 -2
  195. data/lib/mongo/error/notable.rb +8 -16
  196. data/lib/mongo/error/operation_failure.rb +22 -35
  197. data/lib/mongo/error/parser.rb +33 -75
  198. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  199. data/lib/mongo/error/pool_closed_error.rb +0 -3
  200. data/lib/mongo/error/pool_error.rb +0 -3
  201. data/lib/mongo/error/pool_paused_error.rb +0 -2
  202. data/lib/mongo/error/raise_original_error.rb +1 -3
  203. data/lib/mongo/error/read_write_retryable.rb +14 -17
  204. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  205. data/lib/mongo/error/server_api_conflict.rb +0 -2
  206. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  207. data/lib/mongo/error/server_not_usable.rb +0 -2
  208. data/lib/mongo/error/session_ended.rb +1 -3
  209. data/lib/mongo/error/session_not_materialized.rb +1 -3
  210. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  211. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  212. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  213. data/lib/mongo/error/socket_error.rb +0 -2
  214. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  215. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  216. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  217. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  218. data/lib/mongo/error/unexpected_response.rb +1 -4
  219. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  220. data/lib/mongo/error/unmet_dependency.rb +0 -2
  221. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  222. data/lib/mongo/error/unsupported_collation.rb +3 -24
  223. data/lib/mongo/error/unsupported_features.rb +0 -2
  224. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  225. data/lib/mongo/error/unsupported_option.rb +19 -21
  226. data/lib/mongo/error/write_retryable.rb +0 -2
  227. data/lib/mongo/error.rb +10 -24
  228. data/lib/mongo/event/base.rb +0 -2
  229. data/lib/mongo/event/listeners.rb +0 -3
  230. data/lib/mongo/event/publisher.rb +0 -3
  231. data/lib/mongo/event/subscriber.rb +0 -4
  232. data/lib/mongo/event.rb +4 -6
  233. data/lib/mongo/grid/file/chunk.rb +7 -10
  234. data/lib/mongo/grid/file/info.rb +20 -24
  235. data/lib/mongo/grid/file.rb +7 -8
  236. data/lib/mongo/grid/fs_bucket.rb +40 -48
  237. data/lib/mongo/grid/stream/read.rb +25 -35
  238. data/lib/mongo/grid/stream/write.rb +17 -22
  239. data/lib/mongo/grid/stream.rb +2 -4
  240. data/lib/mongo/grid.rb +0 -1
  241. data/lib/mongo/id.rb +0 -1
  242. data/lib/mongo/index/view.rb +49 -48
  243. data/lib/mongo/index.rb +7 -10
  244. data/lib/mongo/lint.rb +31 -37
  245. data/lib/mongo/loggable.rb +5 -8
  246. data/lib/mongo/logger.rb +1 -7
  247. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  248. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  249. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  250. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  251. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  252. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  254. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  256. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  258. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  260. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  262. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  263. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  264. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  265. data/lib/mongo/monitoring/event/secure.rb +15 -20
  266. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  267. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  268. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  269. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  270. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  271. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  272. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  273. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  275. data/lib/mongo/monitoring/event.rb +0 -1
  276. data/lib/mongo/monitoring/publishable.rb +20 -30
  277. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  278. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  279. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  282. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  284. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  285. data/lib/mongo/monitoring.rb +38 -39
  286. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  287. data/lib/mongo/operation/aggregate/result.rb +3 -6
  288. data/lib/mongo/operation/aggregate.rb +0 -2
  289. data/lib/mongo/operation/collections_info/result.rb +0 -3
  290. data/lib/mongo/operation/collections_info.rb +0 -2
  291. data/lib/mongo/operation/command/op_msg.rb +1 -4
  292. data/lib/mongo/operation/command.rb +0 -2
  293. data/lib/mongo/operation/context.rb +13 -16
  294. data/lib/mongo/operation/count/op_msg.rb +2 -4
  295. data/lib/mongo/operation/count.rb +0 -2
  296. data/lib/mongo/operation/create/op_msg.rb +2 -5
  297. data/lib/mongo/operation/create.rb +0 -2
  298. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  299. data/lib/mongo/operation/create_index.rb +0 -2
  300. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  301. data/lib/mongo/operation/create_user.rb +0 -2
  302. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  303. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  304. data/lib/mongo/operation/delete/result.rb +0 -3
  305. data/lib/mongo/operation/delete.rb +1 -5
  306. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  307. data/lib/mongo/operation/distinct.rb +0 -2
  308. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  309. data/lib/mongo/operation/drop.rb +0 -2
  310. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop_database.rb +0 -2
  312. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  313. data/lib/mongo/operation/drop_index.rb +0 -2
  314. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  315. data/lib/mongo/operation/explain/result.rb +0 -3
  316. data/lib/mongo/operation/explain.rb +0 -2
  317. data/lib/mongo/operation/find/builder/command.rb +4 -12
  318. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  319. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  320. data/lib/mongo/operation/find/builder.rb +0 -1
  321. data/lib/mongo/operation/find/op_msg.rb +4 -12
  322. data/lib/mongo/operation/find/result.rb +0 -3
  323. data/lib/mongo/operation/find.rb +0 -2
  324. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  325. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  326. data/lib/mongo/operation/get_more/result.rb +0 -3
  327. data/lib/mongo/operation/get_more.rb +0 -2
  328. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  329. data/lib/mongo/operation/indexes/result.rb +1 -5
  330. data/lib/mongo/operation/indexes.rb +0 -2
  331. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  332. data/lib/mongo/operation/insert/op_msg.rb +2 -4
  333. data/lib/mongo/operation/insert/result.rb +0 -3
  334. data/lib/mongo/operation/insert.rb +2 -5
  335. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  336. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  337. data/lib/mongo/operation/kill_cursors.rb +0 -2
  338. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  339. data/lib/mongo/operation/list_collections/result.rb +1 -4
  340. data/lib/mongo/operation/list_collections.rb +0 -2
  341. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  342. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  343. data/lib/mongo/operation/map_reduce.rb +0 -2
  344. data/lib/mongo/operation/op_msg_base.rb +0 -1
  345. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  346. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  347. data/lib/mongo/operation/parallel_scan.rb +0 -2
  348. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  349. data/lib/mongo/operation/remove_user.rb +0 -2
  350. data/lib/mongo/operation/result.rb +38 -48
  351. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  352. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  353. data/lib/mongo/operation/shared/executable.rb +19 -28
  354. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  355. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  356. data/lib/mongo/operation/shared/idable.rb +3 -6
  357. data/lib/mongo/operation/shared/limited.rb +0 -3
  358. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  359. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  360. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  361. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  362. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  363. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  364. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  365. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  366. data/lib/mongo/operation/shared/specifiable.rb +32 -58
  367. data/lib/mongo/operation/shared/write.rb +12 -17
  368. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  369. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  370. data/lib/mongo/operation/update/op_msg.rb +2 -5
  371. data/lib/mongo/operation/update/result.rb +5 -5
  372. data/lib/mongo/operation/update.rb +1 -5
  373. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  374. data/lib/mongo/operation/update_user.rb +0 -2
  375. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  376. data/lib/mongo/operation/users_info/result.rb +1 -4
  377. data/lib/mongo/operation/users_info.rb +0 -2
  378. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  379. data/lib/mongo/operation/write_command.rb +0 -2
  380. data/lib/mongo/operation.rb +9 -14
  381. data/lib/mongo/options/mapper.rb +8 -15
  382. data/lib/mongo/options/redacted.rb +7 -9
  383. data/lib/mongo/options.rb +0 -1
  384. data/lib/mongo/protocol/bit_vector.rb +3 -5
  385. data/lib/mongo/protocol/caching_hash.rb +2 -7
  386. data/lib/mongo/protocol/compressed.rb +5 -10
  387. data/lib/mongo/protocol/get_more.rb +2 -8
  388. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  389. data/lib/mongo/protocol/message.rb +103 -105
  390. data/lib/mongo/protocol/msg.rb +48 -63
  391. data/lib/mongo/protocol/query.rb +32 -41
  392. data/lib/mongo/protocol/registry.rb +2 -5
  393. data/lib/mongo/protocol/reply.rb +10 -16
  394. data/lib/mongo/protocol/serializers.rb +41 -59
  395. data/lib/mongo/protocol.rb +0 -1
  396. data/lib/mongo/query_cache.rb +7 -15
  397. data/lib/mongo/retryable/backpressure.rb +31 -0
  398. data/lib/mongo/retryable/base_worker.rb +39 -13
  399. data/lib/mongo/retryable/read_worker.rb +77 -21
  400. data/lib/mongo/retryable/retry_policy.rb +59 -0
  401. data/lib/mongo/retryable/write_worker.rb +155 -56
  402. data/lib/mongo/retryable.rb +70 -9
  403. data/lib/mongo/search_index/view.rb +1 -1
  404. data/lib/mongo/semaphore.rb +0 -1
  405. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  406. data/lib/mongo/server/app_metadata.rb +4 -5
  407. data/lib/mongo/server/connection.rb +61 -61
  408. data/lib/mongo/server/connection_base.rb +43 -53
  409. data/lib/mongo/server/connection_common.rb +41 -64
  410. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  411. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  412. data/lib/mongo/server/connection_pool.rb +195 -167
  413. data/lib/mongo/server/description/features.rb +23 -60
  414. data/lib/mongo/server/description/load_balancer.rb +0 -2
  415. data/lib/mongo/server/description.rb +117 -138
  416. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  417. data/lib/mongo/server/monitor/connection.rb +28 -35
  418. data/lib/mongo/server/monitor.rb +65 -60
  419. data/lib/mongo/server/pending_connection.rb +70 -71
  420. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  421. data/lib/mongo/server/push_monitor.rb +21 -29
  422. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  423. data/lib/mongo/server.rb +60 -93
  424. data/lib/mongo/server_selector/base.rb +133 -157
  425. data/lib/mongo/server_selector/nearest.rb +2 -5
  426. data/lib/mongo/server_selector/primary.rb +1 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  428. data/lib/mongo/server_selector/secondary.rb +2 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  430. data/lib/mongo/server_selector.rb +3 -4
  431. data/lib/mongo/session/server_session.rb +6 -7
  432. data/lib/mongo/session/session_pool.rb +20 -34
  433. data/lib/mongo/session.rb +287 -188
  434. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  435. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  436. data/lib/mongo/socket/ssl.rb +44 -43
  437. data/lib/mongo/socket/tcp.rb +5 -8
  438. data/lib/mongo/socket/unix.rb +0 -4
  439. data/lib/mongo/socket.rb +80 -102
  440. data/lib/mongo/srv/monitor.rb +6 -11
  441. data/lib/mongo/srv/resolver.rb +15 -24
  442. data/lib/mongo/srv/result.rb +18 -24
  443. data/lib/mongo/srv.rb +0 -1
  444. data/lib/mongo/timeout.rb +4 -11
  445. data/lib/mongo/topology_version.rb +8 -13
  446. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +1 -1
  447. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
  448. data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
  449. data/lib/mongo/uri/options_mapper.rb +135 -126
  450. data/lib/mongo/uri/srv_protocol.rb +25 -38
  451. data/lib/mongo/uri.rb +95 -139
  452. data/lib/mongo/utils.rb +5 -12
  453. data/lib/mongo/version.rb +1 -1
  454. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  455. data/lib/mongo/write_concern/base.rb +6 -6
  456. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  457. data/lib/mongo/write_concern.rb +14 -15
  458. data/lib/mongo.rb +1 -3
  459. data/mongo.gemspec +17 -17
  460. metadata +5 -5
  461. data/lib/mongo/error/server_api_not_supported.rb +0 -27
  462. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  463. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -18,13 +17,11 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class Gssapi
21
-
22
- # Defines behaviour around a single Kerberos conversation between the
20
+ # Defines behavior around a single Kerberos conversation between the
23
21
  # client and the server.
24
22
  #
25
23
  # @api private
26
24
  class Conversation < SaslConversationBase
27
-
28
25
  # The base client first message.
29
26
  START_MESSAGE = { saslStart: 1, autoAuthorize: 1 }.freeze
30
27
 
@@ -44,14 +41,12 @@ module Mongo
44
41
  def initialize(user, connection, **opts)
45
42
  super
46
43
  host = connection.address.host
47
- unless defined?(Mongo::GssapiNative)
48
- require 'mongo_kerberos'
49
- end
44
+ require 'mongo_kerberos' unless defined?(Mongo::GssapiNative)
50
45
  @authenticator = Mongo::GssapiNative::Authenticator.new(
51
46
  user.name,
52
47
  host,
53
48
  user.auth_mech_properties[:service_name] || 'mongodb',
54
- user.auth_mech_properties[:canonicalize_host_name] || false,
49
+ user.auth_mech_properties[:canonicalize_host_name] || false
55
50
  )
56
51
  end
57
52
 
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB, Inc.
5
4
  #
@@ -17,16 +16,14 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines behavior for Kerberos authentication.
22
20
  #
23
21
  # @api private
24
22
  class Gssapi < Base
25
-
26
23
  # The authentication mechanism string.
27
24
  #
28
25
  # @since 2.0.0
29
- MECHANISM = 'GSSAPI'.freeze
26
+ MECHANISM = 'GSSAPI'
30
27
 
31
28
  # Log the user in on the current connection.
32
29
  #
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -18,14 +17,12 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class LDAP
21
-
22
20
  # Defines behavior around a single PLAIN conversation between the
23
21
  # client and server.
24
22
  #
25
23
  # @since 2.0.0
26
24
  # @api private
27
25
  class Conversation < ConversationBase
28
-
29
26
  # The login message.
30
27
  #
31
28
  # @since 2.0.0
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,17 +16,15 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines behavior for LDAP Proxy authentication.
22
20
  #
23
21
  # @since 2.0.0
24
22
  # @api private
25
23
  class LDAP < Base
26
-
27
24
  # The authentication mechanism string.
28
25
  #
29
26
  # @since 2.0.0
30
- MECHANISM = 'PLAIN'.freeze
27
+ MECHANISM = 'PLAIN'
31
28
 
32
29
  # Log the user in on the current connection.
33
30
  #
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,91 +16,89 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Provides constants for the built in roles provided by MongoDB.
22
20
  #
23
21
  # @since 2.0.0
24
22
  module Roles
25
-
26
23
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#backup
27
24
  #
28
25
  # @since 2.0.0
29
- BACKUP = 'backup'.freeze
26
+ BACKUP = 'backup'
30
27
 
31
28
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterAdmin
32
29
  #
33
30
  # @since 2.0.0
34
- CLUSTER_ADMIN = 'clusterAdmin'.freeze
31
+ CLUSTER_ADMIN = 'clusterAdmin'
35
32
 
36
33
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterManager
37
34
  #
38
35
  # @since 2.0.0
39
- CLUSTER_MANAGER = 'clusterManager'.freeze
36
+ CLUSTER_MANAGER = 'clusterManager'
40
37
 
41
38
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterMonitor
42
39
  #
43
40
  # @since 2.0.0
44
- CLUSTER_MONITOR = 'clusterMonitor'.freeze
41
+ CLUSTER_MONITOR = 'clusterMonitor'
45
42
 
46
43
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbAdmin
47
44
  #
48
45
  # @since 2.0.0
49
- DATABASE_ADMIN = 'dbAdmin'.freeze
46
+ DATABASE_ADMIN = 'dbAdmin'
50
47
 
51
48
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbAdminAnyDatabase
52
49
  #
53
50
  # @since 2.0.0
54
- DATABASE_ADMIN_ANY_DATABASE = 'dbAdminAnyDatabase'.freeze
51
+ DATABASE_ADMIN_ANY_DATABASE = 'dbAdminAnyDatabase'
55
52
 
56
53
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbOwner
57
54
  #
58
55
  # @since 2.0.0
59
- DATABASE_OWNER = 'dbOwner'.freeze
56
+ DATABASE_OWNER = 'dbOwner'
60
57
 
61
58
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#hostManager
62
59
  #
63
60
  # @since 2.0.0
64
- HOST_MANAGER = 'hostManager'.freeze
61
+ HOST_MANAGER = 'hostManager'
65
62
 
66
63
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#read
67
64
  #
68
65
  # @since 2.0.0
69
- READ = 'read'.freeze
66
+ READ = 'read'
70
67
 
71
68
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readAnyDatabase
72
69
  #
73
70
  # @since 2.0.0
74
- READ_ANY_DATABASE = 'readAnyDatabase'.freeze
71
+ READ_ANY_DATABASE = 'readAnyDatabase'
75
72
 
76
73
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readWriteAnyDatabase
77
74
  #
78
75
  # @since 2.0.0
79
- READ_WRITE_ANY_DATABASE = 'readWriteAnyDatabase'.freeze
76
+ READ_WRITE_ANY_DATABASE = 'readWriteAnyDatabase'
80
77
 
81
78
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readWrite
82
79
  #
83
80
  # @since 2.0.0
84
- READ_WRITE = 'readWrite'.freeze
81
+ READ_WRITE = 'readWrite'
85
82
 
86
83
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#restore
87
84
  #
88
85
  # @since 2.0.0
89
- RESTORE = 'restore'.freeze
86
+ RESTORE = 'restore'
90
87
 
91
88
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#root
92
89
  #
93
90
  # @since 2.0.0
94
- ROOT = 'root'.freeze
91
+ ROOT = 'root'
95
92
 
96
93
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#userAdmin
97
94
  #
98
95
  # @since 2.0.0
99
- USER_ADMIN = 'userAdmin'.freeze
96
+ USER_ADMIN = 'userAdmin'
100
97
 
101
98
  # @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#userAdminAnyDatabase
102
99
  #
103
100
  # @since 2.0.0
104
- USER_ADMIN_ANY_DATABASE = 'userAdminAnyDatabase'.freeze
101
+ USER_ADMIN_ANY_DATABASE = 'userAdminAnyDatabase'
105
102
  end
106
103
  end
107
104
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,13 +16,11 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines common behavior around SASL conversations between
22
20
  # the client and the server.
23
21
  #
24
22
  # @api private
25
23
  class SaslConversationBase < ConversationBase
26
-
27
24
  # The base client first message.
28
25
  CLIENT_FIRST_MESSAGE = { saslStart: 1, autoAuthorize: 1 }.freeze
29
26
 
@@ -66,14 +63,13 @@ module Mongo
66
63
 
67
64
  def client_first_document
68
65
  payload = client_first_payload
69
- if Lint.enabled?
70
- unless payload.is_a?(String)
71
- raise Error::LintError, "Payload must be a string but is a #{payload.class}: #{payload}"
72
- end
66
+ if Lint.enabled? && !payload.is_a?(String)
67
+ raise Error::LintError, "Payload must be a string but is a #{payload.class}: #{payload}"
73
68
  end
69
+
74
70
  doc = CLIENT_FIRST_MESSAGE.merge(
75
71
  mechanism: auth_mechanism_name,
76
- payload: BSON::Binary.new(payload),
72
+ payload: BSON::Binary.new(payload)
77
73
  )
78
74
  if options = client_first_message_options
79
75
  # Short SCRAM conversation,
@@ -93,9 +89,9 @@ module Mongo
93
89
  raise ArgumentError, 'Cannot validate server nonce when client nonce is nil or empty'
94
90
  end
95
91
 
96
- unless server_nonce.start_with?(client_nonce)
97
- raise Error::InvalidNonce.new(client_nonce, server_nonce)
98
- end
92
+ return if server_nonce.start_with?(client_nonce)
93
+
94
+ raise Error::InvalidNonce.new(client_nonce, server_nonce)
99
95
  end
100
96
  end
101
97
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -18,13 +17,11 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class Scram
21
-
22
20
  # Defines behavior around a single SCRAM-SHA-1 conversation between
23
21
  # the client and server.
24
22
  #
25
23
  # @api private
26
24
  class Conversation < ScramConversationBase
27
-
28
25
  private
29
26
 
30
27
  # HI algorithm implementation.
@@ -39,7 +36,7 @@ module Mongo
39
36
  data,
40
37
  salt,
41
38
  iterations,
42
- digest.size,
39
+ digest.size
43
40
  )
44
41
  end
45
42
 
@@ -57,7 +54,7 @@ module Mongo
57
54
  end
58
55
 
59
56
  def digest
60
- @digest ||= OpenSSL::Digest::SHA1.new.freeze
57
+ @digest ||= OpenSSL::Digest.new('SHA1').freeze
61
58
  end
62
59
  end
63
60
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -17,14 +16,12 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines behavior for SCRAM authentication.
22
20
  #
23
21
  # @api private
24
22
  class Scram < Base
25
-
26
23
  # The authentication mechanism string.
27
- MECHANISM = 'SCRAM-SHA-1'.freeze
24
+ MECHANISM = 'SCRAM-SHA-1'
28
25
 
29
26
  # Initializes the Scram authenticator.
30
27
  #
@@ -53,7 +50,8 @@ module Mongo
53
50
 
54
51
  def conversation
55
52
  @conversation ||= self.class.const_get(:Conversation).new(
56
- user, connection, client_nonce: speculative_auth_client_nonce)
53
+ user, connection, client_nonce: speculative_auth_client_nonce
54
+ )
57
55
  end
58
56
 
59
57
  # Log the user in on the current connection.
@@ -61,11 +59,8 @@ module Mongo
61
59
  # @return [ BSON::Document ] The document of the authentication response.
62
60
  def login
63
61
  converse_multi_step(connection, conversation,
64
- speculative_auth_result: speculative_auth_result,
65
- ).tap do
66
- unless conversation.server_verified?
67
- raise Error::MissingScramServerSignature
68
- end
62
+ speculative_auth_result: speculative_auth_result).tap do
63
+ raise Error::MissingScramServerSignature unless conversation.server_verified?
69
64
  end
70
65
  end
71
66
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -18,13 +17,11 @@
18
17
  module Mongo
19
18
  module Auth
20
19
  class Scram256
21
-
22
20
  # Defines behavior around a single SCRAM-SHA-256 conversation between
23
21
  # the client and server.
24
22
  #
25
23
  # @api private
26
24
  class Conversation < ScramConversationBase
27
-
28
25
  private
29
26
 
30
27
  # HI algorithm implementation.
@@ -40,7 +37,7 @@ module Mongo
40
37
  salt,
41
38
  iterations,
42
39
  digest.size,
43
- digest,
40
+ digest
44
41
  )
45
42
  end
46
43
 
@@ -58,7 +55,7 @@ module Mongo
58
55
  end
59
56
 
60
57
  def digest
61
- @digest ||= OpenSSL::Digest::SHA256.new.freeze
58
+ @digest ||= OpenSSL::Digest.new('SHA256').freeze
62
59
  end
63
60
  end
64
61
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines behavior for SCRAM-SHA-256 authentication.
22
20
  #
23
21
  # The purpose of this class is to provide the namespace for the
@@ -26,7 +24,7 @@ module Mongo
26
24
  # @api private
27
25
  class Scram256 < Scram
28
26
  # The authentication mechanism string.
29
- MECHANISM = 'SCRAM-SHA-256'.freeze
27
+ MECHANISM = 'SCRAM-SHA-256'
30
28
  end
31
29
  end
32
30
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,13 +16,11 @@
17
16
 
18
17
  module Mongo
19
18
  module Auth
20
-
21
19
  # Defines common behavior around authentication conversations between
22
20
  # the client and the server.
23
21
  #
24
22
  # @api private
25
23
  class ScramConversationBase < SaslConversationBase
26
-
27
24
  # The minimum iteration count for SCRAM-SHA-1 and SCRAM-SHA-256.
28
25
  MIN_ITER_COUNT = 4096
29
26
 
@@ -55,7 +52,7 @@ module Mongo
55
52
  #
56
53
  # @see https://jira.mongodb.org/browse/SECURITY-621
57
54
  #
58
- # @return [ true | fase ] Whether the server's signature was verified.
55
+ # @return [ true | false ] Whether the server's signature was verified.
59
56
  def server_verified?
60
57
  !!@server_verified
61
58
  end
@@ -79,7 +76,8 @@ module Mongo
79
76
  @iterations = parsed_data.fetch('i').to_i.tap do |i|
80
77
  if i < MIN_ITER_COUNT
81
78
  raise Error::InsufficientIterationCount.new(
82
- Error::InsufficientIterationCount.message(MIN_ITER_COUNT, i))
79
+ Error::InsufficientIterationCount.message(MIN_ITER_COUNT, i)
80
+ )
83
81
  end
84
82
  end
85
83
  @auth_message = "#{first_bare},#{payload_data},#{without_proof}"
@@ -88,7 +86,7 @@ module Mongo
88
86
 
89
87
  selector = CLIENT_CONTINUE_MESSAGE.merge(
90
88
  payload: client_final_message,
91
- conversationId: id,
89
+ conversationId: id
92
90
  )
93
91
  build_message(connection, user.auth_source, selector)
94
92
  end
@@ -111,7 +109,7 @@ module Mongo
111
109
  def finalize(connection)
112
110
  selector = CLIENT_CONTINUE_MESSAGE.merge(
113
111
  payload: client_empty_message,
114
- conversationId: id,
112
+ conversationId: id
115
113
  )
116
114
  build_message(connection, user.auth_source, selector)
117
115
  end
@@ -138,15 +136,14 @@ module Mongo
138
136
  def parse_payload(payload)
139
137
  Hash[payload.split(',').reject { |v| v == '' }.map do |pair|
140
138
  k, v, = pair.split('=', 2)
141
- if k == ''
142
- raise Error::InvalidServerAuthResponse, 'Payload malformed: missing key'
143
- end
144
- [k, v]
139
+ raise Error::InvalidServerAuthResponse, 'Payload malformed: missing key' if k == ''
140
+
141
+ [ k, v ]
145
142
  end]
146
143
  end
147
144
 
148
145
  def client_first_message_options
149
- {skipEmptyExchange: true}
146
+ { skipEmptyExchange: true }
150
147
  end
151
148
 
152
149
  # @see http://tools.ietf.org/html/rfc5802#section-3
@@ -192,8 +189,8 @@ module Mongo
192
189
  # @since 2.0.0
193
190
  def client_final
194
191
  @client_final ||= client_proof(client_key,
195
- client_signature(stored_key(client_key),
196
- auth_message))
192
+ client_signature(stored_key(client_key),
193
+ auth_message))
197
194
  end
198
195
 
199
196
  # Looks for field 'v' in payload data, if it is present verifies the
@@ -203,13 +200,10 @@ module Mongo
203
200
  # This method can be called from different conversation steps
204
201
  # depending on whether the short SCRAM conversation is used.
205
202
  def check_server_signature(payload_data)
206
- if verifier = payload_data['v']
207
- if compare_digest(verifier, server_signature)
208
- @server_verified = true
209
- else
210
- raise Error::InvalidSignature.new(verifier, server_signature)
211
- end
212
- end
203
+ return unless verifier = payload_data['v']
204
+ raise Error::InvalidSignature.new(verifier, server_signature) unless compare_digest(verifier, server_signature)
205
+
206
+ @server_verified = true
213
207
  end
214
208
 
215
209
  # Client key algorithm implementation.
@@ -310,7 +304,7 @@ module Mongo
310
304
 
311
305
  # @api private
312
306
  def cache_key(*extra)
313
- [user.password, salt, iterations, @mechanism] + extra
307
+ [ user.password, salt, iterations, @mechanism ] + extra
314
308
  end
315
309
 
316
310
  # Server key algorithm implementation.
@@ -365,12 +359,12 @@ module Mongo
365
359
  #
366
360
  # @since 2.0.0
367
361
  def xor(first, second)
368
- first.bytes.zip(second.bytes).map{ |(a,b)| (a ^ b).chr }.join('')
362
+ first.bytes.zip(second.bytes).map { |(a, b)| (a ^ b).chr }.join('')
369
363
  end
370
364
 
371
365
  def compare_digest(a, b)
372
366
  check = a.bytesize ^ b.bytesize
373
- a.bytes.zip(b.bytes){ |x, y| check |= x ^ y.to_i }
367
+ a.bytes.zip(b.bytes) { |x, y| check |= x ^ y.to_i }
374
368
  check == 0
375
369
  end
376
370
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2018-2020 MongoDB Inc.
5
4
  #
@@ -27,23 +26,23 @@ module Mongo
27
26
  # @api private
28
27
  module SASL
29
28
  MAP_NON_ASCII_TO_SPACE = {
30
- 0x00A0 => [0x0020],
31
- 0x1680 => [0x0020],
32
- 0x2000 => [0x0020],
33
- 0x2001 => [0x0020],
34
- 0x2002 => [0x0020],
35
- 0x2003 => [0x0020],
36
- 0x2004 => [0x0020],
37
- 0x2005 => [0x0020],
38
- 0x2006 => [0x0020],
39
- 0x2007 => [0x0020],
40
- 0x2008 => [0x0020],
41
- 0x2009 => [0x0020],
42
- 0x200A => [0x0020],
43
- 0x200B => [0x0020],
44
- 0x202F => [0x0020],
45
- 0x205F => [0x0020],
46
- 0x3000 => [0x0020],
29
+ 0x00A0 => [ 0x0020 ],
30
+ 0x1680 => [ 0x0020 ],
31
+ 0x2000 => [ 0x0020 ],
32
+ 0x2001 => [ 0x0020 ],
33
+ 0x2002 => [ 0x0020 ],
34
+ 0x2003 => [ 0x0020 ],
35
+ 0x2004 => [ 0x0020 ],
36
+ 0x2005 => [ 0x0020 ],
37
+ 0x2006 => [ 0x0020 ],
38
+ 0x2007 => [ 0x0020 ],
39
+ 0x2008 => [ 0x0020 ],
40
+ 0x2009 => [ 0x0020 ],
41
+ 0x200A => [ 0x0020 ],
42
+ 0x200B => [ 0x0020 ],
43
+ 0x202F => [ 0x0020 ],
44
+ 0x205F => [ 0x0020 ],
45
+ 0x3000 => [ 0x0020 ],
47
46
  }.freeze
48
47
 
49
48
  # The mappings to use for SASL string preparation.