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.
Files changed (435) hide show
  1. symphony/bdk/core/__init__.py +1 -0
  2. symphony/bdk/core/activity/__init__.py +1 -2
  3. symphony/bdk/core/activity/api.py +4 -4
  4. symphony/bdk/core/activity/command.py +17 -9
  5. symphony/bdk/core/activity/exception.py +2 -4
  6. symphony/bdk/core/activity/help_command.py +3 -2
  7. symphony/bdk/core/activity/parsing/arguments.py +1 -1
  8. symphony/bdk/core/activity/parsing/command_token.py +5 -4
  9. symphony/bdk/core/activity/parsing/input_tokenizer.py +13 -5
  10. symphony/bdk/core/activity/parsing/match_result.py +5 -3
  11. symphony/bdk/core/activity/parsing/message_entities.py +7 -6
  12. symphony/bdk/core/activity/parsing/slash_command_pattern.py +22 -7
  13. symphony/bdk/core/activity/registry.py +17 -7
  14. symphony/bdk/core/auth/__init__.py +1 -2
  15. symphony/bdk/core/auth/auth_session.py +33 -14
  16. symphony/bdk/core/auth/authenticator_factory.py +41 -21
  17. symphony/bdk/core/auth/bot_authenticator.py +33 -21
  18. symphony/bdk/core/auth/exception.py +3 -6
  19. symphony/bdk/core/auth/ext_app_authenticator.py +40 -30
  20. symphony/bdk/core/auth/jwt_helper.py +36 -15
  21. symphony/bdk/core/auth/obo_authenticator.py +27 -18
  22. symphony/bdk/core/auth/tokens_repository.py +5 -6
  23. symphony/bdk/core/client/__init__.py +2 -2
  24. symphony/bdk/core/client/api_client_factory.py +40 -22
  25. symphony/bdk/core/client/trace_id.py +3 -4
  26. symphony/bdk/core/config/__init__.py +1 -2
  27. symphony/bdk/core/config/exception.py +2 -4
  28. symphony/bdk/core/config/loader.py +2 -2
  29. symphony/bdk/core/config/model/bdk_app_config.py +5 -3
  30. symphony/bdk/core/config/model/bdk_authentication_config.py +13 -7
  31. symphony/bdk/core/config/model/bdk_bot_config.py +6 -3
  32. symphony/bdk/core/config/model/bdk_client_config.py +1 -1
  33. symphony/bdk/core/config/model/bdk_config.py +12 -7
  34. symphony/bdk/core/config/model/bdk_datafeed_config.py +7 -6
  35. symphony/bdk/core/config/model/bdk_datahose_config.py +1 -2
  36. symphony/bdk/core/config/model/bdk_retry_config.py +7 -3
  37. symphony/bdk/core/config/model/bdk_rsa_key_config.py +4 -5
  38. symphony/bdk/core/config/model/bdk_server_config.py +7 -2
  39. symphony/bdk/core/extension.py +15 -13
  40. symphony/bdk/core/retry/__init__.py +13 -9
  41. symphony/bdk/core/retry/_asyncio.py +10 -7
  42. symphony/bdk/core/retry/strategy.py +5 -2
  43. symphony/bdk/core/service/__init__.py +1 -2
  44. symphony/bdk/core/service/application/application_service.py +51 -41
  45. symphony/bdk/core/service/connection/connection_service.py +14 -23
  46. symphony/bdk/core/service/connection/model/connection_status.py +1 -0
  47. symphony/bdk/core/service/datafeed/abstract_ackId_event_loop.py +24 -14
  48. symphony/bdk/core/service/datafeed/abstract_datafeed_loop.py +16 -7
  49. symphony/bdk/core/service/datafeed/abstract_datahose_loop.py +2 -2
  50. symphony/bdk/core/service/datafeed/datafeed_loop_v1.py +18 -10
  51. symphony/bdk/core/service/datafeed/datafeed_loop_v2.py +31 -21
  52. symphony/bdk/core/service/datafeed/datahose_loop.py +22 -11
  53. symphony/bdk/core/service/datafeed/on_disk_datafeed_id_repository.py +10 -4
  54. symphony/bdk/core/service/datafeed/real_time_event_listener.py +32 -18
  55. symphony/bdk/core/service/exception.py +3 -6
  56. symphony/bdk/core/service/health/health_service.py +5 -4
  57. symphony/bdk/core/service/message/message_parser.py +10 -8
  58. symphony/bdk/core/service/message/message_service.py +196 -161
  59. symphony/bdk/core/service/message/messageml_util.py +6 -6
  60. symphony/bdk/core/service/message/model.py +15 -5
  61. symphony/bdk/core/service/message/multi_attachments_messages_api.py +134 -219
  62. symphony/bdk/core/service/obo_services.py +5 -4
  63. symphony/bdk/core/service/pagination.py +9 -6
  64. symphony/bdk/core/service/presence/presence_service.py +40 -28
  65. symphony/bdk/core/service/session/session_service.py +7 -13
  66. symphony/bdk/core/service/signal/signal_service.py +66 -33
  67. symphony/bdk/core/service/stream/stream_service.py +186 -69
  68. symphony/bdk/core/service/stream/stream_util.py +1 -0
  69. symphony/bdk/core/service/user/model/delegate_action_enum.py +1 -0
  70. symphony/bdk/core/service/user/model/role_id.py +1 -0
  71. symphony/bdk/core/service/user/user_service.py +225 -313
  72. symphony/bdk/core/service/user/user_util.py +4 -6
  73. symphony/bdk/core/service/version/__init__.py +0 -0
  74. symphony/bdk/core/service/version/agent_version_service.py +62 -0
  75. symphony/bdk/core/service_factory.py +50 -53
  76. symphony/bdk/core/symphony_bdk.py +34 -18
  77. symphony/bdk/ext/group.py +52 -37
  78. symphony/bdk/gen/agent_api/attachments_api.py +10 -18
  79. symphony/bdk/gen/agent_api/audit_trail_api.py +8 -12
  80. symphony/bdk/gen/agent_api/datafeed_api.py +34 -219
  81. symphony/bdk/gen/agent_api/datahose_api.py +184 -0
  82. symphony/bdk/gen/agent_api/dlp_policies_and_dictionary_management_api.py +130 -214
  83. symphony/bdk/gen/agent_api/messages_api.py +99 -119
  84. symphony/bdk/gen/agent_api/share_api.py +7 -11
  85. symphony/bdk/gen/agent_api/signals_api.py +1 -1
  86. symphony/bdk/gen/agent_api/system_api.py +1 -1
  87. symphony/bdk/gen/agent_api/util_api.py +13 -21
  88. symphony/bdk/gen/agent_api/violations_api.py +45 -73
  89. symphony/bdk/gen/agent_model/ack_id.py +1 -1
  90. symphony/bdk/gen/agent_model/agent_info.py +1 -1
  91. symphony/bdk/gen/agent_model/attachment_info.py +1 -1
  92. symphony/bdk/gen/agent_model/base_message.py +1 -1
  93. symphony/bdk/gen/agent_model/base_signal.py +1 -1
  94. symphony/bdk/gen/agent_model/channel_subscriber.py +1 -1
  95. symphony/bdk/gen/agent_model/channel_subscriber_response.py +1 -1
  96. symphony/bdk/gen/agent_model/channel_subscription_error.py +1 -1
  97. symphony/bdk/gen/agent_model/channel_subscription_response.py +1 -1
  98. symphony/bdk/gen/agent_model/connection_request_message.py +1 -1
  99. symphony/bdk/gen/agent_model/connection_request_message_all_of.py +1 -1
  100. symphony/bdk/gen/agent_model/datafeed.py +1 -1
  101. symphony/bdk/gen/agent_model/error.py +1 -1
  102. symphony/bdk/gen/agent_model/import_response.py +1 -1
  103. symphony/bdk/gen/agent_model/import_response_list.py +1 -1
  104. symphony/bdk/gen/agent_model/imported_message.py +1 -1
  105. symphony/bdk/gen/agent_model/ingestion_error.py +266 -0
  106. symphony/bdk/gen/agent_model/message.py +1 -1
  107. symphony/bdk/gen/agent_model/message_all_of.py +1 -1
  108. symphony/bdk/gen/agent_model/message_import_list.py +1 -1
  109. symphony/bdk/gen/agent_model/message_list.py +1 -1
  110. symphony/bdk/gen/agent_model/message_search_query.py +1 -1
  111. symphony/bdk/gen/agent_model/message_submission.py +1 -1
  112. symphony/bdk/gen/agent_model/pagination.py +1 -1
  113. symphony/bdk/gen/agent_model/pagination_cursors.py +1 -1
  114. symphony/bdk/gen/agent_model/room_created_message.py +1 -1
  115. symphony/bdk/gen/agent_model/room_created_message_all_of.py +1 -1
  116. symphony/bdk/gen/agent_model/room_deactivated_message.py +1 -1
  117. symphony/bdk/gen/agent_model/room_deactivated_message_all_of.py +1 -1
  118. symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message.py +1 -1
  119. symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message_all_of.py +1 -1
  120. symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message.py +1 -1
  121. symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message_all_of.py +1 -1
  122. symphony/bdk/gen/agent_model/room_reactivated_message.py +1 -1
  123. symphony/bdk/gen/agent_model/room_reactivated_message_all_of.py +1 -1
  124. symphony/bdk/gen/agent_model/room_tag.py +1 -1
  125. symphony/bdk/gen/agent_model/room_updated_message.py +1 -1
  126. symphony/bdk/gen/agent_model/room_updated_message_all_of.py +1 -1
  127. symphony/bdk/gen/agent_model/share_article.py +1 -1
  128. symphony/bdk/gen/agent_model/share_content.py +1 -1
  129. symphony/bdk/gen/agent_model/signal.py +1 -1
  130. symphony/bdk/gen/agent_model/signal_all_of.py +1 -6
  131. symphony/bdk/gen/agent_model/signal_list.py +1 -1
  132. symphony/bdk/gen/agent_model/simple_message.py +1 -1
  133. symphony/bdk/gen/agent_model/success_response.py +1 -1
  134. symphony/bdk/gen/agent_model/user_joined_room_message.py +1 -1
  135. symphony/bdk/gen/agent_model/user_joined_room_message_all_of.py +1 -1
  136. symphony/bdk/gen/agent_model/user_left_room_message.py +1 -1
  137. symphony/bdk/gen/agent_model/user_left_room_message_all_of.py +1 -1
  138. symphony/bdk/gen/agent_model/v1_audit_trail_initiator_list.py +1 -1
  139. symphony/bdk/gen/agent_model/v1_audit_trail_initiator_response.py +1 -1
  140. symphony/bdk/gen/agent_model/v1_dlp_content_type.py +1 -1
  141. symphony/bdk/gen/agent_model/v1_dlp_dictionary.py +1 -1
  142. symphony/bdk/gen/agent_model/v1_dlp_dictionary_content.py +1 -1
  143. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata.py +1 -1
  144. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_collection_response.py +1 -1
  145. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_create_request.py +1 -1
  146. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_response.py +1 -1
  147. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_update_request.py +1 -1
  148. symphony/bdk/gen/agent_model/v1_dlp_dictionary_ref.py +1 -1
  149. symphony/bdk/gen/agent_model/v1_dlp_matched_policy.py +1 -1
  150. symphony/bdk/gen/agent_model/v1_dlp_matched_policy_list.py +1 -1
  151. symphony/bdk/gen/agent_model/v1_dlp_outcome.py +1 -1
  152. symphony/bdk/gen/agent_model/v1_dlp_policies_collection_response.py +1 -1
  153. symphony/bdk/gen/agent_model/v1_dlp_policy.py +1 -1
  154. symphony/bdk/gen/agent_model/v1_dlp_policy_request.py +9 -8
  155. symphony/bdk/gen/agent_model/v1_dlp_policy_response.py +1 -1
  156. symphony/bdk/gen/agent_model/v1_dlp_signal.py +6 -1
  157. symphony/bdk/gen/agent_model/v1_dlp_stream.py +1 -1
  158. symphony/bdk/gen/agent_model/v1_dlp_violation.py +1 -1
  159. symphony/bdk/gen/agent_model/v1_dlp_violation_message.py +1 -1
  160. symphony/bdk/gen/agent_model/v1_dlp_violation_message_response.py +1 -1
  161. symphony/bdk/gen/agent_model/v1_dlp_violation_signal.py +1 -1
  162. symphony/bdk/gen/agent_model/v1_dlp_violation_signal_response.py +1 -1
  163. symphony/bdk/gen/agent_model/v1_dlp_violation_stream.py +1 -1
  164. symphony/bdk/gen/agent_model/v1_dlp_violation_stream_response.py +1 -1
  165. symphony/bdk/gen/agent_model/v1_health_check_response.py +1 -1
  166. symphony/bdk/gen/agent_model/v2_base_message.py +1 -1
  167. symphony/bdk/gen/agent_model/v2_error.py +1 -1
  168. symphony/bdk/gen/agent_model/v2_health_check_response.py +1 -1
  169. symphony/bdk/gen/agent_model/v2_import_response.py +1 -1
  170. symphony/bdk/gen/agent_model/v2_import_response_list.py +1 -1
  171. symphony/bdk/gen/agent_model/v2_imported_message.py +1 -1
  172. symphony/bdk/gen/agent_model/v2_message.py +1 -1
  173. symphony/bdk/gen/agent_model/v2_message_all_of.py +1 -1
  174. symphony/bdk/gen/agent_model/v2_message_import_list.py +1 -1
  175. symphony/bdk/gen/agent_model/v2_message_list.py +1 -1
  176. symphony/bdk/gen/agent_model/v2_message_submission.py +1 -1
  177. symphony/bdk/gen/agent_model/v3_dlp_dictionary_meta.py +1 -1
  178. symphony/bdk/gen/agent_model/v3_dlp_file_classifier_config.py +1 -1
  179. symphony/bdk/gen/agent_model/v3_dlp_file_extension_config.py +1 -1
  180. symphony/bdk/gen/agent_model/v3_dlp_file_password_config.py +1 -1
  181. symphony/bdk/gen/agent_model/v3_dlp_file_size_config.py +1 -1
  182. symphony/bdk/gen/agent_model/v3_dlp_policies_collection_response.py +1 -1
  183. symphony/bdk/gen/agent_model/v3_dlp_policy.py +1 -1
  184. symphony/bdk/gen/agent_model/v3_dlp_policy_applies_to.py +1 -1
  185. symphony/bdk/gen/agent_model/v3_dlp_policy_request.py +1 -1
  186. symphony/bdk/gen/agent_model/v3_dlp_policy_response.py +1 -1
  187. symphony/bdk/gen/agent_model/v3_dlp_rule.py +1 -1
  188. symphony/bdk/gen/agent_model/v3_dlp_text_match_config.py +1 -1
  189. symphony/bdk/gen/agent_model/v3_dlp_violation.py +1 -1
  190. symphony/bdk/gen/agent_model/v3_dlp_violation_message.py +1 -1
  191. symphony/bdk/gen/agent_model/v3_dlp_violation_message_response.py +1 -1
  192. symphony/bdk/gen/agent_model/v3_dlp_violation_signal.py +1 -1
  193. symphony/bdk/gen/agent_model/v3_dlp_violation_signal_response.py +1 -1
  194. symphony/bdk/gen/agent_model/v3_dlp_violation_stream.py +1 -1
  195. symphony/bdk/gen/agent_model/v3_dlp_violation_stream_response.py +1 -1
  196. symphony/bdk/gen/agent_model/v3_health.py +1 -1
  197. symphony/bdk/gen/agent_model/v3_health_auth_type.py +1 -1
  198. symphony/bdk/gen/agent_model/v3_health_component.py +1 -1
  199. symphony/bdk/gen/agent_model/v3_health_status.py +1 -1
  200. symphony/bdk/gen/agent_model/v4_attachment_info.py +1 -1
  201. symphony/bdk/gen/agent_model/v4_connection_accepted.py +1 -1
  202. symphony/bdk/gen/agent_model/v4_connection_requested.py +1 -1
  203. symphony/bdk/gen/agent_model/v4_event.py +3 -3
  204. symphony/bdk/gen/agent_model/v4_event_list.py +1 -1
  205. symphony/bdk/gen/agent_model/v4_generic_system_event.py +279 -0
  206. symphony/bdk/gen/agent_model/v4_import_response.py +1 -1
  207. symphony/bdk/gen/agent_model/v4_import_response_list.py +1 -1
  208. symphony/bdk/gen/agent_model/v4_imported_message.py +1 -1
  209. symphony/bdk/gen/agent_model/v4_imported_message_attachment.py +1 -1
  210. symphony/bdk/gen/agent_model/v4_initiator.py +1 -1
  211. symphony/bdk/gen/agent_model/v4_instant_message_created.py +1 -1
  212. symphony/bdk/gen/agent_model/v4_key_value_pair.py +1 -1
  213. symphony/bdk/gen/agent_model/v4_message.py +1 -1
  214. symphony/bdk/gen/agent_model/v4_message_blast_response.py +1 -1
  215. symphony/bdk/gen/agent_model/v4_message_import_list.py +1 -1
  216. symphony/bdk/gen/agent_model/v4_message_list.py +1 -1
  217. symphony/bdk/gen/agent_model/v4_message_sent.py +1 -1
  218. symphony/bdk/gen/agent_model/v4_message_suppressed.py +1 -1
  219. symphony/bdk/gen/agent_model/v4_payload.py +8 -1
  220. symphony/bdk/gen/agent_model/v4_room_created.py +1 -1
  221. symphony/bdk/gen/agent_model/v4_room_deactivated.py +1 -1
  222. symphony/bdk/gen/agent_model/v4_room_member_demoted_from_owner.py +1 -1
  223. symphony/bdk/gen/agent_model/v4_room_member_promoted_to_owner.py +1 -1
  224. symphony/bdk/gen/agent_model/v4_room_properties.py +1 -1
  225. symphony/bdk/gen/agent_model/v4_room_reactivated.py +1 -1
  226. symphony/bdk/gen/agent_model/v4_room_updated.py +1 -1
  227. symphony/bdk/gen/agent_model/v4_shared_post.py +1 -1
  228. symphony/bdk/gen/agent_model/v4_stream.py +6 -1
  229. symphony/bdk/gen/agent_model/v4_symphony_elements_action.py +1 -1
  230. symphony/bdk/gen/agent_model/v4_thumbnail_info.py +1 -1
  231. symphony/bdk/gen/agent_model/v4_user.py +1 -1
  232. symphony/bdk/gen/agent_model/v4_user_joined_room.py +1 -1
  233. symphony/bdk/gen/agent_model/v4_user_left_room.py +1 -1
  234. symphony/bdk/gen/agent_model/v4_user_requested_to_join_room.py +1 -1
  235. symphony/bdk/gen/agent_model/v5_datafeed.py +3 -3
  236. symphony/bdk/gen/agent_model/v5_datafeed_create_body.py +1 -1
  237. symphony/bdk/gen/agent_model/v5_event_list.py +1 -1
  238. symphony/bdk/gen/agent_model/v5_events_read_body.py +5 -5
  239. symphony/bdk/gen/pod_api/app_entitlement_api.py +1 -1
  240. symphony/bdk/gen/pod_api/application_api.py +1 -1
  241. symphony/bdk/gen/pod_api/connection_api.py +1 -1
  242. symphony/bdk/gen/pod_api/default_api.py +1 -1
  243. symphony/bdk/gen/pod_api/disclaimer_api.py +1 -1
  244. symphony/bdk/gen/pod_api/info_barriers_api.py +1 -1
  245. symphony/bdk/gen/pod_api/message_api.py +1 -1
  246. symphony/bdk/gen/pod_api/message_suppression_api.py +1 -1
  247. symphony/bdk/gen/pod_api/pod_api.py +1 -1
  248. symphony/bdk/gen/pod_api/presence_api.py +1 -1
  249. symphony/bdk/gen/pod_api/room_membership_api.py +1 -1
  250. symphony/bdk/gen/pod_api/security_api.py +1 -1
  251. symphony/bdk/gen/pod_api/session_api.py +1 -1
  252. symphony/bdk/gen/pod_api/streams_api.py +162 -1
  253. symphony/bdk/gen/pod_api/system_api.py +1 -1
  254. symphony/bdk/gen/pod_api/user_api.py +264 -2
  255. symphony/bdk/gen/pod_api/users_api.py +421 -1
  256. symphony/bdk/gen/pod_model/admin_justified_action.py +1 -1
  257. symphony/bdk/gen/pod_model/admin_justified_user_action.py +1 -1
  258. symphony/bdk/gen/pod_model/app_authentication_key.py +1 -1
  259. symphony/bdk/gen/pod_model/app_authentication_keys.py +1 -1
  260. symphony/bdk/gen/pod_model/app_notification.py +1 -1
  261. symphony/bdk/gen/pod_model/app_properties.py +1 -1
  262. symphony/bdk/gen/pod_model/app_property.py +1 -1
  263. symphony/bdk/gen/pod_model/application_detail.py +1 -1
  264. symphony/bdk/gen/pod_model/application_info.py +1 -1
  265. symphony/bdk/gen/pod_model/assignee_candidate.py +1 -1
  266. symphony/bdk/gen/pod_model/assignee_candidates.py +1 -1
  267. symphony/bdk/gen/pod_model/attachment_preview.py +1 -1
  268. symphony/bdk/gen/pod_model/avatar.py +1 -1
  269. symphony/bdk/gen/pod_model/avatar_list.py +1 -1
  270. symphony/bdk/gen/pod_model/avatar_update.py +1 -1
  271. symphony/bdk/gen/pod_model/bulk_action_result.py +1 -1
  272. symphony/bdk/gen/pod_model/cert_info.py +1 -1
  273. symphony/bdk/gen/pod_model/cert_info_item.py +1 -1
  274. symphony/bdk/gen/pod_model/company_cert.py +1 -1
  275. symphony/bdk/gen/pod_model/company_cert_attributes.py +1 -1
  276. symphony/bdk/gen/pod_model/company_cert_detail.py +1 -1
  277. symphony/bdk/gen/pod_model/company_cert_info.py +1 -1
  278. symphony/bdk/gen/pod_model/company_cert_info_list.py +1 -1
  279. symphony/bdk/gen/pod_model/company_cert_status.py +1 -1
  280. symphony/bdk/gen/pod_model/company_cert_type.py +1 -1
  281. symphony/bdk/gen/pod_model/company_cert_type_list.py +1 -1
  282. symphony/bdk/gen/pod_model/conversation_specific_stream_attributes.py +1 -1
  283. symphony/bdk/gen/pod_model/delegate_action.py +1 -1
  284. symphony/bdk/gen/pod_model/disclaimer.py +1 -1
  285. symphony/bdk/gen/pod_model/disclaimer_list.py +1 -1
  286. symphony/bdk/gen/pod_model/download_receipt_count.py +1 -1
  287. symphony/bdk/gen/pod_model/error.py +1 -1
  288. symphony/bdk/gen/pod_model/faceted_match_count.py +1 -1
  289. symphony/bdk/gen/pod_model/feature.py +1 -1
  290. symphony/bdk/gen/pod_model/feature_list.py +1 -1
  291. symphony/bdk/gen/pod_model/file_extension.py +6 -1
  292. symphony/bdk/gen/pod_model/file_extensions_response.py +1 -1
  293. symphony/bdk/gen/pod_model/followers_list.py +1 -1
  294. symphony/bdk/gen/pod_model/followers_list_response.py +1 -1
  295. symphony/bdk/gen/pod_model/following_list_response.py +1 -1
  296. symphony/bdk/gen/pod_model/group.py +1 -1
  297. symphony/bdk/gen/pod_model/group_item.py +1 -1
  298. symphony/bdk/gen/pod_model/group_list.py +1 -1
  299. symphony/bdk/gen/pod_model/group_role_scope.py +1 -1
  300. symphony/bdk/gen/pod_model/im_system_info.py +1 -1
  301. symphony/bdk/gen/pod_model/immutable_room_attributes.py +1 -1
  302. symphony/bdk/gen/pod_model/integer_list.py +1 -1
  303. symphony/bdk/gen/pod_model/languages.py +1 -1
  304. symphony/bdk/gen/pod_model/member_info.py +1 -1
  305. symphony/bdk/gen/pod_model/membership_data.py +1 -1
  306. symphony/bdk/gen/pod_model/membership_list.py +1 -1
  307. symphony/bdk/gen/pod_model/message_detail.py +1 -1
  308. symphony/bdk/gen/pod_model/message_details.py +1 -1
  309. symphony/bdk/gen/pod_model/message_download_receipt_count.py +1 -1
  310. symphony/bdk/gen/pod_model/message_ids.py +1 -1
  311. symphony/bdk/gen/pod_model/message_metadata_response.py +1 -1
  312. symphony/bdk/gen/pod_model/message_metadata_response_parent.py +1 -1
  313. symphony/bdk/gen/pod_model/message_receipt_detail.py +1 -1
  314. symphony/bdk/gen/pod_model/message_receipt_detail_response.py +1 -1
  315. symphony/bdk/gen/pod_model/message_status.py +1 -1
  316. symphony/bdk/gen/pod_model/message_status_user.py +1 -1
  317. symphony/bdk/gen/pod_model/message_stream.py +1 -1
  318. symphony/bdk/gen/pod_model/message_suppression_response.py +1 -1
  319. symphony/bdk/gen/pod_model/message_user.py +1 -1
  320. symphony/bdk/gen/pod_model/name_value_pair.py +1 -1
  321. symphony/bdk/gen/pod_model/pagination.py +1 -1
  322. symphony/bdk/gen/pod_model/pagination_cursors.py +1 -1
  323. symphony/bdk/gen/pod_model/password.py +1 -1
  324. symphony/bdk/gen/pod_model/password_reset.py +1 -1
  325. symphony/bdk/gen/pod_model/pod_app_entitlement.py +1 -1
  326. symphony/bdk/gen/pod_model/pod_app_entitlement_list.py +1 -1
  327. symphony/bdk/gen/pod_model/pod_certificate.py +1 -1
  328. symphony/bdk/gen/pod_model/policy.py +1 -1
  329. symphony/bdk/gen/pod_model/policy_list.py +1 -1
  330. symphony/bdk/gen/pod_model/product.py +1 -1
  331. symphony/bdk/gen/pod_model/product_list.py +1 -1
  332. symphony/bdk/gen/pod_model/protocol.py +1 -1
  333. symphony/bdk/gen/pod_model/role.py +1 -1
  334. symphony/bdk/gen/pod_model/role_detail.py +1 -1
  335. symphony/bdk/gen/pod_model/role_detail_list.py +1 -1
  336. symphony/bdk/gen/pod_model/role_list.py +1 -1
  337. symphony/bdk/gen/pod_model/room_attributes.py +1 -1
  338. symphony/bdk/gen/pod_model/room_detail.py +1 -1
  339. symphony/bdk/gen/pod_model/room_search_criteria.py +1 -1
  340. symphony/bdk/gen/pod_model/room_specific_stream_attributes.py +1 -1
  341. symphony/bdk/gen/pod_model/room_system_info.py +1 -1
  342. symphony/bdk/gen/pod_model/room_tag.py +1 -1
  343. symphony/bdk/gen/pod_model/service_account_manifest.py +264 -0
  344. symphony/bdk/gen/pod_model/stream.py +1 -1
  345. symphony/bdk/gen/pod_model/stream_attachment_item.py +1 -1
  346. symphony/bdk/gen/pod_model/stream_attachment_response.py +1 -1
  347. symphony/bdk/gen/pod_model/stream_attributes.py +1 -1
  348. symphony/bdk/gen/pod_model/stream_filter.py +1 -1
  349. symphony/bdk/gen/pod_model/stream_list.py +1 -1
  350. symphony/bdk/gen/pod_model/stream_type.py +1 -1
  351. symphony/bdk/gen/pod_model/string_id.py +1 -1
  352. symphony/bdk/gen/pod_model/string_list.py +1 -1
  353. symphony/bdk/gen/pod_model/success_response.py +1 -1
  354. symphony/bdk/gen/pod_model/user_app_entitlement.py +1 -1
  355. symphony/bdk/gen/pod_model/user_app_entitlement_list.py +1 -1
  356. symphony/bdk/gen/pod_model/user_app_entitlement_patch.py +1 -1
  357. symphony/bdk/gen/pod_model/user_app_entitlement_patch_enum.py +1 -1
  358. symphony/bdk/gen/pod_model/user_app_entitlements_patch_list.py +1 -1
  359. symphony/bdk/gen/pod_model/user_attributes.py +1 -1
  360. symphony/bdk/gen/pod_model/user_compp.py +1 -1
  361. symphony/bdk/gen/pod_model/user_connection.py +1 -1
  362. symphony/bdk/gen/pod_model/user_connection_list.py +1 -1
  363. symphony/bdk/gen/pod_model/user_connection_request.py +1 -1
  364. symphony/bdk/gen/pod_model/user_data.py +1 -1
  365. symphony/bdk/gen/pod_model/user_detail.py +1 -1
  366. symphony/bdk/gen/pod_model/user_detail_list.py +1 -1
  367. symphony/bdk/gen/pod_model/user_error.py +1 -1
  368. symphony/bdk/gen/pod_model/user_filter.py +1 -1
  369. symphony/bdk/gen/pod_model/user_group_assignee.py +1 -1
  370. symphony/bdk/gen/pod_model/user_group_assignee_response.py +1 -1
  371. symphony/bdk/gen/pod_model/user_group_assignee_update.py +1 -1
  372. symphony/bdk/gen/pod_model/user_group_assignment_response.py +1 -1
  373. symphony/bdk/gen/pod_model/user_group_create.py +1 -1
  374. symphony/bdk/gen/pod_model/user_group_data.py +1 -1
  375. symphony/bdk/gen/pod_model/user_group_membership_data.py +1 -1
  376. symphony/bdk/gen/pod_model/user_group_membership_request.py +1 -1
  377. symphony/bdk/gen/pod_model/user_group_membership_response.py +1 -1
  378. symphony/bdk/gen/pod_model/user_group_membership_response_data.py +1 -1
  379. symphony/bdk/gen/pod_model/user_group_membership_update.py +1 -1
  380. symphony/bdk/gen/pod_model/user_group_response.py +1 -1
  381. symphony/bdk/gen/pod_model/user_group_response_list.py +1 -1
  382. symphony/bdk/gen/pod_model/user_group_update.py +1 -1
  383. symphony/bdk/gen/pod_model/user_id.py +1 -1
  384. symphony/bdk/gen/pod_model/user_id_list.py +1 -1
  385. symphony/bdk/gen/pod_model/user_info.py +1 -1
  386. symphony/bdk/gen/pod_model/user_name.py +1 -1
  387. symphony/bdk/gen/pod_model/user_name_list.py +1 -1
  388. symphony/bdk/gen/pod_model/user_search_filter.py +1 -1
  389. symphony/bdk/gen/pod_model/user_search_query.py +1 -1
  390. symphony/bdk/gen/pod_model/user_search_results.py +1 -1
  391. symphony/bdk/gen/pod_model/user_status.py +1 -1
  392. symphony/bdk/gen/pod_model/user_suspension.py +1 -1
  393. symphony/bdk/gen/pod_model/user_system_info.py +1 -1
  394. symphony/bdk/gen/pod_model/user_v2.py +1 -1
  395. symphony/bdk/gen/pod_model/v1_im_attributes.py +1 -1
  396. symphony/bdk/gen/pod_model/v1_im_detail.py +1 -1
  397. symphony/bdk/gen/pod_model/v1_session.py +301 -0
  398. symphony/bdk/gen/pod_model/v1_user_sessions.py +259 -0
  399. symphony/bdk/gen/pod_model/v2_admin_stream_attributes.py +6 -1
  400. symphony/bdk/gen/pod_model/v2_admin_stream_filter.py +1 -1
  401. symphony/bdk/gen/pod_model/v2_admin_stream_info.py +1 -1
  402. symphony/bdk/gen/pod_model/v2_admin_stream_info_list.py +1 -1
  403. symphony/bdk/gen/pod_model/v2_admin_stream_list.py +1 -1
  404. symphony/bdk/gen/pod_model/v2_admin_stream_type.py +1 -1
  405. symphony/bdk/gen/pod_model/v2_conversation_specific_stream_attributes.py +1 -1
  406. symphony/bdk/gen/pod_model/v2_member_info.py +1 -1
  407. symphony/bdk/gen/pod_model/v2_member_info_list.py +1 -1
  408. symphony/bdk/gen/pod_model/v2_member_user_detail.py +1 -1
  409. symphony/bdk/gen/pod_model/v2_membership_list.py +1 -1
  410. symphony/bdk/gen/pod_model/v2_presence.py +1 -1
  411. symphony/bdk/gen/pod_model/v2_presence_all_of.py +1 -1
  412. symphony/bdk/gen/pod_model/v2_presence_list.py +1 -1
  413. symphony/bdk/gen/pod_model/v2_presence_status.py +1 -1
  414. symphony/bdk/gen/pod_model/v2_room_search_criteria.py +1 -1
  415. symphony/bdk/gen/pod_model/v2_room_search_criteria_all_of.py +1 -1
  416. symphony/bdk/gen/pod_model/v2_room_specific_stream_attributes.py +1 -1
  417. symphony/bdk/gen/pod_model/v2_stream_attributes.py +1 -1
  418. symphony/bdk/gen/pod_model/v2_stream_type.py +1 -1
  419. symphony/bdk/gen/pod_model/v2_user_attributes.py +1 -1
  420. symphony/bdk/gen/pod_model/v2_user_create.py +1 -1
  421. symphony/bdk/gen/pod_model/v2_user_detail.py +1 -1
  422. symphony/bdk/gen/pod_model/v2_user_detail_list.py +1 -1
  423. symphony/bdk/gen/pod_model/v2_user_key_request.py +1 -1
  424. symphony/bdk/gen/pod_model/v2_user_list.py +1 -1
  425. symphony/bdk/gen/pod_model/v2_user_presence.py +1 -1
  426. symphony/bdk/gen/pod_model/v2_user_presence_all_of.py +1 -1
  427. symphony/bdk/gen/pod_model/v3_room_attributes.py +6 -1
  428. symphony/bdk/gen/pod_model/v3_room_detail.py +1 -1
  429. symphony/bdk/gen/pod_model/v3_room_search_results.py +1 -1
  430. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/METADATA +19 -5
  431. symphony_bdk_python-2.11.0.dist-info/RECORD +546 -0
  432. symphony_bdk_python-2.10.dev0.dist-info/RECORD +0 -538
  433. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/LICENSE +0 -0
  434. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/NOTICE +0 -0
  435. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/WHEEL +0 -0
