zscaler-sdk-python 1.7.5__tar.gz → 1.7.7__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 (426) hide show
  1. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/PKG-INFO +1 -1
  2. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/pyproject.toml +1 -1
  3. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/__init__.py +1 -1
  4. zscaler_sdk_python-1.7.7/zscaler/oneapi_oauth_client.py +444 -0
  5. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/oneapi_response.py +2 -3
  6. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/request_executor.py +10 -6
  7. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_firewall_rules.py +21 -3
  8. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dlp_web_rules.py +3 -1
  9. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/location_management.py +14 -4
  10. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/activation.py +4 -2
  11. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/ip_destination_groups.py +0 -5
  12. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/nw_service_groups.py +1 -1
  13. zscaler_sdk_python-1.7.5/zscaler/oneapi_oauth_client.py +0 -240
  14. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/LICENSE.md +0 -0
  15. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/README.md +0 -0
  16. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/api_client.py +0 -0
  17. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/cache/__init__.py +0 -0
  18. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/cache/cache.py +0 -0
  19. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/cache/no_op_cache.py +0 -0
  20. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/cache/zscaler_cache.py +0 -0
  21. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/config/__init__.py +0 -0
  22. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/config/config_setter.py +0 -0
  23. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/config/config_validator.py +0 -0
  24. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/constants.py +0 -0
  25. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/error_messages.py +0 -0
  26. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/errors/__init__.py +0 -0
  27. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/errors/error.py +0 -0
  28. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/errors/http_error.py +0 -0
  29. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/errors/response_checker.py +0 -0
  30. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/errors/zscaler_api_error.py +0 -0
  31. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/exceptions/__init__.py +0 -0
  32. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/exceptions/exceptions.py +0 -0
  33. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/helpers.py +0 -0
  34. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/logger.py +0 -0
  35. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/oneapi_client.py +0 -0
  36. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/oneapi_collection.py +0 -0
  37. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/oneapi_http_client.py +0 -0
  38. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/oneapi_object.py +0 -0
  39. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ratelimiter/__init__.py +0 -0
  40. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ratelimiter/ratelimiter.py +0 -0
  41. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/user_agent.py +0 -0
  42. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/utils.py +0 -0
  43. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/__init__.py +0 -0
  44. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/admin_user.py +0 -0
  45. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/company.py +0 -0
  46. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/devices.py +0 -0
  47. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/entitlements.py +0 -0
  48. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/fail_open_policy.py +0 -0
  49. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/forwarding_profile.py +0 -0
  50. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/legacy.py +0 -0
  51. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/admin_roles.py +0 -0
  52. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/admin_user.py +0 -0
  53. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/devices.py +0 -0
  54. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/failopenpolicy.py +0 -0
  55. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/forwardingprofile.py +0 -0
  56. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/getcompanyinfo.py +0 -0
  57. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/manage_pass.py +0 -0
  58. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/secrets_otp.py +0 -0
  59. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/secrets_passwords.py +0 -0
  60. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/trustednetworks.py +0 -0
  61. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/webappservice.py +0 -0
  62. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/webpolicy.py +0 -0
  63. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/webprivacy.py +0 -0
  64. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
  65. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
  66. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/secrets.py +0 -0
  67. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/trusted_networks.py +0 -0
  68. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/web_app_service.py +0 -0
  69. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/web_policy.py +0 -0
  70. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/web_privacy.py +0 -0
  71. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zcc/zcc_service.py +0 -0
  72. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/__init__.py +0 -0
  73. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/admin.py +0 -0
  74. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/alerts.py +0 -0
  75. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/apps.py +0 -0
  76. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/devices.py +0 -0
  77. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/inventory.py +0 -0
  78. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/legacy.py +0 -0
  79. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/administration.py +0 -0
  80. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/alerts.py +0 -0
  81. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/application_users.py +0 -0
  82. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/applications.py +0 -0
  83. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/call_quality_metrics.py +0 -0
  84. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/common.py +0 -0
  85. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/devices.py +0 -0
  86. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/snapshot.py +0 -0
  87. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/software_inventory.py +0 -0
  88. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/troubleshooting.py +0 -0
  89. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/models/users.py +0 -0
  90. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/snapshot.py +0 -0
  91. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/troubleshooting.py +0 -0
  92. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/users.py +0 -0
  93. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zdx/zdx_service.py +0 -0
  94. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/__init__.py +0 -0
  95. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/activate.py +0 -0
  96. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/admin_roles.py +0 -0
  97. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/admin_users.py +0 -0
  98. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/advanced_settings.py +0 -0
  99. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/alert_subscriptions.py +0 -0
  100. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/apptotal.py +0 -0
  101. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/atp_policy.py +0 -0
  102. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/audit_logs.py +0 -0
  103. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/authentication_settings.py +0 -0
  104. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/bandwidth_classes.py +0 -0
  105. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/bandwidth_control_rules.py +0 -0
  106. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/browser_control_settings.py +0 -0
  107. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/casb_dlp_rules.py +0 -0
  108. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/casb_malware_rules.py +0 -0
  109. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_app_instances.py +0 -0
  110. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_applications.py +0 -0
  111. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_browser_isolation.py +0 -0
  112. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_firewall.py +0 -0
  113. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_firewall_dns.py +0 -0
  114. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_firewall_ips.py +0 -0
  115. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_nss.py +0 -0
  116. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloud_to_cloud_ir.py +0 -0
  117. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/cloudappcontrol.py +0 -0
  118. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dedicated_ip_gateways.py +0 -0
  119. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/device_management.py +0 -0
  120. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dlp_dictionary.py +0 -0
  121. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dlp_engine.py +0 -0
  122. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dlp_resources.py +0 -0
  123. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dlp_templates.py +0 -0
  124. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dlp_web_rules.py +0 -0
  125. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/dns_gatways.py +0 -0
  126. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/end_user_notification.py +0 -0
  127. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/file_type_control_rule.py +0 -0
  128. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/forwarding_control.py +0 -0
  129. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/ftp_control_policy.py +0 -0
  130. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/gre_tunnel.py +0 -0
  131. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/intermediate_certificates.py +0 -0
  132. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/iot_report.py +0 -0
  133. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/ipv6_config.py +0 -0
  134. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/legacy.py +0 -0
  135. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/locations.py +0 -0
  136. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/malware_protection_policy.py +0 -0
  137. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/mobile_threat_settings.py +0 -0
  138. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/__init__.py +0 -0
  139. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/activation.py +0 -0
  140. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/admin_roles.py +0 -0
  141. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/admin_users.py +0 -0
  142. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/advanced_settings.py +0 -0
  143. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/advanced_threat_settings.py +0 -0
  144. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/alert_subscriptions.py +0 -0
  145. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/apptotal.py +0 -0
  146. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/authentication_settings.py +0 -0
  147. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/bandwidth_classes.py +0 -0
  148. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
  149. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/browser_control_settings.py +0 -0
  150. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/casb_dlp_rules.py +0 -0
  151. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/casb_malware_rules.py +0 -0
  152. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_app_instances.py +0 -0
  153. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_app_policy.py +0 -0
  154. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
  155. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
  156. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
  157. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
  158. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
  159. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
  160. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
  161. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
  162. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
  163. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
  164. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
  165. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
  166. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_nss.py +0 -0
  167. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloud_to_cloud_ir.py +0 -0
  168. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/cloudappcontrol.py +0 -0
  169. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/common.py +0 -0
  170. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
  171. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/device_groups.py +0 -0
  172. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/devices.py +0 -0
  173. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dlp_dictionary.py +0 -0
  174. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dlp_engine.py +0 -0
  175. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dlp_resources.py +0 -0
  176. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dlp_templates.py +0 -0
  177. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/dns_gateways.py +0 -0
  178. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/endusernotification.py +0 -0
  179. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/filetyperules.py +0 -0
  180. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/forwarding_control_policy.py +0 -0
  181. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/ftp_control_policy.py +0 -0
  182. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/gre_recommended_list.py +0 -0
  183. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/gre_tunnel_info.py +0 -0
  184. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/gre_tunnels.py +0 -0
  185. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/gre_vips.py +0 -0
  186. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/intermediate_certificates.py +0 -0
  187. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/iotreport.py +0 -0
  188. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/ipv6_config.py +0 -0
  189. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/location_group.py +0 -0
  190. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/malware_protection_settings.py +0 -0
  191. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/mobile_threat_settings.py +0 -0
  192. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/nat_control_policy.py +0 -0
  193. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/nss_servers.py +0 -0
  194. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/organization_information.py +0 -0
  195. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/pac_files.py +0 -0
  196. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/proxies.py +0 -0
  197. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/proxy_gateways.py +0 -0
  198. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/remoteassistance.py +0 -0
  199. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/risk_profiles.py +0 -0
  200. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/rule_labels.py +0 -0
  201. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/saas_security_api.py +0 -0
  202. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/sandboxrules.py +0 -0
  203. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/security_policy_settings.py +0 -0
  204. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/shadow_it_report.py +0 -0
  205. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
  206. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/subclouds.py +0 -0
  207. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/system_audit.py +0 -0
  208. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
  209. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/time_intervals.py +0 -0
  210. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/traffic_datacenters.py +0 -0
  211. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
  212. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/traffic_extranet.py +0 -0
  213. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/traffic_static_ip.py +0 -0
  214. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
  215. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
  216. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/url_filtering_rules.py +0 -0
  217. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/urlcategory.py +0 -0
  218. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/user_management.py +0 -0
  219. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/vzen_clusters.py +0 -0
  220. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/workload_groups.py +0 -0
  221. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/models/zpa_gateway.py +0 -0
  222. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/nat_control_policy.py +0 -0
  223. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/nss_servers.py +0 -0
  224. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/organization_information.py +0 -0
  225. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/pac_files.py +0 -0
  226. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/policy_export.py +0 -0
  227. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/proxies.py +0 -0
  228. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/remote_assistance.py +0 -0
  229. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/risk_profiles.py +0 -0
  230. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/rule_labels.py +0 -0
  231. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/saas_security_api.py +0 -0
  232. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/sandbox.py +0 -0
  233. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/sandbox_rules.py +0 -0
  234. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/security_policy_settings.py +0 -0
  235. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/shadow_it_report.py +0 -0
  236. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/ssl_inspection_rules.py +0 -0
  237. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/sub_clouds.py +0 -0
  238. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/system_audit.py +0 -0
  239. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/tenancy_restriction_profile.py +0 -0
  240. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/time_intervals.py +0 -0
  241. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/traffic_datacenters.py +0 -0
  242. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/traffic_extranet.py +0 -0
  243. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/traffic_static_ip.py +0 -0
  244. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/traffic_vpn_credentials.py +0 -0
  245. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/url_categories.py +0 -0
  246. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/url_filtering.py +0 -0
  247. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/user_management.py +0 -0
  248. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/vzen_clusters.py +0 -0
  249. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/workload_groups.py +0 -0
  250. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/zia_service.py +0 -0
  251. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zia/zpa_gateway.py +0 -0
  252. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/__init__.py +0 -0
  253. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/api_client.py +0 -0
  254. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/groups.py +0 -0
  255. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/api_client.py +0 -0
  256. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/common.py +0 -0
  257. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/groups.py +0 -0
  258. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/resource_servers.py +0 -0
  259. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/user_entitlement.py +0 -0
  260. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/models/users.py +0 -0
  261. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/resource_servers.py +0 -0
  262. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/user_entitlement.py +0 -0
  263. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/users.py +0 -0
  264. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zidentity/zidentity_service.py +0 -0
  265. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/__init__.py +0 -0
  266. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/admin_sso_controller.py +0 -0
  267. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/administrator_controller.py +0 -0
  268. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/api_keys.py +0 -0
  269. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_connector_groups.py +0 -0
  270. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_connector_schedule.py +0 -0
  271. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_connectors.py +0 -0
  272. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_protection.py +0 -0
  273. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_segment_by_type.py +0 -0
  274. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_segments_ba.py +0 -0
  275. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_segments_ba_v2.py +0 -0
  276. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_segments_inspection.py +0 -0
  277. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/app_segments_pra.py +0 -0
  278. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/application_segment.py +0 -0
  279. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/c2c_ip_ranges.py +0 -0
  280. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cbi_banner.py +0 -0
  281. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cbi_certificate.py +0 -0
  282. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cbi_profile.py +0 -0
  283. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cbi_region.py +0 -0
  284. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cbi_zpa_profile.py +0 -0
  285. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/certificates.py +0 -0
  286. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/client_settings.py +0 -0
  287. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/cloud_connector_groups.py +0 -0
  288. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/config_override_controller.py +0 -0
  289. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/customer_controller.py +0 -0
  290. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/customer_domain.py +0 -0
  291. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/customer_version_profile.py +0 -0
  292. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/emergency_access.py +0 -0
  293. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/enrollment_certificates.py +0 -0
  294. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/idp.py +0 -0
  295. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/legacy.py +0 -0
  296. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/lss.py +0 -0
  297. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/machine_groups.py +0 -0
  298. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/microtenants.py +0 -0
  299. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/administrator_controller.py +0 -0
  300. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/api_keys.py +0 -0
  301. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/app_connector_groups.py +0 -0
  302. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/app_connector_schedule.py +0 -0
  303. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/app_connectors.py +0 -0
  304. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
  305. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/app_protection_profile.py +0 -0
  306. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/application_segment.py +0 -0
  307. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/application_segment_lb.py +0 -0
  308. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/application_servers.py +0 -0
  309. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/c2c_ip_ranges.py +0 -0
  310. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cbi_banner.py +0 -0
  311. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cbi_certificate.py +0 -0
  312. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cbi_profile.py +0 -0
  313. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cbi_region.py +0 -0
  314. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
  315. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/certificates.py +0 -0
  316. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/client_settings.py +0 -0
  317. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
  318. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/common.py +0 -0
  319. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/config_override_controller.py +0 -0
  320. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/customer_controller.py +0 -0
  321. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/customer_domain.py +0 -0
  322. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/customer_version_profile.py +0 -0
  323. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/emergency_access.py +0 -0
  324. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/enrollment_certificates.py +0 -0
  325. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/idp.py +0 -0
  326. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/lss.py +0 -0
  327. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/machine_groups.py +0 -0
  328. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/microtenants.py +0 -0
  329. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/npn_client_controller.py +0 -0
  330. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
  331. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
  332. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/posture_profiles.py +0 -0
  333. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/pra_approval.py +0 -0
  334. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/pra_console.py +0 -0
  335. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
  336. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/pra_credential.py +0 -0
  337. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/pra_portal.py +0 -0
  338. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/private_cloud_controller.py +0 -0
  339. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/private_cloud_group.py +0 -0
  340. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/provisioning_keys.py +0 -0
  341. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/role_controller.py +0 -0
  342. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/saml_attributes.py +0 -0
  343. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/scim_attributes.py +0 -0
  344. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/scim_groups.py +0 -0
  345. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/segment_group.py +0 -0
  346. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/server_group.py +0 -0
  347. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/service_edge_groups.py +0 -0
  348. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/service_edge_schedule.py +0 -0
  349. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/service_edges.py +0 -0
  350. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/trusted_network.py +0 -0
  351. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/user_portal_controller.py +0 -0
  352. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/models/user_portal_link.py +0 -0
  353. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/npn_client_controller.py +0 -0
  354. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/policies.py +0 -0
  355. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/posture_profiles.py +0 -0
  356. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/pra_approval.py +0 -0
  357. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/pra_console.py +0 -0
  358. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/pra_credential.py +0 -0
  359. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/pra_credential_pool.py +0 -0
  360. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/pra_portal.py +0 -0
  361. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/private_cloud_controller.py +0 -0
  362. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/private_cloud_group.py +0 -0
  363. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/provisioning.py +0 -0
  364. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/role_controller.py +0 -0
  365. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/saml_attributes.py +0 -0
  366. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/scim_attributes.py +0 -0
  367. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/scim_groups.py +0 -0
  368. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/segment_groups.py +0 -0
  369. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/server_groups.py +0 -0
  370. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/servers.py +0 -0
  371. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/service_edge_group.py +0 -0
  372. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/service_edge_schedule.py +0 -0
  373. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/service_edges.py +0 -0
  374. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/trusted_networks.py +0 -0
  375. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/user_portal_controller.py +0 -0
  376. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/user_portal_link.py +0 -0
  377. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zpa/zpa_service.py +0 -0
  378. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/__init__.py +0 -0
  379. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/account_details.py +0 -0
  380. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/admin_roles.py +0 -0
  381. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/admin_users.py +0 -0
  382. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/api_keys.py +0 -0
  383. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/ec_groups.py +0 -0
  384. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/forwarding_gateways.py +0 -0
  385. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/forwarding_rules.py +0 -0
  386. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/ip_groups.py +0 -0
  387. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/ip_source_groups.py +0 -0
  388. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/legacy.py +0 -0
  389. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/location_management.py +0 -0
  390. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/location_template.py +0 -0
  391. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/activation.py +0 -0
  392. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/admin_roles.py +0 -0
  393. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/admin_users.py +0 -0
  394. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/api_keys.py +0 -0
  395. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/common.py +0 -0
  396. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/ec_group_vm.py +0 -0
  397. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/ecgroup.py +0 -0
  398. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/forwarding_gateways.py +0 -0
  399. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/forwarding_rules.py +0 -0
  400. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/ip_destination_groups.py +0 -0
  401. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/ip_groups.py +0 -0
  402. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/ip_source_groups.py +0 -0
  403. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/location_management.py +0 -0
  404. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/location_templates.py +0 -0
  405. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/nw_service.py +0 -0
  406. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/nw_service_groups.py +0 -0
  407. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/provisioning_url.py +0 -0
  408. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
  409. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/models/zpa_resources.py +0 -0
  410. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/nw_service.py +0 -0
  411. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/provisioning_url.py +0 -0
  412. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/ztw/ztw_service.py +0 -0
  413. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/__init__.py +0 -0
  414. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/audit_logs.py +0 -0
  415. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/dlp_incidents.py +0 -0
  416. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/legacy.py +0 -0
  417. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/audit_logs.py +0 -0
  418. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/change_history.py +0 -0
  419. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/common.py +0 -0
  420. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/generated_tickets.py +0 -0
  421. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/incident_details.py +0 -0
  422. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/incident_evidence.py +0 -0
  423. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/incident_group_search.py +0 -0
  424. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/incident_search.py +0 -0
  425. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/models/incident_trigger.py +0 -0
  426. {zscaler_sdk_python-1.7.5 → zscaler_sdk_python-1.7.7}/zscaler/zwa/zwa_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zscaler-sdk-python
3
- Version: 1.7.5
3
+ Version: 1.7.7
4
4
  Summary: Official Python SDK for the Zscaler Products
5
5
  Home-page: https://github.com/zscaler/zscaler-sdk-python
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zscaler-sdk-python"
3
- version = "1.7.5"
3
+ version = "1.7.7"
4
4
  description = "Official Python SDK for the Zscaler Products"
5
5
  authors = ["Zscaler, Inc. <devrel@zscaler.com>"]
6
6
  license = "MIT"
@@ -29,7 +29,7 @@ __license__ = "MIT"
29
29
  __contributors__ = [
30
30
  "William Guilherme",
31
31
  ]
32
- __version__ = "1.7.5"
32
+ __version__ = "1.7.7"
33
33
 
34
34
 
35
35
  from zscaler.oneapi_client import Client as ZscalerClient # noqa
@@ -0,0 +1,444 @@
1
+ import logging
2
+ import json
3
+ import requests
4
+ import jwt
5
+ import time
6
+ from cryptography.hazmat.backends import default_backend
7
+ from cryptography.hazmat.primitives import serialization
8
+ from zscaler.user_agent import UserAgent
9
+ from zscaler.oneapi_http_client import HTTPClient
10
+ from zscaler.errors.response_checker import check_response_for_error
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class OAuth:
16
+ """
17
+ This class contains the OAuth actions for the Zscaler Client.
18
+ """
19
+
20
+ _instance = None
21
+ _last_config = None
22
+
23
+ def __new__(cls, request_executor, config):
24
+ if cls._instance is None or cls._last_config != config:
25
+ cls._instance = super(OAuth, cls).__new__(cls)
26
+ cls._last_config = config
27
+ cls._instance.__init__(request_executor, config)
28
+ return cls._instance
29
+
30
+ def __init__(self, request_executor, config):
31
+ if not hasattr(self, "_initialized"):
32
+ self._request_executor = request_executor
33
+ self._config = config
34
+ self._access_token = None
35
+ self._token_expires_at = None
36
+ self._token_issued_at = None
37
+
38
+ # Initialize cache based on config
39
+ self._cache = self._initialize_cache()
40
+ self._cache_key = self._generate_cache_key()
41
+ # No buffer needed - simple expiration check
42
+ # logging.debug("OAuth instance created with provided configuration.")
43
+ self._initialized = True
44
+
45
+ def _initialize_cache(self):
46
+ """
47
+ Initialize cache based on configuration.
48
+
49
+ Returns:
50
+ Cache instance or None if caching is disabled
51
+ """
52
+ cache_config = self._config.get("cache", {})
53
+
54
+ # If cache is already a cache instance, return it
55
+ if hasattr(cache_config, 'get') and hasattr(cache_config, 'add'):
56
+ return cache_config
57
+
58
+ # If cache is a dict with enabled flag
59
+ if isinstance(cache_config, dict) and cache_config.get("enabled", False):
60
+ from zscaler.cache.zscaler_cache import ZscalerCache
61
+
62
+ # Get TTL and TTI from config
63
+ ttl = cache_config.get("defaultTtl", 3600) # Default 1 hour
64
+ tti = cache_config.get("defaultTti", 1800) # Default 30 minutes
65
+
66
+ return ZscalerCache(ttl=ttl, tti=tti)
67
+
68
+ return None
69
+
70
+ def _generate_cache_key(self):
71
+ """
72
+ Generate a unique cache key for this OAuth instance.
73
+
74
+ Returns:
75
+ str: Unique cache key based on client configuration
76
+ """
77
+ # Handle legacy client configurations that don't have OneAPI OAuth fields
78
+ client_config = self._config.get("client", {})
79
+
80
+ # For legacy clients, use alternative identifiers
81
+ if "clientId" not in client_config:
82
+ # Legacy clients might have username, api_key, etc.
83
+ username = client_config.get("username", "unknown")
84
+ api_key = client_config.get("api_key", "unknown")
85
+ cloud = client_config.get("cloud", "production").lower()
86
+ return f"oauth_token_legacy_{username}_{api_key}_{cloud}"
87
+
88
+ # For OneAPI clients, use the standard fields
89
+ client_id = client_config["clientId"]
90
+ vanity_domain = client_config["vanityDomain"]
91
+ cloud = client_config.get("cloud", "PRODUCTION").lower()
92
+ return f"oauth_token_{client_id}_{vanity_domain}_{cloud}"
93
+
94
+ def _get_cached_token(self):
95
+ """
96
+ Retrieve token from cache if available and enabled.
97
+
98
+ Returns:
99
+ dict: Cached token data or None if not available
100
+ """
101
+ if not self._cache or not self._cache_enabled():
102
+ return None
103
+
104
+ try:
105
+ cached_data = self._cache.get(self._cache_key)
106
+ if cached_data and isinstance(cached_data, dict):
107
+ logger.debug("Retrieved token from cache")
108
+ return cached_data
109
+ except Exception as e:
110
+ logger.warning(f"Failed to retrieve token from cache: {e}")
111
+
112
+ return None
113
+
114
+ def _cache_token(self, access_token, expires_at):
115
+ """
116
+ Cache the token if caching is enabled.
117
+
118
+ Args:
119
+ access_token (str): The access token to cache
120
+ expires_at (float): Token expiration timestamp
121
+ """
122
+ if not self._cache or not self._cache_enabled():
123
+ return
124
+
125
+ try:
126
+ token_data = {
127
+ 'access_token': access_token,
128
+ 'expires_at': expires_at,
129
+ 'issued_at': time.time()
130
+ }
131
+
132
+ # Store token data directly (not as tuple)
133
+ self._cache.add(self._cache_key, token_data)
134
+ logger.debug("Token cached successfully")
135
+ except Exception as e:
136
+ logger.warning(f"Failed to cache token: {e}")
137
+
138
+ def _cache_enabled(self):
139
+ """
140
+ Check if caching is enabled in the configuration.
141
+
142
+ Returns:
143
+ bool: True if caching is enabled
144
+ """
145
+ return self._cache is not None
146
+
147
+ def _is_token_expired(self, token_data=None):
148
+ """
149
+ Check if the current token is expired.
150
+
151
+ Args:
152
+ token_data (dict, optional): Token data to check. If None, uses instance data.
153
+
154
+ Returns:
155
+ bool: True if token is expired
156
+ """
157
+ if token_data:
158
+ # Check cached token data
159
+ expires_at = token_data.get('expires_at')
160
+ if not expires_at:
161
+ return True
162
+ return time.time() >= expires_at
163
+ else:
164
+ # Check instance token data
165
+ if not self._token_expires_at:
166
+ return True
167
+ return time.time() >= self._token_expires_at
168
+
169
+ def authenticate(self):
170
+ """
171
+ Main authentication function. Determines which authentication
172
+ method to use (Client Secret or JWT Private Key) and retrieves the
173
+ OAuth access token.
174
+
175
+ Returns:
176
+ str: OAuth access token.
177
+ """
178
+ # Check if this is a legacy client configuration
179
+ client_config = self._config.get("client", {})
180
+ if "clientId" not in client_config:
181
+ logging.error("OAuth authentication not available for legacy client configurations.")
182
+ raise ValueError("OAuth authentication not available for legacy client configurations. Use legacy authentication methods instead.")
183
+
184
+ # logging.debug("Starting authentication process.")
185
+ client_id = client_config["clientId"]
186
+ client_secret = client_config.get("clientSecret", "")
187
+ private_key = client_config.get("privateKey", "")
188
+
189
+ if not client_id or (not client_secret and not private_key):
190
+ logging.error("No valid client credentials provided.")
191
+ raise ValueError("No valid client credentials provided")
192
+
193
+ # Determine whether to authenticate with client secret or JWT
194
+ if private_key:
195
+ logging.info("Authenticating using JWT private key.")
196
+ response = self._authenticate_with_private_key(client_id, private_key)
197
+ else:
198
+ # logging.info("Authenticating using client secret.")
199
+ response = self._authenticate_with_client_secret(client_id, client_secret)
200
+
201
+ # logging.debug("Authentication process completed.")
202
+ return response
203
+
204
+ def _authenticate_with_client_secret(self, client_id, client_secret):
205
+ """
206
+ Authenticate using client ID and client secret.
207
+
208
+ Args:
209
+ client_id (str): Client ID for authentication.
210
+ client_secret (str): Client secret for authentication.
211
+
212
+ Returns:
213
+ str: OAuth access token.
214
+ """
215
+ # logging.debug("Preparing to authenticate with client secret.")
216
+ vanity_domain = self._config["client"]["vanityDomain"]
217
+ cloud = self._config["client"].get("cloud", "PRODUCTION").lower()
218
+ auth_url = self._get_auth_url(vanity_domain, cloud)
219
+
220
+ # Prepare form data (like in the Go SDK)
221
+ form_data = {
222
+ "grant_type": "client_credentials",
223
+ "client_id": client_id,
224
+ "client_secret": client_secret,
225
+ "audience": "https://api.zscaler.com",
226
+ }
227
+
228
+ user_agent = UserAgent().get_user_agent_string()
229
+ headers = {
230
+ "Accept": "application/json",
231
+ "Content-Type": "application/x-www-form-urlencoded",
232
+ "User-Agent": user_agent,
233
+ }
234
+
235
+ # logging.debug(f"Sending authentication request to {auth_url}.")
236
+ # Synchronous HTTP request (with form data in the body)
237
+ response = requests.post(auth_url, data=form_data, headers=headers)
238
+
239
+ if response.status_code >= 300:
240
+ logging.error(f"Error authenticating: {response.status_code}, {response.text}")
241
+ raise Exception(f"Error authenticating: {response.status_code}, {response.text}")
242
+
243
+ # logging.debug("Authentication with client secret successful.")
244
+ return response
245
+
246
+ def _authenticate_with_private_key(self, client_id, private_key):
247
+ """
248
+ Authenticate using client ID and JWT private key.
249
+
250
+ Args:
251
+ client_id (str): Client ID for authentication.
252
+ private_key (str): Path to the private key file, JWK JSON string, or raw private key.
253
+
254
+ Returns:
255
+ str: OAuth access token.
256
+ """
257
+ logging.debug("Preparing to authenticate with JWT private key.")
258
+ vanity_domain = self._config["client"]["vanityDomain"]
259
+ cloud = self._config["client"].get("cloud", "PRODUCTION").lower()
260
+ auth_url = self._get_auth_url(vanity_domain, cloud)
261
+
262
+ # **Step 1: Determine the Private Key Type**
263
+ if private_key.strip().startswith("{"):
264
+ # **JWK JSON Format**
265
+ logging.info("Using JWK JSON format for private key.")
266
+ jwk_key = json.loads(private_key.strip()) # Convert JWK string to dict
267
+ private_key_obj = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(jwk_key))
268
+
269
+ elif "BEGIN PRIVATE KEY" in private_key:
270
+ # **Raw PEM Private Key**
271
+ logging.info("Using raw PEM private key.")
272
+ private_key_obj = serialization.load_pem_private_key(
273
+ private_key.encode(), password=None, backend=default_backend()
274
+ )
275
+
276
+ else:
277
+ # **Assume it's a file path and read the private key**
278
+ logging.info("Using private key from file.")
279
+ with open(private_key, "rb") as key_file:
280
+ private_key_obj = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())
281
+
282
+ # **Step 2: Create JWT for Client Assertion**
283
+ now = int(time.time())
284
+ payload = {
285
+ "iss": client_id,
286
+ "sub": client_id,
287
+ "aud": "https://api.zscaler.com",
288
+ "exp": now + 600, # 10 minutes expiration
289
+ }
290
+
291
+ # **Generate the JWT assertion using the private key**
292
+ assertion = jwt.encode(payload, private_key_obj, algorithm="RS256")
293
+
294
+ # **Step 3: Prepare OAuth Request**
295
+ form_data = {
296
+ "grant_type": "client_credentials",
297
+ "client_id": client_id,
298
+ "client_assertion": assertion,
299
+ "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
300
+ "audience": "https://api.zscaler.com",
301
+ }
302
+
303
+ headers = {
304
+ "Accept": "application/json",
305
+ "Content-Type": "application/x-www-form-urlencoded",
306
+ "User-Agent": "Zscaler-SDK",
307
+ }
308
+
309
+ logging.debug(f"Sending authentication request to {auth_url} with JWT.")
310
+ response = requests.post(auth_url, data=form_data, headers=headers)
311
+
312
+ if response.status_code >= 300:
313
+ logging.error(f"Error authenticating: {response.status_code}, {response.text}")
314
+ raise Exception(f"Error authenticating: {response.status_code}, {response.text}")
315
+
316
+ logging.info("Authentication with JWT private key successful.")
317
+ return response
318
+
319
+ def _get_access_token(self):
320
+ """
321
+ Retrieves or generates the OAuth access token for the Zscaler OneAPI Client.
322
+ Implements proactive token refresh using expires_in with configurable buffer.
323
+
324
+ Returns:
325
+ str: OAuth access token.
326
+ """
327
+ # Check if this is a legacy client configuration
328
+ client_config = self._config.get("client", {})
329
+ if "clientId" not in client_config:
330
+ logger.warning("OAuth client initialized with legacy configuration - OAuth functionality not available")
331
+ return None
332
+
333
+ # 1. Check cache first (if enabled)
334
+ cached_token = self._get_cached_token()
335
+ if cached_token and not self._is_token_expired(cached_token):
336
+ self._access_token = cached_token['access_token']
337
+ self._token_expires_at = cached_token['expires_at']
338
+ self._token_issued_at = cached_token.get('issued_at', time.time())
339
+ logger.debug("Using cached access token")
340
+ return self._access_token
341
+
342
+ # 2. Check if current token is about to expire (proactive refresh)
343
+ if self._access_token and not self._is_token_expired():
344
+ logger.debug("Using existing access token")
345
+ return self._access_token
346
+
347
+ # 3. Get new token
348
+ logger.info("Access token expired or not available, requesting new token")
349
+ try:
350
+ # Call the authenticate function, which now returns the response object
351
+ response = self.authenticate()
352
+
353
+ # Check the response body for error messages using check_response_for_error
354
+ parsed_response, err = check_response_for_error(response.url, response, response.text)
355
+
356
+ if err:
357
+ logging.error(f"Error during authentication: {err}")
358
+ raise ValueError(f"Error during authentication: {err}")
359
+
360
+ # Extract access token and expiration from the parsed response
361
+ if isinstance(parsed_response, dict):
362
+ self._access_token = parsed_response.get("access_token")
363
+ expires_in = parsed_response.get("expires_in", 3600) # Default to 1 hour
364
+ self._token_expires_at = time.time() + expires_in
365
+ self._token_issued_at = time.time()
366
+
367
+ # Cache the new token
368
+ self._cache_token(self._access_token, self._token_expires_at)
369
+
370
+ logger.info(f"New access token obtained, expires in {expires_in} seconds")
371
+ else:
372
+ logging.error("Parsed response is not a dictionary as expected.")
373
+ raise ValueError("Parsed response is not a dictionary as expected")
374
+
375
+ except Exception as e:
376
+ logging.error(f"Failed to get access token: {e}")
377
+ raise # Re-raise the exception to handle it outside
378
+
379
+ return self._access_token
380
+
381
+ def _get_auth_url(self, vanity_domain, cloud):
382
+ """
383
+ Determines the OAuth2 provider URL based on the vanity domain and cloud.
384
+
385
+ Args:
386
+ vanity_domain (str): Vanity domain for the authentication URL.
387
+ cloud (str): Cloud environment (e.g., "production", "stage").
388
+
389
+ Returns:
390
+ str: The fully constructed authentication URL.
391
+ """
392
+ # logging.debug(f"Constructing auth URL for cloud: {cloud}.")
393
+ if cloud == "production":
394
+ return f"https://{vanity_domain}.zslogin.net/oauth2/v1/token"
395
+ else:
396
+ return f"https://{vanity_domain}.zslogin{cloud}.net/oauth2/v1/token"
397
+
398
+ def clear_access_token(self):
399
+ """
400
+ Clear the current OAuth access token and remove from cache.
401
+ """
402
+ logging.info("Clearing the current access token.")
403
+ self._access_token = None
404
+ self._token_expires_at = None
405
+ self._token_issued_at = None
406
+
407
+ # Clear from cache if enabled
408
+ if self._cache and self._cache_enabled():
409
+ try:
410
+ self._cache.delete(self._cache_key)
411
+ logger.debug("Token cleared from cache")
412
+ except Exception as e:
413
+ logger.warning(f"Failed to clear token from cache: {e}")
414
+
415
+ self._request_executor._default_headers.pop("Authorization", None)
416
+
417
+ def get_token_info(self):
418
+ """
419
+ Get information about the current token status.
420
+
421
+ Returns:
422
+ dict: Token information including expiration and cache status
423
+ """
424
+ if not self._access_token:
425
+ return {
426
+ 'has_token': False,
427
+ 'expires_at': None,
428
+ 'issued_at': None,
429
+ 'is_expired': True,
430
+ 'time_until_expiry': None,
431
+ 'cached': False
432
+ }
433
+
434
+ now = time.time()
435
+ time_until_expiry = self._token_expires_at - now if self._token_expires_at else None
436
+
437
+ return {
438
+ 'has_token': True,
439
+ 'expires_at': self._token_expires_at,
440
+ 'issued_at': self._token_issued_at,
441
+ 'is_expired': self._is_token_expired(),
442
+ 'time_until_expiry': time_until_expiry,
443
+ 'cached': self._cache_enabled() and self._cache.contains(self._cache_key) if self._cache else False
444
+ }
@@ -8,7 +8,6 @@ logger = logging.getLogger(__name__)
8
8
  class ZscalerAPIResponse:
9
9
  """
10
10
  Class for defining the wrapper of a Zscaler API response.
11
- Inspired by the Okta approach, this class only returns the initial page of results.
12
11
  The user can check if more pages exist with `has_next()` and fetch them on-demand using `next()`.
13
12
  """
14
13
 
@@ -118,7 +117,7 @@ class ZscalerAPIResponse:
118
117
 
119
118
  def get_headers(self):
120
119
  """
121
- Returns the response body of the Okta API Response.
120
+ Returns the response body of the Zscaler API Response.
122
121
 
123
122
  Returns:
124
123
  CIMultiDictProxy: dict-like object
@@ -128,7 +127,7 @@ class ZscalerAPIResponse:
128
127
 
129
128
  def get_body(self):
130
129
  """
131
- Returns the response body of the Okta API Response.
130
+ Returns the response body of the Zscaler API Response.
132
131
 
133
132
  Returns:
134
133
  dict: Dictionary format of response
@@ -85,9 +85,13 @@ class RequestExecutor:
85
85
  self.microtenant_id = self._config["client"].get("microtenantId") # Optional for ZIA/ZCC
86
86
  self.vanity_domain = self._config["client"].get("vanityDomain") # Required for zidentity service
87
87
 
88
- # OAuth2 setup
89
- self._oauth = OAuth(self, self._config)
90
- self._access_token = None
88
+ # OAuth2 setup - only for OneAPI clients, not legacy clients
89
+ if not self.use_legacy_client:
90
+ self._oauth = OAuth(self, self._config)
91
+ self._access_token = None
92
+ else:
93
+ self._oauth = None
94
+ self._access_token = None
91
95
 
92
96
  # Set default headers from config
93
97
  self._default_headers = {
@@ -519,7 +523,7 @@ class RequestExecutor:
519
523
  # Check for 401 -> Trigger re-auth if we still have retries left
520
524
  if response.status_code == 401:
521
525
  # We only want to attempt refreshing the token if we haven't hit max_retries
522
- if attempts < max_retries:
526
+ if attempts < max_retries and self._oauth is not None:
523
527
  logger.info("Got 401 response; clearing token and re-authenticating.")
524
528
  self._oauth.clear_access_token()
525
529
 
@@ -535,8 +539,8 @@ class RequestExecutor:
535
539
  attempts += 1
536
540
  return self.fire_request_helper(request, attempts, request_start_time)
537
541
  else:
538
- logger.error("401 Unauthorized - token refresh attempts exhausted.")
539
- return request, response, response.text, Exception("401 Unauthorized - token refresh attempts exhausted.")
542
+ logger.error("401 Unauthorized - token refresh attempts exhausted or OAuth not available.")
543
+ return request, response, response.text, Exception("401 Unauthorized - token refresh attempts exhausted or OAuth not available.")
540
544
 
541
545
  # Handle “retryable” statuses such as 429, 503, etc.
542
546
  if attempts < max_retries and self.is_retryable_status(response.status_code):
@@ -18,7 +18,6 @@ from zscaler.request_executor import RequestExecutor
18
18
  from zscaler.api_client import APIClient
19
19
  from zscaler.zia.models.cloud_firewall_rules import FirewallRule
20
20
  from zscaler.utils import format_url, transform_common_id_fields, reformat_params
21
- import json
22
21
 
23
22
 
24
23
  class FirewallPolicyAPI(APIClient):
@@ -39,7 +38,27 @@ class FirewallPolicyAPI(APIClient):
39
38
 
40
39
  Args:
41
40
  query_params {dict}: Map of query parameters for the request.
42
- ``[query_params.search]`` {str}: Search string for filtering results by rule name.
41
+ ``[query_params.rule_name]`` {str}: Filters rules based on rule names using the specified keywords
42
+ ``[query_params.rule_label]`` {str}: Filters rules based on rule labels using the specified keywords
43
+ ``[query_params.rule_order]`` {str}: Filters rules based on rule order using the specified keywords
44
+ ``[query_params.rule_description]`` {str}: Filters rules based on rule descriptions using the specified keywords
45
+ ``[query_params.rule_action]`` {str}: Filters rules based on rule actions using the specified keywords
46
+ ``[query_params.location]`` {str}: Filters rules based on locations using the specified keywords
47
+ ``[query_params.department]`` {str}: Filters rules based on user departments using the specified keywords
48
+ ``[query_params.group]`` {str}: Filters rules based on user groups using the specified keywords
49
+ ``[query_params.user]`` {str}: Filters rules based on users using the specified keywords
50
+ ``[query_params.device]`` {str}: Filters rules based on devices using the specified keywords
51
+ ``[query_params.device_group]`` {str}: Filters rules based on device groups using the specified keywords
52
+ ``[query_params.device_trust_level]`` {str}: Filters rules based on device trust levels using the specified keywords
53
+ ``[query_params.src_ips]`` {str}: Filters rules based on source IP addresses using the specified keywords
54
+ ``[query_params.dest_addresses]`` {str}: Filters rules based on destination IP addresses using the specified keywords
55
+ ``[query_params.src_ip_groups]`` {str}: Filters rules based on source IP groups using the specified keywords
56
+ ``[query_params.dest_ip_groups]`` {str}: Filters rules based on destination IP groups using the specified keywords
57
+ ``[query_params.nw_application]`` {str}: Filters rules based on network applications using the specified keywords
58
+ ``[query_params.nw_services]`` {str}: Filters rules based on network services using the specified keywords
59
+ ``[query_params.dest_ip_categories]`` {str}: Filters rules based on destination URL categories using the specified keywords
60
+ ``[query_params.page]`` {str}: Specifies the page offset
61
+ ``[query_params.page_size]`` {str}: Specifies the page size. The default size is set to 5,000, if not specified.
43
62
 
44
63
  Returns:
45
64
  tuple: A tuple containing (list of firewall rules instances, Response, error)
@@ -209,7 +228,6 @@ class FirewallPolicyAPI(APIClient):
209
228
 
210
229
  body = kwargs
211
230
 
212
- # Convert 'enabled' to 'state' (ENABLED/DISABLED) if it's present in the payload
213
231
  if "enabled" in body:
214
232
  body["state"] = "ENABLED" if body.pop("enabled") else "DISABLED"
215
233
 
@@ -79,7 +79,7 @@ class DLPWebRules(ZscalerObject):
79
79
  config["dlpContentLocationsScopes"] if "dlpContentLocationsScopes" in config else [], str
80
80
  )
81
81
  self.url_categories = ZscalerCollection.form_list(
82
- config["urlCategories"] if "urlCategories" in config else [], common_reference.ResourceReference
82
+ config["urlCategories"] if "urlCategories" in config else [], urlcategory.URLCategory
83
83
  )
84
84
 
85
85
  self.locations = ZscalerCollection.form_list(
@@ -181,6 +181,7 @@ class DLPWebRules(ZscalerObject):
181
181
  self.icap_server = None
182
182
  self.external_auditor_email = None
183
183
  self.dlp_content_locations_scopes = []
184
+ self.dlp_engines = []
184
185
 
185
186
  def request_format(self):
186
187
  """
@@ -235,6 +236,7 @@ class DLPWebRules(ZscalerObject):
235
236
  "icapServer": self.icap_server.request_format() if self.icap_server else None,
236
237
  "externalAuditorEmail": self.external_auditor_email,
237
238
  "dlpContentLocationsScopes": self.dlp_content_locations_scopes,
239
+ "dlpEngines": [engine.request_format() for engine in (self.dlp_engines or [])],
238
240
  }
239
241
  parent_req_format.update(current_obj_format)
240
242
  return parent_req_format
@@ -66,12 +66,19 @@ class LocationManagement(ZscalerObject):
66
66
  or False # ← fallback
67
67
  )
68
68
 
69
+ self.surrogate_ip_enforced_for_known_browsers = (
70
+ config.get("surrogate_ip_enforced_for_known_browsers") # ← used by the converted keys
71
+ or config.get("surrogateIpEnforcedForKnownBrowsers") # ← if not snake_cased
72
+ or config.get("surrogateIPEnforcedForKnownBrowsers") # ← raw from the API
73
+ or False # ← fallback
74
+ )
75
+
69
76
  self.cookies_and_proxy = config["cookiesAndProxy"] if "cookiesAndProxy" in config else None
70
77
  self.idle_time_in_minutes = config["idleTimeInMinutes"] if "idleTimeInMinutes" in config else None
71
78
  self.display_time_unit = config["displayTimeUnit"] if "displayTimeUnit" in config else None
72
- self.surrogate_ip_enforced_for_known_browsers = (
73
- config["surrogateIPEnforcedForKnownBrowsers"] if "surrogateIPEnforcedForKnownBrowsers" in config else False
74
- )
79
+ # self.surrogate_ip_enforced_for_known_browsers = (
80
+ # config["surrogateIPEnforcedForKnownBrowsers"] if "surrogateIPEnforcedForKnownBrowsers" in config else False
81
+ # )
75
82
  self.surrogate_refresh_time_in_minutes = (
76
83
  config["surrogateRefreshTimeInMinutes"] if "surrogateRefreshTimeInMinutes" in config else None
77
84
  )
@@ -106,7 +113,8 @@ class LocationManagement(ZscalerObject):
106
113
  self.basic_auth_enabled = config["basicAuthEnabled"] if "basicAuthEnabled" in config else False
107
114
 
108
115
  self.digest_auth_enabled = config["digestAuthEnabled"] if "digestAuthEnabled" in config else False
109
-
116
+ self.ports = config["ports"] if "ports" in config else None
117
+
110
118
  # Handling nested lists and collections
111
119
  self.static_location_groups = ZscalerCollection.form_list(
112
120
  config["staticLocationGroups"] if "staticLocationGroups" in config else [], common.CommonIDName
@@ -199,6 +207,7 @@ class LocationManagement(ZscalerObject):
199
207
  self.extranet = None
200
208
  self.extranet_ip_pool = None
201
209
  self.extranet_dns = None
210
+ self.ports = None
202
211
  self.static_location_groups = []
203
212
  self.dynamic_location_groups = []
204
213
  self.vpn_credentials = []
@@ -255,6 +264,7 @@ class LocationManagement(ZscalerObject):
255
264
  "ipAddresses": self.ip_addresses,
256
265
  "ipv6Enabled": self.ipv6_enabled,
257
266
  "extranet": self.extranet,
267
+ "ports": self.ports,
258
268
  "extranetIpPool": self.extranet_ip_pool,
259
269
  "extranetDns": self.extranet_dns,
260
270
  "defaultExtranetTsPool": self.default_extranet_ts_pool,
@@ -31,7 +31,7 @@ class ActivationAPI(APIClient):
31
31
  super().__init__()
32
32
  self._request_executor: RequestExecutor = request_executor
33
33
 
34
- def activate(self, force: bool = False) -> tuple:
34
+ def activate(self, force: bool = False, **kwargs) -> tuple:
35
35
  """
36
36
  Activate the configuration.
37
37
 
@@ -60,8 +60,10 @@ class ActivationAPI(APIClient):
60
60
 
61
61
  api_url = format_url(f"{self._ztw_base_endpoint}{endpoint_path}")
62
62
 
63
+ body = kwargs
64
+
63
65
  # Create the request
64
- request, error = self._request_executor.create_request(http_method, api_url, body={}, headers={}, params={})
66
+ request, error = self._request_executor.create_request(http_method, api_url, body=body, headers={}, params={})
65
67
  if error:
66
68
  return (None, None, error)
67
69