onlinepayments-sdk-ruby 4.23.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 (408) 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 -52
  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 -28
  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 -128
  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 -100
  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 -59
  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 -42
  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 -60
  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 +51 -35
  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 +52 -44
  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 +27 -22
  152. data/lib/onlinepayments/sdk/domain/mandate_personal_name.rb +27 -20
  153. data/lib/onlinepayments/sdk/domain/mandate_personal_name_response.rb +27 -20
  154. data/lib/onlinepayments/sdk/domain/mandate_redirect_data.rb +27 -20
  155. data/lib/onlinepayments/sdk/domain/mandate_response.rb +64 -44
  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 +58 -45
  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 +27 -20
  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 +51 -0
  190. data/lib/onlinepayments/sdk/domain/payment_product302_specific_data.rb +22 -20
  191. data/lib/onlinepayments/sdk/domain/payment_product3203_specific_output.rb +27 -24
  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 +139 -88
  238. data/lib/onlinepayments/sdk/domain/redirect_payment_method_specific_output.rb +95 -75
  239. data/lib/onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.rb +20 -16
  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 -31
  275. data/lib/onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.rb +60 -39
  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 -63
  287. data/lib/onlinepayments/sdk/domain/three_d_secure_base.rb +78 -52
  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 +89 -35
  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/endpoint_configuration.rb +0 -127
  389. data/lib/onlinepayments/sdk/exceptions.rb +0 -8
  390. data/lib/onlinepayments/sdk/logging/logging_util.rb +0 -286
  391. data/lib/onlinepayments/sdk/marshaller.rb +0 -24
  392. data/lib/onlinepayments/sdk/marshaller_syntax_exception.rb +0 -6
  393. data/lib/onlinepayments/sdk/merchant/services/get_privacy_policy_params.rb +0 -30
  394. data/lib/onlinepayments/sdk/meta_data_provider.rb +0 -150
  395. data/lib/onlinepayments/sdk/modules.rb +0 -62
  396. data/lib/onlinepayments/sdk/multipart_form_data_object.rb +0 -44
  397. data/lib/onlinepayments/sdk/multipart_form_data_request.rb +0 -9
  398. data/lib/onlinepayments/sdk/not_found_exception.rb +0 -16
  399. data/lib/onlinepayments/sdk/param_request.rb +0 -11
  400. data/lib/onlinepayments/sdk/payment_platform_exception.rb +0 -15
  401. data/lib/onlinepayments/sdk/pooled_connection.rb +0 -21
  402. data/lib/onlinepayments/sdk/request_header.rb +0 -50
  403. data/lib/onlinepayments/sdk/request_param.rb +0 -23
  404. data/lib/onlinepayments/sdk/response_exception.rb +0 -47
  405. data/lib/onlinepayments/sdk/response_header.rb +0 -42
  406. data/lib/onlinepayments/sdk/uploadable_file.rb +0 -30
  407. data/lib/onlinepayments/sdk/webhooks/webhooks.rb +0 -22
  408. data/lib/onlinepayments/sdk/webhooks/webhooks_helper_builder.rb +0 -25
@@ -0,0 +1,27 @@
1
+ module OnlinePayments
2
+ module SDK
3
+ module JSON
4
+ # Class responsible for marshalling and unmarshalling objects to and from JSON
5
+ class Marshaller
6
+
7
+ # Marshals _request_object_ to JSON format by calling #to_h on it.
8
+ #
9
+ # @param request_object [OnlinePayments::SDK::Domain::DataObject] the object to format
10
+ # @return [String] _request_object_ converted to JSON
11
+ def marshal(request_object)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ # Unmarshals a JSON string into an object of type _type_.
16
+ # The new object is initialized by calling .new_from_hash with contents of the JSON as a Hash object.
17
+ #
18
+ # @param response_json [String] The JSON to unmarshal
19
+ # @param type [Type] The class of the object that will be instantiated using _type.new_from_hash_
20
+ # @return The JSON unmarshalled to the given type
21
+ def unmarshal(response_json, type)
22
+ raise NotImplementedError
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ module OnlinePayments
2
+ module SDK
3
+ module JSON
4
+ # Raised when an error occurred while marshalling/unmarshalling data to/from JSON
5
+ class MarshallerSyntaxException < RuntimeError
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ Dir[File.join(__dir__, 'json', '*.rb')].each { |f| require f }
@@ -1,21 +1,23 @@
1
- module OnlinePayments::SDK
2
- module Logging
1
+ module OnlinePayments
2
+ module SDK
3
+ module Logging
4
+ # Base logger class used in this SDK. This class is an interface and cannot be instantiated.
5
+ class CommunicatorLogger
3
6
 
