Esempio n. 1
0
    def setUp(self):
        fp = "img/test.png"
        fmt = "png"

        self.authorizer = RulesAuthorizer({
            "cookie_secret": b"4rakTQJDyhaYgoew802q78pNnsXR7ClvbYtAF1YC87o=",
            "token_secret": b"hyQijpEEe9z1OB9NOkHvmSA4lC1B4lu1n80bKNx0Uz0=",
            "salt": b"4rakTQJD4lC1B4lu"
        })
        self.badInfo = ImageInfo(app=None, src_img_fp=fp, src_format=fmt)
        self.okayIdent = "67352ccc-d1b0-11e1-89ae-279075081939.jp2"
        self.okayInfo = ImageInfo(app=None,
                                  src_img_fp="img/%s" % self.okayIdent,
                                  src_format="jp2")

        self.origin = "localhost"
        # role to get access is "test"
        # en/decryption defaults to return the plain text
        self.emptyRequest = MockRequest()

        secret = b'-'.join(
            [self.authorizer.token_secret,
             self.origin.encode('utf8')])
        key = base64.urlsafe_b64encode(self.authorizer.kdf().derive(secret))
        self.token_fernet = Fernet(key)
        tv = self.token_fernet.encrypt(b"localhost|test")
        jwt_tv = jwt.encode({u"sub": u"test"}, secret, algorithm='HS256')
        jwt_tv_roles = jwt.encode({u"roles": [u'test']},
                                  secret,
                                  algorithm='HS256')

        secret = b'-'.join(
            [self.authorizer.cookie_secret,
             self.origin.encode('utf8')])
        key = base64.urlsafe_b64encode(self.authorizer.kdf().derive(secret))
        self.cookie_fernet = Fernet(key)
        cv = self.cookie_fernet.encrypt(b"localhost|test")
        jwt_cv = jwt.encode({"sub": "test"}, secret, algorithm='HS256')
        jwt_cv_roles = jwt.encode({"roles": ['test']},
                                  secret,
                                  algorithm='HS256')

        self.tokenRequest = MockRequest(headers={
            "Authorization": b"Bearer " + tv,
            "origin": self.origin
        })
        self.cookieRequest = MockRequest(headers={"origin": self.origin},
                                         cookies={'iiif_access_cookie': cv})
        self.cookieRequest.path = ".../default.jpg"

        self.jwtTokenRequest = MockRequest(headers={
            "Authorization": b"Bearer " + jwt_tv,
            "origin": self.origin
        })
        self.jwtCookieRequest = MockRequest(
            headers={"origin": self.origin},
            cookies={'iiif_access_cookie': jwt_cv})
        self.jwtCookieRequest.path = ".../default.jpg"
Esempio n. 2
0
 def setUp(self):
     ident = "test"
     fp = "img/test.png"
     fmt = "png"
     self.authorizer = SingleDegradingAuthorizer({})
     self.badInfo = ImageInfo(None, ident, fp, fmt)
     self.okayInfo = ImageInfo(None, "67352ccc-d1b0-11e1-89ae-279075081939.jp2",\
         "img/67352ccc-d1b0-11e1-89ae-279075081939.jp2", "jp2")
     self.request = MockRequest()
Esempio n. 3
0
 def setUp(self):
     fp = "img/test.png"
     fmt = "png"
     self.authorizer = SingleDegradingAuthorizer({})
     self.badInfo = ImageInfo(app=None, src_img_fp=fp, src_format=fmt)
     self.okayIdent = "67352ccc-d1b0-11e1-89ae-279075081939.jp2"
     self.okayInfo = ImageInfo(app=None,
                               src_img_fp="img/%s" % self.okayIdent,
                               src_format="jp2")
     self.request = MockRequest()
Esempio n. 4
0
    def test_rights_licensing_properties_in_iiif_json(self):
        info = ImageInfo(
            src_img_fp=self.test_jpeg_fp,
            src_format=self.test_jpeg_fmt,
            license='CC-BY',
            logo='logo.png',
            attribution='Author unknown',
        )
        info.from_image_file()

        iiif_json = json.loads(
            info.to_iiif_json(base_uri='http://localhost/1234'))
        assert iiif_json['license'] == 'CC-BY'
        assert iiif_json['logo'] == 'logo.png'
        assert iiif_json['attribution'] == 'Author unknown'
