Example #1
0
def bulk_add_object(request):
    """
    Bulk add objects.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    all_obj_type_choices = [
        (c[0], c[0], {"datatype": c[1].keys()[0], "datatype_value": c[1].values()[0]})
        for c in get_object_types(False, query={"datatype.file": {"$exists": 0}})
    ]

    formdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

    if request.method == "POST" and request.is_ajax():
        response = parse_bulk_upload(request, parse_row_to_bound_object_form, add_new_handler_object_via_bulk, formdict)

        return HttpResponse(json.dumps(response, default=json_handler), mimetype="application/json")
    else:
        return render_to_response(
            "bulk_add_default.html",
            {"formdict": formdict, "title": "Bulk Add Objects", "table_name": "object"},
            RequestContext(request),
        )
Example #2
0
def bulk_add_object(request):
    """
    Bulk add objects.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    all_obj_type_choices = [(c[0],
                            c[0],
                            {'datatype':c[1].keys()[0],
                            'datatype_value':c[1].values()[0]}
                            ) for c in get_object_types(False, query={'datatype.file':{'$exists':0}})]

    formdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

    if request.method == "POST" and request.is_ajax():
        response = parse_bulk_upload(request, parse_row_to_bound_object_form, add_new_handler_object_via_bulk, formdict)

        return HttpResponse(json.dumps(response,
                            default=json_handler),
                            mimetype='application/json')
    else:
        return render_to_response('bulk_add_default.html',
                                  {'formdict': formdict,
                                  'title': "Bulk Add Objects",
                                  'table_name': 'object'},
                                  RequestContext(request))
Example #3
0
def parse_row_to_bound_object_form(request, rowData, cache):
    """
    Parse a row from mass object upload into an AddObjectForm.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :param rowData: The row data.
    :type rowData: dict
    :param cache: Cached data, typically for performance enhancements
                  during bulk operations.
    :type cache: dict
    :returns: :class:`crits.objects.forms.AddObjectForm`
    """

    bound_form = None

    # TODO fix the hardcoded strings and conversion of types
    # TODO Add common method to convert data to string
    object_type = rowData.get(form_consts.Object.OBJECT_TYPE, "")
    value = rowData.get(form_consts.Object.VALUE, "")
    source = rowData.get(form_consts.Object.SOURCE, "")
    method = rowData.get(form_consts.Object.METHOD, "")
    reference = rowData.get(form_consts.Object.REFERENCE, "")
    otype = rowData.get(form_consts.Object.PARENT_OBJECT_TYPE, "")
    oid = rowData.get(form_consts.Object.PARENT_OBJECT_ID, "")
    is_add_indicator = convert_string_to_bool(
        rowData.get(form_consts.Object.ADD_INDICATOR, "False"))

    all_obj_type_choices = cache.get("object_types")

    if all_obj_type_choices == None:
        all_obj_type_choices = [(c[0], c[0], {
            'datatype': c[1].keys()[0],
            'datatype_value': c[1].values()[0]
        }) for c in get_object_types(False)]
        cache["object_types"] = all_obj_type_choices

    data = {
        'object_type': object_type,
        'value': value,
        'source': source,
        'method': method,
        'reference': reference,
        'otype': otype,
        'oid': oid,
        'add_indicator': is_add_indicator
    }

    bound_form = cache.get("object_form")

    if bound_form == None:
        bound_form = AddObjectForm(request.user, all_obj_type_choices, data)
        cache['object_form'] = bound_form
    else:
        bound_form.data = data

    bound_form.full_clean()

    return bound_form
Example #4
0
def parse_row_to_bound_object_form(request, rowData, cache):
    """
    Parse a row from mass object upload into an AddObjectForm.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :param rowData: The row data.
    :type rowData: dict
    :param cache: Cached data, typically for performance enhancements
                  during bulk operations.
    :type cache: dict
    :returns: :class:`crits.objects.forms.AddObjectForm`
    """

    bound_form = None

    # TODO fix the hardcoded strings and conversion of types
    # TODO Add common method to convert data to string
    object_type = rowData.get(form_consts.Object.OBJECT_TYPE, "")
    value = rowData.get(form_consts.Object.VALUE, "")
    source = rowData.get(form_consts.Object.SOURCE, "")
    method = rowData.get(form_consts.Object.METHOD, "")
    reference = rowData.get(form_consts.Object.REFERENCE, "")
    otype = rowData.get(form_consts.Object.PARENT_OBJECT_TYPE, "")
    oid = rowData.get(form_consts.Object.PARENT_OBJECT_ID, "")
    is_add_indicator = convert_string_to_bool(rowData.get(form_consts.Object.ADD_INDICATOR, "False"))

    all_obj_type_choices = cache.get("object_types")

    if all_obj_type_choices == None:
        all_obj_type_choices = [(c[0],
                c[0],
                {'datatype':c[1].keys()[0],
                 'datatype_value':c[1].values()[0]}
                ) for c in get_object_types(False)]
        cache["object_types"] = all_obj_type_choices

    data = {
        'object_type': object_type,
        'value': value,
        'source': source,
        'method': method,
        'reference': reference,
        'otype': otype,
        'oid': oid,
        'add_indicator': is_add_indicator
    }

    bound_form = cache.get("object_form")

    if bound_form == None:
        bound_form = AddObjectForm(request.user, all_obj_type_choices, data)
        cache['object_form'] = bound_form
    else:
        bound_form.data = data

    bound_form.full_clean()

    return bound_form