4
- # Base logger class used in this SDK. This class is an interface and cannot be instantiated.
5
- class CommunicatorLogger
6
- # Interface, no instantiation
7
- # @see OnlinePayments::SDK::Logging::StdoutCommunicatorLogger
8
- # @see OnlinePayments::SDK::Logging::RubyCommunicatorLogger
9
- def initialize
10
- raise NotImplementedError, "#{self.class.name} is not implemented."
11
- end
7
+ # Interface, no instantiation
8
+ # @see OnlinePayments::SDK::Logging::StdoutCommunicatorLogger
9
+ # @see OnlinePayments::SDK::Logging::RubyCommunicatorLogger
10
+ def initialize
11
+ raise NotImplementedError.new("#{self.class.name} is not implemented.")
12
+ end
12
13
 
13
- # Logs a message with or without exception
14
- #
15
- # @param message [String] the message to log
16
- # @param thrown [Exception, false] the exception to log, or false to log no exception
17
- def log(message, thrown = false)
18
- raise NotImplementedError, "#{self.class.name}#log() is not implemented."
14
+ # Logs a message with or without exception
15
+ #
16
+ # @param message [String] the message to log
17
+ # @param thrown [Exception, nil] the exception to log, or nil to log no exception
18
+ def log(message, thrown = nil)
19
+ raise NotImplementedError.new("#{self.class.name}#log() is not implemented.")
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -1,56 +1,89 @@
1
- module OnlinePayments::SDK
2
- module Logging
3
-
4
- # Abstract class used to construct a message describing a request or response.
5
- #
6
- # @attr_reader [String] request_id An identifier assigned to the request and response
7
- # @attr_reader [String] headers Request or response headers in string form
8
- # @attr_reader [String] body Request or response body as a string
9
- # @attr_reader [String] content_type Content type of the body, generally 'application/json' or 'text/html'
10
- class LogMessageBuilder
11
-
12
- attr_reader :request_id
13
- attr_reader :headers
14
- attr_reader :body
15
- attr_reader :content_type
16
-
17
- # Create a new LogMessageBuilder
18
- def initialize(request_id)
19
- raise ArgumentError if request_id.nil? || request_id.empty?
20
- @request_id = request_id
21
- @headers = ''
22
- end
1
+ require 'onlinepayments/sdk/logging/obfuscation/body_obfuscator'
2
+ require 'onlinepayments/sdk/logging/obfuscation/header_obfuscator'
23
3
 
24
- # Adds a single header to the #headers string
25
- def add_headers(name, value)
26
- @headers += ', ' unless @headers.empty?
27
- @headers += "#{name}='#{LoggingUtil.obfuscate_header(name, value)}'"
28
- end
4
+ module OnlinePayments
5
+ module SDK
6
+ module Logging
7
+ # Abstract class used to construct a message describing a request or response.
8
+ #
9
+ # @attr_reader [String] request_id An identifier assigned to the request and response
10
+ # @attr_reader [String] headers Request or response headers in string form
11
+ # @attr_reader [String] body Request or response body as a string
12
+ # @attr_reader [String] content_type Content type of the body, generally 'application/json' or 'text/html'
13
+ # @attr_reader [OnlinePayments::SDK::Logging::Obfuscation::BodyObfuscator] body_obfuscator
14
+ # @attr_reader [OnlinePayments::SDK::Logging::Obfuscation::HeaderObfuscator] header_obfuscator
15
+ class LogMessageBuilder
29
16
 
