Beispiel #1
0
def ui_yara():
    """
    Yara signatures view.
    """
    create_yara_form = YaraForm()
    change_tlp_level_form = ChangeTLPForm()
    rename_yara_form = RenameForm()

    if create_yara_form.validate_on_submit():
        ret = api.yaracontrol.create(
            create_yara_form.yara_name.data,
            create_yara_form.yara_raw.data,
            create_yara_form.yara_tlp.data)
        if ret is None:
            flash("Error during yara creation", "error")
        else:
            flash("Created yara " + ret.name, "success")
    elif change_tlp_level_form.validate_on_submit():
        if change_tlp_level_form.item_id:
            yar = api.get_elem_by_type("yara",
                                       change_tlp_level_form.item_id.data)
            api.yaracontrol.set_tlp_level(
                change_tlp_level_form.level.data, yar)
    elif rename_yara_form.validate_on_submit():
        if rename_yara_form.item_id:
            yar = api.get_elem_by_type("yara",
                                       rename_yara_form.item_id.data)
            api.yaracontrol.rename(rename_yara_form.newname.data, yar)

    yaras = api.yaracontrol.get_all()
    return render_template("signatures.html",
                           myyaras=yaras,
                           changetlpform=change_tlp_level_form,
                           renameform=rename_yara_form,
                           yaraform=create_yara_form)
Beispiel #2
0
def ui_yara():
    """
    Yara signatures view.
    """
    create_yara_form = YaraForm()
    change_tlp_level_form = ChangeTLPForm()
    rename_yara_form = RenameForm()

    if create_yara_form.validate_on_submit():
        ret = api.yaracontrol.create(
            create_yara_form.yara_name.data,
            create_yara_form.yara_raw.data,
            create_yara_form.yara_tlp.data)
        if ret is None:
            flash("Error during yara creation", "error")
        else:
            flash("Created yara " + ret.name, "success")
    elif change_tlp_level_form.validate_on_submit():
        if change_tlp_level_form.item_id:
            yar = api.get_elem_by_type("yara",
                                       change_tlp_level_form.item_id.data)
            api.yaracontrol.set_tlp_level(
                change_tlp_level_form.level.data, yar)
    elif rename_yara_form.validate_on_submit():
        if rename_yara_form.item_id:
            yar = api.get_elem_by_type("yara",
                                       rename_yara_form.item_id.data)
            api.yaracontrol.rename(rename_yara_form.newname.data, yar)

    yaras = api.yaracontrol.get_all()
    return render_template("signatures.html",
                           myyaras=yaras,
                           changetlpform=change_tlp_level_form,
                           renameform=rename_yara_form,
                           yaraform=create_yara_form)
Beispiel #3
0
def diff_samples(sample_id, sample2_id):
    """
    Diff two samples using MACHOC. Maybe we could move this view in the sample
    view, just as we did for the disassemble view?
    """
    sample1 = api.get_elem_by_type("sample", sample_id)
    sample2 = api.get_elem_by_type("sample", sample2_id)
    sdiff = []
    # POST request means that the samples names sharing has been submitted.
    if request.method == "POST":
        if not request.form.getlist("selectl"):
            abort(500)
        items = []
        for i in request.form.getlist("selectl"):
            n = i.split("_")
            if len(n) == 2:
                items.append((n[0], n[1]))
        if not api.samplecontrol.sample_rename_from_diff(
                items, sample1, sample2):
            abort(500)
        if not api.add_actions_fromfunc_infos(items, sample1, sample2):
            abort(500)
        return redirect("/sample/" + str(sample1.id) + "#poli_infos")
    else:
        sdiff = api.samplecontrol.machoc_get_similar_functions(
            sample1, sample2)
    return render_template("diff.html",
                           sample1=sample1,
                           sample2=sample2,
                           sdiff=sdiff)
