Exemple #1
0
def import_rendition(guid, rendition_name, href, extract_metadata,
                     trigger_events):
    archive = superdesk.apps['archive'].find_one(req=None, guid=guid)
    if not archive:
        msg = 'No document found in the media archive with this ID: %s' % guid
        raise superdesk.SuperdeskError(payload=msg)

    if rendition_name not in archive['renditions']:
        payload = 'Invalid rendition name %s' % rendition_name
        raise superdesk.SuperdeskError(payload=payload)

    updates = {}
    metadata = None

    content, filename, content_type = download_file_from_url(href)
    if extract_metadata:
        file_type, ext = content_type.split('/')
        metadata = process_file(content, file_type)

    file_guid = app.media.put(content, filename, content_type, metadata)

    # perform partial update
    updates['renditions.' + rendition_name +
            '.href'] = url_for_media(file_guid)
    updates['renditions.' + rendition_name + '.media'] = file_guid
    result = superdesk.apps['archive'].update(id=guid,
                                              updates=updates,
                                              trigger_events=trigger_events)

    return result
 def on_delete(self, docs):
     if docs.get('is_default'):
         raise superdesk.SuperdeskError('Cannot delete the default role')
     # check if there are any users in the role
     user = get_resource_service('users').find_one(req=None,
                                                   role=docs.get('_id'))
     if user:
         raise superdesk.SuperdeskError(
             'Cannot delete the role, it still has users in it!')
Exemple #3
0
    def create(self, docs, trigger_events=None, **kwargs):
        for doc in docs:
            ingest_doc = superdesk.apps['ingest'].find_one(req=None,
                                                           _id=doc.get('guid'))
            if not ingest_doc:
                msg = 'Fail to found ingest item with guid: %s' % doc.get(
                    'guid')
                raise superdesk.SuperdeskError(payload=msg)
            ingest_set_archived(doc.get('guid'))

            archived_doc = superdesk.apps['archive'].find_one(
                req=None, guid=doc.get('guid'))
            if not archived_doc:
                doc.setdefault('_id', doc.get('guid'))
                doc.setdefault('user',
                               str(getattr(flask.g, 'user', {}).get('_id')))
                superdesk.apps['archive'].create([doc],
                                                 trigger_events=trigger_events)

            task = archive_item.delay(doc.get('guid'),
                                      ingest_doc.get('ingest_provider'),
                                      doc.get('user'), trigger_events)
            doc['task_id'] = task.id
            if task.state not in ('PROGRESS', states.SUCCESS,
                                  states.FAILURE) and not task.result:
                update_status(task.id, 0, 0)

            superdesk.apps['archive'].update(doc.get('guid'),
                                             {"task_id": task.id},
                                             trigger_events=trigger_events)

        return [doc.get('guid') for doc in docs]
Exemple #4
0
    def create(self, docs, **kwargs):
        for doc in docs:
            ingest_doc = superdesk.get_resource_service('ingest').find_one(
                req=None, _id=doc.get('guid'))
            if not ingest_doc:
                msg = 'Fail to found ingest item with guid: %s' % doc.get(
                    'guid')
                raise superdesk.SuperdeskError(payload=msg)

            mark_ingest_as_archived(ingest_doc=ingest_doc)

            archived_doc = superdesk.get_resource_service(ARCHIVE).find_one(
                req=None, guid=doc.get('guid'))
            if not archived_doc:
                self._copy_from_ingest_doc(doc, ingest_doc)
                superdesk.get_resource_service(ARCHIVE).post([doc])

            task = archive_item.delay(doc.get('guid'),
                                      ingest_doc.get('ingest_provider'),
                                      get_user())

            doc['task_id'] = task.id
            if task.state not in ('PROGRESS', states.SUCCESS,
                                  states.FAILURE) and not task.result:
                update_status(task.id, 0, 0)

        return [doc.get('guid') for doc in docs]
Exemple #5
0
 def on_delete(self, doc):
     if doc['default_incoming'] is True:
         desk_id = doc.get('desk', None)
         if desk_id:
             desk = superdesk.get_resource_service('desks').find_one(req=None, _id=desk_id)
             if desk:
                 raise superdesk.SuperdeskError('Deleting default stages is not allowed.')
def set_user(doc):
    user = get_user()
    sent_user = doc.get('user', None)
    if sent_user and sent_user != user.get('_id'):
        raise superdesk.SuperdeskError()
    doc['user'] = str(user.get('_id'))
    return str(user.get('_id'))
Exemple #7
0
    def reset_password(self, doc):
        key = doc.get('token')
        password = doc.get('password')

        reset_request = superdesk.apps['active_tokens'].find_one(req=None, token=key)
        if not reset_request:
            raise superdesk.SuperdeskError(payload='Invalid token received: %s' % key)

        user_id = reset_request['user']
        user = app.data.find_one('users', req=None, _id=user_id)
        if not user:
            raise superdesk.SuperdeskError(payload='Invalid user.')

        self.update_user_password(user_id, password)
        self.remove_all_tokens_for_email(reset_request['email'])
        self.remove_private_data(doc)
        return [reset_request['_id']]
def download_file_from_url(url):
    rv = requests.get(url)
    if rv.status_code not in (200, 201):
        payload = 'Failed to retrieve file from URL: %s' % url
        raise superdesk.SuperdeskError(payload=payload)

    mime = magic.from_buffer(rv.content, mime=True).decode('UTF-8')
    ext = mime.split('/')[1]
    name = 'stub.' + ext
    return BytesIO(rv.content), name, mime
Exemple #9
0
 def check_filter(self, filter, location):
     parsed_request = init_parsed_request(filter)
     payload = None
     try:
         superdesk.apps[location].get(req=parsed_request, lookup={})
     except Exception as e:
         logger.exception(e)
         payload = 'Fail to validate the filter against %s.' % location
     if payload:
         raise superdesk.SuperdeskError(payload=payload)
 def on_create(self, docs):
     for doc in docs:
         sent_user = doc.get('user', None)
         user = g.user
         if sent_user and sent_user != str(user.get('_id')):
             payload = 'Commenting on behalf of someone else is prohibited.'
             raise superdesk.SuperdeskError(payload=payload)
         doc['user'] = str(user.get('_id'))
         usernames = get_users_mentions(doc.get('text'))
         doc['mentioned_users'] = get_users(usernames)
    def initialize_reset_password(self, doc, email):
        token_ttl = app.config['RESET_PASSWORD_TOKEN_TIME_TO_LIVE']

        user = superdesk.get_resource_service('users').find_one(req=None,
                                                                email=email)
        if not user:
            logger.warning(
                'User password reset triggered with invalid email: %s' % email)
            raise superdesk.SuperdeskError(status_code=400, message='Created')

        if not user.get('is_active', False):
            logger.warning(
                'User password reset triggered for an inactive user')
            raise superdesk.SuperdeskError(status_code=403, message='Created')

        ids = self.store_reset_password_token(doc, email, token_ttl,
                                              user['_id'])
        send_reset_password_email(doc)
        self.remove_private_data(doc)
        return ids
Exemple #12
0
    def create(self, docs, trigger_events=None, **kwargs):
        for doc in docs:
            email = doc.get('email')
            key = doc.get('token')
            password = doc.get('password')

            if key and password:
                return self.reset_password(doc)
            if email:
                return self.initialize_reset_password(doc, email)
            raise superdesk.SuperdeskError(payload='Invalid request.')
Exemple #13
0
    def autosave(self, item_id, updates, user, etag):
        item_model = get_model(ItemModel)
        item = item_model.find_one({'_id': item_id})
        if item is None:
            raise superdesk.SuperdeskError('Invalid item identifier', 404)

        lock_user = item.get('lock_user', None)
        if lock_user and str(lock_user) != str(user['_id']):
            raise superdesk.SuperdeskError(
                payload='The item was locked by another user')

        autosave_model = get_model(ItemAutosaveModel)
        item.update(updates)
        self.app.on_item_autosave(item)
        autosave_item = autosave_model.find_one({'_id': item_id})
        if not autosave_item:
            autosave_model.create([item])
        else:
            autosave_model.update({'_id': item_id}, item, etag)
        self.app.on_item_autosaved(item)
        updates.update(item)
        return updates