30
- # Sets the body of this message to the parameter body.
17
+ attr_reader :request_id
18
+ attr_reader :headers
19
+ attr_reader :body
20
+ attr_reader :content_type
21
+ attr_reader :body_obfuscator
22
+ attr_reader :header_obfuscator
31
23
 
32
- # @param body [String] the message body
33
- # @param content_type [String] the content type of the body
34
- def set_body(body, content_type)
35
- @body = LoggingUtil.obfuscate_body(body)
36
- @content_type = content_type
37
- end
24
+ # Create a new LogMessageBuilder
25
+ def initialize(request_id,
26
+ body_obfuscator = Obfuscation::BodyObfuscator.default_obfuscator,
27
+ header_obfuscator = Obfuscation::HeaderObfuscator.default_obfuscator)
28
+ raise ArgumentError if request_id.nil? or request_id.empty?
29
+ raise ArgumentError if body_obfuscator.nil?
30
+ raise ArgumentError if header_obfuscator.nil?
31
+ @request_id = request_id
32
+ @headers = ''
33
+ @body_obfuscator = body_obfuscator
34
+ @header_obfuscator = header_obfuscator
35
+ end
38
36
 
39
- # Constructs and returns the log message as a string.
40
- def get_message
41
- raise NotImplementedError, "#{self.class.name}#get_message() is not implemented."
42
- end
37
+ # Adds a single header to the #headers string
38
+ def add_headers(name, value)
39
+ @headers += ', ' if @headers.length > 0
40
+ @headers += name + '="'
41
+ @headers += @header_obfuscator.obfuscate_header(name, value) unless value.nil?
42
+ @headers += '"'
43
+ end
43
44
 
44
- def to_s
45
- self.class == LogMessageBuilder ?
46
- super.to_s :
47
- get_message
48
- end
45
+ # Sets the body of this message to the parameter body.
46
+
47
+ # @param body [String] the message body
48
+ # @param content_type [String] the content type of the body
49
+ def set_body(body, content_type)
50
+ if is_binary(content_type)
51
+ @body = "<binary content>"
52
+ else
53
+ @body = @body_obfuscator.obfuscate_body(body)
54
+ end
55
+ @content_type = content_type
56
+ end
57
+
58
+ # Constructs and returns the log message as a string.
59
+ # @return [String]
60
+ def get_message
61
+ raise NotImplementedError.new("#{self.class.name}#get_message() is not implemented.")
62
+ end
63
+
64
+ def to_s
65
+ if self.class == LogMessageBuilder
66
+ super.to_s
67
+ else
68
+ get_message
69
+ end
70
+ end
71
+
72
+ # Returns an empty string if the parameter is nil, and returns the parameter itself otherwise
73
+ protected def empty_if_null(value)
74
+ value.nil? ? '' : value
75
+ end
49
76
 
50
- # Returns an empty string if the parameter is nil, and returns the parameter itself otherwise
51
- protected def empty_if_null(value)
52
- value.nil? ? '' : value
77
+ # Returns whether or not the content type is binary
78
+ def is_binary(content_type)
79
+ if content_type.nil?
80
+ false
81
+ else
82
+ content_type = content_type.downcase
83
+ !(content_type.start_with?("text/") || content_type.include?("json") || content_type.include?("xml"))
84
+ end
85
+ end
86
+ end
53
87
  end
54
- end
55
88
  end
56
89
  end
@@ -1,9 +1,9 @@
1
1
  module OnlinePayments
2
2
  module SDK
3
3
  module Logging
4
-
5
4
  # Abstract mixin module that allows loggers to be registered to an object.
6
5
  module LoggingCapable
6
+
7
7
  def enable_logging(communicator_logger)
8
8
  raise NotImplementedError
9
9
  end
