3232from app .blueprints .rest .endpoints import endpoint_deprecated
3333from app .blueprints .iris_user import iris_current_user
3434from app .datamgmt .case .case_assets_db import get_asset_by_name
35+ from app .datamgmt .case .case_assets_db import get_assets_by_case
3536from app .datamgmt .case .case_events_db import add_comment_to_event
37+ from app .datamgmt .case .case_events_db import get_events_by_case
3638from app .datamgmt .case .case_events_db import get_category_by_name
3739from app .datamgmt .case .case_events_db import get_default_category
3840from app .datamgmt .case .case_events_db import delete_event_comment
@@ -178,19 +180,8 @@ def case_get_timeline_state(caseid):
178180@ac_requires_case_identifier (CaseAccessLevel .read_only , CaseAccessLevel .full_access )
179181@ac_api_requires ()
180182def case_getgraph_assets (caseid ):
181- assets_cache = CaseAssets .query .with_entities (
182- CaseEventsAssets .event_id ,
183- CaseAssets .asset_name
184- ).filter (
185- CaseEventsAssets .case_id == caseid ,
186- ).join (CaseEventsAssets .asset ).all ()
187-
188- timeline = CasesEvent .query .filter (and_ (
189- CasesEvent .case_id == caseid ,
190- CasesEvent .event_in_summary
191- )).order_by (
192- CasesEvent .event_date
193- ).all ()
183+ assets_cache = get_assets_by_case (caseid )
184+ timeline = get_events_by_case (caseid )
194185
195186 tim = []
196187 for row in timeline :
@@ -216,12 +207,7 @@ def case_getgraph_assets(caseid):
216207@ac_requires_case_identifier (CaseAccessLevel .read_only , CaseAccessLevel .full_access )
217208@ac_api_requires ()
218209def case_getgraph (caseid ):
219- timeline = CasesEvent .query .filter (and_ (
220- CasesEvent .case_id == caseid ,
221- CasesEvent .event_in_summary
222- )).order_by (
223- CasesEvent .event_date
224- ).all ()
210+ timeline = get_events_by_case (caseid )
225211
226212 tim = []
227213 for row in timeline :
@@ -359,6 +345,11 @@ def case_filter_timeline(caseid):
359345 assets = filter_d .get ('asset' )
360346 assets_id = filter_d .get ('asset_id' )
361347 event_ids = filter_d .get ('event_id' )
348+ if event_ids :
349+ try :
350+ event_ids = [int (event_id ) for event_id in event_ids ]
351+ except Exception as _ :
352+ return response_error ('Invalid event id' )
362353 iocs = filter_d .get ('ioc' )
363354 iocs_id = filter_d .get ('ioc_id' )
364355 tags = filter_d .get ('tag' )
@@ -371,6 +362,46 @@ def case_filter_timeline(caseid):
371362 sources = filter_d .get ('source' )
372363 flag = filter_d .get ('flag' )
373364
365+ cache , events_list , tim = _extract_timeline (assets , assets_id , caseid , categories , descriptions , end_date , event_ids ,
366+ flag , iocs , iocs_id , raws , sources , start_date , tags , titles )
367+
368+ if request .cookies .get ('session' ):
369+
370+ iocs = Ioc .query .with_entities (
371+ Ioc .ioc_id ,
372+ Ioc .ioc_value ,
373+ Ioc .ioc_description ,
374+ ).filter (
375+ Ioc .case_id == caseid
376+ ).all ()
377+
378+ events_comments_map = {}
379+ events_comments_set = get_case_events_comments_count (events_list )
380+ for k , v in events_comments_set :
381+ events_comments_map .setdefault (k , []).append (v )
382+
383+ resp = {
384+ "tim" : tim ,
385+ "comments_map" : events_comments_map ,
386+ "assets" : cache ,
387+ "iocs" : [ioc ._asdict () for ioc in iocs ],
388+ "categories" : [cat .name for cat in get_events_categories ()],
389+ "state" : get_timeline_state (caseid = caseid )
390+ }
391+
392+ else :
393+ resp = {
394+ "timeline" : tim ,
395+ "state" : get_timeline_state (caseid = caseid )
396+ }
397+
398+ return response_success ("ok" , data = resp )
399+
400+
401+ def _extract_timeline (assets : str | None , assets_id : str | None , caseid , categories : str | None ,
402+ descriptions : str | None , end_date : str | None , event_ids : list [int ] | None ,
403+ flag : str | None , iocs : str | None , iocs_id : str | None , raws : str | None , sources : str | None ,
404+ start_date : str | None , tags : str | None , titles : str | None ):
374405 condition = (CasesEvent .case_id == caseid )
375406
376407 if assets :
@@ -437,11 +468,6 @@ def case_filter_timeline(caseid):
437468 EventCategory .name == category )
438469
439470 if event_ids :
440- try :
441- event_ids = [int (event_id ) for event_id in event_ids ]
442- except Exception as _ :
443- return response_error ('Invalid event id' )
444-
445471 condition = and_ (condition ,
446472 CasesEvent .event_id .in_ (event_ids ))
447473
@@ -491,7 +517,7 @@ def case_filter_timeline(caseid):
491517 ).filter (
492518 assets_cache_condition
493519 ).join (CaseEventsAssets .asset )
494- .join (CaseAssets .asset_type ).all ())
520+ .join (CaseAssets .asset_type ).all ())
495521
496522 iocs_cache_condition = and_ (
497523 CaseEventsIoc .case_id == caseid
@@ -521,8 +547,7 @@ def case_filter_timeline(caseid):
521547 if asset .asset_id not in cache :
522548 cache [asset .asset_id ] = [asset .asset_name , asset .type ]
523549
524- if (assets and asset .asset_name .lower () in assets ) \
525- or (assets_id and asset .asset_id in assets_id ):
550+ if (assets and asset .asset_name .lower () in assets ) or (assets_id and asset .asset_id in assets_id ):
526551 if asset .event_id in assets_map :
527552 assets_map [asset .event_id ] += 1
528553 else :
@@ -549,10 +574,10 @@ def case_filter_timeline(caseid):
549574 events_list = []
550575 for row in timeline :
551576 if (assets is not None or assets_id is not None ) and row .event_id not in assets_filter :
552- continue
577+ continue
553578
554579 if iocs is not None and row .event_id not in iocs_filter :
555- continue
580+ continue
556581
557582 ras = row ._asdict ()
558583
@@ -594,38 +619,7 @@ def case_filter_timeline(caseid):
594619 ras ['iocs' ] = alki
595620
596621 tim .append (ras )
597-
598- if request .cookies .get ('session' ):
599-
600- iocs = Ioc .query .with_entities (
601- Ioc .ioc_id ,
602- Ioc .ioc_value ,
603- Ioc .ioc_description ,
604- ).filter (
605- Ioc .case_id == caseid
606- ).all ()
607-
608- events_comments_map = {}
609- events_comments_set = get_case_events_comments_count (events_list )
610- for k , v in events_comments_set :
611- events_comments_map .setdefault (k , []).append (v )
612-
613- resp = {
614- "tim" : tim ,
615- "comments_map" : events_comments_map ,
616- "assets" : cache ,
617- "iocs" : [ioc ._asdict () for ioc in iocs ],
618- "categories" : [cat .name for cat in get_events_categories ()],
619- "state" : get_timeline_state (caseid = caseid )
620- }
621-
622- else :
623- resp = {
624- "timeline" : tim ,
625- "state" : get_timeline_state (caseid = caseid )
626- }
627-
628- return response_success ("ok" , data = resp )
622+ return cache , events_list , tim
629623
630624
631625@case_timeline_rest_blueprint .route ('/case/timeline/events/delete/<int:cur_id>' , methods = ['POST' ])
0 commit comments