mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
860 lines
30 KiB
ObjectPascal
860 lines
30 KiB
ObjectPascal
unit usermanager;
|
|
|
|
|
|
// -------------------------------------
|
|
// HeidiSQL
|
|
// Usermanager
|
|
// -------------------------------------
|
|
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
ComCtrls, StdCtrls, CheckLst, ImgList, ExtCtrls, Registry, ZDataset;
|
|
// winsock
|
|
|
|
type
|
|
TUserManagerForm = class(TForm)
|
|
PageControl1: TPageControl;
|
|
TabSheetAddUser: TTabSheet;
|
|
DBUserTree: TTreeView;
|
|
EditUser: TEdit;
|
|
EditPassword: TEdit;
|
|
EditHost: TEdit;
|
|
Label4: TLabel;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Label7: TLabel;
|
|
CheckListBoxPrivileges: TCheckListBox;
|
|
CheckBoxAllPrivileges: TCheckBox;
|
|
Label8: TLabel;
|
|
CheckBoxWithGrant: TCheckBox;
|
|
Label9: TLabel;
|
|
ImageList1: TImageList;
|
|
Bevel1: TBevel;
|
|
CheckBoxCreateAccount: TCheckBox;
|
|
EditDescription: TEdit;
|
|
Label1: TLabel;
|
|
TabSheetEditUsers: TTabSheet;
|
|
Panel1: TPanel;
|
|
CheckListBoxPrivs: TCheckListBox;
|
|
Label13: TLabel;
|
|
LabelColumn: TLabel;
|
|
LabelTable: TLabel;
|
|
LabelDB: TLabel;
|
|
Label12: TLabel;
|
|
Label11: TLabel;
|
|
LabelPrivileges: TLabel;
|
|
Panel2: TPanel;
|
|
Label2: TLabel;
|
|
TreeViewUsers: TTreeView;
|
|
ButtonSelectAll: TButton;
|
|
ButtonSelectNone: TButton;
|
|
ButtonSet: TButton;
|
|
LabelPleaseSelect: TLabel;
|
|
LabelNoPrivs: TLabel;
|
|
ButtonSelectPrivileges: TButton;
|
|
Panel3: TPanel;
|
|
ButtonClose: TButton;
|
|
ButtonAddUser: TButton;
|
|
LabelUser: TLabel;
|
|
ButtonRevoke: TButton;
|
|
Panel4: TPanel;
|
|
ButtonEditUser: TButton;
|
|
Button1: TButton;
|
|
procedure ButtonCloseClick(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure CheckBoxAllPrivilegesClick(Sender: TObject);
|
|
procedure ButtonAddUserClick(Sender: TObject);
|
|
procedure CheckBoxCreateAccountClick(Sender: TObject);
|
|
procedure TreeViewUsersDblClick(Sender: TObject);
|
|
procedure TreeViewUsersChange(Sender: TObject; Node: TTreeNode);
|
|
procedure PageControl1Change(Sender: TObject);
|
|
procedure ButtonSelectAllClick(Sender: TObject);
|
|
procedure ButtonSelectNoneClick(Sender: TObject);
|
|
procedure ShowPrivilegesControls(v,w,y: Boolean);
|
|
procedure ButtonSelectPrivilegesClick(Sender: TObject);
|
|
procedure ShowPrivs(node: TTreeNode);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
procedure ButtonSetClick(Sender: TObject);
|
|
procedure CheckListBoxPrivsClickCheck(Sender: TObject);
|
|
procedure ButtonRevokeClick(Sender: TObject);
|
|
procedure ButtonEditUserClick(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure GetResUsers;
|
|
procedure GetResDBs;
|
|
procedure GetResTables;
|
|
procedure GetResColumns;
|
|
|
|
private
|
|
{ Private declarations }
|
|
editcurrent : Boolean;
|
|
public
|
|
{ Public declarations }
|
|
User, Host : String; // Remember for setting privileges
|
|
ZQueryDBs, ZQueryTables, ZQueryColumns, ZQueryUsers, ZQueryF : TZReadOnlyQuery;
|
|
end;
|
|
|
|
var
|
|
UserManagerForm: TUserManagerForm;
|
|
|
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
main, childwin, helpers, edituser;
|
|
|
|
|
|
const
|
|
crlf = #13#10;
|
|
{$R *.DFM}
|
|
|
|
|
|
procedure TUserManagerForm.ButtonCloseClick(Sender: TObject);
|
|
begin
|
|
close;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.FormShow(Sender: TObject);
|
|
var
|
|
i,j : Integer;
|
|
tntop, tn1, tn2, tnu1, tnu2, tnu3 : TTreeNode;
|
|
|
|
// wsadat : WSAData;
|
|
// host : String;
|
|
// ph : PHostEnt;
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
DBUserTree.Items.Clear;
|
|
TreeViewUsers.Items.Clear;
|
|
PageControl1.ActivePageIndex := 0;
|
|
ShowPrivilegesControls(false, true, false);
|
|
CheckBoxCreateAccount.Caption := 'Create connection account for ' + appname;
|
|
|
|
tnu1 := DBUserTree.Items.Add(nil, 'Global Access');
|
|
tnu1.ImageIndex := 13;
|
|
tnu1.SelectedIndex := 6;
|
|
with TMDIChild(Application.Mainform.ActiveMDIChild) do
|
|
begin
|
|
DBUserTree.Images := ImageList1;
|
|
tntop := tnodehost; // tnodehost on childwin
|
|
tn1 := tntop.GetFirstChild;
|
|
for i:=0 to tntop.Count-1 do
|
|
begin
|
|
tnu2 := DBUserTree.Items.AddChild(tnu1, tn1.Text);
|
|
tnu2.ImageIndex := 12;
|
|
tnu2.SelectedIndex := 0;
|
|
for j:=0 to tn1.Count-1 do
|
|
begin
|
|
tn2 := tntop.Item[i].Item[j];
|
|
tnu3 := DBUserTree.Items.AddChild(tnu2, tn1.Text + '.' + tn2.Text);
|
|
tnu3.ImageIndex := 1;
|
|
tnu3.SelectedIndex := 11;
|
|
end;
|
|
tn1 := tntop.getNextChild(tn1);
|
|
|
|
TreeViewUsers.Images := ImageList1;
|
|
end;
|
|
EditUser.Text := ZConn.User;
|
|
|
|
end;
|
|
tnu1.Expand(false);
|
|
tnu1.Selected := true;
|
|
|
|
with CheckListBoxPrivileges do
|
|
for i:=0 to 8 do
|
|
Checked[i] := true;
|
|
|
|
PageControl1.OnChange(self);
|
|
|
|
{
|
|
// get users hostname
|
|
WSAStartup(MAKEWORD(1, 1), wsadat);
|
|
gethostname(pchar(host), 80);
|
|
ph := gethostbyname(pchar(host));
|
|
EditHost.Text := ph.h_name;
|
|
WSACleanup();
|
|
}
|
|
TMDIChild(Application.Mainform.ActiveMDIChild).ExecQuery( 'USE mysql' );
|
|
|
|
ZQueryDBs := TZReadOnlyQuery.Create(self);
|
|
ZQueryDBs.Connection := TMDIChild(Application.Mainform.ActiveMDIChild).ZConn;
|
|
|
|
ZQueryTables := TZReadOnlyQuery.Create(self);
|
|
ZQueryTables.Connection := TMDIChild(Application.Mainform.ActiveMDIChild).ZConn;
|
|
|
|
ZQueryColumns := TZReadOnlyQuery.Create(self);
|
|
ZQueryColumns.Connection := TMDIChild(Application.Mainform.ActiveMDIChild).ZConn;
|
|
|
|
ZQueryUsers := TZReadOnlyQuery.Create(self);
|
|
ZQueryUsers.Connection := TMDIChild(Application.Mainform.ActiveMDIChild).ZConn;
|
|
|
|
ZQueryF := TZReadOnlyQuery.Create(self);
|
|
ZQueryF.Connection := TMDIChild(Application.Mainform.ActiveMDIChild).ZConn;
|
|
|
|
Screen.Cursor := crDefault;
|
|
end;
|
|
|
|
procedure TUserManagerForm.CheckBoxAllPrivilegesClick(Sender: TObject);
|
|
begin
|
|
CheckListBoxPrivileges.Enabled := not CheckBoxAllPrivileges.Checked;
|
|
end;
|
|
|
|
procedure TUserManagerForm.ButtonAddUserClick(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
priv, query, access, fromhost, pass, grant : String;
|
|
begin
|
|
// Account
|
|
if CheckBoxCreateAccount.Checked then
|
|
with TRegistry.Create do
|
|
begin
|
|
OpenKey(regpath + '\Servers\', false);
|
|
if KeyExists(EditDescription.Text) then
|
|
begin
|
|
MessageDlg('This Description (' + EditDescription.Text + ') is already used.' + crlf + 'Please specify another description!', mtError, [mbOK], 0);
|
|
EditDescription.SetFocus;
|
|
exit;
|
|
end
|
|
else with TRegistry.Create do
|
|
begin
|
|
OpenKey(regpath + '\Servers\' + EditDescription.Text, true);
|
|
WriteString('Host', TMDIChild(Application.Mainform.ActiveMDIChild).ZConn.HostName);
|
|
WriteString('User', EditUser.Text);
|
|
WriteString('Password', encrypt(EditPassword.Text));
|
|
WriteString('Port', IntToStr(TMDIChild(Application.Mainform.ActiveMDIChild).ZConn.Port));
|
|
WriteString('Timeout', '30');
|
|
WriteBool('Compressed', false);
|
|
WriteString('OnlyDBs', '');
|
|
CloseKey;
|
|
end;
|
|
end;
|
|
|
|
priv := '';
|
|
if CheckBoxAllPrivileges.Checked then
|
|
priv := 'ALL PRIVILEGES'
|
|
else
|
|
with CheckListBoxPrivileges do
|
|
for i:=0 to Items.Count - 1 do
|
|
if Checked[i] then
|
|
begin
|
|
if priv <> '' then
|
|
priv := priv + ', ';
|
|
priv := priv + Items[i];
|
|
end;
|
|
if priv = '' then
|
|
priv := 'USAGE';
|
|
|
|
case DBUserTree.Selected.Level of
|
|
0 : access := '*.*';
|
|
1 : access := DBUserTree.Selected.Text + '.*';
|
|
2 : access := DBUserTree.Selected.Text;
|
|
end;
|
|
|
|
if EditHost.Text = '' then
|
|
fromhost := '%'
|
|
else
|
|
fromhost := EditHost.Text;
|
|
|
|
if EditPassWord.Text <> '' then
|
|
pass := ' IDENTIFIED BY ''' + EditPassWord.Text + '''';
|
|
|
|
if CheckBoxWithGrant.Checked then
|
|
grant := ' WITH GRANT OPTION';
|
|
|
|
query := 'GRANT ' + priv + ' ON ' + access + ' TO ''' + EditUser.Text + '''@''' + fromhost + '''' + pass + grant;
|
|
TMDIChild(Application.Mainform.ActiveMDIChild).ExecQuery(query);
|
|
TMDIChild(Application.Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
ShowMessage('User succesfully created.');
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.CheckBoxCreateAccountClick(Sender: TObject);
|
|
begin
|
|
Label1.Enabled := CheckBoxCreateAccount.Checked;
|
|
EditDescription.Enabled := CheckBoxCreateAccount.Checked;
|
|
if (CheckBoxCreateAccount.Checked) and (EditDescription.Text = '') then
|
|
begin
|
|
EditDescription.Text := TMDIChild(Application.Mainform.ActiveMDIChild).Caption;
|
|
EditDescription.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.TreeViewUsersDblClick(Sender: TObject);
|
|
var
|
|
tnu, tndb, tntbl : TTreeNode;
|
|
i : Integer;
|
|
begin
|
|
// Add subitems to TreeNode:
|
|
|
|
Screen.Cursor := crHourGlass;
|
|
|
|
if not TreeViewUsers.Selected.HasChildren then
|
|
case TreeViewUsers.Selected.Level of
|
|
|
|
0 : // add dbs to user-node...
|
|
with TMDIChild(Application.Mainform.ActiveMDIChild) do begin
|
|
tndb := tnodehost.GetFirstChild;
|
|
for i:=0 to tnodehost.Count-1 do begin
|
|
tnu := TreeViewUsers.Items.AddChild(TreeViewUsers.Selected, tndb.Text);
|
|
tnu.ImageIndex := 12;
|
|
tnu.SelectedIndex := 0;
|
|
tndb := tnodehost.getNextChild(tndb);
|
|
end;
|
|
end;
|
|
|
|
1 : // add tables to user-node...
|
|
with TMDIChild(Application.Mainform.ActiveMDIChild) do begin
|
|
tndb := tnodehost.GetFirstChild;
|
|
// find according db in dbtree
|
|
for i:=0 to tnodehost.Count-1 do begin
|
|
if tndb.Text = TreeViewUsers.Selected.Text then
|
|
break;
|
|
tndb := tnodehost.getNextChild(tndb);
|
|
end;
|
|
|
|
tntbl := tndb.GetFirstChild;
|
|
for i:=0 to tndb.Count-1 do begin
|
|
tnu := TreeViewUsers.Items.AddChild(TreeViewUsers.Selected, tntbl.Text);
|
|
tnu.ImageIndex := 1;
|
|
tnu.SelectedIndex := 11;
|
|
tntbl := tndb.getNextChild(tntbl);
|
|
end;
|
|
end;
|
|
|
|
|
|
2 : // add columns to user-node...
|
|
begin
|
|
// find fields from table
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SHOW FIELDS FROM ' + TreeViewUsers.Selected.Parent.Text + '.' + TreeViewUsers.Selected.Text, ZQueryF );
|
|
for i:=1 to ZQueryF.RecordCount do
|
|
begin
|
|
tnu := TreeViewUsers.Items.AddChild(TreeViewUsers.Selected, ZQueryF.Fields[0].AsString);
|
|
tnu.ImageIndex := 17;
|
|
tnu.SelectedIndex := 18;
|
|
ZQueryF.Next;
|
|
end;
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
if not TreeViewUsers.Selected.Expanded then
|
|
TreeViewUsers.Selected.Expand(false);
|
|
|
|
Screen.Cursor := crDefault;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.TreeViewUsersChange(Sender: TObject;
|
|
Node: TTreeNode);
|
|
var
|
|
n : TTreeNode;
|
|
highlight : TColor;
|
|
begin
|
|
// Selecting a User, DB, Table or Column in TreeViewUsers
|
|
n := Node;
|
|
while n.Parent <> nil do
|
|
n := n.Parent;
|
|
// show controls:
|
|
ShowPrivilegesControls(false, false, true);
|
|
User := copy(n.Text, 0, pos('@', n.Text)-1);
|
|
Host := copy(n.Text, pos('@', n.Text)+1, length(n.text));
|
|
LabelUser.Caption := 'User ''' + User + ''' connecting from host ''' + Host + '''';
|
|
|
|
highlight := clNavy;
|
|
case Node.level of
|
|
0 : begin
|
|
LabelDB.Caption := '<All Databases>'; LabelDB.Font.Color := highlight;
|
|
LabelTable.Caption := '<All Tables>'; LabelTable.Font.Color := highlight;
|
|
LabelColumn.Caption := '<All Columns>'; LabelColumn.Font.Color := highlight;
|
|
ButtonEditUser.Enabled := true;
|
|
end;
|
|
1 : begin
|
|
LabelDB.Caption := Node.Text; LabelDB.Font.Color := clWindowText;
|
|
LabelTable.Caption := '<All Tables>'; LabelTable.Font.Color := highlight;
|
|
LabelColumn.Caption := '<All Columns>'; LabelColumn.Font.Color := highlight;
|
|
if not ZQueryDBs.Active then
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.db', ZQueryDBs );
|
|
ButtonEditUser.Enabled := false;
|
|
end;
|
|
2 : begin
|
|
LabelDB.Caption := Node.Parent.Text; LabelDB.Font.Color := clWindowText;
|
|
LabelTable.Caption := Node.Text; LabelTable.Font.Color := clWindowText;
|
|
LabelColumn.Caption := '<All Columns>'; LabelColumn.Font.Color := highlight;
|
|
if not ZQueryTables.Active then
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.tables_priv', ZQueryTables );
|
|
ButtonEditUser.Enabled := false;
|
|
end;
|
|
3 : begin
|
|
LabelDB.Caption := Node.Parent.Parent.Text; LabelDB.Font.Color := clWindowText;
|
|
LabelTable.Caption := Node.Parent.Text; LabelTable.Font.Color := clWindowText;
|
|
LabelColumn.Caption := Node.Text; LabelColumn.Font.Color := clWindowText;
|
|
if not ZQueryColumns.Active then
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.columns_priv', ZQueryColumns );
|
|
ButtonEditUser.Enabled := false;
|
|
end;
|
|
end;
|
|
|
|
editcurrent := true;
|
|
ShowPrivs(node);
|
|
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.PageControl1Change(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
tn : TTreeNode;
|
|
begin
|
|
// Toggle Button Add User
|
|
ButtonAddUser.Visible := PageControl1.ActivePage = TabSheetAddUser;
|
|
|
|
// ---------------------
|
|
// Edit Users:
|
|
|
|
// Fill Tree with Registered Users:
|
|
if (PageControl1.ActivePage = TabSheetEditUsers) and
|
|
(TreeViewUsers.Items.Count = 0) then
|
|
begin
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.user', ZQueryUsers );
|
|
for i:=1 to ZQueryUsers.RecordCount do
|
|
begin
|
|
tn := TreeViewUsers.Items.AddChild(nil, ZQueryUsers.Fields[1].AsString + '@' + ZQueryUsers.Fields[0].AsString );
|
|
tn.ImageIndex := 16;
|
|
tn.SelectedIndex := 15;
|
|
ZQueryUsers.Next;
|
|
end;
|
|
end;
|
|
// ---------------------
|
|
end;
|
|
|
|
procedure TUserManagerForm.ButtonSelectAllClick(Sender: TObject);
|
|
begin
|
|
// Select all
|
|
ToggleCheckListBox(CheckListBoxPrivs, true);
|
|
CheckListBoxPrivs.OnClickCheck(self);
|
|
end;
|
|
|
|
procedure TUserManagerForm.ButtonSelectNoneClick(Sender: TObject);
|
|
begin
|
|
// Select none
|
|
ToggleCheckListBox(CheckListBoxPrivs, false);
|
|
CheckListBoxPrivs.OnClickCheck(self);
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.ShowPrivilegesControls(v, w, y: Boolean);
|
|
begin
|
|
// show/hide Privileges-Controls
|
|
// v : some privileges set?
|
|
// w : a user selected?
|
|
// y : no privileges set
|
|
LabelPrivileges.Visible := v;
|
|
Label11.Visible := v;
|
|
Label12.Visible := v;
|
|
Label13.Visible := v;
|
|
LabelUser.Visible := v;
|
|
LabelDB.Visible := v;
|
|
LabelTable.Visible := v;
|
|
LabelColumn.Visible := v;
|
|
CheckListBoxPrivs.Visible := v;
|
|
ButtonSelectAll.Visible := v;
|
|
ButtonSelectNone.Visible := v;
|
|
ButtonSet.Visible := v;
|
|
if v then
|
|
ButtonSet.Enabled := false;
|
|
ButtonRevoke.Visible := v;
|
|
if v then
|
|
ButtonRevoke.Enabled := editcurrent;
|
|
LabelPleaseSelect.Visible := w;
|
|
LabelNoPrivs.Visible := y;
|
|
ButtonSelectPrivileges.Visible := y;
|
|
|
|
if TreeViewUsers.Selected <> nil then
|
|
case TreeViewUsers.Selected.Level of
|
|
0 : begin // General
|
|
CheckListBoxPrivs.Clear;
|
|
CheckListBoxPrivs.Items.Add('Select');
|
|
CheckListBoxPrivs.Items.Add('Insert');
|
|
CheckListBoxPrivs.Items.Add('Update');
|
|
CheckListBoxPrivs.Items.Add('Delete');
|
|
CheckListBoxPrivs.Items.Add('Create');
|
|
CheckListBoxPrivs.Items.Add('Drop');
|
|
CheckListBoxPrivs.Items.Add('Reload');
|
|
CheckListBoxPrivs.Items.Add('Shutdown');
|
|
CheckListBoxPrivs.Items.Add('Process');
|
|
CheckListBoxPrivs.Items.Add('File');
|
|
CheckListBoxPrivs.Items.Add('Grant');
|
|
CheckListBoxPrivs.Items.Add('References');
|
|
CheckListBoxPrivs.Items.Add('Index');
|
|
CheckListBoxPrivs.Items.Add('Alter');
|
|
ButtonRevoke.Caption := 'Delete User';
|
|
end;
|
|
1,2 : begin // DB, Table
|
|
CheckListBoxPrivs.Clear;
|
|
CheckListBoxPrivs.Items.Add('Select');
|
|
CheckListBoxPrivs.Items.Add('Insert');
|
|
CheckListBoxPrivs.Items.Add('Update');
|
|
CheckListBoxPrivs.Items.Add('Delete');
|
|
CheckListBoxPrivs.Items.Add('Create');
|
|
CheckListBoxPrivs.Items.Add('Drop');
|
|
CheckListBoxPrivs.Items.Add('Grant');
|
|
CheckListBoxPrivs.Items.Add('References');
|
|
CheckListBoxPrivs.Items.Add('Index');
|
|
CheckListBoxPrivs.Items.Add('Alter');
|
|
ButtonRevoke.Caption := 'Revoke Privileges';
|
|
end;
|
|
3 : begin // Column
|
|
CheckListBoxPrivs.Clear;
|
|
CheckListBoxPrivs.Items.Add('Select');
|
|
CheckListBoxPrivs.Items.Add('Insert');
|
|
CheckListBoxPrivs.Items.Add('Update');
|
|
CheckListBoxPrivs.Items.Add('References');
|
|
ButtonRevoke.Caption := 'Revoke Privileges';
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.ButtonSelectPrivilegesClick(Sender: TObject);
|
|
begin
|
|
// Specify some privileges
|
|
editcurrent := false;
|
|
ShowPrivilegesControls(true, false, false);
|
|
end;
|
|
|
|
|
|
|
|
procedure TUserManagerForm.ShowPrivs(node: TTreeNode);
|
|
var
|
|
i,j : Integer;
|
|
begin
|
|
// Show user-privileges (general, db, table or column)
|
|
// depending on node.level
|
|
|
|
case Node.Level of
|
|
0 : begin // General user-privileges
|
|
ZQueryUsers.First;
|
|
for i:=1 to ZQueryUsers.RecordCount do
|
|
begin
|
|
if (ZQueryUsers.Fields[0].AsString+'' = Host) and (ZQueryUsers.Fields[1].AsString+'' = User) then
|
|
begin // found the according user!
|
|
ShowPrivilegesControls(true, false, false);
|
|
CheckListBoxPrivs.Checked[0] := ZQueryUsers.Fields[3].AsString = 'Y'; // Select
|
|
CheckListBoxPrivs.Checked[1] := ZQueryUsers.Fields[4].AsString = 'Y'; // Insert
|
|
CheckListBoxPrivs.Checked[2] := ZQueryUsers.Fields[5].AsString = 'Y'; // Update
|
|
CheckListBoxPrivs.Checked[3] := ZQueryUsers.Fields[6].AsString = 'Y'; // Delete
|
|
CheckListBoxPrivs.Checked[4] := ZQueryUsers.Fields[7].AsString = 'Y'; // Create
|
|
CheckListBoxPrivs.Checked[5] := ZQueryUsers.Fields[8].AsString = 'Y'; // Drop
|
|
CheckListBoxPrivs.Checked[6] := ZQueryUsers.Fields[9].AsString = 'Y'; // Reload
|
|
CheckListBoxPrivs.Checked[7] := ZQueryUsers.Fields[10].AsString = 'Y'; // Shutdown
|
|
CheckListBoxPrivs.Checked[8] := ZQueryUsers.Fields[11].AsString = 'Y'; // Process
|
|
CheckListBoxPrivs.Checked[9] := ZQueryUsers.Fields[12].AsString = 'Y'; // File
|
|
CheckListBoxPrivs.Checked[10] := ZQueryUsers.Fields[13].AsString = 'Y'; // Grant
|
|
CheckListBoxPrivs.Checked[11] := ZQueryUsers.Fields[14].AsString = 'Y'; // References
|
|
CheckListBoxPrivs.Checked[12] := ZQueryUsers.Fields[15].AsString = 'Y'; // Index
|
|
CheckListBoxPrivs.Checked[13] := ZQueryUsers.Fields[16].AsString = 'Y'; // Alter
|
|
break;
|
|
end;
|
|
ZQueryUsers.Next;
|
|
end;
|
|
end;
|
|
|
|
1 : begin // db-privileges
|
|
ZQueryDBs.First;
|
|
for i:=1 to ZQueryDBs.RecordCount do
|
|
begin
|
|
if (ZQueryDBs.Fields[0].AsString = Host)
|
|
and (ZQueryDBs.Fields[1].AsString = Node.Text)
|
|
and (ZQueryDBs.Fields[2].AsString = User) then
|
|
begin
|
|
// some privs are set:
|
|
ShowPrivilegesControls(true, false, false);
|
|
CheckListBoxPrivs.Checked[0] := ZQueryDBs.Fields[3].AsString = 'Y'; // Select
|
|
CheckListBoxPrivs.Checked[1] := ZQueryDBs.Fields[4].AsString = 'Y'; // Insert
|
|
CheckListBoxPrivs.Checked[2] := ZQueryDBs.Fields[5].AsString = 'Y'; // Update
|
|
CheckListBoxPrivs.Checked[3] := ZQueryDBs.Fields[6].AsString = 'Y'; // Delete
|
|
CheckListBoxPrivs.Checked[4] := ZQueryDBs.Fields[7].AsString = 'Y'; // Create
|
|
CheckListBoxPrivs.Checked[5] := ZQueryDBs.Fields[8].AsString = 'Y'; // Drop
|
|
CheckListBoxPrivs.Checked[6] := ZQueryDBs.Fields[9].AsString = 'Y'; // Grant
|
|
CheckListBoxPrivs.Checked[7] := ZQueryDBs.Fields[10].AsString = 'Y'; // References
|
|
CheckListBoxPrivs.Checked[8] := ZQueryDBs.Fields[11].AsString = 'Y'; // Index
|
|
CheckListBoxPrivs.Checked[9] := ZQueryDBs.Fields[12].AsString = 'Y'; // Alter
|
|
end;
|
|
ZQueryDBs.Next;
|
|
end;
|
|
end;
|
|
|
|
2 : begin // table-privileges
|
|
ZQueryTables.First;
|
|
for i:=1 to ZQueryTables.RecordCount do
|
|
begin
|
|
if (ZQueryTables.Fields[0].AsString = Host)
|
|
and (ZQueryTables.Fields[1].AsString = Node.Parent.Text)
|
|
and (ZQueryTables.Fields[2].AsString = User)
|
|
and (ZQueryTables.Fields[3].AsString = Node.Text) then
|
|
begin // found the according record!
|
|
// some privs are set:
|
|
ShowPrivilegesControls(true, false, false);
|
|
// find values in set-field:
|
|
for j:=0 to CheckListBoxPrivs.Items.Count-1 do
|
|
CheckListBoxPrivs.Checked[j] := pos(CheckListBoxPrivs.Items[j], ZQueryTables.Fields[6].AsString) > 0;
|
|
end;
|
|
ZQueryTables.Next;
|
|
end;
|
|
end;
|
|
|
|
3 : begin // column-privileges
|
|
ZQueryColumns.First;
|
|
for i:=1 to ZQueryColumns.RecordCount do
|
|
begin
|
|
if (ZQueryColumns.Fields[0].AsString = Host)
|
|
and (ZQueryColumns.Fields[1].AsString = Node.Parent.Parent.Text)
|
|
and (ZQueryColumns.Fields[2].AsString = User)
|
|
and (ZQueryColumns.Fields[3].AsString = Node.Parent.Text)
|
|
and (ZQueryColumns.Fields[4].AsString = Node.Text) then
|
|
begin
|
|
// some privs are set:
|
|
ShowPrivilegesControls(true, false, false);
|
|
// find values in set-field:
|
|
for j:=0 to CheckListBoxPrivs.Items.Count-1 do
|
|
CheckListBoxPrivs.Checked[j] := pos(CheckListBoxPrivs.Items[j], ZQueryColumns.Fields[6].AsString) > 0;
|
|
end;
|
|
ZQueryColumns.Next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TUserManagerForm.ButtonSetClick(Sender: TObject);
|
|
|
|
function checked2yn(index: Byte): String;
|
|
begin
|
|
if CheckListBoxPrivs.Checked[index] then
|
|
result := 'Y'
|
|
else
|
|
result := 'N';
|
|
end;
|
|
|
|
var
|
|
sql : String;
|
|
i : Byte;
|
|
begin
|
|
// Grant specified Privileges
|
|
Screen.Cursor := crHourglass;
|
|
case TreeViewUsers.Selected.Level of
|
|
0 : begin // general
|
|
sql := 'UPDATE mysql.user SET ';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if i > 0 then
|
|
sql := sql + ', ';
|
|
sql := sql + ' ' + CheckListBoxPrivs.Items[i] + '_priv = ''' + checked2yn(i) + '''';
|
|
end;
|
|
sql := sql + ' WHERE Host = ''' + Host + ''' AND User = ''' + User + '''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
GetResUsers;
|
|
end;
|
|
|
|
1 : begin // db
|
|
if editcurrent then begin
|
|
sql := 'UPDATE mysql.db SET ';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if i > 0 then
|
|
sql := sql + ', ';
|
|
sql := sql + ' ' + CheckListBoxPrivs.Items[i] + '_priv = ''' + checked2yn(i) + '''';
|
|
end;
|
|
sql := sql + ' WHERE Host = ''' + Host + ''' AND Db = ''' + TreeViewUsers.Selected.Text + ''' AND User = ''' + User + '''';
|
|
end
|
|
else begin
|
|
sql := 'INSERT INTO mysql.db (Host, Db, User';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do
|
|
sql := sql + ', ' + CheckListBoxPrivs.Items[i] + '_priv';
|
|
sql := sql + ') VALUES (''' + Host + ''', ''' + TreeViewUsers.Selected.Text + ''', ''' + User + '''';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do
|
|
sql := sql + ', ''' + checked2yn(i) + '''';
|
|
sql := sql + ')';
|
|
editcurrent := true;
|
|
end;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
GetResDBs;
|
|
end;
|
|
|
|
2 : begin // table
|
|
if editcurrent then begin
|
|
sql := 'UPDATE mysql.tables_priv SET Table_priv = ''';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if CheckListBoxPrivs.Checked[i] then
|
|
sql := sql + CheckListBoxPrivs.Items[i] + ',';
|
|
end;
|
|
if sql[length(sql)] = ',' then
|
|
delete(sql, length(sql), 1); // last comma
|
|
sql := sql + ''' WHERE Host = ''' + Host + ''' AND Db = ''' + TreeViewUsers.Selected.Parent.Text + ''' AND User = ''' + User + ''' AND Table_name = ''' + TreeViewUsers.Selected.Text + '''';
|
|
end
|
|
else begin
|
|
sql := 'INSERT INTO mysql.tables_priv (Host, Db, User, Table_name, Grantor, Table_priv) VALUES ('''+Host+''','''+TreeViewUsers.Selected.Parent.Text+''','''+User+''','''+TreeViewUsers.Selected.Text+''','''+TMDIChild(Mainform.ActiveMDIChild).ZConn.User+''',''';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if CheckListBoxPrivs.Checked[i] then
|
|
sql := sql + CheckListBoxPrivs.Items[i] + ',';
|
|
end;
|
|
if sql[length(sql)] = ',' then
|
|
delete(sql, length(sql), 1); // last comma
|
|
sql := sql + ''')';
|
|
editcurrent := true;
|
|
end;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
GetResTables;
|
|
end;
|
|
|
|
3 : begin // column
|
|
if editcurrent then begin
|
|
sql := 'UPDATE mysql.columns_priv SET Column_priv = ''';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if CheckListBoxPrivs.Checked[i] then
|
|
sql := sql + CheckListBoxPrivs.Items[i] + ',';
|
|
end;
|
|
if sql[length(sql)] = ',' then
|
|
delete(sql, length(sql), 1); // last comma
|
|
sql := sql + ''' WHERE Host = ''' + Host + ''' AND Db = ''' + TreeViewUsers.Selected.Parent.Parent.Text + ''' AND User = ''' + User + ''' AND Table_name = ''' + TreeViewUsers.Selected.Parent.Text + ''' AND Column_name = ''' + TreeViewUsers.Selected.Text + '''';
|
|
end
|
|
else begin
|
|
sql := 'INSERT INTO mysql.columns_priv (Host, Db, User, Table_name, Column_name, Column_priv) VALUES ('''+Host+''','''+TreeViewUsers.Selected.Parent.Parent.Text+''','''+User+''','''+TreeViewUsers.Selected.Parent.Text+''','''+TreeViewUsers.Selected.Text+''',''';
|
|
for i:=0 to CheckListBoxPrivs.Items.Count-1 do begin
|
|
if CheckListBoxPrivs.Checked[i] then
|
|
sql := sql + CheckListBoxPrivs.Items[i] + ',';
|
|
end;
|
|
if sql[length(sql)] = ',' then
|
|
delete(sql, length(sql), 1); // last comma
|
|
sql := sql + ''')';
|
|
editcurrent := true;
|
|
end;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
GetResColumns;
|
|
end;
|
|
end;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
ButtonRevoke.Enabled := editcurrent;
|
|
Screen.Cursor := crDefault;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TUserManagerForm.FormClose(Sender: TObject;
|
|
var Action: TCloseAction);
|
|
begin
|
|
// free memory
|
|
ZQueryUsers.Active := False;
|
|
ZQueryDBs.Active := False;
|
|
ZQueryTables.Active := False;
|
|
ZQueryColumns.Active := False;
|
|
ZQueryF.Active := False;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.CheckListBoxPrivsClickCheck(Sender: TObject);
|
|
begin
|
|
ButtonSet.Enabled := true;
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.ButtonRevokeClick(Sender: TObject);
|
|
var sql : String;
|
|
begin
|
|
// Delete some Privs
|
|
Screen.Cursor := crHourglass;
|
|
case TreeViewUsers.Selected.Level of
|
|
0 : // delete user
|
|
if MessageDLG('Delete User '''+User+''' and all its privileges?', mtConfirmation, [mbNo, mbYes], 0) = mrYes then begin
|
|
sql := 'DELETE FROM mysql.user WHERE Host='''+Host+''' AND User='''+User+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
sql := 'DELETE FROM mysql.db WHERE Host='''+Host+''' AND User='''+User+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
sql := 'DELETE FROM mysql.tables_priv WHERE Host='''+Host+''' AND User='''+User+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
sql := 'DELETE FROM mysql.columns_priv WHERE Host='''+Host+''' AND User='''+User+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
TreeViewUsers.Selected.Delete;
|
|
ZQueryDBs.Active := False;
|
|
ZQueryTables.Active := False;
|
|
ZQueryColumns.Active := False;
|
|
GetResUsers;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
end;
|
|
1 : // delete db-privs
|
|
begin
|
|
sql := 'DELETE FROM mysql.db WHERE Host='''+Host+''' AND User='''+User+''' AND Db='''+TreeViewUsers.Selected.Text+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
ShowPrivilegesControls(false, false, true);
|
|
GetResDBs;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
end;
|
|
2 : // delete table-privs
|
|
begin
|
|
sql := 'DELETE FROM mysql.tables_priv WHERE Host='''+Host+''' AND User='''+User+''' AND Db='''+TreeViewUsers.Selected.Parent.Text+''' AND Table_name='''+TreeViewUsers.Selected.Text+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
ShowPrivilegesControls(false, false, true);
|
|
GetResTables;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
end;
|
|
3 : // delete column-privs
|
|
begin
|
|
sql := 'DELETE FROM mysql.columns_priv WHERE Host='''+Host+''' AND User='''+User+''' AND Db='''+TreeViewUsers.Selected.Parent.Parent.Text+''' AND Table_name='''+TreeViewUsers.Selected.Parent.Text+''' AND Column_name='''+TreeViewUsers.Selected.Text+'''';
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery(sql);
|
|
ShowPrivilegesControls(false, false, true);
|
|
GetResColumns;
|
|
TMDIChild(Mainform.ActiveMDIChild).ExecQuery('FLUSH PRIVILEGES');
|
|
end;
|
|
end;
|
|
Screen.Cursor := crDefault;
|
|
end;
|
|
|
|
procedure TUserManagerForm.ButtonEditUserClick(Sender: TObject);
|
|
begin
|
|
FormEditUser.ShowModal;
|
|
end;
|
|
|
|
procedure TUserManagerForm.Button1Click(Sender: TObject);
|
|
begin
|
|
// free memory
|
|
ZQueryUsers.Active := False;
|
|
ZQueryDBs.Active := False;
|
|
ZQueryTables.Active := False;
|
|
ZQueryColumns.Active := False;
|
|
ZQueryF.Active := False;
|
|
ShowPrivilegesControls(false, true, false);
|
|
TreeViewUsers.Items.Clear;
|
|
PageControl1.OnChange(self);
|
|
end;
|
|
|
|
|
|
procedure TUserManagerForm.GetResUsers;
|
|
begin
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.user', ZQueryUsers );
|
|
end;
|
|
|
|
procedure TUserManagerForm.GetResDBs;
|
|
begin
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.db', ZQueryDBs );
|
|
end;
|
|
|
|
procedure TUserManagerForm.GetResTables;
|
|
begin
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.tables_priv', ZQueryTables );
|
|
end;
|
|
|
|
procedure TUserManagerForm.GetResColumns;
|
|
begin
|
|
TMDIChild(Mainform.ActiveMDIChild).GetResults( 'SELECT * FROM mysql.columns_priv', ZQueryColumns );
|
|
end;
|
|
|
|
end.
|