taegis-sdk-python 1.3.0__tar.gz → 1.4.0__tar.gz

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 (267) hide show
  1. {taegis_sdk_python-1.3.0/taegis_sdk_python.egg-info → taegis_sdk_python-1.4.0}/PKG-INFO +1 -1
  2. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/_consts.py +3 -0
  3. taegis_sdk_python-1.4.0/taegis_sdk_python/_version.py +1 -0
  4. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/authentication.py +16 -136
  5. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/__init__.py +41 -4
  6. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts/types.py +8 -1
  7. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat/queries.py +20 -0
  8. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat/types.py +3 -0
  9. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/vdr/types.py +2 -0
  10. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/utils.py +9 -13
  11. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0/taegis_sdk_python.egg-info}/PKG-INFO +1 -1
  12. taegis_sdk_python-1.3.0/taegis_sdk_python/_version.py +0 -1
  13. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/LICENSE +0 -0
  14. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/MANIFEST.in +0 -0
  15. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/README.md +0 -0
  16. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/requirements-dev.txt +0 -0
  17. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/requirements-test.txt +0 -0
  18. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/requirements.txt +0 -0
  19. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/setup.cfg +0 -0
  20. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/setup.py +0 -0
  21. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/__init__.py +0 -0
  22. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/config.py +0 -0
  23. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/errors.py +0 -0
  24. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/service_core.py +0 -0
  25. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/access_points/__init__.py +0 -0
  26. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/access_points/mutations.py +0 -0
  27. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/access_points/queries.py +0 -0
  28. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/access_points/subscriptions.py +0 -0
  29. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/access_points/types.py +0 -0
  30. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/agent/__init__.py +0 -0
  31. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/agent/mutations.py +0 -0
  32. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/agent/queries.py +0 -0
  33. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/agent/subscriptions.py +0 -0
  34. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/agent/types.py +0 -0
  35. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts/__init__.py +0 -0
  36. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts/mutations.py +0 -0
  37. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts/queries.py +0 -0
  38. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts/subscriptions.py +0 -0
  39. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts_history/__init__.py +0 -0
  40. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts_history/mutations.py +0 -0
  41. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts_history/queries.py +0 -0
  42. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts_history/subscriptions.py +0 -0
  43. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/alerts_history/types.py +0 -0
  44. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets/__init__.py +0 -0
  45. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets/mutations.py +0 -0
  46. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets/queries.py +0 -0
  47. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets/subscriptions.py +0 -0
  48. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets/types.py +0 -0
  49. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets2/__init__.py +0 -0
  50. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets2/mutations.py +0 -0
  51. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets2/queries.py +0 -0
  52. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets2/subscriptions.py +0 -0
  53. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/assets2/types.py +0 -0
  54. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/audits/__init__.py +0 -0
  55. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/audits/mutations.py +0 -0
  56. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/audits/queries.py +0 -0
  57. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/audits/subscriptions.py +0 -0
  58. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/audits/types.py +0 -0
  59. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/authz/__init__.py +0 -0
  60. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/authz/mutations.py +0 -0
  61. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/authz/queries.py +0 -0
  62. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/authz/subscriptions.py +0 -0
  63. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/authz/types.py +0 -0
  64. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/byoti/__init__.py +0 -0
  65. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/byoti/mutations.py +0 -0
  66. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/byoti/queries.py +0 -0
  67. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/byoti/subscriptions.py +0 -0
  68. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/byoti/types.py +0 -0
  69. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/clients/__init__.py +0 -0
  70. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/clients/mutations.py +0 -0
  71. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/clients/queries.py +0 -0
  72. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/clients/subscriptions.py +0 -0
  73. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/clients/types.py +0 -0
  74. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/collector/__init__.py +0 -0
  75. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/collector/mutations.py +0 -0
  76. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/collector/queries.py +0 -0
  77. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/collector/subscriptions.py +0 -0
  78. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/collector/types.py +0 -0
  79. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/comments/__init__.py +0 -0
  80. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/comments/mutations.py +0 -0
  81. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/comments/queries.py +0 -0
  82. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/comments/subscriptions.py +0 -0
  83. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/comments/types.py +0 -0
  84. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/contracted_endpoint/__init__.py +0 -0
  85. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/contracted_endpoint/mutations.py +0 -0
  86. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/contracted_endpoint/queries.py +0 -0
  87. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/contracted_endpoint/subscriptions.py +0 -0
  88. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/contracted_endpoint/types.py +0 -0
  89. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/datasources/__init__.py +0 -0
  90. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/datasources/mutations.py +0 -0
  91. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/datasources/queries.py +0 -0
  92. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/datasources/subscriptions.py +0 -0
  93. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/datasources/types.py +0 -0
  94. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/detector_registry/__init__.py +0 -0
  95. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/detector_registry/mutations.py +0 -0
  96. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/detector_registry/queries.py +0 -0
  97. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/detector_registry/subscriptions.py +0 -0
  98. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/detector_registry/types.py +0 -0
  99. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_command_manager/__init__.py +0 -0
  100. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_command_manager/mutations.py +0 -0
  101. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_command_manager/queries.py +0 -0
  102. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_command_manager/subscriptions.py +0 -0
  103. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_command_manager/types.py +0 -0
  104. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_management_service/__init__.py +0 -0
  105. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_management_service/mutations.py +0 -0
  106. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_management_service/queries.py +0 -0
  107. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_management_service/subscriptions.py +0 -0
  108. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/endpoint_management_service/types.py +0 -0
  109. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/event_search/__init__.py +0 -0
  110. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/event_search/mutations.py +0 -0
  111. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/event_search/queries.py +0 -0
  112. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/event_search/subscriptions.py +0 -0
  113. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/event_search/types.py +0 -0
  114. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/events/__init__.py +0 -0
  115. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/events/mutations.py +0 -0
  116. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/events/queries.py +0 -0
  117. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/events/subscriptions.py +0 -0
  118. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/events/types.py +0 -0
  119. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/exports/__init__.py +0 -0
  120. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/exports/mutations.py +0 -0
  121. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/exports/queries.py +0 -0
  122. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/exports/subscriptions.py +0 -0
  123. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/exports/types.py +0 -0
  124. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/fast_ioc/__init__.py +0 -0
  125. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/fast_ioc/mutations.py +0 -0
  126. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/fast_ioc/queries.py +0 -0
  127. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/fast_ioc/subscriptions.py +0 -0
  128. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/fast_ioc/types.py +0 -0
  129. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/file_info/__init__.py +0 -0
  130. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/file_info/mutations.py +0 -0
  131. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/file_info/queries.py +0 -0
  132. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/file_info/subscriptions.py +0 -0
  133. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/file_info/types.py +0 -0
  134. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/ingest_stats/__init__.py +0 -0
  135. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/ingest_stats/mutations.py +0 -0
  136. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/ingest_stats/queries.py +0 -0
  137. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/ingest_stats/subscriptions.py +0 -0
  138. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/ingest_stats/types.py +0 -0
  139. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations/__init__.py +0 -0
  140. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations/mutations.py +0 -0
  141. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations/queries.py +0 -0
  142. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations/subscriptions.py +0 -0
  143. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations/types.py +0 -0
  144. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations2/__init__.py +0 -0
  145. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations2/mutations.py +0 -0
  146. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations2/queries.py +0 -0
  147. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations2/subscriptions.py +0 -0
  148. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/investigations2/types.py +0 -0
  149. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/isensor/__init__.py +0 -0
  150. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/isensor/mutations.py +0 -0
  151. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/isensor/queries.py +0 -0
  152. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/isensor/subscriptions.py +0 -0
  153. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/isensor/types.py +0 -0
  154. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/mitre_attack_info/__init__.py +0 -0
  155. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/mitre_attack_info/mutations.py +0 -0
  156. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/mitre_attack_info/queries.py +0 -0
  157. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/mitre_attack_info/subscriptions.py +0 -0
  158. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/mitre_attack_info/types.py +0 -0
  159. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_context/__init__.py +0 -0
  160. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_context/mutations.py +0 -0
  161. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_context/queries.py +0 -0
  162. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_context/subscriptions.py +0 -0
  163. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_context/types.py +0 -0
  164. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_ioc/__init__.py +0 -0
  165. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_ioc/mutations.py +0 -0
  166. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_ioc/queries.py +0 -0
  167. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_ioc/subscriptions.py +0 -0
  168. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/multi_tenant_ioc/types.py +0 -0
  169. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/nl_search/__init__.py +0 -0
  170. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/nl_search/mutations.py +0 -0
  171. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/nl_search/queries.py +0 -0
  172. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/nl_search/subscriptions.py +0 -0
  173. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/nl_search/types.py +0 -0
  174. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notebooks/__init__.py +0 -0
  175. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notebooks/mutations.py +0 -0
  176. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notebooks/queries.py +0 -0
  177. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notebooks/subscriptions.py +0 -0
  178. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notebooks/types.py +0 -0
  179. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notifications/__init__.py +0 -0
  180. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notifications/mutations.py +0 -0
  181. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notifications/queries.py +0 -0
  182. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notifications/subscriptions.py +0 -0
  183. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/notifications/types.py +0 -0
  184. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/preferences/__init__.py +0 -0
  185. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/preferences/mutations.py +0 -0
  186. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/preferences/queries.py +0 -0
  187. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/preferences/subscriptions.py +0 -0
  188. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/preferences/types.py +0 -0
  189. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/process_trees/__init__.py +0 -0
  190. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/process_trees/mutations.py +0 -0
  191. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/process_trees/queries.py +0 -0
  192. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/process_trees/subscriptions.py +0 -0
  193. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/process_trees/types.py +0 -0
  194. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/queries/__init__.py +0 -0
  195. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/queries/mutations.py +0 -0
  196. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/queries/queries.py +0 -0
  197. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/queries/subscriptions.py +0 -0
  198. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/queries/types.py +0 -0
  199. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/roadrunner/__init__.py +0 -0
  200. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/roadrunner/mutations.py +0 -0
  201. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/roadrunner/queries.py +0 -0
  202. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/roadrunner/subscriptions.py +0 -0
  203. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/roadrunner/types.py +0 -0
  204. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/rules/__init__.py +0 -0
  205. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/rules/mutations.py +0 -0
  206. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/rules/queries.py +0 -0
  207. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/rules/subscriptions.py +0 -0
  208. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/rules/types.py +0 -0
  209. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/sharelinks/__init__.py +0 -0
  210. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/sharelinks/mutations.py +0 -0
  211. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/sharelinks/queries.py +0 -0
  212. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/sharelinks/subscriptions.py +0 -0
  213. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/sharelinks/types.py +0 -0
  214. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/subjects/__init__.py +0 -0
  215. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/subjects/mutations.py +0 -0
  216. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/subjects/queries.py +0 -0
  217. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/subjects/subscriptions.py +0 -0
  218. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/subjects/types.py +0 -0
  219. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenant_profiles/__init__.py +0 -0
  220. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenant_profiles/mutations.py +0 -0
  221. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenant_profiles/queries.py +0 -0
  222. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenant_profiles/subscriptions.py +0 -0
  223. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenant_profiles/types.py +0 -0
  224. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants/__init__.py +0 -0
  225. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants/mutations.py +0 -0
  226. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants/queries.py +0 -0
  227. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants/subscriptions.py +0 -0
  228. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants/types.py +0 -0
  229. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants4/__init__.py +0 -0
  230. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants4/mutations.py +0 -0
  231. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants4/queries.py +0 -0
  232. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants4/subscriptions.py +0 -0
  233. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/tenants4/types.py +0 -0
  234. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat/__init__.py +0 -0
  235. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat/mutations.py +0 -0
  236. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat/subscriptions.py +0 -0
  237. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat_score/__init__.py +0 -0
  238. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat_score/mutations.py +0 -0
  239. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat_score/queries.py +0 -0
  240. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat_score/subscriptions.py +0 -0
  241. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/threat_score/types.py +0 -0
  242. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trigger_action/__init__.py +0 -0
  243. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trigger_action/mutations.py +0 -0
  244. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trigger_action/queries.py +0 -0
  245. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trigger_action/subscriptions.py +0 -0
  246. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trigger_action/types.py +0 -0
  247. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trip/__init__.py +0 -0
  248. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trip/mutations.py +0 -0
  249. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trip/queries.py +0 -0
  250. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trip/subscriptions.py +0 -0
  251. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/trip/types.py +0 -0
  252. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/users/__init__.py +0 -0
  253. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/users/mutations.py +0 -0
  254. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/users/queries.py +0 -0
  255. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/users/subscriptions.py +0 -0
  256. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/users/types.py +0 -0
  257. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/vdr/__init__.py +0 -0
  258. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/vdr/mutations.py +0 -0
  259. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/vdr/queries.py +0 -0
  260. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/services/vdr/subscriptions.py +0 -0
  261. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/tokens.py +0 -0
  262. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/transport/__init__.py +0 -0
  263. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python/transport/aiohttp_websockets.py +0 -0
  264. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python.egg-info/SOURCES.txt +0 -0
  265. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python.egg-info/dependency_links.txt +0 -0
  266. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python.egg-info/requires.txt +0 -0
  267. {taegis_sdk_python-1.3.0 → taegis_sdk_python-1.4.0}/taegis_sdk_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taegis-sdk-python
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Taegis Python SDK
5
5
  Home-page: https://github.com/secureworks/taegis-sdk-python
