@@ -32,7 +32,7 @@ TPrivComparer = class(TComparer<TPrivObj>)
3232 TUserProblem = (upNone, upEmptyPassword, upInvalidPasswordLen, upSkipNameResolve, upUnknown);
3333
3434 TUser = class (TObject)
35- Username, Host, Password, Cipher, Issuer, Subject: String;
35+ Username, Host, Password, Cipher, Issuer, Subject, DefaultRole : String;
3636 MaxQueries, MaxUpdates, MaxConnections, MaxUserConnections, SSL: Integer;
3737 Problem: TUserProblem;
3838 IsRole: Boolean;
@@ -51,7 +51,8 @@ TUser = class(TObject)
5151 PUser = ^TUser;
5252 TUserList = class (TObjectList<TUser>)
5353 public
54- function GetRoleNames : TStringList;
54+ function GetRoleNames : TStringList; overload;
55+ procedure GetRoleNames (Strings: TStrings); overload;
5556 function GetDefaultRoles : TStringList;
5657 end ;
5758
@@ -130,6 +131,8 @@ TUserManagerForm = class(TExtForm)
130131 tlbObjects: TToolBar;
131132 btnAddObject: TToolButton;
132133 ValueListEditorRoles: TValueListEditor;
134+ lblDefaultRole: TLabel;
135+ comboDefaultRole: TComboBox;
133136 procedure btnCancelClick (Sender: TObject);
134137 procedure editFromHostButtonClick (Sender: TObject);
135138 procedure editPasswordButtonClick (Sender: TObject);
@@ -193,7 +196,7 @@ TUserManagerForm = class(TExtForm)
193196 { Private declarations }
194197 FUsers: TUserList;
195198 FModified, FAdded: Boolean;
196- FHasIsRole: Boolean;
199+ FHasIsRole, FHasDefaultRole : Boolean;
197200 FCloneGrants: TStringList;
198201 FPrivObjects: TPrivObjList;
199202 FPrivsGlobal, FPrivsDb, FPrivsTable, FPrivsRoutine, FPrivsColumn: TStringList;
@@ -257,6 +260,8 @@ procedure TUserManagerForm.FormCreate(Sender: TObject);
257260 ' REPLICATION SLAVE ADMIN,SET USER,SLAVE MONITOR' );
258261 FixVT(listUsers);
259262 FixVT(treePrivs);
263+ FHasIsRole := False;
264+ FHasDefaultRole := False;
260265end ;
261266
262267procedure TUserManagerForm.FormDestroy (Sender: TObject);
@@ -289,7 +294,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
289294 Version, i: Integer;
290295 Users: TDBQuery;
291296 U: TUser;
292- tmp, PasswordExpr, IsRoleExpr: String;
297+ tmp, PasswordExpr, IsRoleExpr, DefaultRoleExpr : String;
293298 SkipNameResolve,
294299 HasPassword, HasAuthString: Boolean;
295300 PasswordLengthMatters: Boolean;
@@ -419,6 +424,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
419424 HasPassword := UserTableColumns.IndexOf(' password' ) > -1 ;
420425 HasAuthString := UserTableColumns.IndexOf(' authentication_string' ) > -1 ;
421426 FHasIsRole := UserTableColumns.IndexOf(' is_role' ) > -1 ;
427+ FHasDefaultRole := UserTableColumns.IndexOf(' default_role' ) > -1 ;
422428 if HasPassword and (not HasAuthString) then
423429 PasswordExpr := ' password'
424430 else if (not HasPassword) and HasAuthString then
@@ -429,13 +435,15 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
429435 Raise Exception.Create(_(' No password hash column available' ));
430436 PasswordExpr := PasswordExpr + ' AS ' + FConnection.QuoteIdent(' password' );
431437 IsRoleExpr := IfThen(FHasIsRole, ' is_role' , FConnection.EscapeString(' N' )+' AS is_role' );
438+ DefaultRoleExpr := IfThen(FHasDefaultRole, ' default_role' , FConnection.EscapeString(' ' )+' AS default_role' );
432439
433440 Users := FConnection.GetResults(
434441 ' SELECT ' +
435442 FConnection.QuoteIdent(' user' ) + ' , ' +
436443 FConnection.QuoteIdent(' host' ) + ' , ' +
437444 PasswordExpr + ' , ' +
438- IsRoleExpr + ' ' +
445+ IsRoleExpr + ' , ' +
446+ DefaultRoleExpr + ' ' +
439447 ' FROM ' +FConnection.QuoteIdent(' mysql' )+' .' +FConnection.QuoteIdent(' user' )
440448 );
441449 FUsers := TUserList.Create(True);
@@ -446,6 +454,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
446454 U.Host := Users.Col(' host' );
447455 U.Password := Users.Col(' password' );
448456 U.IsRole := UpperCase(Users.Col(' is_role' )) = ' Y' ;
457+ U.DefaultRole := Users.Col(' default_role' );
449458 U.Problem := upNone;
450459 if U.IsUser then begin
451460 if Length(U.Password) = 0 then
@@ -635,6 +644,10 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
635644 editPassword.Clear;
636645 editPassword.TextHint := ' ' ;
637646 editRepeatPassword.Clear;
647+ comboDefaultRole.Items.Clear;
648+ comboDefaultRole.Items.Add(_(' None' ));
649+ FUsers.GetRoleNames(comboDefaultRole.Items);
650+ comboDefaultRole.ItemIndex := 0 ;
638651 spinMaxQueries.Value := 0 ;
639652 spinMaxUpdates.Value := 0 ;
640653 spinMaxConnections.Value := 0 ;
@@ -655,6 +668,10 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
655668 UserHost := FConnection.EscapeString(User.Username);
656669 editUsername.Text := User.Username;
657670 editFromHost.Text := User.Host;
671+ i := comboDefaultRole.Items.IndexOf(User.DefaultRole);
672+ if i > -1 then
673+ comboDefaultRole.ItemIndex := i;
674+
658675 Caption := Caption + ' - ' + User.Username;
659676
660677 AllPNames := TStringList.Create;
@@ -893,6 +910,8 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
893910 editPassword.Enabled := UserSelected and User.IsUser;
894911 lblRepeatPassword.Enabled := UserSelected and User.IsUser;
895912 editRepeatPassword.Enabled := UserSelected and User.IsUser;
913+ comboDefaultRole.Enabled := UserSelected and User.IsUser and FHasDefaultRole;
914+ lblDefaultRole.Enabled := comboDefaultRole.Enabled;
896915 tabCredentials.Enabled := UserSelected;
897916 lblMaxQueries.Enabled := UserSelected and User.IsUser and (FConnection.ServerVersionInt >= 40002 );
898917
@@ -1508,6 +1527,23 @@ procedure TUserManagerForm.btnSaveClick(Sender: TObject);
15081527 end ;
15091528 end ;
15101529
1530+ // Set default role
1531+ if comboDefaultRole.Enabled and (comboDefaultRole.ItemIndex > -1 ) then begin
1532+ if comboDefaultRole.ItemIndex = 0 then begin
1533+ FConnection.Query(qSetDefaultRole, [' NONE' , OrgUserHost]);
1534+ end
1535+ else try
1536+ RoleName := comboDefaultRole.Text;
1537+ RoleAssigned := ValueListEditorRoles.Strings.Values[RoleName];
1538+ if (RoleAssigned = TUser.RoleYes) or (RoleAssigned = TUser.RoleYesAdmin) then
1539+ FConnection.Query(qSetDefaultRole, [FConnection.EscapeString(RoleName), OrgUserHost]);
1540+ except
1541+ on E:EDbError do ; // Happens when this role was not granted before
1542+ end ;
1543+ FConnection.ShowWarnings;
1544+ end ;
1545+
1546+
15111547 // Rename user
15121548 if (FocusedUser.Username <> editUsername.Text) or (FocusedUser.Host <> editFromHost.Text) then begin
15131549
@@ -1540,6 +1576,7 @@ procedure TUserManagerForm.btnSaveClick(Sender: TObject);
15401576 FocusedUser.Host := editFromHost.Text;
15411577 if editPassword.Modified then
15421578 FocusedUser.Password := editPassword.Text;
1579+ FocusedUser.DefaultRole := IfThen(comboDefaultRole.ItemIndex=0 , ' ' , comboDefaultRole.Text);
15431580 FocusedUser.SSL := comboSSL.ItemIndex;
15441581 FocusedUser.Cipher := editCipher.Text;
15451582 FocusedUser.Issuer := editIssuer.Text;
@@ -1740,6 +1777,7 @@ constructor TUser.Create;
17401777 Username := ' ' ;
17411778 Host := ' ' ;
17421779 Password := ' ' ;
1780+ DefaultRole := ' ' ;
17431781 Cipher := ' ' ;
17441782 Issuer := ' ' ;
17451783 Subject := ' ' ;
@@ -1862,6 +1900,15 @@ function TUserList.GetRoleNames: TStringList;
18621900 end ;
18631901end ;
18641902
1903+ procedure TUserList.GetRoleNames (Strings: TStrings);
1904+ var
1905+ RoleNames: TStringList;
1906+ begin
1907+ RoleNames := GetRoleNames;
1908+ Strings.AddStrings(RoleNames);
1909+ RoleNames.Free;
1910+ end ;
1911+
18651912function TUserList.GetDefaultRoles : TStringList;
18661913var
18671914 RoleNames: TStringList;
0 commit comments