Example #1
0
def approve_rereview(theme):
    """Replace original theme with pending theme on filesystem."""
    # If reuploaded theme, replace old theme design.
    storage = LocalFileStorage()
    rereview = theme.rereviewqueuetheme_set.all()
    reupload = rereview[0]

    if reupload.header_path != reupload.theme.header_path:
        create_persona_preview_images(
            src=reupload.header_path,
            full_dst=[
                reupload.theme.thumb_path,
                reupload.theme.icon_path],
            set_modified_on=reupload.theme.addon.serializable_reference())

        if not reupload.theme.is_new():
            # Legacy themes also need a preview_large.jpg.
            # Modern themes use preview.png for both thumb and preview so there
            # is no problem there.
            copy_stored_file(reupload.theme.thumb_path,
                             reupload.theme.preview_path, storage=storage)

        move_stored_file(
            reupload.header_path, reupload.theme.header_path, storage=storage)

    theme = reupload.theme
    rereview.delete()
    theme_checksum(theme)
    theme.addon.increment_theme_version_number()
Example #2
0
def repack_fileupload(upload_pk):
    log.info('Starting task to repackage FileUpload %s', upload_pk)
    upload = FileUpload.objects.get(pk=upload_pk)
    # When a FileUpload is created and a file added to it, if it's a xpi/zip,
    # it should be move to upload.path, and it should have a .xpi extension,
    # so we only need to care about that extension here.
    # We don't trust upload.name: it's the original filename as used by the
    # developer, so it could be something else.
    if upload.path.endswith('.xpi'):
        try:
            tempdir = extract_zip(upload.path)
        except Exception:
            # Something bad happened, maybe we couldn't parse the zip file.
            # This task should have a on_error attached when called by
            # Validator(), so we can just raise and the developer will get a
            # generic error message.
            log.exception('Could not extract upload %s for repack.', upload_pk)
            raise
        log.info('Zip from upload %s extracted, repackaging', upload_pk)
        file_ = tempfile.NamedTemporaryFile(suffix='.zip', delete=False)
        shutil.make_archive(os.path.splitext(file_.name)[0], 'zip', tempdir)
        with open(file_.name, 'rb') as f:
            upload.hash = 'sha256:%s' % get_sha256(f)
        log.info('Zip from upload %s repackaged, moving file back', upload_pk)
        move_stored_file(file_.name, upload.path)
        upload.save()
    else:
        log.info('Not repackaging upload %s, it is not a xpi file.', upload_pk)
Example #3
0
def approve_rereview(theme):
    """Replace original theme with pending theme on filesystem."""
    # If reuploaded theme, replace old theme design.
    storage = LocalFileStorage()
    rereview = theme.rereviewqueuetheme_set.all()
    reupload = rereview[0]

    if reupload.header_path != reupload.theme.header_path:
        create_persona_preview_images(
            src=reupload.header_path,
            full_dst=[reupload.theme.thumb_path, reupload.theme.icon_path],
            set_modified_on=reupload.theme.addon.serializable_reference())

        if not reupload.theme.is_new():
            # Legacy themes also need a preview_large.jpg.
            # Modern themes use preview.png for both thumb and preview so there
            # is no problem there.
            copy_stored_file(reupload.theme.thumb_path,
                             reupload.theme.preview_path,
                             storage=storage)

        move_stored_file(reupload.header_path,
                         reupload.theme.header_path,
                         storage=storage)

    theme = reupload.theme
    rereview.delete()
    theme_checksum(theme)
    theme.addon.increment_theme_version_number()
Example #4
0
    def move_file(self, source_path, destination_path, log_message):
        """Move a file from `source_path` to `destination_path` and delete the
        source directory if it's empty once the file has been successfully
        moved.

        Meant to move files from/to the guarded file path as they are disabled
        or re-enabled.

        IOError and UnicodeEncodeError are caught and logged."""
        log_message = force_str(log_message)
        try:
            if storage.exists(source_path):
                source_parent_path = os.path.dirname(source_path)
                log.info(
                    log_message.format(source=source_path,
                                       destination=destination_path))
                move_stored_file(source_path, destination_path)
                # Now that the file has been deleted, remove the directory if
                # it exists to prevent the main directory from growing too
                # much (#11464)
                remaining_dirs, remaining_files = storage.listdir(
                    source_parent_path)
                if len(remaining_dirs) == len(remaining_files) == 0:
                    storage.delete(source_parent_path)
        except (UnicodeEncodeError, IOError):
            msg = 'Move Failure: {} {}'.format(source_path, destination_path)
            log.exception(msg)
Example #5
0
    def move_file(self, source_path, destination_path, log_message):
        """Move a file from `source_path` to `destination_path` and delete the
        source directory if it's empty once the file has been successfully
        moved.

        Meant to move files from/to the guarded file path as they are disabled
        or re-enabled.

        IOError and UnicodeEncodeError are caught and logged."""
        log_message = force_text(log_message)
        try:
            if storage.exists(source_path):
                source_parent_path = os.path.dirname(source_path)
                log.info(log_message.format(
                    source=source_path, destination=destination_path))
                move_stored_file(source_path, destination_path)
                # Now that the file has been deleted, remove the directory if
                # it exists to prevent the main directory from growing too
                # much (#11464)
                remaining_dirs, remaining_files = storage.listdir(
                    source_parent_path)
                if len(remaining_dirs) == len(remaining_files) == 0:
                    storage.delete(source_parent_path)
        except (UnicodeEncodeError, IOError):
            msg = u'Move Failure: {} {}'.format(source_path, destination_path)
            log.exception(msg)
Example #6
0
 def mv(cls, src, dst, msg):
     """Move a file from src to dst."""
     try:
         if storage.exists(src):
             log.info(msg % (src, dst))
             move_stored_file(src, dst)
     except UnicodeEncodeError:
         log.error('Move Failure: %s %s' % (smart_str(src), smart_str(dst)))
Example #7
0
 def mv(cls, src, dst, msg):
     """Move a file from src to dst."""
     try:
         if storage.exists(src):
             log.info(msg % (src, dst))
             move_stored_file(src, dst)
     except UnicodeEncodeError:
         log.error('Move Failure: %s %s' % (smart_str(src), smart_str(dst)))
Example #8
0
 def mv(cls, src, dst, msg):
     """Move a file from src to dst."""
     try:
         if storage.exists(src):
             log.info(msg % (src, dst))
             move_stored_file(src, dst)
     except UnicodeEncodeError:
         msg = 'Move Failure: %s %s' % (force_bytes(src), force_bytes(dst))
         log.error(msg)
Example #9
0
 def mv(cls, src, dst, msg):
     """Move a file from src to dst."""
     try:
         if storage.exists(src):
             log.info(msg % (src, dst))
             move_stored_file(src, dst)
     except UnicodeEncodeError:
         msg = 'Move Failure: %s %s' % (force_bytes(src), force_bytes(dst))
         log.error(msg)
Example #10
0
 def move_file(self, source, destination, log_message):
     """Move a file from `source` to `destination`."""
     log_message = force_text(log_message)
     try:
         if storage.exists(source):
             log.info(
                 log_message.format(source=source, destination=destination))
             move_stored_file(source, destination)
     except (UnicodeEncodeError, IOError):
         msg = u'Move Failure: {} {}'.format(source, destination)
         log.exception(msg)
Example #11
0
 def move_file(self, source, destination, log_message):
     """Move a file from `source` to `destination`."""
     log_message = force_text(log_message)
     try:
         if storage.exists(source):
             log.info(log_message.format(
                 source=source, destination=destination))
             move_stored_file(source, destination)
     except (UnicodeEncodeError, IOError):
         msg = u'Move Failure: {} {}'.format(source, destination)
         log.exception(msg)
Example #12
0
    def move_file(self, source, destination, log_message):
        """Move a file from `source` to `destination`."""
        # Make sure we are passing bytes to Python's io system.
        source, destination = force_bytes(source), force_bytes(destination)

        try:
            if storage.exists(source):
                log.info(log_message.format(
                    source=source, destination=destination))
                move_stored_file(source, destination)
        except (UnicodeEncodeError, IOError):
            msg = 'Move Failure: {} {}'.format(
                force_bytes(source), force_bytes(destination))
            log.exception(msg)
Example #13
0
    def move_file(self, source, destination, log_message):
        """Move a file from `source` to `destination`."""
        # Make sure we are passing bytes to Python's io system.
        source, destination = force_bytes(source), force_bytes(destination)

        try:
            if storage.exists(source):
                log.info(
                    log_message.format(source=source, destination=destination))
                move_stored_file(source, destination)
        except (UnicodeEncodeError, IOError):
            msg = 'Move Failure: {} {}'.format(force_bytes(source),
                                               force_bytes(destination))
            log.exception(msg)
Example #14
0
def repack_fileupload(results, upload_pk):
    log.info('Starting task to repackage FileUpload %s', upload_pk)
    upload = FileUpload.objects.get(pk=upload_pk)
    # When a FileUpload is created and a file added to it, if it's a xpi/zip,
    # it should be move to upload.path, and it should have a .xpi extension,
    # so we only need to care about that extension here.
    # We don't trust upload.name: it's the original filename as used by the
    # developer, so it could be something else.
    if upload.path.endswith('.xpi'):
        timer = StopWatch('files.tasks.repack_fileupload.')
        timer.start()
        # tempdir must *not* be on TMP_PATH, we want local fs instead. It will be
        # deleted automatically once we exit the context manager.
        with tempfile.TemporaryDirectory(prefix='repack_fileupload_extract') as tempdir:
            try:
                extract_zip(upload.path, tempdir=tempdir)
            except Exception as exc:
                # Something bad happened, maybe we couldn't parse the zip file.
                # @validation_task should ensure the exception is caught and
                # transformed in a generic error message for the developer, so we
                # just log it and re-raise.
                log.exception(
                    'Could not extract upload %s for repack.', upload_pk, exc_info=exc
                )
                raise
            timer.log_interval('1.extracted')
            log.info('Zip from upload %s extracted, repackaging', upload_pk)
            # We'll move the file to its final location below with move_stored_file(),
            # so don't let tempfile delete it.
            file_ = tempfile.NamedTemporaryFile(suffix='.zip', delete=False)
            shutil.make_archive(os.path.splitext(file_.name)[0], 'zip', tempdir)
        with open(file_.name, 'rb') as f:
            upload.hash = 'sha256:%s' % get_sha256(f)
        timer.log_interval('2.repackaged')
        log.info('Zip from upload %s repackaged, moving file back', upload_pk)
        move_stored_file(file_.name, upload.path)
        timer.log_interval('3.moved')
        upload.save()
        timer.log_interval('4.end')
    else:
        log.info('Not repackaging upload %s, it is not a xpi file.', upload_pk)
    return results
Example #15
0
def approve_rereview(theme):
    """Replace original theme with pending theme on filesystem."""
    # If reuploaded theme, replace old theme design.
    storage = LocalFileStorage()
    rereview = theme.rereviewqueuetheme_set.all()
    reupload = rereview[0]

    if reupload.header_path != reupload.theme.header_path:
        create_persona_preview_images(
            src=reupload.header_path,
            full_dst=[
                reupload.theme.thumb_path,
                reupload.theme.icon_path],
            set_modified_on=[reupload.theme.addon])

        if not reupload.theme.is_new():
            # Legacy themes also need a preview_large.jpg.
            # Modern themes use preview.png for both thumb and preview so there
            # is no problem there.
            copy_stored_file(reupload.theme.thumb_path,
                             reupload.theme.preview_path, storage=storage)

        move_stored_file(
            reupload.header_path, reupload.theme.header_path, storage=storage)

    theme = reupload.theme
    footer_path = theme.footer_path
    if reupload.footer_path != footer_path:
        if not footer_path:
            dst_root = os.path.join(user_media_path('addons'),
                                    str(theme.addon.id))
            footer_path = os.path.join(dst_root, 'footer.png')
            theme.footer = 'footer.png'
            theme.save()

        move_stored_file(
            reupload.footer_path, footer_path, storage=storage)
    rereview.delete()

    theme.addon.increment_theme_version_number()
Example #16
0
def approve_rereview(theme):
    """Replace original theme with pending theme on filesystem."""
    # If reuploaded theme, replace old theme design.
    storage = LocalFileStorage()
    rereview = theme.rereviewqueuetheme_set.all()
    reupload = rereview[0]

    if reupload.header_path != reupload.theme.header_path:
        create_persona_preview_images(
            src=reupload.header_path,
            full_dst=[
                reupload.theme.thumb_path,
                reupload.theme.icon_path],
            set_modified_on=[reupload.theme.addon])

        if not reupload.theme.is_new():
            # Legacy themes also need a preview_large.jpg.
            # Modern themes use preview.png for both thumb and preview so there
            # is no problem there.
            copy_stored_file(reupload.theme.thumb_path,
                             reupload.theme.preview_path, storage=storage)

        move_stored_file(
            reupload.header_path, reupload.theme.header_path, storage=storage)

    theme = reupload.theme
    footer_path = theme.footer_path
    if reupload.footer_path != footer_path:
        if not footer_path:
            dst_root = os.path.join(user_media_path('addons'),
                                    str(theme.addon.id))
            footer_path = os.path.join(dst_root, 'footer.png')
            theme.footer = 'footer.png'
            theme.save()

        move_stored_file(
            reupload.footer_path, footer_path, storage=storage)
    rereview.delete()

    theme.addon.increment_theme_version_number()
 def test_move_chunking(self):
     src = self.newfile('src.txt', '<contents>')
     dest = self.path('somedir/dest.txt')
     move_stored_file(src, dest, chunk_size=1)
     assert self.contents(dest) == '<contents>'
     assert not storage.exists(src)
 def test_move_chunking(self):
     src = self.newfile('src.txt', '<contents>')
     dest = self.path('somedir/dest.txt')
     move_stored_file(src, dest, chunk_size=1)
     assert self.contents(dest) == '<contents>'
     assert not storage.exists(src)
 def test_move(self):
     src = self.newfile("src.txt", "<contents>")
     dest = self.path("somedir/dest.txt")
     move_stored_file(src, dest)
     eq_(self.contents(dest), "<contents>")
     eq_(storage.exists(src), False)
 def test_move(self):
     src = self.newfile('src.txt', '<contents>')
     dest = self.path('somedir/dest.txt')
     move_stored_file(src, dest)
     assert self.contents(dest) == '<contents>'
     assert storage.exists(src) == False