Example #5
0
def get_object_type_dropdown(request):
    """
    Get the list of object types for UI dropdowns. Should be an AJAX POST.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    # NOTE: query is no longer a free-form ajax object that is passed onto mongo
    # There was a Mongo Injection issue here before. get_object_types
    # query is passed into mongo as a raw WHERE clause, permitting
    # javascript injection into mongo.
    # Only searches seen used so far is {datatype.file:{$exists:0}}, so this was changed around to
    # only look for a query:'no_file' and sets the where clause for the handler to remove the
    # exposure here

    if request.method == 'POST' and request.is_ajax():
        dd_types = ""
        query = {}
        if 'query' in request.POST and request.POST['query'] != "":
            if request.POST['query'] == "no_file":
                query = {'datatype.file':{'$exists':0}}
            else:
                message = "Invalid Query passed"
                result = {'success': False, 'message': message}
                return HttpResponse(json.dumps(result),
                                    mimetype="application/json")

        if 'all' in request.POST:
            dd_types = get_object_types(False, query)
        else:
            dd_types = get_object_types(True, query)
        dd_final = {}
        for obj_type in dd_types:
            dd_final[obj_type[0]] = obj_type
        result = {'types': dd_final}
        return HttpResponse(json.dumps(result),
                            mimetype="application/json")
    else:
        error = "Expected AJAX POST"
        return render_to_response("error.html",
                                  {"error" : error },
                                  RequestContext(request))
Example #6
0
File: views.py Project: 0x3a/crits
def get_object_type_dropdown(request):
    """
    Get the list of object types for UI dropdowns. Should be an AJAX POST.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    # NOTE: query is no longer a free-form ajax object that is passed onto mongo
    # There was a Mongo Injection issue here before. get_object_types
    # query is passed into mongo as a raw WHERE clause, permitting
    # javascript injection into mongo.
    # Only searches seen used so far is {datatype.file:{$exists:0}}, so this was changed around to
    # only look for a query:'no_file' and sets the where clause for the handler to remove the
    # exposure here

    if request.method == 'POST' and request.is_ajax():
        dd_types = ""
        query = {}
        if 'query' in request.POST and request.POST['query'] != "":
            if request.POST['query'] == "no_file":
                query = {'datatype.file':{'$exists':0}}
            else:
                message = "Invalid Query passed"
                result = {'success': False, 'message': message}
                return HttpResponse(json.dumps(result),
                                    mimetype="application/json")

        if 'all' in request.POST:
            dd_types = get_object_types(False, query)
        else:
            dd_types = get_object_types(True, query)
        dd_final = {}
        for obj_type in dd_types:
            dd_final[obj_type[0]] = obj_type
        result = {'types': dd_final}
        return HttpResponse(json.dumps(result),
                            mimetype="application/json")
    else:
        error = "Expected AJAX POST"
        return render_to_response("error.html",
                                  {"error" : error },
                                  RequestContext(request))
Example #7
0
 def __init__(self, username, choices, *args, **kwargs):
     super(AddObjectForm, self).__init__(*args, **kwargs)
     if not choices:
         choices = [(c[0], c[0],
                     {'datatype':c[1].keys()[0],
                      'datatype_value':c[1].values()[0]}) for c in get_object_types(True)]
     self.fields['object_type'].choices = choices
     self.fields['object_type'].widget.attrs = {'class':'object-types'}
     self.fields['source'].choices = [(c.name,
                                       c.name) for c in get_source_names(True,
                                                                         True,
                                                                         username)]
     self.fields['source'].initial = get_user_organization(username)
Example #8
0
File: views.py Project: 0x3a/crits
def bulk_add_domain(request):
    """
    Bulk add domains via a bulk upload form.

    Args:
        request: The Django context which contains information about the
            session and key/value pairs for the bulk add domains request

    Returns:
        If the request is not a POST and not a Ajax call then:
            Returns a rendered HTML form for a bulk add of domains
        If the request is a POST and a Ajax call then:
            Returns a response that contains information about the
            status of the bulk uploaded domains. This may include information
            such as domains that failed or successfully added. This may
            also contain helpful status messages about each operation.
    """

    all_obj_type_choices = [(c[0],
                            c[0],
                            {'datatype':c[1].keys()[0],
                            'datatype_value':c[1].values()[0]}
                            ) for c in get_object_types(False)]

    formdict = form_to_dict(AddDomainForm(request.user))

    if request.method == "POST" and request.is_ajax():
        response = process_bulk_add_domain(request, formdict);

        return HttpResponse(json.dumps(response,
                            default=json_handler),
                            mimetype='application/json')
    else:
        objectformdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

        return render_to_response('bulk_add_default.html',
                                 {'formdict': formdict,
                                  'objectformdict': objectformdict,
                                  'title': "Bulk Add Domains",
                                  'table_name': 'domain',
                                  'local_validate_columns': [form_consts.Domain.DOMAIN_NAME],
                                  'custom_js': "domain_handsontable.js",
                                  'is_bulk_add_objects': True},
                                  RequestContext(request));
Example #9
0
def bulk_add_domain(request):
    """
    Bulk add domains via a bulk upload form.

    Args:
        request: The Django context which contains information about the
            session and key/value pairs for the bulk add domains request

    Returns:
        If the request is not a POST and not a Ajax call then:
            Returns a rendered HTML form for a bulk add of domains
        If the request is a POST and a Ajax call then:
            Returns a response that contains information about the
            status of the bulk uploaded domains. This may include information
            such as domains that failed or successfully added. This may
            also contain helpful status messages about each operation.
    """

    all_obj_type_choices = [(c[0],
                            c[0],
                            {'datatype':c[1].keys()[0],
                            'datatype_value':c[1].values()[0]}
                            ) for c in get_object_types(False)]

    formdict = form_to_dict(AddDomainForm(request.user))

    if request.method == "POST" and request.is_ajax():
        response = process_bulk_add_domain(request, formdict);

        return HttpResponse(json.dumps(response,
                            default=json_handler),
                            mimetype='application/json')
    else:
        objectformdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

        return render_to_response('bulk_add_default.html',
                                 {'formdict': formdict,
                                  'objectformdict': objectformdict,
                                  'title': "Bulk Add Domains",
                                  'table_name': 'domain',
                                  'local_validate_columns': [form_consts.Domain.DOMAIN_NAME],
                                  'custom_js': "domain_handsontable.js",
                                  'is_bulk_add_objects': True},
                                  RequestContext(request));
