Refactored utility functions to make them more readable and removed separate register endpoint.
This commit is contained in:
@@ -92,7 +92,7 @@ proc handleResult*(resultData: seq[byte]) =
|
||||
if int(taskResult.length) > 0:
|
||||
cq.writeLine(fgBlack, styleBright, fmt"[{date}] [*] ", resetStyle, "Output:")
|
||||
# Split result string on newline to keep formatting
|
||||
for line in taskResult.data.toString().split("\n"):
|
||||
for line in Bytes.toString(taskResult.data).split("\n"):
|
||||
cq.writeLine(line)
|
||||
|
||||
of RESULT_BINARY:
|
||||
|
||||
@@ -3,38 +3,16 @@ import sequtils, strutils, times, base64
|
||||
|
||||
import ./handlers
|
||||
import ../[utils, globals]
|
||||
import ../../common/[types, utils]
|
||||
import ../../common/[types, utils, serialize]
|
||||
|
||||
proc error404*(ctx: Context) {.async.} =
|
||||
resp "", Http404
|
||||
|
||||
#[
|
||||
POST /register
|
||||
Called from agent to register itself to the conquest server
|
||||
]#
|
||||
proc register*(ctx: Context) {.async.} =
|
||||
|
||||
# Check headers
|
||||
# If POST data is not binary data, return 404 error code
|
||||
if ctx.request.contentType != "application/octet-stream":
|
||||
resp "", Http404
|
||||
return
|
||||
|
||||
try:
|
||||
if not register(ctx.request.body.toBytes()):
|
||||
resp "", Http400
|
||||
return
|
||||
|
||||
resp "", Http200
|
||||
|
||||
except CatchableError:
|
||||
resp "", Http404
|
||||
|
||||
#[
|
||||
GET /tasks
|
||||
Called from agent to check for new tasks
|
||||
]#
|
||||
proc getTasks*(ctx: Context) {.async.} =
|
||||
proc httpGet*(ctx: Context) {.async.} =
|
||||
|
||||
# Check headers
|
||||
# Heartbeat data is hidden base64-encoded within "Authorization: Bearer" header, between a prefix and suffix
|
||||
@@ -42,7 +20,7 @@ proc getTasks*(ctx: Context) {.async.} =
|
||||
resp "", Http404
|
||||
return
|
||||
|
||||
let checkinData: seq[byte] = decode(ctx.request.getHeader("Authorization")[0].split(".")[1]).toBytes()
|
||||
let checkinData: seq[byte] = string.toBytes(decode(ctx.request.getHeader("Authorization")[0].split(".")[1]))
|
||||
|
||||
try:
|
||||
var response: seq[byte]
|
||||
@@ -57,12 +35,12 @@ proc getTasks*(ctx: Context) {.async.} =
|
||||
response.add(cast[uint8](tasks.len))
|
||||
|
||||
for task in tasks:
|
||||
response.add(uint32(task.len).toBytes())
|
||||
response.add(uint32.toBytes(uint32(task.len)))
|
||||
response.add(task)
|
||||
|
||||
await ctx.respond(
|
||||
code = Http200,
|
||||
body = response.toString()
|
||||
body = Bytes.toString(response)
|
||||
)
|
||||
|
||||
# Notify operator that agent collected tasks
|
||||
@@ -77,7 +55,7 @@ proc getTasks*(ctx: Context) {.async.} =
|
||||
POST /results
|
||||
Called from agent to post results of a task
|
||||
]#
|
||||
proc postResults*(ctx: Context) {.async.} =
|
||||
proc httpPost*(ctx: Context) {.async.} =
|
||||
|
||||
# Check headers
|
||||
# If POST data is not binary data, return 404 error code
|
||||
@@ -85,8 +63,19 @@ proc postResults*(ctx: Context) {.async.} =
|
||||
resp "", Http404
|
||||
return
|
||||
|
||||
try:
|
||||
handleResult(ctx.request.body.toBytes())
|
||||
try:
|
||||
# Differentiate between registration and task result packet
|
||||
var unpacker = Unpacker.init(ctx.request.body)
|
||||
let header = unpacker.deserializeHeader()
|
||||
|
||||
if cast[PacketType](header.packetType) == MSG_REGISTER:
|
||||
if not register(string.toBytes(ctx.request.body)):
|
||||
resp "", Http400
|
||||
return
|
||||
resp "", Http200
|
||||
|
||||
elif cast[PacketType](header.packetType) == MSG_RESULT:
|
||||
handleResult(string.toBytes(ctx.request.body))
|
||||
|
||||
except CatchableError:
|
||||
resp "", Http404
|
||||
|
||||
@@ -66,9 +66,8 @@ proc listenerStart*(cq: Conquest, host: string, portStr: string) =
|
||||
var listener = newApp(settings = listenerSettings)
|
||||
|
||||
# Define API endpoints
|
||||
listener.post("register", routes.register)
|
||||
listener.get("tasks", routes.getTasks)
|
||||
listener.post("results", routes.postResults)
|
||||
listener.get("get", routes.httpGet)
|
||||
listener.post("post", routes.httpPost)
|
||||
listener.registerErrorHandler(Http404, routes.error404)
|
||||
|
||||
# Store listener in database
|
||||
@@ -99,9 +98,8 @@ proc restartListeners*(cq: Conquest) =
|
||||
listener = newApp(settings = settings)
|
||||
|
||||
# Define API endpoints
|
||||
listener.post("register", routes.register)
|
||||
listener.get("tasks", routes.getTasks)
|
||||
listener.post("results", routes.postResults)
|
||||
listener.get("get", routes.httpGet)
|
||||
listener.post("post", routes.httpPost)
|
||||
listener.registerErrorHandler(Http404, routes.error404)
|
||||
|
||||
try:
|
||||
|
||||
@@ -4,7 +4,7 @@ import ../../common/[types, utils, serialize, sequence, crypto]
|
||||
|
||||
proc serializeTask*(cq: Conquest, task: var Task): seq[byte] =
|
||||
|
||||
var packer = initPacker()
|
||||
var packer = Packer.init()
|
||||
|
||||
# Serialize payload
|
||||
packer
|
||||
@@ -33,19 +33,19 @@ proc serializeTask*(cq: Conquest, task: var Task): seq[byte] =
|
||||
|
||||
proc deserializeTaskResult*(cq: Conquest, resultData: seq[byte]): TaskResult =
|
||||
|
||||
var unpacker = initUnpacker(resultData.toString)
|
||||
var unpacker = Unpacker.init(Bytes.toString(resultData))
|
||||
|
||||
let header = unpacker.deserializeHeader()
|
||||
|
||||
# Packet Validation
|
||||
validatePacket(header, cast[uint8](MSG_RESPONSE))
|
||||
validatePacket(header, cast[uint8](MSG_RESULT))
|
||||
|
||||
# Decrypt payload
|
||||
let payload = unpacker.getBytes(int(header.size))
|
||||
let decData= validateDecryption(cq.agents[uuidToString(header.agentId)].sessionKey, header.iv, payload, header.seqNr, header)
|
||||
|
||||
# Deserialize decrypted data
|
||||
unpacker = initUnpacker(decData.toString)
|
||||
unpacker = Unpacker.init(Bytes.toString(decData))
|
||||
|
||||
let
|
||||
taskId = unpacker.getUint32()
|
||||
@@ -71,7 +71,7 @@ proc deserializeTaskResult*(cq: Conquest, resultData: seq[byte]): TaskResult =
|
||||
|
||||
proc deserializeNewAgent*(cq: Conquest, data: seq[byte]): Agent =
|
||||
|
||||
var unpacker = initUnpacker(data.toString)
|
||||
var unpacker = Unpacker.init(Bytes.toString(data))
|
||||
|
||||
let header= unpacker.deserializeHeader()
|
||||
|
||||
@@ -87,7 +87,7 @@ proc deserializeNewAgent*(cq: Conquest, data: seq[byte]): Agent =
|
||||
let decData= validateDecryption(sessionKey, header.iv, payload, header.seqNr, header)
|
||||
|
||||
# Deserialize decrypted data
|
||||
unpacker = initUnpacker(decData.toString)
|
||||
unpacker = Unpacker.init(Bytes.toString(decData))
|
||||
|
||||
let
|
||||
listenerId = unpacker.getUint32()
|
||||
@@ -121,7 +121,7 @@ proc deserializeNewAgent*(cq: Conquest, data: seq[byte]): Agent =
|
||||
|
||||
proc deserializeHeartbeat*(cq: Conquest, data: seq[byte]): Heartbeat =
|
||||
|
||||
var unpacker = initUnpacker(data.toString)
|
||||
var unpacker = Unpacker.init(Bytes.toString(data))
|
||||
|
||||
let header = unpacker.deserializeHeader()
|
||||
|
||||
@@ -133,7 +133,7 @@ proc deserializeHeartbeat*(cq: Conquest, data: seq[byte]): Heartbeat =
|
||||
let decData= validateDecryption(cq.agents[uuidToString(header.agentId)].sessionKey, header.iv, payload, header.seqNr, header)
|
||||
|
||||
# Deserialize decrypted data
|
||||
unpacker = initUnpacker(decData.toString)
|
||||
unpacker = Unpacker.init(Bytes.toString(decData))
|
||||
|
||||
return Heartbeat(
|
||||
header: header,
|
||||
|
||||
Reference in New Issue
Block a user