Beispiel #1
0
def get_allowed_fields(user):
    return tuple(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed']
        and has_permissions(user, x['permissions_needed'])
    )
Beispiel #2
0
def signature_report(request, default_context=None):
    context = default_context

    params = get_validated_params(request)
    if isinstance(params, http.HttpResponseBadRequest):
        # There was an error in the form, let's return it.
        return params

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory')

    context['signature'] = signature

    fields = sorted(x['name'] for x in SuperSearchFields().get().values()
                    if x['is_exposed'] and x['is_returned']
                    and has_permissions(request.user, x['permissions_needed'])
                    and x['name'] != 'signature'  # exclude the signature field
                    )
    context['fields'] = [{
        'id': field,
        'text': field.replace('_', ' ')
    } for field in fields]

    context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS

    context['report_list_query_string'] = urllib.urlencode(
        utils.sanitize_dict(get_report_list_parameters(params)), True)

    return render(request, 'signature/signature_report.html', context)
Beispiel #3
0
def get_allowed_fields(user):
    return tuple(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed']
        and has_permissions(user, x['permissions_needed'])
    )
Beispiel #4
0
def signature_report(request, default_context=None):
    context = default_context

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory'
        )

    context['signature'] = signature

    fields = sorted(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed']
        and x['is_returned']
        and has_permissions(request.user, x['permissions_needed'])
        and x['name'] != 'signature'  # exclude the signature field
    )
    context['fields'] = [
        {'id': field, 'text': field.replace('_', ' ')} for field in fields
    ]

    context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS

    return render(request, 'signature/signature_report.html', context)
Beispiel #5
0
def signature_summary(request, params):
    '''Return a list of specific aggregations. '''

    context = {}

    params['signature'] = '=' + params['signature'][0]
    params['_aggs.signature'] = [
        'hang_type',
        'process_type',
        'startup_crash',
        '_histogram.uptime',
    ]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_name',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60
    params['_aggs.adapter_vendor_id'] = ['adapter_device_id']
    params['_aggs.android_cpu_abi.android_manufacturer.android_model'] = [
        'android_version'
    ]
    params['_aggs.product.version'] = ['_cardinality.install_time']

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(request.user,
                       all_fields['exploitability']['permissions_needed']):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()

    # Now make the actual request with all expected parameters.
    try:
        search_results = api.get(**params)
    except BadArgumentError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest(render_exception(e))

    facets = search_results['facets']

    _transform_uptime_summary(facets)
    _transform_graphics_summary(facets)
    _transform_mobile_summary(facets)
    _transform_exploitability_summary(facets)

    context['query'] = search_results
    context['product_version_total'] = search_results['total']
    if 'signature' in facets and len(facets['signature']) > 0:
        context['signature_stats'] = SignatureStats(
            search_results['facets']['signature'][0], search_results['total'])

    return render(request, 'signature/signature_summary.html', context)
Beispiel #6
0
def signature_summary(request, params):
    """Return a list of specific aggregations"""
    context = {}

    params['signature'] = '=' + params['signature'][0]
    params['_aggs.signature'] = [
        'hang_type',
        'process_type',
        'startup_crash',
        '_histogram.uptime',
    ]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_arch',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60
    params['_aggs.adapter_vendor_id'] = ['adapter_device_id']
    params['_aggs.android_cpu_abi.android_manufacturer.android_model'] = [
        'android_version'
    ]
    params['_aggs.product.version'] = ['_cardinality.install_time']

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(
        request.user, all_fields['exploitability']['permissions_needed']
    ):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()

    # Now make the actual request with all expected parameters.
    try:
        search_results = api.get(**params)
    except BadArgumentError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest(render_exception(e))

    facets = search_results['facets']

    _transform_uptime_summary(facets)
    _transform_graphics_summary(facets)
    _transform_mobile_summary(facets)
    _transform_exploitability_summary(facets)

    context['query'] = search_results
    context['product_version_total'] = search_results['total']
    if 'signature' in facets and len(facets['signature']) > 0:
        context['signature_stats'] = SignatureStats(search_results['facets']['signature'][0],
                                                    search_results['total'])

    return render(request, 'signature/signature_summary.html', context)
