recoveryfile

This commit is contained in:
2024-12-09 16:35:54 +01:00
parent 1900100b54
commit 5f08435816
8 changed files with 183 additions and 349 deletions

View File

@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Fusion import QtQuick.Controls.Fusion
import QtQuick.Dialogs
import "../js/qmldict.js" as JsLib import "../js/qmldict.js" as JsLib
ColumnLayout ColumnLayout
@@ -258,6 +259,8 @@ ColumnLayout
id: spacer3 id: spacer3
Layout.fillHeight: true Layout.fillHeight: true
} }
function isEmptyField() function isEmptyField()
{ {
if (!firmenName.text.trim() || !street.text.trim() || !city.text.trim()) if (!firmenName.text.trim() || !street.text.trim() || !city.text.trim())

View File

@@ -70,9 +70,13 @@ GridLayout
{ {
Layout.fillHeight: true Layout.fillHeight: true
} }
Component.onCompleted: Component.onCompleted:
{ {
config.usernameNotAvailable.connect(usernameNotAvailable) config.usernameNotAvailable.connect(usernameNotAvailable)
} }
function usernameNotAvailable() function usernameNotAvailable()
{ {
@@ -81,6 +85,7 @@ GridLayout
benutzerNamelabel.color = "red" benutzerNamelabel.color = "red"
benutzerNamelabel.font.bold = true benutzerNamelabel.font.bold = true
} }
} }

View File

@@ -2,16 +2,26 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtCore
import "../js/qmldict.js" as Qmldict import "../js/qmldict.js" as Qmldict
Item Item
{ {
property string recpass: ""
property bool adminAvailable: true
Component.onCompleted: Component.onCompleted:
{ {
config.dbConnectionError.connect(onDbConnectionError) config.dbConnectionError.connect(onDbConnectionError)
config.adminUserError.connect(onAdminUserError) config.adminUserError.connect(onAdminUserError)
config.backupEncryptionKey.connect(onBackupEncryptionKey)
}
function onBackupEncryptionKey()
{
recoveryDialog.open()
} }
function onDbConnectionError(msg, success) function onDbConnectionError(msg, success)
@@ -27,9 +37,44 @@ Item
encryptPwDialog.open() encryptPwDialog.open()
} }
else else
{
adminAvailable = false
firstStart.push("AdminUserConfig.qml") firstStart.push("AdminUserConfig.qml")
} }
}
MessageDialog
{
id: recoveryDialog
text: qsTr("Diesen Wiederherstellungscode musst du sicher aufbewahren!\nMöchtest du das jetzt machen?")
title: qsTr("Wiederherstellen")
buttons: MessageDialog.Yes | MessageDialog.No
onAccepted: saveRecoveryDialog.open()
}
FileDialog
{
id: saveRecoveryDialog
title: qsTr("Wiederherstellungsdatei")
fileMode: adminAvailable? FileDialog.OpenFile: FileDialog.SaveFile
nameFilters: ["PYQCRM Recovery files (*.pyqrec)"]
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
onAccepted:
{
if (!adminAvailable) config.saveRecoveryKey(saveRecoveryDialog.currentFile, recpass)
else
{
config.getRecoveryKey(saveRecoveryDialog.currentFile, recpass)
}
appLoader.source = "Dashboard.qml"
topBar.visible = true
}
}
MessageDialog MessageDialog
{ {
id: conErrDialog id: conErrDialog
@@ -43,15 +88,14 @@ Item
{ {
id: encryptPwDialog id: encryptPwDialog
modal: true modal: true
title: qsTr("Encryption Key") title: qsTr("Wiederherstellung")
anchors.centerIn: parent anchors.centerIn: parent
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
onAccepted: onAccepted:
{ {
// TODO: signal for EncryptionKey testing recpass = encryptPassword.text
config.setEncyrptKey(encryptPassword.text) saveRecoveryDialog.open()
appLoader.source = "Dashboard.qml"
topBar.visible = true
} }
ColumnLayout ColumnLayout
{ {
@@ -59,7 +103,7 @@ Item
{ {
Label Label
{ {
text: qsTr("Encryption Key eingeben:") text: qsTr("Wiederherstellungspasswort eingeben: ")
} }
TextField TextField
@@ -67,12 +111,14 @@ Item
id: encryptPassword id: encryptPassword
echoMode: TextInput.Password echoMode: TextInput.Password
implicitWidth: 300 implicitWidth: 300
placeholderText: qsTr("Hier Encryption Key eingeben") placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben")
} }
} }
} }
} }
anchors.fill: parent anchors.fill: parent
StackView StackView
{ {
@@ -129,8 +175,8 @@ Item
admin = config.addAdminUser(pyqcrm_conf) admin = config.addAdminUser(pyqcrm_conf)
if (admin) if (admin)
{ {
appLoader.source = "Dashboard.qml" //appLoader.source = "Dashboard.qml"
topBar.visible = true //topBar.visible = true
} }
else else
{ {

View File

@@ -1,288 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17">
<diagram name="Seite-1" id="pSBFfb5XT7-LB2o_rlPx">
<mxGraphModel dx="1434" dy="844" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="zKFDF5UOk-7tD0-7yUJp-6" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="270" y="90" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-7" value="Erfolgreich&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="270" y="70" width="80" height="40" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-8" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-6" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="450" y="465" as="sourcePoint" />
<mxPoint x="620" y="130" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-9" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zKFDF5UOk-7tD0-7yUJp-8" vertex="1" connectable="0">
<mxGeometry x="-0.1294" y="2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-10" value="Laden Konfiguration" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="620" y="100" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-6" target="vLrOMzFsj3qdJpjowrCW-6" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="370" y="465" as="sourcePoint" />
<mxPoint x="310" y="205" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-12" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zKFDF5UOk-7tD0-7yUJp-11" vertex="1" connectable="0">
<mxGeometry x="-0.0286" y="4" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-10" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="450" y="465" as="sourcePoint" />
<mxPoint x="700" y="280" as="targetPoint" />
<Array as="points">
<mxPoint x="700" y="190" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-6" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="270" y="215" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-10" value="Backup existiert" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="187.5" y="210" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-13" value="importieren" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="450" y="240" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-14" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-6" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="285" as="sourcePoint" />
<mxPoint x="450" y="255" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-15" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-14" vertex="1" connectable="0">
<mxGeometry x="-0.18" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-55" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="zKFDF5UOk-7tD0-7yUJp-6" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="40" y="130" as="sourcePoint" />
<mxPoint x="270" y="130" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-56" value="config exists" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-55" vertex="1" connectable="0">
<mxGeometry x="-0.1714" y="1" relative="1" as="geometry">
<mxPoint x="-5" y="1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-1" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="10" y="115" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-73" value="Data not full usable" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="10" y="595" width="130" height="30" as="geometry" />
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-5" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="530" y="260" as="sourcePoint" />
<mxPoint x="620" y="150" as="targetPoint" />
<Array as="points">
<mxPoint x="580" y="260" />
<mxPoint x="580" y="150" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-70" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.483;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-47" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="60" y="695" as="sourcePoint" />
<mxPoint x="660" y="320" as="targetPoint" />
<Array as="points">
<mxPoint x="399" y="800" />
<mxPoint x="560" y="800" />
<mxPoint x="560" y="320" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-13" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310" y="460" as="sourcePoint" />
<mxPoint x="310" y="390" as="targetPoint" />
<Array as="points">
<mxPoint x="310" y="350" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-30" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-13" target="vLrOMzFsj3qdJpjowrCW-22" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="342.5" y="590" as="sourcePoint" />
<mxPoint x="310" y="595" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-39" value="Login erfolgreich" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="580" y="555" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-23" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="620" y="280" width="190" height="490" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-16" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1">
<mxGeometry x="40" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-19" value="Dashboard" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1">
<mxGeometry x="10" y="430" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-21" value="Login Screen" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1">
<mxGeometry y="140" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-36" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-23" source="zKFDF5UOk-7tD0-7yUJp-16" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-170" y="180" as="sourcePoint" />
<mxPoint x="80" y="140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-37" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1">
<mxGeometry x="40" y="280" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-38" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-23" source="zKFDF5UOk-7tD0-7yUJp-21" target="zKFDF5UOk-7tD0-7yUJp-37" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-170" y="180" as="sourcePoint" />
<mxPoint x="-120" y="130" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-40" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-23" source="zKFDF5UOk-7tD0-7yUJp-37" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-130" y="220" as="sourcePoint" />
<mxPoint x="80" y="430" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-41" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zKFDF5UOk-7tD0-7yUJp-40" vertex="1" connectable="0">
<mxGeometry x="-0.3429" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-42" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-23" source="zKFDF5UOk-7tD0-7yUJp-37" target="zKFDF5UOk-7tD0-7yUJp-21" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-170" y="180" as="sourcePoint" />
<mxPoint x="200" y="180" as="targetPoint" />
<Array as="points">
<mxPoint x="190" y="320" />
<mxPoint x="190" y="170" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-43" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="zKFDF5UOk-7tD0-7yUJp-42" vertex="1" connectable="0">
<mxGeometry x="0.1259" y="-3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-27" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="130" y="460" width="390" height="300" as="geometry" />
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-24" value="Admin user speichern" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="270" y="205" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-22" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="140" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-24" value="admin exists" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="77.5" width="90" height="30" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-35" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-22" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="300" y="39.5" as="sourcePoint" />
<mxPoint x="270" y="40" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-39" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-35" vertex="1" connectable="0">
<mxGeometry x="-0.1143" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-49" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-22" target="vLrOMzFsj3qdJpjowrCW-61" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="130" y="60" as="sourcePoint" />
<mxPoint x="180" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-54" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-49" vertex="1" connectable="0">
<mxGeometry x="-0.4" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-61" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="140" y="120" width="80" height="60" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-62" value="&lt;span style=&quot;text-wrap: wrap;&quot;&gt;encryption&amp;nbsp;&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;Key&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="180" y="110" width="80" height="40" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-63" value="create Verschlüssenlungskey" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="270" y="120" width="120" height="35" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-66" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-61" target="vLrOMzFsj3qdJpjowrCW-71" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="20" y="160" as="sourcePoint" />
<mxPoint x="50" y="140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-67" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-66" vertex="1" connectable="0">
<mxGeometry x="0.2061" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-69" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.459;exitY=0.998;exitDx=0;exitDy=0;exitPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="329.65000000000015" y="244.9999999999999" as="sourcePoint" />
<mxPoint x="330" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-71" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.flowchart.or;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry y="125" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-24" value="add admin and user roles&amp;nbsp;&amp;nbsp;" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="270" y="10" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-25" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" target="zKFDF5UOk-7tD0-7yUJp-24" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="330" y="155" as="sourcePoint" />
<mxPoint x="330" y="145" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="wBh1sZi6hsA7ukKMJ2_X-24" target="vLrOMzFsj3qdJpjowrCW-63" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="370" y="-5" as="sourcePoint" />
<mxPoint x="420" y="-55" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-28" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-6" target="zKFDF5UOk-7tD0-7yUJp-13" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310" y="295" as="sourcePoint" />
<mxPoint x="310" y="390" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-29" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="wBh1sZi6hsA7ukKMJ2_X-28" vertex="1" connectable="0">
<mxGeometry x="-0.1231" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-13" value="anlegen Konfiguration" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="250" y="355" width="120" height="65" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-47" value="" style="shape=line;html=1;strokeWidth=6;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="297.5" y="760" width="210" height="10" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-64" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-61" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310" y="635" as="sourcePoint" />
<mxPoint x="311" y="750" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-65" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-64" vertex="1" connectable="0">
<mxGeometry x="-0.32" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -81,7 +81,7 @@
<mxCell id="vLrOMzFsj3qdJpjowrCW-73" value="Data not full usable" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-73" value="Data not full usable" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="10" y="595" width="130" height="30" as="geometry" /> <mxGeometry x="10" y="595" width="130" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-5" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-5" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="530" y="260" as="sourcePoint" /> <mxPoint x="530" y="260" as="sourcePoint" />
<mxPoint x="620" y="150" as="targetPoint" /> <mxPoint x="620" y="150" as="targetPoint" />
@@ -91,12 +91,12 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-70" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.483;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-47" edge="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-70" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="KgfY491xeuN-natDz28Q-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="60" y="695" as="sourcePoint" /> <mxPoint x="750" y="810" as="sourcePoint" />
<mxPoint x="660" y="320" as="targetPoint" /> <mxPoint x="660" y="320" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="399" y="800" /> <mxPoint x="560" y="880" />
<mxPoint x="560" y="800" /> <mxPoint x="560" y="800" />
<mxPoint x="560" y="320" /> <mxPoint x="560" y="320" />
</Array> </Array>
@@ -111,7 +111,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-30" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-13" edge="1" target="vLrOMzFsj3qdJpjowrCW-22"> <mxCell id="zKFDF5UOk-7tD0-7yUJp-30" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="zKFDF5UOk-7tD0-7yUJp-13" target="vLrOMzFsj3qdJpjowrCW-22" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="342.5" y="590" as="sourcePoint" /> <mxPoint x="342.5" y="590" as="sourcePoint" />
<mxPoint x="310" y="595" as="targetPoint" /> <mxPoint x="310" y="595" as="targetPoint" />
@@ -121,7 +121,7 @@
<mxCell id="zKFDF5UOk-7tD0-7yUJp-39" value="Login erfolgreich" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxCell id="zKFDF5UOk-7tD0-7yUJp-39" value="Login erfolgreich" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
<mxGeometry x="580" y="555" width="110" height="30" as="geometry" /> <mxGeometry x="580" y="555" width="110" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-23" value="" style="group" vertex="1" connectable="0" parent="1"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-23" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="620" y="280" width="190" height="490" as="geometry" /> <mxGeometry x="620" y="280" width="190" height="490" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-16" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1"> <mxCell id="zKFDF5UOk-7tD0-7yUJp-16" value="" style="rhombus;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-23" vertex="1">
@@ -174,7 +174,7 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-27" value="" style="group" vertex="1" connectable="0" parent="1"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-27" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="130" y="460" width="390" height="300" as="geometry" /> <mxGeometry x="130" y="460" width="390" height="300" as="geometry" />
</mxCell> </mxCell>
<mxCell id="zKFDF5UOk-7tD0-7yUJp-24" value="Admin user speichern" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1"> <mxCell id="zKFDF5UOk-7tD0-7yUJp-24" value="Admin user speichern" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
@@ -197,10 +197,7 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-47" value="" style="shape=line;html=1;strokeWidth=6;strokeColor=#ff0000;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-49" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-22" target="vLrOMzFsj3qdJpjowrCW-61" edge="1">
<mxGeometry x="167.5" y="290" width="210" height="10" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-49" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-22" edge="1" target="vLrOMzFsj3qdJpjowrCW-61">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="130" y="60" as="sourcePoint" /> <mxPoint x="130" y="60" as="sourcePoint" />
<mxPoint x="180" y="110" as="targetPoint" /> <mxPoint x="180" y="110" as="targetPoint" />
@@ -221,18 +218,7 @@
<mxCell id="vLrOMzFsj3qdJpjowrCW-63" value="create Verschlüssenlungskey" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-63" value="create Verschlüssenlungskey" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="270" y="120" width="120" height="35" as="geometry" /> <mxGeometry x="270" y="120" width="120" height="35" as="geometry" />
</mxCell> </mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-64" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.064;entryY=0.226;entryDx=0;entryDy=0;entryPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-61" target="vLrOMzFsj3qdJpjowrCW-47" edge="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-66" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-61" target="vLrOMzFsj3qdJpjowrCW-71" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="180" y="175" as="sourcePoint" />
<mxPoint x="180" y="293" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-65" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-64" vertex="1" connectable="0">
<mxGeometry x="-0.32" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-66" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="vLrOMzFsj3qdJpjowrCW-61" edge="1" target="vLrOMzFsj3qdJpjowrCW-71">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="20" y="160" as="sourcePoint" /> <mxPoint x="20" y="160" as="sourcePoint" />
<mxPoint x="50" y="140" as="targetPoint" /> <mxPoint x="50" y="140" as="targetPoint" />
@@ -243,38 +229,32 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-69" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.459;exitY=0.998;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.774;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" target="vLrOMzFsj3qdJpjowrCW-47" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="329.65000000000015" y="244.9999999999999" as="sourcePoint" />
<mxPoint x="330" y="285" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-71" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.flowchart.or;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1"> <mxCell id="vLrOMzFsj3qdJpjowrCW-71" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.flowchart.or;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry y="125" width="50" height="50" as="geometry" /> <mxGeometry y="125" width="50" height="50" as="geometry" />
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-24" value="add admin and user roles&amp;nbsp;&amp;nbsp;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="wBh1sZi6hsA7ukKMJ2_X-27"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-24" value="add admin and user roles&amp;nbsp;&amp;nbsp;" style="rounded=1;whiteSpace=wrap;html=1;" parent="wBh1sZi6hsA7ukKMJ2_X-27" vertex="1">
<mxGeometry x="270" y="10" width="120" height="60" as="geometry" /> <mxGeometry x="270" y="10" width="120" height="60" as="geometry" />
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-25" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="wBh1sZi6hsA7ukKMJ2_X-27" target="zKFDF5UOk-7tD0-7yUJp-24"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-25" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" target="zKFDF5UOk-7tD0-7yUJp-24" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="330" y="155" as="sourcePoint" /> <mxPoint x="330" y="155" as="sourcePoint" />
<mxPoint x="330" y="145" as="targetPoint" /> <mxPoint x="330" y="145" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="wBh1sZi6hsA7ukKMJ2_X-24" target="vLrOMzFsj3qdJpjowrCW-63"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="wBh1sZi6hsA7ukKMJ2_X-27" source="wBh1sZi6hsA7ukKMJ2_X-24" target="vLrOMzFsj3qdJpjowrCW-63" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="370" y="-5" as="sourcePoint" /> <mxPoint x="370" y="-5" as="sourcePoint" />
<mxPoint x="420" y="-55" as="targetPoint" /> <mxPoint x="420" y="-55" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-28" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="vLrOMzFsj3qdJpjowrCW-6" target="zKFDF5UOk-7tD0-7yUJp-13"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-28" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-6" target="zKFDF5UOk-7tD0-7yUJp-13" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310" y="295" as="sourcePoint" /> <mxPoint x="310" y="295" as="sourcePoint" />
<mxPoint x="310" y="390" as="targetPoint" /> <mxPoint x="310" y="390" as="targetPoint" />
<Array as="points" /> <Array as="points" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="wBh1sZi6hsA7ukKMJ2_X-29" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wBh1sZi6hsA7ukKMJ2_X-28"> <mxCell id="wBh1sZi6hsA7ukKMJ2_X-29" value="nein" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="wBh1sZi6hsA7ukKMJ2_X-28" vertex="1" connectable="0">
<mxGeometry x="-0.1231" y="3" relative="1" as="geometry"> <mxGeometry x="-0.1231" y="3" relative="1" as="geometry">
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
@@ -282,6 +262,41 @@
<mxCell id="zKFDF5UOk-7tD0-7yUJp-13" value="anlegen Konfiguration" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="zKFDF5UOk-7tD0-7yUJp-13" value="anlegen Konfiguration" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="250" y="355" width="120" height="65" as="geometry" /> <mxGeometry x="250" y="355" width="120" height="65" as="geometry" />
</mxCell> </mxCell>
<mxCell id="KgfY491xeuN-natDz28Q-1" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="334" y="800" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-64" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="vLrOMzFsj3qdJpjowrCW-61" target="KgfY491xeuN-natDz28Q-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310" y="635" as="sourcePoint" />
<mxPoint x="270" y="770" as="targetPoint" />
<Array as="points">
<mxPoint x="310" y="840" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="vLrOMzFsj3qdJpjowrCW-65" value="ja" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="vLrOMzFsj3qdJpjowrCW-64" vertex="1" connectable="0">
<mxGeometry x="-0.32" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="KgfY491xeuN-natDz28Q-3" value="backup verschlüsselungskey" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="740" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="KgfY491xeuN-natDz28Q-4" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.442;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="zKFDF5UOk-7tD0-7yUJp-24">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="400" y="860" as="sourcePoint" />
<mxPoint x="453" y="740" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="KgfY491xeuN-natDz28Q-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.442;exitY=1.075;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="KgfY491xeuN-natDz28Q-3" target="KgfY491xeuN-natDz28Q-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="400" y="660" as="sourcePoint" />
<mxPoint x="450" y="610" as="targetPoint" />
<Array as="points">
<mxPoint x="453" y="840" />
</Array>
</mxGeometry>
</mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>

Binary file not shown.

View File

@@ -24,7 +24,8 @@ class ConfigLoader(QObject):
dbConnectionError = Signal(str, bool) dbConnectionError = Signal(str, bool)
adminUserError = Signal(str, bool) adminUserError = Signal(str, bool)
usernameNotAvailable = Signal() usernameNotAvailable = Signal()
configurationReady = Signal() configurationReady = Signal(bool)
backupEncryptionKey = Signal()
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -36,6 +37,51 @@ class ConfigLoader(QObject):
else: else:
config_dir.mkdir(0o750, True, True) config_dir.mkdir(0o750, True, True)
@Slot(str, str)
def saveRecoveryKey(self, recovery_file, recovery_password):
rp = self.__setRecoveryPassword(recovery_password)
rf = rp[1] + self.__encrypt_key + rp[0]
rf = Vermasseln().oscarVermasseln(rf)
rec_file = urlparse(recovery_file)
rec_file = rec_file.path
if os.name == "nt":
rec_file = rec_file [1:]
try:
with open(rec_file, "w") as f:
f.write(rf)
self.configurationReady.emit(True)
except Exception as e:
print(str(e))
@Slot(str, str)
def getRecoveryKey(self, recovery_file, recovery_password):
rec_file = urlparse(recovery_file)
rec_file = rec_file.path
if os.name == "nt":
rec_file = rec_file [1:]
try:
with open(rec_file, "r") as f:
rf = f.read()
rf = Vermasseln().entschluesseln(rf)
ek = rf[128:]
ek = ek[:-32]
password = rf[:128]
salt = rf[-32:]
ok = self.__checkRecoveryPassword(recovery_password, password, salt)
if ok:
self.configurationReady.emit(True)
else:
self.configurationReady.emit(False)
except Exception as e:
print(str(e))
def __checkRecoveryPassword(self, recovery_password, password, salt):
rp = self.__setRecoveryPassword(recovery_password, salt)
return rp[1] == password
@Slot(str, str) @Slot(str, str)
def importConfig(self, confile, password): def importConfig(self, confile, password):
@@ -52,6 +98,8 @@ class ConfigLoader(QObject):
if not admin: if not admin:
self.usernameNotAvailable.emit() self.usernameNotAvailable.emit()
else:
self.backupEncryptionKey.emit()
return admin return admin
@Slot(dict, result= bool) @Slot(dict, result= bool)
@@ -66,7 +114,7 @@ class ConfigLoader(QObject):
self.__saveConfig() self.__saveConfig()
conf = self.__checkAdminUser() conf = self.__checkAdminUser()
if conf: if conf:
self.configurationReady.emit() self.configurationReady.emit(True)
@@ -75,6 +123,7 @@ class ConfigLoader(QObject):
with open (self.config_dir + '/pyqcrm.toml', 'r') as f: with open (self.config_dir + '/pyqcrm.toml', 'r') as f:
config = f.read() config = f.read()
self.__config = toml.loads(Vermasseln().entschluesseln(config)) self.__config = toml.loads(Vermasseln().entschluesseln(config))
self.configurationReady.emit(True)
except FileNotFoundError: except FileNotFoundError:
print("Konnte die Konfiguration nicht laden.") print("Konnte die Konfiguration nicht laden.")
except TypeError: except TypeError:
@@ -87,8 +136,8 @@ class ConfigLoader(QObject):
return self.__config return self.__config
def __initializeConfig(self): def __initializeConfig(self):
encrypt_key = b64encode(get_random_bytes(32)).decode("utf-8") self.__encrypt_key = b64encode(get_random_bytes(32)).decode("utf-8")
conf = f"[pyqcrm]\nVERSION = \"{self.__version}\"\nENCRYPTION_KEY = \"{encrypt_key}\"\n\n" conf = f"[pyqcrm]\nVERSION = \"{self.__version}\"\nENCRYPTION_KEY = \"{self.__encrypt_key}\"\n\n"
return conf return conf
@@ -114,12 +163,13 @@ class ConfigLoader(QObject):
self.adminUserError.emit("Admin vorhanden", True) self.adminUserError.emit("Admin vorhanden", True)
return True return True
@Slot(str)
def setEncyrptKey(self, key): def __setRecoveryPassword(self, key, salt = None):
self.__config['pyqcrm']['ENCRYPTION_KEY'] = key key = Vermasseln.userPasswordHash(key, salt)
self.__saveConfig() return key.split("$")
def __saveConfig(self): def __saveConfig(self):
try: try:
with open (self.config_dir + '/pyqcrm.toml', 'w') as f: with open (self.config_dir + '/pyqcrm.toml', 'w') as f:
config = Vermasseln().oscarVermasseln(toml.dumps(self.__config)) config = Vermasseln().oscarVermasseln(toml.dumps(self.__config))

View File

@@ -30,7 +30,8 @@ am = None
bm = None bm = None
user = None user = None
def initializeProgram(): def initializeProgram(conf_ok):
if conf_ok:
global am, bad_config, bm, user global am, bad_config, bm, user
dbconf = config.getConfig()['database'] dbconf = config.getConfig()['database']
DbManager(dbconf) DbManager(dbconf)
@@ -38,8 +39,10 @@ def initializeProgram():
bm = BusinessModel() bm = BusinessModel()
user = UserManager() user = UserManager()
am = AddressModel() am = AddressModel()
publishContext() publishContext()
else:
# TODO: show message and exit program
print("Kein Zugriff auf die Datenbank")
def publishContext(): def publishContext():
global engine global engine