Esempio n. 5
0
    def test_profile_from_json_one_arg_profile(self):
        compliance_uri = 'http://iiif.io/api/image/2/level2.json'
        existing_info = {'profile': [compliance_uri]}
        info = ImageInfo.from_json(json.dumps(existing_info))

        assert info.profile.compliance_uri == compliance_uri
        assert info.profile.description == {}
Esempio n. 6
0
    def resolve(self, app, ident, base_uri):
        ident = unquote(ident)
        local_fp = join(self.cache_root, ident)
        logger.debug('local_fp: %s' % (local_fp))

        if exists(local_fp):
            format_ = 'jp2'  # FIXME
            logger.debug('src image from local disk: %s' % (local_fp, ))
        else:
            # get image from S3
            bucketname = self.s3bucket
            keyname = '{0}{1}'.format(self.prefix, ident).strip("/")
            logger.debug(
                'Getting img from AWS S3. bucketname, keyname: %s, %s' %
                (bucketname, keyname))

            s3 = boto3.client('s3')
            try:
                s3.download_file(bucketname, keyname, local_fp)
            except botocore.exceptions.ClientError as e:
                message = 'Source image not found for identifier: %s.' % (
                    ident, )
                logger.warn(e, message)
                raise ResolverException(404, message)
            format_ = 'jp2'  #FIXME
            logger.debug('src format %s' % (format, ))

        return ImageInfo(app=app,
                         src_img_fp=local_fp,
                         src_format=format_,
                         auth_rules={})
Esempio n. 7
0
 def setUp(self):
     ident = "test"
     fp = "img/test.png"
     fmt = "png"
     self.authorizer = NooneAuthorizer({})
     self.info = ImageInfo(None, ident, fp, fmt)
     self.request = MockRequest()
Esempio n. 8
0
    def resolve(self, app, ident, base_uri):
        try:
            key = urllib.unquote(ident)
            info_fp = self._get_key_from_file(key, '.info')

            try:
                cache_info = CacheInfo.load(info_fp)
            except CacheException as e:
                src_img_fp = self._get_key_from_file(key, '.cache')

                obj = self._bucket.Object(key)
                obj.load()

                with tempfile.NamedTemporaryFile(dir=self._cache_root,
                                                 delete=False) as tmp_file:
                    obj.download_file(tmp_file.name)

                if os.path.exists(src_img_fp):
                    os.remove(tmp_file.name)
                else:
                    os.rename(tmp_file.name, src_img_fp)

                cache_info = CacheInfo(ident, src_img_fp, obj)
                cache_info.save(info_fp)

        except botocore.exceptions.ClientError as e:
            self.raise_boto_for_ident(ident, e)

        uri = self.fix_base_uri(base_uri)
        source_fp = cache_info.src_img_fp
        format = cache_info.src_format
        extra = self.get_extra_info(ident, source_fp)

        return ImageInfo(app, uri, source_fp, format, extra)
Esempio n. 9
0
 def resolve(self, app, ident, base_uri):
     cached_file_path = self.cached_file_for_ident(ident)
     if not cached_file_path:
         cached_file_path = self.copy_to_cache(ident)
     format_ = self.get_format(cached_file_path, None)
     uri = self.fix_base_uri(base_uri)
     extra = self.get_extra_info(ident, cached_file_path)
     return ImageInfo(app, uri, cached_file_path, format_, extra)
Esempio n. 10
0
    def test_extrainfo_appears_in_iiif_json(self):
        info = ImageInfo(
            src_img_fp=self.test_jpeg_fp,
            src_format=self.test_jpeg_fmt,
            extra={'extraInfo': {
                'license': 'CC-BY',
                'logo': 'logo.png',
                'service': {'@id': 'my_service'},
                'attribution': 'Author unknown',
            }}
        )
        info.from_image_file()

        iiif_json = json.loads(info.to_iiif_json())
        assert iiif_json['license'] == 'CC-BY'
        assert iiif_json['logo'] == 'logo.png'
        assert iiif_json['service'] == {'@id': 'my_service'}
        assert iiif_json['attribution'] == 'Author unknown'
Esempio n. 11
0
    def resolve(self, app, ident, base_uri):

        if not self.is_resolvable(ident):
            self.raise_404_for_ident(ident)

        source_fp = self.source_file_path(ident)
        format_ = self.format_from_ident(ident)
        uri = self.fix_base_uri(base_uri)
        extra = self.get_extra_info(ident, source_fp)
        return ImageInfo(app, uri, source_fp, format_, extra)
