Further fixes for unicode handling in manifests

We were occasionally trying to compute schema 2 version 1 signatures on the *unicode* representation, which was failing the signature check. This PR adds a new wrapper type called `Bytes`, which all manifests must take in, and which handles the unicodes vs encoded utf-8 stuff in a central location. This PR also adds a test for the manifest that was breaking in production.
This commit is contained in:
Joseph Schorr 2019-01-08 20:49:00 -05:00
parent 05fa2bcbe0
commit 171c7e5238
28 changed files with 275 additions and 106 deletions

View file

@ -102,7 +102,7 @@ from dateutil.parser import parse as parse_date
from digest import digest_tools
from image.docker import ManifestException
from image.docker.schemautil import ensure_utf8
from util.bytes import Bytes
DOCKER_SCHEMA2_CONFIG_HISTORY_KEY = "history"
@ -183,10 +183,12 @@ class DockerSchema2Config(object):
}
def __init__(self, config_bytes):
assert isinstance(config_bytes, Bytes)
self._config_bytes = config_bytes
try:
self._parsed = json.loads(ensure_utf8(config_bytes))
self._parsed = json.loads(config_bytes.as_unicode())
except ValueError as ve:
raise MalformedSchema2Config('malformed config data: %s' % ve)
@ -198,12 +200,12 @@ class DockerSchema2Config(object):
@property
def digest(self):
""" Returns the digest of this config object. """
return digest_tools.sha256_digest(ensure_utf8(self._config_bytes))
return digest_tools.sha256_digest(self._config_bytes.as_encoded_str())
@property
def size(self):
""" Returns the size of this config object. """
return len(ensure_utf8(self._config_bytes))
return len(self._config_bytes.as_encoded_str())
@property
def bytes(self):