@@ -0,0 +1,113 @@
1
+ require 'onlinepayments/sdk/logging/obfuscation/obfuscation_rule'
2
+
3
+ module OnlinePayments
4
+ module SDK
5
+ module Logging
6
+ module Obfuscation
7
+ # A class that can be used to obfuscate properties in JSON bodies.
8
+ class BodyObfuscator
9
+
10
+ # Creates a new body obfuscator.
11
+ # This will contain some pre-defined obfuscation rules, as well as any provided custom rules
12
+ #
13
+ # @param additional_rules [Hash] An optional hash where the keys are property names and the values are
14
+ # functions that obfuscate a single value
15
+ def initialize(additional_rules = nil)
16
+ @obfuscation_rules = {
17
+ "additionalInfo" => Obfuscation.obfuscate_all,
18
+ "cardholderName" => Obfuscation.obfuscate_all,
19
+ "dateOfBirth" => Obfuscation.obfuscate_all,
20
+ "emailAddress" => Obfuscation.obfuscate_all,
21
+ "faxNumber" => Obfuscation.obfuscate_all,
22
+ "firstName" => Obfuscation.obfuscate_all,
23
+ "houseNumber" => Obfuscation.obfuscate_all,
24
+ "mobilePhoneNumber" => Obfuscation.obfuscate_all,
25
+ "passengerName" => Obfuscation.obfuscate_all,
26
+ "phoneNumber" => Obfuscation.obfuscate_all,
27
+ "street" => Obfuscation.obfuscate_all,
28
+ "workPhoneNumber" => Obfuscation.obfuscate_all,
29
+ "zip" => Obfuscation.obfuscate_all,
30
+ "cardNumber" => Obfuscation.obfuscate_all_but_last(4),
31
+ "expiryDate" => Obfuscation.obfuscate_all_but_last(2),
32
+ "cvv" => Obfuscation.obfuscate_all,
33
+ "iban" => Obfuscation.obfuscate_all_but_last(4),
34
+ "accountNumber" => Obfuscation.obfuscate_all_but_last(4),
35
+ "reformattedAccountNumber" => Obfuscation.obfuscate_all_but_last(4),
36
+ "bin" => Obfuscation.obfuscate_all_but_first(6),
37
+ "value" => Obfuscation.obfuscate_all,
38
+ "keyId" => Obfuscation.obfuscate_with_fixed_length(8),
39
+ "secretKey" => Obfuscation.obfuscate_with_fixed_length(8),
40
+ "publicKey" => Obfuscation.obfuscate_with_fixed_length(8),
41
+ "userAuthenticationToken" => Obfuscation.obfuscate_with_fixed_length(8),
42
+ "encryptedPayload" => Obfuscation.obfuscate_with_fixed_length(8),
43
+ "decryptedPayload" => Obfuscation.obfuscate_with_fixed_length(8),
44
+ "encryptedCustomerInput" => Obfuscation.obfuscate_with_fixed_length(8),
45
+ }
46
+ if additional_rules
47
+ additional_rules.each do |name, rule|
48
+ @obfuscation_rules[name] = rule
49
+ end
50
+ end
51
+
52
+ @property_pattern = build_property_pattern(@obfuscation_rules.keys)
53
+ end
54
+
55
+ private
56
+
57
+ def build_property_pattern(pn)
58
+ return /$^/ if pn.empty? # no possible match
59
+ # Regex to create:
60
+ # (["'])(X|Y|Z)\1\s*:\s*(?:(["'])(.*?)(?<!\\)\3|([^"'\s\[\{]\S*))
61
+ # Groups:
62
+ # 1: opening " or ' for the property name
63
+ # 2: property name
64
+ # 3: opening " or ' for the value
65
+ # 4: quoted value
66
+ # 5: non-quoted-value
67
+ # The negative lookbehind is to allow escaped quotes to be part of
68
+ # the value. What this does not allow currently is having values end
69
+ # with a \ (which would be escaped to \\).
70
+ regex = pn.inject("([\"'])(") { |r, p| "#{r}#{Regexp.quote(p)}|" }.chop <<
71
+ ")\\1\\s*:\\s*(?:([\"'])(.*?)(?<!\\\\)\\3|([^\"'\\s\\[\\{]((?!,)\\S)*))"
72
+ /#{regex}/m # dotall mode
73
+ end
74
+
75
+ def obfuscate_value(property_name, value)
76
+ obfuscation_rule = @obfuscation_rules[property_name]
77
+ return obfuscation_rule.call(value) if obfuscation_rule
78
+ value
79
+ end
80
+
81
+ public
82
+
83
+ # Obfuscates the given body as necessary.
84
+ #
85
+ # @return (String)
86
+ def obfuscate_body(body)
87
+ return nil if body.nil?
88
+ return '' if body.empty?
89
+
90
+ body.gsub(@property_pattern) do
91
+ m = Regexp.last_match
92
+ property_name = m[2]
93
+ value = m[4] || m[5]
94
+ # copy value 'cause it's part of m[0]
95
+ m[0].sub(value, obfuscate_value(property_name, value.dup))
96
+ end
97
+ end
98
+
99
+ private
100
+
101
+ DEFAULT_OBFUSCATOR = BodyObfuscator.new
102
+
103
+ public
104
+
105
+ # @return [BodyObfuscator]
106
+ def self.default_obfuscator
107
+ DEFAULT_OBFUSCATOR
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,54 @@
1
+ require 'onlinepayments/sdk/logging/obfuscation/obfuscation_rule'
2
+
3
+ module OnlinePayments
4
+ module SDK
5
+ module Logging
6
+ module Obfuscation
7
+ # A class that can be used to obfuscate headers.
8
+ class HeaderObfuscator
9
+
10
+ # Creates a new header obfuscator.
11
+ # This will contain some pre-defined obfuscation rules, as well as any provided custom rules
12
+ #
13
+ # @param additional_rules [Hash] An optional hash where the keys are header names and the values are
14
+ # functions that obfuscate a single value
15
+ def initialize(additional_rules = nil)
16
+ @obfuscation_rules = {
17
+ "X-GCS-Authentication-Token" => Obfuscation.obfuscate_with_fixed_length(8),
18
+ "X-GCS-CallerPassword" => Obfuscation.obfuscate_with_fixed_length(8),
19
+ "authorization" => Obfuscation.obfuscate_with_fixed_length(8),
20
+ "www-authenticate" => Obfuscation.obfuscate_with_fixed_length(8),
21
+ "proxy-authenticate" => Obfuscation.obfuscate_with_fixed_length(8),
22
+ "proxy-authorization" => Obfuscation.obfuscate_with_fixed_length(8),
23
+ }
24
+ if additional_rules
25
+ additional_rules.each do |name, rule|
26
+ @obfuscation_rules[name.downcase] = rule
27
+ end
28
+ end
29
+ end
30
+
31
+ # Obfuscates the value for the given header as necessary.
32
+ #
33
+ # @return (String)
34
+ def obfuscate_header(header_name, value)
35
+ obfuscation_rule = @obfuscation_rules[header_name.downcase]
36
+ return obfuscation_rule.call(value) if obfuscation_rule
37
+ value
38
+ end
39
+
40
+ private
41
+
42
+ DEFAULT_OBFUSCATOR = HeaderObfuscator.new
43
+
44
+ public
45
+
46
+ # @return [HeaderObfuscator]
47
+ def self.default_obfuscator
48
+ DEFAULT_OBFUSCATOR
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,21 @@
1
+ module OnlinePayments
2
+ module SDK
3
+ module Logging
4
+ module Obfuscation
5
+ # Abstract mixin module that allows specifying body and header obfuscators for an object.
6
+ module ObfuscationCapable
7
+
8
+ # Sets the current body obfuscator to use.
9
+ def set_body_obfuscator(body_obfuscator)
10
+ raise NotImplementedError
11
+ end
12
+
13
+ # Sets the current header obfuscator to use.
14
+ def set_header_obfuscator(header_obfuscator)
15
+ raise NotImplementedError
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,47 @@
1
+ module OnlinePayments
2
+ module SDK
3
+ module Logging
4
+ module Obfuscation
5
+
6
+ # Returns an obfuscation rule (callable) that will replace all characters with *
7
+ def self.obfuscate_all
8
+ ->(value) do
9
+ return value if value.nil? or value.empty?
10
+ '*' * (value || '').length
11
+ end
12
+ end
13
+
14
+ # Returns an obfuscation rule (function) that will replace values with a fixed length string containing only *
15
+ def self.obfuscate_with_fixed_length(fixed_length)
16
+ ->(value) { '*' * fixed_length }
17
+ end
18
+
19
+ # Returns an obfuscation rule (function) that will keep a fixed number of characters at the start,
20
+ # then replaces all other characters with *
21
+ def self.obfuscate_all_but_first(count)
22
+ ->(value) do
23
+ return value if value.nil? or value.empty?
24
+ return value if value.length < count
25
+ # range describes the range of characters to replace with asterisks
26
+ range = count...value.length
27
+ value[range] = '*' * range.size
28
+ value
29
+ end
30
+ end
31
+
32
+ # Returns an obfuscation rule that will keep a fixed number of characters at the end,
33
+ # then replaces all other characters with *
34
+ def self.obfuscate_all_but_last(count)
35
+ ->(value) do
36
+ return value if value.nil? or value.empty?
37
+ return value if value.length < count
38
+ # range describes the range of characters to replace with asterisks
39
+ range = 0...(value.length - count)
40
+ value[range] = '*' * range.size
41
+ value
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1 @@
1
+ Dir[File.join(__dir__, 'obfuscation', '*.rb')].each { |f| require f }
@@ -1,38 +1,49 @@
1
- module OnlinePayments::SDK
2
- module Logging
1
+ require 'onlinepayments/sdk/logging/obfuscation/body_obfuscator'
2
+ require 'onlinepayments/sdk/logging/obfuscation/header_obfuscator'
3
+ require 'onlinepayments/sdk/logging/log_message_builder'
3
4
 