6
6
  Author: Secureworks
@@ -27,6 +27,9 @@ TAEGIS_TENANTS_URLS = {
27
27
  "US3": "https://api-tenants.foxtrot.taegis.secureworks.com",
28
28
  }
29
29
 
30
+ UNIVERSAL_ENVIRONMENT = "universal"
31
+ UNIVERSAL_AUTHENTICATION_URL = "https://api.taegis.secureworks.com"
32
+
30
33
 
31
34
  class TaegisEnum(str, Enum):
32
35
  """Handler for Unknown Enums."""
@@ -0,0 +1 @@
1
+ __version__ = "v1.4.0"
@@ -5,19 +5,16 @@ Authenication implementations for Taegis.
5
5
 
6
6
  import logging
7
7
  import os
8
- from getpass import getpass
9
- from time import time
10
- from typing import Any, Dict, Tuple, Union, Optional
11
8
  import threading
9
+ from time import time
10
+ from typing import Optional, Tuple, Union
12
11
 
13
12
  from oauthlib.oauth2 import BackendApplicationClient
14
13
  from requests import HTTPError, post
15
14
  from requests_oauthlib import OAuth2Session
15
+
16
16
  from taegis_sdk_python.config import get_config, write_to_config
17
- from taegis_sdk_python.errors import (
18
- InvalidAuthenticationMethod,
19
- MissingAccessTokenError,
20
- )
17
+ from taegis_sdk_python.errors import MissingAccessTokenError
21
18
  from taegis_sdk_python.tokens import get_token_exp
22
19
 
23
20
  try:
@@ -30,34 +27,6 @@ logger = logging.getLogger(__name__)
30
27
  LOCK = threading.RLock()
31
28
 
32
29
 
33
- def check_username(
34
- request_url: str, username: str
35
- ) -> Dict[str, Any]: # pragma: no cover
36
- """Check if the user needs to login via password or sso.
37
-
38
- Parameters
39
- ----------
40
- request_url : str
41
- Taegis Environment URL
42
- username : str
43
- Username
44
-
45
- Returns
46
- -------
47
- Dict[str, Any]
48
- JSON response from username check
49
- """
50
- logger.debug("Checking login type for username...")
51
- userlogin_endpoint = "/auth/userLogin"
52
-
53
- response = post(
54
- f"{request_url}{userlogin_endpoint}", json={"username": username}, timeout=300
55
- )
56
- logger.debug(response)
57
-
58
- return response.json()
59
-
60
-
61
30
  def get_oauth_from_env(environment: str) -> Tuple[Optional[str], Optional[str]]:
62
31
  """
63
32
  Retrieve CLIENT_ID and CLIENT_SECRET credentials from environment.
@@ -116,28 +85,10 @@ def get_token(environment: str, request_url: str) -> str: # pragma: no cover
116
85
  request_url, client_id, client_secret
117
86
  )
118
87
  else:
119
- username = input("Username: ")
120
- response = check_username(request_url, username)
121
- external_provider = response.get("external_provider")
122
-
123
- if (
124
- response.get("login_type") == "username-password"
125
- and external_provider != "COGNITO"
126
- ):
127
- access_token = get_token_by_password_grant(
128
- request_url, username
129
- )
130
- elif (
131
- response.get("login_type") == "sso"
132
- or external_provider == "COGNITO"
133
- ):
134
- access_token = get_token_by_device_code_authorization(
135
- request_url, external_provider
136
- )
137
- else:
138
- raise InvalidAuthenticationMethod(
139
- message="No known authentication method for user"
140
- )
88
+ access_token = get_token_by_device_code_authorization(request_url)
89
+
90
+ if not access_token:
91
+ raise MissingAccessTokenError(message="Access token ")
141
92
 
142
93
  write_to_config(environment, "access_token", access_token)
143
94
 
@@ -148,11 +99,14 @@ def get_cached_token(env: str) -> Union[str, None]: # pragma: no cover
148
99
  """Get cached token from config file."""
149
100
  config = get_config()
150
101
 
102
+ logger.debug(f"Checking for cached token in config for {env}...")
151
103
  # check for token and expiry in config
152
104
  token = str(config.get(env, "access_token", fallback=""))
153
105
  if token and get_token_exp(token) >= int(time()) + 15:
106
+ logger.debug(f"Token found in config and not expired for {env}...")
154
107
  return token
155
108
 
109
+ logger.debug(f"Token not found in config or expired for {env}...")
156
110
  return None
157
111
 
158
112
 
@@ -198,82 +152,8 @@ def get_token_by_oauth(
198
152
  return access_token
199
153
 
200
154
 
201
- def get_token_by_password_grant(
202
- request_url: str,
203
- username: str,
204
- password: Optional[str] = None,
205
- ) -> str: # pragma: no cover
206
- """Get an access token by username/password with mfa.
207
-
208
- Parameters
209
- ----------
210
- request_url : str
211
- Endpoint URL for Taegis environment
212
- username : str
213
- User to authenticate
214
-
215
- Returns
216
- -------
217
- str
218
- Access token
219
-
220
- Raises
221
- ------
222
- requests.HTTPError
223
- Any issue with retrieving token via HTTP
224
- """
225
- auth_uri = "/universal-auth/token"
226
-
227
- if not password:
228
- password = getpass("Password: ")
229
-
230
- response = post(
231
- f"{request_url}{auth_uri}",
232
- json={"username": username, "password": password, "grant_type": "password"},
233
- timeout=300,
234
- )
235
-
236
- if access_token := response.json().get("access_token"):
237
- return access_token
238
-
239
- try:
240
- mfa_token = response.json().get("mfa_token")
241
- except JSONDecodeError as exc:
242
- raise HTTPError(response.text, response=response) from exc
243
-
244
- if not mfa_token:
245
- raise HTTPError(response.text, response=response)
246
-
247
- mfa_input = input("MFA Token: ")
248
-
249
- response = post(
250
- f"{request_url}{auth_uri}",
251
- json={
252
- "mfa_token": mfa_token,
253
- "otp": mfa_input,
254
- "grant_type": "http://ctpx.secureworks.com/grant-type/mfa-otp",
255
- },
256
- timeout=300,
257
- )
258
- response.raise_for_status()
259
- try:
260
- access_token = response.json().get("access_token")
261
- except JSONDecodeError as exc:
262
- raise HTTPError(response.text, response=response) from exc
263
-
264
- if not access_token:
265
- raise MissingAccessTokenError(
266
- message="Access token not found",
267
- comments=["Check credentials and MFA input."],
268
- nested_exception=HTTPError(response.text, response=response),
269
- )
270
-
271
- return access_token
272
-
273
-
274
155
  def get_token_by_device_code_authorization(
275
156
  request_url: str,
276
- external_provider: str,
277
157
  ) -> Union[str, None]: # pragma: no cover
278
158
  """Get a user token via Device Code authorization.
