示例#1
0
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'})
示例#2
0
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)})
示例#3
0
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"})
示例#4
0
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)})
示例#5
0
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'})
示例#6
0
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"})