4
- # Class that converts data about a request into a properly formatted log message.
5
- # Formats request id, http method, uri, headers and body into a helpful message.
6
- class RequestLogMessageBuilder < OnlinePayments::SDK::Logging::LogMessageBuilder
5
+ module OnlinePayments
6
+ module SDK
7
+ module Logging
8
+ # Class that converts data about a request into a properly formatted log message.
9
+ # Formats request id, http method, uri, headers and body into a helpful message.
10
+ class RequestLogMessageBuilder < LogMessageBuilder
7
11
 
8
- def initialize(request_id, method, uri)
9
- super(request_id)
10
- @method = method
11
- @uri = uri
12
- end
12
+ def initialize(request_id, method, uri,
13
+ body_obfuscator = Obfuscation::BodyObfuscator.default_obfuscator,
14
+ header_obfuscator = Obfuscation::HeaderObfuscator.default_obfuscator)
15
+ super(request_id, body_obfuscator, header_obfuscator)
16
+ @method = method
17
+ @uri = uri
18
+ end
13
19
 
14
- # Constructs and returns a log message based on the request data. The log message is a string.
15
- def get_message
16
- @body ?
17
- sprintf(MSG_TEMPLATE_WITH_BODY, @request_id, empty_if_null(@method),
18
- format_uri, @headers, empty_if_null(@content_type), @body) :
19
- sprintf(MSG_TEMPLATE_WITHOUT_BODY, @request_id, empty_if_null(@method), format_uri, @headers)
20
- end
20
+ # Constructs and returns a log message based on the request data. The log message is a string.
21
+ def get_message
22
+ msg_template_without_body = "Outgoing request (requestId='%s'):\n" +
23
+ " method: '%s'\n" +
24
+ " uri: '%s'\n" +
25
+ " headers: '%s'"
26
+ msg_template_with_body = msg_template_without_body + "\n" +
27
+ " content-type: '%s'\n" +
28
+ " body: '%s'"
21
29
 
