Skip to content

Commit 419acd7

Browse files
committed
feat: support assigning a default role to a user
Refs #1155
1 parent 1e13f13 commit 419acd7

File tree

4 files changed

+77
-14
lines changed

4 files changed

+77
-14
lines changed

source/dbstructures.mysql.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3395,6 +3395,7 @@ function TMySqlProvider.GetSql(AId: TQueryId): string;
33953395
qReloadPrivileges: Result := 'FLUSH PRIVILEGES';
33963396
qGrantRole: Result := 'GRANT %s TO %s%s';
33973397
qRevokeRole: Result := 'REVOKE %s FROM %s';
3398+
qSetDefaultRole: Result := 'SET DEFAULT ROLE %s FOR %s';
33983399
else Result := inherited;
33993400
end;
34003401
end;

source/dbstructures.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ interface
5151
qGetReverseForeignKeys, qExplain, qSetTimezone,
5252
qShowFunctionStatus, qShowProcedureStatus, qShowTriggers, qShowEvents, qShowCreateTrigger,
5353
qHelpKeyword, qShowWarnings, qGetEnumTypes,
54-
qDropUser, qCreateRole, qDropRole, qReloadPrivileges, qGrantRole, qRevokeRole);
54+
qDropUser, qCreateRole, qDropRole, qReloadPrivileges, qGrantRole, qRevokeRole, qSetDefaultRole);
5555
TSqlProvider = class
5656
strict protected
5757
FNetType: TNetType;

source/usermanager.dfm

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ object UserManagerForm: TUserManagerForm
214214
Left = 0
215215
Top = 0
216216
Width = 283
217-
Height = 145
217+
Height = 177
218218
ActivePage = tabCredentials
219219
Align = alTop
220220
TabOrder = 0
221221
object tabCredentials: TTabSheet
222222
Caption = 'Credentials'
223223
DesignSize = (
224224
275
225-
116)
225+
148)
226226
object lblUsername: TLabel
227227
Left = 3
228228
Top = 10
@@ -254,6 +254,13 @@ object UserManagerForm: TUserManagerForm
254254
Caption = 'Repeat password:'
255255
FocusControl = editRepeatPassword
256256
end
257+
object lblDefaultRole: TLabel
258+
Left = 3
259+
Top = 120
260+
Width = 67
261+
Height = 14
262+
Caption = 'Default role:'
263+
end
257264
object editRepeatPassword: TEdit
258265
Left = 176
259266
Top = 88
@@ -301,13 +308,23 @@ object UserManagerForm: TUserManagerForm
301308
TabOrder = 0
302309
OnChange = Modification
303310
end
311+
object comboDefaultRole: TComboBox
312+
Left = 176
313+
Top = 116
314+
Width = 96
315+
Height = 22
316+
Style = csDropDownList
317+
Anchors = [akLeft, akTop, akRight]
318+
TabOrder = 4
319+
OnChange = Modification
320+
end
304321
end
305322
object tabLimitations: TTabSheet
306323
Caption = 'Limitations'
307324
ImageIndex = 1
308325
DesignSize = (
309326
275
310-
116)
327+
148)
311328
object lblMaxQueries: TLabel
312329
Left = 3
313330
Top = 10
@@ -431,7 +448,7 @@ object UserManagerForm: TUserManagerForm
431448
ImageIndex = 2
432449
DesignSize = (
433450
275
434-
116)
451+
148)
435452
object lblCipher: TLabel
436453
Left = 3
437454
Top = 36
@@ -512,9 +529,9 @@ object UserManagerForm: TUserManagerForm
512529
end
513530
object PageControlAccess: TPageControl
514531
Left = 0
515-
Top = 145
532+
Top = 177
516533
Width = 283
517-
Height = 171
534+
Height = 139
518535
ActivePage = tabPrivileges
519536
Align = alClient
520537
TabOrder = 1
@@ -524,7 +541,7 @@ object UserManagerForm: TUserManagerForm
524541
Left = 0
525542
Top = 22
526543
Width = 275
527-
Height = 120
544+
Height = 88
528545
Align = alClient
529546
Header.AutoSizeIndex = 0
530547
Header.Height = 14
@@ -581,7 +598,7 @@ object UserManagerForm: TUserManagerForm
581598
Left = 0
582599
Top = 0
583600
Width = 275
584-
Height = 142
601+
Height = 110
585602
Align = alClient
586603
Strings.Strings = (
587604
'Roll=off')

source/usermanager.pas

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
18371873
end;
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+
18391884
function TUserList.GetDefaultRoles: TStringList;
18401885
var
18411886
RoleNames: TStringList;

0 commit comments

Comments
 (0)