Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37047646
en ru br
ALT Linux repos
S:0.12-alt10

Group :: Security/Networking
RPM: token-manager

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: token-manager-port-to-python3-and-PyQt5.patch
Download


diff --git a/token-manager.py b/token-manager.py
index e51466d..21930ce 100755
--- a/token-manager.py
+++ b/token-manager.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
 """
@@ -41,8 +41,10 @@ THE SOFTWARE.
 """
 import os
 import sys
-from PyQt4 import QtCore
-from PyQt4 import QtGui
+from PyQt5 import QtCore
+from PyQt5 import QtGui
+from PyQt5 import QtWidgets
+from PyQt5.QtGui import QIcon, QPixmap, QColor
 import subprocess
 import platform
 import re
@@ -55,7 +57,7 @@ except AttributeError:
         return s
 
 try:
-    _encoding = QtGui.QApplication.UnicodeUTF8
+    _encoding = QtWidgets.QApplication.UnicodeUTF8
 
 
     def _translate(context, text, disambig):
@@ -66,12 +68,12 @@ try:
         :param disambig:
         :return:
         """
-        return QtGui.QApplication.translate(context, text, disambig, _encoding)
+        return QtWidgets.QApplication.translate(context, text, disambig, _encoding)
 except AttributeError:
     def _translate(context, text, disambig):
-        return QtGui.QApplication.translate(context, text, disambig)
+        return QtWidgets.QApplication.translate(context, text, disambig)
 
-qt_resource_data = "\
+qt_resource_data = b"\
 \x00\x00\x01\x64\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -173,7 +175,7 @@ qt_resource_data = "\
 \x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 "
 
-qt_resource_name = "\
+qt_resource_name = b"\
 \x00\x06\
 \x07\x03\x7d\xc3\
 \x00\x69\
@@ -192,7 +194,7 @@ qt_resource_name = "\
 \x00\x6f\x00\x6f\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
 "
 
-qt_resource_struct = "\
+qt_resource_struct = b"\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\
 \x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x03\x60\
@@ -215,8 +217,6 @@ if platform.machine() == 'x86_64':
     arch = 'amd64'
 elif platform.machine() == 'i686':
     arch = 'ia32'
-elif  platform.machine() == 'e2k':
-    arch = 'e2k64'
 else:
     exit(-1)
 
@@ -224,7 +224,7 @@ else:
 def get_cspversion():
     csptest = subprocess.Popen(['/opt/cprocsp/bin/%s/csptest' % arch, '-keyset', '-verifycontext'],
                                stdout=subprocess.PIPE)
-    output = csptest.communicate()[0].split('\n')[0]
+    output = csptest.communicate()[0].decode().split('\n')[0]
     r = re.search(r'v([0-9.]*[0-9]+)\ (.+)\ Release Ver\:([0-9.]*[0-9]+)\ OS\:([a-zA-z]+)', output)
     return r.group(1), r.group(2), r.group(3), r.group(4)
 
@@ -235,20 +235,20 @@ def versiontuple(v):
 
 def get_tokens():
     list_pcsc = subprocess.Popen(['/opt/cprocsp/bin/%s/list_pcsc' % arch], stdout=subprocess.PIPE)
-    output = list_pcsc.communicate()[0]
+    output = list_pcsc.communicate()[0].decode()
     if 'ERROR' in output:
-        return u'<ключевых носителей не обнаружено>', 1
+        return '<ключевых носителей не обнаружено>', 1
     m = re.findall(r'(?:available reader: |^)(.+)', output, re.MULTILINE)
     return m, 0
 
 
 def get_token_serial(token):
     opensc_tool = subprocess.Popen(['/usr/bin/opensc-tool', '--serial', '-r', token], stdout=subprocess.PIPE)
-    output = opensc_tool.communicate()[0]
+    output = opensc_tool.communicate()[0].decode()
     try:
         serial = '%010d' % int(output[:11].replace(' ', ''), 16)
     except:
-        return u'б/н'
+        return 'б/н'
     if not opensc_tool.returncode:
         return serial
 
@@ -256,10 +256,10 @@ def get_token_serial(token):
 def get_token_certs(token):
     csptest = subprocess.Popen(['/opt/cprocsp/bin/%s/csptest' % arch, '-keyset', '-enum_cont', '-unique', '-fqcn',
                                 '-verifyc'], stdout=subprocess.PIPE)
-    output = csptest.communicate()[0]
+    output = csptest.communicate()[0].decode('cp1251', 'ignore')
     certs = []
     if csptest.returncode:
-        return u'Ошибка', 1
+        return 'Ошибка', 1
     for line in output.split("\n"):
         if token in line:
             certs.append(line)
@@ -269,14 +269,14 @@ def get_token_certs(token):
 def get_store_certs(store):
     if store == 'root':
         certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-store', 'root'], stdout=subprocess.PIPE)
-        output = certmgr.communicate()[0]
+        output = certmgr.communicate()[0].decode()
         m = re.findall(r'(\d+)-{7}\nIssuer.*?: (.+?)\n.*?Subject.*?: (.+?)\n.*?Serial.*?: (0x\w+?)\nSHA1 Hash.*?(\w+?)\n.*?Not valid before.*?(\d.+?)UTC\nNot valid after.*?(\d.+?)UTC', output, re.MULTILINE + re.DOTALL)
     else:
         if versiontuple(get_cspversion()[2]) >= versiontuple("4.0.9708"):
             certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-store', store], stdout=subprocess.PIPE)
         else:
             certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-verbose', '-store', store], stdout = subprocess.PIPE)
-        output = certmgr.communicate()[0]
+        output = certmgr.communicate()[0].decode()
         m = re.findall(r'(\d+)-{7}\nIssuer.*?: (.+?)\n.*?Subject.*?: (.+?)\n.*?Serial.*?: (0x\w+?)\nSHA1 Hash.*?(\w+?)\n.*?Not valid before.*?(\d.+?)UTC\nNot valid after.*?(\d.+?)UTC.+?Extended Key Usage.*?([\d\.\s]+)\n', output, re.MULTILINE + re.DOTALL)
     return m
 
@@ -286,7 +286,7 @@ def list_cert(cert):
         certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-cont', cert], stdout=subprocess.PIPE)
     else:
         certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-verbose', '-cont', cert], stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     m = re.findall(r'(\d+)-{7}\nIssuer.*?: (.+?)\n.*?Subject.*?: (.+?)\n.*?Serial.*?: (0x.+?)\nSHA1 Hash.*?(.+?)\n.*?Not valid before.*?(\d.+?)UTC\nNot valid after.*?(\d.+?)UTC.+?Extended Key Usage.*?([\d\.\s]+)\n',
         output, re.MULTILINE + re.DOTALL)
     return m
@@ -295,44 +295,44 @@ def list_cert(cert):
 def inst_cert(cert):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-inst', '-store', 'uMy', '-cont',
                                 cert], stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     if certmgr.returncode:
         return output.split("\n")[-1]
-    return u"Сертификат успешно установлен"
+    return "Сертификат успешно установлен"
 
 
 def inst_cert_from_file(filepath):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-inst', '-store', 'uMy', '-file',
                                 filepath], stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     if certmgr.returncode:
         return output.split("\n")[-1]
-    return u"Сертификат успешно установлен"
+    return "Сертификат успешно установлен"
 
 
 def del_cont(cert):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-delete', '-cont', cert], stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     if certmgr.returncode:
         return output
-    return u"Сертификат успешно удален"
+    return "Сертификат успешно удален"
 
 
 def del_store_cert(cert_index, store):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-delete', '-store', store],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE, stdin=subprocess.PIPE)
-    output = certmgr.communicate(cert_index)[0]
+    output = certmgr.communicate(cert_index.encode())[0].decode()
     if certmgr.returncode:
         return output
-    return u"Сертификат успешно удален"
+    return "Сертификат успешно удален"
 
 
 def set_license(cpro_license):
     cpconfig = subprocess.Popen(['/usr/bin/cpconfig-%s' % arch, '-license', '-set', cpro_license],
                                 stdout=subprocess.PIPE)
-    output = cpconfig.communicate()[0]
+    output = cpconfig.communicate()[0].decode()
     if cpconfig.returncode:
         return output.split("\n")[-1], 1
     return None, 0
@@ -340,14 +340,14 @@ def set_license(cpro_license):
 
 def get_license():
     cpconfig = subprocess.Popen(['/opt/cprocsp/sbin/%s/cpconfig' % arch, '-license', '-view'], stdout=subprocess.PIPE)
-    output = cpconfig.communicate()[0]
+    output = cpconfig.communicate()[0].decode()
     return output
 
 
 def install_root_cert(file):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-inst', '-store', 'root', '-file', file],
                                stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     m = re.findall(
         r'(\d+)-{7}\nIssuer.*?CN=(.+?)[\n,].*?Subject.*?CN=(.+?)[\n,].*?Serial.*?(0x.+?)\nSHA1 Hash.*?(.+?)\n.*?Not valid before.*?(\d.+?)UTC\nNot valid after.*?(\d.+?)UTC',
         output, re.MULTILINE + re.DOTALL)
@@ -357,7 +357,7 @@ def install_root_cert(file):
 def list_root_certs():
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-store', 'root'],
                                stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     m = re.findall(
         r'(\d+)-{7}\nIssuer.*?CN=(.+?)[\n,].*?Subject.*?CN=(.+?)[\n,].*?Serial.*?(0x.+?)\nSHA1 Hash.*?(.+?)\n.*?Not valid before.*?(\d.+?)UTC\nNot valid after.*?(\d.+?)UTC',
         output,
@@ -368,7 +368,7 @@ def list_root_certs():
 def install_crl(file):
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-inst', '-crl', '-store', 'root', '-file', file],
                                stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     m = re.findall(r'(\d+)-{7}.+?CN=(.+?)[\n,].*?ThisUpdate: (\d.+?)UTC\nNextUpdate: (\d.+?)UTC', output,
                    re.MULTILINE + re.DOTALL)
     return m
@@ -377,7 +377,7 @@ def install_crl(file):
 def list_crls():
     certmgr = subprocess.Popen(['/opt/cprocsp/bin/%s/certmgr' % arch, '-list', '-crl', '-store', 'root'],
                                stdout=subprocess.PIPE)
-    output = certmgr.communicate()[0]
+    output = certmgr.communicate()[0].decode()
     m = re.findall(r'(\d+)-{7}.+?CN=(.+?)[\n,].*?ThisUpdate: (\d.+?)UTC\nNextUpdate: (\d.+?)UTC', output,
                    re.MULTILINE + re.DOTALL)
     return m
@@ -387,7 +387,7 @@ def change_user_pin(old_pin, new_pin):
     pkcs15tool = subprocess.Popen(
         ['pkcs15-tool', '--auth-id', '02', '--change-pin', '--pin', old_pin, '--new-pin', new_pin],
         stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    output = pkcs15tool.communicate()[0]
+    output = pkcs15tool.communicate()[0].decode()
     tries = output.split('\n')[1].split(': ')[-1]
     if tries:
         return False, tries
@@ -410,7 +410,7 @@ def init_token():
 
 def check_user_pin():
     pkcs15tool = subprocess.Popen(['/usr/bin/pkcs15-tool', '-D'], stdout=subprocess.PIPE)
-    output = pkcs15tool.communicate()[0]
+    output = pkcs15tool.communicate()[0].decode()
     search = 'User PIN'
     s = re.search(search, output)
     if s:
@@ -430,7 +430,7 @@ def add_ini(pin, cont_id):
 def set_as_reader(token):
     cpconfig = subprocess.Popen(['/usr/bin/cpconfig-%s' % arch, '-hardware', 'reader', '-add', token],
                                 stdout=subprocess.PIPE)
-    output = cpconfig.communicate()[0]
+    output = cpconfig.communicate()[0].decode()
     if "Succeeded, code:0x0" in output:
         return True
     else:
@@ -438,49 +438,49 @@ def set_as_reader(token):
 
 
 def translate_cert_fields(fieldname):
-    fields = {'1.2.840.113549.1.9.2': u'неструктурированное имя',
-              '1.2.643.5.1.5.2.1.2': u'код должности',
-              '1.2.643.5.1.5.2.1.1': u'код структурного подразделения ФССП России (ВКСП)',
-              '1.2.643.5.1.5.2.2.1': u'Полномочия публикации обновлений ПО',
-              '1.2.643.5.1.5.2.2.2': u'Подсистема АИС ФССП России',
-              '1.2.643.5.1.24.2.9': u'Главный судебный пристав Российской Федерации',
-              '1.2.643.5.1.24.2.10': u'Заместитель главного судебного пристава Российской Федерации',
-              '1.2.643.5.1.24.2.11': u'Главный судебный пристав субъекта Российской Федерации',
-              '1.2.643.5.1.24.2.12': u'Заместитель главного судебного пристава субъекта Российской Федерации',
-              '1.2.643.5.1.24.2.13': u'Старший судебный пристав',
-              '1.2.643.5.1.24.2.14': u'Судебный пристав-исполнитель',
-              '1.2.643.100.2.1': u'Доступ к СМЭВ (ФЛ)',
-              '1.2.643.100.2.2': u'Доступ к СМЭВ (ЮЛ)',
-              '1.2.643.2.2.34.2': u'Временный доступ к Центру Регистрации',
-              '1.2.643.2.2.34.4': u'Администратор Центра Регистрации КриптоПро УЦ',
-              '1.2.643.2.2.34.5': u'Оператор Центра Регистрации КриптоПро УЦ',
-              '1.2.643.2.2.34.6': u'Пользователь центра регистрации КриптоПро УЦ',
-              '1.2.643.2.2.34.7': u'Центр Регистрации КриптоПро УЦ',
-              '1.3.6.1.5.5.7.3.1': u'Проверка подлинности сервера',
-              '1.3.6.1.5.5.7.3.2': u'Проверка подлинности клиента',
-              '1.3.6.1.5.5.7.3.4': u'Защищенная электронная почта',
-              '1.3.6.1.5.5.7.3.8': u'Установка штампа времени',
-              '1.2.643.3.61.502710.1.6.3.4.1.1': u'Администратор организации',
-              '1.2.643.3.61.502710.1.6.3.4.1.2': u'Уполномоченный специалист',
-              '1.2.643.3.61.502710.1.6.3.4.1.3': u'Должностное лицо с правом подписи контракта',
-              '1.2.643.3.61.502710.1.6.3.4.1.4': u'Специалист с правом направления проекта контракта участнику размещения заказа',
-              'CN': u'общее имя',
-              'SN': u'фамилия',
-              'G': u'имя и отчество',
-              'I': u'инициалы',
-              'T': u'должность',
-              'OU': u'структурное подразделение',
-              'O': u'организация',
-              'L': u'населенный пункт',
-              'S': u'субъект РФ',
-              'C': u'страна',
-              'E': u'адрес электронной почты',
-              'INN': u'ИНН',
-              'OGRN': u'ОГРН',
-              'SNILS': u'СНИЛС',
-              'STREET': u'название улицы, номер дома',
-              'StreetAddress': u'адрес места нахождения',
-              'Unstructured Name': u'неструктурированное имя'}
+    fields = {'1.2.840.113549.1.9.2': 'неструктурированное имя',
+              '1.2.643.5.1.5.2.1.2': 'код должности',
+              '1.2.643.5.1.5.2.1.1': 'код структурного подразделения ФССП России (ВКСП)',
+              '1.2.643.5.1.5.2.2.1': 'Полномочия публикации обновлений ПО',
+              '1.2.643.5.1.5.2.2.2': 'Подсистема АИС ФССП России',
+              '1.2.643.5.1.24.2.9': 'Главный судебный пристав Российской Федерации',
+              '1.2.643.5.1.24.2.10': 'Заместитель главного судебного пристава Российской Федерации',
+              '1.2.643.5.1.24.2.11': 'Главный судебный пристав субъекта Российской Федерации',
+              '1.2.643.5.1.24.2.12': 'Заместитель главного судебного пристава субъекта Российской Федерации',
+              '1.2.643.5.1.24.2.13': 'Старший судебный пристав',
+              '1.2.643.5.1.24.2.14': 'Судебный пристав-исполнитель',
+              '1.2.643.100.2.1': 'Доступ к СМЭВ (ФЛ)',
+              '1.2.643.100.2.2': 'Доступ к СМЭВ (ЮЛ)',
+              '1.2.643.2.2.34.2': 'Временный доступ к Центру Регистрации',
+              '1.2.643.2.2.34.4': 'Администратор Центра Регистрации КриптоПро УЦ',
+              '1.2.643.2.2.34.5': 'Оператор Центра Регистрации КриптоПро УЦ',
+              '1.2.643.2.2.34.6': 'Пользователь центра регистрации КриптоПро УЦ',
+              '1.2.643.2.2.34.7': 'Центр Регистрации КриптоПро УЦ',
+              '1.3.6.1.5.5.7.3.1': 'Проверка подлинности сервера',
+              '1.3.6.1.5.5.7.3.2': 'Проверка подлинности клиента',
+              '1.3.6.1.5.5.7.3.4': 'Защищенная электронная почта',
+              '1.3.6.1.5.5.7.3.8': 'Установка штампа времени',
+              '1.2.643.3.61.502710.1.6.3.4.1.1': 'Администратор организации',
+              '1.2.643.3.61.502710.1.6.3.4.1.2': 'Уполномоченный специалист',
+              '1.2.643.3.61.502710.1.6.3.4.1.3': 'Должностное лицо с правом подписи контракта',
+              '1.2.643.3.61.502710.1.6.3.4.1.4': 'Специалист с правом направления проекта контракта участнику размещения заказа',
+              'CN': 'общее имя',
+              'SN': 'фамилия',
+              'G': 'имя и отчество',
+              'I': 'инициалы',
+              'T': 'должность',
+              'OU': 'структурное подразделение',
+              'O': 'организация',
+              'L': 'населенный пункт',
+              'S': 'субъект РФ',
+              'C': 'страна',
+              'E': 'адрес электронной почты',
+              'INN': 'ИНН',
+              'OGRN': 'ОГРН',
+              'SNILS': 'СНИЛС',
+              'STREET': 'название улицы, номер дома',
+              'StreetAddress': 'адрес места нахождения',
+              'Unstructured Name': 'неструктурированное имя'}
     try:
         return fields[fieldname]
     except KeyError:
@@ -491,108 +491,107 @@ class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         MainWindow.setObjectName(_fromUtf8("MainWindow"))
         MainWindow.resize(413, 388)
-        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
         MainWindow.setSizePolicy(sizePolicy)
         MainWindow.setMinimumSize(QtCore.QSize(344, 0))
         MainWindow.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
-        icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap(_fromUtf8("/usr/share/pixmaps/token-manager.png")), QtGui.QIcon.Normal,
-                       QtGui.QIcon.Off)
+        icon = QIcon()
+        icon.addPixmap(QPixmap(_fromUtf8("/usr/share/pixmaps/token-manager.png")), QIcon.Normal, QIcon.Off)
         MainWindow.setWindowIcon(icon)
         MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
         MainWindow.setAutoFillBackground(False)
         MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
         MainWindow.setDocumentMode(False)
-        self.centralwidget = QtGui.QWidget(MainWindow)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
         self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
-        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
         self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.horizontalLayout_3 = QtGui.QHBoxLayout()
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
-        self.label = QtGui.QLabel(self.centralwidget)
+        self.label = QtWidgets.QLabel(self.centralwidget)
         self.label.setLineWidth(2)
         self.label.setObjectName(_fromUtf8("label"))
         self.horizontalLayout_3.addWidget(self.label)
-        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_3.addItem(spacerItem)
-        self.token_refresh = QtGui.QPushButton(self.centralwidget)
+        self.token_refresh = QtWidgets.QPushButton(self.centralwidget)
         self.token_refresh.setObjectName(_fromUtf8("token_refresh"))
         self.horizontalLayout_3.addWidget(self.token_refresh)
         self.verticalLayout.addLayout(self.horizontalLayout_3)
-        self.token_list = QtGui.QListWidget(self.centralwidget)
-        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Expanding)
+        self.token_list = QtWidgets.QListWidget(self.centralwidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.token_list.sizePolicy().hasHeightForWidth())
         self.token_list.setSizePolicy(sizePolicy)
-        self.token_list.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.token_list.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         self.token_list.setObjectName(_fromUtf8("token_list"))
         self.verticalLayout.addWidget(self.token_list)
-        self.horizontalLayout_2 = QtGui.QHBoxLayout()
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
-        spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_2.addItem(spacerItem1)
-        self.asReader = QtGui.QPushButton(self.centralwidget)
+        self.asReader = QtWidgets.QPushButton(self.centralwidget)
         self.asReader.setEnabled(False)
         self.asReader.setObjectName(_fromUtf8("asReader"))
         self.horizontalLayout_2.addWidget(self.asReader)
-        self.cachePIN = QtGui.QPushButton(self.centralwidget)
+        self.cachePIN = QtWidgets.QPushButton(self.centralwidget)
         self.cachePIN.setEnabled(False)
         self.cachePIN.setObjectName(_fromUtf8("cachePIN"))
         self.horizontalLayout_2.addWidget(self.cachePIN)
-        self.changePIN = QtGui.QPushButton(self.centralwidget)
+        self.changePIN = QtWidgets.QPushButton(self.centralwidget)
         self.changePIN.setEnabled(False)
         self.changePIN.setObjectName(_fromUtf8("changePIN"))
         self.horizontalLayout_2.addWidget(self.changePIN)
         self.verticalLayout.addLayout(self.horizontalLayout_2)
-        self.label_2 = QtGui.QLabel(self.centralwidget)
+        self.label_2 = QtWidgets.QLabel(self.centralwidget)
         self.label_2.setObjectName(_fromUtf8("label_2"))
         self.verticalLayout.addWidget(self.label_2)
-        self.cert_list = QtGui.QListWidget(self.centralwidget)
-        self.cert_list.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.cert_list = QtWidgets.QListWidget(self.centralwidget)
+        self.cert_list.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         self.cert_list.setObjectName(_fromUtf8("cert_list"))
         self.verticalLayout.addWidget(self.cert_list)
-        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
         self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout.addItem(spacerItem2)
-        self.cert_delete = QtGui.QPushButton(self.centralwidget)
+        self.cert_delete = QtWidgets.QPushButton(self.centralwidget)
         self.cert_delete.setEnabled(False)
         self.cert_delete.setObjectName(_fromUtf8("cert_delete"))
         self.horizontalLayout.addWidget(self.cert_delete)
-        self.cert_view = QtGui.QPushButton(self.centralwidget)
+        self.cert_view = QtWidgets.QPushButton(self.centralwidget)
         self.cert_view.setEnabled(False)
         self.cert_view.setObjectName(_fromUtf8("cert_view"))
         self.horizontalLayout.addWidget(self.cert_view)
-        self.cert_install = QtGui.QPushButton(self.centralwidget)
+        self.cert_install = QtWidgets.QPushButton(self.centralwidget)
         self.cert_install.setEnabled(False)
         self.cert_install.setObjectName(_fromUtf8("cert_install"))
         self.horizontalLayout.addWidget(self.cert_install)
         self.verticalLayout.addLayout(self.horizontalLayout)
         MainWindow.setCentralWidget(self.centralwidget)
-        self.menuBar = QtGui.QMenuBar(MainWindow)
+        self.menuBar = QtWidgets.QMenuBar(MainWindow)
         self.menuBar.setGeometry(QtCore.QRect(0, 0, 413, 27))
         self.menuBar.setDefaultUp(False)
         self.menuBar.setObjectName(_fromUtf8("menuBar"))
-        self.operations = QtGui.QMenu(self.menuBar)
+        self.operations = QtWidgets.QMenu(self.menuBar)
         self.operations.setObjectName(_fromUtf8("operations"))
         MainWindow.setMenuBar(self.menuBar)
-        self.add_license = QtGui.QAction(MainWindow)
+        self.add_license = QtWidgets.QAction(MainWindow)
         self.add_license.setObjectName(_fromUtf8("add_license"))
-        self.install_root_certs = QtGui.QAction(MainWindow)
+        self.install_root_certs = QtWidgets.QAction(MainWindow)
         self.install_root_certs.setObjectName(_fromUtf8("install_root_certs"))
-        self.install_crl = QtGui.QAction(MainWindow)
+        self.install_crl = QtWidgets.QAction(MainWindow)
         self.install_crl.setObjectName(_fromUtf8("install_crl"))
-        self.actionAbout = QtGui.QAction(MainWindow)
+        self.actionAbout = QtWidgets.QAction(MainWindow)
         self.actionAbout.setObjectName(_fromUtf8("actionAbout"))
-        self.view_license = QtGui.QAction(MainWindow)
+        self.view_license = QtWidgets.QAction(MainWindow)
         self.view_license.setObjectName(_fromUtf8("view_license"))
-        self.view_root = QtGui.QAction(MainWindow)
+        self.view_root = QtWidgets.QAction(MainWindow)
         self.view_root.setObjectName(_fromUtf8("view_root"))
-        self.view_crl = QtGui.QAction(MainWindow)
+        self.view_crl = QtWidgets.QAction(MainWindow)
         self.view_crl.setObjectName(_fromUtf8("view_crl"))
         self.operations.addAction(self.add_license)
         self.operations.addAction(self.view_license)
@@ -632,19 +631,19 @@ class Ui_cert_view(object):
     def setupUi(self, cert_view):
         cert_view.setObjectName(_fromUtf8("cert_view"))
         cert_view.resize(430, 343)
-        self.gridLayout = QtGui.QGridLayout(cert_view)
+        self.gridLayout = QtWidgets.QGridLayout(cert_view)
         self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        spacerItem = QtGui.QSpacerItem(323, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        spacerItem = QtWidgets.QSpacerItem(323, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.gridLayout.addItem(spacerItem, 1, 0, 1, 1)
-        self.close_cert_view = QtGui.QPushButton(cert_view)
+        self.close_cert_view = QtWidgets.QPushButton(cert_view)
         self.close_cert_view.setObjectName(_fromUtf8("close_cert_view"))
         self.gridLayout.addWidget(self.close_cert_view, 1, 1, 1, 1)
-        self.cert_listview = QtGui.QListWidget(cert_view)
+        self.cert_listview = QtWidgets.QListWidget(cert_view)
         self.cert_listview.setObjectName(_fromUtf8("cert_listview"))
         self.gridLayout.addWidget(self.cert_listview, 0, 0, 1, 2)
 
         self.retranslateUi(cert_view)
-        QtCore.QObject.connect(self.close_cert_view, QtCore.SIGNAL(_fromUtf8("clicked()")), cert_view.close)
+        self.close_cert_view.clicked.connect(cert_view.close)
         QtCore.QMetaObject.connectSlotsByName(cert_view)
 
     def retranslateUi(self, cert_view):
@@ -656,22 +655,22 @@ class Ui_cert_list(object):
     def setupUi(self, cert_list):
         cert_list.setObjectName(_fromUtf8("cert_list"))
         cert_list.resize(404, 343)
-        self.gridLayout = QtGui.QGridLayout(cert_list)
+        self.gridLayout = QtWidgets.QGridLayout(cert_list)
         self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        spacerItem = QtGui.QSpacerItem(323, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        spacerItem = QtWidgets.QSpacerItem(323, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.gridLayout.addItem(spacerItem, 2, 0, 1, 1)
-        self.close_cert_list = QtGui.QPushButton(cert_list)
+        self.close_cert_list = QtWidgets.QPushButton(cert_list)
         self.close_cert_list.setObjectName(_fromUtf8("close_cert_list"))
         self.gridLayout.addWidget(self.close_cert_list, 2, 1, 1, 1)
-        self.cert_listview = QtGui.QListWidget(cert_list)
+        self.cert_listview = QtWidgets.QListWidget(cert_list)
         self.cert_listview.setObjectName(_fromUtf8("cert_listview"))
         self.gridLayout.addWidget(self.cert_listview, 1, 0, 1, 2)
-        self.cert_list_filter = QtGui.QLineEdit(cert_list)
+        self.cert_list_filter = QtWidgets.QLineEdit(cert_list)
         self.cert_list_filter.setObjectName(_fromUtf8("cert_list_filter"))
         self.gridLayout.addWidget(self.cert_list_filter, 0, 0, 1, 2)
 
         self.retranslateUi(cert_list)
-        QtCore.QObject.connect(self.close_cert_list, QtCore.SIGNAL(_fromUtf8("clicked()")), cert_list.close)
+        self.close_cert_list.clicked.connect(cert_list.close)
         QtCore.QMetaObject.connectSlotsByName(cert_list)
 
     def retranslateUi(self, cert_list):
@@ -679,14 +678,14 @@ class Ui_cert_list(object):
         self.close_cert_list.setText(_translate("cert_list", "Закрыть", None))
 
 
-class ViewCert(QtGui.QDialog):
+class ViewCert(QtWidgets.QDialog):
     def __init__(self):
         super(ViewCert, self).__init__()
         self.ui = Ui_cert_view()
         self.ui.setupUi(self)
 
 
-class ListCert(QtGui.QDialog):
+class ListCert(QtWidgets.QDialog):
 
     list_data = []
     is_root = False
@@ -702,31 +701,31 @@ class ListCert(QtGui.QDialog):
 
     def filterout(self):
         self.ui.cert_listview.clear()
-        filter_text = unicode(self.ui.cert_list_filter.text())
+        filter_text = str(self.ui.cert_list_filter.text())
         for line in self.list_data:
-            if filter_text.upper() in line[1].decode('utf-8').upper():
-                item = QtGui.QListWidgetItem()
+            if filter_text.upper() in line[1].upper():
+                item = QtWidgets.QListWidgetItem()
                 if self.is_root:
                     not_valid_before = datetime.strptime(line[5], '%d/%m/%Y  %H:%M:%S ')
                     not_valid_after = datetime.strptime(line[6], '%d/%m/%Y  %H:%M:%S ')
                     if not_valid_after < datetime.utcnow():
-                        item.setBackgroundColor(QtGui.QColor(252, 133, 133))
+                        item.setBackground(QColor(252, 133, 133))
                     item.setText(('Эмитент: %s\nСубъект: %s\nСерийный номер: %s\nХэш SHA1: %s\nНе действителен до: %s\n'
                           'Не действителен после: %s' % (line[1], line[2], line[3], line[4],
                                                          datetime.strftime(not_valid_before, '%d.%m.%Y %H:%M:%S'),
                                                          datetime.strftime(not_valid_after,
-                                                                           '%d.%m.%Y %H:%M:%S'))).decode('utf-8'))
+                                                                           '%d.%m.%Y %H:%M:%S'))))
                 else:
                     this_update = datetime.strptime(line[2], '%d/%m/%Y  %H:%M:%S ')
                     next_update = datetime.strptime(line[3], '%d/%m/%Y  %H:%M:%S ')
                     if next_update < datetime.utcnow():
-                        item.setBackgroundColor(QtGui.QColor(252, 133, 133))
+                        item.setBackground(QColor(252, 133, 133))
                     item.setText(('%s\nДата выпуска: %s UTC\nДата обновления: %s UTC' %
                           (line[1], datetime.strftime(this_update, '%d.%m.%Y %H:%M:%S'),
-                           datetime.strftime(next_update, '%d.%m.%Y %H:%M:%S'))).decode('utf-8'))
+                           datetime.strftime(next_update, '%d.%m.%Y %H:%M:%S'))))
                 self.ui.cert_listview.addItem(item)
 
-class TokenListItem(QtGui.QListWidgetItem):
+class TokenListItem(QtWidgets.QListWidgetItem):
     isToken = True
     storage = ''
     token_name = ''
@@ -735,14 +734,14 @@ class TokenListItem(QtGui.QListWidgetItem):
         super(TokenListItem, self).__init__(parent)
 
 
-class CertListItem(QtGui.QListWidgetItem):
+class CertListItem(QtWidgets.QListWidgetItem):
     cert_index = 0
 
     def __init__(self, parent=None):
         super(CertListItem, self).__init__(parent)
 
 
-class MainWindow(QtGui.QMainWindow):
+class MainWindow(QtWidgets.QMainWindow):
     token = ""
     cert = ""
     cont_id = ""
@@ -751,7 +750,7 @@ class MainWindow(QtGui.QMainWindow):
         super(MainWindow, self).__init__()
         self.ui = Ui_MainWindow()
         self.ui.setupUi(self)
-        aboutAction = QtGui.QAction(u'&О программе', self)
+        aboutAction = QtWidgets.QAction('&О программе', self)
         aboutAction.setShortcut('Ctrl+Q')
         aboutAction.triggered.connect(self.aboutProgram)
         self.ui.menuBar.addAction(aboutAction)
@@ -760,7 +759,7 @@ class MainWindow(QtGui.QMainWindow):
                 or not os.path.exists('/opt/cprocsp/bin/%s/list_pcsc' % arch) \
                 or not os.path.exists('/opt/cprocsp/bin/%s/csptest' % arch) \
                 or not os.path.exists('/opt/cprocsp/sbin/%s/cpconfig' % arch):
-            raise Exception(u'СКЗИ Крипто Про CSP или некоторые его компоненты не установлены.')
+            raise Exception('СКЗИ Крипто Про CSP или некоторые его компоненты не установлены.')
         self.refresh_token()
         self.ui.token_refresh.clicked.connect(self.refresh_token)
         self.ui.token_list.itemClicked.connect(self.select_token)
@@ -778,52 +777,53 @@ class MainWindow(QtGui.QMainWindow):
         self.ui.cachePIN.clicked.connect(self.cache_pin)
         self.ui.asReader.clicked.connect(self.set_reader)
         if versiontuple(get_cspversion()[2]) < versiontuple("3.6.7491"):
-            QtGui.QMessageBox.information(self, u"Сообщение", u"Необходимо обновить КриптоПро CSP."
-                                                              u"<br>Ваша текущая версия: %s"
-                                                              u"<br>Минимальная рекомендуемая: 3.6.7491" %
+            QtWidgets.QMessageBox.information(self, "Сообщение", "Необходимо обновить КриптоПро CSP."
+                                                              "<br>Ваша текущая версия: %s"
+                                                              "<br>Минимальная рекомендуемая: 3.6.7491" %
                                           get_cspversion()[2])
 
     def set_reader(self):
         if set_as_reader(self.token):
-            QtGui.QMessageBox.information(self, u"Cообщение", u"Ключевой носитель %s успешно добавлен в качестве "
-                                                              u"считывателя" % self.token)
+            QtWidgets.QMessageBox.information(self, "Cообщение", "Ключевой носитель %s успешно добавлен в качестве "
+                                                              "считывателя" % self.token)
         else:
-            QtGui.QMessageBox.information(self, u"Cообщение", u"Произошла ошибка")
+            QtWidgets.QMessageBox.information(self, "Cообщение", "Произошла ошибка")
 
     def cache_pin(self):
-        pin, ok = QtGui.QInputDialog.getText(None, u"Ввод PIN-кода", u"Введите PIN-код:",
-                                             QtGui.QLineEdit.Password)
+        pin, ok = QtWidgets.QInputDialog.getText(None, "Ввод PIN-кода", "Введите PIN-код:",
+                                             QtWidgets.QLineEdit.Password)
         if ok:
             if not add_ini(pin, self.cont_id):
-                QtGui.QMessageBox.information(self, u"Cообщение", u"PIN-код успешно сохранен")
+                QtWidgets.QMessageBox.information(self, "Cообщение", "PIN-код успешно сохранен")
 
     def change_pin(self):
         auth_id = check_user_pin()
         if auth_id:
-            old_pin, ok = QtGui.QInputDialog.getText(None, u"Ввод PIN-кода", u"Введите текущий PIN-код:",
-                                                     QtGui.QLineEdit.Password)
+            old_pin, ok = QtWidgets.QInputDialog.getText(None, "Ввод PIN-кода", "Введите текущий PIN-код:",
+                                                     QtWidgets.QLineEdit.Password)
             if ok:
-                new_pin, ok = QtGui.QInputDialog.getText(None, u"Ввод PIN-кода", u"Введите новый PIN-код:",
-                                                         QtGui.QLineEdit.Password)
+                new_pin, ok = QtWidgets.QInputDialog.getText(None, "Ввод PIN-кода", "Введите новый PIN-код:",
+                                                         QtWidgets.QLineEdit.Password)
                 if ok:
-                    conf_pin, ok = QtGui.QInputDialog.getText(None, u"Ввод PIN-кода", u"Повторите новый PIN-код:",
-                                                              QtGui.QLineEdit.Password)
+                    conf_pin, ok = QtWidgets.QInputDialog.getText(None, "Ввод PIN-кода", "Повторите новый PIN-код:",
+                                                              QtWidgets.QLineEdit.Password)
                     if ok and new_pin == conf_pin:
                         if len(new_pin) < 8:
-                            QtGui.QMessageBox.warning(self, u'Ошибка', u"Недостаточная длина PIN-кода.\nМинимальная "
-                                                                       u"длина PIN составляет 8 символов")
+                            QtWidgets.QMessageBox.warning(self, 'Ошибка', "Недостаточная длина PIN-кода.\nМинимальная "
+                                                                       "длина PIN составляет 8 символов")
                             return
                         ok, tries = change_user_pin(old_pin, new_pin)
                         if ok:
-                            QtGui.QMessageBox.information(self, u"Cообщение", u"PIN-код успешно изменен")
+                            QtWidgets.QMessageBox.information(self, "Cообщение", "PIN-код успешно изменен")
+                            add_ini(new_pin, self.cont_id)
                         else:
-                            QtGui.QMessageBox.warning(self, u'Ошибка', u"PIN-код введен неверно\nОсталось попыток: %s" %
+                            QtWidgets.QMessageBox.warning(self, 'Ошибка', "PIN-код введен неверно\nОсталось попыток: %s" %
                                                       tries)
                     else:
-                        QtGui.QMessageBox.warning(self, u'Ошибка', u"Введенные PIN-коды не совпадают")
+                        QtWidgets.QMessageBox.warning(self, 'Ошибка', "Введенные PIN-коды не совпадают")
         else:
             if not init_token():
-                QtGui.QMessageBox.warning(self, u"Ошибка", u'Произошла ошибка при инициализации ключевого носителя')
+                QtWidgets.QMessageBox.warning(self, "Ошибка", 'Произошла ошибка при инициализации ключевого носителя')
             else:
                 self.change_pin()
 
@@ -838,103 +838,103 @@ class MainWindow(QtGui.QMainWindow):
         crl_view.exec_()
 
     def open_crl(self):
-        file_names = QtGui.QFileDialog.getOpenFileNames(self, u"Выберите файл(ы)", "", "*.crl")
+        file_names = QtWidgets.QFileDialog.getOpenFileNames(self, "Выберите файл(ы)", "", "*.crl")
         if not file_names:
             return
         crl_view = ViewCert()
         for filename in file_names:
-            crl_info = install_crl(unicode(filename))
+            crl_info = install_crl(str(filename))
             for line in crl_info:
-                item = QtGui.QListWidgetItem()
+                item = QtWidgets.QListWidgetItem()
                 this_update = datetime.strptime(line[2], '%d/%m/%Y  %H:%M:%S ')
                 next_update = datetime.strptime(line[3], '%d/%m/%Y  %H:%M:%S ')
                 if next_update < datetime.utcnow():
-                    item.setBackgroundColor(QtGui.QColor(252, 133, 133))
+                    item.setBackground(QColor(252, 133, 133))
                 item.setText(('%s\nДата выпуска: %s UTC\nДата обновления: %s UTC' %
                               (line[1], datetime.strftime(this_update, '%d.%m.%Y %H:%M:%S'),
-                               datetime.strftime(next_update, '%d.%m.%Y %H:%M:%S'))).decode('utf-8'))
+                               datetime.strftime(next_update, '%d.%m.%Y %H:%M:%S'))))
                 crl_view.ui.cert_listview.addItem(item)
-        crl_view.setWindowTitle(QtCore.QString(u'Установлен список отозванных сертификатов'))
+        crl_view.setWindowTitle(QtCore.QString('Установлен список отозванных сертификатов'))
         crl_view.exec_()
 
     def open_root_certs(self):
-        file_names = QtGui.QFileDialog.getOpenFileNames(self, u"Выберите файл(ы)", "", "*.cer *.crt")
+        file_names = QtWidgets.QFileDialog.getOpenFileNames(self, "Выберите файл(ы)", "", "*.cer *.crt")
         if not file_names:
             return
         root_view = ViewCert()
         for filename in file_names:
-            root_info = install_root_cert(unicode(filename))
+            root_info = install_root_cert(str(filename))
             for line in root_info:
-                item = QtGui.QListWidgetItem()
+                item = QtWidgets.QListWidgetItem()
                 not_valid_before = datetime.strptime(line[5], '%d/%m/%Y  %H:%M:%S ')
                 not_valid_after = datetime.strptime(line[6], '%d/%m/%Y  %H:%M:%S ')
                 if not_valid_after < datetime.utcnow():
-                    item.setBackgroundColor(QtGui.QColor(252, 133, 133))
+                    item.setBackground(QColor(252, 133, 133))
                 item.setText(('Эмитент: %s\nСубъект: %s\nСерийный номер: %s\nХэш SHA1: %s\nНе действителен до: %s\n'
                               'Не действителен после: %s' % (line[1], line[2], line[3], line[4],
                                                              datetime.strftime(not_valid_before, '%d.%m.%Y %H:%M:%S'),
                                                              datetime.strftime(not_valid_after,
-                                                                               '%d.%m.%Y %H:%M:%S'))).decode('utf-8'))
+                                                                               '%d.%m.%Y %H:%M:%S'))))
                 root_view.ui.cert_listview.addItem(item)
-        root_view.setWindowTitle(QtCore.QString(u'Установлен корневой сертификат'))
+        root_view.setWindowTitle(QtCore.QString('Установлен корневой сертификат'))
         root_view.exec_()
 
     def view_license(self):
         license_info = get_license()
         license_view = ViewCert()
-        item = QtGui.QListWidgetItem()
+        item = QtWidgets.QListWidgetItem()
         item.setText(license_info)
         license_view.ui.cert_listview.addItem(item)
         license_view.exec_()
 
     def enter_license(self):
-        cpro_license, ok = QtGui.QInputDialog.getText(self, u'Лицензия КриптоПро',
-                                                      u'Введите лицензионный ключ:')
+        cpro_license, ok = QtWidgets.QInputDialog.getText(self, 'Лицензия КриптоПро',
+                                                      'Введите лицензионный ключ:')
         if ok:
             m = re.match('([A-Z0-9]{5}-){4}[A-Z0-9]{5}', cpro_license)
             if m:
                 l = set_license(cpro_license)
                 if l[1]:
-                    QtGui.QMessageBox.warning(self, u"Ошибка", u"Произошла ошибка: %s" % l[0])
+                    QtWidgets.QMessageBox.warning(self, "Ошибка", "Произошла ошибка: %s" % l[0])
                 else:
-                    QtGui.QMessageBox.information(self, u"Cообщение", u"Лицензионный ключ успешно установлен")
+                    QtWidgets.QMessageBox.information(self, "Cообщение", "Лицензионный ключ успешно установлен")
             else:
-                QtGui.QMessageBox.warning(self, u"Ошибка", u"Лицензионный ключ введен неверно!")
+                QtWidgets.QMessageBox.warning(self, "Ошибка", "Лицензионный ключ введен неверно!")
 
     def install_cert(self):
         ret = inst_cert(self.cert)
-        QtGui.QMessageBox.information(self, u"Сообщение", ret)
+        QtWidgets.QMessageBox.information(self, "Сообщение", ret)
 
     def install_local_cert(self):
-        file_name = QtGui.QFileDialog().getOpenFileName(self, u"Выберите файл(ы)", "", "*.cer")
+        file_name = QtWidgets.QFileDialog().getOpenFileName(self, "Выберите файл(ы)", "", "*.cer")
         if not file_name:
             return
-        ret = inst_cert_from_file(unicode(file_name))
-        QtGui.QMessageBox.information(self, u"Сообщение", ret)
+        ret = inst_cert_from_file(str(file_name))
+        QtWidgets.QMessageBox.information(self, "Сообщение", ret)
 
     def delete_cert(self):
         is_token = self.ui.token_list.currentItem().isToken
         if is_token:
-            reply = QtGui.QMessageBox.question(self, u'Подтверждение',
-                                               u'Вы уверенны что хотите удалить данный сертификат '
-                                               u'с ключевого носителя?\n'
-                                               u'Эту операцию нельзя отменить.',
-                                               QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
-            if reply == QtGui.QMessageBox.Yes:
+            reply = QtWidgets.QMessageBox.question(self, 'Подтверждение',
+                                               'Вы уверенны что хотите удалить данный сертификат '
+                                               'с ключевого носителя?\n'
+                                               'Эту операцию нельзя отменить.',
+                                               QtWidgets.QMessageBox.Yes, Gui.QMessageBox.No)
+            if reply == QtWidgets.QMessageBox.Yes:
                 ret = del_cont(self.cert)
-                QtGui.QMessageBox.information(self, u"Сообщение", ret)
+                QtWidgets.QMessageBox.information(self, "Сообщение", ret)
                 self.ui.cert_delete.setEnabled(False)
                 self.ui.cert_view.setEnabled(False)
                 self.ui.cert_install.setEnabled(False)
         else:
-            reply = QtGui.QMessageBox.question(self, u'Подтверждение',
-                                               u'Вы уверенны что хотите удалить данный сертификат?\n'
-                                               u'Эту операцию нельзя отменить.',
-                                               QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
-            if reply == QtGui.QMessageBox.Yes:
+            reply = QtWidgets.QMessageBox.question(self, 'Подтверждение',
+                                               'Вы уверенны что хотите удалить данный сертификат?\n'
+                                               'Эту операцию нельзя отменить.',
+                                               QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
+            if reply == QtWidgets.QMessageBox.Yes:
                 ret = del_store_cert(self.ui.cert_list.currentItem().cert_index,
                                      self.ui.token_list.currentItem().storage)
-                QtGui.QMessageBox.information(self, u"Сообщение", ret)
+                QtWidgets.QMessageBox.information(self, "Сообщение", ret)
                 self.ui.cert_delete.setEnabled(False)
                 self.ui.cert_view.setEnabled(False)
                 self.ui.cert_install.setEnabled(False)
@@ -953,9 +953,9 @@ class MainWindow(QtGui.QMainWindow):
         if is_token:
             self.ui.cert_view.clicked.connect(self.view_cert)
             containers = get_token_certs(self.token)
-            cert_name = str(item.text().toUtf8())
+            cert_name = str(item.text())
             for line in containers[0]:
-                container = line.decode('cp1251').encode('utf-8')
+                container = line
                 if cert_name in container:
                     self.cert = line.split('|')[1]
                     self.cont_id = line.split('|')[1].split('\\')[4:] # содержит список, который нужно объединить бэкслэшами
@@ -969,13 +969,13 @@ class MainWindow(QtGui.QMainWindow):
             self.ui.cert_install.setHidden(False)
             self.ui.cert_install.clicked.disconnect()
             self.ui.cert_install.clicked.connect(self.install_cert)
-            self.ui.label_2.setText(u'Выберите контейнер сертификата')
+            self.ui.label_2.setText('Выберите контейнер сертификата')
             self.ui.asReader.setEnabled(True)
             self.token = str(item.token_name)
             certs = get_token_certs(str(item.token_name))[0]
             for cert in certs:
-                cert_item = QtGui.QListWidgetItem()
-                cert_item.setText(cert.split('|')[0].split('\\')[-1].decode('cp1251'))
+                cert_item = QtWidgets.QListWidgetItem()
+                cert_item.setText(cert.split('|')[0].split('\\')[-1])
                 self.ui.cert_list.addItem(cert_item)
         if not item.isToken:
             self.ui.cert_install.setEnabled(True)
@@ -985,7 +985,7 @@ class MainWindow(QtGui.QMainWindow):
             elif item.storage == 'uMy':
                 self.ui.cert_install.clicked.disconnect()
                 self.ui.cert_install.clicked.connect(self.install_local_cert)
-            self.ui.label_2.setText(u'Выберите сертификат')
+            self.ui.label_2.setText('Выберите сертификат')
             self.ui.asReader.setEnabled(False)
             self.ui.changePIN.setEnabled(False)
             self.ui.cachePIN.setEnabled(False)
@@ -994,10 +994,10 @@ class MainWindow(QtGui.QMainWindow):
                 cert_item = CertListItem()
                 cert_item.cert_index = cert[0]
                 if datetime.strptime(cert[6], '%d/%m/%Y  %H:%M:%S ') < datetime.utcnow():
-                    cert_item.setBackgroundColor(QtGui.QColor(252, 133, 133))
-                cert_subject_cn = dict(re.findall(ur'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', cert[2].decode('utf-8'), re.UNICODE))['CN']
-                cert_issuer_cn = dict(re.findall(ur'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', cert[1].decode('utf-8'), re.UNICODE))['CN']
-                cert_item.setText(u"%s\nвыдан %s" % (cert_subject_cn, cert_issuer_cn))
+                    cert_item.setBackground(QColor(252, 133, 133))
+                cert_subject_cn = dict(re.findall(r'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', cert[2], re.UNICODE))['CN']
+                cert_issuer_cn = dict(re.findall(r'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', cert[1], re.UNICODE))['CN']
+                cert_item.setText("%s\nвыдан %s" % (cert_subject_cn, cert_issuer_cn))
                 self.ui.cert_list.addItem(cert_item)
 
     def view_cert(self):
@@ -1009,60 +1009,60 @@ class MainWindow(QtGui.QMainWindow):
             cert_info = get_store_certs(store)
             line = cert_info[int(self.ui.cert_list.currentItem().cert_index) - 1]
         cert_view = ViewCert()
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        label = QtGui.QLabel()
-        label.setText(u'<b>Эмитент</b>:')
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        label = QtWidgets.QLabel()
+        label.setText('<b>Эмитент</b>:')
         cert_view.ui.cert_listview.setItemWidget(item, label)
-        issuer_info = dict(re.findall(ur'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', line[1].decode('utf-8'), re.UNICODE))
+        issuer_info = dict(re.findall(r'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', line[1], re.UNICODE))
         for field in issuer_info:
-            item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-            label = QtGui.QLabel()
-            label.setText(u'<b>%s</b>:\t\t%s' % (translate_cert_fields(field), issuer_info[field]))
+            item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+            label = QtWidgets.QLabel()
+            label.setText('<b>%s</b>:\t\t%s' % (translate_cert_fields(field), issuer_info[field]))
             cert_view.ui.cert_listview.setItemWidget(item, label)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        label = QtGui.QLabel()
-        label.setText(u'<b>Субъект</b>:')
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        label = QtWidgets.QLabel()
+        label.setText('<b>Субъект</b>:')
         cert_view.ui.cert_listview.setItemWidget(item, label)
-        subject_info = dict(re.findall(ur'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', line[2].decode('utf-8'), re.UNICODE))
+        subject_info = dict(re.findall(r'([A-Za-z0-9\.]+?)=([\xab\xbb\(\)\w \.\,0-9@\-\#\/\"\/\']+|\"(?:\\.|[^\"])*\")(?:, |$)', line[2], re.UNICODE))
         for field in subject_info:
-            item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-            label = QtGui.QLabel()
+            item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+            label = QtWidgets.QLabel()
             if subject_info[field][:2] == '"#':  # Если поле в HEX-виде
-                label.setText(u'<b>%s</b>:\t%s' % (translate_cert_fields(field), subject_info[field][6:-1].decode('hex').decode('utf-8')))
+                label.setText('<b>%s</b>:\t%s' % (translate_cert_fields(field), subject_info[field][6:-1]))
             else:
-                label.setText(u'<b>%s</b>:\t%s' % (translate_cert_fields(field), subject_info[field]))
+                label.setText('<b>%s</b>:\t%s' % (translate_cert_fields(field), subject_info[field]))
             cert_view.ui.cert_listview.setItemWidget(item, label)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
         cert_serial = line[3][2:]
-        label = QtGui.QLabel()
-        label.setText(u'<b>Серийный номер</b>: %s' % cert_serial)
+        label = QtWidgets.QLabel()
+        label.setText('<b>Серийный номер</b>: %s' % cert_serial)
         cert_view.ui.cert_listview.setItemWidget(item, label)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
         not_valid_before = datetime.strptime(line[5], '%d/%m/%Y  %H:%M:%S ')
-        label = QtGui.QLabel()
-        label.setText(u'<b>Не действителен до</b>: %s' % datetime.strftime(not_valid_before, '%d.%m.%Y %H:%M:%S'))
+        label = QtWidgets.QLabel()
+        label.setText('<b>Не действителен до</b>: %s' % datetime.strftime(not_valid_before, '%d.%m.%Y %H:%M:%S'))
         cert_view.ui.cert_listview.setItemWidget(item, label)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
         not_valid_after = datetime.strptime(line[6], '%d/%m/%Y  %H:%M:%S ')
         if not_valid_after < datetime.utcnow():
-            item.setBackgroundColor(QtGui.QColor(252, 133, 133))
-        label = QtGui.QLabel()
-        label.setText(u'<b>Не действителен после</b>: %s' % datetime.strftime(not_valid_after, '%d.%m.%Y %H:%M:%S'))
+            item.setBackground(QColor(252, 133, 133))
+        label = QtWidgets.QLabel()
+        label.setText('<b>Не действителен после</b>: %s' % datetime.strftime(not_valid_after, '%d.%m.%Y %H:%M:%S'))
         cert_view.ui.cert_listview.setItemWidget(item, label)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-        label = QtGui.QLabel()
-        label.setText(u'<b>Расширенное использование ключа</b>: ')
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+        label = QtWidgets.QLabel()
+        label.setText('<b>Расширенное использование ключа</b>: ')
         cert_view.ui.cert_listview.setItemWidget(item, label)
         try:
             ext_key = line[7].split()
         except IndexError:
-            ext_key = [u'<i>Не имеет</i>']
+            ext_key = ['<i>Не имеет</i>']
         for oid in ext_key:
-            item = QtGui.QListWidgetItem(cert_view.ui.cert_listview)
-            label = QtGui.QLabel()
+            item = QtWidgets.QListWidgetItem(cert_view.ui.cert_listview)
+            label = QtWidgets.QLabel()
             label.setText(translate_cert_fields(oid))
             cert_view.ui.cert_listview.setItemWidget(item, label)
         cert_view.exec_()
@@ -1071,59 +1071,61 @@ class MainWindow(QtGui.QMainWindow):
         self.ui.token_list.clear()
         tokens = get_tokens()
         root_store_item = TokenListItem()
-        root_store_item.setText(u"Хранилище корневых сертификатов")
+        root_store_item.setText("Хранилище корневых сертификатов")
         root_store_item.isToken = False
         root_store_item.storage = 'root'
-        root_store_item.setIcon(QtGui.QIcon(':/images/root.png'))
+        root_store_item.setIcon(QIcon(':/images/root.png'))
         self.ui.token_list.addItem(root_store_item)
         personal_store_item = TokenListItem()
-        personal_store_item.setText(u"Личное хранилище сертификатов")
+        personal_store_item.setText("Личное хранилище сертификатов")
         personal_store_item.isToken = False
         personal_store_item.storage = 'uMy'
-        personal_store_item.setIcon(QtGui.QIcon(':/images/personal.png'))
+        personal_store_item.setIcon(QIcon(':/images/personal.png'))
         self.ui.token_list.addItem(personal_store_item)
         if tokens[1]:
             token_item = TokenListItem()
             self.ui.cert_list.clearSelection()
-            token_item.setText(u'<Ключевых носителей не обнаружено>')
+            token_item.setText('<Ключевых носителей не обнаружено>')
             token_item.setSelected(False)
             token_item.setFlags(QtCore.Qt.NoItemFlags)
         else:
             for token in tokens[0]:
                 token_item = TokenListItem()
                 token_item.token_name = token
-                token_item.setText(u'%s - сер. № %s' % (token, get_token_serial(token)))
-                token_item.setIcon(QtGui.QIcon(':/images/usb-token.png'))
+                token_item.setText('%s - сер. № %s' % (token, get_token_serial(token)))
+                token_item.setIcon(QIcon(':/images/usb-token.png'))
                 self.ui.token_list.addItem(token_item)
 
     def aboutProgram(self):
-        QtGui.QMessageBox.about(self, u"О программе",
-                                u"<b>token-manager 0.12</b><br>"
-                                u"Версия CSP: %s<br>"
-                                u"Класс криптосредств: %s<br>"
-                                u"Релиз: %s<br>"
-                                u"ОС: %s<br>"
-                                u"<br>Борис Макаренко<br>УИТ ФССП России"
-                                u"<br>E-mail: <a href='mailto:makarenko@fssprus.ru'>makarenko@fssprus.ru</a>"
-                                u"<br> <a href='mailto:bmakarenko90@gmail.com'>bmakarenko90@gmail.com<br><br>"
-                                u"<a href='http://opensource.org/licenses/MIT'>Лицензия MIT</a>" % get_cspversion())
+        QtWidgets.QMessageBox.about(self, "О программе",
+                                "<b>token-manager 0.12</b><br>"
+                                "Версия CSP: %s<br>"
+                                "Класс криптосредств: %s<br>"
+                                "Релиз: %s<br>"
+                                "ОС: %s<br>"
+                                "<br>Борис Макаренко<br>УИТ ФССП России"
+                                "<br>E-mail: <a href='mailto:makarenko@fssprus.ru'>makarenko@fssprus.ru</a>"
+                                "<br> <a href='mailto:bmakarenko90@gmail.com'>bmakarenko90@gmail.com<br><br>"
+                                "<a href='http://opensource.org/licenses/MIT'>Лицензия MIT</a>" % get_cspversion())
 
 
 def main():
-    app = QtGui.QApplication(sys.argv)
-    try:
-        ex = MainWindow()
-    except Exception as error:
-        QtGui.QMessageBox().warning(QtGui.QMessageBox(), u"Cообщение", u"Произошла ошибка:\n%s" % error)
-        exit(-1)
+    app = QtWidgets.QApplication(sys.argv)
+    # TODO
+    ex = MainWindow()
+    #try:
+    #    ex = MainWindow()
+    #except Exception as error:
+    #    QtWidgets.QMessageBox().warning(QtWidgets.QMessageBox(), "Cообщение", "Произошла ошибка:\n%s" % error)
+    #    exit(-1)
 
     if len(sys.argv) == 1:
         ex.show()
         sys.exit(app.exec_())
     else:
-        if os.path.isfile(sys.argv[1].decode('utf-8')):
-            ret = inst_cert_from_file(sys.argv[1].decode('utf-8'))
-            QtGui.QMessageBox().information(QtGui.QMessageBox(), u"Сообщение", ret)
+        if os.path.isfile(sys.argv[1]):
+            ret = inst_cert_from_file(sys.argv[1])
+            QtWidgets.QMessageBox().information(QtWidgets.QMessageBox(), "Сообщение", ret)
 
 if __name__ == '__main__':
     main()
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin