def get_stix_files_from_mongo(self, collection_name, start_time, end_time): # print '>>>get_stix_files_from_mongo:start_time:' + str(start_time) # print '>>>get_stix_files_from_mongo:end_time:' + str(end_time) # print '>>>get_stix_files_from_mongo:collection_name:' + str(collection_name) # TAXII Server 設定取得 ts = TaxiiServers.objects.get(collection_name=collection_name) # 条件絞り込み QQ = Q(information_source__in=ts.information_sources) # for is_ in ts.information_sources: # print '>>>get_stix_files_from_mongo:information_sources:' + str(is_.name) # print '>>>get_stix_files_from_mongo:information_sources:' + str(is_.id) if start_time is not None and end_time is not None: QQ = QQ & Q(produced__gt=start_time) QQ = QQ & Q(produced__lt=end_time) elif start_time is None and end_time is not None: QQ = QQ & Q(produced__lt=end_time) elif start_time is not None and end_time is None: QQ = QQ & Q(produced__gt=start_time) # print '>>>get_stix_files_from_mongo:count:' + str(StixFiles.objects(QQ).count()) return StixFiles.objects(QQ)
def feeds(request): try: #GET 以外はエラー if request.method != 'GET': return HttpResponseNotAllowed(['GET']) #引数取得 start_time = get_feeds_start_time(request) last_feed = get_feeds_last_feed(request) range_big_datetime = get_feeds_range_big_datetime( request) #期間範囲指定の大きい方(新しい方)。この時間を含む range_small_datetime = get_feeds_range_small_datetime( request) #期間範囲指定の小さい方(古い方)。この時間を含む user_id = get_feeds_user_id(request) instance = get_feeds_instance(request) content = get_feeds_content(request) #index は 0 開始 index = get_feeds_index(request) size = get_feeds_size(request) #指定なし時は size = -1 #返却条件は SNS に返却 かつ version 2.0 / 2.1 以外 QQ = Q(is_post_sns__ne=False) & Q(version__ne='2.0') & Q( version__ne='2.1') if last_feed is not None: #last_feed の指定があった場合 (last_feed より新しい投稿を返却) QQ &= Q(produced__gt=last_feed) else: #last_feed の指定がない場合 (start_timeを最新として古い投稿を返却) QQ &= Q(produced__lt=start_time) #range_big_datetime 指定あり #最大より古く(<=) if range_big_datetime is not None: QQ &= Q(produced__lte=range_big_datetime) #range_small_datetime 指定あり #最小より新しい(>=) if range_small_datetime is not None: QQ &= Q(produced__gte=range_small_datetime) #user_id が指定の場合はその user_id の投稿のみを抽出 from ctirs.models.rs.models import STIPUser if user_id is not None: stip_user = STIPUser.objects.get(id=user_id) QQ &= ( #SNS 産 STIX なら instance 名とユーザ名が一致した (Q(is_created_by_sns=True) & Q(sns_user_name=stip_user.username) & Q(sns_instance=instance)) | #SNS 産以外の STIX なら ユーザ名が一致した (Q(is_created_by_sns__ne=True) & Q(sns_user_name=stip_user.username))) else: #未定の場合は存在している STIP_USER だけ有効 stip_users = STIPUser.objects.only('id') stip_user_list = [] for stip_user in stip_users: stip_user_list.append(stip_user.id) stip_users_vias = Vias.objects.filter(uploader__in=stip_user_list) QQ & Q(via__in=stip_users_vias) #count = 0 l = [] stix_files = StixFiles.objects(QQ).order_by('-produced').skip( index).timeout(False) #サイズ指定がある場合は limit 設定 if size != -1: stix_files = stix_files.limit(size) #指定された数値分 StixFiles から取得する(produced順にソートする かつ is_post_sns が False以外 かつ version が 2.0 以外) #for stix_file in StixFiles.objects(QQ).order_by('-produced').all().timeout(False): for stix_file in stix_files: l.append( get_return_dictionary_from_stix_file_document(stix_file, content=content)) r = {} r['feeds'] = l return JsonResponse(r, safe=False) except Exception as e: import traceback traceback.print_exc() return error(e)
def query(request): try: # GET 以外はエラー if request.method != 'GET': return HttpResponseNotAllowed(['GET']) # 引数取得 size = get_feeds_size(request) # 指定なし時は size = -1 query_string = get_query_query_string(request) # query_string 未指定時は空リスト返却 if query_string is None: r = {} r['feeds'] = [] return JsonResponse(r, safe=False) # 返却条件は SNS に返却 かつ version 2.0 以外 QQ = Q(is_post_sns__ne=False) & Q(version__ne='2.0') # 空白スペース区切りで分割 query_strings = query_string.split(' ') # 空白スペース区切りで検索文字列が指定されていない場合(検索対象: 投稿/タイトル/ユーザ名/スクリーン名)(大文字小文字区別せず) if len(query_strings) == 1: QQ &= (Q(package_name__icontains=query_strings[0]) | Q(post__icontains=query_strings[0]) | Q(sns_user_name__icontains=query_strings[0]) | Q(sns_screen_name__icontains=query_strings[0])) else: f_flag = True for q in query_strings: if f_flag: # 空白スペース区切りの場合(検索対象: 投稿/タイトル/ユーザ名/スクリーン名)(大文字小文字区別せず) query = Q(package_name__icontains=q) | Q( post__icontains=q) | Q(sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) f_flag = False else: query &= Q(package_name__icontains=q) | Q( post__icontains=q) | Q(sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) QQ &= (query) stix_files = set([]) # Query for stix_file in StixFiles.objects(QQ).order_by('-produced').timeout( False): stix_files.add(stix_file) # ObservableCache から query_string を含む StixFile の set を作成 for observable_cache in ObservableCaches.objects.filter( Q(value__icontains=query_string)): stix_file = StixFiles.objects.get( package_id=observable_cache.package_id) stix_files.add(stix_file) # 時間でソートする stix_files = sorted(list(stix_files), key=lambda s: s.produced, reverse=True) # サイズ指定がある場合は上位から指定sizeを取得 if size != -1: stix_files = stix_files[:size] # 返却データ作成 feeds_list = [] for stix_file in stix_files: feeds_list.append( get_return_dictionary_from_stix_file_document(stix_file, content=content)) r = {} r['feeds'] = feeds_list return JsonResponse(r, safe=False) except Exception as e: import traceback traceback.print_exc() return error(e)
def feeds(request): try: # GET 以外はエラー if request.method != 'GET': return HttpResponseNotAllowed(['GET']) # 引数取得 start_time = get_feeds_start_time(request) last_feed = get_feeds_last_feed(request) range_big_datetime = get_feeds_range_big_datetime( request) # 期間範囲指定の大きい方(新しい方)。この時間を含む range_small_datetime = get_feeds_range_small_datetime( request) # 期間範囲指定の小さい方(古い方)。この時間を含む user_id = get_feeds_user_id(request) instance = get_feeds_instance(request) content = get_feeds_content(request) query_string = request.GET.get(key='query_string', default=None) # index は 0 開始 index = get_feeds_index(request) size = get_feeds_size(request) # 指定なし時は size = -1 # 返却条件は SNS に返却 QQ = Q(is_post_sns__ne=False) if last_feed is not None: # last_feed の指定があった場合 (last_feed より新しい投稿を返却) QQ &= Q(produced__gt=last_feed) else: # last_feed の指定がない場合 (start_timeを最新として古い投稿を返却) QQ &= Q(produced__lte=start_time) # range_big_datetime 指定あり # 最大より古く(<=) if range_big_datetime is not None: QQ &= Q(produced__lte=range_big_datetime) # range_small_datetime 指定あり # 最小より新しい(>=) if range_small_datetime is not None: QQ &= Q(produced__gte=range_small_datetime) # package_name か post に query_string が含まれているか (大文字小文字区別せず) if query_string is not None: # 空白スペース区切りで分割 query_strings = query_string.split(' ') # 空白スペース区切りで検索文字列が指定されていない場合(検索対象: 投稿/タイトル/ユーザ名/スクリーン名) if len(query_strings) == 1: QQ &= (Q(package_name__icontains=query_strings[0]) | Q(post__icontains=query_strings[0]) | Q(sns_user_name__icontains=query_strings[0]) | Q(sns_screen_name__icontains=query_strings[0])) else: f_flag = True for q in query_strings: if f_flag: # 空白スペース区切りの場合(検索対象: 投稿/タイトル/ユーザ名/スクリーン名) query = Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) f_flag = False else: query &= Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) QQ &= (query) # user_id が指定の場合はその user_id の投稿のみを抽出 from ctirs.models.rs.models import STIPUser if user_id is not None: stip_user = STIPUser.objects.get(id=user_id) QQ &= ( # SNS 産 STIX なら instance 名とユーザ名が一致した (Q(is_created_by_sns=True) & Q(sns_user_name=stip_user.username) & Q(sns_instance=instance)) | # SNS 産以外の STIX なら ユーザ名が一致した (Q(is_created_by_sns__ne=True) & Q(sns_user_name=stip_user.username))) else: # 未定の場合は存在している STIP_USER だけ有効 stip_users = STIPUser.objects.only('id') stip_user_list = [] for stip_user in stip_users: stip_user_list.append(stip_user.id) stip_users_vias = Vias.objects.filter(uploader__in=stip_user_list) QQ & Q(via__in=stip_users_vias) # count = 0 feeds_list = [] stix_files = StixFiles.objects(QQ).order_by('-produced').skip( index).timeout(False) # サイズ指定がある場合は limit 設定 if size != -1: stix_files = stix_files.limit(size) # 指定された数値分 StixFiles から取得する(produced順にソートする かつ is_post_sns が False以外 かつ version が 2.0 以外) # for stix_file in StixFiles.objects(QQ).order_by('-produced').all().timeout(False): for stix_file in stix_files: feeds_list.append( get_return_dictionary_from_stix_file_document(stix_file, content=content)) r = {} r['feeds'] = feeds_list return JsonResponse(r, safe=False) except Exception as e: import traceback traceback.print_exc() return error(e)
def query(request): try: if request.method != 'GET': return HttpResponseNotAllowed(['GET']) size = get_feeds_size(request) query_string = get_query_query_string(request) if query_string is None: r = {} r['feeds'] = [] return JsonResponse(r, safe=False) QQ = Q(is_post_sns__ne=False) & Q(version__ne='2.0') query_strings = re.split('[ ]', query_string) if len(query_strings) == 1: if check_symbols(query_strings[0]) and tag.is_tag( query_strings[0]): QQ &= Q(sns_lower_tags__in=[query_strings[0].lower()]) else: QQ &= Q(package_name__icontains=query_strings[0]) | Q( post__icontains=query_strings[0]) | Q( sns_user_name__icontains=query_strings[0]) | Q( sns_screen_name__icontains=query_strings[0]) else: f_flag = True for q in query_strings: if f_flag: if check_symbols(q) and tag.is_tag(q): query = Q(sns_lower_tags__in=[q.lower()]) else: query = Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) f_flag = False else: if check_symbols(q) and tag.is_tag(q): query &= Q(sns_lower_tags__in=[q.lower()]) else: query &= Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) QQ &= query stix_files = set([]) for stix_file in StixFiles.objects(QQ).order_by('-produced').timeout( False): stix_files.add(stix_file) for observable_cache in ObservableCaches.objects.filter( Q(value__icontains=query_string)): stix_file = StixFiles.objects.get( package_id=observable_cache.package_id) stix_files.add(stix_file) stix_files = sorted(list(stix_files), key=lambda s: s.produced, reverse=True) if size != -1: stix_files = stix_files[:size] feeds_list = [] for stix_file in stix_files: feeds_list.append( get_return_dictionary_from_stix_file_document(stix_file, content=content)) r = {} r['feeds'] = feeds_list return JsonResponse(r, safe=False) except Exception as e: import traceback traceback.print_exc() return error(e)
def feeds(request): try: if request.method != 'GET': return HttpResponseNotAllowed(['GET']) start_time = get_feeds_start_time(request) last_feed = get_feeds_last_feed(request) range_big_datetime = get_feeds_range_big_datetime(request) range_small_datetime = get_feeds_range_small_datetime(request) user_id = get_feeds_user_id(request) instance = get_feeds_instance(request) content = get_feeds_content(request) query_string = request.GET.get(key='query_string', default=None) index = get_feeds_index(request) size = get_feeds_size(request) QQ = Q(is_post_sns__ne=False) if last_feed is not None: QQ &= Q(produced__gt=last_feed) else: QQ &= Q(produced__lte=start_time) if range_big_datetime is not None: QQ &= Q(produced__lte=range_big_datetime) if range_small_datetime is not None: QQ &= Q(produced__gte=range_small_datetime) if query_string is not None: query_strings = re.split('[ ]', query_string) if len(query_strings) == 1: if check_symbols(query_strings[0]) and tag.is_tag( query_strings[0]): QQ &= Q(sns_lower_tags__in=[query_strings[0].lower()]) else: QQ &= Q(package_name__icontains=query_strings[0]) | Q( post__icontains=query_strings[0]) | Q( sns_user_name__icontains=query_strings[0]) | Q( sns_screen_name__icontains=query_strings[0]) else: f_flag = True for q in query_strings: if f_flag: if check_symbols(q) and tag.is_tag(q): query = Q(sns_lower_tags__in=[q.lower()]) else: query = Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) f_flag = False else: if check_symbols(q) and tag.is_tag(q): query &= Q(sns_lower_tags__in=[q.lower()]) else: query &= Q(package_name__icontains=q) | Q( post__icontains=q) | Q( sns_user_name__icontains=q) | Q( sns_screen_name__icontains=q) QQ &= query from ctirs.models.rs.models import STIPUser if user_id is not None: stip_user = STIPUser.objects.get(id=user_id) QQ &= ((Q(is_created_by_sns=True) & Q(sns_user_name=stip_user.username) & Q(sns_instance=instance)) | (Q(is_created_by_sns__ne=True) & Q(sns_user_name=stip_user.username))) else: stip_users = STIPUser.objects.only('id') stip_user_list = [] for stip_user in stip_users: stip_user_list.append(stip_user.id) stip_users_vias = Vias.objects.filter(uploader__in=stip_user_list) QQ & Q(via__in=stip_users_vias) feeds_list = [] stix_files = StixFiles.objects(QQ).order_by('-produced').skip( index).timeout(False) if size != -1: stix_files = stix_files.limit(size) for stix_file in stix_files: feeds_list.append( get_return_dictionary_from_stix_file_document(stix_file, content=content)) r = {} r['feeds'] = feeds_list return JsonResponse(r, safe=False) except Exception as e: import traceback traceback.print_exc() return error(e)