Exemple #14
0
 def initialize_reset_password(self, doc, email):
     user = app.data.find_one('users', req=None, email=email)
     if not user:
         logger.warning('User password reset triggered with invalid email: %s' % email)
         raise superdesk.SuperdeskError(status_code=201, message='Created')
     doc[app.config['DATE_CREATED']] = utcnow()
     doc[app.config['LAST_UPDATED']] = utcnow()
     doc['user'] = user['_id']
     doc['token'] = get_random_string()
     ids = super().create([doc])
     send_reset_password_email(doc)
     self.remove_private_data(doc)
     return ids
    def reset_password(self, doc):
        key = doc.get('token')
        password = doc.get('password')

        reset_request = superdesk.get_resource_service(
            'active_tokens').find_one(req=None, token=key)
        if not reset_request:
            logger.warning('Invalid token received: %s' % key)
            raise superdesk.SuperdeskError(status_code=400, message='Created')

        user_id = reset_request['user']
        user = superdesk.get_resource_service('users').find_one(req=None,
                                                                _id=user_id)
        if not user.get('is_active'):
            logger.warning('Try to set password for an inactive user')
            raise superdesk.SuperdeskError(status_code=403, message='Created')

        superdesk.get_resource_service('users').update_password(
            user_id, password)
        self.remove_all_tokens_for_email(reset_request['email'])
        self.remove_private_data(doc)
        return [reset_request['_id']]
    def find_one(self, req=None, **lookup):
        try:
            task_id = lookup["task_id"]
            task = AsyncResult(task_id)

            if task.state in ('PROGRESS', states.SUCCESS, states.FAILURE) and task.result:
                doc = task.result
            else:
                doc = {}

            doc['state'] = task.state
            doc['task_id'] = task_id
            doc['_id'] = task_id
            doc['_created'] = doc['_updated'] = utcnow()

            return doc
        except Exception:
            msg = 'No progress information is available for task_id: %s' % task_id
            raise superdesk.SuperdeskError(payload=msg)
Exemple #17
0
    def get(self, req, **lookup):
        content_view_id = lookup['lookup']['content_view_id']
        view_items = superdesk.apps['content_view'].find_one(
            req=None, _id=content_view_id)
        if not view_items:
            raise superdesk.SuperdeskError(payload='Invalid content view id.')
        additional_query = view_items.get('filter')

        query = None
        if req.args.get('source'):
            query = json.loads(req.args.get('source'))

        query = apply_additional_query(query, additional_query)
        parsed_request = init_parsed_request(query)
        location = view_items.get('location', 'archive')
        docs = superdesk.apps[location].get(req=parsed_request, lookup={})

        for doc in docs:
            build_custom_hateoas(self.custom_hateoas, doc, location=location)
        return docs
    def create(self, docs, **kwargs):
        for doc in docs:
            username = doc['username']
            try:
                get_resource_service('auth').authenticate({
                    'username':
                    username,
                    'password':
                    doc['old_password']
                })
            except Exception:
                payload = 'The provided old password is not correct.'
                raise superdesk.SuperdeskError(payload=payload)

            user = superdesk.get_resource_service('users').find_one(
                req=None, username=username)
            superdesk.get_resource_service('users').update_password(
                user['_id'], doc['new_password'])
            del doc['old_password']
            del doc['new_password']
            return [user['_id']]
Exemple #19
0
 def check_item_valid(self, item_id):
     item = superdesk.get_resource_service('archive').find_one(req=None,
                                                               _id=item_id)
     if not item:
         msg = 'Invalid content item ID provided: %s' % item_id
         raise superdesk.SuperdeskError(payload=msg)
Exemple #20
0
def get_user(required=False):
    user = flask.g.get('user', {})
    if '_id' not in user and required:
        raise superdesk.SuperdeskError(payload='Invalid user.')
    return user
Exemple #21
0
 def server_error_handler(error):
     """Log server errors."""
     app.sentry.captureException()
     logger.exception(error)
     return_error = superdesk.SuperdeskError(status_code=500)
     return client_error_handler(return_error)