Files
browser/platform/service/resource_authorization.go

162 lines
4.7 KiB
Go

package service
import (
"browser.local/platform/domain"
)
func (svc *CoreService) AuthorizePluginBridgeActionForSession(sessionID string, request domain.PluginBridgeAuthorizeRequest) (domain.PluginBridgeAuthorization, error) {
if _, err := svc.GetCurrentUser(sessionID); err != nil {
return domain.PluginBridgeAuthorization{}, err
}
if request.ServerInstanceID != "" {
if _, err := svc.GetServerInstanceForSession(sessionID, request.ServerInstanceID); err != nil {
return domain.PluginBridgeAuthorization{}, err
}
}
return svc.AuthorizePluginBridgeAction(request)
}
func (svc *CoreService) GetJobForSession(sessionID string, id string) (domain.Job, error) {
job, err := svc.store.Jobs().Get(id)
if err != nil {
return domain.Job{}, err
}
if err := svc.authorizeJobAccess(sessionID, job); err != nil {
return domain.Job{}, err
}
return domain.CopyJob(job), nil
}
func (svc *CoreService) ListJobsForSession(sessionID string, filter domain.JobFilter) ([]domain.Job, error) {
user, err := svc.GetCurrentUser(sessionID)
if err != nil {
return nil, err
}
if filter.ServerInstanceID != "" {
instance, err := svc.store.ServerInstances().Get(filter.ServerInstanceID)
if err != nil {
return nil, err
}
if !canAccessServer(user, instance) {
return nil, ErrForbidden
}
}
jobs, err := svc.store.Jobs().List(filter)
if err != nil {
return nil, err
}
if isPlatformAdmin(user) {
return jobs, nil
}
visible := make([]domain.Job, 0, len(jobs))
for _, job := range jobs {
if job.ServerInstanceID == "" {
continue
}
instance, getErr := svc.store.ServerInstances().Get(job.ServerInstanceID)
if getErr == nil && canAccessServer(user, instance) {
visible = append(visible, domain.CopyJob(job))
}
}
return visible, nil
}
func (svc *CoreService) RequestRunJobCancelForSession(sessionID string, request domain.RunJobCancelRequest) (domain.RunJobCancelRequestResult, error) {
job, err := svc.GetJobForSession(sessionID, request.JobID)
if err != nil {
return domain.RunJobCancelRequestResult{}, err
}
request.JobID = job.ID
return svc.RequestRunJobCancel(request)
}
func (svc *CoreService) ListArtifactsForSession(sessionID string, filter domain.ArtifactFilter) ([]domain.Artifact, error) {
if _, err := svc.GetCurrentUser(sessionID); err != nil {
return nil, err
}
artifacts, err := svc.store.Artifacts().List(filter)
if err != nil {
return nil, err
}
visible := make([]domain.Artifact, 0, len(artifacts))
for _, artifact := range artifacts {
if err := svc.authorizeArtifactAccess(sessionID, artifact); err == nil {
visible = append(visible, domain.CopyArtifact(artifact))
}
}
if filter.OwnerID != "" && len(artifacts) > 0 && len(visible) == 0 {
return nil, ErrForbidden
}
return visible, nil
}
func (svc *CoreService) GetLogStreamForSession(sessionID string, id string) (domain.LogStream, error) {
stream, err := svc.store.LogStreams().Get(id)
if err != nil {
return domain.LogStream{}, err
}
if _, err := svc.GetServerInstanceForSession(sessionID, stream.ServerInstanceID); err != nil {
return domain.LogStream{}, err
}
return domain.CopyLogStream(stream), nil
}
func (svc *CoreService) ListLogStreamsForSession(sessionID string, filter domain.LogStreamFilter) ([]domain.LogStream, error) {
user, err := svc.GetCurrentUser(sessionID)
if err != nil {
return nil, err
}
if filter.ServerInstanceID != "" {
instance, err := svc.store.ServerInstances().Get(filter.ServerInstanceID)
if err != nil {
return nil, err
}
if !canAccessServer(user, instance) {
return nil, ErrForbidden
}
}
streams, err := svc.store.LogStreams().List(filter)
if err != nil {
return nil, err
}
if isPlatformAdmin(user) {
return streams, nil
}
visible := make([]domain.LogStream, 0, len(streams))
for _, stream := range streams {
instance, getErr := svc.store.ServerInstances().Get(stream.ServerInstanceID)
if getErr == nil && canAccessServer(user, instance) {
visible = append(visible, domain.CopyLogStream(stream))
}
}
return visible, nil
}
func (svc *CoreService) QueryLogStreamForSession(sessionID string, query domain.LogStreamCursorQuery) (domain.LogStreamCursorResult, error) {
if _, err := svc.GetLogStreamForSession(sessionID, query.LogStreamID); err != nil {
return domain.LogStreamCursorResult{}, err
}
return svc.QueryLogStream(query)
}
func (svc *CoreService) authorizeJobAccess(sessionID string, job domain.Job) error {
user, err := svc.GetCurrentUser(sessionID)
if err != nil {
return err
}
if job.ServerInstanceID == "" {
if !isPlatformAdmin(user) {
return ErrForbidden
}
return nil
}
instance, err := svc.store.ServerInstances().Get(job.ServerInstanceID)
if err != nil {
return err
}
if !canAccessServer(user, instance) {
return ErrForbidden
}
return nil
}