fingerprint-pro-server-api-sdk 7.0.0.dev1__tar.gz → 7.0.0.dev2__tar.gz

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 (118) hide show
  1. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/PKG-INFO +8 -7
  2. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/README.md +4 -5
  3. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/__init__.py +2 -0
  4. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/api/fingerprint_api.py +4 -4
  5. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/api_client.py +72 -63
  6. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/configuration.py +1 -1
  7. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/sealed.py +30 -14
  8. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk.egg-info/PKG-INFO +8 -7
  9. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/setup.cfg +1 -1
  10. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/setup.py +5 -1
  11. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/test/test_fingerprint_api.py +1 -1
  12. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/test/test_sealed.py +23 -20
  13. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/LICENSE +0 -0
  14. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/api/__init__.py +0 -0
  15. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/base_model.py +0 -0
  16. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/dummy_pool.py +0 -0
  17. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/extend_exception.py +0 -0
  18. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/__init__.py +0 -0
  19. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/asn.py +0 -0
  20. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/botd_detection_result.py +0 -0
  21. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/botd_result.py +0 -0
  22. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/browser_details.py +0 -0
  23. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/cloned_app_result.py +0 -0
  24. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/common403_error_response.py +0 -0
  25. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/confidence.py +0 -0
  26. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/data_center.py +0 -0
  27. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/deprecated_ip_location.py +0 -0
  28. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/deprecated_ip_location_city.py +0 -0
  29. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/developer_tools_result.py +0 -0
  30. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/emulator_result.py +0 -0
  31. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_common403_response.py +0 -0
  32. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_common429_response.py +0 -0
  33. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_common429_response_error.py +0 -0
  34. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_event404_response.py +0 -0
  35. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_event404_response_error.py +0 -0
  36. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_update_event400_response.py +0 -0
  37. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_update_event400_response_error.py +0 -0
  38. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_update_event409_response.py +0 -0
  39. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_update_event409_response_error.py +0 -0
  40. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_visitor400_response.py +0 -0
  41. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_visitor400_response_error.py +0 -0
  42. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_visitor404_response.py +0 -0
  43. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_visitor404_response_error.py +0 -0
  44. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/error_visits403.py +0 -0
  45. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/event_response.py +0 -0
  46. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/event_update_request.py +0 -0
  47. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/factory_reset_result.py +0 -0
  48. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/frida_result.py +0 -0
  49. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/high_activity_result.py +0 -0
  50. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/identification_error.py +0 -0
  51. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/incognito_result.py +0 -0
  52. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_block_list_result.py +0 -0
  53. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_block_list_result_details.py +0 -0
  54. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_info_result.py +0 -0
  55. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_info_result_v4.py +0 -0
  56. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_info_result_v6.py +0 -0
  57. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_location.py +0 -0
  58. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/ip_location_city.py +0 -0
  59. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/jailbroken_result.py +0 -0
  60. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/location.py +0 -0
  61. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/location_spoofing_result.py +0 -0
  62. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/privacy_settings_result.py +0 -0
  63. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/product_error.py +0 -0
  64. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/products_response.py +0 -0
  65. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/products_response_botd.py +0 -0
  66. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/products_response_identification.py +0 -0
  67. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/products_response_identification_data.py +0 -0
  68. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/proxy_result.py +0 -0
  69. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/raw_device_attributes_result.py +0 -0
  70. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/remote_control_result.py +0 -0
  71. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/response.py +0 -0
  72. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/response_visits.py +0 -0
  73. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/root_apps_result.py +0 -0
  74. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/seen_at.py +0 -0
  75. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_cloned_app.py +0 -0
  76. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_developer_tools.py +0 -0
  77. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_emulator.py +0 -0
  78. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_factory_reset.py +0 -0
  79. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_frida.py +0 -0
  80. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_high_activity.py +0 -0
  81. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_incognito.py +0 -0
  82. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_ip_blocklist.py +0 -0
  83. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_ip_info.py +0 -0
  84. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_jailbroken.py +0 -0
  85. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_location_spoofing.py +0 -0
  86. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_privacy_settings.py +0 -0
  87. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_proxy.py +0 -0
  88. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_raw_device_attributes.py +0 -0
  89. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_remote_control.py +0 -0
  90. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_root_apps.py +0 -0
  91. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_suspect_score.py +0 -0
  92. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_tampering.py +0 -0
  93. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_tor.py +0 -0
  94. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_velocity.py +0 -0
  95. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_virtual_machine.py +0 -0
  96. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/signal_response_vpn.py +0 -0
  97. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/subdivision.py +0 -0
  98. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/suspect_score_result.py +0 -0
  99. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/tampering_result.py +0 -0
  100. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/too_many_requests_response.py +0 -0
  101. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/tor_result.py +0 -0
  102. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/velocity_interval_result.py +0 -0
  103. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/velocity_intervals.py +0 -0
  104. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/velocity_result.py +0 -0
  105. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/virtual_machine_result.py +0 -0
  106. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/visit.py +0 -0
  107. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/vpn_result.py +0 -0
  108. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/vpn_result_methods.py +0 -0
  109. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/models/webhook_visit.py +0 -0
  110. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/rest.py +0 -0
  111. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk/webhook.py +0 -0
  112. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk.egg-info/SOURCES.txt +0 -0
  113. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk.egg-info/dependency_links.txt +0 -0
  114. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk.egg-info/requires.txt +0 -0
  115. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/fingerprint_pro_server_api_sdk.egg-info/top_level.txt +0 -0
  116. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/test/__init__.py +0 -0
  117. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/test/test_base_model.py +0 -0
  118. {fingerprint_pro_server_api_sdk-7.0.0.dev1 → fingerprint_pro_server_api_sdk-7.0.0.dev2}/test/test_webhook_validation.py +0 -0
@@ -1,11 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fingerprint-pro-server-api-sdk
3
- Version: 7.0.0.dev1
3
+ Version: 7.0.0.dev2
4
4
  Summary: Fingerprint Pro Server API allows you to get information about visitors and about individual events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios. Server API is intended for server-side usage, it's not intended to be used from the client side, whether it's a browser or a mobile device.
