github.com/sap/cf-mta-plugin@v2.6.3+incompatible/clients/csrf/default_csrf_token_fetcher.go (about) 1 package csrf 2 3 import ( 4 "net/http" 5 "os" 6 7 "github.com/cloudfoundry-incubator/multiapps-cli-plugin/clients/csrf/csrf_parameters" 8 "github.com/cloudfoundry-incubator/multiapps-cli-plugin/log" 9 "github.com/cloudfoundry/cli/plugin" 10 ) 11 12 const CsrfTokenHeaderFetchValue = "Fetch" 13 const CsrfTokensApi = "/api/v1/csrf-token" 14 const ContentTypeHeader = "Content-Type" 15 const AuthorizationHeader = "Authorization" 16 const ApplicationJsonContentType = "application/json" 17 const CookieHeader = "Cookie" 18 19 type DefaultCsrfTokenFetcher struct { 20 transport *Transport 21 } 22 23 func NewDefaultCsrfTokenFetcher(transport *Transport) *DefaultCsrfTokenFetcher { 24 return &DefaultCsrfTokenFetcher{transport: transport} 25 } 26 27 func (c *DefaultCsrfTokenFetcher) FetchCsrfToken(url string, currentRequest *http.Request) (*csrf_parameters.CsrfRequestHeader, error) { 28 29 fetchTokenRequest, err := http.NewRequest(http.MethodGet, url, nil) 30 if err != nil { 31 return nil, err 32 } 33 fetchTokenRequest.Header.Set(XCsrfToken, CsrfTokenHeaderFetchValue) 34 fetchTokenRequest.Header.Set(ContentTypeHeader, ApplicationJsonContentType) 35 36 cliConnection := plugin.NewCliConnection(os.Args[1]) 37 token, err := cliConnection.AccessToken() 38 if err != nil { 39 return nil, err 40 } 41 fetchTokenRequest.Header.Set(AuthorizationHeader, token) 42 UpdateCookiesIfNeeded(currentRequest.Cookies(), fetchTokenRequest) 43 44 response, err := c.transport.OriginalTransport.RoundTrip(fetchTokenRequest) 45 if err != nil { 46 return nil, err 47 } 48 // if there are set-cookie headers present in response - persist them in Transport 49 if len(response.Cookies()) != 0 { 50 log.Tracef("Set-Cookie headers present in response, updating current with '" + prettyPrintCookies(response.Cookies()) + "'\n") 51 52 c.transport.Cookies.Cookies = response.Cookies() 53 } 54 55 log.Tracef("New CSRF Token fetched '" + response.Header.Get(XCsrfToken) + "'\n") 56 return &csrf_parameters.CsrfRequestHeader{response.Header.Get(XCsrfHeader), response.Header.Get(XCsrfToken)}, nil 57 } 58 59 func getCsrfTokenUrl(req *http.Request) string { 60 return req.URL.Scheme + "://" + req.URL.Host + CsrfTokensApi 61 }