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!')
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]
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]
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'))
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
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
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.')
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
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)
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']]
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)
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
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)