@@ -26,12 +26,46 @@ import (
2626 "github.com/docker/docker/pkg/stdcopy"
2727 "github.com/dustin/go-humanize"
2828 "github.com/go-chi/chi/v5"
29+ "github.com/samber/lo"
2930
3031 "github.com/rs/zerolog/log"
3132)
3233
34+ func (h * handler ) validContainerIDsForHost (r * http.Request , host string ) (map [string ]docker.Container , error ) {
35+ usersFilter := h .config .Filter
36+ if h .config .Authorization .Provider != NONE {
37+ user := auth .UserFromContext (r .Context ())
38+ if user .ContainerFilter .Exists () {
39+ usersFilter = user .ContainerFilter
40+ }
41+ }
42+
43+ validContainers , err := h .multiHostService .ListContainersForHost (host , usersFilter )
44+ if err != nil {
45+ return nil , err
46+ }
47+
48+ validIdMap := lo .KeyBy (validContainers , func (item docker.Container ) string {
49+ return item .ID
50+ })
51+
52+ return validIdMap , nil
53+ }
54+
3355func (h * handler ) downloadLogs (w http.ResponseWriter , r * http.Request ) {
3456 id := chi .URLParam (r , "id" )
57+
58+ validIdMap , err := h .validContainerIDsForHost (r , hostKey (r ))
59+ if err != nil {
60+ http .Error (w , err .Error (), http .StatusInternalServerError )
61+ return
62+ }
63+
64+ if _ , ok := validIdMap [id ]; ! ok {
65+ http .Error (w , "container not found" , http .StatusUnauthorized )
66+ return
67+ }
68+
3569 containerService , err := h .multiHostService .FindContainer (hostKey (r ), id )
3670 if err != nil {
3771 http .Error (w , err .Error (), http .StatusBadRequest )
@@ -103,6 +137,17 @@ func (h *handler) fetchLogsBetweenDates(w http.ResponseWriter, r *http.Request)
103137 return
104138 }
105139
140+ validIdMap , err := h .validContainerIDsForHost (r , hostKey (r ))
141+ if err != nil {
142+ http .Error (w , err .Error (), http .StatusInternalServerError )
143+ return
144+ }
145+
146+ if _ , ok := validIdMap [id ]; ! ok {
147+ http .Error (w , "container not found" , http .StatusUnauthorized )
148+ return
149+ }
150+
106151 containerService , err := h .multiHostService .FindContainer (hostKey (r ), id )
107152 if err != nil {
108153 http .Error (w , err .Error (), http .StatusNotFound )
@@ -420,8 +465,16 @@ loop:
420465 }
421466 sseWriter .Message (logEvent )
422467 case container := <- newContainers :
423- events <- & docker.ContainerEvent {ActorID : container .ID , Name : "container-started" , Host : container .Host }
424- go streamLogs (container )
468+ validIdMap , err := h .validContainerIDsForHost (r , container .Host )
469+ if err != nil {
470+ log .Error ().Err (err ).Msg ("error fetching valid container IDs" )
471+ continue
472+ }
473+
474+ if _ , ok := validIdMap [container .ID ]; ok {
475+ events <- & docker.ContainerEvent {ActorID : container .ID , Name : "container-started" , Host : container .Host }
476+ go streamLogs (container )
477+ }
425478
426479 case event := <- events :
427480 log .Debug ().Str ("event" , event .Name ).Str ("container" , event .ActorID ).Msg ("received event" )
0 commit comments