atomicshop 2.15.11__py3-none-any.whl → 3.10.5__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 (221) hide show
  1. atomicshop/__init__.py +1 -1
  2. atomicshop/{addons/mains → a_mains}/FACT/update_extract.py +3 -2
  3. atomicshop/a_mains/dns_gateway_setting.py +11 -0
  4. atomicshop/a_mains/get_local_tcp_ports.py +85 -0
  5. atomicshop/a_mains/github_wrapper.py +11 -0
  6. atomicshop/a_mains/install_ca_certificate.py +172 -0
  7. atomicshop/a_mains/process_from_port.py +119 -0
  8. atomicshop/a_mains/set_default_dns_gateway.py +90 -0
  9. atomicshop/a_mains/update_config_toml.py +38 -0
  10. atomicshop/basics/ansi_escape_codes.py +3 -1
  11. atomicshop/basics/argparse_template.py +2 -0
  12. atomicshop/basics/booleans.py +27 -30
  13. atomicshop/basics/bytes_arrays.py +43 -0
  14. atomicshop/basics/classes.py +149 -1
  15. atomicshop/basics/enums.py +2 -2
  16. atomicshop/basics/exceptions.py +5 -1
  17. atomicshop/basics/list_of_classes.py +29 -0
  18. atomicshop/basics/multiprocesses.py +374 -50
  19. atomicshop/basics/strings.py +72 -3
  20. atomicshop/basics/threads.py +14 -0
  21. atomicshop/basics/tracebacks.py +13 -3
  22. atomicshop/certificates.py +153 -52
  23. atomicshop/config_init.py +11 -6
  24. atomicshop/console_user_response.py +7 -14
  25. atomicshop/consoles.py +9 -0
  26. atomicshop/datetimes.py +1 -1
  27. atomicshop/diff_check.py +3 -3
  28. atomicshop/dns.py +128 -3
  29. atomicshop/etws/_pywintrace_fix.py +17 -0
  30. atomicshop/etws/trace.py +40 -42
  31. atomicshop/etws/traces/trace_dns.py +56 -44
  32. atomicshop/etws/traces/trace_tcp.py +130 -0
  33. atomicshop/file_io/csvs.py +27 -5
  34. atomicshop/file_io/docxs.py +34 -17
  35. atomicshop/file_io/file_io.py +31 -17
  36. atomicshop/file_io/jsons.py +49 -0
  37. atomicshop/file_io/tomls.py +139 -0
  38. atomicshop/filesystem.py +616 -291
  39. atomicshop/get_process_list.py +3 -3
  40. atomicshop/http_parse.py +149 -93
  41. atomicshop/ip_addresses.py +6 -1
  42. atomicshop/mitm/centered_settings.py +132 -0
  43. atomicshop/mitm/config_static.py +207 -0
  44. atomicshop/mitm/config_toml_editor.py +55 -0
  45. atomicshop/mitm/connection_thread_worker.py +875 -357
  46. atomicshop/mitm/engines/__parent/parser___parent.py +4 -17
  47. atomicshop/mitm/engines/__parent/recorder___parent.py +108 -51
  48. atomicshop/mitm/engines/__parent/requester___parent.py +116 -0
  49. atomicshop/mitm/engines/__parent/responder___parent.py +75 -114
  50. atomicshop/mitm/engines/__reference_general/parser___reference_general.py +10 -7
  51. atomicshop/mitm/engines/__reference_general/recorder___reference_general.py +5 -5
  52. atomicshop/mitm/engines/__reference_general/requester___reference_general.py +47 -0
  53. atomicshop/mitm/engines/__reference_general/responder___reference_general.py +95 -13
  54. atomicshop/mitm/engines/create_module_template.py +58 -14
  55. atomicshop/mitm/import_config.py +359 -139
  56. atomicshop/mitm/initialize_engines.py +160 -80
  57. atomicshop/mitm/message.py +64 -23
  58. atomicshop/mitm/mitm_main.py +892 -0
  59. atomicshop/mitm/recs_files.py +183 -0
  60. atomicshop/mitm/shared_functions.py +4 -10
  61. atomicshop/mitm/ssh_tester.py +82 -0
  62. atomicshop/mitm/statistic_analyzer.py +136 -40
  63. atomicshop/mitm/statistic_analyzer_helper/moving_average_helper.py +265 -83
  64. atomicshop/monitor/checks/dns.py +1 -1
  65. atomicshop/networks.py +671 -0
  66. atomicshop/on_exit.py +39 -9
  67. atomicshop/package_mains_processor.py +84 -0
  68. atomicshop/permissions/permissions.py +22 -0
  69. atomicshop/permissions/ubuntu_permissions.py +239 -0
  70. atomicshop/permissions/win_permissions.py +33 -0
  71. atomicshop/print_api.py +24 -42
  72. atomicshop/process.py +24 -6
  73. atomicshop/process_poller/process_pool.py +0 -1
  74. atomicshop/process_poller/simple_process_pool.py +204 -5
  75. atomicshop/python_file_patcher.py +1 -1
  76. atomicshop/python_functions.py +27 -75
  77. atomicshop/speech_recognize.py +8 -0
  78. atomicshop/ssh_remote.py +158 -172
  79. atomicshop/system_resource_monitor.py +61 -47
  80. atomicshop/system_resources.py +8 -8
  81. atomicshop/tempfiles.py +1 -2
  82. atomicshop/urls.py +6 -0
  83. atomicshop/venvs.py +28 -0
  84. atomicshop/versioning.py +27 -0
  85. atomicshop/web.py +98 -27
  86. atomicshop/web_apis/google_custom_search.py +44 -0
  87. atomicshop/web_apis/google_llm.py +188 -0
  88. atomicshop/websocket_parse.py +450 -0
  89. atomicshop/wrappers/certauthw/certauth.py +1 -0
  90. atomicshop/wrappers/cryptographyw.py +29 -8
  91. atomicshop/wrappers/ctyping/etw_winapi/const.py +97 -47
  92. atomicshop/wrappers/ctyping/etw_winapi/etw_functions.py +178 -49
  93. atomicshop/wrappers/ctyping/file_details_winapi.py +67 -0
  94. atomicshop/wrappers/ctyping/msi_windows_installer/cabs.py +2 -1
  95. atomicshop/wrappers/ctyping/msi_windows_installer/extract_msi_main.py +2 -2
  96. atomicshop/wrappers/ctyping/setup_device.py +466 -0
  97. atomicshop/wrappers/ctyping/win_console.py +39 -0
  98. atomicshop/wrappers/dockerw/dockerw.py +113 -2
  99. atomicshop/wrappers/elasticsearchw/config_basic.py +0 -12
  100. atomicshop/wrappers/elasticsearchw/elastic_infra.py +75 -0
  101. atomicshop/wrappers/elasticsearchw/elasticsearchw.py +2 -20
  102. atomicshop/wrappers/factw/get_file_data.py +12 -5
  103. atomicshop/wrappers/factw/install/install_after_restart.py +89 -5
  104. atomicshop/wrappers/factw/install/pre_install_and_install_before_restart.py +20 -14
  105. atomicshop/wrappers/githubw.py +537 -54
  106. atomicshop/wrappers/loggingw/consts.py +1 -1
  107. atomicshop/wrappers/loggingw/filters.py +23 -0
  108. atomicshop/wrappers/loggingw/formatters.py +12 -0
  109. atomicshop/wrappers/loggingw/handlers.py +214 -107
  110. atomicshop/wrappers/loggingw/loggers.py +19 -0
  111. atomicshop/wrappers/loggingw/loggingw.py +860 -22
  112. atomicshop/wrappers/loggingw/reading.py +134 -112
  113. atomicshop/wrappers/mongodbw/mongo_infra.py +31 -0
  114. atomicshop/wrappers/mongodbw/mongodbw.py +1324 -36
  115. atomicshop/wrappers/netshw.py +271 -0
  116. atomicshop/wrappers/playwrightw/engine.py +34 -19
  117. atomicshop/wrappers/playwrightw/infra.py +5 -0
  118. atomicshop/wrappers/playwrightw/javascript.py +7 -3
  119. atomicshop/wrappers/playwrightw/keyboard.py +14 -0
  120. atomicshop/wrappers/playwrightw/scenarios.py +172 -5
  121. atomicshop/wrappers/playwrightw/waits.py +9 -7
  122. atomicshop/wrappers/powershell_networking.py +80 -0
  123. atomicshop/wrappers/psutilw/processes.py +37 -1
  124. atomicshop/wrappers/psutilw/psutil_networks.py +85 -0
  125. atomicshop/wrappers/pyopensslw.py +9 -2
  126. atomicshop/wrappers/pywin32w/cert_store.py +116 -0
  127. atomicshop/wrappers/pywin32w/win_event_log/fetch.py +174 -0
  128. atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_create.py +3 -105
  129. atomicshop/wrappers/pywin32w/win_event_log/subscribes/process_terminate.py +3 -57
  130. atomicshop/wrappers/pywin32w/wmis/msft_netipaddress.py +113 -0
  131. atomicshop/wrappers/pywin32w/wmis/win32_networkadapterconfiguration.py +259 -0
  132. atomicshop/wrappers/pywin32w/wmis/win32networkadapter.py +112 -0
  133. atomicshop/wrappers/pywin32w/wmis/wmi_helpers.py +236 -0
  134. atomicshop/wrappers/socketw/accepter.py +21 -7
  135. atomicshop/wrappers/socketw/certificator.py +216 -150
  136. atomicshop/wrappers/socketw/creator.py +190 -50
  137. atomicshop/wrappers/socketw/dns_server.py +491 -182
  138. atomicshop/wrappers/socketw/exception_wrapper.py +45 -52
  139. atomicshop/wrappers/socketw/process_getter.py +86 -0
  140. atomicshop/wrappers/socketw/receiver.py +144 -102
  141. atomicshop/wrappers/socketw/sender.py +65 -35
  142. atomicshop/wrappers/socketw/sni.py +334 -165
  143. atomicshop/wrappers/socketw/socket_base.py +134 -0
  144. atomicshop/wrappers/socketw/socket_client.py +137 -95
  145. atomicshop/wrappers/socketw/socket_server_tester.py +11 -7
  146. atomicshop/wrappers/socketw/socket_wrapper.py +717 -116
  147. atomicshop/wrappers/socketw/ssl_base.py +15 -14
  148. atomicshop/wrappers/socketw/statistics_csv.py +148 -17
  149. atomicshop/wrappers/sysmonw.py +1 -1
  150. atomicshop/wrappers/ubuntu_terminal.py +65 -26
  151. atomicshop/wrappers/win_auditw.py +189 -0
  152. atomicshop/wrappers/winregw/__init__.py +0 -0
  153. atomicshop/wrappers/winregw/winreg_installed_software.py +58 -0
  154. atomicshop/wrappers/winregw/winreg_network.py +232 -0
  155. {atomicshop-2.15.11.dist-info → atomicshop-3.10.5.dist-info}/METADATA +31 -51
  156. atomicshop-3.10.5.dist-info/RECORD +306 -0
  157. {atomicshop-2.15.11.dist-info → atomicshop-3.10.5.dist-info}/WHEEL +1 -1
  158. atomicshop/_basics_temp.py +0 -101
  159. atomicshop/a_installs/win/fibratus.py +0 -9
  160. atomicshop/a_installs/win/mongodb.py +0 -9
  161. atomicshop/a_installs/win/pycharm.py +0 -9
  162. atomicshop/addons/a_setup_scripts/install_psycopg2_ubuntu.sh +0 -3
  163. atomicshop/addons/a_setup_scripts/install_pywintrace_0.3.cmd +0 -2
  164. atomicshop/addons/mains/__pycache__/install_fibratus_windows.cpython-312.pyc +0 -0
  165. atomicshop/addons/mains/__pycache__/msi_unpacker.cpython-312.pyc +0 -0
  166. atomicshop/addons/mains/install_docker_rootless_ubuntu.py +0 -11
  167. atomicshop/addons/mains/install_docker_ubuntu_main_sudo.py +0 -11
  168. atomicshop/addons/mains/install_elastic_search_and_kibana_ubuntu.py +0 -10
  169. atomicshop/addons/mains/install_wsl_ubuntu_lts_admin.py +0 -9
  170. atomicshop/addons/package_setup/CreateWheel.cmd +0 -7
  171. atomicshop/addons/package_setup/Setup in Edit mode.cmd +0 -6
  172. atomicshop/addons/package_setup/Setup.cmd +0 -7
  173. atomicshop/archiver/_search_in_zip.py +0 -189
  174. atomicshop/archiver/archiver.py +0 -34
  175. atomicshop/archiver/search_in_archive.py +0 -250
  176. atomicshop/archiver/sevenz_app_w.py +0 -86
  177. atomicshop/archiver/sevenzs.py +0 -44
  178. atomicshop/archiver/zips.py +0 -293
  179. atomicshop/file_types.py +0 -24
  180. atomicshop/mitm/config_editor.py +0 -37
  181. atomicshop/mitm/engines/create_module_template_example.py +0 -13
  182. atomicshop/mitm/initialize_mitm_server.py +0 -268
  183. atomicshop/pbtkmultifile_argparse.py +0 -88
  184. atomicshop/permissions.py +0 -151
  185. atomicshop/script_as_string_processor.py +0 -38
  186. atomicshop/ssh_scripts/process_from_ipv4.py +0 -37
  187. atomicshop/ssh_scripts/process_from_port.py +0 -27
  188. atomicshop/wrappers/_process_wrapper_curl.py +0 -27
  189. atomicshop/wrappers/_process_wrapper_tar.py +0 -21
  190. atomicshop/wrappers/dockerw/install_docker.py +0 -209
  191. atomicshop/wrappers/elasticsearchw/infrastructure.py +0 -265
  192. atomicshop/wrappers/elasticsearchw/install_elastic.py +0 -232
  193. atomicshop/wrappers/ffmpegw.py +0 -125
  194. atomicshop/wrappers/fibratusw/install.py +0 -81
  195. atomicshop/wrappers/mongodbw/infrastructure.py +0 -53
  196. atomicshop/wrappers/mongodbw/install_mongodb.py +0 -190
  197. atomicshop/wrappers/msiw.py +0 -149
  198. atomicshop/wrappers/nodejsw/install_nodejs.py +0 -139
  199. atomicshop/wrappers/process_wrapper_pbtk.py +0 -16
  200. atomicshop/wrappers/psutilw/networks.py +0 -45
  201. atomicshop/wrappers/pycharmw.py +0 -81
  202. atomicshop/wrappers/socketw/base.py +0 -59
  203. atomicshop/wrappers/socketw/get_process.py +0 -107
  204. atomicshop/wrappers/wslw.py +0 -191
  205. atomicshop-2.15.11.dist-info/RECORD +0 -302
  206. /atomicshop/{addons/mains → a_mains}/FACT/factw_fact_extractor_docker_image_main_sudo.py +0 -0
  207. /atomicshop/{addons → a_mains/addons}/PlayWrightCodegen.cmd +0 -0
  208. /atomicshop/{addons → a_mains/addons}/ScriptExecution.cmd +0 -0
  209. /atomicshop/{addons → a_mains/addons}/inits/init_to_import_all_modules.py +0 -0
  210. /atomicshop/{addons → a_mains/addons}/process_list/ReadMe.txt +0 -0
  211. /atomicshop/{addons → a_mains/addons}/process_list/compile.cmd +0 -0
  212. /atomicshop/{addons → a_mains/addons}/process_list/compiled/Win10x64/process_list.dll +0 -0
  213. /atomicshop/{addons → a_mains/addons}/process_list/compiled/Win10x64/process_list.exp +0 -0
  214. /atomicshop/{addons → a_mains/addons}/process_list/compiled/Win10x64/process_list.lib +0 -0
  215. /atomicshop/{addons → a_mains/addons}/process_list/process_list.cpp +0 -0
  216. /atomicshop/{archiver → permissions}/__init__.py +0 -0
  217. /atomicshop/{wrappers/fibratusw → web_apis}/__init__.py +0 -0
  218. /atomicshop/wrappers/{nodejsw → pywin32w/wmis}/__init__.py +0 -0
  219. /atomicshop/wrappers/pywin32w/{wmi_win32process.py → wmis/win32process.py} +0 -0
  220. {atomicshop-2.15.11.dist-info → atomicshop-3.10.5.dist-info/licenses}/LICENSE.txt +0 -0
  221. {atomicshop-2.15.11.dist-info → atomicshop-3.10.5.dist-info}/top_level.txt +0 -0
