Skip to content

Commit

Permalink
add sequence permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
romg67 committed Sep 8, 2024
1 parent 94eb58c commit 8f3ae99
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
8 changes: 7 additions & 1 deletion pkg/controller/postgres/postgres_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,12 +226,18 @@ func (r *ReconcilePostgres) Reconcile(request reconcile.Request) (_ reconcile.Re
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions \"%s\"", reader, readerPrivs))
continue
}
schemaPrivilegesWriter := postgres.PostgresSchemaPrivileges{database, owner, writer, schema, readerPrivs, true}
schemaPrivilegesWriter := postgres.PostgresSchemaPrivileges{database, owner, writer, schema, writerPrivs, true}
err = r.pg.SetSchemaPrivileges(schemaPrivilegesWriter, reqLogger)
if err != nil {
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions \"%s\"", writer, writerPrivs))
continue
}
sequncesPrivilegesWriter := postgres.PostgresSequncesPrivileges{database, owner, writer, schema, writerPrivs}
err = r.pg.SetSequncesPrivileges(sequncesPrivilegesWriter, reqLogger)
if err != nil {
reqLogger.Error(err, fmt.Sprintf("Could not give %s permissions for sequnces \"%s\"", writer, writerPrivs))
continue
}
schemaPrivilegesOwner := postgres.PostgresSchemaPrivileges{database, owner, owner, schema, readerPrivs, true}
err = r.pg.SetSchemaPrivileges(schemaPrivilegesOwner, reqLogger)
if err != nil {
Expand Down
26 changes: 26 additions & 0 deletions pkg/postgres/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ const (
GRANT_USAGE_SCHEMA = `GRANT USAGE ON SCHEMA "%s" TO "%s"`
GRANT_CREATE_TABLE = `GRANT CREATE ON SCHEMA "%s" TO "%s"`
GRANT_ALL_TABLES = `GRANT %s ON ALL TABLES IN SCHEMA "%s" TO "%s"`
GRANT_ALL_SEQUENCES = `GRANT %s ON ALL SEQUENCES IN SCHEMA "%s" TO "%s"`
DEFAULT_PRIVS_SCHEMA = `ALTER DEFAULT PRIVILEGES FOR ROLE "%s" IN SCHEMA "%s" GRANT %s ON TABLES TO "%s"`
DEFAULT_PRIVS_SEQUENCES = `ALTER DEFAULT PRIVILEGES FOR ROLE "%s" IN SCHEMA "%s" GRANT %s ON SEQUENCES TO "%s"`
REVOKE_CONNECT = `REVOKE CONNECT ON DATABASE "%s" FROM public`
TERMINATE_BACKEND = `SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '%s' AND pid <> pg_backend_pid()`
GET_DB_OWNER = `SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = '%s'`
Expand Down Expand Up @@ -130,3 +132,27 @@ func (c *pg) SetSchemaPrivileges(schemaPrivileges PostgresSchemaPrivileges, logg

return nil
}


func (c *pg) SetSequncesPrivileges(SequncesPrivileges PostgresSequncesPrivileges, logger logr.Logger) error {
tmpDb, err := GetConnection(c.user, c.pass, c.host, SequncesPrivileges.DB, c.args, logger)
if err != nil {
return err
}
defer tmpDb.Close()

// Grant role privs on existing sequences in schema
_, err = tmpDb.Exec(fmt.Sprintf(GRANT_ALL_SEQUENCES, SequncesPrivileges.Privs, SequncesPrivileges.Schema, SequncesPrivileges.Role))
if err != nil {
return err
}

// Grant role privs on future sequences in schema
_, err = tmpDb.Exec(fmt.Sprintf(DEFAULT_PRIVS_SCHEMA, SequncesPrivileges.Creator, SequncesPrivileges.Schema, SequncesPrivileges.Privs, SequncesPrivileges.Role))
if err != nil {
return err
}


return nil
}
9 changes: 9 additions & 0 deletions pkg/postgres/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type PG interface {
UpdatePassword(role, password string) error
GrantRole(role, grantee string) error
SetSchemaPrivileges(schemaPrivileges PostgresSchemaPrivileges, logger logr.Logger) error
SetSequncesPrivileges(sequencesPrivileges PostgresSequncesPrivileges, logger logr.Logger) error
RevokeRole(role, revoked string) error
AlterDefaultLoginRole(role, setRole string) error
DropDatabase(db string, logger logr.Logger) error
Expand Down Expand Up @@ -44,6 +45,14 @@ type PostgresSchemaPrivileges struct {
CreateSchema bool
}

type PostgresSequncesPrivileges struct {
DB string
Creator string
Role string
Schema string
Privs string
}

func NewPG(host, user, password, uri_args, default_database, cloud_type string, logger logr.Logger) (PG, error) {
db, err := GetConnection(user, password, host, default_database, uri_args, logger)
if err != nil {
Expand Down

0 comments on commit 8f3ae99

Please sign in to comment.