Example #10
0
    def __init__(self, username, choices=None, *args, **kwargs):
        super(UploadIndicatorForm, self).__init__(*args, **kwargs)
        self.fields['source'].choices = [
            (c.name, c.name) for c in get_source_names(True, True, username)
        ]
        self.fields['source'].initial = get_user_organization(username)
        if not choices:
            #only valid types for indicators are those which don't require file upload
            choices = [(c[0], c[0], {
                'datatype': c[1].keys()[0],
                'datatype_value': c[1].values()[0]
            }) for c in get_object_types(active=True,
                                         query={
                                             'datatype.file': {
                                                 '$exists': 0
                                             },
                                             'datatype.enum': {
                                                 '$exists': 0
                                             }
                                         })]

        self.fields['indicator_type'].choices = choices
        self.fields['indicator_type'].widget.attrs = {'class': 'object-types'}
        self.fields['campaign'].choices = [("", "")]
        self.fields['campaign'].choices += [
            (c.name, c.name) for c in get_item_names(Campaign, True)
        ]
        self.fields['campaign_confidence'].choices = [("", ""), ("low", "low"),
                                                      ("medium", "medium"),
                                                      ("high", "high")]
        self.fields['confidence'].choices = [("unknown", "unknown"),
                                             ("benign", "benign"),
                                             ("low", "low"),
                                             ("medium", "medium"),
                                             ("high", "high")]
        self.fields['impact'].choices = [("unknown", "unknown"),
                                         ("benign", "benign"), ("low", "low"),
                                         ("medium", "medium"),
                                         ("high", "high")]

        add_bucketlist_to_form(self)
        add_ticket_to_form(self)
Example #11
0
    def __init__(self, username, choices=None, *args, **kwargs):
        super(UploadIndicatorForm, self).__init__(*args, **kwargs)
        self.fields['source'].choices = [(c.name,
                                          c.name) for c in get_source_names(True,
                                                                               True,
                                                                               username)]
        self.fields['source'].initial = get_user_organization(username)
        if not choices:
            #only valid types for indicators are those which don't require file upload
            choices = [(c[0],
                             c[0],
                             {'datatype':c[1].keys()[0],
                              'datatype_value':c[1].values()[0]}
                             ) for c in get_object_types(active=True,
                                                         query={'datatype.file':{'$exists':0}})]

        self.fields['indicator_type'].choices = choices
        self.fields['indicator_type'].widget.attrs = {'class':'object-types'}
        self.fields['campaign'].choices = [("","")]
        self.fields['campaign'].choices += [(c.name,
                                             c.name
                                             ) for c in get_item_names(Campaign,
                                                                       True)]
        self.fields['campaign_confidence'].choices = [("", ""),
                                             ("low", "low"),
                                             ("medium", "medium"),
                                             ("high", "high")]
        self.fields['confidence'].choices = [("unknown", "unknown"),
                                             ("benign", "benign"),
                                             ("low", "low"),
                                             ("medium", "medium"),
                                             ("high", "high")]
        self.fields['impact'].choices = [("unknown", "unknown"),
                                             ("benign", "benign"),
                                             ("low", "low"),
                                             ("medium", "medium"),
                                             ("high", "high")]

        add_bucketlist_to_form(self)
        add_ticket_to_form(self)
Example #12
0
def upload_indicator(request):
    """
    Upload new indicators (individual, blob, or CSV file).

    :param request: Django request object (Required)
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
              :class:`django.http.HttpResponseRedirect`
    """

    if request.method == "POST":
        username = request.user.username
        failed_msg = ""
        result = None

        if request.POST["svalue"] == "Upload CSV":
            form = UploadIndicatorCSVForm(username, request.POST, request.FILES)
            if form.is_valid():
                result = handle_indicator_csv(
                    request.FILES["filedata"],
                    request.POST["source"],
                    request.POST["method"],
                    request.POST["reference"],
                    "file",
                    username,
                    add_domain=True,
                )
                if result["success"]:
                    message = {
                        "message": (
                            '<div>%s <a href="%s">Go to all'
                            " indicators</a></div>"
                            % (result["message"], reverse("crits.indicators.views.indicators_listing"))
                        )
                    }
                else:
                    failed_msg = "<div>%s</div>" % result["message"]

        if request.POST["svalue"] == "Upload Text":
            form = UploadIndicatorTextForm(username, request.POST)
            if form.is_valid():
                result = handle_indicator_csv(
                    request.POST["data"],
                    request.POST["source"],
                    request.POST["method"],
                    request.POST["reference"],
                    "ti",
                    username,
                    add_domain=True,
                )
                if result["success"]:
                    message = {
                        "message": (
                            '<div>%s <a href="%s">Go to all'
                            " indicators</a></div>"
                            % (result["message"], reverse("crits.indicators.views.indicators_listing"))
                        )
                    }
                else:
                    failed_msg = "<div>%s</div>" % result["message"]

        if request.POST["svalue"] == "Upload Indicator":
            all_ind_type_choices = [
                (c[0], c[0], {"datatype": c[1].keys()[0], "datatype_value": c[1].values()[0]})
                for c in get_object_types(active=False, query={"datatype.file": {"$exists": 0}})
            ]
            form = UploadIndicatorForm(username, all_ind_type_choices, request.POST)
            if form.is_valid():
                result = handle_indicator_ind(
                    request.POST["value"],
                    request.POST["source"],
                    request.POST["indicator_type"],
                    username,
                    request.POST["method"],
                    request.POST["reference"],
                    add_domain=True,
                    campaign=request.POST["campaign"],
                    campaign_confidence=request.POST["campaign_confidence"],
                    confidence=request.POST["confidence"],
                    impact=request.POST["impact"],
                    bucket_list=request.POST[form_consts.Common.BUCKET_LIST_VARIABLE_NAME],
                    ticket=request.POST[form_consts.Common.TICKET_VARIABLE_NAME],
                )
                if result["success"]:
                    indicator_link = (
                        ' - <a href="%s">Go to this ' 'indicator</a> or <a href="%s">all ' "indicators</a>.</div>"
                    ) % (
                        reverse("crits.indicators.views.indicator", args=[result["objectid"]]),
                        reverse("crits.indicators.views.indicators_listing"),
                    )

                    if result.get("is_new_indicator", False) == False:
                        message = {"message": ("<div>Warning: Updated existing" " Indicator!" + indicator_link)}
                    else:
                        message = {"message": ("<div>Indicator added " "successfully!" + indicator_link)}
                else:
                    failed_msg = result["message"] + " - "

        if result == None or not result["success"]:
            failed_msg += '<a href="%s"> Go to all indicators</a></div>' % reverse(
                "crits.indicators.views.indicators_listing"
            )
            message = {"message": failed_msg, "form": form.as_table()}
        elif result != None:
            message["success"] = result["success"]

        if request.is_ajax():
            return HttpResponse(json.dumps(message), mimetype="application/json")
        else:  # file upload
            return render_to_response(
                "file_upload_response.html", {"response": json.dumps(message)}, RequestContext(request)
            )
