(ctx context.Context, challenge challenge, scopes []authScope)
| 809 | } |
| 810 | |
| 811 | func (c *dockerClient) getBearerToken(ctx context.Context, challenge challenge, |
| 812 | scopes []authScope) (*bearerToken, error) { |
| 813 | realm, ok := challenge.Parameters["realm"] |
| 814 | if !ok { |
| 815 | return nil, errors.New("missing realm in bearer auth challenge") |
| 816 | } |
| 817 | |
| 818 | authReq, err := http.NewRequestWithContext(ctx, http.MethodGet, realm, nil) |
| 819 | if err != nil { |
| 820 | return nil, err |
| 821 | } |
| 822 | |
| 823 | params := authReq.URL.Query() |
| 824 | if c.auth.Username != "" { |
| 825 | params.Add("account", c.auth.Username) |
| 826 | } |
| 827 | |
| 828 | if service, ok := challenge.Parameters["service"]; ok && service != "" { |
| 829 | params.Add("service", service) |
| 830 | } |
| 831 | |
| 832 | for _, scope := range scopes { |
| 833 | if scope.resourceType != "" && scope.remoteName != "" && scope.actions != "" { |
| 834 | params.Add("scope", fmt.Sprintf("%s:%s:%s", scope.resourceType, scope.remoteName, scope.actions)) |
| 835 | } |
| 836 | } |
| 837 | |
| 838 | authReq.URL.RawQuery = params.Encode() |
| 839 | |
| 840 | if c.auth.Username != "" && c.auth.Password != "" { |
| 841 | authReq.SetBasicAuth(c.auth.Username, c.auth.Password) |
| 842 | } |
| 843 | authReq.Header.Add("User-Agent", c.userAgent) |
| 844 | |
| 845 | logrus.Debugf("%s %s", authReq.Method, authReq.URL.Redacted()) |
| 846 | res, err := c.client.Do(authReq) |
| 847 | if err != nil { |
| 848 | return nil, err |
| 849 | } |
| 850 | defer res.Body.Close() |
| 851 | if err := httpResponseToError(res, "Requesting bearer token"); err != nil { |
| 852 | return nil, err |
| 853 | } |
| 854 | |
| 855 | return newBearerTokenFromHTTPResponseBody(res) |
| 856 | } |
| 857 | |
| 858 | // newBearerTokenFromHTTPResponseBody parses a http.Response to obtain a bearerToken. |
| 859 | // The caller is still responsible for ensuring res.Body is closed. |
no test coverage detected