279
159
 
@@ -291,14 +171,14 @@ def get_token_by_device_code_authorization(
291
171
  init_endpoint = "/universal-auth/device/code/auth"
292
172
  token_endpoint = "/universal-auth/device/code/token"
293
173
 
294
- if external_provider == "COGNITO":
295
- init_endpoint += "?version=2"
296
- token_endpoint += "?version=2"
297
-
298
- response = post(f"{request_url}{init_endpoint}", timeout=300)
174
+ init_url = f"{request_url}{init_endpoint}"
175
+ logger.debug(f"Init URL: {init_url}")
176
+ response = post(init_url, timeout=300)
177
+ logger.debug(f"Response: {response.text}")
299
178
 
300
179
  try:
301
180
  device_code_flow = response.json()
181
+
302
182
  except JSONDecodeError as exc:
303
183
  raise HTTPError(response.text, response=response) from exc
304
184
 
@@ -11,7 +11,11 @@ import aiohttp
11
11
  from aiohttp.client_reqrep import Fingerprint
12
12
  from aiohttp.typedefs import LooseHeaders
13
13
 
14
- from taegis_sdk_python._consts import TAEGIS_ENVIRONMENT_URLS
14
+ from taegis_sdk_python._consts import (
15
+ TAEGIS_ENVIRONMENT_URLS,
16
+ UNIVERSAL_AUTHENTICATION_URL,
17
+ UNIVERSAL_ENVIRONMENT,
18
+ )
15
19
  from taegis_sdk_python._version import __version__
16
20
  from taegis_sdk_python.authentication import get_token
17
21
  from taegis_sdk_python.config import write_to_config
@@ -93,6 +97,7 @@ class GraphQLService:
93
97
  ssl: Optional[Union[SSLContext, Literal[False], Fingerprint]] = None,
94
98
  execute_timeout: Optional[Union[int, float]] = 300,
95
99
  max_message_size: int = 0,
100
+ use_universal_authentication: bool = False,
96
101
  ): # pylint: disable=too-many-statements
