Beispiel #1
0
    def __call__(self):
        if None in self.interface_mapping:
            brains = api.content.find(object_provides=['opengever.dossier.interfaces.IDossierJournalPdfMarker',
                                                       'opengever.dossier.interfaces.IDossierTasksPdfMarker'])

            if len(brains) > 0:
                error = "Trying to execute upgrade step AddAutomaticallyGeneratedDocumentInterface\n"
                error += "after 'opengever.dossier.interfaces.IDossierJournalPdfMarker' and\n"
                error += "'opengever.dossier.interfaces.IDossierTasksPdfMarker' have already\n"
                error += "been removed from code. There are {} objects\n".format(len(brains))
                error += "left displaying one of these interfaces."

                log_msg_to_sentry(error)
                LOG.warning("Sent message to sentry:")
                LOG.warning(error)
            return

        for old_interface, new_interface in self.interface_mapping.items():
            query = {'object_provides': [old_interface.__identifier__]}
            message = 'Map {} to {}'.format(old_interface.__identifier__,
                                            new_interface.__identifier__)
            for obj in self.objects(query, message):
                alsoProvides(obj, new_interface)
                noLongerProvides(obj, old_interface)
                obj.reindexObject(idxs=['object_provides'])
    def acquire(self, commit=False):
        """Acquire a resolve lock for a dossier.

        Will overwrite a possibly existing expired lock.
        """
        self.log("Acquiring resolve lock for %s..." % self.context)

        if self.txn_is_dirty():
            # Acquiring and committing the lock should always be the first
            # thing that's being done when resolving the dossier, otherwise
            # we would be committing unrelated, unexpected changes.
            #
            # Detect if that happens, but still proceed and log to sentry.
            msg = 'Dirty transaction when comitting resolve lock'
            self.log(msg)
            self.log('Registered objects: %r' % self._registered_objects())
            log_msg_to_sentry(
                msg,
                level='warning',
                extra={'registered_objects': repr(self._registered_objects())})

        ann = IAnnotations(self.context)
        lockinfo = PersistentMapping({
            'timestamp': datetime.now(),
            'userid': api.user.get_current().id,
        })
        ann[RESOLVE_LOCK_KEY] = lockinfo
        self.invalidate_cache()

        if commit:
            transaction.commit()

        self.log("Resolve lock acquired.")
Beispiel #3
0
    def __call__(self):
        if None in self.interface_mapping:
            brains = api.content.find(object_provides=[
                'opengever.dossier.interfaces.IDossierJournalPdfMarker',
                'opengever.dossier.interfaces.IDossierTasksPdfMarker'
            ])

            if len(brains) > 0:
                error = "Trying to execute upgrade step AddAutomaticallyGeneratedDocumentInterface\n"
                error += "after 'opengever.dossier.interfaces.IDossierJournalPdfMarker' and\n"
                error += "'opengever.dossier.interfaces.IDossierTasksPdfMarker' have already\n"
                error += "been removed from code. There are {} objects\n".format(
                    len(brains))
                error += "left displaying one of these interfaces."

                log_msg_to_sentry(error)
                LOG.warning("Sent message to sentry:")
                LOG.warning(error)
            return

        for old_interface, new_interface in self.interface_mapping.items():
            query = {'object_provides': [old_interface.__identifier__]}
            message = 'Map {} to {}'.format(old_interface.__identifier__,
                                            new_interface.__identifier__)
            for obj in self.objects(query, message):
                alsoProvides(obj, new_interface)
                noLongerProvides(obj, old_interface)
                obj.reindexObject(idxs=['object_provides'])
    def acquire(self, commit=False):
        """Acquire a resolve lock for a dossier.

        Will overwrite a possibly existing expired lock.
        """
        self.log("Acquiring resolve lock for %s..." % self.context)

        if self.txn_is_dirty():
            # Acquiring and committing the lock should always be the first
            # thing that's being done when resolving the dossier, otherwise
            # we would be committing unrelated, unexpected changes.
            #
            # Detect if that happens, but still proceed and log to sentry.
            msg = 'Dirty transaction when comitting resolve lock'
            self.log(msg)
            self.log('Registered objects: %r' % self._registered_objects())
            log_msg_to_sentry(msg, level='warning', extra={
                'registered_objects': repr(self._registered_objects())}
            )

        ann = IAnnotations(self.context)
        lockinfo = PersistentMapping({
            'timestamp': datetime.now(),
            'userid': api.user.get_current().id,
        })
        ann[RESOLVE_LOCK_KEY] = lockinfo
        self.invalidate_cache()

        if commit:
            transaction.commit()

        self.log("Resolve lock acquired.")
Beispiel #5
0
def _log_unexpected_conversion_to_sentry(converted, markup):
    request = getRequest()

    extra = {'converted_html': converted, 'source_html': markup}

    log_msg_to_sentry('Unexpected html during trix/sablon conversion',
                      request=request,
                      url=request.get('ACTUAL_URL', ''),
                      extra=extra,
                      string_max_length=SERVER_SIDE_STRING_MAX_LENGTH)
Beispiel #6
0
def _log_unexpected_conversion_to_sentry(converted, markup):
    request = getRequest()

    extra = {
        'converted_html': converted,
        'source_html': markup
    }

    log_msg_to_sentry(
        'Unexpected html during trix/sablon conversion',
        request=request,
        url=request.get('ACTUAL_URL', ''),
        extra=extra,
        string_max_length=SERVER_SIDE_STRING_MAX_LENGTH)
Beispiel #7
0
def _update_docproperties(document, raise_on_error=False):
    try:
        DocPropertyWriter(document).update()
    except Exception as exc:
        if not raise_on_error:
            path = '/'.join(document.getPhysicalPath())
            logger.warn('Failed to update DocProperties for %r' % path)
            logger.warn('\n%s' % format_exc(exc))
            logger.warn('Updating of DocProperties has therefore been skipped')
            log_msg_to_sentry(
                'DocProperties update skipped', level='warning',
                extra={'document_that_failed': repr(document)})
            return

        raise
Beispiel #8
0
def _update_docproperties(document, raise_on_error=False):
    try:
        DocPropertyWriter(document).update()
    except Exception as exc:
        if not raise_on_error:
            path = '/'.join(document.getPhysicalPath())
            logger.warn('Failed to update DocProperties for %r' % path)
            logger.warn('\n%s' % format_exc(exc))
            logger.warn('Updating of DocProperties has therefore been skipped')
            log_msg_to_sentry('DocProperties update skipped',
                              level='warning',
                              extra={'document_that_failed': repr(document)})
            return

        raise
Beispiel #9
0
    def transform(self, value):
        # Create a temporary directory for 'msgconvert' to work in. It dumps
        # the resulting .eml file to its working directory, and doesn't take
        # an commandline option to actually specify the output path, so we
        # have it do its work in a tempdir and predict the output filename.
        tempdir = tempfile.mkdtemp()

        # Create a temporary msg file in the tempdir we just created
        msg_path = os.path.join(tempdir, 'mail.msg')
        with open(msg_path, 'wb') as msg_file:
            msg_file.write(value)

        msgconvert_path = spawn.find_executable("msgconvert")
        if msgconvert_path is None:
            error = 'msgconvert not found in $PATH'
            log_msg_to_sentry(
                error,
                request=getRequest())
            raise EnvironmentError(error)

        process = subprocess.Popen(
            [msgconvert_path, msg_path],
            bufsize=0,
            cwd=tempdir,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            close_fds=True)

        # Wait for subprocess to terminate.
        stdout, stderr = process.communicate()

        # The converted .eml file will be placed in the working directory
        eml_path = os.path.join(tempdir, 'mail.eml')
        with open(eml_path) as eml_file:
            eml_data = eml_file.read()

        # Remove temp directory
        shutil.rmtree(tempdir)

        # If program terminated correctly return converted message
        if process.returncode == 0:
            return eml_data
        # If program terminated with error, raise exception
        else:
            msg = 'Program terminated with error code %s\n%s' % (
                process.returncode, stderr)
            raise IOError(msg)
Beispiel #10
0
    def transform(self, value):
        # Create a temporary directory for 'msgconvert' to work in. It dumps
        # the resulting .eml file to its working directory, and doesn't take
        # an commandline option to actually specify the output path, so we
        # have it do its work in a tempdir and predict the output filename.
        tempdir = tempfile.mkdtemp()

        # Create a temporary msg file in the tempdir we just created
        msg_path = os.path.join(tempdir, 'mail.msg')
        with open(msg_path, 'wb') as msg_file:
            msg_file.write(value)

        msgconvert_path = spawn.find_executable("msgconvert")
        if msgconvert_path is None:
            error = 'msgconvert not found in $PATH'
            log_msg_to_sentry(error, request=getRequest())
            raise EnvironmentError(error)

        process = subprocess.Popen([msgconvert_path, msg_path],
                                   bufsize=0,
                                   cwd=tempdir,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   close_fds=True)

        # Wait for subprocess to terminate.
        stdout, stderr = process.communicate()

        # The converted .eml file will be placed in the working directory
        eml_path = os.path.join(tempdir, 'mail.eml')
        with open(eml_path) as eml_file:
            eml_data = eml_file.read()

        # Remove temp directory
        shutil.rmtree(tempdir)

        # If program terminated correctly return converted message
        if process.returncode == 0:
            return eml_data
        # If program terminated with error, raise exception
        else:
            msg = 'Program terminated with error code %s\n%s' % (
                process.returncode, stderr)
            raise IOError(msg)
Beispiel #11
0
    def _log_csrf_incident_to_sentry(self, env):
        logged = False
        try:
            extra = {'referrer': self.request.get('HTTP_REFERER', ''),
                     '_registered_objects': env['registered_objects_summary']}
        except Exception as e:
            LOG.error('Error while preparing CSRF incident data for Sentry'
                      ' (%r)' % e)
            return

        logged = log_msg_to_sentry(
            'CSRF @@confirm-action triggered',
            request=self.request,
            url=env['url'],
            extra=extra,
            fingerprint=['{{ default }}', env['url']],
        )

        if logged:
            LOG.warn('Logged CSRF incident to Sentry')
Beispiel #12
0
    def _log_csrf_incident_to_sentry(self, env):
        logged = False
        try:
            extra = {
                'referrer': self.request.get('HTTP_REFERER', ''),
                '_registered_objects': env['registered_objects_summary']
            }
        except Exception as e:
            LOG.error('Error while preparing CSRF incident data for Sentry'
                      ' (%r)' % e)
            return

        logged = log_msg_to_sentry(
            'CSRF @@confirm-action triggered',
            request=self.request,
            url=env['url'],
            extra=extra,
            fingerprint=['{{ default }}', env['url']],
        )

        if logged:
            LOG.warn('Logged CSRF incident to Sentry')
Beispiel #13
0
 def log_to_sentry(self, message):
     log_msg_to_sentry(message, request=getRequest())