Beispiel #7
0
def signature_report(request, params, default_context=None):
    context = default_context

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory'
        )

    context['signature'] = signature

    fields = sorted(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed'] and
        x['is_returned'] and
        has_permissions(request.user, x['permissions_needed']) and
        x['name'] != 'signature'  # exclude the signature field
    )
    context['fields'] = [
        {'id': field, 'text': field.replace('_', ' ')} for field in fields
    ]

    columns = request.GET.getlist('_columns')
    columns = [x for x in columns if x in fields]
    context['columns'] = columns or DEFAULT_COLUMNS

    sort = request.GET.getlist('_sort')
    sort = [x for x in sort if x in fields]
    context['sort'] = sort or DEFAULT_SORT

    context['channels'] = ','.join(settings.CHANNELS).split(',')
    context['channel'] = settings.CHANNEL

    # Compute dates to show them to the user.
    start_date, end_date = get_date_boundaries(params)
    context['query'] = {
        'start_date': start_date,
        'end_date': end_date,
    }

    return render(request, 'signature/signature_report.html', context)
Beispiel #8
0
def signature_report(request, params, default_context=None):
    context = default_context

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory'
        )

    context['signature'] = signature

    fields = sorted(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed'] and
        x['is_returned'] and
        has_permissions(request.user, x['permissions_needed']) and
        x['name'] != 'signature'  # exclude the signature field
    )
    context['fields'] = [
        {'id': field, 'text': field.replace('_', ' ')} for field in fields
    ]

    columns = request.GET.getlist('_columns')
    columns = [x for x in columns if x in fields]
    context['columns'] = columns or DEFAULT_COLUMNS

    sort = request.GET.getlist('_sort')
    sort = [x for x in sort if x in fields]
    context['sort'] = sort or DEFAULT_SORT

    context['channels'] = ','.join(settings.CHANNELS).split(',')
    context['channel'] = settings.CHANNEL

    context['report_list_query_string'] = urllib.urlencode(
        utils.sanitize_dict(
            get_report_list_parameters(params)
        ),
        True
    )

    return render(request, 'signature/signature_report.html', context)
Beispiel #9
0
def signature_report(request, default_context=None):
    context = default_context

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory')

    context['signature'] = signature

    fields = sorted(x['name'] for x in SuperSearchFields().get().values()
                    if x['is_exposed'] and x['is_returned']
                    and has_permissions(request.user, x['permissions_needed'])
                    and x['name'] != 'signature'  # exclude the signature field
                    )
    context['fields'] = [{
        'id': field,
        'text': field.replace('_', ' ')
    } for field in fields]

    return render(request, 'signature/signature_report.html', context)
Beispiel #10
0
def signature_report(request, default_context=None):
    context = default_context

    params = get_validated_params(request)
    if isinstance(params, http.HttpResponseBadRequest):
        # There was an error in the form, let's return it.
        return params

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory'
        )

    context['signature'] = signature

    fields = sorted(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed']
        and x['is_returned']
        and has_permissions(request.user, x['permissions_needed'])
        and x['name'] != 'signature'  # exclude the signature field
    )
    context['fields'] = [
        {'id': field, 'text': field.replace('_', ' ')} for field in fields
    ]

    context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS

    context['report_list_query_string'] = urllib.urlencode(
        utils.sanitize_dict(
            get_report_list_parameters(params)
        ),
        True
    )

    return render(request, 'signature/signature_report.html', context)
Beispiel #11
0
def signature_report(request, params, default_context=None):
    context = default_context

    signature = request.GET.get('signature')
    if not signature:
        return http.HttpResponseBadRequest(
            '"signature" parameter is mandatory'
        )

    context['signature'] = signature

    fields = sorted(
        x['name']
        for x in SuperSearchFields().get().values()
        if x['is_exposed'] and
        x['is_returned'] and
        has_permissions(request.user, x['permissions_needed']) and
        x['name'] != 'signature'  # exclude the signature field
    )
    context['fields'] = [
        {'id': field, 'text': field.replace('_', ' ')} for field in fields
    ]

    context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS

    context['channels'] = ','.join(settings.CHANNELS).split(',')
    context['channel'] = settings.CHANNEL

    context['report_list_query_string'] = urllib.urlencode(
        utils.sanitize_dict(
            get_report_list_parameters(params)
        ),
        True
    )

    return render(request, 'signature/signature_report.html', context)