22
- private
30
+ return sprintf(msg_template_without_body, @request_id, empty_if_null(@method),
31
+ format_uri, @headers) if @body.nil?
32
+ sprintf(msg_template_with_body, @request_id, empty_if_null(@method),
33
+ format_uri, @headers, empty_if_null(@content_type), @body)
34
+ end
23
35
 
24
- MSG_TEMPLATE_WITHOUT_BODY = "Outgoing request (requestId=\"%s\"):\n"\
25
- " method: \"%s\"\n"\
26
- " uri: \"%s\"\n"\
27
- " headers: \"%s\"".freeze
28
- MSG_TEMPLATE_WITH_BODY = "#{MSG_TEMPLATE_WITHOUT_BODY}\n"\
29
- " content-type: \"%s\"\n"\
30
- " body: \"%s\"".freeze
36
+ private
31
37
 
32
- def format_uri
33
- return '' unless @uri && @uri.path
34
- return @uri.path unless @uri.query
35
- "#{@uri.path}?#{@uri.query}"
38
+ def format_uri
39
+ '' unless @uri && @uri.path
40
+ if @uri.query.nil?
41
+ @uri.path
42
+ else
43
+ "#{@uri.path}?#{@uri.query}" unless @uri.query.nil?
44
+ end
45
+ # @uri.path + '?' + empty_if_null(@uri.query)
46
+ end
36
47
  end
