changeset 1544:5f80ec319a4f

If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 10 Dec 2018 13:17:50 +0100
parents 240bd1db49c0
children 494bb818d073
files pkg/controllers/user.go pkg/scheduler/scheduler.go
diffstat 2 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/user.go	Mon Dec 10 13:16:23 2018 +0100
+++ b/pkg/controllers/user.go	Mon Dec 10 13:17:50 2018 +0100
@@ -29,6 +29,7 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/misc"
 	"gemma.intevation.de/gemma/pkg/models"
+	"gemma.intevation.de/gemma/pkg/scheduler"
 )
 
 const (
@@ -128,6 +129,7 @@
 
 	// Running in a go routine should not be necessary.
 	go func() { auth.Sessions.Logout(user) }()
+	go func() { scheduler.UnbindUser(user) }()
 
 	jr = JSONResult{Code: http.StatusNoContent}
 	return
@@ -205,6 +207,7 @@
 	if user != newUser.User {
 		// Running in a go routine should not be necessary.
 		go func() { auth.Sessions.Logout(string(user)) }()
+		go func() { scheduler.UnbindUser(string(user)) }()
 	}
 
 	jr = JSONResult{
--- a/pkg/scheduler/scheduler.go	Mon Dec 10 13:16:23 2018 +0100
+++ b/pkg/scheduler/scheduler.go	Mon Dec 10 13:17:50 2018 +0100
@@ -73,10 +73,47 @@
 	return global.unbindAction(name, user, cfgID)
 }
 
+func UnbindUser(user string) {
+	global.unbindUser(user)
+}
+
 func sameCfgID(a, b *int64) bool {
 	return (a == nil && b == nil) || (a != nil && b != nil && *a == *b)
 }
 
+func (s *scheduler) unbindUser(user string) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+
+	entries := s.cr.Entries()
+
+	if len(entries) == 0 {
+		return
+	}
+
+	var found bool
+	for _, entry := range entries {
+		ua := entry.Job.(*userAction)
+		if ua.user == user {
+			found = true
+			break
+		}
+	}
+	if !found {
+		return
+	}
+
+	s.cr.Stop()
+	s.cr = cron.New()
+	for _, entry := range entries {
+		ua := entry.Job.(*userAction)
+		if ua.user != user {
+			s.cr.Schedule(entry.Schedule, entry.Job)
+		}
+	}
+	s.cr.Start()
+}
+
 func (s *scheduler) unbindAction(name, user string, cfgID *int64) error {
 	s.mu.Lock()
 	defer s.mu.Unlock()