Example #13
0
def add_new_object(request):
    """
    Add a new object.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    if request.method == 'POST':
        analyst = "%s" % request.user
        result = ""
        message = ""
        my_type = request.POST['otype']
        all_obj_type_choices = [(c[0],
                                 c[0],
                                 {'datatype':c[1].keys()[0],
                                  'datatype_value':c[1].values()[0]}
                                 ) for c in get_object_types(False)]
        form = AddObjectForm(analyst,
                             all_obj_type_choices,
                             request.POST,
                             request.FILES)
        if not form.is_valid() and not 'value' in request.FILES:
            message = "Invalid Form: %s" % form.errors
            form = form.as_table()
            response = json.dumps({'message': message,
                                   'form': form,
                                   'success': False})
            if request.is_ajax():
                return HttpResponse(response, mimetype="application/json")
            else:
                return render_to_response("file_upload_response.html",
                                          {'response':response},
                                          RequestContext(request))
        source = request.POST['source']
        oid = request.POST['oid']
        ot_array = request.POST['object_type'].split(" - ")
        object_type = ot_array[0]
        name = ot_array[1] if len(ot_array) == 2 else ot_array[0]
        method = request.POST['method']
        reference = request.POST['reference']
        add_indicator = request.POST.get('add_indicator', None)
        data = None
        # if it was a file upload, handle the file appropriately
        if 'value' in request.FILES:
            data = request.FILES['value']
        value = request.POST.get('value', None)
        if isinstance(value, basestring):
            value = value.strip()
        results = add_object(my_type,
                             oid,
                             object_type,
                             name,
                             source,
                             method,
                             reference,
                             analyst,
                             value=value,
                             file_=data,
                             add_indicator=add_indicator,
                             is_sort_relationships=True)
        if results['success']:
            subscription = {
                'type': my_type,
                'id': oid
            }

            if results.get('relationships', None):
                relationship = {'type': my_type,
                                'value': oid}
                relationships = results['relationships']

                html = render_to_string('objects_listing_widget.html',
                                        {'objects': results['objects'],
                                         'relationships': relationships,
                                         'subscription': subscription},
                                        RequestContext(request))
                result = {'success': True,
                          'html': html,
                          'message': results['message']}

                rel_msg  = render_to_string('relationships_listing_widget.html',
                                            {'relationship': relationship,
                                             'nohide': True,
                                             'relationships': relationships},
                                            RequestContext(request))
                result['rel_made'] = True
                result['rel_msg'] = rel_msg
            else:
                html = render_to_string('objects_listing_widget.html',
                                        {'objects': results['objects'],
                                         'subscription': subscription},
                                        RequestContext(request))
                result = {'success': True,
                          'html': html,
                          'message': results['message']}
        else:
            message = "Error adding object: %s" % results['message']
            result = {'success': False, 'message': message}
        if request.is_ajax():
            return HttpResponse(json.dumps(result),
                                mimetype="application/json")
        else:
            return render_to_response("file_upload_response.html",
                                      {'response': json.dumps(result)},
                                      RequestContext(request))
    else:
        error = "Expected POST"
        return render_to_response("error.html",
                                  {"error" : error },
                                  RequestContext(request))
Example #14
0
import re

from django import forms
from django.forms.util import ErrorList

from crits.campaigns.campaign import Campaign
from crits.core.forms import add_bucketlist_to_form, add_ticket_to_form
from crits.core.handlers import get_item_names, get_source_names
from crits.core.user_tools import get_user_organization
from crits.core.handlers import get_object_types
from crits.core import form_consts

ip_choices = [(c[0], c[0]) for c in get_object_types(
    active=False,
    query={
        'type': 'Address',
        'name': {
            '$in': ['cidr', re.compile('^ipv')]
        }
    })]


class AddIPForm(forms.Form):
    """
    Django form for adding an IP to CRITs.
    """

    error_css_class = 'error'
    required_css_class = 'required'
    ip = forms.CharField(
        required=True,
        label=form_consts.IP.IP_ADDRESS,
Example #15
0
    Split the name and type into their separate parts.

    :param full_name: The full name of the ObjectType.
    :type full_name: str
    :returns: list of [<name>, <type>]
    """

    split_name = full_name.split(" - ")
    # if len(split_name) == 1, name and type are the same
    return split_name*2 if len(split_name) == 1 else split_name

all_obj_type_choices = [(c[0],
                         c[0],
                         {'datatype':c[1].keys()[0],
                          'datatype_value':c[1].values()[0]}
                         ) for c in get_object_types(False)]

def validate_and_add_new_handler_object(data, rowData, request, errors, row_counter,
                                        is_validate_only=False, is_sort_relationships=False,
                                        cache={}, obj=None):
    """
    Validate an object and then add it to the database.

    :param data: The data for the object.
    :type data: dict
    :param rowData: Data from the row if using mass object upload.
    :type rowData: dict
    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :param errors: List of existing errors to append to.
    :type errors: list
Example #16
0
File: views.py Project: 0x3a/crits
def add_new_object(request):
    """
    Add a new object.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    if request.method == 'POST':
        analyst = "%s" % request.user
        result = ""
        message = ""
        my_type = request.POST['otype']
        all_obj_type_choices = [(c[0],
                                 c[0],
                                 {'datatype':c[1].keys()[0],
                                  'datatype_value':c[1].values()[0]}
                                 ) for c in get_object_types(False)]
        form = AddObjectForm(analyst,
                             all_obj_type_choices,
                             request.POST,
                             request.FILES)
        if not form.is_valid() and not 'value' in request.FILES:
            message = "Invalid Form: %s" % form.errors
            form = form.as_table()
            response = json.dumps({'message': message,
                                   'form': form,
                                   'success': False})
            if request.is_ajax():
                return HttpResponse(response, mimetype="application/json")
            else:
                return render_to_response("file_upload_response.html",
                                          {'response':response},
                                          RequestContext(request))
        source = request.POST['source']
        oid = request.POST['oid']
        ot_array = request.POST['object_type'].split(" - ")
        object_type = ot_array[0]
        name = ot_array[1] if len(ot_array) == 2 else ot_array[0]
        method = request.POST['method']
        reference = request.POST['reference']
        add_indicator = request.POST.get('add_indicator', None)
        data = None
        # if it was a file upload, handle the file appropriately
        if 'value' in request.FILES:
            data = request.FILES['value']
        value = request.POST.get('value', None)
        if isinstance(value, basestring):
            value = value.strip()
        results = add_object(my_type,
                             oid,
                             object_type,
                             name,
                             source,
                             method,
                             reference,
                             analyst,
                             value=value,
                             file_=data,
                             add_indicator=add_indicator,
                             is_sort_relationships=True)
        if results['success']:
            subscription = {
                'type': my_type,
                'id': oid
            }

            if results.get('relationships', None):
                relationship = {'type': my_type,
                                'value': oid}
                relationships = results['relationships']

                html = render_to_string('objects_listing_widget.html',
                                        {'objects': results['objects'],
                                         'relationships': relationships,
                                         'subscription': subscription},
                                        RequestContext(request))
                result = {'success': True,
                          'html': html,
                          'message': results['message']}

                rel_msg  = render_to_string('relationships_listing_widget.html',
                                            {'relationship': relationship,
                                             'nohide': True,
                                             'relationships': relationships},
                                            RequestContext(request))
                result['rel_made'] = True
                result['rel_msg'] = rel_msg
            else:
                html = render_to_string('objects_listing_widget.html',
                                        {'objects': results['objects'],
                                         'subscription': subscription},
                                        RequestContext(request))
                result = {'success': True,
                          'html': html,
                          'message': results['message']}
        else:
            message = "Error adding object: %s" % results['message']
            result = {'success': False, 'message': message}
        if request.is_ajax():
            return HttpResponse(json.dumps(result),
                                mimetype="application/json")
        else:
            return render_to_response("file_upload_response.html",
                                      {'response': json.dumps(result)},
                                      RequestContext(request))
    else:
        error = "Expected POST"
        return render_to_response("error.html",
                                  {"error" : error },
                                  RequestContext(request))
Example #17
0
File: views.py Project: 0x3a/crits
def bulk_add_object_inline(request):
    """
    Bulk add objects inline.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """
    all_obj_type_choices = [(c[0], c[0], {'datatype':c[1].keys()[0],
                            'datatype_value':c[1].values()[0]}
                            ) for c in get_object_types(False, query={'datatype.file':{'$exists':0}})]

    formdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

    if request.method == "POST" and request.is_ajax():
        response = parse_bulk_upload(request, parse_row_to_bound_object_form, add_new_handler_object_via_bulk, formdict)

        secondary_data_array = response.get('secondary')
        if secondary_data_array:
            latest_secondary_data = secondary_data_array[-1]
            class_type = class_from_id(latest_secondary_data['type'], latest_secondary_data['id'])

            subscription = {'type': latest_secondary_data['type'],
                            'id': latest_secondary_data['id'],
                            'value': latest_secondary_data['id']}

            object_listing_html = render_to_string('objects_listing_widget.html',
                                                   {'objects': class_type.sort_objects(),
                                                    'subscription': subscription},
                                                   RequestContext(request))

            response['html'] = object_listing_html

            is_relationship_made = False
            for secondary_data in secondary_data_array:
                if secondary_data.get('relationships'):
                    is_relationship_made = True
                    break

            if is_relationship_made == True:
                rel_html = render_to_string('relationships_listing_widget.html',
                                            {'relationship': subscription,
                                             'relationships': class_type.sort_relationships(request.user, meta=True)},
                                            RequestContext(request))

                response['rel_msg'] = rel_html
                response['rel_made'] = True

        return HttpResponse(json.dumps(response,
                            default=json_handler),
                            mimetype='application/json')
    else:
        is_prevent_initial_table = request.GET.get('isPreventInitialTable', False)
        is_use_item_source = request.GET.get('useItemSource', False)

        if is_use_item_source == True or is_use_item_source == "true":
            otype = request.GET.get('otype')
            oid = request.GET.get('oid')

            # Get the item with the type and ID from the database
            obj = class_from_id(otype, oid)

            if obj:
                source_field_name = get_source_field_for_class(otype)
                if source_field_name:

                    # If the item has a source, then use the source value
                    # to set as the default source
                    if hasattr(obj, "source"):
                        source_field = get_field_from_label("source", formdict)
                        earliest_source = None
                        earliest_date = None

                        # Get the earliest source, compared by date
                        for source in obj.source:
                            for source_instance in source.instances:
                                if earliest_source == None or source_instance.date < earliest_date:
                                    earliest_date = source_instance.date
                                    earliest_source = source

                        if earliest_source:
                            source_field['initial'] = earliest_source.name

        return render_to_response('bulk_add_object_inline.html',
                                  {'formdict': formdict,
                                   'title': "Bulk Add Objects",
                                   'is_prevent_initial_table': is_prevent_initial_table,
                                   'table_name': 'object_inline'},
                                  RequestContext(request))
