signalwire-sdk 3.4.1.dev112__tar.gz → 3.4.1.dev113__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.
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/PKG-INFO +1 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/pyproject.toml +1 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agent_server.py +1 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/__init__.py +4 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_middleware.py +25 -4
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/webhook_validator.py +60 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/LICENSE +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/setup.cfg +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/setup.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/build_search.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/capabilities.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/function_result.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/security_config.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_function.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_service.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_request_options.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/document_processor.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/index_builder.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_engine.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/search/search_service.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/spider/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/tests/test_mcp_integration.py +0 -0
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/__init__.py
RENAMED
|
@@ -52,7 +52,7 @@ if TYPE_CHECKING:
|
|
|
52
52
|
from signalwire.utils.schema_utils import SchemaValidationError
|
|
53
53
|
from signalwire.web import WebService
|
|
54
54
|
|
|
55
|
-
__version__ = "3.4.1.
|
|
55
|
+
__version__ = "3.4.1.dev113"
|
|
56
56
|
|
|
57
57
|
# §6.2-python (owner decision: NO packaging split — one package, all deps required;
|
|
58
58
|
# IMPORT-TIME behavior only): the agent/web symbols are lazy-imported via module
|
|
@@ -10,9 +10,11 @@ See LICENSE file in the project root for full license information.
|
|
|
10
10
|
from signalwire.core.security.webhook_validator import (
|
|
11
11
|
validate_request,
|
|
12
12
|
validate_webhook_signature,
|
|
13
|
+
validate_webhook_signature_sha256,
|
|
13
14
|
)
|
|
14
15
|
from signalwire.core.security.webhook_middleware import (
|
|
15
16
|
SIGNALWIRE_SIGNATURE_HEADER,
|
|
17
|
+
SIGNALWIRE_SHA256_SIGNATURE_HEADER,
|
|
16
18
|
TWILIO_COMPAT_SIGNATURE_HEADER,
|
|
17
19
|
make_webhook_validation_dependency,
|
|
18
20
|
)
|
|
@@ -25,6 +27,7 @@ from signalwire.core.security.security_utils import (
|
|
|
25
27
|
|
|
26
28
|
__all__ = [
|
|
27
29
|
"SENSITIVE_HEADERS",
|
|
30
|
+
"SIGNALWIRE_SHA256_SIGNATURE_HEADER",
|
|
28
31
|
"SIGNALWIRE_SIGNATURE_HEADER",
|
|
29
32
|
"TWILIO_COMPAT_SIGNATURE_HEADER",
|
|
30
33
|
"filter_sensitive_headers",
|
|
@@ -33,4 +36,5 @@ __all__ = [
|
|
|
33
36
|
"redact_url",
|
|
34
37
|
"validate_request",
|
|
35
38
|
"validate_webhook_signature",
|
|
39
|
+
"validate_webhook_signature_sha256",
|
|
36
40
|
]
|
|
@@ -44,10 +44,14 @@ from collections.abc import Awaitable, Callable, Mapping
|
|
|
44
44
|
|
|
45
45
|
from fastapi import HTTPException, Request, Response, status
|
|
46
46
|
|
|
47
|
-
from signalwire.core.security.webhook_validator import
|
|
47
|
+
from signalwire.core.security.webhook_validator import (
|
|
48
|
+
validate_webhook_signature,
|
|
49
|
+
validate_webhook_signature_sha256,
|
|
50
|
+
)
|
|
48
51
|
|
|
49
52
|
|
|
50
53
|
SIGNALWIRE_SIGNATURE_HEADER = "x-signalwire-signature"
|
|
54
|
+
SIGNALWIRE_SHA256_SIGNATURE_HEADER = "x-signalwire-sha256-signature"
|
|
51
55
|
TWILIO_COMPAT_SIGNATURE_HEADER = "x-twilio-signature"
|
|
52
56
|
|
|
53
57
|
|
|
@@ -69,8 +73,9 @@ def validate(
|
|
|
69
73
|
wrapper (:func:`make_webhook_validation_dependency` here) is the only idiom
|
|
70
74
|
on top of it.
|
|
71
75
|
|
|
72
|
-
The ``headers`` map is consulted for the signature header
|
|
73
|
-
|
|
76
|
+
The ``headers`` map is consulted for the signature header: the stronger
|
|
77
|
+
``X-SignalWire-Sha256-Signature`` is preferred when present, falling back to
|
|
78
|
+
``X-SignalWire-Signature`` (or the ``X-Twilio-Signature`` alias); ``method``
|
|
74
79
|
is accepted to keep a stable signature but is not part of the HMAC. Returns
|
|
75
80
|
``(403, {}, "")`` on any failure (missing/bad
|
|
76
81
|
signature, non-UTF-8 body, validator error) — no body detail, to avoid
|
|
@@ -92,6 +97,20 @@ def validate(
|
|
|
92
97
|
if not signing_key:
|
|
93
98
|
raise ValueError("signing_key is required")
|
|
94
99
|
|
|
100
|
+
# Prefer the stronger SHA-256 signature when the platform sends it
|
|
101
|
+
# (X-SignalWire-Sha256-Signature): same Scheme A message, SHA-256 hash. Fall
|
|
102
|
+
# back to the SHA-1 header below so deployments on older platform builds --
|
|
103
|
+
# and the cXML/form Scheme B path -- keep validating.
|
|
104
|
+
sha256_signature = headers.get(SIGNALWIRE_SHA256_SIGNATURE_HEADER)
|
|
105
|
+
if sha256_signature:
|
|
106
|
+
try:
|
|
107
|
+
if validate_webhook_signature_sha256(
|
|
108
|
+
signing_key, sha256_signature, url, body
|
|
109
|
+
):
|
|
110
|
+
return None
|
|
111
|
+
except (TypeError, ValueError):
|
|
112
|
+
pass # fall back to the SHA-1 header path below
|
|
113
|
+
|
|
95
114
|
signature = headers.get(SIGNALWIRE_SIGNATURE_HEADER)
|
|
96
115
|
if signature is None:
|
|
97
116
|
signature = headers.get(TWILIO_COMPAT_SIGNATURE_HEADER)
|
|
@@ -146,7 +165,8 @@ def make_webhook_validation_dependency(
|
|
|
146
165
|
|
|
147
166
|
1. Reads ``await request.body()`` and stashes the bytes on
|
|
148
167
|
``request.state.raw_body``.
|
|
149
|
-
2. Pulls the ``X-SignalWire-Signature``
|
|
168
|
+
2. Pulls the signature header (``X-SignalWire-Sha256-Signature`` preferred,
|
|
169
|
+
then ``X-SignalWire-Signature`` or the Twilio alias).
|
|
150
170
|
3. Reconstructs the public URL (proxy headers / env / fallback).
|
|
151
171
|
4. Calls :func:`validate_webhook_signature`.
|
|
152
172
|
5. On invalid signature: raises ``HTTPException(403)`` to short-circuit
|
|
@@ -205,6 +225,7 @@ def make_webhook_validation_dependency(
|
|
|
205
225
|
|
|
206
226
|
|
|
207
227
|
__all__ = [
|
|
228
|
+
"SIGNALWIRE_SHA256_SIGNATURE_HEADER",
|
|
208
229
|
"SIGNALWIRE_SIGNATURE_HEADER",
|
|
209
230
|
"TWILIO_COMPAT_SIGNATURE_HEADER",
|
|
210
231
|
"make_webhook_validation_dependency",
|
|
@@ -4,14 +4,18 @@ Webhook signature validation for SignalWire-signed HTTP requests.
|
|
|
4
4
|
Copyright (c) 2025 SignalWire. Licensed under the MIT License.
|
|
5
5
|
See LICENSE file in the project root for full license information.
|
|
6
6
|
|
|
7
|
-
Implements
|
|
7
|
+
Implements the SignalWire webhook signature schemes:
|
|
8
8
|
|
|
9
9
|
- Scheme A (RELAY/SWML/JSON): hex(HMAC-SHA1(key, url + raw_body))
|
|
10
|
+
- Scheme A / SHA-256: hex(HMAC-SHA256(key, url + raw_body)) -- the platform also
|
|
11
|
+
sends this as the ``X-SignalWire-Sha256-Signature`` header. Identical message
|
|
12
|
+
construction to Scheme A with a stronger hash; prefer it when present.
|
|
10
13
|
- Scheme B (Compat/cXML form): base64(HMAC-SHA1(key, url + sortedFormParams))
|
|
11
14
|
with optional bodySHA256 query-param fallback for JSON-on-compat-surface.
|
|
12
15
|
|
|
13
16
|
Public API:
|
|
14
17
|
validate_webhook_signature(signing_key, signature, url, raw_body) -> bool
|
|
18
|
+
validate_webhook_signature_sha256(signing_key, signature, url, raw_body) -> bool
|
|
15
19
|
validate_request(signing_key, signature, url, params_or_raw_body) -> bool
|
|
16
20
|
|
|
17
21
|
All comparisons use ``hmac.compare_digest`` (constant-time) so the secret
|
|
@@ -42,6 +46,15 @@ def _hex_hmac_sha1(key: str, message: str) -> str:
|
|
|
42
46
|
).hexdigest()
|
|
43
47
|
|
|
44
48
|
|
|
49
|
+
def _hex_hmac_sha256(key: str, message: str) -> str:
|
|
50
|
+
"""Scheme-A/SHA-256 digest: lowercase hex of HMAC-SHA256."""
|
|
51
|
+
return hmac.new(
|
|
52
|
+
key.encode("utf-8"),
|
|
53
|
+
message.encode("utf-8"),
|
|
54
|
+
hashlib.sha256,
|
|
55
|
+
).hexdigest()
|
|
56
|
+
|
|
57
|
+
|
|
45
58
|
def _b64_hmac_sha1(key: str, message: str) -> str:
|
|
46
59
|
"""Scheme-B digest: standard base64 of HMAC-SHA1."""
|
|
47
60
|
return base64.b64encode(
|
|
@@ -266,6 +279,51 @@ def validate_webhook_signature(
|
|
|
266
279
|
return False
|
|
267
280
|
|
|
268
281
|
|
|
282
|
+
def validate_webhook_signature_sha256(
|
|
283
|
+
signing_key: str,
|
|
284
|
+
signature: str,
|
|
285
|
+
url: str,
|
|
286
|
+
raw_body: str,
|
|
287
|
+
) -> bool:
|
|
288
|
+
"""Validate the SHA-256 webhook signature (Scheme A with a stronger hash).
|
|
289
|
+
|
|
290
|
+
SignalWire sends ``X-SignalWire-Sha256-Signature`` alongside the SHA-1
|
|
291
|
+
``X-SignalWire-Signature`` on signed webhooks. Its construction is the same
|
|
292
|
+
Scheme A message with SHA-256::
|
|
293
|
+
|
|
294
|
+
hex(HMAC-SHA256(signing_key, url + raw_body))
|
|
295
|
+
|
|
296
|
+
Only Scheme A (RELAY/SWML/JSON) is defined for this header; the legacy
|
|
297
|
+
cXML/form Scheme B stays on SHA-1 -- see :func:`validate_webhook_signature`.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
signing_key: Customer's Signing Key. ``None`` / empty raises
|
|
301
|
+
``ValueError`` (a programming error, not a validation failure).
|
|
302
|
+
signature: The ``X-SignalWire-Sha256-Signature`` header value (64-char
|
|
303
|
+
lowercase hex). Missing / empty returns False without raising.
|
|
304
|
+
url: The full public URL SignalWire POSTed to, exactly as the platform
|
|
305
|
+
saw it when it computed the signature.
|
|
306
|
+
raw_body: The raw request body as a UTF-8 string, BEFORE any parsing.
|
|
307
|
+
Must be a ``str`` -- passing a parsed dict raises ``TypeError``.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
True if the SHA-256 signature matches, False otherwise.
|
|
311
|
+
|
|
312
|
+
Raises:
|
|
313
|
+
ValueError: when ``signing_key`` is missing.
|
|
314
|
+
TypeError: when ``raw_body`` is not a string.
|
|
315
|
+
"""
|
|
316
|
+
if not signing_key:
|
|
317
|
+
raise ValueError("signing_key is required")
|
|
318
|
+
if not isinstance(raw_body, str):
|
|
319
|
+
raise TypeError("raw_body must be a str — did you pass parsed JSON by mistake?")
|
|
320
|
+
if signature is None or signature == "":
|
|
321
|
+
return False
|
|
322
|
+
|
|
323
|
+
expected = _hex_hmac_sha256(signing_key, url + raw_body)
|
|
324
|
+
return _safe_eq(expected, signature)
|
|
325
|
+
|
|
326
|
+
|
|
269
327
|
def validate_request(
|
|
270
328
|
signing_key: str,
|
|
271
329
|
signature: str,
|
|
@@ -326,4 +384,5 @@ def validate_request(
|
|
|
326
384
|
__all__ = [
|
|
327
385
|
"validate_request",
|
|
328
386
|
"validate_webhook_signature",
|
|
387
|
+
"validate_webhook_signature_sha256",
|
|
329
388
|
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/agents/bedrock.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/client.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/gateway.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/ai_chat/handoff.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/dokku.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/test_swaig.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/cli/types.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/agent_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/contexts.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/data_map.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/skill_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/core/web.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/pom/pom_tool.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/faq_bot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/prefabs/survey.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/call.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/client.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/constants.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/event.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/relay/message.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.4.1.dev112 → signalwire_sdk-3.4.1.dev113}/signalwire/signalwire/rest/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|