@@ -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;
563560end ;
564561
565562procedure TUserManagerForm.ValueListEditorRolesSetEditText (Sender: TObject;
@@ -628,7 +625,7 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
628625var
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;
19121916end ;
19131917
1914- function TUserList.GetDefaultRoles : TStringList;
1918+ function TUserList.GetDefaultRoles (ExcludeRole: TUser) : TStringList;
19151919var
19161920 RoleNames: TStringList;
19171921 i: Integer;
19181922begin
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;
19251932end ;
19261933
0 commit comments