mirror of
https://github.com/maxDcb/C2TeamServer
synced 2026-06-06 16:14:27 +00:00
137 lines
3.8 KiB
Python
137 lines
3.8 KiB
Python
import sys
|
|
import os
|
|
import time
|
|
from threading import Thread, Lock
|
|
from PyQt5.QtWidgets import *
|
|
from PyQt5.QtGui import *
|
|
from PyQt5.QtCore import *
|
|
from PyQt5.QtGui import QPixmap, QTransform
|
|
|
|
from grpcClient import *
|
|
|
|
|
|
# https://www.pythonguis.com/tutorials/pyqt-qgraphics-vector-graphics/
|
|
# https://github.com/HavocFramework/Havoc/blob/a3f36e843b4df7f7f9124c68e61c137811c87ee5/client/include/UserInterface/Widgets/SessionGraph.hpp#L87
|
|
class Graph(QWidget):
|
|
|
|
def __init__(self, parent, ip, port, devMode):
|
|
super(QWidget, self).__init__(parent)
|
|
|
|
width = self.frameGeometry().width()
|
|
height = self.frameGeometry().height()
|
|
|
|
print("width", width)
|
|
print("height", height)
|
|
|
|
self.ip = ip
|
|
self.port = port
|
|
self.grpcClient = GrpcClient(ip, port, devMode)
|
|
|
|
self.scene = QGraphicsScene()
|
|
|
|
for x in range(0,500,50):
|
|
self.scene.addLine(x, 0, x, 500)
|
|
for y in range(0,500,50):
|
|
self.scene.addLine(0, y, 500, y)
|
|
|
|
pixmap = QPixmap("firewall.png")
|
|
pixmap = pixmap.scaled(64, 64)
|
|
pixmapitem = self.scene.addPixmap(pixmap)
|
|
pixmapitem.setPos(100, 50 );
|
|
|
|
# pixmap = QPixmap("pc2.png")
|
|
# pixmap = pixmap.scaled(64, 64)
|
|
# pixmapitem = self.scene.addPixmap(pixmap)
|
|
# pixmapitem.setPos(250, 70)
|
|
|
|
self.view = QGraphicsView(self.scene)
|
|
self.view.setRenderHint(QPainter.Antialiasing)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.view._scene_rect = None
|
|
self.view._scene_transform = None
|
|
self.view._start_point = None
|
|
|
|
self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
self.view.setRenderHint(QPainter.Antialiasing)
|
|
self.view.setMouseTracking(True)
|
|
self.view.setTransformationAnchor(self.view.NoAnchor)
|
|
self.view.setResizeAnchor(self.view.NoAnchor)
|
|
|
|
|
|
transform = QTransform()
|
|
center = self.view.mapToScene(self.view.viewport().rect().center())
|
|
transform.translate(center.x(), center.y())
|
|
transform.scale(1 , 1 )
|
|
transform.translate(-center.x(), -center.y())
|
|
|
|
self.view.setTransform(transform)
|
|
|
|
|
|
|
|
|
|
|
|
# Set all items as moveable and selectable.
|
|
for item in self.scene.items():
|
|
item.setFlag(QGraphicsItem.ItemIsMovable)
|
|
item.setFlag(QGraphicsItem.ItemIsSelectable)
|
|
|
|
self.vbox = QVBoxLayout()
|
|
self.vbox.setContentsMargins(0, 0, 0, 0)
|
|
self.vbox.addWidget(self.view)
|
|
|
|
self.setLayout(self.vbox)
|
|
|
|
|
|
# Thread to get listeners every second
|
|
# https://realpython.com/python-pyqt-qthread/
|
|
self.thread = QThread()
|
|
self.getGraphInfoWorker = GetGraphInfoWorker()
|
|
self.getGraphInfoWorker.moveToThread(self.thread)
|
|
self.thread.started.connect(self.getGraphInfoWorker.run)
|
|
self.getGraphInfoWorker.checkin.connect(self.updateGraph)
|
|
self.thread.start()
|
|
|
|
|
|
def __del__(self):
|
|
self.getGraphInfoWorker.quit()
|
|
self.thread.quit()
|
|
self.thread.wait()
|
|
|
|
|
|
# query the server to get the list of listeners
|
|
def updateGraph(self):
|
|
listeners = self.grpcClient.getListeners()
|
|
|
|
sessions = self.grpcClient.getSessions()
|
|
|
|
# pixmap = QPixmap("pc.png")
|
|
# pixmap = pixmap.scaled(64, 64)
|
|
# pixmapitem = self.scene.addPixmap(pixmap)
|
|
# # pixmapitem.setPos(250, 70)
|
|
|
|
# # Set all items as moveable and selectable.
|
|
# for item in self.scene.items():
|
|
# item.setFlag(QGraphicsItem.ItemIsMovable)
|
|
# item.setFlag(QGraphicsItem.ItemIsSelectable)
|
|
|
|
|
|
class GetGraphInfoWorker(QObject):
|
|
checkin = pyqtSignal()
|
|
|
|
exit=False
|
|
|
|
def run(self):
|
|
while self.exit==False:
|
|
self.checkin.emit()
|
|
time.sleep(1)
|
|
|
|
def quit(self):
|
|
self.exit=True
|
|
|