프로젝트

일반

사용자정보

개정판 d8792307

IDd879230740a3283edd27bea4b57844007db26b80
상위 7684568b
하위 cd379195

백흠경이(가) 약 4년 전에 추가함

issue #1650: 보안 기능 적용

Change-Id: I46afff48766fdfd215f60928cc40ba6df8d41045

차이점 보기:

App.spec
38 38
        console=False,
39 39
		icon='HYTOS.ico',
40 40
		version='version.rc')
41
		
41 42
coll = COLLECT(exe,
42 43
        a.binaries,
43 44
        a.zipfiles,
44 45
        a.datas,
45 46
        strip=False,
46 47
        upx=True,
47
        name='App')
48
        name='App')
49
		
50
foo = Analysis(['.\\HYTOS\\HYTOS\\License.py'],
51
             pathex=['.\\HYTOS\\HYTOS', '.\\HYTOS\\HYTOS\\UI'],
52
             binaries=[],
53
             datas=[],
54
             hiddenimports=['tkinter'],
55
             hookspath=[],
56
             runtime_hooks=[],
57
             excludes=[],
58
             win_no_prefer_redirects=False,
59
             win_private_assemblies=False,
60
             cipher=block_cipher,
61
             noarchive=False)
62
license = EXE(pyz,
63
		foo.scripts,
64
        [],
65
        exclude_binaries=True,
66
        name='License',
67
        debug=False,
68
        bootloader_ignore_signals=False,
69
        strip=False,
70
        upx=True,
71
        console=False,
72
		icon='HYTOS.ico',
73
		version='version.rc')
74
coll = COLLECT(license,
75
        foo.binaries,
76
        foo.zipfiles,
77
        foo.datas,
78
        strip=False,
79
        upx=True,
80
        name='License')
HYTOS/HYTOS/App.py
114 114
    sys._excepthook = sys.excepthook
115 115
    sys.excepthook = exceptionHandler.handler
116 116

  
117
    app_doc_data = AppDocData.instance()
118
    configs = app_doc_data.getAppConfigs('app', 'SingleID')
119
    if not (configs and configs[0].value):
120
        dlg = QSystemInformationDialog()
121
        dlg.exec_()
122

  
123
    configs = app_doc_data.getAppConfigs('app', 'SingleID')
124
    if configs and configs[0].value:
117
    if QSystemInformationDialog.check_license_key():
118
        app_doc_data = AppDocData.instance()
125 119
        app_doc_data.ex = exceptionHandler
126 120
        app._mainWnd = MainWindow.instance()
127 121
        if len(sys.argv) == 2 and os.path.exists(sys.argv[1]):
HYTOS/HYTOS/License.py
1
# -*- coding: utf-8 -*-
2

  
3
from PyQt5 import QtCore, QtGui, QtWidgets
4
from PyQt5.QtWidgets import *
5
import os
6
import sys
7
import socket
8
import platform
9
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\UI')
10
import UI.License_UI
11

  
12

  
13
class QLicenseDialog(QDialog):
14
    SECRET_KEY = '795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m'
15

  
16
    def __init__(self):
17
        QDialog.__init__(self)
18

  
19
        self.ui = UI.License_UI.Ui_LicenseDialog()
20
        self.ui.setupUi(self)
21

  
22
    def accept(self):
23
        """generate license key using computer name"""
24
        from SystemInformation import QSystemInformationDialog
25
        import jwt
26

  
27
        if self.ui.lineEditComputerName.text():
28
            computer_name = self.ui.lineEditComputerName.text()
29
            dt = self.ui.dateEditExpireDate.dateTime().toPyDateTime()
30
            exp = dt.timestamp()
31
            license_key = jwt.encode({'COMPUTERNAME': computer_name, 'exp': exp}, QSystemInformationDialog.SECRET_KEY,
32
                                     algorithm="HS256")
33
            self.ui.lineEditLicenseKey.setText(license_key)
34
        else:
35
            QMessageBox.information(self, self.tr('Information'), self.tr('Please input computer name'))
36

  
37
    def reject(self):
38
        QDialog.reject(self)
39

  
40

  
41
if __name__ == '__main__':
42
    from App import App
43

  
44
    app = App(sys.argv)
45

  
46
    dlg = QLicenseDialog()
47
    dlg.exec_()
48

  
49
    sys.exit(app.exec_())
HYTOS/HYTOS/SystemInformation.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
# Form implementation generated from reading ui file 'ProjectDialog.ui'
4
#
5
# Created by: PyQt5 UI code generator 5.6
6
#
7
# WARNING! All changes made in this file will be lost!
8

  
9 3
from PyQt5 import QtCore, QtGui, QtWidgets
10 4
from PyQt5.QtWidgets import *
11 5
import os
......
15 9
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\UI')
16 10
from AppDocData import AppDocData, Config
17 11
import SystemInformation_UI
18
import math
19 12

  
20 13

  
21 14
class QSystemInformationDialog(QDialog):
15
    SECRET_KEY = '795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m'
16

  
22 17
    def __init__(self):
23 18
        QDialog.__init__(self)
24 19

  
25 20
        self.ui = SystemInformation_UI.Ui_SystemInfoDialog()
26 21
        self.ui.setupUi(self)
27 22

  
23
        app_doc_data = AppDocData.instance()
24
        configs = app_doc_data.getAppConfigs('app', 'SingleID')
25
        if configs and configs[0].value:
26
            self.ui.lineEditSingleID.setText(configs[0].value)
28 27
        self.ui.lineEditSingleID.setFocus()
28

  
29 29
        self.ui.lineEditComputerName.setText(f"{os.environ['COMPUTERNAME']}")
30 30
        ip = self.get_my_ip_address()
31 31
        self.ui.lineEditIP.setText(f"{ip}")
32 32
        self.ui.textEditComputerInformation.setText(f"{platform.uname()}")
33 33

  
34
        # license key를 보여준다
35
        configs = app_doc_data.getAppConfigs('app', 'License')
36
        if configs and configs[0].value:
37
            self.ui.lineEditLicense.setText(configs[0].value)
38

  
34 39
    def get_my_ip_address(self, remote_server="google.com"):
35 40
        """ Return the/a network-facing IP number for this system. """
36 41
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
37 42
            s.connect((remote_server, 80))
38 43
            return s.getsockname()[0]
39 44

  
45
    @staticmethod
46
    def process_running():
47
        """check if program is running inside samsung engineering"""
48
        import subprocess
49

  
50
        n = 0  # number of instances of the program running
51
        CREATE_NO_WINDOW = 0x08000000
52
        prog = [line.split() for line in
53
                subprocess.check_output("tasklist", creationflags=CREATE_NO_WINDOW).splitlines()]
54
        [prog.pop(e) for e in [0, 0, 0]]  # useless
55

  
56
        names = []
57
        for task in prog:
58
            name = task[0].decode().replace('"', '').split(',')[0]
59
            names.append(name)
60
            if (name.upper() == 'EPTRAY.EXE') or (name.upper() == 'ICTRAY.EXE') or (name.upper() == 'ICTRAY64.EXE'):
61
                n = n + 1
62

  
63
        return n >= 2
64

  
65
    @staticmethod
66
    def check_license_key(sender=None):
67
        """ check license key with computer name """
68
        from AppDocData import AppDocData
69
        import jwt
70

  
71
        try:
72
            if QSystemInformationDialog.process_running():
73
                appDocData = AppDocData.instance()
74
                configs = appDocData.getAppConfigs('app', 'License')
75
                if configs and 1 == len(configs) and 3 == len(configs[0].value.split('.')):
76
                    payload = jwt.decode(configs[0].value, QSystemInformationDialog.SECRET_KEY, 'HS256')
77
                    if payload['COMPUTERNAME'].upper() == os.environ['COMPUTERNAME'].upper():
78
                        return True
79
                    else:
80
                        QMessageBox.information(None, 'Information', 'The license is invalid.')
81
            else:
82
                QMessageBox.information(None, 'Information', 'The processes are not running.')
83
        except jwt.ExpiredSignatureError:
84
            """기간 만료"""
85
            message = f"The license has expired"
86
            QMessageBox.critical(None, 'Error', message)
87
        except jwt.InvalidSignatureError as ex:
88
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
89
                      f"{sys.exc_info()[-1].tb_lineno}"
90
            QMessageBox.critical(None, 'Error', message)
91
        except Exception as ex:
92
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
93
                      f"{sys.exc_info()[-1].tb_lineno}"
94
            QMessageBox.critical(None, 'Error', message)
95

  
96
        if not sender:
97
            dialog = QSystemInformationDialog()
98
            return QDialog.Accepted == dialog.exec_()
99

  
100
        return False
101

  
40 102
    def accept(self):
41
        """ set tag no and nozzle data """
103
        """save single id, computer name, license, ip"""
42 104

  
43 105
        if self.ui.lineEditSingleID.text():
44 106
            app_doc_data = AppDocData.instance()
45 107

  
46 108
            configs = [Config('app', 'SingleID', self.ui.lineEditSingleID.text()),
47 109
                       Config('app', 'ComputerName', self.ui.lineEditComputerName.text()),
110
                       Config('app', 'License', self.ui.lineEditLicense.text()),
48 111
                       Config('app', 'IP', self.ui.lineEditIP.text())]
49 112
            app_doc_data.saveAppConfigs(configs)
50 113

  
51
            QDialog.accept(self)
114
            if QSystemInformationDialog.check_license_key(sender=self):
115
                QDialog.accept(self)
52 116
        else:
53 117
            QMessageBox.information(self, self.tr('Information'), self.tr('Please input user name'))
54 118

  
55 119
    def reject(self):
56 120
        QDialog.reject(self)
121

  
122

  
123
if __name__ == '__main__':
124
    import jwt
125
    import time
126
    from datetime import datetime
127
    from time import mktime
128

  
129
    var = input('Enter Computer Name: ')
130
    dt = datetime(2021, 4, 12, 0, 0, 0)
131
    exp = dt.timestamp()
132
    # exp = iat + 3600
133
    license = jwt.encode({'COMPUTERNAME': var, 'exp': exp}, QSystemInformationDialog.SECRET_KEY, algorithm="HS256")
134
    print(license)
HYTOS/HYTOS/UI/License.ui
1
<?xml version="1.0" encoding="UTF-8"?>
2
<ui version="4.0">
3
 <class>LicenseDialog</class>
4
 <widget class="QDialog" name="LicenseDialog">
5
  <property name="geometry">
6
   <rect>
7
    <x>0</x>
8
    <y>0</y>
9
    <width>643</width>
10
    <height>121</height>
11
   </rect>
12
  </property>
13
  <property name="windowTitle">
14
   <string>License</string>
15
  </property>
16
  <property name="windowIcon">
17
   <iconset>
18
    <normaloff>:/newPrefix/ID2.png</normaloff>:/newPrefix/ID2.png</iconset>
19
  </property>
20
  <property name="sizeGripEnabled">
21
   <bool>true</bool>
22
  </property>
23
  <layout class="QGridLayout" name="gridLayout_2">
24
   <item row="0" column="0">
25
    <layout class="QGridLayout" name="gridLayout">
26
     <item row="2" column="0">
27
      <widget class="QLabel" name="label_2">
28
       <property name="text">
29
        <string>License Key : </string>
30
       </property>
31
      </widget>
32
     </item>
33
     <item row="0" column="0">
34
      <widget class="QLabel" name="label">
35
       <property name="text">
36
        <string>Computer Name : </string>
37
       </property>
38
      </widget>
39
     </item>
40
     <item row="0" column="1">
41
      <widget class="QLineEdit" name="lineEditComputerName"/>
42
     </item>
43
     <item row="2" column="1">
