atomicshop 3.4.0__py3-none-any.whl → 3.4.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.
Potentially problematic release.
This version of atomicshop might be problematic. Click here for more details.
- atomicshop/__init__.py +1 -1
- atomicshop/mitm/mitm_main.py +2 -0
- atomicshop/wrappers/socketw/certificator.py +13 -3
- atomicshop/wrappers/socketw/creator.py +28 -6
- atomicshop/wrappers/socketw/sni.py +23 -6
- atomicshop/wrappers/socketw/socket_wrapper.py +14 -2
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.2.dist-info}/METADATA +1 -1
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.2.dist-info}/RECORD +11 -11
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.2.dist-info}/WHEEL +0 -0
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.2.dist-info}/licenses/LICENSE.txt +0 -0
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.2.dist-info}/top_level.txt +0 -0
atomicshop/__init__.py
CHANGED
atomicshop/mitm/mitm_main.py
CHANGED
|
@@ -502,6 +502,8 @@ def mitm_server(config_file_path: str, script_version: str):
|
|
|
502
502
|
exceptions_logger_queue=EXCEPTIONS_CSV_LOGGER_QUEUE,
|
|
503
503
|
forwarding_dns_service_ipv4_list___only_for_localhost=[config_static.DNSServer.forwarding_dns_service_ipv4],
|
|
504
504
|
skip_extension_id_list=config_static.SkipExtensions.SKIP_EXTENSION_ID_LIST,
|
|
505
|
+
enable_sslkeylogfile_env_to_client_ssl_context=config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
506
|
+
sslkeylog_file_path=config_static.Certificates.sslkeylog_file_path,
|
|
505
507
|
print_kwargs=dict(stdout=False)
|
|
506
508
|
)
|
|
507
509
|
|
|
@@ -30,7 +30,9 @@ class Certificator:
|
|
|
30
30
|
custom_private_key_path: str,
|
|
31
31
|
forwarding_dns_service_ipv4_list___only_for_localhost: list,
|
|
32
32
|
skip_extension_id_list: list,
|
|
33
|
-
tls: bool
|
|
33
|
+
tls: bool,
|
|
34
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool,
|
|
35
|
+
sslkeylog_file_path: str
|
|
34
36
|
):
|
|
35
37
|
self.ca_certificate_name = ca_certificate_name
|
|
36
38
|
self.ca_certificate_filepath = ca_certificate_filepath
|
|
@@ -49,6 +51,9 @@ class Certificator:
|
|
|
49
51
|
forwarding_dns_service_ipv4_list___only_for_localhost)
|
|
50
52
|
self.skip_extension_id_list = skip_extension_id_list
|
|
51
53
|
self.tls = tls
|
|
54
|
+
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = (
|
|
55
|
+
enable_sslkeylogfile_env_to_client_ssl_context)
|
|
56
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
52
57
|
|
|
53
58
|
# noinspection PyTypeChecker
|
|
54
59
|
self.certauth_wrapper: CertAuthWrapper = None
|
|
@@ -221,5 +226,10 @@ class Certificator:
|
|
|
221
226
|
|
|
222
227
|
# You need to build new context and exchange the context that being inherited from the main socket,
|
|
223
228
|
# or else the context will receive previous certificate each time.
|
|
224
|
-
sni_received_parameters.ssl_socket.context =
|
|
225
|
-
creator.create_server_ssl_context___load_certificate_and_key(
|
|
229
|
+
sni_received_parameters.ssl_socket.context = (
|
|
230
|
+
creator.create_server_ssl_context___load_certificate_and_key(
|
|
231
|
+
certificate_file_path=sni_server_certificate_file_path, key_file_path=None,
|
|
232
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
233
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
234
|
+
)
|
|
235
|
+
)
|
|
@@ -25,7 +25,15 @@ def add_reusable_address_option(socket_instance):
|
|
|
25
25
|
socket_instance.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def create_ssl_context_for_server(
|
|
28
|
+
def create_ssl_context_for_server(
|
|
29
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
30
|
+
sslkeylog_file_path: str = None,
|
|
31
|
+
allow_legacy: bool = False
|
|
32
|
+
) -> ssl.SSLContext:
|
|
33
|
+
"""
|
|
34
|
+
This function creates the SSL context for the server.
|
|
35
|
+
Meaning that your script will act like a server, and the client will connect to it.
|
|
36
|
+
"""
|
|
29
37
|
# Creating context with SSL certificate and the private key before the socket
|
|
30
38
|
# https://docs.python.org/3/library/ssl.html
|
|
31
39
|
# Creating context for SSL wrapper, specifying "PROTOCOL_TLS_SERVER" will pick the best TLS version protocol for
|
|
@@ -48,6 +56,15 @@ def create_ssl_context_for_server(allow_legacy=False) -> ssl.SSLContext:
|
|
|
48
56
|
ssl_context.verify_mode = ssl.CERT_NONE
|
|
49
57
|
ssl_context.check_hostname = False
|
|
50
58
|
|
|
59
|
+
if enable_sslkeylogfile_env_to_client_ssl_context:
|
|
60
|
+
if sslkeylog_file_path is None:
|
|
61
|
+
sslkeylog_file_path = os.environ.get('SSLKEYLOGFILE')
|
|
62
|
+
|
|
63
|
+
if not os.path.exists(sslkeylog_file_path):
|
|
64
|
+
open(sslkeylog_file_path, "a").close()
|
|
65
|
+
|
|
66
|
+
ssl_context.keylog_filename = sslkeylog_file_path
|
|
67
|
+
|
|
51
68
|
# If you must support old clients that only offer TLS_RSA_* suites under OpenSSL 3:
|
|
52
69
|
if allow_legacy:
|
|
53
70
|
# This enables RSA key exchange and other legacy bits at security level 1
|
|
@@ -64,6 +81,7 @@ def create_ssl_context_for_client(
|
|
|
64
81
|
) -> ssl.SSLContext:
|
|
65
82
|
"""
|
|
66
83
|
This function creates the SSL context for the client.
|
|
84
|
+
This means that your script will act like a client, and will connect to a server.
|
|
67
85
|
The SSL context is created with the "PROTOCOL_TLS_CLIENT" protocol.
|
|
68
86
|
|
|
69
87
|
:param enable_sslkeylogfile_env_to_client_ssl_context: boolean, enables the SSLKEYLOGFILE environment variable
|
|
@@ -83,9 +101,9 @@ def create_ssl_context_for_client(
|
|
|
83
101
|
if sslkeylog_file_path is None:
|
|
84
102
|
sslkeylog_file_path = os.environ.get('SSLKEYLOGFILE')
|
|
85
103
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
104
|
+
if not os.path.exists(sslkeylog_file_path):
|
|
105
|
+
open(sslkeylog_file_path, "a").close()
|
|
106
|
+
ssl_context.keylog_filename = sslkeylog_file_path
|
|
89
107
|
|
|
90
108
|
current_ciphers = 'AES256-GCM-SHA384:' + ssl._DEFAULT_CIPHERS
|
|
91
109
|
ssl_context.set_ciphers(current_ciphers)
|
|
@@ -191,10 +209,14 @@ def copy_server_ctx_settings(src: ssl.SSLContext, dst: ssl.SSLContext) -> None:
|
|
|
191
209
|
def create_server_ssl_context___load_certificate_and_key(
|
|
192
210
|
certificate_file_path: str,
|
|
193
211
|
key_file_path: str | None,
|
|
194
|
-
inherit_from: ssl.SSLContext | None = None
|
|
212
|
+
inherit_from: ssl.SSLContext | None = None,
|
|
213
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
214
|
+
sslkeylog_file_path: str = None,
|
|
195
215
|
) -> ssl.SSLContext:
|
|
196
216
|
# Create and set ssl context for server.
|
|
197
|
-
ssl_context: ssl.SSLContext = create_ssl_context_for_server(
|
|
217
|
+
ssl_context: ssl.SSLContext = create_ssl_context_for_server(
|
|
218
|
+
allow_legacy=True, enable_sslkeylogfile_env_to_client_ssl_context=enable_sslkeylogfile_env_to_client_ssl_context,
|
|
219
|
+
sslkeylog_file_path=sslkeylog_file_path)
|
|
198
220
|
|
|
199
221
|
# If you replaced contexts during SNI, copy policy from the old one
|
|
200
222
|
if inherit_from is not None:
|
|
@@ -47,7 +47,9 @@ class SNISetup:
|
|
|
47
47
|
tls: bool,
|
|
48
48
|
domain_from_dns_server: str = None,
|
|
49
49
|
skip_extension_id_list: list = None,
|
|
50
|
-
exceptions_logger: loggingw.ExceptionCsvLogger = None
|
|
50
|
+
exceptions_logger: loggingw.ExceptionCsvLogger = None,
|
|
51
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
52
|
+
sslkeylog_file_path: str = None
|
|
51
53
|
):
|
|
52
54
|
self.ca_certificate_name = ca_certificate_name
|
|
53
55
|
self.ca_certificate_filepath = ca_certificate_filepath
|
|
@@ -74,6 +76,8 @@ class SNISetup:
|
|
|
74
76
|
self.tls = tls
|
|
75
77
|
self.exceptions_logger = exceptions_logger
|
|
76
78
|
self.certificator_instance = None
|
|
79
|
+
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
|
|
80
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
77
81
|
|
|
78
82
|
def wrap_socket_with_ssl_context_server_sni_extended(
|
|
79
83
|
self,
|
|
@@ -82,7 +86,9 @@ class SNISetup:
|
|
|
82
86
|
):
|
|
83
87
|
|
|
84
88
|
# Create SSL Socket to wrap the raw socket with.
|
|
85
|
-
ssl_context: ssl.SSLContext = creator.create_ssl_context_for_server(
|
|
89
|
+
ssl_context: ssl.SSLContext = creator.create_ssl_context_for_server(
|
|
90
|
+
allow_legacy=True, enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
91
|
+
sslkeylog_file_path=self.sslkeylog_file_path)
|
|
86
92
|
|
|
87
93
|
self.certificator_instance = certificator.Certificator(
|
|
88
94
|
ca_certificate_name=self.ca_certificate_name,
|
|
@@ -101,7 +107,9 @@ class SNISetup:
|
|
|
101
107
|
forwarding_dns_service_ipv4_list___only_for_localhost=(
|
|
102
108
|
self.forwarding_dns_service_ipv4_list___only_for_localhost),
|
|
103
109
|
skip_extension_id_list=self.skip_extension_id_list,
|
|
104
|
-
tls=self.tls
|
|
110
|
+
tls=self.tls,
|
|
111
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
112
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
105
113
|
)
|
|
106
114
|
|
|
107
115
|
# Add SNI callback function to the SSL context.
|
|
@@ -160,7 +168,10 @@ class SNISetup:
|
|
|
160
168
|
certificator_instance=self.certificator_instance,
|
|
161
169
|
domain_from_dns_server=self.domain_from_dns_server,
|
|
162
170
|
default_certificate_domain_list=self.default_certificate_domain_list,
|
|
163
|
-
exceptions_logger=self.exceptions_logger
|
|
171
|
+
exceptions_logger=self.exceptions_logger,
|
|
172
|
+
enable_sslkeylogfile_env_to_client_ssl_context=(
|
|
173
|
+
self.certificator_instance.enable_sslkeylogfile_env_to_client_ssl_context),
|
|
174
|
+
sslkeylog_file_path=self.certificator_instance.sslkeylog_file_path)
|
|
164
175
|
ssl_context.set_servername_callback(
|
|
165
176
|
sni_handler_instance.setup_sni_callback(print_kwargs=print_kwargs))
|
|
166
177
|
|
|
@@ -178,7 +189,9 @@ class SNIHandler:
|
|
|
178
189
|
certificator_instance: certificator.Certificator,
|
|
179
190
|
domain_from_dns_server: str,
|
|
180
191
|
default_certificate_domain_list: list,
|
|
181
|
-
exceptions_logger: loggingw.ExceptionCsvLogger
|
|
192
|
+
exceptions_logger: loggingw.ExceptionCsvLogger,
|
|
193
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool,
|
|
194
|
+
sslkeylog_file_path: str
|
|
182
195
|
):
|
|
183
196
|
self.sni_use_default_callback_function_extended = sni_use_default_callback_function_extended
|
|
184
197
|
self.sni_add_new_domains_to_default_server_certificate = sni_add_new_domains_to_default_server_certificate
|
|
@@ -187,6 +200,8 @@ class SNIHandler:
|
|
|
187
200
|
self.domain_from_dns_server: str = domain_from_dns_server
|
|
188
201
|
self.default_certificate_domain_list = default_certificate_domain_list
|
|
189
202
|
self.exceptions_logger = exceptions_logger
|
|
203
|
+
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
|
|
204
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
190
205
|
|
|
191
206
|
# noinspection PyTypeChecker
|
|
192
207
|
self.sni_received_parameters: SNIReceivedParameters = None
|
|
@@ -325,7 +340,9 @@ class SNIHandler:
|
|
|
325
340
|
creator.create_server_ssl_context___load_certificate_and_key(
|
|
326
341
|
default_server_certificate_path,
|
|
327
342
|
None,
|
|
328
|
-
inherit_from=self.sni_received_parameters.ssl_socket.context
|
|
343
|
+
inherit_from=self.sni_received_parameters.ssl_socket.context,
|
|
344
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
345
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
329
346
|
)
|
|
330
347
|
)
|
|
331
348
|
else:
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import multiprocessing
|
|
2
2
|
import threading
|
|
3
|
-
import time
|
|
4
3
|
|
|
5
4
|
import select
|
|
6
5
|
from typing import Literal, Union, Callable, Any
|
|
@@ -80,6 +79,8 @@ class SocketWrapper:
|
|
|
80
79
|
statistics_logger_queue: multiprocessing.Queue = None,
|
|
81
80
|
exceptions_logger_name: str = 'SocketWrapperExceptions',
|
|
82
81
|
exceptions_logger_queue: multiprocessing.Queue = None,
|
|
82
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
83
|
+
sslkeylog_file_path: str = None,
|
|
83
84
|
print_kwargs: dict = None,
|
|
84
85
|
):
|
|
85
86
|
"""
|
|
@@ -173,6 +174,12 @@ class SocketWrapper:
|
|
|
173
174
|
:param exceptions_logger_name: string, name of the logger that will be used to log exceptions.
|
|
174
175
|
:param exceptions_logger_queue: multiprocessing.Queue, queue that will be used to log exceptions in
|
|
175
176
|
multiprocessing. You need to start the logger listener in the main process to handle the queue.
|
|
177
|
+
:param enable_sslkeylogfile_env_to_client_ssl_context: boolean, if True, each client SSL context
|
|
178
|
+
that will be created by the SocketWrapper will have save the SSL handshake keys to the file
|
|
179
|
+
defined in 'sslkeylog_file_path' parameter.
|
|
180
|
+
:param sslkeylog_file_path: string, path to file where SSL handshake keys will be saved.
|
|
181
|
+
If not provided and 'enable_sslkeylogfile_env_to_client_ssl_context' is True, then
|
|
182
|
+
the environment variable 'SSLKEYLOGFILE' will be used.
|
|
176
183
|
:param print_kwargs: dict, additional arguments to pass to the print function.
|
|
177
184
|
"""
|
|
178
185
|
|
|
@@ -208,6 +215,9 @@ class SocketWrapper:
|
|
|
208
215
|
self.ssh_script_to_execute = ssh_script_to_execute
|
|
209
216
|
self.forwarding_dns_service_ipv4_list___only_for_localhost = (
|
|
210
217
|
forwarding_dns_service_ipv4_list___only_for_localhost)
|
|
218
|
+
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = (
|
|
219
|
+
enable_sslkeylogfile_env_to_client_ssl_context)
|
|
220
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
211
221
|
self.print_kwargs: dict = print_kwargs
|
|
212
222
|
|
|
213
223
|
self.socket_object = None
|
|
@@ -616,7 +626,9 @@ class SocketWrapper:
|
|
|
616
626
|
forwarding_dns_service_ipv4_list___only_for_localhost=(
|
|
617
627
|
self.forwarding_dns_service_ipv4_list___only_for_localhost),
|
|
618
628
|
tls=is_tls,
|
|
619
|
-
exceptions_logger=self.exceptions_logger
|
|
629
|
+
exceptions_logger=self.exceptions_logger,
|
|
630
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
631
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
620
632
|
)
|
|
621
633
|
|
|
622
634
|
ssl_client_socket, accept_error_message = \
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
atomicshop/__init__.py,sha256=
|
|
1
|
+
atomicshop/__init__.py,sha256=z6B8jy3rF9-QI0t-bMD5Kjc5FyXhKQba4P5WtIQrHhk,122
|
|
2
2
|
atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
|
|
3
3
|
atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
|
|
4
4
|
atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
|
|
@@ -130,7 +130,7 @@ atomicshop/mitm/connection_thread_worker.py,sha256=NPHizpPJOaYjP05EEGxEOOKHhgbe4
|
|
|
130
130
|
atomicshop/mitm/import_config.py,sha256=7aLfKqflc3ZnzKc2_Y4T0eenzQpKG94M0r-PaVwF99M,18881
|
|
131
131
|
atomicshop/mitm/initialize_engines.py,sha256=qzz5jzh_lKC03bI1w5ebngVXo1K-RV3poAyW-nObyqo,11042
|
|
132
132
|
atomicshop/mitm/message.py,sha256=CDhhm4BTuZE7oNZCjvIZ4BuPOW4MuIzQLOg91hJaxDI,3065
|
|
133
|
-
atomicshop/mitm/mitm_main.py,sha256=
|
|
133
|
+
atomicshop/mitm/mitm_main.py,sha256=i0YcLDKAYH1aUS_Rf7IbwXiSQzndsdOY_JuYTvTiTN8,40453
|
|
134
134
|
atomicshop/mitm/recs_files.py,sha256=tv8XFhYZMkBv4DauvpiAdPgvSo0Bcm1CghnmwO7dx8M,5018
|
|
135
135
|
atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
|
|
136
136
|
atomicshop/mitm/statistic_analyzer.py,sha256=EC9g21ocOsFzNfntV-nZHSGtrS1-Kxb0QDSGWS5FuNA,28942
|
|
@@ -298,24 +298,24 @@ atomicshop/wrappers/pywin32w/wmis/wmi_helpers.py,sha256=Ng5pbWeQBNcPqfFuxHEIdkIU
|
|
|
298
298
|
atomicshop/wrappers/socketw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
299
299
|
atomicshop/wrappers/socketw/accepter.py,sha256=4I9ORugRDvwaqSzm_gWSjZnRwQGY8hDTlCdsYHwH_ZE,2377
|
|
300
300
|
atomicshop/wrappers/socketw/base.py,sha256=EcosGkD8VzgBY3GeIHDSG29ThQfXwg3-GQPmBTAqTdw,3048
|
|
301
|
-
atomicshop/wrappers/socketw/certificator.py,sha256=
|
|
302
|
-
atomicshop/wrappers/socketw/creator.py,sha256=
|
|
301
|
+
atomicshop/wrappers/socketw/certificator.py,sha256=mA78HXg6j_WKQ7D26Ue66QKA9y1Iu-EWsnc6cI6RC8w,12976
|
|
302
|
+
atomicshop/wrappers/socketw/creator.py,sha256=DpYzw45DDrHzdSPWt4k-k5ymxr2-91E14yofC4sQ9NM,17198
|
|
303
303
|
atomicshop/wrappers/socketw/dns_server.py,sha256=UHq1a3NVdOrclEOOQIe-wNtIgbF8DFeNXsobvtoM1U8,55961
|
|
304
304
|
atomicshop/wrappers/socketw/exception_wrapper.py,sha256=_p98OdOaKYSMqJ23pHLXBUA7NkbVmpgqcSJAdWr6wwc,7560
|
|
305
305
|
atomicshop/wrappers/socketw/get_process.py,sha256=aJC-_qFUv3NgWCSUzDI72E4z8_-VTZE9NVZ0CwUoNlM,5698
|
|
306
306
|
atomicshop/wrappers/socketw/receiver.py,sha256=9B3MvcDqr4C3x2fsnjG5SQognd1wRqsBgikxZa0wXG8,8243
|
|
307
307
|
atomicshop/wrappers/socketw/sender.py,sha256=5ecHUlz4Sxt4oWevBFfy33jQLRXmmVLOF34njfvSbxY,4801
|
|
308
|
-
atomicshop/wrappers/socketw/sni.py,sha256
|
|
308
|
+
atomicshop/wrappers/socketw/sni.py,sha256=-EnZwJJU35NZgYo6SyIr7tfM_ISCgb1ZDYXShYAO9bQ,19547
|
|
309
309
|
atomicshop/wrappers/socketw/socket_client.py,sha256=WWIiCxUX9irN9aWzJ6-1xrXNB_iv_diq3ha1yrWsNGU,22671
|
|
310
310
|
atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
|
|
311
|
-
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=
|
|
311
|
+
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=KdwZvATt7iEC2R0to9jcE0kBtG1cjcZwmF_cMn5fFms,43616
|
|
312
312
|
atomicshop/wrappers/socketw/ssl_base.py,sha256=62-hPm7zla1rh3m_WvDnXqKH-sDUTdiRptD8STCkgdk,2313
|
|
313
313
|
atomicshop/wrappers/socketw/statistics_csv.py,sha256=_gA8bMX6Sw_UCXKi2y9wNAwlqifgExgDGfQIa9pFxQA,5543
|
|
314
314
|
atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
315
315
|
atomicshop/wrappers/winregw/winreg_installed_software.py,sha256=Qzmyktvob1qp6Tjk2DjLfAqr_yXV0sgWzdMW_9kwNjY,2345
|
|
316
316
|
atomicshop/wrappers/winregw/winreg_network.py,sha256=ih0BVNwByLvf9F_Lac4EdmDYYJA3PzMvmG0PieDZrsE,9905
|
|
317
|
-
atomicshop-3.4.
|
|
318
|
-
atomicshop-3.4.
|
|
319
|
-
atomicshop-3.4.
|
|
320
|
-
atomicshop-3.4.
|
|
321
|
-
atomicshop-3.4.
|
|
317
|
+
atomicshop-3.4.2.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
|
|
318
|
+
atomicshop-3.4.2.dist-info/METADATA,sha256=LSck6xzVp4t5nFs5mLWlM5-6NvidcN44oDJueNqU7sQ,9317
|
|
319
|
+
atomicshop-3.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
320
|
+
atomicshop-3.4.2.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
|
|
321
|
+
atomicshop-3.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|