pgadmin3/frm/frmGrantWizard.cpp
lsv 38f4510342 Add view MAINTAIN privilege
Добавлена поддержка отображения новой привелегии MAINTAIN.
2025-01-21 10:16:11 +05:00

346 lines
8.4 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// frmGrantWizard.cpp - Grant Wizard dialogue
//
//////////////////////////////////////////////////////////////////////////
// wxWindows headers
#include <wx/wx.h>
#include <wx/settings.h>
#include <wx/xrc/xmlres.h>
// App headers
#include "pgAdmin3.h"
#include "frm/frmGrantWizard.h"
#include "frm/frmMain.h"
#include "utils/sysLogger.h"
#include "ctl/ctlSecurityPanel.h"
#include "schema/pgFunction.h"
#include "schema/pgSequence.h"
#include "schema/pgTable.h"
#include "schema/pgView.h"
#include "schema/gpExtTable.h"
// Icons
#include "images/index.pngc"
#define chkList CTRL_CHECKLISTBOX("chkList")
BEGIN_EVENT_TABLE(frmGrantWizard, ExecutionDialog)
EVT_NOTEBOOK_PAGE_CHANGED(XRCID("nbNotebook"), frmGrantWizard::OnPageSelect)
EVT_BUTTON(XRCID("btnChkAll"), frmGrantWizard::OnCheckAll)
EVT_BUTTON(XRCID("btnUnchkAll"), frmGrantWizard::OnUncheckAll)
EVT_CHECKLISTBOX(XRCID("chkList"), frmGrantWizard::OnChange)
END_EVENT_TABLE()
frmGrantWizard::frmGrantWizard(frmMain *form, pgObject *obj) : ExecutionDialog(form, obj)
{
nbNotebook = 0;
SetFont(settings->GetSystemFont());
LoadResource(form, wxT("frmGrantWizard"));
RestorePosition();
SetTitle(object->GetTranslatedMessage(GRANTWIZARDTITLE));
// Icon
SetIcon(*index_png_ico);
nbNotebook = CTRL_NOTEBOOK("nbNotebook");
sqlPane = 0;
Restore();
EnableOK(false);
}
frmGrantWizard::~frmGrantWizard()
{
SavePosition();
Abort();
}
wxString frmGrantWizard::GetHelpPage() const
{
wxString page = wxT("pg/sql-grant");
return page;
}
void frmGrantWizard::OnChange(wxCommandEvent &event)
{
sqlPane->SetReadOnly(false);
sqlPane->SetText(GetSql());
sqlPane->SetReadOnly(true);
if (sqlPane->GetText().IsEmpty())
EnableOK(false);
else
EnableOK(true);
}
void frmGrantWizard::OnUncheckAll(wxCommandEvent &event)
{
unsigned int i;
for (i = 0 ; i < chkList->GetCount() ; i++)
chkList->Check(i, false);
OnChange(event);
}
void frmGrantWizard::OnCheckAll(wxCommandEvent &event)
{
unsigned int i;
for (i = 0 ; i < chkList->GetCount() ; i++)
chkList->Check(i, true);
OnChange(event);
}
void frmGrantWizard::OnPageSelect(wxNotebookEvent &event)
{
if (nbNotebook && sqlPane && event.GetSelection() == (int)nbNotebook->GetPageCount() - 2)
{
sqlPane->SetReadOnly(false);
sqlPane->SetText(GetSql());
sqlPane->SetReadOnly(true);
}
}
void frmGrantWizard::AddObjects(pgCollection *collection)
{
bool traverseKids = (!collection->IsCollection() || collection->GetMetaType() == PGM_SCHEMA);
if (!traverseKids)
{
pgaFactory *factory = collection->GetFactory();
if (!factory->IsCollectionFor(tableFactory) &&
!factory->IsCollectionFor(functionFactory) &&
!factory->IsCollectionFor(triggerFunctionFactory) &&
!factory->IsCollectionFor(procedureFactory) &&
!factory->IsCollectionFor(viewFactory) &&
!factory->IsCollectionFor(extTableFactory) &&
!factory->IsCollectionFor(sequenceFactory))
return;
}
wxCookieType cookie;
wxTreeItemId item = mainForm->GetBrowser()->GetFirstChild(collection->GetId(), cookie);
while (item)
{
pgObject *obj = mainForm->GetBrowser()->GetObject(item);
if (obj)
{
if (traverseKids)
AddObjects((pgCollection *)obj);
else
{
if (obj->CanEdit())
{
objectArray.Add(obj);
chkList->Append((wxString)wxGetTranslation(obj->GetTypeName()) + wxT(" ") + obj->GetFullIdentifier());
}
}
}
item = mainForm->GetBrowser()->GetNextChild(collection->GetId(), cookie);
}
}
void frmGrantWizard::Go()
{
chkList->SetFocus();
wxString privList = wxT("INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER");
const char *privChar = "arwdDxt";
if (conn && conn->BackendMinimumVersion(17, 0)) {
privChar = "arwdDxtm";
privList += ",MAINTAIN";
}
switch (object->GetMetaType())
{
case PGM_DATABASE:
case PGM_SCHEMA:
privList.Append(wxT(",EXECUTE,USAGE"));
privChar = "arwdDxtXU";
break;
case PGM_FUNCTION:
privList = wxT("EXECUTE");
privChar = "X";
break;
case PGM_SEQUENCE:
privList = wxT("SELECT,UPDATE,USAGE");
privChar = "rwU";
break;
case GP_EXTTABLE:
privList = wxT("SELECT");
privChar = "r";
default:
break;
}
securityPage = new ctlSecurityPanel(nbNotebook, privList, privChar, mainForm->GetImageList());
securityPage->SetConnection(object->GetConnection());
this->Connect(EVT_SECURITYPANEL_CHANGE, wxCommandEventHandler(frmGrantWizard::OnChange));
sqlPane = new ctlSQLBox(nbNotebook, CTL_PROPSQL, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH2);
nbNotebook->AddPage(sqlPane, wxT("SQL"));
txtMessages = new wxTextCtrl(nbNotebook, CTL_MSG, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY | wxHSCROLL);
nbNotebook->AddPage(txtMessages, _("Messages"));
AddObjects((pgCollection *)object);
if (securityPage->cbGroups)
{
pgSet *set = object->GetConnection()->ExecuteSet(wxT("SELECT groname FROM pg_group ORDER BY groname"));
if (set)
{
while (!set->Eof())
{
securityPage->cbGroups->Append(wxT("group ") + set->GetVal(0));
set->MoveNext();
}
delete set;
}
if (settings->GetShowUsersForPrivileges())
{
set = object->GetConnection()->ExecuteSet(wxT("SELECT usename FROM pg_user ORDER BY usename"));
if (set)
{
securityPage->stGroup->SetLabel(_("Group/User"));
while (!set->Eof())
{
securityPage->cbGroups->Append(set->GetVal(0));
set->MoveNext();
}
delete set;
Layout();
}
}
}
Layout();
Show(true);
// Work around a weird display bug in wx2.7
this->Refresh();
}
wxString frmGrantWizard::GetSql()
{
wxString sql;
unsigned int i;
for (i = 0 ; i < chkList->GetCount() ; i++)
{
if (chkList->IsChecked(i))
{
wxString tmp;
pgObject *obj = (pgObject *)objectArray.Item(i);
switch (obj->GetMetaType())
{
case PGM_FUNCTION:
{
if (((pgFunction *)obj)->GetIsProcedure())
{
tmp = securityPage->GetGrant(wxT("X"), wxT("PROCEDURE ")
+ obj->GetQuotedFullIdentifier() + wxT("(")
+ ((pgProcedure *)obj)->GetArgSigList() + wxT(")"));
}
else
{
tmp = securityPage->GetGrant(wxT("X"), wxT("FUNCTION ")
+ obj->GetQuotedFullIdentifier() + wxT("(")
+ ((pgFunction *)obj)->GetArgSigList() + wxT(")"));
}
break;
}
case PGM_VIEW:
tmp = securityPage->GetGrant(wxT("arwdxt"), wxT("TABLE ") + obj->GetQuotedFullIdentifier());
break;
case PGM_SEQUENCE:
tmp = securityPage->GetGrant(wxT("rwU"), wxT("SEQUENCE ") + obj->GetQuotedFullIdentifier());
break;
case GP_EXTTABLE:
tmp = securityPage->GetGrant(wxT("r"), wxT("TABLE ") + obj->GetQuotedFullIdentifier());
default:
if (obj->GetTypeName().Upper() == wxT("EXTERNAL TABLE")) // somewhat of a hack
{
tmp = securityPage->GetGrant(wxT("r"), wxT("TABLE ") + obj->GetQuotedFullIdentifier());
}
else
if (conn && conn->BackendMinimumVersion(17, 0))
tmp = securityPage->GetGrant(wxT("arwdDxtm"), obj->GetTypeName().Upper() + wxT(" ") + obj->GetQuotedFullIdentifier());
else
tmp = securityPage->GetGrant(wxT("arwdDxt"), obj->GetTypeName().Upper() + wxT(" ") + obj->GetQuotedFullIdentifier());
break;
}
if (!tmp.IsEmpty())
sql.Append(tmp);
}
}
return sql;
}
grantWizardFactory::grantWizardFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar) : contextActionFactory(list)
{
mnu->Append(id, _("&Grant Wizard..."), _("Grants rights to multiple objects"));
}
wxWindow *grantWizardFactory::StartDialog(frmMain *form, pgObject *obj)
{
frmGrantWizard *frm = new frmGrantWizard(form, obj);
frm->Go();
return 0;
}
bool grantWizardFactory::CheckEnable(pgObject *obj)
{
if (obj)
{
switch (obj->GetMetaType())
{
case PGM_TABLE:
case PGM_FUNCTION:
case PGM_SEQUENCE:
case PGM_VIEW:
case GP_EXTTABLE:
if (obj->IsCollection() && obj->GetSchema()->GetMetaType() != PGM_CATALOG)
return obj->GetSchema()->CanEdit();
break;
case PGM_SCHEMA:
return obj->CanEdit();
default:
break;
}
}
return false;
}