@@ -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 TypeVar, Generic
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('C') # Context type
7
- E = TypeVar('E') # Event type
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
- """ This callback can be used to prepare :py:class:`ActivityContext` before actually processing the `matches`
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
- def __init__(self, initiator: V4Initiator, source_event: V4MessageSent, bot_display_name: str,
21
- bot_user_id: int = None):
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(MatchingUserIdMentionToken(lambda: self.bot_user_id))
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 self._description + " (mention required)" if self._requires_mention_bot \
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(context.stream_id,
22
- "<messageML><ul>" + help_message + "</ul></messageML>")
21
+ await self._bdk.messages().send_message(
22
+ context.stream_id, "<messageML><ul>" + help_message + "</ul></messageML>"
23
+ )
@@ -1,4 +1,4 @@
1
- from symphony.bdk.core.activity.parsing.message_entities import Mention, Hashtag, Cashtag
1
+ from symphony.bdk.core.activity.parsing.message_entities import Cashtag, Hashtag, Mention
2
2
 
3
3
 
4
4
  class Arguments:
@@ -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 isinstance(o, MatchingUserIdMentionToken) and \
155
- self._matching_user_id_supplier() == o._matching_user_id_supplier()
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, 'data') and message.data else "{}"
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]['type']
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 root.tag == "span" and "class" in root.attrib and root.attrib["class"] == "entity" \
95
- and InputTokenizer.data_entity_id in root.attrib:
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 ["org.symphonyoss.taxonomy", "org.symphonyoss.fin.security", "com.symphony.user.mention"]
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 isinstance(other, MatchResult) \
28
- and self._is_matching == other._is_matching \
29
- and self._arguments == other._arguments
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 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
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 StaticCommandToken, StringArgumentCommandToken, \
4
- HashArgumentCommandToken, CashArgumentCommandToken, MentionArgumentCommandToken, ArgumentCommandToken
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 = [self.create_token(pattern) for pattern in
27
- re.split(SlashCommandPattern.whitespace_pattern, pattern) if pattern]
28
-
29
- filtered_tokens_arg_names = list(filter(lambda a: a is not None, map(self.get_arg_name, self._tokens)))
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 MatchResult(True, self.get_arguments(input_tokens)) if self.matches(input_tokens) else MatchResult(False)
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 FormReplyContext, FormReplyActivity
8
- from symphony.bdk.core.activity.user_joined_room import UserJoinedRoomContext, UserJoinedRoomActivity
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("Activity '%s' has been removed/unsubscribed in order to be replaced", act)
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("Registering slash command with command=%s, mention_bot=%s", command, mention_bot)
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(self, initiator: V4Initiator, event: V4SymphonyElementsAction):
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
- self._key_manager_token = await self._authenticator.retrieve_key_manager_token()
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("Username and user id for OBO authentication should not be defined at "
112
- "a same time.")
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("At least username or user id should be defined for "
115
- "OBO authentication.")
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(self.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(self.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 BotAuthenticator, BotAuthenticatorRsa, BotAuthenticatorCert
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 ExtensionAppAuthenticator, ExtensionAppAuthenticatorRsa, \
7
- ExtensionAppAuthenticatorCert
8
- from symphony.bdk.core.auth.obo_authenticator import OboAuthenticator, OboAuthenticatorRsa, OboAuthenticatorCert
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("RSA or certificate authentication should be configured. "
57
- "Only one field among private key path or content should be configured "
58
- "for bot RSA authentication. "
59
- "The path field should be specified for bot certificate authentication.")
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(self._api_client_factory.get_app_session_auth_client())
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("Application under 'app' field should be configured with a private key or "
77
- "a certificate in order to use OBO authentication.")
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(self._api_client_factory.get_app_session_auth_client()),
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("Application under 'app' field should be configured with a private key path or "
101
- "content in order to authenticate extension app.")
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
- def __init__(self, session_auth_client: ApiClient, key_manager_auth_client: ApiClient,
23
- retry_config: BdkRetryConfig):
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
- def __init__(self, bot_config: BdkBotConfig, login_api_client: ApiClient, relay_api_client: ApiClient,
68
- retry_config: BdkRetryConfig):
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__()