Example #1
0
    def test_scrubs_hacked_svg(self):
        hacked_svg = open(self.get_hacked_svg_image_path(), 'rb').read()

        responses.add(
            responses.GET,
            self.test_url,
            body=hacked_svg,
            status=200
        )

        status_code, storage_name = fetch_remote_file_to_storage(
            self.test_url,
            upload_to=self.test_uploaded_path,
            allowed_mime_types=self.mime_types
        )

        saved_svg_path = os.path.join('{base_url}/{file_name}'.format(
            base_url= default_storage.location,
            file_name=storage_name)
        )
            
        saved_svg = open(saved_svg_path, 'rb').read()

        self.assertNotIn(b'onload', saved_svg)
        self.assertNotIn(b'<script>', saved_svg)
Example #2
0
def _fetch_image_and_get_file(url, allowed_mime_types, upload_to=''):
    status_code, storage_name = fetch_remote_file_to_storage(
        url, upload_to=upload_to, allowed_mime_types=allowed_mime_types)
    if status_code == 200:
        image = DefaultStorage().open(storage_name)
        image.name = storage_name
        return image
Example #3
0
def import_localbadgeclass_to_issuer(apps, schema_editor):
    LocalBadgeClass = apps.get_model('composition', 'LocalBadgeClass')
    Issuer = apps.get_model('issuer', 'Issuer')
    BadgeClass = apps.get_model('issuer', 'BadgeClass')
    for local_badgeclass in LocalBadgeClass.objects.all():
        issuer = Issuer.objects.get(source='legacy_local_issuer', source_url=local_badgeclass.issuer.identifier)

        remote_image_url = local_badgeclass.json.get('image', None)
        if local_badgeclass.image:
            image = local_badgeclass.image
        elif remote_image_url and local_badgeclass.image_preview_status is None:
            try:
                status_code, image = fetch_remote_file_to_storage(remote_image_url, upload_to=local_badgeclass.image.field.upload_to)
            except IOError:
                image = None
        else:
            image = None

        new_badgeclass, created = BadgeClass.objects.get_or_create(
            source='legacy_local_badgeclass',
            source_url=local_badgeclass.identifier,
            defaults={
                'created_by': local_badgeclass.created_by,
                'name': local_badgeclass.name,
                'image': image,
                'criteria_text': local_badgeclass.criteria_text,
                'issuer': issuer,
                'original_json': json.dumps(local_badgeclass.json),
                'criteria_url': local_badgeclass.json.get('criteria', None),
                'description': local_badgeclass.json.get('description', None),
            }
        )
        new_badgeclass.created_at = new_badgeclass.created_at  # Avoid auto-now behavior
        new_badgeclass.save()
Example #4
0
    def test_remote_url_is_data_uri(self):
        data_uri_as_url = open(self.get_test_image_data_uri()).read()
        status_code, storage_name = fetch_remote_file_to_storage(
            data_uri_as_url,
            upload_to=self.test_uploaded_path,
            allowed_mime_types=self.mime_types)

        self.assertEqual(status_code, 200)
    def handle(self, *args, **options):

        # save the placeholder image to storage if needed
        store = DefaultStorage()
        placeholder_storage_name = "placeholder/badge-failed.svg"
        if not store.exists(placeholder_storage_name):
            with open(os.path.join(TOP_DIR, 'apps', 'mainsite', 'static', 'badgr-ui', 'images', 'badge-failed.svg'), 'r') as fh:
                store.save(placeholder_storage_name, fh)

        report = {
            'total': 0,
            'saved': 0,
            'placeholders_saved': 0,
            'status_codes': {},
            'ioerrors': [],
            'no_image_url': [],
            'json_error': []
        }
        badgeclasses_missing_images = BadgeClass.objects.filter(image='')
        report['total'] = len(badgeclasses_missing_images)
        self.stdout.write("Processing {} badgeclasses missing images...".format(report['total']))
        for badgeclass in badgeclasses_missing_images:
            try:
                original_json = json.loads(badgeclass.original_json)
            except ValueError:
                report['json_error'].append(badgeclass.pk)
            else:
                remote_image_url = original_json.get('image', None)
                if remote_image_url:
                    try:
                        status_code, image = fetch_remote_file_to_storage(remote_image_url, upload_to=badgeclass.image.field.upload_to)
                    except IOError as e:
                        self.stdout.write("IOError fetching '{}': {}".format(remote_image_url, str(e)))
                        report['ioerrors'].append((remote_image_url, str(e)))
                    else:
                        report['status_codes'][status_code] = report['status_codes'].get(status_code, []) + [remote_image_url]
                        if status_code == 200:
                            badgeclass.image = image
                            badgeclass.save()
                            report['saved'] += 1
                            self.stdout.write("Saved missing image for badgeclass(pk={}) from '{}'".format(badgeclass.pk, remote_image_url))
                            continue  # shortcircuit failure handling at end of loop
                        else:
                            self.stdout.write("Http error fetching '{}': {}".format(remote_image_url, status_code))
                else:
                    report['no_image_url'].append(badgeclass.pk)
                    self.stdout.write("Unable to determine an image url for badgeclass(pk={})".format(badgeclass.pk))

            # all errors should fall through to here
            if not badgeclass.image:
                report['placeholders_saved'] += 1
                badgeclass.image = placeholder_storage_name
                badgeclass.save()
        self.stdout.write(json.dumps(report, indent=2))
