stix-shifter-modules-sysdig 8.0.2__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 (27) hide show
  1. stix_shifter_modules/sysdig/__init__.py +0 -0
  2. stix_shifter_modules/sysdig/configuration/config.json +603 -0
  3. stix_shifter_modules/sysdig/configuration/dialects.json +6 -0
  4. stix_shifter_modules/sysdig/configuration/lang_en.json +69 -0
  5. stix_shifter_modules/sysdig/entry_point.py +12 -0
  6. stix_shifter_modules/sysdig/stix_translation/__init__.py +0 -0
  7. stix_shifter_modules/sysdig/stix_translation/json/config_map.json +33 -0
  8. stix_shifter_modules/sysdig/stix_translation/json/from_stix_map.json +110 -0
  9. stix_shifter_modules/sysdig/stix_translation/json/operators.json +13 -0
  10. stix_shifter_modules/sysdig/stix_translation/json/stix_2_1/from_stix_map.json +110 -0
  11. stix_shifter_modules/sysdig/stix_translation/json/stix_2_1/to_stix_map.json +332 -0
  12. stix_shifter_modules/sysdig/stix_translation/json/to_stix_map.json +332 -0
  13. stix_shifter_modules/sysdig/stix_translation/json_to_stix_translator.py +529 -0
  14. stix_shifter_modules/sysdig/stix_translation/query_constructor.py +472 -0
  15. stix_shifter_modules/sysdig/stix_translation/query_translator.py +26 -0
  16. stix_shifter_modules/sysdig/stix_translation/transformers.py +66 -0
  17. stix_shifter_modules/sysdig/stix_transmission/__init__.py +0 -0
  18. stix_shifter_modules/sysdig/stix_transmission/api_client.py +37 -0
  19. stix_shifter_modules/sysdig/stix_transmission/connector.py +213 -0
  20. stix_shifter_modules/sysdig/stix_transmission/error_mapper.py +34 -0
  21. stix_shifter_modules_sysdig-8.0.2.dist-info/METADATA +148 -0
  22. stix_shifter_modules_sysdig-8.0.2.dist-info/RECORD +27 -0
  23. stix_shifter_modules_sysdig-8.0.2.dist-info/WHEEL +5 -0
  24. stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/AUTHORS.md +23 -0
  25. stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/LICENSE.md +219 -0
  26. stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/NOTICE +32 -0
  27. stix_shifter_modules_sysdig-8.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,213 @@
1
+ import json
2
+ from stix_shifter_utils.modules.base.stix_transmission.base_json_sync_connector import BaseJsonSyncConnector
3
+ from stix_shifter_utils.utils.error_response import ErrorResponder
4
+ from stix_shifter_utils.utils import logger
5
+ from .api_client import APIClient
6
+
7
+
8
+ class InvalidMetadataException(Exception):
9
+ pass
10
+
11
+
12
+ class Connector(BaseJsonSyncConnector):
13
+ SYSDIG_MAX_PAGE_SIZE = 999
14
+
15
+ def __init__(self, connection, configuration):
16
+ self.api_client = APIClient(connection, configuration)
17
+ self.logger = logger.set_logger(__name__)
18
+ self.connector = __name__.split('.')[1]
19
+
20
+ async def create_results_connection(self, query, offset, length, metadata=None):
21
+ """
22
+ Fetching the results using query, offset and length
23
+ :param query: str, Data Source query
24
+ :param offset: str, Offset value
25
+ :param length: str, Length value
26
+ :param metadata: dict
27
+ :return: return_obj, dict
28
+ """
29
+ return_obj = {}
30
+ response_dict = {}
31
+ data = []
32
+ local_result_count = 0
33
+ # Using 'prev' cursor instead of 'next' cursor in Sysdig since the records are returned in desc order by last
34
+ # modified timestamp. The 'prev' is not None when all the results are returned in the first api call itself
35
+ # and there are no more records.
36
+ # Hence, checking for result_count returned from API call with the limit. When the result_count is less than
37
+ # the limit, setting prev_page_token to None. This is to overcome Sysdig behaviour.
38
+ try:
39
+ if metadata:
40
+ if isinstance(metadata, dict) and metadata.get('result_count') and metadata.get('prev_page_token'):
41
+ result_count, prev_page_token = metadata['result_count'], metadata['prev_page_token']
42
+ result_count = int(result_count)
43
+ total_records = int(length)
44
+ if abs(self.api_client.result_limit - result_count) < total_records:
45
+ total_records = abs(self.api_client.result_limit - result_count)
46
+
47
+ else:
48
+ # Raise exception when metadata doesnt contain result count or next page token.
49
+ raise InvalidMetadataException(metadata)
50
+ else:
51
+ result_count, prev_page_token = 0, '0'
52
+ total_records = int(offset) + int(length)
53
+ if total_records > int(self.api_client.result_limit):
54
+ total_records = int(self.api_client.result_limit)
55
+ if total_records <= Connector.SYSDIG_MAX_PAGE_SIZE:
56
+ limit = total_records
57
+ else:
58
+ limit = Connector.SYSDIG_MAX_PAGE_SIZE
59
+ query_limit = limit
60
+ limit = f'&limit={limit}'
61
+ if (result_count == 0 and prev_page_token == '0') or (prev_page_token != '0' and result_count <
62
+ self.api_client.result_limit):
63
+ """api call for searching alert based on query"""
64
+ split_query = query.split('&filter=')
65
+ if metadata:
66
+ response_wrapper = await self.api_client.get_search_results(
67
+ f'&cursor={prev_page_token}&filter={split_query[1]}{limit}')
68
+ else:
69
+ response_wrapper = await self.api_client.get_search_results(query + limit)
70
+ response_code = response_wrapper.code
71
+ if response_code == 200:
72
+ response_dict = json.loads(response_wrapper.read())
73
+ return_obj['success'] = True
74
+ result_count += len(response_dict['data'])
75
+ local_result_count += len(response_dict['data'])
76
+ prev_page_token = response_dict['page'].get('prev')
77
+ if len(response_dict['data']) < query_limit:
78
+ prev_page_token = None
79
+ data += response_dict['data']
80
+ # Loop until if there is next page and records fetched is less than total records.
81
+ while prev_page_token:
82
+ if not metadata and result_count < total_records:
83
+ remaining_records = total_records - result_count
84
+ elif metadata and local_result_count < total_records:
85
+ remaining_records = total_records - local_result_count
86
+ else:
87
+ break
88
+ if remaining_records > Connector.SYSDIG_MAX_PAGE_SIZE:
89
+ limit = Connector.SYSDIG_MAX_PAGE_SIZE
90
+ else:
91
+ limit = remaining_records
92
+ query_limit = limit
93
+ limit = f'&limit={limit}'
94
+ prev_response_wrapper = await self.api_client.get_search_results(
95
+ f'&cursor={prev_page_token}&filter={split_query[1]}{limit}')
96
+ prev_response_code = prev_response_wrapper.code
97
+ prev_response_dict = json.loads(prev_response_wrapper.read())
98
+ if prev_response_code == 200:
99
+ result_count += len(prev_response_dict['data'])
100
+ local_result_count += len(response_dict['data'])
101
+ prev_page_token = prev_response_dict['page'].get('prev')
102
+ if len(prev_response_dict['data']) < query_limit:
103
+ prev_page_token = None
104
+ data += prev_response_dict['data']
105
+ else:
106
+ return_obj = self.exception_response(prev_response_wrapper.code,
107
+ prev_response_dict.get('error'))
108
+ data = []
109
+ break
110
+ if data:
111
+ self.update_event(data)
112
+
113
+ if metadata:
114
+ return_obj['data'] = data if data else []
115
+ else:
116
+ return_obj['data'] = data[int(offset):total_records] if data else []
117
+
118
+ if prev_page_token and result_count < self.api_client.result_limit:
119
+ return_obj['metadata'] = {"result_count": result_count,
120
+ "prev_page_token": str(prev_page_token)}
121
+ else:
122
+ if not return_obj.get('error') and return_obj.get('success') is not False:
123
+ return_obj['success'] = True
124
+ return_obj['data'] = []
125
+ else:
126
+ if response_code == 401:
127
+ message = 'cannot verify credentials'
128
+ else:
129
+ response_dict = json.loads(response_wrapper.read())
130
+ message = response_dict.get('message')
131
+ if response_code == 400 and message == 'bad request':
132
+ message = 'Query time range can be maximum up to 14 days or The given query is invalid'
133
+ return_obj = self.exception_response(response_wrapper.code, message)
134
+ else:
135
+ return_obj['success'] = True
136
+ return_obj['data'] = []
137
+
138
+ except InvalidMetadataException as ex:
139
+ response_dict['code'] = 100
140
+ response_dict['message'] = f'Invalid metadata: {str(ex)}'
141
+ ErrorResponder.fill_error(return_obj, response_dict, ['message'], connector=self.connector)
142
+
143
+ except Exception as ex:
144
+ if "timeout_error" in str(ex):
145
+ response_dict['code'] = 408
146
+ response_dict['message'] = str(ex)
147
+ self.logger.error(f'{self.connector} connector error when getting search results: %s', ex)
148
+ ErrorResponder.fill_error(return_obj, response_dict, ['message'],
149
+ connector=self.connector)
150
+ return return_obj
151
+
152
+ @staticmethod
153
+ def update_event(data):
154
+ """
155
+ Set the finding_type as 'threat' for the event.
156
+ Replace invalid <NA> tag with empty string.
157
+ Parse the fd.name and set the fields for network-traffic in the event.
158
+ """
159
+ for event in data:
160
+ fields = event["content"]["fields"]
161
+ # replace unsupported field value <NA> with empty string
162
+ for f in fields:
163
+ if fields[f] == '<NA>':
164
+ fields[f] = ''
165
+
166
+ # Setting the finding_type for the event as 'threat'
167
+ event["finding_type"] = "threat"
168
+ # Parsing network fields from event data
169
+ if fields.get("evt.type") and fields["evt.type"] == "connect":
170
+ if "->" in fields["fd.name"]:
171
+ source, destination = fields["fd.name"].split('->')
172
+ event["clientIpv4"], event["clientPort"] = source.split(":")
173
+ event["serverIpv4"], event["serverPort"] = destination.split(":")
174
+ if fields.get('fd.l4proto'):
175
+ event["l4protocol"] = fields['fd.l4proto']
176
+ else:
177
+ event["l4protocol"] = "tcp"
178
+
179
+ # Adding ancestor names in list
180
+ fields["proc.anames"] = [val for key, val in fields.items() if 'proc.aname' in key and len(val) > 0]
181
+
182
+ async def ping_connection(self):
183
+ """
184
+ Ping the endpoint
185
+ :return: dict
186
+ """
187
+ return_obj = {}
188
+ response_dict = {}
189
+ try:
190
+ response = await self.api_client.ping_data_source()
191
+ response_code = response.code
192
+ if response_code == 200:
193
+ return_obj['success'] = True
194
+ else:
195
+ return_obj = self.exception_response(response_code, 'cannot verify credentials')
196
+ except Exception as ex:
197
+ response_dict['message'] = ex
198
+ self.logger.error(f'{self.connector} connector error while pinging: %s', ex)
199
+ ErrorResponder.fill_error(return_obj, response_dict, ['message'],
200
+ connector=self.connector)
201
+ return return_obj
202
+
203
+ def exception_response(self, code, response_txt):
204
+ """
205
+ create the exception response
206
+ :param code, int
207
+ :param response_txt, dict
208
+ :return: return_obj, dict
209
+ """
210
+ return_obj = {}
211
+ response_dict = {'code': code, 'message': str(response_txt)}
212
+ ErrorResponder.fill_error(return_obj, response_dict, ['message'], connector=self.connector)
213
+ return return_obj
@@ -0,0 +1,34 @@
1
+ from stix_shifter_utils.utils.error_mapper_base import ErrorMapperBase
2
+ from stix_shifter_utils.utils.error_response import ErrorCode
3
+ from stix_shifter_utils.utils import logger
4
+
5
+ error_mapping = {
6
+ 400: ErrorCode.TRANSMISSION_INVALID_PARAMETER,
7
+ 422: ErrorCode.TRANSMISSION_QUERY_LOGICAL_ERROR,
8
+ 100: ErrorCode.TRANSMISSION_INVALID_PARAMETER,
9
+ 401: ErrorCode.TRANSMISSION_AUTH_CREDENTIALS,
10
+ 408: ErrorCode.TRANSMISSION_CONNECT
11
+ }
12
+
13
+
14
+ class ErrorMapper:
15
+ logger = logger.set_logger(__name__)
16
+ DEFAULT_ERROR = ErrorCode.TRANSMISSION_MODULE_DEFAULT_ERROR
17
+
18
+ @staticmethod
19
+ def set_error_code(json_data, return_obj, connector=None):
20
+ code = None
21
+ try:
22
+ code = int(json_data['code'])
23
+ except Exception:
24
+ pass
25
+
26
+ error_code = ErrorMapper.DEFAULT_ERROR
27
+
28
+ if code in error_mapping:
29
+ error_code = error_mapping[code]
30
+
31
+ if error_code == ErrorMapper.DEFAULT_ERROR:
32
+ ErrorMapper.logger.error("failed to map: " + str(json_data))
33
+
34
+ ErrorMapperBase.set_error_code(return_obj, error_code, connector=connector)
@@ -0,0 +1,148 @@
1
+ Metadata-Version: 2.4
2
+ Name: stix_shifter_modules_sysdig
3
+ Version: 8.0.2
4
+ Summary: Tools and interface to translate STIX formatted results and queries to different data source formats and to set up appropriate connection strings for invoking and triggering actions in openwhisk
5
+ Author: ibm
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/opencybersecurityalliance/stix-shifter
8
+ Project-URL: Source, https://github.com/opencybersecurityalliance/stix-shifter
9
+ Keywords: datasource,stix,translate,transform,transmit
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Requires-Python: >=3.10
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE.md
16
+ License-File: AUTHORS.md
17
+ License-File: NOTICE
18
+ Dynamic: license-file
19
+
20
+ [![example workflow](https://github.com/opencybersecurityalliance/stix-shifter/actions/workflows/main.yml/badge.svg)](https://github.com/opencybersecurityalliance/stix-shifter/actions)
21
+ [![codecov](https://codecov.io/gh/opencybersecurityalliance/stix-shifter/branch/develop/graph/badge.svg?token=gQvl14peRj)](https://codecov.io/gh/opencybersecurityalliance/stix-shifter)
22
+
23
+ # Introduction
24
+
25
+ STIX-shifter is an open source python library allowing software to connect to products that house data repositories by using STIX Patterning, and return results as STIX Observations.
26
+
27
+ This library takes in STIX 2 Patterns as input, and "finds" data that matches the patterns inside various products that house repositories of cybersecurity data. Examples of such products include SIEM systems, endpoint management systems, threat intelligence platforms, orchestration platforms, network control points, data lakes, and more.
28
+
29
+ In addition to "finding" the data by using these patterns, STIX-Shifter also _transforms the output_ into STIX 2 Observations. Why would we do that you ask? To put it simply - so that all of the security data, regardless of the source, mostly looks and behaves the same.
30
+
31
+ ***Project Documentation***
32
+
33
+ For general information about STIX, this project, and the command line utilities, see the [STIX-shifter Documentation](https://stix-shifter.readthedocs.io/)
34
+
35
+ ## Installation
36
+
37
+ The recommended method for installing stix-shifter is via pip. Two prerequisite packages needs to be installed inlcuding the package of stix-shifter connector module to complete a stix-shifter connector installation. Run the below commands to install all the packages:
38
+
39
+ 1. Main stix-shifter package: `pip install stix-shifter`
40
+
41
+ 2. Stix-shifter Utility package: `pip install stix-shifter-utils`
42
+
43
+ 3. Desired stix-shifter connector module package: `pip install stix-shifter-modules-<module name> `
44
+ Example: `pip install stix-shifter-modules-qradar`
45
+
46
+ ### Dependencies
47
+
48
+ STIX-shifter requries Python 3.10 or greater. See the [requirements file](../stix_shifter/requirements.txt) for library dependencies.
49
+
50
+ ## Usage
51
+
52
+ STIX-Shifter can use used the following ways:
53
+
54
+ ### As a command line utility
55
+
56
+ The STIX-Shifter comes with a bundled script which you can use to translate STIX Pattern to a native datasource query. It can also be used to translate a JSON data source query result to a STIX bundle of observable objects. You can also send query to a datasource by using a transmission option.
57
+
58
+ More details of the command line option can be found [here](OVERVIEW.md#how-to-use)
59
+
60
+ ```
61
+ $ stix-shifter translate <MODULE NAME> query "<STIX IDENTITY OBJECT>" "<STIX PATTERN>" "<OPTIONS>"
62
+ ```
63
+ Example:
64
+ ```
65
+ $ stix-shifter translate qradar query {} "[ipv4-addr:value = '127.0.0.1']" {}
66
+ ```
67
+
68
+ In order to build `stix-shifter` packages from source follow the below prerequisite steps:
69
+ 1. Go to the stix-shifter parent directory
70
+ 2. Optionally, you can create a Python 3 virtual environemnt:
71
+ `virtualenv -p python3 virtualenv && source virtualenv/bin/activate`
72
+ 3. Run setup: `python -m build_tools.run_build install`
73
+
74
+
75
+ ### Running from the source
76
+
77
+ You may also use the `python3 main.py` script. All the options are the same as the command line utility described above.
78
+
79
+ Example:
80
+
81
+ ```
82
+ python3 main.py translate qradar query {} "[ipv4-addr:value = '127.0.0.1']" {}
83
+ ```
84
+
85
+ In order to run `python3 main.py` from the source follow the below prerequisite steps:
86
+ 1. Go to the stix-shifter parent directory
87
+ 2. Optionally, you can create a Python 3 virtual environemnt:
88
+ `virtualenv -p python3 virtualenv && source virtualenv/bin/activate`
89
+ 3. Run setup to install dependancies: `INSTALL_REQUIREMENTS_ONLY=1 python3 -m build_tools.run_build install`.
90
+
91
+ **Note:** `build_tools.run_build` only installs dependencies when INSTALL_REQUIREMENTS_ONLY=1 directive is used. This option is similar to `python3 -m build_tools.pre_build && pip install -r requirements.txt`
92
+
93
+ ### As a library
94
+
95
+ You can also use this library to integrate STIX Shifter into your own tools. You can translate a STIX Pattern:
96
+
97
+ ```
98
+ from stix_shifter.stix_translation import stix_translation
99
+
100
+ translation = stix_translation.StixTranslation()
101
+ response = translation.translate('<MODULE NAME>', 'query', '{}', '<STIX PATTERN>', '<OPTIONS>')
102
+
103
+ print(response)
104
+ ```
105
+ ### Use of custom mappings
106
+
107
+ If a connector has been installed using pip, the process for editing the STIX mappings is different than if you have pulled-down the project. When working locally, you can edit the mapping files directly. See the [mapping files for the MySQL connector](https://github.com/opencybersecurityalliance/stix-shifter/tree/develop/stix_shifter_modules/mysql/stix_translation/json) as an example. Editing the mapping files won't work if the connector has been installed with pip; the setup script of the stix-shifter package includes the mapppings inside `config.json`. This allows stix-shifter to injest custom mappings as part of the connector's configuration.
108
+
109
+ Refer to [Use of custom mappings](adapter-guide/custom_mappings.md) for more details on how to edit the mappings in the configuration.
110
+
111
+ # Contributing
112
+
113
+ We are thrilled you are considering contributing! We welcome all contributors.
114
+ Please read our [guidelines for contributing](CONTRIBUTING.md).
115
+
116
+ ## [Connector Developer Guide](adapter-guide/develop-stix-adapter.md)
117
+
118
+
119
+ ## [CLI tools and Connector Development Labs](lab/README.md)
120
+
121
+
122
+ # Licensing
123
+
124
+ Licensed under the Apache License, Version 2.0 (the "License");
125
+ you may not use this file except in compliance with the License.
126
+ You may obtain a copy of the License at
127
+
128
+ http://www.apache.org/licenses/LICENSE-2.0
129
+
130
+ Unless required by applicable law or agreed to in writing, software
131
+ distributed under the License is distributed on an "AS IS" BASIS,
132
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133
+ See the License for the specific language governing permissions and
134
+ limitations under the License.
135
+
136
+ # More Resources
137
+
138
+ ## Join us on Slack!
139
+
140
+ [Click here](https://docs.google.com/forms/d/1vEAqg9SKBF3UMtmbJJ9qqLarrXN5zeVG3_obedA3DKs) and fill out the form to receive an invite to the Open Cybersecurity Alliance slack instance, then join the #stix-shifter channel, to meet and discuss usage with the team.
141
+
142
+ ## Introduction Webinar!
143
+
144
+ [Click here](https://ibm.biz/BdzTyA) to view an introduction webinar on STIX Shifter and the use cases it solves for.
145
+
146
+ ## Changelog
147
+
148
+ - [Changelog](../CHANGELOG.md)
@@ -0,0 +1,27 @@
1
+ stix_shifter_modules/sysdig/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ stix_shifter_modules/sysdig/entry_point.py,sha256=DlhtiZzEzBCFQj9SV7zDiOMHvyl7lLAiHpcQPPTW85k,424
3
+ stix_shifter_modules/sysdig/configuration/config.json,sha256=BYcxpCkSUR_CG5ezvOCPd7S4Sx24x75hYrdX_GHTBFQ,26696
4
+ stix_shifter_modules/sysdig/configuration/dialects.json,sha256=tewYuoIE-WBBxsLTlOstMkMSUs6sFlEyW1dveC61xwk,78
5
+ stix_shifter_modules/sysdig/configuration/lang_en.json,sha256=C7rcwaqd1ADbXWwemIy0FH4mKTQmr9bJESfaIDF06dI,3071
6
+ stix_shifter_modules/sysdig/stix_translation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ stix_shifter_modules/sysdig/stix_translation/json_to_stix_translator.py,sha256=JQYc8AoRarJU4PlETIBsx_1f2J_axc1YBjiAaDUCokw,26842
8
+ stix_shifter_modules/sysdig/stix_translation/query_constructor.py,sha256=dSmx_y5xw5r4d7O5WGqw2o2WXfI8GDPaSZ2uaBCUfbw,20230
9
+ stix_shifter_modules/sysdig/stix_translation/query_translator.py,sha256=1IsBlz_YYM9s0myfyed9Wy0fqkV82k77UXd_fTEE38w,1029
10
+ stix_shifter_modules/sysdig/stix_translation/transformers.py,sha256=1s4QpIJZZDOHL4DA0o8RibEYazS8lqxXAXkYFisoyR4,2653
11
+ stix_shifter_modules/sysdig/stix_translation/json/config_map.json,sha256=XlUxXoQzZrecmYuLIDeLGWut-5TPRZ4khWBpdSRevlo,698
12
+ stix_shifter_modules/sysdig/stix_translation/json/from_stix_map.json,sha256=JJ72e-ePAcQJFwf-GEizEr8ksC8vUa73DkRoqQYKYmo,2046
13
+ stix_shifter_modules/sysdig/stix_translation/json/operators.json,sha256=ysKmSc3Ha-AZgFTDih_XaFhM4ejET1gKBnapKmcVHe4,465
14
+ stix_shifter_modules/sysdig/stix_translation/json/to_stix_map.json,sha256=ydLkwcmZEPBsjY_ooJxhN5tfknvgWZ7SgRcDwlrNJ3U,7706
15
+ stix_shifter_modules/sysdig/stix_translation/json/stix_2_1/from_stix_map.json,sha256=axdMRopIMSWx8_FuzN19cYlNlfXObWl4-i57xcbJfPE,2048
16
+ stix_shifter_modules/sysdig/stix_translation/json/stix_2_1/to_stix_map.json,sha256=LPQ0Jw0pLcZ7DAmc2nPf2Az49o67B-BKR7zvAjkg7xM,7708
17
+ stix_shifter_modules/sysdig/stix_transmission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ stix_shifter_modules/sysdig/stix_transmission/api_client.py,sha256=h4t5wFwDleLoKG_ThNw2pIOcJZ_6_VYUsWUBw8DReFE,1654
19
+ stix_shifter_modules/sysdig/stix_transmission/connector.py,sha256=rQ7945EsGsSoqvQPU3klW3zZ49e_Yfl2Wcv8gb__YLU,10774
20
+ stix_shifter_modules/sysdig/stix_transmission/error_mapper.py,sha256=TF8RD8W9idIxMP_uCyi-I7doPodqvrDhknlg0bfz8Wc,1108
21
+ stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/AUTHORS.md,sha256=2o6cakCKaGsd6zHFZHIva-nm93URvbR6HB0ixeZDTG8,996
22
+ stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/LICENSE.md,sha256=ssGEKMVW69oFTBblVhD1YPolqCOyOCJi4wRDRI7xCnU,12786
23
+ stix_shifter_modules_sysdig-8.0.2.dist-info/licenses/NOTICE,sha256=wx-gWE9vSnLJ7YQkrGlMp9VNXOXG57TTxDDRd9CEdYg,1418
24
+ stix_shifter_modules_sysdig-8.0.2.dist-info/METADATA,sha256=6fyIOoVlOv_9VX6nDsOXKAi0Jvm0GrpDbWYLtJ9Xmbg,7309
25
+ stix_shifter_modules_sysdig-8.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
+ stix_shifter_modules_sysdig-8.0.2.dist-info/top_level.txt,sha256=NX-VgUOr8fI-lMXHt3gtjfsEn1UPaGAVszt6Z_CTp2s,21
27
+ stix_shifter_modules_sysdig-8.0.2.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,23 @@
1
+ # Project Authors
2
+
3
+ This project is a collaborative effort between the [OCA Project](https://opencybersecurityalliance.org/) and IBM Canada. It has been developed and maintained by a dedicated team of contributors over time.
4
+
5
+ ## Current Maintainer & Developer
6
+
7
+ **Morgan Nolan** – Developer (Maintainer) – Cork, Ireland (IBM)
8
+
9
+ ## Former Maintainers & Developers – IBM, Fredericton (NB), Canada
10
+
11
+ We gratefully acknowledge the contributions of former IBM Connector Factory maintainers and developers who helped shape this project:
12
+
13
+ - **Derek Rushton** – Developer (Former Maintainer)
14
+ - **Eric Larsen** – Developer (Former Maintainer)
15
+ - **Ben Craig** – Developer (Former Maintainer)
16
+ - **Danny Elliot** – Developer (Maintainer)
17
+ - **Md Azam** – Developer (Maintainer)
18
+ - **Arthur Muradyan** – Developer
19
+ - **Omkar Gurav** – Developer
20
+
21
+ ## Special Thanks
22
+
23
+ We also extend our appreciation to everyone who contributed ideas, bug reports, and feedback to improve the project.