Скачиваний:
12
Добавлен:
27.05.2017
Размер:
55.46 Кб
Скачать
import sys
from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import random
import hashlib

class NotRealNetwork:

    '''буфер, симулирующий сеть'''

    def __init__(self):
        self.contact=dict()#здесь лежит информация про зарегистрированные объекты и их "почтовые ящики"
        # потоки будут по очереди использовать этот словарь через блокировку

    def enter(self, name):

        '''Вход объекта в "сеть". Через имя объект может получить информацию о том,
        что с ним хотят свяаться. Тогда в списке будет кортеж их имени отправителя и
        содержания послания'''

        if self.contact.get(name) is None:
            self.contact[name]=[]
            return True
        else:
            return False

    def delete(self, name):
        if self.contact.get(name) is None:
            return False
        else:
            self.contact.pop(name)
            return True


    def write(self, send_name, rec_name, data):

        '''Пишет в ящик получателя информацию и имя отправителя'''
        if self.contact.get(rec_name) is None:
            return False
        else:
            self.contact[rec_name].append((send_name, data))
            return True

    def read(self, name):

        '''Выдаёт получателю следующий по очереди отправленный ему пакет, если он есть'''

        if self.contact.get(name):
            return self.contact[name].pop(0)
        else:
            return []

class Subject:

    '''Субьект протокола, управляется пользователем'''

    def __init__(self, name, web):
        self.name=name
        self.web=web
        self.chap_twice_database=dict()
        self.skey_database=dict()

    def reg_web(self):
        f=self.web.enter(self.name)
        return f

    def pap_auth_reg_inquiry(self, auth_system_name, login, password):

        '''посылает запрос на регистрацию по паролю. Никакой доп защиты'''
        send=dict()
        send['nomination']='pap reg'
        send['login']=login
        send['password']=password
        self.web.write(self.name, auth_system_name, send)

    def pap_auth_result(self, auth_system_name, suc, fail):

        '''проверяет результаты действия. suc - строка, возврат которо обозначает успех, fail - наоборот'''
        obj=objs=self.web.read(self.name) #берём первое письмо и запоминаем
        if not obj or obj is None: #если ничего не написали, то следующая попытка
            return False

        while not (obj[0]==auth_system_name and obj[1]['nomination']==suc): #другое письмо
            if obj[0]==auth_system_name and obj[1]['nomination']==fail: #пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj) #возвращаем ненужное письмо обратно в очередь
            obj=self.web.read(self.name) #и берём следующее
            if obj is objs: #если все письма уже перебрали, а нужного не нашли
                break
        else: # нашли нужное письмо!
            return True

    def pap_auth_check_inquiry(self, auth_system_name, login, password):
        send = dict()
        send['nomination'] = 'pap auth'
        send['login'] = login
        send['password'] = password
        f=self.web.write(self.name, auth_system_name, send)
        return f

    def chap_reg_inquiry(self, auth_system_name, login, password):

        '''посылает запрос на регистрацию по паролю. Никакой доп защиты'''

        send = dict()
        send['nomination'] = 'chap reg'
        send['login'] = login
        send['password'] = password
        self.web.write(self.name, auth_system_name, send)

    def chap_reg_result(self, auth_system_name, suc, fail):