Example #6
0
    def test_fetch_remote_file_to_storage_with_an_unsupported_mimetype_throws_UnsupportedMediaType(self):
        responses.add(
            responses.GET,
            self.test_url,
            body=open(self.get_test_jpeg_image_path(), 'rb').read(),
            status=200
        )

        with self.assertRaises(UnsupportedMediaType):
            status_code, storage_name = fetch_remote_file_to_storage(
                self.test_url,
                upload_to=self.test_uploaded_path,
                allowed_mime_types= ['image/png', 'image/svg+xml']
            )
Example #7
0
    def test_svg_with_extension(self):
        expected_extension = '.svg'

        responses.add(responses.GET,
                      self.test_url,
                      body=open(self.get_test_svg_image_path()).read(),
                      status=200)

        status_code, storage_name = fetch_remote_file_to_storage(
            self.test_url,
            upload_to=self.test_uploaded_path,
            allowed_mime_types=self.mime_types)

        self.assertTrue(storage_name.endswith(expected_extension))
        self.assertTrue(default_storage.size(storage_name) > 0)
Example #8
0
    def test_fetch_store_and_resize_png_height_from_800_to_512_1to1_ratio(self):
        expected_extension = '.png'

        responses.add(
            responses.GET,
            self.test_url,
            body=open(self.get_test_image_800x800(), 'rb').read(),
            status=200
        )

        status_code, storage_name = fetch_remote_file_to_storage(
            self.test_url,
            upload_to=self.test_uploaded_path,
            allowed_mime_types=self.mime_types,
            resize_to_height=512
        )

        image = Image.open(os.path.join(self.path_to_mediafiles, storage_name))
        self.assertEqual(image.width, 512)
        self.assertEqual(image.height, 512)
        self.assertTrue(storage_name.endswith(expected_extension))
        self.assertTrue(default_storage.size(storage_name) > 0)
Example #9
0
 def fetch_and_process_logo_uri(self, logo_uri):
     return fetch_remote_file_to_storage(
         logo_uri,
         upload_to='remote/application',
         allowed_mime_types=['image/png', 'image/svg+xml'],
         resize_to_height=512)
Example #10
0
 def patched_fetch_and_process_logo_uri(self, logo_uri):
     return fetch_remote_file_to_storage(
         logo_uri,
         upload_to=upload_to_path,
         allowed_mime_types=['image/png', 'image/svg+xml'],
         resize_to_height=512)
Example #11
0
def _fetch_image_and_get_file(url, upload_to=''):
    status_code, storage_name = fetch_remote_file_to_storage(url, upload_to=upload_to)
    if status_code == 200:
        image = DefaultStorage().open(storage_name)
        image.name = storage_name
        return image