37
48
  end
38
49
  end
@@ -1,33 +1,40 @@
1
- module OnlinePayments::SDK
2
- module Logging
3
-
4
- class ResponseLogMessageBuilder < LogMessageBuilder
1
+ require 'onlinepayments/sdk/logging/obfuscation/body_obfuscator'
2
+ require 'onlinepayments/sdk/logging/obfuscation/header_obfuscator'
3
+ require 'onlinepayments/sdk/logging/log_message_builder'
5
4
 
5
+ module OnlinePayments
6
+ module SDK
7
+ module Logging
6
8
  # Class that converts data about a response into a properly formatted log message.
7
9
  # Formats request id, status code, headers, body and time between request and response into a helpful message.
8
- #
9
- # @param request_id [String] identifier of the request corresponding to this response.
10
- # @param status_code [Integer] HTTP status code of the response.
11
- # @param duration [Float] time elapsed between request and response.
12
- def initialize(request_id, status_code, duration = -1)
13
- super(request_id)
14
- @status_code = status_code
15
- @duration = duration
16
- end
10
+ class ResponseLogMessageBuilder < LogMessageBuilder
11
+
12
+ # @param request_id [String] identifier of the request corresponding to this response.
13
+ # @param status_code [Integer] HTTP status code of the response.
14
+ # @param duration [Float] time elapsed between request and response.
15
+ def initialize(request_id, status_code, duration = -1,
16
+ body_obfuscator = Obfuscation::BodyObfuscator.default_obfuscator,
17
+ header_obfuscator = Obfuscation::HeaderObfuscator.default_obfuscator)
18
+ super(request_id, body_obfuscator, header_obfuscator)
19
+ @status_code = status_code
20
+ @duration = duration
21
+ end
17
22
 
18
- # Constructs and returns a log message based on the request data. The log message is a string.
19
- def get_message
20
- msg_template = "Incoming response (requestId=\"%s\"#{(@duration.positive?) ? ", %.3f ms" : ""}):\n" +
21
- " status-code: \"%s\"\n" +
22
- " headers: \"%s\"\n" +
23
- " content-type: \"%s\"\n" +
24
- " body: \"%s\""
23
+ # Constructs and returns a log message based on the request data. The log message is a string.
24
+ def get_message
25
+ msg_template = "Incoming response (requestId='%s'" +
26
+ ((@duration < 0) ? "" : ", %.3f ms") +
27
+ "):\n" +
28
+ " status-code: '%s'\n" +
29
+ " headers: '%s'\n" +
30
+ " content-type: '%s'\n" +
31
+ " body: '%s'"
25
32
 
26
- @duration.positive? ?
33
+ return sprintf(msg_template, @request_id, @status_code, @headers,
34
+ empty_if_null(@content_type), empty_if_null(@body)) if @duration < 0
27
35
  sprintf(msg_template, @request_id, @duration, @status_code, @headers,
28
- empty_if_null(@content_type), empty_if_null(@body)) :
29
- sprintf(msg_template, @request_id, @status_code, @headers,
30
36
  empty_if_null(@content_type), empty_if_null(@body))
37
+ end
31
38
  end
32
39
  end
33
40
  end