Compare commits

...

4 Commits

Author SHA1 Message Date
David Cruciani 7c59af5eb5
chg: [history] save from session to db 2024-03-11 15:29:49 +01:00
David Cruciani dcc790f5af
chg: [config] queries limit 2024-03-11 15:27:25 +01:00
David Cruciani 99e2ce7f04
chg: [query] query with same parameters 2024-03-11 15:21:59 +01:00
David Cruciani f0fff0df2e
chg: [history_session] save new query in tree 2024-03-11 12:12:23 +01:00
7 changed files with 115 additions and 44 deletions

View File

@ -31,15 +31,14 @@ def get_history_session():
# It's already save in history
# Only parent-child tree structure is in flask session
current_query_value = sess.get(current_query)
if current_query_value and current_query_value["children"]:
if current_query_value:
loc_list.append(current_query_value)
for q in sess:
if isUUID(q):
# If query have no children then don't display it
q_value = sess.get(q)
if q_value["children"]:
if not q == current_query:
loc_list.append(q_value)
if not q == current_query:
loc_list.append(q_value)
return loc_list
@ -47,7 +46,7 @@ def get_current_query_history():
current_query = sess.get("current_query")
if current_query:
current_query_value = sess.get(current_query)
if current_query_value and current_query_value["children"]:
if current_query_value:
return current_query_value
return {}
@ -82,25 +81,22 @@ def save_history_core(sid):
# Doesn't already exist
history_tree_db = History_Tree.query.filter_by(session_uuid=session["uuid"]).first()
if not history_tree_db:
if "children" in session and session["children"]:
# Get all children before add to db
loc_dict = util_save_history(session)
h = History_Tree(
session_uuid = session["uuid"],
tree=json.dumps(loc_dict)
)
db.session.add(h)
db.session.commit()
return {"message": "History Save", 'toast_class': "success-subtle"}
return {"message": "No children", 'toast_class': "warning-subtle"}
# Get all children before add to db
loc_dict = util_save_history(session)
h = History_Tree(
session_uuid = session["uuid"],
tree=json.dumps(loc_dict)
)
db.session.add(h)
db.session.commit()
return {"message": "History Save", 'toast_class': "success-subtle"}
# Save same session but with new value
elif not json.loads(history_tree_db.tree) == session:
if "children" in session and session["children"]:
# Get all children before add to db
loc_dict = util_save_history(session)
history_tree_db.tree = json.dumps(loc_dict)
db.session.commit()
return {"message": "History updated", 'toast_class': "success-subtle"}
# Get all children before add to db
loc_dict = util_save_history(session)
history_tree_db.tree = json.dumps(loc_dict)
db.session.commit()
return {"message": "History updated", 'toast_class': "success-subtle"}
return {"message": "History already saved", 'toast_class': "warning-subtle"}
return {"message": "Session not found", 'toast_class': "danger-subtle"}
@ -163,9 +159,8 @@ def remove_node_session(node_uuid):
if q_value["uuid"] == node_uuid:
loc = i
break
else:
if q_value["children"]:
return util_remove_node_session(node_uuid, q_value, sess[keys_list[i]])
elif q_value["children"]:
return util_remove_node_session(node_uuid, q_value, sess[keys_list[i]])
if loc:
del sess[keys_list[i]]

View File

@ -104,6 +104,8 @@ def run_modules():
if "modules" in request.json:
if "query_as_same" in request.json:
session = SessionModel.Session_class(request.json, query_as_same=True, parent_id=request.json["parent_id"])
elif "query_as_params" in request.json:
session = SessionModel.Session_class(request.json, query_as_same=True, parent_id=request.json["same_query_id"])
else:
session = SessionModel.Session_class(request.json)
HomeModel.set_flask_session(session, request.json["parent_id"])

View File