Example #18
0
def upload_indicator(request):
    """
    Upload new indicators (individual, blob, or CSV file).

    :param request: Django request object (Required)
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
              :class:`django.http.HttpResponseRedirect`
    """

    if request.method == "POST":
        username = request.user.username
        failed_msg = ''
        result = None

        if request.POST['svalue'] == "Upload CSV":
            form = UploadIndicatorCSVForm(username, request.POST,
                                          request.FILES)
            if form.is_valid():
                result = handle_indicator_csv(request.FILES['filedata'],
                                              request.POST['source'],
                                              request.POST['method'],
                                              request.POST['reference'],
                                              "file",
                                              username,
                                              add_domain=True)
                if result['success']:
                    message = {
                        'message':
                        ('<div>%s <a href="%s">Go to all indicators</a>'
                         '.</div>' %
                         (result['message'],
                          reverse('crits.indicators.views.indicators_listing'))
                         )
                    }
                else:
                    failed_msg = '<div>%s</div>' % result['message']

        if request.POST['svalue'] == "Upload Text":
            form = UploadIndicatorTextForm(username, request.POST)
            if form.is_valid():
                result = handle_indicator_csv(request.POST['data'],
                                              request.POST['source'],
                                              request.POST['method'],
                                              request.POST['reference'],
                                              "ti",
                                              username,
                                              add_domain=True)
                if result['success']:
                    message = {
                        'message':
                        ('<div>%s <a href="%s">Go to all indicators</a>'
                         '.</div>' %
                         (result['message'],
                          reverse('crits.indicators.views.indicators_listing'))
                         )
                    }
                else:
                    failed_msg = '<div>%s</div>' % result['message']

        if request.POST['svalue'] == "Upload Indicator":
            all_ind_type_choices = [(c[0], c[0], {
                'datatype': c[1].keys()[0],
                'datatype_value': c[1].values()[0]
            }) for c in get_object_types(
                active=False, query={'datatype.file': {
                    '$exists': 0
                }})]
            form = UploadIndicatorForm(username, all_ind_type_choices,
                                       request.POST)
            if form.is_valid():
                result = handle_indicator_ind(
                    request.POST['value'],
                    request.POST['source'],
                    request.POST['reference'],
                    request.POST['indicator_type'],
                    username,
                    request.POST['method'],
                    add_domain=True,
                    campaign=request.POST['campaign'],
                    campaign_confidence=request.POST['campaign_confidence'],
                    confidence=request.POST['confidence'],
                    impact=request.POST['impact'],
                    bucket_list=request.POST[
                        form_consts.Common.BUCKET_LIST_VARIABLE_NAME],
                    ticket=request.POST[
                        form_consts.Common.TICKET_VARIABLE_NAME])
                if result['success']:
                    indicator_link = '<a href=\"%s\">Go to this indicator</a> or <a href="%s">all indicators</a>.</div>' % (
                        reverse('crits.indicators.views.indicator',
                                args=[result['objectid']]),
                        reverse('crits.indicators.views.indicators_listing'))

                    if result.get('is_new_indicator', False) == False:
                        message = {
                            'message':
                            ('<div>Warning: Updated indicator since indicator already exists! '
                             + indicator_link)
                        }
                    else:
                        message = {
                            'message': ('<div>Indicator added successfully! ' +
                                        indicator_link)
                        }
                else:
                    failed_msg = result['message']

        if result == None or not result['success']:
            failed_msg += (
                '<a href="%s">Go to all indicators</a>'
                '.</div>' %
                reverse('crits.indicators.views.indicators_listing'))
            message = {'message': failed_msg, 'form': form.as_table()}
        elif result != None:
            message['success'] = result['success']

        if request.is_ajax():
            return HttpResponse(json.dumps(message),
                                mimetype="application/json")
        else:  #file upload
            return render_to_response('file_upload_response.html',
                                      {'response': json.dumps(message)},
                                      RequestContext(request))
Example #19
0
    Split the name and type into their separate parts.

    :param full_name: The full name of the ObjectType.
    :type full_name: str
    :returns: list of [<name>, <type>]
    """

    split_name = full_name.split(" - ")
    # if len(split_name) == 1, name and type are the same
    return split_name * 2 if len(split_name) == 1 else split_name


all_obj_type_choices = [(c[0], c[0], {
    'datatype': c[1].keys()[0],
    'datatype_value': c[1].values()[0]
}) for c in get_object_types(False)]


def validate_and_add_new_handler_object(data,
                                        rowData,
                                        request,
                                        errors,
                                        row_counter,
                                        is_validate_only=False,
                                        is_sort_relationships=False,
                                        cache={},
                                        obj=None):
    """
    Validate an object and then add it to the database.

    :param data: The data for the object.
Example #20
0
File: forms.py Project: 0x3a/crits
import re

from datetime import datetime
from django.conf import settings
from django import forms
from django.forms.util import ErrorList

from crits.campaigns.campaign import Campaign
from crits.core import form_consts
from crits.core.forms import add_bucketlist_to_form, add_ticket_to_form
from crits.core.widgets import CalWidget
from crits.core.handlers import get_source_names, get_item_names, get_object_types
from crits.core.user_tools import get_user_organization
from crits.domains.domain import Domain

ip_choices = [(c[0], c[0]) for c in get_object_types(active=False, query={'type':'Address', 'name':{'$in':['cidr', re.compile('^ipv')]}})]

class TLDUpdateForm(forms.Form):
    """
    Django form for updating TLD entries.
    """

    error_css_class = 'error'
    required_css_class = 'required'
    filedata = forms.FileField()

class AddDomainForm(forms.Form):
    """
    Django form for adding a domain.
    """
