onlinepayments-sdk-ruby 4.22.0 → 5.0.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 (413) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -0
  3. data/LICENSE.txt +0 -0
  4. data/README.md +5 -6
  5. data/Rakefile +0 -0
  6. data/lib/onlinepayments/sdk/api_exception.rb +47 -35
  7. data/lib/onlinepayments/sdk/api_resource.rb +49 -97
  8. data/lib/onlinepayments/sdk/authentication/authenticator.rb +19 -0
  9. data/lib/onlinepayments/sdk/authentication/authorization_type.rb +15 -0
  10. data/lib/onlinepayments/sdk/authentication/v1hmac_authenticator.rb +109 -0
  11. data/lib/onlinepayments/sdk/authentication.rb +1 -0
  12. data/lib/onlinepayments/sdk/authorization_exception.rb +14 -8
  13. data/lib/onlinepayments/sdk/call_context.rb +30 -21
  14. data/lib/onlinepayments/sdk/client.rb +36 -18
  15. data/lib/onlinepayments/sdk/communication/communication_exception.rb +19 -0
  16. data/lib/onlinepayments/sdk/communication/connection.rb +48 -0
  17. data/lib/onlinepayments/sdk/communication/default_connection.rb +427 -0
  18. data/lib/onlinepayments/sdk/communication/metadata_provider.rb +160 -0
  19. data/lib/onlinepayments/sdk/communication/multipart_form_data_object.rb +52 -0
  20. data/lib/onlinepayments/sdk/communication/multipart_form_data_request.rb +13 -0
  21. data/lib/onlinepayments/sdk/communication/not_found_exception.rb +19 -0
  22. data/lib/onlinepayments/sdk/communication/param_request.rb +14 -0
  23. data/lib/onlinepayments/sdk/communication/pooled_connection.rb +26 -0
  24. data/lib/onlinepayments/sdk/communication/request_header.rb +62 -0
  25. data/lib/onlinepayments/sdk/communication/request_param.rb +28 -0
  26. data/lib/onlinepayments/sdk/communication/response_exception.rb +56 -0
  27. data/lib/onlinepayments/sdk/communication/response_header.rb +78 -0
  28. data/lib/onlinepayments/sdk/communication.rb +1 -0
  29. data/lib/onlinepayments/sdk/communicator.rb +475 -268
  30. data/lib/onlinepayments/sdk/communicator_configuration.rb +162 -53
  31. data/lib/onlinepayments/sdk/declined_payment_exception.rb +28 -21
  32. data/lib/onlinepayments/sdk/declined_payout_exception.rb +28 -23
  33. data/lib/onlinepayments/sdk/declined_refund_exception.rb +28 -23
  34. data/lib/onlinepayments/sdk/declined_transaction_exception.rb +16 -10
  35. data/lib/onlinepayments/sdk/domain/account_on_file.rb +44 -35
  36. data/lib/onlinepayments/sdk/domain/account_on_file_attribute.rb +42 -28
  37. data/lib/onlinepayments/sdk/domain/account_on_file_display_hints.rb +29 -24
  38. data/lib/onlinepayments/sdk/domain/acquirer_information.rb +27 -22
  39. data/lib/onlinepayments/sdk/domain/acquirer_selection_information.rb +34 -24
  40. data/lib/onlinepayments/sdk/domain/additional_order_input.rb +43 -38
  41. data/lib/onlinepayments/sdk/domain/address.rb +65 -43
  42. data/lib/onlinepayments/sdk/domain/address_personal.rb +78 -48
  43. data/lib/onlinepayments/sdk/domain/airline_data.rb +204 -123
  44. data/lib/onlinepayments/sdk/domain/airline_flight_leg.rb +158 -95
  45. data/lib/onlinepayments/sdk/domain/airline_passenger.rb +59 -39
  46. data/lib/onlinepayments/sdk/domain/amount_breakdown.rb +27 -20
  47. data/lib/onlinepayments/sdk/domain/amount_of_money.rb +27 -20
  48. data/lib/onlinepayments/sdk/domain/api_error.rb +73 -47
  49. data/lib/onlinepayments/sdk/domain/apple_pay_line_item.rb +72 -0
  50. data/lib/onlinepayments/sdk/domain/apple_pay_recurring_payment_request.rb +61 -0
  51. data/lib/onlinepayments/sdk/domain/bank_account_iban.rb +20 -16
  52. data/lib/onlinepayments/sdk/domain/browser_data.rb +51 -35
  53. data/lib/onlinepayments/sdk/domain/calculate_surcharge_request.rb +27 -24
  54. data/lib/onlinepayments/sdk/domain/calculate_surcharge_response.rb +22 -20
  55. data/lib/onlinepayments/sdk/domain/cancel_payment_request.rb +27 -22
  56. data/lib/onlinepayments/sdk/domain/cancel_payment_response.rb +20 -18
  57. data/lib/onlinepayments/sdk/domain/capture.rb +41 -32
  58. data/lib/onlinepayments/sdk/domain/capture_output.rb +106 -78
  59. data/lib/onlinepayments/sdk/domain/capture_payment_request.rb +43 -26
  60. data/lib/onlinepayments/sdk/domain/capture_response.rb +41 -32
  61. data/lib/onlinepayments/sdk/domain/capture_status_output.rb +20 -16
  62. data/lib/onlinepayments/sdk/domain/captures_response.rb +22 -20
  63. data/lib/onlinepayments/sdk/domain/card.rb +41 -28
  64. data/lib/onlinepayments/sdk/domain/card_essentials.rb +41 -32
  65. data/lib/onlinepayments/sdk/domain/card_fraud_results.rb +34 -24
  66. data/lib/onlinepayments/sdk/domain/card_info.rb +27 -20
  67. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input.rb +199 -136
  68. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input_base.rb +149 -104
  69. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input_for_hosted_checkout.rb +36 -28
  70. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_output.rb +133 -108
  71. data/lib/onlinepayments/sdk/domain/card_payout_method_specific_input.rb +41 -30
  72. data/lib/onlinepayments/sdk/domain/card_recurrence_details.rb +20 -16
  73. data/lib/onlinepayments/sdk/domain/card_source.rb +41 -30
  74. data/lib/onlinepayments/sdk/domain/card_without_cvv.rb +34 -24
  75. data/lib/onlinepayments/sdk/domain/company_information.rb +20 -16
  76. data/lib/onlinepayments/sdk/domain/complete_payment_card_payment_method_specific_input.rb +20 -18
  77. data/lib/onlinepayments/sdk/domain/complete_payment_request.rb +27 -24
  78. data/lib/onlinepayments/sdk/domain/complete_payment_response.rb +35 -31
  79. data/lib/onlinepayments/sdk/domain/contact_details.rb +51 -35
  80. data/lib/onlinepayments/sdk/domain/create_hosted_checkout_request.rb +76 -67
  81. data/lib/onlinepayments/sdk/domain/create_hosted_checkout_response.rb +60 -43
  82. data/lib/onlinepayments/sdk/domain/create_hosted_tokenization_request.rb +57 -50
  83. data/lib/onlinepayments/sdk/domain/create_hosted_tokenization_response.rb +57 -44
  84. data/lib/onlinepayments/sdk/domain/create_mandate_request.rb +71 -48
  85. data/lib/onlinepayments/sdk/domain/create_mandate_response.rb +27 -24
  86. data/lib/onlinepayments/sdk/domain/create_mandate_with_return_url.rb +71 -48
  87. data/lib/onlinepayments/sdk/domain/create_payment_link_request.rb +120 -87
  88. data/lib/onlinepayments/sdk/domain/create_payment_request.rb +82 -72
  89. data/lib/onlinepayments/sdk/domain/create_payment_response.rb +35 -31
  90. data/lib/onlinepayments/sdk/domain/create_payout_request.rb +61 -40
  91. data/lib/onlinepayments/sdk/domain/create_token_request.rb +27 -22
  92. data/lib/onlinepayments/sdk/domain/created_payment_output.rb +27 -22
  93. data/lib/onlinepayments/sdk/domain/created_token_response.rb +50 -38
  94. data/lib/onlinepayments/sdk/domain/credit_card_specific_input_hosted_tokenization.rb +29 -26
  95. data/lib/onlinepayments/sdk/domain/credit_card_validation_rules_hosted_tokenization.rb +27 -20
  96. data/lib/onlinepayments/sdk/domain/currency_conversion.rb +27 -22
  97. data/lib/onlinepayments/sdk/domain/currency_conversion_input.rb +27 -20
  98. data/lib/onlinepayments/sdk/domain/currency_conversion_request.rb +27 -24
  99. data/lib/onlinepayments/sdk/domain/currency_conversion_response.rb +34 -28
  100. data/lib/onlinepayments/sdk/domain/currency_conversion_result.rb +27 -20
  101. data/lib/onlinepayments/sdk/domain/currency_conversion_specific_input.rb +20 -16
  102. data/lib/onlinepayments/sdk/domain/customer.rb +87 -68
  103. data/lib/onlinepayments/sdk/domain/customer_account.rb +77 -55
  104. data/lib/onlinepayments/sdk/domain/customer_account_authentication.rb +34 -20
  105. data/lib/onlinepayments/sdk/domain/customer_bank_account.rb +34 -24
  106. data/lib/onlinepayments/sdk/domain/customer_device.rb +64 -44
  107. data/lib/onlinepayments/sdk/domain/customer_device_output.rb +20 -16
  108. data/lib/onlinepayments/sdk/domain/customer_output.rb +20 -18
  109. data/lib/onlinepayments/sdk/domain/customer_payment_activity.rb +34 -24
  110. data/lib/onlinepayments/sdk/domain/customer_token.rb +35 -31
  111. data/lib/onlinepayments/sdk/domain/data_object.rb +32 -0
  112. data/lib/onlinepayments/sdk/domain/dcc_card_source.rb +41 -30
  113. data/lib/onlinepayments/sdk/domain/dcc_proposal.rb +51 -41
  114. data/lib/onlinepayments/sdk/domain/decrypted_payment_data.rb +51 -35
  115. data/lib/onlinepayments/sdk/domain/directory_entry.rb +34 -24
  116. data/lib/onlinepayments/sdk/domain/discount.rb +20 -16
  117. data/lib/onlinepayments/sdk/domain/empty_validator.rb +7 -6
  118. data/lib/onlinepayments/sdk/domain/error_response.rb +29 -24
  119. data/lib/onlinepayments/sdk/domain/external_cardholder_authentication_data.rb +86 -55
  120. data/lib/onlinepayments/sdk/domain/external_token_linked.rb +35 -24
  121. data/lib/onlinepayments/sdk/domain/feedbacks.rb +30 -0
  122. data/lib/onlinepayments/sdk/domain/fixed_list_validator.rb +22 -20
  123. data/lib/onlinepayments/sdk/domain/fraud_fields.rb +37 -28
  124. data/lib/onlinepayments/sdk/domain/fraud_results.rb +20 -16
  125. data/lib/onlinepayments/sdk/domain/g_pay_three_d_secure.rb +50 -36
  126. data/lib/onlinepayments/sdk/domain/get_hosted_checkout_response.rb +27 -22
  127. data/lib/onlinepayments/sdk/domain/get_hosted_tokenization_response.rb +27 -22
  128. data/lib/onlinepayments/sdk/domain/get_iin_details_request.rb +27 -22
  129. data/lib/onlinepayments/sdk/domain/get_iin_details_response.rb +52 -38
  130. data/lib/onlinepayments/sdk/domain/get_mandate_response.rb +20 -18
  131. data/lib/onlinepayments/sdk/domain/get_payment_product_groups_response.rb +22 -20
  132. data/lib/onlinepayments/sdk/domain/get_payment_products_response.rb +22 -20
  133. data/lib/onlinepayments/sdk/domain/get_privacy_policy_response.rb +20 -16
  134. data/lib/onlinepayments/sdk/domain/gift_card_purchase.rb +27 -22
  135. data/lib/onlinepayments/sdk/domain/hosted_checkout_specific_input.rb +83 -56
  136. data/lib/onlinepayments/sdk/domain/hosted_checkout_specific_output.rb +27 -20
  137. data/lib/onlinepayments/sdk/domain/iin_detail.rb +34 -24
  138. data/lib/onlinepayments/sdk/domain/label_template_element.rb +27 -20
  139. data/lib/onlinepayments/sdk/domain/length_validator.rb +27 -20
  140. data/lib/onlinepayments/sdk/domain/line_item.rb +44 -31
  141. data/lib/onlinepayments/sdk/domain/line_item_invoice_data.rb +20 -16
  142. data/lib/onlinepayments/sdk/domain/loan_recipient.rb +51 -35
  143. data/lib/onlinepayments/sdk/domain/lodging_data.rb +20 -16
  144. data/lib/onlinepayments/sdk/domain/mandate_address.rb +51 -35
  145. data/lib/onlinepayments/sdk/domain/mandate_address_response.rb +58 -0
  146. data/lib/onlinepayments/sdk/domain/mandate_contact_details.rb +20 -16
  147. data/lib/onlinepayments/sdk/domain/mandate_customer.rb +52 -44
  148. data/lib/onlinepayments/sdk/domain/mandate_customer_response.rb +66 -0
  149. data/lib/onlinepayments/sdk/domain/mandate_merchant_action.rb +27 -22
  150. data/lib/onlinepayments/sdk/domain/mandate_personal_information.rb +27 -22
  151. data/lib/onlinepayments/sdk/domain/mandate_personal_information_response.rb +39 -0
  152. data/lib/onlinepayments/sdk/domain/mandate_personal_name.rb +27 -20
  153. data/lib/onlinepayments/sdk/domain/mandate_personal_name_response.rb +37 -0
  154. data/lib/onlinepayments/sdk/domain/mandate_redirect_data.rb +27 -20
  155. data/lib/onlinepayments/sdk/domain/mandate_response.rb +66 -42
  156. data/lib/onlinepayments/sdk/domain/merchant_action.rb +43 -28
  157. data/lib/onlinepayments/sdk/domain/mobile_payment_data.rb +27 -20
  158. data/lib/onlinepayments/sdk/domain/mobile_payment_method_hosted_checkout_specific_input.rb +43 -26
  159. data/lib/onlinepayments/sdk/domain/mobile_payment_method_specific_input.rb +71 -50
  160. data/lib/onlinepayments/sdk/domain/mobile_payment_method_specific_output.rb +56 -51
  161. data/lib/onlinepayments/sdk/domain/mobile_payment_product302_specific_input.rb +32 -0
  162. data/lib/onlinepayments/sdk/domain/mobile_payment_product320_specific_input.rb +20 -18
  163. data/lib/onlinepayments/sdk/domain/mobile_three_d_secure_challenge_parameters.rb +51 -0
  164. data/lib/onlinepayments/sdk/domain/multiple_payment_information.rb +37 -0
  165. data/lib/onlinepayments/sdk/domain/omnichannel_payout_specific_input.rb +20 -16
  166. data/lib/onlinepayments/sdk/domain/operation_output.rb +67 -45
  167. data/lib/onlinepayments/sdk/domain/operation_payment_references.rb +30 -0
  168. data/lib/onlinepayments/sdk/domain/order.rb +75 -66
  169. data/lib/onlinepayments/sdk/domain/order_line_details.rb +79 -47
  170. data/lib/onlinepayments/sdk/domain/order_references.rb +34 -24
  171. data/lib/onlinepayments/sdk/domain/order_status_output.rb +52 -38
  172. data/lib/onlinepayments/sdk/domain/order_type_information.rb +27 -20
  173. data/lib/onlinepayments/sdk/domain/other_details.rb +37 -0
  174. data/lib/onlinepayments/sdk/domain/payment_account_on_file.rb +27 -20
  175. data/lib/onlinepayments/sdk/domain/payment_context.rb +34 -26
  176. data/lib/onlinepayments/sdk/domain/payment_creation_output.rb +41 -28
  177. data/lib/onlinepayments/sdk/domain/payment_details_response.rb +60 -49
  178. data/lib/onlinepayments/sdk/domain/payment_error_response.rb +37 -31
  179. data/lib/onlinepayments/sdk/domain/payment_link_event.rb +34 -24
  180. data/lib/onlinepayments/sdk/domain/payment_link_order_input.rb +34 -28
  181. data/lib/onlinepayments/sdk/domain/payment_link_order_output.rb +34 -28
  182. data/lib/onlinepayments/sdk/domain/payment_link_response.rb +74 -51
  183. data/lib/onlinepayments/sdk/domain/payment_link_specific_input.rb +36 -24
  184. data/lib/onlinepayments/sdk/domain/payment_output.rb +115 -94
  185. data/lib/onlinepayments/sdk/domain/payment_product.rb +117 -85
  186. data/lib/onlinepayments/sdk/domain/payment_product130_specific_input.rb +20 -18
  187. data/lib/onlinepayments/sdk/domain/payment_product130_specific_three_d_secure.rb +41 -28
  188. data/lib/onlinepayments/sdk/domain/payment_product3012.rb +27 -20
  189. data/lib/onlinepayments/sdk/domain/payment_product3012_specific_input.rb +41 -28
  190. data/lib/onlinepayments/sdk/domain/payment_product302_specific_data.rb +22 -20
  191. data/lib/onlinepayments/sdk/domain/payment_product3203_specific_output.rb +40 -0
  192. data/lib/onlinepayments/sdk/domain/payment_product3208_specific_input.rb +20 -16
  193. data/lib/onlinepayments/sdk/domain/payment_product3208_specific_output.rb +20 -16
  194. data/lib/onlinepayments/sdk/domain/payment_product3209_specific_input.rb +20 -16
  195. data/lib/onlinepayments/sdk/domain/payment_product3209_specific_output.rb +20 -16
  196. data/lib/onlinepayments/sdk/domain/payment_product320_specific_data.rb +29 -24
  197. data/lib/onlinepayments/sdk/domain/payment_product5001_specific_output.rb +48 -16
  198. data/lib/onlinepayments/sdk/domain/payment_product5100_specific_input.rb +20 -16
  199. data/lib/onlinepayments/sdk/domain/payment_product5402_specific_output.rb +20 -16
  200. data/lib/onlinepayments/sdk/domain/payment_product5404.rb +27 -20
  201. data/lib/onlinepayments/sdk/domain/payment_product5407.rb +27 -20
  202. data/lib/onlinepayments/sdk/domain/payment_product5500_specific_output.rb +41 -24
  203. data/lib/onlinepayments/sdk/domain/payment_product771_specific_output.rb +20 -16
  204. data/lib/onlinepayments/sdk/domain/payment_product840_customer_account.rb +72 -47
  205. data/lib/onlinepayments/sdk/domain/payment_product840_specific_output.rb +43 -38
  206. data/lib/onlinepayments/sdk/domain/payment_product_display_hints.rb +34 -24
  207. data/lib/onlinepayments/sdk/domain/payment_product_field.rb +41 -32
  208. data/lib/onlinepayments/sdk/domain/payment_product_field_data_restrictions.rb +27 -22
  209. data/lib/onlinepayments/sdk/domain/payment_product_field_display_element.rb +41 -28
  210. data/lib/onlinepayments/sdk/domain/payment_product_field_display_hints.rb +84 -56
  211. data/lib/onlinepayments/sdk/domain/payment_product_field_form_element.rb +30 -24
  212. data/lib/onlinepayments/sdk/domain/payment_product_field_tooltip.rb +28 -20
  213. data/lib/onlinepayments/sdk/domain/payment_product_field_validators.rb +83 -73
  214. data/lib/onlinepayments/sdk/domain/payment_product_filter.rb +32 -29
  215. data/lib/onlinepayments/sdk/domain/payment_product_filter_hosted_tokenization.rb +22 -20
  216. data/lib/onlinepayments/sdk/domain/payment_product_filters_hosted_checkout.rb +27 -24
  217. data/lib/onlinepayments/sdk/domain/payment_product_filters_hosted_tokenization.rb +27 -24
  218. data/lib/onlinepayments/sdk/domain/payment_product_group.rb +44 -37
  219. data/lib/onlinepayments/sdk/domain/payment_product_networks_response.rb +22 -20
  220. data/lib/onlinepayments/sdk/domain/payment_references.rb +27 -20
  221. data/lib/onlinepayments/sdk/domain/payment_response.rb +51 -41
  222. data/lib/onlinepayments/sdk/domain/payment_status_output.rb +66 -46
  223. data/lib/onlinepayments/sdk/domain/payout_error_response.rb +37 -31
  224. data/lib/onlinepayments/sdk/domain/payout_output.rb +27 -22
  225. data/lib/onlinepayments/sdk/domain/payout_response.rb +41 -32
  226. data/lib/onlinepayments/sdk/domain/payout_result.rb +41 -32
  227. data/lib/onlinepayments/sdk/domain/payout_status_output.rb +34 -24
  228. data/lib/onlinepayments/sdk/domain/personal_information.rb +34 -26
  229. data/lib/onlinepayments/sdk/domain/personal_information_token.rb +20 -18
  230. data/lib/onlinepayments/sdk/domain/personal_name.rb +34 -24
  231. data/lib/onlinepayments/sdk/domain/personal_name_token.rb +27 -20
  232. data/lib/onlinepayments/sdk/domain/product_directory.rb +22 -20
  233. data/lib/onlinepayments/sdk/domain/protection_eligibility.rb +27 -20
  234. data/lib/onlinepayments/sdk/domain/range_validator.rb +27 -20
  235. data/lib/onlinepayments/sdk/domain/rate_details.rb +51 -35
  236. data/lib/onlinepayments/sdk/domain/redirect_data.rb +27 -20
  237. data/lib/onlinepayments/sdk/domain/redirect_payment_method_specific_input.rb +140 -81
  238. data/lib/onlinepayments/sdk/domain/redirect_payment_method_specific_output.rb +96 -68
  239. data/lib/onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.rb +30 -0
  240. data/lib/onlinepayments/sdk/domain/redirect_payment_product3302_specific_input.rb +44 -0
  241. data/lib/onlinepayments/sdk/domain/redirect_payment_product3306_specific_input.rb +20 -16
  242. data/lib/onlinepayments/sdk/domain/redirect_payment_product5001_specific_input.rb +20 -16
  243. data/lib/onlinepayments/sdk/domain/redirect_payment_product5300_specific_input.rb +74 -0
  244. data/lib/onlinepayments/sdk/domain/redirect_payment_product5406_specific_input.rb +20 -18
  245. data/lib/onlinepayments/sdk/domain/redirect_payment_product5408_specific_input.rb +27 -22
  246. data/lib/onlinepayments/sdk/domain/redirect_payment_product5410_specific_input.rb +32 -0
  247. data/lib/onlinepayments/sdk/domain/redirect_payment_product809_specific_input.rb +20 -16
  248. data/lib/onlinepayments/sdk/domain/redirect_payment_product840_specific_input.rb +41 -20
  249. data/lib/onlinepayments/sdk/domain/redirection_data.rb +20 -16
  250. data/lib/onlinepayments/sdk/domain/refund_card_method_specific_output.rb +34 -26
  251. data/lib/onlinepayments/sdk/domain/refund_e_wallet_method_specific_output.rb +34 -26
  252. data/lib/onlinepayments/sdk/domain/refund_error_response.rb +37 -31
  253. data/lib/onlinepayments/sdk/domain/refund_mobile_method_specific_output.rb +34 -24
  254. data/lib/onlinepayments/sdk/domain/refund_output.rb +89 -64
  255. data/lib/onlinepayments/sdk/domain/refund_payment_product840_customer_account.rb +34 -24
  256. data/lib/onlinepayments/sdk/domain/refund_payment_product840_specific_output.rb +20 -18
  257. data/lib/onlinepayments/sdk/domain/refund_redirect_method_specific_output.rb +27 -20
  258. data/lib/onlinepayments/sdk/domain/refund_request.rb +43 -24
  259. data/lib/onlinepayments/sdk/domain/refund_response.rb +41 -32
  260. data/lib/onlinepayments/sdk/domain/refunds_response.rb +22 -20
  261. data/lib/onlinepayments/sdk/domain/regular_expression_validator.rb +20 -16
  262. data/lib/onlinepayments/sdk/domain/send_test_request.rb +30 -0
  263. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input.rb +27 -22
  264. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input_base.rb +27 -22
  265. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_output.rb +34 -28
  266. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input.rb +27 -22
  267. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input_base.rb +27 -22
  268. data/lib/onlinepayments/sdk/domain/session_request.rb +22 -20
  269. data/lib/onlinepayments/sdk/domain/session_response.rb +53 -39
  270. data/lib/onlinepayments/sdk/domain/shipping.rb +76 -52
  271. data/lib/onlinepayments/sdk/domain/shipping_method.rb +41 -28
  272. data/lib/onlinepayments/sdk/domain/shopping_cart.rb +62 -48
  273. data/lib/onlinepayments/sdk/domain/shopping_cart_extension.rb +51 -43
  274. data/lib/onlinepayments/sdk/domain/show_form_data.rb +35 -39
  275. data/lib/onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.rb +60 -35
  276. data/lib/onlinepayments/sdk/domain/subsequent_payment_product5001_specific_input.rb +20 -16
  277. data/lib/onlinepayments/sdk/domain/subsequent_payment_request.rb +35 -31
  278. data/lib/onlinepayments/sdk/domain/subsequent_payment_response.rb +20 -18
  279. data/lib/onlinepayments/sdk/domain/surcharge.rb +59 -48
  280. data/lib/onlinepayments/sdk/domain/surcharge_calculation_card.rb +27 -20
  281. data/lib/onlinepayments/sdk/domain/surcharge_for_payment_link.rb +20 -16
  282. data/lib/onlinepayments/sdk/domain/surcharge_rate.rb +41 -28
  283. data/lib/onlinepayments/sdk/domain/surcharge_specific_input.rb +27 -22
  284. data/lib/onlinepayments/sdk/domain/surcharge_specific_output.rb +34 -28
  285. data/lib/onlinepayments/sdk/domain/test_connection.rb +20 -16
  286. data/lib/onlinepayments/sdk/domain/three_d_secure.rb +98 -87
  287. data/lib/onlinepayments/sdk/domain/three_d_secure_base.rb +75 -69
  288. data/lib/onlinepayments/sdk/domain/three_d_secure_data.rb +34 -24
  289. data/lib/onlinepayments/sdk/domain/three_d_secure_results.rb +107 -67
  290. data/lib/onlinepayments/sdk/domain/token_card.rb +27 -22
  291. data/lib/onlinepayments/sdk/domain/token_card_data.rb +27 -18
  292. data/lib/onlinepayments/sdk/domain/token_card_specific_input.rb +20 -18
  293. data/lib/onlinepayments/sdk/domain/token_data.rb +27 -18
  294. data/lib/onlinepayments/sdk/domain/token_e_wallet.rb +28 -22
  295. data/lib/onlinepayments/sdk/domain/token_response.rb +58 -45
  296. data/lib/onlinepayments/sdk/domain/transaction.rb +20 -18
  297. data/lib/onlinepayments/sdk/domain/uploadable_file.rb +33 -0
  298. data/lib/onlinepayments/sdk/domain/validate_credentials_request.rb +37 -0
  299. data/lib/onlinepayments/sdk/domain/validate_credentials_response.rb +30 -0
  300. data/lib/onlinepayments/sdk/domain/value_mapping_element.rb +29 -24
  301. data/lib/onlinepayments/sdk/domain.rb +4 -0
  302. data/lib/onlinepayments/sdk/exception_factory.rb +76 -0
  303. data/lib/onlinepayments/sdk/factory.rb +163 -118
  304. data/lib/onlinepayments/sdk/idempotence_exception.rb +23 -19
  305. data/lib/onlinepayments/sdk/json/default_marshaller.rb +34 -0
  306. data/lib/onlinepayments/sdk/json/marshaller.rb +27 -0
  307. data/lib/onlinepayments/sdk/json/marshaller_syntax_exception.rb +9 -0
  308. data/lib/onlinepayments/sdk/json.rb +1 -0
  309. data/lib/onlinepayments/sdk/logging/communicator_logger.rb +18 -16
  310. data/lib/onlinepayments/sdk/logging/log_message_builder.rb +80 -47
  311. data/lib/onlinepayments/sdk/logging/logging_capable.rb +1 -1
  312. data/lib/onlinepayments/sdk/logging/obfuscation/body_obfuscator.rb +113 -0
  313. data/lib/onlinepayments/sdk/logging/obfuscation/header_obfuscator.rb +54 -0
  314. data/lib/onlinepayments/sdk/logging/obfuscation/obfuscation_capable.rb +21 -0
  315. data/lib/onlinepayments/sdk/logging/obfuscation/obfuscation_rule.rb +47 -0
  316. data/lib/onlinepayments/sdk/logging/obfuscation.rb +1 -0
  317. data/lib/onlinepayments/sdk/logging/request_log_message_builder.rb +40 -29
  318. data/lib/onlinepayments/sdk/logging/response_log_message_builder.rb +30 -23
  319. data/lib/onlinepayments/sdk/logging/ruby_communicator_logger.rb +49 -45
  320. data/lib/onlinepayments/sdk/logging/stdout_communicator_logger.rb +20 -23
  321. data/lib/onlinepayments/sdk/logging.rb +1 -10
  322. data/lib/onlinepayments/sdk/merchant/captures/captures_client.rb +57 -0
  323. data/lib/onlinepayments/sdk/merchant/captures.rb +4 -0
  324. data/lib/onlinepayments/sdk/merchant/complete/complete_client.rb +60 -0
  325. data/lib/onlinepayments/sdk/merchant/complete.rb +4 -0
  326. data/lib/onlinepayments/sdk/merchant/hostedcheckout/hosted_checkout_client.rb +72 -71
  327. data/lib/onlinepayments/sdk/merchant/hostedcheckout.rb +4 -0
  328. data/lib/onlinepayments/sdk/merchant/hostedtokenization/hosted_tokenization_client.rb +72 -71
  329. data/lib/onlinepayments/sdk/merchant/hostedtokenization.rb +4 -0
  330. data/lib/onlinepayments/sdk/merchant/mandates/mandates_client.rb +165 -164
  331. data/lib/onlinepayments/sdk/merchant/mandates.rb +4 -0
  332. data/lib/onlinepayments/sdk/merchant/merchant_client.rb +116 -64
  333. data/lib/onlinepayments/sdk/merchant/paymentlinks/payment_links_client.rb +102 -101
  334. data/lib/onlinepayments/sdk/merchant/paymentlinks.rb +4 -0
  335. data/lib/onlinepayments/sdk/merchant/payments/payments_client.rb +233 -332
  336. data/lib/onlinepayments/sdk/merchant/payments.rb +4 -0
  337. data/lib/onlinepayments/sdk/merchant/payouts/payouts_client.rb +73 -71
  338. data/lib/onlinepayments/sdk/merchant/payouts.rb +4 -0
  339. data/lib/onlinepayments/sdk/merchant/privacypolicy/get_privacy_policy_params.rb +32 -0
  340. data/lib/onlinepayments/sdk/merchant/privacypolicy/privacy_policy_client.rb +54 -0
  341. data/lib/onlinepayments/sdk/merchant/privacypolicy.rb +4 -0
  342. data/lib/onlinepayments/sdk/merchant/productgroups/get_product_group_params.rb +50 -47
  343. data/lib/onlinepayments/sdk/merchant/productgroups/get_product_groups_params.rb +50 -47
  344. data/lib/onlinepayments/sdk/merchant/productgroups/product_groups_client.rb +72 -72
  345. data/lib/onlinepayments/sdk/merchant/productgroups.rb +4 -0
  346. data/lib/onlinepayments/sdk/merchant/products/get_payment_product_networks_params.rb +27 -25
  347. data/lib/onlinepayments/sdk/merchant/products/get_payment_product_params.rb +50 -47
  348. data/lib/onlinepayments/sdk/merchant/products/get_payment_products_params.rb +50 -47
  349. data/lib/onlinepayments/sdk/merchant/products/get_product_directory_params.rb +21 -19
  350. data/lib/onlinepayments/sdk/merchant/products/products_client.rb +134 -136
  351. data/lib/onlinepayments/sdk/merchant/products.rb +4 -0
  352. data/lib/onlinepayments/sdk/merchant/refunds/refunds_client.rb +57 -0
  353. data/lib/onlinepayments/sdk/merchant/refunds.rb +4 -0
  354. data/lib/onlinepayments/sdk/merchant/services/services_client.rb +124 -155
  355. data/lib/onlinepayments/sdk/merchant/services.rb +4 -0
  356. data/lib/onlinepayments/sdk/merchant/sessions/sessions_client.rb +42 -41
  357. data/lib/onlinepayments/sdk/merchant/sessions.rb +4 -0
  358. data/lib/onlinepayments/sdk/merchant/tokens/tokens_client.rb +101 -100
  359. data/lib/onlinepayments/sdk/merchant/tokens.rb +4 -0
  360. data/lib/onlinepayments/sdk/merchant/webhooks/webhooks_client.rb +83 -0
  361. data/lib/onlinepayments/sdk/merchant/webhooks.rb +4 -0
  362. data/lib/onlinepayments/sdk/merchant.rb +4 -0
  363. data/lib/onlinepayments/sdk/platform_exception.rb +19 -0
  364. data/lib/onlinepayments/sdk/proxy_configuration.rb +60 -60
  365. data/lib/onlinepayments/sdk/reference_exception.rb +14 -9
  366. data/lib/onlinepayments/sdk/validation_exception.rb +14 -9
  367. data/lib/onlinepayments/sdk/webhooks/api_version_mismatch_exception.rb +17 -15
  368. data/lib/onlinepayments/sdk/webhooks/in_memory_secret_key_store.rb +46 -43
  369. data/lib/onlinepayments/sdk/webhooks/secret_key_not_available_exception.rb +16 -12
  370. data/lib/onlinepayments/sdk/webhooks/secret_key_store.rb +13 -11
  371. data/lib/onlinepayments/sdk/webhooks/signature_validation_exception.rb +15 -14
  372. data/lib/onlinepayments/sdk/webhooks/signature_validator.rb +81 -0
  373. data/lib/onlinepayments/sdk/webhooks/webhooks_event.rb +84 -53
  374. data/lib/onlinepayments/sdk/webhooks/webhooks_helper.rb +28 -90
  375. data/lib/onlinepayments/sdk/webhooks.rb +1 -11
  376. data/lib/onlinepayments/sdk.rb +4 -26
  377. data/onlinepayments-sdk-ruby.gemspec +3 -2
  378. metadata +95 -40
  379. data/lib/onlinepayments/sdk/authenticator.rb +0 -16
  380. data/lib/onlinepayments/sdk/communication_exception.rb +0 -16
  381. data/lib/onlinepayments/sdk/connection.rb +0 -41
  382. data/lib/onlinepayments/sdk/data_object.rb +0 -31
  383. data/lib/onlinepayments/sdk/defaultimpl/authorization_type.rb +0 -24
  384. data/lib/onlinepayments/sdk/defaultimpl/default_authenticator.rb +0 -108
  385. data/lib/onlinepayments/sdk/defaultimpl/default_connection.rb +0 -365
  386. data/lib/onlinepayments/sdk/defaultimpl/default_marshaller.rb +0 -32
  387. data/lib/onlinepayments/sdk/defaultimpl.rb +0 -6
  388. data/lib/onlinepayments/sdk/domain/network_token_essentials.rb +0 -38
  389. data/lib/onlinepayments/sdk/domain/page_customization.rb +0 -26
  390. data/lib/onlinepayments/sdk/domain/payment_product5002_specific_input.rb +0 -34
  391. data/lib/onlinepayments/sdk/domain/payment_product840.rb +0 -26
  392. data/lib/onlinepayments/sdk/domain/three_ds_whitelist.rb +0 -30
  393. data/lib/onlinepayments/sdk/endpoint_configuration.rb +0 -127
  394. data/lib/onlinepayments/sdk/exceptions.rb +0 -8
  395. data/lib/onlinepayments/sdk/logging/logging_util.rb +0 -286
  396. data/lib/onlinepayments/sdk/marshaller.rb +0 -24
  397. data/lib/onlinepayments/sdk/marshaller_syntax_exception.rb +0 -6
  398. data/lib/onlinepayments/sdk/merchant/services/get_privacy_policy_params.rb +0 -30
  399. data/lib/onlinepayments/sdk/meta_data_provider.rb +0 -150
  400. data/lib/onlinepayments/sdk/modules.rb +0 -62
  401. data/lib/onlinepayments/sdk/multipart_form_data_object.rb +0 -44
  402. data/lib/onlinepayments/sdk/multipart_form_data_request.rb +0 -9
  403. data/lib/onlinepayments/sdk/not_found_exception.rb +0 -16
  404. data/lib/onlinepayments/sdk/param_request.rb +0 -11
  405. data/lib/onlinepayments/sdk/payment_platform_exception.rb +0 -15
  406. data/lib/onlinepayments/sdk/pooled_connection.rb +0 -21
  407. data/lib/onlinepayments/sdk/request_header.rb +0 -50
  408. data/lib/onlinepayments/sdk/request_param.rb +0 -23
  409. data/lib/onlinepayments/sdk/response_exception.rb +0 -47
  410. data/lib/onlinepayments/sdk/response_header.rb +0 -42
  411. data/lib/onlinepayments/sdk/uploadable_file.rb +0 -30
  412. data/lib/onlinepayments/sdk/webhooks/webhooks.rb +0 -22
  413. data/lib/onlinepayments/sdk/webhooks/webhooks_helper_builder.rb +0 -25
@@ -1,55 +1,58 @@
1
1
  require 'concurrent'
2
2
  require 'singleton'
3
+ require 'onlinepayments/sdk/webhooks/secret_key_not_available_exception'
4
+ require 'onlinepayments/sdk/webhooks/secret_key_store'
3
5
 
4
- module OnlinePayments::SDK
5
- module Webhooks
6
- # An in-memory secret key store. This implementation can be used
7
- # in applications where secret keys are specified at application
8
- # startup. Thread-safe.
9
- class InMemorySecretKeyStore
6
+ module OnlinePayments
7
+ module SDK
8
+ module Webhooks
9
+ # An in-memory secret key store. This implementation can be used
10
+ # in applications where secret keys are specified at application
11
+ # startup. Thread-safe.
12
+ class InMemorySecretKeyStore
13
+ include Singleton
14
+ include SecretKeyStore
10
15
 
11
- include Singleton
12
- include SecretKeyStore
13
-
14
- # Creates new InMemorySecretKeyStore
15
- def initialize
16
- # NOTE: use Map instead of Hash to provide better performance
17
- # under high concurrency.
18
- @store = Concurrent::Map.new
19
- end
16
+ # Creates new InMemorySecretKeyStore
17
+ def initialize
18
+ # NOTE: use Map instead of Hash to provide better performance
19
+ # under high concurrency.
20
+ @store = Concurrent::Map.new
21
+ end
20
22
 
21
- # Retrieves the secret key corresponding to the given key id
22
- #
23
- # @param key_id [String] key id of the secret key
24
- # @raise [OnlinePayments::SDK::Webhooks::SecretKeyNotAvailableException] if the secret key for the given key id is not available.
25
- def get_secret_key(key_id)
26
- if (secret_key = @store.get(key_id))
27
- return secret_key
23
+ # Retrieves the secret key corresponding to the given key id
24
+ #
25
+ # @param key_id [String] key id of the secret key
26
+ # @raise [OnlinePayments::SDK::Webhooks::SecretKeyNotAvailableException] if the secret key for the given key id is not available.
27
+ def get_secret_key(key_id)
28
+ if (secret_key = @store.get(key_id)).nil?
29
+ msg = "could not find secret key for key id " + key_id
30
+ raise SecretKeyNotAvailableException.new(message: msg, key_id: key_id)
31
+ end
32
+ secret_key
28
33
  end
29
- msg = "could not find secret key for key id #{key_id}"
30
- raise SecretKeyNotAvailableException, message: msg, key_id: key_id
31
- end
32
34
 
33
- # Stores the given secret key for the given key id.
34
- #
35
- # @param key_id [String] key id of the secret key
36
- # @param secret_key [String] the secret key to be stored
37
- def store_secret_key(key_id, secret_key)
38
- raise ArgumentError if key_id.nil? || key_id.strip.empty?
39
- raise ArgumentError if secret_key.nil? || secret_key.strip.empty?
40
- @store.put(key_id, secret_key)
41
- end
35
+ # Stores the given secret key for the given key id.
36
+ #
37
+ # @param key_id [String] key id of the secret key
38
+ # @param secret_key [String] the secret key to be stored
39
+ def store_secret_key(key_id, secret_key)
40
+ raise ArgumentError if key_id.nil? or key_id.strip.empty?
41
+ raise ArgumentError if secret_key.nil? or secret_key.strip.empty?
42
+ @store.put(key_id, secret_key)
43
+ end
42
44
 
