Feat: 支持navicat连接MongoDB SSL连接

pull/9632/head
jiangweidong 2 years ago
parent ec582e37dc
commit 6cedb90f1b

@ -1,4 +1,5 @@
import os
import shutil
import time
import winreg
@ -29,11 +30,19 @@ class AppletApplication(BaseApplication):
self.port = self.asset.get_protocol_port(self.protocol)
self.db = self.asset.spec_info.db_name
self.name = '%s-%s-%s' % (self.host, self.db, int(time.time()))
self.use_ssl = self.asset.spec_info.use_ssl
self.client_key = self.asset.secret_info.client_key
self.client_key_path = None
self.pid = None
self.app = None
@staticmethod
def clean_up():
def get_cert_path():
win_user_name = win32api.GetUserName()
cert_path = r'C:\Users\%s\AppData\Roaming\Navicat\certs' % win_user_name
return cert_path
def clean_up(self):
protocols = (
'NavicatMARIADB', 'NavicatMONGODB', 'Navicat',
'NavicatORA', 'NavicatMSSQL', 'NavicatPG'
@ -44,10 +53,21 @@ class AppletApplication(BaseApplication):
win32api.RegDeleteTree(winreg.HKEY_CURRENT_USER, sub_key)
except Exception:
pass
cert_path = self.get_cert_path()
shutil.rmtree(cert_path, ignore_errors=True)
def gen_asset_file(self):
if self.use_ssl and self.client_key:
cert_path = self.get_cert_path()
if not os.path.exists(cert_path):
os.makedirs(cert_path, exist_ok=True)
filepath = os.path.join(cert_path, str(int(time.time())))
with open(filepath, 'w') as f:
f.write(self.client_key)
self.client_key_path = filepath
def launch(self):
# 清理因为异常未关闭的会话历史记录
self.clean_up()
@staticmethod
def edit_regedit():
sub_key = r'Software\PremiumSoft\NavicatPremium'
try:
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, sub_key)
@ -60,6 +80,14 @@ class AppletApplication(BaseApplication):
except Exception as err:
print('Launch error: %s' % err)
def launch(self):
# 清理因为异常未关闭的会话历史记录
self.clean_up()
# 生成资产依赖的相关文件
self.gen_asset_file()
# 修改注册表,达到一些配置目的
self.edit_regedit()
@staticmethod
def _exec_commands(commands):
for command in commands:
@ -67,6 +95,7 @@ class AppletApplication(BaseApplication):
if not pre_check():
_messageBox('程序启动异常,请重新连接!!', 'Error', win32con.MB_DEFAULT_DESKTOP_ONLY)
return
time.sleep(0.5)
if command['type'] == 'key':
send_keys(' '.join(command['commands']))
@ -81,11 +110,11 @@ class AppletApplication(BaseApplication):
return False
return True
def _action_not_remember_password(self):
conn_window = self.app.window(best_match='Dialog'). \
child_window(title_re='New Connection')
remember_checkbox = conn_window.child_window(best_match='Save password')
remember_checkbox.click()
def _action_ele_click(self, ele_name, conn_win=None):
if not conn_win:
conn_win = self.app.window(best_match='Dialog'). \
child_window(title_re='New Connection')
conn_win.child_window(best_match=ele_name).click()
def _fill_mysql_auth_info(self):
conn_window = self.app.window(best_match='Dialog'). \
@ -114,7 +143,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._fill_mysql_auth_info, self._action_not_remember_password
self._fill_mysql_auth_info, lambda: self._action_ele_click('Save password')
]
},
{
@ -135,7 +164,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._fill_mysql_auth_info, self._action_not_remember_password
self._fill_mysql_auth_info, lambda: self._action_ele_click('Save password')
]
},
{
@ -178,7 +207,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._fill_mongodb_auth_info, self._action_not_remember_password
self._fill_mongodb_auth_info, lambda: self._action_ele_click('Save password')
]
},
{
@ -186,6 +215,29 @@ class AppletApplication(BaseApplication):
'commands': [c.ENTER]
}
]
if self.use_ssl:
ssl_commands = [
{
'type': 'key',
'commands': [c.TAB * 5, c.RIGHT * 3, c.TAB]
},
{
'type': 'action',
'commands': [
lambda: self._action_ele_click('Use SSL'),
lambda: self._action_ele_click('Use authentication'),
]
},
{
'type': 'key',
'commands': [c.TAB, self.client_key_path]
},
{
'type': 'action',
'commands': [lambda: self._action_ele_click('Allow invalid host names')]
}
]
commands = commands[:2] + ssl_commands + commands[2:]
return commands
def _fill_postgresql_auth_info(self):
@ -218,7 +270,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._fill_postgresql_auth_info, self._action_not_remember_password
self._fill_postgresql_auth_info, lambda: self._action_ele_click('Save password')
]
},
{
@ -255,7 +307,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._fill_sqlserver_auth_info, self._action_not_remember_password
self._fill_sqlserver_auth_info, lambda: self._action_ele_click('Save password')
]
},
{
@ -300,7 +352,7 @@ class AppletApplication(BaseApplication):
{
'type': 'action',
'commands': [
self._action_not_remember_password, self._fill_oracle_auth_info
lambda: self._action_ele_click('Save password'), self._fill_oracle_auth_info
]
},
{

@ -103,6 +103,11 @@ class Specific(DictObj):
# database
db_name: str
use_ssl: str
class Secret(DictObj):
client_key: str
class Category(DictObj):
@ -123,6 +128,7 @@ class Asset(DictObj):
protocols: list[Protocol]
category: Category
spec_info: Specific
secret_info: Secret
def get_protocol_port(self, protocol):
for item in self.protocols:

Loading…
Cancel
Save