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
|
@@ -4,6 +4,7 @@ The tenant ID is stored in the 27 highest bits (minus the sign bit which is unus
|
|
|
4
4
|
positive value) which allows for 134 million pods.
|
|
5
5
|
This leaves 36 lowest bits for the user ID, which allows 68.7 billion users per tenant.
|
|
6
6
|
"""
|
|
7
|
+
|
|
7
8
|
TENANT_ID_BIT_LENGTH = 27
|
|
8
9
|
SUBTENANT_ID_BIT_LENGTH = 36
|
|
9
10
|
TENANT_ID_INDEX = 1
|
|
@@ -20,8 +21,7 @@ def extract_tenant_id(user_id: int):
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
class NumberUtil:
|
|
23
|
-
"""Used to compute the segments bases in the input sizes
|
|
24
|
-
"""
|
|
24
|
+
"""Used to compute the segments bases in the input sizes"""
|
|
25
25
|
|
|
26
26
|
def __init__(self, sizes: []):
|
|
27
27
|
self._segments = []
|
|
@@ -38,15 +38,13 @@ class NumberUtil:
|
|
|
38
38
|
raise ValueError("total size is larger than the bit-count of 64")
|
|
39
39
|
|
|
40
40
|
def extract(self, value: int, index: int):
|
|
41
|
-
"""Extract the tenant_id given the user_id and the index
|
|
42
|
-
"""
|
|
41
|
+
"""Extract the tenant_id given the user_id and the index"""
|
|
43
42
|
segment = self._segments[index]
|
|
44
43
|
return value >> segment._shift & segment._mask
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
class Segment:
|
|
48
|
-
"""Helper class to initialize a Segment
|
|
49
|
-
"""
|
|
47
|
+
"""Helper class to initialize a Segment"""
|
|
50
48
|
|
|
51
49
|
def __init__(self, size: int, shift: int):
|
|
52
50
|
mask = 0
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
|
|
4
|
+
from symphony.bdk.core.auth.jwt_helper import generate_expiration_time
|
|
5
|
+
from symphony.bdk.core.config.model.bdk_retry_config import BdkRetryConfig
|
|
6
|
+
from symphony.bdk.core.retry import retry
|
|
7
|
+
from symphony.bdk.gen.agent_api.signals_api import SignalsApi
|
|
8
|
+
from symphony.bdk.gen.exceptions import ApiException
|
|
9
|
+
|
|
10
|
+
MIN_MAJOR_VERSION = 24
|
|
11
|
+
MIN_MINOR_VERSION = 12
|
|
12
|
+
VERSION_REGEXP = r"Agent-(\d+)\.(\d+)\..*"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AgentVersionService:
|
|
16
|
+
"""Service class has one purpose only. It checks if version of agents supports simplified key delivery mechanism"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, signals_api: SignalsApi, retry_config: BdkRetryConfig):
|
|
19
|
+
self._signals_api = signals_api
|
|
20
|
+
self._retry_config = retry_config
|
|
21
|
+
self._is_skd_supported = None
|
|
22
|
+
self._expire_at = -1
|
|
23
|
+
|
|
24
|
+
async def is_skd_supported(self) -> bool:
|
|
25
|
+
"""AgentVersionService stores cached version flag.
|
|
26
|
+
Caching interval is the same as in to session token caching.
|
|
27
|
+
Once cache is expired it calls agent info api to update version.
|
|
28
|
+
|
|
29
|
+
:return: boolean flag if skd supported for agent
|
|
30
|
+
"""
|
|
31
|
+
if (
|
|
32
|
+
self._is_skd_supported is not None
|
|
33
|
+
and self._expire_at > datetime.now(timezone.utc).timestamp()
|
|
34
|
+
):
|
|
35
|
+
return self._is_skd_supported
|
|
36
|
+
self._expire_at = generate_expiration_time()
|
|
37
|
+
self._is_skd_supported = await self._get_agent_skd_support()
|
|
38
|
+
return self._is_skd_supported
|
|
39
|
+
|
|
40
|
+
@retry
|
|
41
|
+
async def _get_agent_skd_support(self) -> bool:
|
|
42
|
+
try:
|
|
43
|
+
agent_info = await self._signals_api.v1_info_get()
|
|
44
|
+
if not agent_info or not agent_info.version:
|
|
45
|
+
return False
|
|
46
|
+
except ApiException:
|
|
47
|
+
return False
|
|
48
|
+
agent_major_version, agent_minor_version = self._parse_version(agent_info.version)
|
|
49
|
+
if not agent_major_version:
|
|
50
|
+
return False
|
|
51
|
+
if agent_major_version == MIN_MAJOR_VERSION:
|
|
52
|
+
return agent_minor_version >= MIN_MINOR_VERSION
|
|
53
|
+
return agent_major_version > MIN_MAJOR_VERSION
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def _parse_version(version_string):
|
|
57
|
+
if not version_string:
|
|
58
|
+
return None, None
|
|
59
|
+
match = re.match(VERSION_REGEXP, version_string)
|
|
60
|
+
if match:
|
|
61
|
+
return int(match.group(1)), int(match.group(2))
|
|
62
|
+
return None, None
|
|
@@ -1,23 +1,32 @@
|
|
|
1
1
|
"""Service factory module"""
|
|
2
|
+
|
|
2
3
|
from symphony.bdk.core.auth.auth_session import AuthSession
|
|
3
4
|
from symphony.bdk.core.client.api_client_factory import ApiClientFactory
|
|
4
5
|
from symphony.bdk.core.config.model.bdk_config import BdkConfig
|
|
5
6
|
from symphony.bdk.core.service.application.application_service import ApplicationService
|
|
6
|
-
from symphony.bdk.core.service.connection.connection_service import
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
from symphony.bdk.core.service.connection.connection_service import (
|
|
8
|
+
ConnectionService,
|
|
9
|
+
OboConnectionService,
|
|
10
|
+
)
|
|
11
|
+
from symphony.bdk.core.service.datafeed.abstract_datafeed_loop import (
|
|
12
|
+
AbstractDatafeedLoop,
|
|
13
|
+
DatafeedVersion,
|
|
14
|
+
)
|
|
9
15
|
from symphony.bdk.core.service.datafeed.abstract_datahose_loop import AbstractDatahoseLoop
|
|
10
16
|
from symphony.bdk.core.service.datafeed.datafeed_loop_v1 import DatafeedLoopV1
|
|
11
17
|
from symphony.bdk.core.service.datafeed.datafeed_loop_v2 import DatafeedLoopV2
|
|
12
18
|
from symphony.bdk.core.service.datafeed.datahose_loop import DatahoseLoop
|
|
13
19
|
from symphony.bdk.core.service.health.health_service import HealthService
|
|
14
20
|
from symphony.bdk.core.service.message.message_service import MessageService, OboMessageService
|
|
15
|
-
from symphony.bdk.core.service.message.multi_attachments_messages_api import
|
|
16
|
-
|
|
21
|
+
from symphony.bdk.core.service.message.multi_attachments_messages_api import (
|
|
22
|
+
MultiAttachmentsMessagesApi,
|
|
23
|
+
)
|
|
24
|
+
from symphony.bdk.core.service.presence.presence_service import OboPresenceService, PresenceService
|
|
17
25
|
from symphony.bdk.core.service.session.session_service import SessionService
|
|
18
|
-
from symphony.bdk.core.service.signal.signal_service import
|
|
19
|
-
from symphony.bdk.core.service.stream.stream_service import
|
|
20
|
-
from symphony.bdk.core.service.user.user_service import
|
|
26
|
+
from symphony.bdk.core.service.signal.signal_service import OboSignalService, SignalService
|
|
27
|
+
from symphony.bdk.core.service.stream.stream_service import OboStreamService, StreamService
|
|
28
|
+
from symphony.bdk.core.service.user.user_service import OboUserService, UserService
|
|
29
|
+
from symphony.bdk.core.service.version.agent_version_service import AgentVersionService
|
|
21
30
|
from symphony.bdk.gen.agent_api.attachments_api import AttachmentsApi
|
|
22
31
|
from symphony.bdk.gen.agent_api.audit_trail_api import AuditTrailApi
|
|
23
32
|
from symphony.bdk.gen.agent_api.datafeed_api import DatafeedApi
|
|
@@ -52,16 +61,15 @@ class ServiceFactory:
|
|
|
52
61
|
"""
|
|
53
62
|
|
|
54
63
|
def __init__(
|
|
55
|
-
|
|
56
|
-
api_client_factory: ApiClientFactory,
|
|
57
|
-
auth_session: AuthSession,
|
|
58
|
-
config: BdkConfig
|
|
64
|
+
self, api_client_factory: ApiClientFactory, auth_session: AuthSession, config: BdkConfig
|
|
59
65
|
):
|
|
60
66
|
self._pod_client = api_client_factory.get_pod_client()
|
|
61
67
|
self._agent_client = api_client_factory.get_agent_client()
|
|
62
68
|
self._auth_session = auth_session
|
|
63
69
|
self._config = config
|
|
64
|
-
self._session_service = SessionService(
|
|
70
|
+
self._session_service = SessionService(
|
|
71
|
+
SessionApi(self._pod_client), self._auth_session, self._config.retry
|
|
72
|
+
)
|
|
65
73
|
|
|
66
74
|
def get_user_service(self) -> UserService:
|
|
67
75
|
"""Returns a fully initialized UserService
|
|
@@ -74,7 +82,8 @@ class ServiceFactory:
|
|
|
74
82
|
AuditTrailApi(self._agent_client),
|
|
75
83
|
PodSystemApi(self._pod_client),
|
|
76
84
|
self._auth_session,
|
|
77
|
-
self._config.retry
|
|
85
|
+
self._config.retry,
|
|
86
|
+
self._config.manifest,
|
|
78
87
|
)
|
|
79
88
|
|
|
80
89
|
def get_message_service(self) -> MessageService:
|
|
@@ -91,7 +100,7 @@ class ServiceFactory:
|
|
|
91
100
|
AttachmentsApi(self._agent_client),
|
|
92
101
|
DefaultApi(self._pod_client),
|
|
93
102
|
self._auth_session,
|
|
94
|
-
self._config.retry
|
|
103
|
+
self._config.retry,
|
|
95
104
|
)
|
|
96
105
|
|
|
97
106
|
def get_connection_service(self) -> ConnectionService:
|
|
@@ -100,9 +109,7 @@ class ServiceFactory:
|
|
|
100
109
|
:return: a new ConnectionService instance.
|
|
101
110
|
"""
|
|
102
111
|
return ConnectionService(
|
|
103
|
-
ConnectionApi(self._pod_client),
|
|
104
|
-
self._auth_session,
|
|
105
|
-
self._config.retry
|
|
112
|
+
ConnectionApi(self._pod_client), self._auth_session, self._config.retry
|
|
106
113
|
)
|
|
107
114
|
|
|
108
115
|
def get_stream_service(self) -> StreamService:
|
|
@@ -115,7 +122,8 @@ class ServiceFactory:
|
|
|
115
122
|
RoomMembershipApi(self._pod_client),
|
|
116
123
|
ShareApi(self._agent_client),
|
|
117
124
|
self._auth_session,
|
|
118
|
-
self._config.retry
|
|
125
|
+
self._config.retry,
|
|
126
|
+
)
|
|
119
127
|
|
|
120
128
|
def get_application_service(self) -> ApplicationService:
|
|
121
129
|
"""Returns a fully initialized ApplicationService
|
|
@@ -126,7 +134,7 @@ class ServiceFactory:
|
|
|
126
134
|
ApplicationApi(self._pod_client),
|
|
127
135
|
AppEntitlementApi(self._pod_client),
|
|
128
136
|
self._auth_session,
|
|
129
|
-
self._config.retry
|
|
137
|
+
self._config.retry,
|
|
130
138
|
)
|
|
131
139
|
|
|
132
140
|
def get_signal_service(self) -> SignalService:
|
|
@@ -134,11 +142,7 @@ class ServiceFactory:
|
|
|
134
142
|
|
|
135
143
|
:return: a new SignalService instance
|
|
136
144
|
"""
|
|
137
|
-
return SignalService(
|
|
138
|
-
SignalsApi(self._agent_client),
|
|
139
|
-
self._auth_session,
|
|
140
|
-
self._config.retry
|
|
141
|
-
)
|
|
145
|
+
return SignalService(SignalsApi(self._agent_client), self._auth_session, self._config.retry)
|
|
142
146
|
|
|
143
147
|
def get_session_service(self) -> SessionService:
|
|
144
148
|
"""Returns a fully initialized SessionService
|
|
@@ -158,13 +162,10 @@ class ServiceFactory:
|
|
|
158
162
|
DatafeedApi(self._agent_client),
|
|
159
163
|
self._session_service,
|
|
160
164
|
self._auth_session,
|
|
161
|
-
self._config
|
|
165
|
+
self._config,
|
|
162
166
|
)
|
|
163
167
|
return DatafeedLoopV2(
|
|
164
|
-
DatafeedApi(self._agent_client),
|
|
165
|
-
self._session_service,
|
|
166
|
-
self._auth_session,
|
|
167
|
-
self._config
|
|
168
|
+
DatafeedApi(self._agent_client), self._session_service, self._auth_session, self._config
|
|
168
169
|
)
|
|
169
170
|
|
|
170
171
|
def get_datahose_loop(self) -> AbstractDatahoseLoop:
|
|
@@ -177,7 +178,7 @@ class ServiceFactory:
|
|
|
177
178
|
DatafeedApi(self._agent_client),
|
|
178
179
|
self._session_service,
|
|
179
180
|
self._auth_session,
|
|
180
|
-
self._config
|
|
181
|
+
self._config,
|
|
181
182
|
)
|
|
182
183
|
|
|
183
184
|
def get_health_service(self) -> HealthService:
|
|
@@ -186,9 +187,7 @@ class ServiceFactory:
|
|
|
186
187
|
:return: a new HealthService instance
|
|
187
188
|
"""
|
|
188
189
|
return HealthService(
|
|
189
|
-
AgentSystemApi(self._agent_client),
|
|
190
|
-
SignalsApi(self._agent_client),
|
|
191
|
-
self._config.retry
|
|
190
|
+
AgentSystemApi(self._agent_client), SignalsApi(self._agent_client), self._config.retry
|
|
192
191
|
)
|
|
193
192
|
|
|
194
193
|
def get_presence_service(self) -> PresenceService:
|
|
@@ -197,11 +196,16 @@ class ServiceFactory:
|
|
|
197
196
|
:return: a new PresenceService instance
|
|
198
197
|
"""
|
|
199
198
|
return PresenceService(
|
|
200
|
-
PresenceApi(self._pod_client),
|
|
201
|
-
self._auth_session,
|
|
202
|
-
self._config.retry
|
|
199
|
+
PresenceApi(self._pod_client), self._auth_session, self._config.retry
|
|
203
200
|
)
|
|
204
201
|
|
|
202
|
+
def get_agent_version_service(self) -> AgentVersionService:
|
|
203
|
+
"""Returns a fully initialized AgentVersionService
|
|
204
|
+
|
|
205
|
+
:return: a new AgentVersionService instance
|
|
206
|
+
"""
|
|
207
|
+
return AgentVersionService(SignalsApi(self._agent_client), self._config.retry)
|
|
208
|
+
|
|
205
209
|
|
|
206
210
|
class OboServiceFactory:
|
|
207
211
|
"""Factory responsible for creating BDK service instances for OBO-enabled endpoints only:
|
|
@@ -215,10 +219,7 @@ class OboServiceFactory:
|
|
|
215
219
|
"""
|
|
216
220
|
|
|
217
221
|
def __init__(
|
|
218
|
-
|
|
219
|
-
api_client_factory: ApiClientFactory,
|
|
220
|
-
auth_session: AuthSession,
|
|
221
|
-
config: BdkConfig
|
|
222
|
+
self, api_client_factory: ApiClientFactory, auth_session: AuthSession, config: BdkConfig
|
|
222
223
|
):
|
|
223
224
|
self._pod_client = api_client_factory.get_pod_client()
|
|
224
225
|
self._agent_client = api_client_factory.get_agent_client()
|
|
@@ -234,7 +235,7 @@ class OboServiceFactory:
|
|
|
234
235
|
UserApi(self._pod_client),
|
|
235
236
|
UsersApi(self._pod_client),
|
|
236
237
|
self._auth_session,
|
|
237
|
-
self._config.retry
|
|
238
|
+
self._config.retry,
|
|
238
239
|
)
|
|
239
240
|
|
|
240
241
|
def get_message_service(self) -> OboMessageService:
|
|
@@ -245,8 +246,9 @@ class OboServiceFactory:
|
|
|
245
246
|
return OboMessageService(
|
|
246
247
|
MultiAttachmentsMessagesApi(self._agent_client),
|
|
247
248
|
MessageSuppressionApi(self._pod_client),
|
|
249
|
+
self._pod_client,
|
|
248
250
|
self._auth_session,
|
|
249
|
-
self._config.retry
|
|
251
|
+
self._config.retry,
|
|
250
252
|
)
|
|
251
253
|
|
|
252
254
|
def get_connection_service(self) -> OboConnectionService:
|
|
@@ -255,9 +257,7 @@ class OboServiceFactory:
|
|
|
255
257
|
:return: a new OboConnectionService instance.
|
|
256
258
|
"""
|
|
257
259
|
return OboConnectionService(
|
|
258
|
-
ConnectionApi(self._pod_client),
|
|
259
|
-
self._auth_session,
|
|
260
|
-
self._config.retry
|
|
260
|
+
ConnectionApi(self._pod_client), self._auth_session, self._config.retry
|
|
261
261
|
)
|
|
262
262
|
|
|
263
263
|
def get_stream_service(self) -> OboStreamService:
|
|
@@ -270,7 +270,8 @@ class OboServiceFactory:
|
|
|
270
270
|
RoomMembershipApi(self._pod_client),
|
|
271
271
|
ShareApi(self._agent_client),
|
|
272
272
|
self._auth_session,
|
|
273
|
-
self._config.retry
|
|
273
|
+
self._config.retry,
|
|
274
|
+
)
|
|
274
275
|
|
|
275
276
|
def get_presence_service(self) -> OboPresenceService:
|
|
276
277
|
"""Returns a fully initialized OboPresenceService
|
|
@@ -278,9 +279,7 @@ class OboServiceFactory:
|
|
|
278
279
|
:return: a new OboPresenceService instance
|
|
279
280
|
"""
|
|
280
281
|
return OboPresenceService(
|
|
281
|
-
PresenceApi(self._pod_client),
|
|
282
|
-
self._auth_session,
|
|
283
|
-
self._config.retry
|
|
282
|
+
PresenceApi(self._pod_client), self._auth_session, self._config.retry
|
|
284
283
|
)
|
|
285
284
|
|
|
286
285
|
def get_signal_service(self) -> OboSignalService:
|
|
@@ -289,7 +288,5 @@ class OboServiceFactory:
|
|
|
289
288
|
:return: a new OboSignalService instance
|
|
290
289
|
"""
|
|
291
290
|
return OboSignalService(
|
|
292
|
-
SignalsApi(self._agent_client),
|
|
293
|
-
self._auth_session,
|
|
294
|
-
self._config.retry
|
|
291
|
+
SignalsApi(self._agent_client), self._auth_session, self._config.retry
|
|
295
292
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""Module containing SymphonyBdk class which acts as en entry point for all BDK services.
|
|
2
|
-
|
|
1
|
+
"""Module containing SymphonyBdk class which acts as en entry point for all BDK services."""
|
|
2
|
+
|
|
3
3
|
import functools
|
|
4
4
|
import logging
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ from symphony.bdk.core.auth.authenticator_factory import AuthenticatorFactory
|
|
|
9
9
|
from symphony.bdk.core.auth.exception import AuthInitializationError
|
|
10
10
|
from symphony.bdk.core.auth.ext_app_authenticator import ExtensionAppAuthenticator
|
|
11
11
|
from symphony.bdk.core.client.api_client_factory import ApiClientFactory
|
|
12
|
-
from symphony.bdk.core.config.exception import
|
|
12
|
+
from symphony.bdk.core.config.exception import BdkConfigError, BotNotConfiguredError
|
|
13
13
|
from symphony.bdk.core.extension import ExtensionService
|
|
14
14
|
from symphony.bdk.core.service.application.application_service import ApplicationService
|
|
15
15
|
from symphony.bdk.core.service.connection.connection_service import ConnectionService
|
|
@@ -55,6 +55,7 @@ def app_service(func):
|
|
|
55
55
|
:return: the value returned by the decorated function with the passed arguments.
|
|
56
56
|
:raise: BdkConfigError if the app is not configured.
|
|
57
57
|
"""
|
|
58
|
+
|
|
58
59
|
@functools.wraps(func)
|
|
59
60
|
def check_if_app_configured_and_call_function(*args, **kwds):
|
|
60
61
|
symphony_bdk = args[0]
|
|
@@ -66,8 +67,7 @@ def app_service(func):
|
|
|
66
67
|
|
|
67
68
|
|
|
68
69
|
class SymphonyBdk:
|
|
69
|
-
"""BDK entry point
|
|
70
|
-
"""
|
|
70
|
+
"""BDK entry point"""
|
|
71
71
|
|
|
72
72
|
async def __aenter__(self):
|
|
73
73
|
return self
|
|
@@ -80,7 +80,9 @@ class SymphonyBdk:
|
|
|
80
80
|
self._api_client_factory = ApiClientFactory(config)
|
|
81
81
|
self._pod_client = self._api_client_factory.get_pod_client()
|
|
82
82
|
self._agent_client = self._api_client_factory.get_agent_client()
|
|
83
|
-
self._authenticator_factory = AuthenticatorFactory(
|
|
83
|
+
self._authenticator_factory = AuthenticatorFactory(
|
|
84
|
+
config, api_client_factory=self._api_client_factory
|
|
85
|
+
)
|
|
84
86
|
|
|
85
87
|
self._bot_session = None
|
|
86
88
|
self._ext_app_authenticator = None
|
|
@@ -101,12 +103,17 @@ class SymphonyBdk:
|
|
|
101
103
|
if self._config.bot.is_authentication_configured():
|
|
102
104
|
self._initialize_bot_services()
|
|
103
105
|
else:
|
|
104
|
-
logging.info(
|
|
105
|
-
|
|
106
|
+
logging.info(
|
|
107
|
+
"Bot (service account) credentials have not been configured."
|
|
108
|
+
"You can however use services in OBO mode if app authentication is configured."
|
|
109
|
+
)
|
|
106
110
|
|
|
107
111
|
def _initialize_bot_services(self):
|
|
108
|
-
|
|
109
|
-
self.
|
|
112
|
+
bot_authenticator = self._authenticator_factory.get_bot_authenticator()
|
|
113
|
+
self._bot_session = AuthSession(bot_authenticator)
|
|
114
|
+
self._service_factory = ServiceFactory(
|
|
115
|
+
self._api_client_factory, self._bot_session, self._config
|
|
116
|
+
)
|
|
110
117
|
self._user_service = self._service_factory.get_user_service()
|
|
111
118
|
self._message_service = self._service_factory.get_message_service()
|
|
112
119
|
self._connection_service = self._service_factory.get_connection_service()
|
|
@@ -122,7 +129,10 @@ class SymphonyBdk:
|
|
|
122
129
|
self._activity_registry = ActivityRegistry(self._session_service)
|
|
123
130
|
self._datafeed_loop.subscribe(self._activity_registry)
|
|
124
131
|
# initialises extension service and register decorated extensions
|
|
125
|
-
self._extension_service = ExtensionService(
|
|
132
|
+
self._extension_service = ExtensionService(
|
|
133
|
+
self._api_client_factory, self._bot_session, self._config
|
|
134
|
+
)
|
|
135
|
+
bot_authenticator.agent_version_service = self._service_factory.get_agent_version_service()
|
|
126
136
|
|
|
127
137
|
@bot_service
|
|
128
138
|
def bot_session(self) -> AuthSession:
|
|
@@ -140,7 +150,9 @@ class SymphonyBdk:
|
|
|
140
150
|
:return: a new instance of :class:`symphony.bdk.core.auth.ext_app_authenticator.ExtensionAppAuthenticator`
|
|
141
151
|
"""
|
|
142
152
|
if self._ext_app_authenticator is None:
|
|
143
|
-
self._ext_app_authenticator =
|
|
153
|
+
self._ext_app_authenticator = (
|
|
154
|
+
self._authenticator_factory.get_extension_app_authenticator()
|
|
155
|
+
)
|
|
144
156
|
return self._ext_app_authenticator
|
|
145
157
|
|
|
146
158
|
@app_service
|
|
@@ -150,11 +162,16 @@ class SymphonyBdk:
|
|
|
150
162
|
:return: The obo authentication session
|
|
151
163
|
"""
|
|
152
164
|
if user_id is not None:
|
|
153
|
-
return self._authenticator_factory.get_obo_authenticator().authenticate_by_user_id(
|
|
165
|
+
return self._authenticator_factory.get_obo_authenticator().authenticate_by_user_id(
|
|
166
|
+
user_id
|
|
167
|
+
)
|
|
154
168
|
if username is not None:
|
|
155
|
-
return self._authenticator_factory.get_obo_authenticator().authenticate_by_username(
|
|
156
|
-
|
|
157
|
-
|
|
169
|
+
return self._authenticator_factory.get_obo_authenticator().authenticate_by_username(
|
|
170
|
+
username
|
|
171
|
+
)
|
|
172
|
+
raise AuthInitializationError(
|
|
173
|
+
"At least user_id or username should be given to OBO authenticate the extension app"
|
|
174
|
+
)
|
|
158
175
|
|
|
159
176
|
@app_service
|
|
160
177
|
def obo_services(self, obo_session: OboAuthSession) -> OboServices:
|
|
@@ -270,6 +287,5 @@ class SymphonyBdk:
|
|
|
270
287
|
return self._extension_service
|
|
271
288
|
|
|
272
289
|
async def close_clients(self):
|
|
273
|
-
"""Close all the existing api clients created by the api client factory.
|
|
274
|
-
"""
|
|
290
|
+
"""Close all the existing api clients created by the api client factory."""
|
|
275
291
|
await self._api_client_factory.close_clients()
|
symphony/bdk/ext/group.py
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
from typing import AsyncGenerator
|
|
2
2
|
|
|
3
|
-
from symphony.bdk.core.extension import
|
|
4
|
-
|
|
3
|
+
from symphony.bdk.core.extension import (
|
|
4
|
+
BdkApiClientFactoryAware,
|
|
5
|
+
BdkAuthenticationAware,
|
|
6
|
+
BdkConfigAware,
|
|
7
|
+
BdkExtensionServiceProvider,
|
|
8
|
+
)
|
|
5
9
|
from symphony.bdk.core.retry import retry
|
|
6
10
|
from symphony.bdk.core.retry.strategy import is_network_or_minor_error, is_unauthorized
|
|
7
|
-
from symphony.bdk.core.service.pagination import
|
|
11
|
+
from symphony.bdk.core.service.pagination import cursor_based_pagination
|
|
8
12
|
from symphony.bdk.core.service.user.user_util import extract_tenant_id
|
|
9
13
|
from symphony.bdk.gen.group_api.group_api import GroupApi
|
|
10
14
|
from symphony.bdk.gen.group_model.add_member import AddMember
|
|
@@ -34,10 +38,10 @@ async def refresh_bearer_token_if_unauthorized(retry_state):
|
|
|
34
38
|
return False
|
|
35
39
|
|
|
36
40
|
|
|
37
|
-
class SymphonyGroupBdkExtension(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"""
|
|
41
|
+
class SymphonyGroupBdkExtension(
|
|
42
|
+
BdkAuthenticationAware, BdkApiClientFactoryAware, BdkConfigAware, BdkExtensionServiceProvider
|
|
43
|
+
):
|
|
44
|
+
"""Extension for Symphony Groups APIs"""
|
|
41
45
|
|
|
42
46
|
def __init__(self):
|
|
43
47
|
self._api_client_factory = None
|
|
@@ -58,15 +62,15 @@ class SymphonyGroupBdkExtension(BdkAuthenticationAware, BdkApiClientFactoryAware
|
|
|
58
62
|
|
|
59
63
|
|
|
60
64
|
class SymphonyGroupService:
|
|
61
|
-
"""Service class for managing Symphony Groups
|
|
62
|
-
"""
|
|
65
|
+
"""Service class for managing Symphony Groups"""
|
|
63
66
|
|
|
64
67
|
def __init__(self, api_client_factory, auth_session, retry_config):
|
|
65
68
|
self._api_client_factory = api_client_factory
|
|
66
69
|
self._auth_session = auth_session
|
|
67
70
|
self._retry_config = retry_config
|
|
68
|
-
self._oauth_session = OAuthSession(
|
|
69
|
-
|
|
71
|
+
self._oauth_session = OAuthSession(
|
|
72
|
+
self._api_client_factory.get_login_client(), self._auth_session, self._retry_config
|
|
73
|
+
)
|
|
70
74
|
client = self._api_client_factory.get_client("/profile-manager")
|
|
71
75
|
client.configuration.auth_settings = self._oauth_session.get_auth_settings
|
|
72
76
|
|
|
@@ -85,8 +89,14 @@ class SymphonyGroupService:
|
|
|
85
89
|
return await self._group_api.insert_group(x_symphony_host="", create_group=create_group)
|
|
86
90
|
|
|
87
91
|
@retry(retry=refresh_bearer_token_if_unauthorized)
|
|
88
|
-
async def list_groups(
|
|
89
|
-
|
|
92
|
+
async def list_groups(
|
|
93
|
+
self,
|
|
94
|
+
status: Status = None,
|
|
95
|
+
before: str = None,
|
|
96
|
+
after: str = None,
|
|
97
|
+
limit: int = None,
|
|
98
|
+
sort_order: SortOrder = None,
|
|
99
|
+
) -> GroupList:
|
|
90
100
|
"""List groups of type SDL
|
|
91
101
|
See: `List all groups of specified type <https://developers.symphony.com/restapi/reference/listgroups>`_
|
|
92
102
|
|
|
@@ -112,10 +122,7 @@ class SymphonyGroupService:
|
|
|
112
122
|
return await self._group_api.list_groups(**kwargs)
|
|
113
123
|
|
|
114
124
|
async def list_all_groups(
|
|
115
|
-
|
|
116
|
-
status: Status = None,
|
|
117
|
-
chunk_size: int = 100,
|
|
118
|
-
max_number: int = None
|
|
125
|
+
self, status: Status = None, chunk_size: int = 100, max_number: int = None
|
|
119
126
|
) -> AsyncGenerator[ReadGroup, None]:
|
|
120
127
|
"""Returns an asynchronous generator of groups of type SDL
|
|
121
128
|
See: `List all groups of specified type <https://developers.symphony.com/restapi/reference/listgroups>`_
|
|
@@ -128,15 +135,15 @@ class SymphonyGroupService:
|
|
|
128
135
|
"""
|
|
129
136
|
|
|
130
137
|
async def groups_one_page(limit, after=None):
|
|
131
|
-
result = await self.list_groups(status=status,
|
|
132
|
-
|
|
133
|
-
after=after)
|
|
134
|
-
return result.data, getattr(result.pagination.cursors, 'after', None)
|
|
138
|
+
result = await self.list_groups(status=status, limit=limit, after=after)
|
|
139
|
+
return result.data, getattr(result.pagination.cursors, "after", None)
|
|
135
140
|
|
|
136
141
|
return cursor_based_pagination(groups_one_page, chunk_size, max_number)
|
|
137
142
|
|
|
138
143
|
@retry(retry=refresh_bearer_token_if_unauthorized)
|
|
139
|
-
async def update_group(
|
|
144
|
+
async def update_group(
|
|
145
|
+
self, if_match: str, group_id: str, update_group: UpdateGroup
|
|
146
|
+
) -> ReadGroup:
|
|
140
147
|
"""Update an existing group
|
|
141
148
|
See: `Update a group <https://developers.symphony.com/restapi/reference/updategroup>`_
|
|
142
149
|
|
|
@@ -145,8 +152,9 @@ class SymphonyGroupService:
|
|
|
145
152
|
:param update_group: the group fields to be updated
|
|
146
153
|
:return: the updated group
|
|
147
154
|
"""
|
|
148
|
-
return await self._group_api.update_group(
|
|
149
|
-
|
|
155
|
+
return await self._group_api.update_group(
|
|
156
|
+
x_symphony_host="", if_match=if_match, group_id=group_id, update_group=update_group
|
|
157
|
+
)
|
|
150
158
|
|
|
151
159
|
@retry(retry=refresh_bearer_token_if_unauthorized)
|
|
152
160
|
async def update_avatar(self, group_id: str, image: str) -> ReadGroup:
|
|
@@ -159,7 +167,9 @@ class SymphonyGroupService:
|
|
|
159
167
|
:return: the updated group
|
|
160
168
|
"""
|
|
161
169
|
upload_avatar = UploadAvatar(image=image)
|
|
162
|
-
return await self._group_api.update_avatar(
|
|
170
|
+
return await self._group_api.update_avatar(
|
|
171
|
+
x_symphony_host="", group_id=group_id, upload_avatar=upload_avatar
|
|
172
|
+
)
|
|
163
173
|
|
|
164
174
|
@retry(retry=refresh_bearer_token_if_unauthorized)
|
|
165
175
|
async def get_group(self, group_id: str) -> ReadGroup:
|
|
@@ -181,13 +191,13 @@ class SymphonyGroupService:
|
|
|
181
191
|
:return: the updated group
|
|
182
192
|
"""
|
|
183
193
|
member = Member(member_id=user_id, member_tenant=extract_tenant_id(user_id))
|
|
184
|
-
return await self._group_api.add_member_to_group(
|
|
185
|
-
|
|
194
|
+
return await self._group_api.add_member_to_group(
|
|
195
|
+
x_symphony_host="", group_id=group_id, add_member=AddMember(member=member)
|
|
196
|
+
)
|
|
186
197
|
|
|
187
198
|
|
|
188
199
|
class OAuthSession:
|
|
189
|
-
"""Used to handle the bearer token needed to call Groups endpoints.
|
|
190
|
-
"""
|
|
200
|
+
"""Used to handle the bearer token needed to call Groups endpoints."""
|
|
191
201
|
|
|
192
202
|
def __init__(self, login_client, session, retry_config):
|
|
193
203
|
self._authentication_api = AuthenticationApi(login_client)
|
|
@@ -197,10 +207,10 @@ class OAuthSession:
|
|
|
197
207
|
|
|
198
208
|
@retry
|
|
199
209
|
async def refresh(self):
|
|
200
|
-
"""Refreshes internal Bearer authentication token from the bot sessionToken.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
210
|
+
"""Refreshes internal Bearer authentication token from the bot sessionToken."""
|
|
211
|
+
jwt_token = await self._authentication_api.idm_tokens_post(
|
|
212
|
+
await self._auth_session.session_token, scope="profile-manager"
|
|
213
|
+
)
|
|
204
214
|
self._bearer_token = jwt_token.access_token
|
|
205
215
|
|
|
206
216
|
async def get_auth_settings(self):
|
|
@@ -208,12 +218,17 @@ class OAuthSession:
|
|
|
208
218
|
|
|
209
219
|
:return: the map of auth_settings containing the header value with the current bearer token
|
|
210
220
|
"""
|
|
211
|
-
return {
|
|
212
|
-
|
|
221
|
+
return {
|
|
222
|
+
"bearerAuth": {
|
|
223
|
+
"in": "header",
|
|
224
|
+
"type": "bearer",
|
|
225
|
+
"key": "Authorization",
|
|
226
|
+
"value": "Bearer " + await self._get_bearer_token(),
|
|
227
|
+
}
|
|
228
|
+
}
|
|
213
229
|
|
|
214
230
|
async def _get_bearer_token(self):
|
|
215
|
-
"""Returns the bearer token
|
|
216
|
-
"""
|
|
231
|
+
"""Returns the bearer token"""
|
|
217
232
|
if self._bearer_token is None:
|
|
218
233
|
await self.refresh()
|
|
219
234
|
return self._bearer_token
|