Can brute-force write a file such that exiv2 can read it.

This commit is contained in:
jevans 2013-05-28 20:04:23 -04:00
commit 244660ec9e
2 changed files with 85 additions and 0 deletions

View file

@ -5,3 +5,4 @@ from .test_printing import TestPrinting as printing
from .test_opj_suite import TestSuite as suite
from .test_opj_suite_write import TestSuiteWrite as suitew
from .test_opj_suite_neg import TestSuiteNegative as suiteneg
from .test_xmp import TestSuite as xmp

84
glymur/test/test_xmp.py Normal file
View file

@ -0,0 +1,84 @@
import os
import struct
import sys
import tempfile
import uuid
import unittest
if sys.hexversion <= 0x03030000:
from mock import patch
else:
from unittest.mock import patch
import warnings
from xml.etree import cElementTree as ET
import pkg_resources
from glymur import Jp2k
from glymur.lib import openjp2 as opj2
import glymur
lines = ['<?xpacket begin="\ufeff"'
+ ' id="W5M0MpCehiHzreSzNTczkc9d"?> '
+ ' <x:xmpmeta xmlns:x="adobe:ns:meta/"'
+ ' x:xmptk="XMP Core 4.4.0-Exiv2">'
+ ' <rdf:RDF'
+ ' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'
+ ' <rdf:Description rdf:about=""'
+ ' xmlns:dc="http://purl.org/dc/elements/1.1/">'
+ ' <dc:subject>'
+ ' <rdf:Bag>'
+ ' <rdf:li>Rubbertree</rdf:li>'
+ ' </rdf:Bag>'
+ ' </dc:subject>'
+ ' </rdf:Description>'
+ ' </rdf:RDF>\n</x:xmpmeta>'
+ '<?xpacket end="w"?>']
packet = '\n'.join(lines)
class TestSuite(unittest.TestCase):
@classmethod
def setUpClass(cls):
jp2file = pkg_resources.resource_filename(glymur.__name__,
"data/nemo.jp2")
with tempfile.NamedTemporaryFile(suffix='.jp2', delete=False) as tfile:
cls._xmp_file = tfile.name
with open(jp2file, 'rb') as ifile:
# Everything up until the jp2c box.
buffer = ifile.read(77)
tfile.write(buffer)
# Write the uuid box with bad xml
# Length = 4 + 4 + 16 + length of packet, id is 'xml '.
L = 4 + 4 + 16 + len(packet.encode())
buffer = struct.pack('>I4s', int(L), b'uuid')
tfile.write(buffer)
tfile.write(b'\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8')
tfile.write(b'\x9c\x71\x99\x94\x91\xe3\xaf\xac')
tfile.write(packet.encode())
# Get the rest of the input file.
buffer = ifile.read()
tfile.write(buffer)
tfile.flush()
@classmethod
def tearDownClass(cls):
os.unlink(cls._xmp_file)
def setUp(self):
self.jp2file = pkg_resources.resource_filename(glymur.__name__,
"data/nemo.jp2")
def tearDown(self):
pass
def test_basic_xmp(self):
b = b'\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac'
xmp_uuid = uuid.UUID(bytes=b)
jp2 = Jp2k(self._xmp_file)
self.assertEqual(jp2.box[3].uuid, xmp_uuid)
if __name__ == "__main__":
unittest.main()