97
102
  """
98
103
  GraphQLService
@@ -137,6 +142,7 @@ class GraphQLService:
137
142
  """
138
143
  self._environments = environments or TAEGIS_ENVIRONMENT_URLS
139
144
  self._environment = environment or list(self._environments)[0]
145
+ self._use_universal_authentication = use_universal_authentication
140
146
 
141
147
  if self._environment not in self._environments:
142
148
  raise ValueError(f"environment must be in {self._environments.keys()}")
@@ -253,11 +259,42 @@ class GraphQLService:
253
259
  """Taegis Environment."""
254
260
  return self._context_manager.get("environment", self._environment)
255
261
 
262
+ @property
263
+ def authentication_environment(self):
264
+ """Taegis Authentication Environment."""
265
+ return self._context_manager.get(
266
+ "authentication_environment",
267
+ (
268
+ UNIVERSAL_ENVIRONMENT
269
+ if self.use_universal_authentication
270
+ else self.environment
271
+ ),
272
+ )
273
+
256
274
  @property
257
275
  def url(self):
258
276
  """Taegis Environment URL."""
259
277
  return self._context_manager.get("url")
260
278
 
279
+ @property
280
+ def authentication_url(self):
281
+ """Taegis Authentication URL."""
282
+ return self._context_manager.get(
283
+ "authentication_url",
284
+ (
285
+ UNIVERSAL_AUTHENTICATION_URL
286
+ if self.use_universal_authentication
287
+ else self._environments[self.environment]
288
+ ),
289
+ )
290
+
291
+ @property
292
+ def use_universal_authentication(self):
293
+ """Use Universal Authentication."""
294
+ return self._context_manager.get(
295
+ "use_universal_authentication", self._use_universal_authentication
296
+ )
297
+
261
298
  @property
