shadowbrokers-exploits/windows/Resources/Dsz/PyScripts/Lib/gui/networkserver/response.py
2017-04-14 11:45:07 +02:00

199 lines
No EOL
6.3 KiB
Python

import re
#----------------------------------------------------------------
# Holds response objects for the networkserver client.
#----------------------------------------------------------------
#----------------------------------------------------------------
# An unknown response.
#----------------------------------------------------------------
class UnknownResponse(object):
def __init__(self, xml):
self.xml = xml
def __repr__(self):
return "Unknown response: %s" % (xml.toprettyxml(indent=" "))
#----------------------------------------------------------------
# The identity of the target you have connected to. Danderspritz
# returns 'Live Peer', but anything that follows the Danderspritz
# IPC could provide something else
#----------------------------------------------------------------
class RemoteIdentification(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "Identification: %s" % (self.name)
#----------------------------------------------------------------
# A ping request from the target.
#----------------------------------------------------------------
class RemotePing(object):
pass
def __repr__(self):
return "Remote Ping"
#----------------------------------------------------------------
# A ping response from the target.
#----------------------------------------------------------------
class RemotePong(object):
pass
def __repr__(self):
return "Remote Pong"
#----------------------------------------------------------------
# A message from the server. The work-horse message. Check the
# 'message' field for the wrapped message
#----------------------------------------------------------------
class RemoteMessage(object):
def __init__(self, msg):
self.message = msg
def __repr__(self):
return "RemoteMessage: %s" % (self.message)
#----------------------------------------------------------------
# A requested command has been run - but not necessarily finished
# The requestId field is the request id provided when the request
# was registered.
# taskId and operation are the identifiers used to determine
# task data
#----------------------------------------------------------------
class ExecutedRequest(object):
def __init__(self, reqId, operation, taskId):
self.requestId = reqId
self.operation = operation
self.taskid = taskId
def __repr__(self):
return "ExecutedRequest: %d (%s <=> %d)" % (self.requestId, self.operation, self.taskid)
#----------------------------------------------------------------
# A requested command has been run and completed
# The requestId field is the request id provided when the request
# was registered.
# taskId and operation are the identifiers used to determine
# task data
#----------------------------------------------------------------
class CompletedRequest(object):
def __init__(self, reqId, operation, taskId, status):
self.requestId = reqId
self.operation = operation
self.taskid = taskId
self.status = status
def __repr__(self):
return "CompletedRequest: %d (%s <=> %d) == %s" % (self.requestId, self.operation, self.taskid, self.status)
#----------------------------------------------------------------
# A requested command was cancelled
# The requestId field is the request id provided when the request
# was registered.
#----------------------------------------------------------------
class CancelledRequest(object):
def __init__(self, id):
self.id = id
def __repr__(self):
return "Cancelled Request: %d" % (self.id)
#----------------------------------------------------------------
# A requested command was denied
# The requestId field is the request id provided when the request
# was registered.
#----------------------------------------------------------------
class DeniedRequest(object):
def __init__(self, id):
self.id = id
def __repr__(self):
return "Denied Request: %d" % (self.id)
#----------------------------------------------------------------
# A newly requested operation
#----------------------------------------------------------------
class NewRequest(object):
def __init__(self, requestId, source, key, data):
self.requestId = requestId
self.source = source
self.key = key
self.data = data
def __repr__(self):
return "New Request: %d, %s, %s\n\t%s" % (self.requestId, self.source, self.key, self.data)
#----------------------------------------------------------------
# Task Data
# The data is stored in a dictionary, according to the task's
# documentation.
#----------------------------------------------------------------
class TaskData(object):
def __init__(self, name, operation, id, parentId, data):
self.data = DataObject(data)
self.name = name
self.operation = operation
self.id = id
self.parentId = parentId
def __repr__(self):
return "TaskData: %d: %s => %s" % (self.id, self.name, self.data)
def __getitem__(self, index):
return self.data[index]
#----------------------------------------------------------------
# Data Object
# Holds data from a command, and provides indexing lookup
#----------------------------------------------------------------
class DataObject(object):
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return _derive([self.data], index.split("::"))
#----------------------------------------------------------------
def _splitStep(step):
try:
m = re.match("(.*)\[([0-9+])\]$", step)
return (m.group(1), int(m.group(2)))
except:
return (step, -1)
#----------------------------------------------------------------
def _derive(data, steps):
if ((data == None) or (len(data) == 0)):
return None
newData = []
for d in data:
(string, index) = _splitStep(steps[0])
a = d[string]
if (index == -1):
newData += a
else:
newData.append(a[index])
if len(steps) == 1:
return newData
else:
return _derive(newData, steps[1:])