@@ -1,169 +1,235 @@
1
1
  import os
2
2
  import sys
3
3
 
4
- from . import creator, base, socket_client
4
+ from cryptography import x509
5
+
6
+ from . import creator, socket_base, socket_client
5
7
  from .. import pyopensslw, cryptographyw
6
8
  from ..certauthw.certauthw import CertAuthWrapper
7
9
  from ...print_api import print_api
10
+ from ... import filesystem
11
+
12
+
13
+ class Certificator:
14
+ """
15
+ Certificator class is used to create and manage certificates, wrapping ssl contexts and sockets.
16
+ """
17
+ def __init__(
18
+ self,
19
+ ca_certificate_name: str,
20
+ ca_certificate_filepath: str,
21
+ default_server_certificate_usage: bool,
22
+ default_server_certificate_name: str,
23
+ default_server_certificate_directory: str,
24
+ default_certificate_domain_list: list,
25
+ sni_server_certificates_cache_directory: str,
26
+ sni_get_server_certificate_from_server_socket: bool,
27
+ sni_server_certificate_from_server_socket_download_directory: str,
28
+ custom_server_certificate_usage: bool,
29
+ custom_server_certificate_path: str,
30
+ custom_private_key_path: str,
31
+ forwarding_dns_service_ipv4_list___only_for_localhost: list,
32
+ skip_extension_id_list: list,
33
+ tls: bool,
34
+ enable_sslkeylogfile_env_to_client_ssl_context: bool,
35
+ sslkeylog_file_path: str
36
+ ):
37
+ self.ca_certificate_name = ca_certificate_name
38
+ self.ca_certificate_filepath = ca_certificate_filepath
39
+ self.default_server_certificate_usage = default_server_certificate_usage
40
+ self.default_server_certificate_name = default_server_certificate_name
41
+ self.default_server_certificate_directory = default_server_certificate_directory
42
+ self.default_certificate_domain_list = default_certificate_domain_list
43
+ self.sni_server_certificates_cache_directory = sni_server_certificates_cache_directory
44
+ self.sni_get_server_certificate_from_server_socket = sni_get_server_certificate_from_server_socket
45
+ self.sni_server_certificate_from_server_socket_download_directory = (
46
+ sni_server_certificate_from_server_socket_download_directory)
47
+ self.custom_server_certificate_usage = custom_server_certificate_usage
48
+ self.custom_server_certificate_path = custom_server_certificate_path
49
+ self.custom_private_key_path = custom_private_key_path
50
+ self.forwarding_dns_service_ipv4_list___only_for_localhost = (
51
+ forwarding_dns_service_ipv4_list___only_for_localhost)
52
+ self.skip_extension_id_list = skip_extension_id_list
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
57
+
58
+ # noinspection PyTypeChecker
59
+ self.certauth_wrapper: CertAuthWrapper = None
60
+
61
+ def initialize_certauth_create_use_ca_certificate(self, server_certificate_directory: str):
62
+ """
63
+ Initialize CertAuthWrapper and create CA certificate if it doesn't exist.
64
+ :return:
65
+ """
66
+ # Initialize CertAuthWrapper.
67
+ certauth_wrapper = CertAuthWrapper(
68
+ ca_certificate_name=self.ca_certificate_name,
69
+ ca_certificate_filepath=self.ca_certificate_filepath,
70
+ server_certificate_directory=server_certificate_directory
71
+ )
8
72
 
