#todo 聚合
This commit is contained in:
parent
e3d50481a3
commit
d0d2122b2f
|
@ -520,6 +520,40 @@ async def asset_data_statistics_port(request_data: dict, db=Depends(get_mongo_db
|
||||||
"data": result_list
|
"data": result_list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@router.post("/asset/statistics/title")
|
||||||
|
async def asset_data_statistics_title(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
||||||
|
request_data['filter']['type'] = ['https', 'http']
|
||||||
|
query = await get_search_query("asset", request_data)
|
||||||
|
if query == "":
|
||||||
|
return {"message": "Search condition parsing error", "code": 500}
|
||||||
|
pipeline = [
|
||||||
|
{
|
||||||
|
"$match": query # 添加搜索条件
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$facet": {
|
||||||
|
"by_title": [
|
||||||
|
{"$group": {"_id": "$title", "num_tutorial": {"$sum": 1}}},
|
||||||
|
{"$match": {"_id": {"$ne": ""}}}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
result = await db['asset'].aggregate(pipeline).to_list(None)
|
||||||
|
result_list = {"Title": []}
|
||||||
|
title_list = {}
|
||||||
|
|
||||||
|
for r in result:
|
||||||
|
for port in r['by_title']:
|
||||||
|
title_list[port["_id"]] = port["num_tutorial"]
|
||||||
|
|
||||||
|
title_list = dict(sorted(title_list.items(), key=lambda item: -item[1]))
|
||||||
|
for title in title_list:
|
||||||
|
result_list['Title'].append({"value": title, "number": title_list[title]})
|
||||||
|
return {
|
||||||
|
"code": 200,
|
||||||
|
"data": result_list
|
||||||
|
}
|
||||||
|
|
||||||
@router.post("/asset/statistics/type")
|
@router.post("/asset/statistics/type")
|
||||||
async def asset_data_statistics_type(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
async def asset_data_statistics_type(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
||||||
|
@ -704,16 +738,14 @@ async def asset_data_statistics_app(request_data: dict, db=Depends(get_mongo_db)
|
||||||
@router.post("/data/delete")
|
@router.post("/data/delete")
|
||||||
async def delete_data(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
async def delete_data(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
||||||
try:
|
try:
|
||||||
# Extract the list of IDs from the request_data dictionary
|
|
||||||
data_ids = request_data.get("ids", [])
|
data_ids = request_data.get("ids", [])
|
||||||
index = request_data.get("index", "")
|
index = request_data.get("index", "")
|
||||||
# Convert the provided rule_ids to ObjectId
|
obj_ids = []
|
||||||
obj_ids = [ObjectId(data_id) for data_id in data_ids]
|
for data_id in data_ids:
|
||||||
|
if data_id != "" and len(data_id) > 6:
|
||||||
# Delete the SensitiveRule documents based on the provided IDs
|
obj_ids.append(ObjectId(data_id))
|
||||||
result = await db[index].delete_many({"_id": {"$in": obj_ids}})
|
result = await db[index].delete_many({"_id": {"$in": obj_ids}})
|
||||||
|
|
||||||
# Check if the deletion was successful
|
|
||||||
if result.deleted_count > 0:
|
if result.deleted_count > 0:
|
||||||
return {"code": 200, "message": "Data deleted successfully"}
|
return {"code": 200, "message": "Data deleted successfully"}
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# @contact : rainy-autumn@outlook.com
|
# @contact : rainy-autumn@outlook.com
|
||||||
# @time : 2024/7/8 21:02
|
# @time : 2024/7/8 21:02
|
||||||
# -------------------------------------------
|
# -------------------------------------------
|
||||||
|
import asyncio
|
||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ async def get_projects_data(request_data: dict, db=Depends(get_mongo_db), _: dic
|
||||||
"scheduledTasks": 1,
|
"scheduledTasks": 1,
|
||||||
"AssetCount": 1,
|
"AssetCount": 1,
|
||||||
"root_domains": 1,
|
"root_domains": 1,
|
||||||
"name":1
|
"name": 1
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if result['scheduledTasks']:
|
if result['scheduledTasks']:
|
||||||
|
@ -77,7 +77,9 @@ async def get_projects_vul_statistics(request_data: dict, db=Depends(get_mongo_d
|
||||||
@router.post("/project/vul/data")
|
@router.post("/project/vul/data")
|
||||||
async def get_projects_vul_data(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
async def get_projects_vul_data(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
||||||
id = request_data.get("id", "")
|
id = request_data.get("id", "")
|
||||||
cursor: AsyncIOMotorCursor = db.vulnerability.find({"project": id}, {"_id": 0, "url": 1, "vulname": 1, "level": 1, "time": 1, "matched": 1}).sort([("time", DESCENDING)])
|
cursor: AsyncIOMotorCursor = db.vulnerability.find({"project": id},
|
||||||
|
{"_id": 0, "url": 1, "vulname": 1, "level": 1, "time": 1,
|
||||||
|
"matched": 1}).sort([("time", DESCENDING)])
|
||||||
result = await cursor.to_list(length=None)
|
result = await cursor.to_list(length=None)
|
||||||
return {
|
return {
|
||||||
"code": 200,
|
"code": 200,
|
||||||
|
@ -85,3 +87,41 @@ async def get_projects_vul_data(request_data: dict, db=Depends(get_mongo_db), _:
|
||||||
'list': result
|
'list': result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/project/subdomain/data")
|
||||||
|
async def get_projects_vul_data(request_data: dict, db=Depends(get_mongo_db), _: dict = Depends(verify_token)):
|
||||||
|
filter = request_data.get("filter", {})
|
||||||
|
project_id = filter["project"][0]
|
||||||
|
project_query = {}
|
||||||
|
host_filter = ""
|
||||||
|
if "host" in filter:
|
||||||
|
host_filter = filter["host"]
|
||||||
|
project_query["_id"] = ObjectId(project_id)
|
||||||
|
doc = await db.project.find_one(project_query, {"_id": 0, "root_domains": 1})
|
||||||
|
if not doc or "root_domains" not in doc:
|
||||||
|
return {"code": 404, "message": "domain is null"}
|
||||||
|
query = await get_search_query("subdomain", request_data)
|
||||||
|
if query == "":
|
||||||
|
return {"message": "Search condition parsing error", "code": 500}
|
||||||
|
results = []
|
||||||
|
for root_domain in doc["root_domains"]:
|
||||||
|
query["$and"].append({"host": {"$regex": f"{root_domain}$"}})
|
||||||
|
cursor: AsyncIOMotorCursor = db['subdomain'].find(query, {
|
||||||
|
"_id": 0, "id": {"$toString": "$_id"}, "host": 1, "type": 1, "value": 1, "ip": 1, "time": 1
|
||||||
|
}).sort([("time", -1)])
|
||||||
|
result = await cursor.to_list(length=None)
|
||||||
|
result_list = []
|
||||||
|
for r in result:
|
||||||
|
if r['value'] is None:
|
||||||
|
r['value'] = []
|
||||||
|
if r['ip'] is None:
|
||||||
|
r['ip'] = []
|
||||||
|
result_list.append(r)
|
||||||
|
results.append({"host": root_domain, "type": "", "value": [], "ip": [], "id": generate_random_string(5), "children": result_list})
|
||||||
|
return {
|
||||||
|
"code": 200,
|
||||||
|
"data": {
|
||||||
|
'list': results
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue