Compare commits

..

2 Commits

Author SHA256 Message Date
2bc0730fbf blabla 2024-12-02 16:26:11 +01:00
5bf35ce12a Login, user in datenbank und encryption key 2024-12-02 16:15:26 +01:00
9 changed files with 93 additions and 375 deletions

View File

@@ -24,6 +24,7 @@ GridLayout
Label Label
{ {
id: benutzerNamelabel
text: qsTr("Benutzername:") text: qsTr("Benutzername:")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
@@ -69,4 +70,17 @@ GridLayout
{ {
Layout.fillHeight: true Layout.fillHeight: true
} }
Component.onCompleted:
{
config.usernameNotAvailable.connect(usernameNotAvailable)
}
function usernameNotAvailable()
{
benutzerName.placeholderText = qsTr ("Benutzername ist bereits vergeben")
benutzerName.clear()
benutzerNamelabel.color = "red"
benutzerNamelabel.font.bold = true
}
} }

View File

@@ -37,6 +37,7 @@ RowLayout
implicitWidth: kunden.implicitContentWidth + 10 implicitWidth: kunden.implicitContentWidth + 10
onClicked: onClicked:
{ {
// TODO: here we should call the model
appLoader.source = "CustomerTables.qml" appLoader.source = "CustomerTables.qml"
} }
} }

View File

@@ -45,7 +45,6 @@ Item
firstStart.push("AdminUserConfig.qml") firstStart.push("AdminUserConfig.qml")
} }
MessageDialog MessageDialog
{ {
id: conErrDialog id: conErrDialog
@@ -62,7 +61,13 @@ Item
title: qsTr("Encryption Key") title: qsTr("Encryption Key")
anchors.centerIn: parent anchors.centerIn: parent
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
onAccepted: config.setEncyrptKey(encryptPassword.text) onAccepted:
{
// TODO: signal for EncryptionKey testing
config.setEncyrptKey(encryptPassword.text)
appLoader.source = "Dashboard.qml"
topBar.visible = true
}
ColumnLayout ColumnLayout
{ {
RowLayout RowLayout
@@ -89,6 +94,7 @@ Item
id: firstStart id: firstStart
anchors.fill: parent anchors.fill: parent
initialItem: "DbConfiguration.qml" initialItem: "DbConfiguration.qml"
//initialItem: "AdminUserConfig.qml"
} }
RowLayout RowLayout
{ {
@@ -126,7 +132,7 @@ Item
pyqcrm_conf = Qmldict.func(submitBtn.grids) pyqcrm_conf = Qmldict.func(submitBtn.grids)
if (pyqcrm_conf) if (pyqcrm_conf)
{ {
admin = config.setConfig(pyqcrm_conf) config.setConfig(pyqcrm_conf)
} }
} }

View File

@@ -15,6 +15,7 @@ from .PyqcrmFlags import PyqcrmFlags
class ConfigLoader(QObject): class ConfigLoader(QObject):
__config = None __config = None
__version = "0.1-alpha" __version = "0.1-alpha"
@@ -22,6 +23,7 @@ class ConfigLoader(QObject):
dbConnectionError = Signal(str, bool) dbConnectionError = Signal(str, bool)
adminUserError = Signal(str, bool) adminUserError = Signal(str, bool)
usernameNotAvailable = Signal()
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -46,7 +48,10 @@ class ConfigLoader(QObject):
@Slot(dict, result= bool) @Slot(dict, result= bool)
def addAdminUser(self, user_config): def addAdminUser(self, user_config):
admin = UserManager(user_config["user"], PyqcrmFlags.ADMIN).createUser() admin = UserManager(user_config["user"], PyqcrmFlags.ADMIN).createUser()
return True print (admin)
if not admin:
self.usernameNotAvailable.emit()
return admin
@Slot(dict, result= bool) @Slot(dict, result= bool)
def setConfig(self, app_config): def setConfig(self, app_config):
@@ -93,12 +98,21 @@ class ConfigLoader(QObject):
return False return False
def __checkAdminUser(self): def __checkAdminUser(self):
con = DbManager().getConnection()
cur = con.cursor()
cur.callproc("checkAdmin")
result = cur.fetchall()
if not result:
#if not result[0][0] == 1:
self.adminUserError.emit("Kein Admin vorhanden", False) self.adminUserError.emit("Kein Admin vorhanden", False)
else:
self.adminUserError.emit("Admin vorhanden", True)
@Slot(str) @Slot(str)
def setEncyrptKey(self, key): def setEncyrptKey(self, key):
self.__config['pyqcrm']['ENCRYPTION_KEY'] = key self.__config['pyqcrm']['ENCRYPTION_KEY'] = key
print(self.__config)
self.__saveConfig() self.__saveConfig()
def __saveConfig(self): def __saveConfig(self):

View File

@@ -1,5 +1,7 @@
from .DbManager import DbManager from .DbManager import DbManager
from ..PyqcrmFlags import PyqcrmFlags from ..PyqcrmFlags import PyqcrmFlags
from ..Vermasseln import Vermasseln
import mariadb
@@ -15,9 +17,24 @@ class UserManager():
def createUser(self): def createUser(self):
self.__hashPassword()
user_created = True
try:
self.__cur.callproc("createUser", (self.__username, self.__password, self.__info, self.__role)) self.__cur.callproc("createUser", (self.__username, self.__password, self.__info, self.__role))
self.__con.commit() self.__con.commit()
self.__closeConnection() except mariadb.Error as e:
print(f"Error: {e}")
print(e.errno)
user_created = False
finally:
self.__cur.close()
#self.__closeConnection()
return user_created
def __hashPassword(self):
self.__password = Vermasseln.userPasswordHash(self.__password)
print (self.__password)
def getUser(self): def getUser(self):
self.__closeConnection() self.__closeConnection()

View File

@@ -2,7 +2,11 @@
from Crypto.Cipher import AES from Crypto.Cipher import AES
from base64 import b64encode, b64decode from base64 import b64encode, b64decode
import platform import platform
from Crypto.Hash import SHA256 from Crypto.Hash import SHA256, SHA3_512
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
import random
import string
class Vermasseln: class Vermasseln:
@@ -42,6 +46,18 @@ class Vermasseln:
cipher = AES.new(hashed, AES.MODE_SIV, nonce = nonce) cipher = AES.new(hashed, AES.MODE_SIV, nonce = nonce)
return cipher return cipher
@classmethod
def userPasswordHash(self, password):
salt = "".join(random.choice(string.ascii_letters + string.digits) for i in range (32))
hash_pw = (salt + password).encode("utf-8")
h_obj = SHA3_512.new(hash_pw)
password = salt + "$" + h_obj.hexdigest()
return password

View File

@@ -1,78 +0,0 @@
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.8.0
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x01\xba\
(\
\xb5/\xfd`\xdd\x04\x85\x0d\x00\xb6\x13=\x1f0s\x1e\
\xb3\xfb\x92H\xd4\xdc\x08\xd0\xcdc\xdb\xa9\xa2\xa0\xc4\xa4\
\xbco\x17:w\xe6&\x14T4\x0c\x034\x003\x00\
4\x00{5\x07\x9f\x8a\x9d\x83\xa1\xb9\x87UdHh\
\xae\x9a\xf1\xedE}\x17W\x7fsTl\x0c\xc4:]\
a\x8c~\xed\xcfF\xa8l\xff\xd9\x0c\x89i^\xac\x94\
\xa7\xb4\xf7\xbe\xac\x18M(4A\x9b,]>\xbe(\
/+\x10M\x90n#\x02\xb8\x85n\x9a{\x0fs\xf5\
o\xeeWb(\xdf^@\xba\xd4\xec\xff\xba\x081\xf6\
\x18\x96\xd4\x1b\xbe\xb9\xd2O\xf6\x8f}Z\xfe\xb4C\xe2\
\xfc\x91'\xdf\x8f\xd6\xe45\x9c\x99\x9a\xb2\x9c\xd6\xe2l\
\xf5\xd3\xca\x80L\xa6f\xd5\x84\x22im\xa4\x96h\xfc\
\xbc6\x95\x9c\xa9\xed\xc8u9\x8a5\x8c\x19\x8c\x85\x10\
\xcd\xcdX\xf9J\x1eV\xd1#\x8a\xdd[\xf6\x8b*\x0e\
\x95\xeadk@\xb9Z+\x0e\xdc\xf3M\xd4\xdc\xecG\
;\xb3/e\xc4Ho/\x0a-\xfe\x87\xa2\x9au\xc2\
N\xa0\x91\x1dB\x8a!\x91))LZ\x03@\x84\x18\
\xc6\xec\x1c\x03\x00\xb53i!-\xd8t\x01r\x1e\xc8\
R\xc2\x99\x15\xe6\xba7\xf5\xb1\x85]\xd9d4\xe6\x0c\
\x07\x95\x88^\xe0\xf7\x96\x0d\xeb\xc7\xa2\xaeQ\xbf\x96\xfd\
\x93\x9c\xd3\x1cX\x94L7\x1bB\xb5\xb0\xc2tNJ\
\x5c\xf0x\x18\x1d\xd3vQ\x82w\xa5\xf6\x18\xb9\xbb\xaa\
\x8d)z\x08\x8f\xf5\xb8\x80\xe7*\xab\xbd\x0f\xd2\x92;\
\xc4\xaa@\x8bdyf\xa1\x0d\xc2[\xc6\xa0QD\x18\
\x97p\xb1\x85\xf3m3\x04\x05\x95=^\xd8SU\xe5\
6\x9e\x93%!~\x0d`\x01_\xdb(\x5c\xa0\xa7\x82\
\x03\xf0\xd6\xb8\x0d\x97\xd8n\x056\x87\xb4\xaf%\xb4\x0d\
\x83\xfb\x1b\xe6\x8aD\x22w*\
\x00\x00\x00$\
m\
odule TopBar\x0aTop\
Bar 1.0 TopBar.q\
ml\x0a\
"
qt_resource_name = b"\
\x00\x03\
\x00\x00n\xb9\
\x00g\
\x00u\x00i\
\x00\x0a\
\x08\x8e<\xbc\
\x00T\
\x00o\x00p\x00B\x00a\x00r\x00.\x00q\x00m\x00l\
\x00\x06\
\x07\x84+\x02\
\x00q\
\x00m\x00l\x00d\x00i\x00r\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00&\x00\x00\x00\x00\x00\x01\x00\x00\x01\xbe\
\x00\x00\x01\x93+<\x17\x5c\
\x00\x00\x00\x0c\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x93*\xc9x\xab\
"
def qInitResources():
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()

View File

@@ -6,10 +6,10 @@
from PySide6 import QtCore from PySide6 import QtCore
qt_resource_data = b"\ qt_resource_data = b"\
\x00\x00\x00\x18\ \x00\x00\x00\x1a\
[\ [\
Controls]\x0aStyle=\ Controls]\x0d\x0aStyle\
Fusion\x0a\ =Fusion\x0d\x0a\
\x00\x00\x01\x22\ \x00\x00\x01\x22\
<\ <\
svg xmlns=\x22http:\ svg xmlns=\x22http:\
@@ -194,19 +194,19 @@ qt_resource_struct = b"\
\x00\x00\x000\x00\x02\x00\x00\x00\x06\x00\x00\x00\x03\ \x00\x00\x000\x00\x02\x00\x00\x00\x06\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x93*\xc9x\xac\ \x00\x00\x01\x93)\xa6\xd7i\
\x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x02\x9f\ \x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x02\xa1\
\x00\x00\x01\x93*\xd6\x0c\xbc\ \x00\x00\x01\x93 \xd4\x11\xf3\
\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00\x03Y\ \x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00\x03[\
\x00\x00\x01\x93*\xd6\x0c\xbd\ \x00\x00\x01\x93\x00\x9f\x10\x0d\
\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x05\x9a\ \x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x05\x9c\
\x00\x00\x01\x93*\xd6\x0c\xbc\ \x00\x00\x01\x93 \xd4\x11\xf4\
\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x01B\ \x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x01D\
\x00\x00\x01\x93*\xd6\x0c\xbc\ \x00\x00\x01\x93 \xd4\x11\xf4\
\x00\x00\x00B\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1c\ \x00\x00\x00B\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1e\
\x00\x00\x01\x93*\xd6\x0c\xbd\ \x00\x00\x01\x93\x00\xcf\xe6\x09\
\x00\x00\x00\xae\x00\x00\x00\x00\x00\x01\x00\x00\x04\xd5\ \x00\x00\x00\xae\x00\x00\x00\x00\x00\x01\x00\x00\x04\xd7\
\x00\x00\x01\x93*\xd6\x0c\xbd\ \x00\x00\x01\x92\xfc,B\x0e\
" "
def qInitResources(): def qInitResources():

272
rc_qml.py
View File

@@ -1,272 +0,0 @@
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.8.0
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x01\xbc\
(\
\xb5/\xfd`\xe0\x04\x95\x0d\x00\xf6\xd3=\x1f0s\x1e\
\xb3\xfb\x92H\xd4\xdc\x08\xd0\xcdc\xcb\x14\xd1\xdd\x16\xbb\
\xef\xdb\x85\xce\x9d\xb9\x1dJ*\x1a\x86\x014\x004\x00\
5\x00\xdb\xe0S\xb1s0l{XE\x86\x84m\xd5\
\x8c\xcf]\xd4\xdd\xe2\xea\xdfF\xc5\xdd]\x06b\x9d\xae\
0F\xbf\xf6\xc7E\xa8l\xff\xd9\x0c\x89i^\xac\x94\
\xa7\xec{_V\x0c\x84\xc2\x0av\xb2t\xf9\xf8\xa2\xbc\
\xac@4A\xea\x1a\x11\xc0-t\xb3\xed=\xcc\xd5\x7f\
\xdb;\x89\xa1\xdc\xf5\x02RG\xcd\xfe\xaf\x8b\x10c\x8f\
aI\xbd\xe1\x9bN\xfa\xc9\xee\xae\xec\x93\xe3O;$\
\xce\x1fyr\xf7\xd1\xe2\xc9k835e99\x8b\
\xb3\xd5O+\x032\x99\x9aU\x13\x8a\xa4\xb5\x916\xb1\
\xfc\xbc6\x95\x9c)\xd7\x91\xebj\x14k\x18\xb3\x03\x8c\
\x85\x10\xdbf\xac\xdcI\x1eV\xd1#\x8a\xdd[\xf6\x8b\
*\x0e\x95\xeadk@\xb9rV\x1c\xb4\xe7\x9bh\xdb\
\xecG;\xe3^\xca\x88\x91\x9e\xbb(\xb4\xf8\x1f\x8aj\
\xd6\x09_M\xa0\x91!B\x88!\x91!)L\xb3\x06\
@\x84\x18\xc6\xcc\xea\x03e7\xa1`/\xb3\xeb\x00\xe4\
\xbc\xc9b\x9a3;\xcc6\xde\x15\xc6\x96qq\x93\xd1\
\x9a3\x5c\xe4$)\x1b\x7f\x98\xedl2\x12[]\x91\
\xfd(\xcf)wR#\xa0*7o4\x08\xc1\xd2\x0a\
';*\x83\xb1'\xa1T\xb1\xcfRL\x01\x832{\
\x82\xfc\xddj{\x12=\x84\xdf>B\xf0\xf3\x94\xda\x9e\
\x07\xb9\x92;`UX\x8bdyf\xe1\x1a\xd0[\xf2\
\xa0YD\x18\x97\xbc\xb8\xb2\x13m3\xc3B\xc9\x08\x1f\
\xf2\xac\xaar\x1b\xcf\xc9J8\xbf\x0eX\xcb\xd7o\x14\
/\xe0\xa9\xd8Ax5n\xee%\xb6[\x81\xcdC\xc4\
\x1d\xbf\xda\x7fahCL\x91q\x1a\
\x00\x00\x03,\
i\
mport QtQuick\x0aim\
port QtQuick.Con\
trols\x0aimport QtQ\
uick.Layouts\x0a\x0aGr\
idLayout\x0a{\x0a i\
d: passEncryptKe\
yGrid\x0a column\
s: 2\x0a columnS\
pacing: 5\x0a ro\
wSpacing: 9\x0a \
// anchors.fill:\
parent\x0a\x0a pro\
perty string nam\
e: \x22pyqcrm\x22\x0a\x0a \
Label\x0a {\x0a \
text: qsTr(\
\x22Encryption Key \
eingeben\x22)\x0a \
font.pixelSiz\
e: 40\x0a La\
yout.columnSpan:\
2\x0a Layou\
t.alignment: Qt.\
AlignHCenter\x0a \
padding: 15\
\x0a }\x0a\x0a\x0a Lab\
el\x0a {\x0a \
text: qsTr(\x22Enc\
ryption Key:\x22)\x0a \
Layout.al\
ignment: Qt.Alig\
nRight\x0a }\x0a\x0a \
TextField\x0a \
{\x0a id: pa\
ssEncryptKey\x0a \
placeholder\
Text: qsTr(\x22Hier\
Encryption Key \
eingeben\x22)\x0a \
Layout.fillWi\
dth: true\x0a \
height: 3\x0a \
echoMode: Te\
xtInput.Password\
\x0a propert\
y string name: \x22\
ENCRYPT_KEY\x22\x0a \
}\x0a\x0a Item\x0a \
{\x0a Layou\
t.fillHeight: tr\
ue\x0a }\x0a}\x0a\
\x00\x00\x00!\
m\
odule gui\x0aTopBar\
1.0 TopBar.qml\x0a\
\
\x00\x00\x01\xfc\
(\
\xb5/\xfd`\x8f\x06\x95\x0f\x00\xe6\xd8M \xf0\x18=\
\xd0E\x8b\xadru:\x98\xfd\x06\x97G\xab\x9e\xb2\xe6\
;C\xd5\xda{k,,\x0e\x034\xef\x05B\x00C\
\x00E\x00X\xc7\x90\xa5\x9c\xf44C\xc7l\xbb\xaf^\
n\x9b\x1d'\x8d\x8f\xe5k\x9f1\x05u\x96\xb4\xcaF\
=v\xefb\xaf\x07\x83\xeen\xa8\x82\x93b\x09\x840\
\xffwQ\x92\x92\xeb\xc5o\xaf\xe3\x82#\x8e~\x99\xcf\
\xf4\xe3\xebu4\xf1\xadw6D\xab4t\xb4\x17\x01\
\xd1\xd1ST\xab~\xa2\xde\xf5\xf6\x82\x02\x96\xf5\x90\xfd\
j\xf5\xcf\x96Bzd\xe5f\xfd\xe5\xc3\x02\xe0M&\
u\xfc\x93\x7f\xf5MR,\xcfr\x93/\xa7\xd5\xd1;\
i\x1b\x7f\x86\x0a\xd3\xc5\x01r\xd2*K\xf8b\xac\x8d\
v\xc9>\x8d\x87\x7f\xf8;\x8a~RO\xad\x14d}\
\xf3\x90\xa5\xde\x8d\x9df\x1b\xec\xb3^\x91s\xb2\xce\xea\
4\xf2'\xdf\xc0\x17\x85\xa8&`\xc5\xcf7\x134\xe0\
\xaa0\xa7\xf4\xb0\xbfuG\xc6\xb8>\xd3\x01p\xe5Y\
\xe7?\xd14\x06\xe6\xfa\xcf\xb3\x93\xe8\xf3V\xae\x88\xf3\
i\xcaYBK\x03\xd18\xd83\xc7bO\xfdg\xbd\
\x01\xa90,\xdeI\x8b\xe6\x82Y-\xb0\x03\x86%:\
z\xf7{\x81\x19\x08\x85\x8e\xdd\xfd\xbf\x9b\xaa\xf3v\xd2\
\x11\xdf\x0fL\xa0\x91\x11B\xd0\x90\x88\x8d\x92(\x951\
PF \xa6\xca<Z\x99\xf8X\xc3\x03B\x9fEu\
\x8d]\xa4\xa9?Ejk\x0e\xed9\x942\xcf\xdd\xfa\
\x02\x84AVW&Q\x5cE:\xa4(e-\xca\x98\
\xb9\xaa\xf0\xb4yT\xa5\x04\xbf\xadl\xe1\xbeB0\x09\
\x89\x94!\x8d\xfc\xf8;\x0d\x1c\x10\xc2\xfa\xe7*pB\
\xd3M.\xf4\x01\xac\x0b\x857X\x0a\xe8\xa0G6;\
\x126JY\xba\xda\xa2-\xce\x04.\xc7\x1a=\x18n\
r\xfb\xb1$|t7Ml\xd4\x0f[\x00\xa2[K\
\xa1\xd0\xa1\xf1\x14\xda\xa8J\x08\x16gTw\x9c6\xa4\
\x0dp_k\xbd\xb4^\x0as\x0f\x86\x0b\x0a\xcd\xe5\xd9\
F^F\x8d\x86^ E\xe47\x05\
\x00\x00\x05>\
i\
mport QtQuick\x0aim\
port QtQuick.Con\
trols\x0aimport QtQ\
uick.Layouts\x0a\x0aGr\
idLayout\x0a{\x0a i\
d: createUserGri\
d\x0a columns: 2\
\x0a columnSpaci\
ng: 5\x0a rowSpa\
cing: 9\x0a // a\
nchors.fill: par\
ent\x0a\x0a propert\
y string name: \x22\
user\x22\x0a\x0a Label\
\x0a {\x0a t\
ext: qsTr(\x22Admin\
User erstellen\x22\
)\x0a font.p\
ixelSize: 40\x0a \
Layout.colu\
mnSpan: 2\x0a \
Layout.alignme\
nt: Qt.AlignHCen\
ter\x0a padd\
ing: 15\x0a }\x0a\x0a\x0a\
Label\x0a {\x0a\
text: qs\
Tr(\x22Benutzername\
:\x22)\x0a Layo\
ut.alignment: Qt\
.AlignRight\x0a \
}\x0a\x0a TextField\
\x0a {\x0a i\
d: benutzerName\x0a\
placehol\
derText: qsTr(\x22H\
ier Benutzername\
eingeben\x22)\x0a \
Layout.fillW\
idth: true\x0a \
height: 3\x0a \
property st\
ring name: \x22PYQC\
RM_USER\x22\x0a }\x0a\x0a\
Label\x0a {\x0a\
text: qs\
Tr(\x22Passwort:\x22)\x0a\
Layout.a\
lignment: Qt.Ali\
gnRight\x0a }\x0a\x0a \
TextField\x0a \
{\x0a id: p\
assword\x0a \
echoMode: TextIn\
put.Password\x0a \
placeholder\
Text: qsTr(\x22Hier\
Passwort eingeb\
en\x22)\x0a Lay\
out.fillWidth: t\
rue\x0a prop\
erty string name\
: \x22PYQCRM_USER_P\
ASS\x22\x0a }\x0a L\
abel\x0a {\x0a \
text: qsTr(\x22I\
nfo:\x22)\x0a L\
ayout.alignment:\
Qt.AlignRight\x0a \
}\x0a\x0a TextFi\
eld\x0a {\x0a \
id: gecos\x0a \
placeholderT\
ext: qsTr(\x22Zus\xc3\xa4\
tzliche Info\x22)\x0a \
Layout.fi\
llWidth: true\x0a \
property s\
tring name: \x22PYQ\
CRM_USER_INFO\x22\x0a \
}\x0a\x0a Item\x0a \
{\x0a Lay\
out.fillHeight: \
true\x0a }\x0a}\x0a\
"
qt_resource_name = b"\
\x00\x03\
\x00\x00N\xb9\
\x00G\
\x00u\x00i\
\x00\x0a\
\x08\x8e<\xbc\
\x00T\
\x00o\x00p\x00B\x00a\x00r\x00.\x00q\x00m\x00l\
\x00\x11\
\x00\x11r\xdc\
\x00E\
\x00n\x00c\x00r\x00y\x00p\x00t\x00i\x00o\x00n\x00K\x00e\x00y\x00.\x00q\x00m\x00l\
\
\x00\x06\
\x07\x84+\x02\
\x00q\
\x00m\x00l\x00d\x00i\x00r\
\x00\x13\
\x0aQ\xd8\x1c\
\x00D\
\x00b\x00C\x00o\x00n\x00f\x00i\x00g\x00u\x00r\x00a\x00t\x00i\x00o\x00n\x00.\x00q\
\x00m\x00l\
\x00\x13\
\x01\xa7!\xbc\
\x00A\
\x00d\x00m\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00q\
\x00m\x00l\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00&\x00\x00\x00\x00\x00\x01\x00\x00\x01\xc0\
\x00\x00\x01\x93c~Y\x0a\
\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x07\x15\
\x00\x00\x01\x93h\xe8\xab\xf0\
\x00\x00\x00N\x00\x00\x00\x00\x00\x01\x00\x00\x04\xf0\
\x00\x00\x01\x930& \x0f\
\x00\x00\x00\x0c\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x93s\x11\x00\xaa\
\x00\x00\x00`\x00\x04\x00\x00\x00\x01\x00\x00\x05\x15\
\x00\x00\x01\x93c\xd7\xe0,\
"
def qInitResources():
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()