Example #21
0
def upload_indicator(request):
    """
    Upload new indicators (individual, blob, or CSV file).

    :param request: Django request object (Required)
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
              :class:`django.http.HttpResponseRedirect`
    """

    if request.method == "POST":
        username = request.user.username
        failed_msg = ''
        result = None;

        if request.POST['svalue'] == "Upload CSV":
            form = UploadIndicatorCSVForm(username,
                                          request.POST,
                                          request.FILES)
            if form.is_valid():
                result = handle_indicator_csv(request.FILES['filedata'],
                                              request.POST['source'],
                                              request.POST['method'],
                                              request.POST['reference'],
                                              "file",
                                              username,
                                              add_domain=True)
                if result['success']:
                    message = {'message': ('<div>%s <a href="%s">Go to all indicators</a>'
                                           '.</div>' % (result['message'],
                                           reverse('crits.indicators.views.indicators_listing')))}
                else:
                    failed_msg = '<div>%s</div>' % result['message']

        if request.POST['svalue'] == "Upload Text":
            form = UploadIndicatorTextForm(username,
                                           request.POST)
            if form.is_valid():
                result = handle_indicator_csv(request.POST['data'],
                                              request.POST['source'],
                                              request.POST['method'],
                                              request.POST['reference'],
                                              "ti",
                                              username,
                                              add_domain=True)
                if result['success']:
                    message = {'message': ('<div>%s <a href="%s">Go to all indicators</a>'
                                           '.</div>' % (result['message'],
                                           reverse('crits.indicators.views.indicators_listing')))}
                else:
                    failed_msg = '<div>%s</div>' % result['message']

        if request.POST['svalue'] == "Upload Indicator":
            all_ind_type_choices = [(c[0],
                                     c[0],
                                     {'datatype': c[1].keys()[0],
                                      'datatype_value': c[1].values()[0]}) for c in get_object_types(active=False, query={'datatype.file':{'$exists':0}})]
            form = UploadIndicatorForm(username,
                                       all_ind_type_choices,
                                       request.POST)
            if form.is_valid():
                result = handle_indicator_ind(request.POST['value'],
                                              request.POST['source'],
                                              request.POST['reference'],
                                              request.POST['indicator_type'],
                                              username,
                                              request.POST['method'],
                                              add_domain=True,
                                              campaign=request.POST['campaign'],
                                              campaign_confidence=request.POST['campaign_confidence'],
                                              confidence=request.POST['confidence'],
                                              impact=request.POST['impact'],
                                              bucket_list=request.POST[form_consts.Common.BUCKET_LIST_VARIABLE_NAME],
                                              ticket=request.POST[form_consts.Common.TICKET_VARIABLE_NAME])
                if result['success']:
                    indicator_link = '<a href=\"%s\">Go to this indicator</a> or <a href="%s">all indicators</a>.</div>' % (reverse('crits.indicators.views.indicator', args=[result['objectid']]), reverse('crits.indicators.views.indicators_listing'));

                    if result.get('is_new_indicator', False) == False:
                        message = {'message': ('<div>Warning: Updated indicator since indicator already exists! ' + indicator_link)}
                    else:
                        message = {'message': ('<div>Indicator added successfully! ' + indicator_link)}
                else:
                    failed_msg = result['message']

        if result == None or not result['success']:
            failed_msg += ('<a href="%s">Go to all indicators</a>'
                          '.</div>' % reverse('crits.indicators.views.indicators_listing'))
            message = {'message': failed_msg, 'form': form.as_table()}
        elif result != None:
            message['success'] = result['success']

        if request.is_ajax():
            return HttpResponse(json.dumps(message),
                                mimetype="application/json")
        else: #file upload
            return render_to_response('file_upload_response.html',
                                      {'response': json.dumps(message)},
                                      RequestContext(request))
Example #22
0
def bulk_add_object_inline(request):
    """
    Bulk add objects inline.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """
    all_obj_type_choices = [
        (c[0], c[0], {"datatype": c[1].keys()[0], "datatype_value": c[1].values()[0]})
        for c in get_object_types(False, query={"datatype.file": {"$exists": 0}})
    ]

    formdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

    if request.method == "POST" and request.is_ajax():
        response = parse_bulk_upload(request, parse_row_to_bound_object_form, add_new_handler_object_via_bulk, formdict)

        secondary_data_array = response.get("secondary")
        if secondary_data_array:
            latest_secondary_data = secondary_data_array[-1]
            class_type = class_from_id(latest_secondary_data["type"], latest_secondary_data["id"])

            subscription = {
                "type": latest_secondary_data["type"],
                "id": latest_secondary_data["id"],
                "value": latest_secondary_data["id"],
            }

            object_listing_html = render_to_string(
                "objects_listing_widget.html",
                {"objects": class_type.sort_objects(), "subscription": subscription},
                RequestContext(request),
            )

            response["html"] = object_listing_html

            is_relationship_made = False
            for secondary_data in secondary_data_array:
                if secondary_data.get("relationships"):
                    is_relationship_made = True
                    break

            if is_relationship_made == True:
                rel_html = render_to_string(
                    "relationships_listing_widget.html",
                    {
                        "relationship": subscription,
                        "relationships": class_type.sort_relationships(request.user, meta=True),
                    },
                    RequestContext(request),
                )

                response["rel_msg"] = rel_html
                response["rel_made"] = True

        return HttpResponse(json.dumps(response, default=json_handler), mimetype="application/json")
    else:
        is_prevent_initial_table = request.GET.get("isPreventInitialTable", False)
        is_use_item_source = request.GET.get("useItemSource", False)

        if is_use_item_source == True or is_use_item_source == "true":
            otype = request.GET.get("otype")
            oid = request.GET.get("oid")

            # Get the item with the type and ID from the database
            obj = class_from_id(otype, oid)

            if obj:
                source_field_name = get_source_field_for_class(otype)
                if source_field_name:

                    # If the item has a source, then use the source value
                    # to set as the default source
                    if hasattr(obj, "source"):
                        source_field = get_field_from_label("source", formdict)
                        earliest_source = None
                        earliest_date = None

                        # Get the earliest source, compared by date
                        for source in obj.source:
                            for source_instance in source.instances:
                                if earliest_source == None or source_instance.date < earliest_date:
                                    earliest_date = source_instance.date
                                    earliest_source = source

                        if earliest_source:
                            source_field["initial"] = earliest_source.name

        return render_to_response(
            "bulk_add_object_inline.html",
            {
                "formdict": formdict,
                "title": "Bulk Add Objects",
                "is_prevent_initial_table": is_prevent_initial_table,
                "table_name": "object_inline",
            },
            RequestContext(request),
        )