@ -1,5 +1,5 @@
import json
from .utils.utils import query_get_module
from .utils.utils import isUUID, query_get_module
from . import db
from .db_class.db import History, Module, Config, Module_Config, Session_db, History_Tree
from flask import session as sess
@ -150,14 +150,7 @@ def get_history():
def create_new_session_tree(current_session, parent_id):
loc_session = get_session(parent_id)
loc_json = {
"uuid": loc_session.uuid,
"modules": json.loads(loc_session.modules_list),
"query": loc_session.query_enter,
"input": loc_session.input_query,
"query_date": loc_session.query_date.strftime('%Y-%m-%d %H:%M'),
"config": json.loads(loc_session.config_module)
}
loc_json_child = {
"uuid": current_session.uuid,
"modules": current_session.modules_list,
@ -165,12 +158,20 @@ def create_new_session_tree(current_session, parent_id):
"input": current_session.input_query,
"query_date": current_session.query_date.strftime('%Y-%m-%d'),
"config": current_session.config_module,
"children": []
"children": list()
}
loc_json = {
"uuid": loc_session.uuid,
"modules": json.loads(loc_session.modules_list),
"query": loc_session.query_enter,
"input": loc_session.input_query,
"query_date": loc_session.query_date.strftime('%Y-%m-%d %H:%M'),
"config": json.loads(loc_session.config_module),
"children" : [loc_json_child]
}
sess["current_query"] = loc_session.uuid
sess[sess.get("current_query")] = loc_json
sess[sess.get("current_query")]["children"] = [loc_json_child]
def util_set_flask_session(parent_id, loc_session, current_session):
if parent_id == loc_session["uuid"]:
@ -201,9 +202,34 @@ def set_flask_session(current_session, parent_id):
if not current_query or current_query not in sess:
create_new_session_tree(current_session, parent_id)
else:
# sess["uuid"]
loc_session = sess.get(sess.get("current_query"))
## Check in current query
loc_session = sess.get(current_query)
if not "children" in loc_session:
loc_session["children"] = list()
## If not in current query, current query change for an other one
if not util_set_flask_session(parent_id, loc_session, current_session):
create_new_session_tree(current_session, parent_id)
# sess["uuid"]
for q in sess:
if isUUID(q) and not q == current_query:
loc_session = sess.get(q)
if not "children" in loc_session:
loc_session["children"] = list()
if util_set_flask_session(parent_id, loc_session, current_session):
sess["current_query"] = q
flag = False
break
if flag:
create_new_session_tree(current_session, parent_id)
else:
loc_json = {
"uuid": current_session.uuid,
"modules": current_session.modules_list,
"query": current_session.query,
"input": current_session.input_query,
"query_date": current_session.query_date.strftime('%Y-%m-%d %H:%M'),
"config": current_session.config_module,
"children": list()
}
sess["current_query"] = current_session.uuid
sess[sess.get("current_query")] = loc_json

View File

@ -3,7 +3,7 @@ import json
from queue import Queue
from threading import Thread
from uuid import uuid4
from .utils.utils import query_post_query, query_get_module, get_object
from .utils.utils import query_post_query, query_get_module, get_object, get_limit_queries
from . import home_core as HomeModel
import uuid
from . import db
@ -179,7 +179,7 @@ class Session_class:
histories = History.query.all()
while len(histories) > 200:
while len(histories) > get_limit_queries():
history = History.query.order_by(History.id).all()
session = Session_db.query.filter_by(id=history[0].session_id)
if not History_Tree.query.filter_by(session_uuid=session.uuid):

View File

@ -14,7 +14,21 @@
<div class="btn-group" style="float: right;" role="group" aria-label="Basic mixed styles example">
<a style="float: right;" class="btn btn-primary" href="/" title="Do a new query with no relation with this one">New query</a>
<a style="float: right;" class="btn btn-secondary" href="/?query={{query}}" title="New query with same name">Query</a>
</div>
<div class="dropdown" style="float: right;">
<button class="btn btn-primary dropdown-toggle" title="New query with same parameters" style="border-radius: 0;" data-bs-toggle="dropdown" aria-expanded="false" data-bs-auto-close="outside">
Query as same
</button>
<div class="dropdown-menu p-4" style="min-width: 200px;">
<div class="mb-3">
<label for="query_as_params" class="form-label">To query:</label>
<input type="email" class="form-control" id="query_as_params" placeholder="{{query}}">
<div id="query_as_params_error" style="color:brown"></div>
</div>
<button type="submit" class="btn btn-primary btn-sm" @click="query_as_params()" style="border-radius: 50px;">Query</button>
</div>
</div>
</div>
<div class="card card-body">
@ -341,6 +355,7 @@ Value: [[misp_attr]]
history.value = loc
}
// query 'value' with same parameters with a parent
async function query_as_same(value){
let result_dict = {"modules": query_info.value["modules"],
"input": query_info.value["input_query"],
@ -361,6 +376,33 @@ Value: [[misp_attr]]
}
}
// query 'value' with same parameters without a parent
async function query_as_params(){
let loc = $("#query_as_params").val()
$("#query_as_params_error").text("")
if(loc){
let result_dict = {"modules": query_info.value["modules"],
"input": query_info.value["input_query"],
"query": loc,
"config": {},
"same_query_id": sid.value,
"parent_id": ""
}
const res = await fetch('/run_modules',{
headers: { "X-CSRFToken": $("#csrf_token").val(), "Content-Type": "application/json" },
method: "POST",
body: JSON.stringify(result_dict)
})
if(await res.status == 201){
let loc = await res.json()
await nextTick()
window.location.href="/query/" + loc['id']
}
}else{
$("#query_as_params_error").text("Please give value")
}
}
onMounted(() => {
queryInfo()
actionQuery()
@ -382,7 +424,8 @@ Value: [[misp_attr]]
parseMispObject,
parseMispAttr,
active_tab,
query_as_same
query_as_same,
query_as_params
}
}
}).mount('.container-fluid')

View File

@ -71,4 +71,7 @@ def gen_admin_password():
print(f"##########################\n## Admin password ##\n## {password} ##\n##########################")
config["ADMIN"]["ADMIN_PASSWORD"] = password
with open(CONF_PATH, "w") as conffile:
config.write(conffile)
config.write(conffile)
def get_limit_queries():
return Config.QUERIES_LIMIT

View File

@ -4,6 +4,8 @@ class Config:
FLASK_URL = '127.0.0.1'
FLASK_PORT = 7008
MISP_MODULE = '127.0.0.1:6666'
QUERIES_LIMIT = 200
class DevelopmentConfig(Config):
DEBUG = True