zscaler-sdk-python 1.8.3__tar.gz → 1.8.4__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.
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/PKG-INFO +24 -18
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/README.md +23 -17
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/pyproject.toml +1 -1
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/__init__.py +1 -1
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/constants.py +1 -1
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/errors/response_checker.py +1 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/exceptions/exceptions.py +2 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/helpers.py +14 -11
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/logger.py +108 -6
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_client.py +3 -3
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_oauth_client.py +29 -28
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_object.py +2 -2
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_response.py +38 -50
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/request_executor.py +34 -32
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dlp_dictionary.py +5 -5
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/traffic_static_ip.py +37 -14
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/errors/http_error.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/errors/zscaler_api_error.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/oneapi_http_client.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/utils.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/admin_user.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/devices.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/devices.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/getcompanyinfo.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/secrets.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/snapshot.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/snapshot.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/browser_control_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/casb_dlp_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/casb_malware_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_firewall.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_firewall_dns.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_firewall_ips.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloud_to_cloud_ir.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/browser_control_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/casb_dlp_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/casb_malware_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloud_to_cloud_ir.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/dns_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/nss_servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/proxies.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/proxy_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/saas_security_api.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/url_filtering_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/vzen_clusters.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/vzen_nodes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/nss_servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/proxies.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/saas_security_api.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/sandbox_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/time_intervals.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/url_categories.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/url_filtering.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/vzen_clusters.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/vzen_nodes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/zia_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/api_client.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/api_client.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/resource_servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/user_entitlement.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/models/users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/resource_servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/user_entitlement.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zidentity/zidentity_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/admin_sso_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/api_keys.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_protection.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_segments_ba.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_segments_ba_v2.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_segments_inspection.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/app_segments_pra.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/application_segment.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/c2c_ip_ranges.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/client_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/config_override_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/customer_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/customer_domain.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/app_protection_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/application_segment.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/application_segment_lb.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/c2c_ip_ranges.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/client_settings.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/config_override_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/customer_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/customer_domain.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/npn_client_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/pra_console.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/private_cloud_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/private_cloud_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/role_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/segment_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/server_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/service_edge_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/user_portal_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/models/user_portal_link.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/npn_client_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/policies.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/private_cloud_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/private_cloud_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/role_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/segment_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/user_portal_controller.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/user_portal_link.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zpa/zpa_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.8.3 → zscaler_sdk_python-1.8.4}/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.8.
|
|
3
|
+
Version: 1.8.4
|
|
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
|
|
@@ -414,6 +414,7 @@ or
|
|
|
414
414
|
|
|
415
415
|
```
|
|
416
416
|
-----BEGIN PRIVATE KEY-----
|
|
417
|
+
# Example private key (not a real key)
|
|
417
418
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCv3krdYg3z7h0H
|
|
418
419
|
60QoePJMghllQxsfPxp3mgFfYEaIbF88Z8dvPZEfhAtP19/Mv62ASjwgqzQzKHRV
|
|
419
420
|
-----END PRIVATE KEY-----
|
|
@@ -554,10 +555,11 @@ query_parameters = {'page_size': 100}
|
|
|
554
555
|
groups, resp, err = client.zia.user_management.list_groups(query_parameters)
|
|
555
556
|
|
|
556
557
|
while resp.has_next():
|
|
557
|
-
more_groups, err = resp.next()
|
|
558
|
+
more_groups, resp, err = resp.next() # Unpack all 3 return values
|
|
558
559
|
if err:
|
|
559
560
|
break
|
|
560
|
-
|
|
561
|
+
if more_groups:
|
|
562
|
+
groups.extend(more_groups)
|
|
561
563
|
```
|
|
562
564
|
|
|
563
565
|
### Searching and Filtering
|
|
@@ -595,12 +597,13 @@ def main():
|
|
|
595
597
|
print(group)
|
|
596
598
|
|
|
597
599
|
while resp.has_next():
|
|
598
|
-
next_page, err = resp.next()
|
|
600
|
+
next_page, resp, err = resp.next() # Unpack all 3 return values
|
|
599
601
|
if err:
|
|
600
602
|
print(f"Error fetching next page: {err}")
|
|
601
603
|
break
|
|
602
|
-
|
|
603
|
-
|
|
604
|
+
if next_page:
|
|
605
|
+
for group in next_page:
|
|
606
|
+
print(group)
|
|
604
607
|
|
|
605
608
|
try:
|
|
606
609
|
resp.next() # Will raise StopIteration if no more data
|
|
@@ -613,18 +616,21 @@ if __name__ == "__main__":
|
|
|
613
616
|
|
|
614
617
|
### Pagination Limits and Controls
|
|
615
618
|
|
|
616
|
-
Each Zscaler service has its own pagination
|
|
617
|
-
|
|
618
|
-
| Service | Default Page Size | Max Page Size |
|
|
619
|
-
|
|
620
|
-
| ZCC | Varies
|
|
621
|
-
| ZDX | 10
|
|
622
|
-
| ZIA | 100
|
|
623
|
-
| ZPA |
|
|
624
|
-
| ZTW | 100
|
|
625
|
-
| ZWA | Varies
|
|
626
|
-
|
|
627
|
-
|
|
619
|
+
Each Zscaler service has its own pagination requirements and limits. The SDK automatically respects these API defaults when no `page_size` is provided:
|
|
620
|
+
|
|
621
|
+
| Service | API Default Page Size | Max Page Size | Pagination Parameters |
|
|
622
|
+
|---------|-----------------------|---------------|-------------------------------------------------|
|
|
623
|
+
| ZCC | Varies by endpoint | Varies | Uses `page`, `pageSize` |
|
|
624
|
+
| ZDX | 10 | Varies | Uses `limit` + `offset` (cursor-based) |
|
|
625
|
+
| ZIA | 100 | 1000 | Uses `page`, `pageSize` |
|
|
626
|
+
| ZPA | 20 | 500 | Uses `page`, `pagesize` |
|
|
627
|
+
| ZTW | 100 | Varies | Uses `page`, `pageSize` |
|
|
628
|
+
| ZWA | Varies by endpoint | Varies | Uses `page`, `pageSize` |
|
|
629
|
+
|
|
630
|
+
**Important Notes:**
|
|
631
|
+
- ✅ The SDK automatically uses each API's default page size when no `page_size` is specified
|
|
632
|
+
- ✅ Always use `snake_case` for parameter names (e.g., `page_size`). The SDK handles conversion internally
|
|
633
|
+
- ✅ Pagination stops automatically when fewer results than the page size are returned
|
|
628
634
|
|
|
629
635
|
|
|
630
636
|
You can control how many total items or pages the SDK will fetch even if more data is available.
|
|
@@ -375,6 +375,7 @@ or
|
|
|
375
375
|
|
|
376
376
|
```
|
|
377
377
|
-----BEGIN PRIVATE KEY-----
|
|
378
|
+
# Example private key (not a real key)
|
|
378
379
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCv3krdYg3z7h0H
|
|
379
380
|
60QoePJMghllQxsfPxp3mgFfYEaIbF88Z8dvPZEfhAtP19/Mv62ASjwgqzQzKHRV
|
|
380
381
|
-----END PRIVATE KEY-----
|
|
@@ -515,10 +516,11 @@ query_parameters = {'page_size': 100}
|
|
|
515
516
|
groups, resp, err = client.zia.user_management.list_groups(query_parameters)
|
|
516
517
|
|
|
517
518
|
while resp.has_next():
|
|
518
|
-
more_groups, err = resp.next()
|
|
519
|
+
more_groups, resp, err = resp.next() # Unpack all 3 return values
|
|
519
520
|
if err:
|
|
520
521
|
break
|
|
521
|
-
|
|
522
|
+
if more_groups:
|
|
523
|
+
groups.extend(more_groups)
|
|
522
524
|
```
|
|
523
525
|
|
|
524
526
|
### Searching and Filtering
|
|
@@ -556,12 +558,13 @@ def main():
|
|
|
556
558
|
print(group)
|
|
557
559
|
|
|
558
560
|
while resp.has_next():
|
|
559
|
-
next_page, err = resp.next()
|
|
561
|
+
next_page, resp, err = resp.next() # Unpack all 3 return values
|
|
560
562
|
if err:
|
|
561
563
|
print(f"Error fetching next page: {err}")
|
|
562
564
|
break
|
|
563
|
-
|
|
564
|
-
|
|
565
|
+
if next_page:
|
|
566
|
+
for group in next_page:
|
|
567
|
+
print(group)
|
|
565
568
|
|
|
566
569
|
try:
|
|
567
570
|
resp.next() # Will raise StopIteration if no more data
|
|
@@ -574,18 +577,21 @@ if __name__ == "__main__":
|
|
|
574
577
|
|
|
575
578
|
### Pagination Limits and Controls
|
|
576
579
|
|
|
577
|
-
Each Zscaler service has its own pagination
|
|
578
|
-
|
|
579
|
-
| Service | Default Page Size | Max Page Size |
|
|
580
|
-
|
|
581
|
-
| ZCC | Varies
|
|
582
|
-
| ZDX | 10
|
|
583
|
-
| ZIA | 100
|
|
584
|
-
| ZPA |
|
|
585
|
-
| ZTW | 100
|
|
586
|
-
| ZWA | Varies
|
|
587
|
-
|
|
588
|
-
|
|
580
|
+
Each Zscaler service has its own pagination requirements and limits. The SDK automatically respects these API defaults when no `page_size` is provided:
|
|
581
|
+
|
|
582
|
+
| Service | API Default Page Size | Max Page Size | Pagination Parameters |
|
|
583
|
+
|---------|-----------------------|---------------|-------------------------------------------------|
|
|
584
|
+
| ZCC | Varies by endpoint | Varies | Uses `page`, `pageSize` |
|
|
585
|
+
| ZDX | 10 | Varies | Uses `limit` + `offset` (cursor-based) |
|
|
586
|
+
| ZIA | 100 | 1000 | Uses `page`, `pageSize` |
|
|
587
|
+
| ZPA | 20 | 500 | Uses `page`, `pagesize` |
|
|
588
|
+
| ZTW | 100 | Varies | Uses `page`, `pageSize` |
|
|
589
|
+
| ZWA | Varies by endpoint | Varies | Uses `page`, `pageSize` |
|
|
590
|
+
|
|
591
|
+
**Important Notes:**
|
|
592
|
+
- ✅ The SDK automatically uses each API's default page size when no `page_size` is specified
|
|
593
|
+
- ✅ Always use `snake_case` for parameter names (e.g., `page_size`). The SDK handles conversion internally
|
|
594
|
+
- ✅ Pagination stops automatically when fewer results than the page size are returned
|
|
589
595
|
|
|
590
596
|
|
|
591
597
|
You can control how many total items or pages the SDK will fetch even if more data is available.
|
|
@@ -15,7 +15,7 @@ ZPA_BASE_URLS = {
|
|
|
15
15
|
DEV_AUTH_URL = "https://authn1.dev.zpath.net/authn/v1/oauth/token"
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
RETRYABLE_STATUS_CODES = {
|
|
18
|
+
RETRYABLE_STATUS_CODES = {429, 500, 502, 503, 504}
|
|
19
19
|
MAX_RETRIES = 5
|
|
20
20
|
BACKOFF_FACTOR = 1
|
|
21
21
|
BACKOFF_BASE_DURATION = 2
|
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
|
|
3
3
|
raise_exception = False
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
# Zscaler Base Exceptions
|
|
6
7
|
class ZscalerBaseException(Exception):
|
|
7
8
|
def __init__(self, url, response, response_body):
|
|
@@ -85,6 +86,7 @@ class TokenRefreshError(Exception):
|
|
|
85
86
|
class HeaderUpdateError(Exception):
|
|
86
87
|
pass
|
|
87
88
|
|
|
89
|
+
|
|
88
90
|
class RetryTooLong(Exception):
|
|
89
91
|
"""Raised when backoff time exceeds maxRetrySeconds configuration."""
|
|
90
92
|
pass
|
|
@@ -47,13 +47,14 @@ def to_snake_case(string):
|
|
|
47
47
|
"dnsResolutionOnTransparentProxyIPv6UrlCategories": "dns_resolution_on_transparent_proxy_ipv6_url_categories",
|
|
48
48
|
"dnsResolutionOnTransparentProxyIPv6Apps": "dns_resolution_on_transparent_proxy_ipv6_apps",
|
|
49
49
|
"enableIPv6DnsOptimizationOnAllTransparentProxy": "enable_ipv6_dns_optimization_on_all_transparent_proxy",
|
|
50
|
-
"dnsResolutionOnTransparentProxyIPv6ExemptUrlCategories":
|
|
50
|
+
"dnsResolutionOnTransparentProxyIPv6ExemptUrlCategories":
|
|
51
|
+
"dns_resolution_on_transparent_proxy_ipv6_exempt_url_categories",
|
|
51
52
|
"endPointDLPLogType": "end_point_dlp_log_type",
|
|
52
53
|
"emailDLPLogType": "email_dlp_log_type",
|
|
53
54
|
"extranetDNSList": "extranet_dns_list",
|
|
54
55
|
"primaryDNSServer": "primary_dns_server",
|
|
55
56
|
"secondaryDNSServer": "secondary_dns_server",
|
|
56
|
-
|
|
57
|
+
|
|
57
58
|
# ZCC Edge Case Attributes
|
|
58
59
|
"enableUDPTransportSelection": "enable_udp_transport_selection",
|
|
59
60
|
"interceptZIATrafficAllAdapters": "intercept_zia_traffic_all_adapters",
|
|
@@ -118,7 +119,7 @@ def to_snake_case(string):
|
|
|
118
119
|
"enableZCCRevert": "enable_zcc_revert",
|
|
119
120
|
"enableZiaDR": "enable_zia_dr",
|
|
120
121
|
"purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
|
|
121
|
-
|
|
122
|
+
|
|
122
123
|
# ZPA Edge Cases
|
|
123
124
|
"serverGroupDTOs": "server_group_dtos",
|
|
124
125
|
"extranetDTO": "extranet_dto",
|
|
@@ -126,7 +127,7 @@ def to_snake_case(string):
|
|
|
126
127
|
"locationDTO": "location_dto",
|
|
127
128
|
"predefinedADPControls": "predefined_adp_controls",
|
|
128
129
|
"runtimeOS": "runtime_os",
|
|
129
|
-
|
|
130
|
+
|
|
130
131
|
# ZIdentity Edge Cases
|
|
131
132
|
# "clientJWKsUrl": "clientJWKsUrl",
|
|
132
133
|
}
|
|
@@ -184,14 +185,16 @@ def to_lower_camel_case(string):
|
|
|
184
185
|
"dns_resolution_on_transparent_proxy_ipv6_exempt_apps": "dnsResolutionOnTransparentProxyIPv6ExemptApps",
|
|
185
186
|
"dns_resolution_on_transparent_proxy_ipv6_url_categories": "dnsResolutionOnTransparentProxyIPv6UrlCategories",
|
|
186
187
|
"dns_resolution_on_transparent_proxy_ipv6_apps": "dnsResolutionOnTransparentProxyIPv6Apps",
|
|
187
|
-
"enable_ipv6_dns_optimization_on_all_transparent_proxy":
|
|
188
|
-
|
|
188
|
+
"enable_ipv6_dns_optimization_on_all_transparent_proxy":
|
|
189
|
+
"enableIPv6DnsOptimizationOnAllTransparentProxy",
|
|
190
|
+
"dns_resolution_on_transparent_proxy_ipv6_exempt_url_categories":
|
|
191
|
+
"dnsResolutionOnTransparentProxyIPv6ExemptUrlCategories",
|
|
189
192
|
"end_point_dlp_log_type": "endPointDLPLogType",
|
|
190
193
|
"email_dlp_log_type": "emailDLPLogType",
|
|
191
194
|
"extranet_dns_list": "extranetDNSList",
|
|
192
195
|
"primary_dns_server": "primaryDNSServer",
|
|
193
196
|
"secondary_dns_server": "secondaryDNSServer",
|
|
194
|
-
|
|
197
|
+
|
|
195
198
|
# ZCC Edge Case Attributes
|
|
196
199
|
"enable_udp_transport_selection": "enableUDPTransportSelection",
|
|
197
200
|
"intercept_zia_traffic_all_adapters": "interceptZIATrafficAllAdapters",
|
|
@@ -255,7 +258,7 @@ def to_lower_camel_case(string):
|
|
|
255
258
|
"delete_dhcp_option121_routes": "deleteDHCPOption121Routes",
|
|
256
259
|
"enableZiaDR": "enable_zia_dr",
|
|
257
260
|
"purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
|
|
258
|
-
|
|
261
|
+
|
|
259
262
|
# ZPA Edge Cases
|
|
260
263
|
"server_group_dtos": "serverGroupDTOs",
|
|
261
264
|
"extranet_dto": "extranetDTO",
|
|
@@ -321,17 +324,17 @@ def convert_keys_to_camel_case_selective(data, preserve_snake_case_keys=None):
|
|
|
321
324
|
Recursively convert keys to camelCase while preserving specific snake_case keys.
|
|
322
325
|
This function allows users to use snake_case for all attributes, and only converts
|
|
323
326
|
to camelCase if the attribute is NOT in the preserve_snake_case_keys set.
|
|
324
|
-
|
|
327
|
+
|
|
325
328
|
Args:
|
|
326
329
|
data: Dictionary or list to convert
|
|
327
330
|
preserve_snake_case_keys: Set of keys that should remain in snake_case
|
|
328
|
-
|
|
331
|
+
|
|
329
332
|
Returns:
|
|
330
333
|
Converted data with selective key preservation
|
|
331
334
|
"""
|
|
332
335
|
if preserve_snake_case_keys is None:
|
|
333
336
|
preserve_snake_case_keys = set()
|
|
334
|
-
|
|
337
|
+
|
|
335
338
|
if isinstance(data, dict):
|
|
336
339
|
result = {}
|
|
337
340
|
for k, v in data.items():
|
|
@@ -7,6 +7,85 @@ from http.client import HTTPConnection
|
|
|
7
7
|
|
|
8
8
|
LOG_FORMAT = "%(asctime)s - %(name)s - %(module)s - %(levelname)s - %(message)s"
|
|
9
9
|
|
|
10
|
+
# Fields to sanitize in logs (case-insensitive matching)
|
|
11
|
+
SENSITIVE_FIELDS = {
|
|
12
|
+
"password", "api_key", "apiKey", "apikey",
|
|
13
|
+
"clientSecret", "client_secret", "clientsecret",
|
|
14
|
+
"authorization", "Authorization",
|
|
15
|
+
"access_token", "accessToken", "accesstoken",
|
|
16
|
+
"refresh_token", "refreshToken", "refreshtoken",
|
|
17
|
+
"secret", "Secret",
|
|
18
|
+
"privateKey", "private_key", "privatekey",
|
|
19
|
+
"token", "Token",
|
|
20
|
+
"key", "Key",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# Sensitive header keys (case-insensitive)
|
|
24
|
+
SENSITIVE_HEADERS = {
|
|
25
|
+
"authorization", "x-api-key", "apikey", "api-key",
|
|
26
|
+
"clientsecret", "client-secret", "access-token",
|
|
27
|
+
"refresh-token", "x-auth-token",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _sanitize_for_logging(data):
|
|
32
|
+
"""
|
|
33
|
+
Recursively mask sensitive fields in dicts/lists for logging.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
data: The data structure to sanitize (dict, list, or other)
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Sanitized copy of the data with sensitive fields masked
|
|
40
|
+
"""
|
|
41
|
+
if isinstance(data, dict):
|
|
42
|
+
return {
|
|
43
|
+
k: "***REDACTED***" if k in SENSITIVE_FIELDS or k.lower() in SENSITIVE_FIELDS
|
|
44
|
+
else _sanitize_for_logging(v)
|
|
45
|
+
for k, v in data.items()
|
|
46
|
+
}
|
|
47
|
+
elif isinstance(data, list):
|
|
48
|
+
return [_sanitize_for_logging(item) for item in data]
|
|
49
|
+
else:
|
|
50
|
+
return data
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _sanitize_plaintext_for_logging(text):
|
|
54
|
+
"""
|
|
55
|
+
Scan and mask sensitive keywords in plaintext strings.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
text (str): Plain text that might contain sensitive data
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
str: Text with sensitive patterns masked
|
|
62
|
+
"""
|
|
63
|
+
import re
|
|
64
|
+
|
|
65
|
+
if not isinstance(text, str):
|
|
66
|
+
return text
|
|
67
|
+
|
|
68
|
+
# Patterns to match common sensitive data formats in plain text
|
|
69
|
+
# Match patterns like "password":"value", "password": "value", password=value, etc.
|
|
70
|
+
patterns = [
|
|
71
|
+
(r'("password"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
72
|
+
(r'("api_key"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
73
|
+
(r'("apiKey"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
74
|
+
(r'("clientSecret"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
75
|
+
(r'("client_secret"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
76
|
+
(r'("access_token"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
77
|
+
(r'("refresh_token"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
78
|
+
(r'("token"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
79
|
+
(r'("secret"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
80
|
+
(r'("privateKey"\s*:\s*")[^"]*(")', r'\1***REDACTED***\2'),
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
sanitized_text = text
|
|
84
|
+
for pattern, replacement in patterns:
|
|
85
|
+
sanitized_text = re.sub(pattern, replacement, sanitized_text, flags=re.IGNORECASE)
|
|
86
|
+
|
|
87
|
+
return sanitized_text
|
|
88
|
+
|
|
10
89
|
|
|
11
90
|
def setup_logging(logger_name="zscaler-sdk-python", enabled=None, verbose=None):
|
|
12
91
|
"""
|
|
@@ -66,12 +145,20 @@ def setup_logging(logger_name="zscaler-sdk-python", enabled=None, verbose=None):
|
|
|
66
145
|
|
|
67
146
|
|
|
68
147
|
def dump_request(logger, url: str, method: str, json, params, headers, request_uuid: str, body=True):
|
|
69
|
-
|
|
148
|
+
# Mask sensitive header values (e.g., Authorization, X-Api-Key, etc.)
|
|
149
|
+
request_headers_filtered = {
|
|
150
|
+
key: "***REDACTED***" if key.lower() in SENSITIVE_HEADERS else value
|
|
151
|
+
for key, value in headers.items()
|
|
152
|
+
}
|
|
153
|
+
|
|
70
154
|
# Log the request details before sending the request
|
|
71
155
|
log_lines = []
|
|
72
156
|
request_body = ""
|
|
73
|
-
if body:
|
|
74
|
-
|
|
157
|
+
if body and json:
|
|
158
|
+
# Sanitize request body before logging
|
|
159
|
+
sanitized_json = _sanitize_for_logging(json)
|
|
160
|
+
request_body = jsonp.dumps(sanitized_json)
|
|
161
|
+
|
|
75
162
|
log_lines.append(f"\n---[ ZSCALER SDK REQUEST | ID:{request_uuid} ]-------------------------------")
|
|
76
163
|
full_url = url
|
|
77
164
|
if params:
|
|
@@ -100,8 +187,13 @@ def dump_response(
|
|
|
100
187
|
duration_seconds = end_time - start_time
|
|
101
188
|
# Convert the duration to milliseconds
|
|
102
189
|
duration_ms = duration_seconds * 1000
|
|
103
|
-
|
|
104
|
-
|
|
190
|
+
|
|
191
|
+
# Mask sensitive headers in response
|
|
192
|
+
response_headers_dict = {
|
|
193
|
+
key: "***REDACTED***" if key.lower() in SENSITIVE_HEADERS else value
|
|
194
|
+
for key, value in dict(resp.headers).items()
|
|
195
|
+
}
|
|
196
|
+
|
|
105
197
|
full_url = url
|
|
106
198
|
if params:
|
|
107
199
|
full_url += "?" + urlencode(params)
|
|
@@ -116,10 +208,20 @@ def dump_response(
|
|
|
116
208
|
log_lines.append(f"{method} {full_url}")
|
|
117
209
|
for key, value in response_headers_dict.items():
|
|
118
210
|
log_lines.append(f"{key}: {value}")
|
|
211
|
+
|
|
119
212
|
response_body = ""
|
|
120
213
|
if resp.text:
|
|
121
214
|
response_body = resp.text
|
|
215
|
+
# Try to sanitize response body if it's JSON
|
|
216
|
+
try:
|
|
217
|
+
parsed_body = jsonp.loads(response_body)
|
|
218
|
+
sanitized_body = _sanitize_for_logging(parsed_body)
|
|
219
|
+
response_body = jsonp.dumps(sanitized_body)
|
|
220
|
+
except (jsonp.JSONDecodeError, ValueError):
|
|
221
|
+
# If not JSON, sanitize sensitive keywords in plaintext
|
|
222
|
+
response_body = _sanitize_plaintext_for_logging(response_body)
|
|
223
|
+
|
|
122
224
|
if response_body and response_body != "" and response_body != "null":
|
|
123
225
|
log_lines.append(f"\n{response_body}")
|
|
124
226
|
log_lines.append("-" * 68)
|
|
125
|
-
logger.info("\n".join(log_lines))
|
|
227
|
+
logger.info("\n".join(log_lines))
|
|
@@ -259,7 +259,7 @@ class Client:
|
|
|
259
259
|
if self._zidentity is None:
|
|
260
260
|
self._zidentity = ZIdentityService(self._request_executor)
|
|
261
261
|
return self._zidentity
|
|
262
|
-
|
|
262
|
+
|
|
263
263
|
def __enter__(self):
|
|
264
264
|
"""
|
|
265
265
|
Automatically create and set session within context manager.
|
|
@@ -276,7 +276,7 @@ class Client:
|
|
|
276
276
|
if hasattr(self, "_session"):
|
|
277
277
|
self._session.close()
|
|
278
278
|
self.logger.debug("Session closed.")
|
|
279
|
-
|
|
279
|
+
|
|
280
280
|
# Clean up Zscaler authentication session
|
|
281
281
|
if hasattr(self, '_request_executor'):
|
|
282
282
|
# For legacy clients, use their deauthenticate method
|
|
@@ -291,7 +291,7 @@ class Client:
|
|
|
291
291
|
service_type = getattr(self._request_executor, '_last_service_type', None)
|
|
292
292
|
if not service_type:
|
|
293
293
|
service_type = self._config.get("client", {}).get("service", "zia")
|
|
294
|
-
|
|
294
|
+
|
|
295
295
|
if service_type.lower() in ["zia", "ztw"]:
|
|
296
296
|
# For ZIA, deauthenticate only if mutations occurred; executor will decide.
|
|
297
297
|
self.logger.debug(f"Deauthenticating Zscaler session for {service_type} service.")
|
|
@@ -34,7 +34,7 @@ class OAuth:
|
|
|
34
34
|
self._access_token = None
|
|
35
35
|
self._token_expires_at = None
|
|
36
36
|
self._token_issued_at = None
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
# Initialize cache based on config
|
|
39
39
|
self._cache = self._initialize_cache()
|
|
40
40
|
self._cache_key = self._generate_cache_key()
|
|
@@ -45,38 +45,38 @@ class OAuth:
|
|
|
45
45
|
def _initialize_cache(self):
|
|
46
46
|
"""
|
|
47
47
|
Initialize cache based on configuration.
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
Returns:
|
|
50
50
|
Cache instance or None if caching is disabled
|
|
51
51
|
"""
|
|
52
52
|
cache_config = self._config.get("cache", {})
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
# If cache is already a cache instance, return it
|
|
55
55
|
if hasattr(cache_config, 'get') and hasattr(cache_config, 'add'):
|
|
56
56
|
return cache_config
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
# If cache is a dict with enabled flag
|
|
59
59
|
if isinstance(cache_config, dict) and cache_config.get("enabled", False):
|
|
60
60
|
from zscaler.cache.zscaler_cache import ZscalerCache
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
# Get TTL and TTI from config
|
|
63
63
|
ttl = cache_config.get("defaultTtl", 3600) # Default 1 hour
|
|
64
64
|
tti = cache_config.get("defaultTti", 1800) # Default 30 minutes
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
return ZscalerCache(ttl=ttl, tti=tti)
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
return None
|
|
69
69
|
|
|
70
70
|
def _generate_cache_key(self):
|
|
71
71
|
"""
|
|
72
72
|
Generate a unique cache key for this OAuth instance.
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
Returns:
|
|
75
75
|
str: Unique cache key based on client configuration
|
|
76
76
|
"""
|
|
77
77
|
# Handle legacy client configurations that don't have OneAPI OAuth fields
|
|
78
78
|
client_config = self._config.get("client", {})
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
# For legacy clients, use alternative identifiers
|
|
81
81
|
if "clientId" not in client_config:
|
|
82
82
|
# Legacy clients might have username, api_key, etc.
|
|
@@ -84,7 +84,7 @@ class OAuth:
|
|
|
84
84
|
api_key = client_config.get("api_key", "unknown")
|
|
85
85
|
cloud = client_config.get("cloud", "production").lower()
|
|
86
86
|
return f"oauth_token_legacy_{username}_{api_key}_{cloud}"
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
# For OneAPI clients, use the standard fields
|
|
89
89
|
client_id = client_config["clientId"]
|
|
90
90
|
vanity_domain = client_config["vanityDomain"]
|
|
@@ -94,13 +94,13 @@ class OAuth:
|
|
|
94
94
|
def _get_cached_token(self):
|
|
95
95
|
"""
|
|
96
96
|
Retrieve token from cache if available and enabled.
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
Returns:
|
|
99
99
|
dict: Cached token data or None if not available
|
|
100
100
|
"""
|
|
101
101
|
if not self._cache or not self._cache_enabled():
|
|
102
102
|
return None
|
|
103
|
-
|
|
103
|
+
|
|
104
104
|
try:
|
|
105
105
|
cached_data = self._cache.get(self._cache_key)
|
|
106
106
|
if cached_data and isinstance(cached_data, dict):
|
|
@@ -108,27 +108,27 @@ class OAuth:
|
|
|
108
108
|
return cached_data
|
|
109
109
|
except Exception as e:
|
|
110
110
|
logger.warning(f"Failed to retrieve token from cache: {e}")
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
return None
|
|
113
113
|
|
|
114
114
|
def _cache_token(self, access_token, expires_at):
|
|
115
115
|
"""
|
|
116
116
|
Cache the token if caching is enabled.
|
|
117
|
-
|
|
117
|
+
|
|
118
118
|
Args:
|
|
119
119
|
access_token (str): The access token to cache
|
|
120
120
|
expires_at (float): Token expiration timestamp
|
|
121
121
|
"""
|
|
122
122
|
if not self._cache or not self._cache_enabled():
|
|
123
123
|
return
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
try:
|
|
126
126
|
token_data = {
|
|
127
127
|
'access_token': access_token,
|
|
128
128
|
'expires_at': expires_at,
|
|
129
129
|
'issued_at': time.time()
|
|
130
130
|
}
|
|
131
|
-
|
|
131
|
+
|
|
132
132
|
# Store token data directly (not as tuple)
|
|
133
133
|
self._cache.add(self._cache_key, token_data)
|
|
134
134
|
logger.debug("Token cached successfully")
|
|
@@ -138,7 +138,7 @@ class OAuth:
|
|
|
138
138
|
def _cache_enabled(self):
|
|
139
139
|
"""
|
|
140
140
|
Check if caching is enabled in the configuration.
|
|
141
|
-
|
|
141
|
+
|
|
142
142
|
Returns:
|
|
143
143
|
bool: True if caching is enabled
|
|
144
144
|
"""
|
|
@@ -147,10 +147,10 @@ class OAuth:
|
|
|
147
147
|
def _is_token_expired(self, token_data=None):
|
|
148
148
|
"""
|
|
149
149
|
Check if the current token is expired.
|
|
150
|
-
|
|
150
|
+
|
|
151
151
|
Args:
|
|
152
152
|
token_data (dict, optional): Token data to check. If None, uses instance data.
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
Returns:
|
|
155
155
|
bool: True if token is expired
|
|
156
156
|
"""
|
|
@@ -179,7 +179,8 @@ class OAuth:
|
|
|
179
179
|
client_config = self._config.get("client", {})
|
|
180
180
|
if "clientId" not in client_config:
|
|
181
181
|
logging.error("OAuth authentication not available for legacy client configurations.")
|
|
182
|
-
raise ValueError("OAuth authentication not available for legacy client configurations.
|
|
182
|
+
raise ValueError("OAuth authentication not available for legacy client configurations. "
|
|
183
|
+
"Use legacy authentication methods instead.")
|
|
183
184
|
|
|
184
185
|
# logging.debug("Starting authentication process.")
|
|
185
186
|
client_id = client_config["clientId"]
|
|
@@ -329,7 +330,7 @@ class OAuth:
|
|
|
329
330
|
if "clientId" not in client_config:
|
|
330
331
|
logger.warning("OAuth client initialized with legacy configuration - OAuth functionality not available")
|
|
331
332
|
return None
|
|
332
|
-
|
|
333
|
+
|
|
333
334
|
# 1. Check cache first (if enabled)
|
|
334
335
|
cached_token = self._get_cached_token()
|
|
335
336
|
if cached_token and not self._is_token_expired(cached_token):
|
|
@@ -363,10 +364,10 @@ class OAuth:
|
|
|
363
364
|
expires_in = parsed_response.get("expires_in", 3600) # Default to 1 hour
|
|
364
365
|
self._token_expires_at = time.time() + expires_in
|
|
365
366
|
self._token_issued_at = time.time()
|
|
366
|
-
|
|
367
|
+
|
|
367
368
|
# Cache the new token
|
|
368
369
|
self._cache_token(self._access_token, self._token_expires_at)
|
|
369
|
-
|
|
370
|
+
|
|
370
371
|
logger.info(f"New access token obtained, expires in {expires_in} seconds")
|
|
371
372
|
else:
|
|
372
373
|
logging.error("Parsed response is not a dictionary as expected.")
|
|
@@ -403,7 +404,7 @@ class OAuth:
|
|
|
403
404
|
self._access_token = None
|
|
404
405
|
self._token_expires_at = None
|
|
405
406
|
self._token_issued_at = None
|
|
406
|
-
|
|
407
|
+
|
|
407
408
|
# Clear from cache if enabled
|
|
408
409
|
if self._cache and self._cache_enabled():
|
|
409
410
|
try:
|
|
@@ -411,13 +412,13 @@ class OAuth:
|
|
|
411
412
|
logger.debug("Token cleared from cache")
|
|
412
413
|
except Exception as e:
|
|
413
414
|
logger.warning(f"Failed to clear token from cache: {e}")
|
|
414
|
-
|
|
415
|
+
|
|
415
416
|
self._request_executor._default_headers.pop("Authorization", None)
|
|
416
417
|
|
|
417
418
|
def get_token_info(self):
|
|
418
419
|
"""
|
|
419
420
|
Get information about the current token status.
|
|
420
|
-
|
|
421
|
+
|
|
421
422
|
Returns:
|
|
422
423
|
dict: Token information including expiration and cache status
|
|
423
424
|
"""
|
|
@@ -430,10 +431,10 @@ class OAuth:
|
|
|
430
431
|
'time_until_expiry': None,
|
|
431
432
|
'cached': False
|
|
432
433
|
}
|
|
433
|
-
|
|
434
|
+
|
|
434
435
|
now = time.time()
|
|
435
436
|
time_until_expiry = self._token_expires_at - now if self._token_expires_at else None
|
|
436
|
-
|
|
437
|
+
|
|
437
438
|
return {
|
|
438
439
|
'has_token': True,
|
|
439
440
|
'expires_at': self._token_expires_at,
|