2020-05-21 18:30:19 +00:00
package label
import (
"context"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/authorizer"
2021-09-13 19:12:35 +00:00
"github.com/influxdata/influxdb/v2/kit/platform"
2020-05-21 18:30:19 +00:00
)
var _ influxdb . LabelService = ( * AuthedLabelService ) ( nil )
type AuthedLabelService struct {
2020-10-27 11:45:05 +00:00
s influxdb . LabelService
orgIDResolver authorizer . OrgIDResolver
2020-05-21 18:30:19 +00:00
}
// NewAuthedLabelService constructs an instance of an authorizing label serivce.
2020-10-27 11:45:05 +00:00
func NewAuthedLabelService ( s influxdb . LabelService , orgIDResolver authorizer . OrgIDResolver ) * AuthedLabelService {
2020-05-21 18:30:19 +00:00
return & AuthedLabelService {
2020-10-27 11:45:05 +00:00
s : s ,
orgIDResolver : orgIDResolver ,
2020-05-21 18:30:19 +00:00
}
}
func ( s * AuthedLabelService ) CreateLabel ( ctx context . Context , l * influxdb . Label ) error {
if _ , _ , err := authorizer . AuthorizeCreate ( ctx , influxdb . LabelsResourceType , l . OrgID ) ; err != nil {
return err
}
return s . s . CreateLabel ( ctx , l )
}
func ( s * AuthedLabelService ) FindLabels ( ctx context . Context , filter influxdb . LabelFilter , opt ... influxdb . FindOptions ) ( [ ] * influxdb . Label , error ) {
// TODO: we'll likely want to push this operation into the database eventually since fetching the whole list of data
// will likely be expensive.
ls , err := s . s . FindLabels ( ctx , filter , opt ... )
if err != nil {
return nil , err
}
ls , _ , err = authorizer . AuthorizeFindLabels ( ctx , ls )
return ls , err
}
// FindLabelByID checks to see if the authorizer on context has read access to the label id provided.
2021-03-30 18:10:02 +00:00
func ( s * AuthedLabelService ) FindLabelByID ( ctx context . Context , id platform . ID ) ( * influxdb . Label , error ) {
2020-05-21 18:30:19 +00:00
l , err := s . s . FindLabelByID ( ctx , id )
if err != nil {
return nil , err
}
if _ , _ , err := authorizer . AuthorizeRead ( ctx , influxdb . LabelsResourceType , id , l . OrgID ) ; err != nil {
return nil , err
}
return l , nil
}
// FindResourceLabels retrieves all labels belonging to the filtering resource if the authorizer on context has read access to it.
// Then it filters the list down to only the labels that are authorized.
func ( s * AuthedLabelService ) FindResourceLabels ( ctx context . Context , filter influxdb . LabelMappingFilter ) ( [ ] * influxdb . Label , error ) {
if err := filter . ResourceType . Valid ( ) ; err != nil {
return nil , err
}
2020-05-28 15:26:08 +00:00
2020-10-27 11:45:05 +00:00
orgID , err := s . orgIDResolver . FindResourceOrganizationID ( ctx , filter . ResourceType , filter . ResourceID )
2020-05-21 18:30:19 +00:00
if err != nil {
return nil , err
}
2020-05-28 15:26:08 +00:00
if _ , _ , err := authorizer . AuthorizeRead ( ctx , filter . ResourceType , filter . ResourceID , orgID ) ; err != nil {
return nil , err
2020-05-21 18:30:19 +00:00
}
2020-05-28 15:26:08 +00:00
// first fetch all labels for this resource
ls , err := s . s . FindResourceLabels ( ctx , filter )
if err != nil {
2020-05-21 18:30:19 +00:00
return nil , err
}
// then filter the labels we got to return only the ones the user is authorized to read
ls , _ , err = authorizer . AuthorizeFindLabels ( ctx , ls )
return ls , err
}
// UpdateLabel checks to see if the authorizer on context has write access to the label provided.
2021-03-30 18:10:02 +00:00
func ( s * AuthedLabelService ) UpdateLabel ( ctx context . Context , id platform . ID , upd influxdb . LabelUpdate ) ( * influxdb . Label , error ) {
2020-05-21 18:30:19 +00:00
l , err := s . s . FindLabelByID ( ctx , id )
if err != nil {
return nil , err
}
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , influxdb . LabelsResourceType , l . ID , l . OrgID ) ; err != nil {
return nil , err
}
return s . s . UpdateLabel ( ctx , id , upd )
}
// DeleteLabel checks to see if the authorizer on context has write access to the label provided.
2021-03-30 18:10:02 +00:00
func ( s * AuthedLabelService ) DeleteLabel ( ctx context . Context , id platform . ID ) error {
2020-05-21 18:30:19 +00:00
l , err := s . s . FindLabelByID ( ctx , id )
if err != nil {
return err
}
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , influxdb . LabelsResourceType , l . ID , l . OrgID ) ; err != nil {
return err
}
return s . s . DeleteLabel ( ctx , id )
}
// CreateLabelMapping checks to see if the authorizer on context has write access to the label and the resource contained by the label mapping in creation.
func ( s * AuthedLabelService ) CreateLabelMapping ( ctx context . Context , m * influxdb . LabelMapping ) error {
l , err := s . s . FindLabelByID ( ctx , m . LabelID )
if err != nil {
return err
}
2020-05-28 15:26:08 +00:00
2020-05-21 18:30:19 +00:00
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , influxdb . LabelsResourceType , m . LabelID , l . OrgID ) ; err != nil {
return err
}
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , m . ResourceType , m . ResourceID , l . OrgID ) ; err != nil {
return err
}
return s . s . CreateLabelMapping ( ctx , m )
}
// DeleteLabelMapping checks to see if the authorizer on context has write access to the label and the resource of the label mapping to delete.
func ( s * AuthedLabelService ) DeleteLabelMapping ( ctx context . Context , m * influxdb . LabelMapping ) error {
l , err := s . s . FindLabelByID ( ctx , m . LabelID )
if err != nil {
return err
}
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , influxdb . LabelsResourceType , m . LabelID , l . OrgID ) ; err != nil {
return err
}
if _ , _ , err := authorizer . AuthorizeWrite ( ctx , m . ResourceType , m . ResourceID , l . OrgID ) ; err != nil {
return err
}
return s . s . DeleteLabelMapping ( ctx , m )
}