github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/resourceserver/check_webhook.go (about) 1 package resourceserver 2 3 import ( 4 "context" 5 "encoding/json" 6 "net/http" 7 8 "code.cloudfoundry.org/lager" 9 "code.cloudfoundry.org/lager/lagerctx" 10 "github.com/pf-qiu/concourse/v6/atc/api/present" 11 "github.com/pf-qiu/concourse/v6/atc/creds" 12 "github.com/pf-qiu/concourse/v6/atc/db" 13 "github.com/tedsuo/rata" 14 ) 15 16 // CheckResourceWebHook defines a handler for process a check resource request via an access token. 17 func (s *Server) CheckResourceWebHook(dbPipeline db.Pipeline) http.Handler { 18 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 19 resourceName := rata.Param(r, "resource_name") 20 webhookToken := r.URL.Query().Get("webhook_token") 21 22 logger := s.logger.Session("check-resource-webhook", lager.Data{ 23 "resource": resourceName, 24 }) 25 26 if webhookToken == "" { 27 logger.Info("no-webhook-token", lager.Data{"error": "missing webhook_token"}) 28 w.WriteHeader(http.StatusBadRequest) 29 return 30 } 31 32 dbResource, found, err := dbPipeline.Resource(resourceName) 33 if err != nil { 34 logger.Error("failed-to-get-resource", err) 35 w.WriteHeader(http.StatusInternalServerError) 36 return 37 } 38 39 if !found { 40 logger.Info("resource-not-found") 41 w.WriteHeader(http.StatusNotFound) 42 return 43 } 44 45 variables, err := dbPipeline.Variables(logger, s.secretManager, s.varSourcePool) 46 if err != nil { 47 logger.Error("failed-to-create-var-sources", err) 48 w.WriteHeader(http.StatusInternalServerError) 49 return 50 } 51 token, err := creds.NewString(variables, dbResource.WebhookToken()).Evaluate() 52 if token != webhookToken { 53 logger.Info("invalid-token", lager.Data{"token": webhookToken}) 54 w.WriteHeader(http.StatusUnauthorized) 55 return 56 } 57 58 dbResourceTypes, err := dbPipeline.ResourceTypes() 59 if err != nil { 60 logger.Error("failed-to-get-resource-types", err) 61 w.WriteHeader(http.StatusInternalServerError) 62 return 63 } 64 65 build, created, err := s.checkFactory.TryCreateCheck( 66 lagerctx.NewContext(context.Background(), logger), 67 dbResource, 68 dbResourceTypes, 69 nil, 70 true, 71 ) 72 if err != nil { 73 logger.Error("failed-to-create-check", err) 74 w.WriteHeader(http.StatusInternalServerError) 75 w.Write([]byte(err.Error())) 76 return 77 } 78 79 if !created { 80 logger.Info("check-not-created") 81 w.WriteHeader(http.StatusInternalServerError) 82 return 83 } 84 85 w.WriteHeader(http.StatusCreated) 86 87 err = json.NewEncoder(w).Encode(present.Build(build)) 88 if err != nil { 89 logger.Error("failed-to-encode-check", err) 90 w.WriteHeader(http.StatusInternalServerError) 91 } 92 }) 93 }