#############дубль
        '''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            return True

    def chap_auth_check_inquiry(self, auth_system_name, login, is_twice=False):
        send = dict()
        send['login'] = login
        if is_twice:
            send['nomination'] = 'chap twice auth inquiry'
            number=random.randint(0, 2000000)
            send['number']=number
            self.chap_twice_database[auth_system_name+'number']=number
            self.web.write(self.name, auth_system_name, send)
            return number
        else:
            send['nomination'] = 'chap auth inquiry'
            f = self.web.write(self.name, auth_system_name, send)
            return f

    def chap_auth_check_inquiry_step_two(self, auth_system_name, suc, fail, login, password, is_twice=False):

        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            number = obj[1]['number']
            hashpass = hashlib.sha1(str(number).encode('utf-8'))
            hashpass.update(str(password).encode("utf-8"))

            send = dict()
            send['login'] = login
            send['hashpass'] = hashpass
            if is_twice:
                send['nomination']='chap twice auth pass'
                hashpass1=obj[1]['hashpass']
                hashpass2=hashlib.sha1(str(self.chap_twice_database[auth_system_name+'number']).encode('utf-8'))
                hashpass2.update(str(self.chap_twice_database[auth_system_name]).encode('utf8'))
                if hashpass1.hexdigest()==hashpass2.hexdigest():
                    self.web.write(self.name, auth_system_name, send)
                    return (hashpass.hexdigest(), number, hashpass1)
                else:
                    return False
            else:
                send['nomination'] = 'chap auth pass'
                self.web.write(self.name, auth_system_name, send)
                return (hashpass.hexdigest(), number)

    def chap_auth_check_inquiry_step_four(self, auth_system_name, suc, fail):

        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            return True

    def chap_twice_reg_inquiry(self, auth_system_name, login, password):

        '''посылает запрос на регистрацию по паролю. Никакой доп защиты'''

        send = dict()
        send['nomination'] = 'chap twice reg'
        send['login'] = login
        send['password'] = password
        self.web.write(self.name, auth_system_name, send)

    def chap_twice_reg_result(self, auth_system_name, suc, fail):
        '''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            self.chap_twice_database[obj[1]['login']]=obj[1]['password']
            return obj[1]

    def skey_reg_inquiry(self, auth_system_name, login, password):

        '''посылает запрос на регистрацию по паролю. Никакой доп защиты'''

        send = dict()
        send['nomination'] = 'skey reg'
        send['login'] = login
        send['password'] = password
        self.skey_database[login]=password
        self.web.write(self.name, auth_system_name, send)

    def skey_reg_result(self, auth_system_name, suc, fail, slogin):
        '''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            password=self.skey_database[slogin].encode('utf-8')
            k = hashlib.sha1(password)
            k.update(str(obj[1]['number']).encode('utf-8'))
            self.skey_database[slogin]=[]
            for i in range(100):
                self.skey_database[slogin].append(k.copy())
                k.update(password)
            self.skey_database[slogin].append(password)
            return obj[1]
##
    def skey_auth_check_inquiry(self, auth_system_name, login):
        send = dict()
        send['login'] = login
        send['nomination'] = 'skey auth inquiry'
        f = self.web.write(self.name, auth_system_name, send)
        return f

    def skey_auth_check_inquiry_step_two(self, auth_system_name, suc, fail, login):

        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            tran= obj[1]['transaction']
            hashpass=self.skey_database[login][100-tran]
            '''k=[]
            for i in self.skey_database[login][:99]:
                if i!=b'qwerty':
                    k.append(i.hexdigest())'''

            send = dict()
            send['hashpass'] = hashpass
            send['login']=login
            send['nomination']='skey auth pass'
            if tran==100:
                send['getnext']=True
            else:
                send['getnext']=False

            self.web.write(self.name, auth_system_name, send)
            return (hashpass, tran)

    def skey_auth_check_inquiry_step_four(self, auth_system_name, suc, fail, slogin):

        obj = objs = self.web.read(self.name)  # берём первое письмо и запоминаем
        if not obj or obj is None:  # если ничего не написали, то следующая попытка
            return False

        while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc):  # другое письмо
            if obj[0] == auth_system_name and obj[1]['nomination'] == fail:  # пришёл отказ - регистрация не удалать
                return False

            self.web.write(self.name, self.name, obj)  # возвращаем ненужное письмо обратно в очередь
            obj = self.web.read(self.name)  # и берём следующее
            if obj is objs:  # если все письма уже перебрали, а нужного не нашли
                break
        else:  # нашли нужное письмо!
            if obj[1]['number']:

                password = self.skey_database[slogin][101]
                k = hashlib.sha1(password)
                k.update(str(obj[1]['number']).encode('utf-8'))
                self.skey_database[slogin] = []
                for i in range(100):
                    self.skey_database[slogin].append(k.hexdigest())
                    k.update(password)
                self.skey_database[slogin].append(password)
            return True

class AuthSystem:

    '''Аутентификационная система'''

    def __init__(self, name, password, web):
        self.name=name
        self.password=password
        self.web=web
        self.pap_detabase=dict()
        self.chap_detabase=dict()
        self.chap_twice_database=dict()
        self.skey_database=dict()
        self.flag=True
        self.data=[]

    def reg_web(self):
        f=self.web.enter(self.name)
        return f

    def del_web(self):
        f=self.web.delete(self.name)
        return f

    def pap_auth_reg(self, name, obj):
        send=dict()
        if self.pap_detabase.get(obj['login']) is None:
            self.pap_detabase[obj['login']]=obj['password']
            send['nomination']='pap auth reg done'
            self.web.write(self.name, name, send)
            return True
        else:
            send['nomination']='pap auth reg fail'
            self.web.write(self.name, name, send)
            return False

    def pap_auth_check(self, name, obj):
        send=dict()
        if not self.pap_detabase.get(obj['login']) is None and self.pap_detabase[obj['login']]==obj['password']:
            send['nomination']='pap auth done'
            self.web.write(self.name, name, send)
            return True
        else:
            send['nomination'] = 'pap auth fail'
            self.web.write(self.name, name, send)
            return False

    def chap_reg(self, name, obj):
        send = dict()
        if self.chap_detabase.get(obj['login']) is None:
            self.chap_detabase[obj['login']] = obj['password']
            send['nomination'] = 'chap auth reg done'
            self.web.write(self.name, name, send)
            return True
        else:
            send['nomination'] = 'chap auth reg fail'
            self.web.write(self.name, name, send)
            return False

    def chap_auth_check_step_one(self, name, obj, is_twice=False):
        send = dict()
        if (not self.chap_detabase.get(obj['login']) is None) and not is_twice or is_twice and (not self.chap_twice_database.get(obj['login']) is None):
            if is_twice:
                send['nomination'] = 'chap twice auth random number'
                number=random.randint(0, 2000000)
                send['number']=number

                password=self.password
                number1 = obj['number']

                hashpass = hashlib.sha1(str(number1).encode('utf-8'))
                hashpass.update(str(password).encode("utf-8"))
                send['hashpass']=hashpass
                self.web.write(self.name, name, send)
                self.chap_twice_database[obj['login']+'number']=number
                return (number, hashpass, number1)

            else:
                send['nomination'] = 'chap auth random number'
                number=random.randint(0, 2000000)

                send['number']=number
                self.web.write(self.name, name, send)
                self.chap_detabase[obj['login']+'number']=number
                return number
        else:
            send['nomination'] = 'chap auth fail'
            self.web.write(self.name, name, send)
            return False

    def chap_auth_check_step_three(self, name, obj, is_twice=False):
        send = dict()
        if is_twice:
            database=self.chap_twice_database
            suc='chap twice auth suc'
            fail='chap twice auth fail'
        else:
            database=self.chap_detabase
            suc='chap auth suc'
            fail='chap auth fail'

        if not database.get(obj['login']) is None:
            hashpass=obj['hashpass'].hexdigest()
            number=database[obj['login']+'number']
            password=database[obj['login']]
            f=hashlib.sha1(str(number).encode('utf-8'))
            f.update(str(password).encode('utf-8'))
            f=f.hexdigest()
            if hashpass==f:
                send['nomination']=suc
                self.web.write(self.name, name, send)
                return True
            else:
                send['nomination'] = fail
                self.web.write(self.name, name, send)
                return False
        else:
            send['nomination'] = fail
            self.web.write(self.name, name, send)
            return False

    def chap_twice_reg(self, name, obj):
        send = dict()
        if self.chap_twice_database.get(obj['login']) is None:
            self.chap_twice_database[obj['login']] = obj['password']
            send['nomination'] = 'chap twice auth reg done'
            send['login']=self.name
            send['password']=self.password
            self.web.write(self.name, name, send)
            return True
        else:
            send['nomination'] = 'chap twice auth reg fail'
            self.web.write(self.name, name, send)
            return False

    def skey_reg(self, name, obj):
        send = dict()
        if self.skey_database.get(obj['login']) is None:
            self.skey_database[obj['login']] = dict()
            self.skey_database[obj['login']]['transaction']=1
            number=random.randint(0, 2000000)

            k=hashlib.sha1(obj['password'].encode('utf-8'))
            k.update(str(number).encode('utf-8'))
            for i in range(100):
                k.update(obj['password'].encode('utf-8'))
                k=k.copy()

            self.skey_database[obj['login']]['password'] = k.hexdigest()
            self.skey_database[obj['login']]['passinit']=obj['password'].encode('utf-8')

            send['nomination'] = 'skey auth reg done'
            send['number']=number
            self.web.write(self.name, name, send)
            return number
        else:
            send['nomination'] = 'skey auth reg fail'
            self.web.write(self.name, name, send)
            return False

    def skey_auth_step_one(self, name, obj):
        send = dict()
        if not self.skey_database.get(obj['login']) is None:
            send['nomination'] = 'skey auth tran'
            tran=self.skey_database[obj['login']]['transaction']
            send['transaction']=tran
            self.web.write(self.name, name, send)
            return tran
        else:
            send['nomination'] = 'skey auth fail'
            self.web.write(self.name, name, send)
            return False

    def skey_auth_step_three(self, name, obj):
        send = dict()

        if not self.skey_database.get(obj['login']) is None:
            hashpass=obj['hashpass']
            password=self.skey_database[obj['login']]['passinit']
            f=self.skey_database[obj['login']]['password']
            hs=hashpass.copy()
            ff=hs.hexdigest()
            hashpass.update(password)
            hashpass=hashpass.hexdigest()
            if hashpass==f:
                send['nomination']='skey auth suc'
                self.skey_database[obj['login']]['transaction']=self.skey_database[obj['login']]['transaction']+1
                self.skey_database[obj['login']]['password']=ff
                if obj['getnext']:
                    send['number']=random.randint(0, 2000000)
                else:
                    send['number']=False
                self.web.write(self.name, name, send)
                return True
            else:
                send['nomination'] = 'skey auth fail'
                self.web.write(self.name, name, send)
                return False
        else:
            send['nomination'] = 'skey auth fail'
            self.web.write(self.name, name, send)
            return False


    def signal_waiting(self):
        obj=self.web.read(self.name)#obj - name, описание, login, password
        if not obj or obj is None:
            return

        if obj[1]['nomination']=='pap reg':
            f=self.pap_auth_reg(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='pap auth':
            f=self.pap_auth_check(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap reg':
            f=self.chap_reg(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap auth inquiry':
            f=self.chap_auth_check_step_one(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap auth pass':
            f=self.chap_auth_check_step_three(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap twice reg':
            f=self.chap_twice_reg(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap twice auth inquiry':
            f=self.chap_auth_check_step_one(obj[0], obj[1], True)
            self.data.append((obj, f))
        elif obj[1]['nomination']=='chap twice auth pass':
            f=self.chap_auth_check_step_three(obj[0], obj[1], True)
            self.data.append((obj, f))
        elif obj[1]['nomination']=='skey reg':
            f=self.skey_reg(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='skey auth inquiry':##
            f=self.skey_auth_step_one(obj[0], obj[1])
            self.data.append((obj, f))
        elif obj[1]['nomination']=='skey auth pass':
            f=self.skey_auth_step_three(obj[0], obj[1])
            self.data.append((obj, f))
        else:
            self.data.append(('', 'error letter', False, False))


class SubjectDraw(QWidget):

    '''Визуализация субъектов'''

    def __init__(self, web):
        QWidget.__init__(self)
        self.initUI()
        self.subject=dict() # массив с зарегистрированными субъектами
        self.web=web

    def initUI(self):
        self.resize(500, 700)
        vbox = QVBoxLayout()

        hbox1 = QHBoxLayout()
        self.name = QLabel("Имя")
        hbox1.addWidget(self.name)
        self.system_name = QLabel("Имя системы")
        hbox1.addWidget(self.system_name)
        self.login_label = QLabel("Логин")
        hbox1.addWidget(self.login_label)
        self.password_label = QLabel("Пароль")
        hbox1.addWidget(self.password_label)
        vbox.addLayout(hbox1)

        hbox2 = QHBoxLayout()
        self.name_edit = QLineEdit()
        self.name_edit.setText("name")
        hbox2.addWidget(self.name_edit)
        self.system_name_edit = QLineEdit()
        self.system_name_edit.setText("sys")
        hbox2.addWidget(self.system_name_edit)
        self.login_edit = QLineEdit()
        self.login_edit.setText("name1")
        hbox2.addWidget(self.login_edit)
        self.password_edit = QLineEdit()
        self.password_edit.setText("qwety")
        hbox2.addWidget(self.password_edit)
        vbox.addLayout(hbox2)

        self.plain_text = QPlainTextEdit()
        vbox.addWidget(self.plain_text)

        hbox = QHBoxLayout()
        self.create_button = QPushButton("Создать объект")
        self.create_button.clicked.connect(self.create_subject)
        hbox.addWidget(self.create_button)
        self.web_button = QPushButton("Зайти в сеть")
        self.web_button.clicked.connect(self.web_reg)
        hbox.addWidget(self.web_button)
        self.pap_reg_button = QPushButton("Зарегистрироваться PAP")
        self.pap_reg_button.clicked.connect(self.pap_reg)
        hbox.addWidget(self.pap_reg_button)
        self.pap_reg_check_button = QPushButton("Проверить регистрацию PAP")
        self.pap_reg_check_button.clicked.connect(self.pap_reg_check)
        hbox.addWidget(self.pap_reg_check_button)
        self.pap_auth_button = QPushButton("Авторизоваться PAP")
        self.pap_auth_button.clicked.connect(self.pap_auth)
        hbox.addWidget(self.pap_auth_button)
        self.pap_auth_check_button = QPushButton("Проверить авторизацию PAP")
        self.pap_auth_check_button.clicked.connect(self.pap_auth_check)
        hbox.addWidget(self.pap_auth_check_button)
        vbox.addLayout(hbox)

        hbox1 = QHBoxLayout()
        self.chap_reg_button = QPushButton("Зарегистрироваться CHAP")
        self.chap_reg_button.clicked.connect(self.chap_reg)
        hbox1.addWidget(self.chap_reg_button)
        self.chap_reg_check_button = QPushButton("Проверить регистрацию CHAP")
        self.chap_reg_check_button.clicked.connect(self.chap_reg_check)
        hbox1.addWidget(self.chap_reg_check_button)
        self.chap_auth_button = QPushButton("Авторизоваться CHAP")
        self.chap_auth_button.clicked.connect(self.chap_auth_init)
        hbox1.addWidget(self.chap_auth_button)
        self.chap_auth_button_step_two = QPushButton("Отправить хэш")
        self.chap_auth_button_step_two.clicked.connect(self.chap_auth_step_two)
        hbox1.addWidget(self.chap_auth_button_step_two)
        self.chap_auth_check_button = QPushButton("Результаты авторизации CHAP")
        self.chap_auth_check_button.clicked.connect(self.chap_auth_step_four)
        hbox1.addWidget(self.chap_auth_check_button)
        vbox.addLayout(hbox1)

        hbox2 = QHBoxLayout()
        self.chap_twice_reg_button = QPushButton("Зарегистрироваться двойным CHAP")
        self.chap_twice_reg_button.clicked.connect(self.chap_twice_reg)
        hbox2.addWidget(self.chap_twice_reg_button)
        self.chap_twice_reg_check_button = QPushButton("Проверить двойную регистрацию CHAP")
        self.chap_twice_reg_check_button.clicked.connect(self.chap_twice_reg_check)
        hbox2.addWidget(self.chap_twice_reg_check_button)
        self.chap_twice_auth_button = QPushButton("Двойная авторизоваться CHAP")
        self.chap_twice_auth_button.clicked.connect(self.chap_twice_auth_init)
        hbox2.addWidget(self.chap_twice_auth_button)
        self.chap_twice_auth_button_step_two = QPushButton("Отправить хэш")
        self.chap_twice_auth_button_step_two.clicked.connect(self.chap_twice_auth_step_two)
        hbox2.addWidget(self.chap_twice_auth_button_step_two)
        self.chap_twice_auth_check_button = QPushButton("Результаты авторизации CHAP")
        self.chap_twice_auth_check_button.clicked.connect(self.chap_twice_auth_step_four)
        hbox2.addWidget(self.chap_twice_auth_check_button)
        vbox.addLayout(hbox2)

        hbox3 = QHBoxLayout()
        self.skey_reg_button = QPushButton("Зарегистрироваться S/KEY")
        self.skey_reg_button.clicked.connect(self.skey_reg)
        hbox3.addWidget(self.skey_reg_button)
        self.skey_reg_check_button = QPushButton("Проверить регистрацию S/KEY")
        self.skey_reg_check_button.clicked.connect(self.skey_reg_check)
        hbox3.addWidget(self.skey_reg_check_button)
        self.skey_auth_button = QPushButton("Авторизоваться S/KEY")
        self.skey_auth_button.clicked.connect(self.skey_auth_init)
        hbox3.addWidget(self.skey_auth_button)
        self.skey_auth_button_step_two = QPushButton("Отправить хэш")
        self.skey_auth_button_step_two.clicked.connect(self.skey_auth_step_two)
        hbox3.addWidget(self.skey_auth_button_step_two)
        self.skey_auth_check_button = QPushButton("Результаты авторизации S/KEY")
        self.skey_auth_check_button.clicked.connect(self.skey_auth_step_four)
        hbox3.addWidget(self.skey_auth_check_button)
        vbox.addLayout(hbox3)

        self.setLayout(vbox)

    def create_subject(self):
        name=self.name_edit.text()
        if not self.subject.get(name) is None:
            self.plain_text.appendPlainText("Уже зарегистрирован")
        else:
            self.subject[name]=Subject(name, self.web)
            self.plain_text.appendPlainText("Создан")

    def web_reg(self):
        name = self.name_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Объекта нет")
        else:
            if self.subject[name].reg_web():
                self.plain_text.appendPlainText("Зашёл")
            else:
                self.plain_text.appendPlainText("Вход этим именем уже произведён")

    def pap_reg(self):
        name=self.name_edit.text()
        system_name=self.system_name_edit.text()
        login=self.login_edit.text()
        password=self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не создан")
            return
        else:
            self.subject[name].pap_auth_reg_inquiry(system_name, login, password)
            self.plain_text.appendPlainText("Запрос регистрации отправлен")

    def pap_reg_check(self):
        name = self.name_edit.text()
        system_name=self.system_name_edit.text()
        if self.subject[name].pap_auth_result(system_name, "pap auth reg done", "pap auth reg fail"):
            self.plain_text.appendPlainText("Регистрация успешна")
        else:
            self.plain_text.appendPlainText("Регистрация не прошла")

    def pap_auth(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            self.subject[name].pap_auth_check_inquiry(system_name, login, password)
            self.plain_text.appendPlainText("Запрос на авторизацию отправлен")

    def pap_auth_check(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        if self.subject[name].pap_auth_result(system_name, "pap auth done", "pap auth fail"):
            self.plain_text.appendPlainText("Аутентификация успешна")
        else:
            self.plain_text.appendPlainText("Аутентификация не прошла")

    def chap_reg_check(self):
        name = self.name_edit.text()
        system_name=self.system_name_edit.text()
        if self.subject[name].chap_reg_result(system_name, "chap auth reg done", "chap auth reg fail"):
            self.plain_text.appendPlainText("Регистрация успешна")
        else:
            self.plain_text.appendPlainText("Регистрация не прошла")

    def chap_reg(self):
        name=self.name_edit.text()
        system_name=self.system_name_edit.text()
        login=self.login_edit.text()
        password=self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не создан")
            return
        else:
            self.subject[name].chap_reg_inquiry(system_name, login, password)
            self.plain_text.appendPlainText("Запрос регистрации отправлен")

    def chap_auth_init(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            self.subject[name].chap_auth_check_inquiry(system_name, login)
            self.plain_text.appendPlainText("Запрос на авторизацию отправлен")

    def chap_auth_step_two(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            obj=self.subject[name].chap_auth_check_inquiry_step_two(system_name, 'chap auth random number', 'chap auth fail', login, password)
            self.plain_text.appendPlainText("Пришло случайное число "+str(obj[1])+". Пароль отправлен, хеш - "+str(obj[0]))
            return

    def chap_auth_step_four(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            obj = self.subject[name].chap_auth_check_inquiry_step_four(system_name, 'chap auth suc', 'chap auth fail')
            if obj:
                self.plain_text.appendPlainText("Авторизация прошла")
            else:
                self.plain_text.appendPlainText("Авторизация не прошла")

            return

    def chap_twice_reg(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не создан")
            return
        else:
            self.subject[name].chap_twice_reg_inquiry(system_name, login, password)
            self.plain_text.appendPlainText("Запрос регистрации отправлен")

    def chap_twice_reg_check(self):
        name = self.name_edit.text()
        system_name=self.system_name_edit.text()
        f = self.subject[name].chap_twice_reg_result(system_name, "chap twice auth reg done", "chap twice auth reg fail")
        if f:
            self.plain_text.appendPlainText(
                "Регистрация успешна, логин системы " + f['login'] + ", пароль " + f['password'])
        else:
            self.plain_text.appendPlainText("Регистрация не прошла")

    def chap_twice_auth_init(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            n=self.subject[name].chap_auth_check_inquiry(system_name, login, True)
            self.plain_text.appendPlainText("Запрос на авторизацию отправлен вместе со случайным числом "+str(n))

    def chap_twice_auth_step_two(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            obj = self.subject[name].chap_auth_check_inquiry_step_two(system_name, 'chap twice auth random number','chap twice auth fail', login, password, True)
            self.plain_text.appendPlainText("Пришло случайное число " + str(obj[1]) + " и хэш пароля "+ str(obj[2].hexdigest())+ ". Пароль отправлен, хеш - " + str(obj[0])+" Система аутентификации аутетифицирована")
            return

    def chap_twice_auth_step_four(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            obj = self.subject[name].chap_auth_check_inquiry_step_four(system_name, 'chap twice auth suc', 'chap twice auth fail')
            if obj:
                self.plain_text.appendPlainText("Авторизация прошла")
            else:
                self.plain_text.appendPlainText("Авторизация не прошла")

            return

    def skey_reg(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        password = self.password_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не создан")
            return
        else:##
            self.subject[name].skey_reg_inquiry(system_name, login, password)
            self.plain_text.appendPlainText("Запрос регистрации отправлен")

    def skey_reg_check(self):
        name=self.name_edit.text()
        login = self.login_edit.text()
        system_name=self.system_name_edit.text()
        f = self.subject[name].skey_reg_result(system_name, "skey auth reg done", "skey auth reg fail", login)
        if f:
            self.plain_text.appendPlainText(
                "Регистрация успешна, получено случайное число " + str(f['number']))
        else:
            self.plain_text.appendPlainText("Регистрация не прошла")

    def skey_auth_init(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            self.subject[name].skey_auth_check_inquiry(system_name, login)
            self.plain_text.appendPlainText("Запрос на авторизацию отправлен")

    def skey_auth_step_two(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        login = self.login_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:##
            obj = self.subject[name].skey_auth_check_inquiry_step_two(system_name, 'skey auth tran','skey auth fail', login)
            self.plain_text.appendPlainText("Пришёл номер транзакции " + str(obj[1]) + ".Отправлен хэш "+ str(obj[0].hexdigest()))
            return

    def skey_auth_step_four(self):
        name = self.name_edit.text()
        system_name = self.system_name_edit.text()
        if self.subject.get(name) is None:
            self.plain_text.appendPlainText("Не зарегистрирован")
            return
        else:
            obj = self.subject[name].skey_auth_check_inquiry_step_four(system_name, 'skey auth suc', 'skey auth fail', name)
            if obj:
                self.plain_text.appendPlainText("Авторизация прошла")
            else:
                self.plain_text.appendPlainText("Авторизация не прошла")

            return

class SystemDraw(QWidget):

    '''Визуализация систем аутентификации'''

    def __init__(self, web):
        QWidget.__init__(self)
        self.initUI()
        self.system=dict() # словарь систем
        self.web=web

    def initUI(self):
        self.resize(500, 700)
        vbox = QVBoxLayout()

        hbox = QHBoxLayout()
        self.name = QLabel("Имя системы")
        hbox.addWidget(self.name)
        self.name_edit = QLineEdit()
        self.name_edit.setText('sys')
        hbox.addWidget(self.name_edit)
        self.password = QLabel("Пароль системы")
        hbox.addWidget(self.password)
        self.pass_edit = QLineEdit()
        self.pass_edit.setText('12345')
        hbox.addWidget(self.pass_edit)
        self.create_button=QPushButton("Создать")
        self.create_button.clicked.connect(self.create_system)
        hbox.addWidget(self.create_button)
        self.reg_button=QPushButton("Зарегистрировать")
        self.reg_button.clicked.connect(self.reg_system)
        hbox.addWidget(self.reg_button)
        self.stop_button=QPushButton("Удалить")
        self.stop_button.clicked.connect(self.stop_system)
        hbox.addWidget(self.stop_button)
        self.read_button=QPushButton("Считать")
        self.read_button.clicked.connect(self.read_data)
        hbox.addWidget(self.read_button)
        vbox.addLayout(hbox)

        self.plain_text = QPlainTextEdit()
        vbox.addWidget(self.plain_text)

        self.setLayout(vbox)

    def create_system(self):
        name=self.name_edit.text()
        password=self.pass_edit.text()
        if not self.system.get(name) is None:
            self.plain_text.appendPlainText("Система с таким именем уже существует")
        else:
            self.system[name]=AuthSystem(name, password, self.web)
            self.plain_text.appendPlainText("Система создана")

    def reg_system(self):
        name=self.name_edit.text()
        f=self.system[name].reg_web()
        if f:
            self.plain_text.appendPlainText("Система зарегистрирована в сети")
        else:
            self.plain_text.appendPlainText("Регистрация в сети невозможна")

    def stop_system(self):
        name=self.name_edit.text()
        if self.system.get(name) is None:
            self.plain_text.appendPlainText("Система с таким именем не существует")
        else:
            self.system[name].del_web()
            self.system.pop(name)
            self.plain_text.appendPlainText("Удалена")

    def read_data(self):
        #захватить данные системы
        name=self.name_edit.text()
        if self.system.get(name) is None:
            self.plain_text.appendPlainText("Система с таким именем не существует")
        else:
            self.system[name].signal_waiting()
            if self.system[name].data:
                if self.system[name].data is None:
                    self.plain_text.appendPlainText(name + " - ничего не принято" )
                    return

                obj=self.system[name].data[0]#cообщение и результат. Надо сделать перебор
                if obj[0][1]['nomination']=='pap reg':
                    self.plain_text.appendPlainText(name+" принят запрос на регистрацию pap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Регистрация прошла")
                    else:
                        self.plain_text.appendPlainText("Регистрация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='pap auth':
                    self.plain_text.appendPlainText(name+" принят запрос на авторизацию pap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Авторизация прошла")
                    else:
                        self.plain_text.appendPlainText("Авторизация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap reg':
                    self.plain_text.appendPlainText(name+" принят запрос на регистрацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Авторизация прошла")
                    else:
                        self.plain_text.appendPlainText("Авторизация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap auth inquiry':
                    self.plain_text.appendPlainText(name+" принят запрос на авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+". Сгенерировано случайное число "+str(obj[1]))
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap auth pass':
                    self.plain_text.appendPlainText(name+" принят запрос на авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", хэш "+str(obj[0][1]['hashpass'].hexdigest()))
                    if obj[1]:
                        self.plain_text.appendPlainText("Авторизация прошла")
                    else:
                        self.plain_text.appendPlainText("Авторизация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap twice reg':
                    self.plain_text.appendPlainText(name + " принят запрос на двойную регистрацию chap от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Регистрация прошла")
                    else:
                        self.plain_text.appendPlainText("регистрация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap twice auth inquiry':
                    self.plain_text.appendPlainText(name+" принят запрос на двойную авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+". Сгенерировано случайное число "+str(obj[1][0])+". Послан хэш "+str(obj[1][1].hexdigest())+", сгенерированный по числу "+str(obj[1][2]))
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap twice auth pass':
                    self.plain_text.appendPlainText(name+" принят запрос на двойную авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", хэш "+str(obj[0][1]['hashpass'].hexdigest()))
                    if obj[1]:
                        self.plain_text.appendPlainText("Авторизация прошла")
                    else:
                        self.plain_text.appendPlainText("Авторизация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='chap twice reg':
                    self.plain_text.appendPlainText(name + " принят запрос на регистрацию chap от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Регистрация прошла")
                    else:
                        self.plain_text.appendPlainText("Регистрация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='skey reg':
                    self.plain_text.appendPlainText(name + " принят запрос на регистрацию S/KEY от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Регистрация прошла, послано случайное число "+str(obj[1]))
                    else:
                        self.plain_text.appendPlainText("Регистрация не прошла")
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='skey auth inquiry':
                    self.plain_text.appendPlainText(name+" принят запрос на авторизацию S/KEY от "+obj[0][0]+", логин "+obj[0][1]['login']+". Нормер транзакции "+str(obj[1]))
                    self.system[name].data.pop()
                    return
                elif obj[0][1]['nomination']=='skey auth pass':
                    self.plain_text.appendPlainText(name+" принят запрос на авторизацию S/KEY от "+obj[0][0]+", логин "+obj[0][1]['login'])
                    if obj[1]:
                        self.plain_text.appendPlainText("Авторизация прошла")
                    else:
                        self.plain_text.appendPlainText("Авторизация не прошла")
                    self.system[name].data.pop()
                    return
            else:
                self.plain_text.appendPlainText("Ничего не принято")
                return

w=NotRealNetwork()
app = QApplication(sys.argv)
s1 = SubjectDraw(w)
s2 = SystemDraw(w)
s1.show()
s2.show()
app.exit(app.exec_())
Соседние файлы в предмете Технология построения защищенных распределённых приложений