262
299
  def gateway(self):
263
300
  """Taegis GraphQL Gateway."""
@@ -276,14 +313,14 @@ class GraphQLService:
276
313
  )
277
314
  if not access_token:
278
315
  access_token = get_token(
279
- environment=self.environment,
280
- request_url=self._environments.get(self.environment),
316
+ environment=self.authentication_environment,
317
+ request_url=self.authentication_url,
281
318
  )
282
319
  return access_token
283
320
 
284
321
  def clear_access_token(self):
285
322
  """Clear the current access token."""
286
- write_to_config(self.environment, "access_token", "")
323
+ write_to_config(self.authentication_environment, "access_token", "")
287
324
 
288
325
  @property
289
326
  def output(self):
@@ -3159,7 +3159,14 @@ class Alert2:
3159
3159
  default=None, metadata=config(field_name="threat_score_v2")
3160
3160
  )
3161
3161
  observation: Optional[bool] = field(
3162
- default=None, metadata=config(field_name="observation")
3162
+ default=None,
3163
+ metadata=config(
3164
+ metadata={
3165
+ "deprecated": True,
3166
+ "deprecation_reason": "use threat_score_v2 value instead",
3167
+ },
3168
+ field_name="observation",
3169
+ ),
3163
3170
  )
3164
3171
  metadata: Optional[AlertsMetadata] = field(
3165
3172
  default=None, metadata=config(field_name="metadata")
@@ -387,3 +387,23 @@ class TaegisSDKThreatQuery:
387
387
  [r or {} for r in result.get(endpoint)], many=True
388
388
  )
389
389
  raise GraphQLNoRowsInResultSetError("for query threatFacetInfo")
390
+
391
+ def threat_associated_indicators(
392
+ self, id_: str, page: Optional[ThreatPageInput] = None
393
+ ) -> List[ThreatIndicator]:
394
+ """Retrives all associated indicators to a malware or threat_group."""
395
+ endpoint = "threatAssociatedIndicators"
396
+
397
+ result = self.service.execute_query(
398
+ endpoint=endpoint,
399
+ variables={
400
+ "ID": prepare_input(id_),
401
+ "page": prepare_input(page),
402
+ },
403
+ output=build_output_string(ThreatIndicator),
404
+ )
405
+ if result.get(endpoint) is not None:
406
+ return ThreatIndicator.schema().load(
407
+ [r or {} for r in result.get(endpoint)], many=True
408
+ )
409
+ raise GraphQLNoRowsInResultSetError("for query threatAssociatedIndicators")
@@ -838,6 +838,9 @@ class ThreatReportInput:
838
838
  class FacetInfo:
839
839
  """FacetInfo."""
840
840
 
841
+ display_name: Optional[str] = field(
842
+ default=None, metadata=config(field_name="displayName")
843
+ )
841
844
  facet: Optional[str] = field(default=None, metadata=config(field_name="facet"))