44
      <widget class="QLineEdit" name="lineEditLicenseKey">
45
       <property name="readOnly">
46
        <bool>true</bool>
47
       </property>
48
      </widget>
49
     </item>
50
     <item row="1" column="0">
51
      <widget class="QLabel" name="label_3">
52
       <property name="text">
53
        <string>Expire Date : </string>
54
       </property>
55
      </widget>
56
     </item>
57
     <item row="1" column="1">
58
      <widget class="QDateEdit" name="dateEditExpireDate">
59
       <property name="dateTime">
60
        <datetime>
61
         <hour>0</hour>
62
         <minute>0</minute>
63
         <second>0</second>
64
         <year>2021</year>
65
         <month>4</month>
66
         <day>12</day>
67
        </datetime>
68
       </property>
69
      </widget>
70
     </item>
71
    </layout>
72
   </item>
73
   <item row="1" column="0">
74
    <widget class="QDialogButtonBox" name="buttonBox">
75
     <property name="orientation">
76
      <enum>Qt::Horizontal</enum>
77
     </property>
78
     <property name="standardButtons">
79
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
80
     </property>
81
    </widget>
82
   </item>
83
  </layout>
84
 </widget>
85
 <resources>
86
  <include location="../res/Resource.qrc"/>
87
 </resources>
88
 <connections>
89
  <connection>
90
   <sender>buttonBox</sender>
91
   <signal>accepted()</signal>
92
   <receiver>LicenseDialog</receiver>
93
   <slot>accept()</slot>
94
   <hints>
95
    <hint type="sourcelabel">
96
     <x>248</x>
97
     <y>254</y>
98
    </hint>
99
    <hint type="destinationlabel">
100
     <x>157</x>
101
     <y>274</y>
102
    </hint>
103
   </hints>
104
  </connection>
105
  <connection>
106
   <sender>buttonBox</sender>
107
   <signal>rejected()</signal>
108
   <receiver>LicenseDialog</receiver>
109
   <slot>reject()</slot>
110
   <hints>
111
    <hint type="sourcelabel">
112
     <x>316</x>
113
     <y>260</y>
114
    </hint>
115
    <hint type="destinationlabel">
116
     <x>286</x>
117
     <y>274</y>
118
    </hint>
119
   </hints>
120
  </connection>
121
 </connections>
122
</ui>
HYTOS/HYTOS/UI/License_UI.py
1
# -*- coding: utf-8 -*-
2

  
3
# Form implementation generated from reading ui file '.\HYTOS\UI\License.ui'
4
#
5
# Created by: PyQt5 UI code generator 5.15.2
6
#
7
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
8
# run again.  Do not edit this file unless you know what you are doing.
9

  
10

  
11
from PyQt5 import QtCore, QtGui, QtWidgets
12

  
13

  
14
class Ui_LicenseDialog(object):
15
    def setupUi(self, LicenseDialog):
16
        LicenseDialog.setObjectName("LicenseDialog")
17
        LicenseDialog.resize(643, 121)
18
        icon = QtGui.QIcon()
