Skip to content

Commit 12de69b

Browse files
author
Travis Fields
committed
FM-1556 Change permission to permissions and allow for array
1 parent 0b97c1d commit 12de69b

File tree

6 files changed

+48
-37
lines changed

6 files changed

+48
-37
lines changed

manifests/login/permission.pp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
# [login]
1111
# The login for which the permission will be manage.
1212
#
13-
# [permission]
14-
# The permission you would like managed. i.e. 'SELECT', 'INSERT', 'UPDATE', 'DELETE'
13+
# [permissions]
14+
# An array of permissions you would like managed. i.e. ['SELECT', 'INSERT', 'UPDATE', 'DELETE']
1515
#
1616
# [state]
1717
# The state you would like the permission in. Accepts 'GRANT', 'DENY', 'REVOKE' Please note that REVOKE equates to absent and will default to database and system level permissions.
@@ -22,17 +22,16 @@
2222
##
2323
define sqlserver::login::permission (
2424
$login,
25-
$permission = $title,
25+
$permissions,
2626
$state = 'GRANT',
2727
$with_grant_option = false,
2828
$instance = 'MSSQLSERVER',
2929
){
3030
sqlserver_validate_instance_name($instance)
3131

3232
## Validate Permissions
33-
$_permission = upcase($permission)
34-
sqlserver_validate_range($_permission, 4, 128, 'Permission must be between 4 and 128 characters')
35-
validate_re($_permission, '^([A-Z]|\s)+$', 'Permissions must be alphabetic only')
33+
sqlserver_validate_range($permissions, 4, 128, 'Permission must be between 4 and 128 characters')
34+
validate_array($permissions)
3635

3736
sqlserver_validate_range($login, 1, 128, 'Login must be between 1 and 128 characters')
3837

@@ -41,8 +40,10 @@
4140
validate_re($_state,'^(GRANT|REVOKE|DENY)$', "State parameter can only be one of 'GRANT', 'REVOKE' or 'DENY', you passed a value of ${state}")
4241

4342
validate_bool($with_grant_option)
44-
45-
sqlserver_tsql{ "login-permission-${instance}-${login}-${_permission}":
43+
if $with_grant_option {
44+
$grant_option = "-WITH_GRANT_OPTION"
45+
}
46+
sqlserver_tsql{ "login-permission-${instance}-${login}-${_state}${grant_option}":
4647
instance => $instance,
4748
command => template('sqlserver/create/login/permission.sql.erb'),
4849
onlyif => template('sqlserver/query/login/permission_exists.sql.erb'),

spec/defines/login/permission_spec.rb

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
context 'validation errors' do
77
include_context 'manifests' do
88
let(:title) { 'myTitle' }
9-
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-SELECT' }
9+
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-GRANT' }
1010
end
1111
context 'login =>' do
1212
let(:params) { {
13-
:permission => 'SELECT',
13+
:permissions=> ['SELECT'],
1414
} }
1515
let(:raise_error_check) { 'Login must be between 1 and 128 characters' }
1616
describe 'missing' do
@@ -32,21 +32,21 @@
3232
} }
3333
let(:raise_error_check) { 'Permission must be between 4 and 128 characters' }
3434
describe 'empty' do
35-
let(:additional_params) { {:permission => ''} }
35+
let(:additional_params) { {:permissions=> ['']} }
3636
it_behaves_like 'validation error'
3737
end
3838
describe 'under limit' do
39-
let(:additional_params) { {:permission => random_string_of_size(3, false)} }
39+
let(:additional_params) { {:permissions=> [random_string_of_size(3, false)]} }
4040
it_behaves_like 'validation error'
4141
end
4242
describe 'over limit' do
43-
let(:additional_params) { {:permission => random_string_of_size(129, false)} }
43+
let(:additional_params) { {:permissions=> [random_string_of_size(129, false)]} }
4444
it_behaves_like 'validation error'
4545
end
4646
end
4747
context 'state =>' do
4848
let(:params) { {
49-
:permission => 'SELECT',
49+
:permissions=> ['SELECT'],
5050
:login => 'loggingUser'
5151
} }
5252
describe 'invalid' do
@@ -59,15 +59,15 @@
5959
context 'successfully' do
6060
include_context 'manifests' do
6161
let(:title) { 'myTitle' }
62-
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-SELECT' }
62+
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-GRANT' }
6363
let(:params) { {
6464
:login => 'loggingUser',
65-
:permission => 'SELECT',
65+
:permissions=> ['SELECT'],
6666
} }
6767
end
6868
%w(revoke grant deny).each do |state|
6969
context "state => '#{state}'" do
70-
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-SELECT" }
70+
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-#{state.upcase}" }
7171
let(:should_contain_command) { ["#{state.upcase} SELECT TO [loggingUser];", 'USE [master];'] }
7272
describe "lowercase #{state}" do
7373
let(:additional_params) { {:state => state} }
@@ -84,15 +84,15 @@
8484
context 'permission' do
8585
describe 'upper limit' do
8686
permission =random_string_of_size(128, false)
87-
let(:additional_params) { {:permission => permission} }
88-
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-#{permission.upcase}" }
87+
let(:additional_params) { {:permissions => [permission]} }
88+
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-GRANT" }
8989
let(:should_contain_command) { ['USE [master];'] }
9090
it_behaves_like 'sqlserver_tsql command'
9191
end
9292
describe 'alter' do
93-
let(:additional_params) { {:permission => 'ALTER'} }
93+
let(:additional_params) { {:permissions=> ['ALTER']} }
9494
let(:should_contain_command) { ['USE [master];', 'GRANT ALTER TO [loggingUser];'] }
95-
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-ALTER" }
95+
let(:sqlserver_tsql_title) { "login-permission-MSSQLSERVER-loggingUser-GRANT" }
9696
it_behaves_like 'sqlserver_tsql command'
9797
end
9898
end
@@ -111,10 +111,10 @@
111111
context 'command syntax' do
112112
include_context 'manifests' do
113113
let(:title) { 'myTitle' }
114-
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-SELECT' }
114+
let(:sqlserver_tsql_title) { 'login-permission-MSSQLSERVER-loggingUser-GRANT' }
115115
let(:params) { {
116116
:login => 'loggingUser',
117-
:permission => 'SELECT',
117+
:permissions => ['SELECT'],
118118
} }
119119
describe '' do
120120
let(:should_contain_command) { [
@@ -123,8 +123,8 @@
123123
/DECLARE @perm_state varchar\(250\)/,
124124
/SET @perm_state = ISNULL\(\n\s+\(SELECT perm.state_desc FROM sys\.server_permissions perm\n\s+JOIN sys\./,
125125
/JOIN sys\.server_principals princ ON princ.principal_id = perm\.grantee_principal_id\n\s+WHERE/,
126-
/WHERE princ\.type IN \('U','S','G'\)\n\s+ AND princ\.name = 'loggingUser'\n\s+AND perm\.permission_name = 'SELECT'\),\n\s+'REVOKE'\)/,
127-
/DECLARE @error_msg varchar\(250\);\nSET @error_msg = 'EXPECTED login \[loggingUser\] to have permission \[SELECT\] with GRANT but got ' \+ @perm_state;/,
126+
/WHERE princ\.type IN \('U','S','G'\)\n\s+ AND princ\.name = 'loggingUser'\n\s+AND perm\.permission_name = @permission\),\n\s+'REVOKE'\)/,
127+
/SET @error_msg = 'EXPECTED login \[loggingUser\] to have permission \[' \+ @permission \+ '\] with GRANT but got ' \+ @perm_state;/,
128128
/IF @perm_state != 'GRANT'\n\s+THROW 51000, @error_msg, 10/
129129
] }
130130
it_behaves_like 'sqlserver_tsql command'
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1+
USE [master];
2+
DECLARE @perm_state varchar(250), @error_msg varchar(250), @permission varchar(250);
3+
<% @permissions.each do |permission|
4+
permission.upcase!
5+
%>
6+
SET @permission = '<%= permission %>'
17
BEGIN
2-
USE [master];
38
<% if @with_grant_option == false %>
49
IF 'GRANT_WITH_GRANT_OPTION' = <%= scope.function_template(['sqlserver/snippets/login/get_perm_state.sql.erb']) %>
5-
REVOKE GRANT OPTION FOR <%= @_permission %> TO [<%= @login %>] CASCADE;
10+
REVOKE GRANT OPTION FOR <%= permission %> TO [<%= @login %>] CASCADE;
611
<% end %>
7-
<%= @_state %> <%= @_permission %> TO [<%= @login %>]<% if @with_grant_option == true %> WITH GRANT OPTION<% end %>;
12+
<%= @_state %> <%= permission %> TO [<%= @login %>]<% if @with_grant_option == true %> WITH GRANT OPTION<% end %>;
813
END
914
BEGIN
10-
<%= scope.function_template(['sqlserver/query/login/permission_exists.sql.erb']) %>
15+
<%= scope.function_template(['sqlserver/snippets/login/permission/exists.sql.erb']) %>
1116
END
17+
<% end %>
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
USE [master];
2-
DECLARE @perm_state varchar(250);
3-
SET @perm_state = <%= scope.function_template(['sqlserver/snippets/login/get_perm_state.sql.erb']) %>;
4-
DECLARE @error_msg varchar(250);
5-
SET @error_msg = 'EXPECTED login [<%= @login %>] to have permission [<%= @_permission %>] with <%= @_state %> but got ' + @perm_state;
6-
7-
IF @perm_state != '<% if @with_grant_option == true %>GRANT_WITH_GRANT_OPTION<% else %><%= @_state %><% end %>'
8-
THROW 51000, @error_msg, 10
2+
DECLARE @perm_state varchar(250), @error_msg varchar(250), @permission varchar(250);
3+
<% @permissions.each do |permission|
4+
permission.upcase!
5+
%>
6+
SET @permission = '<%= permission %>'
7+
<%= scope.function_template(['sqlserver/snippets/login/permission/exists.sql.erb']) %>
8+
<% end %>

templates/snippets/login/get_perm_state.sql.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ ISNULL(
33
JOIN sys.server_principals princ ON princ.principal_id = perm.grantee_principal_id
44
WHERE princ.type IN ('U','S','G')
55
AND princ.name = '<%= @login %>'
6-
AND perm.permission_name = '<%= @_permission %>'),
6+
AND perm.permission_name = @permission),
77
'REVOKE')
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
SET @perm_state = <%= scope.function_template(['sqlserver/snippets/login/get_perm_state.sql.erb']) %>;
2+
SET @error_msg = 'EXPECTED login [<%= @login %>] to have permission [' + @permission + '] with <%= @_state %> but got ' + @perm_state;
3+
IF @perm_state != '<% if @with_grant_option == true %>GRANT_WITH_GRANT_OPTION<% else %><%= @_state %><% end %>'
4+
THROW 51000, @error_msg, 10;

0 commit comments

Comments
 (0)