async def search_responses(request, user): if user['auth'] not in ['access_token', 'apitoken']: abort(status_code=403, message="Cannot access via Cookies. Use CLI or access via JS in browser") try: data = request.json if 'search' not in data: return json({'status': 'error', 'error': 'failed to find search term in request'}) query = await db_model.operation_query() operation = await db_objects.get(query, name=user['current_operation']) except Exception as e: return json({'status': 'error', 'error': 'Cannot get that response'}) try: query = await db_model.task_query() count = await db_objects.count(query.join(Response).switch(Response).where(fn.encode(Response.response, 'escape').regexp(data['search'])).switch(Task).where(Callback.operation == operation).order_by(Task.id).distinct()) if 'page' not in data: # allow a blanket search to still be performed responses = await db_objects.execute(query.join(Response).switch(Response).where(fn.encode(Response.response, 'escape').regexp(data['search'])).switch(Task).where(Callback.operation == operation).order_by(Task.id).distinct()) data['page'] = 1 data['size'] = count else: if 'page' not in data or 'size' not in data or int(data['size']) <= 0 or int(data['page']) <= 0: return json({'status': 'error', 'error': 'size and page must be supplied and be greater than 0'}) data['size'] = int(data['size']) data['page'] = int(data['page']) if data['page'] * data['size'] > count: data['page'] = ceil(count / data['size']) if data['page'] == 0: data['page'] = 1 responses = await db_objects.execute( query.join(Response).switch(Response).where( fn.encode(Response.response, 'escape').regexp(data['search'])).switch(Task).where( Callback.operation == operation).order_by(Task.id).distinct().paginate(data['page'], data['size']) ) output = [] response_query = await db_model.response_query() for r in responses: setup = await db_objects.execute(response_query.where(Response.task == r).order_by(Response.id)) output.append({**r.to_json(), 'response': [s.to_json() for s in setup]}) return json({'status': 'success', 'output': output, 'total_count': count, 'page': data['page'], 'size': data['size']}) except Exception as e: print(str(e)) return json({'status': 'error', 'error': 'bad regex syntax'})
async def search_event_message(request, user): if user['auth'] not in ['access_token', 'apitoken']: abort(status_code=403, message="Cannot access via Cookies. Use CLI or access via JS in browser") try: query = await db_model.operation_query() operation = await db_objects.get(query, name=user['current_operation']) query = await db_model.operationeventlog_query() except Exception as e: return json({'status': 'error', 'error': 'failed to find that file browsing object in your current operation'}) try: data = request.json count = await db_objects.count(query.where( (db_model.OperationEventLog.operation == operation) & (fn.encode(db_model.OperationEventLog.message, 'escape').regexp(data['search']))).distinct()) if 'page' not in data: # allow a blanket search to still be performed responses = await db_objects.execute(query.where( (db_model.OperationEventLog.operation == operation) & (fn.encode(db_model.OperationEventLog.message, 'escape').regexp(data['search']))).distinct()) data['page'] = 1 data['size'] = count else: if 'page' not in data or 'size' not in data or int(data['size']) <= 0 or int(data['page']) <= 0: return json({'status': 'error', 'error': 'size and page must be supplied and be greater than 0'}) data['size'] = int(data['size']) data['page'] = int(data['page']) if data['page'] * data['size'] > count: data['page'] = ceil(count / data['size']) if data['page'] == 0: data['page'] = 1 responses = await db_objects.execute(query.where( (db_model.OperationEventLog.operation == operation) & (fn.encode(db_model.OperationEventLog.message, 'escape').regexp(data['search']))).distinct().paginate(data['page'], data['size'])) output = [] for r in responses: rjson = r.to_json() output.append(rjson) return json( {'status': 'success', 'output': output, 'total_count': count, 'page': data['page'], 'size': data['size']}) except Exception as e: print(e) return json({'status': 'error', 'error': str(e)})
async def search_responses(request, user): if user["auth"] not in ["access_token", "apitoken"]: abort( status_code=403, message= "Cannot access via Cookies. Use CLI or access via JS in browser", ) try: data = request.json if "search" not in data: return json({ "status": "error", "error": "failed to find search term in request" }) query = await db_model.operation_query() operation = await db_objects.get(query, name=user["current_operation"]) except Exception as e: return json({"status": "error", "error": "Cannot get that response"}) try: query = await db_model.task_query() count = await db_objects.count( query.join(Response).switch(Response).where( fn.encode(Response.response, "escape").regexp(data["search"])).switch(Task).where( Callback.operation == operation).order_by( Task.id).distinct()) if "page" not in data: # allow a blanket search to still be performed responses = await db_objects.execute( query.join(Response).switch(Response).where( fn.encode(Response.response, "escape").regexp( data["search"])).switch(Task).where( Callback.operation == operation).order_by( Task.id).distinct()) data["page"] = 1 data["size"] = count else: if ("page" not in data or "size" not in data or int(data["size"]) <= 0 or int(data["page"]) <= 0): return json({ "status": "error", "error": "size and page must be supplied and be greater than 0", }) data["size"] = int(data["size"]) data["page"] = int(data["page"]) if data["page"] * data["size"] > count: data["page"] = ceil(count / data["size"]) if data["page"] == 0: data["page"] = 1 responses = await db_objects.execute( query.join(Response).switch(Response).where( fn.encode(Response.response, "escape").regexp( data["search"])).switch(Task).where( Callback.operation == operation).order_by( Task.id).distinct().paginate( data["page"], data["size"])) output = [] response_query = await db_model.response_query() for r in responses: setup = await db_objects.execute( response_query.where(Response.task == r).order_by(Response.id)) output.append({ **r.to_json(), "response": [s.to_json() for s in setup] }) return json({ "status": "success", "output": output, "total_count": count, "page": data["page"], "size": data["size"], }) except Exception as e: print(str(e)) return json({"status": "error", "error": "bad regex syntax"})
async def search_filebrowsobj(request, user): if user["auth"] not in ["access_token", "apitoken"]: abort( status_code=403, message="Cannot access via Cookies. Use CLI or access via JS in browser", ) try: query = await db_model.operation_query() operation = await db_objects.get(query, name=user["current_operation"]) query = await db_model.filebrowserobj_query() except Exception as e: return json( { "status": "error", "error": "failed to find that file browsing object in your current operation", } ) try: data = request.json count = await db_objects.count( query.where( (db_model.FileBrowserObj.operation == operation) & ( fn.encode(db_model.FileBrowserObj.host, "escape").regexp( data["host"] ) ) & (db_model.FileBrowserObj.comment.regexp(data["comment"])) & ( fn.encode(db_model.FileBrowserObj.full_path, "escape").regexp( data["path"] ) ) ).distinct() ) if "page" not in data: # allow a blanket search to still be performed responses = await db_objects.execute( query.where( (db_model.FileBrowserObj.operation == operation) & ( fn.encode(db_model.FileBrowserObj.host, "escape").regexp( data["host"] ) ) & (db_model.FileBrowserObj.comment.regexp(data["comment"])) & ( fn.encode(db_model.FileBrowserObj.full_path, "escape").regexp( data["path"] ) ) ) .distinct() .order_by(db_model.FileBrowserObj.full_path) ) data["page"] = 1 data["size"] = count else: if ( "page" not in data or "size" not in data or int(data["size"]) <= 0 or int(data["page"]) <= 0 ): return json( { "status": "error", "error": "size and page must be supplied and be greater than 0", } ) data["size"] = int(data["size"]) data["page"] = int(data["page"]) if data["page"] * data["size"] > count: data["page"] = ceil(count / data["size"]) if data["page"] == 0: data["page"] = 1 responses = await db_objects.execute( query.where( (db_model.FileBrowserObj.operation == operation) & ( fn.encode(db_model.FileBrowserObj.host, "escape").regexp( data["host"] ) ) & (db_model.FileBrowserObj.comment.regexp(data["comment"])) & ( fn.encode(db_model.FileBrowserObj.full_path, "escape").regexp( data["path"] ) ) ) .distinct() .order_by(db_model.FileBrowserObj.full_path) .paginate(data["page"], data["size"]) ) output = [] for r in responses: rjson = r.to_json() rjson["files"] = [] for f in r.files: fjson = f.to_json() if f.task is not None and f.task.comment != "": fjson["comment"] = f.task.comment rjson["files"].append(fjson) output.append(rjson) return json( { "status": "success", "output": output, "total_count": count, "page": data["page"], "size": data["size"], } ) except Exception as e: print(e) return json({"status": "error", "error": str(e)})
async def search_artifact_tasks(request, user): if user['auth'] not in ['access_token', 'apitoken']: abort(status_code=403, message= "Cannot access via Cookies. Use CLI or access via JS in browser") try: data = request.json if 'search' not in data: return json({ 'status': 'error', 'error': 'must supply a search term' }) query = await db_model.operation_query() operation = await db_objects.get(query, name=user['current_operation']) except Exception as e: return json({'status': 'error', 'error': 'Cannot find operation'}) query = await db_model.callback_query() callbacks = query.where(Callback.operation == operation).select( Callback.id) task_query = await db_model.taskartifact_query() try: count = await db_objects.count( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, 'escape').regexp(data['search']))) if 'page' not in data: tasks = await db_objects.execute( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, 'escape').regexp(data['search'])). order_by(-TaskArtifact.timestamp)) data['page'] = 1 data['size'] = count else: if 'page' not in data or 'size' not in data or int( data['size']) <= 0 or int(data['page']) <= 0: return json({ 'status': 'error', 'error': 'size and page must be supplied and be greater than 0' }) data['size'] = int(data['size']) data['page'] = int(data['page']) if data['page'] * data['size'] > count: data['page'] = ceil(count / data['size']) if data['page'] == 0: data['page'] = 1 tasks = await db_objects.execute( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, 'escape').regexp(data['search'])). order_by(-TaskArtifact.timestamp).paginate( data['page'], data['size'])) return json({ 'status': 'success', 'tasks': [a.to_json() for a in tasks], 'total_count': count, 'page': data['page'], 'size': data['size'] }) except Exception as e: return json({'status': 'error', 'error': 'Bad regex'})
async def search_artifact_tasks(request, user): if user["auth"] not in ["access_token", "apitoken"]: abort( status_code=403, message= "Cannot access via Cookies. Use CLI or access via JS in browser", ) try: data = request.json if "search" not in data: return json({ "status": "error", "error": "must supply a search term" }) query = await db_model.operation_query() operation = await db_objects.get(query, name=user["current_operation"]) except Exception as e: return json({"status": "error", "error": "Cannot find operation"}) query = await db_model.callback_query() callbacks = query.where(Callback.operation == operation).select( Callback.id) task_query = await db_model.taskartifact_query() try: count = await db_objects.count( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, "escape").regexp(data["search"]))) if "page" not in data: tasks = await db_objects.execute( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, "escape").regexp(data["search"])). order_by(-TaskArtifact.timestamp)) data["page"] = 1 data["size"] = count else: if ("page" not in data or "size" not in data or int(data["size"]) <= 0 or int(data["page"]) <= 0): return json({ "status": "error", "error": "size and page must be supplied and be greater than 0", }) data["size"] = int(data["size"]) data["page"] = int(data["page"]) if data["page"] * data["size"] > count: data["page"] = ceil(count / data["size"]) if data["page"] == 0: data["page"] = 1 tasks = await db_objects.execute( task_query.where(((Task.callback.in_(callbacks)) | (TaskArtifact.operation == operation)) & fn.encode(TaskArtifact.artifact_instance, "escape").regexp(data["search"])). order_by(-TaskArtifact.timestamp).paginate( data["page"], data["size"])) return json({ "status": "success", "tasks": [a.to_json() for a in tasks], "total_count": count, "page": data["page"], "size": data["size"], }) except Exception as e: return json({"status": "error", "error": "Bad regex"})