@@ -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
@@ -131,6 +132,8 @@ TUserManagerForm = class(TExtForm)
131132 tlbObjects: TToolBar;
132133 btnAddObject: TToolButton;
133134 ValueListEditorRoles: TValueListEditor;
135+ lblDefaultRole: TLabel;
136+ comboDefaultRole: TComboBox;
134137 procedure FormCreate (Sender: TObject);
135138 procedure FormShow (Sender: TObject);
136139 procedure btnAddUserClick (Sender: TObject);
@@ -190,7 +193,7 @@ TUserManagerForm = class(TExtForm)
190193 { Private declarations }
191194 FUsers: TUserList;
192195 FModified, FAdded: Boolean;
193- FHasIsRole: Boolean;
196+ FHasIsRole, FHasDefaultRole : Boolean;
194197 FCloneGrants: TStringList;
195198 FPrivObjects: TPrivObjList;
196199 FPrivsGlobal, FPrivsDb, FPrivsTable, FPrivsRoutine, FPrivsColumn: TStringList;
@@ -261,7 +264,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
261264 Version, i: Integer;
262265 Users: TDBQuery;
263266 U: TUser;
264- tmp, PasswordExpr, IsRoleExpr: String;
267+ tmp, PasswordExpr, IsRoleExpr, DefaultRoleExpr : String;
265268 SkipNameResolve,
266269 HasPassword, HasAuthString: Boolean;
267270 PasswordLengthMatters: Boolean;
@@ -394,6 +397,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
394397 HasPassword := UserTableColumns.IndexOf(' password' ) > -1 ;
395398 HasAuthString := UserTableColumns.IndexOf(' authentication_string' ) > -1 ;
396399 FHasIsRole := UserTableColumns.IndexOf(' is_role' ) > -1 ;
400+ FHasDefaultRole := UserTableColumns.IndexOf(' default_role' ) > -1 ;
397401 if HasPassword and (not HasAuthString) then
398402 PasswordExpr := ' password'
399403 else if (not HasPassword) and HasAuthString then
@@ -404,13 +408,15 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
404408 Raise Exception.Create(_(' No password hash column available' ));
405409 PasswordExpr := PasswordExpr + ' AS ' + FConnection.QuoteIdent(' password' );
406410 IsRoleExpr := IfThen(FHasIsRole, ' is_role' , FConnection.EscapeString(' N' )+' AS is_role' );
411+ DefaultRoleExpr := IfThen(FHasDefaultRole, ' default_role' , FConnection.EscapeString(' ' )+' AS default_role' );
407412
408413 Users := FConnection.GetResults(
409414 ' SELECT ' +
410415 FConnection.QuoteIdent(' user' ) + ' , ' +
411416 FConnection.QuoteIdent(' host' ) + ' , ' +
412417 PasswordExpr + ' , ' +
413- IsRoleExpr + ' ' +
418+ IsRoleExpr + ' , ' +
419+ DefaultRoleExpr + ' ' +
414420 ' FROM ' +FConnection.QuoteIdent(' mysql' )+' .' +FConnection.QuoteIdent(' user' )
415421 );
416422 FUsers := TUserList.Create(True);
@@ -421,6 +427,7 @@ procedure TUserManagerForm.FormShow(Sender: TObject);
421427 U.Host := Users.Col(' host' );
422428 U.Password := Users.Col(' password' );
423429 U.IsRole := UpperCase(Users.Col(' is_role' )) = ' Y' ;
430+ U.DefaultRole := Users.Col(' default_role' );
424431 U.Problem := upNone;
425432 if U.IsUser then begin
426433 if Length(U.Password) = 0 then
@@ -605,6 +612,10 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
605612 editPassword.Clear;
606613 editPassword.TextHint := ' ' ;
607614 editRepeatPassword.Clear;
615+ comboDefaultRole.Items.Clear;
616+ comboDefaultRole.Items.Add(_(' None' ));
617+ FUsers.GetRoleNames(comboDefaultRole.Items);
618+ comboDefaultRole.ItemIndex := 0 ;
608619 udMaxQueries.Position := 0 ;
609620 udMaxUpdates.Position := 0 ;
610621 udMaxConnections.Position := 0 ;
@@ -625,6 +636,10 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
625636 UserHost := FConnection.EscapeString(User.Username);
626637 editUsername.Text := User.Username;
627638 editFromHost.Text := User.Host;
639+ i := comboDefaultRole.Items.IndexOf(User.DefaultRole);
640+ if i > -1 then
641+ comboDefaultRole.ItemIndex := i;
642+
628643 Caption := Caption + ' - ' + User.Username;
629644
630645 AllPNames := TStringList.Create;
@@ -863,6 +878,8 @@ procedure TUserManagerForm.listUsersFocusChanged(Sender: TBaseVirtualTree; Node:
863878 editPassword.Enabled := UserSelected and User.IsUser;
864879 lblRepeatPassword.Enabled := UserSelected and User.IsUser;
865880 editRepeatPassword.Enabled := UserSelected and User.IsUser;
881+ comboDefaultRole.Enabled := UserSelected and User.IsUser and FHasDefaultRole;
882+ lblDefaultRole.Enabled := comboDefaultRole.Enabled;
866883 tabCredentials.Enabled := UserSelected;
867884 lblMaxQueries.Enabled := UserSelected and User.IsUser and (FConnection.ServerVersionInt >= 40002 );
868885
@@ -1482,6 +1499,23 @@ procedure TUserManagerForm.btnSaveClick(Sender: TObject);
14821499 end ;
14831500 end ;
14841501
1502+ // Set default role
1503+ if comboDefaultRole.Enabled and (comboDefaultRole.ItemIndex > -1 ) then begin
1504+ if comboDefaultRole.ItemIndex = 0 then begin
1505+ FConnection.Query(qSetDefaultRole, [' NONE' , OrgUserHost]);
1506+ end
1507+ else try
1508+ RoleName := comboDefaultRole.Text;
1509+ RoleAssigned := ValueListEditorRoles.Strings.Values[RoleName];
1510+ if (RoleAssigned = TUser.RoleYes) or (RoleAssigned = TUser.RoleYesAdmin) then
1511+ FConnection.Query(qSetDefaultRole, [FConnection.EscapeString(RoleName), OrgUserHost]);
1512+ except
1513+ on E:EDbError do ; // Happens when this role was not granted before
1514+ end ;
1515+ FConnection.ShowWarnings;
1516+ end ;
1517+
1518+
14851519 // Rename user
14861520 if (FocusedUser.Username <> editUsername.Text) or (FocusedUser.Host <> editFromHost.Text) then begin
14871521
@@ -1514,6 +1548,7 @@ procedure TUserManagerForm.btnSaveClick(Sender: TObject);
15141548 FocusedUser.Host := editFromHost.Text;
15151549 if editPassword.Modified then
15161550 FocusedUser.Password := editPassword.Text;
1551+ FocusedUser.DefaultRole := IfThen(comboDefaultRole.ItemIndex=0 , ' ' , comboDefaultRole.Text);
15171552 FocusedUser.SSL := comboSSL.ItemIndex;
15181553 FocusedUser.Cipher := editCipher.Text;
15191554 FocusedUser.Issuer := editIssuer.Text;
@@ -1714,6 +1749,7 @@ constructor TUser.Create;
17141749 Username := ' ' ;
17151750 Host := ' ' ;
17161751 Password := ' ' ;
1752+ DefaultRole := ' ' ;
17171753 Cipher := ' ' ;
17181754 Issuer := ' ' ;
17191755 Subject := ' ' ;
@@ -1836,6 +1872,15 @@ function TUserList.GetRoleNames: TStringList;
18361872 end ;
18371873end ;
18381874
1875+ procedure TUserList.GetRoleNames (Strings: TStrings);
1876+ var
1877+ RoleNames: TStringList;
1878+ begin
1879+ RoleNames := GetRoleNames;
1880+ Strings.AddStrings(RoleNames);
1881+ RoleNames.Free;
1882+ end ;
1883+
18391884function TUserList.GetDefaultRoles : TStringList;
18401885var
18411886 RoleNames: TStringList;
0 commit comments