842
845
  fields: Optional[List[FacetFieldInfo]] = field(
843
846
  default=None, metadata=config(field_name="fields")
@@ -64,6 +64,7 @@ class VdrCounterThreatUnit(str, Enum):
64
64
  ISENSOR_RULES_TARGET = "ISENSOR_RULES_TARGET"
65
65
  ADVISORIES_MENTIONS = "ADVISORIES_MENTIONS"
66
66
  IDENTIFIED_MALWARE_THREAT_ACTORS = "IDENTIFIED_MALWARE_THREAT_ACTORS"
67
+ THREAT_ANALYSIS_MENTIONS = "THREAT_ANALYSIS_MENTIONS"
67
68
 
68
69
 
69
70
  class VdrExploitability(str, Enum):
@@ -73,6 +74,7 @@ class VdrExploitability(str, Enum):
73
74
  DOS_EXPLOIT_EXIST = "DOS_EXPLOIT_EXIST"
74
75
  REMOTE_EXPLOIT_EXIST = "REMOTE_EXPLOIT_EXIST"
75
76
  WEB_EXPLOIT_EXIST = "WEB_EXPLOIT_EXIST"
77
+ TRUSTED_EXPLOIT_EXIST = "TRUSTED_EXPLOIT_EXIST"
76
78
 
77
79
 
78
80
  class VdrAttackClass(str, Enum):
@@ -51,8 +51,7 @@ def unwrap(t: Field) -> Any:
51
51
  #
52
52
  # Neither of these need to be included to
53
53
  # generate GraphQL strings sent to the server
54
- args = [arg for arg in get_args(
55
- t) if arg != type(None) and arg != TaegisEnum]
54
+ args = [arg for arg in get_args(t) if arg != type(None) and arg != TaegisEnum]
56
55
 
57
56
  # Unwrap List[type]
58
57
  if hasattr(t, "_name") and t._name == "List": # pylint: disable=protected-access
@@ -88,8 +87,7 @@ def build_output_dataclass(cls: Any) -> Any:
88
87
  output_fields = []
89
88
  for field in dc_fields(cls):
90
89
  log.debug(f"{field=}")
91
- letter_case = field.metadata.get(
92
- "dataclasses_json", {}).get("letter_case")
90
+ letter_case = field.metadata.get("dataclasses_json", {}).get("letter_case")
93
91
  if letter_case:
94
92
  field_name = letter_case(...)
95
93
  else:
@@ -146,8 +144,7 @@ def build_output_string(cls) -> str:
146
144
  if item == type(None):
147
145
  continue
148
146
  output_string = build_output_string(item)
149
- output_fields.append(
150
- f"... on {item.__name__} {{ {output_string} }}")
147
+ output_fields.append(f"... on {item.__name__} {{ {output_string} }}")
151
148
 
152
149
  elif isinstance(cls, (list, tuple)):
153
150
  if len(cls) == 1:
@@ -160,8 +157,7 @@ def build_output_string(cls) -> str:
160
157
  if item == type(None):
161
158
  continue
162
159
  output_string = build_output_string(item)
163
- output_fields.append(
164
- f"... on {item.__name__} {{ {output_string} }}")
160
+ output_fields.append(f"... on {item.__name__} {{ {output_string} }}")
165
161
  output_fields.append("}")
166
162
  log.debug("Generating output string. Done...")
167
163
 
@@ -235,8 +231,7 @@ def build_output_string_from_introspection(field: Any) -> str:
235
231
  fields.append(name)
236
232
  scalar = graphql_unwrap_field(gql_type)
237
233
  if is_object_type(scalar):
238
- fields.append(
239
- f"{{ {build_output_string_from_introspection(scalar)} }}")
234
+ fields.append(f"{{ {build_output_string_from_introspection(scalar)} }}")
240
235
  return " ".join(fields)
241
236
 
242
237
 
@@ -275,8 +270,7 @@ def prepare_input(value: Any) -> Any:
275
270
  """
276
271
  if is_dataclass(value):
277
272
  for field in dc_fields(value):
278
- letter_case = field.metadata.get(
279
- "dataclasses_json", {}).get("letter_case")
273
+ letter_case = field.metadata.get("dataclasses_json", {}).get("letter_case")
280
274
  if letter_case:
281
275
  field_name = letter_case(...)
282
276
  else:
@@ -348,7 +342,9 @@ def prepare_variables(
348
342
  return {key: value for key, value in variables.items() if value is not None}
349
343
 
350
344
 
351
- def parse_union_result(union, result: Union[List[Dict[str, Any]], Dict[str, Any]]) -> Any:
345
+ def parse_union_result(
346
+ union, result: Union[List[Dict[str, Any]], Dict[str, Any]]
347
+ ) -> Any:
352
348
  """
353
349
  Coerse result into a type from union.
354
350
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taegis-sdk-python
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Taegis Python SDK
5
5
  Home-page: https://github.com/secureworks/taegis-sdk-python
6
6
  Author: Secureworks
@@ -1 +0,0 @@
1
- __version__ = "v1.3.0"