symphony_bdk_python 2.10.dev0__py3-none-any.whl → 2.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- symphony/bdk/core/__init__.py +1 -0
- symphony/bdk/core/activity/__init__.py +1 -2
- symphony/bdk/core/activity/api.py +4 -4
- symphony/bdk/core/activity/command.py +17 -9
- symphony/bdk/core/activity/exception.py +2 -4
- symphony/bdk/core/activity/help_command.py +3 -2
- symphony/bdk/core/activity/parsing/arguments.py +1 -1
- symphony/bdk/core/activity/parsing/command_token.py +5 -4
- symphony/bdk/core/activity/parsing/input_tokenizer.py +13 -5
- symphony/bdk/core/activity/parsing/match_result.py +5 -3
- symphony/bdk/core/activity/parsing/message_entities.py +7 -6
- symphony/bdk/core/activity/parsing/slash_command_pattern.py +22 -7
- symphony/bdk/core/activity/registry.py +17 -7
- symphony/bdk/core/auth/__init__.py +1 -2
- symphony/bdk/core/auth/auth_session.py +33 -14
- symphony/bdk/core/auth/authenticator_factory.py +41 -21
- symphony/bdk/core/auth/bot_authenticator.py +33 -21
- symphony/bdk/core/auth/exception.py +3 -6
- symphony/bdk/core/auth/ext_app_authenticator.py +40 -30
- symphony/bdk/core/auth/jwt_helper.py +36 -15
- symphony/bdk/core/auth/obo_authenticator.py +27 -18
- symphony/bdk/core/auth/tokens_repository.py +5 -6
- symphony/bdk/core/client/__init__.py +2 -2
- symphony/bdk/core/client/api_client_factory.py +40 -22
- symphony/bdk/core/client/trace_id.py +3 -4
- symphony/bdk/core/config/__init__.py +1 -2
- symphony/bdk/core/config/exception.py +2 -4
- symphony/bdk/core/config/loader.py +2 -2
- symphony/bdk/core/config/model/bdk_app_config.py +5 -3
- symphony/bdk/core/config/model/bdk_authentication_config.py +13 -7
- symphony/bdk/core/config/model/bdk_bot_config.py +6 -3
- symphony/bdk/core/config/model/bdk_client_config.py +1 -1
- symphony/bdk/core/config/model/bdk_config.py +12 -7
- symphony/bdk/core/config/model/bdk_datafeed_config.py +7 -6
- symphony/bdk/core/config/model/bdk_datahose_config.py +1 -2
- symphony/bdk/core/config/model/bdk_retry_config.py +7 -3
- symphony/bdk/core/config/model/bdk_rsa_key_config.py +4 -5
- symphony/bdk/core/config/model/bdk_server_config.py +7 -2
- symphony/bdk/core/extension.py +15 -13
- symphony/bdk/core/retry/__init__.py +13 -9
- symphony/bdk/core/retry/_asyncio.py +10 -7
- symphony/bdk/core/retry/strategy.py +5 -2
- symphony/bdk/core/service/__init__.py +1 -2
- symphony/bdk/core/service/application/application_service.py +51 -41
- symphony/bdk/core/service/connection/connection_service.py +14 -23
- symphony/bdk/core/service/connection/model/connection_status.py +1 -0
- symphony/bdk/core/service/datafeed/abstract_ackId_event_loop.py +24 -14
- symphony/bdk/core/service/datafeed/abstract_datafeed_loop.py +16 -7
- symphony/bdk/core/service/datafeed/abstract_datahose_loop.py +2 -2
- symphony/bdk/core/service/datafeed/datafeed_loop_v1.py +18 -10
- symphony/bdk/core/service/datafeed/datafeed_loop_v2.py +31 -21
- symphony/bdk/core/service/datafeed/datahose_loop.py +22 -11
- symphony/bdk/core/service/datafeed/on_disk_datafeed_id_repository.py +10 -4
- symphony/bdk/core/service/datafeed/real_time_event_listener.py +32 -18
- symphony/bdk/core/service/exception.py +3 -6
- symphony/bdk/core/service/health/health_service.py +5 -4
- symphony/bdk/core/service/message/message_parser.py +10 -8
- symphony/bdk/core/service/message/message_service.py +196 -161
- symphony/bdk/core/service/message/messageml_util.py +6 -6
- symphony/bdk/core/service/message/model.py +15 -5
- symphony/bdk/core/service/message/multi_attachments_messages_api.py +134 -219
- symphony/bdk/core/service/obo_services.py +5 -4
- symphony/bdk/core/service/pagination.py +9 -6
- symphony/bdk/core/service/presence/presence_service.py +40 -28
- symphony/bdk/core/service/session/session_service.py +7 -13
- symphony/bdk/core/service/signal/signal_service.py +66 -33
- symphony/bdk/core/service/stream/stream_service.py +186 -69
- symphony/bdk/core/service/stream/stream_util.py +1 -0
- symphony/bdk/core/service/user/model/delegate_action_enum.py +1 -0
- symphony/bdk/core/service/user/model/role_id.py +1 -0
- symphony/bdk/core/service/user/user_service.py +225 -313
- symphony/bdk/core/service/user/user_util.py +4 -6
- symphony/bdk/core/service/version/__init__.py +0 -0
- symphony/bdk/core/service/version/agent_version_service.py +62 -0
- symphony/bdk/core/service_factory.py +50 -53
- symphony/bdk/core/symphony_bdk.py +34 -18
- symphony/bdk/ext/group.py +52 -37
- symphony/bdk/gen/agent_api/attachments_api.py +10 -18
- symphony/bdk/gen/agent_api/audit_trail_api.py +8 -12
- symphony/bdk/gen/agent_api/datafeed_api.py +34 -219
- symphony/bdk/gen/agent_api/datahose_api.py +184 -0
- symphony/bdk/gen/agent_api/dlp_policies_and_dictionary_management_api.py +130 -214
- symphony/bdk/gen/agent_api/messages_api.py +99 -119
- symphony/bdk/gen/agent_api/share_api.py +7 -11
- symphony/bdk/gen/agent_api/signals_api.py +1 -1
- symphony/bdk/gen/agent_api/system_api.py +1 -1
- symphony/bdk/gen/agent_api/util_api.py +13 -21
- symphony/bdk/gen/agent_api/violations_api.py +45 -73
- symphony/bdk/gen/agent_model/ack_id.py +1 -1
- symphony/bdk/gen/agent_model/agent_info.py +1 -1
- symphony/bdk/gen/agent_model/attachment_info.py +1 -1
- symphony/bdk/gen/agent_model/base_message.py +1 -1
- symphony/bdk/gen/agent_model/base_signal.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscriber.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscriber_response.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscription_error.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscription_response.py +1 -1
- symphony/bdk/gen/agent_model/connection_request_message.py +1 -1
- symphony/bdk/gen/agent_model/connection_request_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/datafeed.py +1 -1
- symphony/bdk/gen/agent_model/error.py +1 -1
- symphony/bdk/gen/agent_model/import_response.py +1 -1
- symphony/bdk/gen/agent_model/import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/imported_message.py +1 -1
- symphony/bdk/gen/agent_model/ingestion_error.py +266 -0
- symphony/bdk/gen/agent_model/message.py +1 -1
- symphony/bdk/gen/agent_model/message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/message_list.py +1 -1
- symphony/bdk/gen/agent_model/message_search_query.py +1 -1
- symphony/bdk/gen/agent_model/message_submission.py +1 -1
- symphony/bdk/gen/agent_model/pagination.py +1 -1
- symphony/bdk/gen/agent_model/pagination_cursors.py +1 -1
- symphony/bdk/gen/agent_model/room_created_message.py +1 -1
- symphony/bdk/gen/agent_model/room_created_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_deactivated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_deactivated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message.py +1 -1
- symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message.py +1 -1
- symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_reactivated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_reactivated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_tag.py +1 -1
- symphony/bdk/gen/agent_model/room_updated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_updated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/share_article.py +1 -1
- symphony/bdk/gen/agent_model/share_content.py +1 -1
- symphony/bdk/gen/agent_model/signal.py +1 -1
- symphony/bdk/gen/agent_model/signal_all_of.py +1 -6
- symphony/bdk/gen/agent_model/signal_list.py +1 -1
- symphony/bdk/gen/agent_model/simple_message.py +1 -1
- symphony/bdk/gen/agent_model/success_response.py +1 -1
- symphony/bdk/gen/agent_model/user_joined_room_message.py +1 -1
- symphony/bdk/gen/agent_model/user_joined_room_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/user_left_room_message.py +1 -1
- symphony/bdk/gen/agent_model/user_left_room_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/v1_audit_trail_initiator_list.py +1 -1
- symphony/bdk/gen/agent_model/v1_audit_trail_initiator_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_content_type.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_content.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_create_request.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_update_request.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_ref.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_matched_policy.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_matched_policy_list.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_outcome.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policies_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policy.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policy_request.py +9 -8
- symphony/bdk/gen/agent_model/v1_dlp_policy_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_signal.py +6 -1
- symphony/bdk/gen/agent_model/v1_dlp_stream.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_message.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_message_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_signal.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_signal_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_stream.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_stream_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_health_check_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_base_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_error.py +1 -1
- symphony/bdk/gen/agent_model/v2_health_check_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_import_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_imported_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_submission.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_dictionary_meta.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_classifier_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_extension_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_password_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_size_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policies_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_applies_to.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_request.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_rule.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_text_match_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_message.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_message_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_signal.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_signal_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_stream.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_stream_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_health.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_auth_type.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_component.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_status.py +1 -1
- symphony/bdk/gen/agent_model/v4_attachment_info.py +1 -1
- symphony/bdk/gen/agent_model/v4_connection_accepted.py +1 -1
- symphony/bdk/gen/agent_model/v4_connection_requested.py +1 -1
- symphony/bdk/gen/agent_model/v4_event.py +3 -3
- symphony/bdk/gen/agent_model/v4_event_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_generic_system_event.py +279 -0
- symphony/bdk/gen/agent_model/v4_import_response.py +1 -1
- symphony/bdk/gen/agent_model/v4_import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_imported_message.py +1 -1
- symphony/bdk/gen/agent_model/v4_imported_message_attachment.py +1 -1
- symphony/bdk/gen/agent_model/v4_initiator.py +1 -1
- symphony/bdk/gen/agent_model/v4_instant_message_created.py +1 -1
- symphony/bdk/gen/agent_model/v4_key_value_pair.py +1 -1
- symphony/bdk/gen/agent_model/v4_message.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_blast_response.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_sent.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_suppressed.py +1 -1
- symphony/bdk/gen/agent_model/v4_payload.py +8 -1
- symphony/bdk/gen/agent_model/v4_room_created.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_deactivated.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_member_demoted_from_owner.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_member_promoted_to_owner.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_properties.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_reactivated.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_updated.py +1 -1
- symphony/bdk/gen/agent_model/v4_shared_post.py +1 -1
- symphony/bdk/gen/agent_model/v4_stream.py +6 -1
- symphony/bdk/gen/agent_model/v4_symphony_elements_action.py +1 -1
- symphony/bdk/gen/agent_model/v4_thumbnail_info.py +1 -1
- symphony/bdk/gen/agent_model/v4_user.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_joined_room.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_left_room.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_requested_to_join_room.py +1 -1
- symphony/bdk/gen/agent_model/v5_datafeed.py +3 -3
- symphony/bdk/gen/agent_model/v5_datafeed_create_body.py +1 -1
- symphony/bdk/gen/agent_model/v5_event_list.py +1 -1
- symphony/bdk/gen/agent_model/v5_events_read_body.py +5 -5
- symphony/bdk/gen/pod_api/app_entitlement_api.py +1 -1
- symphony/bdk/gen/pod_api/application_api.py +1 -1
- symphony/bdk/gen/pod_api/connection_api.py +1 -1
- symphony/bdk/gen/pod_api/default_api.py +1 -1
- symphony/bdk/gen/pod_api/disclaimer_api.py +1 -1
- symphony/bdk/gen/pod_api/info_barriers_api.py +1 -1
- symphony/bdk/gen/pod_api/message_api.py +1 -1
- symphony/bdk/gen/pod_api/message_suppression_api.py +1 -1
- symphony/bdk/gen/pod_api/pod_api.py +1 -1
- symphony/bdk/gen/pod_api/presence_api.py +1 -1
- symphony/bdk/gen/pod_api/room_membership_api.py +1 -1
- symphony/bdk/gen/pod_api/security_api.py +1 -1
- symphony/bdk/gen/pod_api/session_api.py +1 -1
- symphony/bdk/gen/pod_api/streams_api.py +162 -1
- symphony/bdk/gen/pod_api/system_api.py +1 -1
- symphony/bdk/gen/pod_api/user_api.py +264 -2
- symphony/bdk/gen/pod_api/users_api.py +421 -1
- symphony/bdk/gen/pod_model/admin_justified_action.py +1 -1
- symphony/bdk/gen/pod_model/admin_justified_user_action.py +1 -1
- symphony/bdk/gen/pod_model/app_authentication_key.py +1 -1
- symphony/bdk/gen/pod_model/app_authentication_keys.py +1 -1
- symphony/bdk/gen/pod_model/app_notification.py +1 -1
- symphony/bdk/gen/pod_model/app_properties.py +1 -1
- symphony/bdk/gen/pod_model/app_property.py +1 -1
- symphony/bdk/gen/pod_model/application_detail.py +1 -1
- symphony/bdk/gen/pod_model/application_info.py +1 -1
- symphony/bdk/gen/pod_model/assignee_candidate.py +1 -1
- symphony/bdk/gen/pod_model/assignee_candidates.py +1 -1
- symphony/bdk/gen/pod_model/attachment_preview.py +1 -1
- symphony/bdk/gen/pod_model/avatar.py +1 -1
- symphony/bdk/gen/pod_model/avatar_list.py +1 -1
- symphony/bdk/gen/pod_model/avatar_update.py +1 -1
- symphony/bdk/gen/pod_model/bulk_action_result.py +1 -1
- symphony/bdk/gen/pod_model/cert_info.py +1 -1
- symphony/bdk/gen/pod_model/cert_info_item.py +1 -1
- symphony/bdk/gen/pod_model/company_cert.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_attributes.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_detail.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_info.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_info_list.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_status.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_type.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_type_list.py +1 -1
- symphony/bdk/gen/pod_model/conversation_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/delegate_action.py +1 -1
- symphony/bdk/gen/pod_model/disclaimer.py +1 -1
- symphony/bdk/gen/pod_model/disclaimer_list.py +1 -1
- symphony/bdk/gen/pod_model/download_receipt_count.py +1 -1
- symphony/bdk/gen/pod_model/error.py +1 -1
- symphony/bdk/gen/pod_model/faceted_match_count.py +1 -1
- symphony/bdk/gen/pod_model/feature.py +1 -1
- symphony/bdk/gen/pod_model/feature_list.py +1 -1
- symphony/bdk/gen/pod_model/file_extension.py +6 -1
- symphony/bdk/gen/pod_model/file_extensions_response.py +1 -1
- symphony/bdk/gen/pod_model/followers_list.py +1 -1
- symphony/bdk/gen/pod_model/followers_list_response.py +1 -1
- symphony/bdk/gen/pod_model/following_list_response.py +1 -1
- symphony/bdk/gen/pod_model/group.py +1 -1
- symphony/bdk/gen/pod_model/group_item.py +1 -1
- symphony/bdk/gen/pod_model/group_list.py +1 -1
- symphony/bdk/gen/pod_model/group_role_scope.py +1 -1
- symphony/bdk/gen/pod_model/im_system_info.py +1 -1
- symphony/bdk/gen/pod_model/immutable_room_attributes.py +1 -1
- symphony/bdk/gen/pod_model/integer_list.py +1 -1
- symphony/bdk/gen/pod_model/languages.py +1 -1
- symphony/bdk/gen/pod_model/member_info.py +1 -1
- symphony/bdk/gen/pod_model/membership_data.py +1 -1
- symphony/bdk/gen/pod_model/membership_list.py +1 -1
- symphony/bdk/gen/pod_model/message_detail.py +1 -1
- symphony/bdk/gen/pod_model/message_details.py +1 -1
- symphony/bdk/gen/pod_model/message_download_receipt_count.py +1 -1
- symphony/bdk/gen/pod_model/message_ids.py +1 -1
- symphony/bdk/gen/pod_model/message_metadata_response.py +1 -1
- symphony/bdk/gen/pod_model/message_metadata_response_parent.py +1 -1
- symphony/bdk/gen/pod_model/message_receipt_detail.py +1 -1
- symphony/bdk/gen/pod_model/message_receipt_detail_response.py +1 -1
- symphony/bdk/gen/pod_model/message_status.py +1 -1
- symphony/bdk/gen/pod_model/message_status_user.py +1 -1
- symphony/bdk/gen/pod_model/message_stream.py +1 -1
- symphony/bdk/gen/pod_model/message_suppression_response.py +1 -1
- symphony/bdk/gen/pod_model/message_user.py +1 -1
- symphony/bdk/gen/pod_model/name_value_pair.py +1 -1
- symphony/bdk/gen/pod_model/pagination.py +1 -1
- symphony/bdk/gen/pod_model/pagination_cursors.py +1 -1
- symphony/bdk/gen/pod_model/password.py +1 -1
- symphony/bdk/gen/pod_model/password_reset.py +1 -1
- symphony/bdk/gen/pod_model/pod_app_entitlement.py +1 -1
- symphony/bdk/gen/pod_model/pod_app_entitlement_list.py +1 -1
- symphony/bdk/gen/pod_model/pod_certificate.py +1 -1
- symphony/bdk/gen/pod_model/policy.py +1 -1
- symphony/bdk/gen/pod_model/policy_list.py +1 -1
- symphony/bdk/gen/pod_model/product.py +1 -1
- symphony/bdk/gen/pod_model/product_list.py +1 -1
- symphony/bdk/gen/pod_model/protocol.py +1 -1
- symphony/bdk/gen/pod_model/role.py +1 -1
- symphony/bdk/gen/pod_model/role_detail.py +1 -1
- symphony/bdk/gen/pod_model/role_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/role_list.py +1 -1
- symphony/bdk/gen/pod_model/room_attributes.py +1 -1
- symphony/bdk/gen/pod_model/room_detail.py +1 -1
- symphony/bdk/gen/pod_model/room_search_criteria.py +1 -1
- symphony/bdk/gen/pod_model/room_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/room_system_info.py +1 -1
- symphony/bdk/gen/pod_model/room_tag.py +1 -1
- symphony/bdk/gen/pod_model/service_account_manifest.py +264 -0
- symphony/bdk/gen/pod_model/stream.py +1 -1
- symphony/bdk/gen/pod_model/stream_attachment_item.py +1 -1
- symphony/bdk/gen/pod_model/stream_attachment_response.py +1 -1
- symphony/bdk/gen/pod_model/stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/stream_filter.py +1 -1
- symphony/bdk/gen/pod_model/stream_list.py +1 -1
- symphony/bdk/gen/pod_model/stream_type.py +1 -1
- symphony/bdk/gen/pod_model/string_id.py +1 -1
- symphony/bdk/gen/pod_model/string_list.py +1 -1
- symphony/bdk/gen/pod_model/success_response.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_list.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_patch.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_patch_enum.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlements_patch_list.py +1 -1
- symphony/bdk/gen/pod_model/user_attributes.py +1 -1
- symphony/bdk/gen/pod_model/user_compp.py +1 -1
- symphony/bdk/gen/pod_model/user_connection.py +1 -1
- symphony/bdk/gen/pod_model/user_connection_list.py +1 -1
- symphony/bdk/gen/pod_model/user_connection_request.py +1 -1
- symphony/bdk/gen/pod_model/user_data.py +1 -1
- symphony/bdk/gen/pod_model/user_detail.py +1 -1
- symphony/bdk/gen/pod_model/user_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/user_error.py +1 -1
- symphony/bdk/gen/pod_model/user_filter.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee_update.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignment_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_create.py +1 -1
- symphony/bdk/gen/pod_model/user_group_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_request.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_response_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_update.py +1 -1
- symphony/bdk/gen/pod_model/user_group_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_response_list.py +1 -1
- symphony/bdk/gen/pod_model/user_group_update.py +1 -1
- symphony/bdk/gen/pod_model/user_id.py +1 -1
- symphony/bdk/gen/pod_model/user_id_list.py +1 -1
- symphony/bdk/gen/pod_model/user_info.py +1 -1
- symphony/bdk/gen/pod_model/user_name.py +1 -1
- symphony/bdk/gen/pod_model/user_name_list.py +1 -1
- symphony/bdk/gen/pod_model/user_search_filter.py +1 -1
- symphony/bdk/gen/pod_model/user_search_query.py +1 -1
- symphony/bdk/gen/pod_model/user_search_results.py +1 -1
- symphony/bdk/gen/pod_model/user_status.py +1 -1
- symphony/bdk/gen/pod_model/user_suspension.py +1 -1
- symphony/bdk/gen/pod_model/user_system_info.py +1 -1
- symphony/bdk/gen/pod_model/user_v2.py +1 -1
- symphony/bdk/gen/pod_model/v1_im_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v1_im_detail.py +1 -1
- symphony/bdk/gen/pod_model/v1_session.py +301 -0
- symphony/bdk/gen/pod_model/v1_user_sessions.py +259 -0
- symphony/bdk/gen/pod_model/v2_admin_stream_attributes.py +6 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_filter.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_info.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_info_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_type.py +1 -1
- symphony/bdk/gen/pod_model/v2_conversation_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_info.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_info_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_user_detail.py +1 -1
- symphony/bdk/gen/pod_model/v2_membership_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_status.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_search_criteria.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_search_criteria_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_stream_type.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_create.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_detail.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_key_request.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_presence.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_presence_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v3_room_attributes.py +6 -1
- symphony/bdk/gen/pod_model/v3_room_detail.py +1 -1
- symphony/bdk/gen/pod_model/v3_room_search_results.py +1 -1
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/METADATA +19 -5
- symphony_bdk_python-2.11.0.dist-info/RECORD +546 -0
- symphony_bdk_python-2.10.dev0.dist-info/RECORD +0 -538
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/LICENSE +0 -0
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/NOTICE +0 -0
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/WHEEL +0 -0
symphony/bdk/core/__init__.py
CHANGED
|
@@ -4,6 +4,7 @@ There is an outstanding issue with aiohttp and Python 3.8+ on Windows. This affe
|
|
|
4
4
|
proxy on Windows with Python 3.8+. As known workaround, the following code is meant to avoid this issue by detecting the
|
|
5
5
|
operating system and setting WindowsSelectorEventLoopPolicy as event loop policy.
|
|
6
6
|
"""
|
|
7
|
+
|
|
7
8
|
import asyncio
|
|
8
9
|
import os
|
|
9
10
|
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
"""Package containing all modules related to the Activity API
|
|
2
|
-
"""
|
|
1
|
+
"""Package containing all modules related to the Activity API"""
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import Generic, TypeVar
|
|
3
3
|
|
|
4
4
|
from symphony.bdk.gen.agent_model.v4_initiator import V4Initiator
|
|
5
5
|
|
|
6
|
-
C = TypeVar(
|
|
7
|
-
E = TypeVar(
|
|
6
|
+
C = TypeVar("C") # Context type
|
|
7
|
+
E = TypeVar("E") # Event type
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ActivityContext(Generic[E]):
|
|
@@ -60,7 +60,7 @@ class AbstractActivity(ABC, Generic[C]):
|
|
|
60
60
|
"""
|
|
61
61
|
|
|
62
62
|
def before_matcher(self, context: C):
|
|
63
|
-
"""
|
|
63
|
+
"""This callback can be used to prepare :py:class:`ActivityContext` before actually processing the `matches`
|
|
64
64
|
method.
|
|
65
65
|
|
|
66
66
|
:param context: an instance of :py:class:`ActivityContext`
|
|
@@ -14,11 +14,15 @@ logger = logging.getLogger(__name__)
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class CommandContext(ActivityContext[V4MessageSent]):
|
|
17
|
-
"""Default implementation of the :py:class:`ActivityContext` handled by the :py:class:`CommandActivity`.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
"""Default implementation of the :py:class:`ActivityContext` handled by the :py:class:`CommandActivity`."""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
initiator: V4Initiator,
|
|
22
|
+
source_event: V4MessageSent,
|
|
23
|
+
bot_display_name: str,
|
|
24
|
+
bot_user_id: int = None,
|
|
25
|
+
):
|
|
22
26
|
self._message_id = source_event.message.message_id
|
|
23
27
|
self._stream_id = source_event.message.stream.stream_id
|
|
24
28
|
self._bot_display_name = bot_display_name
|
|
@@ -56,8 +60,7 @@ class CommandContext(ActivityContext[V4MessageSent]):
|
|
|
56
60
|
|
|
57
61
|
|
|
58
62
|
class CommandActivity(AbstractActivity[CommandContext]):
|
|
59
|
-
"""A command activity corresponds to any message sent in a chat where the bot is part of.
|
|
60
|
-
"""
|
|
63
|
+
"""A command activity corresponds to any message sent in a chat where the bot is part of."""
|
|
61
64
|
|
|
62
65
|
def __init__(self):
|
|
63
66
|
self._bot_user_id = None
|
|
@@ -103,15 +106,20 @@ class SlashCommandActivity(CommandActivity):
|
|
|
103
106
|
|
|
104
107
|
if self._requires_mention_bot:
|
|
105
108
|
# The user id will be loaded in runtime in a lazy way
|
|
106
|
-
self._command_pattern.prepend_token(
|
|
109
|
+
self._command_pattern.prepend_token(
|
|
110
|
+
MatchingUserIdMentionToken(lambda: self.bot_user_id)
|
|
111
|
+
)
|
|
107
112
|
|
|
108
113
|
@property
|
|
109
114
|
def name(self) -> str:
|
|
110
115
|
return self._name
|
|
111
116
|
|
|
112
117
|
def build_command_description(self) -> str:
|
|
113
|
-
return
|
|
118
|
+
return (
|
|
119
|
+
self._description + " (mention required)"
|
|
120
|
+
if self._requires_mention_bot
|
|
114
121
|
else self._description + " (mention not required)"
|
|
122
|
+
)
|
|
115
123
|
|
|
116
124
|
def matches(self, context: CommandContext) -> bool:
|
|
117
125
|
match_result = self._command_pattern.get_match_result(context.source_event.message)
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
"""Module containing all activities related exception.
|
|
2
|
-
"""
|
|
1
|
+
"""Module containing all activities related exception."""
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
class FatalActivityExecutionException(Exception):
|
|
6
|
-
"""A Fatal error occurred during an activity execution flow
|
|
7
|
-
"""
|
|
5
|
+
"""A Fatal error occurred during an activity execution flow"""
|
|
@@ -18,5 +18,6 @@ class HelpCommand(SlashCommandActivity):
|
|
|
18
18
|
help_message = ""
|
|
19
19
|
for act in activity_list:
|
|
20
20
|
help_message += "<li>" + act.name + " - " + act.build_command_description() + "</li>"
|
|
21
|
-
await self._bdk.messages().send_message(
|
|
22
|
-
|
|
21
|
+
await self._bdk.messages().send_message(
|
|
22
|
+
context.stream_id, "<messageML><ul>" + help_message + "</ul></messageML>"
|
|
23
|
+
)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""This module gathers all token classes that we can use for {@link SlashCommandPattern}
|
|
2
|
-
"""
|
|
1
|
+
"""This module gathers all token classes that we can use for {@link SlashCommandPattern}"""
|
|
3
2
|
|
|
4
3
|
import re
|
|
5
4
|
from abc import ABC, abstractmethod
|
|
@@ -151,5 +150,7 @@ class MatchingUserIdMentionToken(AbstractCommandToken):
|
|
|
151
150
|
return isinstance(token, Mention) and token.user_id == self._matching_user_id_supplier()
|
|
152
151
|
|
|
153
152
|
def __eq__(self, o: object) -> bool:
|
|
154
|
-
return
|
|
155
|
-
|
|
153
|
+
return (
|
|
154
|
+
isinstance(o, MatchingUserIdMentionToken)
|
|
155
|
+
and self._matching_user_id_supplier() == o._matching_user_id_supplier()
|
|
156
|
+
)
|
|
@@ -23,7 +23,7 @@ class InputTokenizer:
|
|
|
23
23
|
:param message: message to be tokenized.
|
|
24
24
|
"""
|
|
25
25
|
self._document = fromstring(message.message)
|
|
26
|
-
json_data = message.data if hasattr(message,
|
|
26
|
+
json_data = message.data if hasattr(message, "data") and message.data else "{}"
|
|
27
27
|
self._data_node = json.loads(json_data)
|
|
28
28
|
self._buffer = ""
|
|
29
29
|
self._tokens = []
|
|
@@ -43,7 +43,7 @@ class InputTokenizer:
|
|
|
43
43
|
if self._is_entity_node(root):
|
|
44
44
|
self._parse_buffer()
|
|
45
45
|
entity_id = root.attrib[InputTokenizer.data_entity_id]
|
|
46
|
-
entity_type = self._data_node[entity_id][
|
|
46
|
+
entity_type = self._data_node[entity_id]["type"]
|
|
47
47
|
if self._is_entity_type_supported(entity_type):
|
|
48
48
|
self._parse_entity_node(entity_id, root)
|
|
49
49
|
else:
|
|
@@ -91,14 +91,22 @@ class InputTokenizer:
|
|
|
91
91
|
:param root: root of the xml document
|
|
92
92
|
:return: Whether the node is a known entity.
|
|
93
93
|
"""
|
|
94
|
-
if
|
|
95
|
-
|
|
94
|
+
if (
|
|
95
|
+
root.tag == "span"
|
|
96
|
+
and "class" in root.attrib
|
|
97
|
+
and root.attrib["class"] == "entity"
|
|
98
|
+
and InputTokenizer.data_entity_id in root.attrib
|
|
99
|
+
):
|
|
96
100
|
return root.attrib[InputTokenizer.data_entity_id] in self._data_node
|
|
97
101
|
return False
|
|
98
102
|
|
|
99
103
|
@staticmethod
|
|
100
104
|
def _is_entity_type_supported(entity_type):
|
|
101
|
-
return entity_type in [
|
|
105
|
+
return entity_type in [
|
|
106
|
+
"org.symphonyoss.taxonomy",
|
|
107
|
+
"org.symphonyoss.fin.security",
|
|
108
|
+
"com.symphony.user.mention",
|
|
109
|
+
]
|
|
102
110
|
|
|
103
111
|
@property
|
|
104
112
|
def tokens(self):
|
|
@@ -24,6 +24,8 @@ class MatchResult:
|
|
|
24
24
|
return self._arguments
|
|
25
25
|
|
|
26
26
|
def __eq__(self, other):
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
return (
|
|
28
|
+
isinstance(other, MatchResult)
|
|
29
|
+
and self._is_matching == other._is_matching
|
|
30
|
+
and self._arguments == other._arguments
|
|
31
|
+
)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""This module gathers all entities that we can find in a message.
|
|
2
|
-
"""
|
|
1
|
+
"""This module gathers all entities that we can find in a message."""
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
class Cashtag:
|
|
@@ -67,7 +66,9 @@ class Mention:
|
|
|
67
66
|
return self._user_id
|
|
68
67
|
|
|
69
68
|
def __eq__(self, o: object) -> bool:
|
|
70
|
-
return
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
return (
|
|
70
|
+
isinstance(o, Mention)
|
|
71
|
+
and self._text == o._text
|
|
72
|
+
and self._user_display_name == o._user_display_name
|
|
73
|
+
and self._user_id == o._user_id
|
|
74
|
+
)
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import re
|
|
2
2
|
|
|
3
|
-
from symphony.bdk.core.activity.parsing.command_token import
|
|
4
|
-
|
|
3
|
+
from symphony.bdk.core.activity.parsing.command_token import (
|
|
4
|
+
ArgumentCommandToken,
|
|
5
|
+
CashArgumentCommandToken,
|
|
6
|
+
HashArgumentCommandToken,
|
|
7
|
+
MentionArgumentCommandToken,
|
|
8
|
+
StaticCommandToken,
|
|
9
|
+
StringArgumentCommandToken,
|
|
10
|
+
)
|
|
5
11
|
from symphony.bdk.core.activity.parsing.input_tokenizer import InputTokenizer
|
|
6
12
|
from symphony.bdk.core.activity.parsing.match_result import MatchResult
|
|
7
13
|
from symphony.bdk.gen.agent_model.v4_message import V4Message
|
|
@@ -23,10 +29,15 @@ class SlashCommandPattern:
|
|
|
23
29
|
whitespace_pattern = re.compile(r"\s+")
|
|
24
30
|
|
|
25
31
|
def __init__(self, pattern: str):
|
|
26
|
-
self._tokens = [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
self._tokens = [
|
|
33
|
+
self.create_token(pattern)
|
|
34
|
+
for pattern in re.split(SlashCommandPattern.whitespace_pattern, pattern)
|
|
35
|
+
if pattern
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
filtered_tokens_arg_names = list(
|
|
39
|
+
filter(lambda a: a is not None, map(self.get_arg_name, self._tokens))
|
|
40
|
+
)
|
|
30
41
|
if not len(set(filtered_tokens_arg_names)) == len(filtered_tokens_arg_names):
|
|
31
42
|
raise ValueError("Argument names must be unique")
|
|
32
43
|
|
|
@@ -67,7 +78,11 @@ class SlashCommandPattern:
|
|
|
67
78
|
"""
|
|
68
79
|
input_tokenizer = InputTokenizer(message)
|
|
69
80
|
input_tokens = input_tokenizer.tokens
|
|
70
|
-
return
|
|
81
|
+
return (
|
|
82
|
+
MatchResult(True, self.get_arguments(input_tokens))
|
|
83
|
+
if self.matches(input_tokens)
|
|
84
|
+
else MatchResult(False)
|
|
85
|
+
)
|
|
71
86
|
|
|
72
87
|
def matches(self, input_tokens):
|
|
73
88
|
"""
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from symphony.bdk.gen.agent_model.v4_user_joined_room import V4UserJoinedRoom
|
|
4
|
-
|
|
5
3
|
from symphony.bdk.core.activity.api import AbstractActivity
|
|
6
4
|
from symphony.bdk.core.activity.command import CommandActivity, CommandContext, SlashCommandActivity
|
|
7
|
-
from symphony.bdk.core.activity.form import
|
|
8
|
-
from symphony.bdk.core.activity.user_joined_room import
|
|
5
|
+
from symphony.bdk.core.activity.form import FormReplyActivity, FormReplyContext
|
|
6
|
+
from symphony.bdk.core.activity.user_joined_room import (
|
|
7
|
+
UserJoinedRoomActivity,
|
|
8
|
+
UserJoinedRoomContext,
|
|
9
|
+
)
|
|
9
10
|
from symphony.bdk.core.service.datafeed.real_time_event_listener import RealTimeEventListener
|
|
10
11
|
from symphony.bdk.core.service.session.session_service import SessionService
|
|
11
12
|
from symphony.bdk.gen.agent_model.v4_initiator import V4Initiator
|
|
12
13
|
from symphony.bdk.gen.agent_model.v4_message_sent import V4MessageSent
|
|
13
14
|
from symphony.bdk.gen.agent_model.v4_symphony_elements_action import V4SymphonyElementsAction
|
|
15
|
+
from symphony.bdk.gen.agent_model.v4_user_joined_room import V4UserJoinedRoom
|
|
14
16
|
|
|
15
17
|
logger = logging.getLogger(__name__)
|
|
16
18
|
|
|
@@ -22,6 +24,7 @@ def _initialize_display_name(func):
|
|
|
22
24
|
:param func: the function to be decorated
|
|
23
25
|
:return: the decorated function
|
|
24
26
|
"""
|
|
27
|
+
|
|
25
28
|
async def decorator(*args, **kwargs):
|
|
26
29
|
registry = args[0]
|
|
27
30
|
await registry.fetch_bot_info()
|
|
@@ -59,7 +62,9 @@ class ActivityRegistry(RealTimeEventListener):
|
|
|
59
62
|
for act in self._activity_list:
|
|
60
63
|
if act == activity:
|
|
61
64
|
self._activity_list.remove(act)
|
|
62
|
-
logger.debug(
|
|
65
|
+
logger.debug(
|
|
66
|
+
"Activity '%s' has been removed/unsubscribed in order to be replaced", act
|
|
67
|
+
)
|
|
63
68
|
|
|
64
69
|
def slash(self, command: str, mention_bot: bool = True, description: str = ""):
|
|
65
70
|
"""Decorator around a listener callback coroutine which takes a
|
|
@@ -72,8 +77,11 @@ class ActivityRegistry(RealTimeEventListener):
|
|
|
72
77
|
:param description: command description
|
|
73
78
|
:return: None
|
|
74
79
|
"""
|
|
80
|
+
|
|
75
81
|
def decorator(func):
|
|
76
|
-
logger.debug(
|
|
82
|
+
logger.debug(
|
|
83
|
+
"Registering slash command with command=%s, mention_bot=%s", command, mention_bot
|
|
84
|
+
)
|
|
77
85
|
self.register(SlashCommandActivity(command, mention_bot, func, description))
|
|
78
86
|
return func
|
|
79
87
|
|
|
@@ -89,7 +97,9 @@ class ActivityRegistry(RealTimeEventListener):
|
|
|
89
97
|
await act.on_activity(context)
|
|
90
98
|
|
|
91
99
|
@_initialize_display_name
|
|
92
|
-
async def on_symphony_elements_action(
|
|
100
|
+
async def on_symphony_elements_action(
|
|
101
|
+
self, initiator: V4Initiator, event: V4SymphonyElementsAction
|
|
102
|
+
):
|
|
93
103
|
context = FormReplyContext(initiator, event)
|
|
94
104
|
for act in self._activity_list:
|
|
95
105
|
if isinstance(act, FormReplyActivity):
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
"""Package containing all modules related to authentication
|
|
2
|
-
"""
|
|
1
|
+
"""Package containing all modules related to authentication"""
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
"""Module containing session handle classes.
|
|
1
|
+
"""Module containing session handle classes."""
|
|
2
2
|
|
|
3
|
-
"""
|
|
4
|
-
from datetime import datetime, timezone
|
|
5
3
|
import logging
|
|
4
|
+
from datetime import datetime, timezone
|
|
6
5
|
|
|
7
6
|
from symphony.bdk.core.auth.exception import AuthInitializationError
|
|
7
|
+
from symphony.bdk.core.auth.jwt_helper import extract_token_claims
|
|
8
8
|
|
|
9
9
|
logger = logging.getLogger(__name__)
|
|
10
10
|
|
|
11
11
|
EXPIRATION_SAFETY_BUFFER_SECONDS = 5
|
|
12
|
+
SKD_FLAG_NAME = "canUseSimplifiedKeyDelivery"
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class AuthSession:
|
|
@@ -29,11 +30,13 @@ class AuthSession:
|
|
|
29
30
|
self._expire_at = -1
|
|
30
31
|
|
|
31
32
|
async def refresh(self):
|
|
32
|
-
"""Trigger re-authentication to refresh the tokens.
|
|
33
|
-
"""
|
|
33
|
+
"""Trigger re-authentication to refresh the tokens."""
|
|
34
34
|
logger.debug("Authenticate")
|
|
35
35
|
self._session_token = await self._authenticator.retrieve_session_token()
|
|
36
|
-
|
|
36
|
+
if await self.skd_enabled:
|
|
37
|
+
self._key_manager_token = ""
|
|
38
|
+
return
|
|
39
|
+
self.key_manager_token = await self._authenticator.retrieve_key_manager_token()
|
|
37
40
|
|
|
38
41
|
@property
|
|
39
42
|
async def session_token(self):
|
|
@@ -71,6 +74,10 @@ class AuthSession:
|
|
|
71
74
|
|
|
72
75
|
:return: the key manager token
|
|
73
76
|
"""
|
|
77
|
+
|
|
78
|
+
if await self.skd_enabled:
|
|
79
|
+
return ""
|
|
80
|
+
|
|
74
81
|
if self._key_manager_token is None:
|
|
75
82
|
self._key_manager_token = await self._authenticator.retrieve_key_manager_token()
|
|
76
83
|
return self._key_manager_token
|
|
@@ -91,6 +98,13 @@ class AuthSession:
|
|
|
91
98
|
"""
|
|
92
99
|
self._key_manager_token = value
|
|
93
100
|
|
|
101
|
+
@property
|
|
102
|
+
async def skd_enabled(self):
|
|
103
|
+
token_data = extract_token_claims(await self.session_token)
|
|
104
|
+
if not token_data.get(SKD_FLAG_NAME, False):
|
|
105
|
+
return False
|
|
106
|
+
return await self._authenticator.agent_version_service.is_skd_supported()
|
|
107
|
+
|
|
94
108
|
|
|
95
109
|
class OboAuthSession(AuthSession):
|
|
96
110
|
"""RSA OBO Authentication session handle to get the OBO session token from.
|
|
@@ -108,21 +122,26 @@ class OboAuthSession(AuthSession):
|
|
|
108
122
|
"""
|
|
109
123
|
super().__init__(authenticator)
|
|
110
124
|
if user_id is not None and username is not None:
|
|
111
|
-
raise AuthInitializationError(
|
|
112
|
-
|
|
125
|
+
raise AuthInitializationError(
|
|
126
|
+
"Username and user id for OBO authentication should not be defined at a same time."
|
|
127
|
+
)
|
|
113
128
|
if user_id is None and username is None:
|
|
114
|
-
raise AuthInitializationError(
|
|
115
|
-
|
|
129
|
+
raise AuthInitializationError(
|
|
130
|
+
"At least username or user id should be defined for OBO authentication."
|
|
131
|
+
)
|
|
116
132
|
self.user_id = user_id
|
|
117
133
|
self.username = username
|
|
118
134
|
|
|
119
135
|
async def refresh(self):
|
|
120
|
-
"""Trigger re-authentication to refresh the OBO session token.
|
|
121
|
-
"""
|
|
136
|
+
"""Trigger re-authentication to refresh the OBO session token."""
|
|
122
137
|
if self.user_id is not None:
|
|
123
|
-
self._session_token = await self._authenticator.retrieve_obo_session_token_by_user_id(
|
|
138
|
+
self._session_token = await self._authenticator.retrieve_obo_session_token_by_user_id(
|
|
139
|
+
self.user_id
|
|
140
|
+
)
|
|
124
141
|
if self.username is not None:
|
|
125
|
-
self._session_token = await self._authenticator.retrieve_obo_session_token_by_username(
|
|
142
|
+
self._session_token = await self._authenticator.retrieve_obo_session_token_by_username(
|
|
143
|
+
self.username
|
|
144
|
+
)
|
|
126
145
|
|
|
127
146
|
@property
|
|
128
147
|
async def session_token(self):
|
|
@@ -1,11 +1,21 @@
|
|
|
1
|
-
"""Module for instantiating various authenticator objects.
|
|
2
|
-
"""
|
|
1
|
+
"""Module for instantiating various authenticator objects."""
|
|
3
2
|
|
|
4
|
-
from symphony.bdk.core.auth.bot_authenticator import
|
|
3
|
+
from symphony.bdk.core.auth.bot_authenticator import (
|
|
4
|
+
BotAuthenticator,
|
|
5
|
+
BotAuthenticatorCert,
|
|
6
|
+
BotAuthenticatorRsa,
|
|
7
|
+
)
|
|
5
8
|
from symphony.bdk.core.auth.exception import AuthInitializationError
|
|
6
|
-
from symphony.bdk.core.auth.ext_app_authenticator import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
from symphony.bdk.core.auth.ext_app_authenticator import (
|
|
10
|
+
ExtensionAppAuthenticator,
|
|
11
|
+
ExtensionAppAuthenticatorCert,
|
|
12
|
+
ExtensionAppAuthenticatorRsa,
|
|
13
|
+
)
|
|
14
|
+
from symphony.bdk.core.auth.obo_authenticator import (
|
|
15
|
+
OboAuthenticator,
|
|
16
|
+
OboAuthenticatorCert,
|
|
17
|
+
OboAuthenticatorRsa,
|
|
18
|
+
)
|
|
9
19
|
from symphony.bdk.core.client.api_client_factory import ApiClientFactory
|
|
10
20
|
from symphony.bdk.core.config.model.bdk_config import BdkConfig
|
|
11
21
|
from symphony.bdk.gen.auth_api.certificate_authentication_api import CertificateAuthenticationApi
|
|
@@ -45,18 +55,20 @@ class AuthenticatorFactory:
|
|
|
45
55
|
self._config.bot,
|
|
46
56
|
self._api_client_factory.get_login_client(),
|
|
47
57
|
self._api_client_factory.get_relay_client(),
|
|
48
|
-
self._config.retry
|
|
58
|
+
self._config.retry,
|
|
49
59
|
)
|
|
50
60
|
if self._config.bot.is_certificate_configuration_valid():
|
|
51
61
|
return BotAuthenticatorCert(
|
|
52
62
|
self._api_client_factory.get_session_auth_client(),
|
|
53
63
|
self._api_client_factory.get_key_auth_client(),
|
|
54
|
-
self._config.retry
|
|
64
|
+
self._config.retry,
|
|
55
65
|
)
|
|
56
|
-
raise AuthInitializationError(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
raise AuthInitializationError(
|
|
67
|
+
"RSA or certificate authentication should be configured. "
|
|
68
|
+
"Only one field among private key path or content should be configured "
|
|
69
|
+
"for bot RSA authentication. "
|
|
70
|
+
"The path field should be specified for bot certificate authentication."
|
|
71
|
+
)
|
|
60
72
|
|
|
61
73
|
def get_obo_authenticator(self) -> OboAuthenticator:
|
|
62
74
|
"""Creates a new instance of a Obo Authenticator service.
|
|
@@ -68,13 +80,17 @@ class AuthenticatorFactory:
|
|
|
68
80
|
return OboAuthenticatorRsa(
|
|
69
81
|
app_config,
|
|
70
82
|
AuthenticationApi(self._api_client_factory.get_login_client()),
|
|
71
|
-
self._config.retry
|
|
83
|
+
self._config.retry,
|
|
72
84
|
)
|
|
73
85
|
if app_config.is_certificate_configuration_valid():
|
|
74
|
-
authentication_api = CertificateAuthenticationApi(
|
|
86
|
+
authentication_api = CertificateAuthenticationApi(
|
|
87
|
+
self._api_client_factory.get_app_session_auth_client()
|
|
88
|
+
)
|
|
75
89
|
return OboAuthenticatorCert(authentication_api, self._config.retry)
|
|
76
|
-
raise AuthInitializationError(
|
|
77
|
-
|
|
90
|
+
raise AuthInitializationError(
|
|
91
|
+
"Application under 'app' field should be configured with a private key or "
|
|
92
|
+
"a certificate in order to use OBO authentication."
|
|
93
|
+
)
|
|
78
94
|
|
|
79
95
|
def get_extension_app_authenticator(self) -> ExtensionAppAuthenticator:
|
|
80
96
|
"""Creates a new instance of an extension app authenticator service.
|
|
@@ -88,14 +104,18 @@ class AuthenticatorFactory:
|
|
|
88
104
|
PodApi(self._api_client_factory.get_pod_client()),
|
|
89
105
|
app_config.app_id,
|
|
90
106
|
app_config.private_key,
|
|
91
|
-
self._config.retry
|
|
107
|
+
self._config.retry,
|
|
92
108
|
)
|
|
93
109
|
if app_config.is_certificate_configuration_valid():
|
|
94
110
|
return ExtensionAppAuthenticatorCert(
|
|
95
|
-
CertificateAuthenticationApi(
|
|
111
|
+
CertificateAuthenticationApi(
|
|
112
|
+
self._api_client_factory.get_app_session_auth_client()
|
|
113
|
+
),
|
|
96
114
|
CertificatePodApi(self._api_client_factory.get_app_session_auth_client()),
|
|
97
115
|
app_config.app_id,
|
|
98
|
-
self._config.retry
|
|
116
|
+
self._config.retry,
|
|
99
117
|
)
|
|
100
|
-
raise AuthInitializationError(
|
|
101
|
-
|
|
118
|
+
raise AuthInitializationError(
|
|
119
|
+
"Application under 'app' field should be configured with a private key path or "
|
|
120
|
+
"content in order to authenticate extension app."
|
|
121
|
+
)
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
"""Module containing BotAuthenticator classes.
|
|
2
|
-
|
|
3
|
-
from typing import Optional, Tuple
|
|
1
|
+
"""Module containing BotAuthenticator classes."""
|
|
2
|
+
|
|
4
3
|
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Optional, Tuple
|
|
5
5
|
|
|
6
6
|
from symphony.bdk.core.auth.jwt_helper import create_signed_jwt, generate_expiration_time
|
|
7
7
|
from symphony.bdk.core.config.model.bdk_bot_config import BdkBotConfig
|
|
8
8
|
from symphony.bdk.core.config.model.bdk_retry_config import BdkRetryConfig
|
|
9
9
|
from symphony.bdk.core.retry import retry
|
|
10
10
|
from symphony.bdk.core.retry.strategy import authentication_retry
|
|
11
|
+
from symphony.bdk.core.service.version.agent_version_service import AgentVersionService
|
|
11
12
|
from symphony.bdk.gen.api_client import ApiClient
|
|
12
13
|
from symphony.bdk.gen.auth_api.certificate_authentication_api import CertificateAuthenticationApi
|
|
13
14
|
from symphony.bdk.gen.login_api.authentication_api import AuthenticationApi
|
|
@@ -16,14 +17,18 @@ from symphony.bdk.gen.login_model.token import Token
|
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
class BotAuthenticator(ABC):
|
|
19
|
-
"""Bot authentication service.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
"""Bot authentication service."""
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
session_auth_client: ApiClient,
|
|
25
|
+
key_manager_auth_client: ApiClient,
|
|
26
|
+
retry_config: BdkRetryConfig,
|
|
27
|
+
):
|
|
24
28
|
self._session_auth_client = session_auth_client
|
|
25
29
|
self._key_manager_auth_client = key_manager_auth_client
|
|
26
30
|
self._retry_config = retry_config
|
|
31
|
+
self._agent_version_service = None
|
|
27
32
|
|
|
28
33
|
async def retrieve_session_token(self) -> str:
|
|
29
34
|
"""Authenticates and retrieves a new session token.
|
|
@@ -38,9 +43,7 @@ class BotAuthenticator(ABC):
|
|
|
38
43
|
:return: retrieved token object + expiration date.
|
|
39
44
|
"""
|
|
40
45
|
expire_at = generate_expiration_time()
|
|
41
|
-
token = await self._authenticate_and_get_token_object(
|
|
42
|
-
self._session_auth_client, expire_at
|
|
43
|
-
)
|
|
46
|
+
token = await self._authenticate_and_get_token_object(self._session_auth_client, expire_at)
|
|
44
47
|
return token, expire_at
|
|
45
48
|
|
|
46
49
|
async def retrieve_key_manager_token(self) -> str:
|
|
@@ -59,13 +62,25 @@ class BotAuthenticator(ABC):
|
|
|
59
62
|
:return: the token as a string
|
|
60
63
|
"""
|
|
61
64
|
|
|
65
|
+
@property
|
|
66
|
+
def agent_version_service(self) -> Optional[AgentVersionService]:
|
|
67
|
+
return self._agent_version_service
|
|
68
|
+
|
|
69
|
+
@agent_version_service.setter
|
|
70
|
+
def agent_version_service(self, agent_version_service: AgentVersionService):
|
|
71
|
+
self._agent_version_service = agent_version_service
|
|
62
72
|
|
|
63
|
-
class BotAuthenticatorRsa(BotAuthenticator):
|
|
64
|
-
"""Bot authenticator RSA implementation.
|
|
65
|
-
"""
|
|
66
73
|
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
class BotAuthenticatorRsa(BotAuthenticator):
|
|
75
|
+
"""Bot authenticator RSA implementation."""
|
|
76
|
+
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
bot_config: BdkBotConfig,
|
|
80
|
+
login_api_client: ApiClient,
|
|
81
|
+
relay_api_client: ApiClient,
|
|
82
|
+
retry_config: BdkRetryConfig,
|
|
83
|
+
):
|
|
69
84
|
self._bot_config = bot_config
|
|
70
85
|
super().__init__(login_api_client, relay_api_client, retry_config)
|
|
71
86
|
|
|
@@ -81,16 +96,13 @@ class BotAuthenticatorRsa(BotAuthenticator):
|
|
|
81
96
|
"""Calls pubkey auth endpoint with signed jwt token.
|
|
82
97
|
:return: token object which might contain a few tokens inside
|
|
83
98
|
"""
|
|
84
|
-
jwt = create_signed_jwt(
|
|
85
|
-
self._bot_config.private_key, self._bot_config.username, expire_at
|
|
86
|
-
)
|
|
99
|
+
jwt = create_signed_jwt(self._bot_config.private_key, self._bot_config.username, expire_at)
|
|
87
100
|
req = AuthenticateRequest(token=jwt)
|
|
88
101
|
return await AuthenticationApi(api_client).pubkey_authenticate_post(req)
|
|
89
102
|
|
|
90
103
|
|
|
91
104
|
class BotAuthenticatorCert(BotAuthenticator):
|
|
92
|
-
"""Bot authenticator certificate implementation.
|
|
93
|
-
"""
|
|
105
|
+
"""Bot authenticator certificate implementation."""
|
|
94
106
|
|
|
95
107
|
@retry(retry=authentication_retry)
|
|
96
108
|
async def _authenticate_and_get_token(self, api_client: ApiClient) -> str:
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
"""Module containing all authentication related exception.
|
|
2
|
-
"""
|
|
1
|
+
"""Module containing all authentication related exception."""
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
class AuthInitializationError(Exception):
|
|
6
|
-
"""Thrown when unable to read/parse a RSA Private Key or a certificate.
|
|
7
|
-
"""
|
|
5
|
+
"""Thrown when unable to read/parse a RSA Private Key or a certificate."""
|
|
8
6
|
|
|
9
7
|
def __init__(self, message: str):
|
|
10
8
|
super().__init__()
|
|
@@ -12,8 +10,7 @@ class AuthInitializationError(Exception):
|
|
|
12
10
|
|
|
13
11
|
|
|
14
12
|
class AuthUnauthorizedError(Exception):
|
|
15
|
-
"""When thrown, it means that authentication cannot be performed for several reasons
|
|
16
|
-
"""
|
|
13
|
+
"""When thrown, it means that authentication cannot be performed for several reasons"""
|
|
17
14
|
|
|
18
15
|
def __init__(self, message: str, cause: Exception = None):
|
|
19
16
|
super().__init__()
|