Beispiel #12
0
def signature_summary(request, params):
    '''Return a list of specific aggregations. '''

    context = {}

    params['signature'] = '=' + params['signature'][0]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_name',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60
    params['_aggs.adapter_vendor_id'] = ['adapter_device_id']
    params['_aggs.android_cpu_abi.android_manufacturer.android_model'] = [
        'android_version'
    ]

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(
        request.user, all_fields['exploitability']['permissions_needed']
    ):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()

    # Now make the actual request with all expected parameters.
    try:
        search_results = api.get(**params)
    except BadArgumentError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest(render_exception(e))

    facets = search_results['facets']

    # We need to make a separate query so that we can show all versions and
    # not just the one asked for.
    params_copy = {
        'signature': params['signature'],
        '_aggs.product.version': ['_cardinality.install_time'],
    }

    try:
        product_results = api.get(**params_copy)
    except BadArgumentError as e:
        # We need to return the error message in some HTML form for jQuery
        # to pick it up.
        return http.HttpResponseBadRequest(render_exception(e))

    if 'product' in product_results['facets']:
        facets['product'] = product_results['facets']['product']
    else:
        facets['product'] = []

    context['product_version_total'] = product_results['total']

    _transform_uptime_summary(facets)
    _transform_graphics_summary(facets)
    _transform_mobile_summary(facets)
    _transform_exploitability_summary(facets)

    context['query'] = search_results

    return render(request, 'signature/signature_summary.html', context)
Beispiel #13
0
def signature_summary(request, params):
    '''Return a list of specific aggregations. '''

    data = {}

    params['signature'] = '=' + params['signature'][0]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_name',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60
    params['_aggs.adapter_vendor_id'] = ['adapter_device_id']
    params['_aggs.android_cpu_abi.android_manufacturer.android_model'] = [
        'android_version'
    ]

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(
        request.user, all_fields['exploitability']['permissions_needed']
    ):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()

    # Now make the actual request with all expected parameters.
    try:
        search_results = api.get(**params)
    except models.BadStatusCodeError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest('<ul><li>%s</li></ul>' % e)

    facets = search_results['facets']

    # We need to make a separate query so that we can show all versions and
    # not just the one asked for.
    params_copy = {
        'signature': params['signature'],
        '_aggs.product.version': ['_cardinality.install_time'],
    }

    try:
        product_results = api.get(**params_copy)
    except models.BadStatusCodeError as e:
        # We need to return the error message in some HTML form for jQuery
        # to pick it up.
        return http.HttpResponseBadRequest('<ul><li>%s</li></ul>' % e)

    if 'product' in product_results['facets']:
        facets['product'] = product_results['facets']['product']
    else:
        facets['product'] = []

    data['product_version_total'] = product_results['total']

    _transform_uptime_summary(facets)
    _transform_graphics_summary(facets)
    _transform_mobile_summary(facets)
    _transform_exploitability_summary(facets)

    data['query'] = search_results

    return render(request, 'signature/signature_summary.html', data)
Beispiel #14
0
def signature_summary(request, params):
    '''Return a list of specific aggregations. '''

    data = {}

    params['signature'] = '=' + params['signature'][0]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_name',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(
        request.user, all_fields['exploitability']['permissions_needed']
    ):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()
    try:
        search_results = api.get(**params)
    except models.BadStatusCodeError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest('<ul><li>%s</li></ul>' % e)

    facets = search_results['facets']

    # Transform uptime data to be easier to consume.
    # Keys are in minutes.
    if 'histogram_uptime' in facets:
        labels = {
            0: '< 1 min',
            1: '1-5 min',
            5: '5-15 min',
            15: '15-60 min',
            60: '> 1 hour'
        }
        uptimes_count = dict((x, 0) for x in labels)

        for uptime in facets['histogram_uptime']:
            for uptime_minutes in sorted(uptimes_count.keys(), reverse=True):
                uptime_seconds = uptime_minutes * 60

                if uptime['term'] >= uptime_seconds:
                    uptimes_count[uptime_minutes] += uptime['count']
                    break

        uptimes = [
            {'term': labels.get(key), 'count': count}
            for key, count in uptimes_count.items()
            if count > 0
        ]
        uptimes = sorted(uptimes, key=lambda x: x['count'], reverse=True)
        data['uptimes'] = uptimes

    # Transform exploitability facet.
    if 'histogram_date' in facets:
        exploitability_base = {
            'none': 0,
            'low': 0,
            'medium': 0,
            'high': 0,
        }
        for day in facets['histogram_date']:
            exploitability = dict(exploitability_base)
            for expl in day['facets']['exploitability']:
                if expl['term'] in exploitability:
                    exploitability[expl['term']] = expl['count']
            day['exploitability'] = exploitability

        facets['histogram_date'] = sorted(
            facets['histogram_date'],
            key=lambda x: x['term'],
            reverse=True
        )

    data['query'] = search_results

    return render(request, 'signature/signature_summary.html', data)