Пример #1
0
    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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)