9
-
10
- # noinspection PyTypeChecker
11
- CERTAUTH_WRAPPER: CertAuthWrapper = None
12
-
13
-
14
- def initialize_certauth_create_use_ca_certificate(config: dict):
15
- # Initialize CertAuthWrapper.
16
- if config['certificates']['default_server_certificate_usage']:
17
- server_certificate_directory = config['certificates']['default_server_certificate_directory']
18
- else:
19
- server_certificate_directory = config['certificates']['sni_server_certificates_cache_directory']
20
-
21
- certauth_wrapper = CertAuthWrapper(
22
- ca_certificate_name=config['certificates']['ca_certificate_name'],
23
- ca_certificate_filepath=config['certificates']['ca_certificate_filepath'],
24
- server_certificate_directory=server_certificate_directory
25
- )
26
-
27
- # Create CA certificate if it doesn't exist.
28
- certauth_wrapper.create_use_ca_certificate()
29
-
30
- return certauth_wrapper
31
-
32
-
33
- # noinspection PyTypeChecker
34
- def select_server_ssl_context_certificate(config: dict, print_kwargs: dict = None):
35
- # We need to nullify the variable, since we have several checks if the variable was set or not.
36
- server_certificate_file_path: str = None
37
- server_private_key_file_path: str = None
38
-
39
- # Creating if non-existent/overwriting default server certificate.
40
- # 'server_certificate_filepath' will be assigned there.
41
- if config['certificates']['default_server_certificate_usage']:
42
- server_certificate_file_path, default_server_certificate_san = \
43
- create_overwrite_default_server_certificate_ca_signed(config=config)
44
-
45
- # Check if default certificate was created.
46
- if server_certificate_file_path:
47
- message = f"Default Server Certificate was created / overwritten: {server_certificate_file_path}"
48
- print_api(message, **print_kwargs)
49
-
50
- message = \
51
- f"Default Server Certificate current 'Subject Alternative Names': {default_server_certificate_san}"
52
- print_api(message, **print_kwargs)
53
- else:
54
- message = f"Couldn't create / overwrite Default Server Certificate: {server_certificate_file_path}"
55
- print_api(message, error_type=True, logger_method='critical', **print_kwargs)
56
- sys.exit()
73
+ # Create CA certificate if it doesn't exist.
74
+ certauth_wrapper.create_use_ca_certificate()
75
+
76
+ return certauth_wrapper
77
+
78
+ # noinspection PyTypeChecker
79
+ def select_server_ssl_context_certificate(
80
+ self,
81
+ print_kwargs: dict = None
82
+ ):
83
+ """
84
+ This function selects between the default certificate and custom certificate for the sll context.
85
+ Returns the selected certificate file path and the private key file path.
86
+ """
87
+ # We need to nullify the variable, since we have several checks if the variable was set or not.
88
+ server_certificate_file_path: str = None
89
+ server_private_key_file_path: str = None
90
+
91
+ # Creating if non-existent/overwriting default server certificate.
92
+ if self.default_server_certificate_usage:
93
+ # Creating if non-existent/overwriting default server certificate.
94
+ server_certificate_file_path, default_server_certificate_san = \
95
+ self.create_overwrite_default_server_certificate_ca_signed()
96
+
97
+ # Check if default certificate was created.
98
+ if server_certificate_file_path:
99
+ message = f"Default Server Certificate was created / overwritten: {server_certificate_file_path}"
100
+ print_api(message, **(print_kwargs or {}))
101
+
102
+ message = \
103
+ f"Default Server Certificate current 'Subject Alternative Names': {default_server_certificate_san}"
104
+ print_api(message, **(print_kwargs or {}))
105
+ else:
106
+ message = f"Couldn't create / overwrite Default Server Certificate: {server_certificate_file_path}"
107
+ print_api(message, error_type=True, logger_method='critical', **(print_kwargs or {}))
108
+ sys.exit()
57
109
 