19
        icon.addPixmap(QtGui.QPixmap(":/newPrefix/ID2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
20
        LicenseDialog.setWindowIcon(icon)
21
        LicenseDialog.setSizeGripEnabled(True)
22
        self.gridLayout_2 = QtWidgets.QGridLayout(LicenseDialog)
23
        self.gridLayout_2.setObjectName("gridLayout_2")
24
        self.gridLayout = QtWidgets.QGridLayout()
25
        self.gridLayout.setObjectName("gridLayout")
26
        self.label_2 = QtWidgets.QLabel(LicenseDialog)
27
        self.label_2.setObjectName("label_2")
28
        self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
29
        self.label = QtWidgets.QLabel(LicenseDialog)
30
        self.label.setObjectName("label")
31
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
32
        self.lineEditComputerName = QtWidgets.QLineEdit(LicenseDialog)
33
        self.lineEditComputerName.setObjectName("lineEditComputerName")
34
        self.gridLayout.addWidget(self.lineEditComputerName, 0, 1, 1, 1)
35
        self.lineEditLicenseKey = QtWidgets.QLineEdit(LicenseDialog)
36
        self.lineEditLicenseKey.setReadOnly(True)
37
        self.lineEditLicenseKey.setObjectName("lineEditLicenseKey")
38
        self.gridLayout.addWidget(self.lineEditLicenseKey, 2, 1, 1, 1)
39
        self.label_3 = QtWidgets.QLabel(LicenseDialog)
40
        self.label_3.setObjectName("label_3")
41
        self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
42
        self.dateEditExpireDate = QtWidgets.QDateEdit(LicenseDialog)
43
        self.dateEditExpireDate.setDateTime(QtCore.QDateTime(QtCore.QDate(2021, 4, 12), QtCore.QTime(0, 0, 0)))
44
        self.dateEditExpireDate.setObjectName("dateEditExpireDate")
45
        self.gridLayout.addWidget(self.dateEditExpireDate, 1, 1, 1, 1)
46
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
47
        self.buttonBox = QtWidgets.QDialogButtonBox(LicenseDialog)
48
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
49
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
50
        self.buttonBox.setObjectName("buttonBox")
51
        self.gridLayout_2.addWidget(self.buttonBox, 1, 0, 1, 1)
52

  
53
        self.retranslateUi(LicenseDialog)
54
        self.buttonBox.accepted.connect(LicenseDialog.accept)
55
        self.buttonBox.rejected.connect(LicenseDialog.reject)
56
        QtCore.QMetaObject.connectSlotsByName(LicenseDialog)
57

  
58
    def retranslateUi(self, LicenseDialog):
59
        _translate = QtCore.QCoreApplication.translate
60
        LicenseDialog.setWindowTitle(_translate("LicenseDialog", "License"))
61
        self.label_2.setText(_translate("LicenseDialog", "License Key : "))
62
        self.label.setText(_translate("LicenseDialog", "Computer Name : "))
63
        self.label_3.setText(_translate("LicenseDialog", "Expire Date : "))
64
import Resource_rc
HYTOS/HYTOS/UI/SystemInformation.ui
31 31
     <layout class="QGridLayout" name="gridLayout_3">
32 32
      <item row="0" column="0">
33 33
       <layout class="QGridLayout" name="gridLayout_2">
34
        <item row="1" column="1">
35
         <widget class="QLineEdit" name="lineEditComputerName">
36
          <property name="readOnly">
37
           <bool>true</bool>
34
        <item row="0" column="1">
35
         <widget class="QLineEdit" name="lineEditSingleID"/>
36
        </item>
37
        <item row="4" column="0">
38
         <widget class="QLabel" name="label_4">
39
          <property name="text">
40
           <string>Computer Information : </string>
38 41
          </property>
39 42
         </widget>
40 43
        </item>
41
        <item row="2" column="1">
42
         <widget class="QLineEdit" name="lineEditIP">
44
        <item row="4" column="1">
45
         <widget class="QTextEdit" name="textEditComputerInformation">
43 46
          <property name="readOnly">
44 47
           <bool>true</bool>
45 48
          </property>
46 49
         </widget>
47 50
        </item>
48
        <item row="1" column="0">
49
         <widget class="QLabel" name="label_3">
50
          <property name="text">
51
           <string>Computer Name : </string>
52
          </property>
53
         </widget>
54
        </item>
55 51
        <item row="0" column="0">
56 52
         <widget class="QLabel" name="label">
57 53
          <property name="text">
......
59 55
          </property>
60 56
         </widget>
61 57
        </item>
62
        <item row="2" column="0">
58
        <item row="3" column="0">
63 59
         <widget class="QLabel" name="label_2">
64 60
          <property name="text">
65 61
           <string>IP : </string>
66 62
          </property>
67 63
         </widget>
68 64
        </item>
69
        <item row="0" column="1">
70
         <widget class="QLineEdit" name="lineEditSingleID"/>
71
        </item>
72
        <item row="3" column="0">
73
         <widget class="QLabel" name="label_4">
65
        <item row="1" column="0">
66
         <widget class="QLabel" name="label_3">
74 67
          <property name="text">
75
           <string>Computer Information : </string>
68
           <string>Computer Name : </string>
76 69
          </property>
77 70
         </widget>
78 71
        </item>
79 72
        <item row="3" column="1">
80
         <widget class="QTextEdit" name="textEditComputerInformation">
73
         <widget class="QLineEdit" name="lineEditIP">
81 74
          <property name="readOnly">
82 75
           <bool>true</bool>
83 76
          </property>
84 77
         </widget>
85 78
        </item>
79
        <item row="1" column="1">
80
         <widget class="QLineEdit" name="lineEditComputerName">
81
          <property name="readOnly">
82
           <bool>true</bool>
83
          </property>
84
         </widget>
85
        </item>
86
        <item row="2" column="0">
87
         <widget class="QLabel" name="label_5">
88
          <property name="text">
89
           <string>License : </string>
90
          </property>
91
         </widget>
92
        </item>
93
        <item row="2" column="1">
94
         <widget class="QLineEdit" name="lineEditLicense"/>
95
        </item>
86 96
       </layout>
87 97
      </item>
88 98
     </layout>
HYTOS/HYTOS/UI/SystemInformation_UI.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
# Form implementation generated from reading ui file '.\UI\SystemInformation.ui'
3
# Form implementation generated from reading ui file '.\HYTOS\UI\SystemInformation.ui'
4 4
#
5
# Created by: PyQt5 UI code generator 5.13.0
5
# Created by: PyQt5 UI code generator 5.15.2
6 6
#
7
# WARNING! All changes made in this file will be lost!
7
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
8
# run again.  Do not edit this file unless you know what you are doing.
8 9

  
9 10

  
10 11
from PyQt5 import QtCore, QtGui, QtWidgets
......
28 29
        self.gridLayout_3.setObjectName("gridLayout_3")
29 30
        self.gridLayout_2 = QtWidgets.QGridLayout()
30 31
        self.gridLayout_2.setObjectName("gridLayout_2")
31
        self.lineEditComputerName = QtWidgets.QLineEdit(self.groupBox)
32
        self.lineEditComputerName.setReadOnly(True)
33
        self.lineEditComputerName.setObjectName("lineEditComputerName")
34
        self.gridLayout_2.addWidget(self.lineEditComputerName, 1, 1, 1, 1)
35
        self.lineEditIP = QtWidgets.QLineEdit(self.groupBox)
36
        self.lineEditIP.setReadOnly(True)
37
        self.lineEditIP.setObjectName("lineEditIP")
38
        self.gridLayout_2.addWidget(self.lineEditIP, 2, 1, 1, 1)
39
        self.label_3 = QtWidgets.QLabel(self.groupBox)
40
        self.label_3.setObjectName("label_3")
41
        self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
42
        self.label = QtWidgets.QLabel(self.groupBox)
43
        self.label.setObjectName("label")
44
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
45
        self.label_2 = QtWidgets.QLabel(self.groupBox)
46
        self.label_2.setObjectName("label_2")
47
        self.gridLayout_2.addWidget(self.label_2, 2, 0, 1, 1)
48 32
        self.lineEditSingleID = QtWidgets.QLineEdit(self.groupBox)
49 33
        self.lineEditSingleID.setObjectName("lineEditSingleID")
50 34
        self.gridLayout_2.addWidget(self.lineEditSingleID, 0, 1, 1, 1)
51 35
        self.label_4 = QtWidgets.QLabel(self.groupBox)
52 36
        self.label_4.setObjectName("label_4")
53
        self.gridLayout_2.addWidget(self.label_4, 3, 0, 1, 1)
37
        self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
54 38
        self.textEditComputerInformation = QtWidgets.QTextEdit(self.groupBox)
55 39
        self.textEditComputerInformation.setReadOnly(True)
56 40
        self.textEditComputerInformation.setObjectName("textEditComputerInformation")
57
        self.gridLayout_2.addWidget(self.textEditComputerInformation, 3, 1, 1, 1)
41
        self.gridLayout_2.addWidget(self.textEditComputerInformation, 4, 1, 1, 1)
42
        self.label = QtWidgets.QLabel(self.groupBox)
43
        self.label.setObjectName("label")
44
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
45
        self.label_2 = QtWidgets.QLabel(self.groupBox)
46
        self.label_2.setObjectName("label_2")
47
        self.gridLayout_2.addWidget(self.label_2, 3, 0, 1, 1)
48
        self.label_3 = QtWidgets.QLabel(self.groupBox)
49
        self.label_3.setObjectName("label_3")
50
        self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
51
        self.lineEditIP = QtWidgets.QLineEdit(self.groupBox)
52
        self.lineEditIP.setReadOnly(True)
53
        self.lineEditIP.setObjectName("lineEditIP")
54
        self.gridLayout_2.addWidget(self.lineEditIP, 3, 1, 1, 1)
55
        self.lineEditComputerName = QtWidgets.QLineEdit(self.groupBox)
56
        self.lineEditComputerName.setReadOnly(True)
57
        self.lineEditComputerName.setObjectName("lineEditComputerName")
58
        self.gridLayout_2.addWidget(self.lineEditComputerName, 1, 1, 1, 1)
59
        self.label_5 = QtWidgets.QLabel(self.groupBox)
60
        self.label_5.setObjectName("label_5")
61
        self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
62
        self.lineEditLicense = QtWidgets.QLineEdit(self.groupBox)
63
        self.lineEditLicense.setObjectName("lineEditLicense")
64
        self.gridLayout_2.addWidget(self.lineEditLicense, 2, 1, 1, 1)
58 65
        self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 1)
59 66
        self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
60 67
        self.buttonBox = QtWidgets.QDialogButtonBox(SystemInfoDialog)
......
72 79
        _translate = QtCore.QCoreApplication.translate
73 80
        SystemInfoDialog.setWindowTitle(_translate("SystemInfoDialog", "System Information"))
74 81
        self.groupBox.setTitle(_translate("SystemInfoDialog", "System Information"))
75
        self.label_3.setText(_translate("SystemInfoDialog", "Computer Name : "))
82
        self.label_4.setText(_translate("SystemInfoDialog", "Computer Information : "))
76 83
        self.label.setText(_translate("SystemInfoDialog", "Single ID : "))
77 84
        self.label_2.setText(_translate("SystemInfoDialog", "IP : "))
78
        self.label_4.setText(_translate("SystemInfoDialog", "Computer Information : "))
85
        self.label_3.setText(_translate("SystemInfoDialog", "Computer Name : "))
86
        self.label_5.setText(_translate("SystemInfoDialog", "License : "))
79 87
import Resource_rc
HYTOS_html.template
137 137
    <td>PROGRAM</td>
138 138
    </tr>
139 139
    <tr>
140
    <td><a href="http://www.devdoftech.co.kr:8081/artifactory/${project.name}/Setup/${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi">${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi </a></td>
140
    <td><a href="http://www.devdoftech.co.kr:8081/artifactory/${project.name}/Setup/<%= build.getEnvVars()["OUTPUT_FILE_NAME"]-build.getEnvVars()["BUILD_NAME"] %>x86.msi">${project.name}-<%= build.getEnvVars()["BUILD_NAME"] %>x86.msi </a></td>
141 141
    </tr>
142 142
</table>
143 143
<% } %>
requirements.txt
2 2
Pillow==8.1.0
3 3
pyinstaller==4.1
4 4
PyQt5==5.15.2
5
Shapely==1.7.1
5
Shapely==1.7.1
6
PyJWT==2.0.1

내보내기 Unified diff

클립보드 이미지 추가 (최대 크기: 500 MB)