Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-azure-eventgrid for
openSUSE:Factory checked in at 2026-08-04 21:35:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-azure-eventgrid (Old)
and /work/SRC/openSUSE:Factory/.python-azure-eventgrid.new.16738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-azure-eventgrid"
Tue Aug 4 21:35:16 2026 rev:31 rq:1369319 version:4.22.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-azure-eventgrid/python-azure-eventgrid.changes
2025-05-15 17:03:01.086335704 +0200
+++
/work/SRC/openSUSE:Factory/.python-azure-eventgrid.new.16738/python-azure-eventgrid.changes
2026-08-04 21:38:14.584171881 +0200
@@ -1,0 +2,8 @@
+Mon Aug 3 14:32:15 UTC 2026 - John Paul Adrian Glaubitz
<[email protected]>
+
+- New upstream release
+ + Version 4.22.1
+ + For detailed information about changes see the
+ CHANGELOG.md file provided with this package
+
+-------------------------------------------------------------------
Old:
----
azure_eventgrid-4.22.0.tar.gz
New:
----
azure_eventgrid-4.22.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-azure-eventgrid.spec ++++++
--- /var/tmp/diff_new_pack.OwWHZx/_old 2026-08-04 21:38:15.276196720 +0200
+++ /var/tmp/diff_new_pack.OwWHZx/_new 2026-08-04 21:38:15.288197150 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-azure-eventgrid
#
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-azure-eventgrid
-Version: 4.22.0
+Version: 4.22.1
Release: 0
Summary: Microsoft Azure Event Grid Client Library
License: MIT
++++++ azure_eventgrid-4.22.0.tar.gz -> azure_eventgrid-4.22.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/CHANGELOG.md
new/azure_eventgrid-4.22.1/CHANGELOG.md
--- old/azure_eventgrid-4.22.0/CHANGELOG.md 2025-05-14 21:42:50.000000000
+0200
+++ new/azure_eventgrid-4.22.1/CHANGELOG.md 2026-07-29 07:58:01.000000000
+0200
@@ -1,5 +1,16 @@
# Release History
+## 4.22.1 (2026-07-28)
+
+### Bugs Fixed
+
+- Fixed a security issue where the legacy `EventGridPublisherClient` (sync and
async) could re-send credential headers to a different host when following an
HTTP 3xx redirect. A `SensitiveHeaderCleanupPolicy` is now added to the
pipeline to strip `Authorization`, `aeg-sas-key` and `aeg-sas-token` headers on
cross-host redirects.
+
+### Other Changes
+
+- Raised the minimum `azure-core` dependency to `1.38.3` so that credential
headers remain stripped across retries following a cross-host redirect
(`insecure_domain_change` flag persistence).
+- Increased the minimum supported Python version to 3.10. Python 3.9 and
earlier are no longer supported.
+
## 4.22.0 (2025-05-14)
### Features Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/PKG-INFO
new/azure_eventgrid-4.22.1/PKG-INFO
--- old/azure_eventgrid-4.22.0/PKG-INFO 2025-05-14 21:44:40.456189000 +0200
+++ new/azure_eventgrid-4.22.1/PKG-INFO 2026-07-29 07:58:41.977072500 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: azure-eventgrid
-Version: 4.22.0
+Version: 4.22.1
Summary: Microsoft Azure Event Grid Client Library for Python
Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk
Author: Microsoft Corporation
@@ -11,18 +11,30 @@
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: License :: OSI Approved :: MIT License
-Requires-Python: >=3.8
+Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: isodate>=0.6.1
-Requires-Dist: azure-core>=1.30.0
+Requires-Dist: azure-core>=1.38.3
Requires-Dist: typing-extensions>=4.6.0
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: description-content-type
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: license-file
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
# Azure Event Grid client library for Python
@@ -43,7 +55,7 @@
## Getting started
### Prerequisites
-* Python 3.8 or later is required to use this package.
+* Python 3.10 or later is required to use this package.
* You must have an [Azure subscription][azure_subscription] and at least one
of the following:
* an Event Grid Namespace resource. To create an Event Grid Namespace
resource follow [this
tutorial](https://learn.microsoft.com/azure/event-grid/create-view-manage-namespaces).
* an Event Grid Basic resource. To create an Event Grid Basic resource via
the Azure portal follow this [step-by-step
tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart-portal).
To create an Event Grid Basic resource via the [Azure
CLI](https://learn.microsoft.com/cli/azure) follow this
[tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/README.md
new/azure_eventgrid-4.22.1/README.md
--- old/azure_eventgrid-4.22.0/README.md 2025-05-14 21:42:50.000000000
+0200
+++ new/azure_eventgrid-4.22.1/README.md 2026-07-29 07:58:01.000000000
+0200
@@ -17,7 +17,7 @@
## Getting started
### Prerequisites
-* Python 3.8 or later is required to use this package.
+* Python 3.10 or later is required to use this package.
* You must have an [Azure subscription][azure_subscription] and at least one
of the following:
* an Event Grid Namespace resource. To create an Event Grid Namespace
resource follow [this
tutorial](https://learn.microsoft.com/azure/event-grid/create-view-manage-namespaces).
* an Event Grid Basic resource. To create an Event Grid Basic resource via
the Azure portal follow this [step-by-step
tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart-portal).
To create an Event Grid Basic resource via the [Azure
CLI](https://learn.microsoft.com/cli/azure) follow this
[tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/api.md
new/azure_eventgrid-4.22.1/api.md
--- old/azure_eventgrid-4.22.0/api.md 1970-01-01 01:00:00.000000000 +0100
+++ new/azure_eventgrid-4.22.1/api.md 2026-07-29 07:58:01.000000000 +0200
@@ -0,0 +1,672 @@
+```py
+namespace azure.eventgrid
+
+ def azure.eventgrid.generate_sas(
+ endpoint: str,
+ shared_access_key: str,
+ expiration_date_utc: datetime,
+ *,
+ api_version: str = constants.DEFAULT_API_VERSION
+ ) -> str: ...
+
+
+ class
azure.eventgrid.EventGridConsumerClient(InternalEventGridConsumerClient):
implements ContextManager
+
+ def __init__(
+ self,
+ endpoint: str,
+ credential: Union[AzureKeyCredential, TokenCredential],
+ *,
+ api_version: Optional[str] = ...,
+ namespace_topic: str,
+ subscription: str,
+ **kwargs: Any
+ ) -> None: ...
+
+ def __repr__(self) -> str: ...
+
+ @distributed_trace
+ def acknowledge(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> AcknowledgeResult: ...
+
+ def close(self) -> None: ...
+
+ @distributed_trace
+ def receive(
+ self,
+ *,
+ max_events: Optional[int] = ...,
+ max_wait_time: Optional[int] = ...,
+ **kwargs: Any
+ ) -> List[ReceiveDetails]: ...
+
+ @distributed_trace
+ def reject(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> RejectResult: ...
+
+ @api_version_validation(params_added_on={'2023-10-01-preview':
['release_delay']})
+ def release(
+ self,
+ *,
+ lock_tokens: List[str],
+ release_delay: Optional[Union[int, ReleaseDelay]] = ...,
+ **kwargs: Any
+ ) -> ReleaseResult: ...
+
+ @distributed_trace
+ @api_version_validation(method_added_on='2023-10-01-preview',
params_added_on={'2023-10-01-preview': ['api_version', 'content_type',
'accept']})
+ def renew_locks(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> RenewLocksResult: ...
+
+ def send_request(
+ self,
+ request: HttpRequest,
+ *,
+ stream: bool = False,
+ **kwargs: Any
+ ) -> HttpResponse: ...
+
+
+ class azure.eventgrid.EventGridEvent(InternalEventGridEvent):
+ data: object
+ data_version: str
+ event_time: datetime
+ event_type: str
+ id: str
+ metadata_version: str
+ subject: str
+ topic: str
+
+ def __eq__(self, other: Any) -> bool: ...
+
+ def __init__(
+ self,
+ subject: str,
+ event_type: str,
+ data: Any,
+ data_version: str,
+ *,
+ event_time: Optional[datetime] = ...,
+ id: Optional[str] = ...,
+ metadata_version: Optional[str] = ...,
+ topic: Optional[str] = ...,
+ **kwargs: Any
+ ) -> None: ...
+
+ def __ne__(self, other: Any) -> bool: ...
+
+ def __repr__(self) -> str: ...
+
+ def __str__(self) -> str: ...
+
+ @classmethod
+ def deserialize(
+ cls: Type[ModelType],
+ data: Any,
+ content_type: Optional[str] = None
+ ) -> ModelType: ...
+
+ @classmethod
+ def enable_additional_properties_sending(cls) -> None: ...
+
+ @classmethod
+ def from_dict(
+ cls: Type[ModelType],
+ data: Any,
+ key_extractors: Optional[Callable[[str, Dict[str, Any], Any],
Any]] = None,
+ content_type: Optional[str] = None
+ ) -> ModelType: ...
+
+ @classmethod
+ def from_json(cls, event: Any) -> EventGridEvent: ...
+
+ @classmethod
+ def is_xml_model(cls) -> bool: ...
+
+ def as_dict(
+ self,
+ keep_readonly: bool = True,
+ key_transformer: Callable[[str, Dict[str, Any], Any], Any] =
attribute_transformer,
+ **kwargs: Any
+ ) -> JSON: ...
+
+ def serialize(
+ self,
+ keep_readonly: bool = False,
+ **kwargs: Any
+ ) -> JSON: ...
+
+
+ class
azure.eventgrid.EventGridPublisherClient(InternalEventGridPublisherClient):
implements ContextManager
+
+ def __init__(
+ self,
+ endpoint: str,
+ credential: Union[AzureKeyCredential, AzureSasCredential,
TokenCredential],
+ *,
+ api_version: Optional[str] = ...,
+ namespace_topic: Optional[str] = ...,
+ **kwargs: Any
+ ) -> None: ...
+
+ def __repr__(self) -> str: ...
+
+ def close(self) -> None: ...
+
+ @distributed_trace
+ def send(
+ self,
+ events: Union[CloudEvent, List[CloudEvent], Dict[str, Any],
List[Dict[str, Any]], CNCFCloudEvent, List[CNCFCloudEvent], EventGridEvent,
List[EventGridEvent]],
+ *,
+ channel_name: Optional[str] = ...,
+ content_type: Optional[str] = ...,
+ **kwargs: Any
+ ) -> None: ...
+
+ def send_request(
+ self,
+ request: HttpRequest,
+ *,
+ stream: bool = False,
+ **kwargs: Any
+ ) -> HttpResponse: ...
+
+
+ class azure.eventgrid.SystemEventNames(str, Enum,
metaclass=CaseInsensitiveEnumMeta):
+ AcsAdvancedMessageDeliveryStatusUpdatedEventName =
"Microsoft.Communication.AdvancedMessageDeliveryStatusUpdated"
+ AcsAdvancedMessageReceivedEventName =
"Microsoft.Communication.AdvancedMessageReceived"
+ AcsCallEndedEventName = "Microsoft.Communication.CallEnded"
+ AcsCallParticipantAddedEventName =
"Microsoft.Communication.CallParticipantAdded"
+ AcsCallParticipantRemovedEventName =
"Microsoft.Communication.CallParticipantRemoved"
+ AcsCallStartedEventName = "Microsoft.Communication.CallStarted"
+ AcsChatAzureBotCommandReceivedInThreadEventName =
"Microsoft.Communication.ChatAzureBotCommandReceivedInThread"
+ AcsChatMemberAddedToThreadWithUserEventName =
"Microsoft.Communication.ChatMemberAddedToThreadWithUser"
+ AcsChatMemberRemovedFromThreadWithUserEventName =
"Microsoft.Communication.ChatMemberRemovedFromThreadWithUser"
+ AcsChatMessageDeletedEventName =
"Microsoft.Communication.ChatMessageDeleted"
+ AcsChatMessageDeletedInThreadEventName =
"Microsoft.Communication.ChatMessageDeletedInThread"
+ AcsChatMessageEditedEventName =
"Microsoft.Communication.ChatMessageEdited"
+ AcsChatMessageEditedInThreadEventName =
"Microsoft.Communication.ChatMessageEditedInThread"
+ AcsChatMessageReceivedEventName =
"Microsoft.Communication.ChatMessageReceived"
+ AcsChatMessageReceivedInThreadEventName =
"Microsoft.Communication.ChatMessageReceivedInThread"
+ AcsChatParticipantAddedToThreadEventName =
"Microsoft.Communication.ChatThreadParticipantAdded"
+ AcsChatParticipantAddedToThreadWithUserEventName =
"Microsoft.Communication.ChatParticipantAddedToThreadWithUser"
+ AcsChatParticipantRemovedFromThreadEventName =
"Microsoft.Communication.ChatThreadParticipantRemoved"
+ AcsChatParticipantRemovedFromThreadWithUserEventName =
"Microsoft.Communication.ChatParticipantRemovedFromThreadWithUser"
+ AcsChatThreadCreatedEventName =
"Microsoft.Communication.ChatThreadCreated"
+ AcsChatThreadCreatedWithUserEventName =
"Microsoft.Communication.ChatThreadCreatedWithUser"
+ AcsChatThreadDeletedEventName =
"Microsoft.Communication.ChatThreadDeleted"
+ AcsChatThreadParticipantAddedEventName =
"Microsoft.Communication.ChatThreadParticipantAdded"
+ AcsChatThreadParticipantRemovedEventName =
"Microsoft.Communication.ChatThreadParticipantRemoved"
+ AcsChatThreadPropertiesUpdatedEventName =
"Microsoft.Communication.ChatThreadPropertiesUpdated"
+ AcsChatThreadPropertiesUpdatedPerUserEventName =
"Microsoft.Communication.ChatThreadPropertiesUpdatedPerUser"
+ AcsChatThreadWithUserDeletedEventName =
"Microsoft.Communication.ChatThreadWithUserDeleted"
+ AcsChatTypingIndicatorReceivedInThreadEventName =
"Microsoft.Communication.ChatTypingIndicatorReceivedInThread"
+ AcsEmailDeliveryReportReceivedEventName =
"Microsoft.Communication.EmailDeliveryReportReceived"
+ AcsEmailEngagementTrackingReportReceivedEventName =
"Microsoft.Communication.EmailEngagementTrackingReportReceived"
+ AcsIncomingCallEventName = "Microsoft.Communication.IncomingCall"
+ AcsRecordingFileStatusUpdatedEventName =
"Microsoft.Communication.RecordingFileStatusUpdated"
+ AcsRouterJobCancelledEventName =
"Microsoft.Communication.RouterJobCancelled"
+ AcsRouterJobClassificationFailedEventName =
"Microsoft.Communication.RouterJobClassificationFailed"
+ AcsRouterJobClassifiedEventName =
"Microsoft.Communication.RouterJobClassified"
+ AcsRouterJobClosedEventName = "Microsoft.Communication.RouterJobClosed"
+ AcsRouterJobCompletedEventName =
"Microsoft.Communication.RouterJobCompleted"
+ AcsRouterJobDeletedEventName =
"Microsoft.Communication.RouterJobDeleted"
+ AcsRouterJobExceptionTriggeredEventName =
"Microsoft.Communication.RouterJobExceptionTriggered"
+ AcsRouterJobQueuedEventName = "Microsoft.Communication.RouterJobQueued"
+ AcsRouterJobReceivedEventName =
"Microsoft.Communication.RouterJobReceived"
+ AcsRouterJobSchedulingFailedEventName =
"Microsoft.Communication.RouterJobSchedulingFailed"
+ AcsRouterJobUnassignedEventName =
"Microsoft.Communication.RouterJobUnassigned"
+ AcsRouterJobWaitingForActivationEventName =
"Microsoft.Communication.RouterJobWaitingForActivation"
+ AcsRouterJobWorkerSelectorsExpiredEventName =
"Microsoft.Communication.RouterJobWorkerSelectorsExpired"
+ AcsRouterWorkerDeletedEventName =
"Microsoft.Communication.RouterWorkerDeleted"
+ AcsRouterWorkerDeregisteredEventName =
"Microsoft.Communication.RouterWorkerDeregistered"
+ AcsRouterWorkerOfferAcceptedEventName =
"Microsoft.Communication.RouterWorkerOfferAccepted"
+ AcsRouterWorkerOfferDeclinedEventName =
"Microsoft.Communication.RouterWorkerOfferDeclined"
+ AcsRouterWorkerOfferExpiredEventName =
"Microsoft.Communication.RouterWorkerOfferExpired"
+ AcsRouterWorkerOfferIssuedEventName =
"Microsoft.Communication.RouterWorkerOfferIssued"
+ AcsRouterWorkerOfferRevokedEventName =
"Microsoft.Communication.RouterWorkerOfferRevoked"
+ AcsRouterWorkerRegisteredEventName =
"Microsoft.Communication.RouterWorkerRegistered"
+ AcsRouterWorkerUpdatedEventName =
"Microsoft.Communication.RouterWorkerUpdated"
+ AcsSmsDeliveryReportReceivedEventName =
"Microsoft.Communication.SMSDeliveryReportReceived"
+ AcsSmsReceivedEventName = "Microsoft.Communication.SMSReceived"
+ AcsUserDisconnectedEventName =
"Microsoft.Communication.UserDisconnected"
+ ApiCenterApiDefinitionAddedEventName =
"Microsoft.ApiCenter.ApiDefinitionAdded"
+ ApiCenterApiDefinitionUpdatedEventName =
"Microsoft.ApiCenter.ApiDefinitionUpdated"
+ ApiManagementApiCreatedEventName = "Microsoft.ApiManagement.APICreated"
+ ApiManagementApiDeletedEventName = "Microsoft.ApiManagement.APIDeleted"
+ ApiManagementApiReleaseCreatedEventName =
"Microsoft.ApiManagement.APIReleaseCreated"
+ ApiManagementApiReleaseDeletedEventName =
"Microsoft.ApiManagement.APIReleaseDeleted"
+ ApiManagementApiReleaseUpdatedEventName =
"Microsoft.ApiManagement.APIReleaseUpdated"
+ ApiManagementApiUpdatedEventName = "Microsoft.ApiManagement.APIUpdated"
+ ApiManagementCircuitBreakerClosedEventName =
"Microsoft.ApiManagement.CircuitBreaker.Closed"
+ ApiManagementCircuitBreakerOpenedEventName =
"Microsoft.ApiManagement.CircuitBreaker.Opened"
+ ApiManagementGatewayApiAddedEventName =
"Microsoft.ApiManagement.GatewayAPIAdded"
+ ApiManagementGatewayApiRemovedEventName =
"Microsoft.ApiManagement.GatewayAPIRemoved"
+ ApiManagementGatewayCertificateAuthorityCreatedEventName =
"Microsoft.ApiManagement.GatewayCertificateAuthorityCreated"
+ ApiManagementGatewayCertificateAuthorityDeletedEventName =
"Microsoft.ApiManagement.GatewayCertificateAuthorityDeleted"
+ ApiManagementGatewayCertificateAuthorityUpdatedEventName =
"Microsoft.ApiManagement.GatewayCertificateAuthorityUpdated"
+ ApiManagementGatewayCreatedEventName =
"Microsoft.ApiManagement.GatewayCreated"
+ ApiManagementGatewayDeletedEventName =
"Microsoft.ApiManagement.GatewayDeleted"
+ ApiManagementGatewayHostnameConfigurationCreatedEventName =
"Microsoft.ApiManagement.GatewayHostnameConfigurationCreated"
+ ApiManagementGatewayHostnameConfigurationDeletedEventName =
"Microsoft.ApiManagement.GatewayHostnameConfigurationDeleted"
+ ApiManagementGatewayHostnameConfigurationUpdatedEventName =
"Microsoft.ApiManagement.GatewayHostnameConfigurationUpdated"
+ ApiManagementGatewayTokenExpiredEventName =
"Microsoft.ApiManagement.GatewayTokenExpired"
+ ApiManagementGatewayTokenNearExpiryEventName =
"Microsoft.ApiManagement.GatewayTokenNearExpiry"
+ ApiManagementGatewayUpdatedEventName =
"Microsoft.ApiManagement.GatewayUpdated"
+ ApiManagementProductCreatedEventName =
"Microsoft.ApiManagement.ProductCreated"
+ ApiManagementProductDeletedEventName =
"Microsoft.ApiManagement.ProductDeleted"
+ ApiManagementProductUpdatedEventName =
"Microsoft.ApiManagement.ProductUpdated"
+ ApiManagementSubscriptionCreatedEventName =
"Microsoft.ApiManagement.SubscriptionCreated"
+ ApiManagementSubscriptionDeletedEventName =
"Microsoft.ApiManagement.SubscriptionDeleted"
+ ApiManagementSubscriptionUpdatedEventName =
"Microsoft.ApiManagement.SubscriptionUpdated"
+ ApiManagementUserCreatedEventName =
"Microsoft.ApiManagement.UserCreated"
+ ApiManagementUserDeletedEventName =
"Microsoft.ApiManagement.UserDeleted"
+ ApiManagementUserUpdatedEventName =
"Microsoft.ApiManagement.UserUpdated"
+ AppConfigurationKeyValueDeletedEventName =
"Microsoft.AppConfiguration.KeyValueDeleted"
+ AppConfigurationKeyValueModifiedEventName =
"Microsoft.AppConfiguration.KeyValueModified"
+ AppConfigurationSnapshotCreatedEventName =
"Microsoft.AppConfiguration.SnapshotCreated"
+ AppConfigurationSnapshotModifiedEventName =
"Microsoft.AppConfiguration.SnapshotModified"
+ AvsClusterCreatedEventName = "Microsoft.AVS.ClusterCreated"
+ AvsClusterDeletedEventName = "Microsoft.AVS.ClusterDeleted"
+ AvsClusterFailedEventName = "Microsoft.AVS.ClusterFailed"
+ AvsClusterUpdatedEventName = "Microsoft.AVS.ClusterUpdated"
+ AvsClusterUpdatingEventName = "Microsoft.AVS.ClusterUpdating"
+ AvsPrivateCloudFailedEventName = "Microsoft.AVS.PrivateCloudFailed"
+ AvsPrivateCloudUpdatedEventName = "Microsoft.AVS.PrivateCloudUpdated"
+ AvsPrivateCloudUpdatingEventName = "Microsoft.AVS.PrivateCloudUpdating"
+ AvsScriptExecutionCancelledEventName =
"Microsoft.AVS.ScriptExecutionCancelled"
+ AvsScriptExecutionFailedEventName =
"Microsoft.AVS.ScriptExecutionFailed"
+ AvsScriptExecutionFinishedEventName =
"Microsoft.AVS.ScriptExecutionFinished"
+ AvsScriptExecutionStartedEventName =
"Microsoft.AVS.ScriptExecutionStarted"
+ ContainerRegistryArtifactEventName =
"Microsoft.AppConfiguration.KeyValueModified"
+ ContainerRegistryChartDeletedEventName =
"Microsoft.ContainerRegistry.ChartDeleted"
+ ContainerRegistryChartPushedEventName =
"Microsoft.ContainerRegistry.ChartPushed"
+ ContainerRegistryEventName = "Microsoft.ContainerRegistry.ChartPushed"
+ ContainerRegistryImageDeletedEventName =
"Microsoft.ContainerRegistry.ImageDeleted"
+ ContainerRegistryImagePushedEventName =
"Microsoft.ContainerRegistry.ImagePushed"
+ ContainerServiceClusterSupportEndedEventName =
"Microsoft.ContainerService.ClusterSupportEnded"
+ ContainerServiceClusterSupportEndingEventName =
"Microsoft.ContainerService.ClusterSupportEnding"
+ ContainerServiceNewKubernetesVersionAvailableEventName =
"Microsoft.ContainerService.NewKubernetesVersionAvailable"
+ ContainerServiceNodePoolRollingFailedEventName =
"Microsoft.ContainerService.NodePoolRollingFailed"
+ ContainerServiceNodePoolRollingStartedEventName =
"Microsoft.ContainerService.NodePoolRollingStarted"
+ ContainerServiceNodePoolRollingSucceededEventName =
"Microsoft.ContainerService.NodePoolRollingSucceeded"
+ DataBoxCopyCompletedEventName = "Microsoft.DataBox.CopyCompleted"
+ DataBoxCopyStartedEventName = "Microsoft.DataBox.CopyStarted"
+ DataBoxOrderCompletedEventName = "Microsoft.DataBox.OrderCompleted"
+ EdgeSolutionVersionPublishedEventName =
"Microsoft.Edge.SolutionVersionPublished"
+ EventGridMQTTClientCreatedOrUpdatedEventName =
"Microsoft.EventGrid.MQTTClientCreatedOrUpdated"
+ EventGridMQTTClientDeletedEventName =
"Microsoft.EventGrid.MQTTClientDeleted"
+ EventGridMQTTClientSessionConnectedEventName =
"Microsoft.EventGrid.MQTTClientSessionConnected"
+ EventGridMQTTClientSessionDisconnectedEventName =
"Microsoft.EventGrid.MQTTClientSessionDisconnected"
+ EventGridSubscriptionDeletedEventName =
"Microsoft.EventGrid.SubscriptionDeletedEvent"
+ EventGridSubscriptionValidationEventName =
"Microsoft.EventGrid.SubscriptionValidationEvent"
+ EventHubCaptureFileCreatedEventName =
"Microsoft.EventHub.CaptureFileCreated"
+ HealthcareDicomImageCreatedEventName =
"Microsoft.HealthcareApis.DicomImageCreated"
+ HealthcareDicomImageDeletedEventName =
"Microsoft.HealthcareApis.DicomImageDeleted"
+ HealthcareDicomImageUpdatedEventName =
"Microsoft.HealthcareApis.DicomImageUpdated"
+ HealthcareFhirResourceCreatedEventName =
"Microsoft.HealthcareApis.FhirResourceCreated"
+ HealthcareFhirResourceDeletedEventName =
"Microsoft.HealthcareApis.FhirResourceDeleted"
+ HealthcareFhirResourceUpdatedEventName =
"Microsoft.HealthcareApis.FhirResourceUpdated"
+ IoTHubDeviceConnectedEventName = "Microsoft.Devices.DeviceConnected"
+ IoTHubDeviceCreatedEventName = "Microsoft.Devices.DeviceCreated"
+ IoTHubDeviceDeletedEventName = "Microsoft.Devices.DeviceDeleted"
+ IoTHubDeviceDisconnectedEventName =
"Microsoft.Devices.DeviceDisconnected"
+ IotHubDeviceConnectedEventName = "Microsoft.Devices.DeviceConnected"
+ IotHubDeviceCreatedEventName = "Microsoft.Devices.DeviceCreated"
+ IotHubDeviceDeletedEventName = "Microsoft.Devices.DeviceDeleted"
+ IotHubDeviceDisconnectedEventName =
"Microsoft.Devices.DeviceDisconnected"
+ IotHubDeviceTelemetryEventName = "Microsoft.Devices.DeviceTelemetry"
+ KeyVaultAccessPolicyChangedEventName =
"Microsoft.KeyVault.VaultAccessPolicyChanged"
+ KeyVaultCertificateExpiredEventName =
"Microsoft.KeyVault.CertificateExpired"
+ KeyVaultCertificateNearExpiryEventName =
"Microsoft.KeyVault.CertificateNearExpiry"
+ KeyVaultCertificateNewVersionCreatedEventName =
"Microsoft.KeyVault.CertificateNewVersionCreated"
+ KeyVaultKeyExpiredEventName = "Microsoft.KeyVault.KeyExpired"
+ KeyVaultKeyNearExpiryEventName = "Microsoft.KeyVault.KeyNearExpiry"
+ KeyVaultKeyNewVersionCreatedEventName =
"Microsoft.KeyVault.KeyNewVersionCreated"
+ KeyVaultSecretExpiredEventName = "Microsoft.KeyVault.SecretExpired"
+ KeyVaultSecretNearExpiryEventName =
"Microsoft.KeyVault.SecretNearExpiry"
+ KeyVaultSecretNewVersionCreatedEventName =
"Microsoft.KeyVault.SecretNewVersionCreated"
+ KeyVaultVaultAccessPolicyChangedEventName =
"Microsoft.KeyVault.VaultAccessPolicyChanged"
+ MachineLearningServicesDatasetDriftDetectedEventName =
"Microsoft.MachineLearningServices.DatasetDriftDetected"
+ MachineLearningServicesModelDeployedEventName =
"Microsoft.MachineLearningServices.ModelDeployed"
+ MachineLearningServicesModelRegisteredEventName =
"Microsoft.MachineLearningServices.ModelRegistered"
+ MachineLearningServicesRunCompletedEventName =
"Microsoft.MachineLearningServices.RunCompleted"
+ MachineLearningServicesRunStatusChangedEventName =
"Microsoft.MachineLearningServices.RunStatusChanged"
+ MapsGeofenceEnteredEventName = "Microsoft.Maps.GeofenceEntered"
+ MapsGeofenceExitedEventName = "Microsoft.Maps.GeofenceExited"
+ MapsGeofenceResultEventName = "Microsoft.Maps.GeofenceResult"
+ MediaJobCanceledEventName = "Microsoft.Media.JobCanceled"
+ MediaJobCancelingEventName = "Microsoft.Media.JobCanceling"
+ MediaJobErroredEventName = "Microsoft.Media.JobErrored"
+ MediaJobFinishedEventName = "Microsoft.Media.JobFinished"
+ MediaJobOutputCanceledEventName = "Microsoft.Media.JobOutputCanceled"
+ MediaJobOutputCancelingEventName = "Microsoft.Media.JobOutputCanceling"
+ MediaJobOutputErroredEventName = "Microsoft.Media.JobOutputErrored"
+ MediaJobOutputFinishedEventName = "Microsoft.Media.JobOutputFinished"
+ MediaJobOutputProcessingEventName =
"Microsoft.Media.JobOutputProcessing"
+ MediaJobOutputProgressEventName = "Microsoft.Media.JobOutputProgress"
+ MediaJobOutputScheduledEventName = "Microsoft.Media.JobOutputScheduled"
+ MediaJobOutputStateChangeEventName =
"Microsoft.Media.JobOutputStateChange"
+ MediaJobProcessingEventName = "Microsoft.Media.JobProcessing"
+ MediaJobScheduledEventName = "Microsoft.Media.JobScheduled"
+ MediaJobStateChangeEventName = "Microsoft.Media.JobStateChange"
+ MediaLiveEventChannelArchiveHeartbeatEventName =
"Microsoft.Media.LiveEventChannelArchiveHeartbeat"
+ MediaLiveEventConnectionRejectedEventName =
"Microsoft.Media.LiveEventConnectionRejected"
+ MediaLiveEventEncoderConnectedEventName =
"Microsoft.Media.LiveEventEncoderConnected"
+ MediaLiveEventEncoderDisconnectedEventName =
"Microsoft.Media.LiveEventEncoderDisconnected"
+ MediaLiveEventIncomingDataChunkDroppedEventName =
"Microsoft.Media.LiveEventIncomingDataChunkDropped"
+ MediaLiveEventIncomingStreamReceivedEventName =
"Microsoft.Media.LiveEventIncomingStreamReceived"
+ MediaLiveEventIncomingStreamsOutOfSyncEventName =
"Microsoft.Media.LiveEventIncomingStreamsOutOfSync"
+ MediaLiveEventIncomingVideoStreamsOutOfSyncEventName =
"Microsoft.Media.LiveEventIncomingVideoStreamsOutOfSync"
+ MediaLiveEventIngestHeartbeatEventName =
"Microsoft.Media.LiveEventIngestHeartbeat"
+ MediaLiveEventTrackDiscontinuityDetectedEventName =
"Microsoft.Media.LiveEventTrackDiscontinuityDetected"
+ PolicyInsightsPolicyStateChangedEventName =
"Microsoft.PolicyInsights.PolicyStateChanged"
+ PolicyInsightsPolicyStateCreatedEventName =
"Microsoft.PolicyInsights.PolicyStateCreated"
+ PolicyInsightsPolicyStateDeletedEventName =
"Microsoft.PolicyInsights.PolicyStateDeleted"
+ RedisExportRDBCompletedEventName = "Microsoft.Cache.ExportRDBCompleted"
+ RedisImportRDBCompletedEventName = "Microsoft.Cache.ImportRDBCompleted"
+ RedisPatchingCompletedEventName = "Microsoft.Cache.PatchingCompleted"
+ RedisScalingCompletedEventName = "Microsoft.Cache.ScalingCompleted"
+ ResourceActionCancelEventName =
"Microsoft.Resources.ResourceActionCancel"
+ ResourceActionCancelName = "Microsoft.Resources.ResourceActionCancel"
+ ResourceActionFailureEventName =
"Microsoft.Resources.ResourceActionFailure"
+ ResourceActionFailureName = "Microsoft.Resources.ResourceActionFailure"
+ ResourceActionSuccessEventName =
"Microsoft.Resources.ResourceActionSuccess"
+ ResourceActionSuccessName = "Microsoft.Resources.ResourceActionSuccess"
+ ResourceDeleteCancelEventName =
"Microsoft.Resources.ResourceDeleteCancel"
+ ResourceDeleteCancelName = "Microsoft.Resources.ResourceDeleteCancel"
+ ResourceDeleteFailureEventName =
"Microsoft.Resources.ResourceDeleteFailure"
+ ResourceDeleteFailureName = "Microsoft.Resources.ResourceDeleteFailure"
+ ResourceDeleteSuccessEventName =
"Microsoft.Resources.ResourceDeleteSuccess"
+ ResourceDeleteSuccessName = "Microsoft.Resources.ResourceDeleteSuccess"
+ ResourceNotificationsContainerServiceEventResourcesScheduledEventName
=
"Microsoft.ResourceNotifications.ContainerServiceEventResources.ScheduledEventEmitted"
+ ResourceNotificationsHealthResourcesAnnotatedEventName =
"Microsoft.ResourceNotifications.HealthResources.ResourceAnnotated"
+ ResourceNotificationsHealthResourcesAvailabilityStatusChangedEventName
= "Microsoft.ResourceNotifications.HealthResources.AvailabilityStatusChanged"
+ ResourceNotificationsResourceManagementCreatedOrUpdatedEventName =
"Microsoft.ResourceNotifications.Resources.CreatedOrUpdated"
+ ResourceNotificationsResourceManagementDeletedEventName =
"Microsoft.ResourceNotifications.Resources.Deleted"
+ ResourceWriteCancelEventName =
"Microsoft.Resources.ResourceWriteCancel"
+ ResourceWriteCancelName = "Microsoft.Resources.ResourceWriteCancel"
+ ResourceWriteFailureEventName =
"Microsoft.Resources.ResourceWriteFailure"
+ ResourceWriteFailureName = "Microsoft.Resources.ResourceWriteFailure"
+ ResourceWriteSuccessEventName =
"Microsoft.Resources.ResourceWriteSuccess"
+ ResourceWriteSuccessName = "Microsoft.Resources.ResourceWriteSuccess"
+ ServiceBusActiveMessagesAvailablePeriodicNotificationsEventName =
"Microsoft.ServiceBus.ActiveMessagesAvailablePeriodicNotifications"
+ ServiceBusActiveMessagesAvailableWithNoListenersEventName =
"Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners"
+ ServiceBusDeadletterMessagesAvailablePeriodicNotificationsEventName =
"Microsoft.ServiceBus.DeadletterMessagesAvailablePeriodicNotifications"
+ ServiceBusDeadletterMessagesAvailableWithNoListenerEventName =
"Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners"
+ ServiceBusDeadletterMessagesAvailableWithNoListenersEventName =
"Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners"
+ SignalRServiceClientConnectionConnectedEventName =
"Microsoft.SignalRService.ClientConnectionConnected"
+ SignalRServiceClientConnectionDisconnectedEventName =
"Microsoft.SignalRService.ClientConnectionDisconnected"
+ StorageAsyncOperationInitiatedEventName =
"Microsoft.Storage.AsyncOperationInitiated"
+ StorageBlobCreatedEventName = "Microsoft.Storage.BlobCreated"
+ StorageBlobDeletedEventName = "Microsoft.Storage.BlobDeleted"
+ StorageBlobInventoryPolicyCompletedEventName =
"Microsoft.Storage.BlobInventoryPolicyCompleted"
+ StorageBlobRenamedEventName = "Microsoft.Storage.BlobRenamed"
+ StorageBlobTierChangedEventName = "Microsoft.Storage.BlobTierChanged"
+ StorageDirectoryCreatedEventName = "Microsoft.Storage.DirectoryCreated"
+ StorageDirectoryDeletedEventName = "Microsoft.Storage.DirectoryDeleted"
+ StorageDirectoryRenamedEventName = "Microsoft.Storage.DirectoryRenamed"
+ StorageLifecyclePolicyCompletedEventName =
"Microsoft.Storage.LifecyclePolicyCompleted"
+ StorageTaskAssignmentCompletedEventName =
"Microsoft.Storage.StorageTaskAssignmentCompleted"
+ StorageTaskAssignmentQueuedEventName =
"Microsoft.Storage.StorageTaskAssignmentQueued"
+ StorageTaskCompletedEventName =
"Microsoft.Storage.StorageTaskCompleted"
+ StorageTaskQueuedEventName = "Microsoft.Storage.StorageTaskQueued"
+ SubscriptionDeletedEventName =
"Microsoft.EventGrid.SubscriptionDeletedEvent"
+ SubscriptionValidationEventName =
"Microsoft.EventGrid.SubscriptionValidationEvent"
+ WebAppServicePlanUpdatedEventName =
"Microsoft.Web.AppServicePlanUpdated"
+ WebAppUpdatedEventName = "Microsoft.Web.AppUpdated"
+ WebBackupOperationCompletedEventName =
"Microsoft.Web.BackupOperationCompleted"
+ WebBackupOperationFailedEventName =
"Microsoft.Web.BackupOperationFailed"
+ WebBackupOperationStartedEventName =
"Microsoft.Web.BackupOperationStarted"
+ WebRestoreOperationCompletedEventName =
"Microsoft.Web.RestoreOperationCompleted"
+ WebRestoreOperationFailedEventName =
"Microsoft.Web.RestoreOperationFailed"
+ WebRestoreOperationStartedEventName =
"Microsoft.Web.RestoreOperationStarted"
+ WebSlotSwapCompletedEventName = "Microsoft.Web.SlotSwapCompleted"
+ WebSlotSwapFailedEventName = "Microsoft.Web.SlotSwapFailed"
+ WebSlotSwapStartedEventName = "Microsoft.Web.SlotSwapStarted"
+ WebSlotSwapWithPreviewCancelledEventName =
"Microsoft.Web.SlotSwapWithPreviewCancelled"
+ WebSlotSwapWithPreviewStartedEventName =
"Microsoft.Web.SlotSwapWithPreviewStarted"
+
+
+namespace azure.eventgrid.aio
+
+ class
azure.eventgrid.aio.EventGridConsumerClient(InternalEventGridConsumerClient):
implements AsyncContextManager
+
+ def __init__(
+ self,
+ endpoint: str,
+ credential: Union[AzureKeyCredential, AsyncTokenCredential],
+ *,
+ api_version: Optional[str] = ...,
+ namespace_topic: str,
+ subscription: str,
+ **kwargs: Any
+ ) -> None: ...
+
+ def __repr__(self) -> str: ...
+
+ @distributed_trace_async
+ async def acknowledge(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> AcknowledgeResult: ...
+
+ async def close(self) -> None: ...
+
+ @distributed_trace_async
+ async def receive(
+ self,
+ *,
+ max_events: Optional[int] = ...,
+ max_wait_time: Optional[int] = ...,
+ **kwargs: Any
+ ) -> List[ReceiveDetails]: ...
+
+ @distributed_trace_async
+ async def reject(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> RejectResult: ...
+
+ @distributed_trace_async
+ @api_version_validation(params_added_on={'2023-10-01-preview':
['release_delay']})
+ async def release(
+ self,
+ *,
+ lock_tokens: List[str],
+ release_delay: Optional[Union[int, ReleaseDelay]] = ...,
+ **kwargs: Any
+ ) -> ReleaseResult: ...
+
+ @distributed_trace_async
+ @api_version_validation(method_added_on='2023-10-01-preview',
params_added_on={'2023-10-01-preview': ['api_version', 'content_type',
'accept']})
+ async def renew_locks(
+ self,
+ *,
+ lock_tokens: List[str],
+ **kwargs: Any
+ ) -> RenewLocksResult: ...
+
+ def send_request(
+ self,
+ request: HttpRequest,
+ *,
+ stream: bool = False,
+ **kwargs: Any
+ ) -> Awaitable[AsyncHttpResponse]: ...
+
+
+ class
azure.eventgrid.aio.EventGridPublisherClient(InternalEventGridPublisherClient):
implements AsyncContextManager
+
+ def __init__(
+ self,
+ endpoint: str,
+ credential: Union[AzureKeyCredential, AzureSasCredential,
AsyncTokenCredential],
+ *,
+ api_version: Optional[str] = ...,
+ namespace_topic: Optional[str] = ...,
+ **kwargs: Any
+ ) -> None: ...
+
+ def __repr__(self) -> str: ...
+
+ async def close(self) -> None: ...
+
+ @distributed_trace_async
+ async def send(
+ self,
+ events: Union[CloudEvent, List[CloudEvent], Dict[str, Any],
List[Dict[str, Any]], CNCFCloudEvent, List[CNCFCloudEvent], EventGridEvent,
List[EventGridEvent]],
+ *,
+ channel_name: Optional[str] = ...,
+ content_type: Optional[str] = ...,
+ **kwargs: Any
+ ) -> None: ...
+
+ def send_request(
+ self,
+ request: HttpRequest,
+ *,
+ stream: bool = False,
+ **kwargs: Any
+ ) -> Awaitable[AsyncHttpResponse]: ...
+
+
+namespace azure.eventgrid.models
+
+ class azure.eventgrid.models.AcknowledgeResult(Model):
+ failed_lock_tokens: List[FailedLockToken]
+ succeeded_lock_tokens: List[str]
+
+ @overload
+ def __init__(
+ self,
+ *,
+ failed_lock_tokens: List[FailedLockToken],
+ succeeded_lock_tokens: List[str]
+ ) -> None: ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]) -> None: ...
+
+
+ class azure.eventgrid.models.BrokerProperties(InternalBrokerProperties):
+ delivery_count: int
+ lock_token: str
+
+ @overload
+ def __init__(
+ self,
+ *,
+ delivery_count: int,
+ lock_token: str
+ ): ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]): ...
+
+
+ class azure.eventgrid.models.FailedLockToken(Model):
+ error: ODataV4Format
+ lock_token: str
+
+ @overload
+ def __init__(
+ self,
+ *,
+ error: ODataV4Format,
+ lock_token: str
+ ) -> None: ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]) -> None: ...
+
+
+ class azure.eventgrid.models.ReceiveDetails(InternalReceiveDetails,
Generic[DataType]):
+ broker_properties: BrokerProperties
+ event: CloudEvent
+
+ @overload
+ def __init__(
+ self,
+ *,
+ broker_properties: BrokerProperties,
+ event: CloudEvent[DataType]
+ ): ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]): ...
+
+
+ class azure.eventgrid.models.RejectResult(Model):
+ failed_lock_tokens: List[FailedLockToken]
+ succeeded_lock_tokens: List[str]
+
+ @overload
+ def __init__(
+ self,
+ *,
+ failed_lock_tokens: List[FailedLockToken],
+ succeeded_lock_tokens: List[str]
+ ) -> None: ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]) -> None: ...
+
+
+ class azure.eventgrid.models.ReleaseDelay(str, Enum,
metaclass=CaseInsensitiveEnumMeta):
+ NO_DELAY = "0"
+ ONE_HOUR = "3600"
+ ONE_MINUTE = "60"
+ TEN_MINUTES = "600"
+ TEN_SECONDS = "10"
+
+
+ class azure.eventgrid.models.ReleaseResult(Model):
+ failed_lock_tokens: List[FailedLockToken]
+ succeeded_lock_tokens: List[str]
+
+ @overload
+ def __init__(
+ self,
+ *,
+ failed_lock_tokens: List[FailedLockToken],
+ succeeded_lock_tokens: List[str]
+ ) -> None: ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]) -> None: ...
+
+
+ class azure.eventgrid.models.RenewLocksResult(Model):
+ failed_lock_tokens: List[FailedLockToken]
+ succeeded_lock_tokens: List[str]
+
+ @overload
+ def __init__(
+ self,
+ *,
+ failed_lock_tokens: List[FailedLockToken],
+ succeeded_lock_tokens: List[str]
+ ) -> None: ...
+
+ @overload
+ def __init__(self, mapping: Mapping[str, Any]) -> None: ...
+
+
+```
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure/eventgrid/_legacy/_publisher_client.py
new/azure_eventgrid-4.22.1/azure/eventgrid/_legacy/_publisher_client.py
--- old/azure_eventgrid-4.22.0/azure/eventgrid/_legacy/_publisher_client.py
2025-05-14 21:42:50.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure/eventgrid/_legacy/_publisher_client.py
2026-07-29 07:58:01.000000000 +0200
@@ -20,6 +20,7 @@
DistributedTracingPolicy,
HttpLoggingPolicy,
UserAgentPolicy,
+ SensitiveHeaderCleanupPolicy,
)
from azure.core.exceptions import (
ClientAuthenticationError,
@@ -121,6 +122,16 @@
**kwargs: Any
) -> List[Any]:
auth_policy = _get_authentication_policy(credential)
+ # Merge any caller-supplied blocked redirect headers with the mandatory
+ # Event Grid credential headers, and remove the key from kwargs so it
is
+ # not passed twice to SensitiveHeaderCleanupPolicy.
+ blocked_redirect_headers = [
+ "Authorization",
+ "x-ms-authorization-auxiliary",
+ "aeg-sas-key",
+ "aeg-sas-token",
+ *kwargs.pop("blocked_redirect_headers", []),
+ ]
sdk_moniker = "eventgrid/{}".format(VERSION)
policies = [
RequestIdPolicy(**kwargs),
@@ -131,6 +142,14 @@
RedirectPolicy(**kwargs),
RetryPolicy(**kwargs),
auth_policy,
+ # Strip credential headers on cross-host redirects to avoid
leaking them to
+ # a redirect target. `SensitiveHeaderCleanupPolicy` already covers
+ # `Authorization` and `x-ms-authorization-auxiliary` by default;
the Event
+ # Grid SAS headers (`aeg-sas-key`/`aeg-sas-token`) are added here
as well.
+ SensitiveHeaderCleanupPolicy(
+ blocked_redirect_headers=blocked_redirect_headers,
+ **kwargs,
+ ),
CustomHookPolicy(**kwargs),
NetworkTraceLoggingPolicy(**kwargs),
DistributedTracingPolicy(**kwargs),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure/eventgrid/_legacy/aio/_publisher_client_async.py
new/azure_eventgrid-4.22.1/azure/eventgrid/_legacy/aio/_publisher_client_async.py
---
old/azure_eventgrid-4.22.0/azure/eventgrid/_legacy/aio/_publisher_client_async.py
2025-05-14 21:42:50.000000000 +0200
+++
new/azure_eventgrid-4.22.1/azure/eventgrid/_legacy/aio/_publisher_client_async.py
2026-07-29 07:58:01.000000000 +0200
@@ -23,6 +23,7 @@
HttpLoggingPolicy,
UserAgentPolicy,
AsyncBearerTokenCredentialPolicy,
+ SensitiveHeaderCleanupPolicy,
)
from azure.core.exceptions import (
ClientAuthenticationError,
@@ -115,6 +116,16 @@
credential: Union[AzureKeyCredential, AzureSasCredential,
"AsyncTokenCredential"], **kwargs: Any
) -> List[Any]:
auth_policy = _get_authentication_policy(credential,
AsyncBearerTokenCredentialPolicy)
+ # Merge any caller-supplied blocked redirect headers with the mandatory
+ # Event Grid credential headers, and remove the key from kwargs so it
is
+ # not passed twice to SensitiveHeaderCleanupPolicy.
+ blocked_redirect_headers = [
+ "Authorization",
+ "x-ms-authorization-auxiliary",
+ "aeg-sas-key",
+ "aeg-sas-token",
+ *kwargs.pop("blocked_redirect_headers", []),
+ ]
sdk_moniker = "eventgridpublisherclient/{}".format(VERSION)
policies = [
RequestIdPolicy(**kwargs),
@@ -125,6 +136,14 @@
AsyncRedirectPolicy(**kwargs),
AsyncRetryPolicy(**kwargs),
auth_policy,
+ # Strip credential headers on cross-host redirects to avoid
leaking them to
+ # a redirect target. `SensitiveHeaderCleanupPolicy` already covers
+ # `Authorization` and `x-ms-authorization-auxiliary` by default;
the Event
+ # Grid SAS headers (`aeg-sas-key`/`aeg-sas-token`) are added here
as well.
+ SensitiveHeaderCleanupPolicy(
+ blocked_redirect_headers=blocked_redirect_headers,
+ **kwargs,
+ ),
CustomHookPolicy(**kwargs),
NetworkTraceLoggingPolicy(**kwargs),
DistributedTracingPolicy(**kwargs),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure/eventgrid/_model_base.py
new/azure_eventgrid-4.22.1/azure/eventgrid/_model_base.py
--- old/azure_eventgrid-4.22.0/azure/eventgrid/_model_base.py 2025-05-14
21:42:50.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure/eventgrid/_model_base.py 2026-07-29
07:58:01.000000000 +0200
@@ -774,16 +774,16 @@
# is it optional?
try:
- if any(a for a in annotation.__args__ if a == type(None)): # pyright:
ignore
+ if any(a for a in annotation.__args__ if a == type(None)): # pyright:
ignore # pylint: disable=unidiomatic-typecheck
if len(annotation.__args__) <= 2: # pyright: ignore
if_obj_deserializer =
_get_deserialize_callable_from_annotation(
- next(a for a in annotation.__args__ if a != type(None)),
module, rf # pyright: ignore
+ next(a for a in annotation.__args__ if a != type(None)),
module, rf # pyright: ignore # pylint: disable=unidiomatic-typecheck
)
return functools.partial(_deserialize_with_optional,
if_obj_deserializer)
# the type is Optional[Union[...]], we need to remove the None
type from the Union
annotation_copy = copy.copy(annotation)
- annotation_copy.__args__ = [a for a in annotation_copy.__args__ if
a != type(None)] # pyright: ignore
+ annotation_copy.__args__ = [a for a in annotation_copy.__args__ if
a != type(None)] # pyright: ignore # pylint: disable=unidiomatic-typecheck
return _get_deserialize_callable_from_annotation(annotation_copy,
module, rf)
except AttributeError:
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure/eventgrid/_serialization.py
new/azure_eventgrid-4.22.1/azure/eventgrid/_serialization.py
--- old/azure_eventgrid-4.22.0/azure/eventgrid/_serialization.py
2025-05-14 21:42:50.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure/eventgrid/_serialization.py
2026-07-29 07:58:01.000000000 +0200
@@ -189,7 +189,7 @@
class UTC(datetime.tzinfo):
"""Time Zone info for handling UTC"""
- def utcoffset(self, dt):
+ def utcoffset(self, dt): # pylint: disable=unused-argument
"""UTF offset for UTC is 0.
:param datetime.datetime dt: The datetime
@@ -198,7 +198,7 @@
"""
return datetime.timedelta(0)
- def tzname(self, dt):
+ def tzname(self, dt): # pylint: disable=unused-argument
"""Timestamp representation.
:param datetime.datetime dt: The datetime
@@ -207,7 +207,7 @@
"""
return "Z"
- def dst(self, dt):
+ def dst(self, dt): # pylint: disable=unused-argument
"""No daylight saving for UTC.
:param datetime.datetime dt: The datetime
@@ -230,16 +230,16 @@
def __init__(self, offset) -> None:
self.__offset = offset
- def utcoffset(self, dt):
+ def utcoffset(self, dt): # pylint: disable=unused-argument
return self.__offset
- def tzname(self, dt):
+ def tzname(self, dt): # pylint: disable=unused-argument
return str(self.__offset.total_seconds() / 3600)
def __repr__(self):
return "<FixedOffset {}>".format(self.tzname(None))
- def dst(self, dt):
+ def dst(self, dt): # pylint: disable=unused-argument
return datetime.timedelta(0)
def __getinitargs__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/azure/eventgrid/_version.py
new/azure_eventgrid-4.22.1/azure/eventgrid/_version.py
--- old/azure_eventgrid-4.22.0/azure/eventgrid/_version.py 2025-05-14
21:42:50.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure/eventgrid/_version.py 2026-07-29
07:58:01.000000000 +0200
@@ -6,4 +6,4 @@
# Changes may cause incorrect behavior and will be lost if the code is
regenerated.
# --------------------------------------------------------------------------
-VERSION = "4.22.0"
+VERSION = "4.22.1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/PKG-INFO
new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/PKG-INFO
--- old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/PKG-INFO
2025-05-14 21:44:40.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/PKG-INFO
2026-07-29 07:58:41.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: azure-eventgrid
-Version: 4.22.0
+Version: 4.22.1
Summary: Microsoft Azure Event Grid Client Library for Python
Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk
Author: Microsoft Corporation
@@ -11,18 +11,30 @@
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: License :: OSI Approved :: MIT License
-Requires-Python: >=3.8
+Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: isodate>=0.6.1
-Requires-Dist: azure-core>=1.30.0
+Requires-Dist: azure-core>=1.38.3
Requires-Dist: typing-extensions>=4.6.0
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: description-content-type
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: license-file
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
# Azure Event Grid client library for Python
@@ -43,7 +55,7 @@
## Getting started
### Prerequisites
-* Python 3.8 or later is required to use this package.
+* Python 3.10 or later is required to use this package.
* You must have an [Azure subscription][azure_subscription] and at least one
of the following:
* an Event Grid Namespace resource. To create an Event Grid Namespace
resource follow [this
tutorial](https://learn.microsoft.com/azure/event-grid/create-view-manage-namespaces).
* an Event Grid Basic resource. To create an Event Grid Basic resource via
the Azure portal follow this [step-by-step
tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart-portal).
To create an Event Grid Basic resource via the [Azure
CLI](https://learn.microsoft.com/cli/azure) follow this
[tutorial](https://learn.microsoft.com/azure/event-grid/custom-event-quickstart)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/SOURCES.txt
new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/SOURCES.txt
--- old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/SOURCES.txt
2025-05-14 21:44:40.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/SOURCES.txt
2026-07-29 07:58:41.000000000 +0200
@@ -2,6 +2,7 @@
LICENSE
MANIFEST.in
README.md
+api.md
migration_guide.md
pyproject.toml
setup.py
@@ -123,6 +124,7 @@
tests/test_eg_event_get_bytes.py
tests/test_eg_publisher_client.py
tests/test_eg_publisher_client_async.py
+tests/test_eg_redirect.py
tests/test_exceptions.py
tests/test_exceptions_async.py
tests/test_serialization.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/requires.txt
new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/requires.txt
--- old/azure_eventgrid-4.22.0/azure_eventgrid.egg-info/requires.txt
2025-05-14 21:44:40.000000000 +0200
+++ new/azure_eventgrid-4.22.1/azure_eventgrid.egg-info/requires.txt
2026-07-29 07:58:41.000000000 +0200
@@ -1,3 +1,3 @@
isodate>=0.6.1
-azure-core>=1.30.0
+azure-core>=1.38.3
typing-extensions>=4.6.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/pyproject.toml
new/azure_eventgrid-4.22.1/pyproject.toml
--- old/azure_eventgrid-4.22.0/pyproject.toml 2025-05-14 21:42:50.000000000
+0200
+++ new/azure_eventgrid-4.22.1/pyproject.toml 2026-07-29 07:58:01.000000000
+0200
@@ -1,2 +1,5 @@
[tool.azure-sdk-build]
pyright = false
+
+[tool.azure-sdk-conda]
+in_bundle = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/setup.py
new/azure_eventgrid-4.22.1/setup.py
--- old/azure_eventgrid-4.22.0/setup.py 2025-05-14 21:42:50.000000000 +0200
+++ new/azure_eventgrid-4.22.1/setup.py 2026-07-29 07:58:01.000000000 +0200
@@ -42,11 +42,11 @@
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"License :: OSI Approved :: MIT License",
],
zip_safe=False,
@@ -63,8 +63,8 @@
},
install_requires=[
"isodate>=0.6.1",
- "azure-core>=1.30.0",
+ "azure-core>=1.38.3",
"typing-extensions>=4.6.0",
],
- python_requires=">=3.8",
+ python_requires=">=3.10",
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_eventgrid-4.22.0/tests/test_eg_redirect.py
new/azure_eventgrid-4.22.1/tests/test_eg_redirect.py
--- old/azure_eventgrid-4.22.0/tests/test_eg_redirect.py 1970-01-01
01:00:00.000000000 +0100
+++ new/azure_eventgrid-4.22.1/tests/test_eg_redirect.py 2026-07-29
07:58:01.000000000 +0200
@@ -0,0 +1,244 @@
+# --------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See License.txt in the project root for
+# license information.
+# --------------------------------------------------------------------------
+"""Regression tests for the cross-host redirect credential-leak fix (MSRC
126697).
+
+The legacy ``EventGridPublisherClient`` must not re-send credential headers to
a
+different host when following an HTTP 3xx redirect. These tests drive the
client
+pipeline built by ``_policies`` through a mock transport that issues a
cross-host
+redirect and assert the credential header is stripped from the redirected
request.
+"""
+import time
+
+import pytest
+from requests import Response
+
+from azure.core.credentials import AzureKeyCredential, AzureSasCredential,
AccessToken
+from azure.core.pipeline import Pipeline, AsyncPipeline
+from azure.core.pipeline.transport import HttpTransport, AsyncHttpTransport,
HttpRequest
+
+from azure.eventgrid._legacy._publisher_client import EventGridPublisherClient
+from azure.eventgrid._legacy.aio._publisher_client_async import (
+ EventGridPublisherClient as EventGridPublisherClientAsync,
+)
+
+ORIGINAL_URL = "https://topic.westus-1.eventgrid.azure.net/api/events"
+REDIRECT_URL = "https://redirected.example.net/api/events"
+
+
+class FakeTokenCredential(object):
+ def get_token(self, *scopes, **kwargs):
+ return AccessToken("fake-token", int(time.time()) + 3600)
+
+
+class AsyncFakeTokenCredential(object):
+ async def get_token(self, *scopes, **kwargs):
+ return AccessToken("fake-token", int(time.time()) + 3600)
+
+
+def _redirect_response():
+ # 307/308 preserve the original method (POST) and are followed by
azure-core's
+ # RedirectPolicy; a 301/302 would only be followed for GET/HEAD, so a POST
publish
+ # is exposed to the cross-host leak specifically via a method-preserving
redirect.
+ response = Response()
+ response.status_code = 307
+ response.headers["location"] = REDIRECT_URL
+ return response
+
+
+def _ok_response():
+ response = Response()
+ response.status_code = 200
+ return response
+
+
+CREDENTIAL_CASES = [
+ (AzureKeyCredential("my-secret-key"), "aeg-sas-key", "my-secret-key"),
+ (AzureSasCredential("my-sas-token"), "aeg-sas-token", "my-sas-token"),
+ (FakeTokenCredential(), "Authorization", "Bearer fake-token"),
+]
+
+# The async client wraps a `TokenCredential` in
`AsyncBearerTokenCredentialPolicy`
+# which awaits `get_token`, so the async AAD case needs an async credential.
+ASYNC_CREDENTIAL_CASES = [
+ (AzureKeyCredential("my-secret-key"), "aeg-sas-key", "my-secret-key"),
+ (AzureSasCredential("my-sas-token"), "aeg-sas-token", "my-sas-token"),
+ (AsyncFakeTokenCredential(), "Authorization", "Bearer fake-token"),
+]
+
+
[email protected]("credential, cred_header, cred_value",
CREDENTIAL_CASES)
+def test_credentials_not_leaked_on_cross_host_redirect(credential,
cred_header, cred_value):
+ class MockTransport(HttpTransport):
+ def __init__(self):
+ self.first = True
+ self.redirected_headers = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ pass
+
+ def close(self):
+ pass
+
+ def open(self):
+ pass
+
+ def send(self, request, **kwargs):
+ if self.first:
+ self.first = False
+ # The credential header is present on the original (in-host)
request.
+ assert request.headers.get(cred_header) == cred_value
+ return _redirect_response()
+ # After following the cross-host redirect the credential must be
gone.
+ self.redirected_headers = dict(request.headers)
+ return _ok_response()
+
+ transport = MockTransport()
+ pipeline = Pipeline(transport=transport,
policies=EventGridPublisherClient._policies(credential))
+ pipeline.run(HttpRequest("POST", ORIGINAL_URL))
+
+ assert transport.redirected_headers is not None, "cross-host redirect was
not followed"
+ assert not transport.redirected_headers.get(cred_header)
+
+
[email protected]
[email protected]("credential, cred_header, cred_value",
ASYNC_CREDENTIAL_CASES)
+async def test_credentials_not_leaked_on_cross_host_redirect_async(credential,
cred_header, cred_value):
+ class MockAsyncTransport(AsyncHttpTransport):
+ def __init__(self):
+ self.first = True
+ self.redirected_headers = None
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, *args):
+ pass
+
+ async def close(self):
+ pass
+
+ async def open(self):
+ pass
+
+ async def send(self, request, **kwargs):
+ if self.first:
+ self.first = False
+ assert request.headers.get(cred_header) == cred_value
+ return _redirect_response()
+ self.redirected_headers = dict(request.headers)
+ return _ok_response()
+
+ transport = MockAsyncTransport()
+ pipeline = AsyncPipeline(
+ transport=transport,
policies=EventGridPublisherClientAsync._policies(credential)
+ )
+ await pipeline.run(HttpRequest("POST", ORIGINAL_URL))
+
+ assert transport.redirected_headers is not None, "cross-host redirect was
not followed"
+ assert not transport.redirected_headers.get(cred_header)
+
+
[email protected]("credential, cred_header, cred_value",
CREDENTIAL_CASES)
+def test_credentials_not_leaked_on_redirect_then_retry(credential,
cred_header, cred_value):
+ """A retry after a cross-host redirect (307 -> 503 -> 200) must not
re-leak the credential.
+
+ Requires azure-core >= 1.38.3, which persists the
``insecure_domain_change`` flag across
+ retries so the cleanup keeps stripping the credential re-added by the auth
policy.
+ """
+
+ class MockTransport(HttpTransport):
+ def __init__(self):
+ self.calls = 0
+ self.post_redirect_headers = []
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ pass
+
+ def close(self):
+ pass
+
+ def open(self):
+ pass
+
+ def send(self, request, **kwargs):
+ self.calls += 1
+ if self.calls == 1:
+ assert request.headers.get(cred_header) == cred_value
+ return _redirect_response()
+ # Every request to the redirected host - including the retry -
must be clean.
+ self.post_redirect_headers.append(request.headers.get(cred_header))
+ if self.calls == 2:
+ retryable = Response()
+ retryable.status_code = 503
+ # ``Retry-After: 0`` forces a deterministic retry across all
supported
+ # azure-core versions (independent of method-based retry
heuristics) and
+ # avoids any real sleep in the test.
+ retryable.headers["Retry-After"] = "0"
+ return retryable
+ return _ok_response()
+
+ transport = MockTransport()
+ policies = EventGridPublisherClient._policies(credential,
retry_backoff_factor=0)
+ pipeline = Pipeline(transport=transport, policies=policies)
+ pipeline.run(HttpRequest("POST", ORIGINAL_URL))
+
+ assert transport.calls >= 3, "expected a redirect followed by a retry"
+ assert not any(transport.post_redirect_headers)
+
+
[email protected]
[email protected]("credential, cred_header, cred_value",
ASYNC_CREDENTIAL_CASES)
+async def test_credentials_not_leaked_on_redirect_then_retry_async(credential,
cred_header, cred_value):
+ """Async counterpart: a retry after a cross-host redirect (307 -> 503 ->
200) must not re-leak the credential.
+
+ Requires azure-core >= 1.38.3, which persists the
``insecure_domain_change`` flag across
+ retries so the cleanup keeps stripping the credential re-added by the
async auth policy.
+ """
+
+ class MockAsyncTransport(AsyncHttpTransport):
+ def __init__(self):
+ self.calls = 0
+ self.post_redirect_headers = []
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, *args):
+ pass
+
+ async def close(self):
+ pass
+
+ async def open(self):
+ pass
+
+ async def send(self, request, **kwargs):
+ self.calls += 1
+ if self.calls == 1:
+ assert request.headers.get(cred_header) == cred_value
+ return _redirect_response()
+ # Every request to the redirected host - including the retry -
must be clean.
+ self.post_redirect_headers.append(request.headers.get(cred_header))
+ if self.calls == 2:
+ retryable = Response()
+ retryable.status_code = 503
+ retryable.headers["Retry-After"] = "0"
+ return retryable
+ return _ok_response()
+
+ transport = MockAsyncTransport()
+ policies = EventGridPublisherClientAsync._policies(credential,
retry_backoff_factor=0)
+ pipeline = AsyncPipeline(transport=transport, policies=policies)
+ await pipeline.run(HttpRequest("POST", ORIGINAL_URL))
+
+ assert transport.calls >= 3, "expected a redirect followed by a retry"
+ assert not any(transport.post_redirect_headers)