From 80e3fbc804a34e36c38e1172c00890c19627a06a Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Thu, 2 Oct 2025 15:39:11 -0700 Subject: [PATCH 1/7] Adding call to getTokenOrSignInResource --- .../microsoft_agents/activity/__init__.py | 1 + .../token_or_sign_in_resource_response.py | 8 ++++ .../hosting/core/_oauth/_oauth_flow.py | 30 +++++++------- .../connector/client/user_token_client.py | 41 ++++++++++++++++++- .../hosting/core/connector/user_token_base.py | 13 ++++++ 5 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py index cbd7bb7a..aebe13e3 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py @@ -62,6 +62,7 @@ from .token_exchange_invoke_request import TokenExchangeInvokeRequest from .token_exchange_invoke_response import TokenExchangeInvokeResponse from .token_exchange_state import TokenExchangeState +from .token_or_sign_in_resource_response import TokenOrSignInResourceResponse from .token_request import TokenRequest from .token_response import TokenResponse from .token_status import TokenStatus diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py new file mode 100644 index 00000000..77536f43 --- /dev/null +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py @@ -0,0 +1,8 @@ +from .agents_model import AgentsModel +from .token_response import TokenResponse +from .sign_in_resource import SignInResource + +class TokenOrSignInResource(AgentsModel): + token_response: TokenResponse = None + sign_in_resource: SignInResource = None + \ No newline at end of file diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py index a3a9c808..a2a0be04 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py @@ -30,7 +30,6 @@ class _FlowResponse(BaseModel): flow_error_tag: _FlowErrorTag = _FlowErrorTag.NONE token_response: Optional[TokenResponse] = None sign_in_resource: Optional[SignInResource] = None - continuation_activity: Optional[Activity] = None class _OAuthFlow: @@ -183,20 +182,13 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: Notes: The flow state is reset if a token is not obtained from cache. """ - token_response = await self.get_user_token() - if token_response: - return _FlowResponse( - flow_state=self._flow_state, token_response=token_response - ) logger.debug("Starting new OAuth flow") self._flow_state.tag = _FlowStateTag.BEGIN self._flow_state.expiration = ( datetime.now().timestamp() + self._default_flow_duration ) - self._flow_state.attempts_remaining = self._max_attempts - self._flow_state.continuation_activity = activity.model_copy() token_exchange_state = TokenExchangeState( connection_name=self._abs_oauth_connection_name, @@ -205,16 +197,25 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: ms_app_id=self._ms_app_id, ) - sign_in_resource = ( - await self._user_token_client.agent_sign_in.get_sign_in_resource( - state=token_exchange_state.get_encoded_state() - ) + res = await self._user_token_client.user_token.get_token_or_sign_in_resource( + activity.from_property.id, + self._abs_oauth_connection_name, + activity.channel_id, + token_exchange_state.get_encoded_state(), ) - logger.debug("Sign-in resource obtained successfully: %s", sign_in_resource) + if res.token_response: + logger.info("Skipping flow, user token obtained.") + self._flow_state.tag = _FlowStateTag.COMPLETE + self._flow_state.expiration = datetime.now().timestamp() + self._default_flow_duration + return _FlowResponse( + flow_state=self._flow_state, token_response=res.token_response + ) + + logger.debug("Sign-in resource obtained successfully: %s", res.sign_in_resource) return _FlowResponse( - flow_state=self._flow_state, sign_in_resource=sign_in_resource + flow_state=self._flow_state, sign_in_resource=res.sign_in_resource ) async def _continue_from_message( @@ -310,7 +311,6 @@ async def continue_flow(self, activity: Activity) -> _FlowResponse: flow_state=self._flow_state.model_copy(), flow_error_tag=flow_error_tag, token_response=token_response, - continuation_activity=self._flow_state.continuation_activity, ) async def begin_or_continue_flow(self, activity: Activity) -> _FlowResponse: diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py index 7e60df7b..d7fad1cc 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py @@ -8,7 +8,12 @@ from aiohttp import ClientSession from microsoft_agents.hosting.core.connector import UserTokenClientBase -from microsoft_agents.activity import TokenResponse, TokenStatus, SignInResource +from microsoft_agents.activity import ( + TokenOrSignInResourceResponse, + TokenResponse, + TokenStatus, + SignInResource +) from ..get_product_info import get_product_info from ..user_token_base import UserTokenBase from ..agent_sign_in_base import AgentSignInBase @@ -136,6 +141,40 @@ async def get_token( data = await response.json() return TokenResponse.model_validate(data) + + async def get_token_or_sign_in_resource( + self, + user_id, + connection_name, + channel_id, + state: str, + code: str = "", + final_redirect: str = "", + fwd_url: str = "", + ) -> TokenOrSignInResourceResponse: + + params = { + "userId": user_id, + "connectionName": connection_name, + "channelId": channel_id, + "state": state, + "code": code, + "finalRedirect": final_redirect, + "fwdUrl": fwd_url, + } + + logger.info("Getting token or sign-in resource with params: %s", params) + async with self.client.get( + "/api/usertoken/GetTokenOrSignInResource", params=params + ) as response: + if response.status >= 400: + logger.error( + "Error getting token or sign-in resource: %s", response.status + ) + response.raise_for_status() + + data = await response.json() + return TokenOrSignInResourceResponse.model_validate(data) async def get_aad_tokens( self, diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py index cda2da07..bb5758e4 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py @@ -15,6 +15,19 @@ async def get_token( ) -> TokenResponse: raise NotImplementedError() + @abstractmethod + async def get_token_or_sign_in_resource( + self, + user_id: str, + connection_name: str, + channel_id: str, + state: str, + code: str = "", + final_redirect: str = "", + fwd_url: str = "", + ) -> TokenOrSignInResourceResponse: + raise NotImplementedError() + @abstractmethod async def get_aad_tokens( self, From 32a3915c3bb950812f1838bc4bcb2c8f7f055990 Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Fri, 3 Oct 2025 08:25:53 -0700 Subject: [PATCH 2/7] Updated mocking of UserTokenClient --- .../mocks/mock_user_token_client.py | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/tests/_common/testing_objects/mocks/mock_user_token_client.py b/tests/_common/testing_objects/mocks/mock_user_token_client.py index ffd8c463..a3e5edcd 100644 --- a/tests/_common/testing_objects/mocks/mock_user_token_client.py +++ b/tests/_common/testing_objects/mocks/mock_user_token_client.py @@ -1,6 +1,9 @@ +from typing import Union + from microsoft_agents.activity import ( TokenResponse, SignInResource, + TokenOrSignInResourceResponse ) from microsoft_agents.hosting.core import UserTokenClient @@ -9,9 +12,10 @@ def mock_UserTokenClient( mocker, - get_token_return=SKIP, - exchange_token_return=SKIP, - get_sign_in_resource_return=SKIP, + get_token_return: Union[str, TokenResponse]=SKIP, + exchange_token_return: Union[str, TokenResponse]=SKIP, + get_sign_in_resource_return: Union[str, SignInResource]=SKIP, + get_token_or_sign_in_resource_return: Union[str, TokenResponse, SignInResource, TokenOrSignInResourceResponse]=SKIP, ): mock_user_token_client = mocker.Mock(spec=UserTokenClient) @@ -35,6 +39,19 @@ def mock_UserTokenClient( return_value=get_sign_in_resource_return ) + if get_token_or_sign_in_resource_return is not SKIP: + if isinstance(get_token_or_sign_in_resource_return, TokenResponse): + get_token_or_sign_in_resource_return = TokenOrSignInResourceResponse( + token_response=get_token_or_sign_in_resource_return + ) + elif isinstance(get_token_or_sign_in_resource_return, SignInResource): + get_token_or_sign_in_resource_return = TokenOrSignInResourceResponse( + sign_in_resource=get_token_or_sign_in_resource_return + ) + mock_user_token_client.get_token_or_sign_in_resource = mocker.AsyncMock( + return_value=get_token_or_sign_in_resource_return + ) + mock_user_token_client.user_token.sign_out = mocker.AsyncMock(return_value=None) return mock_user_token_client @@ -42,9 +59,10 @@ def mock_UserTokenClient( def mock_class_UserTokenClient( mocker, - get_token_return=SKIP, - exchange_token_return=SKIP, - get_sign_in_resource_return=SKIP, + get_token_return: Union[str, TokenResponse]=SKIP, + exchange_token_return: Union[str, TokenResponse]=SKIP, + get_sign_in_resource_return: Union[str, SignInResource]=SKIP, + get_token_or_sign_in_resource_return: Union[str, TokenResponse, SignInResource, TokenOrSignInResourceResponse]=SKIP, ): mocker.patch( "UserTokenClient", @@ -53,5 +71,6 @@ def mock_class_UserTokenClient( get_token_return=get_token_return, exchange_token_return=exchange_token_return, get_sign_in_resource_return=get_sign_in_resource_return, + get_token_or_sign_in_resource_return=get_token_or_sign_in_resource_return, ), ) From b91537ba5d4a7edae6db7203eb91db9c77fb9284 Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Fri, 3 Oct 2025 08:39:26 -0700 Subject: [PATCH 3/7] Commit --- .../microsoft_agents/activity/__init__.py | 1 + .../token_or_sign_in_resource_response.py | 2 +- .../hosting/core/_oauth/_oauth_flow.py | 11 +++++----- .../hosting/core/connector/user_token_base.py | 2 +- .../mocks/mock_user_token_client.py | 2 +- tests/hosting_core/_oauth/test_oauth_flow.py | 20 ++++++++++++------- 6 files changed, 23 insertions(+), 15 deletions(-) diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py index aebe13e3..bccdf02b 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py @@ -186,4 +186,5 @@ "load_configuration_from_env", "ChannelAdapterProtocol", "TurnContextProtocol", + "TokenOrSignInResourceResponse" ] diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py index 77536f43..437201f7 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py @@ -2,7 +2,7 @@ from .token_response import TokenResponse from .sign_in_resource import SignInResource -class TokenOrSignInResource(AgentsModel): +class TokenOrSignInResourceResponse(AgentsModel): token_response: TokenResponse = None sign_in_resource: SignInResource = None \ No newline at end of file diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py index a2a0be04..cbae7037 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py @@ -184,11 +184,6 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: """ logger.debug("Starting new OAuth flow") - self._flow_state.tag = _FlowStateTag.BEGIN - self._flow_state.expiration = ( - datetime.now().timestamp() + self._default_flow_duration - ) - self._flow_state.attempts_remaining = self._max_attempts token_exchange_state = TokenExchangeState( connection_name=self._abs_oauth_connection_name, @@ -212,6 +207,12 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: flow_state=self._flow_state, token_response=res.token_response ) + self._flow_state.tag = _FlowStateTag.BEGIN + self._flow_state.expiration = ( + datetime.now().timestamp() + self._default_flow_duration + ) + self._flow_state.attempts_remaining = self._max_attempts + logger.debug("Sign-in resource obtained successfully: %s", res.sign_in_resource) return _FlowResponse( diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py index bb5758e4..e26fce10 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py @@ -1,7 +1,7 @@ from abc import abstractmethod from typing import Protocol -from microsoft_agents.activity import TokenResponse, TokenStatus +from microsoft_agents.activity import TokenResponse, TokenStatus, TokenOrSignInResourceResponse class UserTokenBase(Protocol): diff --git a/tests/_common/testing_objects/mocks/mock_user_token_client.py b/tests/_common/testing_objects/mocks/mock_user_token_client.py index a3e5edcd..9a191134 100644 --- a/tests/_common/testing_objects/mocks/mock_user_token_client.py +++ b/tests/_common/testing_objects/mocks/mock_user_token_client.py @@ -48,7 +48,7 @@ def mock_UserTokenClient( get_token_or_sign_in_resource_return = TokenOrSignInResourceResponse( sign_in_resource=get_token_or_sign_in_resource_return ) - mock_user_token_client.get_token_or_sign_in_resource = mocker.AsyncMock( + mock_user_token_client.user_token.get_token_or_sign_in_resource = mocker.AsyncMock( return_value=get_token_or_sign_in_resource_return ) diff --git a/tests/hosting_core/_oauth/test_oauth_flow.py b/tests/hosting_core/_oauth/test_oauth_flow.py index 129540be..266fba03 100644 --- a/tests/hosting_core/_oauth/test_oauth_flow.py +++ b/tests/hosting_core/_oauth/test_oauth_flow.py @@ -51,7 +51,7 @@ def testing_Activity( class TestUtils(FlowStateFixtures): - def setup_method(self, mocker): + def setup_method(self): self.UserTokenClient = mock_UserTokenClient self.Activity = testing_Activity @@ -161,8 +161,14 @@ async def test_sign_out(self, flow_state, user_token_client): @pytest.mark.asyncio async def test_begin_flow_easy_case(self, mocker, flow_state, activity): # setup + # user_token_client = self.UserTokenClient( + # mocker, get_token_return=TokenResponse(token=DEFAULTS.token) + # ) user_token_client = self.UserTokenClient( - mocker, get_token_return=TokenResponse(token=DEFAULTS.token) + mocker, get_token_or_sign_in_resource_return=TokenResponse(token=DEFAULTS.token) + ) + mocker.patch.object( + TokenExchangeState, "get_encoded_state", return_value="encoded_state" ) flow = _OAuthFlow(flow_state, user_token_client) expected_flow_state = flow_state @@ -181,11 +187,11 @@ async def test_begin_flow_easy_case(self, mocker, flow_state, activity): assert response.flow_error_tag == _FlowErrorTag.NONE assert response.token_response assert response.token_response.token == DEFAULTS.token - user_token_client.user_token.get_token.assert_called_once_with( - user_id=flow_state.user_id, - connection_name=flow_state.connection, - channel_id=flow_state.channel_id, - code=None, + user_token_client.user_token.get_token_or_sign_in_resource.assert_called_once_with( + activity.from_property.id, + flow_state.connection, + activity.channel_id, + "encoded_state" ) @pytest.mark.asyncio From c3f5ac8da2f80fd9b538661f8f55f9ed9b63030c Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Wed, 8 Oct 2025 10:04:41 -0700 Subject: [PATCH 4/7] Removed continuation_activity assertions for OAuthFlow --- .../microsoft_agents/activity/__init__.py | 2 +- .../token_or_sign_in_resource_response.py | 2 +- .../hosting/core/_oauth/_oauth_flow.py | 8 +++--- .../connector/client/user_token_client.py | 4 +-- .../hosting/core/connector/user_token_base.py | 6 ++++- .../mocks/mock_user_token_client.py | 26 +++++++++++-------- tests/hosting_core/_oauth/test_oauth_flow.py | 10 +++---- 7 files changed, 33 insertions(+), 25 deletions(-) diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py index bccdf02b..81bc1c83 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/__init__.py @@ -186,5 +186,5 @@ "load_configuration_from_env", "ChannelAdapterProtocol", "TurnContextProtocol", - "TokenOrSignInResourceResponse" + "TokenOrSignInResourceResponse", ] diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py index 437201f7..7cf1e87f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py @@ -2,7 +2,7 @@ from .token_response import TokenResponse from .sign_in_resource import SignInResource + class TokenOrSignInResourceResponse(AgentsModel): token_response: TokenResponse = None sign_in_resource: SignInResource = None - \ No newline at end of file diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py index cbae7037..a543183b 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py @@ -202,17 +202,19 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: if res.token_response: logger.info("Skipping flow, user token obtained.") self._flow_state.tag = _FlowStateTag.COMPLETE - self._flow_state.expiration = datetime.now().timestamp() + self._default_flow_duration + self._flow_state.expiration = ( + datetime.now().timestamp() + self._default_flow_duration + ) return _FlowResponse( flow_state=self._flow_state, token_response=res.token_response ) - + self._flow_state.tag = _FlowStateTag.BEGIN self._flow_state.expiration = ( datetime.now().timestamp() + self._default_flow_duration ) self._flow_state.attempts_remaining = self._max_attempts - + logger.debug("Sign-in resource obtained successfully: %s", res.sign_in_resource) return _FlowResponse( diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py index d7fad1cc..8b752c06 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py @@ -12,7 +12,7 @@ TokenOrSignInResourceResponse, TokenResponse, TokenStatus, - SignInResource + SignInResource, ) from ..get_product_info import get_product_info from ..user_token_base import UserTokenBase @@ -141,7 +141,7 @@ async def get_token( data = await response.json() return TokenResponse.model_validate(data) - + async def get_token_or_sign_in_resource( self, user_id, diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py index e26fce10..a6a71dc5 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py @@ -1,7 +1,11 @@ from abc import abstractmethod from typing import Protocol -from microsoft_agents.activity import TokenResponse, TokenStatus, TokenOrSignInResourceResponse +from microsoft_agents.activity import ( + TokenResponse, + TokenStatus, + TokenOrSignInResourceResponse, +) class UserTokenBase(Protocol): diff --git a/tests/_common/testing_objects/mocks/mock_user_token_client.py b/tests/_common/testing_objects/mocks/mock_user_token_client.py index 9a191134..6afd20a5 100644 --- a/tests/_common/testing_objects/mocks/mock_user_token_client.py +++ b/tests/_common/testing_objects/mocks/mock_user_token_client.py @@ -3,7 +3,7 @@ from microsoft_agents.activity import ( TokenResponse, SignInResource, - TokenOrSignInResourceResponse + TokenOrSignInResourceResponse, ) from microsoft_agents.hosting.core import UserTokenClient @@ -12,10 +12,12 @@ def mock_UserTokenClient( mocker, - get_token_return: Union[str, TokenResponse]=SKIP, - exchange_token_return: Union[str, TokenResponse]=SKIP, - get_sign_in_resource_return: Union[str, SignInResource]=SKIP, - get_token_or_sign_in_resource_return: Union[str, TokenResponse, SignInResource, TokenOrSignInResourceResponse]=SKIP, + get_token_return: Union[str, TokenResponse] = SKIP, + exchange_token_return: Union[str, TokenResponse] = SKIP, + get_sign_in_resource_return: Union[str, SignInResource] = SKIP, + get_token_or_sign_in_resource_return: Union[ + str, TokenResponse, SignInResource, TokenOrSignInResourceResponse + ] = SKIP, ): mock_user_token_client = mocker.Mock(spec=UserTokenClient) @@ -48,8 +50,8 @@ def mock_UserTokenClient( get_token_or_sign_in_resource_return = TokenOrSignInResourceResponse( sign_in_resource=get_token_or_sign_in_resource_return ) - mock_user_token_client.user_token.get_token_or_sign_in_resource = mocker.AsyncMock( - return_value=get_token_or_sign_in_resource_return + mock_user_token_client.user_token.get_token_or_sign_in_resource = ( + mocker.AsyncMock(return_value=get_token_or_sign_in_resource_return) ) mock_user_token_client.user_token.sign_out = mocker.AsyncMock(return_value=None) @@ -59,10 +61,12 @@ def mock_UserTokenClient( def mock_class_UserTokenClient( mocker, - get_token_return: Union[str, TokenResponse]=SKIP, - exchange_token_return: Union[str, TokenResponse]=SKIP, - get_sign_in_resource_return: Union[str, SignInResource]=SKIP, - get_token_or_sign_in_resource_return: Union[str, TokenResponse, SignInResource, TokenOrSignInResourceResponse]=SKIP, + get_token_return: Union[str, TokenResponse] = SKIP, + exchange_token_return: Union[str, TokenResponse] = SKIP, + get_sign_in_resource_return: Union[str, SignInResource] = SKIP, + get_token_or_sign_in_resource_return: Union[ + str, TokenResponse, SignInResource, TokenOrSignInResourceResponse + ] = SKIP, ): mocker.patch( "UserTokenClient", diff --git a/tests/hosting_core/_oauth/test_oauth_flow.py b/tests/hosting_core/_oauth/test_oauth_flow.py index 266fba03..f911c4ff 100644 --- a/tests/hosting_core/_oauth/test_oauth_flow.py +++ b/tests/hosting_core/_oauth/test_oauth_flow.py @@ -165,7 +165,8 @@ async def test_begin_flow_easy_case(self, mocker, flow_state, activity): # mocker, get_token_return=TokenResponse(token=DEFAULTS.token) # ) user_token_client = self.UserTokenClient( - mocker, get_token_or_sign_in_resource_return=TokenResponse(token=DEFAULTS.token) + mocker, + get_token_or_sign_in_resource_return=TokenResponse(token=DEFAULTS.token), ) mocker.patch.object( TokenExchangeState, "get_encoded_state", return_value="encoded_state" @@ -191,7 +192,7 @@ async def test_begin_flow_easy_case(self, mocker, flow_state, activity): activity.from_property.id, flow_state.connection, activity.channel_id, - "encoded_state" + "encoded_state", ) @pytest.mark.asyncio @@ -204,9 +205,7 @@ async def test_begin_flow_long_case(self, mocker, flow_state, activity): sign_in_link="https://example.com/signin", ) user_token_client = self.UserTokenClient( - mocker, - get_token_return=TokenResponse(), - get_sign_in_resource_return=dummy_sign_in_resource, + mocker, get_token_or_sign_in_resource_return=dummy_sign_in_resource ) # setup @@ -214,7 +213,6 @@ async def test_begin_flow_long_case(self, mocker, flow_state, activity): expected_flow_state = flow_state expected_flow_state.tag = _FlowStateTag.BEGIN expected_flow_state.attempts_remaining = 3 - expected_flow_state.continuation_activity = activity # test response = await flow.begin_flow(activity) From 070a52e3c6a0d28a0488bf554969694e616726af Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Wed, 8 Oct 2025 11:19:06 -0700 Subject: [PATCH 5/7] Making new operation protected --- .../hosting/core/_oauth/_oauth_flow.py | 2 +- .../connector/client/user_token_client.py | 20 +++++++++++++++---- .../hosting/core/connector/user_token_base.py | 2 +- .../mocks/mock_user_token_client.py | 2 +- tests/hosting_core/_oauth/test_oauth_flow.py | 2 +- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py index a543183b..6f4b648e 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py @@ -192,7 +192,7 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: ms_app_id=self._ms_app_id, ) - res = await self._user_token_client.user_token.get_token_or_sign_in_resource( + res = await self._user_token_client.user_token._get_token_or_sign_in_resource( activity.from_property.id, self._abs_oauth_connection_name, activity.channel_id, diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py index 8b752c06..3b5fd699 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py @@ -142,16 +142,28 @@ async def get_token( data = await response.json() return TokenResponse.model_validate(data) - async def get_token_or_sign_in_resource( + async def _get_token_or_sign_in_resource( self, - user_id, - connection_name, - channel_id, + user_id: str, + connection_name: str, + channel_id: str, state: str, code: str = "", final_redirect: str = "", fwd_url: str = "", ) -> TokenOrSignInResourceResponse: + """ + Gets a token or a sign-in resource for a user and connection. + + :param user_id: ID of the user. + :param connection_name: Name of the connection to use. + :param channel_id: ID of the channel. + :param state: State parameter for OAuth flow. + :param code: Optional authorization code. + :param final_redirect: Final redirect URL. + :param fwd_url: Forward URL. + :return: A token or sign-in resource response. + """ params = { "userId": user_id, diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py index a6a71dc5..91203c97 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py @@ -20,7 +20,7 @@ async def get_token( raise NotImplementedError() @abstractmethod - async def get_token_or_sign_in_resource( + async def _get_token_or_sign_in_resource( self, user_id: str, connection_name: str, diff --git a/tests/_common/testing_objects/mocks/mock_user_token_client.py b/tests/_common/testing_objects/mocks/mock_user_token_client.py index 6afd20a5..63c16831 100644 --- a/tests/_common/testing_objects/mocks/mock_user_token_client.py +++ b/tests/_common/testing_objects/mocks/mock_user_token_client.py @@ -50,7 +50,7 @@ def mock_UserTokenClient( get_token_or_sign_in_resource_return = TokenOrSignInResourceResponse( sign_in_resource=get_token_or_sign_in_resource_return ) - mock_user_token_client.user_token.get_token_or_sign_in_resource = ( + mock_user_token_client.user_token._get_token_or_sign_in_resource = ( mocker.AsyncMock(return_value=get_token_or_sign_in_resource_return) ) diff --git a/tests/hosting_core/_oauth/test_oauth_flow.py b/tests/hosting_core/_oauth/test_oauth_flow.py index f911c4ff..f92c09b5 100644 --- a/tests/hosting_core/_oauth/test_oauth_flow.py +++ b/tests/hosting_core/_oauth/test_oauth_flow.py @@ -188,7 +188,7 @@ async def test_begin_flow_easy_case(self, mocker, flow_state, activity): assert response.flow_error_tag == _FlowErrorTag.NONE assert response.token_response assert response.token_response.token == DEFAULTS.token - user_token_client.user_token.get_token_or_sign_in_resource.assert_called_once_with( + user_token_client.user_token._get_token_or_sign_in_resource.assert_called_once_with( activity.from_property.id, flow_state.connection, activity.channel_id, From 2083af6bc7c0057bb9c5b5da470a725210308729 Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Wed, 8 Oct 2025 12:25:29 -0700 Subject: [PATCH 6/7] Adding copyright comments --- .../microsoft_agents/activity/_load_configuration.py | 3 +++ .../microsoft_agents/activity/_model_utils.py | 3 +++ .../microsoft_agents/activity/_type_aliases.py | 3 +++ .../microsoft_agents/activity/action_types.py | 3 +++ .../microsoft_agents/activity/activity.py | 3 +++ .../microsoft_agents/activity/activity_event_names.py | 3 +++ .../microsoft_agents/activity/activity_importance.py | 3 +++ .../microsoft_agents/activity/activity_types.py | 3 +++ .../microsoft_agents/activity/adaptive_card_invoke_action.py | 3 +++ .../microsoft_agents/activity/adaptive_card_invoke_response.py | 3 +++ .../microsoft_agents/activity/adaptive_card_invoke_value.py | 3 +++ .../microsoft_agents/activity/agents_model.py | 3 +++ .../microsoft_agents/activity/animation_card.py | 3 +++ .../microsoft_agents/activity/attachment.py | 3 +++ .../microsoft_agents/activity/attachment_data.py | 3 +++ .../microsoft_agents/activity/attachment_info.py | 3 +++ .../microsoft_agents/activity/attachment_layout_types.py | 3 +++ .../microsoft_agents/activity/attachment_view.py | 3 +++ .../microsoft_agents/activity/audio_card.py | 3 +++ .../microsoft_agents/activity/basic_card.py | 3 +++ .../microsoft_agents/activity/caller_id_constants.py | 3 +++ .../microsoft_agents/activity/card_action.py | 3 +++ .../microsoft_agents/activity/card_image.py | 3 +++ .../microsoft_agents/activity/channel_account.py | 3 +++ .../microsoft_agents/activity/channel_adapter_protocol.py | 3 +++ .../activity/contact_relation_update_action_types.py | 3 +++ .../microsoft_agents/activity/conversation_account.py | 3 +++ .../microsoft_agents/activity/conversation_members.py | 3 +++ .../microsoft_agents/activity/conversation_parameters.py | 3 +++ .../microsoft_agents/activity/conversation_reference.py | 3 +++ .../activity/conversation_resource_response.py | 3 +++ .../microsoft_agents/activity/conversation_update_types.py | 3 +++ .../microsoft_agents/activity/conversations_result.py | 3 +++ .../microsoft_agents/activity/delivery_modes.py | 3 +++ .../microsoft_agents/activity/end_of_conversation_codes.py | 3 +++ .../microsoft_agents/activity/entity/entity.py | 3 +++ .../microsoft_agents/activity/entity/geo_coordinates.py | 3 +++ .../microsoft_agents/activity/entity/mention.py | 3 +++ .../microsoft_agents/activity/entity/place.py | 3 +++ .../microsoft_agents/activity/entity/thing.py | 3 +++ .../microsoft_agents/activity/error.py | 3 +++ .../microsoft_agents/activity/error_response.py | 3 +++ .../microsoft_agents/activity/expected_replies.py | 3 +++ .../microsoft_agents/activity/fact.py | 3 +++ .../microsoft_agents/activity/hero_card.py | 3 +++ .../microsoft_agents/activity/inner_http_error.py | 3 +++ .../activity/installation_update_action_types.py | 3 +++ .../microsoft_agents/activity/invoke_response.py | 3 +++ .../microsoft_agents/activity/media_card.py | 3 +++ .../microsoft_agents/activity/media_event_value.py | 3 +++ .../microsoft_agents/activity/media_url.py | 3 +++ .../microsoft_agents/activity/message_reaction.py | 3 +++ .../microsoft_agents/activity/message_reaction_types.py | 3 +++ .../microsoft_agents/activity/message_update_types.py | 3 +++ .../microsoft_agents/activity/oauth_card.py | 3 +++ .../microsoft_agents/activity/paged_members_result.py | 3 +++ .../microsoft_agents/activity/receipt_card.py | 3 +++ .../microsoft_agents/activity/receipt_item.py | 3 +++ .../microsoft_agents/activity/resource_response.py | 3 +++ .../microsoft_agents/activity/role_types.py | 3 +++ .../microsoft_agents/activity/semantic_action.py | 3 +++ .../microsoft_agents/activity/semantic_actions_states.py | 3 +++ .../microsoft_agents/activity/sign_in_resource.py | 3 +++ .../microsoft_agents/activity/signin_card.py | 3 +++ .../microsoft_agents/activity/suggested_actions.py | 3 +++ .../microsoft_agents/activity/text_format_types.py | 3 +++ .../microsoft_agents/activity/text_highlight.py | 3 +++ .../microsoft_agents/activity/thumbnail_card.py | 3 +++ .../microsoft_agents/activity/thumbnail_url.py | 3 +++ .../microsoft_agents/activity/token_exchange_invoke_request.py | 3 +++ .../activity/token_exchange_invoke_response.py | 3 +++ .../microsoft_agents/activity/token_exchange_resource.py | 3 +++ .../microsoft_agents/activity/token_exchange_state.py | 3 +++ .../activity/token_or_sign_in_resource_response.py | 3 +++ .../microsoft_agents/activity/token_post_resource.py | 3 +++ .../microsoft_agents/activity/token_request.py | 3 +++ .../microsoft_agents/activity/transcript.py | 3 +++ .../microsoft_agents/activity/turn_context_protocol.py | 3 +++ .../microsoft_agents/activity/video_card.py | 3 +++ 79 files changed, 237 insertions(+) diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/_load_configuration.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/_load_configuration.py index 2a598f76..cfc8a420 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/_load_configuration.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/_load_configuration.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Any diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/_model_utils.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/_model_utils.py index 025722a5..b747c8ed 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/_model_utils.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/_model_utils.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from abc import ABC from typing import Any, Callable diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/_type_aliases.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/_type_aliases.py index b0952c5e..0e4ce285 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/_type_aliases.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/_type_aliases.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Annotated from pydantic import StringConstraints diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/action_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/action_types.py index 35fcd914..5ba83f0e 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/action_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/action_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity.py index a573e10a..b3189742 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from copy import copy from datetime import datetime, timezone from typing import Optional diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_event_names.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_event_names.py index 9a649dfb..00aec698 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_event_names.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_event_names.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_importance.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_importance.py index 31bae4aa..1900dee5 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_importance.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_importance.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_types.py index 1f70706e..273b2cad 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/activity_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_action.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_action.py index 815d42fe..07ef9fee 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_action.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_action.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_response.py index c142fd4a..5708ae0f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_value.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_value.py index eb77684e..19b183c6 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_value.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/adaptive_card_invoke_value.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .adaptive_card_invoke_action import AdaptiveCardInvokeAction from .token_exchange_invoke_request import TokenExchangeInvokeRequest from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/agents_model.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/agents_model.py index 75cf323a..3f937b58 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/agents_model.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/agents_model.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from __future__ import annotations from pydantic import BaseModel, ConfigDict diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/animation_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/animation_card.py index 9c5bbbcc..558ceb5c 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/animation_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/animation_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .thumbnail_url import ThumbnailUrl from .media_url import MediaUrl from .card_action import CardAction diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment.py index 8cbf04c6..af702f5a 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_data.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_data.py index f0e38a7a..eef9fc44 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_data.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_data.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_info.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_info.py index dbab046d..de890764 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_info.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_info.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .attachment_view import AttachmentView from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_layout_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_layout_types.py index 8ca873e9..e3a57906 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_layout_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_layout_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_view.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_view.py index ce0039e9..db116550 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_view.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/attachment_view.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/audio_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/audio_card.py index 3ae0ccc5..dc7db79e 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/audio_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/audio_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from .thumbnail_url import ThumbnailUrl from .media_url import MediaUrl diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/basic_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/basic_card.py index f45fb206..b89cffd6 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/basic_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/basic_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from .card_image import CardImage from .card_action import CardAction diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/caller_id_constants.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/caller_id_constants.py index 58e23dae..7ddcd866 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/caller_id_constants.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/caller_id_constants.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/card_action.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/card_action.py index 35386e6e..ec736745 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/card_action.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/card_action.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Optional from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/card_image.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/card_image.py index cb7088d6..52572c82 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/card_image.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/card_image.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_action import CardAction from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_account.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_account.py index bf1db20c..2759e376 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_account.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_account.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Any from pydantic import ConfigDict diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_adapter_protocol.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_adapter_protocol.py index e24e2b07..ce07f248 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_adapter_protocol.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/channel_adapter_protocol.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from abc import abstractmethod from typing import Protocol, List, Callable, Awaitable, Optional diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/contact_relation_update_action_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/contact_relation_update_action_types.py index c792f1ad..f9b62d77 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/contact_relation_update_action_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/contact_relation_update_action_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_account.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_account.py index fa8c6869..a3032d9d 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_account.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_account.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Optional from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_members.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_members.py index 9f353c6c..6ecb9359 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_members.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_members.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .channel_account import ChannelAccount from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_parameters.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_parameters.py index 810db792..747e7814 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_parameters.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_parameters.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from pydantic import Field from .channel_account import ChannelAccount diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_reference.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_reference.py index 85c117a7..0b680ea3 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_reference.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_reference.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from uuid import uuid4 as uuid from typing import Optional diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_resource_response.py index c2bf7b0b..3b92f209 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_resource_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_update_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_update_types.py index afd4a7c7..df6602b1 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_update_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversation_update_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversations_result.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversations_result.py index 4da8bf1a..2eff6ea0 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/conversations_result.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/conversations_result.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .conversation_members import ConversationMembers from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/delivery_modes.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/delivery_modes.py index 856601b5..d82e5ac1 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/delivery_modes.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/delivery_modes.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/end_of_conversation_codes.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/end_of_conversation_codes.py index a9e70448..425cc603 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/end_of_conversation_codes.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/end_of_conversation_codes.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/entity.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/entity.py index eee24060..e7352609 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/entity.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/entity.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Any, Optional from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/geo_coordinates.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/geo_coordinates.py index 54299781..15a9e0a5 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/geo_coordinates.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/geo_coordinates.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from ..agents_model import AgentsModel from .._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/mention.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/mention.py index 17510039..ce8b5084 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/mention.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/mention.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Literal from ..channel_account import ChannelAccount diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/place.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/place.py index cdfeccdc..ea0b347f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/place.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/place.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from ..agents_model import AgentsModel from .._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/thing.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/thing.py index 3c56aa0a..040b850a 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/thing.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/entity/thing.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from ..agents_model import AgentsModel from .._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/error.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/error.py index 6beab043..1705d6ca 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/error.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/error.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .inner_http_error import InnerHttpError from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/error_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/error_response.py index 6b1b617e..9f153a88 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/error_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/error_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from .error import Error diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/expected_replies.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/expected_replies.py index a5a99ee8..c6c912fd 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/expected_replies.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/expected_replies.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .activity import Activity from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/fact.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/fact.py index b66b8073..03cfa42c 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/fact.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/fact.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/hero_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/hero_card.py index a2708a9c..810dc000 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/hero_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/hero_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_action import CardAction from .card_image import CardImage from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/inner_http_error.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/inner_http_error.py index 44e37cbb..afd1367f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/inner_http_error.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/inner_http_error.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/installation_update_action_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/installation_update_action_types.py index a97d04bb..b944bc40 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/installation_update_action_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/installation_update_action_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/invoke_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/invoke_response.py index 35deb08b..7684f0f1 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/invoke_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/invoke_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_card.py index 89ccd12d..025c9f0a 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .thumbnail_url import ThumbnailUrl from .media_url import MediaUrl from .card_action import CardAction diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_event_value.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_event_value.py index 478b19c2..fef047b2 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_event_value.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_event_value.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_url.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_url.py index b7b5e9a9..1def8ac1 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/media_url.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/media_url.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction.py index 0ffe1e3d..c56bcab4 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction_types.py index c7d0770e..ff67be96 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_reaction_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_update_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_update_types.py index 70f661ee..5fb4bbd4 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/message_update_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/message_update_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/oauth_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/oauth_card.py index 1505b7c3..a59ecf84 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/oauth_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/oauth_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from typing import Optional from .card_action import CardAction from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/paged_members_result.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/paged_members_result.py index 785b9cd3..59633026 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/paged_members_result.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/paged_members_result.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .channel_account import ChannelAccount from ._type_aliases import NonEmptyString from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_card.py index abe21781..6a80cd42 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .fact import Fact from .receipt_item import ReceiptItem from .card_action import CardAction diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_item.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_item.py index 268fe226..c8604b4f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_item.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/receipt_item.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_image import CardImage from .card_action import CardAction from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/resource_response.py index 8f1802ea..700c4857 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/resource_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/role_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/role_types.py index 1008cb8a..284e88ce 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/role_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/role_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_action.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_action.py index 9fee8509..3e1ca58f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_action.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_action.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_actions_states.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_actions_states.py index bdfe886d..a2ec5f99 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_actions_states.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/semantic_actions_states.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/sign_in_resource.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/sign_in_resource.py index b985c8bb..5eeab683 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/sign_in_resource.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/sign_in_resource.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from ._type_aliases import NonEmptyString from .agents_model import AgentsModel from .token_exchange_resource import TokenExchangeResource diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/signin_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/signin_card.py index 9cb5197a..31242699 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/signin_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/signin_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_action import CardAction from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/suggested_actions.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/suggested_actions.py index 45d4f189..1e723d2d 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/suggested_actions.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/suggested_actions.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_action import CardAction from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/text_format_types.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/text_format_types.py index 6a9ab386..ca84545a 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/text_format_types.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/text_format_types.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from enum import Enum diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/text_highlight.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/text_highlight.py index adcb83b6..c97935b9 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/text_highlight.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/text_highlight.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_card.py index f5c2e57a..028446f9 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .card_image import CardImage from .card_action import CardAction from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_url.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_url.py index 3b8f3244..0fed905f 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_url.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/thumbnail_url.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_request.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_request.py index 889ef773..4598d8b6 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_request.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_request.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_response.py index e09cd999..dffd6d99 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_invoke_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_resource.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_resource.py index ede2ddb6..d4a2323a 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_resource.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_resource.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_state.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_state.py index 85d287bb..f2a9b6d5 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_state.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_exchange_state.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + import base64 import json from typing import Optional diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py index 7cf1e87f..408604f6 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from .token_response import TokenResponse from .sign_in_resource import SignInResource diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_post_resource.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_post_resource.py index 479f56c6..2caba910 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_post_resource.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_post_resource.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_request.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_request.py index b35a5e08..b7d37cc2 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_request.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_request.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .agents_model import AgentsModel from ._type_aliases import NonEmptyString diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/transcript.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/transcript.py index cc72ffe5..654f9c37 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/transcript.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/transcript.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .activity import Activity from .agents_model import AgentsModel diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/turn_context_protocol.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/turn_context_protocol.py index 41703ac6..945cbc71 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/turn_context_protocol.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/turn_context_protocol.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from __future__ import annotations from typing import Protocol, List, Callable, Optional, Generic, TypeVar diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/video_card.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/video_card.py index 5a4d63f3..5a1fd392 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/video_card.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/video_card.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from .thumbnail_url import ThumbnailUrl from .media_url import MediaUrl from .card_action import CardAction From 094092f14aa1b34a6ca8ce2c6caf11cda25ceb0f Mon Sep 17 00:00:00 2001 From: Rodrigo Brandao Date: Wed, 8 Oct 2025 12:36:19 -0700 Subject: [PATCH 7/7] Addressing PR review --- .../token_or_sign_in_resource_response.py | 10 ++++ .../hosting/core/_oauth/_flow_state.py | 4 +- .../hosting/core/_oauth/_oauth_flow.py | 10 ++-- .../connector/client/user_token_client.py | 56 +----------------- .../hosting/core/connector/user_token_base.py | 59 +++++++++++++++++++ .../core/connector/user_token_client_base.py | 3 + tests/_common/data/test_flow_data.py | 18 +++--- tests/hosting_core/_oauth/test_flow_state.py | 50 ++++++++-------- 8 files changed, 114 insertions(+), 96 deletions(-) diff --git a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py index 408604f6..b9a27b8b 100644 --- a/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py +++ b/libraries/microsoft-agents-activity/microsoft_agents/activity/token_or_sign_in_resource_response.py @@ -7,5 +7,15 @@ class TokenOrSignInResourceResponse(AgentsModel): + """Represents the response containing either a token or a sign-in resource. + + One of the two properties should be set (if returned from the 'getTokenOrSignInResource' endpoint), not both. + + :param token_response: The token response. + :type token_response: TokenResponse + :param sign_in_resource: The sign-in resource. + :type sign_in_resource: SignInResource + """ + token_response: TokenResponse = None sign_in_resource: SignInResource = None diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_flow_state.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_flow_state.py index 50572947..cbbb77aa 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_flow_state.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_flow_state.py @@ -3,7 +3,7 @@ from __future__ import annotations -from datetime import datetime +from datetime import datetime, timezone from enum import Enum from typing import Optional @@ -60,7 +60,7 @@ def from_json_to_store_item(json_data: dict) -> _FlowState: return _FlowState.model_validate(json_data) def is_expired(self) -> bool: - return datetime.now().timestamp() >= self.expiration + return datetime.now(timezone.utc).timestamp() >= self.expiration def reached_max_attempts(self) -> bool: return self.attempts_remaining <= 0 diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py index 6f4b648e..21c87ac1 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/_oauth/_oauth_flow.py @@ -6,7 +6,7 @@ import logging from pydantic import BaseModel -from datetime import datetime +from datetime import datetime, timezone from typing import Optional from microsoft_agents.activity import ( @@ -136,7 +136,7 @@ async def get_user_token(self, magic_code: str = None) -> TokenResponse: if token_response: logger.info("User token obtained successfully: %s", token_response) self._flow_state.expiration = ( - datetime.now().timestamp() + self._default_flow_duration + datetime.now(timezone.utc).timestamp() + self._default_flow_duration ) self._flow_state.tag = _FlowStateTag.COMPLETE @@ -203,7 +203,7 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: logger.info("Skipping flow, user token obtained.") self._flow_state.tag = _FlowStateTag.COMPLETE self._flow_state.expiration = ( - datetime.now().timestamp() + self._default_flow_duration + datetime.now(timezone.utc).timestamp() + self._default_flow_duration ) return _FlowResponse( flow_state=self._flow_state, token_response=res.token_response @@ -211,7 +211,7 @@ async def begin_flow(self, activity: Activity) -> _FlowResponse: self._flow_state.tag = _FlowStateTag.BEGIN self._flow_state.expiration = ( - datetime.now().timestamp() + self._default_flow_duration + datetime.now(timezone.utc).timestamp() + self._default_flow_duration ) self._flow_state.attempts_remaining = self._max_attempts @@ -303,7 +303,7 @@ async def continue_flow(self, activity: Activity) -> _FlowResponse: else: self._flow_state.tag = _FlowStateTag.COMPLETE self._flow_state.expiration = ( - datetime.now().timestamp() + self._default_flow_duration + datetime.now(timezone.utc).timestamp() + self._default_flow_duration ) logger.debug( "OAuth flow completed successfully, got TokenResponse: %s", diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py index 3b5fd699..0d1b8c4c 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/client/user_token_client.py @@ -115,15 +115,6 @@ async def get_token( channel_id: Optional[str] = None, code: Optional[str] = None, ) -> TokenResponse: - """ - Gets a token for a user and connection. - - :param user_id: ID of the user. - :param connection_name: Name of the connection to use. - :param channel_id: ID of the channel. - :param code: Optional authorization code. - :return: A token response. - """ params = {"userId": user_id, "connectionName": connection_name} if channel_id: @@ -152,18 +143,6 @@ async def _get_token_or_sign_in_resource( final_redirect: str = "", fwd_url: str = "", ) -> TokenOrSignInResourceResponse: - """ - Gets a token or a sign-in resource for a user and connection. - - :param user_id: ID of the user. - :param connection_name: Name of the connection to use. - :param channel_id: ID of the channel. - :param state: State parameter for OAuth flow. - :param code: Optional authorization code. - :param final_redirect: Final redirect URL. - :param fwd_url: Forward URL. - :return: A token or sign-in resource response. - """ params = { "userId": user_id, @@ -179,7 +158,7 @@ async def _get_token_or_sign_in_resource( async with self.client.get( "/api/usertoken/GetTokenOrSignInResource", params=params ) as response: - if response.status >= 400: + if response.status != 200: logger.error( "Error getting token or sign-in resource: %s", response.status ) @@ -195,15 +174,6 @@ async def get_aad_tokens( channel_id: Optional[str] = None, body: Optional[dict] = None, ) -> dict[str, TokenResponse]: - """ - Gets Azure Active Directory tokens for a user and connection. - - :param user_id: ID of the user. - :param connection_name: Name of the connection to use. - :param channel_id: ID of the channel. - :param body: An optional dictionary containing resource URLs. - :return: A dictionary of tokens. - """ params = {"userId": user_id, "connectionName": connection_name} if channel_id: @@ -226,13 +196,6 @@ async def sign_out( connection_name: Optional[str] = None, channel_id: Optional[str] = None, ) -> None: - """ - Signs the user out from the specified connection. - - :param user_id: ID of the user. - :param connection_name: Name of the connection to use. - :param channel_id: ID of the channel. - """ params = {"userId": user_id} if connection_name: @@ -254,14 +217,6 @@ async def get_token_status( channel_id: Optional[str] = None, include: Optional[str] = None, ) -> list[TokenStatus]: - """ - Gets token status for the user. - - :param user_id: ID of the user. - :param channel_id: ID of the channel. - :param include: Optional filter. - :return: A list of token status objects. - """ params = {"userId": user_id} if channel_id: @@ -287,15 +242,6 @@ async def exchange_token( channel_id: str, body: Optional[dict] = None, ) -> TokenResponse: - """ - Exchanges a token. - - :param user_id: ID of the user. - :param connection_name: Name of the connection to use. - :param channel_id: ID of the channel. - :param body: An optional token exchange request body. - :return: A token response. - """ params = { "userId": user_id, "connectionName": connection_name, diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py index 91203c97..32c21abe 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_base.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from abc import abstractmethod from typing import Protocol @@ -9,6 +12,8 @@ class UserTokenBase(Protocol): + """Base class for user token operations.""" + @abstractmethod async def get_token( self, @@ -17,6 +22,15 @@ async def get_token( channel_id: str = None, code: str = None, ) -> TokenResponse: + """ + Get sign-in URL. + + :param state: State parameter for OAuth flow. + :param code_challenge: Code challenge for PKCE. + :param emulator_url: Emulator URL if used. + :param final_redirect: Final redirect URL. + :return: The sign-in URL. + """ raise NotImplementedError() @abstractmethod @@ -30,6 +44,18 @@ async def _get_token_or_sign_in_resource( final_redirect: str = "", fwd_url: str = "", ) -> TokenOrSignInResourceResponse: + """ + Gets a token or a sign-in resource for a user and connection. + + :param user_id: ID of the user. + :param connection_name: Name of the connection to use. + :param channel_id: ID of the channel. + :param state: State parameter for OAuth flow. + :param code: Optional authorization code. + :param final_redirect: Final redirect URL. + :param fwd_url: Forward URL. + :return: A token or sign-in resource response. + """ raise NotImplementedError() @abstractmethod @@ -40,22 +66,55 @@ async def get_aad_tokens( channel_id: str = None, body: dict = None, ) -> dict[str, TokenResponse]: + """ + Gets Azure Active Directory tokens for a user and connection. + + :param user_id: ID of the user. + :param connection_name: Name of the connection to use. + :param channel_id: ID of the channel. + :param body: An optional dictionary containing resource URLs. + :return: A dictionary of tokens. + """ raise NotImplementedError() @abstractmethod async def sign_out( self, user_id: str, connection_name: str = None, channel_id: str = None ) -> None: + """ + Signs the user out from the specified connection. + + :param user_id: ID of the user. + :param connection_name: Name of the connection to use. + :param channel_id: ID of the channel. + """ raise NotImplementedError() @abstractmethod async def get_token_status( self, user_id: str, channel_id: str = None, include: str = None ) -> list[TokenStatus]: + """ + Gets token status for the user. + + :param user_id: ID of the user. + :param channel_id: ID of the channel. + :param include: Optional filter. + :return: A list of token status objects. + """ raise NotImplementedError() @abstractmethod async def exchange_token( self, user_id: str, connection_name: str, channel_id: str, body: dict = None ) -> TokenResponse: + """ + Exchanges a token. + + :param user_id: ID of the user. + :param connection_name: Name of the connection to use. + :param channel_id: ID of the channel. + :param body: An optional token exchange request body. + :return: A token response. + """ raise NotImplementedError() diff --git a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_client_base.py b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_client_base.py index d7f0f141..7c398a58 100644 --- a/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_client_base.py +++ b/libraries/microsoft-agents-hosting-core/microsoft_agents/hosting/core/connector/user_token_client_base.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + from abc import abstractmethod from typing import Protocol diff --git a/tests/_common/data/test_flow_data.py b/tests/_common/data/test_flow_data.py index ac41c0f8..5cfc6910 100644 --- a/tests/_common/data/test_flow_data.py +++ b/tests/_common/data/test_flow_data.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone from microsoft_agents.hosting.core._oauth import _FlowState, _FlowStateTag @@ -22,53 +22,53 @@ def __init__(self): **DEF_FLOW_ARGS, tag=_FlowStateTag.NOT_STARTED, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.started = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.BEGIN, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.started_one_retry = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.BEGIN, attempts_remaining=2, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.active = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.CONTINUE, attempts_remaining=2, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.active_one_retry = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.CONTINUE, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.active_exp = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.CONTINUE, attempts_remaining=2, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ) self.completed = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.COMPLETE, attempts_remaining=2, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.fail_by_attempts = _FlowState( **DEF_FLOW_ARGS, tag=_FlowStateTag.FAILURE, attempts_remaining=0, - expiration=datetime.now().timestamp() + 1000000, + expiration=datetime.now(timezone.utc).timestamp() + 1000000, ) self.fail_by_exp = _FlowState( diff --git a/tests/hosting_core/_oauth/test_flow_state.py b/tests/hosting_core/_oauth/test_flow_state.py index a96468dd..c2a26ff2 100644 --- a/tests/hosting_core/_oauth/test_flow_state.py +++ b/tests/hosting_core/_oauth/test_flow_state.py @@ -1,5 +1,5 @@ import pytest -from datetime import datetime +from datetime import datetime, timezone from microsoft_agents.hosting.core._oauth._flow_state import _FlowState, _FlowStateTag @@ -11,7 +11,7 @@ class TestFlowState: _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=0, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -19,7 +19,7 @@ class TestFlowState: _FlowState( tag=_FlowStateTag.BEGIN, attempts_remaining=1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -27,7 +27,7 @@ class TestFlowState: _FlowState( tag=_FlowStateTag.COMPLETE, attempts_remaining=0, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), True, ), @@ -35,7 +35,7 @@ class TestFlowState: _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -43,7 +43,7 @@ class TestFlowState: _FlowState( tag=_FlowStateTag.FAILURE, attempts_remaining=-1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), False, ), @@ -64,7 +64,7 @@ def test_refresh(self, original_flow_state, refresh_to_not_started): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=0, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -72,7 +72,7 @@ def test_refresh(self, original_flow_state, refresh_to_not_started): _FlowState( tag=_FlowStateTag.BEGIN, attempts_remaining=1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -80,7 +80,7 @@ def test_refresh(self, original_flow_state, refresh_to_not_started): _FlowState( tag=_FlowStateTag.COMPLETE, attempts_remaining=0, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), True, ), @@ -88,7 +88,7 @@ def test_refresh(self, original_flow_state, refresh_to_not_started): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -96,7 +96,7 @@ def test_refresh(self, original_flow_state, refresh_to_not_started): _FlowState( tag=_FlowStateTag.FAILURE, attempts_remaining=-1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -112,7 +112,7 @@ def test_is_expired(self, flow_state, expected): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=0, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -120,7 +120,7 @@ def test_is_expired(self, flow_state, expected): _FlowState( tag=_FlowStateTag.BEGIN, attempts_remaining=1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), False, ), @@ -128,7 +128,7 @@ def test_is_expired(self, flow_state, expected): _FlowState( tag=_FlowStateTag.COMPLETE, attempts_remaining=0, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), True, ), @@ -136,7 +136,7 @@ def test_is_expired(self, flow_state, expected): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=1, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), False, ), @@ -144,7 +144,7 @@ def test_is_expired(self, flow_state, expected): _FlowState( tag=_FlowStateTag.FAILURE, attempts_remaining=-1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), True, ), @@ -160,7 +160,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=0, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), False, ), @@ -168,7 +168,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.BEGIN, attempts_remaining=1, - expiration=datetime.now().timestamp(), + expiration=datetime.now(timezone.utc).timestamp(), ), False, ), @@ -176,7 +176,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.COMPLETE, attempts_remaining=0, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), False, ), @@ -184,7 +184,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.FAILURE, attempts_remaining=1, - expiration=datetime.now().timestamp() - 100, + expiration=datetime.now(timezone.utc).timestamp() - 100, ), False, ), @@ -192,7 +192,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=2, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), True, ), @@ -200,7 +200,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.BEGIN, attempts_remaining=0, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -208,7 +208,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.COMPLETE, attempts_remaining=-1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -216,7 +216,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.FAILURE, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), False, ), @@ -224,7 +224,7 @@ def test_reached_max_attempts(self, flow_state, expected): _FlowState( tag=_FlowStateTag.CONTINUE, attempts_remaining=1, - expiration=datetime.now().timestamp() + 1000, + expiration=datetime.now(timezone.utc).timestamp() + 1000, ), True, ),