Beispiel #4
0
def diff_samples(sample_id, sample2_id):
    """
    Diff two samples using MACHOC. Maybe we could move this view in the sample
    view, just as we did for the disassemble view?
    """
    sample1 = api.get_elem_by_type("sample", sample_id)
    sample2 = api.get_elem_by_type("sample", sample2_id)
    sdiff = []
    # POST request means that the samples names sharing has been submitted.
    if request.method == "POST":
        if not request.form.getlist("selectl"):
            abort(500)
        items = []
        for i in request.form.getlist("selectl"):
            n = i.split("_")
            if len(n) == 2:
                items.append((n[0], n[1]))
        if not api.samplecontrol.sample_rename_from_diff(
                items, sample1, sample2):
            abort(500)
        if not api.add_actions_fromfunc_infos(items, sample1, sample2):
            abort(500)
        return redirect("/sample/" + str(sample1.id) + "#poli_infos")
    else:
        sdiff = api.samplecontrol.machoc_get_similar_functions(
            sample1, sample2)
    return render_template("diff.html",
                           sample1=sample1,
                           sample2=sample2,
                           sdiff=sdiff)
Beispiel #5
0
def delete_family_item(family_id, item_id):
    """
    Delete a family detection item.
    """
    family = api.get_elem_by_type("family", family_id)
    detection_item = api.get_elem_by_type("detection_item", item_id)
    api.familycontrol.delete_detection_item(detection_item)
    return redirect(url_for('webuiview.view_family', family_id=family.id))
Beispiel #6
0
def delete_family_file(family_id, file_id):
    """
    Delete a family attached file.
    """
    family = api.get_elem_by_type("family", family_id)
    attachment = api.get_elem_by_type("family_file", file_id)
    api.familycontrol.delete_file(attachment)
    return redirect(url_for('webuiview.view_family', family_id=family.id))
Beispiel #7
0
def ui_sample_remove_family(sample_id, family_id):
    """
    Add or remove the current user to the sample's users.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    family = api.get_elem_by_type("family", family_id)
    api.familycontrol.remove_sample(sample, family)
    return redirect(url_for('view_sample', sample_id=sample_id))
Beispiel #8
0
def check_field(sample_id, checklist_id):
    """
    Check or uncheck a checklist element.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    checklist = api.get_elem_by_type("checklist", checklist_id)
    api.samplecontrol.toggle_sample_checklist(sample, checklist)
    return redirect(url_for('webuiview.view_sample', sample_id=sample_id))
Beispiel #9
0
def delete_family_file(family_id, file_id):
    """
    Delete a family attached file.
    """
    family = api.get_elem_by_type("family", family_id)
    attachment = api.get_elem_by_type("family_file", file_id)
    api.familycontrol.delete_file(attachment)
    return redirect(url_for('view_family', family_id=family.id))
Beispiel #10
0
def delete_family_item(family_id, item_id):
    """
    Delete a family detection item.
    """
    family = api.get_elem_by_type("family", family_id)
    detection_item = api.get_elem_by_type("detection_item", item_id)
    api.familycontrol.delete_detection_item(detection_item)
    return redirect(url_for('view_family', family_id=family.id))
Beispiel #11
0
def check_field(sample_id, checklist_id):
    """
    Check or uncheck a checklist element.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    checklist = api.get_elem_by_type("checklist", checklist_id)
    api.samplecontrol.toggle_sample_checklist(sample, checklist)
    return redirect(url_for('view_sample', sample_id=sample_id))
Beispiel #12
0
def ui_sample_remove_family(sample_id, family_id):
    """
    Add or remove the current user to the sample's users.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    family = api.get_elem_by_type("family", family_id)
    api.familycontrol.remove_sample(sample, family)
    return redirect(url_for('webuiview.view_sample', sample_id=sample_id))
Beispiel #13
0
def delete_yara_family(family_id, yara_id):
    """
    Deletes an associated yara rule.
    """
    family = api.get_elem_by_type("family", family_id)
    yar = api.get_elem_by_type("yara", yara_id)
    api.yaracontrol.remove_from_family(family, yar)
    flash("Removed yara %s from family %s" % (yar.name, family.name),
          "success")
    return redirect(url_for("view_family", family_id=family_id))