43
- # Removes the secret key for the given key id.
44
- #
45
- # @param key_id [String] the key id whose corresponding secret should be removed from the store
46
- def remove_secret_key(key_id)
47
- @store.delete(key_id)
48
- end
45
+ # Removes the secret key for the given key id.
46
+ #
47
+ # @param key_id [String] the key id whose corresponding secret should be removed from the store
48
+ def remove_secret_key(key_id)
49
+ @store.delete(key_id)
50
+ end
49
51
 
50
- # Removes all stored secret keys from the store
51
- def clear
52
- @store.clear
52
+ # Removes all stored secret keys from the store
53
+ def clear
54
+ @store.clear
55
+ end
53
56
  end
54
57
  end
55
58
  end
@@ -1,17 +1,21 @@
1
- module OnlinePayments::SDK
2
- module Webhooks
3
- # Raised when an error caused a secret to become not available.
4
- #
5
- # @attr_reader [String] key_id
6
- class SecretKeyNotAvailableException < SignatureValidationException
1
+ require 'onlinepayments/sdk/webhooks/signature_validation_exception'
7
2
 
8
- def initialize(args)
9
- raise ArgumentError if (key_id = args.delete(:key_id)).nil? # key_id is mandatory
10
- super(args)
11
- @key_id = key_id
12
- end
3
+ module OnlinePayments
4
+ module SDK
5
+ module Webhooks
6
+ # Raised when an error caused a secret to become not available.
7
+ #
8
+ # @attr_reader [String] key_id
9
+ class SecretKeyNotAvailableException < SignatureValidationException
10
+
11
+ def initialize(args)
12
+ raise ArgumentError if (key_id = args.delete(:key_id)).nil? # key_id is mandatory
13
+ super(args)
14
+ @key_id = key_id
15
+ end
13
16
 
14
- attr_reader :key_id
17
+ attr_reader :key_id
18
+ end
15
19
  end
16
20
  end
17
21
  end
@@ -1,15 +1,17 @@
1
- module OnlinePayments::SDK
2
- module Webhooks
3
- # An abstract store of secret keys. Implementation can store secret keys in a database,
4
- # on disk, etc. Should be Thread-safe.
5
- module SecretKeyStore
1
+ module OnlinePayments
2
+ module SDK
3
+ module Webhooks
4
+ # An abstract store of secret keys. Implementation can store secret keys in a database,
5
+ # on disk, etc. Should be Thread-safe.
6
+ module SecretKeyStore
6
7
 
7
- # Retrieve secret key for given key id
8
- #
9
- # @param key_id [String] key id of the secret key
10
- # @raise [OnlinePayments::SDK::Webhooks::SecretKeyNotAvailableException] if the secret key for the given key id is not available.
11
- def get_secret_key(key_id)
12
- raise NotImplementedError
8
+ # Retrieve secret key for given key id
9
+ #
10
+ # @param key_id [String] key id of the secret key
11
+ # @raise [OnlinePayments::SDK::Webhooks::SecretKeyNotAvailableException] if the secret key for the given key id is not available.
12
+ def get_secret_key(key_id)
13
+ raise NotImplementedError
14
+ end
13
15
  end