5
- Home-page: https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk
6
5
  Author: Fingerprint
7
6
  Author-email: support@fingerprint.com
8
7
  License: MIT
8
+ Project-URL: Changelog, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/blob/main/CHANGELOG.md
9
+ Project-URL: Code, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk
10
+ Project-URL: Issue Tracker, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/issues
9
11
  Keywords: Swagger,Fingerprint Pro Server API,browser,detection,fingerprint,identification,fingerprinting,browser-fingerprinting,browser-fingerprint,fraud-detection,fraud,audio-fingerprinting,fingerprintjs,fingerprintjs-pro,visitor-identifier
10
12
  Classifier: Development Status :: 5 - Production/Stable
11
13
  Classifier: Intended Audience :: Developers
@@ -49,7 +51,7 @@ The Fingerprint Server Python SDK is an easy way to interact with the Fingerprin
49
51
  This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project:
50
52
 
51
53
  - API version: 3
52
- - Package version: 7.0.0.dev1
54
+ - Package version: 7.0.0.dev2
53
55
  - Build package: io.swagger.codegen.v3.generators.python.PythonClientCodegen
54
56
 
55
57
  ## Requirements
@@ -205,8 +207,7 @@ import os
205
207
 
206
208
  from dotenv import load_dotenv
207
209
 
208
- from fingerprint_pro_server_api_sdk import EventResponse
209
- from fingerprint_pro_server_api_sdk.sealed import unseal_events_response, DecryptionKey, DecryptionAlgorithm
210
+ from fingerprint_pro_server_api_sdk import unseal_event_response, DecryptionKey, DecryptionAlgorithm
210
211
 
211
212
  load_dotenv()
212
213
 
@@ -214,8 +215,8 @@ sealed_result = base64.b64decode(os.environ["BASE64_SEALED_RESULT"])
214
215
  key = base64.b64decode(os.environ["BASE64_KEY"])
215
216
 
216
217
  try:
217
- events_response: EventResponse = unseal_events_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
218
- print("\n\n\nEvent response: \n", events_response.products)
218
+ event_response = unseal_event_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
219
+ print("\n\n\nEvent response: \n", event_response.products)
219
220
  except Exception as e:
220
221
  print("Exception when calling unsealing events response: %s\n" % e)
221
222
  exit(1)
@@ -26,7 +26,7 @@ The Fingerprint Server Python SDK is an easy way to interact with the Fingerprin
26
26
  This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project:
27
27
 
28
28
  - API version: 3
29
- - Package version: 7.0.0.dev1
29
+ - Package version: 7.0.0.dev2
30
30
  - Build package: io.swagger.codegen.v3.generators.python.PythonClientCodegen
31
31
 
32
32
  ## Requirements
@@ -182,8 +182,7 @@ import os
182
182
 
183
183
  from dotenv import load_dotenv
184
184
 
185
- from fingerprint_pro_server_api_sdk import EventResponse
186
- from fingerprint_pro_server_api_sdk.sealed import unseal_events_response, DecryptionKey, DecryptionAlgorithm
185
+ from fingerprint_pro_server_api_sdk import unseal_event_response, DecryptionKey, DecryptionAlgorithm
187
186
 
188
187
  load_dotenv()
189
188
 
@@ -191,8 +190,8 @@ sealed_result = base64.b64decode(os.environ["BASE64_SEALED_RESULT"])
191
190
  key = base64.b64decode(os.environ["BASE64_KEY"])
192
191
 
193
192
  try:
194
- events_response: EventResponse = unseal_events_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
195
- print("\n\n\nEvent response: \n", events_response.products)
193
+ event_response = unseal_event_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
194
+ print("\n\n\nEvent response: \n", event_response.products)
196
195
  except Exception as e:
197
196
  print("Exception when calling unsealing events response: %s\n" % e)
198
197
  exit(1)
@@ -113,3 +113,5 @@ from fingerprint_pro_server_api_sdk.models.vpn_result_methods import VpnResultMe
113
113
  from fingerprint_pro_server_api_sdk.models.webhook_visit import WebhookVisit
114
114
  # import custom methods into sdk package
115
115
  from fingerprint_pro_server_api_sdk.webhook import Webhook
116
+ from fingerprint_pro_server_api_sdk.sealed import ApiClientDeserializer, DecryptionAlgorithm, DecryptionKey, \
117
+ UnsealError, UnsealAggregateError, unseal_event_response
@@ -109,7 +109,7 @@ class FingerprintApi:
109
109
  if 'visitor_id' in params:
110
110
  path_params['visitor_id'] = params['visitor_id'] # noqa: E501
111
111
 
112
- query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev1')]
112
+ query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev2')]
113
113
 
114
114
  header_params = {}
115
115
 
@@ -219,7 +219,7 @@ class FingerprintApi:
219
219
  if 'request_id' in params:
220
220
  path_params['request_id'] = params['request_id'] # noqa: E501
221
221
 
222
- query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev1')]
222
+ query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev2')]
223
223
 
224
224
  header_params = {}
225
225
 
@@ -338,7 +338,7 @@ class FingerprintApi:
338
338
  if 'visitor_id' in params:
339
339
  path_params['visitor_id'] = params['visitor_id'] # noqa: E501
340
340
 
341
- query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev1')]
341
+ query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev2')]
342
342
  if 'request_id' in params:
343
343
  query_params.append(('request_id', params['request_id'])) # noqa: E501
344
344
  if 'linked_id' in params:
@@ -458,7 +458,7 @@ class FingerprintApi:
458
458
  if 'request_id' in params:
459
459
  path_params['request_id'] = params['request_id'] # noqa: E501
460
460
 
461
- query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev1')]
461
+ query_params = [('ii', 'fingerprint-pro-server-python-sdk/7.0.0.dev2')]
462
462
 
463
463
  header_params = {}
464
464
 
@@ -25,6 +25,18 @@ from fingerprint_pro_server_api_sdk import rest
25
25
  from fingerprint_pro_server_api_sdk.rest import ApiException, RESTResponse
26
26
  from fingerprint_pro_server_api_sdk.base_model import BaseModel
27
27
 
28
+ PRIMITIVE_TYPES = (float, bool, bytes, str, int)
29
+ NATIVE_TYPES_MAPPING = {
30
+ 'int': int,
31
+ 'long': int,
32
+ 'float': float,
33
+ 'str': str,
34
+ 'bool': bool,
35
+ 'date': date,
36
+ 'datetime': datetime,
37
+ 'object': object,
38
+ }
39
+
28
40
 
29
41
  class ApiClient:
30
42
  """Generic API client for Swagger client library builds.
@@ -46,18 +58,6 @@ class ApiClient:
46
58
  to the API
47
59
  """
48
60
 
49
- PRIMITIVE_TYPES = (float, bool, bytes, str, int)
50
- NATIVE_TYPES_MAPPING = {
51
- 'int': int,
52
- 'long': int,
53
- 'float': float,
54
- 'str': str,
55
- 'bool': bool,
56
- 'date': date,
57
- 'datetime': datetime,
58
- 'object': object,
59
- }
60
-
61
61
  def __init__(self, configuration: Optional[Configuration] = None, header_name: Optional[str] = None,
62
62
  header_value: Optional[str] = None, cookie: Optional[str] = None, pool: Optional[Pool] = None):
63
63
  if configuration is None:
@@ -79,7 +79,7 @@ class ApiClient:
79
79
  self.default_headers[header_name] = header_value
80
80
  self.cookie = cookie
81
81
  # Set default User-Agent.
82
- self.user_agent = 'Swagger-Codegen/7.0.0.dev1/python'
82
+ self.user_agent = 'Swagger-Codegen/7.0.0.dev2/python'
83
83
 
84
84
  def __del__(self):
85
85
  self.pool.close()
@@ -197,7 +197,7 @@ class ApiClient:
197
197
  """
198
198
  if obj is None:
199
199
  return None
200
- elif isinstance(obj, self.PRIMITIVE_TYPES):
200
+ elif isinstance(obj, PRIMITIVE_TYPES):
201
201
  return obj
202
202
  elif isinstance(obj, list):
203
203
  return [self.sanitize_for_serialization(sub_obj)
@@ -251,46 +251,7 @@ class ApiClient:
251
251
  except ValueError:
252
252
  data = response.data
253
253
 
254
- return self.__deserialize(data, response_type)
255
-
256
- def __deserialize(self, data: Union[Dict, List, str], klass: Any):
257
- """Deserializes dict, list, str into an object.
258
-
259
- :param data: dict, list or str.
260
- :param klass: class literal, or string of class name.
261
-
262
- :return: object.
263
- """
264
- if data is None:
265
- return None
266
-
267
- if type(klass) == str:
268
- if klass.startswith('list['):
269
- sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
270
- return [self.__deserialize(sub_data, sub_kls)
271
- for sub_data in data]
272
-
273
- if klass.startswith('dict('):
274
- sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2)
275
- return {k: self.__deserialize(v, sub_kls)
276
- for k, v in data.items()}
277
-
278
- # convert str to class
279
- if klass in self.NATIVE_TYPES_MAPPING:
280
- klass = self.NATIVE_TYPES_MAPPING[klass]
281
- else:
282
- klass = getattr(fingerprint_pro_server_api_sdk.models, klass)
283
-
284
- if klass in self.PRIMITIVE_TYPES:
285
- return self.__deserialize_primitive(data, klass)
286
- elif klass == object:
287
- return data
288
- elif klass == date:
289
- return self.__deserialize_date(data)
290
- elif klass == datetime:
291
- return self.__deserialize_datatime(data)
292
- else:
293
- return self.__deserialize_model(data, klass)
254
+ return ApiClientDeserializer.deserialize(data, response_type)
294
255
 
295
256
  def call_api(self, resource_path: str, method: str, path_params: Optional[Dict[str, Any]] = None,
296
257
  query_params: Optional[List[Tuple[str, Any]]] = None, header_params: Optional[Dict[str, Any]] = None,
@@ -515,7 +476,51 @@ class ApiClient:
515
476
  f.write(response_data)
516
477
  return path
517
478
 
518
- def __deserialize_primitive(self, data, klass):
479
+
480
+ class ApiClientDeserializer:
481
+ """Deserializes server response into appropriate type."""
482
+ @staticmethod
483
+ def deserialize(data: Union[Dict, List, str], klass: Any):
484
+ """Deserializes dict, list, str into an object.
485
+
486
+ :param data: dict, list or str.
487
+ :param klass: class literal, or string of class name.
488
+
489
+ :return: object.
490
+ """
491
+ if data is None:
492
+ return None
493
+
494
+ if type(klass) == str:
495
+ if klass.startswith('list['):
496
+ sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
497
+ return [ApiClientDeserializer.deserialize(sub_data, sub_kls)
498
+ for sub_data in data]
499
+
500
+ if klass.startswith('dict('):
501
+ sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2)
502
+ return {k: ApiClientDeserializer.deserialize(v, sub_kls)
503
+ for k, v in data.items()}
504
+
505
+ # convert str to class
506
+ if klass in NATIVE_TYPES_MAPPING:
507
+ klass = NATIVE_TYPES_MAPPING[klass]
508
+ else:
509
+ klass = getattr(fingerprint_pro_server_api_sdk.models, klass)
510
+
511
+ if klass in PRIMITIVE_TYPES:
512
+ return ApiClientDeserializer.__deserialize_primitive(data, klass)
513
+ elif klass == object:
514
+ return data
515
+ elif klass == date:
516
+ return ApiClientDeserializer.__deserialize_date(data)
517
+ elif klass == datetime:
518
+ return ApiClientDeserializer.__deserialize_datatime(data)
519
+ else:
520
+ return ApiClientDeserializer.__deserialize_model(data, klass)
521
+
522
+ @staticmethod
523
+ def __deserialize_primitive(data, klass):
519
524
  """Deserializes string to primitive type.
520
525
 
521
526
  :param data: str.
@@ -530,7 +535,8 @@ class ApiClient:
530
535
  except TypeError:
531
536
  return data
532
537
 
533
- def __deserialize_date(self, string: str) -> date:
538
+ @staticmethod
539
+ def __deserialize_date(string: str) -> date:
534
540
  """Deserializes string to date.
535
541
 
536
542
  :param string: str.
@@ -546,7 +552,8 @@ class ApiClient:
546
552
  reason="Failed to parse `{0}` as date object".format(string)
547
553
  )
548
554
 
549
- def __deserialize_datatime(self, string: str) -> datetime:
555
+ @staticmethod
556
+ def __deserialize_datatime(string: str) -> datetime:
550
557
  """Deserializes string to datetime.
551
558
 
552
559
  The string should be in iso8601 datetime format.
@@ -567,10 +574,12 @@ class ApiClient:
567
574
  )
568
575
  )
569
576
 
570
- def __hasattr(self, object, name):
577
+ @staticmethod
578
+ def __hasattr(object, name):
571
579
  return name in object.__class__.__dict__
572
580
 
573
- def __deserialize_model(self, data, klass):
581
+ @staticmethod
582
+ def __deserialize_model(data, klass):
574
583
  """Deserializes list or dict to model.
575
584
 
576
585
  :param data: dict, list.
@@ -578,7 +587,7 @@ class ApiClient:
578
587
  :return: model object.
579
588
  """
580
589
 
581
- if not klass.swagger_types and not self.__hasattr(klass, 'get_real_child_model'):
590
+ if not klass.swagger_types and not ApiClientDeserializer.__hasattr(klass, 'get_real_child_model'):
582
591
  return data
583
592
 
584
593
  kwargs = {}
@@ -588,7 +597,7 @@ class ApiClient:
588
597
  klass.attribute_map[attr] in data and
589
598
  isinstance(data, (list, dict))):
590
599
  value = data[klass.attribute_map[attr]]
591
- kwargs[attr] = self.__deserialize(value, attr_type)
600
+ kwargs[attr] = ApiClientDeserializer.deserialize(value, attr_type)
592
601
 
593
602
  instance = klass(**kwargs)
594
603
 
@@ -598,8 +607,8 @@ class ApiClient:
598
607
  for key, value in data.items():
599
608
  if key not in klass.swagger_types:
600
609
  instance[key] = value
601
- if self.__hasattr(instance, 'get_real_child_model'):
610
+ if ApiClientDeserializer.__hasattr(instance, 'get_real_child_model'):
602
611
  klass_name = instance.get_real_child_model(data)
603
612
  if klass_name:
604
- instance = self.__deserialize(data, klass_name)
613
+ instance = ApiClientDeserializer.deserialize(data, klass_name)
605
614
  return instance
@@ -210,5 +210,5 @@ class Configuration:
210
210
  "OS: {env}\n"\
211
211
  "Python Version: {pyversion}\n"\
212
212
  "Version of the API: 3\n"\
213
- "SDK Package Version: 7.0.0.dev1".\
213
+ "SDK Package Version: 7.0.0.dev2".\
214
214
  format(env=sys.platform, pyversion=sys.version)
@@ -1,8 +1,11 @@
1
1
  import json
2
+ from typing import List
3
+
2
4
  from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
3
5
  from cryptography.hazmat.backends import default_backend
4
6
  import zlib
5
7
 
8
+ from fingerprint_pro_server_api_sdk.api_client import ApiClientDeserializer
6
9
  from fingerprint_pro_server_api_sdk.models.event_response import EventResponse
7
10
 
8
11
  SEALED_HEADER = bytes([0x9e, 0x85, 0xdc, 0xed])
