Esempio n. 1
0
def get_language_contents(request, object_ref):
    try:
        #表示する長さ
        object_modified = request.GET['object_modified']
        objects = StixLanguageContents.objects.filter(
            Q(object_ref=object_ref)
            & Q(object_modified=object_modified)).order_by('-modified')
        language_contents = []
        for o_ in objects:
            language_contents.append(o_.object_)
        resp = get_normal_response_json()
        resp['data'] = language_contents
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 2
0
def attaches(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        package_id = get_attaches_package_id(request)
        if package_id is None:
            return HttpResponseNotFound()
        try:
            stix_file = StixFiles.objects.get(package_id=package_id)
            d = get_return_dictionary_from_stix_file_document(stix_file)
            return JsonResponse(d, safe=False)
        except DoesNotExist:
            return HttpResponseNotFound()
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 3
0
def language_contents(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        object_ref = request.GET['object_ref']
        object_modified = request.GET['object_modified']
        objects = StixLanguageContents.objects.filter(
            Q(object_ref=object_ref)
            & Q(object_modified=object_modified)).order_by('-modified')
        language_contents = []
        for o_ in objects:
            language_contents.append(o_.object_)
        resp = get_normal_response_json()
        resp['data'] = language_contents
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 4
0
def content(request):
    try:
        #GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        #引数取得
        package_id = get_content_original_package_id(request)
        if package_id is None:
            print '/api/v1/sns/content package_id is None.'
            return HttpResponseNotFound()
        stix_file = StixFiles.objects.get(package_id=package_id)
        return JsonResponse(get_return_dictionary_from_stix_file_document(
            stix_file, content=True),
                            safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 5
0
def related_packages(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        original_package_id = get_comments_original_package_id(request)
        if original_package_id is None:
            return HttpResponseNotFound()
        related_packages_list = []
        for stix_file in StixFiles.objects(
                related_packages=original_package_id):
            related_packages_list.append(
                get_return_dictionary_from_stix_file_document(stix_file))
        return JsonResponse(related_packages_list, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 6
0
def tags(request):
    try:
        suggest_list = []
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        word = request.GET.get('word')
        if not word or len(word) < SUGGEST_MIN_LENGTH:
            return JsonResponse(suggest_list, safe=False)
        if word[0] != '#':
            return JsonResponse(suggest_list, safe=False)
        tags = Tags.objects.filter(
            tag__istartswith=word).order_by('tag').limit(SUGGEST_LIMIT)
        for tag in tags:
            suggest_list.append(tag.tag)
        return JsonResponse(suggest_list, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 7
0
def latest_package_list(request):
    DEFAULT_LATEST_NUM = 10
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        try:
            num = int(request.GET['num'])
        except BaseException:
            num = DEFAULT_LATEST_NUM

        resp = get_normal_response_json()
        resp['data'] = []
        for stix_file in StixFiles.objects.order_by('-produced')[:num]:
            resp['data'].append(stix_file.get_rest_api_document_info())
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 8
0
def related_packages(request):
    try:
        #GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        #引数取得
        original_package_id = get_comments_original_package_id(request)
        if original_package_id is None:
            print '/api/v1/sns/related_packages package_id is None.'
            return HttpResponseNotFound()
        l = []
        #original_package_id を related_packages リスト要素に含む stix_fileを返却
        for stix_file in StixFiles.objects(
                related_packages=original_package_id):
            l.append(get_return_dictionary_from_stix_file_document(stix_file))
        return JsonResponse(l, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 9
0
def stix_file_l1_info(request, package_id):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        caches = ObservableCaches.objects.filter(package_id=package_id)
        data = []
        for cache in caches:
            r = {
                'type': cache.type,
                'value': cache.value,
                'observable_id': cache.observable_id,
            }
            data.append(r)
        resp = get_normal_response_json()
        resp['data'] = data
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 10
0
def likers(request):
    try:
        #GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        #引数取得
        original_package_id = get_comments_original_package_id(request)
        if original_package_id is None:
            print '/api/v1/sns/likers package_id is None.'
            return HttpResponseNotFound()
        liker_dict = {}
        #original_package_id を related_packages リスト要素に含む stix_fileを返却
        for stix_file in StixFiles.objects(
                Q(related_packages=original_package_id)
                & Q(sns_type=StixFiles.STIP_SNS_TYPE_LIKE)):
            liker = stix_file.get_unique_name()
            if liker is not None:
                if liker_dict.has_key(liker):
                    liker_dict[liker] += 1
                else:
                    liker_dict[liker] = 1

        #original_package_id を related_packages リスト要素に含む stix_fileを返却
        for stix_file in StixFiles.objects(
                Q(related_packages=original_package_id)
                & Q(sns_type=StixFiles.STIP_SNS_TYPE_UNLIKE)):
            unliker = stix_file.get_unique_name()
            if unliker is not None:
                if liker_dict.has_key(unliker):
                    liker_dict[unliker] -= 1
                else:
                    liker_dict[unliker] = -1
        likers = []
        for liker, value in liker_dict.iteritems():
            if value == 1:
                likers.append(liker)
        return JsonResponse(likers, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 11
0
def content(request):
    try:
        # GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        # 引数取得
        package_id = get_content_original_package_id(request)
        version = get_content_version(request)

        if package_id is None:
            print('/api/v1/sns/content package_id is None.')
            return HttpResponseNotFound()

        stix_file = StixFiles.objects.get(package_id=package_id)
        doc = _get_stix_file_document(stix_file)
        if not version:
            return JsonResponse(doc, safe=False)
        if stix_file.version.startswith('1.'):
            if version.startswith('2.'):
                content = stix_file.get_elevate_21()
                doc['content'] = content
                doc['version'] = '2.1'
        elif stix_file.version == '2.0':
            if version == '2.1':
                content = stix_file.get_elevate_21()
                doc['content'] = content
                doc['version'] = '2.1'
            elif version.startswith('1.'):
                content = stix_file.get_slide_12()
                doc['content'] = content
                doc['version'] = '1.2'
        elif stix_file.version == '2.1':
            if version.startswith('1.'):
                content = stix_file.get_slide_12()
                doc['content'] = content
                doc['version'] = '1.2'
        return JsonResponse(doc, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 12
0
def share_misp(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        package_id = get_package_id_from_get_argument(request)
        mc = MispUploadAdapterControl()
        j = mc.upload_misp(package_id)
        event_id = j['Event']['id']
        misp_conf = MispAdapter.get()
        tmp_url = misp_conf.url
        if tmp_url[-1] != '/':
            tmp_url += '/'
        url = '%sevents/view/%s' % (tmp_url, event_id)
        r = {}
        r['url'] = url
        return JsonResponse(r, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 13
0
def latest_stix_count_by_community(request):
    LASTEST_DAYS_KEY = 'latest_days'
    DEFAULT_LATEST_DAYS = 7
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        try:
            latest_days = int(request.GET[LASTEST_DAYS_KEY])
        except BaseException:
            latest_days = DEFAULT_LATEST_DAYS
        resp = get_normal_response_json()
        resp['data'] = []
        for community in Communities.objects.all():
            count = count_by_community(community, latest_days)
            d = {'community': community.name, 'count': count}
            resp['data'].append(d)
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 14
0
def package_list(request):
    REQUIRED_COMMENT_KEY = 'required_comment'
    LIMIT_KEY = 'limit'
    ORDER_BY_KEY = 'order_by'
    DEFAULT_ORDER_BY = 'package_name'
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        required_comment = False
        if (REQUIRED_COMMENT_KEY in request.GET):
            if request.GET[REQUIRED_COMMENT_KEY].lower() == 'true':
                required_comment = True

        stix_files = StixFiles.objects.filter()
        if (ORDER_BY_KEY in request.GET):
            try:
                stix_files = stix_files.order_by(request.GET[ORDER_BY_KEY])
            except BaseException:
                stix_files = stix_files.order_by(DEFAULT_ORDER_BY)
        else:
            stix_files = stix_files.order_by(DEFAULT_ORDER_BY)

        try:
            limit = int(request.GET[LIMIT_KEY])
        except BaseException:
            limit = None
        if limit is not None:
            stix_files = stix_files[:limit]

        rsp_stix_files = []
        for stix_file in stix_files:
            rsp_stix_files.append(
                stix_file.get_rest_api_document_info(required_comment))
        resp = get_normal_response_json()
        resp['data'] = rsp_stix_files
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 15
0
def comments(request):
    try:
        # GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        # 引数取得
        original_package_id = get_comments_original_package_id(request)
        if original_package_id is None:
            print('/api/v1/sns/comments package_id is None.')
            return HttpResponseNotFound()
        comments_list = []
        # original_package_id を related_packages リスト要素に含み sns_type が comment の stix_fileを返却
        for stix_file in StixFiles.objects(
                Q(related_packages=original_package_id)
                & Q(sns_type=StixFiles.STIP_SNS_TYPE_COMMENT)):
            comments_list.append(
                get_return_dictionary_from_stix_file_document(stix_file))
        return JsonResponse(comments_list, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 16
0
def attaches(request):
    try:
        #GET 以外はエラー
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        #引数取得
        package_id = get_attaches_package_id(request)
        if package_id is None:
            print '/api/v1/sns/attaches package_id is None.'
            return HttpResponseNotFound()
        try:
            stix_file = StixFiles.objects.get(package_id=package_id)
            d = get_return_dictionary_from_stix_file_document(stix_file)
            return JsonResponse(d, safe=False)
        except DoesNotExist:
            #該当レコードがなかった
            print '/api/v1/sns/attaches DoesNotExist (%s)' % (str(package_id))
            return HttpResponseNotFound()
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 17
0
def package_name_list(request):
    LIMIT_KEY = 'limit'
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        stix_files = StixFiles.objects.filter(Q(is_post_sns__ne=False)).only(
            'package_name', 'package_id').order_by('package_name')
        try:
            limit = int(request.GET[LIMIT_KEY])
        except BaseException:
            limit = None
        if limit is not None:
            stix_files = stix_files[:limit]

        rsp_stix_files = []
        for stix_file in stix_files:
            rsp_stix_files.append(stix_file.get_rest_api_package_name_info())
        resp = get_normal_response_json()
        resp['data'] = rsp_stix_files
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 18
0
def search_bundle(request):
    SEARCH_KEY_OBJECT_ID = 'match[object_id]'
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        package_id_list = []
        if SEARCH_KEY_OBJECT_ID in request.GET.keys():
            object_id = request.GET[SEARCH_KEY_OBJECT_ID]
            doc = _get_document(object_id)
            package_id_list.append(doc.package_id)
        else:
            for doc in StixFiles.objects.filter(
                    version__startswith='2.').order_by('-modified'):
                if doc.package_id not in package_id_list:
                    package_id_list.append(doc.package_id)
        resp = get_normal_response_json()
        d = {}
        d['package_id_list'] = package_id_list
        resp['data'] = d
        return JsonResponse(resp, safe=False)
    except Exception as e:
        import traceback
        traceback.print_exc()
        return error(e)
Esempio n. 19
0
def package_list_for_sharing_table(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])
        #認証する
        user = authentication(request)
        if user is None:
            return error(Exception('You have no permission for this operation.'))
        #ajax parameter取得
        #表示する長さ
        iDisplayLength = int(request.GET['iDisplayLength'])
        #表示開始位置インデックス
        iDisplayStart = int(request.GET['iDisplayStart'])
        #検索文字列
        sSearch = request.GET['sSearch']
        #ソートする列
        sort_col = int(request.GET['iSortCol'])
        #ソート順番 (desc指定で降順)
        sort_dir = request.GET['sSortDir']

        order_query = None
        SORT_INDEX_PACKAGE_NAME = 3

        #pakcage_name
        if sort_col == SORT_INDEX_PACKAGE_NAME:
            order_query = 'package_name'

        #昇順/降順
        if order_query is not None:
            #descが降順
            if sort_dir == 'desc':
                order_query = '-' + order_query

        #検索対象のコミュニティリストを検索
        community_objects = Communities.objects.filter(name__icontains=sSearch)
        #検索
        objects = StixFiles.objects.filter(
            Q(package_name__icontains=sSearch) |
            Q(input_community__in=community_objects)) \
            .order_by(order_query)
        objects = objects.filter(Q(is_post_sns__ne=False))
        
        #検索結果から表示範囲のデータを抽出する
        data = []
        for d in objects[iDisplayStart:(iDisplayStart + iDisplayLength)]:
            r = {}
            r['comment'] = d.comment
            r['package_name'] = d.package_name
            r['package_id'] = d.package_id
            try:
                r['input_community'] = d.input_community.name
            except:
                r['input_community'] = ''
            data.append(r)
                
        #response data 作成
        r_data = {}
        r_data['iTotalRecords'] = StixFiles.objects.count()
        r_data['iTotalDisplayRecords'] = objects.count()
        r_data['data'] = data
        resp = get_normal_response_json()
        resp['data'] = r_data
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 20
0
def get_stix_file_document_info(request, id_):
    try:
        doc = StixFiles.objects.get(id=id_)
        return api_root.get_rest_api_document_info(doc)
    except Exception:
        return api_root.error(Exception('The specified id not found.'))
Esempio n. 21
0
def delete_stix_file_document_info(id_):
    try:
        api_root.delete_stix_document(id_=id_)
    except Exception as e:
        return api_root.error(e)
Esempio n. 22
0
def post_language_contents(request, object_ref, ctirs_auth_user):
    try:
        j = json.loads(request.body)
        # S-TIP Identity 作成する
        stip_identity = _get_stip_identname(request.user)
        # bundle 作成
        bundle = Bundle(stip_identity)
        # 参照元の obejct を取得
        object_ = get_object(object_ref)
        if object_ is None:
            return error(
                Exception('No document. (object_ref=%s)' % (object_ref)))

        for language_content in j['language_contents']:
            selector_str = language_content['selector']
            content_value = language_content['content']
            language = language_content['language']
            try:
                selector_elems = selector_str.split('.')
                last_elem = object_
                # selector の 要素をチェックする
                if len(selector_elems) == 1:
                    # selector が . でつながられていない場合
                    last_selector = selector_str
                    last_elem = is_exist_objects(selector_str, last_elem)
                else:
                    # selector が . でつながられている場合は最後までたどる
                    for selector in selector_elems[:-1]:
                        last_selector = selector
                        last_elem = is_exist_objects(selector, last_elem)
                        if last_elem is None:
                            raise Exception('selector is invalid: ' +
                                            str(selector_str))

                if isinstance(last_elem, list):
                    # 空要素で初期化し、該当 index の要素だけ上書きする
                    lc_lists = [''] * len(last_elem)
                    lc_lists[get_list_index_from_selector(
                        selector_elems[-1])] = content_value
                    content = lc_lists
                    selector = '.'.join(selector_elems[:-1])
                elif isinstance(last_elem, dict):
                    # 空辞書で初期化し、該当 index の要素だけ上書きする
                    content = {}
                    content[selector_elems[-1]] = content_value
                    selector = '.'.join(selector_elems[:-1])
                else:
                    # list ではない
                    content = content_value
                    selector = last_selector
            except Exception as e:
                traceback.print_exc()
                raise e

            contents = {}
            contents[language] = {selector: content}
            language_content = LanguageContent(
                created_by_ref=stip_identity,
                object_ref=object_ref,
                object_modified=object_['modified'],
                contents=contents)
            bundle.objects.append(language_content)

        # viaを取得
        via = Vias.get_via_rest_api_upload(uploader=ctirs_auth_user.id)
        community = Communities.get_default_community()
        # stixファイルを一時ファイルに出力
        stix_file_path = tempfile.mktemp(suffix='.json')
        with open(stix_file_path, 'wb+') as fp:
            fp.write(bundle.serialize(indent=4, ensure_ascii=False)).encode()
        # 登録処理
        regist(stix_file_path, community, via)
        resp = get_normal_response_json()
        bundle_json = json.loads(str(bundle))
        resp['data'] = {'bundle': bundle_json}
        return JsonResponse(resp, status=201, safe=False)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 23
0
 def wrap(request, *args, **kwargs):
     ctirs_auth_user = api_root.authentication(request)
     if ctirs_auth_user is None:
         return api_root.error(
             Exception('You have no permission for this operation.'))
     return f(request, *args, **kwargs)
Esempio n. 24
0
def get_stix_file_package_id_document_info(request, package_id):
    try:
        doc = StixFiles.objects.get(package_id=package_id)
        return api_root.get_rest_api_document_info(doc)
    except Exception as _:
        return api_root.error(Exception('The specified id not found.'))
Esempio n. 25
0
def delete_stix_file_package_id_document_info(package_id):
    try:
        api_root.delete_stix_document(package_id=package_id)
    except Exception as e:
        return api_root.error(e)
Esempio n. 26
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)
Esempio n. 27
0
def l1_info_for_l1table(request):
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        iDisplayLength = int(request.GET['iDisplayLength'])
        iDisplayStart = int(request.GET['iDisplayStart'])
        sSearch = request.GET['sSearch']
        sort_col = int(request.GET['iSortCol'])
        sort_dir = request.GET['sSortDir']
        try:
            aliases_str = request.GET['aliases']
            alias_lists = json.loads(aliases_str)
        except BaseException:
            alias_lists = []

        order_query = None

        SORT_INDEX_TYPE = 0
        SORT_INDEX_VALUE = 1
        SORT_INDEX_PACKAGE_NAME = 2
        SORT_INDEX_TILE = 3
        SORT_INDEX_DESCRIPTION = 4
        SORT_INDEX_TIMESTAMP = 5

        if sort_col == SORT_INDEX_TYPE:
            order_query = 'type'
        elif sort_col == SORT_INDEX_VALUE:
            order_query = 'value'
        elif sort_col == SORT_INDEX_PACKAGE_NAME:
            order_query = 'package_name'
        elif sort_col == SORT_INDEX_TILE:
            order_query = 'title'
        elif sort_col == SORT_INDEX_DESCRIPTION:
            order_query = 'description'
        elif sort_col == SORT_INDEX_TIMESTAMP:
            order_query = 'produced'

        if order_query is not None:
            if sort_dir == 'desc':
                order_query = '-' + order_query

        tmp_sSearches = list(set(sSearch.split(' ')))
        if '' in tmp_sSearches:
            tmp_sSearches.remove('')

        sSearches = []
        for item in tmp_sSearches:
            sSearches.append(item)
            for alias_list in alias_lists:
                if item in alias_list:
                    sSearches.extend(alias_list)

        sSearches = list(set(sSearches))

        filters = Q()
        for sSearch in sSearches:
            filters = filters | Q(type__icontains=sSearch)
            filters = filters | Q(value__icontains=sSearch)
            filters = filters | Q(package_name__icontains=sSearch)
            filters = filters | Q(title__icontains=sSearch)
            filters = filters | Q(description__icontains=sSearch)
        objects = ObservableCaches.objects.filter(filters).order_by(
            order_query)

        data = []
        for d in objects[iDisplayStart:(iDisplayStart + iDisplayLength)]:
            r = {}
            r['type'] = d.type
            r['value'] = d.value
            r['package_name'] = d.package_name
            r['package_id'] = d.stix_file.package_id
            r['title'] = d.title
            r['description'] = d.description
            r['created'] = str(d.created)
            r['stix_v2'] = d.stix_file.is_stix_v2()
            r['observable_id'] = d.observable_id
            data.append(r)

        r_data = {}
        r_data['iTotalRecords'] = ObservableCaches.objects.count()
        r_data['iTotalDisplayRecords'] = objects.count()
        r_data['data'] = data
        resp = get_normal_response_json()
        resp['data'] = r_data
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 28
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)
Esempio n. 29
0
def contents_and_edges(request):
    PACKAGE_ID_KEY = 'package_id'
    COMPARED_PACKAGE_IDS_KEY = 'compared_package_ids'
    EXACT_KEY = 'exact'
    SIMILAR_IPV4_KEY = 'similar_ipv4'
    SIMILAR_DOMAIN_KEY = 'similar_domain'
    try:
        if request.method != 'GET':
            return HttpResponseNotAllowed(['GET'])

        package_id = request.GET[PACKAGE_ID_KEY]
        compared_package_ids = request.GET.getlist(COMPARED_PACKAGE_IDS_KEY)
        exact = get_boolean_value(request.GET, EXACT_KEY, True)
        similar_ipv4 = get_boolean_value(request.GET, SIMILAR_IPV4_KEY, False)
        similar_domain = get_boolean_value(request.GET, SIMILAR_DOMAIN_KEY,
                                           False)

        edges = []

        fuzzy_infos = _get_fuzzy_matched_info(package_id)
        for fuzzy_info in fuzzy_infos:
            if fuzzy_info.end_node['package_id'] not in compared_package_ids:
                continue
            start_node = fuzzy_info.start_node
            end_node = fuzzy_info.end_node
            edge = {
                'edge_type': fuzzy_info.reason['title'],
                'start_node': start_node,
                'end_node': end_node,
                'reason': fuzzy_info.reason,
            }
            edges.append(edge)

        if exact:
            end_infos = _get_exact_matched_info(package_id)
            for end_info in end_infos:
                if end_info.package_id not in compared_package_ids:
                    continue
                end_node = {
                    'package_id': end_info.package_id,
                    'node_id': end_info.node_id
                }

                if hasattr(end_info, 'start_collection'):
                    collection = end_info.start_collection
                else:
                    collection = type(end_info)
                if collection == IndicatorV2Caches:
                    start_caches = collection.objects.filter(
                        package_id=package_id, pattern=end_info.pattern)
                elif collection == LabelCaches:
                    start_caches = collection.objects.filter(
                        package_id=package_id, label__iexact=end_info.label)
                elif collection == CustomObjectCaches:
                    if hasattr(end_info, 'start_type'):
                        start_type = end_info.start_type
                    else:
                        start_type = end_info.type
                    start_caches = collection.objects.filter(
                        package_id=package_id,
                        type=start_type,
                        value=end_info.value)
                else:
                    start_caches = collection.objects.filter(
                        package_id=package_id,
                        type=end_info.type,
                        value=end_info.value)
                for start_cache in start_caches:
                    start_node = {
                        'package_id': package_id,
                        'node_id': start_cache.node_id
                    }
                    edge = {
                        'edge_type': EXACT_EDGE_TYPE,
                        'start_node': start_node,
                        'end_node': end_node
                    }
                    edges.append(edge)

        if similar_ipv4:
            end_infos = _get_similar_ipv4(package_id)
            for end_info in end_infos:
                end_cache = end_info['cache']
                if end_cache.package_id not in compared_package_ids:
                    continue
                end_node = {
                    'package_id': end_cache.package_id,
                    'node_id': end_cache.node_id
                }
                source_value = end_info['source_value']
                start_caches = ObservableCaches.objects.filter(
                    package_id=package_id,
                    type=end_cache.type,
                    value=source_value)
                for start_cache in start_caches:
                    start_node = {
                        'package_id': package_id,
                        'node_id': start_cache.node_id
                    }
                    edge_type = _get_ipv4_similarity_type(
                        start_cache, end_cache)
                    edge = {
                        'edge_type': edge_type,
                        'start_node': start_node,
                        'end_node': end_node
                    }
                    edges.append(edge)

        if similar_domain:
            end_infos = _get_similar_domain(package_id)
            for end_info in end_infos:
                end_cache = end_info['cache']
                if end_cache.package_id not in compared_package_ids:
                    continue
                end_node = {
                    'package_id': end_cache.package_id,
                    'node_id': end_cache.node_id
                }
                source_value = end_info['source_value']
                start_caches = ObservableCaches.objects.filter(
                    package_id=package_id,
                    type=end_cache.type,
                    value=source_value)
                for start_cache in start_caches:
                    edge_type = _get_domain_similarity_type(
                        start_cache, end_cache)
                    if edge_type is None:
                        continue
                    start_node = {
                        'package_id': package_id,
                        'node_id': start_cache.node_id
                    }
                    edge = {
                        'edge_type': edge_type,
                        'start_node': start_node,
                        'end_node': end_node
                    }
                    edges.append(edge)

        contents = []
        contents.append(_get_contents_item(package_id))
        for compared_package_id in compared_package_ids:
            contents.append(_get_contents_item(compared_package_id))

        data = {}
        data['contents'] = contents
        data['edges'] = edges

        resp = get_normal_response_json()
        resp['data'] = data
        return JsonResponse(resp)
    except Exception as e:
        traceback.print_exc()
        return error(e)
Esempio n. 30
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)