def timelines(sketch_id): """Generates the sketch explore view template. Returns: Template with context. """ sketch = Sketch.query.get_with_acl(sketch_id) searchindices_in_sketch = [t.searchindex.id for t in sketch.timelines] indices = SearchIndex.all_with_acl( current_user).order_by( desc(SearchIndex.created_at)).filter( not_(SearchIndex.id.in_(searchindices_in_sketch))) # Setup the form form = AddTimelineForm() form.timelines.choices = set((i.id, i.name) for i in indices.all()) # Create new timeline form POST if form.validate_on_submit(): if not sketch.has_permission(current_user, u'write'): abort(HTTP_STATUS_CODE_FORBIDDEN) for searchindex_id in form.timelines.data: searchindex = SearchIndex.query.get_with_acl(searchindex_id) if searchindex not in [t.searchindex for t in sketch.timelines]: _timeline = Timeline( name=searchindex.name, description=searchindex.description, sketch=sketch, user=current_user, searchindex=searchindex) db_session.add(_timeline) sketch.timelines.append(_timeline) db_session.commit() return redirect(url_for(u'sketch_views.timelines', sketch_id=sketch.id)) return render_template( u'sketch/timelines.html', sketch=sketch, timelines=indices.all(), form=form)
def timelines(sketch_id): """Generates the sketch explore view template. Returns: Template with context. """ sketch = Sketch.query.get_with_acl(sketch_id) searchindices_in_sketch = [t.searchindex.id for t in sketch.timelines] indices = SearchIndex.all_with_acl(current_user).order_by( desc(SearchIndex.created_at)).filter( not_(SearchIndex.id.in_(searchindices_in_sketch))) upload_enabled = current_app.config[u'UPLOAD_ENABLED'] graphs_enabled = current_app.config[u'GRAPH_BACKEND_ENABLED'] try: plaso_version = current_app.config[u'PLASO_VERSION'] except KeyError: plaso_version = u'Unknown' # Setup the form form = AddTimelineForm() form.timelines.choices = set((i.id, i.name) for i in indices.all()) # Create new timeline form POST if form.validate_on_submit(): if not sketch.has_permission(current_user, u'write'): abort(HTTP_STATUS_CODE_FORBIDDEN) for searchindex_id in form.timelines.data: searchindex = SearchIndex.query.get_with_acl(searchindex_id) if searchindex not in [t.searchindex for t in sketch.timelines]: _timeline = Timeline(name=searchindex.name, description=searchindex.description, sketch=sketch, user=current_user, searchindex=searchindex) db_session.add(_timeline) sketch.timelines.append(_timeline) db_session.commit() # If enabled, run sketch analyzers when timeline is added. # Import here to avoid circular imports. from timesketch.lib import tasks sketch_analyzer_group = tasks.build_sketch_analysis_pipeline( sketch_id) if sketch_analyzer_group: pipeline = (tasks.run_sketch_init.s( [searchindex.index_name]) | sketch_analyzer_group) pipeline.apply_async(task_id=searchindex.index_name) return redirect(url_for(u'sketch_views.timelines', sketch_id=sketch.id)) return render_template(u'sketch/timelines.html', sketch=sketch, timelines=indices.all(), form=form, upload_enabled=upload_enabled, plaso_version=plaso_version, graphs_enabled=graphs_enabled)
def timelines(sketch_id): """Generates the sketch explore view template. Returns: Template with context. """ TIMELINES_TO_SHOW = 20 sketch = Sketch.query.get_with_acl(sketch_id) searchindices_in_sketch = [t.searchindex.id for t in sketch.timelines] query = request.args.get(u'q', None) indices = SearchIndex.all_with_acl( current_user).order_by( desc(SearchIndex.created_at)).filter( not_(SearchIndex.id.in_(searchindices_in_sketch))) filtered = False if query: indices = indices.filter(SearchIndex.name.contains(query)).limit(500) filtered = True if not filtered: indices = indices.limit(TIMELINES_TO_SHOW) # Setup the form form = AddTimelineForm() form.timelines.choices = set((i.id, i.name) for i in indices.all()) # Create new timeline form POST if form.validate_on_submit(): if not sketch.has_permission(current_user, u'write'): abort(HTTP_STATUS_CODE_FORBIDDEN) for searchindex_id in form.timelines.data: searchindex = SearchIndex.query.get_with_acl(searchindex_id) if searchindex not in [t.searchindex for t in sketch.timelines]: _timeline = Timeline( name=searchindex.name, description=searchindex.description, sketch=sketch, user=current_user, searchindex=searchindex) db_session.add(_timeline) sketch.timelines.append(_timeline) db_session.commit() return redirect(url_for(u'sketch_views.timelines', sketch_id=sketch.id)) return render_template( u'sketch/timelines.html', sketch=sketch, timelines=indices.all(), form=form, filtered=filtered)
def post(self, sketch_id): """Handles POST request to the resource. Returns: A sketch in JSON (instance of flask.wrappers.Response) Raises: ApiHTTPError """ sketch = Sketch.query.get_with_acl(sketch_id) searchindices_in_sketch = [t.searchindex.id for t in sketch.timelines] indices = SearchIndex.all_with_acl( current_user).order_by( desc(SearchIndex.created_at)).filter( not_(SearchIndex.id.in_(searchindices_in_sketch))) add_timeline_form = AddTimelineForm.build(request) add_timeline_form.timelines.choices = set( (i.id, i.name) for i in indices.all()) if add_timeline_form.validate_on_submit(): if not sketch.has_permission(current_user, u'write'): abort(HTTP_STATUS_CODE_FORBIDDEN) for searchindex_id in add_timeline_form.timelines.data: searchindex = SearchIndex.query.get_with_acl(searchindex_id) if searchindex not in [t.searchindex for t in sketch.timelines]: _timeline = Timeline( name=searchindex.name, description=searchindex.description, sketch=sketch, user=current_user, searchindex=searchindex) db_session.add(_timeline) sketch.timelines.append(_timeline) db_session.commit() return self.to_json(sketch, status_code=HTTP_STATUS_CODE_CREATED) else: raise ApiHTTPError( message=add_timeline_form.errors, status_code=HTTP_STATUS_CODE_BAD_REQUEST)
def timelines(sketch_id): """Generates the sketch explore view template. Returns: Template with context. """ sketch = Sketch.query.get_with_acl(sketch_id) searchindices_in_sketch = [t.searchindex.id for t in sketch.timelines] indices = SearchIndex.all_with_acl(current_user).order_by( desc(SearchIndex.created_at)).filter( not_(SearchIndex.id.in_(searchindices_in_sketch))) upload_enabled = current_app.config['UPLOAD_ENABLED'] graphs_enabled = current_app.config['GRAPH_BACKEND_ENABLED'] try: plaso_version = current_app.config['PLASO_VERSION'] except KeyError: plaso_version = 'Unknown' # Setup the form form = AddTimelineForm() form.timelines.choices = set((i.id, i.name) for i in indices.all()) # Create new timeline form POST if form.validate_on_submit(): if not sketch.has_permission(current_user, 'write'): abort(HTTP_STATUS_CODE_FORBIDDEN) for searchindex_id in form.timelines.data: searchindex = SearchIndex.query.get_with_acl(searchindex_id) if searchindex not in [t.searchindex for t in sketch.timelines]: _timeline = Timeline( name=searchindex.name, description=searchindex.description, sketch=sketch, user=current_user, searchindex=searchindex) db_session.add(_timeline) sketch.timelines.append(_timeline) db_session.commit() # If enabled, run sketch analyzers when timeline is added. # Import here to avoid circular imports. from timesketch.lib import tasks sketch_analyzer_group = tasks.build_sketch_analysis_pipeline( sketch_id) if sketch_analyzer_group: pipeline = (tasks.run_sketch_init.s( [searchindex.index_name]) | sketch_analyzer_group) pipeline.apply_async(task_id=searchindex.index_name) return redirect( url_for('sketch_views.timelines', sketch_id=sketch.id)) return render_template( 'sketch/timelines.html', sketch=sketch, timelines=indices.all(), form=form, upload_enabled=upload_enabled, plaso_version=plaso_version, graphs_enabled=graphs_enabled)