Esempio n. 12
0
 def resolve(self, app, ident, base_uri):
     cached_file_path = self.cached_file_for_ident(ident)
     if not cached_file_path:
         cached_file_path = self.copy_to_cache(ident)
     format_ = self.get_format(cached_file_path, None)
     auth_rules = self.get_auth_rules(ident, cached_file_path)
     return ImageInfo(app=app,
                      src_img_fp=cached_file_path,
                      src_format=format_,
                      auth_rules=auth_rules)
Esempio n. 13
0
    def resolve(self, app, ident, base_uri):
        if not self.is_resolvable(ident):
            self.raise_404_for_ident(ident)

        source_fp = self.source_file_path(ident)
        format_ = self.format_from_ident(ident)
        auth_rules = self.get_auth_rules(ident, source_fp)
        return ImageInfo(app=app,
                         src_img_fp=source_fp,
                         src_format=format_,
                         auth_rules=auth_rules)
Esempio n. 14
0
 def test_extrainfo_can_override_attributes(self):
     info = ImageInfo(extra={'extraInfo': {
         'license': 'CC-BY',
         'logo': 'logo.png',
         'service': {'@id': 'my_service'},
         'attribution': 'Author unknown',
     }})
     assert info.license == 'CC-BY'
     assert info.logo == 'logo.png'
     assert info.service == {'@id': 'my_service'}
     assert info.attribution == 'Author unknown'
Esempio n. 15
0
 def resolve(self, app, ident, base_uri):
     '''Return information about the image, caching it if needed.'''
     if not self.is_resolvable(ident):
         self.raise_404_for_ident(ident)
     if not self.in_cache(ident):
         self.copy_to_cache(ident)
     cache_file_path = self.cache_file_path(ident)
     format_ = self.format_from_ident(ident)
     uri = self.fix_base_uri(base_uri)
     extra = self.get_extra_info(ident, cache_file_path)
     return ImageInfo(app, uri, cache_file_path, format_, extra)
Esempio n. 16
0
    def resolve(self, app, ident, base_uri):
        if not self.is_resolvable(ident):
            self.raise_404_for_ident(ident)
        if not self.in_cache(ident):
            self.copy_to_cache(ident)

        cache_fp = self.cache_file_path(ident)
        format_ = self.format_from_ident(ident)
        uri = self.fix_base_uri(base_uri)
        extra = self.get_extra_info(ident, cache_fp)
        logger.info("Cached copy sent %s", cache_fp)

        return ImageInfo(app, uri, cache_fp, format_, extra)
Esempio n. 17
0
    def test_profile_from_json_two_arg_profile(self):
        compliance_uri = 'http://iiif.io/api/image/2/level2.json'
        description = {
            'formats': ['jpg', 'png', 'gif', 'webp', 'tif'],
            'qualities': ['default', 'bitonal', 'gray', 'color'],
            'supports': [
                'canonicalLinkHeader', 'profileLinkHeader', 'mirroring',
                'rotationArbitrary', 'sizeAboveFull', 'regionSquare'
            ]
        }
        existing_info = {'profile': [compliance_uri, description]}
        info = ImageInfo.from_json(json.dumps(existing_info))

        assert info.profile.compliance_uri == compliance_uri
        assert info.profile.description == description
Esempio n. 18
0
    def test_profile_from_json_no_profile(self):
        existing_info = {}
        info = ImageInfo.from_json(json.dumps(existing_info))

        assert info.profile.compliance_uri == ''
        assert info.profile.description == {}
Esempio n. 19
0
 def test_invalid_src_format_is_error(self, src_format):
     info = ImageInfo(src_format=src_format)
     with pytest.raises(ImageInfoException) as exc:
         info.from_image_file()
Esempio n. 20
0
 def test_invalid_extra_info_is_imageinfoexception(self):
     with pytest.raises(ImageInfoException) as exc:
         ImageInfo(extra={'extraInfo': {'foo': 'bar', 'baz': 'bat'}})
     assert 'Invalid parameters in extraInfo' in str(exc.value)
Esempio n. 21
0
 def setUp(self):
     fp = "img/test.png"
     fmt = "png"
     self.authorizer = NooneAuthorizer({})
     self.info = ImageInfo(app=None, src_img_fp=fp, src_format=fmt)
     self.request = MockRequest()