@@ -12,41 +15,53 @@ DecryptionAlgorithm = {
12
15
 
13
16
 
14
17
  class DecryptionKey:
15
- def __init__(self, key, algorithm):
18
+ """Key for decryption of sealed data."""
19
+ exception: Exception
20
+ algorithm: str
21
+
22
+ def __init__(self, key: bytes, algorithm: str):
16
23
  self.key = key
17
24
  self.algorithm = algorithm
18
25
 
19
26
 
20
27
  class UnsealError(Exception):
28
+ """Error during unsealing."""
21
29
  exception: Exception
22
30
  key: DecryptionKey
23
31
 
24
- def __init__(self, exception, key):
32
+ def __init__(self, exception: Exception, key: DecryptionKey):
25
33
  self.exception = exception
26
34
  self.key = key
27
35
 
28
36
 
29
37
  class UnsealAggregateError(Exception):
30
- def __init__(self, errors):
38
+ """Aggregated error during unsealing."""
39
+ errors: List[UnsealError]
40
+
41
+ def __init__(self, errors: List[UnsealError]):
31
42
  self.errors = errors
32
43
  super().__init__("Unable to decrypt sealed data")
33
44
 
34
45
 
35
- def parse_events_response(unsealed):
36
- json_data = json.loads(unsealed)
46
+ def unseal_event_response(sealed_data: bytes, decryption_keys: List[DecryptionKey]) -> EventResponse:
47
+ """Unseal event response with one of the provided keys."""
48
+ unsealed = __unseal(sealed_data, decryption_keys)
49
+ return __parse_event_response(unsealed)
37
50
 
38
- if 'products' not in json_data:
39
- raise ValueError('Sealed data is not valid events response')
40
51
 
41
- return EventResponse(json_data['products'])
52
+ def __parse_event_response(unsealed: str) -> EventResponse:
53
+ """Parse event response from unsealed data."""
54
+ json_data = json.loads(unsealed)
42
55
 
56
+ if 'products' not in json_data:
57
+ raise ValueError('Sealed data is not valid event response')
43
58
 
44
- def unseal_events_response(sealed_data, decryption_keys):
45
- unsealed = unseal(sealed_data, decryption_keys)
46
- return parse_events_response(unsealed)
59
+ result: EventResponse = ApiClientDeserializer.deserialize(json_data, 'EventResponse')
60
+ return result
47
61
 
48
62
 
49
- def unseal(sealed_data, decryption_keys):
63
+ def __unseal(sealed_data: bytes, decryption_keys: List[DecryptionKey]) -> str:
64
+ """Unseal data with one of the provided keys."""
50
65
  if sealed_data[:len(SEALED_HEADER)].hex() != SEALED_HEADER.hex():
51
66
  raise ValueError('Invalid sealed data header')
52
67
 
@@ -54,7 +69,7 @@ def unseal(sealed_data, decryption_keys):
54
69
  for decryption_key in decryption_keys:
55
70
  if decryption_key.algorithm == DecryptionAlgorithm['Aes256Gcm']:
56
71
  try:
57
- return unseal_aes256gcm(sealed_data, decryption_key.key)
72
+ return __unseal_aes256gcm(sealed_data, decryption_key.key)
58
73
  except Exception as e:
59
74
  errors.append(UnsealError(e, decryption_key))
60
75
  continue
@@ -64,7 +79,8 @@ def unseal(sealed_data, decryption_keys):
64
79
  raise UnsealAggregateError(errors)
65
80
 
66
81
 
67
- def unseal_aes256gcm(sealed_data, decryption_key):
82
+ def __unseal_aes256gcm(sealed_data: bytes, decryption_key: bytes) -> str:
83
+ """Unseal data with AES-256-GCM."""
68
84
  nonce_length = 12
69
85
  nonce = sealed_data[len(SEALED_HEADER):len(SEALED_HEADER) + nonce_length]
70
86
 
@@ -1,11 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fingerprint-pro-server-api-sdk
3
- Version: 7.0.0.dev1
3
+ Version: 7.0.0.dev2
4
4
  Summary: Fingerprint Pro Server API allows you to get information about visitors and about individual events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios. Server API is intended for server-side usage, it's not intended to be used from the client side, whether it's a browser or a mobile device.
5
- Home-page: https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk
6
5
  Author: Fingerprint
7
6
  Author-email: support@fingerprint.com
8
7
  License: MIT
8
+ Project-URL: Changelog, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/blob/main/CHANGELOG.md
9
+ Project-URL: Code, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk
10
+ Project-URL: Issue Tracker, https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/issues
9
11
  Keywords: Swagger,Fingerprint Pro Server API,browser,detection,fingerprint,identification,fingerprinting,browser-fingerprinting,browser-fingerprint,fraud-detection,fraud,audio-fingerprinting,fingerprintjs,fingerprintjs-pro,visitor-identifier
10
12
  Classifier: Development Status :: 5 - Production/Stable
11
13
  Classifier: Intended Audience :: Developers
@@ -49,7 +51,7 @@ The Fingerprint Server Python SDK is an easy way to interact with the Fingerprin
49
51
  This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project:
50
52
 
51
53
  - API version: 3
52
- - Package version: 7.0.0.dev1
54
+ - Package version: 7.0.0.dev2
53
55
  - Build package: io.swagger.codegen.v3.generators.python.PythonClientCodegen
54
56
 
55
57
  ## Requirements
@@ -205,8 +207,7 @@ import os
205
207
 
206
208
  from dotenv import load_dotenv
207
209
 
208
- from fingerprint_pro_server_api_sdk import EventResponse
209
- from fingerprint_pro_server_api_sdk.sealed import unseal_events_response, DecryptionKey, DecryptionAlgorithm
210
+ from fingerprint_pro_server_api_sdk import unseal_event_response, DecryptionKey, DecryptionAlgorithm
210
211
 
211
212
  load_dotenv()
212
213
 
@@ -214,8 +215,8 @@ sealed_result = base64.b64decode(os.environ["BASE64_SEALED_RESULT"])
214
215
  key = base64.b64decode(os.environ["BASE64_KEY"])
215
216
 
216
217
  try:
217
- events_response: EventResponse = unseal_events_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
218
- print("\n\n\nEvent response: \n", events_response.products)
218
+ event_response = unseal_event_response(sealed_result, [DecryptionKey(key, DecryptionAlgorithm['Aes256Gcm'])])
219
+ print("\n\n\nEvent response: \n", event_response.products)
219
220
  except Exception as e:
220
221
  print("Exception when calling unsealing events response: %s\n" % e)
221
222
  exit(1)
@@ -1,5 +1,5 @@
1
1
  [metadata]
2
- version = 7.0.0.dev1
2
+ version = 7.0.0.dev2
3
3
 
4
4
  [egg_info]
5
5
  tag_build =
@@ -45,7 +45,11 @@ setup(
45
45
  license_files=["LICENSE"],
46
46
  author="Fingerprint",
47
47
  author_email="support@fingerprint.com",
48
- url="https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk",
48
+ project_urls={
49
+ "Changelog": "https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/blob/main/CHANGELOG.md",
50
+ "Code": "https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk",
51
+ "Issue Tracker": "https://github.com/fingerprintjs/fingerprint-pro-server-api-python-sdk/issues",
52
+ },
49
53
  keywords=["Swagger", "Fingerprint Pro Server API", "browser", "detection", "fingerprint", "identification",
50
54
  "fingerprinting", "browser-fingerprinting", "browser-fingerprint", "fraud-detection", "fraud",
51
55
  "audio-fingerprinting", "fingerprintjs", "fingerprintjs-pro", "visitor-identifier"],
@@ -25,7 +25,7 @@ from urllib.parse import urlencode
25
25
 
26
26
  API_KEY = 'private_key'
27
27
 
28
- VERSION = '7.0.0.dev1'
28
+ VERSION = '7.0.0.dev2'
29
29
 
30
30
 
31
31
  class MockPoolManager(object):
@@ -3,10 +3,9 @@ import io
3
3
  import json
4
4
  import unittest
5
5
 
6
- from fingerprint_pro_server_api_sdk import EventResponse
7
- from fingerprint_pro_server_api_sdk.sealed import DecryptionAlgorithm, DecryptionKey, unseal_events_response, \
8
- UnsealError, UnsealAggregateError
9
-
6
+ from fingerprint_pro_server_api_sdk import ApiClientDeserializer, DecryptionAlgorithm, DecryptionKey, \
7
+ unseal_event_response, UnsealError, UnsealAggregateError, EventResponse, ProductsResponse, \
8
+ ProductsResponseIdentification, BrowserDetails
10
9
 
11
10
  class TestSealed(unittest.TestCase):
12
11
  valid_key = base64.b64decode('p2PA7MGy5tx56cnyJaFZMr96BCFwZeHjZV2EqMvTq53=')
@@ -14,24 +13,28 @@ class TestSealed(unittest.TestCase):
14
13
 
15
14
  def test_unseal_aes256gcm(self):
16
15
  with io.open("./test/mocks/sealed_result.json", 'r', encoding='utf-8') as f:
17
- expected_result = EventResponse(json.load(f)['products'])
16
+ expected_result = ApiClientDeserializer.deserialize(json.load(f), 'EventResponse')
18
17
 
19
18
  sealed_data = base64.b64decode(
20
19
  'noXc7SXO+mqeAGrvBMgObi/S0fXTpP3zupk8qFqsO/1zdtWCD169iLA3VkkZh9ICHpZ0oWRzqG0M9/TnCeKFohgBLqDp6O0zEfXOv6i5q++aucItznQdLwrKLP+O0blfb4dWVI8/aSbd4ELAZuJJxj9bCoVZ1vk+ShbUXCRZTD30OIEAr3eiG9aw00y1UZIqMgX6CkFlU9L9OnKLsNsyomPIaRHTmgVTI5kNhrnVNyNsnzt9rY7fUD52DQxJILVPrUJ1Q+qW7VyNslzGYBPG0DyYlKbRAomKJDQIkdj/Uwa6bhSTq4XYNVvbk5AJ/dGwvsVdOnkMT2Ipd67KwbKfw5bqQj/cw6bj8Cp2FD4Dy4Ud4daBpPRsCyxBM2jOjVz1B/lAyrOp8BweXOXYugwdPyEn38MBZ5oL4D38jIwR/QiVnMHpERh93jtgwh9Abza6i4/zZaDAbPhtZLXSM5ztdctv8bAb63CppLU541Kf4OaLO3QLvfLRXK2n8bwEwzVAqQ22dyzt6/vPiRbZ5akh8JB6QFXG0QJF9DejsIspKF3JvOKjG2edmC9o+GfL3hwDBiihYXCGY9lElZICAdt+7rZm5UxMx7STrVKy81xcvfaIp1BwGh/HyMsJnkE8IczzRFpLlHGYuNDxdLoBjiifrmHvOCUDcV8UvhSV+UAZtAVejdNGo5G/bz0NF21HUO4pVRPu6RqZIs/aX4hlm6iO/0Ru00ct8pfadUIgRcephTuFC2fHyZxNBC6NApRtLSNLfzYTTo/uSjgcu6rLWiNo5G7yfrM45RXjalFEFzk75Z/fu9lCJJa5uLFgDNKlU+IaFjArfXJCll3apbZp4/LNKiU35ZlB7ZmjDTrji1wLep8iRVVEGht/DW00MTok7Zn7Fv+MlxgWmbZB3BuezwTmXb/fNw==')
21
20
 
22
- result = unseal_events_response(sealed_data, [
21
+ result = unseal_event_response(sealed_data, [
23
22
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
24
23
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
25
24
  ])
26
25
 
27
26
  self.assertEqual(result, expected_result)
27
+ self.assertIsInstance(result, EventResponse)
28
+ self.assertIsInstance(result.products, ProductsResponse)
29
+ self.assertIsInstance(result.products.identification, ProductsResponseIdentification)
30
+ self.assertIsInstance(result.products.identification.data.browser_details, BrowserDetails)
28
31
 
29
32
  def test_unseal_invalid_header(self):
30
33
  sealed_data = base64.b64decode(
31
34
  'xzXc7SXO+mqeAGrvBMgObi/S0fXTpP3zupk8qFqsO/1zdtWCD169iLA3VkkZh9ICHpZ0oWRzqG0M9/TnCeKFohgBLqDp6O0zEfXOv6i5q++aucItznQdLwrKLP+O0blfb4dWVI8/aSbd4ELAZuJJxj9bCoVZ1vk+ShbUXCRZTD30OIEAr3eiG9aw00y1UZIqMgX6CkFlU9L9OnKLsNsyomPIaRHTmgVTI5kNhrnVNyNsnzt9rY7fUD52DQxJILVPrUJ1Q+qW7VyNslzGYBPG0DyYlKbRAomKJDQIkdj/Uwa6bhSTq4XYNVvbk5AJ/dGwvsVdOnkMT2Ipd67KwbKfw5bqQj/cw6bj8Cp2FD4Dy4Ud4daBpPRsCyxBM2jOjVz1B/lAyrOp8BweXOXYugwdPyEn38MBZ5oL4D38jIwR/QiVnMHpERh93jtgwh9Abza6i4/zZaDAbPhtZLXSM5ztdctv8bAb63CppLU541Kf4OaLO3QLvfLRXK2n8bwEwzVAqQ22dyzt6/vPiRbZ5akh8JB6QFXG0QJF9DejsIspKF3JvOKjG2edmC9o+GfL3hwDBiihYXCGY9lElZICAdt+7rZm5UxMx7STrVKy81xcvfaIp1BwGh/HyMsJnkE8IczzRFpLlHGYuNDxdLoBjiifrmHvOCUDcV8UvhSV+UAZtAVejdNGo5G/bz0NF21HUO4pVRPu6RqZIs/aX4hlm6iO/0Ru00ct8pfadUIgRcephTuFC2fHyZxNBC6NApRtLSNLfzYTTo/uSjgcu6rLWiNo5G7yfrM45RXjalFEFzk75Z/fu9lCJJa5uLFgDNKlU+IaFjArfXJCll3apbZp4/LNKiU35ZlB7ZmjDTrji1wLep8iRVVEGht/DW00MTok7Zn7Fv+MlxgWmbZB3BuezwTmXb/fNw==')
32
35
 
33
- with self.assertRaisesRegex(Exception, "Invalid sealed data header"):
34
- unseal_events_response(sealed_data, [
36
+ with self.assertRaisesRegex(ValueError, "Invalid sealed data header"):
37
+ unseal_event_response(sealed_data, [
35
38
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
36
39
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
37
40
  ])
@@ -40,8 +43,8 @@ class TestSealed(unittest.TestCase):
40
43
  sealed_data = base64.b64decode(
41
44
  'noXc7SXO+mqeAGrvBMgObi/S0fXTpP3zupk8qFqsO/1zdtWCD169iLA3VkkZh9ICHpZ0oWRzqG0M9/TnCeKFohgBLqDp6O0zEfXOv6i5q++aucItznQdLwrKLP+O0blfb4dWVI8/aSbd4ELAZuJJxj9bCoVZ1vk+ShbUXCRZTD30OIEAr3eiG9aw00y1UZIqMgX6CkFlU9L9OnKLsNsyomPIaRHTmgVTI5kNhrnVNyNsnzt9rY7fUD52DQxJILVPrUJ1Q+qW7VyNslzGYBPG0DyYlKbRAomKJDQIkdj/Uwa6bhSTq4XYNVvbk5AJ/dGwvsVdOnkMT2Ipd67KwbKfw5bqQj/cw6bj8Cp2FD4Dy4Ud4daBpPRsCyxBM2jOjVz1B/lAyrOp8BweXOXYugwdPyEn38MBZ5oL4D38jIwR/QiVnMHpERh93jtgwh9Abza6i4/zZaDAbPhtZLXSM5ztdctv8bAb63CppLU541Kf4OaLO3QLvfLRXK2n8bwEwzVAqQ22dyzt6/vPiRbZ5akh8JB6QFXG0QJF9DejsIspKF3JvOKjG2edmC9o+GfL3hwDBiihYXCGY9lElZICAdt+7rZm5UxMx7STrVKy81xcvfaIp1BwGh/HyMsJnkE8IczzRFpLlHGYuNDxdLoBjiifrmHvOCUDcV8UvhSV+UAZtAVejdNGo5G/bz0NF21HUO4pVRPu6RqZIs/aX4hlm6iO/0Ru00ct8pfadUIgRcephTuFC2fHyZxNBC6NApRtLSNLfzYTTo/uSjgcu6rLWiNo5G7yfrM45RXjalFEFzk75Z/fu9lCJJa5uLFgDNKlU+IaFjArfXJCll3apbZp4/LNKiU35ZlB7ZmjDTrji1wLep8iRVVEGht/DW00MTok7Zn7Fv+MlxgWmbZB3BuezwTmXb/fNw==')
42
45
 
43
- with self.assertRaisesRegex(Exception, "Unsupported decryption algorithm: invalid"):
44
- unseal_events_response(sealed_data, [
46
+ with self.assertRaisesRegex(ValueError, "Unsupported decryption algorithm: invalid"):
47
+ unseal_event_response(sealed_data, [
45
48
  DecryptionKey(self.invalid_key, 'invalid'),
46
49
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
47
50
  ])
@@ -51,8 +54,8 @@ class TestSealed(unittest.TestCase):
51
54
  # "{\"invalid\":true}"
52
55
  'noXc7VOpBstjjcavDKSKr4HTavt4mdq8h6NC32T0hUtw9S0jXT8lPjZiWL8SyHxmrF3uTGqO+g==')
53
56
 
54
- with self.assertRaisesRegex(Exception, "Sealed data is not valid events response"):
55
- unseal_events_response(sealed_data, [
57
+ with self.assertRaisesRegex(ValueError, "Sealed data is not valid event response"):
58
+ unseal_event_response(sealed_data, [
56
59
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
57
60
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
58
61
  ])
@@ -61,8 +64,8 @@ class TestSealed(unittest.TestCase):
61
64
  sealed_data = base64.b64decode(
62
65
  'noXc7dtuk0smGE+ZbaoXzrp6Rq8ySxLepejTsu7+jUXlPhV1w+WuHx9gbPhaENJnOQo8BcGmsaRhL5k2NVj+DRNzYO9cQD7wHxmXKCyTbl/dvSYOMoHziUZ2VbQ7tmaorFny26v8jROr/UBGfvPE0dLKC36IN9ZlJ3X0NZJO8SY+8bCr4mTrkVZsv/hpvZp+OjC4h7e5vxcpmnBWXzxfaO79Lq3aMRIEf9XfK7/bVIptHaEqtPKCTwl9rz1KUpUUNQSHTPM0NlqJe9bjYf5mr1uYvWHhcJoXSyRyVMxIv/quRiw3SKJzAMOTBiAvFICpWuRFa+T/xIMHK0g96w/IMQo0jdY1E067ZEvBUOBmsJnGJg1LllS3rbJVe+E2ClFNL8SzFphyvtlcfvYB+SVSD4bzI0w/YCldv5Sq42BFt5bn4n4aE5A6658DYsfSRYWqP6OpqPJx96cY34W7H1t/ZG0ulez6zF5NvWhc1HDQ1gMtXd+K/ogt1n+FyFtn8xzvtSGkmrc2jJgYNI5Pd0Z0ent73z0MKbJx9v2ta/emPEzPr3cndN5amdr6TmRkDU4bq0vyhAh87DJrAnJQLdrvYLddnrr8xTdeXxj1i1Yug6SGncPh9sbTYkdOfuamPAYOuiJVBAMcfYsYEiQndZe8mOQ4bpCr+hxAAqixhZ16pQ8CeUwa247+D2scRymLB8qJXlaERuFZtWGVAZ8VP/GS/9EXjrzpjGX9vlrIPeJP8fh2S5QPzw55cGNJ7JfAdOyManXnoEw2/QzDhSZQARVl+akFgSO0Y13YmbiL7H6HcKWGcJ2ipDKIaj2fJ7GE0Vzyt+CBEezSQR99Igd8x3p2JtvsVKp35iLPksjS1VqtSCTbuIRUlINlfQHNjeQiE/B/61jo3Mf7SmjYjqtvXt5e9RKb+CQku2qH4ZU8xN3DSg+4mLom3BgKBkm/MoyGBpMK41c96d2tRp3tp4hV0F6ac02Crg7P2lw8IUct+i2VJ8VUjcbRfTIPQs0HjNjM6/gLfLCkWOHYrlFjwusXWQCJz91Kq+hVxj7M9LtplPO4AUq6RUMNhlPGUmyOI2tcUMrjq9vMLXGlfdkH185zM4Mk+O7DRLC8683lXZFZvcBEmxr855PqLLH/9SpYKHBoGRatDRdQe3oRp6gHS0jpQ1SW/si4kvLKiUNjiBExvbQVOUV7/VFXvG1RpM9wbzSoOd40gg7ZzD/72QshUC/25DkM/Pm7RBzwtjgmnRKjT+mROeC/7VQLoz3amv09O8Mvbt+h/lX5+51Q834F7NgIGagbB20WtWcMtrmKrvCEZlaoiZrmYVSbi1RfknRK7CTPJkopw9IjO7Ut2EhKZ+jL4rwk6TlVm6EC6Kuj7KNqp6wB/UNe9eM2Eym/aiHAcja8XN4YQhSIuJD2Wxb0n3LkKnAjK1/GY65c8K6rZsVYQ0MQL1j4lMl0UZPjG/vzKyetIsVDyXc4J9ZhOEMYnt/LaxEeSt4EMJGBA9wpTmz33X4h3ij0Y3DY/rH7lrEScUknw20swTZRm5T6q1bnimj7M1OiOkebdI09MZ0nyaTWRHdB7B52C/moh89Q7qa2Fulp5h8Us1FYRkWBLt37a5rGI1IfVeP38KaPbagND+XzWpNqX4HVrAVPLQVK5EwUvGamED3ooJ0FMieTc0IH0N+IeUYG7Q8XmrRVBcw32W8pEfYLO9L71An/J0jQZCIP8DuQnUG0mOvunOuloBGvP/9LvkBlkamh68F0a5f5ny1jloyIFJhRh5dt2SBlbsXS9AKqUwARYSSsA9Ao4WJWOZMyjp8A+qIBAfW65MdhhUDKYMBgIAbMCc3uiptzElQQopE5TT5xIhwfYxa503jVzQbz1Q==')
63
66
 
64
- with self.assertRaisesRegex(Exception, "Unable to decrypt sealed data") as context:
65
- unseal_events_response(sealed_data, [
67
+ with self.assertRaisesRegex(UnsealAggregateError, "Unable to decrypt sealed data") as context:
68
+ unseal_event_response(sealed_data, [
66
69
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
67
70
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
68
71
  ])
@@ -76,8 +79,8 @@ class TestSealed(unittest.TestCase):
76
79
  sealed_data = base64.b64decode(
77
80
  'noXc7SXO+mqeAGrvBMgObi/S0fXTpP3zupk8qFqsO/1zdtWCD169iLA3VkkZh9ICHpZ0oWRzqG0M9/TnCeKFohgBLqDp6O0zEfXOv6i5q++aucItznQdLwrKLP+O0blfb4dWVI8/aSbd4ELAZuJJxj9bCoVZ1vk+ShbUXCRZTD30OIEAr3eiG9aw00y1UZIqMgX6CkFlU9L9OnKLsNsyomPIaRHTmgVTI5kNhrnVNyNsnzt9rY7fUD52DQxJILVPrUJ1Q+qW7VyNslzGYBPG0DyYlKbRAomKJDQIkdj/Uwa6bhSTq4XYNVvbk5AJ/dGwvsVdOnkMT2Ipd67KwbKfw5bqQj/cw6bj8Cp2FD4Dy4Ud4daBpPRsCyxBM2jOjVz1B/lAyrOp8BweXOXYugwdPyEn38MBZ5oL4D38jIwR/QiVnMHpERh93jtgwh9Abza6i4/zZaDAbPhtZLXSM5ztdctv8bAb63CppLU541Kf4OaLO3QLvfLRXK2n8bwEwzVAqQ22dyzt6/vPiRbZ5akh8JB6QFXG0QJF9DejsIspKF3JvOKjG2edmC9o+GfL3hwDBiihYXCGY9lElZICAdt+7rZm5UxMx7STrVKy81xcvfaIp1BwGh/HyMsJnkE8IczzRFpLlHGYuNDxdLoBjiifrmHvOCUDcV8UvhSV+UAZtAVejdNGo5G/bz0NF21HUO4pVRPu6RqZIs/aX4hlm6iO/0Ru00ct8pfadUIgRcephTuFC2fHyZxNBC6NApRtLSNLfzYTTo/uSjgcu6rLWiNo5G7yfrM45RXjalFEFzk75Z/fu9lCJJa5uLFgDNKlU+IaFjArfXJCll3apbZp4/LNKiU35ZlB7ZmjDTrji1wLep8iRVVEGht/DW00MTok7Zn7Fv+MlxgWmbZB3BuezwTmXb/fNw==')
78
81
 
79
- with self.assertRaisesRegex(Exception, 'Unable to decrypt sealed data'):
80
- unseal_events_response(sealed_data, [
82
+ with self.assertRaisesRegex(UnsealAggregateError, 'Unable to decrypt sealed data'):
83
+ unseal_event_response(sealed_data, [
81
84
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
82
85
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
83
86
  ])
@@ -85,8 +88,8 @@ class TestSealed(unittest.TestCase):
85
88
  def test_unseal_empty_data(self):
86
89
  sealed_data = bytearray(b'')
87
90
 
88
- with self.assertRaisesRegex(Exception, 'Invalid sealed data header'):
89
- unseal_events_response(sealed_data, [
91
+ with self.assertRaisesRegex(ValueError, 'Invalid sealed data header'):
92
+ unseal_event_response(sealed_data, [
90
93
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
91
94
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
92
95
  ])
@@ -94,8 +97,8 @@ class TestSealed(unittest.TestCase):
94
97
  def test_unseal_invalid_nonce(self):
95
98
  sealed_data = bytes([0x9E, 0x85, 0xDC, 0xED, 0xAA, 0xBB, 0xCC])
96
99
 
97
- with self.assertRaisesRegex(Exception, 'Unable to decrypt sealed data') as context:
98
- unseal_events_response(sealed_data, [
100
+ with self.assertRaisesRegex(UnsealAggregateError, 'Unable to decrypt sealed data') as context:
101
+ unseal_event_response(sealed_data, [
99
102
  DecryptionKey(self.invalid_key, DecryptionAlgorithm['Aes256Gcm']),
100
103
  DecryptionKey(self.valid_key, DecryptionAlgorithm['Aes256Gcm']),
101
104
  ])