Skip to content

Commit 86ea19c

Browse files
committed
fix: support backtick quoted user roles, and some other TValueListEditor related bug fixes
Refs #1155
1 parent 2fbb779 commit 86ea19c

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

source/dbconnection.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,7 @@ TDBConnection = class(TComponent)
577577
property KeyCache: TKeyCache read FKeyCache;
578578
property ForeignKeyCache: TForeignKeyCache read FForeignKeyCache;
579579
property CheckConstraintCache: TCheckConstraintCache read FCheckConstraintCache;
580+
property StringQuoteChar: Char read FStringQuoteChar;
580581
property QuoteChar: Char read FQuoteChar;
581582
property QuoteChars: String read FQuoteChars;
582583
function ServerVersionStr: String;

source/usermanager.pas

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ TUserList = class(TObjectList<TUser>)
5353
public
5454
function GetRoleNames: TStringList; overload;
5555
procedure GetRoleNames(Strings: TStrings); overload;
56-
function GetDefaultRoles: TStringList;
56+
function GetDefaultRoles(ExcludeRole: TUser): TStringList;
5757
end;
5858

5959
EInputError = class(Exception);
@@ -556,10 +556,7 @@ procedure TUserManagerForm.ValueListEditorRolesSelectCell(Sender: TObject;
556556
// Disallow assigning a role to itself
557557
if (aRow <= 0) or (aRow > ValueListEditorRoles.Strings.Count) then
558558
Exit;
559-
if SameText(ValueListEditorRoles.Strings.Names[ARow-1], editUsername.Text) then
560-
CanSelect := False
561-
else
562-
ValueListEditorRoles.ItemProps[aRow-1].EditStyle := esPickList;
559+
ValueListEditorRoles.ItemProps[aRow-1].EditStyle := esPickList;
563560
end;
564561

565562
procedure TUserManagerForm.ValueListEditorRolesSetEditText(Sender: TObject;
@@ -628,7 +625,7 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
628625
var
629626
P, Ptmp, PCol: TPrivObj;
630627
User: PUser;
631-
UserHost, Msg, CreateUser: String;
628+
UserHost, UserHostRx, Msg, CreateUser, RxQuotes: String;
632629
Grants, AllPNames, Cols, RoleNames, DefaultRoles: TStringList;
633630
rxTemp, rxGrant: TRegExpr;
634631
i, j: Integer;
@@ -661,13 +658,17 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
661658
editSubject.Clear;
662659
tabPrivileges.Caption := _('Privileges');
663660
tabRoles.Caption := _('Roles');
661+
// All possible quote chars, escaped for RegExpr. Todo: use in all relevant expressions.
662+
RxQuotes := '['+QuoteRegExprMetaChars(FConnection.QuoteChars + FConnection.StringQuoteChar)+']';
664663

665664
if UserSelected then begin
666665
User := Sender.GetNodeData(Node);
667-
if User.IsUser then
668-
UserHost := FConnection.EscapeString(User.Username)+'@'+FConnection.EscapeString(User.Host)
669-
else
670-
UserHost := FConnection.EscapeString(User.Username);
666+
UserHost := FConnection.EscapeString(User.Username);
667+
UserHostRx := RxQuotes + '?' + QuoteRegExprMetaChars(User.Username) + RxQuotes + '?';
668+
if User.IsUser then begin
669+
UserHost := UserHost + '@' + FConnection.EscapeString(User.Host);
670+
UserHostRx := UserHostRx + '@' + RxQuotes + '?' + QuoteRegExprMetaChars(User.Host) + RxQuotes + '?';
671+
end;
671672
editUsername.Text := User.Username;
672673
editFromHost.Text := User.Host;
673674
i := comboDefaultRole.Items.IndexOf(User.DefaultRole);
@@ -829,13 +830,14 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
829830
// GRANT role_admin TO 'root'@'127.0.0.1';
830831
// GRANT 'role space' TO 'root'@'127.0.0.1';
831832
// GRANT role_space to 'role_admin' WITH ADMIN OPTION;
832-
DefaultRoles := FUsers.GetDefaultRoles;
833+
DefaultRoles := FUsers.GetDefaultRoles(User^);
833834
User.Roles.Assign(DefaultRoles);
834835
RoleNames := FUsers.GetRoleNames;
835836
for i:=0 to RoleNames.Count-1 do begin
836837
RoleNames[i] := QuoteRegExprMetaChars(RoleNames[i]);
837838
end;
838-
rxGrant.Expression := '^GRANT\s+''?('+Implode('|', RoleNames)+')''?\s+TO\s+'+QuoteRegExprMetaChars(UserHost)+'(\s+WITH ADMIN OPTION)?$';
839+
rxGrant.Expression := '^GRANT\s+'+RxQuotes+'?('+Implode('|', RoleNames)+')'+RxQuotes+'?\s+'+
840+
'TO\s+'+UserHostRx+'(\s+WITH ADMIN OPTION)?$';
839841
for i:=0 to Grants.Count-1 do begin
840842
// Find selected priv objects via regular expression
841843
if not rxGrant.Exec(Grants[i]) then begin
@@ -849,7 +851,9 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
849851
User.Roles.ValueFromIndex[j] := User.RoleYes;
850852
end;
851853
end;
854+
ValueListEditorRoles.BeginUpdate;
852855
ValueListEditorRoles.Strings.Assign(User.Roles);
856+
ValueListEditorRoles.EndUpdate;
853857
DefaultRoles.Free;
854858

855859
// Parse general user options
@@ -1911,16 +1915,19 @@ procedure TUserList.GetRoleNames(Strings: TStrings);
19111915
RoleNames.Free;
19121916
end;
19131917

1914-
function TUserList.GetDefaultRoles: TStringList;
1918+
function TUserList.GetDefaultRoles(ExcludeRole: TUser): TStringList;
19151919
var
19161920
RoleNames: TStringList;
19171921
i: Integer;
19181922
begin
19191923
// Default role assignments with "no" value for all roles
19201924
Result := TStringList.Create;
19211925
RoleNames := GetRoleNames;
1922-
for i:=0 to RoleNames.Count-1 do
1926+
for i:=0 to RoleNames.Count-1 do begin
1927+
if ExcludeRole.IsRole and SameText(RoleNames[i], ExcludeRole.Username) then
1928+
Continue;
19231929
Result.AddPair(RoleNames[i], TUser.RoleNo);
1930+
end;
19241931
RoleNames.Free;
19251932
end;
19261933

0 commit comments

Comments
 (0)