atomicshop 3.4.0__py3-none-any.whl → 3.4.1__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 +27 -6
- atomicshop/wrappers/socketw/sni.py +21 -6
- atomicshop/wrappers/socketw/socket_wrapper.py +14 -2
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.1.dist-info}/METADATA +1 -1
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.1.dist-info}/RECORD +11 -11
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.1.dist-info}/WHEEL +0 -0
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.1.dist-info}/licenses/LICENSE.txt +0 -0
- {atomicshop-3.4.0.dist-info → atomicshop-3.4.1.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,14 @@ 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
|
+
ssl_context.keylog_filename = sslkeylog_file_path
|
|
66
|
+
|
|
51
67
|
# If you must support old clients that only offer TLS_RSA_* suites under OpenSSL 3:
|
|
52
68
|
if allow_legacy:
|
|
53
69
|
# This enables RSA key exchange and other legacy bits at security level 1
|
|
@@ -64,6 +80,7 @@ def create_ssl_context_for_client(
|
|
|
64
80
|
) -> ssl.SSLContext:
|
|
65
81
|
"""
|
|
66
82
|
This function creates the SSL context for the client.
|
|
83
|
+
This means that your script will act like a client, and will connect to a server.
|
|
67
84
|
The SSL context is created with the "PROTOCOL_TLS_CLIENT" protocol.
|
|
68
85
|
|
|
69
86
|
:param enable_sslkeylogfile_env_to_client_ssl_context: boolean, enables the SSLKEYLOGFILE environment variable
|
|
@@ -83,9 +100,9 @@ def create_ssl_context_for_client(
|
|
|
83
100
|
if sslkeylog_file_path is None:
|
|
84
101
|
sslkeylog_file_path = os.environ.get('SSLKEYLOGFILE')
|
|
85
102
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
103
|
+
if not os.path.exists(sslkeylog_file_path):
|
|
104
|
+
open(sslkeylog_file_path, "a").close()
|
|
105
|
+
ssl_context.keylog_filename = sslkeylog_file_path
|
|
89
106
|
|
|
90
107
|
current_ciphers = 'AES256-GCM-SHA384:' + ssl._DEFAULT_CIPHERS
|
|
91
108
|
ssl_context.set_ciphers(current_ciphers)
|
|
@@ -191,10 +208,14 @@ def copy_server_ctx_settings(src: ssl.SSLContext, dst: ssl.SSLContext) -> None:
|
|
|
191
208
|
def create_server_ssl_context___load_certificate_and_key(
|
|
192
209
|
certificate_file_path: str,
|
|
193
210
|
key_file_path: str | None,
|
|
194
|
-
inherit_from: ssl.SSLContext | None = None
|
|
211
|
+
inherit_from: ssl.SSLContext | None = None,
|
|
212
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
|
|
213
|
+
sslkeylog_file_path: str = None,
|
|
195
214
|
) -> ssl.SSLContext:
|
|
196
215
|
# Create and set ssl context for server.
|
|
197
|
-
ssl_context: ssl.SSLContext = create_ssl_context_for_server(
|
|
216
|
+
ssl_context: ssl.SSLContext = create_ssl_context_for_server(
|
|
217
|
+
allow_legacy=True, enable_sslkeylogfile_env_to_client_ssl_context=enable_sslkeylogfile_env_to_client_ssl_context,
|
|
218
|
+
sslkeylog_file_path=sslkeylog_file_path)
|
|
198
219
|
|
|
199
220
|
# If you replaced contexts during SNI, copy policy from the old one
|
|
200
221
|
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,7 @@ 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(True)
|
|
89
|
+
ssl_context: ssl.SSLContext = creator.create_ssl_context_for_server(allow_legacy=True)
|
|
86
90
|
|
|
87
91
|
self.certificator_instance = certificator.Certificator(
|
|
88
92
|
ca_certificate_name=self.ca_certificate_name,
|
|
@@ -101,7 +105,9 @@ class SNISetup:
|
|
|
101
105
|
forwarding_dns_service_ipv4_list___only_for_localhost=(
|
|
102
106
|
self.forwarding_dns_service_ipv4_list___only_for_localhost),
|
|
103
107
|
skip_extension_id_list=self.skip_extension_id_list,
|
|
104
|
-
tls=self.tls
|
|
108
|
+
tls=self.tls,
|
|
109
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
110
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
105
111
|
)
|
|
106
112
|
|
|
107
113
|
# Add SNI callback function to the SSL context.
|
|
@@ -160,7 +166,10 @@ class SNISetup:
|
|
|
160
166
|
certificator_instance=self.certificator_instance,
|
|
161
167
|
domain_from_dns_server=self.domain_from_dns_server,
|
|
162
168
|
default_certificate_domain_list=self.default_certificate_domain_list,
|
|
163
|
-
exceptions_logger=self.exceptions_logger
|
|
169
|
+
exceptions_logger=self.exceptions_logger,
|
|
170
|
+
enable_sslkeylogfile_env_to_client_ssl_context=(
|
|
171
|
+
self.certificator_instance.enable_sslkeylogfile_env_to_client_ssl_context),
|
|
172
|
+
sslkeylog_file_path=self.certificator_instance.sslkeylog_file_path)
|
|
164
173
|
ssl_context.set_servername_callback(
|
|
165
174
|
sni_handler_instance.setup_sni_callback(print_kwargs=print_kwargs))
|
|
166
175
|
|
|
@@ -178,7 +187,9 @@ class SNIHandler:
|
|
|
178
187
|
certificator_instance: certificator.Certificator,
|
|
179
188
|
domain_from_dns_server: str,
|
|
180
189
|
default_certificate_domain_list: list,
|
|
181
|
-
exceptions_logger: loggingw.ExceptionCsvLogger
|
|
190
|
+
exceptions_logger: loggingw.ExceptionCsvLogger,
|
|
191
|
+
enable_sslkeylogfile_env_to_client_ssl_context: bool,
|
|
192
|
+
sslkeylog_file_path: str
|
|
182
193
|
):
|
|
183
194
|
self.sni_use_default_callback_function_extended = sni_use_default_callback_function_extended
|
|
184
195
|
self.sni_add_new_domains_to_default_server_certificate = sni_add_new_domains_to_default_server_certificate
|
|
@@ -187,6 +198,8 @@ class SNIHandler:
|
|
|
187
198
|
self.domain_from_dns_server: str = domain_from_dns_server
|
|
188
199
|
self.default_certificate_domain_list = default_certificate_domain_list
|
|
189
200
|
self.exceptions_logger = exceptions_logger
|
|
201
|
+
self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
|
|
202
|
+
self.sslkeylog_file_path: str = sslkeylog_file_path
|
|
190
203
|
|
|
191
204
|
# noinspection PyTypeChecker
|
|
192
205
|
self.sni_received_parameters: SNIReceivedParameters = None
|
|
@@ -325,7 +338,9 @@ class SNIHandler:
|
|
|
325
338
|
creator.create_server_ssl_context___load_certificate_and_key(
|
|
326
339
|
default_server_certificate_path,
|
|
327
340
|
None,
|
|
328
|
-
inherit_from=self.sni_received_parameters.ssl_socket.context
|
|
341
|
+
inherit_from=self.sni_received_parameters.ssl_socket.context,
|
|
342
|
+
enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
|
|
343
|
+
sslkeylog_file_path=self.sslkeylog_file_path
|
|
329
344
|
)
|
|
330
345
|
)
|
|
331
346
|
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=2_vm_IGYQueXrDSwBdgjXn7kHxyeKqTdQmDo1JOD4_0,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=-Xnc59CLHfBEmncwjIhyHBG-p07uNeSxTzr2S1LW7a4,17200
|
|
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=XlTmNIdJYjW_hkF9eCXu7GdhSJYJvKDmTiPrLV1-TdQ,19374
|
|
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.1.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
|
|
318
|
+
atomicshop-3.4.1.dist-info/METADATA,sha256=H6vq6tDZmmoszao5uweXIMSDyVq0QhP4_-cJ4Ow_PDk,9317
|
|
319
|
+
atomicshop-3.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
320
|
+
atomicshop-3.4.1.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
|
|
321
|
+
atomicshop-3.4.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|