58
110
  # Assigning 'certificate_path' to 'custom_certificate_path' if usage was set.
59
- if config['certificates']['custom_server_certificate_usage']:
60
- server_certificate_file_path = config['certificates']['custom_server_certificate_path']
111
+ if self.custom_server_certificate_usage:
112
+ server_certificate_file_path = self.custom_server_certificate_path
61
113
  # Since 'ssl_context.load_cert_chain' uses 'keypath' as 'None' if certificate contains private key.
62
114
  # We'd like to leave it that way and don't fetch empty string from 'config'.
63
- if config['certificates']['custom_private_key_path']:
64
- server_private_key_file_path = config['certificates']['custom_private_key_path']
65
-
66
- return server_certificate_file_path, server_private_key_file_path
67
-
115
+ if self.custom_private_key_path:
116
+ server_private_key_file_path = self.custom_private_key_path
68
117
 
69
- def create_overwrite_default_server_certificate_ca_signed(config: dict):
70
- global CERTAUTH_WRAPPER
71
- CERTAUTH_WRAPPER = initialize_certauth_create_use_ca_certificate(config=config)
118
+ return server_certificate_file_path, server_private_key_file_path
72
119
 
73
- domain_list = config['certificates']['domains_all_times']
74
- server_certificate_file_name_no_extension = config['certificates']['default_server_certificate_name']
120
+ def create_overwrite_default_server_certificate_ca_signed(self):
121
+ """
122
+ Create or overwrite default server certificate.
123
+ :return:
124
+ """
75
125
 
