mirror of
https://github.com/containers/podman.git
synced 2025-06-21 01:19:15 +08:00
Merge pull request #9028 from mlegenovic/master
Accept and ignore 'null' as value for X-Registry-Auth
This commit is contained in:
@ -297,7 +297,9 @@ func imageAuthToDockerAuth(authConfig types.DockerAuthConfig) dockerAPITypes.Aut
|
|||||||
func singleAuthHeader(r *http.Request) (map[string]types.DockerAuthConfig, error) {
|
func singleAuthHeader(r *http.Request) (map[string]types.DockerAuthConfig, error) {
|
||||||
authHeader := r.Header.Get(string(XRegistryAuthHeader))
|
authHeader := r.Header.Get(string(XRegistryAuthHeader))
|
||||||
authConfig := dockerAPITypes.AuthConfig{}
|
authConfig := dockerAPITypes.AuthConfig{}
|
||||||
if len(authHeader) > 0 {
|
// Accept "null" and handle it as empty value for compatibility reason with Docker.
|
||||||
|
// Some java docker clients pass this value, e.g. this one used in Eclipse.
|
||||||
|
if len(authHeader) > 0 && authHeader != "null" {
|
||||||
authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authHeader))
|
authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authHeader))
|
||||||
if err := json.NewDecoder(authJSON).Decode(&authConfig); err != nil {
|
if err := json.NewDecoder(authJSON).Decode(&authConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -312,7 +314,9 @@ func singleAuthHeader(r *http.Request) (map[string]types.DockerAuthConfig, error
|
|||||||
// The header content is a map[string]DockerAuthConfigs.
|
// The header content is a map[string]DockerAuthConfigs.
|
||||||
func multiAuthHeader(r *http.Request) (map[string]types.DockerAuthConfig, error) {
|
func multiAuthHeader(r *http.Request) (map[string]types.DockerAuthConfig, error) {
|
||||||
authHeader := r.Header.Get(string(XRegistryAuthHeader))
|
authHeader := r.Header.Get(string(XRegistryAuthHeader))
|
||||||
if len(authHeader) == 0 {
|
// Accept "null" and handle it as empty value for compatibility reason with Docker.
|
||||||
|
// Some java docker clients pass this value, e.g. this one used in Eclipse.
|
||||||
|
if len(authHeader) == 0 || authHeader == "null" {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,6 +356,52 @@ class TestApi(unittest.TestCase):
|
|||||||
self.assertTrue(keys["stream"], "Expected to find stream progress stanza's")
|
self.assertTrue(keys["stream"], "Expected to find stream progress stanza's")
|
||||||
|
|
||||||
def test_search_compat(self):
|
def test_search_compat(self):
|
||||||
|
url = PODMAN_URL + "/v1.40/images/search"
|
||||||
|
# Had issues with this test hanging when repositories not happy
|
||||||
|
def do_search1():
|
||||||
|
payload = {'term': 'alpine'}
|
||||||
|
r = requests.get(url, params=payload, timeout=5)
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
objs = json.loads(r.text)
|
||||||
|
self.assertIn(type(objs), (list,))
|
||||||
|
|
||||||
|
def do_search2():
|
||||||
|
payload = {'term': 'alpine', 'limit': 1}
|
||||||
|
r = requests.get(url, params=payload, timeout=5)
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
objs = json.loads(r.text)
|
||||||
|
self.assertIn(type(objs), (list,))
|
||||||
|
self.assertEqual(len(objs), 1)
|
||||||
|
|
||||||
|
def do_search3():
|
||||||
|
payload = {'term': 'alpine', 'filters': {'is-official': True}}
|
||||||
|
r = requests.get(url, params=payload, timeout=5)
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
objs = json.loads(r.text)
|
||||||
|
self.assertIn(type(objs), (list,))
|
||||||
|
# TODO: Request should return only one item, but it returns more. For now this check is commented out.
|
||||||
|
# self.assertEqual(len(objs), 1)
|
||||||
|
|
||||||
|
def do_search4():
|
||||||
|
headers = {'X-Registry-Auth': 'null'}
|
||||||
|
payload = {'term': 'alpine'}
|
||||||
|
r = requests.get(url, params=payload, headers=headers, timeout=5)
|
||||||
|
self.assertEqual(r.status_code, 200, r.text)
|
||||||
|
|
||||||
|
def do_search5():
|
||||||
|
headers = {'X-Registry-Auth': 'invalid value'}
|
||||||
|
payload = {'term': 'alpine'}
|
||||||
|
r = requests.get(url, params=payload, headers=headers, timeout=5)
|
||||||
|
self.assertEqual(r.status_code, 400, r.text)
|
||||||
|
|
||||||
|
search_methods = [do_search1, do_search2, do_search3, do_search4, do_search5]
|
||||||
|
for search_method in search_methods:
|
||||||
|
search = Process(target=search_method)
|
||||||
|
search.start()
|
||||||
|
search.join(timeout=10)
|
||||||
|
self.assertFalse(search.is_alive(), "/images/search took too long")
|
||||||
|
|
||||||
|
def test_search_compat_with_(self):
|
||||||
# Had issues with this test hanging when repositories not happy
|
# Had issues with this test hanging when repositories not happy
|
||||||
def do_search():
|
def do_search():
|
||||||
r = requests.get(PODMAN_URL + "/v1.40/images/search?term=alpine", timeout=5)
|
r = requests.get(PODMAN_URL + "/v1.40/images/search?term=alpine", timeout=5)
|
||||||
|
Reference in New Issue
Block a user