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  }