mirror of https://github.com/MISP/misp-modules
add: [website] lib js misp object parser
parent
91ce285067
commit
59a0131880
|
@ -0,0 +1,67 @@
|
|||
function parseMispObject(misp_object, query_url, functionToCall){
|
||||
|
||||
function generate(misp_object, query_url, functionToCall){
|
||||
let $container = $("<div>")
|
||||
misp_object.Attribute.forEach(function (v, i) {
|
||||
let $query = $("<a>")
|
||||
let $query_same = null
|
||||
|
||||
if(v.type != 'counter' && v.type != 'datetime'){
|
||||
if(query_url){
|
||||
$query=$("<a>").attr("href", query_url+v.value).text("query").css("margin-left", "10px")
|
||||
}
|
||||
// `_${functionToCall.name}('${v.value}')` refer to 'window._query_as_same = query_as_same' in my vue file
|
||||
$query_same = $("<button>").attr({"onclick": `_${functionToCall.name}('${v.value}')`,
|
||||
"title": "Query this value with the same attribute and modules as the main query",
|
||||
"class": "btn btn-link"
|
||||
})
|
||||
.text("query as same")
|
||||
.css({"margin-left": "10px", "padding": "0", "--bs-btn-border-width": "0"})
|
||||
}
|
||||
|
||||
$container.append(
|
||||
$("<div>").css("margin-top", "10px").append(
|
||||
$("<h6>").append($("<u>").text(v.object_relation)),
|
||||
$("<div>").css("display", "flex").append(
|
||||
$("<div>").css({
|
||||
"border-left": "2px solid grey",
|
||||
"border-bottom": "2px solid grey",
|
||||
"width": "15px",
|
||||
"height": "15px",
|
||||
"display": "flex",
|
||||
"margin-left": "0.5em",
|
||||
}),
|
||||
$("<div>").text("Type: "+ v.type)
|
||||
),
|
||||
$("<div>").css("display", "flex").append(
|
||||
$("<div>").css({
|
||||
"border-left": "2px solid grey",
|
||||
"border-bottom": "2px solid grey",
|
||||
"width": "15px",
|
||||
"height": "15px",
|
||||
"display": "flex",
|
||||
"margin-left": "0.5em",
|
||||
}),
|
||||
$("<div>").text("Value: "+ v.value),
|
||||
$query,
|
||||
$query_same
|
||||
)
|
||||
)
|
||||
)
|
||||
});
|
||||
return $container
|
||||
}
|
||||
|
||||
var $mainContainer = $('<div>')
|
||||
let first_elem = $("<div>").css({"display": "flex", "align-items": "baseline"}).append(
|
||||
$("<i>").attr({"class": "fa-solid fa-cube", "title": "MISP Object"}),
|
||||
$('<h4>').css("margin-left", "5px").append(
|
||||
$("<small>").text(misp_object.name)
|
||||
)
|
||||
)
|
||||
$mainContainer.append(first_elem)
|
||||
$mainContainer.append(first_elem)
|
||||
$mainContainer.append(generate(misp_object, query_url, functionToCall))
|
||||
$mainContainer.append($("<hr>"))
|
||||
return $mainContainer
|
||||
}
|
|
@ -18,6 +18,7 @@
|
|||
<script src="{{ url_for('static',filename='js/utils.js') }}"></script>
|
||||
|
||||
<script src="{{ url_for('static',filename='js/jsonParser.js') }}"></script>
|
||||
<script src="{{ url_for('static',filename='js/mispParser.js') }}"></script>
|
||||
|
||||
<script src="{{ url_for('static',filename='js/dayjs/dayjs.min.js') }}"></script>
|
||||
<script src="{{ url_for('static',filename='js/dayjs/dayjs-utc.js') }}"></script>
|
||||
|
|
|
@ -67,17 +67,38 @@
|
|||
<hr>
|
||||
<ul class="nav nav-tabs" style="margin-bottom: 10px;">
|
||||
<li class="nav-item">
|
||||
<button class="nav-link active" id="tab-json" aria-current="page" @click="active_tab('json')">Json</button>
|
||||
<button class="nav-link active" id="tab-visual" @click="active_tab('visual')">Visual</button>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<button class="nav-link" id="tab-parser" @click="active_tab('parser')">Parser</button>
|
||||
<button class="nav-link" id="tab-json" aria-current="page" @click="active_tab('json')">Json</button>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<button class="nav-link" id="tab-markdown" @click="active_tab('markdown')">Markdown</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<template v-if="tab_list == 'json'">
|
||||
<template v-if="tab_list == 'visual'">
|
||||
<div class="accordion" v-if="Object.keys(modules_res).length" style="width: 95%">
|
||||
<div class="accordion-item" v-for="result, key in modules_res">
|
||||
<template v-if="!('error' in result)">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" :data-bs-target="'#panelsStayOpen-'+key" aria-expanded="true" :aria-controls="'panelsStayOpen-'+key">
|
||||
[[key]]
|
||||
</button>
|
||||
</h2>
|
||||
<div :id="'panelsStayOpen-'+key" class="accordion-collapse collapse show">
|
||||
<div class="accordion-body row">
|
||||
<template v-for="obj in result.results.Object">
|
||||
<div v-html="parseMispObject(obj, '/home/{{sid}}?query=', query_as_same)[0].outerHTML"></div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-else-if="tab_list == 'json'">
|
||||
<div class="row" v-if="Object.keys(modules_res).length">
|
||||
<div class="col-10">
|
||||
<h3 id="results_part">Results</h3>
|
||||
|
@ -122,40 +143,6 @@
|
|||
</div>
|
||||
</template>
|
||||
|
||||
<template v-else-if="tab_list == 'parser'">
|
||||
<div class="accordion" v-if="Object.keys(modules_res).length" style="width: 95%">
|
||||
<div class="accordion-item" v-for="result, key in modules_res">
|
||||
<template v-if="!('error' in result)">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" :data-bs-target="'#panelsStayOpen-'+key" aria-expanded="true" :aria-controls="'panelsStayOpen-'+key">
|
||||
[[key]]
|
||||
</button>
|
||||
</h2>
|
||||
<div :id="'panelsStayOpen-'+key" class="accordion-collapse collapse show">
|
||||
<div class="accordion-body row">
|
||||
<template v-for="obj, key_obj in result.results.Object">
|
||||
<h4>Object #[[key_obj+1]] - <small>[[obj.name]]</small></h4>
|
||||
<div class="row" style="margin: 5px; padding: 5px;">
|
||||
<div class="col-4 mb-3" style="border: 1px solid #939393; border-radius: 10px;" v-for="attr, key_attr in obj.Attribute">
|
||||
<h6>Attributes #[[key_attr+1]]</h6>
|
||||
<div>
|
||||
Type: [[attr.type]]
|
||||
</div>
|
||||
<div>
|
||||
Value: [[attr.value]]
|
||||
</div>
|
||||
<a v-if="attr.type != 'counter' && attr.type != 'datetime'" :href="'/home/{{sid}}?query='+attr.value">query</a>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-else-if="tab_list == 'markdown'">
|
||||
<div v-if="Object.keys(modules_res).length" class="accordion" style="width: 95%">
|
||||
<div class="accordion-item" v-for="result, key in modules_res">
|
||||
|
@ -208,7 +195,7 @@
|
|||
const modules_res = ref({})
|
||||
const progress = ref(0)
|
||||
const status_site = ref()
|
||||
const tab_list = ref("json")
|
||||
const tab_list = ref("visual")
|
||||
const history = ref({})
|
||||
|
||||
|
||||
|
@ -254,13 +241,13 @@
|
|||
tab_list.value = "json"
|
||||
if ( !document.getElementById("tab-json").classList.contains("active") ){
|
||||
document.getElementById("tab-json").classList.add("active")
|
||||
document.getElementById("tab-parser").classList.remove("active")
|
||||
document.getElementById("tab-visual").classList.remove("active")
|
||||
document.getElementById("tab-markdown").classList.remove("active")
|
||||
}
|
||||
}else if(active_tab == "parser"){
|
||||
tab_list.value = "parser"
|
||||
if ( !document.getElementById("tab-parser").classList.contains("active") ){
|
||||
document.getElementById("tab-parser").classList.add("active")
|
||||
}else if(active_tab == "visual"){
|
||||
tab_list.value = "visual"
|
||||
if ( !document.getElementById("tab-visual").classList.contains("active") ){
|
||||
document.getElementById("tab-visual").classList.add("active")
|
||||
document.getElementById("tab-json").classList.remove("active")
|
||||
document.getElementById("tab-markdown").classList.remove("active")
|
||||
}
|
||||
|
@ -269,7 +256,7 @@
|
|||
if ( !document.getElementById("tab-markdown").classList.contains("active") ){
|
||||
document.getElementById("tab-markdown").classList.add("active")
|
||||
document.getElementById("tab-json").classList.remove("active")
|
||||
document.getElementById("tab-parser").classList.remove("active")
|
||||
document.getElementById("tab-visual").classList.remove("active")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -294,7 +281,8 @@
|
|||
tab_list,
|
||||
history,
|
||||
generateCoreFormatUI,
|
||||
active_tab
|
||||
parseMispObject,
|
||||
active_tab,
|
||||
}
|
||||
}
|
||||
}).mount('.container-fluid')
|
||||
|
|
Loading…
Reference in New Issue