Skip to content

Commit 9a46e02

Browse files
add provisioning for table
1 parent 3180304 commit 9a46e02

File tree

5 files changed

+110
-0
lines changed

5 files changed

+110
-0
lines changed

pkg/connector/function.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ func (r *functionSyncer) Entitlements(ctx context.Context, resource *v2.Resource
9090
}
9191

9292
for _, en := range ens {
93+
annos := annotations.Annotations(en.Annotations)
94+
annos.Update(&v2.EntitlementImmutable{})
9395
en.DisplayName = fmt.Sprintf("%s on %s", dbModel.Name, en.DisplayName)
9496
}
9597

pkg/connector/sequence.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ func (r *sequenceSyncer) Entitlements(ctx context.Context, resource *v2.Resource
9494
}
9595

9696
for _, en := range ens {
97+
annos := annotations.Annotations(en.Annotations)
98+
annos.Update(&v2.EntitlementImmutable{})
9799
en.DisplayName = fmt.Sprintf("%s on %s", dbModel.Name, en.DisplayName)
98100
}
99101

pkg/connector/table.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ func (r *tableSyncer) Entitlements(ctx context.Context, resource *v2.Resource, p
104104
}
105105

106106
for _, en := range ens {
107+
annos := annotations.Annotations(en.Annotations)
108+
annos.Update(&v2.EntitlementImmutable{})
109+
107110
en.DisplayName = fmt.Sprintf("%s - %s", dbModel.Name, resource.DisplayName)
108111
}
109112

@@ -139,6 +142,67 @@ func (r *tableSyncer) Grants(ctx context.Context, resource *v2.Resource, pToken
139142
return ret, nextPageToken, nil, nil
140143
}
141144

145+
func (r *tableSyncer) Grant(ctx context.Context, principal *v2.Resource, entitlement *v2.Entitlement) ([]*v2.Grant, annotations.Annotations, error) {
146+
if principal.Id.ResourceType != roleResourceType.Id {
147+
return nil, nil, fmt.Errorf("baton-postgres: only users and roles can have roles granted")
148+
}
149+
150+
_, _, privilegeName, isGrant, err := parseEntitlementID(entitlement.Id)
151+
if err != nil {
152+
return nil, nil, err
153+
}
154+
155+
dbId, rID, err := parseWithDatabaseID(entitlement.Resource.Id.Resource)
156+
if err != nil {
157+
return nil, nil, err
158+
}
159+
160+
dbClient, dbName, err := r.clientPool.Get(ctx, dbId)
161+
if err != nil {
162+
return nil, nil, err
163+
}
164+
165+
table, err := dbClient.GetTable(ctx, rID)
166+
if err != nil {
167+
return nil, nil, err
168+
}
169+
170+
err = dbClient.GrantTable(ctx, dbName, table.Name, principal.DisplayName, privilegeName, isGrant)
171+
return nil, nil, err
172+
}
173+
174+
func (r *tableSyncer) Revoke(ctx context.Context, grant *v2.Grant) (annotations.Annotations, error) {
175+
entitlement := grant.Entitlement
176+
principal := grant.Principal
177+
178+
if principal.Id.ResourceType != roleResourceType.Id {
179+
return nil, fmt.Errorf("baton-postgres: only users and roles can have roles granted")
180+
}
181+
182+
_, _, privilegeName, isGrant, err := parseEntitlementID(entitlement.Id)
183+
if err != nil {
184+
return nil, err
185+
}
186+
187+
dbId, rID, err := parseWithDatabaseID(entitlement.Resource.Id.Resource)
188+
if err != nil {
189+
return nil, err
190+
}
191+
192+
dbClient, dbName, err := r.clientPool.Get(ctx, dbId)
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
table, err := dbClient.GetTable(ctx, rID)
198+
if err != nil {
199+
return nil, err
200+
}
201+
202+
err = dbClient.RevokeTable(ctx, dbName, table.Name, principal.DisplayName, privilegeName, isGrant)
203+
return nil, err
204+
}
205+
142206
func newTableSyncer(ctx context.Context, c *postgres.ClientDatabasesPool, includeColumns bool) *tableSyncer {
143207
return &tableSyncer{
144208
resourceType: tableResourceType,

pkg/connector/view.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ func (r *viewSyncer) Entitlements(ctx context.Context, resource *v2.Resource, pT
9494
}
9595

9696
for _, en := range ens {
97+
annos := annotations.Annotations(en.Annotations)
98+
annos.Update(&v2.EntitlementImmutable{})
9799
en.DisplayName = fmt.Sprintf("%s on %s", dbModel.Name, en.DisplayName)
98100
}
99101

pkg/postgres/databases.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,43 @@ func (c *Client) RevokeDatabase(ctx context.Context, dbName string, target strin
202202
_, err := c.db.Exec(ctx, q)
203203
return err
204204
}
205+
206+
func (c *Client) GrantTable(ctx context.Context, dbName string, tableName string, principalName string, privilege string, isGrant bool) error {
207+
l := ctxzap.Extract(ctx)
208+
l.Debug("granting database", zap.String("dbName", dbName), zap.String("principalName", principalName), zap.String("privilege", privilege))
209+
210+
sanitizedDbName := pgx.Identifier{dbName}.Sanitize()
211+
sanitizedTableName := pgx.Identifier{tableName}.Sanitize()
212+
sanitizedPrincipalName := pgx.Identifier{principalName}.Sanitize()
213+
sanitizedPrivilege := pgx.Identifier{transformPrivilege(privilege)}.Sanitize()
214+
215+
q := fmt.Sprintf("GRANT %s ON TABLE %s.%s TO %s", sanitizedPrivilege, sanitizedDbName, sanitizedTableName, sanitizedPrincipalName)
216+
217+
if isGrant {
218+
q += " WITH GRANT OPTION"
219+
}
220+
221+
_, err := c.db.Exec(ctx, q)
222+
return err
223+
}
224+
225+
func (c *Client) RevokeTable(ctx context.Context, dbName string, tableName string, principalName string, privilege string, isGrant bool) error {
226+
l := ctxzap.Extract(ctx)
227+
l.Debug("granting database", zap.String("dbName", dbName), zap.String("principalName", principalName), zap.String("privilege", privilege))
228+
229+
sanitizedDbName := pgx.Identifier{dbName}.Sanitize()
230+
sanitizedTableName := pgx.Identifier{tableName}.Sanitize()
231+
sanitizedPrincipalName := pgx.Identifier{principalName}.Sanitize()
232+
sanitizedPrivilege := pgx.Identifier{transformPrivilege(privilege)}.Sanitize()
233+
234+
var q string
235+
236+
if isGrant {
237+
q = fmt.Sprintf("REVOKE GRANT OPTION for %s ON TABLE %s.%s FROM %s", sanitizedPrivilege, sanitizedDbName, sanitizedTableName, sanitizedPrincipalName)
238+
} else {
239+
q = fmt.Sprintf("REVOKE %s ON TABLE %s.%s FROM %s", sanitizedPrivilege, sanitizedDbName, sanitizedTableName, sanitizedPrincipalName)
240+
}
241+
242+
_, err := c.db.Exec(ctx, q)
243+
return err
244+
}

0 commit comments

Comments
 (0)