From 9144763ca0caabfe076fb5e7358ca1507d9774e4 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Thu, 12 Dec 2019 23:50:31 -0800 Subject: [PATCH 1/7] serialize invoke activity body --- .../botbuilder/core/bot_framework_adapter.py | 6 +++++- .../botbuilder/core/teams/__init__.py | 3 ++- .../core/teams/teams_activity_handler.py | 4 ++-- .../botbuilder/core/teams/teams_helper.py | 19 ++++++++++++++++++- .../botbuilder/core/teams/teams_info.py | 8 ++++++-- .../botbuilder/schema/teams/_models.py | 1 + .../botbuilder/schema/teams/_models_py3.py | 1 + 7 files changed, 35 insertions(+), 7 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py index 9facd0f61..2e0f9c024 100644 --- a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py +++ b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py @@ -254,7 +254,11 @@ async def process_activity(self, req, auth_header: str, logic: Callable): teams_channel_data["tenant"]["id"] ) - return await self.run_pipeline(context, logic) + pipeline_result = await self.run_pipeline(context, logic) + + return pipeline_result or context.turn_state.get( + BotFrameworkAdapter._INVOKE_RESPONSE_KEY # pylint: disable=protected-access + ) async def authenticate_request( self, request: Activity, auth_header: str diff --git a/libraries/botbuilder-core/botbuilder/core/teams/__init__.py b/libraries/botbuilder-core/botbuilder/core/teams/__init__.py index 2e482ac88..9acc2a250 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/__init__.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/__init__.py @@ -7,7 +7,7 @@ from .teams_activity_handler import TeamsActivityHandler from .teams_info import TeamsInfo -from .teams_helper import deserializer_helper +from .teams_helper import deserializer_helper, serializer_helper from .teams_activity_extensions import ( teams_get_channel_id, teams_get_team_info, @@ -21,4 +21,5 @@ "teams_get_channel_id", "teams_get_team_info", "teams_notify_user", + "serializer_helper", ] diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index f2f12f141..a4d8b2eb3 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -4,7 +4,7 @@ from http import HTTPStatus from botbuilder.schema import Activity, ActivityTypes, ChannelAccount from botbuilder.core.turn_context import TurnContext -from botbuilder.core.teams.teams_helper import deserializer_helper +from botbuilder.core.teams.teams_helper import deserializer_helper, serializer_helper from botbuilder.core import ActivityHandler, InvokeResponse, BotFrameworkAdapter from botbuilder.schema.teams import ( AppBasedLinkQuery, @@ -441,7 +441,7 @@ async def on_teams_channel_renamed_activity( # pylint: disable=unused-argument @staticmethod def _create_invoke_response(body: object = None) -> InvokeResponse: - return InvokeResponse(status=int(HTTPStatus.OK), body=body) + return InvokeResponse(status=int(HTTPStatus.OK), body=serializer_helper(body)) class _InvokeResponseException(Exception): diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index 2e11f2953..c5bc77c99 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -2,7 +2,7 @@ from typing import Type from enum import Enum -from msrest.serialization import Model, Deserializer +from msrest.serialization import Model, Deserializer, Serializer import botbuilder.schema as schema import botbuilder.schema.teams as teams_schema @@ -22,3 +22,20 @@ def deserializer_helper(msrest_cls: Type[Model], dict_to_deserialize: dict) -> M dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} deserializer = Deserializer(dependencies_dict) return deserializer(msrest_cls.__name__, dict_to_deserialize) + +# TODO consolidate these two methods + +def serializer_helper(object_to_serialize: Model) -> dict: + dependencies = [ + schema_cls + for key, schema_cls in getmembers(schema) + if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum)) + ] + dependencies += [ + schema_cls + for key, schema_cls in getmembers(teams_schema) + if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum)) + ] + dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} + serializer = Serializer(dependencies_dict) + return serializer._serialize(object_to_serialize) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index b70fe256f..c0a020a01 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -3,6 +3,7 @@ from typing import List from botbuilder.core.turn_context import TurnContext +from botbuilder.core.teams.teams_helper import deserializer_helper from botbuilder.schema.teams import ( ChannelInfo, TeamDetails, @@ -110,7 +111,10 @@ async def _get_members( ) for member in members: - new_account_json = member.serialize() - teams_members.append(TeamsChannelAccount(**new_account_json)) + teams_members.append( + TeamsChannelAccount().deserialize( + dict(member.serialize(), **member.additional_properties) + ) + ) return teams_members diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/_models.py b/libraries/botbuilder-schema/botbuilder/schema/teams/_models.py index 835846cb4..3cce195d6 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/_models.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/_models.py @@ -1538,6 +1538,7 @@ class TeamsChannelAccount(ChannelAccount): "surname": {"key": "surname", "type": "str"}, "email": {"key": "email", "type": "str"}, "userPrincipalName": {"key": "userPrincipalName", "type": "str"}, + "aad_object_id": {"key": "objectId", "type": "str"}, } def __init__(self, **kwargs): diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py index 62d1e4a6f..4c5213075 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py @@ -1798,6 +1798,7 @@ class TeamsChannelAccount(ChannelAccount): "surname": {"key": "surname", "type": "str"}, "email": {"key": "email", "type": "str"}, "user_principal_name": {"key": "userPrincipalName", "type": "str"}, + "aad_object_id": {"key": "objectId", "type": "str"}, } def __init__( From efed4749f280a28f34da4f7ff9506c8db5da8595 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 00:14:41 -0800 Subject: [PATCH 2/7] pylint fixes --- libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py | 2 +- libraries/botbuilder-core/botbuilder/core/teams/teams_info.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index c5bc77c99..24cc082e7 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -38,4 +38,4 @@ def serializer_helper(object_to_serialize: Model) -> dict: ] dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} serializer = Serializer(dependencies_dict) - return serializer._serialize(object_to_serialize) + return serializer._serialize(object_to_serialize) # pylint: disable=protected-access diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index c0a020a01..ca1e71a43 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -3,7 +3,6 @@ from typing import List from botbuilder.core.turn_context import TurnContext -from botbuilder.core.teams.teams_helper import deserializer_helper from botbuilder.schema.teams import ( ChannelInfo, TeamDetails, From b688c1c6d575340e6cc358a0cf16a35475f922d3 Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 00:18:03 -0800 Subject: [PATCH 3/7] black fixes --- .../botbuilder/core/bot_framework_adapter.py | 4 ++-- .../botbuilder-core/botbuilder/core/teams/teams_helper.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py index 2e0f9c024..03b9a96d2 100644 --- a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py +++ b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py @@ -257,8 +257,8 @@ async def process_activity(self, req, auth_header: str, logic: Callable): pipeline_result = await self.run_pipeline(context, logic) return pipeline_result or context.turn_state.get( - BotFrameworkAdapter._INVOKE_RESPONSE_KEY # pylint: disable=protected-access - ) + BotFrameworkAdapter._INVOKE_RESPONSE_KEY # pylint: disable=protected-access + ) async def authenticate_request( self, request: Activity, auth_header: str diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index 24cc082e7..b2491df1c 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -23,8 +23,10 @@ def deserializer_helper(msrest_cls: Type[Model], dict_to_deserialize: dict) -> M deserializer = Deserializer(dependencies_dict) return deserializer(msrest_cls.__name__, dict_to_deserialize) + # TODO consolidate these two methods + def serializer_helper(object_to_serialize: Model) -> dict: dependencies = [ schema_cls @@ -38,4 +40,6 @@ def serializer_helper(object_to_serialize: Model) -> dict: ] dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} serializer = Serializer(dependencies_dict) - return serializer._serialize(object_to_serialize) # pylint: disable=protected-access + return serializer._serialize( + object_to_serialize + ) # pylint: disable=protected-access From b3844a0f4c48a607b9e5ba1c1d8f2489934d078f Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 00:37:05 -0800 Subject: [PATCH 4/7] fix merge issues --- .../botbuilder/core/teams/teams_activity_handler.py | 1 - .../botbuilder-core/botbuilder/core/teams/teams_helper.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index baa2ab77b..174f7e9b8 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -6,7 +6,6 @@ from botbuilder.core import ActivityHandler, InvokeResponse, BotFrameworkAdapter from botbuilder.core.turn_context import TurnContext from botbuilder.core.teams.teams_helper import deserializer_helper, serializer_helper -from botbuilder.core import ActivityHandler, InvokeResponse, BotFrameworkAdapter from botbuilder.core.teams.teams_info import TeamsInfo from botbuilder.schema.teams import ( AppBasedLinkQuery, diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index b2491df1c..1fd496e9a 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -40,6 +40,7 @@ def serializer_helper(object_to_serialize: Model) -> dict: ] dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} serializer = Serializer(dependencies_dict) + # pylint: disable=protected-access return serializer._serialize( object_to_serialize - ) # pylint: disable=protected-access + ) From 908b2c7ccef37734f74421a063d31d0bb5426e1f Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 00:41:59 -0800 Subject: [PATCH 5/7] black fix --- .../botbuilder-core/botbuilder/core/teams/teams_helper.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index 1fd496e9a..8772c6e04 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -41,6 +41,4 @@ def serializer_helper(object_to_serialize: Model) -> dict: dependencies_dict = {dependency.__name__: dependency for dependency in dependencies} serializer = Serializer(dependencies_dict) # pylint: disable=protected-access - return serializer._serialize( - object_to_serialize - ) + return serializer._serialize(object_to_serialize) From 4c36826b2ba465aae8cd16032b746603c99aa62f Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 09:55:24 -0800 Subject: [PATCH 6/7] return None if object to serialize is None --- .../botbuilder-core/botbuilder/core/teams/teams_helper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py index 8772c6e04..f9e8c65e8 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py @@ -28,6 +28,9 @@ def deserializer_helper(msrest_cls: Type[Model], dict_to_deserialize: dict) -> M def serializer_helper(object_to_serialize: Model) -> dict: + if object_to_serialize is None: + return None + dependencies = [ schema_cls for key, schema_cls in getmembers(schema) From 1efa62b166be92553635e3cf1ad20f761ea5a26d Mon Sep 17 00:00:00 2001 From: Eric Dahlvang Date: Fri, 13 Dec 2019 11:24:19 -0800 Subject: [PATCH 7/7] return invoke response from process_activity --- .../botbuilder/core/bot_framework_adapter.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py index a13607d83..7309bdbef 100644 --- a/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py +++ b/libraries/botbuilder-core/botbuilder/core/bot_framework_adapter.py @@ -38,6 +38,7 @@ from .bot_adapter import BotAdapter from .turn_context import TurnContext from .user_token_provider import UserTokenProvider +from .invoke_response import InvokeResponse from .conversation_reference_extension import get_continuation_activity USER_AGENT = f"Microsoft-BotFramework/3.1 (BotBuilder Python/{__version__})" @@ -263,11 +264,17 @@ async def process_activity(self, req, auth_header: str, logic: Callable): teams_channel_data["tenant"]["id"] ) - pipeline_result = await self.run_pipeline(context, logic) + await self.run_pipeline(context, logic) - return pipeline_result or context.turn_state.get( - BotFrameworkAdapter._INVOKE_RESPONSE_KEY # pylint: disable=protected-access - ) + if activity.type == ActivityTypes.invoke: + invoke_response = context.turn_state.get( + BotFrameworkAdapter._INVOKE_RESPONSE_KEY # pylint: disable=protected-access + ) + if invoke_response is None: + return InvokeResponse(status=501) + return invoke_response.value + + return None async def authenticate_request( self, request: Activity, auth_header: str @@ -287,7 +294,7 @@ async def authenticate_request( ) if not claims.is_authenticated: - raise Exception("Unauthorized Access. Request is not authorized") + raise PermissionError("Unauthorized Access. Request is not authorized") return claims