14
16
  end
15
17
  end
@@ -1,18 +1,19 @@
1
- module OnlinePayments::SDK
2
- module Webhooks
1
+ module OnlinePayments
2
+ module SDK
3
+ module Webhooks
4
+ # Raised when an error occurred when validating Webhooks signatures
5
+ class SignatureValidationException < RuntimeError
3
6
 
4
- # Raised when an error occurred when validating Webhooks signatures
5
- class SignatureValidationException < RuntimeError
6
-
7
- # Creates a new SignatureValidationException
8
- #
9
- # @param [Hash] args the options to create the Exception with
10
- # @option args [String] :message the error message
11
- # @option args [RuntimeError] :cause an Error object that causes the Exception
12
- def initialize(args)
13
- super(args[:message]) # NOTE: can be nil
14
- # store backtrace info if exception given
15
- set_backtrace(args[:cause].backtrace) if args[:cause]
7
+ # Creates a new SignatureValidationException
8
+ #
9
+ # @param [Hash] args the options to create the Exception with
10
+ # @option args [String] :message the error message
11
+ # @option args [RuntimeError] :cause an Error object that causes the Exception
12
+ def initialize(args)
13
+ super(args[:message]) # NOTE: can be nil
14
+ # store backtrace info if exception given
15
+ set_backtrace(args[:cause].backtrace) unless args[:cause].nil?
16
+ end
16
17
  end
17
18
  end
18
19
  end
@@ -0,0 +1,81 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'onlinepayments/sdk/webhooks/signature_validation_exception'
4
+
5
+ module OnlinePayments
6
+ module SDK
7
+ module Webhooks
8
+
9
+ # Validator for webhooks signatures. Thread-safe.
10
+ class SignatureValidator
11
+ def initialize(secret_key_store)
12
+ raise ArgumentError if secret_key_store.nil?
13
+ @secret_key_store = secret_key_store
14
+ end
15
+
16
+ # Validates incoming request using request headers
17
+ #
18
+ # @param body [String] body of the request
19
+ # @param request_headers [Array<OnlinePayments::SDK::Communication::RequestHeader>] headers of the request
20
+ def validate(body, request_headers)
21
+ validate_body(body, request_headers)
22
+ end
23
+
24
+ private
25
+
26
+ HEADER_SIGNATURE = 'X-GCS-Signature'.freeze
27
+ HEADER_KEY_ID = 'X-GCS-KeyId'.freeze
28
+ HMAC_SCHEME = 'SHA256'.freeze
29
+
30
+ # Validates the body using given request headers
31
+ #
32
+ # @param body [String] body of the request
33
+ # @param request_headers [Array<OnlinePayments::SDK::Communication::RequestHeader>] headers of the request
34
+ def validate_body(body, request_headers)
35
+ signature = get_header_value(request_headers, HEADER_SIGNATURE)
36
+ key_id = get_header_value(request_headers, HEADER_KEY_ID)
37
+ secret_key = @secret_key_store.get_secret_key(key_id)
38
+ digest = OpenSSL::Digest.new(HMAC_SCHEME)
39
+ hmac = OpenSSL::HMAC.digest(digest, secret_key, body)
40
+ expected_signature = Base64.strict_encode64(hmac).strip
41
+
42
+ unless equal_signatures?(signature, expected_signature)
43
+ msg = "failed to validate signature '#{signature}'"
44
+ raise SignatureValidationException.new(message: msg)
45
+ end
46
+ end
47
+
48
+ # Checks two signatures
49
+ #
50
+ # @param signature [String]
51
+ # @param expected_signature [String]
52
+ def equal_signatures?(signature, expected_signature)
53
+ # NOTE: copy the signatures to avoid runtime tampering via references
54
+ signature = signature.dup.freeze
55
+ expected_signature = expected_signature.dup.freeze
56
+ # NOTE: do not use simple equality comparision to avoid side channel attack
57
+ limit = [signature.length, expected_signature.length, 256].max
58
+ limit.times.inject(true) do |flag, idx|
59
+ # NOTE: this block is constructed to take constant time to run
60
+ flag &= signature[idx] == expected_signature[idx]
61
+ # [] returns nil if idx >= the length of the String
62
+ end
63
+ end
64
+
65
+ # Retrieves header value from the request headers whose header name matches the given parameter
66
+ def get_header_value(request_headers, header_name)
67
+ if (right_header = request_headers.select { |h| h.name.casecmp(header_name) == 0 }).size != 1
68
+ msg = if right_header.empty?
69
+ "could not find header '#{header_name}'"
70
+ else
71
+ # more than 2 headers
72
+ "encountered multiple occurrences of header '#{header_name}'"
73
+ end
74
+ raise SignatureValidationException.new(message: msg)
75
+ end
76
+ right_header.first.value
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,57 +1,88 @@
1
- module OnlinePayments::SDK
2
- module Webhooks
3
-
4
- # @attr [String] api_version
5
- # @attr [String] id
6
- # @attr [String] created
7
- # @attr [String] merchant_id
8
- # @attr [String] type
9
- # @attr [OnlinePayments::SDK::Domain::PaymentResponse] payment
10
- # @attr [OnlinePayments::SDK::Domain::PayoutResponse] refund
11
- # @attr [OnlinePayments::SDK::Domain::RefundResponse] payout
12
- # @attr [OnlinePayments::SDK::Domain::TokenResponse] token
13
- # @attr [OnlinePayments::SDK::Domain::DisputeResponse] dispute
14
- class WebhooksEvent < OnlinePayments::SDK::DataObject
15
-
16
- attr_accessor :api_version
17
- attr_accessor :id
18
- attr_accessor :created
19
- attr_accessor :merchant_id
20
- attr_accessor :type
21
-
22
- attr_accessor :payment
23
- attr_accessor :refund
24
- attr_accessor :payout
25
- attr_accessor :token
26
- attr_accessor :dispute
27
-
28
- # @return [Hash]
29
- def to_h
30
- hash = super
31
- hash['apiVersion'] = @api_version if @api_version
32
- hash['id'] = @id if @id
33
- hash['created'] = @created if @created
34
- hash['merchantId'] = @merchant_id if @merchant_id
35
- hash['type'] = @type if @type
36
- hash['payment'] = @payment.to_h if @payment
37
- hash['refund'] = @refund.to_h if @refund
38
- hash['payout'] = @payout.to_h if @payout
39
- hash['token'] = @token.to_h if @token
40
- hash['dispute'] = @dispute.to_h if @dispute
41
- hash
42
- end
1
+ require 'onlinepayments/sdk/domain/data_object'
2
+ require 'onlinepayments/sdk/domain/payment_response'
3
+ require 'onlinepayments/sdk/domain/payout_response'
4
+ require 'onlinepayments/sdk/domain/refund_response'
5
+ require 'onlinepayments/sdk/domain/token_response'
6
+
7
+ module OnlinePayments
8
+ module SDK
9
+ module Webhooks
10
+ # @attr [String] api_version
11
+ # @attr [String] created
12
+ # @attr [String] id
13
+ # @attr [String] merchant_id
14
+ # @attr [String] type
15
+ # @attr [OnlinePayments::SDK::V2::Domain::PaymentResponse] payment
16
+ # @attr [OnlinePayments::SDK::V2::Domain::PayoutResponse] payout
17
+ # @attr [OnlinePayments::SDK::V2::Domain::RefundResponse] refund
18
+ # @attr [OnlinePayments::SDK::V2::Domain::TokenResponse] token
19
+ class WebhooksEvent < OnlinePayments::SDK::Domain::DataObject
20
+
21
+ attr_accessor :api_version
22
+
23
+ attr_accessor :created
24
+
25
+ attr_accessor :dispute
26
+
27
+ attr_accessor :id
28
+
29
+ attr_accessor :merchant_id
30
+
31
+ attr_accessor :type
32
+
33
+ attr_accessor :payment
34
+
35
+ attr_accessor :payout
36
+
37
+ attr_accessor :refund
38
+
39
+ attr_accessor :token
40
+
41
+ # @return (Hash)
42
+ def to_h
43
+ hash = super
44
+ hash['apiVersion'] = @api_version unless @api_version.nil?
45
+ hash['created'] = @created unless @created.nil?
46
+ hash['id'] = @id unless @id.nil?
47
+ hash['merchantId'] = @merchant_id unless @merchant_id.nil?
48
+ hash['type'] = @type unless @type.nil?
49
+ hash['payment'] = @payment.to_h unless @payment.nil?
50
+ hash['payout'] = @payout.to_h unless @payout.nil?
51
+ hash['refund'] = @refund.to_h unless @refund.nil?
52
+ hash['token'] = @token.to_h unless @token.nil?
53
+ hash
54
+ end
43
55
 
44
- def from_hash(hash)
45
- super
46
- @api_version = hash['apiVersion'] if hash.key? 'apiVersion'
47
- @id = hash['id'] if hash.key? 'id'
48
- @created = hash['created'] if hash.key? 'created'
49
- @merchant_id = hash['merchantId'] if hash.key? 'merchantId'
50
- @type = hash['type'] if hash.key? 'type'
51
- @payment = OnlinePayments::SDK::Domain::PaymentResponse.new_from_hash(hash['payment']) if hash.key? 'payment'
52
- @refund = OnlinePayments::SDK::Domain::RefundResponse.new_from_hash(hash['refund']) if hash.key? 'refund'
53
- @payout = OnlinePayments::SDK::Domain::PayoutResponse.new_from_hash(hash['payout']) if hash.key? 'payout'
54
- @token = OnlinePayments::SDK::Domain::TokenResponse.new_from_hash(hash['token']) if hash.key? 'token'
56
+ def from_hash(hash)
57
+ super
58
+ if hash.has_key? 'apiVersion'
59
+ @api_version = hash['apiVersion']
60
+ end
61
+ if hash.has_key? 'created'
62
+ @created = hash['created']
63
+ end
64
+ if hash.has_key? 'id'
65
+ @id = hash['id']
66
+ end
67
+ if hash.has_key? 'merchantId'
68
+ @merchant_id = hash['merchantId']
69
+ end
70
+ if hash.has_key? 'type'
71
+ @type = hash['type']
72
+ end
73
+ if hash.has_key? 'payment'
74
+ @payment = OnlinePayments::SDK::Domain::PaymentResponse.new_from_hash(hash['payment'])
75
+ end
76
+ if hash.has_key? 'payout'
77
+ @payout = OnlinePayments::SDK::Domain::PayoutResponse.new_from_hash(hash['payout'])
78
+ end
79
+ if hash.has_key? 'refund'
80
+ @refund = OnlinePayments::SDK::Domain::RefundResponse.new_from_hash(hash['refund'])
81
+ end
82
+ if hash.has_key? 'token'
83
+ @token = OnlinePayments::SDK::Domain::TokenResponse.new_from_hash(hash['token'])
84
+ end
85
+ end
55
86
  end
56
87
  end
57
88
  end
