Skip to content

Commit

Permalink
db plugin: support multiline revoke stmt in postgres (#18632)
Browse files Browse the repository at this point in the history
* db plugin: support multiline revoke stmt in postgres

* add changelong
  • Loading branch information
fairclothjm authored Jan 10, 2023
1 parent 4758cc8 commit 7517e39
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
3 changes: 3 additions & 0 deletions changelog/18632.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:improvement
database/postgres: Support multiline strings for revocation statements.
```
11 changes: 11 additions & 0 deletions plugins/database/postgresql/postgresql.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,17 @@ func (p *PostgreSQL) customDeleteUser(ctx context.Context, username string, revo
}()

for _, stmt := range revocationStmts {
if containsMultilineStatement(stmt) {
// Execute it as-is.
m := map[string]string{
"name": username,
"username": username,
}
if err := dbtxn.ExecuteTxQueryDirect(ctx, tx, m, stmt); err != nil {
return err
}
continue
}
for _, query := range strutil.ParseArbitraryStringSlice(stmt, ";") {
query = strings.TrimSpace(query)
if len(query) == 0 {
Expand Down
13 changes: 13 additions & 0 deletions plugins/database/postgresql/postgresql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,19 @@ func TestDeleteUser(t *testing.T) {
// Wait for a short time before checking because postgres takes a moment to finish deleting the user
credsAssertion: assertCredsExistAfter(100 * time.Millisecond),
},
"multiline": {
revokeStmts: []string{`
DO $$ BEGIN
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM "{{username}}";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM "{{username}}";
REVOKE USAGE ON SCHEMA public FROM "{{username}}";
DROP ROLE IF EXISTS "{{username}}";
END $$;
`},
expectErr: false,
// Wait for a short time before checking because postgres takes a moment to finish deleting the user
credsAssertion: waitUntilCredsDoNotExist(2 * time.Second),
},
}

// Shared test container for speed - there should not be any overlap between the tests
Expand Down

0 comments on commit 7517e39

Please sign in to comment.