pgadmin3/dlg/dlgServer.cpp
lsv 0093e3676c Add extend options in connstr.
Для сервера можно добавить дополнительные параметры подключения.
В настройка сервера на закладке "Дополнительно" в поле "Connect str"
2023-10-13 21:29:41 +05:00

752 lines
24 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// dlgServer.cpp - PostgreSQL Database Property
//
//////////////////////////////////////////////////////////////////////////
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "pgAdmin3.h"
// Must be after pgAdmin3.h or MSVC++ complains
#include <wx/colordlg.h>
#include <wx/clrpicker.h>
#include <wx/filepicker.h>
// Other app headers
#include "utils/misc.h"
#include "frm/frmMain.h"
#include "frm/frmHint.h"
#include "dlg/dlgServer.h"
#include "schema/pgDatabase.h"
// pointer to controls
#define txtHostAddr CTRL_TEXT("txtHostAddr")
#define txtDescription CTRL_TEXT("txtDescription")
#define txtService CTRL_TEXT("txtService")
#define txtServiceID CTRL_TEXT("txtServiceID")
#define cbDatabase CTRL_COMBOBOX("cbDatabase")
#define txtPort CTRL_TEXT("txtPort")
#define cbSSL CTRL_COMBOBOX("cbSSL")
#define txtUsername CTRL_TEXT("txtUsername")
#define stTryConnect CTRL_STATIC("stTryConnect")
#define chkTryConnect CTRL_CHECKBOX("chkTryConnect")
#define stStorePwd CTRL_STATIC("stStorePwd")
#define chkStorePwd CTRL_CHECKBOX("chkStorePwd")
#define txtRolename CTRL_TEXT("txtRolename")
#define txtConnStr CTRL_TEXT("txtConnStr")
#define stRestore CTRL_STATIC("stRestore")
#define chkRestore CTRL_CHECKBOX("chkRestore")
#define stPassword CTRL_STATIC("stPassword")
#define txtPassword CTRL_TEXT("txtPassword")
#define txtDbRestriction CTRL_TEXT("txtDbRestriction")
#define colourPicker CTRL_COLOURPICKER("colourPicker")
#define cbGroup CTRL_COMBOBOX("cbGroup")
#define pickerSSLCert CTRL_FILEPICKER("pickerSSLCert")
#define pickerSSLKey CTRL_FILEPICKER("pickerSSLKey")
#define pickerSSLRootCert CTRL_FILEPICKER("pickerSSLRootCert")
#define pickerSSLCrl CTRL_FILEPICKER("pickerSSLCrl")
#define chkSSLCompression CTRL_CHECKBOX("chkSSLCompression")
#define nbNotebook CTRL_NOTEBOOK("nbNotebook")
// SSH Tunnel Tab
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
#define chkSSHTunnel CTRL_CHECKBOX("chkSSHTunnel")
#define txtTunnelHost CTRL_TEXT("txtTunnelHost")
#define txtTunnelUsername CTRL_TEXT("txtTunnelUsername")
#define radioBtnPassword CTRL_RADIOBUTTON("radioBtnPassword")
#define radioBtnKeyfile CTRL_RADIOBUTTON("radioBtnKeyfile")
#define txtTunnelPassword CTRL_TEXT("txtTunnelPassword")
#define pickerPublicKeyFile CTRL_FILEPICKER("pickerPublicKeyFile")
#define pickerIdentityFile CTRL_FILEPICKER("pickerIdentityFile")
#define stPublicKeyFile CTRL_STATIC("stPublicKeyFile")
#define txtTunnelPort CTRL_TEXT("txtTunnelPort")
#endif
BEGIN_EVENT_TABLE(dlgServer, dlgProperty)
EVT_NOTEBOOK_PAGE_CHANGED(XRCID("nbNotebook"), dlgServer::OnPageSelect)
EVT_TEXT(XRCID("txtHostAddr"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtDescription"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtService"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtServiceID"), dlgProperty::OnChange)
EVT_TEXT(XRCID("cbDatabase"), dlgProperty::OnChange)
EVT_COMBOBOX(XRCID("cbDatabase"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtPort") , dlgProperty::OnChange)
EVT_TEXT(XRCID("txtUsername"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtRolename"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtConnStr"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtDbRestriction"), dlgServer::OnChangeRestr)
EVT_COMBOBOX(XRCID("cbSSL"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkStorePwd"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkRestore"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkTryConnect"), dlgServer::OnChangeTryConnect)
EVT_COLOURPICKER_CHANGED(XRCID("colourPicker"), dlgServer::OnChangeColour)
EVT_FILEPICKER_CHANGED(XRCID("pickerSSLCert"), dlgServer::OnChangeFile)
EVT_FILEPICKER_CHANGED(XRCID("pickerSSLKey"), dlgServer::OnChangeFile)
EVT_FILEPICKER_CHANGED(XRCID("pickerSSLRootCert"), dlgServer::OnChangeFile)
EVT_FILEPICKER_CHANGED(XRCID("pickerSSLCrl"), dlgServer::OnChangeFile)
EVT_TEXT(XRCID("cbGroup"), dlgProperty::OnChange)
EVT_COMBOBOX(XRCID("cbGroup"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkSSLCompression"), dlgProperty::OnChange)
EVT_BUTTON(wxID_OK, dlgServer::OnOK)
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
EVT_TEXT(XRCID("txtTunnelHost"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtTunnelUsername"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkSSHTunnel"), dlgServer::OnCheckSSHTunnel)
EVT_RADIOBUTTON(XRCID("radioBtnPassword"), dlgServer::OnChangeAuthOption)
EVT_RADIOBUTTON(XRCID("radioBtnKeyfile"), dlgServer::OnChangeAuthOption)
EVT_TEXT(XRCID("txtTunnelPort"), dlgProperty::OnChange)
#endif
END_EVENT_TABLE();
dlgProperty *pgServerFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent)
{
return new dlgServer(this, frame, (pgServer *)node);
}
dlgServer::dlgServer(pgaFactory *f, frmMain *frame, pgServer *node)
: dlgProperty(f, frame, wxT("dlgServer"))
{
server = node;
dbRestrictionOk = true;
cbDatabase->Append(wxT("postgres"));
cbDatabase->Append(wxT("edb"));
cbDatabase->Append(wxT("template1"));
wxString lastDB = settings->GetLastDatabase();
if (lastDB != wxT("postgres") && lastDB != wxT("edb") && lastDB != wxT("template1"))
cbDatabase->Append(lastDB);
cbDatabase->SetSelection(0);
txtPort->SetValue(NumToStr((long)settings->GetLastPort()));
if (!cbSSL->GetValue().IsEmpty())
cbSSL->SetSelection(settings->GetLastSSL());
txtUsername->SetValue(settings->GetLastUsername());
chkTryConnect->SetValue(true);
chkStorePwd->SetValue(true);
chkRestore->SetValue(true);
if (node)
{
chkTryConnect->SetValue(false);
chkTryConnect->Disable();
}
// Fill the group combobox
cbGroup->Append(_("Servers"));
ctlTree *browser = frame->GetBrowser();
wxTreeItemId groupitem;
wxTreeItemIdValue groupcookie, servercookie;
pgServer *firstserver;
if (browser->ItemHasChildren(browser->GetRootItem()))
{
groupitem = browser->GetFirstChild(browser->GetRootItem(), groupcookie);
while (groupitem)
{
firstserver = (pgServer *)browser->GetObject(browser->GetFirstChild(groupitem, servercookie));
if (firstserver && !firstserver->GetGroup().IsEmpty() && firstserver->GetGroup() != _("Servers"))
cbGroup->Append(firstserver->GetGroup());
groupitem = browser->GetNextChild(browser->GetRootItem(), groupcookie);
}
}
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
EnableSSHTunnelControls(false);
radioBtnPassword->SetValue(true);
radioBtnKeyfile->SetValue(false);
txtTunnelPassword->SetMaxLength(SSH_MAX_PASSWORD_LEN);
txtTunnelPort->SetValue(NumToStr((long)DEFAULT_SSH_PORT));
#ifdef HAVE_OPENSSL_CRYPTO
stPublicKeyFile->Show(false);
pickerPublicKeyFile->Show(false);
#endif
#else
for(size_t i = 0; i < nbNotebook->GetPageCount(); i++)
{
if(nbNotebook->GetPageText(i).compare(wxT("SSH Tunnel")) == 0)
{
nbNotebook->RemovePage(i);
}
}
#endif
}
dlgServer::~dlgServer()
{
if (!server)
{
settings->SetLastDatabase(cbDatabase->GetValue());
settings->SetLastPort(StrToLong(txtPort->GetValue()));
settings->SetLastSSL(cbSSL->GetCurrentSelection());
settings->SetLastUsername(txtUsername->GetValue());
}
}
pgObject *dlgServer::GetObject()
{
return server;
}
void dlgServer::OnOK(wxCommandEvent &ev)
{
#ifdef __WXGTK__
if (!btnOK->IsEnabled())
return;
#endif
// Display the 'save password' hint if required
if(chkStorePwd->GetValue())
{
if (frmHint::ShowHint(this, HINT_SAVING_PASSWORDS) == wxID_CANCEL)
return;
}
// notice: changes active after reconnect
EnableOK(false);
if (server)
{
server->iSetName(GetName());
server->iSetHostAddr(txtHostAddr->GetValue());
server->iSetDescription(txtDescription->GetValue());
server->iSetService(txtService->GetValue());
if (txtServiceID->GetValue() != server->GetServiceID())
{
mainForm->StartMsg(_("Checking server status"));
server->iSetServiceID(txtServiceID->GetValue());
mainForm->EndMsg();
}
server->iSetPort(StrToLong(txtPort->GetValue()));
server->iSetSSL(cbSSL->GetCurrentSelection());
server->iSetDatabase(cbDatabase->GetValue());
server->iSetUsername(txtUsername->GetValue());
server->iSetRolename(txtRolename->GetValue());
server->iSetConnStr(txtConnStr->GetValue());
server->iSetStorePwd(chkStorePwd->GetValue());
server->iSetRestore(chkRestore->GetValue());
server->iSetDbRestriction(txtDbRestriction->GetValue().Trim());
server->SetSSLCert(pickerSSLCert->GetPath());
server->SetSSLKey(pickerSSLKey->GetPath());
server->SetSSLRootCert(pickerSSLRootCert->GetPath());
server->SetSSLCrl(pickerSSLCrl->GetPath());
server->iSetSSLCompression(chkSSLCompression->GetValue());
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
server->iSetSSHTunnel(chkSSHTunnel->GetValue());
server->iSetTunnelPort(StrToLong(txtTunnelPort->GetValue()));
server->SetTunnelHost(txtTunnelHost->GetValue());
server->SetTunnelUserName(txtTunnelUsername->GetValue());
server->iSetAuthModePwd(radioBtnPassword->GetValue());
server->SetTunnelPassword(txtTunnelPassword->GetValue());
server->SetPublicKeyFile(pickerPublicKeyFile->GetPath());
server->SetIdentityFile(pickerIdentityFile->GetPath());
#endif
wxColour colour = colourPicker->GetColour();
wxString sColour = colour.GetAsString(wxC2S_HTML_SYNTAX);
server->iSetColour(sColour);
if (cbGroup->GetValue().IsEmpty())
cbGroup->SetValue(_("Servers"));
if (server->GetGroup() != cbGroup->GetValue())
{
ctlTree *browser = mainForm->GetBrowser();
wxTreeItemId oldgroupitem, groupitem, serveritem;
wxTreeItemIdValue groupcookie;
bool found;
int total;
wxString label, oldgroupname;
// Duplicate server object
pgServer *newserver = new pgServer(
server->GetName(),
server->GetHostAddr(),
server->GetDescription(),
server->GetService(),
server->GetDatabaseName(),
server->GetUsername(),
server->GetPort(),
server->GetStorePwd(),
server->GetRolename(),
server->GetConnStr(),
server->GetRestore(),
server->GetSSL(),
server->GetColour(),
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
server->GetGroup(),
server->GetSSHTunnel(),
server->GetTunnelHost(),
server->GetTunnelUserName(),
server->GetAuthModePwd(),
server->GetTunnelPassword(),
server->GetPublicKeyFile(),
server->GetIdentityFile(),
server->GetTunnelPort());
#else
server->GetGroup());
#endif
newserver->iSetDbRestriction(server->GetDbRestriction().Trim());
newserver->iSetServiceID(server->GetServiceID().Trim());
newserver->iSetDiscoveryID(server->GetDiscoveryID().Trim());
newserver->SetSSLCert(server->GetSSLCert());
newserver->SetSSLKey(server->GetSSLKey());
newserver->SetSSLRootCert(server->GetSSLRootCert());
newserver->SetSSLCrl(server->GetSSLCrl());
newserver->iSetSSLCompression(server->GetSSLCompression());
// Drop the old item
// (will also take care of dropping the pgServer item)
oldgroupitem = browser->GetItemParent(item);
oldgroupname = server->GetGroup();
if (oldgroupname.IsEmpty())
oldgroupname = _("Servers");
browser->Delete(item);
// Move the item
found = false;
if (browser->ItemHasChildren(browser->GetRootItem()))
{
groupitem = browser->GetFirstChild(browser->GetRootItem(), groupcookie);
while (!found && groupitem)
{
if (browser->GetItemText(groupitem).StartsWith(cbGroup->GetValue()))
found = true;
else
groupitem = browser->GetNextChild(browser->GetRootItem(), groupcookie);
}
}
if (!found)
{
groupitem = browser->AppendItem(browser->GetRootItem(), cbGroup->GetValue(), browser->GetItemImage(browser->GetRootItem()));
browser->SortChildren(browser->GetRootItem());
}
serveritem = browser->AppendItem(groupitem, newserver->GetFullName(), newserver->GetIconId(), -1, newserver);
browser->SortChildren(groupitem);
browser->Expand(groupitem);
browser->SelectItem(serveritem);
// Count the number of items in the old group item
total = browser->GetChildrenCount(oldgroupitem, false);
if (total == 0)
browser->Delete(oldgroupitem);
else
{
label = oldgroupname + wxT(" (") + NumToStr((long)total) + wxT(")");
browser->SetItemText(oldgroupitem, label);
}
// Count the number of items in the new group item
total = browser->GetChildrenCount(groupitem, false);
label = cbGroup->GetValue() + wxT(" (") + NumToStr((long)total) + wxT(")");
browser->SetItemText(groupitem, label);
// Re-initialize old variables to have their new meanings
server = newserver;
item = serveritem;
}
server->iSetGroup(cbGroup->GetValue());
mainForm->execSelChange(server->GetId(), true);
mainForm->GetBrowser()->SetItemText(item, server->GetFullName());
mainForm->SetItemBackgroundColour(item, wxColour(server->GetColour()));
mainForm->StoreServers();
}
if (IsModal())
{
EndModal(wxID_OK);
return;
}
else
Destroy();
}
void dlgServer::OnChangeColour(wxColourPickerEvent &ev)
{
dlgProperty::OnChange(ev);
}
void dlgServer::OnChangeFile(wxFileDirPickerEvent &ev)
{
dlgProperty::OnChange(ev);
}
void dlgServer::OnChangeRestr(wxCommandEvent &ev)
{
if (!connection || txtDbRestriction->GetValue().IsEmpty())
dbRestrictionOk = true;
else
{
wxString sql = wxT("EXPLAIN SELECT 1 FROM pg_database\n")
wxT("WHERE datname IN (") + txtDbRestriction->GetValue() + wxT(")");
wxLogNull nix;
wxString result = connection->ExecuteScalar(sql);
dbRestrictionOk = !result.IsEmpty();
}
dlgProperty::OnChange(ev);
}
void dlgServer::OnPageSelect(wxNotebookEvent &event)
{
// to prevent dlgProperty from catching it
}
wxString dlgServer::GetHelpPage() const
{
return wxT("connect");
}
int dlgServer::GoNew()
{
if (cbSSL->GetValue().IsEmpty())
return Go(true);
else
{
CheckChange();
return ShowModal();
}
}
int dlgServer::Go(bool modal)
{
chkSSLCompression->Disable();
cbSSL->Clear();
cbSSL->Append(wxT(" "));
#ifdef PG_SSL
cbSSL->Append(_("require"));
cbSSL->Append(_("prefer"));
if (pgConn::GetLibpqVersion() > 7.3)
{
cbSSL->Append(_("allow"));
cbSSL->Append(_("disable"));
}
if (pgConn::GetLibpqVersion() >= 8.4)
{
cbSSL->Append(_("verify-ca"));
cbSSL->Append(_("verify-full"));
}
if (pgConn::GetLibpqVersion() >= 9.2)
{
chkSSLCompression->Enable();
}
#endif
if (server)
{
if (cbDatabase->FindString(server->GetDatabaseName()) < 0)
cbDatabase->Append(server->GetDatabaseName());
txtHostAddr->SetValue(server->GetHostAddr());
txtDescription->SetValue(server->GetDescription());
txtService->SetValue(server->GetService());
txtServiceID->SetValue(server->GetServiceID());
txtPort->SetValue(NumToStr((long)server->GetPort()));
cbSSL->SetSelection(server->GetSSL());
cbDatabase->SetValue(server->GetDatabaseName());
txtUsername->SetValue(server->GetUsername());
chkStorePwd->SetValue(server->GetStorePwd());
txtRolename->SetValue(server->GetRolename());
txtConnStr->SetValue(server->GetConnStr());
chkRestore->SetValue(server->GetRestore());
txtDbRestriction->SetValue(server->GetDbRestriction());
colourPicker->SetColour(server->GetColour());
cbGroup->SetValue(server->GetGroup());
pickerSSLCert->SetPath(server->GetSSLCert());
pickerSSLKey->SetPath(server->GetSSLKey());
pickerSSLRootCert->SetPath(server->GetSSLRootCert());
pickerSSLCrl->SetPath(server->GetSSLCrl());
chkSSLCompression->SetValue(server->GetSSLCompression());
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
chkSSHTunnel->SetValue(server->GetSSHTunnel());
if(server->GetSSHTunnel())
{
chkStorePwd->SetValue(false);
chkStorePwd->Enable(false);
}
txtTunnelPort->SetValue(NumToStr((long)server->GetTunnelPort()));
txtTunnelHost->SetValue(server->GetTunnelHost());
txtTunnelUsername->SetValue(server->GetTunnelUserName());
if (server->GetAuthModePwd())
{
radioBtnPassword->SetValue(true);
radioBtnKeyfile->SetValue(false);
}
else
{
radioBtnPassword->SetValue(false);
radioBtnKeyfile->SetValue(true);
}
txtTunnelPassword->SetValue(server->GetTunnelPassword());
pickerPublicKeyFile->SetPath(server->GetPublicKeyFile());
pickerIdentityFile->SetPath(server->GetIdentityFile());
#endif
stPassword->Disable();
txtPassword->Disable();
if (connection)
{
txtHostAddr->Disable();
txtDescription->Disable();
txtService->Disable();
txtServiceID->Disable();
txtName->Disable();
cbDatabase->Disable();
txtPort->Disable();
cbSSL->Disable();
txtUsername->Disable();
chkStorePwd->Disable();
txtRolename->Disable();
txtConnStr->Disable();
chkRestore->Disable();
txtDbRestriction->Disable();
colourPicker->Disable();
cbGroup->Disable();
pickerSSLCert->Disable();
pickerSSLKey->Disable();
pickerSSLRootCert->Disable();
pickerSSLCrl->Disable();
chkSSLCompression->Disable();
EnableOK(false);
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
chkSSHTunnel->Enable(false);
EnableSSHTunnelControls(false);
}
else
{
if (server->GetSSHTunnel())
{
chkSSHTunnel->Enable(true);
EnableSSHTunnelControls(true);
EnableAuthenticationOptions();
}
#endif
}
}
else
{
SetTitle(_("Add server"));
cbGroup->SetValue(_("Servers"));
wxString colour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW).GetAsString(wxC2S_HTML_SYNTAX);
colourPicker->SetColour(colour);
}
// Call CheckRange to set state on OK button
CheckChange();
return dlgProperty::Go(modal);
}
bool dlgServer::GetTryConnect()
{
return chkTryConnect->GetValue();
}
wxString dlgServer::GetPassword()
{
return txtPassword->GetValue();
}
pgObject *dlgServer::CreateObject(pgCollection *collection)
{
pgServer *obj = NULL;
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
if (chkSSHTunnel->GetValue())
{
obj = new pgServer(GetName(), txtHostAddr->GetValue(), txtDescription->GetValue(),
txtService->GetValue(), cbDatabase->GetValue(),
txtUsername->GetValue(), StrToLong(txtPort->GetValue()),
chkTryConnect->GetValue() && chkStorePwd->GetValue(),
txtRolename->GetValue(), txtConnStr->GetValue(), chkRestore->GetValue(), cbSSL->GetCurrentSelection(),
colourPicker->GetColourString(), cbGroup->GetValue(),
chkSSHTunnel->GetValue(), txtTunnelHost->GetValue(), txtTunnelUsername->GetValue(),
radioBtnPassword->GetValue(),
txtTunnelPassword->GetValue(), pickerPublicKeyFile->GetPath(),
pickerIdentityFile->GetPath(), StrToLong(txtTunnelPort->GetValue()));
}
else
#endif
{
obj = new pgServer(GetName(), txtHostAddr->GetValue(), txtDescription->GetValue(),
txtService->GetValue(), cbDatabase->GetValue(),
txtUsername->GetValue(), StrToLong(txtPort->GetValue()),
chkTryConnect->GetValue() && chkStorePwd->GetValue(),
txtRolename->GetValue(), txtConnStr->GetValue(), chkRestore->GetValue(), cbSSL->GetCurrentSelection(),
colourPicker->GetColourString(), cbGroup->GetValue());
}
obj->iSetDbRestriction(txtDbRestriction->GetValue().Trim());
obj->iSetServiceID(txtServiceID->GetValue());
obj->SetSSLCert(pickerSSLCert->GetTextCtrlValue());
obj->SetSSLKey(pickerSSLKey->GetTextCtrlValue());
obj->SetSSLRootCert(pickerSSLRootCert->GetTextCtrlValue());
obj->SetSSLCrl(pickerSSLCrl->GetTextCtrlValue());
obj->iSetSSLCompression(chkSSLCompression->GetValue());
return obj;
}
void dlgServer::OnChangeTryConnect(wxCommandEvent &ev)
{
chkStorePwd->Enable(chkTryConnect->GetValue() && !connection);
txtPassword->Enable(chkTryConnect->GetValue() && !connection);
OnChange(ev);
}
void dlgServer::CheckChange()
{
wxString name = GetName();
bool enable = true;
if (server)
{
// Get old value
wxColour colour;
wxString sColour = wxEmptyString;
if (colour.Set(server->GetColour()))
sColour = colour.GetAsString(wxC2S_HTML_SYNTAX);
// Get new value
wxString sColour2 = colourPicker->GetColourString();
enable = name != server->GetName()
|| txtHostAddr->GetValue() != server->GetHostAddr()
|| txtDescription->GetValue() != server->GetDescription()
|| txtService->GetValue() != server->GetService()
|| txtServiceID->GetValue() != server->GetServiceID()
|| StrToLong(txtPort->GetValue()) != server->GetPort()
|| cbDatabase->GetValue() != server->GetDatabaseName()
|| txtUsername->GetValue() != server->GetUsername()
|| cbSSL->GetCurrentSelection() != server->GetSSL()
|| chkStorePwd->GetValue() != server->GetStorePwd()
|| txtRolename->GetValue() != server->GetRolename()
|| txtConnStr->GetValue() != server->GetConnStr()
|| chkRestore->GetValue() != server->GetRestore()
|| txtDbRestriction->GetValue() != server->GetDbRestriction()
|| sColour != sColour2
|| cbGroup->GetValue() != server->GetGroup()
|| pickerSSLCert->GetPath() != server->GetSSLCert()
|| pickerSSLKey->GetPath() != server->GetSSLKey()
|| pickerSSLRootCert->GetPath() != server->GetSSLRootCert()
|| pickerSSLCrl->GetPath() != server->GetSSLCrl()
|| chkSSLCompression->GetValue() != server->GetSSLCompression();
}
#ifdef __WXMSW__
CheckValid(enable, !name.IsEmpty(), _("Please specify address."));
#else
bool isPipe = (name.IsEmpty() || name.StartsWith(wxT("/")));
cbSSL->Enable(!isPipe && !connection);
#endif
CheckValid(enable, !txtDescription->GetValue().IsEmpty(), _("Please specify description."));
if (txtService->GetValue().IsEmpty())
{
CheckValid(enable, StrToLong(txtPort->GetValue()) > 0, _("Please specify port."));
CheckValid(enable, !txtUsername->GetValue().IsEmpty(), _("Please specify user name"));
}
CheckValid(enable, dbRestrictionOk, _("Restriction not valid."));
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
if(chkSSHTunnel->GetValue())
{
CheckValid(enable, !txtTunnelHost->GetValue().IsEmpty(), _("Please specify ssh tunnel host."));
CheckValid(enable, !txtTunnelPort->GetValue().IsEmpty(), _("Please specify ssh tunnel port."));
CheckValid(enable, !txtTunnelUsername->GetValue().IsEmpty(), _("Please specify ssh tunnel user name."));
}
#endif
EnableOK(enable && !connection);
}
wxString dlgServer::GetSql()
{
return wxEmptyString;
}
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
void dlgServer::OnCheckSSHTunnel(wxCommandEvent &ev)
{
if (chkSSHTunnel->IsChecked())
{
if(chkStorePwd->GetValue())
{
wxMessageBox(_("Database passwords cannot be stored when using SSH tunnelling. The 'Store password' option has been turned off."), _("Stored Password"), wxICON_EXCLAMATION | wxOK, this);
}
chkStorePwd->SetValue(false);
chkStorePwd->Enable(false);
EnableSSHTunnelControls(true);
EnableAuthenticationOptions();
}
else
{
chkStorePwd->Enable();
EnableSSHTunnelControls(false);
}
CheckChange();
}
void dlgServer::OnChangeAuthOption(wxCommandEvent &ev)
{
EnableAuthenticationOptions();
}
void dlgServer::EnableSSHTunnelControls(const bool &bEnable)
{
txtTunnelHost->Enable(bEnable);
txtTunnelUsername->Enable(bEnable);
pickerPublicKeyFile->Enable(bEnable);
pickerIdentityFile->Enable(bEnable);
radioBtnPassword->Enable(bEnable);
radioBtnKeyfile->Enable(bEnable);
txtTunnelPassword->Enable(bEnable);
txtTunnelPort->Enable(bEnable);
}
void dlgServer::EnableAuthenticationOptions()
{
if (radioBtnPassword->GetValue())
{
pickerIdentityFile->Enable(false);
pickerPublicKeyFile->Enable(false);
}
else
{
pickerIdentityFile->Enable(true);
pickerPublicKeyFile->Enable(true);
}
}
#endif