From d290c0a9676dd40030f77eaa270281d8a046b4d5 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sat, 24 Apr 2021 12:37:06 -0700 Subject: [PATCH] ui: do not attempt running maintenance if the current user is not the maintenance owner, to avoid producing error in the Tasks tab (#1010) --- internal/server/server.go | 6 ++++++ repo/maintenance/maintenance_params.go | 14 ++++++++++++++ repo/maintenance/maintenance_run.go | 6 ++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 479b12bda..447d69c94 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -488,6 +488,12 @@ func (s *Server) periodicMaintenance(ctx context.Context, rep repo.Repository) { return case <-time.After(maintenanceAttemptFrequency): + if owned, err := maintenance.IsOwnedByThisUser(ctx, rep); err == nil && !owned { + // maintenance not owned by this user, don't run, but keep trying because + // maintenance ownership MAY change to this user in the future. + continue + } + if err := s.taskmgr.Run(ctx, "Maintenance", "Periodic maintenance", func(ctx context.Context, _ uitask.Controller) error { return periodicMaintenanceOnce(ctx, rep) }); err != nil { diff --git a/repo/maintenance/maintenance_params.go b/repo/maintenance/maintenance_params.go index ce150acc5..4fcfa9a8d 100644 --- a/repo/maintenance/maintenance_params.go +++ b/repo/maintenance/maintenance_params.go @@ -22,6 +22,10 @@ type Params struct { FullCycle CycleParams `json:"full"` } +func (p *Params) isOwnedByByThisUser(rep repo.Repository) bool { + return p.Owner == rep.ClientOptions().UsernameAtHost() +} + // DefaultParams represents default values of maintenance parameters. func DefaultParams() Params { return Params{ @@ -52,6 +56,16 @@ func HasParams(ctx context.Context, rep repo.Repository) (bool, error) { return len(md) > 0, nil } +// IsOwnedByThisUser determines whether current user is the maintenance owner. +func IsOwnedByThisUser(ctx context.Context, rep repo.Repository) (bool, error) { + p, err := GetParams(ctx, rep) + if err != nil { + return false, errors.Wrap(err, "error getting maintenance params") + } + + return p.isOwnedByByThisUser(rep), nil +} + // GetParams returns repository-wide maintenance parameters. func GetParams(ctx context.Context, rep repo.Repository) (*Params, error) { md, err := manifestIDs(ctx, rep) diff --git a/repo/maintenance/maintenance_run.go b/repo/maintenance/maintenance_run.go index 3c800f088..b8a40eeb5 100644 --- a/repo/maintenance/maintenance_run.go +++ b/repo/maintenance/maintenance_run.go @@ -140,10 +140,8 @@ func RunExclusive(ctx context.Context, rep repo.DirectRepositoryWriter, mode Mod return errors.Wrap(err, "unable to get maintenance params") } - if !force { - if myUsername := rep.ClientOptions().UsernameAtHost(); p.Owner != myUsername { - return NotOwnedError{p.Owner} - } + if !force && !p.isOwnedByByThisUser(rep) { + return NotOwnedError{p.Owner} } if mode == ModeAuto {