Beispiel #14
0
def delete_yara_family(family_id, yara_id):
    """
    Deletes an associated yara rule.
    """
    family = api.get_elem_by_type("family", family_id)
    yar = api.get_elem_by_type("yara", yara_id)
    api.yaracontrol.remove_from_family(family, yar)
    flash("Removed yara %s from family %s" % (yar.name, family.name),
          "success")
    return redirect(url_for('webuiview.view_family', family_id=family_id))
Beispiel #15
0
def api_family_export_detection_openioc(family_id, tlp_level):
    """
        This endpoint format should be reimplemented
    """
    my_family = api.get_elem_by_type("family", family_id)
    return plain_text(
        api.familycontrol.export_detection_openioc(my_family, tlp_level))
Beispiel #16
0
def api_family_export_detection_yara(family_id, tlp_level):
    """
        This endpoint is ugly, should replace with tlp in argument
    """
    my_family = api.get_elem_by_type("family", family_id)
    return plain_text(
        api.familycontrol.export_yara_ruleset(my_family, tlp_level))
Beispiel #17
0
def api_get_sample_abstract(sid):
    """
        Returns the raw markdown sample abstract
    """
    sample = api.get_elem_by_type("sample", sid)
    result = sample.abstract
    return jsonify({'abstract': result})
Beispiel #18
0
def api_get_yara_matches(sid):
    """
        TODO : Get yara matches
    """
    sample = api.get_elem_by_type("sample", sid)
    result = None
    return jsonify({'result': result})
Beispiel #19
0
def api_get_sample_abstract(sid):
    """
        Returns the raw markdown sample abstract
    """
    sample = api.get_elem_by_type("sample", sid)
    result = sample.abstract
    return jsonify({'abstract': result})
Beispiel #20
0
def api_post_sample_family(sid):
    samp = api.get_elem_by_type("sample", sid)
    if request.json is None:
        abort(400, "JSON not provided")
    fam = None
    if "family_id" in request.json.keys():
        fid = request.json['family_id']
        fam = api.get_elem_by_type("family", fid)
    elif "family_name" in request.json.keys():
        fname = request.json['family_name']
        fam = api.familycontrol.get_by_name(fname)
    else:
        return jsonify({'result': False})
    result = api.familycontrol.add_sample(samp, fam)

    return jsonify({'result': result})
Beispiel #21
0
def api_family_export_sampleszip(family_id, tlp_level):
    my_family = api.get_elem_by_type("family", family_id)
    zpath = api.familycontrol.generate_samples_zip_file(my_family, tlp_level)
    if zpath is None:
        return ""
    return send_file("../" + zpath, as_attachment=True,
                     attachment_filename="export.tar.gz")
Beispiel #22
0
def api_get_yara_matches(sid):
    """
        TODO : Get yara matches
    """
    sample = api.get_elem_by_type("sample", sid)
    result = None
    return jsonify({'result': result})
Beispiel #23
0
def api_post_sample_family(sid):
    samp = api.get_elem_by_type("sample", sid)
    if request.json is None:
        abort(400, "JSON not provided")
    fam = None
    if "family_id" in request.json.keys():
        fid = request.json['family_id']
        fam = api.get_elem_by_type("family", fid)
    elif "family_name" in request.json.keys():
        fname = request.json['family_name']
        fam = api.familycontrol.get_by_name(fname)
    else:
        return jsonify({'result': False})
    result = api.familycontrol.add_sample(samp, fam)

    return jsonify({'result': result})