76
- server_certificate_file_path, default_server_certificate_san = \
77
- CERTAUTH_WRAPPER.create_overwrite_server_certificate_ca_signed_return_path_and_san(
78
- domain_list=domain_list,
79
- server_certificate_file_name_no_extension=server_certificate_file_name_no_extension
126
+ self.certauth_wrapper = self.initialize_certauth_create_use_ca_certificate(
127
+ server_certificate_directory=self.default_server_certificate_directory
80
128
  )
81
129
 
82
- return server_certificate_file_path, default_server_certificate_san
83
-
84
-
85
- def create_use_sni_server_certificate_ca_signed(sni_received_dict: dict, config: dict, print_kwargs: dict = None):
86
- global CERTAUTH_WRAPPER
87
-
88
- # === Connect to the domain and get the certificate. ===========================================================
89
- certificate_from_socket_x509 = None
90
- if config['certificates']['sni_get_server_certificate_from_server_socket']:
91
- # Generate PEM certificate file path string for downloaded certificates. Signed certificates will go to the
92
- # 'certs' folder.
93
- certificate_from_socket_file_path: str = \
94
- config['certificates']['sni_server_certificate_from_server_socket_download_directory'] + \
95
- os.sep + sni_received_dict['destination_name'] + ".pem"
96
- # Get client ip.
97
- client_ip = base.get_source_address_from_socket(sni_received_dict['ssl_socket'])[0]
98
-
99
- # If we're on localhost, then use external services list in order to resolve the domain:
100
- if client_ip == "127.0.0.1":
101
- service_client = socket_client.SocketClient(
102
- service_name=sni_received_dict['destination_name'],
103
- service_port=base.get_destination_address_from_socket(sni_received_dict['ssl_socket'])[1],
104
- dns_servers_list=config['tcp']['forwarding_dns_service_ipv4_list___only_for_localhost'])
105
- # If we're not on localhost, then connect to domain directly.
106
- else:
107
- service_client = socket_client.SocketClient(
108
- service_name=sni_received_dict['destination_name'],
109
- service_port=base.get_destination_address_from_socket(sni_received_dict['ssl_socket'])[1])
110
-
111
- # Get certificate from socket and convert to X509 cryptography module object.
112
- certificate_from_socket_x509_cryptography_object = service_client.get_certificate_from_server(
113
- save_as_file=True, cert_file_path=certificate_from_socket_file_path, cert_output_type='cryptography'
114
- )
130
+ server_certificate_file_name_no_extension = self.default_server_certificate_name
115
131
 
116
- # skip_extensions = ['1.3.6.1.5.5.7.3.2', '2.5.29.31', '1.3.6.1.5.5.7.1.1']
117
-
118
- # If certificate was downloaded successfully, then remove extensions if they were provided.
119
- # If certificate was downloaded successfully and no extensions to skip were provided, then use it as is.
120
- if certificate_from_socket_x509_cryptography_object and config['skip_extensions']:
121
- # Copy extensions from old certificate to new certificate, without specified extensions.
122
- certificate_from_socket_x509_cryptography_object, _ = \
123
- cryptographyw.copy_extensions_from_old_cert_to_new_cert(
124
- certificate_from_socket_x509_cryptography_object,
125
- skip_extensions=config['skip_extensions'],
126
- print_kwargs=print_kwargs
132
+ server_certificate_file_path, default_server_certificate_san = \
133
+ self.certauth_wrapper.create_overwrite_server_certificate_ca_signed_return_path_and_san(
134
+ domain_list=self.default_certificate_domain_list,
135
+ server_certificate_file_name_no_extension=server_certificate_file_name_no_extension
136
+ )
137
+
138
+ return server_certificate_file_path, default_server_certificate_san
139
+
140
+ def create_use_sni_server_certificate_ca_signed(
141
+ self,
142
+ sni_received_parameters,
143
+ print_kwargs: dict = None
144
+ ):
145
+ # === Connect to the domain and get the certificate. ===========================================================
146
+ certificate_from_socket_x509 = None
147
+ if self.sni_get_server_certificate_from_server_socket:
148
+ # Generate PEM certificate file path string for downloaded certificates. Signed certificates will go to the
149
+ # 'certs' folder.
150
+ certificate_from_socket_file_path: str = \
151
+ self.sni_server_certificate_from_server_socket_download_directory + \
152
+ os.sep + sni_received_parameters.destination_name + ".pem"
153
+ # Get client ip.
154
+ client_ip = socket_base.get_source_address_from_socket(sni_received_parameters.ssl_socket)[0]
155
+
156
+ # If we're on localhost, then use external services list in order to resolve the domain:
157
+ if client_ip in socket_base.THIS_DEVICE_IP_LIST:
158
+ service_client = socket_client.SocketClient(
159
+ service_name=sni_received_parameters.destination_name,
160
+ service_port=socket_base.get_destination_address_from_socket(sni_received_parameters.ssl_socket)[1],
161
+ tls=self.tls,
162
+ dns_servers_list=self.forwarding_dns_service_ipv4_list___only_for_localhost,
163
+ logger=print_kwargs.get('logger') if print_kwargs else None
164
+ )
165
+ # If we're not on localhost, then connect to domain directly.
166
+ else:
167
+ service_client = socket_client.SocketClient(
168
+ service_name=sni_received_parameters.destination_name,
169
+ service_port=socket_base.get_destination_address_from_socket(sni_received_parameters.ssl_socket)[1],
170
+ tls=self.tls,
171
+ logger=print_kwargs.get('logger') if print_kwargs else None
127
172
  )
128
173
 
129
- # If certificate was downloaded successfully, then convert it to pyopenssl object.
130
- if certificate_from_socket_x509_cryptography_object:
131
- # Convert X509 cryptography module object to pyopenssl, since certauth uses pyopenssl.
132
- certificate_from_socket_x509 = \
133
- pyopensslw.convert_cryptography_object_to_pyopenssl(certificate_from_socket_x509_cryptography_object)
134
-
135
- # === EOF Get certificate from the domain. =====================================================================
136
-
137
- # If CertAuthWrapper wasn't initialized yet, it means that CA wasn't created/loaded yet.
138
- if not CERTAUTH_WRAPPER:
139
- CERTAUTH_WRAPPER = initialize_certauth_create_use_ca_certificate(config=config)
140
- # try:
141
- # Create if non-existent / read existing server certificate.
142
- sni_server_certificate_file_path = CERTAUTH_WRAPPER.create_read_server_certificate_ca_signed(
143
- sni_received_dict['destination_name'], certificate_from_socket_x509)
144
-
145
- message = f"SNI Handler: port " \
146
- f"{base.get_destination_address_from_socket(sni_received_dict['ssl_socket'])[1]}: " \
147
- f"Using certificate: {sni_server_certificate_file_path}"
148
- print_api(message, **print_kwargs)
149
-
150
- # except Exception as e:
151
- # message = \
152
- # f"SNI Handler: Undocumented exception while creating / using certificate for a domain: {e}"
153
- # print_api(
154
- # message, error_type=True, logger_method="critical", traceback_string=True, oneline=True,
155
- # logger=self.logger)
156
- # pass
157
-
158
- # try:
159
- # You need to build new context and exchange the context that being inherited from the main socket,
160
- # or else the context will receive previous certificate each time.
161
- sni_received_dict['ssl_socket'].context = \
162
- creator.create_server_ssl_context___load_certificate_and_key(sni_server_certificate_file_path, None)
163
- # except Exception as e:
164
- # message = \
165
- # f"SNI Handler: Undocumented exception while creating and assigning new SSLContext: {e}"
166
- # print_api(
167
- # message, error_type=True, logger_method="critical", traceback_string=True, oneline=True,
168
- # logger=self.logger)
169
- # pass
174
+ # If certificate from socket exists, then we don't need to get it from the socket and write to file.
175
+ # and we will return None, since no certificate was fetched.
176
+ # noinspection PyTypeChecker
177
+ certificate_from_socket_x509_cryptography_object: x509.Certificate = None
178
+ if not filesystem.is_file_exists(certificate_from_socket_file_path):
179
+ print_api("Certificate from socket doesn't exist, fetching.", **(print_kwargs or {}))
180
+ # Get certificate from socket and convert to X509 cryptography module object.
181
+ certificate_from_socket_x509_cryptography_object: x509.Certificate = (
182
+ service_client.get_certificate_from_server(
183
+ save_as_file=True, cert_file_path=certificate_from_socket_file_path,
184
+ cert_output_type='cryptography')
185
+ )
186
+ else:
187
+ print_api("The Certificate from socket already exists, not fetching", **(print_kwargs or {}))
188
+ certificate_from_socket_x509_cryptography_object: x509.Certificate = (
189
+ cryptographyw.convert_object_to_x509(certificate_from_socket_file_path))
190
+
191
+ # skip_extensions = ['1.3.6.1.5.5.7.3.2', '2.5.29.31', '1.3.6.1.5.5.7.1.1']
192
+
193
+ # If certificate was downloaded successfully, then remove extensions if they were provided.
194
+ # If certificate was downloaded successfully and no extensions to skip were provided, then use it as is.
195
+ if certificate_from_socket_x509_cryptography_object and self.skip_extension_id_list:
196
+ # Copy extensions from old certificate to new certificate, without specified extensions.
197
+ certificate_from_socket_x509_cryptography_object, _ = \
198
+ cryptographyw.copy_extensions_from_old_cert_to_new_cert(
199
+ certificate_from_socket_x509_cryptography_object,
200
+ skip_extensions=self.skip_extension_id_list,
201
+ print_kwargs=print_kwargs
202
+ )
203
+
204
+ # If certificate was downloaded successfully, then convert it to pyopenssl object.
205
+ if certificate_from_socket_x509_cryptography_object:
206
+ # Convert X509 cryptography module object to pyopenssl, since certauth uses pyopenssl.
207
+ certificate_from_socket_x509 = \
208
+ pyopensslw.convert_cryptography_object_to_pyopenssl(
209
+ certificate_from_socket_x509_cryptography_object)
210
+
211
+ # === EOF Get certificate from the domain. =====================================================================
212
+
213
+ # If CertAuthWrapper wasn't initialized yet, it means that CA wasn't created/loaded yet.
214
+ if not self.certauth_wrapper:
215
+ self.certauth_wrapper = self.initialize_certauth_create_use_ca_certificate(
216
+ server_certificate_directory=self.sni_server_certificates_cache_directory)
217
+ # try:
218
+ # Create if non-existent / read existing server certificate.
219
+ sni_server_certificate_file_path = self.certauth_wrapper.create_read_server_certificate_ca_signed(
220
+ sni_received_parameters.destination_name, certificate_from_socket_x509)
221
+
222
+ message = f"SNI Handler: port " \
223
+ f"{socket_base.get_destination_address_from_socket(sni_received_parameters.ssl_socket)[1]}: " \
224
+ f"Using certificate: {sni_server_certificate_file_path}"
225
+ print_api(message, **print_kwargs)
226
+
227
+ # You need to build new context and exchange the context that being inherited from the main socket,
228
+ # or else the context will receive previous certificate each time.
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
+ )