@@ -1,100 +1,38 @@
1
- require 'openssl'
2
- require 'base64'
3
-
4
- module OnlinePayments::SDK
5
- module Webhooks
6
-
7
- # Online Payments platform webhooks Helper, Thread-safe.
8
- class WebhooksHelper
9
- def initialize(marshaller, secret_key_store)
10
- raise ArgumentError unless marshaller
11
- raise ArgumentError unless secret_key_store
12
- @marshaller = marshaller
13
- @secret_key_store = secret_key_store
14
- end
15
-
16
- # Unmarshals the given body, while also validating it using the given request headers.
17
- #
18
- # @param body [String] body of the request
19
- # @param request_headers [Array<OnlinePayments::SDK::RequestHeader>] headers of the request
20
- def unmarshal(body, request_headers)
21
- validate(body, request_headers)
22
- event = @marshaller.unmarshal(body, WebhooksEvent)
23
- validate_api_version(event)
24
- event
25
- end
26
-
27
- # Validates incoming request using request headers
28
- #
29
- # @param body [String] body of the request
30
- # @param request_headers [Array<OnlinePayments::SDK::RequestHeader>] headers of the request
31
- def validate(body, request_headers)
32
- validate_body(body, request_headers)
33
- end
34
-
35
- private
36
-
37
- HEADER_SIGNATURE = 'X-GCS-Signature'.freeze
38
- HEADER_KEY_ID = 'X-GCS-KeyId'.freeze
39
- HMAC_SCHEME = 'SHA256'.freeze
40
-
41
- # validation utility methods
42
-
43
- # Validates the body using given request headers
44
- #
45
- # @param body [String] body of the request
46
- # @param request_headers [Array<OnlinePayments::SDK::RequestHeader>] headers of the request
47
- def validate_body(body, request_headers)
48
- signature = get_header_value(request_headers, HEADER_SIGNATURE)
49
- key_id = get_header_value(request_headers, HEADER_KEY_ID)
50
- secret_key = @secret_key_store.get_secret_key(key_id)
51
- digest = OpenSSL::Digest.new(HMAC_SCHEME)
52
- hmac = OpenSSL::HMAC.digest(digest, secret_key, body)
53
- expected_signature = Base64.strict_encode64(hmac).strip
54
-
55
- unless equal_signatures?(signature, expected_signature)
56
- msg = "failed to validate signature '#{signature}'"
57
- raise SignatureValidationException, message: msg
1
+ require 'onlinepayments/sdk/webhooks/webhooks_event'
2
+ require 'onlinepayments/sdk/webhooks/api_version_mismatch_exception'
3
+ require 'onlinepayments/sdk/webhooks/signature_validator'
4
+
5
+ module OnlinePayments
6
+ module SDK
7
+ module Webhooks
8
+ # Online Payments platform webhooks Helper, Thread-safe.
9
+ class WebhooksHelper
10
+ def initialize(marshaller, secret_key_store)
11
+ raise ArgumentError if marshaller.nil?
12
+ @marshaller = marshaller
13
+ @signature_validator = OnlinePayments::SDK::Webhooks::SignatureValidator.new(secret_key_store)
58
14
  end
59
- end
60
15
 
61
- # Checks two signatures
62
- #
63
- # @param signature [String]
64
- # @param expected_signature [String]
65
- def equal_signatures?(signature, expected_signature)
66
- # NOTE: copy the signatures to avoid runtime tampering via references
67
- signature = signature.dup.freeze
68
- expected_signature = expected_signature.dup.freeze
69
- # NOTE: do not use simple equality comparision to avoid side channel attack
70
- limit = [signature.length, expected_signature.length, 256].max
71
- limit.times.inject(true) do |flag, idx|
72
- # NOTE: this block is constructed to take constant time to run
73
- flag &= signature[idx] == expected_signature[idx]
74
- # [] returns nil if idx >= the length of the String
16
+ # Unmarshals the given body, while also validating it using the given request headers.
17
+ #
18
+ # @param body [String] body of the request
19
+ # @param request_headers [Array<OnlinePayments::SDK::Communication::RequestHeader>] headers of the request
20
+ # @return [OnlinePayments::SDK::Webhooks::WebhooksEvent]
21
+ def unmarshal(body, request_headers)
22
+ @signature_validator.validate(body, request_headers)
23
+
24
+ event = @marshaller.unmarshal(body, OnlinePayments::SDK::Webhooks::WebhooksEvent)
25
+ validate_api_version(event)
26
+ event
75
27
  end
76
- end
77
-
78
- # general utility methods
79
28
 
80
- # Returns true if the client API version and the webhooks event API version matches
81
- def validate_api_version(event)
82
- raise ApiVersionMismatchException.new event.api_version, 'v1' unless 'v1'.eql?(event.api_version)
83
- end
29
+ private
84
30
 
85
- # Retrieves header value from the request headers whose header name matches the given parameter
86
- def get_header_value(request_headers, header_name)
87
- if (right_header = request_headers.select { |h| h.name.casecmp(header_name) == 0 }).size != 1
88
- msg = if right_header.empty?
89
- "could not find header '#{header_name}'"
90
- else
91
- # more than 2 headers
92
- "encountered multiple occurrences of header '#{header_name}'"
93
- end
94
- raise SignatureValidationException, message: msg
31
+ def validate_api_version(event)
32
+ raise OnlinePayments::SDK::Webhooks::ApiVersionMismatchException.new(event.api_version, 'v1') unless 'v1'.eql?(event.api_version)
95
33
  end
96
- right_header.first.value
97
34
  end
98
35
  end
36
+
99
37
  end
100
38
  end
@@ -1,11 +1 @@
1
- prefix = 'onlinepayments/sdk/webhooks'
2
-
3
- require "#{prefix}/api_version_mismatch_exception"
4
- require "#{prefix}/signature_validation_exception"
5
- require "#{prefix}/secret_key_not_available_exception"
6
- require "#{prefix}/secret_key_store"
7
- require "#{prefix}/in_memory_secret_key_store"
8
- require "#{prefix}/webhooks_event"
9
- require "#{prefix}/webhooks_helper"
10
- require "#{prefix}/webhooks_helper_builder"
11
- require "#{prefix}/webhooks"
1
+ Dir[File.join(__dir__, 'webhooks', '*.rb')].each { |f| require f }
@@ -1,26 +1,4 @@
1
- prefix = 'onlinepayments/sdk'
2
-
3
- require "#{prefix}/logging"
4
- require "#{prefix}/exceptions"
5
-
6
- require "#{prefix}/marshaller"
7
- require "#{prefix}/response_header"
8
- require "#{prefix}/authenticator"
9
- require "#{prefix}/data_object"
10
- require "#{prefix}/proxy_configuration"
11
- require "#{prefix}/connection"
12
- require "#{prefix}/pooled_connection"
13
- require "#{prefix}/communicator"
14
- require "#{prefix}/endpoint_configuration"
15
- require "#{prefix}/communicator_configuration"
16
- require "#{prefix}/client"
17
- require "#{prefix}/call_context"
18
- require "#{prefix}/api_resource"
19
- require "#{prefix}/request_param"
20
- require "#{prefix}/request_header"
21
- require "#{prefix}/param_request"
22
- require "#{prefix}/meta_data_provider"
23
- require "#{prefix}/factory"
24
-
25
- require "#{prefix}/defaultimpl"
26
- require "#{prefix}/webhooks"
1
+ #
2
+ # This file was automatically generated.
3
+ #
4
+ Dir[File.join(__dir__, 'sdk', '*.rb')].each { |f| require f }
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'onlinepayments-sdk-ruby'
3
- spec.version = '4.22.0'
3
+ spec.version = '5.0.0'
4
4
  spec.authors = ['Worldline Direct support team']
5
5
  spec.email = ['82139942+worldline-direct-support-team@users.noreply.github.com']
6
6
  spec.summary = %q{SDK to communicate with the Online Payments platform using the Online Payments Server API}
@@ -22,7 +22,8 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'yard', '~> 0.9'
23
23
  spec.add_development_dependency 'rspec', '~> 3.5'
24
24
  spec.add_development_dependency 'webmock', '~> 2.1'
25
- spec.add_development_dependency 'sinatra', '~> 1.4'
25
+ spec.add_development_dependency 'sinatra', '~> 2.1'
26
+ spec.add_development_dependency 'webrick', '~> 1.7'
26
27
  spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
27
28
  # spec.metadata['yard.run'] = 'yri' # compiles yard doc on install
28
29
  end