Example #23
0
def add_new_object(request):
    """
    Add a new object.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """

    if request.method == "POST":
        analyst = "%s" % request.user
        result = ""
        message = ""
        my_type = request.POST["otype"]
        all_obj_type_choices = [
            (c[0], c[0], {"datatype": c[1].keys()[0], "datatype_value": c[1].values()[0]})
            for c in get_object_types(False)
        ]
        form = AddObjectForm(analyst, all_obj_type_choices, request.POST, request.FILES)
        if not form.is_valid() and not "value" in request.FILES:
            message = "Invalid Form: %s" % form.errors
            form = form.as_table()
            response = json.dumps({"message": message, "form": form, "success": False})
            if request.is_ajax():
                return HttpResponse(response, mimetype="application/json")
            else:
                return render_to_response("file_upload_response.html", {"response": response}, RequestContext(request))
        source = request.POST["source"]
        oid = request.POST["oid"]
        ot_array = request.POST["object_type"].split(" - ")
        object_type = ot_array[0]
        name = ot_array[1] if len(ot_array) == 2 else ot_array[0]
        method = request.POST["method"]
        reference = request.POST["reference"]
        add_indicator = request.POST.get("add_indicator", None)
        data = None
        # if it was a file upload, handle the file appropriately
        if "value" in request.FILES:
            data = request.FILES["value"]
        value = request.POST.get("value", None)
        if isinstance(value, basestring):
            value = value.strip()
        results = add_object(
            my_type,
            oid,
            object_type,
            name,
            source,
            method,
            reference,
            analyst,
            value=value,
            file_=data,
            add_indicator=add_indicator,
            is_sort_relationships=True,
        )
        if results["success"]:
            subscription = {"type": my_type, "id": oid}

            if results.get("relationships", None):
                relationship = {"type": my_type, "value": oid}
                relationships = results["relationships"]

                html = render_to_string(
                    "objects_listing_widget.html",
                    {"objects": results["objects"], "relationships": relationships, "subscription": subscription},
                    RequestContext(request),
                )
                result = {"success": True, "html": html, "message": results["message"]}

                rel_msg = render_to_string(
                    "relationships_listing_widget.html",
                    {"relationship": relationship, "nohide": True, "relationships": relationships},
                    RequestContext(request),
                )
                result["rel_made"] = True
                result["rel_msg"] = rel_msg
            else:
                html = render_to_string(
                    "objects_listing_widget.html",
                    {"objects": results["objects"], "subscription": subscription},
                    RequestContext(request),
                )
                result = {"success": True, "html": html, "message": results["message"]}
        else:
            message = "Error adding object: %s" % results["message"]
            result = {"success": False, "message": message}
        if request.is_ajax():
            return HttpResponse(json.dumps(result), mimetype="application/json")
        else:
            return render_to_response(
                "file_upload_response.html", {"response": json.dumps(result)}, RequestContext(request)
            )
    else:
        error = "Expected POST"
        return render_to_response("error.html", {"error": error}, RequestContext(request))
Example #24
0
def bulk_add_object_inline(request):
    """
    Bulk add objects inline.

    :param request: The Django request.
    :type request: :class:`django.http.HttpRequest`
    :returns: :class:`django.http.HttpResponse`
    """
    all_obj_type_choices = [(c[0], c[0], {'datatype':c[1].keys()[0],
                            'datatype_value':c[1].values()[0]}
                            ) for c in get_object_types(False, query={'datatype.file':{'$exists':0}})]

    formdict = form_to_dict(AddObjectForm(request.user, all_obj_type_choices))

    if request.method == "POST" and request.is_ajax():
        response = parse_bulk_upload(request, parse_row_to_bound_object_form, add_new_handler_object_via_bulk, formdict)

        secondary_data_array = response.get('secondary')
        if secondary_data_array:
            latest_secondary_data = secondary_data_array[-1]
            class_type = class_from_id(latest_secondary_data['type'], latest_secondary_data['id'])

            subscription = {'type': latest_secondary_data['type'],
                            'id': latest_secondary_data['id'],
                            'value': latest_secondary_data['id']}

            object_listing_html = render_to_string('objects_listing_widget.html',
                                                   {'objects': class_type.sort_objects(),
                                                    'subscription': subscription},
                                                   RequestContext(request))

            response['html'] = object_listing_html

            is_relationship_made = False
            for secondary_data in secondary_data_array:
                if secondary_data.get('relationships'):
                    is_relationship_made = True
                    break

            if is_relationship_made == True:
                rel_html = render_to_string('relationships_listing_widget.html',
                                            {'relationship': subscription,
                                             'relationships': class_type.sort_relationships(request.user, meta=True)},
                                            RequestContext(request))

                response['rel_msg'] = rel_html
                response['rel_made'] = True

        return HttpResponse(json.dumps(response,
                            default=json_handler),
                            mimetype='application/json')
    else:
        is_prevent_initial_table = request.GET.get('isPreventInitialTable', False)
        is_use_item_source = request.GET.get('useItemSource', False)

        if is_use_item_source == True or is_use_item_source == "true":
            otype = request.GET.get('otype')
            oid = request.GET.get('oid')

            # Get the item with the type and ID from the database
            obj = class_from_id(otype, oid)


            if obj:
                source_field_name = get_source_field_for_class(otype)
                if source_field_name:

                    # If the item has a source, then use the source value
                    # to set as the default source
                    if hasattr(obj, "source"):
                        source_field = get_field_from_label("source", formdict)
                        earliest_source = None
                        earliest_date = None

                        # Get the earliest source, compared by date
                        for source in obj.source:
                            for source_instance in source.instances:
                                if earliest_source == None or source_instance.date < earliest_date:
                                    earliest_date = source_instance.date
                                    earliest_source = source

                        if earliest_source:
                            source_field['initial'] = earliest_source.name

        return render_to_response('bulk_add_object_inline.html',
                                  {'formdict': formdict,
                                   'title': "Bulk Add Objects",
                                   'is_prevent_initial_table': is_prevent_initial_table,
                                   'table_name': 'object_inline'},
                                  RequestContext(request))