Beispiel #24
0
def ui_sample_upload():
    """
    Sample creation from binary file.
    """
    upload_form = UploadSampleForm()
    families_choices = [(0, "None")]
    families_choices += [(f.id, f.name) for f in Family.query.order_by('name')]
    upload_form.family.choices = families_choices

    if upload_form.validate_on_submit():
        family_id = upload_form.family.data
        zipflag = upload_form.zipflag.data
        family = None
        if family_id != 0:
            family = api.get_elem_by_type("family", family_id)

        for mfile in upload_form.files.raw_data:
            file_data = mfile.stream
            file_name = secure_filename(mfile.filename)

            samples = api.dispatch_sample_creation(
                file_data,
                file_name,
                g.user,
                upload_form.level.data,
                family,
                zipflag)
            if not samples:
                flash("Error during sample creation", "error")
            else:
                for sample in samples:
                    flash("Created sample " + str(sample.id), "success")
    return redirect(url_for('webuiview.index'))
Beispiel #25
0
def delete_sample(sample_id):
    """
    Delete from DB.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    api.samplecontrol.delete(sample)
    return redirect(url_for('webuiview.index'))
Beispiel #26
0
def delete_sample(sample_id):
    """
    Delete from DB.
    """
    sample = api.get_elem_by_type("sample", sample_id)
    api.samplecontrol.delete(sample)
    return redirect(url_for('index'))
Beispiel #27
0
def ui_sample_upload():
    """
    Sample creation from binary file.
    """
    upload_form = UploadSampleForm()
    families_choices = [(0, "None")]
    families_choices += [(f.id, f.name) for f in Family.query.order_by('name')]
    upload_form.family.choices = families_choices

    if upload_form.validate_on_submit():
        family_id = upload_form.family.data
        zipflag = upload_form.zipflag.data
        family = None
        if family_id != 0:
            family = api.get_elem_by_type("family", family_id)

        for mfile in upload_form.files.raw_data:
            file_data = mfile.stream
            file_name = secure_filename(mfile.filename)

            samples = api.dispatch_sample_creation(
                file_data,
                file_name,
                g.user,
                upload_form.level.data,
                family,
                zipflag)
            if len(samples) == 0:
                flash("Error during sample creation", "error")
            else:
                for sample in samples:
                    flash("Created sample " + str(sample.id), "success")
    return redirect(url_for('index'))
Beispiel #28
0
def api_get_family_by_id(fid):
    """
        Get family informations
    """
    fam = api.get_elem_by_type("family", fid)
    schema = FamilySchema()
    result = schema.dump(fam).data
    return jsonify({"family": result})
Beispiel #29
0
def api_suggest_func_names(sid):
    """
        Returns a dictionary containing proposed function names
        based on machoc matches.
    """
    sample = api.get_elem_by_type("sample", sid)
    proposed_funcs = api.samplecontrol.get_proposed_funcnames(sample)
    return jsonify({'functions': proposed_funcs})
Beispiel #30
0
def api_suggest_func_names(sid):
    """
        Returns a dictionary containing proposed function names
        based on machoc matches.
    """
    sample = api.get_elem_by_type("sample", sid)
    proposed_funcs = api.samplecontrol.get_proposed_funcnames(sample)
    return jsonify({'functions': proposed_funcs})
Beispiel #31
0
def ui_delete_yara(sig_id):
    """
    Delete YARA rule.
    """
    yar = api.get_elem_by_type("yara", sig_id)
    name = yar.name
    api.yaracontrol.delete(yar)
    flash("Deleted rule " + name, "success")
    return redirect(url_for('webuiview.ui_yara'))
Beispiel #32
0
def api_get_sample_file(sid):
    """
        Return the sample binary
    """
    sample = api.get_elem_by_type("sample", sid)
    data_file = sample.storage_file
    return send_file('../' + data_file,
                     as_attachment=True,
                     attachment_filename=os.path.basename(data_file))
Beispiel #33
0
def api_get_sample_file(sid):
    """
        Return the sample binary
    """
    sample = api.get_elem_by_type("sample", sid)
    data_file = sample.storage_file
    return send_file('../' + data_file,
                     as_attachment=True,
                     attachment_filename=os.path.basename(data_file))
Beispiel #34
0
def ui_delete_yara(sig_id):
    """
    Delete YARA rule.
    """
    yar = api.get_elem_by_type("yara", sig_id)
    name = yar.name
    api.yaracontrol.delete(yar)
    flash("Deleted rule " + name, "success")
    return redirect(url_for('ui_yara'))
Beispiel #35
0
def gen_sample_view(sample_id, graph=None, fctaddr=None):
    """
    Generates a sample's view (template). We split the view because of the
    disassembly view, which is directly included in the sample's view, but
    not "by default".
    """
    sample = api.get_elem_by_type("sample", sample_id)
    machex_export_form = ExportMachexForm(sampleid=sample.id)
    set_sample_abstract_form = SampleAbstractForm()
    add_family_form = AddSampleToFamilyForm()
    families_choices = [(f.id, f.name) for f in Family.query.order_by('name')]
    add_family_form.parentfamily.choices = families_choices
    change_tlp_level_form = ChangeTLPForm()
    machoc_form = CompareMachocForm()

    if add_family_form.validate_on_submit():
        family_id = add_family_form.parentfamily.data
        family = api.get_elem_by_type("family", family_id)
        api.familycontrol.add_sample(sample, family)
    if set_sample_abstract_form.validate_on_submit():
        abstract = set_sample_abstract_form.abstract.data
        api.samplecontrol.set_abstract(sample, abstract)
    elif sample.abstract is not None:
        set_sample_abstract_form.abstract.default = sample.abstract
        set_sample_abstract_form.abstract.data = sample.abstract
    if change_tlp_level_form.validate_on_submit():
        level = change_tlp_level_form.level.data
        api.samplecontrol.set_tlp_level(sample, level)
    machoc_comparison_results = None
    if machoc_form.validate_on_submit():
        machoc_comparison_results = parse_machoc_form(sample, machoc_form)

    return render_template("sample.html",
                           sample=sample,
                           abstractform=set_sample_abstract_form,
                           checklists=api.samplecontrol.get_all_checklists(),
                           changetlpform=change_tlp_level_form,
                           compareform=machoc_form,
                           expform=machex_export_form,
                           hresults=machoc_comparison_results,
                           addfamilyform=add_family_form,
                           graph=graph,
                           fctaddr=fctaddr)
Beispiel #36
0
def gen_sample_view(sample_id, graph=None, fctaddr=None):
    """
    Generates a sample's view (template). We split the view because of the
    disassembly view, which is directly included in the sample's view, but
    not "by default".
    """
    sample = api.get_elem_by_type("sample", sample_id)
    machex_export_form = ExportMachexForm(sampleid=sample.id)
    set_sample_abstract_form = SampleAbstractForm()
    add_family_form = AddSampleToFamilyForm()
    families_choices = [(f.id, f.name) for f in Family.query.order_by('name')]
    add_family_form.parentfamily.choices = families_choices
    change_tlp_level_form = ChangeTLPForm()
    machoc_form = CompareMachocForm()

    if add_family_form.validate_on_submit():
        family_id = add_family_form.parentfamily.data
        family = api.get_elem_by_type("family", family_id)
        api.familycontrol.add_sample(sample, family)
    if set_sample_abstract_form.validate_on_submit():
        abstract = set_sample_abstract_form.abstract.data
        api.samplecontrol.set_abstract(sample, abstract)
    elif sample.abstract is not None:
        set_sample_abstract_form.abstract.default = sample.abstract
        set_sample_abstract_form.abstract.data = sample.abstract
    if change_tlp_level_form.validate_on_submit():
        level = change_tlp_level_form.level.data
        api.samplecontrol.set_tlp_level(sample, level)
    machoc_comparison_results = None
    if machoc_form.validate_on_submit():
        machoc_comparison_results = parse_machoc_form(sample, machoc_form)

    return render_template("sample.html",
                           sample=sample,
                           abstractform=set_sample_abstract_form,
                           checklists=api.samplecontrol.get_all_checklists(),
                           changetlpform=change_tlp_level_form,
                           compareform=machoc_form,
                           expform=machex_export_form,
                           hresults=machoc_comparison_results,
                           addfamilyform=add_family_form,
                           graph=graph,
                           fctaddr=fctaddr)
Beispiel #37
0
def api_set_sample_abstract(sid):
    """
        @arg: abstract Markdown for the abstract
    """
    data = request.json
    if data is None or 'abstract' not in data.keys():
        abort(400, 'Invalid JSON data provided')
    abstract = data['abstract']
    samp = api.get_elem_by_type("sample", sid)
    result = api.samplecontrol.set_abstract(samp, abstract)
    return jsonify({'result': result})
Beispiel #38
0
def download_family_file(family_id, file_id):
    """
    Family attachment download endpoint.
    """
    attachment = api.get_elem_by_type("family_file", file_id)
    data_file = attachment.filepath
    if not os.path.exists(data_file):
        abort(404)
    return send_file('../' + data_file,
                     as_attachment=True,
                     attachment_filename=os.path.basename(data_file))
Beispiel #39
0
def api_set_sample_abstract(sid):
    """
        @arg: abstract Markdown for the abstract
    """
    data = request.json
    if data is None or 'abstract' not in data.keys():
        abort(400, 'Invalid JSON data provided')
    abstract = data['abstract']
    samp = api.get_elem_by_type("sample", sid)
    result = api.samplecontrol.set_abstract(samp, abstract)
    return jsonify({'result': result})
Beispiel #40
0
def delete_family(family_id):
    """
    Delete a family.
    """
    family = api.get_elem_by_type("family", family_id)
    parentfamily = None
    parentfamily = family.parents
    api.familycontrol.delete(family)
    flash("Deleted family", "success")
    if parentfamily is not None:
        return redirect(url_for('view_family', family_id=parentfamily.id))
    return redirect(url_for('view_families'))
Beispiel #41
0
def delete_family(family_id):
    """
    Delete a family.
    """
    family = api.get_elem_by_type("family", family_id)
    parentfamily = None
    parentfamily = family.parents
    api.familycontrol.delete(family)
    flash("Deleted family", "success")
    if parentfamily is not None:
        return redirect(url_for('webuiview.view_family',
                                family_id=parentfamily.id))
    return redirect(url_for('webuiview.view_families'))
Beispiel #42
0
def api_add_yara_to_family(fid):
    """
        Add a yara rule to a family
    """
    family = api.get_elem_by_type("family", fid)
    try:
        rule_name = request.json["rule_name"]
        rule = api.yaracontrol.get_by_name(rule_name)
        if rule is None:
            raise KeyError
        result = api.yaracontrol.add_to_family(family, rule)
    except KeyError:
        abort(400, "Unknown yara")
    return jsonify({"result": result})
Beispiel #43
0
def api_set_family_abstract(fid):
    """
        @arg abstract: The family abstract
    """
    if request.json is None:
        abort(400, "Missing JSON data")

    try:
        family = api.get_elem_by_type("family", fid)
        abstract = request.json["abstract"]
        result = api.familycontrol.set_abstract(family, abstract)
        return jsonify({"result": result})

    except KeyError:
        abort(400, "Missing abstract data")
Beispiel #44
0
def machexport(sample_id):
    """
    Machex export form handling.
    """
    machex_export_form = ExportMachexForm()
    sample = api.get_elem_by_type("sample", sample_id)
    if machex_export_form.validate_on_submit():
        fnamexp = False
        fmachexp = False
        fstringexp = False
        fmeta = False
        aabstract = False
        sabstract = False
        fullmachoc = False
        if machex_export_form.machocfull.data:
            fullmachoc = True
        if machex_export_form.estrings.data:
            fstringexp = True
        if machex_export_form.metadata.data:
            fmeta = True
        if machex_export_form.fnames.data:
            fnamexp = True
        if machex_export_form.fmachoc.data:
            fmachexp = True
        if machex_export_form.abstracts.data:
            sabstract = True
        if machex_export_form.analysis_data.data:
            aabstract = True
        retv = api.samplecontrol.machexport(sample,
                                            machocfull=fullmachoc,
                                            strings=fstringexp,
                                            metadata=fmeta,
                                            fmachoc=fmachexp,
                                            fname=fnamexp,
                                            sabstract=sabstract,
                                            aabstracts=aabstract)
        return jsonify(retv)
    return abort(400)
Beispiel #45
0
def machexport(sample_id):
    """
    Machex export form handling.
    """
    machex_export_form = ExportMachexForm()
    sample = api.get_elem_by_type("sample", sample_id)
    if machex_export_form.validate_on_submit():
        fnamexp = False
        fmachexp = False
        fstringexp = False
        fmeta = False
        aabstract = False
        sabstract = False
        fullmachoc = False
        if machex_export_form.machocfull.data:
            fullmachoc = True
        if machex_export_form.estrings.data:
            fstringexp = True
        if machex_export_form.metadata.data:
            fmeta = True
        if machex_export_form.fnames.data:
            fnamexp = True
        if machex_export_form.fmachoc.data:
            fmachexp = True
        if machex_export_form.abstracts.data:
            sabstract = True
        if machex_export_form.analysis_data.data:
            aabstract = True
        retv = api.samplecontrol.machexport(sample,
                                            machocfull=fullmachoc,
                                            strings=fstringexp,
                                            metadata=fmeta,
                                            fmachoc=fmachexp,
                                            fname=fnamexp,
                                            sabstract=sabstract,
                                            aabstracts=aabstract)
        return jsonify(retv)
    return abort(400)
Beispiel #46
0
def view_family(family_id):
    """
    Family view and forms handling.
    """
    family = api.get_elem_by_type("family", family_id)

    family_users = api.familycontrol.get_users_for_family(family)
    export_form = ExportFamilyForm()
    add_subfamily_form = AddSubFamilyForm()
    add_yara_form = AddYaraToFamilyForm()
    yara_choices = [(f.id, f.name) for f in YaraRule.query.order_by(
        'name') if f not in family.yaras]
    add_yara_form.yaraid.choices = yara_choices
    family_abstract_form = FamilyAbstractForm()
    add_detection_item_form = CreateDetectionItemForm()
    change_status_form = ChangeStatusForm()
    change_tlp_form = ChangeTLPForm()
    add_attachment_form = UploadFamilyFileForm()

    if add_subfamily_form.validate_on_submit():
        newname = add_subfamily_form.familyname.data
        newname = family.name + "." + newname
        fid = api.familycontrol.create(name=newname, parentfamily=family)
        if not fid:
            abort(500)

    if export_form.validate_on_submit():
        family_manage_export_form(family.id, export_form)
    if add_yara_form.validate_on_submit():
        yar = api.get_elem_by_type("yara", add_yara_form.yaraid.data)
        api.yaracontrol.add_to_family(family, yar)
    if family_abstract_form.validate_on_submit():
        abstract = family_abstract_form.abstract.data
        api.familycontrol.set_abstract(family, abstract)
    elif family.abstract is not None:
        family_abstract_form.abstract.default = family.abstract
        family_abstract_form.abstract.data = family.abstract
    if change_tlp_form.validate_on_submit():
        level = change_tlp_form.level.data
        api.familycontrol.set_tlp_level(family, level)
    if change_status_form.validate_on_submit():
        status = change_status_form.newstatus.data
        api.familycontrol.set_status(family, status)
    if add_detection_item_form.validate_on_submit():
        api.familycontrol.create_detection_item(
            add_detection_item_form.item_abstract.data,
            add_detection_item_form.name.data,
            add_detection_item_form.tlp_level.data,
            add_detection_item_form.item_type.data,
            family)
    if add_attachment_form.validate_on_submit():
        data = add_attachment_form.file.data.read()
        fname = secure_filename(add_attachment_form.file.data.filename)
        api.familycontrol.add_file(data,
                                   fname,
                                   add_attachment_form.description.data,
                                   add_attachment_form.level.data,
                                   family)

    return render_template("family.html",
                           family=family,
                           expform=export_form,
                           addsubfamform=add_subfamily_form,
                           uploadform=add_attachment_form,
                           abstractform=family_abstract_form,
                           createdetectionitemform=add_detection_item_form,
                           changestatusform=change_status_form,
                           changetlpform=change_tlp_form,
                           famusers=family_users,
                           yaraform=add_yara_form)
Beispiel #47
0
def api_family_export_samplesioc(family_id, tlp_level):
    my_family = api.get_elem_by_type("family", family_id)
    return plain_text(
        api.familycontrol.export_samplesioc(my_family, tlp_level))
Beispiel #48
0
def api_family_export_detection_custom_elements(family_id, tlp_level):
    my_family = api.get_elem_by_type("family", family_id)
    return plain_text(
        api.familycontrol.export_detection_custom(my_family, tlp_level))
Beispiel #49
0
def view_family(family_id):
    """
    Family view and forms handling.
    """
    family = api.get_elem_by_type("family", family_id)

    family_users = api.familycontrol.get_users_for_family(family)
    export_form = ExportFamilyForm()
    add_subfamily_form = AddSubFamilyForm()
    add_yara_form = AddYaraToFamilyForm()
    yara_choices = [(f.id, f.name) for f in YaraRule.query.order_by(
        'name') if f not in family.yaras]
    add_yara_form.yaraid.choices = yara_choices
    family_abstract_form = FamilyAbstractForm()
    add_detection_item_form = CreateDetectionItemForm()
    change_status_form = ChangeStatusForm()
    change_tlp_form = ChangeTLPForm()
    add_attachment_form = UploadFamilyFileForm()

    if add_subfamily_form.validate_on_submit():
        newname = add_subfamily_form.familyname.data
        newname = family.name + "." + newname
        fid = api.familycontrol.create(name=newname, parentfamily=family)
        if not fid:
            abort(500)

    if export_form.validate_on_submit():
        family_manage_export_form(family.id, export_form)
    if add_yara_form.validate_on_submit():
        yar = api.get_elem_by_type("yara", add_yara_form.yaraid.data)
        api.yaracontrol.add_to_family(family, yar)
    if family_abstract_form.validate_on_submit():
        abstract = family_abstract_form.abstract.data
        api.familycontrol.set_abstract(family, abstract)
    elif family.abstract is not None:
        family_abstract_form.abstract.default = family.abstract
        family_abstract_form.abstract.data = family.abstract
    if change_tlp_form.validate_on_submit():
        level = change_tlp_form.level.data
        api.familycontrol.set_tlp_level(family, level)
    if change_status_form.validate_on_submit():
        status = change_status_form.newstatus.data
        api.familycontrol.set_status(family, status)
    if add_detection_item_form.validate_on_submit():
        api.familycontrol.create_detection_item(
            add_detection_item_form.item_abstract.data,
            add_detection_item_form.name.data,
            add_detection_item_form.tlp_level.data,
            add_detection_item_form.item_type.data,
            family)
    if add_attachment_form.validate_on_submit():
        data = add_attachment_form.file.data.read()
        fname = secure_filename(add_attachment_form.file.data.filename)
        api.familycontrol.add_file(data,
                                   fname,
                                   add_attachment_form.description.data,
                                   add_attachment_form.level.data,
                                   family)

    return render_template("family.html",
                           family=family,
                           expform=export_form,
                           addsubfamform=add_subfamily_form,
                           uploadform=add_attachment_form,
                           abstractform=family_abstract_form,
                           createdetectionitemform=add_detection_item_form,
                           changestatusform=change_status_form,
                           changetlpform=change_tlp_form,
                           famusers=family_users,
                           yaraform=add_yara_form)