Skip to content

Commit 3a3dcad

Browse files
author
Matthias Fuhrmeister
committed
Allow writer user to create tables in schema
In postgres 15 they change the behaviour of the public schema. Now only the owner can create tables in this schema. And the user is in charge to configure the permissions. Grant the writer user to also create tables in a schema. add the public schema explicitly to the list of schemas to create, to force the schema privileges to be applied.
1 parent 027cc24 commit 3a3dcad

File tree

5 files changed

+41
-0
lines changed

5 files changed

+41
-0
lines changed

pkg/controller/postgres/postgres_controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,11 @@ func (r *ReconcilePostgres) Reconcile(request reconcile.Request) (_ reconcile.Re
230230
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions \"%s\"", writer, writerPrivs))
231231
continue
232232
}
233+
err = r.pg.SetSchemaPrivilegesCreate(database, owner, writer, schema, writerPrivs, reqLogger)
234+
if err != nil {
235+
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions \"%s\"", writer, writerPrivs))
236+
continue
237+
}
233238

234239
instance.Status.Schemas = append(instance.Status.Schemas, schema)
235240
}

pkg/controller/postgres/postgres_controller_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,9 +683,11 @@ var _ = Describe("ReconcilePostgres", func() {
683683
// customers schema
684684
pg.EXPECT().CreateSchema(name, name+"-group", "customers", gomock.Any()).Return(nil).Times(1)
685685
pg.EXPECT().SetSchemaPrivileges(name, name+"-group", gomock.Any(), "customers", gomock.Any(), gomock.Any()).Return(nil).Times(2)
686+
pg.EXPECT().SetSchemaPrivilegesCreate(name, name+"-group", name+"-writer", "customers", gomock.Any(), gomock.Any()).Return(nil).Times(1)
686687
// stores schema
687688
pg.EXPECT().CreateSchema(name, name+"-group", "stores", gomock.Any()).Return(nil).Times(1)
688689
pg.EXPECT().SetSchemaPrivileges(name, name+"-group", gomock.Any(), "stores", gomock.Any(), gomock.Any()).Return(nil).Times(2)
690+
pg.EXPECT().SetSchemaPrivilegesCreate(name, name+"-group", name+"-writer", "stores", gomock.Any(), gomock.Any()).Return(nil).Times(1)
689691
})
690692

691693
It("should update status", func() {
@@ -708,9 +710,11 @@ var _ = Describe("ReconcilePostgres", func() {
708710
// customers schema errors
709711
pg.EXPECT().CreateSchema(name, name+"-group", "customers", gomock.Any()).Return(fmt.Errorf("Could not create schema")).Times(1)
710712
pg.EXPECT().SetSchemaPrivileges(name, name+"-group", gomock.Any(), "customers", gomock.Any(), gomock.Any()).Return(nil).Times(0)
713+
pg.EXPECT().SetSchemaPrivilegesCreate(name, name+"-group", name+"-writer", "customers", gomock.Any(), gomock.Any()).Return(nil).Times(0)
711714
// stores schema
712715
pg.EXPECT().CreateSchema(name, name+"-group", "stores", gomock.Any()).Return(nil).Times(1)
713716
pg.EXPECT().SetSchemaPrivileges(name, name+"-group", gomock.Any(), "stores", gomock.Any(), gomock.Any()).Return(nil).Times(2)
717+
pg.EXPECT().SetSchemaPrivilegesCreate(name, name+"-group", name+"-writer", "stores", gomock.Any(), gomock.Any()).Return(nil).Times(1)
714718
})
715719

716720
It("should update status", func() {
@@ -752,6 +756,7 @@ var _ = Describe("ReconcilePostgres", func() {
752756
// customers schema
753757
pg.EXPECT().CreateSchema(name, name+"-group", "customers", gomock.Any()).Return(nil).Times(1)
754758
pg.EXPECT().SetSchemaPrivileges(name, name+"-group", gomock.Any(), "customers", gomock.Any(), gomock.Any()).Return(nil).Times(2)
759+
pg.EXPECT().SetSchemaPrivilegesCreate(name, name+"-group", name+"-writer", "customers", gomock.Any(), gomock.Any()).Return(nil).Times(1)
755760
// stores schema already exists
756761
pg.EXPECT().CreateSchema(name, name+"-group", "stores", gomock.Any()).Times(0)
757762
// Call reconcile

pkg/postgres/database.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const (
1414
ALTER_DB_OWNER = `ALTER DATABASE "%s" OWNER TO "%s"`
1515
DROP_DATABASE = `DROP DATABASE "%s"`
1616
GRANT_USAGE_SCHEMA = `GRANT USAGE ON SCHEMA "%s" TO "%s"`
17+
GRANT_CREATE_TABLE = `GRANT CREATE ON SCHEMA "%s" TO "%s"`
1718
GRANT_ALL_TABLES = `GRANT %s ON ALL TABLES IN SCHEMA "%s" TO "%s"`
1819
DEFAULT_PRIVS_SCHEMA = `ALTER DEFAULT PRIVILEGES FOR ROLE "%s" IN SCHEMA "%s" GRANT %s ON TABLES TO "%s"`
1920
REVOKE_CONNECT = `REVOKE CONNECT ON DATABASE "%s" FROM public`
@@ -120,3 +121,18 @@ func (c *pg) SetSchemaPrivileges(db, creator, role, schema, privs string, logger
120121
}
121122
return nil
122123
}
124+
125+
func (c *pg) SetSchemaPrivilegesCreate(db, creator, role, schema, privs string, logger logr.Logger) error {
126+
tmpDb, err := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
127+
if err != nil {
128+
return err
129+
}
130+
defer tmpDb.Close()
131+
132+
// Grant role usage on schema
133+
_, err = tmpDb.Exec(fmt.Sprintf(GRANT_CREATE_TABLE, schema, role))
134+
if err != nil {
135+
return err
136+
}
137+
return nil
138+
}

pkg/postgres/mock/postgres.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/postgres/postgres.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type PG interface {
1717
UpdatePassword(role, password string) error
1818
GrantRole(role, grantee string) error
1919
SetSchemaPrivileges(db, creator, role, schema, privs string, logger logr.Logger) error
20+
SetSchemaPrivilegesCreate(db, creator, role, schema, privs string, logger logr.Logger) error
2021
RevokeRole(role, revoked string) error
2122
AlterDefaultLoginRole(role, setRole string) error
2223
DropDatabase(db string, logger logr.Logger) error

0 commit comments

Comments
 (0)