Make sure to decode manifests into utf-8 when necessary

This fixes a decoding error
This commit is contained in:
Joseph Schorr 2018-12-17 16:31:24 -05:00
parent 6cc7102ec8
commit 48e584905a
15 changed files with 268 additions and 32 deletions

View file

@ -16,6 +16,7 @@ from image.docker.schema2 import (DOCKER_SCHEMA2_MANIFEST_CONTENT_TYPE,
EMPTY_LAYER_BLOB_DIGEST, EMPTY_LAYER_SIZE)
from image.docker.schema1 import DockerSchema1ManifestBuilder
from image.docker.schema2.config import DockerSchema2Config
from image.docker.schemautil import ensure_utf8
# Keys.
DOCKER_SCHEMA2_MANIFEST_VERSION_KEY = 'schemaVersion'
@ -128,12 +129,13 @@ class DockerSchema2Manifest(ManifestInterface):
}
def __init__(self, manifest_bytes):
self._filesystem_layers = None
self._payload = manifest_bytes
self._filesystem_layers = None
self._cached_built_config = None
try:
self._parsed = json.loads(manifest_bytes)
self._parsed = json.loads(ensure_utf8(self._payload))
except ValueError as ve:
raise MalformedSchema2Manifest('malformed manifest data: %s' % ve)
@ -164,7 +166,7 @@ class DockerSchema2Manifest(ManifestInterface):
@property
def digest(self):
return digest_tools.sha256_digest(self._payload)
return digest_tools.sha256_digest(ensure_utf8(self._payload))
@property
def config(self):
@ -408,7 +410,7 @@ class DockerSchema2ManifestBuilder(object):
urls=urls,
is_remote=bool(urls)))
def build(self):
def build(self, ensure_ascii=True):
""" Builds and returns the DockerSchema2Manifest. """
assert self.filesystem_layers
assert self.config
@ -444,4 +446,4 @@ class DockerSchema2ManifestBuilder(object):
_build_layer(layer) for layer in self.filesystem_layers
],
}
return DockerSchema2Manifest(json.dumps(manifest_dict, indent=3))
return DockerSchema2Manifest(json.dumps(manifest_dict, indent=3, ensure_ascii=ensure_ascii))