Codebase list ausweisapp2 / 4c4be78
New upstream version 1.20.1 John Paul Adrian Glaubitz 3 years ago
460 changed file(s) with 6905 addition(s) and 3495 deletion(s). Raw diff Collapse all Expand all
0 Copyright (c) 2014-2018 Governikus GmbH & Co. KG
0 Copyright (c) 2014-2020 Governikus GmbH & Co. KG
11
22
33 Authors
1010 Jan Murawski
1111 Lars Schmertmann
1212 Jens Trillmann
13
14
15
16
17 Contributors
18 ----------------
13 Jan Möller
14 Jan Niklas Hasse
15 Mike Achtelik
3939 SET(CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "Required macOS version")
4040 ENDIF()
4141
42 PROJECT(AusweisApp2 VERSION 1.20.0 LANGUAGES ${LANGUAGES})
42 PROJECT(AusweisApp2 VERSION 1.20.1 LANGUAGES ${LANGUAGES})
4343
4444 # Set TWEAK if not defined in PROJECT_VERSION above to
4545 # have a valid tweak version without propagating it
6666 IF(EXISTS "${VENDOR_FILE}")
6767 FILE(READ "${VENDOR_FILE}" VENDOR)
6868 STRING(STRIP "${VENDOR}" VENDOR)
69 ELSEIF(LINUX OR BSD)
70 SET(VENDOR "") # Qt uses Organization for pathes
6971 ELSE()
7072 SET(VENDOR AusweisApp2_CE) # CommunityEdition
7173 ENDIF()
135137 RETURN()
136138 ENDIF()
137139
138 IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
140 IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
139141 INCLUDE(CTest)
140142 CONFIGURE_FILE("${CMAKE_DIR}/CTestCustom.cmake.in" "${CMAKE_BINARY_DIR}/CTestCustom.cmake" @ONLY)
141143 CONFIGURE_FILE("${RESOURCES_DIR}/sonar-project.properties.in" "${CMAKE_BINARY_DIR}/sonar-project.properties" @ONLY)
1717 EUPL © Europäische Union 2007, 2016
1818
1919
20 Diese Open-Source-Lizenz für die Europäische Union („EUPL“) gilt für Werke (im Sinne der nachfolgenden Begriffsbestimmung),
20 Diese Open-Source-Lizenz für die Europäische Union (»EUPL«) gilt für Werke (im Sinne der nachfolgenden Begriffsbestimmung),
2121 die unter EUPL-Bedingungen zur Verfügung gestellt werden. Das Werk darf nur in der durch diese Lizenz
2222 gestatteten Form genutzt werden (insoweit eine solche Nutzung dem Urheber vorbehalten ist).
2323
3434
3535 Für diese Lizenz gelten folgende Begriffsbestimmungen:
3636
37 - „Lizenz“: diese Lizenz.
38
39 - „Originalwerk“: das Werk oder die Software, die vom Lizenzgeber unter dieser Lizenz verbreitet oder zugänglich
37 - »Lizenz«: diese Lizenz.
38
39 - »Originalwerk«: das Werk oder die Software, die vom Lizenzgeber unter dieser Lizenz verbreitet oder zugänglich
4040 gemacht wird, und zwar als Quellcode und gegebenenfalls auch als ausführbarer Code.
4141
42 - „Bearbeitungen“: die Werke oder Software, die der Lizenznehmer auf der Grundlage des Originalwerks oder seiner
42 - »Bearbeitungen«: die Werke oder Software, die der Lizenznehmer auf der Grundlage des Originalwerks oder seiner
4343 Bearbeitungen schaffen kann. In dieser Lizenz wird nicht festgelegt, wie umfangreich die Änderung oder wie stark die
4444 Abhängigkeit vom Originalwerk für eine Einstufung als Bearbeitung sein muss; dies bestimmt sich nach dem
4545 Urheberrecht, das in dem unter Artikel 15 aufgeführten Land anwendbar ist.
4646
47 - „Werk“: das Originalwerk oder seine Bearbeitungen.
48
49 - „Quellcode“: diejenige Form des Werkes, die zur Auffassung durch den Menschen bestimmt ist und die am besten
47 - »Werk«: das Originalwerk oder seine Bearbeitungen.
48
49 - »Quellcode«: diejenige Form des Werkes, die zur Auffassung durch den Menschen bestimmt ist und die am besten
5050 geeignet ist, um vom Menschen verstanden und verändert zu werden.
5151
52 - „Ausführbarer Code“: die — üblicherweise — kompilierte Form des Werks, die von einem Computer als Programm
52 - »Ausführbarer Code«: die - üblicherweise - kompilierte Form des Werks, die von einem Computer als Programm
5353 ausgeführt werden soll.
5454
55 - „Lizenzgeber“: die natürliche oder juristische Person, die das Werk unter der Lizenz verbreitet oder zugänglich
55 - »Lizenzgeber«: die natürliche oder juristische Person, die das Werk unter der Lizenz verbreitet oder zugänglich
5656 macht.
5757
58 - „Bearbeiter“: jede natürliche oder juristische Person, die das Werk unter der Lizenz verändert oder auf andere Weise
58 - »Bearbeiter«: jede natürliche oder juristische Person, die das Werk unter der Lizenz verändert oder auf andere Weise
5959 zur Schaffung einer Bearbeitung beiträgt.
6060
61 - „Lizenznehmer“ („Sie“): jede natürliche oder juristische Person, die das Werk unter den Lizenzbedingungen nutzt.
62
63 - „Verbreitung“ oder „Zugänglichmachung“: alle Formen von Verkauf, Überlassung, Verleih, Vermietung, Verbreitung,
61 - »Lizenznehmer« (»Sie«): jede natürliche oder juristische Person, die das Werk unter den Lizenzbedingungen nutzt.
62
63 - »Verbreitung« oder »Zugänglichmachung«: alle Formen von Verkauf, Überlassung, Verleih, Vermietung, Verbreitung,
6464 Weitergabe, Übermittlung oder anderweitiger Online- oder Offline-Bereitstellung von Vervielfältigungen des Werks
6565 oder Zugänglichmachung seiner wesentlichen Funktionen für dritte natürliche oder juristische Personen.
6666
126126 sowie diese Lizenz beifügen. Der Lizenznehmer muss auf jedem abgeleiteten Werk deutlich darauf hinweisen, dass das
127127 Werk geändert wurde, und das Datum der Bearbeitung angeben.
128128
129 „Copyleft“-Klausel: Der Lizenznehmer darf Vervielfältigungen des Originalwerks oder Bearbeitungen nur unter den
129 »Copyleft«-Klausel: Der Lizenznehmer darf Vervielfältigungen des Originalwerks oder Bearbeitungen nur unter den
130130 Bedingungen dieser EUPL oder einer neueren Version dieser Lizenz verbreiten oder zugänglich machen, außer wenn das
131 Originalwerk ausdrücklich nur unter dieser Lizenzversion — z. B. mit der Angabe „Nur EUPL V. 1.2“ — verbreitet
131 Originalwerk ausdrücklich nur unter dieser Lizenzversion - z. B. mit der Angabe »Nur EUPL V. 1.2« - verbreitet
132132 werden darf. Der Lizenznehmer (der zum Lizenzgeber wird) darf für das Werk oder die Bearbeitung keine zusätzlichen
133133 Bedingungen anbieten oder vorschreiben, die die Bedingungen dieser Lizenz verändern oder einschränken.
134134
135135 Kompatibilitäts-Klausel: Wenn der Lizenznehmer Bearbeitungen, die auf dem Werk und einem anderen Werk, das
136136 unter einer kompatiblen Lizenz lizenziert wurde, basieren, oder die Kopien dieser Bearbeitungen verbreitet oder
137 zugänglich macht, kann dies unter den Bedingungen dieser kompatiblen Lizenz erfolgen. Unter „kompatibler Lizenz“ ist
137 zugänglich macht, kann dies unter den Bedingungen dieser kompatiblen Lizenz erfolgen. Unter »kompatibler Lizenz« ist
138138 eine im Anhang dieser Lizenz angeführte Lizenz zu verstehen. Sollten die Verpflichtungen des Lizenznehmers aus der
139139 kompatiblen Lizenz mit denjenigen aus der vorliegenden Lizenz (EUPL) in Konflikt stehen, werden die Verpflichtungen
140140 aus der kompatiblen Lizenz Vorrang haben.
164164 7. Gewährleistungsausschluss
165165
166166 Die Arbeit an diesem Werk wird laufend fortgeführt; es wird durch unzählige Bearbeiter ständig verbessert. Das Werk ist
167 nicht vollendet und kann daher Fehler („bugs“) enthalten, die dieser Art der Entwicklung inhärent sind.
168
169 Aus den genannten Gründen wird das Werk unter dieser Lizenz „so, wie es ist“ ohne jegliche Gewährleistung zur
170 Verfügung gestellt. Dies gilt unter anderem — aber nicht ausschließlich — für Marktreife, Verwendbarkeit für einen
167 nicht vollendet und kann daher Fehler (»bugs«) enthalten, die dieser Art der Entwicklung inhärent sind.
168
169 Aus den genannten Gründen wird das Werk unter dieser Lizenz »so, wie es ist« ohne jegliche Gewährleistung zur
170 Verfügung gestellt. Dies gilt unter anderem - aber nicht ausschließlich - für Marktreife, Verwendbarkeit für einen
171171 bestimmten Zweck, Mängelfreiheit, Richtigkeit sowie Nichtverletzung von anderen Immaterialgüterrechten als dem
172172 Urheberrecht (vgl. dazu Artikel 6 dieser Lizenz).
173173
198198
199199 10. Annahme der Lizenz
200200
201 Sie können den Bestimmungen dieser Lizenz zustimmen, indem Sie das Symbol „Lizenz annehmen“ unter dem Fenster
201 Sie können den Bestimmungen dieser Lizenz zustimmen, indem Sie das Symbol »Lizenz annehmen« unter dem Fenster
202202 mit dem Lizenztext anklicken oder indem Sie Ihre Zustimmung auf vergleichbare Weise in einer nach anwendbarem
203203 Recht zulässigen Form geben. Das Anklicken des Symbols gilt als Anzeichen Ihrer eindeutigen und unwiderruflichen
204204 Annahme der Lizenz und der darin enthaltenen Klauseln und Bedingungen.
267267
268268 Anlage
269269
270 „Kompatible Lizenzen“ nach Artikel 5 der EUPL sind:
270 »Kompatible Lizenzen« nach Artikel 5 der EUPL sind:
271271
272272 - GNU General Public License (GPL) v. 2, v. 3
273273
287287
288288 - European Union Public Licence (EUPL) v. 1.1, v. 1.2
289289
290 - Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) oder Strong Reciprocity (LiLiQ-R+)
290 - Québec Free and Open-Source Licence - Reciprocity (LiLiQ-R) oder Strong Reciprocity (LiLiQ-R+)
291291
292292 - Die Europäische Kommission kann diesen Anhang aktualisieren, um neuere Fassungen der obigen Lizenzen
293293 aufzunehmen, ohne hierfür eine neue Fassung der EUPL auszuarbeiten, solange diese Lizenzen die in Artikel 2
502502
503503 0. Additional Definitions.
504504
505 As used herein, “this License” refers to version 3 of the GNU Lesser
506 General Public License, and the “GNU GPL” refers to version 3 of the
505 As used herein, «this License» refers to version 3 of the GNU Lesser
506 General Public License, and the «GNU GPL» refers to version 3 of the
507507 GNU General Public License.
508508
509 “The Library” refers to a covered work governed by this License,
509 «The Library» refers to a covered work governed by this License,
510510 other than an Application or a Combined Work as defined below.
511511
512 An “Application” is any work that makes use of an interface provided
512 An «Application» is any work that makes use of an interface provided
513513 by the Library, but which is not otherwise based on the Library.
514514 Defining a subclass of a class defined by the Library is deemed a mode
515515 of using an interface provided by the Library.
516516
517 A “Combined Work” is a work produced by combining or linking an
517 A «Combined Work» is a work produced by combining or linking an
518518 Application with the Library. The particular version of the Library
519 with which the Combined Work was made is also called the “Linked
520 Version”.
521
522 The “Minimal Corresponding Source” for a Combined Work means the
519 with which the Combined Work was made is also called the «Linked
520 Version».
521
522 The «Minimal Corresponding Source» for a Combined Work means the
523523 Corresponding Source for the Combined Work, excluding any source code
524524 for portions of the Combined Work that, considered in isolation, are
525525 based on the Application, and not on the Linked Version.
526526
527 The “Corresponding Application Code” for a Combined Work means the
527 The «Corresponding Application Code» for a Combined Work means the
528528 object code and/or source code for the Application, including any data
529529 and utility programs needed for reproducing the Combined Work from the
530530 Application, but excluding the System Libraries of the Combined Work.
639639
640640 Each version is given a distinguishing version number. If the Library
641641 as you received it specifies that a certain numbered version of the
642 GNU Lesser General Public License “or any later version” applies to
642 GNU Lesser General Public License «or any later version» applies to
643643 it, you have the option of following the terms and conditions either
644644 of that published version or of any later version published by the
645645 Free Software Foundation. If the Library as you received it does not
1010 EUPL © Europäische Union 2007, 2016
1111
1212
13 Diese Open-Source-Lizenz für die Europäische Union („EUPL“) gilt für Werke (im Sinne der nachfolgenden Begriffsbestimmung),
13 Diese Open-Source-Lizenz für die Europäische Union (»EUPL«) gilt für Werke (im Sinne der nachfolgenden Begriffsbestimmung),
1414 die unter EUPL-Bedingungen zur Verfügung gestellt werden. Das Werk darf nur in der durch diese Lizenz
1515 gestatteten Form genutzt werden (insoweit eine solche Nutzung dem Urheber vorbehalten ist).
1616
2727
2828 Für diese Lizenz gelten folgende Begriffsbestimmungen:
2929
30 - „Lizenz“: diese Lizenz.
31
32 - „Originalwerk“: das Werk oder die Software, die vom Lizenzgeber unter dieser Lizenz verbreitet oder zugänglich
30 - »Lizenz«: diese Lizenz.
31
32 - »Originalwerk«: das Werk oder die Software, die vom Lizenzgeber unter dieser Lizenz verbreitet oder zugänglich
3333 gemacht wird, und zwar als Quellcode und gegebenenfalls auch als ausführbarer Code.
3434
35 - „Bearbeitungen“: die Werke oder Software, die der Lizenznehmer auf der Grundlage des Originalwerks oder seiner
35 - »Bearbeitungen«: die Werke oder Software, die der Lizenznehmer auf der Grundlage des Originalwerks oder seiner
3636 Bearbeitungen schaffen kann. In dieser Lizenz wird nicht festgelegt, wie umfangreich die Änderung oder wie stark die
3737 Abhängigkeit vom Originalwerk für eine Einstufung als Bearbeitung sein muss; dies bestimmt sich nach dem
3838 Urheberrecht, das in dem unter Artikel 15 aufgeführten Land anwendbar ist.
3939
40 - „Werk“: das Originalwerk oder seine Bearbeitungen.
41
42 - „Quellcode“: diejenige Form des Werkes, die zur Auffassung durch den Menschen bestimmt ist und die am besten
40 - »Werk«: das Originalwerk oder seine Bearbeitungen.
41
42 - »Quellcode«: diejenige Form des Werkes, die zur Auffassung durch den Menschen bestimmt ist und die am besten
4343 geeignet ist, um vom Menschen verstanden und verändert zu werden.
4444
45 - „Ausführbarer Code“: die — üblicherweise — kompilierte Form des Werks, die von einem Computer als Programm
45 - »Ausführbarer Code«: die - üblicherweise - kompilierte Form des Werks, die von einem Computer als Programm
4646 ausgeführt werden soll.
4747
48 - „Lizenzgeber“: die natürliche oder juristische Person, die das Werk unter der Lizenz verbreitet oder zugänglich
48 - »Lizenzgeber«: die natürliche oder juristische Person, die das Werk unter der Lizenz verbreitet oder zugänglich
4949 macht.
5050
51 - „Bearbeiter“: jede natürliche oder juristische Person, die das Werk unter der Lizenz verändert oder auf andere Weise
51 - »Bearbeiter«: jede natürliche oder juristische Person, die das Werk unter der Lizenz verändert oder auf andere Weise
5252 zur Schaffung einer Bearbeitung beiträgt.
5353
54 - „Lizenznehmer“ („Sie“): jede natürliche oder juristische Person, die das Werk unter den Lizenzbedingungen nutzt.
55
56 - „Verbreitung“ oder „Zugänglichmachung“: alle Formen von Verkauf, Überlassung, Verleih, Vermietung, Verbreitung,
54 - »Lizenznehmer« (»Sie«): jede natürliche oder juristische Person, die das Werk unter den Lizenzbedingungen nutzt.
55
56 - »Verbreitung« oder »Zugänglichmachung«: alle Formen von Verkauf, Überlassung, Verleih, Vermietung, Verbreitung,
5757 Weitergabe, Übermittlung oder anderweitiger Online- oder Offline-Bereitstellung von Vervielfältigungen des Werks
5858 oder Zugänglichmachung seiner wesentlichen Funktionen für dritte natürliche oder juristische Personen.
5959
119119 sowie diese Lizenz beifügen. Der Lizenznehmer muss auf jedem abgeleiteten Werk deutlich darauf hinweisen, dass das
120120 Werk geändert wurde, und das Datum der Bearbeitung angeben.
121121
122 „Copyleft“-Klausel: Der Lizenznehmer darf Vervielfältigungen des Originalwerks oder Bearbeitungen nur unter den
122 »Copyleft«-Klausel: Der Lizenznehmer darf Vervielfältigungen des Originalwerks oder Bearbeitungen nur unter den
123123 Bedingungen dieser EUPL oder einer neueren Version dieser Lizenz verbreiten oder zugänglich machen, außer wenn das
124 Originalwerk ausdrücklich nur unter dieser Lizenzversion — z. B. mit der Angabe „Nur EUPL V. 1.2“ — verbreitet
124 Originalwerk ausdrücklich nur unter dieser Lizenzversion - z. B. mit der Angabe »Nur EUPL V. 1.2« - verbreitet
125125 werden darf. Der Lizenznehmer (der zum Lizenzgeber wird) darf für das Werk oder die Bearbeitung keine zusätzlichen
126126 Bedingungen anbieten oder vorschreiben, die die Bedingungen dieser Lizenz verändern oder einschränken.
127127
128128 Kompatibilitäts-Klausel: Wenn der Lizenznehmer Bearbeitungen, die auf dem Werk und einem anderen Werk, das
129129 unter einer kompatiblen Lizenz lizenziert wurde, basieren, oder die Kopien dieser Bearbeitungen verbreitet oder
130 zugänglich macht, kann dies unter den Bedingungen dieser kompatiblen Lizenz erfolgen. Unter „kompatibler Lizenz“ ist
130 zugänglich macht, kann dies unter den Bedingungen dieser kompatiblen Lizenz erfolgen. Unter »kompatibler Lizenz« ist
131131 eine im Anhang dieser Lizenz angeführte Lizenz zu verstehen. Sollten die Verpflichtungen des Lizenznehmers aus der
132132 kompatiblen Lizenz mit denjenigen aus der vorliegenden Lizenz (EUPL) in Konflikt stehen, werden die Verpflichtungen
133133 aus der kompatiblen Lizenz Vorrang haben.
157157 7. Gewährleistungsausschluss
158158
159159 Die Arbeit an diesem Werk wird laufend fortgeführt; es wird durch unzählige Bearbeiter ständig verbessert. Das Werk ist
160 nicht vollendet und kann daher Fehler („bugs“) enthalten, die dieser Art der Entwicklung inhärent sind.
161
162 Aus den genannten Gründen wird das Werk unter dieser Lizenz „so, wie es ist“ ohne jegliche Gewährleistung zur
163 Verfügung gestellt. Dies gilt unter anderem — aber nicht ausschließlich — für Marktreife, Verwendbarkeit für einen
160 nicht vollendet und kann daher Fehler (»bugs«) enthalten, die dieser Art der Entwicklung inhärent sind.
161
162 Aus den genannten Gründen wird das Werk unter dieser Lizenz »so, wie es ist« ohne jegliche Gewährleistung zur
163 Verfügung gestellt. Dies gilt unter anderem - aber nicht ausschließlich - für Marktreife, Verwendbarkeit für einen
164164 bestimmten Zweck, Mängelfreiheit, Richtigkeit sowie Nichtverletzung von anderen Immaterialgüterrechten als dem
165165 Urheberrecht (vgl. dazu Artikel 6 dieser Lizenz).
166166
191191
192192 10. Annahme der Lizenz
193193
194 Sie können den Bestimmungen dieser Lizenz zustimmen, indem Sie das Symbol „Lizenz annehmen“ unter dem Fenster
194 Sie können den Bestimmungen dieser Lizenz zustimmen, indem Sie das Symbol »Lizenz annehmen« unter dem Fenster
195195 mit dem Lizenztext anklicken oder indem Sie Ihre Zustimmung auf vergleichbare Weise in einer nach anwendbarem
196196 Recht zulässigen Form geben. Das Anklicken des Symbols gilt als Anzeichen Ihrer eindeutigen und unwiderruflichen
197197 Annahme der Lizenz und der darin enthaltenen Klauseln und Bedingungen.
260260
261261 Anlage
262262
263 „Kompatible Lizenzen“ nach Artikel 5 der EUPL sind:
263 »Kompatible Lizenzen« nach Artikel 5 der EUPL sind:
264264
265265 - GNU General Public License (GPL) v. 2, v. 3
266266
280280
281281 - European Union Public Licence (EUPL) v. 1.1, v. 1.2
282282
283 - Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) oder Strong Reciprocity (LiLiQ-R+)
283 - Québec Free and Open-Source Licence - Reciprocity (LiLiQ-R) oder Strong Reciprocity (LiLiQ-R+)
284284
285285 - Die Europäische Kommission kann diesen Anhang aktualisieren, um neuere Fassungen der obigen Lizenzen
286286 aufzunehmen, ohne hierfür eine neue Fassung der EUPL auszuarbeiten, solange diese Lizenzen die in Artikel 2
465465
466466 0. Additional Definitions.
467467
468 As used herein, “this License” refers to version 3 of the GNU Lesser
469 General Public License, and the “GNU GPL” refers to version 3 of the
468 As used herein, «this License» refers to version 3 of the GNU Lesser
469 General Public License, and the «GNU GPL» refers to version 3 of the
470470 GNU General Public License.
471471
472 “The Library” refers to a covered work governed by this License,
472 «The Library» refers to a covered work governed by this License,
473473 other than an Application or a Combined Work as defined below.
474474
475 An “Application” is any work that makes use of an interface provided
475 An «Application» is any work that makes use of an interface provided
476476 by the Library, but which is not otherwise based on the Library.
477477 Defining a subclass of a class defined by the Library is deemed a mode
478478 of using an interface provided by the Library.
479479
480 A “Combined Work” is a work produced by combining or linking an
480 A «Combined Work» is a work produced by combining or linking an
481481 Application with the Library. The particular version of the Library
482 with which the Combined Work was made is also called the “Linked
483 Version”.
484
485 The “Minimal Corresponding Source” for a Combined Work means the
482 with which the Combined Work was made is also called the «Linked
483 Version».
484
485 The «Minimal Corresponding Source» for a Combined Work means the
486486 Corresponding Source for the Combined Work, excluding any source code
487487 for portions of the Combined Work that, considered in isolation, are
488488 based on the Application, and not on the Linked Version.
489489
490 The “Corresponding Application Code” for a Combined Work means the
490 The «Corresponding Application Code» for a Combined Work means the
491491 object code and/or source code for the Application, including any data
492492 and utility programs needed for reproducing the Combined Work from the
493493 Application, but excluding the System Libraries of the Combined Work.
602602
603603 Each version is given a distinguishing version number. If the Library
604604 as you received it specifies that a certain numbered version of the
605 GNU Lesser General Public License “or any later version” applies to
605 GNU Lesser General Public License «or any later version» applies to
606606 it, you have the option of following the terms and conditions either
607607 of that published version or of any later version published by the
608608 Free Software Foundation. If the Library as you received it does not
+0
-49
Releasing.rst less more
0 Release
1 =======
2 Folgende Schritte sind notwendig um ein Tag bzw. Release zu bauen.
3
4
5 Tag anbringen
6 -------------
7 #. Mittels "hg update -r stable" auf das jeweilige Changeset wechseln, welches mit einem
8 Tag versehen werden soll.
9
10 #. Mittels "hg status" überprüfen, dass keine weiteren Änderungen in der Working-Copy
11 vorhanden sind.
12
13 #. In der Datei CMakeLists.txt die PROJECT_VERSION im PROJECT entsprechend anpassen.
14
15 #. Mittels "hg tag x.y.z" (Beispiel: hg tag 1.0.0) den Tag anbringen.
16
17 #. Mittels "hg push" ins Main-Repository übertragen.
18
19
20
21 Tag bauen
22 ---------
23 Die Release-Jobs müssen nach dem Tag manuell gestartet werden!
24
25 Jenkins erstellt das Release anhand des Parameters 'changeset'. Dort sollte der angebrachte
26 Tag oder die jeweilige Revision übergeben werden.
27 Nachdem die notwendigen Jobs (Windows/macOS/Docs/...) durchgelaufen sind, muss der Job
28 für den AppCast gestartet werden.
29
30 Im Ordner ``resources/jenkins/dsl`` sind die jeweiligen Konfigurationen der Jenkins-Jobs
31 hinterlegt.
32
33
34
35 Probleme & Lösungen
36 -------------------
37 - Das gebaute Package beinhaltet einen Hashwert im Namen
38 - CMake hat erkannt, dass sich die aktuelle Working-Copy nicht auf dem Tag befindet und hängt
39 somit den Hashwert des Changesets an. Mittels "hg id -t" kann man überprüfen, ob man sich auf
40 dem Tag befindet.
41
42 - Mittels "hg update -r x.y.z" sollte man auf den Tag wechseln.
43
44 - Hinter dem Hashwert ist ein +
45 - Das bedeutet, dass "uncommitted changes" während des Builds in der Working-Copy enthalten waren.
46
47 - Dies kann man mittels "hg status" überprüfen.
48
8989 IF(CMAKE_COMPILER_IS_GNUCXX)
9090 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finline-limit=64")
9191 ELSEIF(CMAKE_VERSION VERSION_LESS "3.13" AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.12")
92 LIST(APPEND CMAKE_CXX_COMPILER_PREDEFINES_COMMAND "--target=${ANDROID_TOOLCHAIN_MACHINE_NAME}")
92 LIST(APPEND CMAKE_CXX_COMPILER_PREDEFINES_COMMAND "--target=${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}")
9393 ENDIF()
9494 SET(CMAKE_CXX_VISIBILITY_PRESET hidden)
9595 ENDIF()
0 IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
0 IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
11 IF(PERSOSIM)
22 IF(NOT JAVA_EXECUTABLE)
33 FIND_PACKAGE(Java COMPONENTS Runtime)
88 IF(JENKINS_APPCAST)
99 SET(REMOTE_CONFIG_PATH_APPCAST /build)
1010 SET(REMOTE_CONFIG_PATH_APPCAST_BETA /build)
11 SET(REMOTE_CONFIG_PATH_PROVIDERS /source/resources)
12 SET(REMOTE_CONFIG_PATH_READERS /source/resources)
1311 ELSE()
1412 SET(REMOTE_CONFIG_PATH_APPCAST )
1513 SET(REMOTE_CONFIG_PATH_APPCAST_BETA /beta)
16 SET(REMOTE_CONFIG_PATH_PROVIDERS )
17 SET(REMOTE_CONFIG_PATH_READERS /reader)
1814 ENDIF()
19 SET(REMOTE_CONFIG_URL_READER_IMAGES ${REMOTE_CONFIG_URL_PROD}/reader)
2015
2116 # Copy secure storage file, so that the AusweisApp2 can be started from the build directory.
2217 CONFIGURE_FILE(${RESOURCES_DIR}/config.json.in ${_destination}/config.json @ONLY)
272272 STRING(REGEX REPLACE "-$" "" ANDROID_TOOLCHAIN_MACHINE_NAME "${ANDROID_TOOLCHAIN_MACHINE_NAME}")
273273 STRING(REGEX MATCH "/toolchains/(.*)/prebuilt/" _unused "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
274274 STRING(REGEX REPLACE "-${ANDROID_NDK_TOOLCHAIN_VERSION}$" "" ANDROID_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}")
275
275276 SET(${_prefix} ${ANDROID_TOOLCHAIN_PREFIX} PARENT_SCOPE)
276 SET(${_machine} ${ANDROID_TOOLCHAIN_MACHINE_NAME} PARENT_SCOPE)
277
278 IF(ANDROID_USE_LLVM)
279 SET(${_machine} llvm PARENT_SCOPE)
280 ELSE()
281 SET(${_machine} ${ANDROID_TOOLCHAIN_MACHINE_NAME} PARENT_SCOPE)
282 ENDIF()
277283 ENDFUNCTION()
278284
279285
328334 SET(multiValueArgs)
329335 cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
330336
331 IF(CMAKE_BUILD_TYPE STREQUAL "MINSIZEREL" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
337 IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
338 SET(BUILD_TYPE DEBUG)
339 ELSE()
332340 SET(BUILD_TYPE RELEASE)
333 ELSE()
334 SET(BUILD_TYPE ${CMAKE_BUILD_TYPE})
335341 ENDIF()
336342
337343 GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_${BUILD_TYPE})
244244 ENDIF()
245245
246246 SET(ANDROID_APP_BINARY "${CMAKE_INSTALL_PREFIX}/${ANDROID_DEST}/libAusweisApp2.so")
247 SET(SYMBOL_FOLDER "${CMAKE_BINARY_DIR}/debug.symbols/${CMAKE_ANDROID_ARCH_ABI}")
248 SET(ANDROID_APP_SYMBOLS "${SYMBOL_FOLDER}/libAusweisApp2.so")
247 SET(SYMBOL_FOLDER "${CMAKE_BINARY_DIR}/debug.symbols")
248 SET(ANDROID_APP_SYMBOLS "${SYMBOL_FOLDER}/libAusweisApp2-${CMAKE_ANDROID_ARCH_ABI}.so")
249249
250250 INSTALL(CODE
251251 "
252252 EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${SYMBOL_FOLDER}\")
253253 EXECUTE_PROCESS(COMMAND \"${CMAKE_OBJCOPY}\" \"--only-keep-debug\" \"${ANDROID_APP_BINARY}\" \"${ANDROID_APP_SYMBOLS}\")
254 " COMPONENT Runtime CONFIGURATIONS RelWithDebInfo)
254 " COMPONENT Runtime)
255255
256256 IF(CMAKE_COMPILER_IS_GNUCXX)
257257 SET(ANDROID_STL_PATH gnu-libstdc++/${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION})
277277 CONFIGURE_FILE(${PACKAGING_DIR}/linux/${BUNDLE_IDENTIFIER}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${BUNDLE_IDENTIFIER}.desktop @ONLY)
278278 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BUNDLE_IDENTIFIER}.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo COMPONENT Application)
279279 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BUNDLE_IDENTIFIER}.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications COMPONENT Application)
280 INSTALL(FILES ${RESOURCES_DIR}/images/npa.svg DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Application)
280 INSTALL(FILES ${RESOURCES_DIR}/images/npa.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps COMPONENT Application RENAME AusweisApp2.svg)
281 INSTALL(FILES ${RESOURCES_DIR}/images/npa.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/96x96/apps COMPONENT Application RENAME AusweisApp2.png)
281282 ENDIF()
282283
283284
302303 ENDIF()
303304
304305
305 IF(LINUX)
306 IF(LINUX OR BSD)
306307 INSTALL(FILES ${QM_FILES} DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
307308 ELSEIF(NOT INTEGRATED_SDK)
308309 INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/translations/ DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
315316
316317 # qt qml plugins
317318 IF((WIN32 OR MAC) AND TARGET Qt5::Qml)
318 FOREACH(entry QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
319 SET(modules QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
320 IF(WIN32)
321 LIST(APPEND modules QtWinExtras)
322 ENDIF()
323
324 FOREACH(entry ${modules})
319325 INSTALL(DIRECTORY ${QT_HOST_PREFIX}/qml/${entry} DESTINATION ${DEFAULT_FILE_DESTINATION}/qml COMPONENT Runtime PATTERN "*.dylib" EXCLUDE)
320326 ENDFOREACH()
321327 ENDIF()
2626 ENDIF()
2727 ENDIF()
2828
29 IF(ANDROID OR IOS OR WINDOWS_STORE OR "${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
29 IF(ANDROID OR IOS OR WINDOWS_STORE OR CMAKE_BUILD_TYPE STREQUAL "DEBUG")
3030 FIND_PACKAGE(Qt5Bluetooth ${MIN_QT_VERSION} REQUIRED)
3131 FIND_PACKAGE(Qt5Nfc ${MIN_QT_VERSION} REQUIRED)
3232 ENDIF()
6464 SET(tmp_crosscompile_enabled TRUE)
6565 SET(CMAKE_CROSSCOMPILING ON)
6666 ENDIF()
67 IF(QT_VENDOR STREQUAL "Governikus" OR FORCE_LEGACY_OPENSSL)
68 FIND_PACKAGE(OpenSSL 1.0.2 REQUIRED) # see openssl_rsa_psk.patch
69 ELSE()
70 FIND_PACKAGE(OpenSSL 1.1 REQUIRED)
71 ENDIF()
67
68 FIND_PACKAGE(OpenSSL 1.1 REQUIRED)
69
7270 IF(tmp_crosscompile_enabled)
7371 SET(CMAKE_CROSSCOMPILING OFF)
7472 ENDIF()
9593 FIND_LIBRARY(IOS_CORETEXT CoreText)
9694 FIND_LIBRARY(IOS_COREGRAPHICS CoreGraphics)
9795 FIND_LIBRARY(IOS_SECURITY Security)
96 FIND_LIBRARY(IOS_NETWORK Network)
9897 FIND_LIBRARY(IOS_AUDIOTOOLBOX AudioToolbox)
9998 FIND_LIBRARY(IOS_IMAGEIO ImageIO)
10099 FIND_LIBRARY(IOS_CORENFC CoreNFC)
2121 MESSAGE(STATUS "CMAKE_ANDROID_ARCH_ABI: ${CMAKE_ANDROID_ARCH_ABI}")
2222 MESSAGE(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
2323 MESSAGE(STATUS "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION: ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}")
24 MESSAGE(STATUS "CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE: ${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}")
2425 MESSAGE(STATUS "ANDROID_TOOLCHAIN_PREFIX: ${ANDROID_TOOLCHAIN_PREFIX}")
2526 MESSAGE(STATUS "ANDROID_TOOLCHAIN_MACHINE_NAME: ${ANDROID_TOOLCHAIN_MACHINE_NAME}")
27 MESSAGE(STATUS "ANDROID_USE_LLVM: ${ANDROID_USE_LLVM}")
2628
2729 MESSAGE(STATUS "ANDROID_SDK: ${ANDROID_SDK}")
2830 MESSAGE(STATUS "ANDROID_BUILD_TOOLS_REVISION: ${ANDROID_BUILD_TOOLS_REVISION}")
4545 SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt")
4646 ENDIF()
4747
48
49 FIND_PROGRAM(CONV uconv)
50 IF(NOT CONV)
51 FIND_PROGRAM(CONV iconv)
52 ENDIF()
53 FIND_PROGRAM(ENSCRIPT enscript)
54 FIND_PROGRAM(GS gs)
55
56 IF(CONV AND ENSCRIPT AND GS)
57 SET(LICENSE_FILE ${FILENAME}-Lizenz.pdf)
58
59 SET(CONV_CMD ${CONV} -f utf-8 -t iso-8859-1 --output license.tmpfile.conv ${CPACK_RESOURCE_FILE_LICENSE})
60 SET(ENSCRIPT_CMD ${ENSCRIPT} -q -X 88591 -B --word-wrap -t ${PROJECT_NAME} --output license.tmpfile.ps license.tmpfile.conv)
61 SET(GS_CMD ${GS} -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=${LICENSE_FILE} license.tmpfile.ps)
62
63 ADD_CUSTOM_COMMAND(OUTPUT ${LICENSE_FILE} COMMAND ${CONV_CMD} COMMAND ${ENSCRIPT_CMD} COMMAND ${GS_CMD})
64 ADD_CUSTOM_TARGET(license DEPENDS ${LICENSE_FILE})
65 ENDIF()
66
4867 IF(APPLE AND NOT IOS)
49 FIND_PROGRAM(ICONV iconv)
50 IF(NOT ICONV)
68 IF(NOT CONV)
5169 MESSAGE(FATAL_ERROR "Cannot find 'iconv' to convert LICENSE.txt")
5270 ENDIF()
5371
54 EXECUTE_PROCESS(COMMAND ${ICONV} -f UTF-8 -t MAC ${CPACK_RESOURCE_FILE_LICENSE} OUTPUT_FILE "${PROJECT_BINARY_DIR}/LICENSE.txt")
72 EXECUTE_PROCESS(COMMAND ${CONV} -f UTF-8 -t MAC ${CPACK_RESOURCE_FILE_LICENSE} OUTPUT_FILE "${PROJECT_BINARY_DIR}/LICENSE.txt")
5573 SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_BINARY_DIR}/LICENSE.txt")
5674 ENDIF()
5775
58 IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
76 IF(NOT CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND NOT CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
5977 SET(CPACK_STRIP_FILES TRUE)
6078 ENDIF()
6179
162180 SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_BINARY_DIR};${PROJECT_NAME};ALL;/)
163181 SET(CPACK_BUNDLE_NAME ${PROJECT_NAME})
164182 SET(CPACK_BUNDLE_COPYRIGHT ${COPYRIGHT_TEXT})
165 SET(CPACK_BUNDLE_ICON ${RESOURCES_DIR}/images/bundle_icons.icns)
183 SET(CPACK_BUNDLE_ICON ${RESOURCES_DIR}/images/macos/bundle_icons.icns)
166184 SET(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Governikus GmbH & Co. KG (G7EQCJU4BR)")
167185
168186 SET(CPACK_BUNDLE_APPLE_CODESIGN_FILES ${ADDITIONAL_BUNDLE_FILES_TO_SIGN})
174192 ELSE()
175193 SET(CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER "${CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER} --timestamp=none")
176194 ENDIF()
177 #SET(CPACK_PACKAGE_ICON ${RESOURCES_DIR}/images/dmg_icons.icns) https://gitlab.kitware.com/cmake/cmake/issues/19517
195 #SET(CPACK_PACKAGE_ICON ${RESOURCES_DIR}/images/macos/dmg_icons.icns) https://gitlab.kitware.com/cmake/cmake/issues/19517
178196 SET(CPACK_DMG_VOLUME_NAME ${CPACK_PACKAGE_NAME})
179197 SET(CPACK_DMG_FORMAT UDBZ)
180 SET(CPACK_DMG_BACKGROUND_IMAGE ${RESOURCES_DIR}/images/dmg_background.png)
198 SET(CPACK_DMG_BACKGROUND_IMAGE ${RESOURCES_DIR}/images/macos/dmg_background.png)
181199 SET(CPACK_DMG_SLA_DIR ${MACOS_PACKAGING_DIR}/sla)
182200 SET(CPACK_DMG_SLA_LANGUAGES English German)
183201
207225 FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}")
208226 OPTION(ANDROID_LINT "Lint Android package" ON)
209227 IF(NOT ANDROID_LINT)
210 FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "tasks.lint.enabled = false")
228 FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "tasks.lint.enabled = false\n")
211229 ENDIF()
212230
213231 IF(INTEGRATED_SDK)
214232 SET(ANDROID_FILE_EXT aar)
233 FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "android.defaultConfig.consumerProguardFiles 'consumer-rules.pro'\n")
215234 CONFIGURE_FILE(${PACKAGING_DIR}/android/pom.xml.in ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.pom @ONLY)
216235 CONFIGURE_FILE("${PACKAGING_DIR}/android/lint.aar.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY)
236 CONFIGURE_FILE("${PACKAGING_DIR}/android/consumer-rules.pro" "${CMAKE_INSTALL_PREFIX}/consumer-rules.pro" COPYONLY)
217237 ELSE()
218238 SET(ANDROID_FILE_EXT apk)
219239 CONFIGURE_FILE("${PACKAGING_DIR}/android/lint.apk.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY)
220240 ENDIF()
221241 MESSAGE(STATUS "Prepare ${ANDROID_FILE_EXT} file generation")
222242
223 IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" OR ${CMAKE_BUILD_TYPE} STREQUAL "RELWITHDEBINFO" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
243 IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
244 SET(ANDROID_FILE dist-debug.${ANDROID_FILE_EXT})
245 ELSE()
224246 SET(DEPLOY_CMD_SIGN --release)
225247
226248 IF(INTEGRATED_SDK)
233255 SET(ANDROID_FILE dist-release-unsigned.apk)
234256 MESSAGE(WARNING "Cannot sign release build! Set APK_SIGN_KEYSTORE, APK_SIGN_KEYSTORE_ALIAS and APK_SIGN_KEYSTORE_PSW!")
235257 ENDIF()
236
237 ELSE()
238 SET(ANDROID_FILE dist-debug.${ANDROID_FILE_EXT})
239258 ENDIF()
240259
241260 SET(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN})
242261 SET(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/${ANDROID_FILE_EXT})
243262
244263 IF("${Qt5Core_VERSION}" VERSION_GREATER_EQUAL "5.12.0" AND NOT INTEGRATED_SDK)
245 IF(${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
264 IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
246265 SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/debug)
247266 ELSE()
248267 SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/release)
8080 STRING(REPLACE "uncrustify " "" UNCRUSTIFY_VERSION ${UNCRUSTIFY_VERSION})
8181 STRING(REPLACE "Uncrustify-" "" UNCRUSTIFY_VERSION ${UNCRUSTIFY_VERSION})
8282
83 SET(UNCRUSTIFY_NEEDED_VERSION "0.70.1")
83 SET(UNCRUSTIFY_NEEDED_VERSION "0.71.0")
8484 IF("${UNCRUSTIFY_VERSION}" STRLESS "${UNCRUSTIFY_NEEDED_VERSION}")
8585 MESSAGE(WARNING "Uncrustify seems to be too old. Use at least ${UNCRUSTIFY_NEEDED_VERSION}... you are using: ${UNCRUSTIFY_VERSION}")
8686 ELSE()
134134 IF(CONVERT)
135135 SET(BACKGROUND_COLOR "#dcebf6")
136136
137 ADD_CUSTOM_TARGET(npaicons.docs
138 COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa.svg npa_docs.png
137 ADD_CUSTOM_TARGET(npaicons.general
138 COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa.svg npa.png
139139 WORKING_DIRECTORY ${RESOURCES_DIR}/images)
140140
141141 ADD_CUSTOM_TARGET(npaicons.win
258258 COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 1024x1024 npa_beta.svg beta/Images.xcassets/AppIcon.appiconset/icon1024.png
259259 WORKING_DIRECTORY ${RESOURCES_DIR}/images/iOS/appIcons)
260260
261 ADD_CUSTOM_TARGET(npaicons DEPENDS npaicons.docs npaicons.win npaicons.android.playstore npaicons.android.legacy npaicons.android.legacy.beta npaicons.android.legacy.preview npaicons.android.adaptive.background npaicons.android.adaptive.foreground npaicons.android.adaptive.foreground.beta npaicons.android.adaptive.foreground.preview npaicons.ios.launchimage npaicons.ios.launchimage.beta npaicons.ios npaicons.ios.beta)
261 ADD_CUSTOM_TARGET(npaicons DEPENDS npaicons.general npaicons.win npaicons.android.playstore npaicons.android.legacy npaicons.android.legacy.beta npaicons.android.legacy.preview npaicons.android.adaptive.background npaicons.android.adaptive.foreground npaicons.android.adaptive.foreground.beta npaicons.android.adaptive.foreground.preview npaicons.ios.launchimage npaicons.ios.launchimage.beta npaicons.ios npaicons.ios.beta)
262262
263263 ADD_CUSTOM_TARGET(readerimages
264264 COMMAND ${CONVERT} -background none -resize 512x512 img_RemoteReader.svg ${RESOURCES_DIR}/updatable-files/reader/img_RemoteReader.png
272272 IF(PNGQUANT)
273273 SET(PNGQUANT_CMD pngquant -f -o)
274274
275 ADD_CUSTOM_TARGET(pngquant.docs
276 COMMAND ${PNGQUANT_CMD} npa_docs.png -- npa_docs.png
275 ADD_CUSTOM_TARGET(pngquant.general
276 COMMAND ${PNGQUANT_CMD} npa.png -- npa.png
277277 WORKING_DIRECTORY ${RESOURCES_DIR}/images)
278278
279279 ADD_CUSTOM_TARGET(pngquant.android.legacy
387387 COMMAND ${PNGQUANT_CMD} icon1024.png -- icon1024.png
388388 WORKING_DIRECTORY ${RESOURCES_DIR}/images/iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset)
389389
390 ADD_CUSTOM_TARGET(pngquant DEPENDS pngquant.docs pngquant.android.legacy pngquant.android.legacy.beta pngquant.android.legacy.preview pngquant.android.adaptive.background pngquant.android.adaptive.foreground pngquant.android.adaptive.foreground.beta pngquant.android.adaptive.foreground.preview pngquant.ios.launchimage pngquant.ios.launchimage.beta pngquant.ios pngquant.ios.beta)
390 ADD_CUSTOM_TARGET(pngquant DEPENDS pngquant.general pngquant.android.legacy pngquant.android.legacy.beta pngquant.android.legacy.preview pngquant.android.adaptive.background pngquant.android.adaptive.foreground pngquant.android.adaptive.foreground.beta pngquant.android.adaptive.foreground.preview pngquant.ios.launchimage pngquant.ios.launchimage.beta pngquant.ios pngquant.ios.beta)
391391
392392 ADD_CUSTOM_TARGET(pngquant.readerimages
393393 COMMAND ${PNGQUANT_CMD} img_RemoteReader.png -- img_RemoteReader.png
463463
464464 ENDIF()
465465
466 IF(APPLE AND NOT IOS AND CONVERT)
467 FIND_PROGRAM(ICONUTIL iconutil)
468 IF(ICONUTIL)
469
470 SET(BUNDLE_ICON_SET_DIR ${CMAKE_CURRENT_BINARY_DIR}/bundle_icons.iconset)
471
472 ADD_CUSTOM_TARGET(npaicons.macos.bundle_icons
473 COMMAND ${CMAKE_COMMAND} -E make_directory ${BUNDLE_ICON_SET_DIR}
474 COMMAND ${CONVERT} -background transparent -resize 16x16 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_16x16.png
475 COMMAND ${CONVERT} -background transparent -resize 32x32 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_16x16@2x.png
476 COMMAND ${CONVERT} -background transparent -resize 32x32 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_32x32.png
477 COMMAND ${CONVERT} -background transparent -resize 64x64 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_32x32@2x.png
478 COMMAND ${CONVERT} -background transparent -resize 128x128 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_128x128.png
479 COMMAND ${CONVERT} -background transparent -resize 256x256 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_128x128@2x.png
480 COMMAND ${CONVERT} -background transparent -resize 256x256 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_256x256.png
481 COMMAND ${CONVERT} -background transparent -resize 512x512 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_256x256@2x.png
482 COMMAND ${CONVERT} -background transparent -resize 512x512 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_512x512.png
483 COMMAND ${CONVERT} -background transparent -resize 1024x1024 appIcon.svg ${BUNDLE_ICON_SET_DIR}/icon_512x512@2x.png
484 COMMAND ${ICONUTIL} -c icns --output bundle_icons.icns ${BUNDLE_ICON_SET_DIR}
485 COMMAND ${CMAKE_COMMAND} -E remove_directory ${BUNDLE_ICON_SET_DIR}
486 WORKING_DIRECTORY ${RESOURCES_DIR}/images/macos)
487 ENDIF()
488 ENDIF()
489
466490 INCLUDE(Sphinx)
4141 IF(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION AND ANDROID_NDK_REVISION VERSION_GREATER_EQUAL "11")
4242 SET(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
4343 ENDIF()
44
45 IF(ANDROID_NDK_REVISION VERSION_GREATER_EQUAL "19")
46 CMAKE_MINIMUM_REQUIRED(VERSION 3.16.0)
47 IF(CMAKE_VERSION VERSION_LESS "3.16.4")
48 MESSAGE(WARNING "Check your cmake: https://gitlab.kitware.com/cmake/cmake/commit/e3d3b7ddeb5922a4d17b962984e698e6387f7544")
49 ENDIF()
50
51 SET(ANDROID_USE_LLVM true)
52 ELSE()
53 SET(ANDROID_USE_LLVM false)
54 ENDIF()
55
4456 SET(ANDROID_NDK_TOOLCHAIN_VERSION 4.9)
4557
4658 SET(CMAKE_SYSTEM_NAME Android)
4848 ENDFUNCTION()
4949
5050
51 FUNCTION(IMPORT_PATCH)
52 MESSAGE(STATUS "Import patch...")
53 IF(CMAKE_VERSION VERSION_LESS "3.12")
54 FIND_PACKAGE(PythonInterp REQUIRED)
55 SET(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
56 ELSE()
57 FIND_PACKAGE(Python REQUIRED)
58 ENDIF()
59
60 EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} "${CMAKE_BINARY_DIR}/resources/jenkins/import.py")
61 ENDFUNCTION()
5162
5263
5364
6172 CREATE_HASH()
6273 ELSEIF(CMD STREQUAL "CHECK_WIX_WARNING")
6374 CHECK_WIX_WARNING()
75 ELSEIF(CMD STREQUAL "IMPORT_PATCH")
76 IMPORT_PATCH()
6477 ELSE()
6578 MESSAGE(FATAL_ERROR "Unknown CMD: ${CMD}")
6679 ENDIF()
1212
1313 .. code-block:: winbatch
1414
15 msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false UPDATECHECK=false ONSCREENKEYBOARD=true HISTORY=false
15 msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true
1616
1717 INSTALL_ROOT
1818 Gibt das Installationsverzeichnis an. Ohne Angabe wird der Ordner
6161 danach gefragt, ob er die Transport-PIN schon geändert hat. Durch
6262 TRANSPORTPINREMINDER=false kann diese Abfrage deaktiviert werden. Ohne Angabe
6363 ist die Abfrage aktiviert (true).
64
65 CUSTOMPROXYTYPE
66 Teil der Konfiguration eines Proxys. Gültige Typen sind SOCKS5 und HTTP.
67 Um einen Proxy zu nutzen müssen alle Parameter gesetzt sein (siehe
68 CUSTOMPROXYHOST und CUSTOMPROXYPORT). Der Proxy kann nach der Installation
69 über eine Checkbox in den Einstellungen deaktiviert werden.
70
71 CUSTOMPROXYHOST
72 Teil der Konfiguration eines Proxys. Angabe des Hosts, unter dem der Proxy zu
73 erreichen ist. Um einen Proxy zu nutzen müssen alle Parameter gesetzt sein
74 (siehe CUSTOMPROXYTYPE und CUSTOMPROXYPORT). Der Proxy kann nach der
75 Installation über eine Checkbox in den Einstellungen deaktiviert werden.
76
77 CUSTOMPROXYPORT
78 Teil der Konfiguration eines Proxys. Angabe des Proxyports. Nur Werte von
79 1 bis 65536 sind gültig. Um einen Proxy zu nutzen müssen alle Parameter
80 gesetzt sein (siehe CUSTOMPROXYTYPE und CUSTOMPROXYHOST). Der Proxy kann nach
81 der Installation über eine Checkbox in den Einstellungen deaktiviert werden.
6482
6583 UPDATECHECK
6684 Wird die Benutzeroberfläche der AusweisApp2 geöffnet, wird eine Überprüfung auf
7997 werden. Durch Setzen von ONSCREENKEYBOARD auf false oder true kann diese
8098 deaktiviert bzw. aktiviert werden. Der Benutzer kann diese Einstellung anpassen.
8199
100 SHUFFLESCREENKEYBOARD
101 Ist die Bildschirmtastatur aktiviert, können die Zifferntasten zufällig angeordnet werden.
102 Durch Setzen von SHUFFLESCREENKEYBOARD auf false oder true kann die zufällige Anordnung
103 deaktiviert bzw. aktiviert werden. Der Benutzer kann diese Einstellung anpassen.
104
82105 HISTORY
83106 Jede Selbstauskunft oder Authentisierung wird im Verlauf gespeichert. Dabei
84107 werden jedoch keine persönlichen Daten gespeichert, sondern nur der Zeitpunkt,
85108 der Anbieter und die ausgelesenen Datenfelder (ohne Inhalt). Durch Setzen
86109 von HISTORY auf false oder true kann der Verlauf deaktiviert bzw. aktiviert
87110 werden. Der Benutzer kann diese Einstellung anpassen.
111
112 ENABLECANALLOWED
113 Aktiviert die Unterstützung für den CAN-Allowed-Modus (Vor-Ort-Auslesen). Wenn ein entsprechendes
114 Berechtigungszertifikat vorliegt, muss zum Auslesen die CAN anstelle der PIN eingegeben werden.
115
116 SKIPRIGHTSONCANALLOWED
117 Überspringt die Anzeige des Berechtigungszertifikat im CAN-Allowed-Modus und wechselt direkt zur
118 CAN-Eingabe.
88119
89120 Alternativ kann mit Orca [#orca]_ eine MST-Datei erzeugt werden, die die oben
90121 genannten Parameter definiert. Die Parameter sind in den Tabellen "Directory"
127158 <false/>
128159 <key>transportPinReminder</key>
129160 <false/>
130 <key>common.autoUpdateCheck</key>
131 <false/>
132 <key>common.keylessPassword</key>
161 <key>customProxyType</key>
162 <string>HTTP</string>
163 <key>customProxyHost</key>
164 <string>proxy.example.org</string>
165 <key>customProxyPort</key>
166 <integer>1337</integer>
167 <key>autoUpdateCheck</key>
168 <false/>
169 <key>keylessPassword</key>
170 <true/>
171 <key>shuffleScreenKeyboard</key>
133172 <true/>
134173 <key>history.enable</key>
135174 <false/>
175 <key>enableCanAllowed</key>
176 <true/>
177 <key>skipRightsOnCanAllowed</key>
178 <true/>
136179 </dict>
137180 </plist>
138181
140183 Windows-Version wobei die Bennennung der Attribute der folgenden Tabelle zu
141184 entnehmen ist.
142185
143 ====================== ====================
144 macOS Windows
145 ====================== ====================
146 autoCloseWindow AUTOHIDE
147 remindToClose REMINDTOCLOSE
148 showSetupAssistant ASSISTANT
149 transportPinReminder TRANSPORTPINREMINDER
150 common.autoUpdateCheck UPDATECHECK
151 common.keylessPassword ONSCREENKEYBOARD
152 history.enable HISTORY
153 ====================== ====================
186 ======================= =======================
187 macOS Windows
188 ======================= =======================
189 autoCloseWindow AUTOHIDE
190 remindToClose REMINDTOCLOSE
191 showSetupAssistant ASSISTANT
192 transportPinReminder TRANSPORTPINREMINDER
193 customProxyType CUSTOMPROXYTYPE
194 customProxyPort CUSTOMPROXYPORT
195 customProxyHost CUSTOMPROXYHOST
196 autoUpdateCheck UPDATECHECK
197 keylessPassword ONSCREENKEYBOARD
198 shuffleScreenKeyboard SHUFFLESCREENKEYBOARD
199 history.enable HISTORY
200 enableCanAllowed ENABLECANALLOWED
201 skipRightsOnCanAllowed SKIPRIGHTSONCANALLOWED
202 ======================= =======================
203
204 Nach Änderung der Datei kann es notwending sein, ein erneutes Laden der vom
205 Betriebssystem gecachten Daten zu erzwingen: :code:`killall -u $USER cfprefsd`
154206
155207 .. [#msiexecreturnvalues] https://docs.microsoft.com/de-de/windows/desktop/msi/error-codes
156208 .. [#standardarguments] https://docs.microsoft.com/de-de/windows/desktop/msi/standard-installer-command-line-options
1111
1212 .. code-block:: winbatch
1313
14 msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false UPDATECHECK=false ONSCREENKEYBOARD=true HISTORY=false
14 msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true
1515
1616 INSTALL_ROOT
1717 States the installation directory. If not specified, the folder
5454
5555 TRANSPORTPINREMINDER
5656 Prior to the first authentication, the user is asked once whether they have
57 changed their transport PIN. Setting TRANSPORTPINREMINDER=false deactivates this
57 changed their Transport PIN. Setting TRANSPORTPINREMINDER=false deactivates this
5858 reminder. Not specified, the reminder is activated (true).
59
60 CUSTOMPROXYTYPE
61 Part of a proxy configuration. Valid values are SOCKS5 and HTTP.
62 All proxy parameters have to be set to use the proxy (see
63 CUSTOMPROXYHOST and CUSTOMPROXYPORT). You can disable the proxy after installation
64 with a checkbox in the settings.
65
66 CUSTOMPROXYHOST
67 Part of a proxy configuration. Sets the Host of the proxy. All proxy parameters have
68 to be set to use the proxy (see CUSTOMPROXYTYPE and CUSTOMPROXYPORT).
69 You can disable the proxy after installation with a checkbox in the settings.
70
71 CUSTOMPROXYPORT
72 Part of a proxy configuration. Sets the port of the proxy. Only values between
73 1 and 65536 are valid. All proxy parameters have to be set to use the proxy (see
74 CUSTOMPROXYTYPE and CUSTOMPROXYHOST). You can disable the proxy after installation
75 with a checkbox in the settings.
5976
6077 UPDATECHECK
6178 Upon opening the user interface of the AusweisApp2, an update check is started,
7087 ONSCREENKEYBOARD
7188 An on-screen keyboard is available to enter PIN, CAN or PUK. It is deactivated or
7289 activated by setting ONSCREENKEYBOARD to false or true. Users are able to adjust
73 the settings.
90 the setting.
91
92 SHUFFLESCREENKEYBOARD
93 If the on-screen keyboard is activated, the number keys can be arranged at random.
94 By setting SHUFFLESCREENKEYBOARD to false or true, the random arrangement can be
95 deactivated or activated. Users are able to adjust the setting.
7496
7597 HISTORY
7698 Each authentication is saved in the history. No personal data is saved, only the
7799 time of authentication, the provider and the selected fields (without
78100 content). Indicating HISTORY as false or true, the history function is
79101 deactivated or activated. Users are able to adjust the settings.
102
103 ENABLECANALLOWED
104 Enables support for the CAN allowed mode. If the provider got issued a corresponding authorization
105 certificate the ID card can be read by entering the CAN instead of the PIN.
106
107 SKIPRIGHTSONCANALLOWED
108 Skips the page with the authorization certificate in the CAN allowed mode and asks directly for
109 the CAN.
80110
81111 Alternatively, Orca [#orca]_ can be used to create an MST file that defines the
82112 above arguments. The arguments are available in the "Directory" and "Property"
115145 <false/>
116146 <key>transportPinReminder</key>
117147 <false/>
118 <key>common.autoUpdateCheck</key>
119 <false/>
120 <key>common.keylessPassword</key>
148 <key>customProxyType</key>
149 <string>HTTP</string>
150 <key>customProxyHost</key>
151 <string>proxy.example.org</string>
152 <key>customProxyPort</key>
153 <integer>1337</integer>
154 <key>autoUpdateCheck</key>
155 <false/>
156 <key>keylessPassword</key>
157 <true/>
158 <key>shuffleScreenKeyboard</key>
121159 <true/>
122160 <key>history.enable</key>
123161 <false/>
162 <key>enableCanAllowed</key>
163 <true/>
164 <key>skipRightsOnCanAllowed</key>
165 <true/>
124166 </dict>
125167 </plist>
126168
127169 The description for each value is applicable for both Windows and macOS,
128170 although the naming of the attributes differs, as shown in the following table:
129171
130 ====================== ====================
131 macOS Windows
132 ====================== ====================
133 autoCloseWindow AUTOHIDE
134 remindToClose REMINDTOCLOSE
135 showSetupAssistant ASSISTANT
136 transportPinReminder TRANSPORTPINREMINDER
137 common.autoUpdateCheck UPDATECHECK
138 common.keylessPassword ONSCREENKEYBOARD
139 history.enable HISTORY
140 ====================== ====================
172 ======================= =======================
173 macOS Windows
174 ======================= =======================
175 autoCloseWindow AUTOHIDE
176 remindToClose REMINDTOCLOSE
177 showSetupAssistant ASSISTANT
178 transportPinReminder TRANSPORTPINREMINDER
179 customProxyType CUSTOMPROXYTYPE
180 customProxyPort CUSTOMPROXYPORT
181 customProxyHost CUSTOMPROXYHOST
182 autoUpdateCheck UPDATECHECK
183 keylessPassword ONSCREENKEYBOARD
184 shuffleScreenKeyboard SHUFFLESCREENKEYBOARD
185 history.enable HISTORY
186 enableCanAllowed ENABLECANALLOWED
187 skipRightsOnCanAllowed SKIPRIGHTSONCANALLOWED
188 ======================= =======================
189
190 It might be necessary to force a reload of the data cached by the operating
191 system: :code:`killall -u $USER cfprefsd`
141192
142193 .. [#msiexecreturnvalues] https://docs.microsoft.com/en-us/windows/desktop/msi/error-codes
143194 .. [#standardarguments] https://docs.microsoft.com/en-us/windows/desktop/msi/standard-installer-command-line-options
151151
152152 # The name of an image file (relative to this directory) to place at the top of
153153 # the title page.
154 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
154 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa.png'
155155
156156 # For "manual" documents, if this is true, then toplevel headings are parts,
157157 # not chapters.
151151
152152 # The name of an image file (relative to this directory) to place at the top of
153153 # the title page.
154 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
154 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa.png'
155155
156156 # For "manual" documents, if this is true, then toplevel headings are parts,
157157 # not chapters.
2323
2424 - Unterstützung von OS X 10.11 wurde eingestellt.
2525
26 - Unterstützung von macOS 10.15.
27
2628 - Unterstützung von der x86-Architektur unter Android
2729 wurde eingestellt.
2830
0 AusweisApp2 1.20.1
1 ^^^^^^^^^^^^^^^^^^
2
3 **Releasedatum:** 23. Juni 2020
4
5
6
7 Anwender
8 """"""""
9 - Die Nutzung von passwortgeschützten Proxys ist nun
10 auch in der neuen grafischen Oberfläche möglich.
11
12 - Auf mobilen Geräten wurde eine Option ergänzt,
13 um zwischen Hoch- und Querformat zu wechseln.
14
15 - Auf Android wurde das Abbrechen einer Authentisierung
16 beschleunigt und ein dabei auftretender Absturz beseitigt.
17
18 - Unter Windows wird bei einer Authentisierung nun auch mit
19 der neuen grafischen Oberfläche ein Fortschritt in der
20 Taskleiste angezeigt.
21
22 - Kleinere Fehlerbehebungen.
23
24
25 Entwickler
26 """"""""""
27 - Erweiterung der firmenweiten Installationen des MSI-Paketes
28 um die Möglichkeit das Vor-Ort-Auslesen zu aktivieren und
29 eine Proxy-Konfiguration zu hinterlegen.
30
31 - In der mobilen Version führt ein zehnmaliges Anklicken der Lupe
32 auf der Startseite dazu, dass weitere Optionen in den Einstellungen
33 sichtbar werden. Dort kann der Testmodus für die Selbstauskunft
34 oder das Vor-Ort-Auslesen aktiviert werden.
11 =============
22
33 Mit der Version 1.22.0 der AusweisApp2 wird die Unterstützung
4 folgender Funktionen eingestellt.
4 folgender Systeme und Funktionen eingestellt.
55
6 - macOS Sierra 10.12
67 - Vorherige grafische Oberfläche
78 - Bluetooth (Reiner SCT cyberJack Wave)
89
33 .. toctree::
44 :maxdepth: 1
55
6 1.20.0
6 1.20.1
77 announce
88 issues
150150
151151 # The name of an image file (relative to this directory) to place at the top of
152152 # the title page.
153 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
153 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa.png'
154154
155155 # For "manual" documents, if this is true, then toplevel headings are parts,
156156 # not chapters.
00 Bekannte Fehler
11 ===============
2
3 - Bei der Nutzung eines Smartphones als Kartenleser mit aktiviertem
4 Tastaturmodus kann bei einer Authentisierung nicht in die PIN-Änderung
5 gewechselt werden, wenn nur eine fünfstellige PIN vorhanden ist.
6
7 - Wird der Screenreader aktiviert, während die AusweisApp2 bereits läuft,
8 kann es zu Fehlverhalten kommen.
9
10
11 Windows / macOS
12 ---------------
213
314 .. important::
415 Auf Windows wird beim Update einer Version der AusweisApp2 älter
819 die ältere Version manuell. Danach kann die bereits installierte,
920 aktuelle Version aufgerufen werden.
1021
11 Die nachfolgende Liste bezieht sich auf die aktuelle Version der AusweisApp2.
12
13 - Mit der NFC-Schnittstelle des iPhone 7 (Plus) unter iOS 13.0 und 13.1 werden
14 viele Ausweise nicht erkannt (hauptsächlich NFC-A) und es kommt zu
15 Abbrüchen der Authentisierung. Aktualisieren Sie auf iOS 13.2 oder höher.
22 .. important::
23 Auf Windows kann es beim Update einer Version der AusweisApp2 älter
24 als Version 1.20.0 auf eine aktuelle Version der AusweisApp2 dazu kommen,
25 dass die Einstellung der Firewall verloren geht und dadurch ein "Smartphone
26 als Kartenleser" nicht mehr erkannt wird. Bitte gehen Sie in die
27 Systemsteuerung Ihres Endgeräts und deinstallieren Sie die AusweisApp2
28 um danach eine Neuinstallation durchzuführen.
1629
1730 - Auf Windows 10 Plattformen mit aktivierter Benutzerkontensteuerung kann
1831 es bei Benutzern mit eingeschränkten Berechtigungen zu Problemen mit der
2841 oder eine PIN-Änderung mit Komfort-Kartenleser durchgeführt wird, kann es
2942 unter Windows und macOS zu einem Absturz kommen.
3043
31 - Unter Umständen kommt es zu Stabilitätsproblemen der NFC-Schnittstelle
32 auf Android und iOS.
33
34 - Längere Texte können unter Android u.U. bei kleinen Bildschirmgrößen
35 abgeschnitten sein.
36
3744 - Unter macOS wird der Hinweis bei falscher PIN-Bestätigung während der
3845 PIN-Änderung nur sehr kurz angezeigt.
39
40 - Bei der Nutzung eines entfernten Kartenlesers mit aktiviertem Tastaturmodus
41 kann bei einer Authentisierung nicht in die PIN-Änderung gewechselt werden,
42 wenn nur eine 5-stellige PIN vorhanden ist.
4346
4447 - Unter Windows wird bei der neuen grafischen Oberfläche der
4548 "Datei speichern unter"-Dialog nicht automatisch bei Beginn einer
5356
5457 - Bei einigen Links werden die Steuerzeichen vom Bildschirmleser vorgelesen.
5558
56 - Wird der Screenreader aktiviert, während die AusweisApp2 bereits läuft,
57 kann es zu Fehlverhalten kommen.
5859
59 - Die Online-Hilfe für die neue grafische Oberfläche ist noch nicht verfügbar.
60 Android / iOS
61 -------------
62
63 - Mit der NFC-Schnittstelle des iPhone 7 (Plus) unter iOS 13.0 und 13.1 werden
64 viele Ausweise nicht erkannt (hauptsächlich NFC-A) und es kommt zu
65 Abbrüchen der Authentisierung. Aktualisieren Sie auf iOS 13.2 oder höher.
66
67 - Unter Umständen kommt es zu Stabilitätsproblemen der NFC-Schnittstelle
68 auf Android und iOS.
69
70 - Längere Texte können unter Android u.U. bei kleinen Bildschirmgrößen
71 abgeschnitten sein.
6072
6173
62 Die nachfolgende Liste bezieht sich auf die alte grafische Oberfläche.
74 Alte grafische Oberfläche
75 -------------------------
6376
6477 - Bei Erhöhung der Schriftgröße über 175% kommt es zur Nutzungseinschränkung.
6578
2121
2222 - Windows 10 (64bit)
2323
24 - Android 5.0 und höher (x86, armeabi-v7a)
24 - Android 5.0 und höher (armeabi-v7a, arm64-v8a)
2525
2626 - iOS 13 und höher
2727
4848 Im Rahmen der Qualitätssicherung werden die folgenden Browserversionen
4949 getestet.
5050
51 - Firefox 70
51 - Firefox 75
5252
53 - Chrome 78
53 - Chrome 81
5454
5555 - Internet Explorer 11
5656
57 - Safari 13
57 - Safari 13.1
5858
59 - Edge 44.5
59 - Edge 80
6060
6161
6262
101101 https://www.ausweisapp.bund.de/mobile-geraete/
102102
103103
104 Android
105 """""""
104 Android / iOS
105 """""""""""""
106106
107107 Browser
108108 ~~~~~~~
114114 Anbieter umgesetzten Aktivierung. Daher empfehlen wir einen der
115115 folgenden Browser zu verwenden.
116116
117 - Firefox Klar 8
117 - Chrome 81 (Android)
118118
119 - Chrome 78
119 - Firefox 68 (Android)
120120
121 - Android System WebView 73
122
121 - Safari 13.1 (iOS)
123122
124123
125124 Kartenleser
66 :maxdepth: 1
77
88 1.20.0
9 1.20.1
910
1011
1112 Versionszweig 1.18
4040 The integrated AusweisApp2 will be fetched automatically as a dependency by
4141 your **app/build.gradle** file.
4242 It is recommended to always use the latest version by **1.+** of AusweisApp2.
43 But you are free to add a concrete version like **1.16.0**.
43 But you are free to add a concrete version like **1.20.1**.
4444
4545 .. code-block:: groovy
4646
4747 dependencies {
48 implementation 'com.governikus:ausweisapp:1.16.+'
48 implementation 'com.governikus:ausweisapp:1.20.+'
4949 }
5050
5151
298298 keypad.
299299
300300
301 - **value**: The personal identification number (PIN) of the card.
301 - **value**: The Personal Identification Number (PIN) of the card.
302302 This must be 6 digits if the :ref:`reader` has no keypad, otherwise
303303 this parameter must be omitted.
304304
334334 keypad.
335335
336336
337 - **value**: The card access number (CAN) of the card.
337 - **value**: The Card Access Number (CAN) of the card.
338338 This must be 6 digits if the :ref:`reader` has no keypad, otherwise
339339 this parameter must be omitted.
340340
372372 keypad.
373373
374374
375 - **value**: The personal unblocking key (PUK) of the card.
375 - **value**: The Personal Unblocking Key (PUK) of the card.
376376 This must be 10 digits if the :ref:`reader` has no keypad, otherwise
377377 this parameter must be omitted.
378378
148148
149149 # The name of an image file (relative to this directory) to place at the top of
150150 # the title page.
151 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
151 latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa.png'
152152
153153 # For "manual" documents, if this is true, then toplevel headings are parts,
154154 # not chapters.
6868 SET(PERL_EXECUTABLE perl)
6969 ENDIF()
7070
71 FIND_HOST_PACKAGE(PythonInterp 2.7 REQUIRED)
72
7371 FIND_PROGRAM(PATCH_CMD patch CMAKE_FIND_ROOT_PATH_BOTH)
7472 IF(PATCH_CMD)
7573 SET(PATCH_OPTIONS -i)
7674 MESSAGE(STATUS "Using 'patch' command... ${PATCH_CMD}")
7775 ELSE()
78 SET(PATCH_CMD ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/patch.py --debug -v)
7976 MESSAGE(STATUS "Cannot find 'patch' command... using patch.py")
77
78 IF(CMAKE_VERSION VERSION_LESS "3.12")
79 FIND_HOST_PACKAGE(PythonInterp REQUIRED)
80 SET(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
81 ELSE()
82 FIND_HOST_PACKAGE(Python REQUIRED)
83 ENDIF()
84
85 SET(PATCH_CMD ${Python_EXECUTABLE} ${PROJECT_SOURCE_DIR}/patch.py --debug -v)
8086 ENDIF()
8187 SET(PATCH_CMD ${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PROJECT_SOURCE_DIR}/patches)
8288
115121 SET(QT_DEST_DIR archive) # official_releases
116122 ENDIF()
117123 STRING(SUBSTRING ${QT} 0 4 QT_SUBVERSION)
118
119 SET(QT_URL https://download.qt.io/${QT_DEST_DIR}/qt/${QT_SUBVERSION}/${QT}/single)
120 SET(OPENSSL_URL https://www.openssl.org/source)
124 SET(QT_URL https://download.qt.io/${QT_DEST_DIR}/qt/${QT_SUBVERSION}/${QT}/single/${QT_FILE})
125
126 STRING(SUBSTRING ${OPENSSL} 0 5 OPENSSL_SUBVERSION)
127 SET(OPENSSL_SOURCE https://www.openssl.org/source)
128 SET(OPENSSL_URL ${OPENSSL_SOURCE}/${OPENSSL_FILE})
129 SET(OPENSSL_URL_OLD ${OPENSSL_SOURCE}/old/${OPENSSL_SUBVERSION}/${OPENSSL_FILE})
130
131
121132
122133 SET(ENABLED_TARGETS)
123
124134
125135 ################################## OpenSSL
126136 #########################################################################
194204 ENDIF()
195205
196206 ExternalProject_Add(openssl
197 URL ${OPENSSL_URL}/${OPENSSL_FILE}
207 URL ${OPENSSL_URL} ${OPENSSL_URL_OLD}
198208 URL_HASH SHA256=${OPENSSL_HASH}
199209 DOWNLOAD_DIR ${PACKAGES_DIR}
200210
325335 ENDIF()
326336 SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER}
327337 -android-sdk ${ANDROID_SDK} -android-ndk ${CMAKE_ANDROID_NDK} -android-ndk-platform android-${CMAKE_SYSTEM_VERSION} -android-ndk-host ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}
328 -android-arch ${CMAKE_ANDROID_ARCH_ABI} -android-toolchain-version ${ANDROID_NDK_TOOLCHAIN_VERSION}
329 -xplatform ${ANDROID_XPLATFORM})
338 -android-arch ${CMAKE_ANDROID_ARCH_ABI} -xplatform ${ANDROID_XPLATFORM})
330339
331340 IF(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
332341 SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -no-use-gold-linker)
334343
335344 SET(QT_ENV export OPENSSL_LIBS=-lcrypto-gov\ -lssl-gov &&)
336345 ELSEIF(BSD)
337 SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER})
346 SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} -no-libudev)
338347 ELSEIF(LINUX)
339348 SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} -no-libproxy)
340349 ELSE()
347356
348357 ExternalProject_Add(qt
349358 DEPENDS openssl
350 URL ${QT_URL}/${QT_FILE}
359 URL ${QT_URL}
351360 URL_HASH SHA256=${QT_HASH}
352361 DOWNLOAD_DIR ${PACKAGES_DIR}
353362
354363 PATCH_COMMAND ${QT_PATCH_COMMAND}
364 ${PATCH_CMD}/qt-Port-python-check-to-configure-system.patch &&
355365 ${PATCH_CMD}/qt-Disable-unused-imageformats.patch &&
356366 ${PATCH_CMD}/qt-Add-work-around-for-freebsd-build.patch &&
357367 ${PATCH_CMD}/qt-Remove-Qt-Labs-specific-plugins-from-the-build.patch &&
363373 ${PATCH_CMD}/qt-Filesystem-avoid-crashes-on-exit-in-case-the-locale-.patch &&
364374 ${PATCH_CMD}/qt-Revert-Android-Stick-with-buildToolsVersion-28.0.3.patch &&
365375 ${PATCH_CMD}/qt-Remove-dead-code-to-fix-a-lint-warning.patch &&
376 ${PATCH_CMD}/qt-Fix-llvm-strip.patch &&
377 ${PATCH_CMD}/qt-Handle-exceptions-when-accessing-android-clipboard.patch &&
378 ${PATCH_CMD}/qt-Fix-build-with-macOS-10.15-and-deployment-10.12.patch &&
379 ${PATCH_CMD}/qt-Pass-SDK-root-to-the-linker-as-isysroot-not-Wl-sysli.patch &&
366380 ${CMAKE_COMMAND} -E touch qtbase/.gitignore
367381 CONFIGURE_COMMAND ${QT_ENV} ${QT_CONFIGURE} ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_SKIP_MODULES}
368382 BUILD_COMMAND ${MAKE} ${MAKE_JOBS}
11 """
22 Patch utility to apply unified diffs
33
4 Brute-force line-by-line non-recursive parsing
4 Brute-force line-by-line non-recursive parsing
55
66 Copyright (c) 2008-2016 anatoly techtonik
77 Available under the terms of MIT license
88
9 https://github.com/techtonik/python-patch/
10
9 ---
10 The MIT License (MIT)
11
12 Copyright (c) 2019 JFrog LTD
13
14 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
15 and associated documentation files (the "Software"), to deal in the Software without
16 restriction, including without limitation the rights to use, copy, modify, merge, publish,
17 distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
18 Software is furnished to do so, subject to the following conditions:
19
20 The above copyright notice and this permission notice shall be included in all copies or
21 substantial portions of the Software.
22
23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
24 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 SOFTWARE.
1129 """
1230 from __future__ import print_function
1331
14 __author__ = "anatoly techtonik <techtonik@gmail.com>"
15 __version__ = "1.16"
32 __author__ = "Conan.io <info@conan.io>"
33 __version__ = "1.17.4"
34 __license__ = "MIT"
35 __url__ = "https://github.com/conan-io/python-patch"
1636
1737 import copy
1838 import logging
1939 import re
40 import tempfile
41 import codecs
2042
2143 # cStringIO doesn't support unicode in 2.5
2244 try:
3355 import posixpath
3456 import shutil
3557 import sys
58 import stat
3659
3760
3861 PY3K = sys.version_info >= (3, 0)
5275
5376 # [ ] figure out how to print non-utf-8 filenames without
5477 # information loss
55 return b.decode('utf-8')
78 return b.decode('utf-8')
5679
5780
5881 #------------------------------------------------
5982 # Logging is controlled by logger named after the
60 # module name (e.g. 'patch' for patch.py module)
61
62 logger = logging.getLogger(__name__)
83 # module name (e.g. 'patch' for patch_ng.py module)
84
85 logger = logging.getLogger("patch_ng")
6386
6487 debug = logger.debug
6588 info = logger.info
6689 warning = logger.warning
90 error = logger.error
6791
6892 class NullHandler(logging.Handler):
6993 """ Copied from Python 2.7 to avoid getting
154178 filename = re.sub(b'^[\\\\/]+', b'', filename)
155179 return filename
156180
181
182 def safe_unlink(filepath):
183 os.chmod(filepath, stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH)
184 os.unlink(filepath)
185
186
157187 #-----------------------------------------------
158188 # Main API functions
159189
203233 # --- /Utility function ---
204234
205235
236 def decode_text(text):
237 encodings = {codecs.BOM_UTF8: "utf_8_sig",
238 codecs.BOM_UTF16_BE: "utf_16_be",
239 codecs.BOM_UTF16_LE: "utf_16_le",
240 codecs.BOM_UTF32_BE: "utf_32_be",
241 codecs.BOM_UTF32_LE: "utf_32_le",
242 b'\x2b\x2f\x76\x38': "utf_7",
243 b'\x2b\x2f\x76\x39': "utf_7",
244 b'\x2b\x2f\x76\x2b': "utf_7",
245 b'\x2b\x2f\x76\x2f': "utf_7",
246 b'\x2b\x2f\x76\x38\x2d': "utf_7"}
247 for bom in sorted(encodings, key=len, reverse=True):
248 if text.startswith(bom):
249 try:
250 return text[len(bom):].decode(encodings[bom])
251 except UnicodeDecodeError:
252 continue
253 decoders = ["utf-8", "Windows-1252"]
254 for decoder in decoders:
255 try:
256 return text.decode(decoder)
257 except UnicodeDecodeError:
258 continue
259 logger.warning("can't decode %s" % str(text))
260 return text.decode("utf-8", "ignore") # Ignore not compatible characters
261
262
263 def to_file_bytes(content):
264 if PY3K:
265 if not isinstance(content, bytes):
266 content = bytes(content, "utf-8")
267 elif isinstance(content, unicode):
268 content = content.encode("utf-8")
269 return content
270
271
272 def load(path, binary=False):
273 """ Loads a file content """
274 with open(path, 'rb') as handle:
275 tmp = handle.read()
276 return tmp if binary else decode_text(tmp)
277
278
279 def save(path, content, only_if_modified=False):
280 """
281 Saves a file with given content
282 Params:
283 path: path to write file to
284 content: contents to save in the file
285 only_if_modified: file won't be modified if the content hasn't changed
286 """
287 try:
288 os.makedirs(os.path.dirname(path))
289 except Exception:
290 pass
291
292 new_content = to_file_bytes(content)
293
294 if only_if_modified and os.path.exists(path):
295 old_content = load(path, binary=True)
296 if old_content == new_content:
297 return
298
299 with open(path, "wb") as handle:
300 handle.write(new_content)
301
302
206303 class Hunk(object):
207304 """ Parsed hunk data container (hunk starts with @@ -R +R @@) """
208305
215312 self.desc=''
216313 self.text=[]
217314
218 # def apply(self, estream):
219 # """ write hunk data into enumerable stream
220 # return strings one by one until hunk is
221 # over
222 #
223 # enumerable stream are tuples (lineno, line)
224 # where lineno starts with 0
225 # """
226 # pass
227
228315
229316 class Patch(object):
230317 """ Patch for a single file.
231318 If used as an iterable, returns hunks.
232319 """
233320 def __init__(self):
234 self.source = None
321 self.source = None
235322 self.target = None
236323 self.hunks = []
237324 self.hunkends = []
337424
338425 # regexp to match start of hunk, used groups - 1,3,4,6
339426 re_hunk_start = re.compile(b"^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@")
340
427
341428 self.errors = 0
342429 # temp buffers for header and filenames info
343430 header = []
373460 else:
374461 info("%d unparsed bytes left at the end of stream" % len(b''.join(header)))
375462 self.warnings += 1
376 # TODO check for \No new line at the end..
463 # TODO check for \No new line at the end..
377464 # TODO test for unparsed bytes
378465 # otherwise error += 1
379466 # this is actually a loop exit
406493 p.hunkends["lf"] += 1
407494 elif line.endswith(b"\r"):
408495 p.hunkends["cr"] += 1
409
496
410497 if line.startswith(b"-"):
411498 hunkactual["linessrc"] += 1
412499 elif line.startswith(b"+"):
476563 # XXX header += srcname
477564 # double source filename line is encountered
478565 # attempt to restart from this second line
479 re_filename = b"^--- ([^\t]+)"
480 match = re.match(re_filename, line)
566
567 # Files dated at Unix epoch don't exist, e.g.:
568 # '1970-01-01 01:00:00.000000000 +0100'
569 # They include timezone offsets.
570 # .. which can be parsed (if we remove the nanoseconds)
571 # .. by strptime() with:
572 # '%Y-%m-%d %H:%M:%S %z'
573 # .. but unfortunately this relies on the OSes libc
574 # strptime function and %z support is patchy, so we drop
575 # everything from the . onwards and group the year and time
576 # separately.
577 re_filename_date_time = b"^--- ([^\t]+)(?:\s([0-9-]+)\s([0-9:]+)|.*)"
578 match = re.match(re_filename_date_time, line)
481579 # todo: support spaces in filenames
482580 if match:
483581 srcname = match.group(1).strip()
582 date = match.group(2)
583 time = match.group(3)
584 if (date == b'1970-01-01' or date == b'1969-12-31') and time.split(b':',1)[1] == b'00:00':
585 srcname = b'/dev/null'
484586 else:
485587 warning("skipping invalid filename at line %d" % (lineno+1))
486588 self.errors += 1
502604 headscan = True
503605 else:
504606 if tgtname != None:
505 # XXX seems to be a dead branch
607 # XXX seems to be a dead branch
506608 warning("skipping invalid patch - double target at line %d" % (lineno+1))
507609 self.errors += 1
508610 srcname = None
515617 filenames = False
516618 headscan = True
517619 else:
518 re_filename = b"^\+\+\+ ([^\t]+)"
519 match = re.match(re_filename, line)
620 re_filename_date_time = b"^\+\+\+ ([^\t]+)(?:\s([0-9-]+)\s([0-9:]+)|.*)"
621 match = re.match(re_filename_date_time, line)
520622 if not match:
521623 warning("skipping invalid patch - no target filename at line %d" % (lineno+1))
522624 self.errors += 1
525627 filenames = False
526628 headscan = True
527629 else:
630 tgtname = match.group(1).strip()
631 date = match.group(2)
632 time = match.group(3)
633 if (date == b'1970-01-01' or date == b'1969-12-31') and time.split(b':',1)[1] == b'00:00':
634 tgtname = b'/dev/null'
528635 if p: # for the first run p is None
529636 self.items.append(p)
530637 p = Patch()
531638 p.source = srcname
532639 srcname = None
533 p.target = match.group(1).strip()
640 p.target = tgtname
641 tgtname = None
534642 p.header = header
535643 header = []
536644 # switch to hunkhead state
589697 warning("error: no patch data found!")
590698 return False
591699 else: # extra data at the end of file
592 pass
700 pass
593701 else:
594702 warning("error: patch stream is incomplete!")
595703 self.errors += 1
615723 # --------
616724
617725 self._normalize_filenames()
618
726
619727 return (self.errors == 0)
620728
621729 def _detect_type(self, p):
653761 break
654762 if p.header[idx].startswith(b'diff --git a/'):
655763 if (idx+1 < len(p.header)
656 and re.match(b'index \\w{7}..\\w{7} \\d{6}', p.header[idx+1])):
764 and re.match(b'(?:index \\w{7}..\\w{7} \\d{6}|new file mode \\d*)', p.header[idx+1])):
657765 if DVCS:
658766 return GIT
659767
660768 # HG check
661 #
769 #
662770 # - for plain HG format header is like "diff -r b2d9961ff1f5 filename"
663771 # - for Git-style HG patches it is "diff --git a/oldname b/newname"
664772 # - filename starts with a/, b/ or is equal to /dev/null
665773 # - exported changesets also contain the header
666774 # # HG changeset patch
667775 # # User name@example.com
668 # ...
776 # ...
669777 # TODO add MQ
670778 # TODO add revision info
671779 if len(p.header) > 0:
688796
689797 [x] always use forward slashes to be crossplatform
690798 (diff/patch were born as a unix utility after all)
691
799
692800 return None
693801 """
694802 if debugmode:
695803 debug("normalize filenames")
696804 for i,p in enumerate(self.items):
697805 if debugmode:
698 debug(" patch type = " + p.type)
699 debug(" source = " + p.source)
700 debug(" target = " + p.target)
806 debug(" patch type = %s" % p.type)
807 debug(" source = %s" % p.source)
808 debug(" target = %s" % p.target)
701809 if p.type in (HG, GIT):
702 # TODO: figure out how to deal with /dev/null entries
703810 debug("stripping a/ and b/ prefixes")
704 if p.source != '/dev/null':
811 if p.source != b'/dev/null':
705812 if not p.source.startswith(b"a/"):
706813 warning("invalid source filename")
707814 else:
708815 p.source = p.source[2:]
709 if p.target != '/dev/null':
816 if p.target != b'/dev/null':
710817 if not p.target.startswith(b"b/"):
711818 warning("invalid target filename")
712819 else:
729836 while p.target.startswith(b".." + sep):
730837 p.target = p.target.partition(sep)[2]
731838 # absolute paths are not allowed
732 if xisabs(p.source) or xisabs(p.target):
839 if (xisabs(p.source) and p.source != b'/dev/null') or \
840 (xisabs(p.target) and p.target != b'/dev/null'):
733841 warning("error: absolute paths are not allowed - file no.%d" % (i+1))
734842 self.warnings += 1
735 if xisabs(p.source):
843 if xisabs(p.source) and p.source != b'/dev/null':
736844 warning("stripping absolute path from source name '%s'" % p.source)
737845 p.source = xstrip(p.source)
738 if xisabs(p.target):
846 if xisabs(p.target) and p.target != b'/dev/null':
739847 warning("stripping absolute path from target name '%s'" % p.target)
740848 p.target = xstrip(p.target)
741
849
742850 self.items[i].source = p.source
743851 self.items[i].target = p.target
744852
794902 hist = "+"*int(iwidth) + "-"*int(dwidth)
795903 # -- /calculating +- histogram --
796904 output += (format % (tostr(names[i]), str(insert[i] + delete[i]), hist))
797
905
798906 output += (" %d files changed, %d insertions(+), %d deletions(-), %+d bytes"
799907 % (len(names), sum(insert), sum(delete), delta))
800908 return output
801909
802910
803 def findfile(self, old, new):
804 """ return name of file to be patched or None """
805 if exists(old):
806 return old
911 def findfiles(self, old, new):
912 """ return tuple of source file, target file """
913 if old == b'/dev/null':
914 handle, abspath = tempfile.mkstemp(suffix='pypatch')
915 abspath = abspath.encode()
916 # The source file must contain a line for the hunk matching to succeed.
917 os.write(handle, b' ')
918 os.close(handle)
919 if not exists(new):
920 handle = open(new, 'wb')
921 handle.close()
922 return abspath, new
923 elif exists(old):
924 return old, old
807925 elif exists(new):
808 return new
926 return new, new
927 elif new == b'/dev/null':
928 return None, None
809929 else:
810930 # [w] Google Code generates broken patches with its online editor
811931 debug("broken patch from Google Code, stripping prefixes..")
814934 debug(" %s" % old)
815935 debug(" %s" % new)
816936 if exists(old):
817 return old
937 return old, old
818938 elif exists(new):
819 return new
820 return None
821
822
823 def apply(self, strip=0, root=None):
939 return new, new
940 return None, None
941
942 def _strip_prefix(self, filename):
943 if filename.startswith(b'a/') or filename.startswith(b'b/'):
944 return filename[2:]
945 return filename
946
947 def decode_clean(self, path, prefix):
948 path = path.decode("utf-8").replace("\\", "/")
949 if path.startswith(prefix):
950 path = path[2:]
951 return path
952
953 def strip_path(self, path, base_path, strip=0):
954 tokens = path.split("/")
955 if len(tokens) > 1:
956 tokens = tokens[strip:]
957 path = "/".join(tokens)
958 if base_path:
959 path = os.path.join(base_path, path)
960 return path
961 # account for new and deleted files, upstream dep won't fix them
962
963
964
965
966 def apply(self, strip=0, root=None, fuzz=False):
824967 """ Apply parsed patch, optionally stripping leading components
825968 from file paths. `root` parameter specifies working dir.
969 :param strip: Strip patch path
970 :param root: Folder to apply the patch
971 :param fuzz: Accept fuzzy patches
826972 return True on success
827973 """
974 items = []
975 for item in self.items:
976 source = self.decode_clean(item.source, "a/")
977 target = self.decode_clean(item.target, "b/")
978 if "dev/null" in source:
979 target = self.strip_path(target, root, strip)
980 hunks = [s.decode("utf-8") for s in item.hunks[0].text]
981 new_file = "".join(hunk[1:] for hunk in hunks)
982 save(target, new_file)
983 elif "dev/null" in target:
984 source = self.strip_path(source, root, strip)
985 safe_unlink(source)
986 else:
987 items.append(item)
988 self.items = items
989
828990 if root:
829991 prevdir = os.getcwd()
830992 os.chdir(root)
8481010 debug("stripping %s leading component(s) from:" % strip)
8491011 debug(" %s" % p.source)
8501012 debug(" %s" % p.target)
851 old = pathstrip(p.source, strip)
852 new = pathstrip(p.target, strip)
1013 old = p.source if p.source == b'/dev/null' else pathstrip(p.source, strip)
1014 new = p.target if p.target == b'/dev/null' else pathstrip(p.target, strip)
8531015 else:
8541016 old, new = p.source, p.target
8551017
856 filename = self.findfile(old, new)
857
858 if not filename:
859 if len(p.hunks)==1 and p.hunks[0].startsrc==0 and p.hunks[0].linessrc==0:
860 filename=new
861 debug("patch creates new file "+filename)
862 # create directory
863 filenameDir=os.path.join(os.path.dirname(filename), ".")
864 if not exists(filenameDir):
865 os.makedirs(filenameDir)
866 # create empty file
867 open(filename, "a").close()
868 else:
869 warning("source/target file does not exist:\n --- %s\n +++ %s" % (old, new))
870 errors += 1
871 continue
872 if not isfile(filename):
873 warning("not a file - %s" % filename)
1018 filenameo, filenamen = self.findfiles(old, new)
1019
1020 if not filenameo or not filenamen:
1021 error("source/target file does not exist:\n --- %s\n +++ %s" % (old, new))
8741022 errors += 1
8751023 continue
1024 if not isfile(filenameo):
1025 error("not a file - %s" % filenameo)
1026 errors += 1
1027 continue
8761028
8771029 # [ ] check absolute paths security here
878 debug("processing %d/%d:\t %s" % (i+1, total, filename))
1030 debug("processing %d/%d:\t %s" % (i+1, total, filenamen))
8791031
8801032 # validate before patching
881 f2fp = open(filename, 'rb')
1033 f2fp = open(filenameo, 'rb')
8821034 hunkno = 0
8831035 hunk = p.hunks[hunkno]
8841036 hunkfind = []
8851037 hunkreplace = []
8861038 validhunks = 0
8871039 canpatch = False
888
8891040 for lineno, line in enumerate(f2fp):
8901041 if lineno+1 < hunk.startsrc:
8911042 continue
8981049 # todo \ No newline at end of file
8991050
9001051 # check hunks in source file
901 if lineno+1 < hunk.startsrc+len(hunkfind)-1:
1052 if lineno+1 < hunk.startsrc+len(hunkfind):
9021053 if line.rstrip(b"\r\n") == hunkfind[hunklineno]:
903 hunklineno+=1
1054 hunklineno += 1
9041055 else:
905 info("file %d/%d:\t %s" % (i+1, total, filename))
906 info(" hunk no.%d doesn't match source file at line %d" % (hunkno+1, lineno+1))
907 info(" expected: %s" % hunkfind[hunklineno])
908 info(" actual : %s" % line.rstrip(b"\r\n"))
909 # not counting this as error, because file may already be patched.
910 # check if file is already patched is done after the number of
911 # invalid hunks if found
912 # TODO: check hunks against source/target file in one pass
913 # API - check(stream, srchunks, tgthunks)
914 # return tuple (srcerrs, tgterrs)
915
916 # continue to check other hunks for completeness
917 hunkno += 1
918 if hunkno < len(p.hunks):
919 hunk = p.hunks[hunkno]
920 continue
1056 warning("file %d/%d:\t %s" % (i+1, total, filenamen))
1057 warning(" hunk no.%d doesn't match source file at line %d" % (hunkno+1, lineno+1))
1058 warning(" expected: %s" % hunkfind[hunklineno])
1059 warning(" actual : %s" % line.rstrip(b"\r\n"))
1060 if fuzz:
1061 hunklineno += 1
9211062 else:
922 break
1063 # not counting this as error, because file may already be patched.
1064 # check if file is already patched is done after the number of
1065 # invalid hunks if found
1066 # TODO: check hunks against source/target file in one pass
1067 # API - check(stream, srchunks, tgthunks)
1068 # return tuple (srcerrs, tgterrs)
1069
1070 # continue to check other hunks for completeness
1071 hunkno += 1
1072 if hunkno < len(p.hunks):
1073 hunk = p.hunks[hunkno]
1074 continue
1075 else:
1076 break
9231077
9241078 # check if processed line is the last line
925 if lineno+1 == hunk.startsrc+len(hunkfind)-1:
926 debug(" hunk no.%d for file %s -- is ready to be patched" % (hunkno+1, filename))
1079 if len(hunkfind) == 0 or lineno+1 == hunk.startsrc+len(hunkfind)-1:
1080 debug(" hunk no.%d for file %s -- is ready to be patched" % (hunkno+1, filenamen))
9271081 hunkno+=1
9281082 validhunks+=1
9291083 if hunkno < len(p.hunks):
9341088 canpatch = True
9351089 break
9361090 else:
937 if hunk.startsrc==0 and hunk.linessrc==0 and len(p.hunks)==1:
938 debug(" patch represents a new file")
939 validhunks=1
940 canpatch=True
941 elif hunkno < len(p.hunks):
942 warning("premature end of source file %s at hunk %d" % (filename, hunkno+1))
1091 if hunkno < len(p.hunks):
1092 error("premature end of source file %s at hunk %d" % (filenameo, hunkno+1))
9431093 errors += 1
9441094
9451095 f2fp.close()
9461096
9471097 if validhunks < len(p.hunks):
948 if self._match_file_hunks(filename, p.hunks):
949 warning("already patched %s" % filename)
1098 if self._match_file_hunks(filenameo, p.hunks):
1099 warning("already patched %s" % filenameo)
9501100 else:
951 warning("source file is different - %s" % filename)
952 errors += 1
1101 if fuzz:
1102 warning("source file is different - %s" % filenameo)
1103 else:
1104 error("source file is different - %s" % filenameo)
1105 errors += 1
9531106 if canpatch:
954 backupname = filename+b".orig"
1107 backupname = filenamen+b".orig"
9551108 if exists(backupname):
9561109 warning("can't backup original file to %s - aborting" % backupname)
1110 errors += 1
9571111 else:
958 shutil.move(filename, backupname)
959 if self.write_hunks(backupname, filename, p.hunks):
960 info("successfully patched %d/%d:\t %s" % (i+1, total, filename))
961 os.unlink(backupname)
1112 shutil.move(filenamen, backupname)
1113 if self.write_hunks(backupname if filenameo == filenamen else filenameo, filenamen, p.hunks):
1114 info("successfully patched %d/%d:\t %s" % (i+1, total, filenamen))
1115 safe_unlink(backupname)
1116 if new == b'/dev/null':
1117 # check that filename is of size 0 and delete it.
1118 if os.path.getsize(filenamen) > 0:
1119 warning("expected patched file to be empty as it's marked as deletion:\t %s" % filenamen)
1120 safe_unlink(filenamen)
9621121 else:
9631122 errors += 1
964 warning("error patching file %s" % filename)
965 shutil.copy(filename, filename+".invalid")
966 warning("invalid version is saved to %s" % filename+".invalid")
1123 warning("error patching file %s" % filenamen)
1124 shutil.copy(filenamen, filenamen+".invalid")
1125 warning("invalid version is saved to %s" % filenamen+".invalid")
9671126 # todo: proper rejects
968 shutil.move(backupname, filename)
1127 shutil.move(backupname, filenamen)
9691128
9701129 if root:
9711130 os.chdir(prevdir)
10501209
10511210 def patch_stream(self, instream, hunks):
10521211 """ Generator that yields stream patched with hunks iterable
1053
1212
10541213 Converts lineends in hunk lines to the best suitable format
10551214 autodetected from input
10561215 """
10941253 continue
10951254 else:
10961255 if not hline.startswith(b"+"):
1097 get_line()
1256 yield get_line()
10981257 srclineno += 1
1258 continue
10991259 line2write = hline[1:]
11001260 # detect if line ends are consistent in source file
11011261 if sum([bool(lineends[x]) for x in lineends]) == 1:
11031263 yield line2write.rstrip(b"\r\n")+newline
11041264 else: # newlines are mixed
11051265 yield line2write
1106
1266
11071267 for line in instream:
11081268 yield line
11091269
11101270
11111271 def write_hunks(self, srcname, tgtname, hunks):
1112 if len(hunks)==1 and hunks[0].starttgt==0 and hunks[0].linestgt==0:
1113 debug("Removing target file %s" % tgtname)
1114 return True
1115
11161272 src = open(srcname, "rb")
11171273 tgt = open(tgtname, "wb")
11181274
11611317 help="strip N path components from filenames")
11621318 opt.add_option("--revert", action="store_true",
11631319 help="apply patch in reverse order (unpatch)")
1320 opt.add_option("-f", "--fuzz", action="store_true", dest="fuzz", help="Accept fuuzzy patches")
11641321 (options, args) = opt.parse_args()
11651322
11661323 if not args and sys.argv[-1:] != ['--']:
11951352 print(patch.diffstat())
11961353 sys.exit(0)
11971354
1355 if not patch:
1356 error("Could not parse patch")
1357 sys.exit(-1)
1358
11981359 #pprint(patch)
11991360 if options.revert:
12001361 patch.revert(options.strip, root=options.directory) or sys.exit(-1)
12011362 else:
1202 patch.apply(options.strip, root=options.directory) or sys.exit(-1)
1203
1204 # todo: document and test line ends handling logic - patch.py detects proper line-endings
1363 patch.apply(options.strip, root=options.directory, fuzz=options.fuzz) or sys.exit(-1)
1364
1365 # todo: document and test line ends handling logic - patch_ng.py detects proper line-endings
12051366 # for inserted hunks and issues a warning if patched file has incosistent line ends
12061367
12071368
0 From 4df28b1a8bc64ddbc3eaeb921c31a48bd6ce13a0 Mon Sep 17 00:00:00 2001
1 From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
2 Date: Thu, 26 Mar 2020 12:52:22 +0100
3 Subject: [PATCH] Fix build with macOS 10.15 and deployment 10.12
4
5 io/qfilesystemengine_unix.cpp:1420:9: error: 'futimens' is only available on macOS 10.13 or newer [-Werror,-Wunguarded-availability-new]
6 if (futimens(fd, ts) == -1) {
7 ^~~~~~~~
8 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/stat.h:396:9: note: 'futimens' has been marked as being introduced in macOS 10.13 here, but the deployment target is macOS 10.12.0
9 int futimens(int __fd, const struct timespec __times[2]) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0));
10 ^
11 io/qfilesystemengine_unix.cpp:1420:9: note: enclose 'futimens' in a __builtin_available check to silence this warning
12 if (futimens(fd, ts) == -1) {
13 ^~~~~~~~
14
15 Change-Id: Ib52adf7b1ec4f1057d8cb260a00da509429cfaed
16 ---
17 src/corelib/configure.json | 3 ++-
18 1 file changed, 2 insertions(+), 1 deletion(-)
19
20 diff --git x/qtbase/src/corelib/configure.json y/qtbase/src/corelib/configure.json
21 index de8d26a12b..4de6cc19f3 100644
22 --- x/qtbase/src/corelib/configure.json
23 +++ y/qtbase/src/corelib/configure.json
24 @@ -343,7 +343,8 @@
25 "# Block futimens() on Apple platforms unless it's available on ALL",
26 "# deployment targets. This simplifies the logic at the call site",
27 "# dramatically, as it isn't strictly needed compared to futimes().",
28 - "darwin: QMAKE_CXXFLAGS += -Werror=unguarded-availability"
29 + "darwin: QMAKE_CXXFLAGS += -Werror=unguarded-availability -Werror=unguarded-availability-new",
30 + "CONFIG += warn_on"
31 ]
32 }
33 },
34 --
35 2.26.0
36
0 From 8b04c8961fd3b93416674fe03b341b53da974d90 Mon Sep 17 00:00:00 2001
1 From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
2 Date: Tue, 4 Feb 2020 09:37:39 +0100
3 Subject: [PATCH] Fix llvm strip
4
5 Change-Id: If5c5a961757255c4e233b0935887adb6faa3564d
6 ---
7 src/tools/androiddeployqt/main.cpp | 2 +-
8 1 file changed, 1 insertion(+), 1 deletion(-)
9
10 diff --git x/qtbase/src/tools/androiddeployqt/main.cpp y/qtbase/src/tools/androiddeployqt/main.cpp
11 index 6a6f8034e3..332975bca9 100644
12 --- x/qtbase/src/tools/androiddeployqt/main.cpp
13 +++ y/qtbase/src/tools/androiddeployqt/main.cpp
14 @@ -1915,7 +1915,7 @@ bool stripFile(const Options &options, const QString &fileName)
15 }
16
17 if (options.useLLVM)
18 - strip = QString::fromLatin1("%1 -strip-all %2").arg(shellQuote(strip), shellQuote(fileName));
19 + strip = QString::fromLatin1("%1 --strip-all %2").arg(shellQuote(strip), shellQuote(fileName));
20 else
21 strip = QString::fromLatin1("%1 %2").arg(shellQuote(strip), shellQuote(fileName));
22
23 --
24 2.25.0
25
0 From 29435a6a279c8a005aeca72a2079c2f844078822 Mon Sep 17 00:00:00 2001
1 From: Mike Achtelik <mike.achtelik@gmail.com>
2 Date: Thu, 6 Feb 2020 13:14:38 +0100
3 Subject: [PATCH] Handle exceptions when accessing android clipboard
4
5 In some circumstances android throws an exception or returns null,
6 when trying to access the clipboard.
7
8 Fixes: QTBUG-80689
9 Change-Id: I92c134e2a002fc648ff966e15a19eb3307c428a1
10 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
11 ---
12 .../org/qtproject/qt5/android/QtNative.java | 128 +++++++++++-------
13 1 file changed, 78 insertions(+), 50 deletions(-)
14
15 diff --git x/qtbase/src/android/jar/src/org/qtproject/qt5/android/QtNative.java y/qtbase/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
16 index 1d2b70ab5f..a13c233712 100644
17 --- x/qtbase/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
18 +++ y/qtbase/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
19 @@ -724,54 +724,66 @@ public class QtNative
20
21 public static boolean hasClipboardText()
22 {
23 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
24 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
25 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
26 - if (primaryClip.getItemAt(i).getText() != null)
27 - return true;
28 + try {
29 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
30 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
31 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
32 + if (primaryClip.getItemAt(i).getText() != null)
33 + return true;
34 + }
35 + } catch (Exception e) {
36 + Log.e(QtTAG, "Failed to get clipboard data", e);
37 }
38 return false;
39 }
40
41 private static String getClipboardText()
42 {
43 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
44 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
45 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
46 - if (primaryClip.getItemAt(i).getText() != null)
47 - return primaryClip.getItemAt(i).getText().toString();
48 + try {
49 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
50 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
51 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
52 + if (primaryClip.getItemAt(i).getText() != null)
53 + return primaryClip.getItemAt(i).getText().toString();
54 + }
55 + } catch (Exception e) {
56 + Log.e(QtTAG, "Failed to get clipboard data", e);
57 }
58 return "";
59 }
60
61 private static void updatePrimaryClip(ClipData clipData)
62 {
63 - if (m_usePrimaryClip) {
64 - ClipData clip = m_clipboardManager.getPrimaryClip();
65 - if (Build.VERSION.SDK_INT >= 26) {
66 - if (m_addItemMethod == null) {
67 - Class[] cArg = new Class[2];
68 - cArg[0] = ContentResolver.class;
69 - cArg[1] = ClipData.Item.class;
70 + try {
71 + if (m_usePrimaryClip) {
72 + ClipData clip = m_clipboardManager.getPrimaryClip();
73 + if (Build.VERSION.SDK_INT >= 26) {
74 + if (m_addItemMethod == null) {
75 + Class[] cArg = new Class[2];
76 + cArg[0] = ContentResolver.class;
77 + cArg[1] = ClipData.Item.class;
78 + try {
79 + m_addItemMethod = m_clipboardManager.getClass().getMethod("addItem", cArg);
80 + } catch (Exception e) {
81 + }
82 + }
83 + }
84 + if (m_addItemMethod != null) {
85 try {
86 - m_addItemMethod = m_clipboardManager.getClass().getMethod("addItem", cArg);
87 + m_addItemMethod.invoke(m_activity.getContentResolver(), clipData.getItemAt(0));
88 } catch (Exception e) {
89 + e.printStackTrace();
90 }
91 + } else {
92 + clip.addItem(clipData.getItemAt(0));
93 }
94 - }
95 - if (m_addItemMethod != null) {
96 - try {
97 - m_addItemMethod.invoke(m_activity.getContentResolver(), clipData.getItemAt(0));
98 - } catch (Exception e) {
99 - e.printStackTrace();
100 - }
101 + m_clipboardManager.setPrimaryClip(clip);
102 } else {
103 - clip.addItem(clipData.getItemAt(0));
104 + m_clipboardManager.setPrimaryClip(clipData);
105 + m_usePrimaryClip = true;
106 }
107 - m_clipboardManager.setPrimaryClip(clip);
108 - } else {
109 - m_clipboardManager.setPrimaryClip(clipData);
110 - m_usePrimaryClip = true;
111 + } catch (Exception e) {
112 + Log.e(QtTAG, "Failed to set clipboard data", e);
113 }
114 }
115
116 @@ -785,22 +797,30 @@ public class QtNative
117
118 public static boolean hasClipboardHtml()
119 {
120 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
121 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
122 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
123 - if (primaryClip.getItemAt(i).getHtmlText() != null)
124 - return true;
125 + try {
126 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
127 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
128 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
129 + if (primaryClip.getItemAt(i).getHtmlText() != null)
130 + return true;
131 + }
132 + } catch (Exception e) {
133 + Log.e(QtTAG, "Failed to get clipboard data", e);
134 }
135 return false;
136 }
137
138 private static String getClipboardHtml()
139 {
140 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
141 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
142 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
143 - if (primaryClip.getItemAt(i).getHtmlText() != null)
144 - return primaryClip.getItemAt(i).getHtmlText().toString();
145 + try {
146 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
147 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
148 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
149 + if (primaryClip.getItemAt(i).getHtmlText() != null)
150 + return primaryClip.getItemAt(i).getHtmlText().toString();
151 + }
152 + } catch (Exception e) {
153 + Log.e(QtTAG, "Failed to get clipboard data", e);
154 }
155 return "";
156 }
157 @@ -816,11 +836,15 @@ public class QtNative
158
159 public static boolean hasClipboardUri()
160 {
161 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
162 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
163 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
164 - if (primaryClip.getItemAt(i).getUri() != null)
165 - return true;
166 + try {
167 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
168 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
169 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
170 + if (primaryClip.getItemAt(i).getUri() != null)
171 + return true;
172 + }
173 + } catch (Exception e) {
174 + Log.e(QtTAG, "Failed to get clipboard data", e);
175 }
176 return false;
177 }
178 @@ -828,11 +852,15 @@ public class QtNative
179 private static String[] getClipboardUris()
180 {
181 ArrayList<String> uris = new ArrayList<String>();
182 - if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
183 - ClipData primaryClip = m_clipboardManager.getPrimaryClip();
184 - for (int i = 0; i < primaryClip.getItemCount(); ++i)
185 - if (primaryClip.getItemAt(i).getUri() != null)
186 - uris.add(primaryClip.getItemAt(i).getUri().toString());
187 + try {
188 + if (m_clipboardManager != null && m_clipboardManager.hasPrimaryClip()) {
189 + ClipData primaryClip = m_clipboardManager.getPrimaryClip();
190 + for (int i = 0; i < primaryClip.getItemCount(); ++i)
191 + if (primaryClip.getItemAt(i).getUri() != null)
192 + uris.add(primaryClip.getItemAt(i).getUri().toString());
193 + }
194 + } catch (Exception e) {
195 + Log.e(QtTAG, "Failed to get clipboard data", e);
196 }
197 String[] strings = new String[uris.size()];
198 strings = uris.toArray(strings);
199 --
200 2.21.1 (Apple Git-122.3)
201
0 From 682242433d10462b58c53f473eec3f9c0574aee8 Mon Sep 17 00:00:00 2001
1 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <torarnv@gmail.com>
2 Date: Fri, 27 Mar 2020 11:53:35 +0100
3 Subject: Pass SDK root to the linker as -isysroot, not -Wl,-syslibroot
4
5 The former option to clang will result in more options to the linker,
6 such as the newly introduced -platform_version, which writes the
7 SDK version to the resulting binary. By using the syslibroot flag
8 directly we were missing the platform version, and binaries were
9 left without an SDK version set, resulting in failed validation
10 of the binary. Going with the clang driver gives us the right
11 behavior for free.
12
13 Fixes: QTBUG-83100
14 Change-Id: I98bc9ba644dae4bcc7a6a88481556bae185ce5fa
15 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
16 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
17 ---
18 configure | 5 +----
19 mkspecs/features/mac/default_post.prf | 4 ++--
20 2 files changed, 3 insertions(+), 6 deletions(-)
21
22 diff --git x/qtbase/configure y/qtbase/configure
23 index ef7bad1bfc..f9407ef587 100755
24 --- x/qtbase/configure
25 +++ y/qtbase/configure
26 @@ -271,12 +271,9 @@ macSDKify()
27 val=$(echo $sdk_val $(echo $val | cut -s -d ' ' -f 2-))
28 echo "$var=$val"
29 ;;
30 - QMAKE_CFLAGS=*|QMAKE_CXXFLAGS=*)
31 + QMAKE_CFLAGS=*|QMAKE_CXXFLAGS=*|QMAKE_LFLAGS=*)
32 echo "$line -isysroot $sysroot $version_min_flag"
33 ;;
34 - QMAKE_LFLAGS=*)
35 - echo "$line -Wl,-syslibroot,$sysroot $version_min_flag"
36 - ;;
37 *)
38 echo "$line"
39 ;;
40 diff --git x/qtbase/mkspecs/features/mac/default_post.prf y/qtbase/mkspecs/features/mac/default_post.prf
41 index 26bd3e2e98..a2eaf447d2 100644
42 --- x/qtbase/mkspecs/features/mac/default_post.prf
43 +++ y/qtbase/mkspecs/features/mac/default_post.prf
44 @@ -196,7 +196,7 @@ macx-xcode {
45 -isysroot$$xcodeSDKInfo(Path, $$sdk)
46 QMAKE_XARCH_LFLAGS_$${arch} = $$version_min_flags \
47 -Xarch_$${arch} \
48 - -Wl,-syslibroot,$$xcodeSDKInfo(Path, $$sdk)
49 + -isysroot$$xcodeSDKInfo(Path, $$sdk)
50
51 QMAKE_XARCH_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
52 QMAKE_XARCH_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS_$${arch})
53 @@ -217,7 +217,7 @@ macx-xcode {
54 version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
55 QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
56 QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
57 - QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag
58 + QMAKE_LFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
59 }
60
61 # Enable precompiled headers for multiple architectures
62 --
63 2.26.0
64
0 From 8beb047fdda99325cdecfbf15b6ce3f5b5ef5ffc Mon Sep 17 00:00:00 2001
1 From: Kai Koehne <kai.koehne@qt.io>
2 Date: Thu, 7 May 2020 10:35:35 +0200
3 Subject: [PATCH] Port python check to configure system
4
5 Also check for py, python2, python3 executables.
6
7 Task-number: QTBUG-72926
8 Fixes: QTBUG-84038
9 Pick-to: 5.15
10 Change-Id: I844db4dd630d9b3025eca529ee57565b600ebbac
11 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
12 ---
13 qtdeclarative.pro | 8 --------
14 src/3rdparty/masm/masm.pri | 4 ++--
15 src/qml/configure.json | 21 +++++++++++++++++++++
16 src/qml/configure.pri | 22 ++++++++++++++++++++++
17 src/qml/qml.pro | 6 +++++-
18 5 files changed, 50 insertions(+), 11 deletions(-)
19 create mode 100644 src/qml/configure.pri
20
21 diff --git x/qtdeclarative/qtdeclarative.pro y/qtdeclarative/qtdeclarative.pro
22 index 5b94da9b69..e924331929 100644
23 --- x/qtdeclarative/qtdeclarative.pro
24 +++ y/qtdeclarative/qtdeclarative.pro
25 @@ -1,10 +1,2 @@
26 CONFIG += tests_need_tools examples_need_tools
27 load(qt_parts)
28 -
29 -!python_available {
30 - py_out = $$system('python -c "print(1)"')
31 - !equals(py_out, 1): error("Building QtQml requires Python.")
32 - tmp = python_available
33 - CONFIG += $$tmp
34 - cache(CONFIG, add, tmp)
35 -}
36 diff --git x/qtdeclarative/src/3rdparty/masm/masm.pri y/qtdeclarative/src/3rdparty/masm/masm.pri
37 index 0e63ac2ce5..00b5aac9f8 100644
38 --- x/qtdeclarative/src/3rdparty/masm/masm.pri
39 +++ y/qtdeclarative/src/3rdparty/masm/masm.pri
40 @@ -58,7 +58,7 @@ contains(DEFINES, WTF_USE_UDIS86=1) {
41 udis86.output = udis86_itab.h
42 udis86.input = ITAB
43 udis86.CONFIG += no_link
44 - udis86.commands = python $$PWD/disassembler/udis86/itab.py ${QMAKE_FILE_IN}
45 + udis86.commands = $$QMAKE_PYTHON $$PWD/disassembler/udis86/itab.py ${QMAKE_FILE_IN}
46 QMAKE_EXTRA_COMPILERS += udis86
47
48 udis86_tab_cfile.target = $$OUT_PWD/udis86_itab.c
49 @@ -113,7 +113,7 @@ retgen.output = $$GENERATEDDIR/RegExpJitTables.h
50 retgen.script = $$PWD/yarr/create_regex_tables
51 retgen.input = retgen.script
52 retgen.CONFIG += no_link
53 -retgen.commands = python $$retgen.script > ${QMAKE_FILE_OUT}
54 +retgen.commands = $$QMAKE_PYTHON $$retgen.script > ${QMAKE_FILE_OUT}
55 QMAKE_EXTRA_COMPILERS += retgen
56
57 # Taken from WebKit/Tools/qmake/mkspecs/features/unix/default_post.prf
58 diff --git x/qtdeclarative/src/qml/configure.json y/qtdeclarative/src/qml/configure.json
59 index 17d1f800ac..3e773651b3 100644
60 --- x/qtdeclarative/src/qml/configure.json
61 +++ y/qtdeclarative/src/qml/configure.json
62 @@ -23,6 +23,11 @@
63 ],
64 "qmake": "CONFIG += c++11"
65 }
66 + },
67 + "qml-python": {
68 + "label": "python",
69 + "type": "detectPython",
70 + "log": "location"
71 }
72 },
73
74 @@ -123,9 +128,25 @@
75 "section": "QML",
76 "condition": "features.thread",
77 "output": [ "privateFeature" ]
78 + },
79 + "qml-python": {
80 + "label": "python",
81 + "condition": "tests.qml-python",
82 + "output": [
83 + "privateFeature",
84 + { "type": "varAssign", "name": "QMAKE_PYTHON", "value": "tests.qml-python.location" }
85 + ]
86 }
87 },
88
89 + "report": [
90 + {
91 + "type": "error",
92 + "condition": "!features.qml-python",
93 + "message": "Python is required to build QtQml."
94 + }
95 + ],
96 +
97 "summary": [
98 {
99 "section": "Qt QML",
100 diff --git x/qtdeclarative/src/qml/configure.pri y/qtdeclarative/src/qml/configure.pri
101 new file mode 100644
102 index 0000000000..2ab5f9454d
103 --- /dev/null
104 +++ y/qtdeclarative/src/qml/configure.pri
105 @@ -0,0 +1,22 @@
106 +equals(QMAKE_HOST.os, Windows): EXE_SUFFIX = .exe
107 +
108 +defineTest(qtConfTest_detectPython) {
109 + PYTHON_NAMES = python$$EXE_SUFFIX python2$${EXE_SUFFIX} python3$${EXE_SUFFIX} py$${EXE_SUFFIX}
110 + for (name, PYTHON_NAMES) {
111 + python_path = $$qtConfFindInPath("$$name")
112 + !isEmpty(python_path): \
113 + break()
114 + }
115 + isEmpty(python_path) {
116 + qtLog("No $$PYTHON_NAMES are found in PATH. Giving up.")
117 + return(false)
118 + }
119 +
120 + # Make tests.python.location available in configure.json.
121 + $${1}.location = $$shell_path($$python_path)
122 + export($${1}.location)
123 + $${1}.cache += location
124 + export($${1}.cache)
125 +
126 + return(true)
127 +}
128 diff --git x/qtdeclarative/src/qml/qml.pro y/qtdeclarative/src/qml/qml.pro
129 index d2170ac40b..390c9e5990 100644
130 --- x/qtdeclarative/src/qml/qml.pro
131 +++ y/qtdeclarative/src/qml/qml.pro
132 @@ -7,6 +7,9 @@ qtConfig(qml-network): \
133 TRACEPOINT_PROVIDER = $$PWD/qtqml.tracepoints
134 CONFIG += qt_tracepoints
135
136 +!qtConfig(qml-python): \
137 + error(Python is required to build QtQml.)
138 +
139 DEFINES += QT_NO_URL_CAST_FROM_STRING QT_NO_INTEGER_EVENT_COORDINATES
140
141 msvc:equals(QT_ARCH, i386): QMAKE_LFLAGS += /BASE:0x66000000
142 @@ -81,8 +84,9 @@ qtConfig(qml-animation) {
143 }
144 include(types/types.pri)
145 include(../3rdparty/masm/masm-defs.pri)
146 -include(../3rdparty/masm/masm.pri)
147
148 MODULE_PLUGIN_TYPES = \
149 qmltooling
150 load(qt_module)
151 +
152 +include(../3rdparty/masm/masm.pri)
153 --
154 2.26.2
155
1111
1212 SET(QRC_FILES "ausweisapp.qrc")
1313
14 IF(IOS OR ANDROID OR ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
14 IF(IOS OR ANDROID OR CMAKE_BUILD_TYPE STREQUAL "DEBUG")
1515 LIST(APPEND QRC_FILES "ausweisapp_mobile.qrc")
1616 ENDIF()
1717
11 # LSAN_OPTIONS=suppressions=/home/dev/AusweisApp2.src/resources/asan_blacklist ./AusweisApp2
22
33 leak:g_malloc*
4 leak:CRYPTO_malloc
54 leak:libxcb*
65 leak:QQuick*
76 leak:QKde*
1313 <file>images/html_message_section.jpg</file>
1414 <file>images/search_icon.svg</file>
1515 <file>images/search_cancel.svg</file>
16 <file>images/macos/appIcon.svg</file>
1617 <file>images/desktop/bell.svg</file>
1718 <file>images/desktop/id_card.png</file>
1819 <file>images/desktop/pin_letter_pinpuk_different_page.svg</file>
1212 <file>images/android/navigation/bewerten.svg</file>
1313 <file>images/android/navigation/tutorial.svg</file>
1414 <file>images/android/search_icon.svg</file>
15 <file>images/android/stay_primary_landscape-24px.svg</file>
16 <file>images/android/stay_primary_portrait-24px.svg</file>
1517 <file>images/iOS/search_icon.svg</file>
1618 <file>images/iOS/search_cancel.svg</file>
1719 <file>images/iOS/more/icon_mehr_settings.svg</file>
4141 "_comment_5": "array of certificates for checking the authenticity of updates; DER format, hex encoded",
4242 "updateCertificates": [
4343 "3082083a30820722a003020102020900d5b6a4dc1fd8854a300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3137313230313130343733325a170d3230313230363233353935395a308180310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a382035430820350301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202308201030603551d1f0481fb3081f83040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c3081b3a081b0a081ad8681aa6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f43657274696669636174655265766f636174696f6e4c6973743082014906082b060105050701010482013b30820137303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e6365723081ab06082b0601050507300286819e6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f63414365727469666963617465300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465300d06092a864886f70d01010b050003820101006376f829a32345d2d590176bf2294d9ab6fe44e6c7db3b467bd597eebda4121d6e8795ec33de253ff9f271857c4a1ddf4b80b080464a51741a53de5137be13fc482e41b3649afbb571bfec2a894022d933ca60c691a99f31fe40209e7ca2e7fcd15d33baf8c1d20e107750cbd8628bc883af062a622f29c36574decaf97ef00471bbbe81380042ab82e46788491e4f77e58168f154d5210748263bfb8b2c3c82937436f758e1b2360c22458803a304eb90a4617bdcaa591176f4002e63dce3c9a3c7dcec83472dec70346544105118227fce63bae6a6686950846f65f30de621c1e5d6b7b20f3ce7d8ebbd95667c89123adb9efcbdd5ea1ba6e71b152bea43d3",
44 "308209bd308208a5a003020102021038c4a7f3fe70d99c56f0df1ebef6a97d300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3230303631373038303034345a170d3232303632323233353935395a308180310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a38204d0308204cc301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202304b0603551d1f044430423040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c30819906082b0601050507010104818c308189303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e636572300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465308202e3060a2b06010401d679020402048202d3048202cf02cd0075006f5376ac31f03119d89900a45115ff77151c11d902c10029068db2089a37d91300000172c14b6a75000004030046304402202a43e32288685dcf68d5aeb92d57b872add7cc72996c76a5ad6239f079f74ec302200ec88ef96b0d9ca431ecefa02bc0e0df93da47e65a74464db22587fcdaec93b900760046a555eb75fa912030b5a28969f4f37d112c4174befd49b885abf2fc70fe6d4700000172c14b6a370000040300473045022100ed6c7e61ef499e52db80e98952929af88a2caf8ea145ef0be18e6a4f03b6055d022034b2ed865610ba163b2271511e0d06b0a4e1d93719b2179be250d68b7ebb2f680075002979bef09e393921f056739f63a577e5be577d9c600af8f94d5d265c255dc78400000172c14b6a6b00000403004630440220474c62e50c058e3145b7a0f07c3b7487f84e71f5c4eadc0f818c169f73c786c1022028d88d20e6752bd3115228b8f60c9a1d2827cc7a3bd9efbc99b141dbeb9e71e600770041c8cab1df22464a10c6a13a0942875e4e318b1b03ebeb4bc768f090629606f600000172c14b6b2e0000040300483046022100b41d0dc708e20b24b410e49182ddcd2d61f9fb57fbccf9db4869389697ba596c022100e643f804f2405057e18fe387bcedef3e55e4cd4afa97a78da8e4fdfcf62b5d3b0075005581d4c2169036014aea0b9b573c53f0c0e43878702508172fa3aa1d0713d30c00000172c14b6b7e000004030046304402207056254b251f9e726b7dbe5e9e747abd4a19a54a1dffb1923d0b77e97a1bd70702204cbd7a226661bf21f2544f65f4a8b8d5703771f6c65c5c7468f3370e216e08c80075002245450759552456963fa12ff1f76d86e0232663adc04b7f5dc6835c6ee20f0200000172c14b6c7200000403004630440220117f1c9168138721382af8f67d14b431c9cd4d42d4dedf78dcd5cf4c0e202a1f022027a1647c220aaba18dc27e7e3d8a95af349ab677061c41ce727d187290881a4d300d06092a864886f70d01010b05000382010100c71fe410a8bb145abc060c364bd8585d29cc1c3f594781a99e713d72b997f08a84679246b239ce499d920fc8cb18469e79b00511754a9c27193776fe790ec36a3489cb3f1f4f1389fd04cb69709c81e00ba2b207fae4158ddab46eed546ecb5a8881fc4f189ba9ec4eece3d342a57e6e98636faf96bf71681aba0da23239c005475d2aabdb07ff5a8539bb357fd9493a3b4c8decf73804c66347d0d85600abfacdee45c3cf818ada8aaed31a4653ddb8fa1361f82babde55f461ce8faadd97e6d30f8c5c459bd0531b87ed6ad2d580f65733664fa0345b138f45207fcd32270cf8be035ce5078b438d0b47d17e9f3424a40b3f627d7b77dc9e1af1725f151ffd",
4445 "3082093a30820822a0030201020210042e5dd11e0c69cdec3882747019081c300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3139303330373131343530325a170d3231303331323233353935395a3074310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e3113301106035504030c0a2a2e676f766b672e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100b03a180c094b52a862ef5fce194147f705d3340d79282a103a14d14fabe3d849a62df93b5f09eed3ad60e6ae5570a3823370aeeb888df9e0fc9a513be26308d783cc7cefd4ef43337e2c854b03ef399c647a19d31c39fe2b1d08c9cc27462ba5e43bc97e494ac62059496579967fa3fe8b1111e016d6dd37eda00e5617bb571cbb042e6750d17dd3acf1055b8dd6a1130214992a673bfc671e2586355378dfbb14a2910d37faa221178cb2dba0e87544ed6acbb2344ac439dbd16c05e1c0f76fa757305c0c38f3ccab420fd49603717986c8d748ce4ea2863260da6a832df53bb6247ada2431239b0a9815b89d6bb0f58a4da508695637c0b10368260cbf7dd8d469fb81d21b560a25125e9cfc8ae09a8b9e7a1cc688a8e49c045f1dc397a7c28e637b11c5205d8375ccfb627b071a813665de2fe172de97671dfecce44d9545a6f083cff4c7e2df4780b9073b19ca93b97561ca0c9bc5687ec0a1de993b199eca2576e820f26ce043fbab092f6e0bbc510b14d4b2489733e28cd38f40928cce16f4f3b6bba6277cff19312ad5771507ae729b6c083924c53d1c1fc33e370af1a0060307b3ef83880886334133c2e645bbf7f14a26acbce1609daceac1ed8d5d2bff8d8ed095a7af79f608134256f1e4a34650225595dd9fa5746448417d7a2f8f0c5ef001b5e4780e6d8caf818b314fb708447f70f3844d39a7ff437ebbf6a70203010001a382045a30820456301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e04160414db05538bd26c0bea1bcb5cde439b81e6ab8aa40b305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202304b0603551d1f044430423040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c30819906082b0601050507010104818c308189303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e636572300c0603551d130101ff04023000301f0603551d1104183016820a2a2e676f766b672e64658208676f766b672e64653082026f060a2b06010401d6790204020482025f0482025b02590076006f5376ac31f03119d89900a45115ff77151c11d902c10029068db2089a37d9130000016957f896900000040300473045022046b42ef57f79c932690c6558eb52f354b8e4f5c49c7dc50616a351dbbe823785022100957c17a3f70a7ee20a920a29bb123e186b425a4c0c4dbd5372ab5163abe88284007600ee4bbdb775ce60bae142691fabe19e66a30f7e5fb072d88300c47b897aa8fdcb0000016957f89686000004030047304502210085921f55932ee2b42b7b6cd1b9627f9d376485024210f8f4358d60ebc25b6d6d022069f72703fc8d7added3f8cc041aee457d011e22425ecdfbebcfd1b312c0ad6220077005581d4c2169036014aea0b9b573c53f0c0e43878702508172fa3aa1d0713d30c0000016957f897e400000403004830460221009c4b1fdcfde4bacba79665a77da038ab42399578dbc80c9ce21ab5054217edf2022100d23970d124e0f1ee384f6cc2e53d76df6069190dc91b9be5be24219898081ad9007600a4b90990b418581487bb13a2cc67700a3c359804f91bdfb8e377cd0ec80ddc100000016957f8968c000004030047304502210099ca67064864c67ab92b4f13c11fd8be58453585f80e4e3d9a1d18a191aba1670220603bc43ad9700dd891e1bb135b2cd0fad041a6f63bed0d9c778a3e96d6082f33007600bbd9dfbc1f8a71b593942397aa927b473857950aab52e81a909664368e1ed1850000016957f896870000040300473045022100e6810cf7ec2ee244d5ae516246973f46c7710bf075c923b21451abc6622b9dee02202ccd410f907ba8176bcb12198f1b0821cf95a550e2486a0292cadca7a670dac2300d06092a864886f70d01010b05000382010100103ab77dff430d59dcd9d5c94b9c2ea44d829d0a70777c42a137ea627eca87881ce9131f00ea7282f7fe7cd7ac8f154f84622023183aac3f02ce4a5925cfb771961e114b78cec3950c0a4aa7726c01ba69c60cf3a4c68ea63e92f8dd0bf2f1e033bb91c536df9945ba281abae1bde75f920f94df2fa2c2ff708a57291114889e374eb9c8f7da0bb8a0d19bda964b3ac32e174cbb9d956c9693f0a6326a80d7019cbc8e54949981d5bf231f85c6ff5be5bc0fcaeb637bf84a8be424ebe2cefdef4c89d2a4682efda5c8010e432977d26e6f30e7e9ed13f612fea99dbd9799e6460ca780a109ff3dc7a86887479832baac8589aebeadf50759077aadfd2d467d06"
4546 ],
4647
171172 },
172173
173174 "updateServer": {
174 "baseUrl": "@REMOTE_CONFIG_URL@/updatable-files"
175 "baseUrl": "@REMOTE_CONFIG_URL_PROD@/updatable-files"
175176 },
176177
177178 "whitelistServer": {
0 <?xml version="1.0" encoding="UTF-8" ?>
1 <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24">
2 <path d="M0 0h24v24H0z" fill="none" />
3 <path d="M1.01 7L1 17c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2H3c-1.1 0-1.99.9-1.99 2zM19 7v10H5V7h14z" />
4 </svg>
0 <?xml version="1.0" encoding="UTF-8" ?>
1 <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24">
2 <path d="M0 0h24v24H0z" fill="none" />
3 <path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z" />
4 </svg>
resources/images/bundle_icons.icns less more
Binary diff not shown
resources/images/dmg_background.png less more
Binary diff not shown
resources/images/dmg_icons.icns less more
Binary diff not shown
0 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
1 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" viewBox="-4 -4 45 45">
2 <defs>
3 <linearGradient x1="0" y1="0" x2="1" y2="0" id="greenGradient1">
4 <stop style="stop-color:#58ab27;stop-opacity:1" offset="0" />
5 <stop style="stop-color:#93c36c;stop-opacity:1" offset="0.78019702" />
6 </linearGradient>
7 <linearGradient x1="0" y1="0" x2="1" y2="0" id="greenGradient2" xlink:href="#greenGradient1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-26.61169,26.61169,0,5.06287,31.67544)" spreadMethod="pad" />
8 <linearGradient x1="0" y1="0" x2="1" y2="0" id="blueGradient1">
9 <stop style="stop-color:#88bce2;stop-opacity:1" offset="0" />
10 <stop style="stop-color:#5489c2;stop-opacity:1" offset="1" />
11 </linearGradient>
12 <linearGradient x1="0" y1="0" x2="1" y2="0" id="blueGradient2" xlink:href="#blueGradient1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,26.61169,26.61169,0,19.60739,5.06376)" spreadMethod="pad" />
13 </defs>
14 <rect x="0.55" y="0.55" width="35.9" height="35.9" rx="4.45" ry="4.45" style="fill:#FFFFFF; stroke-width:1.1; stroke:#5489c2;" />
15 <path d="M 17.25 5.058 v 4.832 a 8.7 8.7 0 0 0 0 17.22 v 4.832 a 13.5 13.5 0 0 1 0 -26.884 z" style="fill:url(#greenGradient2);" />
16 <path d="M 19.75 5.058 v 4.832 a 8.7 8.7 0 0 1 0 17.22 v 4.832 a 13.5 13.5 0 0 0 0 -26.884 z" style="fill:url(#blueGradient2);" />
17 </svg>
Binary diff not shown
0 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
1 <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="768" height="768" viewBox="0 0 37 37" id="svg2696">
2 <defs id="defs2698">
3 <linearGradient x1="0" y1="0" x2="1" y2="0" id="linearGradient2559">
4 <stop style="stop-color:#58ab27;stop-opacity:1" offset="0"/>
5 <stop style="stop-color:#93c36c;stop-opacity:1" offset="0.78019702"/>
0 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
1 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="768" height="768" viewBox="0 0 37 37">
2 <defs>
3 <linearGradient x1="0" y1="0" x2="1" y2="0" id="greenGradient1">
4 <stop style="stop-color:#58ab27;stop-opacity:1" offset="0" />
5 <stop style="stop-color:#93c36c;stop-opacity:1" offset="0.78019702" />
66 </linearGradient>
7 <linearGradient x1="0" y1="0" x2="1" y2="0" id="linearGradient2688" xlink:href="#linearGradient2559" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-26.61169,26.61169,0,5.06287,31.67544)" spreadMethod="pad"/>
8 <linearGradient x1="0" y1="0" x2="1" y2="0" id="linearGradient2583">
9 <stop style="stop-color:#88bce2;stop-opacity:1" offset="0"/>
10 <stop style="stop-color:#5489c2;stop-opacity:1" offset="1"/>
7 <linearGradient x1="0" y1="0" x2="1" y2="0" id="greenGradient2" xlink:href="#greenGradient1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-26.61169,26.61169,0,5.06287,31.67544)" spreadMethod="pad" />
8 <linearGradient x1="0" y1="0" x2="1" y2="0" id="blueGradient1">
9 <stop style="stop-color:#88bce2;stop-opacity:1" offset="0" />
10 <stop style="stop-color:#5489c2;stop-opacity:1" offset="1" />
1111 </linearGradient>
12 <linearGradient x1="0" y1="0" x2="1" y2="0" id="linearGradient2683" xlink:href="#linearGradient2583" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,26.61169,26.61169,0,19.60739,5.06376)" spreadMethod="pad"/>
12 <linearGradient x1="0" y1="0" x2="1" y2="0" id="blueGradient2" xlink:href="#blueGradient1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,26.61169,26.61169,0,19.60739,5.06376)" spreadMethod="pad" />
1313 </defs>
14 <rect x="0" y="0" width="37" height="37" rx="5" ry="5" style="fill:#5489c2" />
15 <rect x="1.1" y="1.1" width="34.8" height="34.8" rx="3.9" ry="3.9" style="fill:#ffffff" />
16 <path d="M 18.5 5 L 18.5 9.8 A 8.7 8.7 0 0 0 18.5 27.2 L 18.5 32 A 13.5 13.5 0 0 1 18.5 5" style="fill:url(#linearGradient2688);stroke:none"/>
17 <path d="M 18.5 5 L 18.5 9.8 A 8.7 8.7 0 0 1 18.5 27.2 L 18.5 32 A 13.5 13.5 0 0 0 18.5 5" style="fill:url(#linearGradient2683);stroke:none"/>
18 <rect x="17.25" y="4" width="2.5" height="30" style="fill:#ffffff" />
14 <rect x="0.55" y="0.55" width="35.9" height="35.9" rx="4.45" ry="4.45" style="fill:#FFFFFF; stroke-width:1.1; stroke:#5489c2;" />
15 <path d="M 17.25 5.058 v 4.832 a 8.7 8.7 0 0 0 0 17.22 v 4.832 a 13.5 13.5 0 0 1 0 -26.884 z" style="fill:url(#greenGradient2);" />
16 <path d="M 19.75 5.058 v 4.832 a 8.7 8.7 0 0 1 0 17.22 v 4.832 a 13.5 13.5 0 0 0 0 -26.884 z" style="fill:url(#blueGradient2);" />
1917 </svg>
resources/images/npa_docs.png less more
Binary diff not shown
11 MAINTAINER Governikus KG <ausweisapp2@governikus.com>
22
33 ARG ANDROID_SDK_TOOLS=4333796
4 ARG ANDROID_NDK_VERSION=r18b
4 ARG ANDROID_NDK_VERSION=r21d
5 ARG CMAKE=3.17.3
56 ENV NAME=Android LABELS="Android" PACKAGES_DIR=/home/governikus/packages
67
78 RUN apt-get update && \
8 apt-get -y install g++ cmake make ccache ninja-build perl unzip gradle maven patch openjdk-8-jdk-headless && \
9 apt-get -y install g++ make ccache ninja-build perl unzip gradle maven patch openjdk-8-jdk-headless && \
910 ln -s /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk && \
1011 rm -rf /var/lib/apt/lists/*
12
13 # CMake 3.16 is required for NDK r19+
14 RUN wget https://github.com/Kitware/CMake/releases/download/v$CMAKE/cmake-$CMAKE-Linux-x86_64.sh -O /tmp/cmake.sh && \
15 sh /tmp/cmake.sh --prefix=/usr --skip-license --exclude-subdir && rm /tmp/cmake.sh
1116
1217 ENV ANDROID_HOME /opt/android-sdk
1318 RUN mkdir -p /tmp/dl/sdk && cd /tmp/dl/sdk && wget -O sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-$ANDROID_SDK_TOOLS.zip && \
1419 unzip sdk.zip && mkdir -p $ANDROID_HOME && mv tools/ $ANDROID_HOME
15 RUN yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;29.0.2" "platform-tools" "platforms;android-29"
20 RUN yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;29.0.3" "platform-tools" "platforms;android-29"
1621
1722 ENV ANDROID_NDK_HOME /opt/android-ndk
1823 ENV ANDROID_NDK=${ANDROID_NDK_HOME}
22
33 ENV NAME=Docs LABELS=Docs
44
5 RUN apk --no-cache add cmake make py3-sphinx py3-setuptools icu-libs poppler zziplib texlive-full && \
6 pip3 install doc8 cloud_sptheme
5 RUN apk --no-cache add cmake make py3-pip py3-sphinx py3-setuptools icu poppler zziplib enscript ghostscript texlive-full && \
6 pip3 install doc8 cloud_sptheme sphinx_rtd_theme
77
88 USER governikus
99
22
33 ENV NAME=Linux LABELS="Linux g++ clang++" PACKAGES_DIR=/home/governikus/packages
44
5 RUN apk --no-cache add cmake make g++ clang clang-analyzer ccache gcovr cloc cppcheck pkgconf ninja pcsc-lite-dev binutils-gold lld \
6 py3-setuptools mesa-dev libx11-dev libxkbcommon-dev xcb-util-wm-dev xcb-util-image-dev xcb-util-keysyms-dev && \
5 RUN apk --no-cache add cmake make g++ clang clang-analyzer ccache gcovr cloc clazy cppcheck pkgconf ninja pcsc-lite-dev binutils-gold lld \
6 py3-setuptools py3-jsonschema mesa-dev libx11-dev libxkbcommon-dev xcb-util-wm-dev xcb-util-image-dev xcb-util-keysyms-dev && \
77 ln -s /usr/libexec/c++-analyzer /usr/local/bin && ln -s /usr/libexec/ccc-analyzer /usr/local/bin
88
99 USER governikus
0 FROM alpine:3.11
0 FROM alpine:3.12
11 MAINTAINER Governikus KG <ausweisapp2@governikus.com>
22
3 ARG JENKINS_SWARM_VERSION=3.17
3 ARG JENKINS_SWARM_VERSION=3.21
44 ENV EXECUTOR=3 LABELS= NAME= PASSWORD=
55
66 RUN adduser governikus -s /bin/sh -D
7 RUN apk --no-cache add openjdk8-jre tini mercurial py3-hglib wget && \
8 ln -s /usr/bin/python3 /usr/bin/python
7 RUN apk --no-cache add openjdk8-jre tini mercurial py3-hglib wget
98 RUN wget -O /swarm-client.jar https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/swarm-client/$JENKINS_SWARM_VERSION/swarm-client-$JENKINS_SWARM_VERSION.jar
109
1110 ADD swarm.sh /
0 FROM ubuntu:19.04
0 FROM ubuntu:20.04
11 MAINTAINER Governikus KG <ausweisapp2@governikus.com>
22
3 ARG JENKINS_SWARM_VERSION=3.17
3 ARG JENKINS_SWARM_VERSION=3.21
44 ENV EXECUTOR=3 LABELS= NAME= PASSWORD=
55
66 RUN useradd -m governikus
77 RUN apt-get update && \
8 apt-get -y install openjdk-8-jre-headless tini mercurial python-hglib wget && \
8 apt-get -y install openjdk-8-jre-headless tini python3-pip wget && \
9 pip3 install rbtools mercurial python-hglib && \
910 rm -rf /var/lib/apt/lists/*
1011 RUN wget -O /swarm-client.jar https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/swarm-client/$JENKINS_SWARM_VERSION/swarm-client-$JENKINS_SWARM_VERSION.jar
1112
0 FROM ubuntu:swarm
1 MAINTAINER Governikus KG <ausweisapp2@governikus.com>
2
3 ENV NAME=Vanilla LABELS="Vanilla"
4 ENV DEBIAN_FRONTEND noninteractive
5
6 RUN apt-get update && \
7 apt-get -y install cmake make g++ clazy clang clang-tidy ccache gcovr cloc pkg-config ninja-build binutils-gold lld \
8 tree libpcsclite-dev libhttp-parser-dev libssl-dev libudev-dev \
9 qml-module-qt-labs-platform qml-module-qtquick-controls2 qml-module-qtquick-controls2 qml-module-qttest \
10 qml-module-qtgraphicaleffects qml-module-qtquick-layouts qml-module-qtqml-models2 \
11 qtdeclarative5-dev qtquickcontrols2-5-dev qttools5-dev libqt5svg5-dev \
12 libqt5websockets5-dev qtconnectivity5-dev && \
13 rm -rf /var/lib/apt/lists/*
14
15 USER governikus
16 RUN mkdir -p /home/governikus/.ccache && mkdir -p /home/governikus/workspace
17
18 ENTRYPOINT ["/usr/bin/tini", "--"]
19 CMD /swarm.sh
1111 name: 'Android_APK_' + ARCH,
1212 libraries: ['Android_' + ARCH],
1313 label: 'Android',
14 artifacts: 'build/dist/**/AusweisApp2-*.apk,build/debug.symbols/**/libAusweisApp2.so'
14 artifacts: 'build/dist/**/AusweisApp2-*.apk,build/debug.symbols/libAusweisApp2-*.so'
1515 ).generate(this)
1616
1717
6262 name: 'Android_AAR',
6363 libraries: neededLibraries,
6464 label: 'Android',
65 artifacts: 'build/**/dist/**/ausweisapp-*.aar,build/**/dist/**/ausweisapp-*.pom,build/**/dist/**/ausweisapp-*.jar,build/dist/libs/**/debug.symbols/libAusweisApp2.so'
65 artifacts: 'build/**/dist/**/ausweisapp-*.aar,build/**/dist/**/ausweisapp-*.pom,build/**/dist/**/ausweisapp-*.jar,build/**/debug.symbols/libAusweisApp2-*.so'
6666 ).generate(this)
6767
6868
33 (
44 name: 'Docs',
55 label: 'Docs',
6 artifacts: 'build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
6 artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
77 ).generate(this)
88
99
2626 shell('cd build; make inte.latex.pdf')
2727
2828 shell('cd build; make doc8')
29
30 shell('cd build; make license')
2931 }
3032 }
1111 name: 'Android_APK_' + ARCH,
1212 libraries: ['Android_' + ARCH],
1313 label: 'Android',
14 artifacts: 'build/dist/**/AusweisApp2-*.apk,build/debug.symbols/**/libAusweisApp2.so'
14 artifacts: 'build/dist/**/AusweisApp2-*.apk,build/debug.symbols/libAusweisApp2-*.so'
1515 ).generate(this)
1616
1717
6161 name: 'Android_AAR',
6262 libraries: neededLibraries,
6363 label: 'Android',
64 artifacts: 'build/**/dist/**/ausweisapp-*.aar,build/**/dist/**/ausweisapp-*.pom,build/**/dist/**/ausweisapp-*.jar,build/dist/libs/**/debug.symbols/libAusweisApp2.so'
64 artifacts: 'build/**/dist/**/ausweisapp-*.aar,build/**/dist/**/ausweisapp-*.pom,build/**/dist/**/ausweisapp-*.jar,build/**/debug.symbols/libAusweisApp2-*.so'
6565 ).generate(this)
6666
6767 j.with
33 (
44 name: 'Docs',
55 label: 'Docs',
6 artifacts: 'build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
6 artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
77 ).generate(this)
88
99
2929 shell('cd build; make inst.latex.pdf')
3030
3131 shell('cd build; make inte.latex.pdf')
32
33 shell('cd build; make license')
3234 }
3335 }
1919 {
2020 steps
2121 {
22 shell('cd source; python resources/jenkins/import.py')
22 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
2323
2424 shell(strip("""\
2525 cd build;
6868 {
6969 steps
7070 {
71 shell('cd source; python resources/jenkins/import.py')
71 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
7272 }
7373 }
7474
33 (
44 name: 'Docs',
55 label: 'Docs',
6 artifacts: 'build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
6 artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html'
77 ).generate(this)
88
99
1313
1414 steps
1515 {
16 shell('cd source; python resources/jenkins/import.py')
16 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1717
1818 shell('cd build; cmake -Werror=dev ../source -DCMAKE_BUILD_TYPE=release -Dtools.only=true')
1919
3030 shell('cd build; make inte.latex.pdf')
3131
3232 shell('cd build; make doc8')
33
34 shell('cd build; make license')
3335 }
3436 }
2323
2424 steps
2525 {
26 shell('cd source; python resources/jenkins/import.py')
26 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
2727
2828 shell(strip('''\
2929 cd build;
1414 {
1515 steps
1616 {
17 shell('cd source; python resources/jenkins/import.py')
17 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1818
1919 shell("cd build; cmake ../source/libs -DCMAKE_BUILD_TYPE=release -DCMAKE_TOOLCHAIN_FILE=../source/cmake/android.toolchain.cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DPACKAGES_DIR=\${PACKAGES_DIR} -DCMAKE_ANDROID_ARCH_ABI=${ARCH}")
2020
1010 {
1111 steps
1212 {
13 shell('cd source; python resources/jenkins/import.py')
13 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1414
1515 shell("cd build; cmake ../source/libs -DCMAKE_BUILD_TYPE=debug -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DPACKAGES_DIR=\${PACKAGES_DIR}")
1616
1010 {
1111 steps
1212 {
13 shell('cd source; python resources/jenkins/import.py')
13 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1414
1515 shell("cd build; cmake ../source/libs -DCMAKE_BUILD_TYPE=release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DPACKAGES_DIR=\${PACKAGES_DIR}")
1616
1010 {
1111 steps
1212 {
13 shell('cd source; python resources/jenkins/import.py')
13 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1414
1515 shell("cd build; cmake ../source/libs -DCMAKE_BUILD_TYPE=release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DPACKAGES_DIR=\${PACKAGES_DIR}")
1616
1818
1919 steps
2020 {
21 batchFile('cd source & python resources/jenkins/import.py')
21 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
2222
2323 batchFile("cd build & cmake ../source/libs -DCMAKE_BUILD_TYPE=release -DPACKAGES_DIR=%PACKAGES_DIR% -G\"MinGW Makefiles\" -DWIN_SIGN_KEYSTORE=%WIN_SIGN_KEYSTORE% -DWIN_SIGN_KEYSTORE_PSW=%WIN_SIGN_KEYSTORE_PSW% -DWIN_SIGN_SUBJECT_NAME=%WIN_SIGN_SUBJECT_NAME%")
2424
1010 {
1111 steps
1212 {
13 batchFile('cd source & python resources/jenkins/import.py')
13 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1414
1515 batchFile('''\
1616 cd build
1010 {
1111 steps
1212 {
13 shell('cd source; python resources/jenkins/import.py')
13 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1414
1515 shell('security unlock-keychain \${KEYCHAIN_CREDENTIALS} \${HOME}/Library/Keychains/login.keychain-db')
1616
3030
3131 steps
3232 {
33 shell('cd source; python resources/jenkins/import.py')
33 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
3434
3535 shell(strip('''\
3636 cd build;
1515 {
1616 steps
1717 {
18 shell('cd source; python resources/jenkins/import.py')
18 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1919
2020 shell('security unlock-keychain ${KEYCHAIN_CREDENTIALS} ${HOME}/Library/Keychains/login.keychain-db')
2121
1313 {
1414 steps
1515 {
16 shell('cd source; python resources/jenkins/import.py')
16 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1717
1818 shell('security unlock-keychain ${KEYCHAIN_CREDENTIALS} ${HOME}/Library/Keychains/login.keychain-db')
1919
1313
1414 steps
1515 {
16 shell('cd source; python resources/jenkins/import.py')
16 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1717
1818 shell('cd build; cmake -Werror=dev ../source -DCMAKE_BUILD_TYPE=release -Dtools.only=true')
1919 shell('cd build; make package_source')
1515 {
1616 steps
1717 {
18 batchFile('cd source & python resources/jenkins/import.py')
18 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1919
2020 batchFile(strip("""\
2121 cd build &
1313 {
1414 steps
1515 {
16 batchFile('cd source & python resources/jenkins/import.py')
16 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1717
1818 batchFile(strip("""\
1919 cd build &
1414 {
1515 steps
1616 {
17 batchFile('cd source & python resources/jenkins/import.py')
17 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1818
1919 batchFile('''\
2020 cd build
1212 {
1313 steps
1414 {
15 batchFile('cd source & python resources/jenkins/import.py')
15 batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1616
1717 batchFile('''\
1818 cd build
1313 {
1414 steps
1515 {
16 shell('cd source; python resources/jenkins/import.py')
16 shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake')
1717
1818 shell('security unlock-keychain \${KEYCHAIN_CREDENTIALS} \${HOME}/Library/Keychains/login.keychain-db')
1919
11 {
22 jobs
33 {
4 regex('Release(.)*')
4 regex(/Release.*/)
55 }
66
77 columns
11 {
22 jobs
33 {
4 regex('(.)*_Review_(.)*')
4 regex(/.*_Review_.*/)
55 }
66
77 categorizationCriteria
88 {
9 regexGroupingRule('([a-z|0-9|.])+_Review_(.)*', 'Branches')
9 regexGroupingRule(/^[a-z0-9.]+_Review_/, 'Branches')
1010 }
1111
1212 categorizationCriteria
1313 {
14 regexGroupingRule('Review_Libs', 'Libraries')
14 regexGroupingRule(/Review_Libs/, 'Libraries')
1515 }
1616
1717 categorizationCriteria
1818 {
19 regexGroupingRule('(.)*__Review_Trigger', 'Sub-Trigger')
19 regexGroupingRule(/__Review_Trigger/, 'Sub-Trigger')
20 }
21
22 categorizationCriteria
23 {
24 regexGroupingRule(/^[A-Z]\w*_Review_/, 'Tools')
2025 }
2126
2227 columns
11 {
22 jobs
33 {
4 regex('(.)*Seeder(.)*')
4 regex(/.*Seeder.*/)
55 }
66
77 columns
11 {
22 jobs
33 {
4 regex("${MERCURIAL_REVISION_BRANCH}_(.)*")
4 regex(/${MERCURIAL_REVISION_BRANCH}_.*/)
55 }
66
77 categorizationCriteria
88 {
9 regexGroupingRule('^[a-z|0-9|.]*_Libs_', '_Libraries_')
10 regexGroupingRule('_Review_', '_Reviews_')
9 regexGroupingRule(/^[a-z0-9.]+_Libs_/, '_Libraries_')
10 regexGroupingRule(/_Review_/, '_Reviews_')
1111 }
1212
1313 columns
88 {
99 String name = 'Appcast'
1010 String label= 'Common'
11 String artifacts = 'build/*.msi,build/*.dmg,build/*.tar.gz,build/*.sha256,build/Appcast.*,build/ReleaseNotes.html,build/docs/**/*.pdf,build/docs/**/*.tar.xz,source/resources/default-*'
11 String artifacts = 'build/*.msi,build/*.dmg,build/*.tar.gz,build/*.sha256,build/Appcast.*,build/ReleaseNotes.html,build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz'
1212 String trigger = null
1313 List oldBuilds = [-1, 5]
1414 boolean sendMail = false
126126 if(getReleaseJob())
127127 tag('${changeset}')
128128 else
129 branch(dslFactory.MERCURIAL_REVISION_BRANCH)
129 tag(dslFactory.MERCURIAL_REVISION_BRANCH)
130130
131131 subdirectory('source')
132132 if(getDisableChangelog())
99 String artifacts = 'build/Toolchain_*'
1010 String namePrefix = 'Libs_' // See copyArtifacts in Build.groovy
1111 String trigger = null
12 List oldBuilds = [-1, 10]
12 List oldBuilds = [-1, 5]
1313 int timeout = -1
1414 int weight = 2
1515 }
33 <description></description>
44 <keepDependencies>false</keepDependencies>
55 <scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.54">
6 <source>https://hg.governikus.de/AusweisApp2</source>
6 <source>https://hg.govkg.de/AusweisApp/AusweisApp2</source>
77 <modules>resources/jenkins/dsl/</modules>
88 <revisionType>BRANCH</revisionType>
99 <revision>default</revision>
44
55 import os
66 import sys
7
8 patchy = None
9
10 try:
11 from rbtools.commands.patch import Patch
12
13 class PatchHelper(Patch):
14 def __init__(self):
15 super(PatchHelper, self).__init__()
16 parser = self.create_arg_parser([])
17 self.options = parser.parse_args([])
18 self.root = None
19 if self.options.server is None:
20 self.options.server = os.environ.get('REVIEWBOARD_SERVER')
21
22 def download(self, request_id, diff_rev=None):
23 if request_id is None:
24 print('ID of review request cannot be undefined')
25 return None
26
27 if self.root is None:
28 if self.options.server is None:
29 print('Cannot find Review Board! Provide .reviewboardrc?')
30 return None
31 _, self.root = self.get_api(self.options.server)
32
33 print('Download patch revision {} '
34 'of review request {}'.format(diff_rev, request_id))
35 diff, _, _ = self.get_patch(request_id, self.root, diff_rev)
36 return diff
37
38 def save(self, file, request_id=None, diff_rev=None):
39 if request_id is None:
40 request_id = os.environ.get('REVIEWBOARD_REVIEW_ID')
41
42 if diff_rev is None:
43 diff_rev = os.environ.get('REVIEWBOARD_DIFF_REVISION')
44
45 diff = self.download(request_id, diff_rev)
46
47 if diff is not None:
48 with open(file, 'wb') as f:
49 f.write(diff)
50 f.flush()
51
52 patchy = PatchHelper()
53 except Exception:
54 print('Cannot import rbtools')
55 pass
756
857
958 def main():
1766
1867 patch = b(sys.argv[1]) if len(sys.argv) == 2 else b('../patch.diff')
1968 if not os.path.isfile(patch):
20 print('Patch file "{}" does not exists'.format(patch))
21 return -1
69 if patchy is not None:
70 print('Try to ask Review Board for patch file')
71 patchy.save(patch)
72
73 if not os.path.isfile(patch):
74 print('Patch file "{}" does not exists'.format(patch))
75 return -1
2276
2377 cfg = ['extensions.hgext.purge=',
2478 'extensions.hgext.strip=',
0 {
1 "$schema": "https://json-schema.org/draft/2019-09/schema",
2 "title": "JSON schema for AusweisApp2's supported-providers.json file",
3 "type": "object",
4 "properties": {
5 "$schema": {
6 "type": "string"
7 },
8 "callcosts": {
9 "description": "Costs for calling telefon numbers",
10 "type": "array",
11 "items": {
12 "type": "object",
13 "properties": {
14 "prefixes": {
15 "type": "array",
16 "items": {
17 "type": "string",
18 "pattern": "^[0-9]+$"
19 }
20 },
21 "free-seconds": {
22 "type": "integer"
23 },
24 "landline": {
25 "type": "object",
26 "properties": {
27 "per-call": {
28 "type": "number"
29 },
30 "per-minute": {
31 "type": "number"
32 }
33 },
34 "additionalProperties": false
35 },
36 "mobile": {
37 "type": "object",
38 "properties": {
39 "per-call": {
40 "type": "number"
41 },
42 "per-minute": {
43 "type": "number"
44 }
45 },
46 "additionalProperties": false
47 }
48 },
49 "required": [
50 "prefixes"
51 ],
52 "additionalProperties": false
53 }
54 },
55 "provider": {
56 "description": "List of providers",
57 "type": "array",
58 "items": {
59 "type": "object",
60 "properties": {
61 "shortName": {
62 "description": "Name of the provider displayed in the provider list for example",
63 "type": "object",
64 "properties": {
65 "": {
66 "type": "string"
67 }
68 },
69 "required": [
70 ""
71 ],
72 "additionalProperties": false
73 },
74 "longName": {
75 "description": "Complete name of the provider",
76 "type": "object",
77 "properties": {
78 "": {
79 "type": "string"
80 }
81 },
82 "required": [
83 ""
84 ],
85 "additionalProperties": false
86 },
87 "shortDescription": {
88 "type": "object",
89 "properties": {
90 "": {
91 "type": "string"
92 }
93 },
94 "required": [
95 ""
96 ],
97 "additionalProperties": false
98 },
99 "longDescription": {
100 "type": "object",
101 "properties": {
102 "": {
103 "type": "string"
104 }
105 },
106 "required": [
107 ""
108 ],
109 "additionalProperties": false
110 },
111 "subjectUrls": {
112 "description": "Foo",
113 "type": "array",
114 "items": {
115 "type": "string",
116 "format": "uri",
117 "pattern": "^https://"
118 }
119 },
120 "phone": {
121 "type": "string",
122 "pattern": "^\\+49 [0-9 ]{6,}$"
123 },
124 "mobileDesign": {
125 "type": "boolean"
126 },
127 "address": {
128 "type": "string",
129 "format": "uri",
130 "pattern": "^https://"
131 },
132 "homepage": {
133 "type": "string",
134 "format": "uri",
135 "pattern": "^https://"
136 },
137 "email": {
138 "type": "string",
139 "format": "email"
140 },
141 "postalAddress": {
142 "type": "string",
143 "pattern": "^([\\w\\. \\(\\)äöüÄÖÜß\\-\\/,:&–]|(<br\\/>))+$"
144 },
145 "category": {
146 "type": "string",
147 "enum": [
148 "citizen",
149 "finance",
150 "insurance",
151 "other"
152 ]
153 },
154 "image": {
155 "type": "string",
156 "pattern": "\\.(jpg|png|svg)$"
157 },
158 "icon": {
159 "type": "string",
160 "pattern": "\\.(jpg|png|svg)$"
161 },
162 "subjectUrlInfo": {
163 "type": "string",
164 "minLength": 1
165 },
166 "exclude": {
167 "type": "array",
168 "items": {
169 "type": "string",
170 "enum": [
171 "ios"
172 ]
173 }
174 }
175 },
176 "required": [
177 "shortName",
178 "address",
179 "homepage",
180 "category"
181 ],
182 "oneOf": [
183 {
184 "required": [
185 "subjectUrls"
186 ]
187 },
188 {
189 "required": [
190 "subjectUrlInfo"
191 ]
192 }
193 ],
194 "additionalProperties": false
195 }
196 }
197 },
198 "required": [
199 "callcosts",
200 "provider"
201 ],
202 "additionalProperties": false
203 }
1919 android:label="@string/app_name"
2020 android:allowBackup="true"
2121 android:fullBackupContent="@xml/backup_rules">
22 <meta-data android:name="android.max_aspect" android:value="2.1" />
2322
2423 <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
2524
3030 android:theme="@style/AppTheme"
3131 android:allowBackup="true"
3232 android:fullBackupContent="@xml/backup_rules">
33 <meta-data android:name="android.max_aspect" android:value="2.1" />
33 <meta-data android:name="android.max_aspect" android:value="2.4" />
3434
3535 <receiver android:name="com.governikus.ausweisapp2.UpdateReceiver" >
3636 <intent-filter>
0 -keep class com.governikus.** { *; }
1 -keep class org.qtproject.** { *; }
66 "toolchain-prefix": "@ANDROID_TOOLCHAIN_PREFIX@",
77 "tool-prefix": "@ANDROID_TOOLCHAIN_MACHINE_NAME@",
88 "toolchain-version": "@ANDROID_NDK_TOOLCHAIN_VERSION@",
9 "useLLVM": @ANDROID_USE_LLVM@,
910 "ndk-host": "@CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG@",
1011 "target-architecture": "@CMAKE_ANDROID_ARCH_ABI@",
1112 "android-package-source-directory": "@ANDROID_PACKAGE_SRC_DIR@",
00 [Desktop Entry]
11 Version=1.0
22 Type=Application
3 Exec=@CMAKE_INSTALL_FULL_BINDIR@/AusweisApp2
4 Icon=@CMAKE_INSTALL_FULL_DATADIR@/@VENDOR@/AusweisApp2/npa.svg
3 Exec=AusweisApp2
4 Icon=AusweisApp2
55 StartupNotify=true
66 Terminal=false
7 Categories=Utility;Accessibility;
7 Categories=System;Security;
88 GenericName=Authentication App
99 Keywords=nPA,eID,eAT,Personalausweis,Aufenthaltstitel,Identity,Card
1010 Name=AusweisApp2
1616 <category>Utility</category>
1717 </categories>
1818 <url type="homepage">https://www.ausweisapp.bund.de/</url>
19 <url type="contact">mailto:support@ausweisapp.de</url>
2019 <launchable type="desktop-id">com.governikus.ausweisapp2.desktop</launchable>
2120 <provides>
2221 <binary>AusweisApp2</binary>
7171 <ComponentRef Id="RemindToClose"/>
7272 <ComponentRef Id="Assistant"/>
7373 <ComponentRef Id="TransportPinReminder"/>
74 <ComponentRef Id="CustomProxyType"/>
75 <ComponentRef Id="CustomProxyHost" />
76 <ComponentRef Id="CustomProxyPort"/>
7477 <ComponentRef Id="UpdateCheck"/>
7578 <ComponentRef Id="OnScreenKeyboard"/>
79 <ComponentRef Id="ShuffleScreenKeyboard"/>
80 <ComponentRef Id="EnableCanAllowed"/>
81 <ComponentRef Id="SkipRightsOnCanAllowed"/>
7682 <ComponentRef Id="History"/>
7783 </FeatureRef>
7884
55
66 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
77 <Fragment>
8 <Property Id="AUTOSTART" Value="undefined" />
9 <Property Id="AUTOHIDE" Value="undefined" />
10 <Property Id="REMINDTOCLOSE" Value="undefined" />
11 <Property Id="ASSISTANT" Value="undefined" />
12 <Property Id="TRANSPORTPINREMINDER" Value="undefined"/>
13 <Property Id="UPDATECHECK" Value="undefined"/>
14 <Property Id="ONSCREENKEYBOARD" Value="undefined"/>
15 <Property Id="HISTORY" Value="undefined"/>
8 <Property Id="AUTOSTART" Secure="yes"/>
9 <Property Id="AUTOHIDE" Secure="yes"/>
10 <Property Id="REMINDTOCLOSE" Secure="yes"/>
11 <Property Id="ASSISTANT" Secure="yes"/>
12 <Property Id="TRANSPORTPINREMINDER" Secure="yes"/>
13 <Property Id="CUSTOMPROXYTYPE" Secure="yes"/>
14 <Property Id="CUSTOMPROXYHOST" Secure="yes"/>
15 <Property Id="CUSTOMPROXYPORT" Secure="yes"/>
16 <Property Id="UPDATECHECK" Secure="yes"/>
17 <Property Id="ONSCREENKEYBOARD" Secure="yes"/>
18 <Property Id="SHUFFLESCREENKEYBOARD" Secure="yes"/>
19 <Property Id="ENABLECANALLOWED" Secure="yes"/>
20 <Property Id="SKIPRIGHTSONCANALLOWED" Secure="yes"/>
21 <Property Id="HISTORY" Secure="yes"/>
22
23 <WixVariable Id="CompanyRootKey" Value="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)"/>
1624
1725 <DirectoryRef Id="TARGETDIR">
1826 <Component Id="AutoStart" Guid="*">
2331 </Component>
2432
2533 <Component Id="AutoHide" Guid="*">
26 <Condition>AUTOHIDE = "true" OR AUTOHIDE = "false"</Condition>
27 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)">
34 <Condition>AUTOHIDE</Condition>
35 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
2836 <RegistryValue Name="autoCloseWindow" Type="string" Value="[AUTOHIDE]" KeyPath="yes"/>
2937 </RegistryKey>
3038 </Component>
3139
3240 <Component Id="RemindToClose" Guid="*">
33 <Condition>REMINDTOCLOSE = "true" OR REMINDTOCLOSE = "false"</Condition>
34 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)">
41 <Condition>REMINDTOCLOSE</Condition>
42 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
3543 <RegistryValue Name="remindToClose" Type="string" Value="[REMINDTOCLOSE]" KeyPath="yes"/>
3644 </RegistryKey>
3745 </Component>
3846
3947 <Component Id="Assistant" Guid="*">
40 <Condition>ASSISTANT = "true" OR ASSISTANT = "false"</Condition>
41 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)">
48 <Condition>ASSISTANT</Condition>
49 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
4250 <RegistryValue Name="showSetupAssistant" Type="string" Value="[ASSISTANT]" KeyPath="yes"/>
4351 </RegistryKey>
4452 </Component>
4553
4654 <Component Id="TransportPinReminder" Guid="*">
47 <Condition>TRANSPORTPINREMINDER = "true" OR TRANSPORTPINREMINDER = "false"</Condition>
48 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)">
55 <Condition>TRANSPORTPINREMINDER</Condition>
56 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
4957 <RegistryValue Name="transportPinReminder" Type="string" Value="[TRANSPORTPINREMINDER]" KeyPath="yes"/>
5058 </RegistryKey>
5159 </Component>
5260
61 <Component Id="CustomProxyType" Guid="*">
62 <Condition>CUSTOMPROXYTYPE</Condition>
63 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
64 <RegistryValue Name="customProxyType" Type="string" Value="[CUSTOMPROXYTYPE]" KeyPath="yes"/>
65 </RegistryKey>
66 </Component>
67
68 <Component Id="CustomProxyHost" Guid="*">
69 <Condition>CUSTOMPROXYHOST</Condition>
70 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
71 <RegistryValue Name="customProxyHost" Type="string" Value="[CUSTOMPROXYHOST]" KeyPath="yes"/>
72 </RegistryKey>
73 </Component>
74
75 <Component Id="CustomProxyPort" Guid="*">
76 <Condition>CUSTOMPROXYPORT</Condition>
77 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
78 <RegistryValue Name="customProxyPort" Type="string" Value="[CUSTOMPROXYPORT]" KeyPath="yes"/>
79 </RegistryKey>
80 </Component>
81
5382 <Component Id="UpdateCheck" Guid="*">
54 <Condition>UPDATECHECK = "true" OR UPDATECHECK = "false"</Condition>
55 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)\common">
83 <Condition>UPDATECHECK</Condition>
84 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
5685 <RegistryValue Name="autoUpdateCheck" Type="string" Value="[UPDATECHECK]" KeyPath="yes"/>
5786 </RegistryKey>
5887 </Component>
5988
6089 <Component Id="OnScreenKeyboard" Guid="*">
61 <Condition>ONSCREENKEYBOARD = "true" OR ONSCREENKEYBOARD = "false"</Condition>
62 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)\common">
90 <Condition>ONSCREENKEYBOARD</Condition>
91 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
6392 <RegistryValue Name="keylessPassword" Type="string" Value="[ONSCREENKEYBOARD]" KeyPath="yes"/>
6493 </RegistryKey>
6594 </Component>
6695
96 <Component Id="ShuffleScreenKeyboard" Guid="*">
97 <Condition>SHUFFLESCREENKEYBOARD</Condition>
98 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
99 <RegistryValue Name="shuffleScreenKeyboard" Type="string" Value="[SHUFFLESCREENKEYBOARD]" KeyPath="yes"/>
100 </RegistryKey>
101 </Component>
102
103 <Component Id="EnableCanAllowed" Guid="*">
104 <Condition>ENABLECANALLOWED</Condition>
105 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
106 <RegistryValue Name="enableCanAllowed" Type="string" Value="[ENABLECANALLOWED]" KeyPath="yes"/>
107 </RegistryKey>
108 </Component>
109
110 <Component Id="SkipRightsOnCanAllowed" Guid="*">
111 <Condition>SKIPRIGHTSONCANALLOWED</Condition>
112 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)">
113 <RegistryValue Name="skipRightsOnCanAllowed" Type="string" Value="[SKIPRIGHTSONCANALLOWED]" KeyPath="yes"/>
114 </RegistryKey>
115 </Component>
116
67117 <Component Id="History" Guid="*">
68 <Condition>HISTORY = "true" OR HISTORY = "false"</Condition>
69 <RegistryKey Root="HKLM" Key="Software\$(var.CPACK_PACKAGE_VENDOR)\$(var.CPACK_PACKAGE_NAME)\history">
118 <Condition>HISTORY</Condition>
119 <RegistryKey Root="HKLM" Key="!(wix.CompanyRootKey)\history">
70120 <RegistryValue Name="enable" Type="string" Value="[HISTORY]" KeyPath="yes"/>
71121 </RegistryKey>
72122 </Component>
99 import Governikus.SelfAuthenticationView 1.0
1010 import Governikus.IdentifyView 1.0
1111 import Governikus.ChangePinView 1.0
12 import Governikus.ProgressView 1.0
1213 import Governikus.ProviderView 1.0
1314 import Governikus.MoreView 1.0
1415 import Governikus.SettingsView 1.0
1617 import Governikus.UpdateView 1.0
1718 import Governikus.View 1.0
1819 import Governikus.Type.ApplicationModel 1.0
20 import Governikus.Type.AuthModel 1.0
1921 import Governikus.Type.UiModule 1.0
2022 import Governikus.Type.SettingsModel 1.0
2123 import Governikus.Type.SelfAuthModel 1.0
2729 import QtQuick 2.10
2830 import QtQuick.Controls 2.3
2931 import QtGraphicalEffects 1.0
30 import Qt.labs.platform 1.1
32 import Qt.labs.platform 1.1 as Labs
3133
3234
3335 ApplicationWindow {
3436 id: appWindow
3537
36 function openSaveFileDialog(pOnAcceptedCallback, pDefaultFilename, pSuffix) {
37 //: LABEL DESKTOP_QML
38 saveFileDialog.nameFilters = [qsTr("Text files") + " (*." + pSuffix + ")"]
38 function openSaveFileDialog(pOnAcceptedCallback, pDefaultFilename, pFileType, pSuffix) {
39 saveFileDialog.nameFilters = "%1 (*.%2)".arg(pFileType).arg(pSuffix)
3940 saveFileDialog.defaultSuffix = pSuffix
4041 saveFileDialog.currentFile = saveFileDialog.folder + "/" + pDefaultFilename
4142 saveFileDialog.acceptedCallback = pOnAcceptedCallback
7071 onHeightChanged: d.setScaleFactor()
7172
7273 onClosing: {
74 if (ApplicationModel.currentWorkflow !== "") {
75 abortWorkflowWarning.open()
76 close.accepted = false
77 return
78 }
79
7380 if (SettingsModel.remindUserToClose) {
7481 closeWarning.open()
7582 close.accepted = false
7683 } else {
77 hide()
78 plugin.hide()
84 d.hideUiAndTaskbarEntry()
7985 }
8086 }
8187 onVisibilityChanged: if (visibility !== ApplicationWindow.Minimized) d.lastVisibility = visibility
94100
95101 property int activeView: SectionPage.Views.Main
96102 property int lastVisibility: ApplicationWindow.Windowed
97 readonly property int initialWidth: ApplicationModel.dpiScale * 1600
98 readonly property int initialHeight: ApplicationModel.dpiScale * 1200
103 readonly property int initialWidth: 960
104 readonly property int initialHeight: 720
99105 property ApplicationWindow detachedLogView: null
106
107 function abortCurrentWorkflow() {
108 if (ApplicationModel.currentWorkflow === "authentication") {
109 AuthModel.cancelWorkflow()
110 }
111 else if (ApplicationModel.currentWorkflow === "selfauthentication") {
112 SelfAuthModel.cancelWorkflow()
113 }
114 else if (ApplicationModel.currentWorkflow === "changepin") {
115 ChangePinModel.cancelWorkflow()
116 }
117 }
118
119 function hideUiAndTaskbarEntry() {
120 hide()
121 plugin.hideFromTaskbar()
122 }
100123
101124 function closeOpenDialogs() {
102125 saveFileDialog.reject()
103126 closeWarning.close()
127 abortWorkflowWarning.close()
104128 }
105129
106130 function showMainWindow() {
131155
132156 }
133157
134 FileDialog {
158 TaskbarProgress {}
159
160 Labs.FileDialog {
135161 id: saveFileDialog
136162
137163 property var acceptedCallback
138164
139 fileMode: FileDialog.SaveFile
140 folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)
165 fileMode: Labs.FileDialog.SaveFile
166 folder: Labs.StandardPaths.writableLocation(Labs.StandardPaths.DocumentsLocation)
141167 onAccepted: acceptedCallback(file)
142168 }
143169
162188 title: qsTr("The user interface of the %1 is closed.").arg(Qt.application.name) + SettingsModel.translationTrigger
163189 //: INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed for the first time.
164190 text: qsTr("The program remains available via the icon in the system tray. Click on the %1 icon to reopen the user interface.").arg(Qt.application.name) + SettingsModel.translationTrigger
165 onConfirmed: {
166 hide()
167 plugin.hide()
168 }
191 onConfirmed: d.hideUiAndTaskbarEntry()
169192
170193 ToggleableOption {
171194 //: LABEL DESKTOP_QML
176199
177200 onCheckedChanged: SettingsModel.remindUserToClose = !checked
178201 }
202 }
203
204 ConfirmationPopup {
205 id: abortWorkflowWarning
206
207 //: INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed and a workflow is still active.
208 readonly property string abortText: qsTr("This will cancel the current operation and hide the UI of %1. You can restart the operation at any time.").arg(Qt.application.name) + SettingsModel.translationTrigger
209 //: INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed and a workflow is still active and the close/minimize info was not disabled.
210 readonly property string hideToTrayText: qsTr("The program remains available via the icon in the system tray. Click on the %1 icon to reopen the user interface.").arg(Qt.application.name) + SettingsModel.translationTrigger
211
212 closePolicy: Popup.NoAutoClose
213 //: INFO DESKTOP_QML Header of the popup that is shown when the AA2 is closed and a workflow is still active
214 title: qsTr("Abort operation") + SettingsModel.translationTrigger
215 text: "%1%2".arg(abortText).arg(SettingsModel.remindUserToClose ? "<br/><br/>%1".arg(hideToTrayText) : "")
216
217 onConfirmed: {
218 d.abortCurrentWorkflow()
219 d.hideUiAndTaskbarEntry()
220 }
221 onCancelled: close()
179222 }
180223
181224 Connections {
222265 break
223266 }
224267 }
225 onFireHideRequest: {
226 hide()
227 }
268 onFireHideRequest: hide()
228269 }
229270
230271 Connections {
243284
244285 Shortcut {
245286 sequence: StandardKey.HelpContents
246 onActivated: ApplicationModel.openOnlineHelp("index")
287 onActivated: ApplicationModel.openOnlineHelp(titleBar.rightMostAction.helpTopic)
247288 }
248289
249290 Image {
355396 onCancelled: plugin.switchUi()
356397 }
357398
399 Connections {
400 target: plugin
401 onFireProxyAuthenticationRequired: {
402 proxyCredentials.credentials = pProxyCredentials
403 proxyCredentials.open()
404 }
405 }
406
407 ProxyCredentialsPopup {
408 id: proxyCredentials
409 }
410
358411 Component {
359412 id: detachedLogViewWindow
360413
1111 import Governikus.View 1.0
1212 import Governikus.FeedbackView 1.0
1313 import Governikus.Type.ApplicationModel 1.0
14 import Governikus.Type.RemoteServiceModel 1.0
1415 import Governikus.Type.SettingsModel 1.0
1516 import Governikus.Style 1.0
1617
172173 id: feedback
173174
174175 function showIfNecessary() {
175 if (!ApplicationModel.currentWorkflow && SettingsModel.requestStoreFeedback()) {
176 if (!ApplicationModel.currentWorkflow && !RemoteServiceModel.running && SettingsModel.requestStoreFeedback()) {
176177 SettingsModel.hideFutureStoreFeedbackDialogs()
177178 feedback.open()
178179 }
2626 Password,
2727 PasswordInfo,
2828 Progress,
29 ProgressNewPin,
2930 CardPosition,
3031 InputError,
3132 Data,
4546
4647 titleBarAction: TitleBarAction {
4748 //: LABEL DESKTOP_QML
48 text: qsTr("PIN Management") + SettingsModel.translationTrigger
49 text: qsTr("Change PIN") + SettingsModel.translationTrigger
4950 rootEnabled: false
5051 helpTopic: "pinManagement"
5152 showSettings: (changePinController.workflowState === ChangePinController.WorkflowStates.Initial ||
5253 changePinController.workflowState === ChangePinController.WorkflowStates.Reader ||
5354 changePinController.workflowState === ChangePinController.WorkflowStates.Card)
54 && d.activeView !== ChangePinView.SubViews.Progress
55 && d.activeView !== ChangePinView.SubViews.Progress && d.activeView !== ChangePinView.SubViews.ProgressNewPin
5556
5657 onClicked: {
5758 if (d.activeView === ChangePinView.SubViews.PasswordInfo) {
138139 visible: d.activeView === ChangePinView.SubViews.Password
139140
140141 onPasswordEntered: {
141 d.view = ChangePinView.SubViews.Progress
142 d.view = pWasNewPin ? ChangePinView.SubViews.ProgressNewPin : ChangePinView.SubViews.Progress
142143 ChangePinModel.continueWorkflow()
143144 }
144145
166167 ProgressView {
167168 id: pinProgressView
168169
169 visible: d.activeView === ChangePinView.SubViews.Progress
170
171 //: LABEL DESKTOP_QML
172 text: qsTr("Change PIN") + SettingsModel.translationTrigger
170 visible: d.activeView === ChangePinView.SubViews.Progress || d.activeView === ChangePinView.SubViews.ProgressNewPin
171
172 text: d.activeView === ChangePinView.SubViews.ProgressNewPin
173 //: LABEL DESKTOP_QML Processing screen label while the card communication is running after the new PIN has been entered during PIN change process.
174 ? qsTr("Setting new PIN") + SettingsModel.translationTrigger
175 //: LABEL DESKTOP_QML Processing screen label while the card communication is running after the old PIN has been entered during PIN change process.
176 : qsTr("Change PIN") + SettingsModel.translationTrigger
173177 //: INFO DESKTOP_QML Processing screen text while the card communication is running after the PIN has been entered during PIN change process.
174 subText: qsTr("Please don't move the ID card...") + SettingsModel.translationTrigger
178 subText: qsTr("Please don't move the ID card.") + SettingsModel.translationTrigger
175179 }
176180
177181 ResultView {
200204
201205 resultType: ResultView.Type.IsSuccess
202206 //: INFO DESKTOP_QML The ID card has just been unblocked and the user can now continue with their PIN change.
203 text: qsTr("Your ID card is unblocked. You now have three more tries to change your PIN") + SettingsModel.translationTrigger
207 text: qsTr("Your ID card is unblocked. You now have three more attempts to change your PIN") + SettingsModel.translationTrigger
204208 onNextView: confirmed = true
205209
206210 Connections {
231235 ChangePinModel.continueWorkflow()
232236 baseItem.nextView(pName)
233237 }
234 emailButtonVisible: ChangePinModel.error && !ChangePinModel.isCancellationByUser()
238 supportButtonsVisible: ChangePinModel.error && !ChangePinModel.isCancellationByUser()
235239 onEmailButtonPressed: ChangePinModel.sendResultMail()
236240 }
237241 }
5656 target: ChangePinModel
5757
5858 onFireNewContextSet: {
59 pinProgressView.wasNewPin = false
5960 navBar.lockedAndHidden = true
6061 navBar.state = "pin"
6162 navBar.currentIndex = 3
3030 Connections {
3131 target: ChangePinModel
3232 //: INFO ANDROID IOS The ID card has just been unblocked and the user can now continue with their PIN change.
33 onFireOnPinUnlocked: ApplicationModel.showFeedback(qsTr("Your ID card is unblocked. You now have three more tries to change your PIN"))
33 onFireOnPinUnlocked: ApplicationModel.showFeedback(qsTr("Your ID card is unblocked. You now have three more attempts to change your PIN"))
3434 }
3535
3636 ChangePinViewContent {
4444
4545 controller: changePinController
4646 workflowModel: ChangePinModel
47 //: LABEL ANDROID IOS
48 workflowTitle: qsTr("PIN Management") + SettingsModel.translationTrigger
47 workflowTitle: baseItem.title
4948
5049 waitingFor: switch (changePinController.workflowState) {
5150 case ChangePinController.WorkflowStates.Reader:
6463
6564 ResultView {
6665 id: cardPositionView
67 //: LABEL ANDROID IOS
68 title: qsTr("PIN Management") + SettingsModel.translationTrigger
66 navigationAction: NavigationAction { state: "cancel"; onClicked: ChangePinModel.cancelWorkflow() }
67 title: baseItem.title
6968 resultType: ResultView.Type.IsInfo
7069 //: LABEL ANDROID IOS
7170 buttonText: qsTr("Retry") + SettingsModel.translationTrigger
8079
8180 ResultView {
8281 id: pinResult
83 //: LABEL ANDROID IOS
84 title: qsTr("PIN Management") + SettingsModel.translationTrigger
82 title: baseItem.title
8583 resultType: ChangePinModel.error ? ResultView.Type.IsError : ResultView.Type.IsSuccess
8684 text: ChangePinModel.resultString
8785 onClicked: {
10098 visible: false
10199
102100 onPasswordEntered: {
101 pinProgressView.wasNewPin = pWasNewPin
103102 firePop()
104103 ChangePinModel.continueWorkflow()
105104 }
109108
110109 ProgressView {
111110 id: pinProgressView
111
112 property bool wasNewPin
113
112114 navigationAction: NavigationAction {
113115 state: ChangePinModel.isBasicReader ? "cancel" : "hidden";
114116 onClicked: if (state !== "hidden") ChangePinModel.cancelWorkflow()
115117 }
116 //: LABEL ANDROID IOS
117 title: qsTr("PIN Management") + SettingsModel.translationTrigger
118 title: baseItem.title
118119 visible: false
119 //: LABEL ANDROID IOS
120 text: qsTr("Change PIN") + SettingsModel.translationTrigger
120 text: (wasNewPin
121 //: LABEL ANDROID IOS Processing screen label while the card communication is running after the new PIN has been entered during PIN change process.
122 ? qsTr("Setting new PIN")
123 //: LABEL ANDROID IOS Processing screen label while the card communication is running before the new PIN has been entered during PIN change process.
124 : qsTr("Change PIN")) + SettingsModel.translationTrigger
121125 subText: (!visible ? ""
122126 //: INFO ANDROID IOS Loading screen during PIN change process, data communcation is currently ongoing. Message is usually not visible since the password handling with basic reader is handled by EnterPasswordView.
123 : ChangePinModel.isBasicReader ? qsTr("Please don't move the ID card...")
127 : ChangePinModel.isBasicReader ? qsTr("Please don't move the ID card.")
124128 : !!NumberModel.inputError ? NumberModel.inputError
125129 //: INFO ANDROID IOS The card communcation was aborted, the online identification functionality is deactivated and needs to be actived by the authorities.
126130 : NumberModel.pinDeactivated ? qsTr("The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.")
129133 //: INFO ANDROID IOS Either an comfort card reader or smartphone-as-card-reader is used, the user needs to react to request on that device.
130134 || changePinController.workflowState === ChangePinController.WorkflowStates.NewPin ? qsTr("Please observe the display of your card reader.")
131135 //: INFO ANDROID IOS The wrong PIN was entered twice, the next attempt requires additional verifcation via CAN.
132 : changePinController.workflowState === ChangePinController.WorkflowStates.Can ? qsTr("A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.")
136 : changePinController.workflowState === ChangePinController.WorkflowStates.Can ? qsTr("A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.")
133137 //: INFO ANDROID IOS The PIN (including the CAN) was entered wrongfully three times, the PUK is required to unlock the ID card.
134138 : changePinController.workflowState === ChangePinController.WorkflowStates.Puk ? qsTr("A wrong PIN has been entered three times on your ID card. Your PIN is now blocked. To unblock your PIN you have to enter the PUK.")
135139 //: INFO ANDROID IOS Generic progress message during PIN change process.
136 : qsTr("Please don't move the ID card...")) + SettingsModel.translationTrigger
140 : qsTr("Please don't move the ID card.")) + SettingsModel.translationTrigger
137141 subTextColor: !ChangePinModel.isBasicReader && (NumberModel.inputError
138142 || NumberModel.pinDeactivated
139143 || changePinController.workflowState === ChangePinController.WorkflowStates.Can
4848 anchors.horizontalCenter: parent.horizontalCenter
4949
5050 //: LABEL ANDROID IOS
51 text: qsTr("You have the opportunity to change your transport PIN into a personal PIN. You can also change the PIN at any time or unblock the PIN using the personal unblocking key (PUK). The transport PIN and the PUK can be found in the letter sent to you by your competent authority.") + SettingsModel.translationTrigger
51 text: qsTr("You have the opportunity to change your Transport PIN into a personal PIN. You can also change the PIN at any time or unblock the PIN using the Personal Unblocking Key (PUK). The Transport PIN and the PUK can be found in the letter sent to you by your competent authority.") + SettingsModel.translationTrigger
5252
5353 horizontalAlignment: Text.AlignHCenter
5454 width: Math.min(parent.width - 2 * Constants.pane_padding, Style.dimens.max_text_width)
+0
-110
resources/qml/Governikus/DeveloperView/+mobile/DeveloperView.qml less more
0 /*
1 * \copyright Copyright (c) 2016-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5 import QtQuick.Controls 2.3
6
7 import Governikus.Global 1.0
8 import Governikus.Style 1.0
9 import Governikus.SettingsView 1.0
10 import Governikus.TitleBar 1.0
11 import Governikus.View 1.0
12 import Governikus.Type.SettingsModel 1.0
13 import Governikus.Type.LogModel 1.0
14 import Governikus.Type.HistoryModel 1.0
15 import Governikus.Type.ApplicationModel 1.0
16
17
18 SectionPage {
19 id: root
20 navigationAction: NavigationAction { state: !topLevelPage ? "back" : ""; onClicked: firePop() }
21 //: LABEL ALL_PLATFORMS
22 title: qsTr("Developer options") + SettingsModel.translationTrigger
23
24 content: Column {
25 id: mainColumn
26 width: root.width
27 padding: Constants.pane_padding
28 spacing: Constants.component_spacing
29
30 readonly property int usableWidth: width - 2 * padding
31
32 LabeledSwitch {
33 id: testUriSwitch
34
35 width: parent.usableWidth
36
37 //: LABEL ANDROID IOS
38 title: qsTr("Testmode for the self-authentication") + SettingsModel.translationTrigger
39 //: LABEL ANDROID IOS
40 description: qsTr("Use the test environment during a self-authentication") + SettingsModel.translationTrigger
41 checked: SettingsModel.useSelfauthenticationTestUri
42 onCheckedChanged: SettingsModel.useSelfauthenticationTestUri = testUriSwitch.checked
43 }
44
45 LabeledSwitch {
46 id: devModeSwitch
47
48 width: parent.usableWidth
49
50 //: LABEL ANDROID IOS
51 title: qsTr("Developer Mode") + SettingsModel.translationTrigger
52 //: LABEL ANDROID IOS
53 description: qsTr("Use a more tolerant mode") + SettingsModel.translationTrigger
54 checked: SettingsModel.developerMode
55 onCheckedChanged: SettingsModel.developerMode = devModeSwitch.checked
56 }
57
58 GText {
59 //: LABEL ALL_PLATFORMS
60 text: qsTr("Change the layout style") + SettingsModel.translationTrigger
61 textStyle: Style.text.normal_accent
62 }
63
64 GRadioButton {
65 //: LABEL ALL_PLATFORMS
66 text: qsTr("iOS") + SettingsModel.translationTrigger
67 checked: plugin.platformStyle === text.toLowerCase()
68 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
69 }
70
71 GRadioButton {
72 //: LABEL ALL_PLATFORMS
73 text: qsTr("Android") + SettingsModel.translationTrigger
74 checked: plugin.platformStyle === text.toLowerCase()
75 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
76 }
77
78 GRadioButton {
79 //: LABEL ALL_PLATFORMS
80 text: qsTr("Tablet, Android") + SettingsModel.translationTrigger
81 checked: plugin.platformStyle === text.toLowerCase()
82 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
83 }
84
85 GText {
86 //: LABEL ALL_PLATFORMS
87 text: qsTr("Create dummy entries") + SettingsModel.translationTrigger
88 textStyle: Style.text.normal_accent
89 }
90
91 GButton {
92 //: LABEL ALL_PLATFORMS
93 text: qsTr("Logfile") + SettingsModel.translationTrigger
94 onClicked: {
95 LogModel.saveDummyLogfile()
96 ApplicationModel.showFeedback("Created new logfile.")
97 }
98 }
99
100 GButton {
101 //: LABEL ALL_PLATFORMS
102 text: qsTr("History") + SettingsModel.translationTrigger
103 onClicked: {
104 HistoryModel.createDummyEntry()
105 ApplicationModel.showFeedback("Created new history entry.")
106 }
107 }
108 }
109 }
+0
-3
resources/qml/Governikus/DeveloperView/qmldir less more
0 module DeveloperView
1
2 DeveloperView 1.0 DeveloperView.qml
1818 {
1919 id: baseItem
2020
21 signal passwordEntered()
21 signal passwordEntered(bool pWasNewPin)
2222 signal changePinLength()
2323 signal requestPasswordInfo()
2424
4646 return
4747 }
4848
49 let wasNewPin = false;
4950 if (passwordType === NumberModel.PASSWORD_PIN) {
5051 NumberModel.pin = numberField.text
5152 }
6162 } else {
6263 NumberModel.newPin = numberField.text
6364 numberField.inputConfirmation = ""
65 wasNewPin = true
6466 }
6567 }
6668 else if (passwordType === NumberModel.PASSWORD_REMOTE_PIN) {
6971
7072 numberField.text = ""
7173 if (numberField.inputConfirmation === "") {
72 baseItem.passwordEntered()
74 baseItem.passwordEntered(wasNewPin)
7375 }
7476 }
7577 }
128130 Accessible.name: mainText.text
129131
130132 //: LABEL DESKTOP_QML
131 text: (passwordType === NumberModel.PASSWORD_PIN ? qsTr("PIN entry")
132 //: LABEL DESKTOP_QML
133 : passwordType === NumberModel.PASSWORD_NEW_PIN ? qsTr("PIN entry")
134 //: LABEL DESKTOP_QML
135 : passwordType === NumberModel.PASSWORD_CAN ? qsTr("CAN entry")
136 //: LABEL DESKTOP_QML
137 : passwordType === NumberModel.PASSWORD_PUK ? qsTr("PUK entry")
138 //: LABEL DESKTOP_QML
139 : passwordType === NumberModel.PASSWORD_REMOTE_PIN ? qsTr("Pairing code")
140 : console.error("Unknown type")) + SettingsModel.translationTrigger
133 text: (passwordType === NumberModel.PASSWORD_CAN ? qsTr("Enter CAN")
134 //: LABEL DESKTOP_QML
135 : passwordType === NumberModel.PASSWORD_PUK ? qsTr("Enter PUK")
136 //: LABEL DESKTOP_QML
137 : passwordType === NumberModel.PASSWORD_REMOTE_PIN ? qsTr("Enter pairing code")
138 //: LABEL DESKTOP_QML
139 : NumberModel.requestTransportPin ? qsTr("Enter Transport PIN")
140 //: LABEL DESKTOP_QML
141 : qsTr("Enter PIN")) + SettingsModel.translationTrigger
141142 textStyle: Style.text.header_inverse
142143 horizontalAlignment: Text.AlignHCenter
143144
168169 if (passwordType === NumberModel.PASSWORD_PIN) {
169170 if (NumberModel.requestTransportPin) {
170171 return ("%1<br><a href=\"#\">%2</a>").arg(
171 //: INFO DESKTOP_QML The AA2 expects a PIN with 5 digits which can be entered via the physical or onscreen keyboard
172 qsTr("Please enter your 5-digit Transport PIN. Use the keyboard or numpad.")
172 //: INFO DESKTOP_QML The AA2 expects the Transport PIN with five digits.
173 qsTr("Please enter the five-digit Transport PIN.")
173174 ).arg(
174175 //: INFO DESKTOP_QML Link text
175176 qsTr("More information")
176177 )
177178 } else {
178179 return ("%1<br><a href=\"#\">%2</a>").arg(
179 //: INFO DESKTOP_QML The AA2 expects a PIN with 6 digits which can be entered via the physical or onscreen keyboard.
180 qsTr("Please enter your 6-digit PIN. Use the keyboard or numpad.")
180 ApplicationModel.currentWorkflow === "changepin"
181 //: INFO DESKTOP_QML The AA2 expects the current PIN with six digits in a PIN change.
182 ? qsTr("Please enter your current six-digit PIN.")
183 //: INFO DESKTOP_QML The AA2 expects a PIN with six digits in an authentication.
184 : qsTr("Please enter your six-digit PIN.")
181185 ).arg(
182186 //: INFO DESKTOP_QML Link text
183187 qsTr("More information")
185189 }
186190 }
187191 if (passwordType === NumberModel.PASSWORD_CAN) {
188 if (NumberModel.isCanAllowedMode) {
189 return ("%1<br><a href=\"#\">%2</a>").arg(
190 //: INFO DESKTOP_QML The operator is required to enter the 6-digit CAN in CAN-allowed authentication.
191 qsTr("Please enter the 6-digit card access number (CAN).")
192 ).arg(
193 //: INFO DESKTOP_QML Link text
194 qsTr("More information")
195 )
196 }
197192 return ("%1<br><a href=\"#\">%2</a>").arg(
198 //: INFO DESKTOP_QML The PIN was entered wrongfully twice, this may have happened during an earlier session of the AA2, too. The user needs to enter the CAN for additional verification.
199 qsTr("A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.")
193 //: INFO DESKTOP_QML The user is required to enter the six-digit CAN in CAN-allowed authentication.
194 qsTr("Please enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of the ID card.")
195 ).arg(
196 //: INFO DESKTOP_QML Link text
197 qsTr("More information")
198 )
199 }
200 if (passwordType === NumberModel.PASSWORD_PUK) {
201 return ("%1<br><a href=\"#\">%2</a>").arg(
202 //: INFO DESKTOP_QML The PUK is required to unlock the ID card.
203 qsTr("The PIN of your ID card is blocked after three incorrect attempts. Please enter the Personal Unblocking Key (PUK) to lift the block. You can find the key in your PIN letter.")
200204 ).arg(
201205 //: INFO DESKTOP_QML Link text
202206 qsTr("More information")
203207 )
204208 }
205 if (passwordType === NumberModel.PASSWORD_PUK) {
206 return ("%1<br><a href=\"#\">%2</a>").arg(
207 //: INFO DESKTOP_QML The PUK is required to unlock the ID card.
208 qsTr("The PIN of your ID card is blocked after three incorrect tries. The block can be lifted by entering your personal unblocking key (PUK).")
209 ).arg(
210 //: INFO DESKTOP_QML Link text
211 qsTr("More information")
212 )
213 }
214209 if (passwordType === NumberModel.PASSWORD_NEW_PIN) {
215210 if (numberField.inputConfirmation === "") {
216 //: INFO DESKTOP_QML A new 6-digit PIN needs to be supplied.
217 return qsTr("Please enter a new 6-digit PIN now.")
211 //: INFO DESKTOP_QML A new six-digit PIN needs to be supplied.
212 return qsTr("Please enter a new six-digit PIN now.")
218213 } else {
219214 //: INFO DESKTOP_QML The new PIN needs to be entered again for verification.
220 return qsTr("Please confirm your new 6-digit PIN.")
215 return qsTr("Please confirm your new six-digit PIN.")
221216 }
222217 }
223218 if (passwordType === NumberModel.PASSWORD_REMOTE_PIN) {
224219 return ("%1<br><a href=\"#\">%2</a>").arg(
225220 //: INFO DESKTOP_QML The pairing code needs to be supplied.
226 qsTr("Start the pairing on your smartphone and enter the shown pairing code in order to use your smartphone as a card reader (SaC).")
221 qsTr("Start the pairing on your smartphone and enter the pairing code shown there in order to use your smartphone as a card reader (SaC).")
227222 ).arg(
228223 //: INFO DESKTOP_QML Link text
229224 qsTr("More information")
284279 textStyle: Style.text.hint_inverse
285280 textFormat: Text.StyledText
286281 text: "<a href=\"#\">" + (NumberModel.requestTransportPin ?
287 //: LABEL DESKTOP_QML Button to switch to a 6-digit PIN.
288 qsTr("Does your PIN have 6 digits?") :
289 //: LABEL DESKTOP_QML Button to switch to a transport PIN or start a change of the transport PIN.
290 qsTr("Does your PIN have 5 digits?")
282 //: LABEL DESKTOP_QML Button to switch to a six-digit PIN.
283 qsTr("Does your PIN have six digits?") :
284 //: LABEL DESKTOP_QML Button to switch to a Transport PIN or start a change of the Transport PIN.
285 qsTr("Does your PIN have five digits?")
291286 ) + "</a>" + SettingsModel.translationTrigger
292287 linkColor: textStyle.textColor
293288 onLinkActivated: baseItem.changePinLength()
2828 Keys.onEscapePressed: close()
2929
3030 titleBarAction: TitleBarAction {
31 rootEnabled: false
31 rootEnabled: ApplicationModel.currentWorkflow === ""
3232 showSettings: false
3333 text: headline.text
3434 showHelp: false
4747
4848 wrapMode: Text.WordWrap
4949 //: LABEL DESKTOP_QML
50 text: (passwordType === NumberModel.PASSWORD_PIN ? qsTr("PIN information")
51 //: LABEL DESKTOP_QML
52 : passwordType === NumberModel.PASSWORD_CAN ? qsTr("CAN information")
50 text: (passwordType === NumberModel.PASSWORD_CAN ? qsTr("CAN information")
5351 //: LABEL DESKTOP_QML
5452 : passwordType === NumberModel.PASSWORD_PUK ? qsTr("PUK information")
5553 //: LABEL DESKTOP_QML
5654 : passwordType === NumberModel.PASSWORD_REMOTE_PIN ? qsTr("Smartphone as card reader information")
57 : console.error("Unknown type")) + SettingsModel.translationTrigger
55 //: LABEL DESKTOP_QML
56 : qsTr("PIN information")) + SettingsModel.translationTrigger
5857 textStyle: Style.text.header_inverse
5958 FocusFrame {}
6059 }
7574
7675 if (passwordType === NumberModel.PASSWORD_CAN && NumberModel.isCanAllowedMode) {
7776 //: INFO DESKTOP_QML Description text of CAN-allowed authentication
78 return qsTr("The card access number (CAN) allows to access the imprinted data of the ID card. In order to allow on-site reading of the personal data the service provider needs to acquire governmental authorization to do so. On-site reading is usually employed to automatically fill forms and prevent spelling mistakes when transfering the personal data.")
77 return qsTr("The Card Access Number (CAN) allows to access the imprinted data of the ID card. In order to allow on-site reading of the personal data the service provider needs to acquire governmental authorization to do so. On-site reading is usually employed to automatically fill forms and prevent spelling mistakes when transfering the personal data.")
7978 }
8079 if (passwordType === NumberModel.PASSWORD_CAN && !NumberModel.isCanAllowedMode) {
8180 //: INFO DESKTOP_QML Description text of CAN if required for third PIN attempt
82 return qsTr("The card access number (CAN) is required if the PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a 6-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red).")
81 return qsTr("The Card Access Number (CAN) is required if the PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red).")
8382 }
8483 if (passwordType === NumberModel.PASSWORD_PUK) {
8584 //: INFO DESKTOP_QML Description text of PUK
86 return qsTr("The personal unblocking key (PUK) is required if the PIN has been entered three times. At this point the PIN is blocked. The PUK is a 10-digit number you received with the letter sent to you by your competent authority (marked in red). Please note that you can only use the PUK to unblock the PIN entry. If you have forgotten your PIN, you can have a new PIN set at your competent authority.")
85 return qsTr("The Personal Unblocking Key (PUK) is required if the PIN has been entered three times. At this point the PIN is blocked. The PUK is a ten-digit number you received with the letter sent to you by your competent authority (marked in red). Please note that you can only use the PUK to unblock the PIN entry. If you have forgotten your PIN, you can have a new PIN set at your competent authority.")
8786 }
8887 if (passwordType === NumberModel.PASSWORD_REMOTE_PIN) {
8988 //: INFO DESKTOP_QML Description text of SaC pairing
9190 }
9291
9392 //: INFO DESKTOP_QML Description text of PIN
94 return qsTr("The personal identification number (PIN) is chosen by you and is required for every use of the online eID function. You can change it anytime and indefinitely if you know your valid PIN. For your 6-digit PIN choose a combination of numbers, that is not easy to guess, neither \"123456\" nor your birth date, or any other numbers printed on the ID card. If you are no longer aware of your valid PIN, you will need to contact the authority responsible for issuing your identification card to renew your PIN.<br><br>When changing the PIN for the first time, please use your 5-digit transport PIN. You will find the transport PIN in the letter you received from the authority responsible for issuing your identification card (marked in red) after you have applied for your identity card.<br><br>Please note that you can not use the online eID function with your 5-digit transport PIN. A change to a 6-digit PIN is mandatory.")
93 return qsTr("The Personal Identification Number (PIN) is chosen by you and is required for every use of the online eID function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither \"123456\" nor your birth date, or any other numbers printed on the ID card. If you are no longer aware of your valid PIN, you will need to contact the authority responsible for issuing your identification card to renew your PIN.<br><br>When changing the PIN for the first time, please use the five-digit Transport PIN. You will find the Transport PIN in the letter you received from the authority responsible for issuing your identification card (marked in red) after you have applied for your identity card.<br><br>Please note that you can not use the online eID function with the five-digit Transport PIN. A change to a six-digit PIN is mandatory.")
9594 }
9695 textStyle: Style.text.header_inverse
9796 horizontalAlignment: Text.AlignJustify
77 import Governikus.Global 1.0
88 import Governikus.Style 1.0
99 import Governikus.View 1.0
10 import Governikus.Type.ApplicationModel 1.0
1011 import Governikus.Type.SettingsModel 1.0
1112 import Governikus.Type.RemoteServiceModel 1.0
1213 import Governikus.Type.NumberModel 1.0
1617 {
1718 id: baseItem
1819 property alias enableTransportPinLink: transportPinLink.enableTransportPinLink
19 signal passwordEntered()
20 signal passwordEntered(bool pWasNewPin)
2021 signal changePinLength()
2122
2223 onVisibleChanged: {
7677 if (baseItem.state === "CAN") {
7778 if (NumberModel.isCanAllowedMode) {
7879 //: INFO ANDROID IOS The CAN needs to be entered in CAN-allowed mode, hint where the CAN can be found.
79 return qsTr("Please enter the 6-digit card access number (CAN). You can find it on the front of the ID card.")
80 return qsTr("Please enter the six-digit Card Access Number (CAN). You can find it in the bottom right on the front of the ID card.")
8081 }
8182 //: INFO ANDROID IOS The wrong PIN was entered twice, the third attempt requires the CAN for additional verification, hint where the CAN is found.
82 return qsTr("A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.")
83 return qsTr("A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.")
8384 }
8485 if (baseItem.state === "PUK") {
8586 //: INFO ANDROID IOS The PUK is required to unlock the ID card since the wrong PIN entered three times.
8687 return qsTr("A wrong PIN has been entered three times on your ID card. Your PIN is now blocked. To unblock your PIN you have to enter the PUK.")
8788 }
8889 if (baseItem.state === "PIN_NEW") {
89 //: INFO ANDROID IOS A new 6-digit PIN needs to be supplied.
90 return qsTr("Please enter a new 6-digit PIN now.")
90 //: INFO ANDROID IOS A new six-digit PIN needs to be supplied.
91 return qsTr("Please enter a new six-digit PIN now.")
9192 }
9293 if (baseItem.state === "PIN_NEW_AGAIN") {
9394 //: INFO ANDROID IOS The new PIN needs to be confirmed.
94 return qsTr("Please confirm your new 6-digit PIN.")
95 return qsTr("Please confirm your new six-digit PIN.")
9596 }
9697 if (baseItem.state === "PIN" && NumberModel.requestTransportPin) {
97 //: INFO ANDROID IOS The transport PIN is required by AA2, it needs to be change to an actual PIN.
98 return qsTr("Please enter the transport PIN from your PIN letter.")
98 //: INFO ANDROID IOS The Transport PIN is required by AA2, it needs to be change to an actual PIN.
99 return qsTr("Please enter the Transport PIN from your PIN letter.")
99100 }
100101 if (baseItem.state === "REMOTE_PIN") {
101102 //: INFO ANDROID IOS The pairing code for the smartphone is required.
102103 return qsTr("Enter the pairing code shown on the device you want to pair.")
103104 }
104 //: LABEL ANDROID IOS
105 return qsTr("Please enter your PIN.")
105 return ApplicationModel.currentWorkflow === "changepin"
106 //: LABEL ANDROID IOS
107 ? qsTr("Please enter your current PIN.")
108 //: LABEL ANDROID IOS
109 : qsTr("Please enter your PIN.")
106110 }
107111 }
108112
148152 Accessible.onPressAction: if (Qt.platform.os === "ios") myMouse.clicked(null)
149153
150154 text: (NumberModel.requestTransportPin ?
151 //: LABEL ANDROID IOS Button to switch to a 6-digit PIN.
152 qsTr("Does your PIN have 6 digits?") :
153 //: LABEL ANDROID IOS Button to switch to a transport PIN or start a change of the transport PIN.
154 qsTr("Does your PIN have 5 digits?")
155 //: LABEL ANDROID IOS Button to switch to a six-digit PIN.
156 qsTr("Does your PIN have six digits?") :
157 //: LABEL ANDROID IOS Button to switch to a Transport PIN or start a change of the Transport PIN.
158 qsTr("Does your PIN have five digits?")
155159 ) + SettingsModel.translationTrigger
156160 textStyle: Style.text.hint_accent
157161 font.underline: true
185189 switch(baseItem.state) {
186190 case "PIN":
187191 NumberModel.pin = pinField.text
188 baseItem.passwordEntered()
192 baseItem.passwordEntered(false)
189193 break
190194 case "PIN_NEW":
191195 pinField.inputConfirmation = pinField.text
194198 break
195199 case "PIN_NEW_AGAIN":
196200 NumberModel.newPin = pinField.text
197 baseItem.passwordEntered()
201 baseItem.passwordEntered(true)
198202 break
199203 case "CAN":
200204 NumberModel.can = pinField.text
201 baseItem.passwordEntered()
205 baseItem.passwordEntered(false)
202206 break
203207 case "PUK":
204208 NumberModel.puk = pinField.text
205 baseItem.passwordEntered()
209 baseItem.passwordEntered(false)
206210 break
207211 case "REMOTE_PIN":
208212 RemoteServiceModel.connectToRememberedServer(pinField.text)
209 baseItem.passwordEntered()
213 baseItem.passwordEntered(false)
210214 break
211215 }
212216 }
6767
6868 onClicked: {
6969 let filenameSuggestion = LogModel.createLogFileName(LogModel.getCurrentLogfileDate())
70 appWindow.openSaveFileDialog(LogModel.saveCurrentLogfile, filenameSuggestion, "log")
70 appWindow.openSaveFileDialog(LogModel.saveCurrentLogfile, filenameSuggestion, qsTr("Logfiles"), "log")
7171 }
7272 }
7373 }
6868 tintIcon: true
6969 onClicked: {
7070 let filenameSuggestion = LogModel.createLogFileName(LogModel.getCurrentLogfileDate())
71 appWindow.openSaveFileDialog(LogModel.saveCurrentLogfile, filenameSuggestion, "log")
71 appWindow.openSaveFileDialog(LogModel.saveCurrentLogfile, filenameSuggestion, qsTr("Logfiles"), "log")
7272 }
7373 }
7474
146146 model: LogModel
147147 spacing: Constants.text_spacing
148148 delegate: LogViewDelegate {
149 width: parent.width - 2 * Constants.pane_padding
149 width: logView.width - 2 * Constants.pane_padding
150150 }
151151
152152 Connections {
173173
174174 property bool deleteAll: true
175175
176 width: ApplicationModel.scaleFactor * 600
177
176178 title: (deleteAll ?
177179 //: LABEL DESKTOP_QML
178180 qsTr("Delete old logfiles") :
6464 Accessible.description: qsTr("Select logfile from list.") + SettingsModel.translationTrigger
6565
6666 model: LogModel.logFiles
67 onActivated: LogModel.setLogfile(comboBox.currentIndex)
67 onCurrentIndexChanged: LogModel.setLogfile(currentIndex)
6868 }
6969 }
7070
+0
-8
resources/qml/Governikus/Global/+desktop/+mac/BrandConstants.qml less more
0 /*
1 * \copyright Copyright (c) 2018-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5
6 Item {
7 }
+0
-8
resources/qml/Governikus/Global/+desktop/+win/BrandConstants.qml less more
0 /*
1 * \copyright Copyright (c) 2018-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5
6 Item {
7 }
6161
6262 width: Math.min(parent.width, implicitWidth)
6363
64 elide: Text.ElideRight
65 maximumLineCount: 1
6466 textStyle: Style.text.header_accent
6567
6668 FocusFrame {
66 import Governikus.Type.ApplicationModel 1.0
77 import Governikus.Type.ApplicationModel 1.0
88
9 BrandConstants {
9 Item {
1010 readonly property int component_spacing: ApplicationModel.scaleFactor * 30
1111 readonly property int pane_padding: ApplicationModel.scaleFactor * 30
1212 readonly property int pane_spacing: ApplicationModel.scaleFactor * 30
7676 scrollBarTopPadding: Constants.text_spacing
7777 scrollBarBottomPadding: Constants.text_spacing
7878 scrollBarAutohide: true
79 onCurrentIndexChanged: flickable.positionViewAtBeginning()
7980 }
8081
8182 Loader {
169170
170171 activeFocusOnTab: false
171172 Accessible.role: Accessible.PageTab
172 Accessible.name: delegateLoader.item.sectionName
173 Accessible.name: delegateLoader.item ? delegateLoader.item.sectionName : ""
173174
174175 width: parent.width
175176 height: delegateLoader.height + 2 * Constants.pane_padding
1010 Switch {
1111 id: control
1212
13 property color color: Style.color.accent
13 property color color: Style.color.switch_checked
1414
1515 Accessible.onPressAction: if (Qt.platform.os === "ios") toggle()
1616
3131 y: parent.height / 2 - height / 2
3232 radius: height / 2
3333
34 color: control.checked ? Qt.lighter(control.color, 1.4) : Qt.darker(Style.color.accent_disabled, 1.1)
34 color: control.enabled ? (control.checked ? Qt.lighter(control.color, 1.3) : Qt.darker(Style.color.accent_disabled, 1.4)) : Qt.darker(Style.color.accent_disabled, 1.1)
3535 }
3636
3737 Rectangle {
3939 height: parent.height
4040 x: control.checked ? parent.width - width : 0
4141 radius: height / 2
42 border.width: control.enabled && !control.checked ? Style.dimens.separator_size : 0
43 border.color: Style.color.border
4244
43 color: control.checked ? control.color : Style.color.accent_disabled
45 color: control.enabled ? (control.checked ? control.color : Style.color.switch_unchecked) : Style.color.accent_disabled
4446
4547 Behavior on x {
4648 NumberAnimation {easing.type: Easing.InOutQuad; duration: 200}
5151 }
5252
5353 anchors.centerIn: Overlay.overlay
54 contentWidth: Overlay.overlay ? Math.min(0.75 * Overlay.overlay.width, Style.dimens.max_text_width) : 0
5455 margins: Constants.pane_padding
5556 padding: 0
5657 topPadding: Constants.pane_padding
6263 background: Rectangle {
6364 color: Style.color.background_popup
6465 radius: Style.dimens.corner_radius_popup
66 border.color: Style.color.border
67 border.width: Style.dimens.popup_border
68
69 FocusPoint {
70 anchors.margins: 4 * ApplicationModel.scaleFactor
71
72 scope: contentItem
73 }
6574 }
6675
67 ColumnLayout {
68 id: contentLayout
76 Item {
77 id: contentItem
6978
70 width: root.availableWidth
71 spacing: Constants.pane_padding
79 implicitWidth: root.availableWidth
80 implicitHeight: contentLayout.height
7281
73 GText {
74 visible: text !== ""
75 Layout.fillWidth: true
76 Layout.rightMargin: Constants.pane_padding
77 Layout.leftMargin: Constants.pane_padding
82 focus: true
83 activeFocusOnTab: true
84 Accessible.role: Accessible.Grouping
85 Accessible.name: qsTr("Dialog") + SettingsModel.translationTrigger
86 Keys.onEnterPressed: if (style & ConfirmationPopup.PopupStyle.OkButton) root.accept()
87 Keys.onReturnPressed: if (style & ConfirmationPopup.PopupStyle.OkButton) root.accept()
7888
79 activeFocusOnTab: true
89 ColumnLayout {
90 id: contentLayout
8091
81 text: root.title
82 textStyle: root.headerTextStyle
83 font.bold: true
84 horizontalAlignment: root.horizontalTextAlignment
92 width: parent.width
93 spacing: Constants.pane_padding
8594
86 FocusFrame {}
87 }
95 GText {
96 visible: text !== ""
97 Layout.fillWidth: true
98 Layout.rightMargin: Constants.pane_padding
99 Layout.leftMargin: Constants.pane_padding
88100
89 GText {
90 visible: text !== ""
91 Layout.fillWidth: true
92 Layout.rightMargin: Constants.pane_padding
93 Layout.leftMargin: Constants.pane_padding
101 activeFocusOnTab: true
94102
95 activeFocusOnTab: true
103 text: root.title
104 textStyle: root.headerTextStyle
105 font.bold: true
106 horizontalAlignment: root.horizontalTextAlignment
96107
97 text: root.text
98 horizontalAlignment: root.horizontalTextAlignment
108 FocusFrame {}
109 }
99110
100 FocusFrame {}
101 }
111 GText {
112 visible: text !== ""
113 Layout.fillWidth: true
114 Layout.rightMargin: Constants.pane_padding
115 Layout.leftMargin: Constants.pane_padding
102116
103 Column {
104 id: customContent
105 visible: children.length > 0
117 activeFocusOnTab: true
106118
107 Layout.fillWidth: true
108 Layout.rightMargin: Constants.pane_padding
109 Layout.leftMargin: Constants.pane_padding
110 }
119 text: root.text
120 horizontalAlignment: root.horizontalTextAlignment
111121
112 Item {
113 id: buttonContainer
122 FocusFrame {}
123 }
114124
115 Layout.fillWidth: true
116 height: childrenRect.height
125 Column {
126 id: customContent
127 visible: children.length > 0
128
129 Layout.fillWidth: true
130 Layout.rightMargin: Constants.pane_padding
131 Layout.leftMargin: Constants.pane_padding
132 }
133
134 Item {
135 id: buttonContainer
136
137 Layout.fillWidth: true
138 height: childrenRect.height
139 }
117140 }
118141 }
119142 }
120
2121
2222 function scrollPageUp() {
2323 Utils.scrollPageUp(baseItem)
24 }
25
26 function positionViewAtBeginning() {
27 contentY = originY
2428 }
2529
2630 function highlightScrollbar() {
0 /*
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5
6 import Governikus.Global 1.0
7 import Governikus.Style 1.0
8 import Governikus.View 1.0
9 import Governikus.Type.ApplicationModel 1.0
10 import Governikus.Type.SettingsModel 1.0
11
12
13 ConfirmationPopup {
14 id: proxyCredentials
15
16 property QtObject credentials
17
18 width: formGrid.width + 2 * Constants.pane_padding
19
20 //: LABEL DESKTOP Title of the proxy credentials popup.
21 title: qsTr("Sign in") + SettingsModel.translationTrigger
22 //: LABEL DESKTOP Text of the button in the proxy credentials popup.
23 okButtonText: qsTr("Sign in") + SettingsModel.translationTrigger
24
25 onCredentialsChanged: {
26 //: LABEL DESKTOP Text of the proxy credentials popup. An example for %1 is http://proxy.example.com:1337.
27 text = qsTr("The proxy %1 requires username and password.").arg(credentials ? credentials.url : "")
28 userInput.text = credentials ? credentials.proposedUser : ""
29 passwordInput.text = ""
30 }
31
32 Grid {
33 id: formGrid
34
35 columns: 2
36 spacing: Constants.component_spacing
37 verticalItemAlignment: Text.AlignVCenter
38
39 GText {
40 //: LABEL DESKTOP Accessible name.
41 Accessible.name: qsTr("Proxy credential username") + SettingsModel.translationTrigger
42
43 activeFocusOnTab: true
44 //: LABEL DESKTOP Label of the textfield for the username.
45 text: qsTr("Username") + SettingsModel.translationTrigger
46
47 FocusFrame {}
48 }
49
50 GTextField {
51 id: userInput
52
53 width: 500 * ApplicationModel.scaleFactor
54
55 textStyle: Style.text.normal
56 }
57
58 GText {
59 //: LABEL DESKTOP Accessible name.
60 Accessible.name: qsTr("Proxy credential password") + SettingsModel.translationTrigger
61
62 activeFocusOnTab: true
63 //: LABEL DESKTOP Label of the textfield for the password.
64 text: qsTr("Password") + SettingsModel.translationTrigger
65
66 FocusFrame {}
67 }
68
69 GTextField {
70 id: passwordInput
71
72 width: 500 * ApplicationModel.scaleFactor
73
74 textStyle: Style.text.normal
75 echoMode: TextInput.Password
76 }
77 }
78
79 onConfirmed: {
80 if (!credentials) return;
81
82 credentials.user = userInput.text
83 credentials.password = passwordInput.text
84 }
85
86 onClosed: {
87 if (!credentials) return;
88
89 credentials.confirmInput()
90 }
91 }
1010
1111 BinaryDecisionView 1.0 BinaryDecisionView.qml
1212 ConfirmationPopup 1.0 ConfirmationPopup.qml
13 ProxyCredentialsPopup 1.0 ProxyCredentialsPopup.qml
1314 GButton 1.0 GButton.qml
1415 GCheckBox 1.0 GCheckBox.qml
1516 GComboBox 1.0 GComboBox.qml
122122 onClicked: {
123123 let now = new Date().toLocaleDateString(Qt.locale(), "yyyy-MM-dd")
124124 let filenameSuggestion = "%1.%2.%3.pdf".arg(Qt.application.name).arg(qsTr("History")).arg(now)
125 appWindow.openSaveFileDialog(HistoryModel.exportHistory, filenameSuggestion, "pdf")
125 appWindow.openSaveFileDialog(HistoryModel.exportHistory, filenameSuggestion, qsTr("Portable Document Format"), "pdf")
126126 }
127127 }
128128 }
4949 LabeledText {
5050 id: purpose
5151
52 visible: text !== ""
5253 Layout.fillWidth: true
5354
5455 activeFocusOnTab: true
4343 }
4444
4545 LabeledText {
46 visible: text !== ""
47
4648 Accessible.onScrollDownAction: scrollPageDown()
4749 Accessible.onScrollUpAction: scrollPageUp()
4850
157157 Accessible.name: confirmButton.text
158158
159159 icon.source: "qrc:///images/npa.svg"
160 //: LABEL DESKTOP_QML %1 can be "card access number (CAN)" or "PIN"
160 //: LABEL DESKTOP_QML %1 can be "CAN" or "PIN"
161161 text: qsTr("Proceed to %1 entry").arg(
162162 NumberModel.isCanAllowedMode ?
163163 //: LABEL DESKTOP_QML Inserted into "Proceed to %1 entry"
164 qsTr("card access number (CAN)") :
164 qsTr("CAN") :
165165 //: LABEL DESKTOP_QML Inserted into "Proceed to %1 entry"
166166 qsTr("PIN")
167167 ) + SettingsModel.translationTrigger
184184 activeFocusOnTab: true
185185 Accessible.name: dataIntroduction.text
186186
187 //: LABEL DESKTOP_QML
188 text: qsTr("The following data will be transferred to the provider when you enter the PIN:") + SettingsModel.translationTrigger
187 text: NumberModel.isCanAllowedMode
188 //: LABEL DESKTOP_QML
189 ? qsTr("The following data of the ID card will be transferred to the provider when you enter the CAN:")
190 //: LABEL DESKTOP_QML
191 : qsTr("The following data of your ID card will be transferred to the provider when you enter the PIN:")
192 + SettingsModel.translationTrigger
189193 textStyle: Style.text.normal_inverse
190194
191195 FocusFrame {}
8282 controller.workflowState = IdentifyController.WorkflowStates.Initial
8383 break
8484 case "StateEditAccessRights":
85 controller.nextView(IdentifyView.SubViews.AccessRights)
85 if (NumberModel.isCanAllowedMode && SettingsModel.skipRightsOnCanAllowed) {
86 chatModel.transferAccessRights()
87 AuthModel.continueWorkflow()
88 } else {
89 controller.nextView(IdentifyView.SubViews.AccessRights)
90 }
8691 AuthModel.setInitialPluginType()
8792 break
8893 case "StateSelectReader":
4646 function showSettings() {
4747 readerView.precedingView = d.activeView
4848 d.view = IdentifyView.SubViews.ReaderSettings
49 ApplicationWindow.menuBar.updateActions()
49 appWindow.menuBar.updateActions()
5050 }
5151
5252 activeFocusOnTab: true
6666 editRights.showProviderInformation(false)
6767 if (d.activeView === IdentifyView.SubViews.PasswordInfo || d.activeView === IdentifyView.SubViews.PasswordLength) {
6868 d.view = IdentifyView.SubViews.Password
69 ApplicationWindow.menuBar.updateActions()
69 appWindow.menuBar.updateActions()
7070 }
7171 else if (d.activeView === IdentifyView.SubViews.ReaderSettings) {
7272 d.view = readerView.precedingView
73 ApplicationWindow.menuBar.updateActions()
73 appWindow.menuBar.updateActions()
7474 }
7575 }
7676
106106 visible: d.activeView === IdentifyView.SubViews.ReaderSettings
107107 onCloseView: {
108108 d.view = precedingView
109 ApplicationWindow.menuBar.updateActions()
109 appWindow.menuBar.updateActions()
110110 }
111111 }
112112
126126 BinaryDecisionView {
127127 visible: d.activeView === IdentifyView.SubViews.TransportPinReminder
128128
129 questionText: qsTr("Did you change the transport PIN already?") + SettingsModel.translationTrigger
130 questionSubText: qsTr("Prior to the first use of the online identification function you have to replace the transport PIN by an individual 6-digit PIN. Online identification with transport PIN is not possible.") + SettingsModel.translationTrigger
131 disagreeText: qsTr("No, change transport PIN now") + SettingsModel.translationTrigger
129 questionText: qsTr("Did you change the Transport PIN already?") + SettingsModel.translationTrigger
130 questionSubText: qsTr("Prior to the first use of the online identification function you have to replace the Transport PIN by an individual six-digit PIN. Online identification with Transport PIN is not possible.") + SettingsModel.translationTrigger
131 disagreeText: qsTr("No, change Transport PIN now") + SettingsModel.translationTrigger
132132
133133 onDisagree: {
134134 SettingsModel.transportPinReminder = false
188188
189189 onChangePinLength: {
190190 d.view = IdentifyView.SubViews.PasswordLength
191 ApplicationWindow.menuBar.updateActions()
191 appWindow.menuBar.updateActions()
192192 }
193193
194194 onRequestPasswordInfo: {
195195 d.view = IdentifyView.SubViews.PasswordInfo
196 ApplicationWindow.menuBar.updateActions()
196 appWindow.menuBar.updateActions()
197197 }
198198 }
199199
204204
205205 onClose: {
206206 d.view = IdentifyView.SubViews.Password
207 ApplicationWindow.menuBar.updateActions()
207 appWindow.menuBar.updateActions()
208208 }
209209 }
210210
221221 customSubAction: CancelAction {
222222 onClicked: {
223223 d.view = IdentifyView.SubViews.Password
224 ApplicationWindow.menuBar.updateActions()
224 appWindow.menuBar.updateActions()
225225 }
226226 }
227227 }
228228 resultType: ResultView.Type.IsInfo
229 //: INFO DESKTOP_QML The user clicked that the current PIN has 5 digits (transport PIN) which needs to be changed to a 6-digit PIN. The current process will be aborted and needs to be restarted *manually* by the user.
230 text: qsTr("First you have to change your 5-digit transport PIN you received in your in PIN letter into a 6-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.") + SettingsModel.translationTrigger
229 //: INFO DESKTOP_QML The user clicked that the current PIN has five digits (Transport PIN) which needs to be changed to a six-digit PIN. The current process will be aborted and needs to be restarted *manually* by the user.
230 text: qsTr("First you have to change your five-digit Transport PIN you received in your in PIN letter into a six-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.") + SettingsModel.translationTrigger
231231 onNextView: {
232232 ChangePinModel.startWorkflow()
233233 AuthModel.cancelWorkflowToChangePin()
271271 SettingsModel.translationTrigger
272272 if (connectivityManager.networkInterfaceActive) {
273273 //: INFO DESKTOP_QML Information message about cancellation process with present network connectivity
274 return qsTr("Please wait a moment...")
274 return qsTr("Please wait a moment.")
275275 }
276276 //: INFO DESKTOP_QML Information message about cancellation process without working network connectivity
277277 return qsTr("Network problemes detected, trying to reach server within 30 seconds.")
300300 }
301301 if (!inProgress || AuthModel.error) {
302302 //: INFO DESKTOP_QML Generic progress status message while no card communication is active.
303 return qsTr("Please wait a moment...")
303 return qsTr("Please wait a moment.")
304304 }
305305 if (AuthModel.isBasicReader) {
306306 //: INFO DESKTOP_QML Second line text if a basic card reader is used and data is exchanged with the card/server in the background. Is not actually visible since the basic reader password handling is done by EnterPasswordView.
307 return qsTr("Please don't move the ID card...")
307 return qsTr("Please don't move the ID card.")
308308 }
309309 if (!!NumberModel.inputError) {
310310 return NumberModel.inputError
314314 return qsTr("The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.")
315315 }
316316 //: INFO DESKTOP_QML Generic progress status message during authentication.
317 return qsTr("Please wait a moment...")
317 return qsTr("Please wait a moment.")
318318 }
319319 subTextColor: !AuthModel.isBasicReader && (NumberModel.inputError || NumberModel.pinDeactivated) ? Style.color.warning_text : Style.color.secondary_text_inverse
320320 progressValue: AuthModel.progressValue
325325 SelfAuthenticationData {
326326 visible: d.activeView === IdentifyView.SubViews.Data
327327
328 onVisibleChanged: ApplicationWindow.menuBar.updateActions()
328 onVisibleChanged: appWindow.menuBar.updateActions()
329329 onNextView: {
330330 identifyView.nextView(pName)
331331 AuthModel.continueWorkflow()
339339
340340 resultType: AuthModel.resultString ? ResultView.Type.IsError : ResultView.Type.IsSuccess
341341 text: AuthModel.resultString
342 header: AuthModel.errorHeader
343 //: INFO DESKTOP_QML Error code (string) of current GlobalStatus code, shown as header of popup.
344 popupTitle: qsTr("Error code: %1").arg(AuthModel.statusCode) + SettingsModel.translationTrigger
345 popupText: AuthModel.errorText
346 supportButtonsVisible: AuthModel.error && !AuthModel.isCancellationByUser()
347
342348 onNextView: {
343349 identifyView.nextView(pName)
344350 AuthModel.continueWorkflow()
345351 }
346 emailButtonVisible: AuthModel.error && !AuthModel.isCancellationByUser()
347352 onEmailButtonPressed: AuthModel.sendResultMail()
348353 }
349354 }
121121 onClicked: {
122122 let now = new Date().toLocaleDateString(Qt.locale(), "yyyy-MM-dd")
123123 let filenameSuggestion = "%1.%2.%3.pdf".arg(Qt.application.name).arg(qsTr("Information")).arg(now)
124 appWindow.openSaveFileDialog(SelfAuthModel.exportData, filenameSuggestion, "pdf")
124 appWindow.openSaveFileDialog(SelfAuthModel.exportData, filenameSuggestion, qsTr("Portable Document Format"), "pdf")
125125 }
126126 }
127127
9797 GButton {
9898 icon.source: "qrc:///images/npa.svg"
9999 anchors.horizontalCenter: parent.horizontalCenter
100 //: LABEL ANDROID_PHONE %1 can be "card access number (CAN)" or "PIN"
100 //: LABEL ANDROID_PHONE %1 can be "CAN" or "PIN"
101101 text: qsTr("Proceed to %1 entry").arg(
102102 NumberModel.isCanAllowedMode ?
103103 //: LABEL ANDROID_PHONE Inserted into "Proceed to %1 entry"
104 qsTr("card access number (CAN)") :
104 qsTr("CAN") :
105105 //: LABEL ANDROID_PHONE Inserted into "Proceed to %1 entry"
106106 qsTr("PIN")
107107 ) + SettingsModel.translationTrigger
114114 GText {
115115 width: parent.width
116116
117 //: LABEL ANDROID_PHONE
118 text: qsTr("The following data will be transferred to the provider when you enter the PIN:") + SettingsModel.translationTrigger
117 text: NumberModel.isCanAllowedMode
118 //: LABEL ANDROID_PHONE
119 ? qsTr("The following data of the ID card will be transferred to the provider when you enter the CAN:")
120 //: LABEL ANDROID_PHONE
121 : qsTr("The following data of your ID card will be transferred to the provider when you enter the PIN:")
122 + SettingsModel.translationTrigger
119123 }
120124
121125 Pane {
1414
1515
1616 SectionPage {
17 id: root
17 id: baseItem
1818
1919 navigationAction: NavigationAction {
2020 state: "cancel"
9292 icon.source: "qrc:///images/npa.svg"
9393 anchors.horizontalCenter: parent.horizontalCenter
9494 anchors.verticalCenter: parent.verticalCenter
95 //: LABEL ANDROID_TABLET %1 can be "card access number (CAN)" or "PIN"
95 //: LABEL ANDROID_TABLET %1 can be "CAN" or "PIN"
9696 text: qsTr("Proceed to %1 entry").arg(
9797 NumberModel.isCanAllowedMode ?
9898 //: LABEL ANDROID_TABLET Inserted into "Proceed to %1 entry"
99 qsTr("card access number (CAN)") :
99 qsTr("CAN") :
100100 //: LABEL ANDROID_TABLET Inserted into "Proceed to %1 entry"
101101 qsTr("PIN")
102102 ) + SettingsModel.translationTrigger
112112 GText {
113113 width: parent.width
114114
115 //: LABEL ANDROID_TABLET
116 text: qsTr("The following data will be transferred to the provider when you enter the PIN:") + SettingsModel.translationTrigger
115 text: NumberModel.isCanAllowedMode
116 //: LABEL ANDROID_TABLET
117 ? qsTr("The following data of the ID card will be transferred to the provider when you enter the CAN:")
118 //: LABEL ANDROID_TABLET
119 : qsTr("The following data of your ID card will be transferred to the provider when you enter the PIN:")
120 + SettingsModel.translationTrigger
117121 }
118122
119123 Pane {
106106 GButton {
107107 icon.source: "qrc:///images/npa.svg"
108108 anchors.horizontalCenter: parent.horizontalCenter
109 //: LABEL IOS_PHONE %1 can be "card access number (CAN)" or "PIN"
109 //: LABEL IOS_PHONE %1 can be "CAN" or "PIN"
110110 text: qsTr("Proceed to %1 entry").arg(
111111 NumberModel.isCanAllowedMode ?
112112 //: LABEL IOS_PHONE Inserted into "Proceed to %1 entry"
113 qsTr("card access number (CAN)") :
113 qsTr("CAN") :
114114 //: LABEL IOS_PHONE Inserted into "Proceed to %1 entry"
115115 qsTr("PIN")
116116 ) + SettingsModel.translationTrigger
123123 GText {
124124 width: parent.width
125125
126 //: LABEL IOS_PHONE
127 text: qsTr("The following data will be transferred to the provider when you enter the PIN:") + SettingsModel.translationTrigger
126 text: NumberModel.isCanAllowedMode
127 //: LABEL IOS_PHONE
128 ? qsTr("The following data of the ID card will be transferred to the provider when you enter the CAN:")
129 //: LABEL IOS_PHONE
130 : qsTr("The following data of your ID card will be transferred to the provider when you enter the PIN:")
131 + SettingsModel.translationTrigger
128132 textStyle: Style.text.normal_secondary
129133 }
130134
104104 GButton {
105105 icon.source: "qrc:///images/npa.svg"
106106 anchors.horizontalCenter: parent.horizontalCenter
107 //: LABEL IOS_TABLET %1 can be "card access number (CAN)" or "PIN"
107 //: LABEL IOS_TABLET %1 can be "CAN" or "PIN"
108108 text: qsTr("Proceed to %1 entry").arg(
109109 NumberModel.isCanAllowedMode ?
110110 //: LABEL IOS_TABLET Inserted into "Proceed to %1 entry"
111 qsTr("card access number (CAN)") :
111 qsTr("CAN") :
112112 //: LABEL IOS_TABLET Inserted into "Proceed to %1 entry"
113113 qsTr("PIN")
114114 ) + SettingsModel.translationTrigger
121121 GText {
122122 width: parent.width
123123
124 //: LABEL IOS_TABLET
125 text: qsTr("The following data will be transferred to the provider when you enter the PIN:") + SettingsModel.translationTrigger
124 text: NumberModel.isCanAllowedMode
125 //: LABEL IOS_TABLET
126 ? qsTr("The following data of the ID card will be transferred to the provider when you enter the CAN:")
127 //: LABEL IOS_TABLET
128 : qsTr("The following data of your ID card will be transferred to the provider when you enter the PIN:")
129 + SettingsModel.translationTrigger
126130 }
127131
128132 Pane {
108108 navBar.currentIndex = 0
109109 break
110110 case "StateEditAccessRights":
111 fireReplace(editRights)
111 if (NumberModel.isCanAllowedMode && SettingsModel.skipRightsOnCanAllowed) {
112 chatModel.transferAccessRights()
113 AuthModel.continueWorkflow()
114 } else {
115 fireReplace(editRights)
116 }
112117 AuthModel.setInitialPluginType()
113118 break
114119 case "StateSelectReader":
137137 SettingsModel.translationTrigger
138138 if (connectivityManager.networkInterfaceActive) {
139139 //: INFO DESKTOP_QML Information message about cancellation process with present network connectivity
140 return qsTr("Please wait a moment...")
140 return qsTr("Please wait a moment.")
141141 }
142142 //: INFO DESKTOP_QML Information message about cancellation process without working network connectivity
143143 return qsTr("Network problemes detected, trying to reach server within 30 seconds.")
144144 }
145145 progressBarVisible: false
146 subTextColor: !connectivityManager.networkInterfaceActive ? Style.color.warning_text : Style.color.secondary_text_inverse
146 subTextColor: !connectivityManager.networkInterfaceActive ? Style.color.warning_text : Style.color.secondary_text
147147 }
148148
149149 ProgressView {
171171 }
172172 //: INFO DESKTOP_QML Generic progress status message while no card communication is active.
173173 if (!inProgress || AuthModel.error) {
174 return qsTr("Please wait a moment...")
174 return qsTr("Please wait a moment.")
175175 }
176176 if (AuthModel.isBasicReader) {
177177 //: INFO ANDROID IOS Second line text if a basic card reader is used and background communication with the card/server is running. Is not actually visible since the basic reader password handling is done by EnterPasswordView.
178 return qsTr("Please don't move the ID card...")
178 return qsTr("Please don't move the ID card.")
179179 }
180180 if (!!NumberModel.inputError) {
181181 return NumberModel.inputError
190190 }
191191 if (identifyController.workflowState === IdentifyController.WorkflowStates.Can) {
192192 //: INFO ANDROID IOS The PIN was entered wrongfully two times, the third attempts requires additional CAN verification, hint where the CAN is found.
193 return qsTr("A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.")
193 return qsTr("A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.")
194194 }
195195
196196 //: INFO ANDROID IOS Generic status message during the authentication process.
197 return qsTr("Please wait a moment...")
197 return qsTr("Please wait a moment.")
198198 }
199199 subTextColor: !AuthModel.isBasicReader && (NumberModel.inputError
200200 || NumberModel.pinDeactivated
222222 id: changeToTransportPinView
223223 navigationAction: NavigationAction { state: "back"; onClicked: fireReplace(enterPinView) }
224224 //: LABEL ANDROID IOS
225 title: qsTr("Change transport PIN") + SettingsModel.translationTrigger
225 title: qsTr("Change Transport PIN") + SettingsModel.translationTrigger
226226 resultType: ResultView.Type.IsInfo
227227 //: LABEL ANDROID IOS
228228 buttonText: qsTr("Change PIN") + SettingsModel.translationTrigger
229 //: INFO ANDROID IOS The user clicked that the current PIN has 5 digits (transport PIN), it needs to be changed to an ordinary 6-digit PIN. The current process needs to be restarted *manually* by the user.
230 text: qsTr("First you have to change your 5-digit transport PIN you received in your in PIN letter into a 6-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.") + SettingsModel.translationTrigger
229 //: INFO ANDROID IOS The user clicked that the current PIN has five digits (Transport PIN), it needs to be changed to an ordinary six-digit PIN. The current process needs to be restarted *manually* by the user.
230 text: qsTr("First you have to change your five-digit Transport PIN you received in your in PIN letter into a six-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.") + SettingsModel.translationTrigger
231231 onClicked: {
232232 firePop()
233233 AuthModel.setSkipRedirect(true)
239239
240240 ResultView {
241241 id: cardPositionView
242 navigationAction: NavigationAction { state: "cancel"; onClicked: AuthModel.cancelWorkflow() }
242243 //: LABEL ANDROID IOS
243244 title: qsTr("Identify") + SettingsModel.translationTrigger
244245 resultType: ResultView.Type.IsInfo
8282 GButton {
8383 id: saveToFile
8484
85 anchors.fill: parent
86 anchors.rightMargin: Constants.groupbox_spacing
87
8588 Accessible.description: qsTr("Save diagnosis to textfile") + SettingsModel.translationTrigger
8689
8790 icon.source: "qrc:///images/icon_save.svg"
8891 //: LABEL DESKTOP_QML
8992 text: qsTr("Save to file") + SettingsModel.translationTrigger
9093 tintIcon: true
94 enableButton: !SelfDiagnosisModel.running || !timeout.running
95 //: LABEL DESKTOP_QML
96 disabledTooltipText: qsTr("Diagnosis is still running") + SettingsModel.translationTrigger
97 //: LABEL DESKTOP_QML
98 enabledTooltipText: SelfDiagnosisModel.running ? (qsTr("Diagnosis may be incomplete") + SettingsModel.translationTrigger) : ""
9199 onClicked: {
92100 var filenameSuggestion = "%1.%2.%3.txt".arg(Qt.application.name).arg(qsTr("Diagnosis")).arg(SelfDiagnosisModel.getCreationTimeString())
93 appWindow.openSaveFileDialog(SelfDiagnosisModel.saveToFile, filenameSuggestion, "txt")
101 appWindow.openSaveFileDialog(SelfDiagnosisModel.saveToFile, filenameSuggestion, qsTr("Textfiles"), "txt")
94102 }
103 }
104
105 Timer {
106 id: timeout
107
108 interval: 10000
109 running: true
110 repeat: false
95111 }
96112 }
97113 }
66 import Governikus.Global 1.0
77 import Governikus.TitleBar 1.0
88 import Governikus.View 1.0
9 import Governikus.Type.ApplicationModel 1.0
910 import Governikus.Type.SettingsModel 1.0
1011
1112
2324
2425 Column
2526 {
27 id: column
28
2629 anchors.fill: parent
2730 anchors.margins: Constants.component_spacing
2831
4447 }
4548 }
4649 }
50
51 MouseArea {
52 property int advancedSettingsCounter: 0
53
54 anchors.fill: column
55
56 onClicked: {
57 advancedSettingsCounter += 1
58
59 switch (advancedSettingsCounter) {
60 case 7:
61 case 8:
62 case 9:
63 //: INFO ANDROID IOS Used in notifications when the user taps the version information
64 ApplicationModel.showFeedback(qsTr("%1 more presses to toggle the advanced settings.").arg(10 - advancedSettingsCounter), true)
65 break;
66 case 10:
67 SettingsModel.advancedSettings = !SettingsModel.advancedSettings
68 ApplicationModel.showFeedback(
69 SettingsModel.advancedSettings ?
70 //: LABEL ANDROID IOS
71 qsTr("Advanced settings activated.") :
72 //: LABEL ANDROID IOS
73 qsTr("Advanced settings deactivated.")
74 )
75 advancedSettingsCounter = 0
76 break;
77 }
78 }
79 }
4780 }
4881 }
3838 width: view.horizontalItemSpace
3939
4040 //: LABEL DESKTOP_QML
41 title: qsTr("Self-Authentication") + SettingsModel.translationTrigger
41 title: qsTr("See my personal data") + SettingsModel.translationTrigger
4242 image: "qrc:/images/desktop/main_identify.svg"
4343
4444 onClicked: sectionPage.nextView(SectionPage.Views.SelfAuthentication)
133133 width: view.horizontalItemSpace
134134
135135 //: LABEL DESKTOP_QML
136 title: qsTr("PIN-Management") + SettingsModel.translationTrigger
136 title: qsTr("Change PIN") + SettingsModel.translationTrigger
137137 image: "qrc:/images/main_pin.svg"
138138
139139 onClicked: ChangePinModel.startWorkflow()
103103 iconSource: "qrc:/images/desktop/info_manual.svg"
104104 //: LABEL DESKTOP_QML
105105 buttonText: qsTr("Open website") + SettingsModel.translationTrigger
106 //: LABEL DESKTOP_QML
107 buttonTooltip: qsTr("Help") + SettingsModel.translationTrigger
106 buttonTooltip: ApplicationModel.onlineHelpUrl("index")
108107 buttonIconSource: "qrc:///images/link_external.svg"
109108 onClicked: ApplicationModel.openOnlineHelp("index")
110109 }
99 import Governikus.FeedbackView 1.0
1010 import Governikus.InformationView 1.0
1111 import Governikus.HistoryView 1.0
12 import Governikus.DeveloperView 1.0
1312 import Governikus.TutorialView 1.0
1413 import Governikus.View 1.0
1514 import Governikus.SettingsView 1.0
2120 SectionPage {
2221 id: moreView
2322
24 //: LABEL ANDROID IOS DESKTOP_QML
23 //: LABEL IOS
2524 title: qsTr("More") + SettingsModel.translationTrigger
2625
2726 content: ColumnLayout {
3736 }
3837
3938 MoreViewMenuItem {
40 //: LABEL ANDROID IOS DESKTOP_QML
39 //: LABEL IOS
4140 text: qsTr("Version information") + SettingsModel.translationTrigger
4241 icon: "qrc:///images/iOS/more/icon_mehr_npa.svg"
4342 onClicked: firePush(versionInformationPage)
4443 }
4544
4645 MoreViewMenuItem {
47 //: LABEL ANDROID IOS DESKTOP_QML
46 //: LABEL IOS
4847 text: qsTr("Settings") + SettingsModel.translationTrigger
4948 icon: "qrc:///images/iOS/more/icon_mehr_settings.svg"
5049 onClicked: firePush(settingsView)
5150 }
5251
5352 MoreViewMenuItem {
54 //: LABEL ANDROID IOS DESKTOP_QML
53 //: LABEL IOS
5554 text: qsTr("History") + SettingsModel.translationTrigger
5655 icon: "qrc:///images/iOS/more/icon_mehr_verlauf.svg"
5756 onClicked: {
6059 }
6160
6261 MoreViewMenuItem {
63 //: LABEL ANDROID IOS DESKTOP_QML
62 //: LABEL IOS
6463 text: qsTr("Tutorial") + SettingsModel.translationTrigger
6564 icon: "qrc:///images/iOS/more/icon_mehr_tutorial.svg"
6665 onClicked: firePush(tutorialView)
6766 }
6867
6968 MoreViewMenuItem {
70 //: LABEL ANDROID IOS DESKTOP_QML
69 //: LABEL IOS
7170 text: qsTr("Show log") + SettingsModel.translationTrigger
7271 icon: "qrc:///images/iOS/more/icon_mehr_log.svg"
7372 onClicked: firePush(logView)
7473 }
7574
7675 MoreViewLinkMenuItem {
77 //: LABEL ANDROID IOS DESKTOP_QML
76 //: LABEL IOS
7877 text: qsTr("FAQ") + SettingsModel.translationTrigger
7978 icon: "qrc:///images/iOS/more/icon_mehr_info.svg"
80 //: LABEL ANDROID IOS DESKTOP_QML
79 //: LABEL IOS
8180 onClicked: Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/qa/frequently-asked-questions/"))
8281 }
8382
8483 MoreViewLinkMenuItem {
85 //: LABEL ANDROID IOS DESKTOP_QML
84 //: LABEL IOS
8685 text: qsTr("Support") + SettingsModel.translationTrigger
8786 icon: "qrc:///images/iOS/more/icon_mehr_fragen.svg"
88 //: LABEL ANDROID IOS DESKTOP_QML
87 //: LABEL IOS
8988 onClicked: Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/qa/support/"))
9089 }
9190
9291 MoreViewLinkMenuItem {
93 //: LABEL ANDROID IOS DESKTOP_QML
92 //: LABEL IOS
9493 text: qsTr("Rate app") + SettingsModel.translationTrigger;
9594 icon: "qrc:///images/iOS/more/icon_mehr_favorit.svg";
9695 onClicked: {
101100 }
102101
103102 MoreViewLinkMenuItem {
104 //: LABEL ANDROID IOS DESKTOP_QML
103 //: LABEL IOS
105104 text: qsTr("Report error") + SettingsModel.translationTrigger
106105 icon: "qrc:///images/iOS/more/icon_mehr_report.svg"
107106 onClicked: LogModel.mailLog()
108107 }
109108
110109 MoreViewLinkMenuItem {
111 //: LABEL ANDROID IOS DESKTOP_QML
110 //: LABEL IOS
112111 text: qsTr("Release notes") + SettingsModel.translationTrigger;
113112 icon: "qrc:///images/iOS/more/icon_mehr_info.svg";
114113 onClicked: {
115114 if (Qt.platform.os === "android") {
116 //: LABEL ANDROID IOS DESKTOP_QML
115 //: LABEL IOS
117116 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/android/"))
118117 }
119118 else if (Qt.platform.os === "ios") {
120 //: LABEL ANDROID IOS DESKTOP_QML
119 //: LABEL IOS
121120 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/ios/"))
122121 }
123122 else {
124 //: LABEL ANDROID IOS DESKTOP_QML
123 //: LABEL IOS
125124 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/windows-and-mac/"))
126125 }
127126 }
128127 }
129128
130129 MoreViewLinkMenuItem {
131 //: LABEL ANDROID IOS DESKTOP_QML
130 //: LABEL IOS
132131 text: qsTr("Software license") + SettingsModel.translationTrigger
133132 icon: "qrc:///images/iOS/more/icon_mehr_license.svg"
134 showSeparator: plugin.debugBuild
133 showSeparator: false
135134 onClicked: {
136135 if (Qt.platform.os === "android") {
137 //: LABEL ANDROID IOS DESKTOP_QML
136 //: LABEL IOS
138137 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/android/"))
139138 }
140139 else if (Qt.platform.os === "ios") {
141 //: LABEL ANDROID IOS DESKTOP_QML
140 //: LABEL IOS
142141 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/ios/"))
143142 }
144143 else {
145 //: LABEL ANDROID IOS DESKTOP_QML
144 //: LABEL IOS
146145 Qt.openUrlExternally(qsTr("https://www.ausweisapp.bund.de/en/download/windows-and-mac/"))
147146 }
148147 }
149 }
150
151 MoreViewMenuItem {
152 visible: plugin.debugBuild
153
154 //: LABEL ANDROID IOS DESKTOP_QML
155 text: qsTr("Developer options") + SettingsModel.translationTrigger
156 icon: "qrc:///images/settings_icon.svg"
157 showSeparator: false
158 tintIcon: true
159
160 onClicked: firePush(developerView)
161148 }
162149
163150 GSeparator {
179166 }
180167
181168 Component {
182 id: developerView
183
184 DeveloperView {}
185 }
186
187 Component {
188169 id: logView
189170
190171 LogView {}
4646
4747 ListElement {
4848 image: "qrc:///images/android/navigation/remoteleser.svg"
49 desc: QT_TR_NOOP("Smartphone as card reader")
49 desc: QT_TR_NOOP("Remote service")
5050 condition: "remoteservice"
5151 }
5252
6161 image: "qrc:///images/android/navigation/support.svg"
6262 desc: QT_TR_NOOP("Help & Feedback")
6363 condition: "feedback"
64 section: "settings"
65 }
66
67 ListElement {
68 desc: QT_TR_NOOP("Developer options")
69 image: "qrc:///images/settings_icon.svg"
70 condition: "developeroptions"
7164 section: "settings"
7265 }
7366 }
115108 }
116109 highlightFollowsCurrentItem: false
117110 delegate: NavigationItem {
118 // Hide developer options if we are not using developer build (debug build)
119 visible: condition !== "developeroptions" || plugin.debugBuild
120111 height: 45
121112 width: content.width
122113
0 /*
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQml 2.10
5
6
7 QtObject {}
0 /*
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import Governikus.Type.ApplicationModel 1.0
5 import Governikus.Type.AuthModel 1.0
6
7 import QtWinExtras 1.0
8
9
10 TaskbarButton {
11 progress.minimum: 0
12 progress.maximum: 100
13 progress.value: AuthModel.progressValue
14 progress.visible: ApplicationModel.currentWorkflow === "selfauthentication" || ApplicationModel.currentWorkflow === "authentication"
15 }
00 module ProgressView
11
22 ProgressView 1.0 ProgressView.qml
3 TaskbarProgress 1.0 TaskbarProgress.qml
2626
2727 activeFocusOnTab: true
2828
29 RowLayout {
29 Row {
3030 id: layout
3131
3232 anchors.left: parent.left
4646 GText {
4747 id: text
4848
49 Layout.fillWidth: true
49 width: parent.width - image.width
5050
5151 linkColor: color
5252 }
111111 anchors.rightMargin: Constants.pane_padding
112112
113113 //: LABEL DESKTOP_QML
114 text: qsTr("To online application") + SettingsModel.translationTrigger
115 icon.source: providerIcon
114 text: qsTr("To provider") + SettingsModel.translationTrigger
115 tintIcon: true
116 icon.source: "qrc:///images/link_external.svg"
116117 buttonColor: categoryColor
117118 enabled: baseItem.address !== ""
118119 onClicked: baseItem.clickButton()
5353 //: LABEL DESKTOP_QML
5454 text: qsTr("Service:") + SettingsModel.translationTrigger
5555 font.weight: Font.Bold
56 maximumLineCount: 1
5657 }
5758
5859 GText {
6970 //: LABEL DESKTOP_QML
7071 text: qsTr("Provider:") + SettingsModel.translationTrigger
7172 font.weight: Font.Bold
73 maximumLineCount: 1
7274 }
7375
7476 GText {
4848
4949 GButton {
5050 id: button
51 //: LABEL ANDROID_TABLET IOS_TABLET
52 text: qsTr("ONLINE APPLICATION") + SettingsModel.translationTrigger
53 buttonColor: baseItem.titleBarColor
51
5452 anchors.left: iconContainer.right
5553 anchors.leftMargin: Constants.component_spacing
5654 anchors.bottom: iconContainer.bottom
55
56 //: LABEL ANDROID_TABLET IOS_TABLET
57 text: qsTr("To provider") + SettingsModel.translationTrigger
58 tintIcon: true
59 icon.source: "qrc:///images/link_external.svg"
60 buttonColor: baseItem.titleBarColor
5761 enabled: baseItem.address !== ""
5862
5963 onClicked: {
157157
158158 GButton {
159159 id: providerButton
160
160161 anchors.right: parent.right
162
161163 buttonColor: shadowColor
162164 //: LABEL ANDROID IOS
163165 text: qsTr("To provider") + SettingsModel.translationTrigger
166 tintIcon: true
167 icon.source: "qrc:///images/link_external.svg"
168
164169 onClicked: {
165170 Qt.openUrlExternally(selectedProvider ? selectedProvider.address : "")
166171 }
110110 height: Style.dimens.high_contrast_item_border
111111 color: Style.color.high_contrast_item_border
112112 }
113
114 GText {
115 id: providerText
116
117 anchors.fill: parent
118 anchors.leftMargin: Constants.text_spacing
119 anchors.rightMargin: Constants.text_spacing
120
121 horizontalAlignment: Text.AlignHCenter
122 verticalAlignment: Text.AlignVCenter
123
124 text: provider.homepageBase
125
126 elide: Text.ElideRight
127 maximumLineCount: 1
128 textStyle: Style.text.hint_inverse
129 }
130113 }
131114 }
132115
1515 Accessible.description: qsTr("Open provider details for") + ' ' + display + SettingsModel.translationTrigger
1616
1717 text: display
18 footerText: providerAddressDomain
1918
2019 onClicked: firePushWithProperties(providerDetailView, {providerModelItem: model})
2120 }
5555 color: Category.displayColor(provider.category)
5656 height: baseItem.footerHeight
5757 width: parent.width
58
59 GText {
60 text: provider.homepageBase
61
62 anchors.centerIn: parent
63
64 Accessible.ignored: true
65
66 leftPadding: Constants.pane_padding
67 rightPadding: Constants.pane_padding
68 elide: Text.ElideRight
69 maximumLineCount: 1
70
71 textStyle: Style.text.normal_inverse
72 }
7358 }
7459 }
7560
4444
4545 text: '<html>' + providerName + '</html>'
4646 elide: Text.ElideRight
47 maximumLineCount: 4
47 maximumLineCount: 3
4848 textStyle: Style.text.hint_secondary
4949 }
5050 }
3939
4040 Layout.fillWidth: true
4141
42 elide: Text.ElideRight
43 maximumLineCount: 1
4244 textStyle: Style.text.normal_accent
4345 }
4446
4749
4850 Layout.fillWidth: true
4951
52 elide: Text.ElideRight
53 maximumLineCount: 1
5054 textStyle: Style.text.hint_secondary
5155 }
5256 }
1919
2020 readonly property string currentPin: RemoteServiceModel.psk.toString()
2121 readonly property bool isPairing: RemoteServiceModel.running && currentPin !== ""
22 readonly property bool wifiEnabled: ApplicationModel.wifiEnabled
2223
2324 navigationAction: NavigationAction {
2425 state: RemoteServiceModel.running ? "cancel" : ""
9091 Layout.preferredWidth: Math.max(pairingButton.implicitWidth, startButton.implicitWidth)
9192 Layout.alignment: Qt.AlignHCenter
9293
93 buttonColor: running ? Constants.red : Constants.darkgreen
94 enabled: (canEnableNfc || RemoteServiceModel.runnable || running) && !serviceIsStarting
94 buttonColor: wifiEnabled ? (running ? Constants.red : Constants.darkgreen) : Style.color.button
95 enabled: (canEnableNfc || RemoteServiceModel.runnable || running || !wifiEnabled) && !serviceIsStarting
9596 text: {
9697 SettingsModel.translationTrigger; // Bind this evaluation to the trigger.
9798
98 if (canEnableNfc) {
99 if (!wifiEnabled) {
100 //: LABEL ANDROID IOS
101 return qsTr("Enable WiFi");
102 } else if (canEnableNfc) {
99103 //: LABEL ANDROID IOS
100104 return qsTr("Enable NFC");
101105 } else if (running) {
107111 }
108112 }
109113 onClicked: {
110 if (canEnableNfc) {
114 if (!wifiEnabled) {
115 ApplicationModel.enableWifi()
116 } else if (canEnableNfc) {
111117 ApplicationModel.showSettings(ApplicationModel.SETTING_NFC)
112118 } else {
113119 if (!running) {
106106 Accessible.role: Accessible.StaticText
107107 Accessible.name: text
108108
109 //: INFO ANDROID IOS No SaC was found on the network, both devices need to be connected to the same wifi network.
109 //: INFO ANDROID IOS No SaC was found on the network, both devices need to be connected to the same WiFi network.
110110 text: qsTr("No unpaired smartphone as card reader (SaC) available. Please make sure that the smartphone as card reader (SaC) functionality in AusweisApp2 on your other device is activated an that both devices are connected to the same WiFi.") + SettingsModel.translationTrigger
111111 textStyle: Style.text.normal_secondary
112112 }
1010 import Governikus.Style 1.0
1111 import Governikus.View 1.0
1212 import Governikus.Type.ApplicationModel 1.0
13 import Governikus.Type.LogModel 1.0
1314 import Governikus.Type.SettingsModel 1.0
1415
1516
2324 }
2425
2526 signal emailButtonPressed()
26 property alias emailButtonVisible: emailButton.visible
27 property alias supportButtonsVisible: supportButtonsLayout.visible
2728 property alias text: resultText.text
29 property alias header: resultHeader.text
2830 property int resultType: ResultView.Type.IsSuccess
2931 property alias buttonType: button.buttonType
32 property alias popupText: detailedResultPopup.text
33 property alias popupTitle: detailedResultPopup.title
3034
3135 Accessible.name: qsTr("Result view") + SettingsModel.translationTrigger
3236 Accessible.description: qsTr("This is the result of an authentication.") + SettingsModel.translationTrigger
5559 }
5660
5761 GText {
62 id: resultHeader
63
64 visible: text !== ""
65 Layout.alignment: Qt.AlignHCenter
66 Layout.maximumWidth: Style.dimens.max_text_width
67
68 activeFocusOnTab: true
69
70 horizontalAlignment: Text.AlignHCenter
71 verticalAlignment: Text.AlignVCenter
72 textStyle: Style.text.header_inverse
73
74 FocusFrame {}
75 }
76
77 GText {
5878 id: resultText
5979
6080 visible: text !== ""
6282 Layout.maximumWidth: Style.dimens.max_text_width
6383
6484 activeFocusOnTab: true
65 Accessible.name: resultText.text
6685
6786 horizontalAlignment: Text.AlignHCenter
6887 verticalAlignment: Text.AlignVCenter
69 textStyle: Style.text.title_inverse
88 textStyle: resultHeader.visible ? Style.text.header_secondary_inverse : Style.text.header_inverse
7089
7190 FocusFrame {}
7291 }
7392
74 GButton {
75 id: emailButton
93 RowLayout {
94 id: supportButtonsLayout
7695
7796 visible: false
97 Layout.fillWidth: true
7898 Layout.alignment: Qt.AlignHCenter
7999
80 icon.source: "qrc:///images/provider/mail.svg"
81 //: LABEL DESKTOP_QML
82 text: qsTr("Send email") + SettingsModel.translationTrigger
83 onClicked: baseItem.emailButtonPressed()
100 GButton {
101 icon.source: "qrc:///images/provider/mail.svg"
102 //: LABEL DESKTOP_QML
103 text: qsTr("Send email") + SettingsModel.translationTrigger
104 onClicked: baseItem.emailButtonPressed()
105 }
106
107 GButton {
108 icon.source: "qrc:/images/desktop/info_application_log.svg"
109 //: LABEL DESKTOP_QML
110 text: qsTr("Save logfile") + SettingsModel.translationTrigger
111 onClicked: {
112 LogModel.setLogfile(0)
113 let filenameSuggestion = LogModel.createLogFileName(LogModel.getCurrentLogfileDate())
114 appWindow.openSaveFileDialog(LogModel.saveCurrentLogfile, filenameSuggestion, qsTr("Logfiles"), "log")
115 }
116 }
117
118 GButton {
119 visible: popupTitle !== "" || popupText !== ""
120
121 icon.source: "qrc:/images/desktop/main_info.svg"
122 //: LABEL DESKTOP_QML
123 text: qsTr("See details") + SettingsModel.translationTrigger
124 onClicked: detailedResultPopup.open()
125 }
84126 }
127
85128
86129 NavigationButton {
87130 id: button
96139 onClicked: baseItem.nextView(SectionPage.Views.Main)
97140 }
98141 }
142
143 ConfirmationPopup {
144 id: detailedResultPopup
145
146 style: ConfirmationPopup.PopupStyle.OkButton
147 }
99148 }
2525 case 8:
2626 case 9:
2727 //: INFO ANDROID IOS Used in notifications when the user taps the magnifying glass
28 ApplicationModel.showFeedback(qsTr("%1 more presses to toggle the testmode for the self-authentication.").arg(10 - d.testPkiCounter) + SettingsModel.translationTrigger, true)
28 ApplicationModel.showFeedback(qsTr("%1 more presses to toggle the testmode for the self-authentication.").arg(10 - d.testPkiCounter), true)
2929 break;
3030 case 10:
3131 SettingsModel.useSelfauthenticationTestUri = !SettingsModel.useSelfauthenticationTestUri
3232 if (SettingsModel.useSelfauthenticationTestUri) {
3333 //: INFO ANDROID IOS Used in notifications when the user taps the magnifying glass
34 ApplicationModel.showFeedback(qsTr("Testmode for the self-authentication activated.") + SettingsModel.translationTrigger, true)
34 ApplicationModel.showFeedback(qsTr("Testmode for the self-authentication activated."), true)
3535 } else {
3636 //: INFO ANDROID IOS Used in notifications when the user taps the magnifying glass
37 ApplicationModel.showFeedback(qsTr("Testmode for the self-authentication deactivated.") + SettingsModel.translationTrigger, true)
37 ApplicationModel.showFeedback(qsTr("Testmode for the self-authentication deactivated."), true)
3838 }
3939 d.testPkiCounter = 0;
4040 break;
6666
6767 MouseArea {
6868 anchors.fill: parent
69 onClicked: {
70 d.toggleTestPki()
71 }
69 onClicked: d.toggleTestPki()
7270 }
7371 }
7472
124122 text: qsTr("See my personal data") + SettingsModel.translationTrigger
125123
126124 enabled: ApplicationModel.currentWorkflow !== "authentication"
127 onClicked: {
128 SelfAuthModel.startWorkflow()
129 }
125 onClicked: SelfAuthModel.startWorkflow()
130126 }
131127 }
0 /*
1 * \copyright Copyright (c) 2019-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5
6 import Governikus.EnterPasswordView 1.0
7 import Governikus.ProgressView 1.0
8 import Governikus.ResultView 1.0
9 import Governikus.TitleBar 1.0
10 import Governikus.Type.ApplicationModel 1.0
11 import Governikus.Type.NumberModel 1.0
12 import Governikus.Type.RemoteServiceModel 1.0
13 import Governikus.Type.SettingsModel 1.0
14 import Governikus.View 1.0
15
16 SectionPage {
17 id: root
18
19 signal closeView()
20
21 function showPairingInformation() {
22 d.view = ConnectSacView.SubView.PairingInfo
23 d.externalMoreInformation = true
24 }
25
26 enum SubView {
27 None,
28 EnterPassword,
29 PairingInfo,
30 WaitForPairing,
31 PairingFailed
32 }
33
34 QtObject {
35 id: d
36
37 property int view
38 property bool externalMoreInformation: false
39 }
40
41 onVisibleChanged: {
42 if (visible) {
43 d.view = ConnectSacView.SubView.EnterPassword
44 } else {
45 d.view = ConnectSacView.SubView.None
46 d.externalMoreInformation = false
47 }
48 appWindow.menuBar.updateActions()
49 }
50
51 titleBarAction: TitleBarAction {
52 visible: d.view !== ConnectSacView.SubView.PairingInfo || !d.externalMoreInformation
53 //: LABEL DESKTOP_QML
54 text: qsTr("Pairing") + SettingsModel.translationTrigger
55 helpTopic: "readerDeviceTab"
56 rootEnabled: false
57 customSubAction: CancelAction {
58 visible: true
59 onClicked: root.closeView()
60 }
61
62 onClicked: {
63 if (d.view === ConnectSacView.SubView.PairingInfo && !d.externalMoreInformation) {
64 d.view = ConnectSacView.SubView.EnterPassword
65 }
66 }
67 }
68
69 EnterPasswordView {
70 visible: d.view === ConnectSacView.SubView.EnterPassword
71
72 statusIcon: "qrc:///images/phone_to_pc.svg"
73 passwordType: NumberModel.PASSWORD_REMOTE_PIN
74
75 onPasswordEntered: d.view = ConnectSacView.SubView.WaitForPairing
76
77 onRequestPasswordInfo: {
78 d.view = ConnectSacView.SubView.PairingInfo
79 appWindow.menuBar.updateActions()
80 }
81 }
82
83 PasswordInfoView {
84 visible: d.view === ConnectSacView.SubView.PairingInfo
85
86 passwordType: NumberModel.PASSWORD_REMOTE_PIN
87 titleBarAction.rootEnabled: ApplicationModel.currentWorkflow === "" && d.externalMoreInformation
88
89 onClose: {
90 if (d.externalMoreInformation) {
91 root.closeView()
92 d.externalMoreInformation = false
93 } else {
94 d.view = ConnectSacView.SubView.EnterPassword
95 }
96 appWindow.menuBar.updateActions()
97 }
98 }
99
100 ProgressView {
101 visible: d.view === ConnectSacView.SubView.WaitForPairing
102
103 //: LABEL DESKTOP_QML
104 text: qsTr("Pairing the device ...") + SettingsModel.translationTrigger
105
106 Connections {
107 enabled: visible
108 target: RemoteServiceModel
109
110 onFirePairingFailed: {
111 pairingFailedView.deviceName = pDeviceName
112 pairingFailedView.errorMessage = pErrorMessage
113 d.view = ConnectSacView.SubView.PairingFailed
114 }
115
116 onFirePairingSuccess: {
117 ApplicationModel.showFeedback(qsTr("The device \"%1\" has been paired.").arg(pDeviceName))
118 root.closeView()
119 }
120 }
121 }
122
123 ResultView {
124 id: pairingFailedView
125
126 property string deviceName
127 property string errorMessage
128
129 visible: d.view === ConnectSacView.SubView.PairingFailed
130
131 //: ERROR DESKTOP_QML An error occurred while pairing the device.
132 text: qsTr("Pairing to \"%1\" failed:").arg(deviceName) + "<br/>\"%2\"".arg(errorMessage) + SettingsModel.translationTrigger
133 resultType: ResultView.Type.IsError
134 onNextView: root.closeView()
135 }
136 }
4646 checked: SettingsModel.showBetaTesting
4747 onCheckedChanged: SettingsModel.showBetaTesting = checked
4848 }
49
50 ToggleableOption {
51 //: LABEL DESKTOP_QML
52 text: qsTr("Support CAN allowed mode") + SettingsModel.translationTrigger
53 checked: SettingsModel.enableCanAllowed
54 onCheckedChanged: SettingsModel.enableCanAllowed = checked
55 }
56
57 ToggleableOption {
58 //: LABEL DESKTOP_QML
59 text: qsTr("Skip rights page in CAN allowed mode") + SettingsModel.translationTrigger
60 enabled: SettingsModel.enableCanAllowed
61 checked: SettingsModel.skipRightsOnCanAllowed
62 onCheckedChanged: SettingsModel.skipRightsOnCanAllowed = checked
63 }
4964 }
147147 borderColor: Style.color.focus_indicator
148148 }
149149 }
150
151 GSeparator {
152 visible: customProxySetting.visible
153
154 Layout.fillWidth: true
155 }
156
157 GText {
158 visible: customProxySetting.visible
159
160 activeFocusOnTab: true
161
162 //: LABEL DESKTOP_QML
163 text: qsTr("Network") + SettingsModel.translationTrigger
164 textStyle: Style.text.header_accent
165
166 FocusFrame {
167 borderColor: Style.color.focus_indicator
168 }
169 }
170
171 ToggleableOption {
172 id: customProxySetting
173
174 visible: SettingsModel.customProxyAttributesPresent
175
176 activeFocusOnTab: true
177
178 //: LABEL DESKTOP_QML
179 text: qsTr("Use the proxy (%1) specified during the installation.").arg(SettingsModel.customProxyUrl) + SettingsModel.translationTrigger
180 checked: SettingsModel.useCustomProxy
181 onCheckedChanged: SettingsModel.useCustomProxy = checked
182 }
150183 }
2323 signal unpairDevice(string pDeviceId)
2424 signal moreInformation()
2525
26 implicitWidth: column.implicitWidth
27 implicitHeight: column.implicitHeight
28
2629 ReaderScanEnabler {
2730 plugInType: ReaderPlugIn.REMOTE
2831 }
2932
3033 Column {
34 id: column
35
3136 anchors.fill: parent
3237 spacing: Constants.component_spacing
3338
8994
9095 model: RemoteServiceModel.availableRemoteDevices
9196 delegate: RemoteReaderDelegate {
92 width: parent.width
97 width: availableDevices.width
9398 height: implicitHeight + Constants.pane_padding
9499 onPairDevice: root.pairDevice(pDeviceId)
95100 }
77
88 import Governikus.Global 1.0
99 import Governikus.Style 1.0
10 import Governikus.Type.ApplicationModel 1.0
1011 import Governikus.Type.SettingsModel 1.0
1112 import Governikus.Type.HistoryModel 1.0
1213 import Governikus.View 1.0
3233 activeFocusOnTab: true
3334
3435 //: LABEL DESKTOP_QML
35 text: qsTr("Save authentification history") + SettingsModel.translationTrigger
36 text: qsTr("Save authentication history") + SettingsModel.translationTrigger
3637 checked: SettingsModel.historyEnabled
3738 onCheckedChanged: SettingsModel.historyEnabled = checked
3839 }
7475 activeFocusOnTab: true
7576
7677 //: LABEL DESKTOP_QML
77 text: qsTr("Avoid visual feedback in the on screen keypad") + SettingsModel.translationTrigger
78 checked: SettingsModel.visualPrivacy
78 text: qsTr("Shuffle keypad buttons") + SettingsModel.translationTrigger
79 checked: SettingsModel.shuffleScreenKeyboard
7980 enabled: SettingsModel.useScreenKeyboard
80 onCheckedChanged: SettingsModel.visualPrivacy = checked
81 onCheckedChanged: SettingsModel.shuffleScreenKeyboard = checked
8182 }
8283
8384 ToggleableOption {
8485 activeFocusOnTab: true
8586
8687 //: LABEL DESKTOP_QML
87 text: qsTr("Shuffle keypad buttons") + SettingsModel.translationTrigger
88 checked: SettingsModel.shuffleScreenKeyboard
88 text: qsTr("Visual feedback when pressing keypad buttons") + SettingsModel.translationTrigger
89 checked: !SettingsModel.visualPrivacy
8990 enabled: SettingsModel.useScreenKeyboard
90 onCheckedChanged: SettingsModel.shuffleScreenKeyboard = checked
91 onCheckedChanged: SettingsModel.visualPrivacy = !checked
9192 }
9293
9394 GSeparator {
174175 title: qsTr("Delete history")+ SettingsModel.translationTrigger
175176 //: INFO DESKTOP_QML The current history is about to be removed, user confirmation required.
176177 text: qsTr("All history entries will be deleted.") + SettingsModel.translationTrigger
177 onConfirmed: SettingsModel.removeEntireHistory()
178 onConfirmed: {
179 let removedItemCount = SettingsModel.removeEntireHistory()
180 //: INFO DESKTOP_QML Feedback how many history entries were removed.
181 ApplicationModel.showFeedback(qsTr("Deleted %1 entries from the history.").arg(removedItemCount))
182 }
178183 }
179184 }
22 */
33
44 import QtQuick 2.10
5 import QtQuick.Controls 2.3
65 import QtQml.Models 2.3
76
87 import Governikus.Global 1.0
1211 import Governikus.Type.SettingsModel 1.0
1312 import Governikus.Type.UiModule 1.0
1413 import Governikus.Type.RemoteServiceModel 1.0
15 import Governikus.EnterPasswordView 1.0
16 import Governikus.Type.NumberModel 1.0
17 import Governikus.ProgressView 1.0
18 import Governikus.ResultView 1.0
1914 import Governikus.UpdateView 1.0
2015
2116
2419
2520 enum SubView {
2621 None,
27 EnterPassword,
28 PairingInfo,
29 WaitForPairing,
30 PairingFailed,
22 ConnectSacView,
3123 AppUpdateView
3224 }
3325
4941
5042 onClicked: {
5143 d.view = SettingsView.SubView.None
44 }
45
46 customSubAction: CancelAction {
47 visible: d.view === SettingsView.SubView.EnterPassword || d.view === SettingsView.SubView.WaitForPairing
48
49 onClicked: d.view = SettingsView.SubView.None
5250 }
5351 }
5452
112110 height: Math.max(implicitHeight, tabbedPane.availableHeight)
113111 onPairDevice: {
114112 if (RemoteServiceModel.rememberServer(pDeviceId)) {
115 d.view = TabbedReaderView.SubView.EnterPassword
113 d.view = SettingsView.SubView.ConnectSacView
116114 appWindow.menuBar.updateActions()
117115 }
118116 }
119117 onUnpairDevice: RemoteServiceModel.forgetDevice(pDeviceId)
120118 onMoreInformation: {
121119 d.precedingView = d.view
122 d.view = TabbedReaderView.SubView.PairingInfo
120 d.view = TabbedReaderView.SubView.ConnectSacView
121 connectSacView.showPairingInformation()
123122 appWindow.menuBar.updateActions()
124123 }
125124 }
160159 onLeaveView: d.view = SettingsView.SubView.None
161160 }
162161
163 EnterPasswordView {
164 id: enterPassword
162 ConnectSacView {
163 id: connectSacView
165164
166 visible: d.view === SettingsView.SubView.EnterPassword
165 visible: d.view === SettingsView.SubView.ConnectSacView
167166
168 statusIcon: "qrc:///images/phone_to_pc.svg"
169 passwordType: NumberModel.PASSWORD_REMOTE_PIN
170
171 onPasswordEntered: d.view = SettingsView.SubView.WaitForPairing
172
173 onRequestPasswordInfo: {
174 d.precedingView = d.view
175 d.view = SettingsView.SubView.PairingInfo
176 appWindow.menuBar.updateActions()
177 }
178 }
179
180 PasswordInfoView {
181 id: passwordInfoView
182
183 visible: d.view === SettingsView.SubView.PairingInfo
184
185 passwordType: NumberModel.PASSWORD_REMOTE_PIN
186
187 onClose: {
188 d.view = d.precedingView
189 appWindow.menuBar.updateActions()
190 }
191 }
192
193 ProgressView {
194 visible: d.view === SettingsView.SubView.WaitForPairing
195
196 //: LABEL DESKTOP_QML
197 text: qsTr("Pairing the device ...") + SettingsModel.translationTrigger
198
199 Connections {
200 enabled: visible
201 target: RemoteServiceModel
202
203 onFirePairingFailed: {
204 pairingFailedView.deviceName = pDeviceName
205 pairingFailedView.errorMessage = pErrorMessage
206 d.view = SettingsView.SubView.PairingFailed
207 }
208
209 onFirePairingSuccess: {
210 ApplicationModel.showFeedback(qsTr("The device \"%1\" has been paired.").arg(pDeviceName))
211 d.view = SettingsView.SubView.None
212 }
213 }
214 }
215
216 ResultView {
217 id: pairingFailedView
218
219 property string deviceName
220 property string errorMessage
221
222 visible: d.view === SettingsView.SubView.PairingFailed
223
224 //: ERROR DESKTOP_QML An error occurred while pairing the device.
225 text: qsTr("Pairing to \"%1\" failed:").arg(deviceName) + "<br/>\"%2\"".arg(errorMessage) + SettingsModel.translationTrigger
226 resultType: ResultView.Type.IsError
227 onNextView: d.view = SettingsView.SubView.None
167 onCloseView: d.view = SettingsView.SubView.None
228168 }
229169 }
44 import QtQuick 2.10
55 import QtQml.Models 2.10
66
7 import Governikus.EnterPasswordView 1.0
87 import Governikus.Global 1.0
98 import Governikus.TitleBar 1.0
109 import Governikus.Type.ApplicationModel 1.0
1615 SectionPage {
1716 id: root
1817
18 signal closeView()
19
1920 property alias rootEnabled: titleBarAction.rootEnabled
20
2121 property alias paneAnchors: tabbedPane.anchors
22
22 property int lastReaderCount: 0
2323 readonly property int currentView: d.view
24
25 signal closeView()
24 readonly property int availableReader: ApplicationModel.availableReader
2625
2726 enum SubView {
2827 None,
29 EnterPassword,
30 PairingInfo
28 ConnectSacView
3129 }
3230
3331 QtObject {
3937
4038 onVisibleChanged: d.view = TabbedReaderView.SubView.None
4139
40 onAvailableReaderChanged: {
41 if (visible && availableReader > lastReaderCount) {
42 root.closeView();
43 }
44 lastReaderCount = availableReader;
45 }
46
4247 titleBarAction: TitleBarAction {
43 id:titleBarAction
48 id: titleBarAction
4449
4550 //: LABEL DESKTOP_QML
4651 text: qsTr("Card Readers") + SettingsModel.translationTrigger
4752 helpTopic: Utils.helpTopicOf(tabbedPane.currentContentItem, "settings")
4853 rootEnabled: false
4954 customSubAction: CancelAction {
50 visible: d.view === TabbedReaderView.SubView.EnterPassword
55 onClicked: closeView()
56 }
5157
52 onClicked: d.view = TabbedReaderView.SubView.None
53 }
58 onClicked: d.view = TabbedReaderView.SubView.None
5459 }
60
61 Component.onCompleted: lastReaderCount = availableReader
5562
5663 TabbedPane {
5764 id: tabbedPane
7784 height: Math.max(implicitHeight, tabbedPane.availableHeight)
7885 onPairDevice: {
7986 if (RemoteServiceModel.rememberServer(pDeviceId)) {
80 d.view = TabbedReaderView.SubView.EnterPassword
87 d.view = TabbedReaderView.SubView.ConnectSacView
8188 appWindow.menuBar.updateActions()
8289 }
8390 }
8491 onUnpairDevice: RemoteServiceModel.forgetDevice(pDeviceId)
8592 onMoreInformation: {
8693 d.precedingView = d.view
87 d.view = TabbedReaderView.SubView.PairingInfo
94 d.view = TabbedReaderView.SubView.ConnectSacView
95 connectSacView.showPairingInformation();
8896 appWindow.menuBar.updateActions()
8997 }
9098 }
112120 onClicked: root.closeView()
113121 }
114122
115 EnterPasswordView {
116 id: enterPassword
123 ConnectSacView {
124 id: connectSacView
117125
118 visible: d.view === TabbedReaderView.SubView.EnterPassword
126 visible: d.view === TabbedReaderView.SubView.ConnectSacView
119127
120 statusIcon: "qrc:///images/phone_to_pc.svg"
121 passwordType: NumberModel.PASSWORD_REMOTE_PIN
122
123 onPasswordEntered: d.view = TabbedReaderView.SubView.None
124
125 onRequestPasswordInfo: {
126 d.precedingView = d.view
127 d.view = TabbedReaderView.SubView.PairingInfo
128 appWindow.menuBar.updateActions()
129 }
130 }
131
132 PasswordInfoView {
133 id: passwordInfoView
134
135 visible: d.view === TabbedReaderView.SubView.PairingInfo
136
137 passwordType: NumberModel.PASSWORD_REMOTE_PIN
138
139 onClose: {
128 onCloseView: {
140129 d.view = d.precedingView
141130 appWindow.menuBar.updateActions()
142131 }
0 /*
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5 import QtQuick.Layouts 1.3
6 import QtQuick.Window 2.3
7
8 import Governikus.Global 1.0
9 import Governikus.Style 1.0
10 import Governikus.Type.SettingsModel 1.0
11
12 ConfirmationPopup {
13 //: LABEL ANDROID
14 title: qsTr("Select screen orientation") + SettingsModel.translationTrigger
15
16 style: ConfirmationPopup.PopupStyle.OkButton
17 onConfirmed: {
18 if (phone.checked && Screen.primaryOrientation === Qt.LandscapeOrientation) {
19 plugin.applyPlatformStyle("mobile,phone," + Qt.platform.os)
20 }
21 if (tablet.checked && Screen.primaryOrientation !== Qt.LandscapeOrientation) {
22 plugin.applyPlatformStyle("mobile,tablet," + Qt.platform.os)
23 }
24 }
25
26 Column {
27 width: parent.width
28
29 spacing: Constants.component_spacing
30
31 GRadioButton {
32 id: phone
33
34 width: parent.width
35
36 //: LABEL ANDROID
37 Accessible.description: qsTr("Set screen orientation to portrait") + SettingsModel.translationTrigger
38
39 checked: Screen.primaryOrientation !== Qt.LandscapeOrientation
40 icon.source: "qrc:///images/android/stay_primary_portrait-24px.svg"
41 //: LABEL ANDROID
42 text: qsTr("Portrait") + (plugin.tablet ? "" : (" (%1)".arg(qsTr("recommended")))) + SettingsModel.translationTrigger
43 tintIcon: true
44 }
45
46 GRadioButton {
47 id: tablet
48
49 width: parent.width
50
51 //: LABEL ANDROID
52 Accessible.description: qsTr("Set screen orientation to landscape") + SettingsModel.translationTrigger
53
54 checked: Screen.primaryOrientation === Qt.LandscapeOrientation
55 icon.source: "qrc:///images/android/stay_primary_landscape-24px.svg"
56 //: LABEL ANDROID
57 text: qsTr("Landscape") + (plugin.tablet ? (" (%1)".arg(qsTr("recommended"))) : "") + SettingsModel.translationTrigger
58 tintIcon: true
59 }
60
61 GText {
62 visible: tablet.checked && !plugin.tablet
63 width: parent.width
64
65 //: LABEL ANDROID
66 text: qsTr("Using a screen orientation unfit for your device may result in display errors.") + SettingsModel.translationTrigger
67 textStyle: Style.text.normal_warning
68 }
69
70 }
71 }
44 import QtQuick 2.10
55 import QtQuick.Controls 2.3
66 import QtQuick.Layouts 1.3
7 import QtQuick.Window 2.3
78
89 import Governikus.Global 1.0
910 import Governikus.Style 1.0
6061 }
6162 }
6263
64 SettingsEntry {
65 visible: Constants.is_layout_android
66 width: parent.usableWidth
67 //: LABEL ANDROID
68 title: qsTr("Screen orientation") + SettingsModel.translationTrigger
69 description: (Screen.primaryOrientation === Qt.LandscapeOrientation
70 //: LABEL ANDROID
71 ? qsTr("Landscape")
72 //: LABEL ANDROID
73 : qsTr("Portrait")
74 ) + SettingsModel.translationTrigger
75 icon: Screen.primaryOrientation === Qt.LandscapeOrientation ? "qrc:///images/android/stay_primary_landscape-24px.svg" : "qrc:///images/android/stay_primary_portrait-24px.svg"
76 tintIcon: true
77
78 onClicked: orientationPopup.open()
79
80 ScreenOrientationSelectionPopup {
81 id: orientationPopup
82 }
83 }
84
6385 TitledSeparator {
6486 width: parent.usableWidth
6587 //: LABEL ANDROID IOS
121143 //: LABEL ANDROID IOS
122144 title: qsTr("Remote card reader") + SettingsModel.translationTrigger
123145 //: LABEL ANDROID IOS
124 description: qsTr("Click here to use another smartphone as a card reader") + SettingsModel.translationTrigger
146 description: qsTr("Configure remote service for another device") + SettingsModel.translationTrigger
125147 onClicked: baseItem.firePush(remoteServiceSettings)
126148
127149 Component {
144166 width: parent.usableWidth
145167
146168 //: LABEL ANDROID IOS
169 title: qsTr("History") + SettingsModel.translationTrigger
170 //: LABEL ANDROID IOS
171 description: qsTr("Save authentication history") + SettingsModel.translationTrigger
172 checked: SettingsModel.historyEnabled
173 onCheckedChanged: SettingsModel.historyEnabled = checked
174 }
175
176 LabeledSwitch {
177 width: parent.usableWidth
178
179 //: LABEL ANDROID IOS
147180 title: qsTr("Shuffle keypad buttons") + SettingsModel.translationTrigger
148181 //: LABEL ANDROID IOS
149182 description: qsTr("Randomize the order of the on screen keypad buttons") + SettingsModel.translationTrigger
156189 width: parent.usableWidth
157190
158191 //: LABEL ANDROID IOS
159 title: qsTr("Privacy keypad") + SettingsModel.translationTrigger
160 //: LABEL ANDROID IOS
161 description: qsTr("Avoid visual feedback in the on screen keypad") + SettingsModel.translationTrigger
162 checked: SettingsModel.visualPrivacy
163 onCheckedChanged: SettingsModel.visualPrivacy = checked
164 }
165
166 LabeledSwitch {
167 width: parent.usableWidth
168
169 //: LABEL ANDROID IOS
170 title: qsTr("History") + SettingsModel.translationTrigger
171 //: LABEL ANDROID IOS
172 description: qsTr("Save authentification history") + SettingsModel.translationTrigger
173 checked: SettingsModel.historyEnabled
174 onCheckedChanged: SettingsModel.historyEnabled = checked
192 title: qsTr("Keypad animations") + SettingsModel.translationTrigger
193 //: LABEL ANDROID IOS
194 description: qsTr("Visual feedback when pressing keypad buttons") + SettingsModel.translationTrigger
195 checked: !SettingsModel.visualPrivacy
196 onCheckedChanged: SettingsModel.visualPrivacy = !checked
197 }
198
199 Column {
200 visible: SettingsModel.advancedSettings
201 width: parent.usableWidth
202
203 spacing: parent.spacing
204
205 TitledSeparator {
206 width: parent.width
207
208 //: LABEL ANDROID IOS
209 title: qsTr("CAN allowed mode") + SettingsModel.translationTrigger
210 }
211
212 LabeledSwitch {
213 width: parent.width
214
215 //: LABEL ANDROID IOS
216 title: qsTr("Support CAN allowed mode") + SettingsModel.translationTrigger
217 //: LABEL ANDROID IOS
218 description: qsTr("Allow the id card to be used with only the CAN") + SettingsModel.translationTrigger
219 checked: SettingsModel.enableCanAllowed
220 onCheckedChanged: SettingsModel.enableCanAllowed = checked
221 }
222
223 LabeledSwitch {
224 width: parent.width
225
226 //: LABEL ANDROID IOS
227 title: qsTr("Skip rights page") + SettingsModel.translationTrigger
228 //: LABEL ANDROID IOS
229 description: qsTr("Do not show the rights page, when in can allowed mode") + SettingsModel.translationTrigger
230 enabled: SettingsModel.enableCanAllowed
231 checked: SettingsModel.skipRightsOnCanAllowed
232 onCheckedChanged: SettingsModel.skipRightsOnCanAllowed = checked
233 }
234 }
235
236 Column {
237 visible: plugin.debugBuild
238 width: parent.usableWidth
239
240 spacing: parent.spacing
241
242 TitledSeparator {
243 width: parent.width
244
245 //: LABEL ANDROID IOS
246 title: qsTr("Developer Options") + SettingsModel.translationTrigger
247 }
248
249 LabeledSwitch {
250 width: parent.width
251
252 //: LABEL ANDROID IOS
253 title: qsTr("Testmode for the self-authentication") + SettingsModel.translationTrigger
254 //: LABEL ANDROID IOS
255 description: qsTr("Use the test environment during a self-authentication") + SettingsModel.translationTrigger
256
257 checked: SettingsModel.useSelfauthenticationTestUri
258 onCheckedChanged: SettingsModel.useSelfauthenticationTestUri = checked
259 }
260
261 LabeledSwitch {
262 width: parent.width
263
264 //: LABEL ANDROID IOS
265 title: qsTr("Developer Mode") + SettingsModel.translationTrigger
266 //: LABEL ANDROID IOS
267 description: qsTr("Use a more tolerant mode") + SettingsModel.translationTrigger
268 checked: SettingsModel.developerMode
269 onCheckedChanged: SettingsModel.developerMode = checked
270 }
271
272 TitledSeparator {
273 width: parent.width
274
275 //: LABEL ANDROID IOS
276 title: qsTr("Layout style") + SettingsModel.translationTrigger
277 }
278
279 GRadioButton {
280 //: LABEL ALL_PLATFORMS
281 text: qsTr("iOS") + SettingsModel.translationTrigger
282 checked: plugin.platformStyle === text.toLowerCase()
283 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
284 }
285
286 GRadioButton {
287 //: LABEL ALL_PLATFORMS
288 text: qsTr("Android") + SettingsModel.translationTrigger
289 checked: plugin.platformStyle === text.toLowerCase()
290 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
291 }
292
293 GRadioButton {
294 //: LABEL ALL_PLATFORMS
295 text: qsTr("Tablet, Android") + SettingsModel.translationTrigger
296 checked: plugin.platformStyle === text.toLowerCase()
297 onCheckedChanged: if (checked) { plugin.applyPlatformStyle(text.toLowerCase()) }
298 }
299
300 TitledSeparator {
301 width: parent.width
302
303 //: LABEL ANDROID IOS
304 title: qsTr("Create dummy entries") + SettingsModel.translationTrigger
305 }
306
307 GButton {
308 //: LABEL ALL_PLATFORMS
309 text: qsTr("Logfile") + SettingsModel.translationTrigger
310 onClicked: {
311 LogModel.saveDummyLogfile()
312 ApplicationModel.showFeedback("Created new logfile.")
313 }
314 }
315
316 GButton {
317 //: LABEL ALL_PLATFORMS
318 text: qsTr("History") + SettingsModel.translationTrigger
319 onClicked: {
320 HistoryModel.createDummyEntry()
321 ApplicationModel.showFeedback("Created new history entry.")
322 }
323 }
175324 }
176325 }
177326 }
77 internal SecurityAndPrivacySettings SecurityAndPrivacySettings.qml
88 internal SettingsEntry SettingsEntry.qml
99 internal LanguageSelectionPopup LanguageSelectionPopup.qml
10 internal ScreenOrientationSelectionPopup ScreenOrientationSelectionPopup.qml
11 internal ConnectSacView ConnectSacView.qml
1012
1113 CardReaderView 1.0 CardReaderView.qml
1214 RemoteReaderView 1.0 RemoteReaderView.qml
1313 readonly property int corner_radius: ApplicationModel.scaleFactor * 20
1414 readonly property int corner_radius_popup: corner_radius
1515 readonly property int button_radius: ApplicationModel.scaleFactor * 15
16 readonly property int popup_border: Math.max(ApplicationModel.scaleFactor * 2, 1)
1617 readonly property int separator_size: Math.max(ApplicationModel.scaleFactor * 2, 1)
1718 readonly property int tabbed_pane_separator_size: Math.max(ApplicationModel.scaleFactor * 4, 1)
1819 readonly property real max_text_width: ApplicationModel.scaleFactor * 1000
1818 readonly property color tutorial_box_background: "#f2f2f2"
1919
2020 readonly property color card_reader: "#444445"
21
22 readonly property color switch_checked: accent
23 readonly property color switch_unchecked: "#ffffff"
2124 }
77 BrandDimensions {
88 readonly property int button_radius: 6
99 readonly property int corner_radius: 10
10 readonly property int popup_border: 0
1011 readonly property int separator_size: 1
1112 readonly property int list_item_height: 64
1213 readonly property int scrollbar_padding_vertical: 5
127127 BinaryDecisionView {
128128 visible: d.activeView === SetupAssistantView.SubViews.TransportPin
129129
130 Accessible.name: qsTr("Change transport PIN setup step") + SettingsModel.translationTrigger
130 Accessible.name: qsTr("Change Transport PIN setup step") + SettingsModel.translationTrigger
131131
132132 mainIconSource: "qrc:///images/reader/default_reader.png"
133 //: INFO DESKTOP_QML Inquiry message if the 5-digit transport PIN should be changed to an ordinary PIN (now).
133 //: INFO DESKTOP_QML Inquiry message if the five-digit Transport PIN should be changed to an ordinary PIN (now).
134134 questionText: qsTr("Do you want to set your PIN now?") + SettingsModel.translationTrigger
135135 //: INFO DESKTOP_QML Hint that this change may be carried out form the main menu as well and that it is required to use the online authentication feature of the ID card.
136 questionSubText: qsTr("If you have not already done so you have to change your 5-digit transport PIN to a 6-digit PIN before you can use the online-ID function.") + SettingsModel.translationTrigger
136 questionSubText: qsTr("If you have not already done so you have to change the five-digit Transport PIN to a six-digit PIN before you can use the online-ID function.") + SettingsModel.translationTrigger
137137
138138 titleBarAction: TitleBarAction {
139139 //: LABEL DESKTOP_QML
4040 anchors.horizontalCenter: parent.horizontalCenter
4141 width: parent.width * 0.9
4242 //: LABEL ANDROID IOS
43 text: qsTr("5 digits long") + SettingsModel.translationTrigger
44 textStyle: Style.text.tutorial_header
45 horizontalAlignment: Text.AlignHCenter
46 }
47
48 GText {
49 anchors.horizontalCenter: parent.horizontalCenter
50 width: parent.width * 0.9
51 //: LABEL ANDROID IOS
52 text: qsTr("transport PIN") + SettingsModel.translationTrigger
43 text: qsTr("five digits long") + SettingsModel.translationTrigger
44 textStyle: Style.text.tutorial_header
45 horizontalAlignment: Text.AlignHCenter
46 }
47
48 GText {
49 anchors.horizontalCenter: parent.horizontalCenter
50 width: parent.width * 0.9
51 //: LABEL ANDROID IOS
52 text: qsTr("Transport PIN") + SettingsModel.translationTrigger
5353 textStyle: Style.text.tutorial_header
5454 font.bold: true
5555 horizontalAlignment: Text.AlignHCenter
8282 anchors.horizontalCenter: parent.horizontalCenter
8383 width: parent.width * 0.9
8484 //: LABEL ANDROID IOS
85 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
85 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
8686 textStyle: Style.text.tutorial_header
8787 font.bold: true
8888 horizontalAlignment: Text.AlignHCenter
110110 anchors.horizontalCenter: parent.horizontalCenter
111111 width: parent.width * 0.9
112112 //: LABEL ANDROID IOS
113 text: qsTr("The transport PIN is sent to you by the Bundesdruckerei via mail.") + SettingsModel.translationTrigger
113 text: qsTr("The Transport PIN is sent to you by the Bundesdruckerei via mail.") + SettingsModel.translationTrigger
114114 textStyle: Style.text.tutorial_header
115115 horizontalAlignment: Text.AlignHCenter
116116 }
210210 anchors.horizontalCenter: parent.horizontalCenter
211211
212212 //: LABEL ANDROID IOS
213 text: qsTr("Please note: The transport PIN can only be used for your first PIN change. If you have already set your personal PIN (e.g. while picking up your ID card) only the set PIN is valid.") + SettingsModel.translationTrigger
213 text: qsTr("Please note: The Transport PIN can only be used for your first PIN change. If you have already set your personal PIN (e.g. while picking up your ID card) only the set PIN is valid.") + SettingsModel.translationTrigger
214214 textStyle: Style.text.tutorial_header_secondary
215215 horizontalAlignment: Text.AlignHCenter
216216 }
220220 anchors.horizontalCenter: parent.horizontalCenter
221221
222222 //: LABEL ANDROID IOS
223 text: qsTr("You can always set a new PIN at the issuing authority if the (transport) PIN is not known.") + SettingsModel.translationTrigger
223 text: qsTr("You can always set a new PIN at the issuing authority if the (Transport) PIN is not known.") + SettingsModel.translationTrigger
224224 textStyle: Style.text.tutorial_header_secondary
225225 horizontalAlignment: Text.AlignHCenter
226226 }
243243
244244 MouseArea {
245245 anchors.fill: parent
246
247 //: LABEL ANDROID IOS
248 Accessible.name: qsTr("Open YouTube video") + SettingsModel.translationTrigger
249 Accessible.role: Accessible.Button
250 Accessible.onPressAction: if (Qt.platform.os === "ios") clicked(null)
246251
247252 //: LABEL ANDROID IOS
248253 onClicked: Qt.openUrlExternally(qsTr("https://www.youtube.com/watch?v=wZglRda5Y60&index=4&list=PLLB5ERhVkn25qQXgMHQr-1KgyZsJKoSAm"))
4747 Column {
4848 width: parent.width
4949 spacing: Constants.component_spacing
50
51 Rectangle {
52 width: parent.width * 0.95
53 height: deprecationWarning.height
54 anchors.horizontalCenter: parent.horizontalCenter
55
56 border.width: 3
57 border.color: Constants.red
58
59 Column {
60 id: deprecationWarning
61
62 width: parent.width
63
64 padding: Constants.pane_padding
65 spacing: Constants.pane_spacing
66
67 GText {
68 width: parent.width - 2 * parent.padding
69
70 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction()
71 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
72
73 color: Constants.red
74 text: qsTr("Deprecation warning") + SettingsModel.translationTrigger
75 textStyle: Style.text.tutorial_header_secondary
76 font.bold: true
77 }
78
79 GText {
80 width: parent.width - 2 * parent.padding
81
82 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction()
83 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
84
85 color: Constants.red
86 text: qsTr("Bluetooth support will be removed in the next version of %1!").arg(Qt.application.name) + SettingsModel.translationTrigger
87 textStyle: Style.text.tutorial_content // Style.text.tutorial_header_secondary
88 }
89 }
90 }
5091
5192 GText {
5293 anchors.horizontalCenter: parent.horizontalCenter
492533 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
493534
494535 //: LABEL ANDROID IOS
495 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
536 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
496537 textStyle: Style.text.tutorial_header
497538 font.bold: true
498539 horizontalAlignment: Text.AlignHCenter
544585 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
545586
546587 //: LABEL ANDROID IOS
547 text: qsTr("This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.") + SettingsModel.translationTrigger
588 text: qsTr("This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.") + SettingsModel.translationTrigger
548589 textStyle: Style.text.tutorial_content
549590 font.bold: true
550591 horizontalAlignment: Text.AlignLeft
423423 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
424424
425425 //: LABEL ANDROID IOS
426 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
426 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
427427 textStyle: Style.text.tutorial_header
428428 font.bold: true
429429 horizontalAlignment: Text.AlignHCenter
475475 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
476476
477477 //: LABEL ANDROID IOS
478 text: qsTr("This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.") + SettingsModel.translationTrigger
478 text: qsTr("This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.") + SettingsModel.translationTrigger
479479 textStyle: Style.text.tutorial_content
480480 font.bold: true
481481 horizontalAlignment: Text.AlignLeft
500500
501501 MouseArea {
502502 anchors.fill: parent
503
504 //: LABEL ANDROID IOS
505 Accessible.name: qsTr("Open YouTube video") + SettingsModel.translationTrigger
506 Accessible.role: Accessible.Button
507 Accessible.onPressAction: if (Qt.platform.os === "ios") clicked(null)
503508
504509 onClicked: Constants.is_layout_ios ? Qt.openUrlExternally("https://www.youtube.com/watch?v=qArkIGs0cFM&list=PLLB5ERhVkn25qQXgMHQr-1KgyZsJKoSAm&index=1")
505510 : Qt.openUrlExternally("https://www.youtube.com/watch?v=OtduiptNKQI&list=PLLB5ERhVkn25qQXgMHQr-1KgyZsJKoSAm&index=2")
208208 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
209209
210210 //: LABEL ANDROID IOS
211 text: qsTr("Both devices have to be connected to the same wifi network") + SettingsModel.translationTrigger
211 text: qsTr("Both devices have to be connected to the same WiFi network") + SettingsModel.translationTrigger
212212 textStyle: Style.text.tutorial_header
213213 font.bold: true
214214 horizontalAlignment: Text.AlignHCenter
791791 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
792792
793793 //: LABEL ANDROID IOS
794 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
794 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
795795 textStyle: Style.text.tutorial_header
796796 font.bold: true
797797 horizontalAlignment: Text.AlignHCenter
843843 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
844844
845845 //: LABEL ANDROID IOS
846 text: qsTr("This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.") + SettingsModel.translationTrigger
846 text: qsTr("This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.") + SettingsModel.translationTrigger
847847 textStyle: Style.text.tutorial_content
848848 font.bold: true
849849 horizontalAlignment: Text.AlignLeft
868868
869869 MouseArea {
870870 anchors.fill: parent
871
872 //: LABEL ANDROID IOS
873 Accessible.name: qsTr("Open YouTube video") + SettingsModel.translationTrigger
874 Accessible.role: Accessible.Button
875 Accessible.onPressAction: if (Qt.platform.os === "ios") clicked(null)
871876
872877 onClicked: Qt.openUrlExternally("https://www.youtube.com/watch?v=PWF1kEwfQ0Y&list=PLLB5ERhVkn25qQXgMHQr-1KgyZsJKoSAm&index=3")
873878 }
194194 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
195195
196196 //: LABEL ANDROID IOS
197 text: qsTr("Both devices have to be connected to the same wifi network") + SettingsModel.translationTrigger
197 text: qsTr("Both devices have to be connected to the same WiFi network") + SettingsModel.translationTrigger
198198 textStyle: Style.text.tutorial_header
199199 font.bold: true
200200 horizontalAlignment: Text.AlignHCenter
663663 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
664664
665665 //: LABEL ANDROID IOS
666 text: qsTr("Tap on Wifi") + SettingsModel.translationTrigger
666 text: qsTr("Tap on WiFi") + SettingsModel.translationTrigger
667667 horizontalAlignment: Text.AlignHCenter
668668 textStyle: Style.text.tutorial_header
669669 }
837837 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
838838
839839 //: LABEL ANDROID IOS
840 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
840 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
841841 textStyle: Style.text.tutorial_header
842842 font.bold: true
843843 horizontalAlignment: Text.AlignHCenter
889889 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
890890
891891 //: LABEL ANDROID IOS
892 text: qsTr("This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.") + SettingsModel.translationTrigger
892 text: qsTr("This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.") + SettingsModel.translationTrigger
893893 textStyle: Style.text.tutorial_content
894894 font.bold: true
895895 horizontalAlignment: Text.AlignLeft
524524 anchors.fill: parent
525525
526526 //: LABEL ANDROID IOS
527 Accessible.name: qsTr("Open YouTube video") + SettingsModel.translationTrigger
528 Accessible.role: Accessible.Button
529 Accessible.onPressAction: if (Qt.platform.os === "ios") clicked(null)
530
531 //: LABEL ANDROID IOS
527532 onClicked: Qt.openUrlExternally(qsTr("https://www.youtube.com/watch?v=fzbUZmHaZp4&index=5&list=PLLB5ERhVkn25qQXgMHQr-1KgyZsJKoSAm"))
528533 }
529534 }
283283 Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction()
284284
285285 //: LABEL ANDROID IOS
286 text: qsTr("6 digits long PIN") + SettingsModel.translationTrigger
286 text: qsTr("six digits long PIN") + SettingsModel.translationTrigger
287287 textStyle: Style.text.tutorial_header
288288 font.bold: true
289289 horizontalAlignment: Text.AlignHCenter
3232
3333 buttonType: NavigationButton.Type.Back
3434 resultType: ResultView.Type.IsError
35 emailButtonVisible: false
3635 //: LABEL DESKTOP_QML Placext if the update information are invalid, might be caused by network issues.
3736 text: qsTr("The update information could not be retrieved. Please check your network connection.") + SettingsModel.translationTrigger
3837
4443
4544 buttonType: NavigationButton.Type.Back
4645 resultType: ResultView.Type.IsSuccess
47 emailButtonVisible: false
4846 //: LABEL DESKTOP_QML The currently installed version is the most recent one, no action is required.
4947 text: qsTr("Your version %1 of %2 is up to date!").arg(Qt.application.version).arg(Qt.application.name) + SettingsModel.translationTrigger
5048
88 import Governikus.RemoteServiceView 1.0
99 import Governikus.TutorialView 1.0
1010 import Governikus.MoreView 1.0
11 import Governikus.DeveloperView 1.0
1211 import Governikus.IdentifyView 1.0
1312 import Governikus.ProviderView 1.0
1413 import Governikus.HistoryView 1.0
9493 prefetch: baseItem.ready
9594 sourceComponent: SettingsView {}
9695 }
97
98 TabBarView {
99 visible: baseItem.state === "developeroptions"
100 anchors.fill: parent
101
102 prefetch: baseItem.ready
103 sourceComponent: DeveloperView {}
104 }
10596 }
0 /*
1 * \copyright Copyright (c) 2019-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtQuick 2.10
5
6
7 Text {
8 property Item scope: parent
9
10 visible: false
11 }
221221
222222 GButton {
223223 //: LABEL ANDROID IOS
224 text: qsTr("Cancel") + SettingsModel.translationTrigger
224 text: qsTr("Do not send") + SettingsModel.translationTrigger
225225 onClicked: root.done(false)
226226 }
227227
228228 GButton {
229229 //: LABEL ANDROID IOS
230 text: qsTr("Transmit") + SettingsModel.translationTrigger
230 text: qsTr("Send") + SettingsModel.translationTrigger
231231 onClicked: root.done(true)
232232 }
233233 }
2929 QtObject {
3030 id: d
3131
32 readonly property bool foundSelectedReader: ApplicationModel.foundSelectedReader
33 readonly property bool foundPCSCReader: ApplicationModel.foundSelectedReader && ApplicationModel.isReaderTypeAvailable(ReaderPlugIn.PCSC)
34 readonly property bool foundRemoteReader: ApplicationModel.foundSelectedReader && ApplicationModel.isReaderTypeAvailable(ReaderPlugIn.REMOTE)
35 readonly property string purpose: (isPinChange ?
36 //: LABEL DESKTOP_QML
37 qsTr("Change PIN") :
38 //: LABEL DESKTOP_QML
39 qsTr("Identify")
40 ) + SettingsModel.translationTrigger
41 }
42
43
32 readonly property bool foundSelectedReader: ApplicationModel.availableReader > 0
33 readonly property bool foundPCSCReader: ApplicationModel.availableReader > 0 && ApplicationModel.isReaderTypeAvailable(ReaderPlugIn.PCSC)
34 readonly property bool foundRemoteReader: ApplicationModel.availableReader > 0 && ApplicationModel.isReaderTypeAvailable(ReaderPlugIn.REMOTE)
35 }
4436
4537 Connections {
4638 target: ApplicationModel
134126 //: ERROR DESKTOP_QML
135127 return qsTr("The used card reader does not meet the technical requirements (Extended Length not supported).")
136128 }
137 //: LABEL DESKTOP_QML
138 return d.foundSelectedReader ? d.purpose : qsTr("Searching for card reader")
129 return d.foundSelectedReader
130 //: LABEL DESKTOP_QML
131 ? qsTr("Place ID card")
132 //: LABEL DESKTOP_QML
133 : qsTr("Connect USB card reader or smartphone")
139134 case Workflow.WaitingFor.Card:
140135 if (NumberModel.pinDeactivated) {
141136 //: LABEL DESKTOP_QML
142 return qsTr("Information") + SettingsModel.translationTrigger
137 return qsTr("Information")
143138 }
144 return d.purpose
139 //: LABEL DESKTOP_QML
140 return qsTr("Place ID card")
145141 case Workflow.WaitingFor.Password:
146142 //: LABEL DESKTOP_QML
147 return qsTr("Information") + SettingsModel.translationTrigger
143 return qsTr("Information")
148144 default:
149145 return ""
150146 }
161157 readonly property string requestCardText: {
162158 if (d.foundPCSCReader && !d.foundRemoteReader) {
163159 //: INFO DESKTOP_QML The AA2 is waiting for an ID card to be inserted into the card reader.
164 return qsTr("Please put the ID card on the card reader.")
160 return qsTr("No ID card detected. Please ensure that your ID card is placed on the card reader.")
165161 } else if (!d.foundPCSCReader && d.foundRemoteReader) {
166162 //: INFO DESKTOP_QML The AA2 is waiting for the smartphone to be placed on the id.
167 return qsTr("Connected to %1. Please place the NFC interface of the smartphone on your ID card.").arg(RemoteServiceModel.connectedServerDeviceNames)
163 return qsTr("No ID card detected. Please make sure that the NFC interface of the smartphone (connected to %1) is correctly placed on your ID card.").arg(RemoteServiceModel.connectedServerDeviceNames)
168164 }
169165
170166 //: INFO DESKTOP_QML The AA2 is waiting for an ID card to be inserted into the card reader (or smartphone for that matter).
186182 switch (waitingFor) {
187183 case Workflow.WaitingFor.Reader:
188184 //: INFO DESKTOP_QML AA2 is waiting for the card reader or the ID card.
189 return d.foundSelectedReader ? requestCardText : qsTr("No card reader detected. Please make sure that a card reader is connected. Open the %1reader settings%2 to configure reader and get more information about supported readers.").arg("<a href=\"#\">").arg("</a>")
185 return d.foundSelectedReader ? requestCardText : qsTr("No card reader detected. Please make sure that a USB card reader is connected or a smartphone as cardreader is paired and available. Open the %1reader settings%2 to configure readers and get more information about supported readers.").arg("<a href=\"#\">").arg("</a>")
190186 case Workflow.WaitingFor.Card:
191187 if (NumberModel.pinDeactivated) {
192188 //: INFO DESKTOP_QML The online authentication feature of the card is disabled and needs to be activated by the authorities.
5252 PropertyChanges { target: grayLevel; visible: false }
5353 PropertyChanges {
5454 target: card
55 x: (baseItem.width + (Constants.is_layout_ios ? 0 : phone.width) - card.width) / 2
55 x: (baseItem.width - (Constants.is_layout_ios ? card.width : card.height)) / 2
5656 y: (Constants.is_layout_ios ? 0 : baseItem.height / 4)
57 rotation: (Constants.is_layout_ios ? 0 : 62)
57 rotation: (Constants.is_layout_ios ? 0 : 90)
5858 }
59 PropertyChanges { target: shaking; running: true }
59 PropertyChanges { target: shaking; running: false }
6060 }
6161 ]
6262
6666 SequentialAnimation
6767 {
6868 PauseAnimation { duration: 500 }
69 PropertyAnimation{ targets: card; properties: "x,y,rotation"; duration: 500; easing.type: Easing.OutQuad }
69 PropertyAnimation{ targets: card; properties: "x,y,rotation"; duration: Constants.is_layout_ios ? 500 : 2000; easing.type: Easing.OutQuad }
7070 PropertyAnimation{ targets: phone; property: "x"; duration: 500; easing.type: Easing.OutQuart }
7171 PropertyAction { target: shaking; property: "running" }
7272 }
5858 //: INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use bluetooth instead.
5959 qsTr("Unfortunately, this functionality is not available on your device.") + "<br/>" +
6060 //: INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use bluetooth instead.
61 qsTr("However you can use a seperate 'Bluetooth card reader' or a seperate 'smartphone as card reader' to utilize the online identification function.") :
61 qsTr("However, you can use a separate 'smartphone as card reader' to utilize the online identification function.") :
6262 !ApplicationModel.nfcEnabled ?
6363 //: INFO ANDROID IOS NFC is available but needs to be activated in the settings of the smartphone.
6464 qsTr("NFC is switched off.") + "<br/>" +
7575
7676 subTitleText: (!visible ? "" :
7777 //: INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a bluetooth reader or a differnt smarthpone is suggested.
78 ApplicationModel.extendedLengthApdusUnsupported ? qsTr("Your device does not meet the technical requirements (Extended Length not supported). However you can use a seperate 'Bluetooth card reader' or a seperate 'smartphone as card reader' to utilize the online identification function.") :
78 ApplicationModel.extendedLengthApdusUnsupported ? qsTr("Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate 'smartphone as card reader' to utilize the online identification function.") :
7979 //: INFO ANDROID IOS The online authentication feature is disabled and needs to be activated by the authorities.
8080 NumberModel.pinDeactivated ? qsTr("The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.") :
8181 //: INFO ANDROID IOS The ID card may be inserted, the authentication process may be started.
2020
2121 property bool settingsPushed: remoteServiceSettings.visible
2222 property bool wifiEnabled: ApplicationModel.wifiEnabled
23 property bool foundSelectedReader: ApplicationModel.foundSelectedReader
23 property bool foundSelectedReader: ApplicationModel.availableReader > 0
2424
2525 Connections {
2626 target: ApplicationModel
6161 SettingsModel.translationTrigger
6262
6363 if (!wifiEnabled) {
64 //: LABEL DESKTOP_QML
65 return qsTr("Enable Wifi");
64 //: LABEL ANDROID IOS
65 return qsTr("Enable WiFi");
6666 } else if (!foundSelectedReader) {
67 //: LABEL DESKTOP_QML
67 //: LABEL ANDROID IOS
6868 return qsTr("Pair device");
6969 } else {
70 //: LABEL DESKTOP_QML
70 //: LABEL ANDROID IOS
7171 return qsTr("Continue")
7272 }
7373 }
8383 SettingsModel.translationTrigger
8484
8585 if (!wifiEnabled) {
86 //: INFO ANDROID IOS The wifi module needs to be enabled in the system settings to use the remote service.
86 //: INFO ANDROID IOS The WiFi module needs to be enabled in the system settings to use the remote service.
8787 return qsTr("To use the remote service WiFi has to be activated. Please activate WiFi in your device settings.");
8888 } else if (!foundSelectedReader) {
8989 //: INFO ANDROID IOS No paired and reachable device was found, hint that the remote device needs to be actually started for this feature.
9494 }
9595
9696 titleText: (foundSelectedReader ?
97 //: LABEL DESKTOP_QML
97 //: LABEL ANDROID IOS
9898 qsTr("Determine card") :
99 //: LABEL DESKTOP_QML
99 //: LABEL ANDROID IOS
100100 qsTr("Establish connection")
101101 ) + SettingsModel.translationTrigger
102102
190190 <source>Cancel</source>
191191 <extracomment>LABEL ALL_PLATFORMS</extracomment>
192192 <translation>Abbrechen</translation>
193 </message>
194 <message>
195 <source>Dialog</source>
196 <translation>Dialog</translation>
193197 </message>
194198 </context>
195199 <context>
449453 <name>ChangePinView</name>
450454 <message>
451455 <source>PIN Management</source>
452 <extracomment>LABEL DESKTOP_QML
453 ----------
454 LABEL ANDROID IOS</extracomment>
456 <extracomment>LABEL ANDROID IOS</extracomment>
455457 <translation>PIN-Verwaltung</translation>
456458 </message>
457459 <message>
458460 <source>Change PIN</source>
459461 <extracomment>LABEL DESKTOP_QML
460462 ----------
461 LABEL ANDROID IOS</extracomment>
463 LABEL DESKTOP_QML Processing screen label while the card communication is running after the old PIN has been entered during PIN change process.
464 ----------
465 LABEL ANDROID IOS
466 ----------
467 LABEL ANDROID IOS Processing screen label while the card communication is running before the new PIN has been entered during PIN change process.</extracomment>
462468 <translation>PIN ändern</translation>
463469 </message>
464470 <message>
465 <source>Please don&apos;t move the ID card...</source>
471 <source>Please don&apos;t move the ID card.</source>
466472 <extracomment>INFO DESKTOP_QML Processing screen text while the card communication is running after the PIN has been entered during PIN change process.
467473 ----------
468474 INFO ANDROID IOS Loading screen during PIN change process, data communcation is currently ongoing. Message is usually not visible since the password handling with basic reader is handled by EnterPasswordView.
469475 ----------
470476 INFO ANDROID IOS Generic progress message during PIN change process.</extracomment>
471 <translation>Bitte den Ausweis nicht bewegen...</translation>
477 <translation>Bitte den Ausweis nicht bewegen.</translation>
472478 </message>
473479 <message>
474480 <source>The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.</source>
481487 <translation>Bitte beachten Sie die Anzeige Ihres Kartenlesers.</translation>
482488 </message>
483489 <message>
484 <source>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</source>
490 <source>A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</source>
485491 <extracomment>INFO ANDROID IOS The wrong PIN was entered twice, the next attempt requires additional verifcation via CAN.</extracomment>
486 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch müssen Sie vorher die sechsstellige Zugangsnummer (CAN) eingeben. Diese finden Sie auf der Vorderseite Ihres Ausweises.</translation>
492 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch geben Sie bitte zunächst die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite Ihres Ausweises.</translation>
487493 </message>
488494 <message>
489495 <source>A wrong PIN has been entered three times on your ID card. Your PIN is now blocked. To unblock your PIN you have to enter the PUK.</source>
509515 - verbinden Sie das Smartphone mit dem Ladegerät</translation>
510516 </message>
511517 <message>
512 <source>Your ID card is unblocked. You now have three more tries to change your PIN</source>
518 <source>Your ID card is unblocked. You now have three more attempts to change your PIN</source>
513519 <extracomment>INFO DESKTOP_QML The ID card has just been unblocked and the user can now continue with their PIN change.
514520 ----------
515521 INFO ANDROID IOS The ID card has just been unblocked and the user can now continue with their PIN change.</extracomment>
516522 <translation>Ihr Ausweis wurde entsperrt. Sie haben nun drei weitere Versuche um Ihre PIN zu ändern</translation>
517523 </message>
524 <message>
525 <source>Setting new PIN</source>
526 <extracomment>LABEL DESKTOP_QML Processing screen label while the card communication is running after the new PIN has been entered during PIN change process.
527 ----------
528 LABEL ANDROID IOS Processing screen label while the card communication is running after the new PIN has been entered during PIN change process.</extracomment>
529 <translation>Neue PIN wird gesetzt</translation>
530 </message>
518531 </context>
519532 <context>
520533 <name>ChangePinViewContent</name>
524537 <translation>PIN-Verwaltung</translation>
525538 </message>
526539 <message>
527 <source>You have the opportunity to change your transport PIN into a personal PIN. You can also change the PIN at any time or unblock the PIN using the personal unblocking key (PUK). The transport PIN and the PUK can be found in the letter sent to you by your competent authority.</source>
540 <source>You have the opportunity to change your Transport PIN into a personal PIN. You can also change the PIN at any time or unblock the PIN using the Personal Unblocking Key (PUK). The Transport PIN and the PUK can be found in the letter sent to you by your competent authority.</source>
528541 <extracomment>LABEL ANDROID IOS</extracomment>
529542 <translation>Hier haben Sie die Möglichkeit, Ihre Transport-PIN in eine persönliche PIN zu ändern. Zudem können Sie jederzeit Ihre persönliche PIN ändern oder eine Blockierung mit Hilfe der Entsperrnummer (PUK) aufheben. Sie finden Ihre Transport-PIN und die PUK in dem Schreiben, das Sie nach Beantragung Ihres Ausweises von der für die Ausgabe Ihres Ausweises zuständigen Behörde erhalten haben.</translation>
530543 </message>
532545 <source>Change PIN now</source>
533546 <extracomment>LABEL ANDROID IOS</extracomment>
534547 <translation>Jetzt PIN ändern</translation>
548 </message>
549 </context>
550 <context>
551 <name>ConnectSacView</name>
552 <message>
553 <source>Pairing</source>
554 <extracomment>LABEL DESKTOP_QML</extracomment>
555 <translation>Kopplung</translation>
556 </message>
557 <message>
558 <source>Pairing the device ...</source>
559 <extracomment>LABEL DESKTOP_QML</extracomment>
560 <translation>Das Gerät wird gekoppelt ...</translation>
561 </message>
562 <message>
563 <source>The device &quot;%1&quot; has been paired.</source>
564 <translation>Das Gerät &quot;%1&quot; wurde gekoppelt.</translation>
565 </message>
566 <message>
567 <source>Pairing to &quot;%1&quot; failed:</source>
568 <extracomment>ERROR DESKTOP_QML An error occurred while pairing the device.</extracomment>
569 <translation>Die Kopplung mit &quot;%1&quot; ist fehlgeschlagen:</translation>
535570 </message>
536571 </context>
537572 <context>
603638 <extracomment>LABEL DESKTOP_QML</extracomment>
604639 <translation>Zeige Beta-Test-Symbol</translation>
605640 </message>
641 <message>
642 <source>Support CAN allowed mode</source>
643 <extracomment>LABEL DESKTOP_QML</extracomment>
644 <translation>CAN-erlaubt-Modus unterstützen</translation>
645 </message>
646 <message>
647 <source>Skip rights page in CAN allowed mode</source>
648 <extracomment>LABEL DESKTOP_QML</extracomment>
649 <translation>Überspringe Berechtigungen-Seite im CAN-erlaubt-Modus</translation>
650 </message>
606651 </context>
607652 <context>
608653 <name>DetachedLogView</name>
619664 <extracomment>LABEL DESKTOP_QML</extracomment>
620665 <translation>Protokolldatei speichern</translation>
621666 </message>
667 <message>
668 <source>Logfiles</source>
669 <translation>Protokolldateien</translation>
670 </message>
622671 </context>
623672 <context>
624673 <name>DetailDialog</name>
681730 </message>
682731 </context>
683732 <context>
684 <name>DeveloperView</name>
685 <message>
686 <source>Developer options</source>
687 <extracomment>LABEL ALL_PLATFORMS</extracomment>
688 <translation>Entwickleroptionen</translation>
689 </message>
690 <message>
691 <source>Testmode for the self-authentication</source>
692 <extracomment>LABEL ANDROID IOS</extracomment>
693 <translation>Testmodus für die Selbstauskunft</translation>
694 </message>
695 <message>
696 <source>Developer Mode</source>
697 <extracomment>LABEL ANDROID IOS</extracomment>
698 <translation>Entwicklermodus</translation>
699 </message>
700 <message>
701 <source>Use a more tolerant mode</source>
702 <extracomment>LABEL ANDROID IOS</extracomment>
703 <translation>Benutze einen toleranten Modus</translation>
704 </message>
705 <message>
706 <source>Change the layout style</source>
707 <extracomment>LABEL ALL_PLATFORMS</extracomment>
708 <translation>Ändere den Style des Layouts</translation>
709 </message>
710 <message>
711 <source>iOS</source>
712 <extracomment>LABEL ALL_PLATFORMS</extracomment>
713 <translation>iOS</translation>
714 </message>
715 <message>
716 <source>Android</source>
717 <extracomment>LABEL ALL_PLATFORMS</extracomment>
718 <translation>Android</translation>
719 </message>
720 <message>
721 <source>Tablet, Android</source>
722 <extracomment>LABEL ALL_PLATFORMS</extracomment>
723 <translation>Tablet, Android</translation>
724 </message>
725 <message>
726 <source>Use the test environment during a self-authentication</source>
727 <extracomment>LABEL ANDROID IOS</extracomment>
728 <translation>Benutze die Test-Umgebung während der Selbstauskunft</translation>
729 </message>
730 <message>
731 <source>Create dummy entries</source>
732 <extracomment>LABEL ALL_PLATFORMS</extracomment>
733 <translation>Erstelle Scheindaten</translation>
734 </message>
735 <message>
736 <source>Logfile</source>
737 <extracomment>LABEL ALL_PLATFORMS</extracomment>
738 <translation>Protokolldatei</translation>
739 </message>
740 <message>
741 <source>History</source>
742 <extracomment>LABEL ALL_PLATFORMS</extracomment>
743 <translation>Verlauf</translation>
744 </message>
745 </context>
746 <context>
747733 <name>DevicesListDelegate</name>
748734 <message>
749735 <source>Device %1</source>
789775 <extracomment>LABEL DESKTOP_QML</extracomment>
790776 <translation>Speichern unter</translation>
791777 </message>
778 <message>
779 <source>Textfiles</source>
780 <translation>Textdateien</translation>
781 </message>
782 <message>
783 <source>Diagnosis is still running</source>
784 <extracomment>LABEL DESKTOP_QML</extracomment>
785 <translation>Die Diagnose läuft noch</translation>
786 </message>
787 <message>
788 <source>Diagnosis may be incomplete</source>
789 <extracomment>LABEL DESKTOP_QML</extracomment>
790 <translation>Die Diagnose könnte unvollständig sein</translation>
791 </message>
792792 </context>
793793 <context>
794794 <name>EditRights</name>
833833 <translation>mehr...</translation>
834834 </message>
835835 <message>
836 <source>The following data will be transferred to the provider when you enter the PIN:</source>
836 <source>Transactional information</source>
837 <extracomment>LABEL DESKTOP_QML
838 ----------
839 LABEL ANDROID_PHONE
840 ----------
841 LABEL ANDROID_TABLET
842 ----------
843 LABEL IOS_PHONE
844 ----------
845 LABEL IOS_TABLET</extracomment>
846 <translation>Transaktionsinformationen</translation>
847 </message>
848 <message>
849 <source>Required Data</source>
850 <extracomment>LABEL DESKTOP_QML
851 ----------
852 LABEL ANDROID_PHONE
853 ----------
854 LABEL ANDROID_TABLET
855 ----------
856 LABEL IOS_PHONE
857 ----------
858 LABEL IOS_TABLET</extracomment>
859 <translation>Erforderliche Daten</translation>
860 </message>
861 <message>
862 <source>Optional Data</source>
863 <extracomment>LABEL DESKTOP_QML
864 ----------
865 LABEL ANDROID_PHONE
866 ----------
867 LABEL ANDROID_TABLET
868 ----------
869 LABEL IOS_PHONE
870 ----------
871 LABEL IOS_TABLET</extracomment>
872 <translation>Optionale Daten</translation>
873 </message>
874 <message>
875 <source>Identify</source>
876 <extracomment>LABEL ANDROID_PHONE
877 ----------
878 LABEL ANDROID_TABLET
879 ----------
880 LABEL IOS_PHONE
881 ----------
882 LABEL IOS_TABLET</extracomment>
883 <translation>Ausweisen</translation>
884 </message>
885 <message>
886 <source>Edit rights view</source>
887 <translation>Anzeige zum Ändern der Berechtigungen</translation>
888 </message>
889 <message>
890 <source>This is the edit rights view of the AusweisApp2.</source>
891 <translation>Dies ist die Anzeige zum Ändern der Berechtigungen der AusweisApp2.</translation>
892 </message>
893 <message>
894 <source>Click for more information about the provider</source>
895 <translation>Klicke hier für mehr Informationen zum Anbieter</translation>
896 </message>
897 <message>
898 <source>Proceed to %1 entry</source>
899 <extracomment>LABEL DESKTOP_QML %1 can be &quot;CAN&quot; or &quot;PIN&quot;
900 ----------
901 LABEL ANDROID_PHONE %1 can be &quot;CAN&quot; or &quot;PIN&quot;
902 ----------
903 LABEL ANDROID_TABLET %1 can be &quot;CAN&quot; or &quot;PIN&quot;
904 ----------
905 LABEL IOS_PHONE %1 can be &quot;CAN&quot; or &quot;PIN&quot;
906 ----------
907 LABEL IOS_TABLET %1 can be &quot;CAN&quot; or &quot;PIN&quot;</extracomment>
908 <translation>Weiter zur %1-Eingabe</translation>
909 </message>
910 <message>
911 <source>You are about to identify yourself towards the following provider</source>
912 <extracomment>LABEL DESKTOP_QML</extracomment>
913 <translation>Sie möchten sich bei folgendem Anbieter ausweisen</translation>
914 </message>
915 <message>
916 <source>Show more information about the service provider</source>
917 <translation>Zeige mehr Informationen über den Anbieter</translation>
918 </message>
919 <message>
920 <source>CAN</source>
921 <extracomment>LABEL DESKTOP_QML Inserted into &quot;Proceed to %1 entry&quot;
922 ----------
923 LABEL ANDROID_PHONE Inserted into &quot;Proceed to %1 entry&quot;
924 ----------
925 LABEL ANDROID_TABLET Inserted into &quot;Proceed to %1 entry&quot;
926 ----------
927 LABEL IOS_PHONE Inserted into &quot;Proceed to %1 entry&quot;
928 ----------
929 LABEL IOS_TABLET Inserted into &quot;Proceed to %1 entry&quot;</extracomment>
930 <translation>CAN</translation>
931 </message>
932 <message>
933 <source>PIN</source>
934 <extracomment>LABEL DESKTOP_QML Inserted into &quot;Proceed to %1 entry&quot;
935 ----------
936 LABEL ANDROID_PHONE Inserted into &quot;Proceed to %1 entry&quot;
937 ----------
938 LABEL ANDROID_TABLET Inserted into &quot;Proceed to %1 entry&quot;
939 ----------
940 LABEL IOS_PHONE Inserted into &quot;Proceed to %1 entry&quot;
941 ----------
942 LABEL IOS_TABLET Inserted into &quot;Proceed to %1 entry&quot;</extracomment>
943 <translation>PIN</translation>
944 </message>
945 <message>
946 <source>The following data of the ID card will be transferred to the provider when you enter the CAN:</source>
947 <extracomment>LABEL DESKTOP_QML
948 ----------
949 LABEL ANDROID_PHONE
950 ----------
951 LABEL ANDROID_TABLET
952 ----------
953 LABEL IOS_PHONE
954 ----------
955 LABEL IOS_TABLET</extracomment>
956 <translation>Folgende Daten des Ausweises werden nach Eingabe der CAN ausgelesen und an den Anbieter übermittelt:</translation>
957 </message>
958 <message>
959 <source>The following data of your ID card will be transferred to the provider when you enter the PIN:</source>
837960 <extracomment>LABEL DESKTOP_QML
838961 ----------
839962 LABEL ANDROID_PHONE
845968 LABEL IOS_TABLET</extracomment>
846969 <translation>Folgende Daten Ihres Ausweises werden nach Eingabe der PIN ausgelesen und an den Anbieter übermittelt:</translation>
847970 </message>
848 <message>
849 <source>Transactional information</source>
850 <extracomment>LABEL DESKTOP_QML
851 ----------
852 LABEL ANDROID_PHONE
853 ----------
854 LABEL ANDROID_TABLET
855 ----------
856 LABEL IOS_PHONE
857 ----------
858 LABEL IOS_TABLET</extracomment>
859 <translation>Transaktionsinformationen</translation>
860 </message>
861 <message>
862 <source>Required Data</source>
863 <extracomment>LABEL DESKTOP_QML
864 ----------
865 LABEL ANDROID_PHONE
866 ----------
867 LABEL ANDROID_TABLET
868 ----------
869 LABEL IOS_PHONE
870 ----------
871 LABEL IOS_TABLET</extracomment>
872 <translation>Erforderliche Daten</translation>
873 </message>
874 <message>
875 <source>Optional Data</source>
876 <extracomment>LABEL DESKTOP_QML
877 ----------
878 LABEL ANDROID_PHONE
879 ----------
880 LABEL ANDROID_TABLET
881 ----------
882 LABEL IOS_PHONE
883 ----------
884 LABEL IOS_TABLET</extracomment>
885 <translation>Optionale Daten</translation>
886 </message>
887 <message>
888 <source>Identify</source>
889 <extracomment>LABEL ANDROID_PHONE
890 ----------
891 LABEL ANDROID_TABLET
892 ----------
893 LABEL IOS_PHONE
894 ----------
895 LABEL IOS_TABLET</extracomment>
896 <translation>Ausweisen</translation>
897 </message>
898 <message>
899 <source>Edit rights view</source>
900 <translation>Anzeige zum Ändern der Berechtigungen</translation>
901 </message>
902 <message>
903 <source>This is the edit rights view of the AusweisApp2.</source>
904 <translation>Dies ist die Anzeige zum Ändern der Berechtigungen der AusweisApp2.</translation>
905 </message>
906 <message>
907 <source>Click for more information about the provider</source>
908 <translation>Klicke hier für mehr Informationen zum Anbieter</translation>
909 </message>
910 <message>
911 <source>Proceed to %1 entry</source>
912 <extracomment>LABEL DESKTOP_QML %1 can be &quot;card access number (CAN)&quot; or &quot;PIN&quot;
913 ----------
914 LABEL ANDROID_PHONE %1 can be &quot;card access number (CAN)&quot; or &quot;PIN&quot;
915 ----------
916 LABEL ANDROID_TABLET %1 can be &quot;card access number (CAN)&quot; or &quot;PIN&quot;
917 ----------
918 LABEL IOS_PHONE %1 can be &quot;card access number (CAN)&quot; or &quot;PIN&quot;
919 ----------
920 LABEL IOS_TABLET %1 can be &quot;card access number (CAN)&quot; or &quot;PIN&quot;</extracomment>
921 <translation>Weiter zur %1-Eingabe</translation>
922 </message>
923 <message>
924 <source>You are about to identify yourself towards the following provider</source>
925 <extracomment>LABEL DESKTOP_QML</extracomment>
926 <translation>Sie möchten sich bei folgendem Anbieter ausweisen</translation>
927 </message>
928 <message>
929 <source>Show more information about the service provider</source>
930 <translation>Zeige mehr Informationen über den Anbieter</translation>
931 </message>
932 <message>
933 <source>card access number (CAN)</source>
934 <extracomment>LABEL DESKTOP_QML Inserted into &quot;Proceed to %1 entry&quot;
935 ----------
936 LABEL ANDROID_PHONE Inserted into &quot;Proceed to %1 entry&quot;
937 ----------
938 LABEL ANDROID_TABLET Inserted into &quot;Proceed to %1 entry&quot;
939 ----------
940 LABEL IOS_PHONE Inserted into &quot;Proceed to %1 entry&quot;
941 ----------
942 LABEL IOS_TABLET Inserted into &quot;Proceed to %1 entry&quot;</extracomment>
943 <translation>Zugangsnummer (CAN)</translation>
944 </message>
945 <message>
946 <source>PIN</source>
947 <extracomment>LABEL DESKTOP_QML Inserted into &quot;Proceed to %1 entry&quot;
948 ----------
949 LABEL ANDROID_PHONE Inserted into &quot;Proceed to %1 entry&quot;
950 ----------
951 LABEL ANDROID_TABLET Inserted into &quot;Proceed to %1 entry&quot;
952 ----------
953 LABEL IOS_PHONE Inserted into &quot;Proceed to %1 entry&quot;
954 ----------
955 LABEL IOS_TABLET Inserted into &quot;Proceed to %1 entry&quot;</extracomment>
956 <translation>PIN</translation>
957 </message>
958971 </context>
959972 <context>
960973 <name>EnterPasswordView</name>
980993 <translation>Die neue PIN und ihre Wiederholung stimmen nicht überein. Bitte korrigieren Sie Ihre Eingabe.</translation>
981994 </message>
982995 <message>
983 <source>Please enter your 6-digit PIN. Use the keyboard or numpad.</source>
984 <extracomment>INFO DESKTOP_QML The AA2 expects a PIN with 6 digits which can be entered via the physical or onscreen keyboard.</extracomment>
985 <translation>Bitte geben Sie Ihre sechsstellige PIN ein. Benutzen Sie dazu die Tastatur oder die Bildschirmtastatur.</translation>
996 <source>Please enter your six-digit PIN.</source>
997 <extracomment>INFO DESKTOP_QML The AA2 expects a PIN with six digits in an authentication.</extracomment>
998 <translation>Bitte geben Sie Ihre sechsstellige PIN ein.</translation>
986999 </message>
9871000 <message>
9881001 <source>More information</source>
9901003 <translation>Mehr Informationen</translation>
9911004 </message>
9921005 <message>
993 <source>Please enter the 6-digit card access number (CAN).</source>
994 <extracomment>INFO DESKTOP_QML The operator is required to enter the 6-digit CAN in CAN-allowed authentication.</extracomment>
995 <translation>Bitte geben Sie Ihre sechsstellige Zugangsnummer (CAN) ein.</translation>
996 </message>
997 <message>
998 <source>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</source>
999 <extracomment>INFO DESKTOP_QML The PIN was entered wrongfully twice, this may have happened during an earlier session of the AA2, too. The user needs to enter the CAN for additional verification.
1000 ----------
1001 INFO ANDROID IOS The wrong PIN was entered twice, the third attempt requires the CAN for additional verification, hint where the CAN is found.</extracomment>
1002 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch müssen Sie vorher die sechsstellige Zugangsnummer (CAN) eingeben. Diese finden Sie auf der Vorderseite Ihres Ausweises.</translation>
1003 </message>
1004 <message>
1005 <source>The PIN of your ID card is blocked after three incorrect tries. The block can be lifted by entering your personal unblocking key (PUK).</source>
1006 <source>Please enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of the ID card.</source>
1007 <extracomment>INFO DESKTOP_QML The user is required to enter the six-digit CAN in CAN-allowed authentication.</extracomment>
1008 <translation>Bitte geben Sie die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite des Ausweises.</translation>
1009 </message>
1010 <message>
1011 <source>A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</source>
1012 <extracomment>INFO ANDROID IOS The wrong PIN was entered twice, the third attempt requires the CAN for additional verification, hint where the CAN is found.</extracomment>
1013 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch geben Sie bitte zunächst die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie rechts unten auf der Vorderseite Ihres Ausweises.</translation>
1014 </message>
1015 <message>
1016 <source>The PIN of your ID card is blocked after three incorrect attempts. Please enter the Personal Unblocking Key (PUK) to lift the block. You can find the key in your PIN letter.</source>
10061017 <extracomment>INFO DESKTOP_QML The PUK is required to unlock the ID card.</extracomment>
1007 <translation>Die PIN Ihres Ausweises ist nach dreimaliger Fehleingabe gesperrt. Die Sperrung können Sie mit der Entsperrnummer (PUK) aufheben.</translation>
1008 </message>
1009 <message>
1010 <source>Please enter a new 6-digit PIN now.</source>
1011 <extracomment>INFO DESKTOP_QML A new 6-digit PIN needs to be supplied.
1012 ----------
1013 INFO ANDROID IOS A new 6-digit PIN needs to be supplied.</extracomment>
1014 <translation>Vergeben Sie bitte nun eine neue sechsstellige PIN.</translation>
1015 </message>
1016 <message>
1017 <source>Please confirm your new 6-digit PIN.</source>
1018 <translation>Die PIN Ihres Ausweises ist nach dreimaliger Fehleingabe gesperrt. Bitte geben Sie zur Aufhebung der Sperrung die zehnstellige Entsperrnummer (PUK) ein. Diese finden Sie in Ihrem PIN-Brief.</translation>
1019 </message>
1020 <message>
1021 <source>Please enter a new six-digit PIN now.</source>
1022 <extracomment>INFO DESKTOP_QML A new six-digit PIN needs to be supplied.
1023 ----------
1024 INFO ANDROID IOS A new six-digit PIN needs to be supplied.</extracomment>
1025 <translation>Bitte geben Sie nun eine neue sechsstellige PIN ein.</translation>
1026 </message>
1027 <message>
1028 <source>Please confirm your new six-digit PIN.</source>
10181029 <extracomment>INFO DESKTOP_QML The new PIN needs to be entered again for verification.
10191030 ----------
10201031 INFO ANDROID IOS The new PIN needs to be confirmed.</extracomment>
1021 <translation>Wiederholen Sie bitte Ihre neue sechsstellige PIN.</translation>
1032 <translation>Bitte wiederholen Sie die Eingabe Ihrer neuen sechsstelligen PIN.</translation>
10221033 </message>
10231034 <message>
10241035 <source>Unknown password type:</source>
10261037 <translation>Unbekannter Passwort-Typ:</translation>
10271038 </message>
10281039 <message>
1029 <source>Does your PIN have 6 digits?</source>
1030 <extracomment>LABEL DESKTOP_QML Button to switch to a 6-digit PIN.
1031 ----------
1032 LABEL ANDROID IOS Button to switch to a 6-digit PIN.</extracomment>
1040 <source>Does your PIN have six digits?</source>
1041 <extracomment>LABEL DESKTOP_QML Button to switch to a six-digit PIN.
1042 ----------
1043 LABEL ANDROID IOS Button to switch to a six-digit PIN.</extracomment>
10331044 <translation>Ist Ihre PIN sechsstellig?</translation>
10341045 </message>
10351046 <message>
1036 <source>Does your PIN have 5 digits?</source>
1037 <extracomment>LABEL DESKTOP_QML Button to switch to a transport PIN or start a change of the transport PIN.
1038 ----------
1039 LABEL ANDROID IOS Button to switch to a transport PIN or start a change of the transport PIN.</extracomment>
1047 <source>Does your PIN have five digits?</source>
1048 <extracomment>LABEL DESKTOP_QML Button to switch to a Transport PIN or start a change of the Transport PIN.
1049 ----------
1050 LABEL ANDROID IOS Button to switch to a Transport PIN or start a change of the Transport PIN.</extracomment>
10401051 <translation>Ist Ihre PIN fünfstellig?</translation>
10411052 </message>
10421053 <message>
1043 <source>Please enter the 6-digit card access number (CAN). You can find it on the front of the ID card.</source>
1054 <source>Please enter the six-digit Card Access Number (CAN). You can find it in the bottom right on the front of the ID card.</source>
10441055 <extracomment>INFO ANDROID IOS The CAN needs to be entered in CAN-allowed mode, hint where the CAN can be found.</extracomment>
1045 <translation>Bitte geben Sie die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie auf der Vorderseite des Ausweises.</translation>
1056 <translation>Bitte geben Sie die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite des Ausweises.</translation>
10461057 </message>
10471058 <message>
10481059 <source>A wrong PIN has been entered three times on your ID card. Your PIN is now blocked. To unblock your PIN you have to enter the PUK.</source>
10501061 <translation>Die PIN Ihres Ausweises wurde dreimal falsch eingegeben. Ihre PIN ist gesperrt. Zum Entsperren geben Sie bitte Ihre PUK ein.</translation>
10511062 </message>
10521063 <message>
1053 <source>Please enter the transport PIN from your PIN letter.</source>
1054 <extracomment>INFO ANDROID IOS The transport PIN is required by AA2, it needs to be change to an actual PIN.</extracomment>
1064 <source>Please enter the Transport PIN from your PIN letter.</source>
1065 <extracomment>INFO ANDROID IOS The Transport PIN is required by AA2, it needs to be change to an actual PIN.</extracomment>
10551066 <translation>Geben Sie bitte die Transport-PIN aus dem PIN-Brief ein.</translation>
10561067 </message>
10571068 <message>
10651076 <translation>Geben Sie bitte Ihre PIN ein.</translation>
10661077 </message>
10671078 <message>
1068 <source>Please enter your 5-digit Transport PIN. Use the keyboard or numpad.</source>
1069 <extracomment>INFO DESKTOP_QML The AA2 expects a PIN with 5 digits which can be entered via the physical or onscreen keyboard</extracomment>
1070 <translation>Bitte geben Sie Ihre fünfstellige Transport-PIN ein. Benutzen Sie dazu die Tastatur oder den Ziffernblock.</translation>
1079 <source>Please enter the five-digit Transport PIN.</source>
1080 <extracomment>INFO DESKTOP_QML The AA2 expects the Transport PIN with five digits.</extracomment>
1081 <translation>Bitte geben Sie die fünfstellige Transport-PIN ein.</translation>
10711082 </message>
10721083 <message>
10731084 <source>%1. You can start to enter the number.</source>
10751086 <translation>%1. Sie können nun Ihre Nummer eingeben.</translation>
10761087 </message>
10771088 <message>
1078 <source>PIN entry</source>
1079 <extracomment>LABEL DESKTOP_QML</extracomment>
1080 <translation>PIN-Eingabe</translation>
1081 </message>
1082 <message>
1083 <source>CAN entry</source>
1084 <extracomment>LABEL DESKTOP_QML</extracomment>
1085 <translation>CAN-Eingabe</translation>
1086 </message>
1087 <message>
1088 <source>PUK entry</source>
1089 <extracomment>LABEL DESKTOP_QML</extracomment>
1090 <translation>PUK-Eingabe</translation>
1091 </message>
1092 <message>
1093 <source>Pairing code</source>
1094 <extracomment>LABEL DESKTOP_QML</extracomment>
1095 <translation>Kopplungscode</translation>
1096 </message>
1097 <message>
1098 <source>Start the pairing on your smartphone and enter the shown pairing code in order to use your smartphone as a card reader (SaC).</source>
1089 <source>Enter PIN</source>
1090 <extracomment>LABEL DESKTOP_QML</extracomment>
1091 <translation>PIN eingeben</translation>
1092 </message>
1093 <message>
1094 <source>Enter CAN</source>
1095 <extracomment>LABEL DESKTOP_QML</extracomment>
1096 <translation>CAN eingeben</translation>
1097 </message>
1098 <message>
1099 <source>Enter PUK</source>
1100 <extracomment>LABEL DESKTOP_QML</extracomment>
1101 <translation>PUK eingeben</translation>
1102 </message>
1103 <message>
1104 <source>Enter pairing code</source>
1105 <extracomment>LABEL DESKTOP_QML</extracomment>
1106 <translation>Kopplungscode eingeben</translation>
1107 </message>
1108 <message>
1109 <source>Start the pairing on your smartphone and enter the pairing code shown there in order to use your smartphone as a card reader (SaC).</source>
10991110 <extracomment>INFO DESKTOP_QML The pairing code needs to be supplied.</extracomment>
1100 <translation>Starten Sie die Kopplung auf Ihrem Smartphone und geben Sie den angezeigten Kopplungscode ein um Ihr Smartphone als Kartenleser (SaK) zu verwenden.</translation>
1111 <translation>Starten Sie die Kopplung auf Ihrem Smartphone und geben Sie den dort angezeigten Kopplungscode ein um Ihr Smartphone als Kartenleser (SaK) zu verwenden.</translation>
1112 </message>
1113 <message>
1114 <source>Please enter your current six-digit PIN.</source>
1115 <extracomment>INFO DESKTOP_QML The AA2 expects the current PIN with six digits in a PIN change.</extracomment>
1116 <translation>Bitte geben Sie Ihre aktuelle sechsstellige PIN ein.</translation>
1117 </message>
1118 <message>
1119 <source>Please enter your current PIN.</source>
1120 <extracomment>LABEL ANDROID IOS</extracomment>
1121 <translation>Geben Sie bitte Ihre aktuelle PIN ein.</translation>
1122 </message>
1123 <message>
1124 <source>Enter Transport PIN</source>
1125 <extracomment>LABEL DESKTOP_QML</extracomment>
1126 <translation>Transport-PIN eingeben</translation>
11011127 </message>
11021128 </context>
11031129 <context>
11691195 <source>Please note that the old UI will be removed in the next version of %1!</source>
11701196 <translation>Bitte beachten Sie, dass die alte grafische Nutzeroberfläche in der nächsten Version der %1 entfernt wird!</translation>
11711197 </message>
1198 <message>
1199 <source>Network</source>
1200 <extracomment>LABEL DESKTOP_QML</extracomment>
1201 <translation>Netzwerk</translation>
1202 </message>
1203 <message>
1204 <source>Use the proxy (%1) specified during the installation.</source>
1205 <extracomment>LABEL DESKTOP_QML</extracomment>
1206 <translation>Benutze den bei der Installation angegebenen Proxy (%1).</translation>
1207 </message>
11721208 </context>
11731209 <context>
11741210 <name>GeneralSettingsWidget</name>
12561292 <translation>Dies ist die allgemeine Fortschrittsansicht der AusweisApp2.</translation>
12571293 </message>
12581294 <message>
1259 <source>Change PIN</source>
1260 <extracomment>LABEL DESKTOP_QML</extracomment>
1261 <translation>PIN ändern</translation>
1262 </message>
1263 <message>
1264 <source>Identify</source>
1265 <extracomment>LABEL DESKTOP_QML</extracomment>
1266 <translation>Ausweisen</translation>
1295 <source>Place ID card</source>
1296 <extracomment>LABEL DESKTOP_QML</extracomment>
1297 <translation>Ausweis auflegen</translation>
12671298 </message>
12681299 <message>
12691300 <source>The device %1 was unpaired because it did not react to connection attempts. Pair the device again to use it as a card reader.</source>
12841315 <translation>Schritt %1 von 3</translation>
12851316 </message>
12861317 <message>
1287 <source>Searching for card reader</source>
1288 <extracomment>LABEL DESKTOP_QML</extracomment>
1289 <translation>Suche nach Kartenleser</translation>
1318 <source>Connect USB card reader or smartphone</source>
1319 <extracomment>LABEL DESKTOP_QML</extracomment>
1320 <translation>USB-Kartenleser oder Smartphone verbinden</translation>
12901321 </message>
12911322 <message>
12921323 <source>Information</source>
12941325 <translation>Information</translation>
12951326 </message>
12961327 <message>
1297 <source>No card reader detected. Please make sure that a card reader is connected. Open the %1reader settings%2 to configure reader and get more information about supported readers.</source>
1328 <source>No card reader detected. Please make sure that a USB card reader is connected or a smartphone as cardreader is paired and available. Open the %1reader settings%2 to configure readers and get more information about supported readers.</source>
12981329 <extracomment>INFO DESKTOP_QML AA2 is waiting for the card reader or the ID card.</extracomment>
1299 <translation>Es wurde kein Kartenleser gefunden. Bitte stellen Sie sicher, dass ein Kartenleser angeschlossen ist. Öffnen Sie die %1Einstellungen%2 um Kartenleser zu konfigurieren und mehr Informationen zu unterstützten Kartenlesern zu erhalten.</translation>
1330 <translation>Es wurde kein Kartenleser gefunden. Bitte überprüfen Sie, ob ein USB-Kartenleser angeschlossen bzw. ein Smartphone als Kartenleser gekoppelt und verfügbar ist. Öffnen Sie die %1Einstellungen%2, um Kartenleser zu konfigurieren und weitere Hinweise zu erhalten.</translation>
13001331 </message>
13011332 <message>
13021333 <source>The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.</source>
13091340 <translation>Bitte beachten Sie die Anzeige Ihres Kartenlesers.</translation>
13101341 </message>
13111342 <message>
1312 <source>Connected to %1. Please place the NFC interface of the smartphone on your ID card.</source>
1343 <source>No ID card detected. Please make sure that the NFC interface of the smartphone (connected to %1) is correctly placed on your ID card.</source>
13131344 <extracomment>INFO DESKTOP_QML The AA2 is waiting for the smartphone to be placed on the id.</extracomment>
1314 <translation>Verbunden mit %1. Bitte platzieren Sie das Smartphone mit der NFC-Schnittstelle auf Ihrem Ausweis.</translation>
1315 </message>
1316 <message>
1317 <source>Please place the smartphone (connected to %1) on your ID card or put the ID card on the card reader.</source>
1318 <extracomment>INFO DESKTOP_QML The AA2 is waiting for an ID card to be inserted into the card reader (or smartphone for that matter).</extracomment>
1319 <translation>Bitte platzieren Sie das Smartphone (verbunden mit %1) auf Ihrem Ausweis oder legen den Ausweis auf den Kartenleser.</translation>
1345 <translation>Es wurde kein Ausweis erkannt. Bitte stellen Sie sicher, dass die NFC-Schnittstelle des Smartphones (verbunden mit %1) korrekt auf Ihrem Ausweis platziert ist.</translation>
13201346 </message>
13211347 <message>
13221348 <source>The used card reader does not meet the technical requirements (Extended Length not supported).</source>
13241350 <translation>Der verwendete Kartenleser erfüllt leider nicht die technischen Voraussetzungen (Extended Length wird nicht unterstützt).</translation>
13251351 </message>
13261352 <message>
1327 <source>Please put the ID card on the card reader.</source>
1353 <source>No ID card detected. Please ensure that your ID card is placed on the card reader.</source>
13281354 <extracomment>INFO DESKTOP_QML The AA2 is waiting for an ID card to be inserted into the card reader.</extracomment>
1329 <translation>Bitte legen Sie den Ausweis auf das Kartenlesegerät.</translation>
1355 <translation>Es wurde kein Ausweis erkannt. Bitte stellen Sie sicher, dass Ihr Ausweis auf dem Kartenleser aufliegt.</translation>
1356 </message>
1357 <message>
1358 <source>Please place the smartphone (connected to %1) on your ID card or put the ID card on the card reader.</source>
1359 <extracomment>INFO DESKTOP_QML The AA2 is waiting for an ID card to be inserted into the card reader (or smartphone for that matter).</extracomment>
1360 <translation>Bitte platzieren Sie das Smartphone (verbunden mit %1) auf Ihrem Ausweis oder legen Sie den Ausweis auf den Kartenleser.</translation>
13301361 </message>
13311362 </context>
13321363 <context>
14891520 <source>Save as PDF...</source>
14901521 <extracomment>LABEL DESKTOP_QML</extracomment>
14911522 <translation>Als PDF speichern...</translation>
1523 </message>
1524 <message>
1525 <source>Portable Document Format</source>
1526 <translation>Portable Document Format</translation>
14921527 </message>
14931528 </context>
14941529 <context>
16651700 <translation>Berechtigungszertifikat wird heruntergeladen</translation>
16661701 </message>
16671702 <message>
1668 <source>Please wait a moment...</source>
1703 <source>Please wait a moment.</source>
16691704 <extracomment>INFO DESKTOP_QML Information message about cancellation process with present network connectivity
16701705 ----------
16711706 INFO DESKTOP_QML Generic progress status message while no card communication is active.
16731708 INFO DESKTOP_QML Generic progress status message during authentication.
16741709 ----------
16751710 INFO ANDROID IOS Generic status message during the authentication process.</extracomment>
1676 <translation>Bitte warten Sie einen Moment...</translation>
1711 <translation>Bitte warten Sie einen Moment.</translation>
16771712 </message>
16781713 <message>
16791714 <source>The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.</source>
17021737 <translation>Bitte stellen Sie eine Internetverbindung her.</translation>
17031738 </message>
17041739 <message>
1705 <source>Change transport PIN</source>
1740 <source>Change Transport PIN</source>
17061741 <extracomment>LABEL ANDROID IOS</extracomment>
17071742 <translation>Transport-PIN ändern</translation>
17081743 </message>
17401775 - verbinden Sie das Smartphone mit dem Ladegerät</translation>
17411776 </message>
17421777 <message>
1743 <source>Did you change the transport PIN already?</source>
1778 <source>Did you change the Transport PIN already?</source>
17441779 <translation>Haben Sie Ihre Transport-PIN bereits geändert?</translation>
17451780 </message>
17461781 <message>
1747 <source>Prior to the first use of the online identification function you have to replace the transport PIN by an individual 6-digit PIN. Online identification with transport PIN is not possible.</source>
1748 <translation>Vor der ersten Nutzung der Online-Ausweisfunktion müssen Sie die Transport-PIN durch eine persönliche sechsstellige PIN ersetzen. Die Online-Indentifikation ist mit der Transport-PIN nicht möglich.</translation>
1749 </message>
1750 <message>
1751 <source>No, change transport PIN now</source>
1782 <source>Prior to the first use of the online identification function you have to replace the Transport PIN by an individual six-digit PIN. Online identification with Transport PIN is not possible.</source>
1783 <translation>Vor der ersten Nutzung der Online-Ausweisfunktion müssen Sie die Transport-PIN durch eine persönliche sechsstellige PIN ersetzen. Die Online-Identifikation ist mit der Transport-PIN nicht möglich.</translation>
1784 </message>
1785 <message>
1786 <source>No, change Transport PIN now</source>
17521787 <translation>Nein, PIN jetzt ändern</translation>
17531788 </message>
17541789 <message>
1755 <source>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</source>
1790 <source>A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</source>
17561791 <extracomment>INFO ANDROID IOS The PIN was entered wrongfully two times, the third attempts requires additional CAN verification, hint where the CAN is found.</extracomment>
1757 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch müssen Sie vorher die sechsstellige Zugangsnummer (CAN) eingeben. Diese finden Sie auf der Vorderseite Ihres Ausweises.</translation>
1758 </message>
1759 <message>
1760 <source>First you have to change your 5-digit transport PIN you received in your in PIN letter into a 6-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.</source>
1761 <extracomment>INFO DESKTOP_QML The user clicked that the current PIN has 5 digits (transport PIN) which needs to be changed to a 6-digit PIN. The current process will be aborted and needs to be restarted *manually* by the user.
1762 ----------
1763 INFO ANDROID IOS The user clicked that the current PIN has 5 digits (transport PIN), it needs to be changed to an ordinary 6-digit PIN. The current process needs to be restarted *manually* by the user.</extracomment>
1792 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch geben Sie bitte zunächst die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite Ihres Ausweises.</translation>
1793 </message>
1794 <message>
1795 <source>First you have to change your five-digit Transport PIN you received in your in PIN letter into a six-digit PIN. You are currently leaving the started process and are forwarded to the PIN management. Please restart the desired process after the PIN has been changed.</source>
1796 <extracomment>INFO DESKTOP_QML The user clicked that the current PIN has five digits (Transport PIN) which needs to be changed to a six-digit PIN. The current process will be aborted and needs to be restarted *manually* by the user.
1797 ----------
1798 INFO ANDROID IOS The user clicked that the current PIN has five digits (Transport PIN), it needs to be changed to an ordinary six-digit PIN. The current process needs to be restarted *manually* by the user.</extracomment>
17641799 <translation>Sie müssen die fünfstellige Transport-PIN aus dem PIN-Brief zunächst in eine sechsstellige PIN ändern. Sie verlassen den laufenden Vorgang und werden zur PIN-Verwaltung weitergeleitet. Starten Sie den gewünschten Vorgang bitte nach der PIN-Änderung erneut.</translation>
17651800 </message>
17661801 <message>
1767 <source>Please don&apos;t move the ID card...</source>
1802 <source>Please don&apos;t move the ID card.</source>
17681803 <extracomment>INFO DESKTOP_QML Second line text if a basic card reader is used and data is exchanged with the card/server in the background. Is not actually visible since the basic reader password handling is done by EnterPasswordView.
17691804 ----------
17701805 INFO ANDROID IOS Second line text if a basic card reader is used and background communication with the card/server is running. Is not actually visible since the basic reader password handling is done by EnterPasswordView.</extracomment>
1771 <translation>Bitte den Ausweis nicht bewegen...</translation>
1806 <translation>Bitte den Ausweis nicht bewegen.</translation>
17721807 </message>
17731808 <message>
17741809 <source>Aborting process and informing the service provider</source>
17801815 <extracomment>INFO DESKTOP_QML Information message about cancellation process without working network connectivity</extracomment>
17811816 <translation>Es wurden Netzwerkprobleme erkannt. Die Verbindung wird weiterhin für 30 Sekunden versucht.</translation>
17821817 </message>
1818 <message>
1819 <source>Error code: %1</source>
1820 <extracomment>INFO DESKTOP_QML Error code (string) of current GlobalStatus code, shown as header of popup.</extracomment>
1821 <translation>Fehlercode: %1</translation>
1822 </message>
17831823 </context>
17841824 <context>
17851825 <name>LanguageSelectionPopup</name>
19241964 <source>Detach log viewer</source>
19251965 <translation>Protokoll separat anzeigen</translation>
19261966 </message>
1967 <message>
1968 <source>Logfiles</source>
1969 <translation>Logdateien</translation>
1970 </message>
19271971 </context>
19281972 <context>
19291973 <name>MainView</name>
19461990 <translation>Verlauf</translation>
19471991 </message>
19481992 <message>
1949 <source>PIN-Management</source>
1950 <extracomment>LABEL DESKTOP_QML</extracomment>
1951 <translation>PIN-Verwaltung</translation>
1993 <source>Change PIN</source>
1994 <extracomment>LABEL DESKTOP_QML</extracomment>
1995 <translation>PIN ändern</translation>
19521996 </message>
19531997 <message>
19541998 <source>Settings</source>
19612005 <translation>Hilfe</translation>
19622006 </message>
19632007 <message>
1964 <source>Self-Authentication</source>
1965 <extracomment>LABEL DESKTOP_QML</extracomment>
1966 <translation>Selbstauskunft</translation>
2008 <source>See my personal data</source>
2009 <extracomment>LABEL DESKTOP_QML</extracomment>
2010 <translation>Meine Daten einsehen</translation>
19672011 </message>
19682012 </context>
19692013 <context>
19702014 <name>MoreView</name>
19712015 <message>
19722016 <source>More</source>
1973 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2017 <extracomment>LABEL IOS</extracomment>
19742018 <translation>Mehr</translation>
19752019 </message>
19762020 <message>
19792023 ----------
19802024 LABEL ANDROID
19812025 ----------
1982 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2026 LABEL IOS</extracomment>
19832027 <translation>Versionsinformationen</translation>
19842028 </message>
19852029 <message>
19862030 <source>FAQ</source>
19872031 <extracomment>LABEL ANDROID
19882032 ----------
1989 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2033 LABEL IOS</extracomment>
19902034 <translation>FAQ</translation>
19912035 </message>
19922036 <message>
19932037 <source>Support</source>
19942038 <extracomment>LABEL ANDROID
19952039 ----------
1996 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2040 LABEL IOS</extracomment>
19972041 <translation>Support</translation>
19982042 </message>
19992043 <message>
20002044 <source>Rate app</source>
2001 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2045 <extracomment>LABEL IOS</extracomment>
20022046 <translation>Bewerten</translation>
20032047 </message>
20042048 <message>
20052049 <source>Software license</source>
20062050 <extracomment>LABEL ANDROID
20072051 ----------
2008 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2052 LABEL IOS</extracomment>
20092053 <translation>Softwarelizenz</translation>
20102054 </message>
20112055 <message>
20122056 <source>https://www.ausweisapp.bund.de/en/download/android/</source>
2013 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2057 <extracomment>LABEL IOS</extracomment>
20142058 <translation>https://www.ausweisapp.bund.de/download/android/</translation>
20152059 </message>
20162060 <message>
20172061 <source>https://www.ausweisapp.bund.de/en/download/ios/</source>
2018 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2062 <extracomment>LABEL IOS</extracomment>
20192063 <translation>https://www.ausweisapp.bund.de/download/ios/</translation>
20202064 </message>
20212065 <message>
20222066 <source>https://www.ausweisapp.bund.de/en/download/windows-and-mac/</source>
2023 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2067 <extracomment>LABEL IOS</extracomment>
20242068 <translation>https://www.ausweisapp.bund.de/download/windows-und-mac/</translation>
20252069 </message>
20262070 <message>
20272071 <source>History</source>
2028 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2072 <extracomment>LABEL IOS</extracomment>
20292073 <translation>Verlauf</translation>
2030 </message>
2031 <message>
2032 <source>Developer options</source>
2033 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2034 <translation>Entwickleroptionen</translation>
20352074 </message>
20362075 <message>
20372076 <source>Show log</source>
20382077 <extracomment>LABEL ANDROID
20392078 ----------
2040 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2079 LABEL IOS</extracomment>
20412080 <translation>Protokoll anzeigen</translation>
20422081 </message>
20432082 <message>
20442083 <source>Tutorial</source>
20452084 <extracomment>LABEL ANDROID
20462085 ----------
2047 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2086 LABEL IOS</extracomment>
20482087 <translation>Tutorial</translation>
20492088 </message>
20502089 <message>
20512090 <source>https://www.ausweisapp.bund.de/en/qa/frequently-asked-questions/</source>
2052 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2091 <extracomment>LABEL IOS</extracomment>
20532092 <translation>https://www.ausweisapp.bund.de/fragen-und-antworten/haeufig-gestellte-fragen/</translation>
20542093 </message>
20552094 <message>
20562095 <source>https://www.ausweisapp.bund.de/en/qa/support/</source>
2057 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2096 <extracomment>LABEL IOS</extracomment>
20582097 <translation>https://www.ausweisapp.bund.de/fragen-und-antworten/support/</translation>
20592098 </message>
20602099 <message>
20612100 <source>Report error</source>
20622101 <extracomment>LABEL ANDROID
20632102 ----------
2064 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2103 LABEL IOS</extracomment>
20652104 <translation>Melden Sie einen Fehler</translation>
20662105 </message>
20672106 <message>
21032142 <source>Release notes</source>
21042143 <extracomment>LABEL ANDROID
21052144 ----------
2106 LABEL ANDROID IOS DESKTOP_QML</extracomment>
2145 LABEL IOS</extracomment>
21072146 <translation>Release Notes</translation>
21082147 </message>
21092148 <message>
21102149 <source>Settings</source>
2111 <extracomment>LABEL ANDROID IOS DESKTOP_QML</extracomment>
2150 <extracomment>LABEL IOS</extracomment>
21122151 <translation>Einstellungen</translation>
21132152 </message>
21142153 <message>
22382277 <translation>Online-Hilfe</translation>
22392278 </message>
22402279 <message>
2241 <source>Help</source>
2242 <extracomment>LABEL DESKTOP_QML</extracomment>
2243 <translation>Hilfe</translation>
2244 </message>
2245 <message>
22462280 <source>Software licenses</source>
22472281 <extracomment>LABEL DESKTOP_QML</extracomment>
22482282 <translation>Softwarelizenzen</translation>
23542388 <translation>Hilfe &amp; Feedback</translation>
23552389 </message>
23562390 <message>
2357 <source>Smartphone as card reader</source>
2358 <translation>Smartphone als Kartenleser</translation>
2359 </message>
2360 <message>
2361 <source>Developer options</source>
2362 <translation>Entwickleroptionen</translation>
2391 <source>Remote service</source>
2392 <translation>Fernzugriff</translation>
23632393 </message>
23642394 <message>
23652395 <source>More</source>
23822412 <translation>Diese Funktion steht auf Ihrem Gerät leider nicht zur Verfügung.</translation>
23832413 </message>
23842414 <message>
2385 <source>However you can use a seperate &apos;Bluetooth card reader&apos; or a seperate &apos;smartphone as card reader&apos; to utilize the online identification function.</source>
2415 <source>However, you can use a separate &apos;smartphone as card reader&apos; to utilize the online identification function.</source>
23862416 <extracomment>INFO ANDROID IOS AA2 can&apos;t use NFC on this device, suggest to use bluetooth instead.</extracomment>
2387 <translation>Sie können die Online-Ausweisfunktion aber mit einen separaten Bluetooth-Leser oder einem anderen Smartphone als Kartenleser nutzen.</translation>
2417 <translation>Sie können die Online-Ausweisfunktion aber mit einem anderen Smartphone als Kartenleser nutzen.</translation>
23882418 </message>
23892419 <message>
23902420 <source>NFC is switched off.</source>
24062436 <translation>Verbindung wird hergestellt</translation>
24072437 </message>
24082438 <message>
2409 <source>Your device does not meet the technical requirements (Extended Length not supported). However you can use a seperate &apos;Bluetooth card reader&apos; or a seperate &apos;smartphone as card reader&apos; to utilize the online identification function.</source>
2439 <source>Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate &apos;smartphone as card reader&apos; to utilize the online identification function.</source>
24102440 <extracomment>INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a bluetooth reader or a differnt smarthpone is suggested.</extracomment>
2411 <translation>Ihr Gerät erfüllt leider nicht die technischen Voraussetzungen (Extended Length). Sie können die Online-Ausweisfunktion aber mit einen separaten Bluetooth-Leser oder einem anderen Smartphone als Kartenleser nutzen.</translation>
2441 <translation>Ihr Gerät erfüllt leider nicht die technischen Voraussetzungen (Extended Length). Sie können die Online-Ausweisfunktion aber mit einem anderen Smartphone als Kartenleser nutzen.</translation>
24122442 </message>
24132443 <message>
24142444 <source>The online identification function of your ID card is not activated. Please contact the authority responsible for issuing your identification card to activate the online identification function.</source>
24932523 <translation>Dies ist die Informationsansicht zu Passwörtern der AusweisApp2.</translation>
24942524 </message>
24952525 <message>
2496 <source>The personal identification number (PIN) is chosen by you and is required for every use of the online eID function. You can change it anytime and indefinitely if you know your valid PIN. For your 6-digit PIN choose a combination of numbers, that is not easy to guess, neither &quot;123456&quot; nor your birth date, or any other numbers printed on the ID card. If you are no longer aware of your valid PIN, you will need to contact the authority responsible for issuing your identification card to renew your PIN.&lt;br&gt;&lt;br&gt;When changing the PIN for the first time, please use your 5-digit transport PIN. You will find the transport PIN in the letter you received from the authority responsible for issuing your identification card (marked in red) after you have applied for your identity card.&lt;br&gt;&lt;br&gt;Please note that you can not use the online eID function with your 5-digit transport PIN. A change to a 6-digit PIN is mandatory.</source>
2497 <extracomment>INFO DESKTOP_QML Description text of PIN</extracomment>
2498 <translation>Die Geheimnummer (PIN) vergeben Sie selbst und benötigen Sie bei jeder Nutzung der Online-Ausweisfunktion. Sie können diese jederzeit und unbegrenzt oft ändern, solange Ihnen Ihre gültige PIN bekannt ist. Wählen Sie für Ihre sechsstellige PIN eine Zahlenkombination, die nicht leicht zu erraten ist, also weder &quot;123456&quot;, noch Ihr Geburtsdatum oder andere Zahlen, die auf dem Ausweis aufgedruckt sind. Sollten Sie Ihre PIN vergessen haben, können Sie in der für die Ausgabe Ihres Ausweises zuständigen Behörde eine neue PIN setzen.&lt;br&gt;&lt;br&gt;Zum erstmaligen Setzen Ihrer PIN verwenden Sie bitte die fünfstellige Transport-PIN. Sie finden diese in dem Schreiben, welches Sie nach Beantragung Ihres Ausweises von der zuständigen Behörde erhalten haben (rot markiert).&lt;br&gt;&lt;br&gt;Bitte beachten Sie, dass die Online-Ausweisfunktion erst nach Änderung der fünfstelligen Transport-PIN in eine sechsstellige PIN genutzt werden kann.</translation>
2499 </message>
2500 <message>
2501 <source>The card access number (CAN) is required if the PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a 6-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red).</source>
2526 <source>The Card Access Number (CAN) is required if the PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red).</source>
25022527 <extracomment>INFO DESKTOP_QML Description text of CAN if required for third PIN attempt</extracomment>
25032528 <translation>Die Zugangsnummer (CAN) wird verlangt, wenn die PIN bereits zwei Mal falsch eingegeben wurde. Um zu verhindern, dass ohne Ihre Zustimmung eine dritte Fehleingabe und somit die Sperrung der PIN erfolgen kann, wird an dieser Stelle zusätzlich die CAN abgefragt. Die CAN ist eine sechsstellige Zahl, die auf der Vorderseite des Ausweises unten rechts zu finden ist (rot markiert).</translation>
25042529 </message>
25052530 <message>
2506 <source>The personal unblocking key (PUK) is required if the PIN has been entered three times. At this point the PIN is blocked. The PUK is a 10-digit number you received with the letter sent to you by your competent authority (marked in red). Please note that you can only use the PUK to unblock the PIN entry. If you have forgotten your PIN, you can have a new PIN set at your competent authority.</source>
2531 <source>The Personal Unblocking Key (PUK) is required if the PIN has been entered three times. At this point the PIN is blocked. The PUK is a ten-digit number you received with the letter sent to you by your competent authority (marked in red). Please note that you can only use the PUK to unblock the PIN entry. If you have forgotten your PIN, you can have a new PIN set at your competent authority.</source>
25072532 <extracomment>INFO DESKTOP_QML Description text of PUK</extracomment>
25082533 <translation>Die Entsperrnummer (PUK) wird verlangt, wenn die PIN drei Mal hintereinander falsch eingegeben wurde. Zu diesem Zeitpunkt ist die PIN gesperrt. Die PUK ist eine zehnstellige Zahl, die Sie mit dem Schreiben bekommen haben, welches Sie nach Beantragung Ihres Ausweises von der zuständigen Behörde erhalten haben (rot markiert). Bitte beachten Sie, dass Sie mit Ihrer PUK lediglich die PIN-Eingabe wieder entsperren können. Sollten Sie Ihre PIN vergessen haben, können Sie in der für die Ausgabe Ihres Ausweises zuständigen Behörde eine neue PIN setzen.</translation>
25092534 </message>
25382563 <translation>Smartphone als Kartenleser-Information</translation>
25392564 </message>
25402565 <message>
2541 <source>The card access number (CAN) allows to access the imprinted data of the ID card. In order to allow on-site reading of the personal data the service provider needs to acquire governmental authorization to do so. On-site reading is usually employed to automatically fill forms and prevent spelling mistakes when transfering the personal data.</source>
2566 <source>The Card Access Number (CAN) allows to access the imprinted data of the ID card. In order to allow on-site reading of the personal data the service provider needs to acquire governmental authorization to do so. On-site reading is usually employed to automatically fill forms and prevent spelling mistakes when transfering the personal data.</source>
25422567 <extracomment>INFO DESKTOP_QML Description text of CAN-allowed authentication</extracomment>
25432568 <translation>Die Kartenzugriffsnummer (CAN) ermöglicht den Zugriff auf die auf dem Ausweis gespeicherten Daten. Um das Vor-Ort-Auslesen der persönlichen Daten zu Nutzen muss ein Diensteanbieter eine Zulassung durch eine staatliche Behörde erhalten. Die Vor-Ort-Auslesefunktion wird typischerweise zum automatischen Füllen von Formularen und insbesondere dem Verhindern von Fehlern beim Übertragen der persönlichen Daten eingesetzt.</translation>
25442569 </message>
25462571 <source>You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.&lt;br&gt;&lt;br&gt;To use your smartphone as a card reader you&apos;ll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you&apos;ll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone.</source>
25472572 <extracomment>INFO DESKTOP_QML Description text of SaC pairing</extracomment>
25482573 <translation>Es besteht die Möglichkeit Ihr Smartphone als Kartenleser mit der AusweisApp2 zu verwenden. Das Smartphone muss einen unterstützten NFC-Chip verwenden und beide Geräte, sowohl das Smartphone als auch Ihr Rechner, müssen mit dem selben WLAN-Netz verbunden sein.&lt;br&gt;&lt;br&gt;Um Ihr Smartphone als Kartenleser zu verwenden muss stets der Fernzugriff in der AusweisApp2 auf Ihrem Smartphone aktiviert sein. Für eine intiale Verbindung der Geräte muss zusätzlich der Kopplungsmodus auf dem Smartphone aktiviert werden, wählen Sie danach das Gerät aus der Liste der verfügbaren Geräte auf Ihrem Rechner und geben Sie den von Ihrem Smartphone dargestellten Kopplungscode ein.</translation>
2574 </message>
2575 <message>
2576 <source>The Personal Identification Number (PIN) is chosen by you and is required for every use of the online eID function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither &quot;123456&quot; nor your birth date, or any other numbers printed on the ID card. If you are no longer aware of your valid PIN, you will need to contact the authority responsible for issuing your identification card to renew your PIN.&lt;br&gt;&lt;br&gt;When changing the PIN for the first time, please use the five-digit Transport PIN. You will find the Transport PIN in the letter you received from the authority responsible for issuing your identification card (marked in red) after you have applied for your identity card.&lt;br&gt;&lt;br&gt;Please note that you can not use the online eID function with the five-digit Transport PIN. A change to a six-digit PIN is mandatory.</source>
2577 <extracomment>INFO DESKTOP_QML Description text of PIN</extracomment>
2578 <translation>Die Persönliche Identifikationsnummer (PIN) vergeben Sie selbst und benötigen Sie bei jeder Nutzung der Online-Ausweisfunktion. Sie können diese jederzeit und unbegrenzt oft ändern, solange Ihnen Ihre gültige PIN bekannt ist. Wählen Sie für Ihre sechsstellige PIN eine Zahlenkombination, die nicht leicht zu erraten ist, also weder &amp;quot;123456&amp;quot;, noch Ihr Geburtsdatum oder andere Zahlen, die auf dem Ausweis aufgedruckt sind. Sollten Sie Ihre PIN vergessen haben, können Sie in der für die Ausgabe Ihres Ausweises zuständigen Behörde eine neue PIN setzen.&lt;br&gt;&lt;br&gt;Zum erstmaligen Setzen Ihrer PIN verwenden Sie bitte die fünfstellige Transport-PIN. Sie finden diese in dem Schreiben, welches Sie nach Beantragung Ihres Ausweises von der zuständigen Behörde erhalten haben (rot markiert).&lt;br&gt;&lt;br&gt;Bitte beachten Sie, dass die Online-Ausweisfunktion erst nach Änderung der fünfstelligen Transport-PIN in eine sechsstellige PIN genutzt werden kann.</translation>
25492579 </message>
25502580 </context>
25512581 <context>
26142644 <message>
26152645 <source>Select a secure PIN that consists of six digits. Do not select a number that can be guessed easily, such as &quot;123456&quot;, your date of birth or any other number that is printed on your ID card.
26162646
2617 When you change your PIN for the first time, please enter your five-digit transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your transport PIN with the letter sent to you by your competent authority.
2647 When you change your PIN for the first time, please enter the five-digit Transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your Transport PIN with the letter sent to you by your competent authority.
26182648
26192649 Please note that the PIN may only consist of digits (0-9).</source>
26202650 <translation>Wählen Sie für Ihre sechsstellige PIN eine Zahlenkombination, die nicht leicht zu erraten ist, also weder &quot;123456&quot;, noch Ihr Geburtsdatum oder andere Zahlen, die auf dem Ausweis aufgedruckt sind.
26212651
2622 Bei der erstmaligen PIN-Änderung geben Sie bitte in das Feld &quot;Aktuelle PIN / Transport-PIN&quot; Ihre fünfstellige Transport-PIN ein. Sie finden die Transport-PIN in dem Schreiben, das Sie nach Beantragung Ihres Ausweises von der für die Ausgabe Ihres Ausweises zuständigen Behörde erhalten haben.</translation>
2623 </message>
2624 <message>
2625 <source>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</source>
2626 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch müssen Sie vorher die sechsstellige Zugangsnummer (CAN) eingeben. Diese finden Sie auf der Vorderseite Ihres Ausweises.</translation>
2652 Bei der erstmaligen PIN-Änderung geben Sie bitte in das Feld &quot;Aktuelle PIN / Transport-PIN&quot; die fünfstellige Transport-PIN ein. Sie finden die Transport-PIN in dem Schreiben, das Sie nach Beantragung Ihres Ausweises von der für die Ausgabe Ihres Ausweises zuständigen Behörde erhalten haben.</translation>
2653 </message>
2654 <message>
2655 <source>A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</source>
2656 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch geben Sie bitte zunächst die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite Ihres Ausweises.</translation>
26272657 </message>
26282658 <message>
26292659 <source>Current PIN / Transport PIN:</source>
26382668 <translation>Bestätigen:</translation>
26392669 </message>
26402670 <message>
2641 <source>Card access number (CAN):</source>
2671 <source>Card Access Number (CAN):</source>
26422672 <translation>Zugangsnummer (CAN):</translation>
26432673 </message>
26442674 <message>
26582688 <translation>deactivatedReaderImageLabel</translation>
26592689 </message>
26602690 <message>
2661 <source>Click on &quot;Change PIN&quot; to enter your card access number (CAN) and then set a new PIN. You can find your card access number (CAN) on the front side of your ID card next to the date of expiry. On the electronic residence permit the card access number (CAN) is printed above your signature.</source>
2691 <source>Click on &quot;Change PIN&quot; to enter your Card Access Number (CAN) and then set a new PIN. You can find your Card Access Number (CAN) on the front side of your ID card next to the date of expiry. On the electronic residence permit the Card Access Number (CAN) is printed above your signature.</source>
26622692 <translation>&quot;Klicken Sie auf &quot;PIN ändern&quot;, um zunächst Ihre Zugangsnummer (CAN) einzugeben und anschließend eine neue PIN zu setzen. Die Zugangsnummer (CAN) finden Sie beim Personalausweis auf der Vorderseite rechts neben dem letzten Tag der Gültigkeitsdauer. Beim elektronischen Aufenthaltstitel finden Sie die Zugangsnummer (CAN) über Ihrer Unterschrift.</translation>
26632693 </message>
26642694 <message>
27052735 Bitte beachten Sie, dass Sie mit Ihrer PUK lediglich Ihren Online-Ausweis entsperren können. Sollten Sie Ihre PIN vergessen haben, können Sie von der für die Ausgabe Ihres Ausweises zuständigen Behörde eine neue PIN setzen lassen.</translation>
27062736 </message>
27072737 <message>
2708 <source>Display of the card access number (CAN) in the lower right corner of the id card</source>
2738 <source>Display of the Card Access Number (CAN) in the lower right corner of the id card</source>
27092739 <translation>Darstellung der Kartenzugangsnummer (CAN) in der unteren rechten Ecke des Ausweises</translation>
27102740 </message>
27112741 </context>
27742804 <context>
27752805 <name>ProviderDetailButtonBar</name>
27762806 <message>
2777 <source>ONLINE APPLICATION</source>
2778 <extracomment>LABEL ANDROID_TABLET IOS_TABLET</extracomment>
2779 <translation>Online-Anwendung</translation>
2780 </message>
2781 <message>
2782 <source>To online application</source>
2783 <extracomment>LABEL DESKTOP_QML</extracomment>
2784 <translation>Zur Online-Anwendung</translation>
2807 <source>To provider</source>
2808 <extracomment>LABEL DESKTOP_QML
2809 ----------
2810 LABEL ANDROID_TABLET IOS_TABLET</extracomment>
2811 <translation>Zum Anbieter</translation>
27852812 </message>
27862813 </context>
27872814 <context>
30973124 </message>
30983125 </context>
30993126 <context>
3127 <name>ProxyCredentialsPopup</name>
3128 <message>
3129 <source>Proxy credential username</source>
3130 <extracomment>LABEL DESKTOP Accessible name.</extracomment>
3131 <translation>Benutzername für den Proxy</translation>
3132 </message>
3133 <message>
3134 <source>Proxy credential password</source>
3135 <extracomment>LABEL DESKTOP Accessible name.</extracomment>
3136 <translation>Passwort für den Proxy</translation>
3137 </message>
3138 <message>
3139 <source>Sign in</source>
3140 <extracomment>LABEL DESKTOP Title of the proxy credentials popup.
3141 ----------
3142 LABEL DESKTOP Text of the button in the proxy credentials popup.</extracomment>
3143 <translation>Anmelden</translation>
3144 </message>
3145 <message>
3146 <source>The proxy %1 requires username and password.</source>
3147 <extracomment>LABEL DESKTOP Text of the proxy credentials popup. An example for %1 is http://proxy.example.com:1337.</extracomment>
3148 <translation>Für den Proxy %1 sind ein Nutzername und ein Passwort erforderlich.</translation>
3149 </message>
3150 <message>
3151 <source>Username</source>
3152 <extracomment>LABEL DESKTOP Label of the textfield for the username.</extracomment>
3153 <translation>Nutzername</translation>
3154 </message>
3155 <message>
3156 <source>Password</source>
3157 <extracomment>LABEL DESKTOP Label of the textfield for the password.</extracomment>
3158 <translation>Passwort</translation>
3159 </message>
3160 </context>
3161 <context>
31003162 <name>QObject</name>
31013163 <message>
31023164 <source>Please describe the error that occurred.</source>
31143176 <source>Critical errors:</source>
31153177 <translation>Kritische Fehler:</translation>
31163178 </message>
3179 <message>
3180 <source>Service URL</source>
3181 <translation>Service URL</translation>
3182 </message>
3183 <message>
3184 <source>Parameter of occurred error:</source>
3185 <translation>Parameter des aufgetretenen Fehlers:</translation>
3186 </message>
31173187 </context>
31183188 <context>
31193189 <name>RandomPinDialog</name>
31953265 <translation>Eingabe des Kopplungscodes</translation>
31963266 </message>
31973267 <message>
3198 <source>Enter the 4-digit pairing code shown on your other device.</source>
3268 <source>Enter the four-digit pairing code shown on your other device.</source>
31993269 <translation>Geben Sie den vierstelligen Kopplungscode ein, der auf dem anderen Gerät angezeigt wird.</translation>
32003270 </message>
32013271 </context>
33223392 <extracomment>LABEL ANDROID IOS</extracomment>
33233393 <translation>Kopplungscode: %1</translation>
33243394 </message>
3395 <message>
3396 <source>Enable WiFi</source>
3397 <extracomment>LABEL ANDROID IOS</extracomment>
3398 <translation>WLAN aktivieren</translation>
3399 </message>
33253400 </context>
33263401 <context>
33273402 <name>RemoteServiceViewRemote</name>
33423417 </message>
33433418 <message>
33443419 <source>No unpaired smartphone as card reader (SaC) available. Please make sure that the smartphone as card reader (SaC) functionality in AusweisApp2 on your other device is activated an that both devices are connected to the same WiFi.</source>
3345 <extracomment>INFO ANDROID IOS No SaC was found on the network, both devices need to be connected to the same wifi network.</extracomment>
3346 <translation>Kein ungekoppeltes Smartphone als Kartenleser verfügbar. Bitte stellen Sie sicher, dass die Funktion &quot;Fernzugriff&quot; in der AusweisApp2 auf Ihrem Smartphone aktiviert ist und beide Geräte mit demselben WLAN verbunden sind.</translation>
3420 <extracomment>INFO ANDROID IOS No SaC was found on the network, both devices need to be connected to the same WiFi network.</extracomment>
3421 <translation>Kein ungekoppeltes Smartphone als Kartenleser verfügbar. Bitte stellen Sie sicher, dass die Funktion &quot;Fernzugriff&quot; in der AusweisApp2 auf Ihrem Smartphone aktiviert ist und beide Geräte mit demselben WLAN verbunden sind.</translation>
33473422 </message>
33483423 <message>
33493424 <source>Start the pairing mode on your smartphone if you haven&apos;t done it already.</source>
33903465 <name>RemoteWorkflow</name>
33913466 <message>
33923467 <source>Continue</source>
3393 <extracomment>LABEL DESKTOP_QML</extracomment>
3468 <extracomment>LABEL ANDROID IOS</extracomment>
33943469 <translation>Fortsetzen</translation>
33953470 </message>
33963471 <message>
33973472 <source>Pair device</source>
3398 <extracomment>LABEL DESKTOP_QML</extracomment>
3473 <extracomment>LABEL ANDROID IOS</extracomment>
33993474 <translation>Gerät koppeln</translation>
34003475 </message>
34013476 <message>
3402 <source>Enable Wifi</source>
3403 <extracomment>LABEL DESKTOP_QML</extracomment>
3477 <source>Enable WiFi</source>
3478 <extracomment>LABEL ANDROID IOS</extracomment>
34043479 <translation>WLAN aktivieren</translation>
34053480 </message>
34063481 <message>
34073482 <source>Establish connection</source>
3408 <extracomment>LABEL DESKTOP_QML</extracomment>
3483 <extracomment>LABEL ANDROID IOS</extracomment>
34093484 <translation>Verbindung wird hergestellt</translation>
34103485 </message>
34113486 <message>
34193494 <translation>Die Online-Ausweisfunktion Ihres Ausweises ist nicht aktiviert. Bitte wenden Sie sich an die Behörde, die Ihren Ausweis ausgegeben hat, um die Online-Ausweisfunktion zu aktivieren.</translation>
34203495 </message>
34213496 <message>
3497 <source>Determine card</source>
3498 <extracomment>LABEL ANDROID IOS</extracomment>
3499 <translation>Ermittle Ausweis</translation>
3500 </message>
3501 <message>
3502 <source>The device %1 was unpaired because it did not react to connection attempts. Pair the device again to use it as a card reader.</source>
3503 <extracomment>INFO ANDROID IOS The paired smartphone was removed since it did not respond to connection attempts. It needs to be paired again before using it.</extracomment>
3504 <translation>Das Gerät %1 wurde entkoppelt, da es nicht auf Verbindungsversuche reagiert hat. Koppeln Sie das Gerät erneut, um es wieder als Kartenleser zu verwenden.</translation>
3505 </message>
3506 <message>
3507 <source>To use the remote service WiFi has to be activated. Please activate WiFi in your device settings.</source>
3508 <extracomment>INFO ANDROID IOS The WiFi module needs to be enabled in the system settings to use the remote service.</extracomment>
3509 <translation>Um den Fernzugriff zu nutzen, muss WLAN aktiviert werden. Bitte aktivieren Sie WLAN in Ihren Einstellungen.</translation>
3510 </message>
3511 <message>
3512 <source>No paired smartphone as cardreader (SaC) with activated &quot;remote service&quot; available.</source>
3513 <extracomment>INFO ANDROID IOS No paired and reachable device was found, hint that the remote device needs to be actually started for this feature.</extracomment>
3514 <translation>Kein gekoppeltes Smartphone als Kartenleser mit aktiviertem &quot;Fernzugriff&quot; verfügbar.</translation>
3515 </message>
3516 <message>
34223517 <source>Connected to %1. Please place the NFC interface of the smartphone on your ID card.</source>
34233518 <extracomment>INFO ANDROID IOS The connection to the smartphone was established, the ID card may be inserted.</extracomment>
34243519 <translation>Verbunden mit %1. Bitte platzieren Sie das Smartphone mit der NFC-Schnittstelle auf Ihrem Ausweis.</translation>
34253520 </message>
3426 <message>
3427 <source>Determine card</source>
3428 <extracomment>LABEL DESKTOP_QML</extracomment>
3429 <translation>Ermittle Ausweis</translation>
3430 </message>
3431 <message>
3432 <source>The device %1 was unpaired because it did not react to connection attempts. Pair the device again to use it as a card reader.</source>
3433 <extracomment>INFO ANDROID IOS The paired smartphone was removed since it did not respond to connection attempts. It needs to be paired again before using it.</extracomment>
3434 <translation>Das Gerät %1 wurde entkoppelt, da es nicht auf Verbindungsversuche reagiert hat. Koppeln Sie das Gerät erneut, um es wieder als Kartenleser zu verwenden.</translation>
3435 </message>
3436 <message>
3437 <source>To use the remote service WiFi has to be activated. Please activate WiFi in your device settings.</source>
3438 <extracomment>INFO ANDROID IOS The wifi module needs to be enabled in the system settings to use the remote service.</extracomment>
3439 <translation>Um den Fernzugriff zu nutzen, muss WLAN aktiviert werden. Bitte aktivieren Sie WLAN in Ihren Einstellungen.</translation>
3440 </message>
3441 <message>
3442 <source>No paired smartphone as cardreader (SaC) with activated &quot;remote service&quot; available.</source>
3443 <extracomment>INFO ANDROID IOS No paired and reachable device was found, hint that the remote device needs to be actually started for this feature.</extracomment>
3444 <translation>Kein gekoppeltes Smartphone als Kartenleser mit aktiviertem &quot;Fernzugriff&quot; verfügbar.</translation>
3445 </message>
34463521 </context>
34473522 <context>
34483523 <name>ResultView</name>
34683543 <source>Send email</source>
34693544 <extracomment>LABEL DESKTOP_QML</extracomment>
34703545 <translation>E-Mail senden</translation>
3546 </message>
3547 <message>
3548 <source>Save logfile</source>
3549 <extracomment>LABEL DESKTOP_QML</extracomment>
3550 <translation>Protokolldatei speichern</translation>
3551 </message>
3552 <message>
3553 <source>See details</source>
3554 <extracomment>LABEL DESKTOP_QML</extracomment>
3555 <translation>Details anzeigen</translation>
3556 </message>
3557 <message>
3558 <source>Logfiles</source>
3559 <translation>Logdateien</translation>
3560 </message>
3561 </context>
3562 <context>
3563 <name>ScreenOrientationSelectionPopup</name>
3564 <message>
3565 <source>Select screen orientation</source>
3566 <extracomment>LABEL ANDROID</extracomment>
3567 <translation>Bildschirmausrichtung wählen</translation>
3568 </message>
3569 <message>
3570 <source>Set screen orientation to portrait</source>
3571 <extracomment>LABEL ANDROID</extracomment>
3572 <translation>Bildschirmausrichtung auf Hochformat setzen</translation>
3573 </message>
3574 <message>
3575 <source>Portrait</source>
3576 <extracomment>LABEL ANDROID</extracomment>
3577 <translation>Hochformat</translation>
3578 </message>
3579 <message>
3580 <source>recommended</source>
3581 <translation>empfohlen</translation>
3582 </message>
3583 <message>
3584 <source>Set screen orientation to landscape</source>
3585 <extracomment>LABEL ANDROID</extracomment>
3586 <translation>Bildschirmausrichtung auf Querformat setzen</translation>
3587 </message>
3588 <message>
3589 <source>Landscape</source>
3590 <extracomment>LABEL ANDROID</extracomment>
3591 <translation>Querformat</translation>
3592 </message>
3593 <message>
3594 <source>Using a screen orientation unfit for your device may result in display errors.</source>
3595 <extracomment>LABEL ANDROID</extracomment>
3596 <translation>Die Ver­wen­dung ei­ner, für Ihr Ge­rät nicht ge­eig­ne­ten Bild­schirm­aus­rich­tung kann zu An­zei­ge­feh­lern füh­ren.</translation>
34713597 </message>
34723598 </context>
34733599 <context>
35203646 <translation>Verlauf</translation>
35213647 </message>
35223648 <message>
3523 <source>Save authentification history</source>
3649 <source>Save authentication history</source>
35243650 <extracomment>LABEL DESKTOP_QML</extracomment>
35253651 <translation>Verlauf der Ausweisvorgänge speichern</translation>
35263652 </message>
35623688 <message>
35633689 <source>History is empty</source>
35643690 <translation>Es gibt keine Einträge im Verlauf</translation>
3565 </message>
3566 <message>
3567 <source>Avoid visual feedback in the on screen keypad</source>
3568 <extracomment>LABEL DESKTOP_QML</extracomment>
3569 <translation>Deaktiviere die Animation der Tasten auf der Bildschirmtastatur</translation>
35703691 </message>
35713692 <message>
35723693 <source>Delete history</source>
36033724 <extracomment>LABEL DESKTOP_QML The automatic update check is disabled (or no network connection was present during app start), a manual check for update is required.</extracomment>
36043725 <translation>Keine Aktualisierungsinformationen vorhanden, bitte prüfen Sie manuell auf verfügbare Aktualisierungen.</translation>
36053726 </message>
3727 <message>
3728 <source>Deleted %1 entries from the history.</source>
3729 <extracomment>INFO DESKTOP_QML Feedback how many history entries were removed.</extracomment>
3730 <translation>Es wurden %1 Einträge aus dem Verlauf gelöscht.</translation>
3731 </message>
3732 <message>
3733 <source>Visual feedback when pressing keypad buttons</source>
3734 <extracomment>LABEL DESKTOP_QML</extracomment>
3735 <translation>Animation der Tasten auf der Bildschirmtastatur</translation>
3736 </message>
36063737 </context>
36073738 <context>
36083739 <name>SelfAuthenticationData</name>
36553786 <extracomment>LABEL DESKTOP_QML Title of the self authentication result data view</extracomment>
36563787 <translation>Ausgelesene Daten der Selbstauskunft</translation>
36573788 </message>
3789 <message>
3790 <source>Portable Document Format</source>
3791 <translation>Portable Document Format</translation>
3792 </message>
36583793 </context>
36593794 <context>
36603795 <name>SelfAuthenticationView</name>
37003835 ----------
37013836 LABEL ANDROID IOS</extracomment>
37023837 <translation>Meine Daten einsehen</translation>
3838 </message>
3839 <message>
3840 <source>https://www.ausweisapp.bund.de/datenschutz/</source>
3841 <translation>https://www.ausweisapp.bund.de/datenschutz/</translation>
3842 </message>
3843 <message>
3844 <source>Click to open link to data privacy statement in browser: %1</source>
3845 <translation>Öffne den Link der Datenschutzerklärung im Browser: %1</translation>
3846 </message>
3847 <message>
3848 <source>This is the self-authentication view of the AusweisApp2.</source>
3849 <translation>Dies ist die Darstellung der Selbstauskunft der AusweisApp2.</translation>
3850 </message>
3851 <message>
3852 <source>Self-Authentication.</source>
3853 <extracomment>LABEL DESKTOP_QML</extracomment>
3854 <translation>Selbstauskunft.</translation>
37033855 </message>
37043856 <message>
37053857 <source>%1 more presses to toggle the testmode for the self-authentication.</source>
37163868 <extracomment>INFO ANDROID IOS Used in notifications when the user taps the magnifying glass</extracomment>
37173869 <translation>Testmodus für die Selbstauskunft deaktiviert.</translation>
37183870 </message>
3719 <message>
3720 <source>https://www.ausweisapp.bund.de/datenschutz/</source>
3721 <translation>https://www.ausweisapp.bund.de/datenschutz/</translation>
3722 </message>
3723 <message>
3724 <source>Click to open link to data privacy statement in browser: %1</source>
3725 <translation>Öffne den Link der Datenschutzerklärung im Browser: %1</translation>
3726 </message>
3727 <message>
3728 <source>This is the self-authentication view of the AusweisApp2.</source>
3729 <translation>Dies ist die Darstellung der Selbstauskunft der AusweisApp2.</translation>
3730 </message>
3731 <message>
3732 <source>Self-Authentication.</source>
3733 <extracomment>LABEL DESKTOP_QML</extracomment>
3734 <translation>Selbstauskunft.</translation>
3735 </message>
37363871 </context>
37373872 <context>
37383873 <name>SelfInfoWidget</name>
38143949 <translation>Debugoptionen</translation>
38153950 </message>
38163951 <message>
3817 <source>Pairing the device ...</source>
3818 <extracomment>LABEL DESKTOP_QML</extracomment>
3819 <translation>Das Gerät wird gekoppelt ...</translation>
3820 </message>
3821 <message>
3822 <source>The device &quot;%1&quot; has been paired.</source>
3823 <translation>Das Gerät &quot;%1&quot; wurde gekoppelt.</translation>
3824 </message>
3825 <message>
3826 <source>Pairing to &quot;%1&quot; failed:</source>
3827 <extracomment>ERROR DESKTOP_QML An error occurred while pairing the device.</extracomment>
3828 <translation>Die Kopplung mit &quot;%1&quot; ist fehlgeschlagen:</translation>
3829 </message>
3830 <message>
38313952 <source>Device name</source>
38323953 <extracomment>LABEL ANDROID IOS</extracomment>
38333954 <translation>Gerätename</translation>
38483969 <translation>Zufällige Anordnung der Ziffern</translation>
38493970 </message>
38503971 <message>
3851 <source>Avoid visual feedback in the on screen keypad</source>
3852 <extracomment>LABEL ANDROID IOS</extracomment>
3853 <translation>Deaktiviere die Animation der Tasten auf der Bildschirmtastatur</translation>
3854 </message>
3855 <message>
38563972 <source>History</source>
3857 <extracomment>LABEL ANDROID IOS</extracomment>
3973 <extracomment>LABEL ANDROID IOS
3974 ----------
3975 LABEL ALL_PLATFORMS</extracomment>
38583976 <translation>Verlauf</translation>
38593977 </message>
38603978 <message>
3861 <source>Save authentification history</source>
3979 <source>Save authentication history</source>
38623980 <extracomment>LABEL ANDROID IOS</extracomment>
38633981 <translation>Verlauf der Ausweisvorgänge speichern</translation>
38643982 </message>
38733991 <translation>Smartphone als Kartenleser</translation>
38743992 </message>
38753993 <message>
3876 <source>Click here to use another smartphone as a card reader</source>
3877 <extracomment>LABEL ANDROID IOS</extracomment>
3878 <translation>Klicken Sie hier um ein anderes Smartphone als Kartenleser zu verwenden</translation>
3994 <source>Configure remote service for another device</source>
3995 <extracomment>LABEL ANDROID IOS</extracomment>
3996 <translation>Ein anderes Gerät für den Fernzugriff konfigurieren</translation>
38793997 </message>
38803998 <message>
38813999 <source>Randomize the order of the on screen keypad buttons</source>
38834001 <translation>Ziffern der Bildschirmtastatur zufällig anordnen</translation>
38844002 </message>
38854003 <message>
3886 <source>Privacy keypad</source>
3887 <extracomment>LABEL ANDROID IOS</extracomment>
3888 <translation>Vertrauliche Bildschirmtastatur</translation>
4004 <source>Screen orientation</source>
4005 <extracomment>LABEL ANDROID</extracomment>
4006 <translation>Bildschirmausrichtung</translation>
4007 </message>
4008 <message>
4009 <source>Landscape</source>
4010 <extracomment>LABEL ANDROID</extracomment>
4011 <translation>Querformat</translation>
4012 </message>
4013 <message>
4014 <source>Portrait</source>
4015 <extracomment>LABEL ANDROID</extracomment>
4016 <translation>Hochformat</translation>
4017 </message>
4018 <message>
4019 <source>Keypad animations</source>
4020 <extracomment>LABEL ANDROID IOS</extracomment>
4021 <translation>Tasten-Animationen</translation>
4022 </message>
4023 <message>
4024 <source>Visual feedback when pressing keypad buttons</source>
4025 <extracomment>LABEL ANDROID IOS</extracomment>
4026 <translation>Animation der Tasten auf der Bildschirmtastatur</translation>
4027 </message>
4028 <message>
4029 <source>CAN allowed mode</source>
4030 <extracomment>LABEL ANDROID IOS</extracomment>
4031 <translation>CAN-allowed-Modus</translation>
4032 </message>
4033 <message>
4034 <source>Support CAN allowed mode</source>
4035 <extracomment>LABEL ANDROID IOS</extracomment>
4036 <translation>CAN-allowed-Modus unterstützen</translation>
4037 </message>
4038 <message>
4039 <source>Allow the id card to be used with only the CAN</source>
4040 <extracomment>LABEL ANDROID IOS</extracomment>
4041 <translation>Unterstütze die Verwendung des Ausweis nur mit der CAN</translation>
4042 </message>
4043 <message>
4044 <source>Skip rights page</source>
4045 <extracomment>LABEL ANDROID IOS</extracomment>
4046 <translation>Anzeige der Bereichtigungen überspringen</translation>
4047 </message>
4048 <message>
4049 <source>Do not show the rights page, when in can allowed mode</source>
4050 <extracomment>LABEL ANDROID IOS</extracomment>
4051 <translation>Überspringe die Anzeige der Berechtigungen im CAN-allowed-Modus</translation>
4052 </message>
4053 <message>
4054 <source>Developer Mode</source>
4055 <extracomment>LABEL ANDROID IOS</extracomment>
4056 <translation>Entwicklermodus</translation>
4057 </message>
4058 <message>
4059 <source>Use a more tolerant mode</source>
4060 <extracomment>LABEL ANDROID IOS</extracomment>
4061 <translation>Benutze einen toleranten Modus</translation>
4062 </message>
4063 <message>
4064 <source>Layout style</source>
4065 <extracomment>LABEL ANDROID IOS</extracomment>
4066 <translation>Layout-Stil</translation>
4067 </message>
4068 <message>
4069 <source>iOS</source>
4070 <extracomment>LABEL ALL_PLATFORMS</extracomment>
4071 <translation>iOS</translation>
4072 </message>
4073 <message>
4074 <source>Android</source>
4075 <extracomment>LABEL ALL_PLATFORMS</extracomment>
4076 <translation>Android</translation>
4077 </message>
4078 <message>
4079 <source>Tablet, Android</source>
4080 <extracomment>LABEL ALL_PLATFORMS</extracomment>
4081 <translation>Tablet, Android</translation>
4082 </message>
4083 <message>
4084 <source>Create dummy entries</source>
4085 <extracomment>LABEL ANDROID IOS</extracomment>
4086 <translation>Erstelle Scheindaten</translation>
4087 </message>
4088 <message>
4089 <source>Logfile</source>
4090 <extracomment>LABEL ALL_PLATFORMS</extracomment>
4091 <translation>Protokolldatei</translation>
4092 </message>
4093 <message>
4094 <source>Developer Options</source>
4095 <extracomment>LABEL ANDROID IOS</extracomment>
4096 <translation>Entwickleroptionen</translation>
4097 </message>
4098 <message>
4099 <source>Testmode for the self-authentication</source>
4100 <extracomment>LABEL ANDROID IOS</extracomment>
4101 <translation>Testmodus für die Selbstauskunft</translation>
4102 </message>
4103 <message>
4104 <source>Use the test environment during a self-authentication</source>
4105 <extracomment>LABEL ANDROID IOS</extracomment>
4106 <translation>Benutze die Test-Umgebung während der Selbstauskunft</translation>
38894107 </message>
38904108 </context>
38914109 <context>
39344152 </message>
39354153 <message>
39364154 <source>Do you want to set your PIN now?</source>
3937 <extracomment>INFO DESKTOP_QML Inquiry message if the 5-digit transport PIN should be changed to an ordinary PIN (now).</extracomment>
4155 <extracomment>INFO DESKTOP_QML Inquiry message if the five-digit Transport PIN should be changed to an ordinary PIN (now).</extracomment>
39384156 <translation>Möchten Sie jetzt Ihre PIN setzen?</translation>
39394157 </message>
39404158 <message>
3941 <source>If you have not already done so you have to change your 5-digit transport PIN to a 6-digit PIN before you can use the online-ID function.</source>
4159 <source>If you have not already done so you have to change the five-digit Transport PIN to a six-digit PIN before you can use the online-ID function.</source>
39424160 <extracomment>INFO DESKTOP_QML Hint that this change may be carried out form the main menu as well and that it is required to use the online authentication feature of the ID card.</extracomment>
39434161 <translation>Falls noch nicht geschehen, müssen Sie vor der erstmaligen Nutzung der Online-Ausweisfunktion die fünfstellige Transport-PIN in eine sechsstellige PIN ändern.</translation>
39444162 </message>
39754193 <translation>Einrichtungsschritt zum Verlauf</translation>
39764194 </message>
39774195 <message>
3978 <source>Change transport PIN setup step</source>
4196 <source>Change Transport PIN setup step</source>
39794197 <translation>Einrichtungsschritt zur Änderung der Transport PIN</translation>
39804198 </message>
39814199 <message>
42924510 <translation>Vor der erstmaligen Nutzung der Online-Ausweisfunktion bitte die</translation>
42934511 </message>
42944512 <message>
4295 <source>5 digits long</source>
4513 <source>five digits long</source>
42964514 <extracomment>LABEL ANDROID IOS</extracomment>
42974515 <translation>fünfstellige</translation>
42984516 </message>
42994517 <message>
4300 <source>transport PIN</source>
4518 <source>Transport PIN</source>
43014519 <extracomment>LABEL ANDROID IOS</extracomment>
43024520 <translation>Transport-PIN</translation>
43034521 </message>
43074525 <translation>durch eine persönliche</translation>
43084526 </message>
43094527 <message>
4310 <source>6 digits long PIN</source>
4528 <source>six digits long PIN</source>
43114529 <extracomment>LABEL ANDROID IOS</extracomment>
43124530 <translation>sechsstellige PIN</translation>
43134531 </message>
43874605 <translation>Sie können dieses Tutorial jederzeit wieder über den Bereich &quot;Hilfe &amp; Feedback&quot; aufrufen.</translation>
43884606 </message>
43894607 <message>
4390 <source>The transport PIN is sent to you by the Bundesdruckerei via mail.</source>
4608 <source>The Transport PIN is sent to you by the Bundesdruckerei via mail.</source>
43914609 <extracomment>LABEL ANDROID IOS</extracomment>
43924610 <translation>Die Transport-PIN wird Ihnen von der Bundesdruckerei per Brief zugesandt.</translation>
43934611 </message>
44024620 <translation>Sie können dieses Tutorial jederzeit wieder über den Bereich &quot;Mehr&quot; aufrufen.</translation>
44034621 </message>
44044622 <message>
4405 <source>Please note: The transport PIN can only be used for your first PIN change. If you have already set your personal PIN (e.g. while picking up your ID card) only the set PIN is valid.</source>
4623 <source>Please note: The Transport PIN can only be used for your first PIN change. If you have already set your personal PIN (e.g. while picking up your ID card) only the set PIN is valid.</source>
44064624 <extracomment>LABEL ANDROID IOS</extracomment>
44074625 <translation>Hinweis: Die Transport-PIN kann nur für die erstmalige PIN-Änderung verwendet werden. Sollten Sie (z.B. bei der Abholung Ihres Ausweises) bereits eine persönliche PIN gesetzt haben, ist nur noch diese gültig.</translation>
44084626 </message>
44094627 <message>
4410 <source>You can always set a new PIN at the issuing authority if the (transport) PIN is not known.</source>
4628 <source>You can always set a new PIN at the issuing authority if the (Transport) PIN is not known.</source>
44114629 <extracomment>LABEL ANDROID IOS</extracomment>
44124630 <translation>Ist Ihnen die (Transport-)PIN nicht bekannt, können Sie in der zuständigen Behörde jederzeit eine neue PIN setzen.</translation>
4631 </message>
4632 <message>
4633 <source>Open YouTube video</source>
4634 <extracomment>LABEL ANDROID IOS</extracomment>
4635 <translation>Öffne das YouTube-Video</translation>
44134636 </message>
44144637 </context>
44154638 <context>
45054728 <translation>Jetzt</translation>
45064729 </message>
45074730 <message>
4508 <source>6 digits long PIN</source>
4731 <source>six digits long PIN</source>
45094732 <extracomment>LABEL ANDROID IOS</extracomment>
45104733 <translation>sechsstellige PIN</translation>
45114734 </message>
45204743 <translation>am Kartenleser eingeben!</translation>
45214744 </message>
45224745 <message>
4523 <source>This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.</source>
4524 <extracomment>LABEL ANDROID IOS</extracomment>
4525 <translation>Funktioniert nur, wenn Sie Ihre fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
4746 <source>This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.</source>
4747 <extracomment>LABEL ANDROID IOS</extracomment>
4748 <translation>Funktioniert nur, wenn Sie die fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
45264749 </message>
45274750 <message>
45284751 <source>qrc:///images/tutorial/screenshot_choose_reader_%1_en.png</source>
45294752 <translation>qrc:///images/tutorial/screenshot_choose_reader_%1_de.png</translation>
4753 </message>
4754 <message>
4755 <source>Deprecation warning</source>
4756 <translation>Abkündigungshinweis</translation>
4757 </message>
4758 <message>
4759 <source>Bluetooth support will be removed in the next version of %1!</source>
4760 <translation>Die Bluetooth-Unterstützung wird in der nächsten Version der %1 entfernt!</translation>
45304761 </message>
45314762 </context>
45324763 <context>
46194850 <translation>Jetzt</translation>
46204851 </message>
46214852 <message>
4622 <source>6 digits long PIN</source>
4853 <source>six digits long PIN</source>
46234854 <extracomment>LABEL ANDROID IOS</extracomment>
46244855 <translation>sechsstellige PIN</translation>
46254856 </message>
46344865 <translation>eingeben!</translation>
46354866 </message>
46364867 <message>
4637 <source>This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.</source>
4638 <extracomment>LABEL ANDROID IOS</extracomment>
4639 <translation>Funktioniert nur, wenn Sie Ihre fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
4868 <source>This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.</source>
4869 <extracomment>LABEL ANDROID IOS</extracomment>
4870 <translation>Funktioniert nur, wenn Sie die fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
46404871 </message>
46414872 <message>
46424873 <source>App on iPhone &lt;b&gt;with&lt;/b&gt; NFC chip as card reader</source>
46534884 <extracomment>LABEL ANDROID IOS</extracomment>
46544885 <translation>Sie können sich auch dieses YouTube-Video ansehen das den Prozess erläutert.</translation>
46554886 </message>
4887 <message>
4888 <source>Open YouTube video</source>
4889 <extracomment>LABEL ANDROID IOS</extracomment>
4890 <translation>Öffne das YouTube-Video</translation>
4891 </message>
46564892 </context>
46574893 <context>
46584894 <name>TutorialReaderMethodSacDesktop</name>
46724908 <translation>App auf Computer &lt;b&gt;ohne&lt;/b&gt; NFC-Chip</translation>
46734909 </message>
46744910 <message>
4675 <source>Both devices have to be connected to the same wifi network</source>
4911 <source>Both devices have to be connected to the same WiFi network</source>
46764912 <extracomment>LABEL ANDROID IOS</extracomment>
46774913 <translation>Beide Geräte müssen im selben WLAN sein</translation>
46784914 </message>
47925028 <translation>Eingeben</translation>
47935029 </message>
47945030 <message>
4795 <source>6 digits long PIN</source>
5031 <source>six digits long PIN</source>
47965032 <extracomment>LABEL ANDROID IOS</extracomment>
47975033 <translation>sechsstellige PIN</translation>
47985034 </message>
48075043 <translation>eingeben!</translation>
48085044 </message>
48095045 <message>
4810 <source>This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.</source>
4811 <extracomment>LABEL ANDROID IOS</extracomment>
4812 <translation>Funktioniert nur, wenn Sie Ihre fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
5046 <source>This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.</source>
5047 <extracomment>LABEL ANDROID IOS</extracomment>
5048 <translation>Funktioniert nur, wenn Sie die fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
48135049 </message>
48145050 <message>
48155051 <source>qrc:///images/tutorial/generated/reader_sac_menu_%1_en.svg</source>
48465082 <extracomment>LABEL ANDROID IOS</extracomment>
48475083 <translation>Sie können sich auch dieses YouTube-Video ansehen das den Prozess erläutert.</translation>
48485084 </message>
5085 <message>
5086 <source>Open YouTube video</source>
5087 <extracomment>LABEL ANDROID IOS</extracomment>
5088 <translation>Öffne das YouTube-Video</translation>
5089 </message>
48495090 </context>
48505091 <context>
48515092 <name>TutorialReaderMethodSacMobile</name>
48605101 <translation>App auf Tablet oder Telefon &lt;b&gt;ohne&lt;/b&gt; NFC-Chip</translation>
48615102 </message>
48625103 <message>
4863 <source>Both devices have to be connected to the same wifi network</source>
5104 <source>Both devices have to be connected to the same WiFi network</source>
48645105 <extracomment>LABEL ANDROID IOS</extracomment>
48655106 <translation>Beide Geräte müssen im selben WLAN sein</translation>
48665107 </message>
49455186 <translation>Weiter zur PIN-Eingabe</translation>
49465187 </message>
49475188 <message>
4948 <source>Tap on Wifi</source>
5189 <source>Tap on WiFi</source>
49495190 <extracomment>LABEL ANDROID IOS</extracomment>
49505191 <translation>Tap auf WLAN</translation>
49515192 </message>
49805221 <translation>Eingeben</translation>
49815222 </message>
49825223 <message>
4983 <source>6 digits long PIN</source>
5224 <source>six digits long PIN</source>
49845225 <extracomment>LABEL ANDROID IOS</extracomment>
49855226 <translation>sechsstellige PIN</translation>
49865227 </message>
49955236 <translation>eingeben!</translation>
49965237 </message>
49975238 <message>
4998 <source>This is only possible if you have exchanged the 5 digits long transport PIN with a 6 digits long personal PIN beforehand.</source>
4999 <extracomment>LABEL ANDROID IOS</extracomment>
5000 <translation>Funktioniert nur, wenn Sie Ihre fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
5239 <source>This is only possible if you have exchanged the five digits long Transport PIN with a six digits long personal PIN beforehand.</source>
5240 <extracomment>LABEL ANDROID IOS</extracomment>
5241 <translation>Funktioniert nur, wenn Sie die fünfstellige Transport-PIN bereits in Ihre persönliche sechsstellige PIN geändert haben.</translation>
50015242 </message>
50025243 <message>
50035244 <source>qrc:///images/tutorial/generated/reader_sac_menu_%1_en.svg</source>
51555396 <extracomment>LABEL ANDROID IOS</extracomment>
51565397 <translation>qrc:///images/tutorial/screenshot_cert_%1_de.png</translation>
51575398 </message>
5399 <message>
5400 <source>Open YouTube video</source>
5401 <extracomment>LABEL ANDROID IOS</extracomment>
5402 <translation>Öffne das YouTube-Video</translation>
5403 </message>
51585404 </context>
51595405 <context>
51605406 <name>TutorialWhere</name>
52095455 <translation>Jetzt</translation>
52105456 </message>
52115457 <message>
5212 <source>6 digits long PIN</source>
5458 <source>six digits long PIN</source>
52135459 <extracomment>LABEL ANDROID IOS</extracomment>
52145460 <translation>sechsstellige PIN</translation>
52155461 </message>
53915637 <extracomment>LABEL DESKTOP_QML</extracomment>
53925638 <translation>Entwickleroptionen deaktiviert.</translation>
53935639 </message>
5640 <message>
5641 <source>%1 more presses to toggle the advanced settings.</source>
5642 <extracomment>INFO ANDROID IOS Used in notifications when the user taps the version information</extracomment>
5643 <translation>%1 weitere Klicks um die erweiterten Einstellungen umzuschalten.</translation>
5644 </message>
5645 <message>
5646 <source>Advanced settings activated.</source>
5647 <extracomment>LABEL ANDROID IOS</extracomment>
5648 <translation>Erweiterte Einstellungen aktiviert.</translation>
5649 </message>
5650 <message>
5651 <source>Advanced settings deactivated.</source>
5652 <extracomment>LABEL ANDROID IOS</extracomment>
5653 <translation>Erweiterte Einstellungen deaktiviert.</translation>
5654 </message>
53945655 </context>
53955656 <context>
53965657 <name>WhiteListSurveyView</name>
54205681 <translation>Vielen Dank für Ihre Mithilfe!</translation>
54215682 </message>
54225683 <message>
5423 <source>Cancel</source>
5424 <extracomment>LABEL ANDROID IOS</extracomment>
5425 <translation>Abbrechen</translation>
5426 </message>
5427 <message>
5428 <source>Transmit</source>
5684 <source>Do not send</source>
5685 <extracomment>LABEL ANDROID IOS</extracomment>
5686 <translation>Nicht senden</translation>
5687 </message>
5688 <message>
5689 <source>Send</source>
54295690 <extracomment>LABEL ANDROID IOS</extracomment>
54305691 <translation>Senden</translation>
54315692 </message>
56495910 <translation>Möchten Sie den Entwicklermodus deaktivieren?</translation>
56505911 </message>
56515912 <message>
5652 <source>No, change transport PIN now</source>
5913 <source>No, change Transport PIN now</source>
56535914 <translation>Nein, PIN jetzt ändern</translation>
56545915 </message>
56555916 <message>
56815942 <translation>Anwendung: %1</translation>
56825943 </message>
56835944 <message>
5684 <source>Did you change the transport PIN already?&lt;br&gt;&lt;br&gt;Prior to the first use of the online identification function you have to replace the transport PIN by an individual 6-digit PIN. Online identification with transport PIN is not possible.</source>
5685 <translation>Haben Sie Ihre Transport-PIN schon geändert? &lt;br&gt;&lt;br&gt;Bevor Sie das erste Mal die Online-Ausweisfunktion nutzen können, müssen Sie Ihre Transport-PIN durch eine persönliche, sechsstellige PIN ersetzen. Die Benutzung der Online-Ausweisfunktion ist mit der Transport-PIN nicht möglich.</translation>
5945 <source>Did you change the Transport PIN already?&lt;br&gt;&lt;br&gt;Prior to the first use of the online identification function you have to replace the Transport PIN by an individual six-digit PIN. Online identification with Transport PIN is not possible.</source>
5946 <translation>Haben Sie Ihre Transport-PIN schon geändert?&lt;br&gt;&lt;br&gt;Bevor Sie das erste Mal die Online-Ausweisfunktion nutzen können, müssen Sie Ihre Transport-PIN durch eine persönliche, sechsstellige PIN ersetzen. Die Benutzung der Online-Ausweisfunktion ist mit der Transport-PIN nicht möglich.</translation>
56865947 </message>
56875948 </context>
56885949 <context>
58556116 <translation>Speichern</translation>
58566117 </message>
58576118 <message>
5858 <source>Text files</source>
6119 <source>Textfiles</source>
58596120 <translation>Textdateien</translation>
58606121 </message>
58616122 <message>
60446305 <message>
60456306 <source>No IP addresses assigned</source>
60466307 <translation>Keine IP-Adressen zugewiesen</translation>
6047 </message>
6048 <message>
6049 <source>Warning: The current firewall status can be obscured by additional Group Policies on your system, often set by system administrators.</source>
6050 <translation>Warnung: Der aktuelle Firewall-Status kann durch zusätzliche Gruppenregeln, die oftmals von Administratoren gesetzt werden, auf Ihrem System verschleiert sein.</translation>
60516308 </message>
60526309 <message>
60536310 <source>An error occurred while trying to gather firewall information. Please check the log for more information.</source>
66506907 <message>
66516908 <source>An unknown network error occurred. Check your network connection and try to restart the app.</source>
66526909 <extracomment>ERROR ALL_PLATFORMS Other critial network error by Qt.</extracomment>
6653 <translation>Ein unbekannter Netzwerkfehler ist aufgetreten. Überprüfen Sie Ihre Netwerkverbindung und versuchen Sie die App neu zu starten.</translation>
6910 <translation>Ein unbekannter Netzwerkfehler ist aufgetreten. Überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie, die App neu zu starten.</translation>
66546911 </message>
66556912 <message>
66566913 <source>The selected card reader cannot be accessed anymore.</source>
66896946 </message>
66906947 <message>
66916948 <source>The process has been cancelled.</source>
6692 <extracomment>ERROR ALL_PLATFORMS The user cancelled the authentication in either the UI or the card reader.</extracomment>
6949 <extracomment>ERROR ALL_PLATFORMS The user cancelled the authentication in the UI.</extracomment>
66936950 <translation>Der Vorgang wurde abgebrochen.</translation>
66946951 </message>
66956952 <message>
67226979 <translation>Die eingegebene PIN ist nicht korrekt.</translation>
67236980 </message>
67246981 <message>
6725 <source>The given card access number (CAN) is not correct.</source>
6982 <source>The given Card Access Number (CAN) is not correct.</source>
67266983 <extracomment>ERROR ALL_PLATFORMS The ID card declined the CAN.</extracomment>
67276984 <translation>Die eingegebene Zugangsnummer (CAN) ist nicht korrekt.</translation>
67286985 </message>
68367093 <extracomment>LABEL ALL_PLATFORMS</extracomment>
68377094 <translation>https://www.ausweisapp.bund.de/fragen-und-antworten/support/</translation>
68387095 </message>
7096 <message>
7097 <source>The process has been cancelled by the card reader.</source>
7098 <extracomment>ERROR ALL_PLATFORMS The user cancelled the authentication on his card reader.</extracomment>
7099 <translation>Der Vorgang wurde durch den Kartenleser abgebrochen.</translation>
7100 </message>
68397101 </context>
68407102 <context>
68417103 <name>governikus::GuiUtils</name>
68427104 <message>
6843 <source>Wrong card access number (CAN)</source>
7105 <source>Wrong Card Access Number (CAN)</source>
68447106 <translation>Falsche Zugangsnummer (CAN)</translation>
68457107 </message>
68467108 <message>
6847 <source>The given card access number (CAN) is not correct. You have one more try to enter the correct PIN. Please mind that you have to acknowledge this last try with your card access number (CAN).</source>
7109 <source>The given Card Access Number (CAN) is not correct. You have one more try to enter the correct PIN. Please mind that you have to acknowledge this last try with your Card Access Number (CAN).</source>
68487110 <translation>Die eingegebene Zugangsnummer (CAN) ist nicht korrekt. Sie haben noch einen weiteren Versuch die korrekte PIN einzugeben. Beachten Sie, dass Sie diesen letzten Versuch mit der Zugangsnummer (CAN) bestätigen müssen.</translation>
68497111 </message>
68507112 <message>
68607122 <translation>Bitte geben Sie Ihre PUK erneut ein.</translation>
68617123 </message>
68627124 <message>
6863 <source>The given card access number (CAN) is not correct.</source>
7125 <source>The given Card Access Number (CAN) is not correct.</source>
68647126 <translation>Die eingegebene Zugangsnummer (CAN) ist ungültig.</translation>
68657127 </message>
68667128 <message>
68767138 <translation>Ihre PIN ist nach dreimaliger Fehleingabe gesperrt. Die Nutzung der Online-Ausweisfunktion ist in diesem Zustand nicht mehr möglich.&lt;/p&gt;&lt;p&gt;Sie können die PIN im folgenden Dialog entsperren. Die Anwendung unterstützt Sie in den nun notwendigen Schritten.</translation>
68777139 </message>
68787140 <message>
6879 <source>The given PIN is not correct. You have one more try to enter the correct PIN. Please mind that you have to acknowledge this last try with your card access number (CAN).</source>
7141 <source>The given PIN is not correct. You have one more try to enter the correct PIN. Please mind that you have to acknowledge this last try with your Card Access Number (CAN).</source>
68807142 <translation>Die eingegebene PIN ist nicht korrekt. Sie haben noch einen weiteren Versuch die korrekte PIN einzugeben. Beachten Sie, dass Sie diesen letzten Versuch mit der Zugangsnummer (CAN) bestätigen müssen.</translation>
68817143 </message>
68827144 <message>
70677329 <source>Could not send log! Please configure your mail client first.</source>
70687330 <translation>Konnte das Protokoll nicht senden! Bitte konfigurieren Sie Ihr E-Mail-Programm.</translation>
70697331 </message>
7332 <message>
7333 <source>Successfully saved logfile to &quot;%1&quot;</source>
7334 <translation>Protokolldatei erfolgreich gespeichert unter &quot;%1&quot;</translation>
7335 </message>
7336 <message>
7337 <source>Error while saving logfile to &quot;%1&quot;</source>
7338 <translation>Fehler beim Speichern der Protokolldatei unter &quot;%1&quot;</translation>
7339 </message>
7340 <message>
7341 <source>The logfile is disabled.</source>
7342 <translation>Die Protokolldatei ist deaktiviert.</translation>
7343 </message>
70707344 </context>
70717345 <context>
70727346 <name>governikus::NotificationModel</name>
70787352 <context>
70797353 <name>governikus::NumberModel</name>
70807354 <message>
7081 <source>The given PIN is not correct. You have 2 tries to enter the correct PIN.</source>
7082 <extracomment>INFO ALL_PLATFORMS The wrong PIN was entered on the first attempt.</extracomment>
7083 <translation>Die eingegebene PIN ist nicht korrekt. Sie haben noch 2 weitere Versuche die korrekte PIN einzugeben.</translation>
7084 </message>
7085 <message>
7086 <source>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</source>
7087 <extracomment>INFO ALL_PLATFORMS The wrong PIN was entered twice, the next attempt requires the CAN for additional verification.</extracomment>
7088 <translation>Die PIN Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch müssen Sie vorher die sechsstellige Zugangsnummer (CAN) eingeben. Diese finden Sie auf der Vorderseite Ihres Ausweises.</translation>
7089 </message>
7090 <message>
7091 <source>A wrong PIN has been entered three times on your ID card. Your PIN is now blocked. To unblock your PIN you have to enter the PUK.</source>
7092 <extracomment>INFO ALL_PLATFORMS The PIN was entered wrongfully three times, the ID card needs to be unlocked using the PUK.</extracomment>
7093 <translation>Die PIN Ihres Ausweises wurde dreimal falsch eingegeben. Ihre PIN ist gesperrt. Zum Entsperren geben Sie bitte Ihre PUK ein.</translation>
7094 </message>
7095 <message>
7096 <source>The entered card access number (CAN) is incorrect. Please try again.</source>
7355 <source>The entered Card Access Number (CAN) is incorrect. Please try again.</source>
70977356 <extracomment>INFO ALL_PLATFORMS The CAN was entered wrongfully and needs to be supplied again.</extracomment>
70987357 <translation>Die eingegebene Zugangsnummer (CAN) ist nicht korrekt. Bitte versuchen Sie es erneut.</translation>
70997358 </message>
71027361 <extracomment>INFO ALL_PLATFORMS The PUK entered wrongfully and needs to be supplied again.</extracomment>
71037362 <translation>Die eingegebene PUK ist nicht korrekt. Bitte versuchen Sie es erneut.</translation>
71047363 </message>
7364 <message>
7365 <source>Transport PIN</source>
7366 <translation>Transport PIN</translation>
7367 </message>
7368 <message>
7369 <source>PIN</source>
7370 <translation>PIN</translation>
7371 </message>
7372 <message>
7373 <source>A wrong %1 has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</source>
7374 <extracomment>INFO ALL_PLATFORMS The wrong (Transport) PIN was entered twice, the next attempt requires the CAN for additional verification.</extracomment>
7375 <translation>Die %1 Ihres Ausweises wurde zweimal falsch eingegeben. Für einen dritten Versuch geben Sie bitte zunächst die sechsstellige Zugangsnummer (CAN) ein. Diese finden Sie unten rechts auf der Vorderseite Ihres Ausweises.</translation>
7376 </message>
7377 <message>
7378 <source>The given %1 is not correct. You have two attempts to enter the correct %1.</source>
7379 <extracomment>INFO ALL_PLATFORMS The wrong (Transport) PIN was entered on the first attempt.</extracomment>
7380 <translation>Die eingegebene %1 ist nicht korrekt. Sie haben noch zwei weitere Versuche die korrekte %1 einzugeben.</translation>
7381 </message>
7382 <message>
7383 <source>A wrong %1 has been entered three times on your ID card. Your %1 is now blocked. You have to enter the PUK to remove the block.</source>
7384 <extracomment>INFO ALL_PLATFORMS The (Transport) PIN was entered wrongfully three times, the ID card needs to be unlocked using the PUK.</extracomment>
7385 <translation>Die %1 Ihres Ausweises wurde dreimal falsch eingegeben. Ihre %1 ist gesperrt. Zum Entsperren geben Sie bitte Ihre PUK ein.</translation>
7386 </message>
71057387 </context>
71067388 <context>
71077389 <name>governikus::PdfCreator</name>
74167698 <message>
74177699 <source>No smartphone as card reader (Sac) available. Please make sure to activate the &quot;remote service&quot; on your smartphone and to connect both devices to the same WiFi. See %1 for details of use.</source>
74187700 <extracomment>INFO ALL_PLATFORMS No smartphone with enabled remote service was found on the same network.</extracomment>
7419 <translation>Kein Smartphone als Kartenleser verfügbar. Bitte stellen Sie sicher, dass die die Funktion &quot;Fernzugriff&quot; in der AusweisApp2 auf Ihrem Smartphone aktiviert ist und beide Geräte mit demselben WLAN verbunden sind. Informationen zur Verwendung befinden sich unter %1.</translation>
7701 <translation>Kein Smartphone als Kartenleser verfügbar. Bitte stellen Sie sicher, dass die die Funktion &quot;Fernzugriff&quot; in der AusweisApp2 auf Ihrem Smartphone aktiviert ist und beide Geräte mit demselben WLAN verbunden sind. Informationen zur Verwendung finden Sie in der %1.</translation>
74207702 </message>
74217703 </context>
74227704 <context>
74267708 <translation>Es sind nur Ziffern (0-9) erlaubt.</translation>
74277709 </message>
74287710 <message>
7429 <source>A pairing code has to be 4 digits long.</source>
7430 <translation>Ein Kopplungscode besteht aus 4 Ziffern.</translation>
7711 <source>A pairing code has to be four digits long.</source>
7712 <translation>Ein Kopplungscode besteht aus vier Ziffern.</translation>
74317713 </message>
74327714 </context>
74337715 <context>
74447726 </message>
74457727 <message>
74467728 <source>Please connect your WiFi to use the remote service.</source>
7447 <extracomment>INFO ALL_PLATFORMS The wifi feature is not enabled but required to use the smartphone as a card reader (SaK).</extracomment>
7729 <extracomment>INFO ALL_PLATFORMS The WiFi feature is not enabled but required to use the smartphone as a card reader (SaK).</extracomment>
74487730 <translation>Bitte verbinden Sie sich mit Ihrem WLAN, um den Fernzugriff zu benutzen.</translation>
74497731 </message>
74507732 <message>
76497931 <translation>Fast fertig!</translation>
76507932 </message>
76517933 <message>
7652 <source>Prior to the first use of the online identification function, you have to replace the transport PIN by an individual 6-digit PIN. The transport PIN was sent to you by postal mail.</source>
7934 <source>Prior to the first use of the online identification function, you have to replace the Transport PIN by an individual six-digit PIN. The Transport PIN was sent to you by postal mail.</source>
76537935 <translation>Vor der ersten Nutzung der Online-Ausweisfunktion müssen Sie die Transport-PIN durch eine persönliche sechsstellige PIN ersetzen. Sie finden Ihre Transport-PIN in dem PIN-Brief, welcher Ihnen postalisch zugesandt wurde.</translation>
76547936 </message>
76557937 <message>
76577939 <translation>Sie können die AusweisApp2 nun verwenden. Weitere Informationen zur Software und der Online-Ausweisfunktion erhalten Sie in der %1Online-Hilfe%2.</translation>
76587940 </message>
76597941 <message>
7660 <source>Personal 6-digit PIN</source>
7942 <source>Personal six-digit PIN</source>
76617943 <translation>Persönliche sechsstellige PIN</translation>
76627944 </message>
76637945 </context>
78108092 <translation>bitte geben sie ihre zugangsnummer (can) ein</translation>
78118093 </message>
78128094 <message>
7813 <source>Card access number (CAN):</source>
8095 <source>Card Access Number (CAN):</source>
78148096 <translation>Zugangsnummer (CAN):</translation>
78158097 </message>
78168098 <message>
78228104 <translation>Jetzt ausweisen</translation>
78238105 </message>
78248106 <message>
7825 <source>Please enter the 6-digit card access number (CAN) for identification.</source>
8107 <source>Please enter the six-digit Card Access Number (CAN) for identification.</source>
78268108 <translation>Bitte geben Sie Ihre sechsstellige Zugangsnummer (CAN) ein.</translation>
78278109 </message>
78288110 <message>
7829 <source>Please enter your 6-digit card access number (CAN) and your PIN for identification.</source>
7830 <translation>Bitte geben Sie Ihre sechstellige Zugangsnummer (CAN) und Ihre PIN ein, um sich auszuweisen.</translation>
7831 </message>
7832 <message>
7833 <source>Please enter your 6-digit PIN for identification</source>
8111 <source>Please enter your six-digit Card Access Number (CAN) and your PIN for identification.</source>
8112 <translation>Bitte geben Sie Ihre sechsstellige Zugangsnummer (CAN) und Ihre PIN ein, um sich auszuweisen.</translation>
8113 </message>
8114 <message>
8115 <source>Please enter your six-digit PIN for identification</source>
78348116 <translation>Bitte geben Sie Ihre sechsstellige PIN ein, um sich auszuweisen</translation>
78358117 </message>
78368118 <message>
80948376 <message>
80958377 <source>The connection to the browser was lost. No forwarding was executed. Please try to call the URL again manually: %1</source>
80968378 <extracomment>ERROR ALL_PLATFORMS The connection to the browser was lost/timed out..</extracomment>
8097 <translation>Die Verbindung zum Browser ging verloren. Es konnte keine Weiterleitung durchgeführt werden. Bitte versuchen Sie die URL manuell aufzurufen: %1</translation>
8379 <translation>Die Verbindung zum Browser ging verloren. Es konnte keine Weiterleitung durchgeführt werden. Bitte versuchen Sie, die URL manuell aufzurufen: %1</translation>
80988380 </message>
80998381 <message>
81008382 <source>https://www.ausweisapp.bund.de/en/qa/report-an-error/</source>
82188500 <translation>Um die Anwendung zu schließen, drücken Sie zweimal schnell die Zurück-Taste.</translation>
82198501 </message>
82208502 <message>
8221 <source>Text files</source>
8222 <extracomment>LABEL DESKTOP_QML</extracomment>
8223 <translation>Textdateien</translation>
8224 </message>
8225 <message>
82268503 <source>Another application uses %1</source>
82278504 <extracomment>INFO DESKTOP_QML The AA2 is currently remote controlled via the SDK interface, concurrent usage of the AA2 is not possible.</extracomment>
82288505 <translation>Eine andere Anwendung verwendet %1</translation>
82348511 </message>
82358512 <message>
82368513 <source>The program remains available via the icon in the system tray. Click on the %1 icon to reopen the user interface.</source>
8237 <extracomment>INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed for the first time.</extracomment>
8514 <extracomment>INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed for the first time.
8515 ----------
8516 INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed and a workflow is still active and the close/minimize info was not disabled.</extracomment>
82388517 <translation>Das Programm steht weiterhin im Infobereich zur Verfügung. Klicken Sie auf das Symbol der %1, um die Anwendung wieder zu öffnen.</translation>
82398518 </message>
82408519 <message>
82828561 <source>%1 - Detached log viewer</source>
82838562 <translation>%1 - Protokolldateianzeige</translation>
82848563 </message>
8564 <message>
8565 <source>This will cancel the current operation and hide the UI of %1. You can restart the operation at any time.</source>
8566 <extracomment>INFO DESKTOP_QML Content of the popup that is shown when the AA2 is closed and a workflow is still active.</extracomment>
8567 <translation>Hiermit wird der aktuelle Vorgang abgebrochen und die Benutzeroberfläche der %1 geschlossen. Sie können den Vorgang jederzeit erneut starten.</translation>
8568 </message>
8569 <message>
8570 <source>Abort operation</source>
8571 <extracomment>INFO DESKTOP_QML Header of the popup that is shown when the AA2 is closed and a workflow is still active</extracomment>
8572 <translation>Vorgang abbrechen</translation>
8573 </message>
82858574 </context>
82868575 </TS>
44
55 readonly CLONE_DIR="${CLONE_DIR:-$(pwd)}"
66
7 MINIROOTFS_VERSION="3.11.2"
8 MINIROOTFS_SHA="e9d9ea8c59fc4e836f733d51bea78a30cf41e6a2a774ca2406427a29249684ab"
7 MINIROOTFS_VERSION="3.12.0"
8 MINIROOTFS_SHA="0beb54cf9bf69d085f9fcd291ff28b3335184d08b706d535f425e8180851edc9"
99
1010 MINIROOTFS="alpine-minirootfs-${MINIROOTFS_VERSION}-x86_64.tar.gz"
1111 MINIROOTFS_URI="http://dl-cdn.alpinelinux.org/alpine/v${MINIROOTFS_VERSION%.*}/releases/x86_64/$MINIROOTFS"
00 {
1 "$schema": "../json-schemas/supported-providers.json",
12 "callcosts" : [
23 {
34 "prefixes" : ["1371", "1375"],
99100 "mobileDesign": false,
100101 "shortName": {"" : ":::(bit)kasten"},
101102 "longDescription": {"": "Der :::(bit)kasten ist ein elektronischer Briefkasten, in dem Sie Ihre Post elektronisch von teilnehmenden Unternehmen und Behörden zum Beispiel Rechnungen, Vertragsunterlagen oder Bescheide sicher und rechtsverbindlich empfangen. Ihre Post erhalten Sie wie bisher anhand Ihrer Postanschrift, nur eben digital. Sie müssen keine persönliche Daten an Dritte herausgeben, Ihre Postadresse reicht für den elektronischen Versand an den :::(bit)kasten aus.<br/>Eine Registrierung für den :::(bit)kasten ist nicht zwingend erforderlich. Ob Sie sich ein Konto anlegen möchten, entscheiden Sie selbst. Nach Login mit Ihrer Online-Ausweisfunktion können Sie Ihre Post abrufen und verwalten.<br/>Da Ihre Post nicht mehr als Papierpost verschickt werden muss, sparen Sie Zeit und senken den Papierverbrauch."},
102 "address": "https://www.bitkasten.de/",
103 "homepage": "https://www.bitkasten.de/",
103 "address": "https://www.bitkasten.de",
104 "homepage": "https://www.bitkasten.de",
104105 "phone": "+49 911 6000 2874",
105106 "email": "nachricht@bitkasten.de",
106107 "postalAddress": "Wallensteinstr. 63<br/>90431 Nürnberg",
107108 "category": "other",
108 "tcTokenUrl": "https://www.bitkasten.de/portal/api/login/npa/createRequest?returnUrl=https%3A%2F%2Fwww.bitkasten.de%2Fportal%2Fapi%2Flogin%2Fnpa%2Flogin.html",
109 "subjectUrls": ["https://www.bitkasten.de"]
110 },
111 {
112 "exclude": ["ios"],
109 "subjectUrls": ["https://mein.bitkasten.de"]
110 },
111 {
113112 "shortName": {"" : "Akteneinsicht in Stasi-Unterlagen"},
114113 "longName": {"" : "Akteneinsicht in Stasi-Unterlagen"},
115114 "shortDescription": {"": "Antragstellung auf Einsicht in Stasi-Unterlagen für Privatpersonen."},
116115 "longDescription": {"": "Privatpersonen können online mittels neuem Personalausweis ohne weitere Wege die Einsichtnahme in die von der Stasi angelegten Akten zur eigenen Person oder zu verstorbenen/vermissten nahen Angehörigen beantragen."},
117116 "address": "https://www.bstu.bund.de/DE/Akteneinsicht/Privatpersonen/Online-Antrag/online-antrag_node.html",
118117 "homepage": "https://www.bstu.bund.de",
119 "phone": "+49 30 23 24-7000",
118 "phone": "+49 30 23 24 7000",
120119 "email": "post@bstu.bund.de",
121120 "postalAddress": "Der Bundesbeauftragte für die Unterlagen des Staatssicherheitsdienstes der ehemaligen Deutschen Demokratischen Republik (BStU)<br/>Karl-Liebknecht-Straße 31/33<br/>10178 Berlin",
122121 "image": "stasi_image.jpg",
123122 "icon": "stasi_icon.png",
124123 "category": "citizen",
125 "subjectUrls": ["https://www.bstu-formulare.de/lip"]
124 "subjectUrls": ["https://www.bstu-formulare.de"]
125 },
126 {
127 "shortName": {"" : "Service-Portal Hochsauerlandkreis"},
128 "longName": {"": "Antragstellung an die Kreisverwaltung im Hochsauerlandkreis"},
129 "shortDescription": {"": "Übersicht über die verschiedenen Online-Anträge"},
130 "longDescription": {"": "Stellen Sie hier Ihre Anträge an die Kreisverwaltung. Das Angebot wird laufend erweitert."},
131 "address": "https://portal.citkomm.de/hsk/services",
132 "homepage": "https://portal.citkomm.de/hsk/services",
133 "phone": "+49 291 94 0",
134 "email": "post@hochsauerlandkreis.de",
135 "postalAddress": "Steinstraße 27<br/>59872 Meschede",
136 "image": "HSK_image.jpg",
137 "icon": "HSK_icon.png",
138 "category": "citizen",
139 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
126140 },
127141 {
128142 "shortName": {"": "eID-Mahnantrag"},
131145 "longDescription": {"": "Dienst zur Stellung von Anträgen und Abgabe von Erklärungen im Mahnverfahren nach der Zivilprozessordnung vor den bundesdeutschen Mahngerichten."},
132146 "address": "https://www.online-mahnantrag.de",
133147 "homepage": "https://www.online-mahnantrag.de",
134 "phone": "",
135148 "email": "poststelle@jum.bwl.de",
136 "postalAdress": "Ministerium der Justiz und für Europa<br/>Koordinierungsstelle für das Automatisierte Mahnverfahren<br/>Schillerplatz 4<br/>70173 Stuttgart",
149 "postalAddress": "Ministerium der Justiz und für Europa<br/>Koordinierungsstelle für das Automatisierte Mahnverfahren<br/>Schillerplatz 4<br/>70173 Stuttgart",
137150 "image": "MahnantragJustizministeriumBaWue_image.jpg",
138151 "icon": "MahnantragJustizministeriumBaWue_icon.png",
139152 "category": "citizen",
140 "tcTokenUrlInfo" : "",
141 "subjectUrls": []
153 "subjectUrls": ["https://www.online-mahnantrag.de"]
154 },
155 {
156 "shortName": {"" : "Online-Registerauskunft"},
157 "longName": {"" : "Auskunft aus den Zentralen Registern des Kraftfahrt-Bundesamtes"},
158 "shortDescription": {"": "Mit der Anwendung können Privatpersonen eine Auskunft aus dem Fahreignungsregister (Punkteauskunft), aus dem Zentralen Fahrzeugregister (Fahrzeugzulassungen) sowie aus dem Zentralen Fahrerlaubnisregister (Führerschein) des Kraftfahrt-Bundesamtes erhalten. Diese umfasst ausgewählte Daten, die zu der jeweiligen Person gespeichert sind."},
159 "longDescription": {"": "Die Online-Auskunft aus dem Zentralen Fahrzeugregister umfasst Informationen zur Fahrzeugbeschreibung, den Halterdaten, der Haftpflichtversicherung, der letzten Haupt- bzw. Sicherheitsüberprüfung, der Fahrzeughistorie und den zulassungsrechtlich relevanten Ereignissen. Daten von vormaligen Haltern und interne Verwaltungsdaten sind von der Auskunft ausgenommen.<br/>Die Online-Auskunft aus dem Fahreignungsregister umfasst Informationen zu den eingetragenen Verkehrsverstößen, deren Punktbewertung und Löschungsdatum.<br/>Die Online-Auskunft aus dem Zentralen Fahrerlaubnisregister umfasst Informationen zu Fahrerlaubnissen, die seit dem 01.01.1999 erteilt, erweitert oder umgeschrieben wurden. Über die anderen vor dem 01.01.1999 ausgestellten Führerscheine führt nur die jeweils ausstellende Fahrerlaubnisbehörde eine Kartei/Datei."},
160 "address": "https://www.kba-online.de/registerauskunft/app/registeranfrage.html",
161 "homepage": "https://www.kba.de",
162 "phone": "+49 461 316 1717",
163 "email": "Anwenderbetreuung@kba.de",
164 "postalAddress": "Kraftfahrt-Bundesamt<br/>24932 Flensburg",
165 "icon": "KraftfahrtBundesamt_icon.png",
166 "category": "citizen",
167 "subjectUrls": ["https://www.kba-online.de"]
142168 },
143169 {
144170 "shortName": {"" : "AusweisIDent"},
145171 "longName": {"" : "AusweisIDent Identifizierungsdienst"},
146172 "shortDescription": {"": "AusweisIDent ist eine neue Lösung für Unternehmen zur schnellen und günstigen Online-Identifikation neuer Kunden mit der Online-Ausweisfunktion des Personalausweises oder des elektronischen Aufenthaltstitels."},
147173 "longDescription": {"": "AusweisIDent ergänzt am Markt etablierte Verfahren um die medienbruchfreie und sichere Online-Identifizierung. Nutzer weisen sich mit der Applikation und der Online-Ausweisfunktion des Personalausweises oder des elektronischen Aufenthaltstitels online aus. Das Identifizierungsverfahren wurde von der Bundesdruckerei gemeinsam mit Governikus entwickelt. AusweisIDent eignet sich für die Identifizierung von Personen für eine Web-Anwendung. Über eine Zwei-Faktor-Authentisierung durch den Kunden werden höchste Sicherheitsanforderungen bei der Kundenregistrierung erfüllt. Die Identitätsprüfungen erfolgen gesetzeskonform nach demGesetz zur Förderung der elektronischen Verwaltung (eGovG), dem Gesetz über das Aufspüren von Gewinnen aus schweren Straftaten (GWG), dem Telekommunikationsgesetz (TKG) sowie nach Bundesdatenschutzgesetz (BDSG) und der EUDatenschutzgrundverordnung (EU-DSGVO)."},
148 "address": "https://www.ausweisident.de/",
149 "homepage": "https://www.ausweisident.de/",
174 "address": "https://www.ausweisident.de",
175 "homepage": "https://www.ausweisident.de",
176 "email": "sales@bdr.de",
177 "phone": "+49 30 25 98 18 30",
178 "postalAddress": "Bundesdruckerei GmbH <br/>Kommandantenstraße 18 <br/>10969 Berlin",
150179 "image": "ausweisident_image.jpg",
151180 "icon": "ausweisident_icon.png",
152181 "category": "other",
153 "subjectUrls": ["https://www.ausweisident.de"]
182 "subjectUrls": ["https://ausweisident.eid-service.de"]
183 },
184 {
185 "shortName": {"" : "BAföG Online"},
186 "address": "https://www.bafoegonline.bva.bund.de/bafoeg-bo/Bafoeg/flow/anmeldenMitIdPreFlow?anmeldenAuswahl=PA_MIT_ONLINE_AUSWEISFUNKTION",
187 "homepage": "https://www.bafoegonline.bva.bund.de",
188 "longDescription": {"": "Mit Ihrer Online-Ausweisfunktion können Sie sich beim Bundesverwaltungsamt für das BAföG-Rückzahlungsverfahren anmelden und sowohl Ihre persönlichen Daten als auch die erforderlichen Nachweise sicher und schnell elektronisch übermitteln. Sie müssen die Nachweise nicht mehr per Post senden.<br/>Die Online-Ausweisfunktion vereinfacht und beschleunigt das BAföG-Rückzahlungsverfahren."},
189 "phone": "+49 22899358 4500",
190 "postalAddress": "Bundesverwaltungsamt<br/>BT-BAföG<br/>50728 Köln",
191 "category": "citizen",
192 "subjectUrls": ["https://e-id.bva.bund.de"]
193 },
194 {
195 "exclude": ["ios"],
196 "shortName": {"" : "BAföG Online Bayern (AKDB)"},
197 "longDescription": {"": "In Bayern können Sie Ihr BAföG für ein Studium bzw. eine Ausbildung in Bayern, Österreich, Liechtenstein oder der Schweiz nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch mit der Online-Ausweisfunktion bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
198 "address": "https://afoegfofa.osrz-akdb.de",
199 "homepage": "https://afoegfofa.osrz-akdb.de",
200 "phone": "+49 89 5903 0",
201 "postalAddress": "Anstalt für Kommunale Datenverarbeitung in Bayern (AKDB)<br/>Hansastraße 12-16<br/>80686 München",
202 "category": "citizen",
203 "subjectUrlInfo": "Using service from Bürgerservice-Portale der bayerischen Kommunen (https://www.buergerserviceportal.de)."
204 },
205 {
206 "exclude": ["ios"],
207 "shortName": {"" : "BAföG Online Bayern (Studentenwerk)"},
208 "address": "https://www.bafoeg-bayern.de",
209 "homepage": "https://www.bafoeg-bayern.de",
210 "phone": "+49 800 223 63 41",
211 "email": "webmaster@bafoeg-bayern.de",
212 "postalAddress": "Studentenwerk Niederbayern/Oberpfalz, Anstalt des öffentlichen Rechts<br/>Administration BAföG-Bayern<br/>Albertus-Magnus-Straße 4<br/>93053 Regensburg",
213 "category": "citizen",
214 "subjectUrlInfo": "Using service from Bürgerservice-Portale der bayerischen Kommunen (https://www.buergerserviceportal.de)."
154215 },
155216 {
156217 "exclude": ["ios"],
160221 "longDescription": {"": "Sie wollen einen Antrag auf Ausbildungsförderung nach dem BAföG stellen? Mit dem neuen Personalausweis / elektronischen Aufenthaltstitel können Sie Ihren Antrag elektronisch signieren und an das Amt übermitteln. Ebenso können Ihre Eltern und ggf. Ihr Ehepartner die nötigen Formulare signieren."},
161222 "address": "https://www.berlin-bafoeg.de",
162223 "homepage": "https://www.berlin-bafoeg.de",
163 "phone": "+49 30 939 39 - 70",
224 "phone": "+49 30 939 39 70",
164225 "email": "info@stw.berlin",
165226 "postalAddress": "studierendenWERK BERLIN<br/>BAföG-Amt<br/>Behrenstraße 40/41<br/>10117 Berlin",
166227 "image": "BafoegBerlin_image.jpg",
167228 "icon": "BafoegBerlin_icon.png",
168229 "category": "citizen",
169 "subjectUrls": []
230 "subjectUrlInfo": "Using service from Service-Portal Berlin (https://eid-prod.connect.verwalt-berlin.de)."
231 },
232 {
233 "exclude": ["ios"],
234 "shortName": {"" : "BAföG Online Brandenburg"},
235 "longDescription": {"": "In Brandenburg können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
236 "address": "https://www.bafoeg-brandenburg.de",
237 "homepage": "https://www.bafoeg-brandenburg.de",
238 "phone": "+49 331 866 45 60",
239 "email": "mwfk@mwfk.brandenburg.de",
240 "postalAddress": "Ministerium für Wissenschaft, Forschung und Kultur<br/>Presse- und Öffentlichkeitsarbeit ",
241 "category": "citizen",
242 "subjectUrls": ["https://www.bafoeg-brandenburg.de"]
243 },
244 {
245 "exclude": ["ios"],
246 "shortName": {"" : "BAföG Online Hamburg"},
247 "longDescription": {"": "In Hamburg können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die neue Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
248 "address": "https://bafoeg-online.hamburg.de",
249 "homepage": "https://bafoeg-online.hamburg.de",
250 "phone": "+49 800 223 63 41",
251 "email": "Marita.Porr@bwfg.hamburg.de",
252 "postalAddress": "Ressortleiter Online-Redaktion der Behörde für Wissenschaft, Forschung und Gleichstellung:<br/>Kommunikation<br/>Daniel Drexelius<br/>Hamburger Straße 37<br/>22083 Hamburg",
253 "category": "citizen",
254 "subjectUrlInfo": "Using service from Hamburg Service Online-Bürgerdienste (https://idp.servicekonto.serviceportal.hamburg.de)."
255 },
256 {
257 "exclude": ["ios"],
258 "shortName": {"" : "BAföG Online Mecklenburg-Vorpommern"},
259 "address": "https://www.regierung-mv.de/Landesregierung/bm/Wissenschaft/Studium/Studienfinanzierung%20(BafoeG)",
260 "homepage": "https://www.regierung-mv.de",
261 "postalAddress": "Ministerium für Bildung, Wissenschaft und Kultur Mecklenburg-Vorpommern<br/>Werderstraße 124<br/>19055 Schwerin",
262 "category": "citizen",
263 "subjectUrls": ["https://fms.mv-regierung.de"]
264 },
265 {
266 "exclude": ["ios"],
267 "shortName": {"" : "BAföG Online Nordrhein-Westfalen"},
268 "longDescription": {"": "In Nordrhein-Westfalen können Sie mit der Online-Ausweisfunktion Ihren Antrag auf BAföG für eine Ausbildung (Schulausbildung, Studium in Nordrhein-Westfalen sowie Studium in Belgien, den Niederlanden oder Luxemburg) oder Ihren Antrag auf Aufstiegsfortbildungsförderung (z. B. für die Meisterausbildung) in Nordrhein-Westfalen bequem und schnell im Internet stellen.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
269 "address": "https://www.bafoeg-online.nrw.de/bafoeg/StartNutzung.html",
270 "homepage": "https://www.bafoeg-online.nrw.de/bafoeg/StartNutzung.html",
271 "phone": "+49 211 896 04",
272 "email": "poststelle@miwf.nrw.de",
273 "postalAddress": "Ministerium für Innovation, Wissenschaft und Forschung des Landes Nordrhein-Westfalen<br/>Besucher- und Lieferanschrift<br/>Völklinger Straße 49<br/>40221 Düsseldorf",
274 "category": "citizen",
275 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
276 },
277 {
278 "exclude": ["ios"],
279 "shortName": {"" : "BAföG Online Sachsen"},
280 "address": "https://fs.egov.sachsen.de/formserv/findform?shortname=bafoeg&formtecid=11&areashortname=SMWK_bafoeg",
281 "homepage": "https://www.studieren.sachsen.de",
282 "phone": "+49 351 564 1080",
283 "email": "info@sk.sachsen.de",
284 "postalAddress": "Sächsische Staatskanzlei<br/>Redaktion Amt24 / Bürgerbüro<br/>01095 Dresden",
285 "category": "citizen",
286 "subjectUrls": ["https://eidconnect.egov.sachsen.de"]
287 },
288 {
289 "exclude": ["ios"],
290 "shortName": {"" : "BAföG Online Schleswig-Holstein"},
291 "longDescription": {"": "In Schleswig-Holstein können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
292 "address": "https://bafoeg.schleswig-holstein.de/BAfoeGOnline/ABAfoeG",
293 "homepage": "https://bafoeg.schleswig-holstein.de",
294 "phone": "+49 431 988 0",
295 "email": "bafoeg@sozmi.landsh.de",
296 "postalAddress": "Ministerium für Soziales, Gesundheit, Wissenschaft und Gleichstellung des Landes Schleswig-Holstein<br/>Abteilung VIII 5<br/>Düsternbrooker Weg 104<br/>24105 Kiel",
297 "category": "citizen",
298 "subjectUrls": ["https://idp.serviceportal.schleswig-holstein.de"]
170299 },
171300 {
172301 "exclude": ["ios"],
175304 "shortDescription": {"": "BAföG und AFBG Online-Antragstellung Hessen"},
176305 "longDescription": {"": "Mit Hilfe dieses Angebotes können Antragstellende, Ehegatten / eingetragene Lebenspartner und Eltern die erforderlichen Antragsformblätter online ausfüllen, mit Hilfe der eID rechtswirksam unterschreiben und papierlos dem zuständigen Amt übermitteln."},
177306 "address": "https://www.bafoeg-hessen.de",
178 "homepage": "https://wissenschaft.hessen.de/",
179 "phone": "+49 611 32 - 3551",
307 "homepage": "https://wissenschaft.hessen.de",
308 "phone": "+49 611 32 3551",
180309 "email": "hebav@hmwk.hessen.de",
181310 "postalAddress": "Hessisches Ministerium für Wissenschaft und Kunst<br/>Rheinstraße 23-25<br/>65185 Wiesbaden ",
182311 "image": "BafoegHessen_image.jpg",
183312 "icon": "BafoegHessen_icon.png",
184313 "category": "citizen",
185 "subjectUrls": ["https://www.bafoeg-hessen.de"]
186 },
187 {
188 "shortName": {"" : "BAföG Online"},
189 "address": "https://www.bafoegonline.bva.bund.de/",
190 "homepage": "https://www.bva.bund.de/DE/Themen/Bildung/BAfoeG/bafoeg_node.html",
191 "longDescription": {"": "Mit Ihrer Online-Ausweisfunktion können Sie sich beim Bundesverwaltungsamt für das BAföG-Rückzahlungsverfahren anmelden und sowohl Ihre persönlichen Daten als auch die erforderlichen Nachweise sicher und schnell elektronisch übermitteln. Sie müssen die Nachweise nicht mehr per Post senden.<br/>Die Online-Ausweisfunktion vereinfacht und beschleunigt das BAföG-Rückzahlungsverfahren."},
192 "phone": "+49 22899358 - 4500",
193 "email": "",
194 "postalAddress": "Bundesverwaltungsamt<br/>BT-BAföG<br/>50728 Köln",
195 "category": "citizen",
196 "tcTokenUrl" : "",
197 "clientUrl" : "https://www.bafoegonline.bva.bund.de/bafoeg-online/Bafoeg/flow/anmeldenMitNpaPreFlow",
198 "subjectUrls": ["https://e-id.bva.bund.de"]
199 },
200 {
201 "exclude": ["ios"],
202 "shortName": {"" : "BAföG Online Bayern (AKDB)"},
203 "longDescription": {"": "In Bayern können Sie Ihr BAföG für ein Studium bzw. eine Ausbildung in Bayern, Österreich, Liechtenstein oder der Schweiz nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch mit der Online-Ausweisfunktion bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
204 "address": "https://afoegfofa.osrz-akdb.de",
205 "homepage": "https://afoegfofa.osrz-akdb.de",
206 "phone": "+49 89 / 5903 - 0",
207 "email": "",
208 "postalAddress": "Anstalt für Kommunale Datenverarbeitung in Bayern (AKDB)<br/>Hansastraße 12-16<br/>80686 München",
209 "category": "citizen",
210 "subjectUrls": ["https://www.buergerserviceportal.de"]
211 },
212 {
213 "exclude": ["ios"],
214 "shortName": {"" : "BAföG Online Bayern (Studentenwerk)"},
215 "address": "https://www.bafoeg-bayern.de",
216 "homepage": "https://www.bafoeg-bayern.de",
217 "phone": "+49 800-223 63 41",
218 "email": "webmaster@bafoeg-bayern.de",
219 "postalAddress": "Studentenwerk Niederbayern/Oberpfalz, Anstalt des öffentlichen Rechts<br/>Administration BAföG-Bayern<br/>Albertus-Magnus-Straße 4<br/>93053 Regensburg",
220 "category": "citizen",
221 "subjectUrls": []
222 },
223 {
224 "exclude": ["ios"],
225 "shortName": {"" : "BAföG Online Brandenburg"},
226 "longDescription": {"": "In Brandenburg können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
227 "address": "https://www.bafoeg-brandenburg.de",
228 "homepage": "https://www.bafoeg-brandenburg.de",
229 "phone": "+49 331 / 866 45 60",
230 "email": "mwfk@mwfk.brandenburg.de",
231 "postalAddress": "Ministerium für Wissenschaft, Forschung und Kultur<br/>Presse- und Öffentlichkeitsarbeit ",
232 "category": "citizen",
233 "subjectUrls": ["https://www.bafoeg-brandenburg.de"]
234 },
235 {
236 "exclude": ["ios"],
237 "shortName": {"" : "BAföG Online Hamburg"},
238 "longDescription": {"": "In Hamburg können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die neue Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
239 "address": "https://bafoeg-online.hamburg.de",
240 "homepage": "https://bafoeg-online.hamburg.de",
241 "phone": "+49 800-223 63 41",
242 "email": "Marita.Porr@bwfg.hamburg.de",
243 "postalAddress": "Ressortleiter Online-Redaktion der Behörde für Wissenschaft, Forschung und Gleichstellung:<br/>Kommunikation<br/>Daniel Drexelius<br/>Hamburger Straße 37<br/>22083 Hamburg",
244 "category": "citizen",
245 "subjectUrls": ["https://bafoeg-online.hamburg.de"]
246 },
247 {
248 "exclude": ["ios"],
249 "shortName": {"" : "BAföG Online Mecklenburg-Vorpommern"},
250 "address": "https://www.regierung-mv.de/Landesregierung/bm/Wissenschaft/Studium/Studienfinanzierung%20(BafoeG)",
251 "homepage": "https://www.regierung-mv.de/",
252 "phone": "",
253 "email": "",
254 "postalAddress": "Ministerium für Bildung, Wissenschaft und Kultur Mecklenburg-Vorpommern<br/>Werderstraße 124<br/>19055 Schwerin",
255 "category": "citizen",
256 "subjectUrls": ["https://fms.mv-regierung.de"]
257 },
258 {
259 "exclude": ["ios"],
260 "shortName": {"" : "BAföG Online Nordrhein-Westfalen"},
261 "longDescription": {"": "In Nordrhein-Westfalen können Sie mit der Online-Ausweisfunktion Ihren Antrag auf BAföG für eine Ausbildung (Schulausbildung, Studium in Nordrhein-Westfalen sowie Studium in Belgien, den Niederlanden oder Luxemburg) oder Ihren Antrag auf Aufstiegsfortbildungsförderung (z. B. für die Meisterausbildung) in Nordrhein-Westfalen bequem und schnell im Internet stellen.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
262 "address": "https://www.bafoeg-online.nrw.de/bafoeg/StartNutzung.html",
263 "homepage": "https://www.bafoeg-online.nrw.de/bafoeg/StartNutzung.html",
264 "phone": "+49 211 896-04",
265 "email": " poststelle@miwf.nrw.de",
266 "postalAddress": "Ministerium für Innovation, Wissenschaft und Forschung des Landes Nordrhein-Westfalen<br/>Besucher- und Lieferanschrift<br/>Völklinger Straße 49<br/>40221 Düsseldorf",
267 "category": "citizen",
268 "subjectUrls": ["https://www.bafoeg-online.nrw.de/bafoeg"]
269 },
270 {
271 "exclude": ["ios"],
272 "shortName": {"" : "BAföG Online Sachsen"},
273 "address": "https://fs.egov.sachsen.de/formserv/findform?shortname=bafoeg&formtecid=11&areashortname=SMWK_bafoeg",
274 "homepage": "https://www.studieren.sachsen.de/",
275 "phone": "+49 351 564-1080",
276 "email": "info@sk.sachsen.de",
277 "postalAddress": "Sächsische Staatskanzlei<br/>Redaktion Amt24 / Bürgerbüro<br/>01095 Dresden",
278 "category": "citizen",
279 "subjectUrls": ["https://fs.egov.sachsen.de"]
280 },
281 {
282 "exclude": ["ios"],
283 "shortName": {"" : "BAföG Online Schleswig-Holstein"},
284 "longDescription": {"": "In Schleswig-Holstein können Sie Ihr BAföG nicht nur auf dem Postweg oder durch persönliche Abgabe beim Amt beantragen, sondern auch bequem und schnell im Internet.<br/>Ihr Antrag muss dann nicht mehr ausgedruckt, unterschrieben und versandt werden, sondern gilt mit der Übermittlung Ihrer Daten als wirksam gestellt. Beizufügende und nachzureichende Unterlagen sowie Bescheinigungen können Sie über die Upload-Funktion ebenfalls elektronisch übermitteln.<br/>Nach Übermittlung der Daten wird Ihnen der Antrag als PDF-Dokument zum Download angeboten. Der Bescheid wird Ihnen per Post zugestellt."},
285 "address": "https://bafoeg.schleswig-holstein.de/BAfoeGOnline/ABAfoeG/",
286 "homepage": "https://bafoeg.schleswig-holstein.de/",
287 "phone": "+49 431 988-0",
288 "email": "bafoeg@sozmi.landsh.de",
289 "postalAddress": "Ministerium für Soziales, Gesundheit, Wissenschaft und Gleichstellung des Landes Schleswig-Holstein<br/>Abteilung VIII 5<br/>Düsternbrooker Weg 104<br/>24105 Kiel",
290 "category": "citizen"
314 "subjectUrls": ["https://mein-service.hessen.de"]
291315 },
292316 {
293317 "shortName": {"" : "Beantragung Schwerbehindertenausweis Bayern"},
294318 "longDescription": {"": "Einen Schwerbehindertenantrag können Sie bei der Landesbehörde Zentrum Bayern Familie und Soziales (ZBFS) mit der Online-Ausweisfunktion komplett papierlos stellen.<br/>Der papierlose Antrag ist ein bedeutender Schritt auf dem Weg zur digitalen Verwaltung – online, schnell und unkompliziert.<br/>Das Online-Verfahren hat weitere Vorteile. Gerade für sehbehinderte Menschen ist die papiergebundene Schriftform ein Hindernis. Digitale Angebote bieten ihnen die Chance, Behördenangelegenheiten ein Stück weit selbständiger erledigen zu können.<br/>Zu 100 Prozent digital – ein bisschen weniger lästiger Papierkram. Digitalisierung ist somit ein Beitrag zur Inklusion."},
295319 "address": "https://www.schwerbehindertenantrag.bayern.de",
296 "homepage": "https://www.zbfs.bayern.de/",
297 "phone": "+49 921 605-03",
320 "homepage": "https://www.zbfs.bayern.de",
321 "phone": "+49 921 605 03",
298322 "email": "poststelle@zbfs.bayern.de",
299323 "postalAddress": "Zentrum Bayern Familie und Soziales<br/>95440 Bayreuth",
300324 "category": "citizen",
301 "subjectUrls": ["https://www.buergerserviceportal.de"]
325 "subjectUrlInfo": "Using service from Bürgerservice-Portale der bayerischen Kommunen (https://www.buergerserviceportal.de)."
302326 },
303327 {
304328 "shortName": {"" : "Beantragung Schwerbehindertenausweis Saarland"},
305329 "longDescription": {"": "Als erstes Bundesland bietet Ihnen das Saarland mit Schweb.NET Online die Möglichkeit, Ihren Erst- und Verschlimmerungsantrag auf Feststellung einer Behinderung nach dem Schwerbehindertenrecht online beim Landesamt für Soziales zu stellen.<br/>Weite Wege werden dadurch vermieden. Bearbeitungszeiten und Arbeitsabläufe werden verkürzt.<br/>Der Antrag ist selbsterklärend und nutzerfreundlich. "},
306330 "address": "https://gatewaylas.saarland.de/FV/Onlineantrag",
307331 "homepage": "https://www.saarland.de/index.htm",
308 "phone": "+49 681/9978-2181",
309 "email": "",
332 "phone": "+49 681 9978 2181",
310333 "postalAddress": "Ministerium für Soziales, Gesundheit, Frauen und Familie<br/>Franz-Josef-Röder-Straße 23<br/>66119 Saarbrücken",
311334 "category": "citizen",
312 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
313335 "subjectUrls": ["https://tbklas.saarland.de"]
336 },
337 {
338 "shortName": {"" : "Braunschweig iKfz"},
339 "address": "https://stadt-braunschweig.govconnect.de",
340 "homepage": "https://braunschweig.de",
341 "phone": "+49 531 4701",
342 "email": "stadt@braunschweig.de",
343 "postalAddress": "Stadt Braunschweig<br/>Platz der Deutschen Einheit 1<br/>38100 Braunschweig",
344 "category": "citizen",
345 "subjectUrls": ["https://e-id.niedersachsen.de"]
314346 },
315347 {
316348 "exclude": ["ios"],
317349 "shortName": {"" : "Bundesagentur für Arbeit"},
318350 "longDescription": {"": "Mit der Online-Ausweisfunktion des Personalausweises können Sie sich bei der Bundesagentur für Arbeit einfach und zuverlässig über Ihr Kindergeld informieren. Die Anwendung bietet u.a. die Möglichkeit:<br/>- sich über den Antragstatus und die Berechnungsgrundlage für den eigenen Kindergeldbezug zu informieren<br/>- Ihre persönlichen Daten online zu ändern, z. B. Ihre Adresse<br/>- für Kunden der Familienkasse Änderungen vollständig papierlos zu übermitteln."},
319351 "address": "https://www.arbeitsagentur.de/npa",
320 "homepage": "https://www.arbeitsagentur.de/",
321 "phone": "+49 911/179-0",
322 "email": "Zentrale@arbeitsagentur.de ",
352 "homepage": "https://www.arbeitsagentur.de",
353 "phone": "+49 911 179 0",
354 "email": "Zentrale@arbeitsagentur.de",
323355 "postalAddress": "Bundesagentur für Arbeit<br/>Regensburger Straße 104<br/>90478 Nürnberg",
324356 "category": "other",
325 "tcTokenUrl" : "",
326 "clientUrl" : "https://formular.arbeitsagentur.de/eantrag/fallinfo-npa.page",
327357 "subjectUrls": ["https://formular.arbeitsagentur.de"]
328358 },
329359 {
331361 "shortName": {"" : "Bundestag ePetition"},
332362 "longDescription": {"": "Mit der Online-Ausweisfunktion des Personalausweises können Sie sich einfach und sicher am Petitionsportal des Deutschen Bundestages<br/>- registrieren,<br/>- eine Petition einreichen sowie<br/>- eine Petition mitzeichnen."},
333363 "address": "https://epetitionen.bundestag.de/epet/anmelden.html",
334 "homepage": "https://www.bundestag.de/",
335 "phone": "+49 30 227-35257",
364 "homepage": "https://www.bundestag.de",
365 "phone": "+49 30 227 35257",
336366 "email": "post.pet@bundestag.de",
337367 "postalAddress": "Sekretariat des Petitionsausschusses<br/>Platz der Republik 1<br/>11011 Berlin",
338368 "category": "citizen",
339 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
340369 "subjectUrls": ["https://epetitionen.bundestag.de"]
341370 },
342371 {
344373 "shortName": {"" : "Bürgerantrag Bremen"},
345374 "longDescription": {"": "Mit der Online-Ausweisfunktion können Sie im Bundesland Bremen Bürgeranträge elektronisch mitzeichnen oder Unterschriften für Ihren eigenen Bürgerantrag sammeln. Mit nur 5.000 Mitzeichnerinnen und Mitzeichnern – egal ob online oder auf Papier – können Sie Anträge direkt in den Bremische Bürgerschaft (Landtag) einbringen. Für die Stadtbürgerschaft Bremen genügen sogar 4.000 Unterschriften."},
346375 "address": "https://www.buergerantrag.bremen.de",
347 "homepage": "https://www.bremische-buergerschaft.de/",
348 "phone": "",
376 "homepage": "https://www.bremische-buergerschaft.de",
349377 "email": "webmaster@buergerschaft.bremen.de",
350 "postalAddress": "",
351 "category": "citizen",
352 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
378 "category": "citizen",
353379 "subjectUrls": ["https://servicekonto.bremen.de"]
354380 },
355381 {
356382 "shortName": {"" : "Bürgerdienste der Stadt Münster"},
357383 "longDescription": {"": "Die Stadt Münster bietet auf ihrer Webseite eine Reihe von Online-Diensten an. Dort können Sie mit der Online-Ausweisfunktion unter anderem:<br/>- eine Personenstandsurkunde bestellen,<br/>- Ihr Wunschkennzeichen beantragen,<br/>- geografische Karten bestellen,<br/>- Elektroschrott zur Abholung anmelden,<br/>- eine Erklärung zum Elterneinkommen für die Festsetzung des Elternbeitrags für die Kindertagesbetreuung abgeben,<br/>- eine Sondernutzungserlaubnis für private Baumaßnahmen an öffentlichen Straßen beantragen,<br/>- eine Großanlage mit zentraler Trinkwassererwärmung anzeigen,<br/>- einen Fahrradfund melden,<br/>- ein Reitkennzeichen beantragen,<br/>- Mietspiegel-Broschüren bestellen."},
358384 "address": "https://www.stadt-muenster.de/rathaus/online-dienste.html",
359 "homepage": "https://www.muenster.de/",
360 "phone": "+49 251/4 92-0",
385 "homepage": "https://www.muenster.de",
386 "phone": "+49 251 4 92 0",
361387 "email": "stadtverwaltung@stadt-muenster.de",
362388 "postalAddress": "Stadt Münster<br/>48127 Münster",
363389 "category": "citizen",
364 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
365 "subjectUrls": []
390 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
366391 },
367392 {
368393 "shortName": {"" : "Bürgerportal Baden-Württemberg"},
369394 "longDescription": {"": "Das Bürgerportal ,mein service-bw' bietet Bürgerinnen und Bürgern mit dem Personalausweis praktische Anwendungen für die Online-Ausweisfunktion. Das Portal bietet seinen Nutzern unter anderem:<br/>- sicheres Registrieren und Anmelden, um Behördengänge im Internet zu erledigen<br/>- verschlüsselte Ablage persönlicher Daten und Dateien in einem Datenspeicher im Internet, dem sogenannten Dokumentensafe<br/>- orts- und zeitunabhängiger Zugang zu den Daten im Dokumentensafe sowie die Möglichkeit, diese elektronisch an Behörden weiterzuleiten (z. B. für eine Gewerbeanmeldung)."},
370395 "address": "https://service-bw.de/zfinder-bw-web/welcome.do?showMsbwDetails=1",
371 "homepage": "https://www.service-bw.de/",
372 "phone": "",
396 "homepage": "https://www.service-bw.de",
373397 "email": "service-bw@im.bwl.de",
374398 "postalAddress": "Ministerium für Inneres, Digitalisierung und Migration Baden-Württemberg<br/>Willy-Brandt-Straße 41<br/>70173 Stuttgart",
375399 "category": "citizen",
376 "tcTokenUrlInfo" : "Unable to locate URL",
377400 "subjectUrls": ["https://eid.service-bw.de"]
378401 },
379402 {
380403 "shortName": {"" : "Bürgerportal Rheinland Pfalz"},
381404 "longDescription": {"": "Über 80% der Meldebehörden und über 90% der Standesämter in Rheinland-Pfalz bieten Ihnen über das Portal www.rlpdirekt.de Verwaltungsleistungen mit der Online-Ausweisfunktion an, für die Sie nicht mehr zur Behörde gehen müssen, z. B.:<br/>- Kfz abmelden<br/>- Führungszeugnis beantragen,<br/>- Meldebescheinigung beantragen,<br/>- Aufenthaltsbescheinigung beantragen,<br/>- Übermittlungssperre einrichten,<br/>- Auskunft aus dem Gewerbezentralregister beantragen,<br/>- Beurkundung im Personenstandswesen beantragen.<br/>Welche Dienste in Ihrer Kommune mit der Online-Ausweisfunktion genutzt werden können, erfahren Sie, wenn Sie auf dem Portal unter \"Stadt/Ort\" Ihren Wohnort eingeben."},
382 "address": "https://www.rlpdirekt.de/",
383 "homepage": "https://www.rlpdirekt.de/",
384 "phone": "+49 6131 / 6277-0",
405 "address": "https://www.rlpdirekt.de",
406 "homepage": "https://www.rlpdirekt.de",
407 "phone": "+49 6131 6277 0",
385408 "email": "support@kommwis.de",
386409 "postalAddress": "KommWis GmbH<br/>Gesellschaft für Kommunikation und Wissenstransfer mbH<br/>Hindenburgplatz 3<br/>55118 Mainz",
387410 "category": "citizen",
388 "tcTokenUrlInfo" : "PLZ required",
389 "subjectUrls": []
411 "subjectUrls": ["https://tbk.ewois.de"]
412 },
413 {
414 "shortName": {"" : "Bürgerservice Magdeburg"},
415 "longDescription": {"": "Die internetbasierte Außerbetriebsetzung und Wiederzulassung eines Kraftfahrzeuges können über das Portal der Landeshauptstadt Magdeburg beantragt werden."},
416 "address": "https://www.magdeburg.de/loadDocument.phtml?ObjSvrID=37&ObjID=27929",
417 "homepage": "https://www.magdeburg.de/Start/B%C3%BCrger-Stadt/Verwaltung-Service/B%C3%BCrgerService",
418 "phone": "+49 391 54 00",
419 "email": "info@magdeburg.de",
420 "postalAddress": "Landeshauptstadt Magdeburg<br/>Alter Markt 6<br/>39104 Magdeburg",
421 "category": "citizen",
422 "subjectUrlInfo": "Using service from Serviceportal Sachsen-Anhalt (https://bk.sachsen-anhalt-connect.de)"
423 },
424 {
425 "shortName": {"" : "Bürgerservice-Portal Krz"},
426 "longName": {"" : "Bürgerservice-Portal Kommunales Rechenzentrum Minden-Ravensberg/Lippe"},
427 "address": "https://www.buergerserviceportal.nrw/krz/classic",
428 "homepage": "https://www.buergerserviceportal.nrw/krz",
429 "category": "citizen",
430 "subjectUrls": ["https://www.buergerserviceportal.nrw"]
390431 },
391432 {
392433 "exclude": ["ios"],
395436 "shortDescription": {"": "Anträge an die Kreisverwaltung Herford online erfassen."},
396437 "longDescription": {"": "In unserem Bürgerservice-Portal können Sie Anträge an die Kreisverwaltung Herford online erfassen und direkt zur weiteren Bearbeitung an die zuständigen Stellen übermitteln."},
397438 "address": "https://www.buergerserviceportal.nrw/krz/lkrherford",
398 "homepage": "https://www.kreis-herford.de/",
399 "phone": "+49 5223/988 - 500",
439 "homepage": "https://www.kreis-herford.de",
440 "phone": "+49 5223 988 500",
400441 "email": "portal@kreis-herford.de",
401442 "postalAddress": "Kreis Herford<br/>Amtshausstraße 3<br/>32051 Herford",
402443 "image": "KreisHerford_image.jpg",
403444 "icon": "KreisHerford_icon.png",
404445 "category": "citizen",
405 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
406 "subjectUrls": ["https://www.buergerserviceportal.nrw"]
446 "subjectUrlInfo": "Using service from Bürgerservice-Portal Krz (https://www.buergerserviceportal.nrw)."
407447 },
408448 {
409449 "exclude": ["ios"],
412452 "shortDescription": {"": "Anträge an den Kreis Minden-Lübbecke online erfassen."},
413453 "longDescription": {"": "In unserem Portal können Sie Ihren Antrag an den Kreis Minden-Lübbecke direkt online erfassen und elektronisch übermitteln."},
414454 "address": "https://www.buergerserviceportal.nrw/krz/mindenluebbecke",
415 "homepage": "https://www.minden-luebbecke.de/",
416 "phone": "+49 571 807-0",
455 "homepage": "https://www.minden-luebbecke.de",
456 "phone": "+49 571 807 0",
417457 "email": "info@minden-luebbecke.de",
418458 "postalAddress": "Kreis Minden-Lübbecke<br/>Portastraße 13<br/>32423 Minden",
419459 "image": "KreisMindenLuebbeke_image.jpg",
420460 "icon": "KreisMindenLuebbeke_icon.png",
421461 "category": "citizen",
422 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
423 "subjectUrls": ["https://www.buergerserviceportal.nrw"]
462 "subjectUrlInfo": "Using service from Bürgerservice-Portal Krz (https://www.buergerserviceportal.nrw)."
463 },
464 {
465 "exclude": ["ios"],
466 "shortName": {"" : "Bürgerservice-Portal Saarbrücken"},
467 "longDescription": {"": "Im Rahmen des Bürgerservice-Portals haben Sie die Möglichkeit, Anträge zu erfassen und diese direkt an die Landeshauptstadt Saarbrücken zur weiteren Bearbeitung weiterzuleiten."},
468 "address": "https://sl.buergerserviceportal.de/saarland/saarbruecken",
469 "homepage": "https://sl.buergerserviceportal.de/saarland/saarbruecken",
470 "phone": "+49 681 90 50",
471 "email": "stadt@saarbruecken.de",
472 "postalAddress": "Landeshauptstadt Saarbrücken<br/>Rathausplatz 1<br/>66111 Saarbrücken",
473 "category": "citizen",
474 "subjectUrls": ["https://sl.buergerserviceportal.de"]
475 },
476 {
477 "exclude": ["ios"],
478 "shortName": {"" : "Bürgerservice-Portal Stadt Lage"},
479 "longName": {"" : "Bürgerservice-Portal Stadt Lage"},
480 "shortDescription": {"": "Anträge online erfassen und an die Verwaltung weiterleiten."},
481 "longDescription": {"": "Das Bürgerservice-Portal bietet die Möglichkeit, Anträge an die Verwaltung der Stadt Lage online zu erfassen und elektronisch zur weiteren Bearbeitung weiterzuleiten."},
482 "address": "https://www.buergerserviceportal.nrw/krz/lage",
483 "homepage": "https://www.lage.de",
484 "phone": "+49 5232 601300",
485 "email": "Buergerbuero@lage.de",
486 "postalAddress": "Bürgerbüro Lage<br/>Bergstraße 21<br/>32791 Lage",
487 "image": "StadtLage_image.jpg",
488 "icon": "StadtLage_icon.png",
489 "category": "citizen",
490 "subjectUrlInfo": "Using service from Bürgerservice-Portal Krz (https://www.buergerserviceportal.nrw)."
491 },
492 {
493 "exclude": ["ios"],
494 "shortName": {"" : "Bürgerservice-Portal Stadt Norderstedt"},
495 "longDescription": {"": "In Norderstedt können Sie mit der Online-Ausweisfunktion über das Bürgerservice-Portal folgende Bürgerdienste nutzen:<br/>- Meldebestätigung<br/>- Aufenthaltsbescheinigung<br/>- Übermittlungssperren<br/>- Umzug innerhalb der Stadt<br/>- Voranzeige einer Anmeldung<br/>- Briefwahlunterlagen<br/>- Führungszeugnis<br/>Darüber hinaus können Sie Ihr persönliches Bürgerkonto einrichten. Nach Einrichtung des Bürgerkontos werden die bei einer Nutzung des Bürgerservice-Portals notwendigen persönlichen Daten komfortabel aus Ihrem Bürgerkonto übernommen. Damit sparen Sie Zeit und erleichtern den Behörden die Bearbeitung Ihres Antrags."},
496 "address": "https://norderstedt.de/digital",
497 "homepage": "https://www.norderstedt.de",
498 "phone": "+49 40 535 95 0 ",
499 "email": "info@norderstedt.de",
500 "postalAddress": "Stadt Norderstedt<br/>Rathausallee 50<br/>22846 Norderstedt",
501 "category": "citizen",
502 "subjectUrls": ["https://sh.buergerserviceportal.de"]
503 },
504 {
505 "exclude": ["ios"],
506 "shortName": {"" : "Bürgerservice-Portal Wiesbaden"},
507 "longDescription": {"": "In Wiesbaden können Sie mit der Online-Ausweisfunktion über das Bürgerservice-Portal<br/>- Briefwahlunterlagen,<br/>- Meldebestätigungen,<br/>- Aufenthaltsbescheinigungen,<br/>- Übermittlungssperren,<br/>- Führungszeugnisse und<br/>- Auskünfte aus dem Gewerbezentralregister beantragen."},
508 "address": "https://www.buergerserviceportal.de/hessen/wiesbaden",
509 "homepage": "https://www.wiesbaden.de",
510 "phone": "+49 611 31 8300",
511 "email": "buergeramt@wiesbaden.de",
512 "postalAddress": "Postfach 3920<br/>65029 Wiesbaden",
513 "category": "citizen",
514 "subjectUrls": ["https://he.buergerserviceportal.de"]
515 },
516 {
517 "exclude": ["ios"],
518 "shortName": {"" : "Bürgerservice-Portale der bayerischen Kommunen"},
519 "longDescription": {"": "Das BayernPortal ist das zentrale Verwaltungsportal für den Freistaat Bayern und die bayerischen Kommunen.<br/>Es bietet Ihnen eine einheitliche Anlaufstelle sowie einen einheitlichen Zugang zu den staatlichen und kommunalen Verwaltungsdienstleistungen in Bayern. Sie erreichen darüber mehr als 150 Online-Dienstleistungen, mehr als 2.000 Fachdatenbanken, über 2.500 Formulare und Merkblätter sowie mehr als 20.000 Ansprechpartnerinnen und Ansprechpartner bei Behörden.<br/>Über das BayernPortal können Sie sich zudem ein Servicekonto einrichten, das BayernID genannt wird und mit dem Sie die Verwaltungsdienstleistungen aller angeschlossenen Kommunen und des Freistaats Bayern einfach und sicher nutzen können. Die Einrichtung Ihrer BayernID und die Anmeldung an diesem persönlichen Servicekonto können Sie auch mit der Online-Ausweisfunktion vornehmen.<br/>Ihre in Ihrem Servicekonto gespeicherten Daten werden automatisch in Ihre Anträge übernommen. Dadurch sparen Sie Zeit und erleichtern der Behörde die Bearbeitung Ihres Anliegens.<br/>In Verbindung mit dem Bayerischen E-Government Gesetz bietet Ihnen die BayernID die Möglichkeit, die in vielen Fällen erforderliche Schriftform zu ersetzen und damit Ihre Anträge ohne handschriftliche Unterschrift, d. h. vollständig online abzuwickeln. Sie müssen nicht mehr zur Behörde gehen oder Unterlagen per Post senden."},
520 "address": "https://www.buergerserviceportal.de/bayern/classic",
521 "homepage": "https://www.freistaat.bayern",
522 "phone": "+49 89 12 22 20",
523 "email": "direkt@bayern.de",
524 "postalAddress": "Postfach 22 00 03<br/>80535 München",
525 "category": "citizen",
526 "subjectUrls": ["https://www.buergerserviceportal.de"]
527 },
528 {
529 "exclude": ["ios"],
530 "shortName": {"" : "d.velop – foxdox.de: Dokumente sicher ablegen"},
531 "longDescription": {"": "Dokumente, Verträge, Reiseunterlagen, Bilder und vieles mehr können Sie einfach in Ihren persönlichen foxdox-Account hochladen. <br/>Sie melden sich mit der Online-Ausweisfunktion an und können von überall und jederzeit auf Ihre Dokumentenablage zugreifen, z. B. um sie innerhalb der Familie, Ihren Kollegen oder auch Ihrem Steuerberater zur Verfügung zu stellen. <br/>Quittungen und Belege können Sie einfach fotografieren oder scannen, hochladen und sicher in Ihrem foxdox-Account mit übersichtlichem Ordner-System speichern. Eine separate Ablage oder Kopien sind nicht mehr notwendig. Alle Daten liegen sicher und verschlüsselt in einem Rechenzentrum in Deutschland.<br/>Ein Standard-Account ist kostenfrei erhältlich."},
532 "address": "https://mein.foxdox.de",
533 "homepage": "https://www.d-velop.de/foxdox/foxdox-home",
534 "phone": "+49 2542 9307 0",
535 "email": "support@foxdox.de",
536 "postalAddress": "d.velop business services GmbH<br/>Schildarpstraße 6-8<br/>48712 Gescher",
537 "category": "other",
538 "subjectUrls": ["https://mein.foxdox.de"]
539 },
540 {
541 "shortName": {"" : "Deutsche Rentenversicherung"},
542 "longDescription": {"": "Mit der Online-Ausweisfunktion im neuen Personalausweis können Sie ...<br/>- auf Informationen Ihres Rentenkontos im Kundenbereich ,eService' sicher zugreifen (z. B. Versicherungsverlauf und Beitragsrechnung),<br/>- Ihre Rentenauskunft online abrufen,<br/>- schnell und einfach Ihre persönlichen Daten ändern (z. B. Ihre Adresse und Bankverbindung)."},
543 "address": "https://www.eservice-drv.de/OnlineDiensteWeb/init.do?npa=true",
544 "homepage": "https://www.deutsche-rentenversicherung.de",
545 "phone": "+49 800 100 048070",
546 "email": "Online-Dienste@deutsche-rentenversicherung.de",
547 "postalAddress": "Ruhrstraße 2<br/>10709 Berlin",
548 "category": "citizen",
549 "subjectUrls": ["https://www.eservice-drv.de"]
550 },
551 {
552 "exclude": ["ios"],
553 "shortName": {"" : "eAntrag der Investitionsbank Berlin (IBB)"},
554 "longDescription": {"": "Im Kundenportal der Investitionsbank Berlin können Sie verschiedene Förder-Produkte durchgängig elektronisch beantragen:<br/>- Berlin Kapital<br/>- IBB Familienbaudarlehen<br/>- IBB Wohnraum modernisieren<br/>- KMU-Fonds über 25.000 Euro<br/>- Liquiditätshilfen BERLIN<br/>- Mikrokredit aus dem KMU-Fonds<br/>- Pro FIT (Projektvorschlagsphase)<br/>- Pro FIT (Frühphasenfinanzierung)<br/>Für die rechtsverbindliche, fristwahrende Antragstellung der Produkte<br/>- GRW<br/>- Innovationsassistent<br/>- PFI - Gemeinschaft<br/>- PFI - KMU<br/>- PFI - Netzwerk<br/>- ProFIT (Projektantragsphase)<br/>gilt aus verwaltungsrechtlichen Anforderungen das Schriftformerfordernis: Die elektronische Antragstellung ist zwingend nachträglich schriftlich zu bestätigen.<br/>Mit der Online-Ausweisfunktion können Sie sich bequem und sicher elektronisch legitimieren und müssen dadurch Ihre Identität weder per Postident-Verfahren noch persönlich vor Ort nachweisen.<br/>Nach Ihrer Legitimierung können Sie über eine persönliche Dokumentenablage die rechtsverbindliche Kommunikation mit Ihrem IBB-Ansprechpartner online – und unabhängig von Öffnungszeiten oder Postwegen – über das Kundenportal erledigen."},
555 "address": "https://www.ibb.de/de/service/eantrag/eantrag.html",
556 "homepage": "https://www.ibb.de",
557 "phone": "+49 30 2125 0",
558 "email": "info@ibb.de",
559 "postalAddress": "Investitionsbank Berlin (IBB)<br/>Bundesallee 210<br/>10719 Berlin",
560 "category": "finance",
561 "subjectUrls": ["https://registrierung-eantrag.ibb.de"]
562 },
563 {
564 "exclude": ["ios"],
565 "shortName": {"" : "ekom21-KGRZ Hessen"},
566 "address": "https://kfzonline.ekom21.de/kfzonline.public/start.html?oe=00.00.06.439000",
567 "homepage": "https://kfzonline.ekom21.de/kfzonline.public/start.html?oe=00.00.06.439000",
568 "email": "ekom21@ekom21.de",
569 "postalAddress": "ekom21-KGRZ Hessen<br/>Carlo-Mierendorff-Straße 11<br/>35398 Gießen",
570 "category": "citizen",
571 "subjectUrls": ["https://kfzonline.ekom21.de"]
572 },
573 {
574 "shortName": {"" : "ELSTER"},
575 "longName": {"" : "ELSTER - Die elektronische Steuererklärung"},
576 "shortDescription": {"": "Abwicklung der Steuererklärungen und -anmeldungen über das Internet."},
577 "longDescription": {"": "ELSTER bietet im Rahmen der Registrierung, welche Voraussetzung für die Abwicklung der Steuererklärungen und Steueranmeldungen über das Internet ist, die Möglichkeit der Nutzung der Online-Ausweisfunktion."},
578 "address": "https://www.elster.de",
579 "homepage": "https://www.elster.de",
580 "phone": "+49 89 9991 0",
581 "email": "info@elster.de",
582 "postalAddress": "Bayerisches Landesamt für Steuern - Dienststelle München<br/>80284 München",
583 "image": "elster_image.png",
584 "icon": "elster_icon.png",
585 "category": "citizen",
586 "subjectUrls": ["https://www.elster.de"]
587 },
588 {
589 "exclude": ["ios"],
590 "shortName": {"" : "Frankfurt am Main - KFZ online"},
591 "address": "https://kfzonline.ekom21.de/kfzonline.public/start.html?oe=00.00.06.412000",
592 "homepage": "https://frankfurt.de/leistungen/Fahrzeug-und-Verkehr-8957833",
593 "phone": "+49 69 115",
594 "email": "buergerberatung@stadt-frankfurt.de",
595 "postalAddress": "Bürgerberatung<br/>Hinter dem Lämmchen 6<br/>60311 Frankfurt am Main ",
596 "category": "citizen",
597 "subjectUrlInfo": "Using service from ekom21-KGRZ Hessen (https://kfzonline.ekom21.de)."
598 },
599 {
600 "exclude": ["ios"],
601 "shortName": {"" : "Führungszeugnis und Auskunft aus dem Gewerbezentralregister"},
602 "longDescription": {"": "Sie benötigen ein Führungszeugnis oder eine Auskunft aus dem Gewerbezentralregister? Mit dem Personalausweis im Scheckkartenformat können Sie einen Behördengang sparen. Weitere Voraussetzungen sind die freigeschaltete Online-Ausweisfunktion und ein passender Kartenleser für Ihren Computer. Auf diese Weise kann eindeutig identifiziert werden, wer den Antrag stellt. Ausländische Mitbürger, die keinen deutschen Personalausweis besitzen, können in gleicher Weise die entsprechende Funktion ihres elektronischen Aufenthaltstitels nutzen.<br/>Neben Führungszeugnissen können auch Auskünfte aus dem Gewerbezentralregister über das neue Online-Portal des BfJ beantragt werden. Solche Auskünfte benötigen Unternehmen, die sich in Ausschreibungsverfahren um öffentliche Aufträge bewerben, recht häufig. Auch hier kann das Online-Verfahren den Aufwand erheblich senken."},
603 "address": "https://www.fuehrungszeugnis.bund.de",
604 "homepage": "https://www.bundesjustizamt.de",
605 "phone": "+49 228 99 410 40",
606 "email": "poststelle@bfj.bund.de",
607 "postalAddress": "Bundesamt für Justiz<br/>53094 Bonn",
608 "category": "citizen",
609 "subjectUrls": ["https://www.fuehrungszeugnis.bund.de"]
610 },
611 {
612 "shortName": {"" : "Hamburg Service Online-Bürgerdienste"},
613 "longName": {"" : "Hamburg Service Online-Bürgerdienste"},
614 "shortDescription": {"": "Digitales Dienstleistungsangebot der Freien und Hansestadt Hamburg (FHH)"},
615 "longDescription": {"": "Digitales Dienstleistungsangebot der Freien und Hansestadt Hamburg (FHH)"},
616 "address": "https://servicekonto.serviceportal.hamburg.de/Servicekonto/Registration/SelectServicekontotype/ShowMenu",
617 "homepage": "https://serviceportal.hamburg.de",
618 "phone": "+49 40 42823 2420",
619 "email": "dataporthamburggateway-service@dataport.de",
620 "postalAddress": "Freie und Hansestadt Hamburg<br/>Erster Bürgermeister Dr. Peter Tschentscher Rathausmarkt 1<br/>20095 Hamburg",
621 "category": "citizen",
622 "subjectUrls": ["https://idp.servicekonto.serviceportal.hamburg.de"],
623 "icon": "hamburg_serviceportal_icon.png"
624 },
625 {
626 "shortName": {"" : "Identitätsprüfungen nach der eIDAS und dem Geldwäschegesetz"},
627 "longDescription": {"": "Die identity Trust Management AG bietet Unternehmen die Möglichkeit, ihre Kunden schnell und sicher mit der Online-Ausweisfunktion zu identifizieren. <br/>Kunden der Kooperationspartner der identity Trust Management AG können die Identitätsprüfung nach dem Signaturgesetz und dem Geldwäschegesetz auch direkt über die Internetseite der identity Trust Management AG vornehmen."},
628 "address": "https://www.identity.tm",
629 "homepage": "https://www.identity.tm",
630 "phone": "+49 211 68 77 3 0",
631 "email": "kontakt@identity.tm",
632 "postalAddress": "identity Trust Management AG<br/>Lierenfelder Straße 51<br/>40231 Düsseldorf",
633 "category": "other",
634 "subjectUrlInfo": "Generic service provider. Order number required to start authentication."
635 },
636 {
637 "exclude": ["ios"],
638 "shortName": {"" : "invenio"},
639 "longName": {"" : "invenio - Rechercheanwendung für Archivgut des Bundesarchivs"},
640 "shortDescription": {"" : "invenio ermöglicht die Recherche in den Beständen des Bundesarchivs. Über invenio können Sie außerdem digitalisierte Unterlagen ansehen und Archivgut zur Einsicht in den Lesesaal bestellen. Die eID-Funktion Ihres Personalausweises dient Ihrer eindeutigen Identifizierung außerhalb des Lesesaals, sodass Ihnen zusätzlich zu den frei verfügbaren Informationen zugangsbeschränkte Erschließungsinformationen über das Internet zur Verfügung gestellt werden können."},
641 "longDescription": {"": "Ein Großteil der Erschließungsinformationen und Digitalisate in der Rechercheanwendung invenio ist frei im Internet zugänglich und unterliegt keinen Schutzfristen oder sonstigen Benutzungsbeschränkungen. Archivalien und deren Erschließungsinformationen, auf denen noch Benutzungsbeschränkungen liegen, können im Einzelfall auf Antrag zugänglich gemacht werden und im Lesesaal eingesehen werden. Wenn Sie nicht selbst vor Ort im Lesesaal recherchieren können, bietet Ihnen das Bundesarchiv mit der eID-Funktion die Möglichkeit, sich über das Internet auszuweisen und so Zugriff auf grundsätzlich noch unter Schutzfristen und anderen Benutzungsbeschränkungen liegenden Informationen zu erhalten. Nach der Verbindung Ihres Benutzerkontos mit der eID werden Ihnen vom Bundesarchiv die für Ihr Benutzungsthema erforderlichen Rechte auf Antrag freigeschaltet. Sofern Sie die entsprechenden Anträge bereits zu einem früheren Zeitpunkt gestellt haben, müssen Sie diese nicht erneut stellen. Sie können dann die Recherche in den benutzungsbeschränkten Beständen durchführen, die Ihnen bisher nur an den PCs im Benutzersaal des Bundesarchivs möglich war. Die Entscheidung über Schutzfristverkürzungen und das Freischalten von Rechten für invenio liegt bei den archivischen Fachreferaten des Bundesarchivs."},
642 "image": "invenio_image.png",
643 "icon": "invenio_icon.png",
644 "address": "https://invenio.bundesarchiv.de/invenio",
645 "homepage": "https://www.bundesarchiv.de",
646 "phone": "+49 261 505 777",
647 "email": "invenio@bundesarchiv.de",
648 "postalAddress": "Bundesarchiv<br/>Potsdamer Straße 1<br/>56075 Koblenz",
649 "category": "citizen",
650 "subjectUrls": ["https://invenio.bundesarchiv.de"]
651 },
652 {
653 "shortName": {"" : "Kreis Borken"},
654 "longName": {"" : "Kreis Borken - Kfz-Abmeldung Internet"},
655 "shortDescription": {"": "Authentisierung für internetbasierte Kfz-Dienste."},
656 "longDescription": {"": "Für die internetbasierten Kfz-Dienste wird die eID-Funktionalität des neuen Personalausweises benötigt."},
657 "address": "https://formulare-extern.de/metaform/Form-Solutions/sid/assistant/5b83c44dc2dcdb75a7b07fea",
658 "homepage": "https://www.kreis-borken.de",
659 "phone": "+49 2861 681 1310",
660 "email": "zulassungsstelle@kreis-borken.de",
661 "postalAddress": "Kfz-Zulassungsstelle Borken<br/>Burloer Str. 93<br/>46325 Borken",
662 "image": "KreisBorken_image.png",
663 "icon": "KreisBorken_icon.svg",
664 "category": "citizen",
665 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
666 },
667 {
668 "shortName": {"" : "Kreis Lippe Portal"},
669 "longName": {"" :"Kreis Lippe Portal"},
670 "longDescription": {"": "Mit der Online-Ausweisfunktion können Sie sich am Bürgerportal des Kreises Lippe registrieren, anmelden und den Online-Service 'Elternbeiträge' nutzen. Als Eltern können Sie nach der einmaligen Registrierung<br/><br/> - Ihre Selbsteinschätzung für den Elternbeitrag online einreichen,<br/> - den Bearbeitungsstand nachverfolgen,<br/> - Bescheide elektronisch im Dokumentenbereich empfangen."},
671 "address": "https://portal.kreis-lippe.de",
672 "homepage": "https://portal.kreis-lippe.de",
673 "phone": "+49 5231 62 0",
674 "postalAddress": "Kreis Lippe<br/>Felix-Fechenbach-Str. 5<br/>32756 Detmold",
675 "category": "citizen",
676 "subjectUrls": ["https://egov-services.krz.de"]
677 },
678 {
679 "shortName": {"" : "Kfz-Online Berlin"},
680 "longName": {"": "Landesamt für Bürger- und Ordnungsangelegenheiten"},
681 "shortDescription": {"": "Das Portal \"Kfz-Online Berlin\" bündelt alle Vorgänge rund um Kfz, die sich im Land Berlin online erledigen lassen."},
682 "address": "https://kfz-portal.berlin.de",
683 "homepage": "https://www.berlin.de/labo",
684 "phone": "+49 30 90269 0",
685 "email": "kundenservice@berlin.de",
686 "postalAddress": "BerlinOnline Stadtportal GmbH & Co. KG<br/>Alte Jakobstraße 105<br/>10969 Berlin",
687 "category": "citizen",
688 "subjectUrlInfo": "Using service from Service-Portal Berlin (https://eid-prod.connect.verwalt-berlin.de)."
689 },
690 {
691 "shortName": {"" : "Landkreis Harburg"},
692 "longDescription": {"": "In diesem Portal haben Sie die Möglichkeit, Dienstleistungen Ihrer Zulassungsbehörde online zu beantragen und abzuwickeln. Kernbestandteil des Portals ist die internetbasierte Fahrzeugzulassung (i-Kfz)."},
693 "address": "https://stva.landkreis-harburg.de",
694 "homepage": "https://stva.landkreis-harburg.de",
695 "phone": "+49 4171 693 99 10 0",
696 "email": "buergerservice@lkharburg.de",
697 "postalAddress": "Landkreis Harburg<br/>Schloßplatz 6<br/>21423 Winsen (Luhe)",
698 "category": "citizen",
699 "subjectUrls": ["https://npa.regioit.de"]
700 },
701 {
702 "exclude": ["ios"],
703 "shortName": {"" : "Landkreis Hildburghausen"},
704 "longDescription": {"": "Mit diesem Service können Sie online auf der Grundlage der Fahrzeugzulassungsverordnung (FZV) Ihr Fahrzeug außer Betrieb setzen und wieder in Betrieb nehmen."},
705 "address": "https://www.landkreis-hildburghausen.de/Schnellnavigation/KFZ-Onlinedienste",
706 "homepage": "https://www.landkreis-hildburghausen.de/Schnellnavigation/KFZ-Onlinedienste",
707 "phone": "+49 3685 445 286",
708 "email": "poststelle@lrahbn.thueringen.de",
709 "postalAddress": "Landkreis Hildburghausen<br/>SG Zulassungsbehörde<br/>Wiesenstraße 18<br/>98646 Hildburghausen",
710 "category": "citizen",
711 "subjectUrls": ["https://thavelp.thueringen.de"]
712 },
713 {
714 "shortName": {"" : "Landkreis Jerichower Land"},
715 "longDescription": {"": "Nutzen Sie die Online-Angebote des Straßenverkehrsamtes Jerichower Land und sparen Sie Zeit. Wir bieten Ihnen die Möglichkeit der Online-Terminvergabe für die Kfz-Zulassungsstelle, Online-Abmeldung und Wiederzulassung von Kraftfahrzeugen, Wunschkennzeichenreservierung, Bankbriefauskunft und Führerscheinauskunft."},
716 "address": "https://www.lkjl.de/de/strassenverkehrsamt.html",
717 "homepage": "https://www.lkjl.de/de/strassenverkehrsamt.html",
718 "phone": "+49 3921 949 0",
719 "email": "post@lkjl.de",
720 "postalAddress": "Landkreis Jerichower Land<br/>Bahnhofstraße 9<br/>39288 Burg",
721 "category": "citizen",
722 "subjectUrlInfo": "Using service from Serviceportal Sachsen-Anhalt (https://st.buergerserviceportal.de)."
723 },
724 {
725 "exclude": ["ios"],
726 "shortName": {"" : "Landkreis Mansfeld-Südharz"},
727 "longDescription": {"": "Im elektronischen Straßenverkehrsamt haben Sie die Möglichkeit, die Abmeldung und die Wiederzulassung Ihres Fahrzeuges online zu realisieren. Darüber hinaus können Sie im elektronischen Straßenverkehrsamt auch ein Bürgerkonto einrichten, welches zukünftig für weitere Dienstleistungen der Kreisverwaltung nutzbar sein wird."},
728 "address": "https://st.buergerserviceportal.de/sachsenanhalt/lkrmansfeldsuedharz",
729 "homepage": "https://st.buergerserviceportal.de/sachsenanhalt/lkrmansfeldsuedharz",
730 "email": "landkreis@lkmsh.de",
731 "postalAddress": "Landkreis Mansfeld-Südharz<br/>Rudolf-Breitscheid-Str. 20/22<br/>06526 Sangerhausen",
732 "category": "citizen",
733 "subjectUrlInfo": "Using service from Serviceportal Sachsen-Anhalt (https://st.buergerserviceportal.de)."
734 },
735 {
736 "shortName": {"" : "Landkreis Merzig-Wadern"},
737 "longDescription": {"": "In diesem Portal haben Sie die Möglichkeit, Dienstleistungen Ihrer Zulassungsbehörde online zu beantragen und abzuwickeln. Kernbestandteil des Portals ist die internetbasierte Fahrzeugzulassung (i-Kfz)."},
738 "address": "https://buergerportal.merzig-wadern.de/kfz",
739 "homepage": "https://buergerportal.merzig-wadern.de",
740 "phone": "+49 6861 80 101",
741 "email": "info@merzig-wadern.de",
742 "postalAddress": "Landkreis Merzig-Wadern<br/>Bahnhofstraße 44<br/>66663 Merzig",
743 "category": "citizen",
744 "subjectUrls": ["https://ident.saarland.de"]
745 },
746 {
747 "exclude": ["ios"],
748 "shortName": {"" : "Landkreis Rostock"},
749 "longDescription": {"": "Mit den Online-Services können Sie die Leistungen der Verwaltung zeit- und ortsunabhängig nutzen, z. B. ganz bequem von zu Haus aus. Probieren Sie es einfach mal aus!"},
750 "address": "https://mv.buergerserviceportal.de/mecklenburgvorpommern/lkrrostock/bsp_ikfz_antragstellung",
751 "homepage": "https://www.landkreis-rostock.de/landkreis/online-dienste2.html",
752 "phone": "+49 3843 755 0",
753 "email": "info@lkros.de",
754 "postalAddress": "Landkreis Rostock<br/>Der Landrat<br/>Am Wall 3-5<br/>18273 Güstrow",
755 "category": "citizen",
756 "subjectUrls": ["https://mv.buergerserviceportal.de"]
757 },
758 {
759 "shortName": {"" : "Login Meine VBL"},
760 "longDescription": {"": "Bei der VBL können Sie sich mit dem Personalausweis am Kundenportal ,Meine VBL' anmelden. Im Kundenkonto können Sie Ihre Vertragsdaten und Ihre persönlichen Daten einsehen und weitere Online-Dienste nutzen, z. B.<br/>- Rentenantrag stellen,<br/>- Beitragserstattung beantragen,<br/>- Kontaktdaten ändern,<br/>- persönliche Mitteilungen von der VBL erhalten."},
761 "address": "https://www.vbl.de/de/meine_vbl",
762 "homepage": "https://www.vbl.de",
763 "phone": "+49 721 93 98 93 1",
764 "email": "info@vbl.de",
765 "postalAddress": "VBL. Kundenservice<br/>76240 Karlsruhe",
766 "category": "other",
767 "subjectUrls": ["https://www.vbl.de"]
768 },
769 {
770 "shortName": {"" : "LVM Versicherung - Kundenportal Meine LVM"},
771 "longDescription": {"": "Mit der Online-Ausweisfunktion im Personalausweis können Sie sich nach der Registrierung durch Ihre LVM-Agentur sicher am Kundenportal ,Meine LVM' anmelden. Ihre Versicherung können Sie nun selbst verwalten und beispielsweise sämtliche Vertragsdaten online einsehen. Darüber hinaus ist es möglich über das Portal Versicherungsbescheinigungen anzufordern sowie schnell und einfach Ihre persönlichen Daten wie Adresse oder Bankverbindung zu ändern."},
772 "address": "https://www.lvm.de/personalausweis",
773 "homepage": "https://www.lvm.de",
774 "phone": "+49 251 702 0",
775 "email": "info@lvm.de",
776 "postalAddress": "LVM Versicherung<br/>48126 Münster",
777 "category": "insurance",
778 "subjectUrls": ["https://www.lvm.de"]
779 },
780 {
781 "shortName": {"" : "DATEV Arbeitnehmer online"},
782 "longName": {"": "Meine Abrechnungen"},
783 "shortDescription": {"": "Arbeitnehmer online ist ein Angebot Ihres Arbeitgebers, um mit Ihnen digital zusammenzuarbeiten. Im Portal stellt er Ihnen persönliche Daten bereit, wie zum Beispiel Ihre Lohn- und Gehaltsdokumente."},
784 "longDescription": {"": "Arbeitnehmer online ist ein Angebot Ihres Arbeitgebers, um mit Ihnen digital zusammenzuarbeiten. Im Portal stellt er Ihnen persönliche Daten bereit, wie zum Beispiel Ihre Lohn- und Gehaltsdokumente. <br/> Ihr Arbeitgeber schaltet Sie für die Nutzung von Arbeitnehmer online frei. Daraufhin erhalten Sie persönliche Briefe, mit denen Sie sich registrieren können. Im Anschluss können Sie jederzeit Ihre Brutto/Netto-Abrechnungen, Sozialversicherungsnachweise und Lohnsteuerbescheinigungen online abrufen. Sie haben dadurch jederzeit und überall einen schnellen Überblick über Ihre gesamten Lohn- und Gehaltsdokumente."},
785 "address": "https://www.datev.de/ano",
786 "homepage": "https://www.datev.de",
787 "phone": "+49 800 6648383",
788 "email": "info@datev.de",
789 "postalAddress": "Datev eG <br/>Paumgartnerstr. 6 - 14 <br/>90429 Nürnberg",
790 "image": "datev_image.jpg",
791 "icon": "datev_icon.png",
792 "category": "other",
793 "subjectUrls": ["https://secure6.datev.de"]
794 },
795 {
796 "exclude": ["ios"],
797 "shortName": {"" : "Mentana-Claimsoft AG - Registrierung beim De-Mail Dienst"},
798 "address": "https://www.fp-demail.de",
799 "homepage": "https://www.fp-demail.de",
800 "phone": "+49 800 6368262",
801 "email": "de-mail.info@mentana.de",
802 "postalAddress": "Mentana-Claimsoft GmbH<br/>Trebuser-Str. 47 Haus 1<br/>D-15517 Fürstenwalde",
803 "category": "other",
804 "subjectUrls": ["https://www.fp-demail.de"]
805 },
806 {
807 "shortName": {"" : "Siegburg Online"},
808 "longName": {"" : "Online-Bürgerdienste der Kreisstadt Siegburg"},
809 "shortDescription": {"": "Alle Online-Services der Kreisstadt Siegburg"},
810 "longDescription": {"": "Die Kreisstadt Siegburg bietet auf ihrer Homepage viele Online-Services an, die Sie mit der Online-Ausweisfunktion nutzen können. Hierzu zählen unter anderem:<br/>- An-, Um- und Abmeldung des Wohnsitzes<br/>- Urkundenservice des Standesamts<br/>- Hundeservice (Online An- & Abmeldung, Hundemarke etc.)<br/>- Bewohnerparkausweis beantragen & verlängern<br/>- Meldebescheinigung & Melderegisterauskunft<br/>- Übermittlungssperre<br/>- Statusabfrage Personalausweis /Reisepass<br/>- Beantragung Siegburg Pass & Siegburg Gutschein"},
811 "address": "https://eservice.siegburg.de",
812 "homepage": "https://www.siegburg.de",
813 "phone": "+49 2241 102 0",
814 "email": "rathaus@siegburg.de",
815 "postalAddress": "Kreisstadt Siegburg<br/>Nogenter Platz 10<br/>53721 Siegburg",
816 "image": "Siegburg_image.png",
817 "icon": "Siegburg_icon.png",
818 "category": "citizen",
819 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
424820 },
425821 {
426822 "shortName": {"" : "Service-Portal Kreis Soest"},
429825 "longDescription": {"": "In unserem Service-Portal können Sie Anträge an die Kreisverwaltung Soest online erfassen und direkt zur weiteren Bearbeitung an die zuständigen Stellen übermitteln."},
430826 "address": "https://serviceportal.kreis-soest.de",
431827 "homepage": "https://www.kreis-soest.de/start",
432 "phone": "+49 2921 30-0",
828 "phone": "+49 2921 30 0",
433829 "email": "service-portal@kreis-soest.de",
434830 "postalAddress": "Kreisverwaltung Soest<br/>Hoher Weg 1-3<br/>59494 Soest",
435831 "image": "KreisSoest_image.png",
436832 "icon": "KreisSoest_icon.png",
437833 "category": "citizen",
438 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
439 "subjectUrls": []
440 },
441 {
442 "exclude": ["ios"],
443 "shortName": {"" : "Bürgerservice-Portal Stadt Lage"},
444 "longName": {"" : "Bürgerservice-Portal Stadt Lage"},
445 "shortDescription": {"": "Anträge online erfassen und an die Verwaltung weiterleiten."},
446 "longDescription": {"": "Das Bürgerservice-Portal bietet die Möglichkeit, Anträge an die Verwaltung der Stadt Lage online zu erfassen und elektronisch zur weiteren Bearbeitung weiterzuleiten."},
447 "address": "https://www.buergerserviceportal.nrw/krz/lage",
448 "homepage": "https://www.lage.de/",
449 "phone": "+49 5232/601300",
450 "email": "Buergerbuero@lage.de",
451 "postalAddress": "Bürgerbüro Lage<br/>Bergstraße 21<br/>32791 Lage",
452 "image": "StadtLage_image.jpg",
453 "icon": "StadtLage_icon.png",
454 "category": "citizen",
455 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
456 "subjectUrls": ["https://www.buergerserviceportal.nrw"]
457 },
458 {
459 "exclude": ["ios"],
460 "shortName": {"" : "Bürgerservice-Portal Stadt Norderstedt"},
461 "longDescription": {"": "In Norderstedt können Sie mit der Online-Ausweisfunktion über das Bürgerservice-Portal folgende Bürgerdienste nutzen:<br/>- Meldebestätigung<br/>- Aufenthaltsbescheinigung<br/>- Übermittlungssperren<br/>- Umzug innerhalb der Stadt<br/>- Voranzeige einer Anmeldung<br/>- Briefwahlunterlagen<br/>- Führungszeugnis<br/>Darüber hinaus können Sie Ihr persönliches Bürgerkonto einrichten. Nach Einrichtung des Bürgerkontos werden die bei einer Nutzung des Bürgerservice-Portals notwendigen persönlichen Daten komfortabel aus Ihrem Bürgerkonto übernommen. Damit sparen Sie Zeit und erleichtern den Behörden die Bearbeitung Ihres Antrags."},
462 "address": "https://norderstedt.de/digital",
463 "homepage": "https://www.norderstedt.de/",
464 "phone": "+49 40 - 535 95-0 ",
465 "email": "info@norderstedt.de",
466 "postalAddress": "Stadt Norderstedt<br/>Rathausallee 50<br/>22846 Norderstedt",
467 "category": "citizen",
468 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
469 "subjectUrls": ["https://sh.buergerserviceportal.de"]
470 },
471 {
472 "exclude": ["ios"],
473 "shortName": {"" : "Bürgerservice-Portal Wiesbaden"},
474 "longDescription": {"": "In Wiesbaden können Sie mit der Online-Ausweisfunktion über das Bürgerservice-Portal<br/>- Briefwahlunterlagen,<br/>- Meldebestätigungen,<br/>- Aufenthaltsbescheinigungen,<br/>- Übermittlungssperren,<br/>- Führungszeugnisse und<br/>- Auskünfte aus dem Gewerbezentralregister beantragen."},
475 "address": "https://www.buergerserviceportal.de/hessen/wiesbaden",
476 "homepage": "https://www.wiesbaden.de/",
477 "phone": "+49 611 / 31 - 8300",
478 "email": "buergeramt@wiesbaden.de",
479 "postalAddress": "Postfach 3920<br/>65029 Wiesbaden",
480 "category": "citizen",
481 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
482 "subjectUrls": ["https://www.buergerserviceportal.de"]
483 },
484 {
485 "exclude": ["ios"],
486 "shortName": {"" : "Bürgerservice-Portale der bayerischen Kommunen"},
487 "longDescription": {"": "Das BayernPortal ist das zentrale Verwaltungsportal für den Freistaat Bayern und die bayerischen Kommunen.<br/>Es bietet Ihnen eine einheitliche Anlaufstelle sowie einen einheitlichen Zugang zu den staatlichen und kommunalen Verwaltungsdienstleistungen in Bayern. Sie erreichen darüber mehr als 150 Online-Dienstleistungen, mehr als 2.000 Fachdatenbanken, über 2.500 Formulare und Merkblätter sowie mehr als 20.000 Ansprechpartnerinnen und Ansprechpartner bei Behörden.<br/>Über das BayernPortal können Sie sich zudem ein Servicekonto einrichten, das BayernID genannt wird und mit dem Sie die Verwaltungsdienstleistungen aller angeschlossenen Kommunen und des Freistaats Bayern einfach und sicher nutzen können. Die Einrichtung Ihrer BayernID und die Anmeldung an diesem persönlichen Servicekonto können Sie auch mit der Online-Ausweisfunktion vornehmen.<br/>Ihre in Ihrem Servicekonto gespeicherten Daten werden automatisch in Ihre Anträge übernommen. Dadurch sparen Sie Zeit und erleichtern der Behörde die Bearbeitung Ihres Anliegens.<br/>In Verbindung mit dem Bayerischen E-Government Gesetz bietet Ihnen die BayernID die Möglichkeit, die in vielen Fällen erforderliche Schriftform zu ersetzen und damit Ihre Anträge ohne handschriftliche Unterschrift, d. h. vollständig online abzuwickeln. Sie müssen nicht mehr zur Behörde gehen oder Unterlagen per Post senden."},
488 "address": "https://www.buergerserviceportal.de/bayern/classic/",
489 "homepage": "https://www.freistaat.bayern/",
490 "phone": "+49 (0)89 12 22 20",
491 "email": "direkt@bayern.de",
492 "postalAddress": "Postfach 22 00 03<br/>80535 München",
493 "category": "citizen",
494 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
495 "subjectUrls": ["https://www.buergerserviceportal.de"]
496 },
497 {
498 "exclude": ["ios"],
499 "shortName": {"" : "d.velop – foxdox.de: Dokumente sicher ablegen"},
500 "longDescription": {"": "Dokumente, Verträge, Reiseunterlagen, Bilder und vieles mehr können Sie einfach in Ihren persönlichen foxdox-Account hochladen. <br/>Sie melden sich mit der Online-Ausweisfunktion an und können von überall und jederzeit auf Ihre Dokumentenablage zugreifen, z. B. um sie innerhalb der Familie, Ihren Kollegen oder auch Ihrem Steuerberater zur Verfügung zu stellen. <br/>Quittungen und Belege können Sie einfach fotografieren oder scannen, hochladen und sicher in Ihrem foxdox-Account mit übersichtlichem Ordner-System speichern. Eine separate Ablage oder Kopien sind nicht mehr notwendig. Alle Daten liegen sicher und verschlüsselt in einem Rechenzentrum in Deutschland.<br/>Ein Standard-Account ist kostenfrei erhältlich."},
501 "address": "https://mein.foxdox.de/",
502 "homepage": "https://www.d-velop.de/foxdox/foxdox-home",
503 "phone": "+49 (0) 2542 9307-0",
504 "email": "support@foxdox.de",
505 "postalAddress": "d.velop business services GmbH<br/>Schildarpstraße 6-8<br/>48712 Gescher",
506 "category": "other",
507 "tcTokenUrl" : "https://mein.foxdox.de/npa_login?action=gettctoken&next=/documents",
508 "subjectUrls": ["https://mein.foxdox.de"]
509 },
510 {
511 "shortName": {"" : "Datev - Arbeitnehmer online / Lohn- und Gehaltsabrechnung"},
512 "longDescription": {"": "Nach einmaliger Freischaltung durch den Arbeitgeber erhalten Sie Ihren persönlichen Aktivierungscode per Post. Mit dem Aktivierungscode registrieren Sie sich an dem Portal \"DATEV Arbeitnehmer online\", dazu können Sie u.a. die Online-Ausweisfunktion nutzen. Danach können Sie jederzeit Ihre Brutto/Netto-Abrechnungen, Sozialversicherungsnachweise und Lohnsteuerbescheinigungen online abrufen. Sie haben dadurch jederzeit und überall einen schnellen Überblick über Ihre gesamten Lohn- und Gehaltsdokumente. "},
513 "address": "https://www.datev.de/ano/",
514 "homepage": "https://www.datev.de",
515 "phone": "+49 800 3283825",
516 "email": "info@datev.de",
517 "postalAddress": "DATEV eG<br/>90329 Nürnberg",
518 "category": "other",
519 "tcTokenUrlInfo" : "Address is faulty",
520 "subjectUrls": ["https://secure6.datev.de"]
521 },
522 {
523 "shortName": {"" : "Deutsche Rentenversicherung"},
524 "longDescription": {"": "Mit der Online-Ausweisfunktion im neuen Personalausweis können Sie ...<br/>- auf Informationen Ihres Rentenkontos im Kundenbereich ,eService' sicher zugreifen (z. B. Versicherungsverlauf und Beitragsrechnung),<br/>- Ihre Rentenauskunft online abrufen,<br/>- schnell und einfach Ihre persönlichen Daten ändern (z. B. Ihre Adresse und Bankverbindung)."},
525 "address": "https://www.eservice-drv.de/OnlineDiensteWeb/init.do?npa=true",
526 "homepage": "https://www.deutsche-rentenversicherung.de/",
527 "phone": "+49 800 100 048070",
528 "email": "Online-Dienste@deutsche-rentenversicherung.de",
529 "postalAddress": "Ruhrstraße 2<br/>10709 Berlin",
530 "category": "citizen",
531 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
532 "subjectUrls": ["https://www.eservice-drv.de"]
533 },
534 {
535 "exclude": ["ios"],
536 "shortName": {"" : "eAntrag der Investitionsbank Berlin (IBB)"},
537 "longDescription": {"": "Im Kundenportal der Investitionsbank Berlin können Sie verschiedene Förder-Produkte durchgängig elektronisch beantragen:<br/>- Berlin Kapital<br/>- IBB Familienbaudarlehen<br/>- IBB Wohnraum modernisieren<br/>- KMU-Fonds über 25.000 Euro<br/>- Liquiditätshilfen BERLIN<br/>- Mikrokredit aus dem KMU-Fonds<br/>- Pro FIT (Projektvorschlagsphase)<br/>- Pro FIT (Frühphasenfinanzierung)<br/>Für die rechtsverbindliche, fristwahrende Antragstellung der Produkte<br/>- GRW<br/>- Innovationsassistent<br/>- PFI - Gemeinschaft<br/>- PFI - KMU<br/>- PFI - Netzwerk<br/>- ProFIT (Projektantragsphase)<br/>gilt aus verwaltungsrechtlichen Anforderungen das Schriftformerfordernis: Die elektronische Antragstellung ist zwingend nachträglich schriftlich zu bestätigen.<br/>Mit der Online-Ausweisfunktion können Sie sich bequem und sicher elektronisch legitimieren und müssen dadurch Ihre Identität weder per Postident-Verfahren noch persönlich vor Ort nachweisen.<br/>Nach Ihrer Legitimierung können Sie über eine persönliche Dokumentenablage die rechtsverbindliche Kommunikation mit Ihrem IBB-Ansprechpartner online – und unabhängig von Öffnungszeiten oder Postwegen – über das Kundenportal erledigen."},
538 "address": "https://www.ibb.de/de/service/eantrag/eantrag.html",
539 "homepage": "https://www.ibb.de/",
540 "phone": "+49 30 / 2125 - 0",
541 "email": "info@ibb.de",
542 "postalAddress": "Investitionsbank Berlin (IBB)<br/>Bundesallee 210<br/>10719 Berlin",
543 "category": "finance",
544 "tcTokenUrlInfo" : "Registration required.",
545 "subjectUrls": []
546 },
547 {
548 "exclude": ["ios"],
549 "shortName": {"" : "easy Login - Der Zugang für Finanz- & Versicherungsvermittler"},
550 "address": "https://www.easy-login.de",
551 "homepage": "https://www.easy-login.de",
552 "phone": "+49 921 75758-555",
553 "email": "info@easy-login.de",
554 "postalAddress": "easy Login GmbH<br/>Bindlacher Str. 4<br/>95448 Bayreuth",
555 "category": "insurance",
556 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
557 "subjectUrls": ["https://easy-login.vdg-portal.de"]
558 },
559 {
560 "shortName": {"" : "ELSTER"},
561 "longName": {"" : "ELSTER - Die elektronische Steuererklärung"},
562 "shortDescription": {"": "Abwicklung der Steuererklärungen und -anmeldungen über das Internet."},
563 "longDescription": {"": "ELSTER bietet im Rahmen der Registrierung, welche Voraussetzung für die Abwicklung der Steuererklärungen und Steueranmeldungen über das Internet ist, die Möglichkeit der Nutzung der Online-Ausweisfunktion."},
564 "address": "https://www.elster.de",
565 "homepage": "https://www.elster.de",
566 "phone": "+49 89 9991 - 0",
567 "email": "info@elster.de",
568 "postalAddress": "Bayerisches Landesamt für Steuern - Dienststelle München<br/>80284 München",
569 "image": "elster_image.png",
570 "icon": "elster_icon.png",
571 "category": "citizen",
572 "tcTokenUrlInfo" : "Registration required.",
573 "subjectUrls": []
574 },
575 {
576 "shortName": {"" : "Feinstaubplakette beantragen"},
577 "longDescription": {"": "In Berlin können Sie eine Feinstaubplakette für alle Kraftfahrzeuge mit der Online-Ausweisfunktion beantragen. Der Antrag ist unabhängig davon, ob Ihr Fahrzeug in Berlin, bei einer anderen deutschen Zulassungsbehörde, oder im Ausland zugelassen ist.<br/>Ihre persönlichen Daten werden verschlüsselt übertragen. Sie müssen Ihre Angaben nicht per Hand eingeben und die Behörde erhält zuverlässig korrekte Informationen, die rasch weiterverarbeitet werden können.<br/>Auf der Internet-Seite Umweltzonen und Feinstaubplaketten der Senatsverwaltung für Stadtentwicklung und Umwelt können Sie sich vorab informieren, welche Plakette Ihrem Fahrzeug zugeteilt werden kann."},
578 "address": "https://www.berlin.de/labo/fahrzeuge/kfz-zulassung/feinstaubplakette/shop.85047.php",
579 "homepage": "https://www.berlin.de",
580 "phone": "+49 30 90269 – 0",
581 "email": "",
582 "postalAddress": "Direktorin Landesamt für Bürger- und Ordnungsangelegenheiten<br/>Friedrichstr. 219<br/>10958 Berlin",
583 "category": "citizen",
584 "tcTokenUrlInfo" : "Car lizence number required",
585 "subjectUrls": []
586 },
587 {
588 "exclude": ["ios"],
589 "shortName": {"" : "Führungszeugnis und Auskunft aus dem Gewerbezentralregister"},
590 "longDescription": {"": "Sie benötigen ein Führungszeugnis oder eine Auskunft aus dem Gewerbezentralregister? Mit dem Personalausweis im Scheckkartenformat können Sie einen Behördengang sparen. Weitere Voraussetzungen sind die freigeschaltete Online-Ausweisfunktion und ein passender Kartenleser für Ihren Computer. Auf diese Weise kann eindeutig identifiziert werden, wer den Antrag stellt. Ausländische Mitbürger, die keinen deutschen Personalausweis besitzen, können in gleicher Weise die entsprechende Funktion ihres elektronischen Aufenthaltstitels nutzen.<br/>Neben Führungszeugnissen können auch Auskünfte aus dem Gewerbezentralregister über das neue Online-Portal des BfJ beantragt werden. Solche Auskünfte benötigen Unternehmen, die sich in Ausschreibungsverfahren um öffentliche Aufträge bewerben, recht häufig. Auch hier kann das Online-Verfahren den Aufwand erheblich senken."},
591 "address": "https://www.fuehrungszeugnis.bund.de/",
592 "homepage": "https://www.bundesjustizamt.de",
593 "phone": "+49 228 99 410-40",
594 "email": "poststelle@bfj.bund.de",
595 "postalAddress": "Bundesamt für Justiz<br/>53094 Bonn",
596 "category": "citizen",
597 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
598 "subjectUrls": ["https://www.fuehrungszeugnis.bund.de/ffw"]
599 },
600 {
601 "shortName": {"" : "Halterauskunft zu einem KFZ beantragen"},
602 "longDescription": {"": "In Berlin können Sie für Fahrzeuge, die bei der Zulassungsbehörde Berlin registriert sind, mit der Online-Ausweisfunktion eine Halterauskunft beantragen.<br/>Ihre persönlichen Daten werden verschlüsselt übertragen. Sie müssen Ihre Angaben nicht per Hand eingeben und die Behörde erhält zuverlässig korrekte Informationen, die rasch weiterverarbeitet werden können.<br/>Bitte beachten Sie, dass eine Halterauskunft nur erteilt werden kann, wenn diese der Geltendmachung oder Abwehr von Rechtsansprüchen dient, die sich aus der Teilnahme am Straßenverkehr ergeben, oder wenn sie zur Erhebung einer Privatklage aufgrund im Straßenverkehr begangener Verstöße benötigt wird."},
603 "address": "https://www.berlin.de/labo/mobilitaet/kfz-zulassung/halterauskunft/shop.86598.php",
604 "homepage": "https://www.berlin.de",
605 "phone": "+49 30 90269 – 0",
606 "email": "",
607 "postalAddress": "Direktorin Landesamt für Bürger- und Ordnungsangelegenheiten<br/>Friedrichstr. 219<br/>10958 Berlin",
608 "category": "citizen",
609 "tcTokenUrlInfo" : "Car lizence number required.",
610 "subjectUrls": []
611 },
612 {
613 "shortName": {"" : "Hamburg Service Online-Bürgerdienste"},
614 "longName": {"" : "Hamburg Service Online-Bürgerdienste"},
615 "shortDescription": {"": "Digitales Dienstleistungsangebot der Freien und Hansestadt Hamburg (FHH)"},
616 "longDescription": {"": "Digitales Dienstleistungsangebot der Freien und Hansestadt Hamburg (FHH)"},
617 "address": "https://servicekonto.serviceportal.hamburg.de/Servicekonto/Registration/SelectServicekontotype/ShowMenu/",
618 "homepage": "https://serviceportal.hamburg.de",
619 "phone": "+49 40 42823-2420",
620 "email": "dataporthamburggateway-service@dataport.de",
621 "postalAddress": "Freie und Hansestadt Hamburg<br/>Erster Bürgermeister Dr. Peter Tschentscher Rathausmarkt 1<br/>20095 Hamburg",
622 "category": "citizen",
623 "tcTokenUrl": "https://idp.servicekonto.serviceportal.hamburg.de",
624 "subjectUrls": ["https://idp.servicekonto.serviceportal.hamburg.de"],
625 "icon": "hamburg_serviceportal_icon.png"
626 },
627 {
628 "shortName": {"" : "Identitätsprüfungen nach der eIDAS und dem Geldwäschegesetz"},
629 "longDescription": {"": "Die identity Trust Management AG bietet Unternehmen die Möglichkeit, ihre Kunden schnell und sicher mit der Online-Ausweisfunktion zu identifizieren. <br/>Kunden der Kooperationspartner der identity Trust Management AG können die Identitätsprüfung nach dem Signaturgesetz und dem Geldwäschegesetz auch direkt über die Internetseite der identity Trust Management AG vornehmen."},
630 "address": "https://www.identity.tm",
631 "homepage": "https://www.identity.tm",
632 "phone": "+49 211 68 77 3-0",
633 "email": "kontakt@identity.tm",
634 "postalAddress": "identity Trust Management AG<br/>Lierenfelder Straße 51<br/>40231 Düsseldorf",
635 "category": "other",
636 "tcTokenUrlInfo" : "Registration required",
637 "subjectUrls": []
638 },
639 {
640 "exclude": ["ios"],
641 "shortName": {"" : "ID-Safe des Landkreis Ostallgäu"},
642 "longDescription": {"": "Der Landkreis Ostallgäu bietet Ihnen bei verschiedenen Bürgerdiensten die Nutzung der Online-Ausweisfunktion in Verbindung mit elektronischen Antragsformularen an:<br/>- Bauantrag digital<br/>- Sperrmüll-Abholung<br/>- An-, Um- oder Abmeldung einer Abfalltonne<br/>- Antrag auf Dauergenehmigung und Feriengenehmigung für ein Segelboot oder Motorboot auf dem Forggensee<br/>Der Landkreis Ostallgäu bietet Ihnen außerdem einen ID-Safe an. Hier können Sie die Daten aus Ihrer Online-Ausweisfunktion hinterlegen und um weitere Kontaktdaten ergänzen. Anschließend können Sie die elektronischen Antragsformulare des Landkreises automatisch mit Ihren hinterlegten Daten befüllen. Dadurch vermeiden Sie Tippfehler und können die Bearbeitung Ihres Vorgangs beschleunigen.<br/>Darüber hinaus können Sie im Landkreis Ostallgäu über das bayerische Bürgerservice-Portal folgende Bürgerdienste online beantragen:<br/>- Fahrzeug-Anmeldung<br/>- Fahrzeug-Abmeldung<br/>- Feinstaubplakette<br/>- Wunschkennzeichen"},
643 "address": "https://www.sixform.com/ID-safe",
644 "homepage": "https://www.landkreis-ostallgaeu.de/",
645 "phone": "+49 83 42 · 9 11 - 0",
646 "email": "poststelle@lra-oal.bayern.de",
647 "postalAddress": "Landkreis Ostallgäu<br/>Schwabenstraße 11<br/>87616 Marktoberdorf",
648 "category": "citizen",
649 "tcTokenUrlInfo" : "Registration required",
650 "subjectUrls": ["https://www.sixform.com"]
651 },
652 {
653 "shortName": {"" : "Online-Registerauskunft"},
654 "longName": {"" : "Auskunft aus den Zentralen Registern des Kraftfahrt-Bundesamtes"},
655 "shortDescription": {"": "Mit der Anwendung können Privatpersonen eine Auskunft aus dem Fahreignungsregister (Punkteauskunft), aus dem Zentralen Fahrzeugregister (Fahrzeugzulassungen) sowie aus dem Zentralen Fahrerlaubnisregister (Führerschein) des Kraftfahrt-Bundesamtes erhalten. Diese umfasst ausgewählte Daten, die zu der jeweiligen Person gespeichert sind."},
656 "longDescription": {"": "Die Online-Auskunft aus dem Zentralen Fahrzeugregister umfasst Informationen zur Fahrzeugbeschreibung, den Halterdaten, der Haftpflichtversicherung, der letzten Haupt- bzw. Sicherheitsüberprüfung, der Fahrzeughistorie und den zulassungsrechtlich relevanten Ereignissen. Daten von vormaligen Haltern und interne Verwaltungsdaten sind von der Auskunft ausgenommen.<br/>Die Online-Auskunft aus dem Fahreignungsregister umfasst Informationen zu den eingetragenen Verkehrsverstößen, deren Punktbewertung und Löschungsdatum.<br/>Die Online-Auskunft aus dem Zentralen Fahrerlaubnisregister umfasst Informationen zu Fahrerlaubnissen, die seit dem 01.01.1999 erteilt, erweitert oder umgeschrieben wurden. Über die anderen vor dem 01.01.1999 ausgestellten Führerscheine führt nur die jeweils ausstellende Fahrerlaubnisbehörde eine Kartei/Datei."},
657 "address": "https://www.kba-online.de/registerauskunft/app/registeranfrage.html",
658 "homepage": "https://www.kba.de",
659 "phone": "+49 461 316-1717",
660 "email": "Anwenderbetreuung@kba.de",
661 "postalAddress": "Kraftfahrt-Bundesamt<br/>24932 Flensburg",
662 "image": "KraftfahrtBundesamt_image.png",
663 "icon": "KraftfahrtBundesamt_icon.png",
664 "category": "citizen",
665 "tcTokenUrl" : "https://www.kba-online.de:443/registerauskunft/app/eidstart.html;jsessionid=HZFFDC4E848A794D83A1D3032252F3F905?ref=HZFFDC4E848A794D83A1D3032252F3F905",
666 "tcTokenUrlInfo" : "TcToken URL contains dynamic request id but is accepted anyway.",
667 "subjectUrls": ["https://www.kba-online.de/registerauskunft"]
668 },
669 {
670 "shortName": {"" : "Kreis Borken"},
671 "longName": {"" : "Kreis Borken - Kfz-Abmeldung Internet"},
672 "shortDescription": {"": "Authentisierung für internetbasierte Kfz-Abmeldung."},
673 "longDescription": {"": "Für die internetbasierte Kfz-Abmeldung wird die eID-Funktionalität des neuen Personalausweises benötigt."},
674 "address": "https://formulare-extern.de/administrationCenter/Form-Solutions/05554004-0001/eID/eIDMandatory?directlink=https%3A%2F%2Fformulare-extern.de%2Fmetaform%2FForm-Solutions%2Fsid%2Fassistant%2F55dc839be4b054042fb93dba%3FeIDComplete%3Dtrue",
675 "homepage": "https://www.kreis-borken.de",
676 "phone": "+49 2861 / 82 - 2059",
677 "email": "zulassungsstelle@kreis-borken.de",
678 "postalAddress": "Kfz-Zulassungsstelle Borken<br/>Burloer Str. 93<br/>46325 Borken",
679 "image": "KreisBorken_image.png",
680 "icon": "KreisBorken_icon.svg",
681 "category": "citizen",
682 "tcTokenUrlInfo" : "",
683 "subjectUrls": []
684 },
685 {
686 "shortName": {"" : "Kreis Lippe Portal"},
687 "longName": {"" :"Kreis Lippe Portal"},
688 "longDescription": {"": "Mit der Online-Ausweisfunktion können Sie sich am Bürgerportal des Kreises Lippe registrieren, anmelden und den Online-Service 'Elternbeiträge' nutzen. Als Eltern können Sie nach der einmaligen Registrierung<br/><br/> - Ihre Selbsteinschätzung für den Elternbeitrag online einreichen,<br/> - den Bearbeitungsstand nachverfolgen,<br/> - Bescheide elektronisch im Dokumentenbereich empfangen."},
689 "address": "https://portal.kreis-lippe.de",
690 "homepage": "https://portal.kreis-lippe.de",
691 "phone": "+49 5231 - 62-0",
692 "email": "",
693 "postalAddress": "Kreis Lippe<br/>Felix-Fechenbach-Str. 5<br/>32756 Detmold",
694 "category": "citizen",
695 "tcTokenUrlInfo" : "",
696 "subjectUrls": []
697 },
698 {
699 "shortName": {"" : "Login Meine VBL"},
700 "longDescription": {"": "Bei der VBL können Sie sich mit dem Personalausweis am Kundenportal ,Meine VBL' anmelden. Im Kundenkonto können Sie Ihre Vertragsdaten und Ihre persönlichen Daten einsehen und weitere Online-Dienste nutzen, z. B.<br/>- Rentenantrag stellen,<br/>- Beitragserstattung beantragen,<br/>- Kontaktdaten ändern,<br/>- persönliche Mitteilungen von der VBL erhalten."},
701 "address": "https://www.vbl.de/de/meine_vbl",
702 "homepage": "https://www.vbl.de/",
703 "phone": "+49 721 93 98 93 1",
704 "email": "info@vbl.de",
705 "postalAddress": "VBL. Kundenservice<br/>76240 Karlsruhe",
706 "category": "other",
707 "tcTokenUrlInfo" : "Registration required",
708 "subjectUrls": ["https://www.vbl.de"]
709 },
710 {
711 "shortName": {"" : "LVM Versicherung - Kundenportal Meine LVM"},
712 "longDescription": {"": "Mit der Online-Ausweisfunktion im Personalausweis können Sie sich nach der Registrierung durch Ihre LVM-Agentur sicher am Kundenportal ,Meine LVM' anmelden. Ihre Versicherung können Sie nun selbst verwalten und beispielsweise sämtliche Vertragsdaten online einsehen. Darüber hinaus ist es möglich über das Portal Versicherungsbescheinigungen anzufordern sowie schnell und einfach Ihre persönlichen Daten wie Adresse oder Bankverbindung zu ändern."},
713 "address": "https://www.lvm.de/personalausweis",
714 "homepage": "https://www.lvm.de/",
715 "phone": "+49 251 702-0",
716 "email": "info@lvm.de",
717 "postalAddress": "LVM Versicherung<br/>48126 Münster",
718 "category": "insurance",
719 "tcTokenUrlInfo" : "Registration required",
720 "subjectUrls": ["https://www.lvm.de"]
721 },
722 {
723 "exclude": ["ios"],
724 "shortName": {"" : "Mentana-Claimsoft AG - Registrierung beim De-Mail Dienst"},
725 "address": "https://www.fp-demail.de/",
726 "homepage": "https://www.fp-demail.de/",
727 "phone": "+49 800-6368262",
728 "email": "de-mail.info@mentana.de",
729 "postalAddress": "Mentana-Claimsoft GmbH<br/>Trebuser-Str. 47 Haus 1<br/>D-15517 Fürstenwalde",
730 "category": "other",
731 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
732 "subjectUrls": ["https://www.fp-demail.de"]
834 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
835 },
836 {
837 "shortName": {"" : "Rhein-Neckar-Kreis - Kfz-Online"},
838 "longName": {"" :"Rhein-Neckar-Kreis - Kfz-Online"},
839 "longDescription": {"": "Beim Landratsamt Rhein-Neckar-Kreis können Sie sich mit der Online-Ausweisfunktion identifizieren und verschiedene Kfz-Dienstleistungen nutzen:<br/><br/> - ein Neufahrzeug zulassen,<br/> - ein Fahrzeug wiederzulassen oder ummelden,<br/> - ein Fahrzeug abmelden,<br/> - Halterdaten ändern,<br/> - eine Ersatzzulassungsbescheinigung Teil 1 beantragen"},
840 "address": "https://www.rhein-neckar-kreis.de/,Lde/start/service/neuzulassung.html",
841 "homepage": "https://www.rhein-neckar-kreis.de/start.html",
842 "phone": "+49 6221 522 0",
843 "email": "post@rhein-neckar-kreis.de",
844 "postalAddress": "Landratsamt Rhein-Neckar-Kreis<br/>Kurfürsten-Anlage 38 - 40<br/>69115 Heidelberg",
845 "category": "citizen",
846 "subjectUrlInfo": "Using service from Bürgerportal Baden-Württemberg (https://eid.service-bw.de)."
847 },
848 {
849 "exclude": ["ios"],
850 "shortName": {"" : "Rheingau-Taunus-Kreis - KFZ online"},
851 "address": "https://www.rheingau-taunus.de/zulassungsbehoerde/kfz-online-portal.html",
852 "homepage": "https://www.rheingau-taunus.de",
853 "email": "zulassung@rheingau-taunus.de",
854 "postalAddress": "Rheingau-Taunus-Kreis<br/>Zulassung<br/>Heimbacher Straße 7<br/>65307 Bad Schwalbach",
855 "category": "citizen",
856 "subjectUrlInfo": "Using service from ekom21-KGRZ Hessen (https://kfzonline.ekom21.de)."
733857 },
734858 {
735859 "shortName": {"" : "OpenPGP-eID"},
737861 "shortDescription": {"" : "OpenPGP-Schlüssel mit dem Online-Ausweis beglaubigen"},
738862 "longDescription": {"": "Die Beglaubigung Ihres PGP-Schlüssels stellt gegenüber dem Empfänger sicher, dass Sie und kein Dritter der Absender einer Nachricht sind. Ein Dienst i.A. des Bundesamtes für Sicherheit in der Informationstechnik (BSI)."},
739863 "address": "https://pgp.governikus.de",
740 "homepage": "https://www.governikus.de/",
741 "phone": "+49 421 204 95-0",
864 "homepage": "https://www.governikus.de",
865 "phone": "+49 421 204 95 0",
742866 "email": "kontakt@governikus.com",
743867 "postalAddress": "Governikus GmbH & Co. KG<br/>Hochschulring 4<br/>28359 Bremen",
744868 "image": "openpgp_image.jpg",
745869 "icon": "openpgp_icon.svg",
746870 "category": "other",
747 "tcTokenUrl" : "https://pgp.governikus.de/pgp/ausweis-app-2",
748871 "subjectUrls": ["https://pgp.governikus-eid.de"]
749 },
750 {
751 "shortName": {"" : "Rhein-Neckar-Kreis - Kfz-Online"},
752 "longName": {"" :"Rhein-Neckar-Kreis - Kfz-Online"},
753 "longDescription": {"": "Beim Landratsamt Rhein-Neckar-Kreis können Sie sich mit der Online-Ausweisfunktion identifizieren und verschiedene Kfz-Dienstleistungen nutzen:<br/><br/> - ein Neufahrzeug zulassen,<br/> - ein Fahrzeug wiederzulassen oder ummelden,<br/> - ein Fahrzeug abmelden,<br/> - Halterdaten ändern,<br/> - eine Ersatzzulassungsbescheinigung Teil 1 beantragen"},
754 "address": "https://www.rhein-neckar-kreis.de/,Lde/start/service/neuzulassung.html",
755 "homepage": "https://www.rhein-neckar-kreis.de/start.html",
756 "phone": "+49 6221 522-0",
757 "email": "post@rhein-neckar-kreis.de",
758 "postalAddress": "Landratsamt Rhein-Neckar-Kreis<br/>Kurfürsten-Anlage 38 - 40<br/>69115 Heidelberg",
759 "category": "citizen",
760 "tcTokenUrlInfo" : "",
761 "subjectUrls": []
762872 },
763873 {
764874 "shortName": {"" : "Selbstauskunft - \"Meine Daten einsehen\""},
765875 "longDescription": {"": "Die AusweisApp2 verfügt über die Funktion \"Meine Daten einsehen\". Mit dieser Funktion können die auf dem Personalausweis bzw. dem elektronischen Aufenthaltstitel gespeicherten Daten ausgelesen und angezeigt werden. Hierbei sprechen wir auch von einer sogenannten Selbstauskunft.<br/><br/>Sobald Sie die AusweisApp2 gestartet und ein geeigneter Kartenleser installiert bzw. ein Android-Smartphone verbunden haben, können Sie diese Funktion unter dem Menüpunkt \"Ausweisen\" aufrufen. (Auf Mobilgeräten finden Sie die Ausweis-Auskunft übrigens auch direkt auf der Startseite sowie im Menüeintrag \"Ausweisen\".)<br/><br/>Nach Ihrer PIN-Eingabe und erfolgreicher Datenübertragung werden die Daten in der AusweisApp2 dargestellt.<br/><br/>Bei der Selbstauskunft handelt es sich um einen reinen Demonstrationsdienst. Die ausgelesenen Daten werden lediglich zur Anzeige gebracht und nicht weitergegeben.<br/><br/>Bitte beachten Sie, dass Sie auch für diesen Vorgang eine Internetverbindung benötigen. Dies hat folgenden Hintergrund: Der Zugriff auf die Daten des Personalausweises bzw. des elektronischen Aufenthaltstitels ist nur möglich, wenn derjenige, der auf die Daten zugreifen möchte sich selbst zunächst eindeutig identifiziert. Dies geschieht über das sog. Berechtigungszertifikat. Es wird Ihnen immer angezeigt, wer auf Ihre Daten zugreifen möchte. Die Erlaubnis, ein Berechtigungszertifikat zu erhalten, wird einen Anbieter auf Antrag und nach Prüfung bei der Vergabestelle für Berechtigungszertifikate beim Bundesverwaltungsamt erteilt. Um das technische Berechtigungszertifikat anzuzeigen und darüber hinaus eine Gültigkeitsprüfung des Ausweisdokuments durchführen zu können, ist eine Internetverbindung zwingend erforderlich. Aus diesem Grund spricht man auch von der Online-Ausweisfunktion."},
766 "address": "https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen/",
767 "homepage": "https://www.ausweisapp.bund.de/",
768 "phone": "+49 421 - 204 95 995",
876 "address": "https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen",
877 "homepage": "https://www.ausweisapp.bund.de",
878 "phone": "+49 421 204 95 995",
769879 "email": "support@ausweisapp.de",
770880 "postalAddress": "Governikus GmbH & Co. KG<br/>- im Auftrag des Bundesamtes für Sicherheit in der Informationstechnik -<br/>Hochschulring 4<br/>D-28359 Bremen",
771881 "image": "selbstauskunft_image.jpg",
772882 "icon": "selbstauskunft_icon.svg",
773883 "category": "citizen",
774 "tcTokenUrlInfo" : "https://www.autentapp.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml",
775884 "subjectUrls": ["https://www.autentapp.de"]
776 },
777 {
778 "shortName": {"" : "Servicekonto Nordrhein-Westfalen"},
779 "longName": {"" :"Servicekonto Nordrhein-Westfalen"},
780 "longDescription": {"": "Einmal online registrieren und dann die gespeicherten Daten vielfach nutzen: Dies ist die Idee des Servicekonto.NRW.<br/>Als Bürgerinnen und Bürger können Sie Ihre einmal erfassten Daten in allen angeschlossenen Portalen und Online-Angeboten in Nordrhein-Westfalen nutzen: Dazu gehören Online-Angebote von Städten, Gemeinden und Kreisen genauso wie die von Ministerien und Behörden der Landesverwaltung NRW.<br/>Um das Servicekonto.NRW zu nutzen, müssen Sie sich einmal registrieren und Ihre Daten erfassen.<br/>Mit der Online-Ausweisfunktion können Sie Ihre Daten einfach elektronisch in das Servicekonto.NRW übertragen und sofort alle Funktionen nutzen. Bei manueller Eingabe der Daten stehen Ihnen unter Umständen nicht alle Funktionen zur Verfügung."},
781 "address": "https://servicekonto.nrw/serviceaccount/",
782 "homepage": "https://servicekonto.nrw/serviceaccount/",
783 "phone": "",
784 "email": "servicekonto@kdn.de",
785 "postalAddress": "KDN – Dachverband kommunaler IT-Dienstleister<br/>Enggasse 2<br/>D-50668 Köln",
786 "category": "citizen",
787 "tcTokenUrlInfo" : "",
788 "subjectUrls": []
789885 },
790886 {
791887 "exclude": ["ios"],
794890 "shortDescription": {"": "Das Service-Portal bietet Online-Dienste rund um die KFZ-Zulassung."},
795891 "longDescription": {"": "Im Service-Portal \"Auto\" können Sie Ihr Auto online abmelden. Weitere Angebote wie die komplette online KFZ-Wiederzulassung und -Zulassung sind im Aufbau."},
796892 "address": "https://www.buergerserviceportal.nrw/krz/lkrlippe",
797 "homepage": "https://www.kreis-lippe.de/",
798 "phone": "+49 5231/62-0",
893 "homepage": "https://www.kreis-lippe.de",
894 "phone": "+49 5231 62 0",
799895 "email": "stva@kreis-lippe.de",
800896 "postalAddress": "Kreis Lippe<br/>Felix-Fechenbach-Straße 5<br/>32756 Detmold",
801897 "image": "KreisLippe_image.jpg",
802898 "icon": "KreisLippe_icon.png",
803899 "category": "citizen",
804 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
805 "subjectUrls": ["https://www.buergerserviceportal.nrw"]
900 "subjectUrlInfo": "Using service from Bürgerservice-Portal Krz (https://www.buergerserviceportal.nrw)."
901 },
902 {
903 "shortName": {"" : "Service-Portal Berlin"},
904 "address": "https://service.berlin.de/onlineverfahren-onlinedienstleistungen",
905 "homepage": "https://www.berlin.de/labo",
906 "phone": "+49 30 90269 0",
907 "email": "kundenservice@berlin.de",
908 "postalAddress": "BerlinOnline Stadtportal GmbH & Co. KG<br/>Alte Jakobstraße 105<br/>10969 Berlin",
909 "category": "citizen",
910 "subjectUrls": ["https://eid-prod.connect.verwalt-berlin.de"]
911 },
912 {
913 "shortName": {"" : "Servicekonto Nordrhein-Westfalen"},
914 "longName": {"" :"Servicekonto Nordrhein-Westfalen"},
915 "longDescription": {"": "Einmal online registrieren und dann die gespeicherten Daten vielfach nutzen: Dies ist die Idee des Servicekonto.NRW.<br/>Als Bürgerinnen und Bürger können Sie Ihre einmal erfassten Daten in allen angeschlossenen Portalen und Online-Angeboten in Nordrhein-Westfalen nutzen: Dazu gehören Online-Angebote von Städten, Gemeinden und Kreisen genauso wie die von Ministerien und Behörden der Landesverwaltung NRW.<br/>Um das Servicekonto.NRW zu nutzen, müssen Sie sich einmal registrieren und Ihre Daten erfassen.<br/>Mit der Online-Ausweisfunktion können Sie Ihre Daten einfach elektronisch in das Servicekonto.NRW übertragen und sofort alle Funktionen nutzen. Bei manueller Eingabe der Daten stehen Ihnen unter Umständen nicht alle Funktionen zur Verfügung."},
916 "address": "https://www.servicekonto.nrw",
917 "homepage": "https://www.land.nrw",
918 "email": "servicekonto@kdn.de",
919 "postalAddress": "KDN – Dachverband kommunaler IT-Dienstleister<br/>Enggasse 2<br/>D-50668 Köln",
920 "category": "citizen",
921 "subjectUrls": ["https://servicekonto.nrw"]
806922 },
807923 {
808924 "shortName": {"" : "Serviceportal des Ennepe-Ruhr-Kreises"},
809925 "longName": {"" : "Serviceportal des Ennepe-Ruhr-Kreises"},
810926 "longDescription": {"": "Herzlich willkommen auf der Startseite des Service-Portals des Ennepe-Ruhr-Kreises.<br/>Über dieses Serviceportal haben Sie rund um die Uhr online Zugriff auf Dienstleistungen des Kreises, des Landes und der Bundesbehörden. Ihr Vorteil: Das Angebot ist immer und überall abrufbar."},
811 "address": "https://portal.enkreis.de/",
927 "address": "https://portal.enkreis.de",
812928 "homepage": "https://www.en-kreis.de",
813929 "phone": "+49 2336 930",
814930 "email": "serviceportal@en-kreis.de",
815931 "postalAddress": "Ennepe-Ruhr-Kreis<br/>Hauptstr. 92<br/>58332 Schwelm",
816932 "category": "citizen",
817933 "icon": "ennepe_icon.png",
818 "subjectUrls": []
934 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
935 },
936 {
937 "shortName": {"" : "Serviceportal Kreis Gütersloh"},
938 "longDescription": {"": "Bei der Kreisverwaltung Gütersloh können Sie viele Dienste mit Hilfe des Servicekonto NRW online erledigen. Einmal angemeldet, ist es Ihr Schlüssel zu unseren Online-Dienstleistungen. Erledigen Sie Ihre Verwaltungsangelegenheiten ganz bequem von Zuhause aus."},
939 "address": "https://service.kreis-guetersloh.de",
940 "homepage": "https://www.kreis-guetersloh.de",
941 "phone": "+49 5241 85 0",
942 "email": "kreisverwaltung@kreis-guetersloh.de",
943 "postalAddress": "Kreisverwaltung Gütersloh<br/>Herzebrocker Str. 140<br/>33334 Gütersloh",
944 "category": "citizen",
945 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
946 },
947 {
948 "exclude": ["ios"],
949 "shortName": {"" : "Serviceportal Sachsen-Anhalt"},
950 "address": "https://serviceportal.sachsen-anhalt.de",
951 "homepage": "https://serviceportal.sachsen-anhalt.de",
952 "category": "citizen",
953 "subjectUrls": ["https://st.buergerserviceportal.de", "https://bk.sachsen-anhalt-connect.de"]
954 },
955 {
956 "shortName": {"" : "sign-me"},
957 "longName": {"" : "sign-me - Dokumente online unterschreiben"},
958 "shortDescription": {"": "sign-me ermöglicht die Nutzung aller Signaturniveaus der eIDAS-Verordnung – von der einfachen über die fortgeschrittene bis hin zur qualifizierten Online-Unterschrift. Letztere erfüllt das Schriftformerfordernis und ist in der Rechtswirkung der handschriftlichen Unterschrift gleichgestellt."},
959 "longDescription": {"": "Mit sign-me, dem digitalen Service für Ihre sichere Online-Unterschrift, wickeln Sie Ihre papierbasierten Unterschriftsprozesse durchgängig elektronisch ab. Ob Sie europaweit Dokumente austauschen, Transaktionen absichern oder Verträge unterschreiben wollen – mit dem digitalen Signaturservice ist dies möglich: online, komfortabel und rechtsverbindlich. Mit sign-me senken Sie Kosten, optimieren Workflows, verringern Abbruchraten bei Vertragsabschlüssen und verbessern die Kundenzufriedenheit. sign-me ermöglicht die Nutzung aller Signaturniveaus der eIDAS-Verordnung – von der einfachen über die fortgeschrittene bis hin zur qualifizierten Online-Unterschrift. Letztere erfüllt das Schriftformerfordernis und ist in der Rechtswirkung der handschriftlichen Unterschrift gleichgestellt."},
960 "address": "https://cloud.sign-me.de/signature/start",
961 "homepage": "https://www.bundesdruckerei.de/de/loesungen/sign-me",
962 "image": "SignMe_image.jpg",
963 "icon": "SignMe_icon.png",
964 "phone": "+49 30 25980",
965 "email": "vertrieb@d-trust.net",
966 "postalAddress": "Bundesdruckerei GmbH<br/>Kommandantenstraße 18<br/>10969 Berlin",
967 "category": "other",
968 "subjectUrlInfo": "Using service from AusweisIDent (https://ausweisident.eid-service.de)."
819969 },
820970 {
821971 "shortName": {"" : "SkIDentity Service"},
827977 "email": "detlef.huehnlein@ecsec.de",
828978 "postalAddress": "ecsec GmbH<br/>Sudetenstraße 16<br/>96247 Michelau",
829979 "category": "other",
830 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
831 "subjectUrls": []
980 "subjectUrls": ["https://service.skidentity.de"]
981 },
982 {
983 "shortName": {"" : "Stadt Kassel"},
984 "longName": {"": "Stadt Kassel Online-Services"},
985 "shortDescription": {"": "Mit Hilfe unserer Online-Services lassen sich einige Behördengänge erleichtern, vorbereiten und oftmals vermeiden."},
986 "address": "https://www.kassel.de/service/media/online-services.php",
987 "homepage": "https://www.kassel.de",
988 "phone": "+49 0561 115",
989 "email": "servicecenter@kassel.de",
990 "postalAddress": "Stadt Kassel<br/>Obere Königsstraße 8<br/>34117 Kassel",
991 "image": "kassel_image.png",
992 "icon": "kassel_icon.png",
993 "category": "citizen",
994 "subjectUrlInfo": "Using service from ekom21-KGRZ Hessen (https://kfzonline.ekom21.de)."
832995 },
833996 {
834997 "shortName": {"" : "Stadt Nürnberg: Online-Bürgerdienste Service"},
835998 "longDescription": {"": "Die Stadt Nürnberg bietet Ihnen mit ihrem Bürgerserviceportal ,Mein.Nürnberg' erstmals die Möglichkeit, Ihre Verwaltungsangelegenheiten komplett elektronisch abzuwickeln – von der Antragstellung bis zur Rückmeldung der Bescheide oder Schriftstücke in Ihren persönlichen Bereich auf dem Portal. Alle Online-Dienste der Stadt Nürnberg wurden zudem für die Nutzung mit mobilen Endgeräten optimiert.<br/>Bei immer mehr Verfahren akzeptiert die Stadtverwaltung einen Unterschriftersatz durch die Online-Ausweisfunktion.<br/>Jeder Online-Dienst der Stadt Nürnberg, der die Online-Ausweisfunktion nutzt, ist an dem Hinweis \"mit eID\" erkennbar. Derzeit sind dies z. B.:<br/>- Aufenthaltstitel beantragen<br/>- Gaststättenrechtliche Erlaubnis für den Ausschank von Alkohol beantragen<br/>- Hunde – Negativzeugnis für Kampfhunde beantragen<br/>- Kfz-Halterauskunft beantragen<br/>- Melderegister – Widerspruch gegen Datenübermittlung<br/>- Veranstaltung, Messe, Markt beantragen"},
836999 "address": "https://www.nuernberg.de/internet/onlinedienste",
837 "homepage": "https://www.nuernberg.de/",
838 "phone": "+49 9 11 / 2 31-8613",
1000 "homepage": "https://www.nuernberg.de",
1001 "phone": "+49 9 11 2 31 8613",
8391002 "email": "poststelle@stadt.nuernberg.de",
8401003 "postalAddress": "Amt für Organisation, Informationsverarbeitung und Zentrale Dienste<br/>E-Government-Büro<br/>Rathausplatz 2<br/>III. OG<br/>90403 Nürnberg",
8411004 "category": "citizen",
842 "tcTokenUrlInfo" : "Registration required",
8431005 "subjectUrls": ["https://meinkonto.nuernberg.de"]
1006 },
1007 {
1008 "exclude": ["ios"],
1009 "shortName": {"" : "Straßenverkehrsamt Saalekreis"},
1010 "longDescription": {"": "Die Reservierung eines Wunschkennzeichens, Terminangelegenheiten oder alles rund um den Führerschein - das Straßenverkehrsamt bietet Ihnen verschiedene Möglichkeiten der Online-Nutzung."},
1011 "address": "https://www.saalekreis.de/de/online-angebote-stva.html",
1012 "homepage": "https://www.saalekreis.de",
1013 "phone": "+49 3461 40 1022",
1014 "email": "internetredaktion@saalekreis.de",
1015 "postalAddress": "Landkreis Saalekreis<br/>Domplatz 9<br/>06217 Merseburg",
1016 "category": "citizen",
1017 "subjectUrlInfo": "Using service from Serviceportal Sachsen-Anhalt (https://st.buergerserviceportal.de)."
1018 },
1019 {
1020 "exclude": ["ios"],
1021 "shortName": {"" : "T-Systems DeMail für Großkunden"},
1022 "address": "https://www.t-systems.de/de-mail",
1023 "homepage": "https://www.t-systems.de",
1024 "phone": "+49 69 20060 0",
1025 "email": "de-mail@t-systems.com",
1026 "postalAddress": "T-Systems International GmbH<br/>Hahnstraße 43d<br/>60528 Frankfurt am Main",
1027 "category": "other",
1028 "subjectUrls": ["https://www.de-mail.t-systems.de"]
8441029 },
8451030 {
8461031 "exclude": ["ios"],
8471032 "shortName": {"" : "Telekom DeMail"},
8481033 "longName": {"" : "Telekom DeMail für Privat- und Geschäftskunden"},
8491034 "address": "https://www.telekom.de/de-mail",
850 "homepage": "https://www.telekom.de/",
1035 "homepage": "https://www.telekom.de",
8511036 "phone": "+49 800 33 01000",
852 "email": "",
8531037 "postalAddress": "Telekom Deutschland GmbH<br/>Landgrabenweg 151<br/>53227 Bonn",
8541038 "category": "other",
855 "tcTokenUrlInfo" : "Registration required",
8561039 "subjectUrls": ["https://www.de-mail.t-online.de"]
857 },
858 {
859 "exclude": ["ios"],
860 "shortName": {"" : "T-Systems DeMail für Großkunden"},
861 "address": "https://www.t-systems.de/de-mail",
862 "homepage": "https://www.t-systems.de/",
863 "phone": "+49 69 20060 - 0",
864 "email": "de-mail@t-systems.com",
865 "postalAddress": "T-Systems International GmbH<br/>Hahnstraße 43d<br/>60528 Frankfurt am Main",
866 "category": "other",
867 "tcTokenUrlInfo" : "Registration required",
868 "subjectUrls": ["https://www.de-mail.t-systems.de"]
8691040 },
8701041 {
8711042 "exclude": ["ios"],
8721043 "shortName": {"" : "Urkundenservice Köln"},
8731044 "longDescription": {"": "Bei der Stadt Köln können Sie mit der Online-Ausweisfunktion folgende Urkunden beantragen:<br/>- Geburtsurkunden<br/>- Eheurkunden<br/>- Lebenspartnerschaftsurkunden<br/>- Sterbeurkunden<br/>Dabei werden die Adressatenangaben in den Online-Formularen automatisch befüllt."},
8741045 "address": "https://www.stadt-koeln.de/service/produkt/urkundenservice-des-standesamtes",
875 "homepage": "https://www.stadt-koeln.de/",
876 "phone": "+49 221 / 221-26530",
1046 "homepage": "https://www.stadt-koeln.de",
1047 "phone": "+49 221 221 26530",
8771048 "email": "standesamt@stadt-koeln.de",
8781049 "postalAddress": "Gülichplatz 1-3<br/>50667 Köln",
8791050 "category": "citizen",
880 "tcTokenUrl" : "https://ea.stadt-koeln.de/Gastzugang/EIDServiceProvider/Request.ashx?appID=7",
8811051 "subjectUrls": ["https://ea.stadt-koeln.de"]
8821052 },
8831053 {
8841054 "exclude": ["ios"],
8851055 "shortName": {"" : "Virtuelles Rathaus Stadt Dortmund"},
8861056 "longDescription": {"": "Sie wollen städtische Dienstleistungen in Anspruch nehmen, sich zunächst nur informieren oder Sie suchen bereits ein bestimmtes Formular?<br/>Wir haben für Sie ein umfassendes Informationsangebot über Produkte und Leistungen (Services) der Stadt Dortmund gegliedert nach Themen und der Behördenstruktur bereitgestellt."},
887 "address": "https://rathaus.dortmund.de/",
888 "homepage": "https://rathaus.dortmund.de/",
889 "phone": "+49 231 / 50-25650",
1057 "address": "https://rathaus.dortmund.de",
1058 "homepage": "https://rathaus.dortmund.de",
1059 "phone": "+49 231 50 25650",
8901060 "email": "domap-feedback@stadtdo.de",
8911061 "postalAddress": "Stadt Dortmund<br/>Dortmunder Systemhaus<br/>Deggingstraße 42<br/>44122 Dortmund",
8921062 "category": "citizen",
893 "tcTokenUrlInfo" : "TcToken URL requires valid dynamic request id.",
894 "subjectUrls": ["https://rathaus.dortmund.de"]
1063 "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)."
8951064 },
8961065 {
8971066 "exclude": ["ios"],
8981067 "shortName": {"" : "Vollstreckungsportal"},
8991068 "longDescription": {"": "Herzlich willkommen auf dem Gemeinsamen Vollstreckungsportal der Länder."},
9001069 "address": "https://www.vollstreckungsportal.de/auskunft/priv/anmelden.jsf?type=npa",
901 "homepage": "https://www.vollstreckungsportal.de/",
902 "phone": "",
1070 "homepage": "https://www.vollstreckungsportal.de",
9031071 "email": "bundesportal@ag-hagen.nrw.de",
9041072 "postalAddress": "Land Nordrhein-Westfalen<br/>vertreten durch das Justizministerium<br/>Martin-Luther-Platz 40<br/>40212 Düsseldorf",
9051073 "category": "citizen",
906 "tcTokenUrlInfo" : "Registration required.",
9071074 "subjectUrls": ["https://www.vollstreckungsportal.de"]
908 },
909 {
910 "shortName": {"" : "Service-Portal Hochsauerlandkreis"},
911 "longName": {"": "Antragstellung an die Kreisverwaltung im Hochsauerlandkreis"},
912 "shortDescription": {"": "Übersicht über die verschiedenen Online-Anträge"},
913 "longDescription": {"": "Stellen Sie hier Ihre Anträge an die Kreisverwaltung. Das Angebot wird laufend erweitert."},
914 "address": "https://portal.citkomm.de/hsk/services",
915 "homepage": "https://portal.citkomm.de/hsk/services",
916 "phone": "+49 291 / 94-0",
917 "email": "post@hochsauerlandkreis.de",
918 "postalAddress": "Steinstraße 27<br/>59872 Meschede",
919 "image": "HSK_image.jpg",
920 "icon": "HSK_icon.png",
921 "category": "citizen",
922 "subjectUrls": []
9231075 }
9241076 ]
9251077 }
118118 "URL": "https://www.reiner-sct.com/support/support-anfrage/?os=Windows&productGroup=77304735&product=77304856&q=driver#choice5"
119119 },
120120 {
121 "Platforms": [{"os": "mac", "max": "10.14"}],
121 "Platforms": [{"os": "mac"}],
122122 "URL": "https://www.reiner-sct.com/support/support-anfrage/?os=MacOS&productGroup=77304735&product=77304856&q=driver#choice5"
123123 },
124124 {
140140 "VendorId": "0x0C4B",
141141 "ProductId": "0x0505",
142142 "Name": "REINER SCT cyberJack wave",
143 "Pattern": "REINER SCT cyberJack wave",
143 "Pattern": "REINER SCT cyberJack wave( USB 1)?$",
144144 "Icon": "img_cyberjack_wave.png",
145145 "IconWithNPA": "img_cyberjack_wave_mit_ausweis.png",
146146 "Drivers":
161161 "Information":
162162 [
163163 {
164 "Platforms":[{"os": "mac"}],
164 "Platforms":[{"os": "win"}, {"os": "mac"}],
165165 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
166166 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
167167 }
178178 "Drivers":
179179 [
180180 {
181 "Platforms": [{"os": "win"}],
181 "Platforms": [{"os": "win"}, {"os": "mac", "max": "10.14"}],
182182 "URL": "https://security.kobil.de/idtoken/"
183 }
184 ],
185 "Information":
186 [
187 {
188 "Platforms":[{"os": "win"}],
189 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
190 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
191 },
192 {
193 "Platforms":[{"os": "mac", "max": "10.14"}],
194 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber.",
195 "EN": "The card reader is compatible with the installed system driver."
183196 }
184197 ]
185198 },
188201 "VendorId": "0x04E6",
189202 "ProductId": "0x512B",
190203 "Name": "SDI011 Contactless Reader",
191 "Pattern": "SDI011 Contactless Reader|SDI011 USB Smart Card Reader(\\(1\\)|\\(2\\))",
204 "Pattern": "(SCM Microsystems Inc. SDI011G (Contactless| Smart Card) Reader 0)|(SDI011 (USB Smart Card|Contactless) Reader(\\(1\\)|\\(2\\))?)",
192205 "Icon": "img_Identive_SDI011.png",
193206 "IconWithNPA": "img_Identive_SDI011_mit_ausweis.png",
194207 "Drivers":
195208 [
196209 {
197 "Platforms": [{"os": "win"}],
198 "URL": "http://www.scm-pc-card.de/index.php?page=download&function=show_downloads&lang=de&product_id=738"
199 },
200 {
201 "Platforms": [{"os": "mac", "min":"10.13", "max":"10.14"}, {"os": "unknown"}],
210 "Platforms": [{"os": "win"}, {"os": "mac"}, {"os": "unknown"}],
202211 "URL": "https://support.identiv.com/sdi010-011/"
203212 }
204213 ],
205214 "Information":
206215 [
207216 {
208 "Platforms": [{"os": "win", "max": "6.1"}],
209 "DE": "Bitte beachten Sie, dass der Kartenleser nur mit der SDI011-generic-version funktioniert. Nach der Installation ist ein Neustart erforderlich.",
210 "EN": "Please note that the card reader only works with the SDI011-generic-version. A reboot is required after the installation of the driver."
211 },
212 {
213 "Platforms":[{"os": "win", "min": "6.2"}],
214 "DE": "Bitte beachten Sie, dass der Kartenleser nur mit der SDI011-nPA-version funktioniert. Nach der Installation ist ein Neustart erforderlich.",
215 "EN": "Please note that the card reader only works with the SDI011-nPA-version. A reboot is required after the installation of the driver."
216 },
217 {
218 "Platforms": [{"os": "mac"}],
219 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
220 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
217 "Platforms": [{"os": "win", "max": "6.3"}, {"os": "mac"}],
218 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.",
219 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver."
220 },
221 {
222 "Platforms":[{"os": "win", "min": "10.0"}],
223 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
224 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
221225 }
222226 ]
223227 },
232236 "Drivers":
233237 [
234238 {
235 "Platforms": [{"os": "win"}, {"os": "mac"}],
236 "URL": "https://www.scm-pc-card.de/index.php?lang=de&page=download&function=show_downloads&product_id=630"
237 },
238 {
239 "Platforms": [{"os": "unknown"}],
240 "URL": "https://support.identiv.com/scl010-scl011/"
241 }
242 ],
243 "Information":
244 [
245 {
246 "Platforms": [{"os": "win"}],
247 "DE": "Der Kartenleser funktioniert nur mit der SCL011-nPA-version. Nach der Installation ist ein Neustart erforderlich.",
248 "EN": "The card reader works only with the SCL011-nPA-version. A reboot is required after the installation of the driver."
249 },
250 {
251 "Platforms": [{"os": "mac"}],
252 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
253 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
254 }
255 ],
256 "Internal information": "Unter macOS funktioniert nur NFC A. Reader wird als unterstützt markiert, da zertifiziert."
239 "Platforms": [{"os": "win"}, {"os": "unknown"}],
240 "URL": "https://www.scm-pc-card.de/kartenleser/npa/65/scm-scl010-usb-multiprotokoll-smartcard-reader-rfid/nfc-leser/905155?c=7"
241 }
242 ],
243 "Information":
244 [
245 {
246 "Platforms": [{"os": "win"}],
247 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber",
248 "EN": "The card reader operates with the driver automatically installed by the system."
249 }
250 ],
251 "Internal information": "Unter macOS funktioniert der Kartenleser nicht mehr. Leider ist kein Treiber vom Hersteller verfügbar."
257252 },
258253
259254 {
269264 "Platforms": [{"os": "win"}, {"os": "mac"}, {"os": "unknown"}],
270265 "URL": "https://support.identiv.com/3700f/"
271266 }
267 ],
268 "Information":
269 [
270 {
271 "Platforms": [{"os": "win"}, {"os": "mac"}],
272 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber.",
273 "EN": "The card reader operates with the driver automatically installed by the system."
274 }
272275 ]
273276 },
274277
276279 "VendorId": "0x04E6",
277280 "ProductId": "0x5591",
278281 "Name": "Identiv SCL3711",
279 "Pattern": "(SCM Microsystems SCL3711 reader & NFC device 0|SCL3711 reader and NFC device)",
282 "Pattern": "(SCM Microsystems SCL3711 reader & NFC device 0|SCL3711 Reader and NFC device)",
280283 "Icon": "img_Identive_SCL3711.png",
281284 "IconWithNPA": "img_Identive_SCL3711_mit_ausweis.png",
282285 "Drivers":
292295 "Platforms": [{"os": "win"}],
293296 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
294297 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
298 },
299 {
300 "Platforms": [{"os": "mac", "max": "10.12"}, {"os": "mac", "min": "10.14"}],
301 "DE":"Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
302 "EN":"The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
295303 }
296304 ]
297305 },
313321 "Information":
314322 [
315323 {
316 "Platforms": [{"os": "win"}, {"os": "mac"}],
324 "Platforms": [{"os": "win"}],
317325 "DE":"Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
318326 "EN":"The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
327 },
328 {
329 "Platforms": [{"os": "mac"}],
330 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
331 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
319332 }
320333 ]
321334 },
337350 "Information":
338351 [
339352 {
340 "Platforms": [{"os": "win"}, {"os": "mac"}],
353 "Platforms": [{"os": "win"}],
341354 "DE":"Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
342355 "EN":"The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
356 },
357 {
358 "Platforms": [{"os": "mac"}],
359 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
360 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
343361 }
344362 ]
345363 },
377395 "VendorId": "0x072F",
378396 "ProductId": "0x223B",
379397 "Name": "ACS ACR1252U",
380 "Pattern": "ACS ACR1252 1S CL Reader PICC 0|ACS ACR1252 Dual Reader\\(2\\)",
398 "Pattern": "ACS ACR1252 (1S CL|Dual)? Reader PICC 0|ACS ACR1252 Dual Reader\\(2\\)",
381399 "Icon": "img_ACS_ACR1252U.png",
382400 "IconWithNPA": "img_ACS_ACR1252U_mit_ausweis.png",
383401 "Drivers":
390408 "Information":
391409 [
392410 {
393 "Platforms": [{"os": "win"}],
411 "Platforms": [{"os": "win"}, {"os": "mac"}],
394412 "DE":"Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
395413 "EN":"The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
396 },
397 {
398 "Platforms": [{"os": "mac"}],
399 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
400 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
401 }
402
403 ]
414 }
415 ],
416 "Internal information": "Unter macOS funktioniert nur NFC A. Reader wird als unterstützt markiert, da zertifiziert."
404417 },
405418
406419 {
413426 "Drivers":
414427 [
415428 {
416 "Platforms": [{"os": "win"}, {"os": "unknown"}],
429 "Platforms": [{"os": "win"}, {"os": "mac"}, {"os": "unknown"}],
417430 "URL": "https://www.hidglobal.de/drivers"
418431 }
419432 ],
423436 "Platforms":[{"os": "win"}],
424437 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Beachten Sie bei der Auswahl, dass nur der \"X-CHIP WINDOWS BU & RU driver\" funktioniert.",
425438 "EN": "It is necessary to install the drivers from the manufacturer. Please note that only the driver named \"X-CHIP WINDOWS BU & RU driver\" works with this card reader."
439 },
440 { "Platforms":[{"os": "mac"}],
441 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
442 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
426443 }
427444 ]
428445 },
431448 "VendorId": "0x076B",
432449 "ProductId": "0x5022",
433450 "Name": "OMNIKEY 5022-CL",
434 "Pattern": "HID Global OMNIKEY 5022 Smart Card Reader 0|HID Global OMNIKEY 5022 Smart Card Reader",
451 "Pattern": "HID Global OMNIKEY 5022 Smart Card Reader( 0)?$",
435452 "Icon": "img_HID_Omnikey_Mobile_Reader_502X_CL.png",
436453 "IconWithNPA": "img_HID_Omnikey_Mobile_Reader_502X_CL_mit_ausweis.png",
437454 "Drivers":
438455 [
439456 {
440 "Platforms": [{"os": "win"}, {"os": "mac", "min": "10.12"}],
457 "Platforms": [{"os": "win"}, {"os": "mac"}],
441458 "URL": "https://www.hidglobal.de/drivers"
442459 }
443460 ],
449466 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
450467 },
451468 {
452 "Platforms":[{"os": "mac", "min": "10.12"}],
469 "Platforms":[{"os": "mac"}],
453470 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber.",
454471 "EN": "The card reader is compatible with the installed system driver."
455472 }
466483 "Drivers":
467484 [
468485 {
469 "Platforms": [{"os": "win"}],
486 "Platforms": [{"os": "win"}, {"os": "mac"}],
470487 "URL": "https://www.hidglobal.de/drivers"
471488 }
472489 ],
473490 "Information":
474491 [
475492 {
476 "Platforms":[{"os": "win"}],
493 "Platforms":[{"os": "win"}, {"os": "mac"}],
477494 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
478495 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
479496 }
490507 "Drivers":
491508 [
492509 {
493 "Platforms": [{"os": "win"}, {"os": "unknown"}],
510 "Platforms": [{"os": "win"}, {"os": "mac"}, {"os": "unknown"}],
494511 "URL": "https://www.hidglobal.com/drivers"
495512 }
496513 ],
500517 "Platforms":[{"os": "win"}],
501518 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Beachten Sie bei der Auswahl, dass nur der \"X-CHIP WINDOWS BU & RU driver\" funktioniert.",
502519 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. Please note that only the driver named \"X-CHIP WINDOWS BU & RU driver\" works with this card reader."
520 },
521 {
522 "Platforms":[{"os": "mac"}],
523 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.",
524 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
503525 }
504526 ]
505527 },
514536 "Drivers":
515537 [
516538 {
517 "Platforms": [{"os": "win"}],
539 "Platforms": [{"os": "win"}, {"os": "mac"}],
518540 "URL": "https://www.hidglobal.com/drivers"
519541 }
520542 ],
524546 "Platforms": [{"os": "win"}],
525547 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
526548 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
549 },
550 {
551 "Platforms":[{"os": "mac", "min": "10.13"}],
552 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Es ist kein Treiber vom Hersteller vorhanden.",
553 "EN": "The card reader is compatible with the installed system driver. There is no driver from the manufacturer."
527554 }
528555 ]
529556 },
635662 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
636663 },
637664 {
638 "Platforms": [{"os": "mac", "max":"10.13"}],
639 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
640 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
665 "Platforms": [{"os": "mac"}],
666 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Der Treiber für macOS 10.13 funktioniert für macOS 10.14 und macOS 10.15.",
667 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. The driver for macOS 10.13 works for macOS 10.14 and macOS 10.15."
641668 }
642669 ]
643670 },
664691 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system."
665692 },
666693 {
667 "Platforms": [{"os": "mac", "max": "10.14"}],
668 "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.",
669 "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required."
694 "Platforms": [{"os": "mac"}],
695 "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Der Treiber für macOS 10.13 funktioniert für macOS 10.14 und macOS 10.15.",
696 "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. The driver for macOS 10.13 works for macOS 10.14 and macOS 10.15."
670697 }
671698 ]
672699 },
113113 TARGET_LINK_LIBRARIES(AusweisApp -lqtpcre2 -lqtlibpng -lQt5GraphicsSupport -lQt5FontDatabaseSupport -lQt5ClipboardSupport -lqios -lqsvg -lqjpeg -lqtfreetype)
114114
115115 TARGET_LINK_LIBRARIES(AusweisApp "-lc++ -lz -lm")
116 TARGET_LINK_LIBRARIES(AusweisApp ${IOS_ASSETSLIBRARY} ${IOS_UIKIT} ${IOS_COREBLUETOOTH} ${IOS_COREFOUNDATION} ${IOS_OPENGLES} ${IOS_FOUNDATION} ${IOS_QUARTZCORE} ${IOS_CORETEXT} ${IOS_COREGRAPHICS} ${IOS_SECURITY} ${IOS_MOBILECORESERVICES} ${IOS_AUDIOTOOLBOX} ${IOS_IMAGEIO} ${IOS_CORENFC} ${IOS_MESSAGEUI} ${IOS_STOREKIT})
116 TARGET_LINK_LIBRARIES(AusweisApp ${IOS_ASSETSLIBRARY} ${IOS_UIKIT} ${IOS_COREBLUETOOTH} ${IOS_COREFOUNDATION} ${IOS_OPENGLES} ${IOS_FOUNDATION} ${IOS_QUARTZCORE} ${IOS_CORETEXT} ${IOS_COREGRAPHICS} ${IOS_SECURITY} ${IOS_NETWORK} ${IOS_MOBILECORESERVICES} ${IOS_AUDIOTOOLBOX} ${IOS_IMAGEIO} ${IOS_CORENFC} ${IOS_MESSAGEUI} ${IOS_STOREKIT})
117117
118118 TARGET_LINK_LIBRARIES(AusweisApp -Wl,-e,_qt_main_wrapper)
119119
88
99 #include <QDesktopServices>
1010
11 #ifdef Q_OS_ANDROID
12 #include <QtAndroidExtras/QAndroidJniObject>
13 #include <QtAndroidExtras/QtAndroid>
14 #endif
1115
1216 using namespace governikus;
1317
3337 * has finished and the AuthMdel is deleted.
3438 */
3539 qDebug() << "Perform redirect to URL" << mRedirectAddress;
40 #ifdef Q_OS_ANDROID
41 if (QtAndroid::androidActivity().callMethod<jboolean>("openUrl", "(Ljava/lang/String;Ljava/lang/String;)Z", QAndroidJniObject::fromString(mRedirectAddress.url()).object<jstring>(), QAndroidJniObject::fromString(mReferrer).object<jstring>()))
42 {
43 return;
44 }
45 #endif
46
3647 QDesktopServices::openUrl(mRedirectAddress);
3748 }
3849 }
33
44 package com.governikus.ausweisapp2;
55
6 import java.util.List;
7
68 import android.accessibilityservice.AccessibilityServiceInfo;
79 import android.app.Activity;
810 import android.app.PendingIntent;
11 import android.content.ActivityNotFoundException;
912 import android.content.Context;
1013 import android.content.Intent;
1114 import android.content.IntentFilter;
12 import android.content.pm.ActivityInfo;
1315 import android.content.pm.PackageManager;
1416 import android.graphics.Color;
1517 import android.net.Uri;
2325 import android.view.ViewGroup.MarginLayoutParams;
2426 import android.view.Window;
2527 import android.view.WindowManager;
28
29 import org.qtproject.qt5.android.bindings.QtActivity;
30
2631 import androidx.core.view.OnApplyWindowInsetsListener;
2732 import androidx.core.view.ViewCompat;
2833 import androidx.core.view.WindowInsetsCompat;
29 import java.util.List;
30
31 import org.qtproject.qt5.android.bindings.QtActivity;
34
3235
3336 public class MainActivity extends QtActivity
3437 {
4144 private final MarginLayoutParams windowInsets = new MarginLayoutParams(0, 0);
4245
4346 private NfcForegroundDispatcher mNfcForegroundDispatcher;
47
4448 private static class NfcForegroundDispatcher
4549 {
4650 private final Activity mActivity;
153157
154158 mNfcForegroundDispatcher = new NfcForegroundDispatcher(this);
155159
156 setRequestedOrientation(isTablet() ? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
157
158160 // Set statusBar/navigationBar color and handle systemWindowInsets
159161 Window window = getWindow();
160162 View rootView = window.getDecorView().findViewById(android.R.id.content);
168170 rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
169171 }
170172 window.setStatusBarColor(Color.TRANSPARENT);
171 ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() {
172 public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets){
173 ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener()
174 {
175 public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets)
176 {
173177 windowInsets.topMargin = insets.getSystemWindowInsetTop();
174178 windowInsets.leftMargin = insets.getSystemWindowInsetLeft();
175179 windowInsets.rightMargin = insets.getSystemWindowInsetRight();
259263 }
260264
261265
266 public boolean openUrl(String pUrl, String pReferrer)
267 {
268 String packageName = pReferrer == null ? null : pReferrer.replace("android-app://", "");
269 Intent intent = new Intent(Intent.ACTION_VIEW)
270 .setData(Uri.parse(pUrl))
271 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
272 .setPackage(packageName);
273 try
274 {
275 startActivity(intent);
276 Log.d(LOG_TAG, "Started Intent in browser with id " + packageName);
277 }
278 catch (ActivityNotFoundException e)
279 {
280 Log.e(LOG_TAG, "Couldn't open URL in browser with id " + packageName);
281 return false;
282 }
283 return true;
284 }
285
286
262287 }
22 #
33 # If another module needs to start an authentication it can be
44 # invoked by the plugin.
5 # This will be used by interal usage of the SDK.
5 # This will be used by internal usage of the SDK.
66 #####################################################################
77
88 ADD_PLATFORM_LIBRARY(AusweisAppActivationInternal)
8686 return resultConnection;
8787 }
8888
89
9089 private Q_SLOTS:
9190 void onReaderInfoChanged(const ReaderInfo& pReaderInfo);
9291
205204 return call(command, pReceiver, pFunc);
206205 }
207206
208
209207 Q_SIGNALS:
210208 void fireReaderInfoChanged(const ReaderInfo& pReaderInfo);
211209 };
4747 mAcceptableStatusCodes += pStatusCodeAsHex;
4848 }
4949
50
5150 private:
5251 QByteArray mInputApdu;
5352 QByteArrayList mAcceptableStatusCodes;
5858 mInfo.setValue(pKey, pValue);
5959 }
6060
61
6261 public:
6362 ReaderManagerPlugIn(ReaderManagerPlugInType pPlugInType,
6463 bool pAvailable = false,
9595 mResponding = pResponding;
9696 }
9797
98
9998 private:
10099 ReaderManagerPlugInType mType;
101100 QMap<Key, QVariant> mValues;
1111 #include <QByteArray>
1212 #include <QLoggingCategory>
1313 #include <QSharedPointer>
14
15 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
16 #include <QScopeGuard>
17 #else
18 #include "ScopeGuard.h"
19 #endif
1420
1521 Q_DECLARE_LOGGING_CATEGORY(card)
1622
6470 ERR_clear_error();
6571 unsigned char* encoded = nullptr;
6672 const int length = encodeAsn1Object(pObject, &encoded);
73 const auto guard = qScopeGuard([encoded] {
74 OPENSSL_free(encoded);
75 });
6776 if (length < 0)
6877 {
6978 qCWarning(card) << "Cannot encode ASN.1 object:" << getOpenSslError();
5555 {
5656 if (auto cvc = reinterpret_cast<cvcertificate_st*>(*pVal))
5757 {
58 cvc->mEcdsaSignature = EcUtil::create(ECDSA_SIG_new());
58 cvc->mEcdsaSignature = ECDSA_SIG_new();
5959 QByteArray sigValue = Asn1OctetStringUtil::getValue(cvc->mSignature);
6060
6161 const auto* const sig = reinterpret_cast<const unsigned char*>(sigValue.data());
6565 BIGNUM* s = BN_bin2bn(sig + (siglen / 2), siglen / 2, nullptr);
6666
6767 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
68 cvc->mEcdsaSignature.data()->r = r;
69 cvc->mEcdsaSignature.data()->s = s;
68 cvc->mEcdsaSignature->r = r;
69 cvc->mEcdsaSignature->s = s;
7070 #else
71 ECDSA_SIG_set0(cvc->mEcdsaSignature.data(), r, s);
71 ECDSA_SIG_set0(cvc->mEcdsaSignature, r, s);
7272 #endif
7373 }
7474 }
75 else if (pOperation == ASN1_OP_FREE_POST)
76 {
77 if (auto cvc = reinterpret_cast<cvcertificate_st*>(*pVal))
78 {
79 ECDSA_SIG_free(cvc->mEcdsaSignature);
80 }
81 }
82
7583 return CB_SUCCESS;
7684 }
7785
116124 }
117125
118126
119 QSharedPointer<const ECDSA_SIG> CVCertificate::getEcdsaSignature() const
127 const ECDSA_SIG* CVCertificate::getEcdsaSignature() const
120128 {
121129 return mEcdsaSignature;
122130 }
4646 {
4747 CVCertificateBody* mBody;
4848 SIGNATURE* mSignature;
49 QSharedPointer<ECDSA_SIG> mEcdsaSignature;
49 ECDSA_SIG* mEcdsaSignature;
5050
51 static QVector<QSharedPointer<const cvcertificate_st> > fromHex(const QByteArrayList& pHexByteList);
51 static QVector<QSharedPointer<const cvcertificate_st>> fromHex(const QByteArrayList& pHexByteList);
5252 static QSharedPointer<const cvcertificate_st> fromHex(const QByteArray& pHexBytes);
5353 QByteArray encode() const;
5454
5555 const CVCertificateBody& getBody() const;
5656 QByteArray getRawBody() const;
57 QSharedPointer<const ECDSA_SIG> getEcdsaSignature() const;
57 const ECDSA_SIG* getEcdsaSignature() const;
5858 QByteArray getRawSignature() const;
5959
6060 bool isValidOn(const QDateTime& pValidationDate) const;
8585 QDebug operator<<(QDebug pDbg, const governikus::CVCertificate& pCvc);
8686 QDebug operator<<(QDebug pDbg, const QSharedPointer<const governikus::CVCertificate>& pCvc);
8787 QDebug operator<<(QDebug pDbg, QSharedPointer<governikus::CVCertificate>& pCvc);
88 QDebug operator<<(QDebug pDbg, const QVector<QSharedPointer<governikus::CVCertificate> >& pCvcs);
88 QDebug operator<<(QDebug pDbg, const QVector<QSharedPointer<governikus::CVCertificate>>& pCvcs);
1717 {
1818
1919 class CVCertificateChain
20 : public QVector<QSharedPointer<const CVCertificate> >
20 : public QVector<QSharedPointer<const CVCertificate>>
2121 {
2222 private:
2323 bool mProductive;
2424
2525 public:
2626 explicit CVCertificateChain(bool pProductive = true);
27 explicit CVCertificateChain(const QVector<QSharedPointer<const CVCertificate> >& pCvcs, bool pProductive);
27 explicit CVCertificateChain(const QVector<QSharedPointer<const CVCertificate>>& pCvcs, bool pProductive);
2828
2929 /*!
3030 * Return the document verifier certificate.
1515 {
1616
1717 class CVCertificateChainBuilder
18 : private ChainBuilder<QSharedPointer<const CVCertificate> >
18 : private ChainBuilder<QSharedPointer<const CVCertificate>>
1919 {
2020 private:
2121 bool mProductive;
3232 /*!
3333 * Creates a new instance. All chains are build using the CVCs passed in as parameter.
3434 */
35 explicit CVCertificateChainBuilder(const QVector<QSharedPointer<const CVCertificate> >& pCvcPool, bool pProductive);
35 explicit CVCertificateChainBuilder(const QVector<QSharedPointer<const CVCertificate>>& pCvcPool, bool pProductive);
3636
3737
3838 /*!
2222 class ChainBuilder
2323 {
2424 protected:
25 QVector<QVector<T> > mChains;
25 QVector<QVector<T>> mChains;
2626
2727 private:
2828 std::function<bool(const T& pChild, const T& pParent)> mIsChildFunc;
7373 return false;
7474 }
7575
76
7776 public:
7877 ChainBuilder(const QVector<T>& pAllElements, const std::function<bool(const T& pChild, const T& pParent)>& pIsChildFunc)
7978 : mChains()
9089 }
9190
9291
93 const QVector<QVector<T> >& getChains() const
92 const QVector<QVector<T>>& getChains() const
9493 {
9594 return mChains;
9695 }
88
99 #include <openssl/evp.h>
1010 #include <QLoggingCategory>
11
12 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
13 #include <QScopeGuard>
14 #else
15 #include "ScopeGuard.h"
16 #endif
1117
1218
1319 using namespace governikus;
4450 }
4551 }
4652 }
53 else if (pOperation == ASN1_OP_FREE_POST)
54 {
55 if (auto ecdsaPublicKey = reinterpret_cast<EcdsaPublicKey*>(*pVal))
56 {
57 EC_KEY_free(ecdsaPublicKey->mEcKey);
58 }
59 }
60
4761 return CB_SUCCESS;
4862 }
4963
112126 }
113127
114128
115 QSharedPointer<const EC_KEY> EcdsaPublicKey::getEcKey() const
129 const EC_KEY* EcdsaPublicKey::getEcKey() const
116130 {
117131 return mEcKey;
118132 }
184198 return;
185199 }
186200
187 QSharedPointer<EC_KEY> ecKey = EcUtil::create(EC_KEY_new());
188 if (!EC_KEY_set_group(ecKey.data(), group.data()))
201 EC_KEY* ecKey = EC_KEY_new();
202 auto guard = qScopeGuard([ecKey] {
203 EC_KEY_free(ecKey);
204 });
205
206 if (!EC_KEY_set_group(ecKey, group.data()))
189207 {
190208 qCCritical(card) << "Cannot set group";
191209 return;
197215 qCCritical(card) << "Cannot convert public point";
198216 return;
199217 }
200 if (!EC_KEY_set_public_key(ecKey.data(), publicPoint.data()))
218 if (!EC_KEY_set_public_key(ecKey, publicPoint.data()))
201219 {
202220 qCCritical(card) << "Cannot set public key";
203221 return;
204222 }
223
224 guard.dismiss();
205225 mEcKey = ecKey;
206226 }
4545 ASN1_OCTET_STRING* mOrderOfTheBasePoint;
4646 ASN1_OCTET_STRING* mPublicPoint;
4747 ASN1_OCTET_STRING* mCofactor;
48 QSharedPointer<EC_KEY> mEcKey;
48 EC_KEY* mEcKey;
4949
5050 static QSharedPointer<ecdsapublickey_st> fromHex(const QByteArray& pHexValue);
5151 static QSharedPointer<ecdsapublickey_st> decode(const QByteArray& pBytes);
5858 */
5959 QByteArray getPublicKeyOidValueBytes() const;
6060 QByteArray getUncompressedPublicPoint() const;
61 QSharedPointer<const EC_KEY> getEcKey() const;
61 const EC_KEY* getEcKey() const;
6262
6363 private:
6464 void initEcKey();
3232 friend class QSharedPointer<SecurityInfos>;
3333
3434 const QByteArray mContentBytes;
35 const QVector<QSharedPointer<const SecurityInfo> > mSecurityInfos;
36 const QVector<QSharedPointer<const PaceInfo> > mPaceInfos;
37 const QVector<QSharedPointer<const ChipAuthenticationInfo> > mChipAuthenticationInfos;
35 const QVector<QSharedPointer<const SecurityInfo>> mSecurityInfos;
36 const QVector<QSharedPointer<const PaceInfo>> mPaceInfos;
37 const QVector<QSharedPointer<const ChipAuthenticationInfo>> mChipAuthenticationInfos;
3838
3939 SecurityInfos(const QByteArray& pBytes,
40 const QVector<QSharedPointer<const SecurityInfo> >& pSecurityInfos,
41 const QVector<QSharedPointer<const PaceInfo> >& pPaceInfos,
42 const QVector<QSharedPointer<const ChipAuthenticationInfo> >& pChipAuthenticationInfos);
40 const QVector<QSharedPointer<const SecurityInfo>>& pSecurityInfos,
41 const QVector<QSharedPointer<const PaceInfo>>& pPaceInfos,
42 const QVector<QSharedPointer<const ChipAuthenticationInfo>>& pChipAuthenticationInfos);
4343
4444 public:
4545 static QSharedPointer<SecurityInfos> fromHex(const QByteArray& pHexString);
4646 static QSharedPointer<SecurityInfos> decode(const QByteArray& pBytes);
4747
4848 const QByteArray& getContentBytes() const;
49 const QVector<QSharedPointer<const SecurityInfo> >& getSecurityInfos() const;
50 const QVector<QSharedPointer<const PaceInfo> >& getPaceInfos() const;
51 const QVector<QSharedPointer<const ChipAuthenticationInfo> >& getChipAuthenticationInfos() const;
49 const QVector<QSharedPointer<const SecurityInfo>>& getSecurityInfos() const;
50 const QVector<QSharedPointer<const PaceInfo>>& getPaceInfos() const;
51 const QVector<QSharedPointer<const ChipAuthenticationInfo>>& getChipAuthenticationInfos() const;
5252 };
5353
5454
99 #include <openssl/ecdsa.h>
1010 #include <openssl/err.h>
1111 #include <QLoggingCategory>
12
13 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
14 #include <QScopeGuard>
15 #else
16 #include "ScopeGuard.h"
17 #endif
1218
1319 using namespace governikus;
1420
3137 }
3238
3339 auto signingCert = mCertificateChain.at(0);
34 QSharedPointer<const EC_KEY> key = signingCert->getBody().getPublicKey().getEcKey();
40 const EC_KEY* key = signingCert->getBody().getPublicKey().getEcKey();
3541 if (!key)
3642 {
3743 qCCritical(card) << "No elliptic curve parameters";
4046
4147 for (const auto& cert : mCertificateChain)
4248 {
43 if (!checkSignature(cert, signingCert, key.data()))
49 if (!checkSignature(cert, signingCert, key))
4450 {
4551 qCCritical(card) << "Certificate verification failed:" << cert->getBody().getCertificateHolderReference();
4652 return false;
6975 const auto uncompPublicPointLen = static_cast<size_t>(uncompPublicPoint.size());
7076
7177 EC_POINT* publicPoint = EC_POINT_new(EC_KEY_get0_group(signingKey.data()));
78 const auto guard = qScopeGuard([publicPoint] {
79 EC_POINT_free(publicPoint);
80 });
81
7282 const EC_GROUP* ecGroup = EC_KEY_get0_group(signingKey.data());
7383 if (!EC_POINT_oct2point(ecGroup, publicPoint, uncompPublicPointData, uncompPublicPointLen, nullptr))
7484 {
8090 const QByteArray bodyHash = QCryptographicHash::hash(pCert->getRawBody(), pSigningCert->getBody().getHashAlgorithm());
8191 const auto* const dgst = reinterpret_cast<const unsigned char*>(bodyHash.constData());
8292 const int dgstlen = bodyHash.size();
83 const int result = ECDSA_do_verify(dgst, dgstlen, pCert->getEcdsaSignature().data(), signingKey.data());
93 const int result = ECDSA_do_verify(dgst, dgstlen, pCert->getEcdsaSignature(), signingKey.data());
8494
8595 if (result == -1)
8696 {
1414 class SignatureChecker
1515 {
1616 private:
17 const QVector<QSharedPointer<const CVCertificate> > mCertificateChain;
17 const QVector<QSharedPointer<const CVCertificate>> mCertificateChain;
1818
1919 bool checkSignature(const QSharedPointer<const CVCertificate>& pCert, const QSharedPointer<const CVCertificate>& pSigningCert, const EC_KEY* pKey);
2020
2121 public:
22 explicit SignatureChecker(const QVector<QSharedPointer<const CVCertificate> >& pCertificateChain);
22 explicit SignatureChecker(const QVector<QSharedPointer<const CVCertificate>>& pCertificateChain);
2323 ~SignatureChecker() = default;
2424
2525 bool check();
4141 return mReturnCode;
4242 }
4343
44
4544 Q_SIGNALS:
4645 void commandDone(QSharedPointer<BaseCardCommand> pCommand);
4746 };
2323 private:
2424 friend class ::test_EcdhKeyAgreement;
2525
26 QSharedPointer<DomainParameterMapping<EC_GROUP> > mMapping;
26 QSharedPointer<DomainParameterMapping<EC_GROUP>> mMapping;
2727 QSharedPointer<EC_GROUP> mEphemeralCurve;
2828 QSharedPointer<EC_POINT> mTerminalPublicKey;
2929 QSharedPointer<const EC_POINT> mCardPublicKey;
3030
31 QPair<CardReturnCode, QSharedPointer<EC_GROUP> > determineEphemeralDomainParameters(const QByteArray& pNonce);
32 QPair<CardReturnCode, QSharedPointer<EC_POINT> > performKeyExchange(const QSharedPointer<const EC_GROUP>& pCurve);
31 QPair<CardReturnCode, QSharedPointer<EC_GROUP>> determineEphemeralDomainParameters(const QByteArray& pNonce);
32 QPair<CardReturnCode, QSharedPointer<EC_POINT>> performKeyExchange(const QSharedPointer<const EC_GROUP>& pCurve);
3333
3434 static QByteArray encodeUncompressedPublicKey(const QSharedPointer<const PaceInfo>& pPaceInfo, const QSharedPointer<const EC_GROUP>& pCurve, const QSharedPointer<const EC_POINT>& pPoint);
3535 static QByteArray encodeCompressedPublicKey(const QSharedPointer<const EC_GROUP>& pCurve, const QSharedPointer<const EC_POINT>& pPoint);
3131 BluetoothReaderManagerPlugInPrivate* const d_ptr;
3232
3333 QBluetoothDeviceDiscoveryAgent mDeviceDiscoveryAgent;
34 QMap<QString, QSharedPointer<CyberJackWaveDevice> > mInitializingDevices;
34 QMap<QString, QSharedPointer<CyberJackWaveDevice>> mInitializingDevices;
3535 QMap<QString, BluetoothReader*> mReaders;
3636 QMap<QString, int> mPendingConnections;
3737 QStringList mReadersDiscoveredInCurrentScan;
5050 qCWarning(bluetooth) << "Parameter ID is already added:" << pMessageParameter->getParameterId();
5151 }
5252
53 mMessageParameter.insertMulti(pMessageParameter->getParameterId(), pMessageParameter);
53 mMessageParameter.insert(pMessageParameter->getParameterId(), pMessageParameter);
5454 }
5555
5656
77
88 #include "parameter/BluetoothMessageParameter.h"
99
10 #include <QMultiMap>
1011 #include <QSharedPointer>
11 #include <QVector>
1212
1313 class test_BluetoothMessageParser;
1414
2020 private:
2121 friend class ::test_BluetoothMessageParser;
2222 BluetoothMsgId mMsgId;
23 QMap<BluetoothParamId, QSharedPointer<const BluetoothMessageParameter> > mMessageParameter;
23 QMultiMap<BluetoothParamId, QSharedPointer<const BluetoothMessageParameter>> mMessageParameter;
2424
2525 protected:
2626 QSharedPointer<const BluetoothMessageParameter> getParameter(BluetoothParamId pId) const;
1313 class BluetoothMessageParser
1414 {
1515 private:
16 QVector<QSharedPointer<const BluetoothMessage> > mMessages;
16 QVector<QSharedPointer<const BluetoothMessage>> mMessages;
1717 QByteArray mRemainingBytes;
1818
1919 inline ushort getParamLength(uchar pHigh, uchar pLow) const;
2727 BluetoothMessageParser(const QByteArray& pData);
2828 virtual ~BluetoothMessageParser();
2929
30 const QVector<QSharedPointer<const BluetoothMessage> >& getMessages() const;
30 const QVector<QSharedPointer<const BluetoothMessage>>& getMessages() const;
3131 const QByteArray& getRemainingBytes() const;
3232 };
3333
4949 return false;
5050 }
5151
52
5352 public:
5453 BluetoothMessageParameter(BluetoothParamId pParamId, const QByteArray& pValue);
5554 virtual ~BluetoothMessageParameter();
8080 }
8181 }
8282
83
8483 public:
8584 DeviceListener()
8685 {
106105 #endif
107106
108107 public:
108
109109 Q_SIGNALS:
110110 void fireDeviceChangeDetected();
111111 };
143143 const QWeakPointer<QByteArray> weakBuffer = resultBuffer;
144144
145145 Q_ASSERT([mCard->mNfcTag conformsToProtocol:@protocol(NFCISO7816Tag)]);
146 const auto tag = static_cast<id<NFCISO7816Tag> >(mCard->mNfcTag);
146 const auto tag = static_cast<id<NFCISO7816Tag>>(mCard->mNfcTag);
147147 auto* apdu = [[NFCISO7816APDU alloc] initWithData: pCmd.getBuffer().toNSData()];
148148 [tag sendCommandAPDU: apdu completionHandler: ^(NSData* responseData, uint8_t sw1, uint8_t sw2, NSError* error){
149149 // By referencing weakBuffer here, it will be copied into the Block. If the handler outlives the caller, resultBuffer won't exist anymore.
9494 }
9595
9696
97 - (void) tagReaderSession: (NFCTagReaderSession*)session didDetectTags:(NSArray<__kindof id<NFCTag> >*)tags {
97 - (void) tagReaderSession: (NFCTagReaderSession*)session didDetectTags:(NSArray<__kindof id<NFCTag>>*)tags {
9898 qCDebug(card_nfc) << "New tag detected";
9999
100100 if (session != self.mSession)
117117 return;
118118 }
119119
120 self.mDelegate->onTagDiscovered(new governikus::IosCard(new governikus::IosCardPointer {tags[0]}));
120 self.mDelegate->onTagDiscovered(new governikus::IosCard(new governikus::IosCardPointer{tags[0]}));
121121 }
122122
123123
121121 return {CardReturnCode::COMMAND_FAILED};
122122 }
123123
124 if (!mNearFieldTarget->waitForRequestCompleted(id, 1500))
125 {
126 qCWarning(card_nfc) << "Transmit timeout reached";
127 return {CardReturnCode::COMMAND_FAILED};
128 }
129
130124 QVariant response = mNearFieldTarget->requestResponse(id);
131125 if (!response.isValid())
132126 {
1010 #include <QFile>
1111 #include <QLoggingCategory>
1212 #include <QRegularExpression>
13
14 #include <algorithm>
1315
1416
1517 using namespace governikus;
5456
5557 mCallCosts = callCosts;
5658 mProviderConfigurationInfos = providerConfigurationInfos;
59 std::sort(mProviderConfigurationInfos.begin(), mProviderConfigurationInfos.end());
5760 return true;
5861 }
5962
7982 , mCallCosts()
8083 {
8184 connect(mUpdatableFile.data(), &UpdatableFile::fireUpdated, this, &ProviderConfiguration::onFileUpdated);
85 connect(mUpdatableFile.data(), &UpdatableFile::fireNoUpdateAvailable, this, &ProviderConfiguration::fireNoUpdateAvailable);
8286 parseProviderConfiguration();
8387 }
8488
4949
5050 Q_SIGNALS:
5151 void fireUpdated();
52 void fireNoUpdateAvailable();
5253 };
5354
5455
3737 const QString& pImage,
3838 const QString& pTcTokenUrl,
3939 const QString& pClientUrl,
40 const QStringList& pSubjectUrls)
40 const QStringList& pSubjectUrls,
41 const QString& pSubjectUrlInfo)
4142 : d(new InternalInfo(pShortName, pLongName, pShortDescription, pLongDescription, pAddress, pHomepage,
42 pCategory, pPhone, pEmail, pPostalAddress, pIcon, pImage, pTcTokenUrl, pClientUrl, pSubjectUrls))
43 pCategory, pPhone, pEmail, pPostalAddress, pIcon, pImage, pTcTokenUrl, pClientUrl, pSubjectUrls, pSubjectUrlInfo))
4344 {
4445 }
4546
5253 void ProviderConfigurationInfo::setTcTokenUrl(const QString& pTcTokenUrl)
5354 {
5455 d = new InternalInfo(d->mShortName, d->mLongName, d->mShortDescription, d->mLongDescription, d->mAddress, d->mHomepage,
55 d->mCategory, d->mPhone, d->mEmail, d->mPostalAddress, d->mIcon, d->mImage, pTcTokenUrl, d->mClientUrl, d->mSubjectUrls);
56 d->mCategory, d->mPhone, d->mEmail, d->mPostalAddress, d->mIcon, d->mImage, pTcTokenUrl, d->mClientUrl, d->mSubjectUrls, d->mSubjectUrlInfo);
5657 }
5758
5859
5960 bool ProviderConfigurationInfo::operator ==(const ProviderConfigurationInfo& pOther) const
6061 {
6162 return *d == *pOther.d;
63 }
64
65
66 bool ProviderConfigurationInfo::operator <(const ProviderConfigurationInfo& pOther) const
67 {
68 const QString myName = getLongName().isEmpty() ? getShortName() : getLongName();
69 const QString otherName = pOther.getLongName().isEmpty() ? pOther.getShortName() : pOther.getLongName();
70 return myName.compare(otherName, Qt::CaseInsensitive) < 0;
6271 }
6372
6473
191200 {
192201 return d->mSubjectUrls;
193202 }
203
204
205 const QString& ProviderConfigurationInfo::getSubjectUrlInfo() const
206 {
207 return d->mSubjectUrlInfo;
208 }
4040 const QString mTcTokenUrl;
4141 const QString mClientUrl;
4242 const QStringList mSubjectUrls;
43 const QString mSubjectUrlInfo;
4344
4445 InternalInfo(const LanguageString& pShortName,
4546 const LanguageString& pLongName,
5556 const QString& pImage,
5657 const QString& pTcTokenUrl,
5758 const QString& pClientUrl,
58 const QStringList& pSubjectUrls = QStringList())
59 const QStringList& pSubjectUrls,
60 const QString& pSubjectUrlInfo)
5961 : mShortName(pShortName)
6062 , mLongName(pLongName)
6163 , mShortDescription(pShortDescription)
7173 , mTcTokenUrl(pTcTokenUrl)
7274 , mClientUrl(pClientUrl)
7375 , mSubjectUrls(pSubjectUrls)
76 , mSubjectUrlInfo(pSubjectUrlInfo)
7477 {
7578 }
7679
9093 mIcon == pOther.mIcon &&
9194 mImage == pOther.mImage &&
9295 mTcTokenUrl == pOther.mTcTokenUrl &&
93 mClientUrl == pOther.mClientUrl;
96 mClientUrl == pOther.mClientUrl &&
97 mSubjectUrls == pOther.mSubjectUrls &&
98 mSubjectUrlInfo == pOther.mSubjectUrlInfo;
9499 }
95100
96101
115120 const QString& pImage = QString(),
116121 const QString& pTcTokenUrl = QString(),
117122 const QString& pClientUrl = QString(),
118 const QStringList& pSubjectUrls = QStringList());
123 const QStringList& pSubjectUrls = QStringList(),
124 const QString& pSubjectUrlInfo = QString());
119125 virtual ~ProviderConfigurationInfo();
120126
121127 void setTcTokenUrl(const QString& pTcTokenUrl);
122128
123129 bool operator ==(const ProviderConfigurationInfo& pOther) const;
130 bool operator <(const ProviderConfigurationInfo& pOther) const;
124131 bool matchWithSubjectUrl(const QString& pSubjectUrl) const;
125132
126133 const LanguageString& getShortName() const;
140147 QUrl getTcTokenUrl() const;
141148 QUrl getClientUrl() const;
142149 const QStringList& getSubjectUrls() const;
150 const QString& getSubjectUrlInfo() const;
143151 };
144152
145153
104104 prov[QLatin1String("image")].toString(),
105105 prov[QLatin1String("tcTokenUrl")].toString(),
106106 prov[QLatin1String("clientUrl")].toString(),
107 prov[QLatin1String("subjectUrls")].toVariant().toStringList());
107 prov[QLatin1String("subjectUrls")].toVariant().toStringList(),
108 prov[QLatin1String("subjectUrlInfo")].toString());
108109 }
109110
110111 return providers;
5959 #if defined(Q_OS_WIN)
6060 QSharedPointer<QProcess> mProcess;
6161 #endif
62 QVector<QSharedPointer<AntivirInfo> > mAntivirInfos;
62 QVector<QSharedPointer<AntivirInfo>> mAntivirInfos;
6363 void parseAntivirInfos(const QString& pAntivirInfos);
6464
6565 private Q_SLOTS:
7575 public:
7676 DiagnosisAntivirusDetection();
7777 void startInformationProcess();
78 const QVector<QSharedPointer<AntivirInfo> >& getAntivirusInformations() const;
78 const QVector<QSharedPointer<AntivirInfo>>& getAntivirusInformations() const;
7979 };
8080
8181 } // namespace governikus
181181 mPingSocketToProxy.reset();
182182 mPingSocketToProxy.setProxy(QNetworkProxy::NoProxy);
183183 connect(&mPingSocketToProxy, &QTcpSocket::connected, this, &DiagnosisConnectionTest::onProxyPingTestDone);
184 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
185 connect(&mPingSocketToProxy, &QTcpSocket::errorOccurred, this, &DiagnosisConnectionTest::onProxyPingTestError);
186 #else
184187 connect(&mPingSocketToProxy, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error), this, &DiagnosisConnectionTest::onProxyPingTestError);
188 #endif
185189 mPingSocketToProxy.connectToHost(proxy.hostName(), proxy.port());
186190
187191 mTcpSocketWithProxy.reset();
188192 mTcpSocketWithProxy.setProxy(proxy);
189193 connect(&mTcpSocketWithProxy, &QTcpSocket::connected, this, &DiagnosisConnectionTest::onSocketConnectionTestWithProxyDone);
194 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
195 connect(&mTcpSocketWithProxy, &QTcpSocket::errorOccurred, this, &DiagnosisConnectionTest::onSocketConnectionTestWithProxyError);
196 #else
190197 connect(&mTcpSocketWithProxy, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error), this, &DiagnosisConnectionTest::onSocketConnectionTestWithProxyError);
198 #endif
191199 mTcpSocketWithProxy.connectToHost(testUrl.host(), 443);
192200 }
193201
194202 mTcpSocketWithoutProxy.reset();
195203 mTcpSocketWithoutProxy.setProxy(QNetworkProxy::NoProxy);
196204 connect(&mTcpSocketWithoutProxy, &QTcpSocket::connected, this, &DiagnosisConnectionTest::onSocketConnectionTestWithoutProxyDone);
205 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
206 connect(&mTcpSocketWithoutProxy, &QTcpSocket::errorOccurred, this, &DiagnosisConnectionTest::onSocketConnectionTestWithoutProxyError);
207 #else
197208 connect(&mTcpSocketWithoutProxy, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error), this, &DiagnosisConnectionTest::onSocketConnectionTestWithoutProxyError);
209 #endif
198210 mTcpSocketWithoutProxy.connectToHost(testUrl.host(), 443);
199211 }
109109 return mPingTestOnProxySuccessful;
110110 }
111111
112
113112 Q_SIGNALS:
114113 void fireConnectionTestDone();
115114 };
9595 {
9696 continue;
9797 }
98 if (lineparts[0].startsWith(QLatin1String("Name")))
99 {
100 if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8 && lineparts[1].startsWith(QLatin1String("AusweisApp2-Firewall-Rule-SaC-In")))
101 {
102 mSecondFirewallRuleExists = true;
103 }
104 else if (lineparts[1].startsWith(QLatin1String("AusweisApp2-Firewall-Rule-In")))
98 if (lineparts[0].startsWith(QLatin1String("Name")) || lineparts[0].startsWith(QLatin1String("DisplayName")))
99 {
100 if (lineparts[1].startsWith(QLatin1String("AusweisApp2-Firewall-Rule-SaC-In")))
105101 {
106102 mSecondFirewallRuleExists = true;
107103 }
328324 }
329325 else
330326 {
331 secondRuleParameters << QStringLiteral("Get-NetFirewallRule -Name \"AusweisApp2-Firewall-Rule-In\"");
327 secondRuleParameters << QStringLiteral("Get-NetFirewallRule -DisplayName \"AusweisApp2-Firewall-Rule-SaC-In\"");
332328 }
333329
334330 connect(&mFirewallSecondRuleProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &DiagnosisFirewallDetection::onSecondRuleDone);
7878 bool mFirstFirewallRuleEnabled;
7979 bool mSecondFirewallRuleExists;
8080 bool mSecondFirewallRuleEnabled;
81 QVector<QSharedPointer<FirewallSoftware> > mDetectedFirewalls;
82 QVector<QSharedPointer<FirewallProfile> > mFirewallProfiles;
81 QVector<QSharedPointer<FirewallSoftware>> mDetectedFirewalls;
82 QVector<QSharedPointer<FirewallProfile>> mFirewallProfiles;
8383
8484 bool mFirstRuleDone;
8585 bool mSecondRuleDone;
133133 }
134134
135135
136 const QVector<QSharedPointer<FirewallProfile> >& getFirewallProfiles() const
136 const QVector<QSharedPointer<FirewallProfile>>& getFirewallProfiles() const
137137 {
138138 return mFirewallProfiles;
139139 }
140140
141141
142 const QVector<QSharedPointer<FirewallSoftware> >& getDetectedFirewalls() const
142 const QVector<QSharedPointer<FirewallSoftware>>& getDetectedFirewalls() const
143143 {
144144 return mDetectedFirewalls;
145145 }
146
147146
148147 Q_SIGNALS:
149148 void fireFirewallInformationReady();
2020
2121 private:
2222 QString mText;
23 QVector<QSharedPointer<DiagnosisItem> > mChildren;
23 QVector<QSharedPointer<DiagnosisItem>> mChildren;
2424 QSharedPointer<DiagnosisItem> mParent;
2525
2626 int getIndexOf(const DiagnosisItem* const pChild) const;
1818
1919 DiagnosisModel::DiagnosisModel(const QSharedPointer<DiagnosisContext>& pContext)
2020 : mContext(pContext)
21 , mAntivirusSectionRunning(false)
22 , mFirewallSectionRunning(false)
23 , mCardReaderSectionRunning(false)
24 , mPcscSectionRunning(false)
25 , mRemoteDeviceSectionRunning(false)
2126 {
2227 reloadContent();
2328 }
5863 mPcscSection = QSharedPointer<SectionModel>::create();
5964 mPcscSection->addTitleWithoutContent(tr("PC/SC driver information"));
6065 mPcscSection->addItemWithoutTitle(tr("Diagnosis is running..."));
66 mPcscSectionRunning = true;
6167 mCardReaderSection = QSharedPointer<SectionModel>::create();
6268 mCardReaderSection->addTitleWithoutContent(tr("Card reader"));
6369 mCardReaderSection->addItemWithoutTitle(tr("Diagnosis is running..."));
70 mCardReaderSectionRunning = true;
6471 mRemoteDeviceSection = QSharedPointer<SectionModel>::create();
6572 mRemoteDeviceSection->addTitleWithoutContent(tr("Paired smartphones"));
6673 mRemoteDeviceSection->addItemWithoutTitle(tr("Diagnosis is running..."));
74 mRemoteDeviceSectionRunning = true;
75 Q_EMIT fireRunningChanged();
6776 }
6877
6978
7685 #ifdef Q_OS_WIN
7786 mAntivirusSection->addTitleWithoutContent(tr("Antivirus information"));
7887 mAntivirusSection->addItemWithoutTitle(tr("Diagnosis is running..."));
88 mAntivirusSectionRunning = true;
7989
8090 mFirewallSection->addTitleWithoutContent(tr("Firewall information"));
8191 mFirewallSection->addItemWithoutTitle(tr("Diagnosis is running..."));
92 mFirewallSectionRunning = true;
93 Q_EMIT fireRunningChanged();
8294 #else
8395 mAntivirusSection->addItemWithoutTitle(tr("No Antivirus information available on this platform."));
8496 mFirewallSection->addItemWithoutTitle(tr("No Firewall information available on this platform."));
217229 QString DiagnosisModel::boolToString(bool pBoolean)
218230 {
219231 return pBoolean ? tr("Yes") : tr("No");
232 }
233
234
235 bool DiagnosisModel::isRunning() const
236 {
237 return mAntivirusSectionRunning || mFirewallSectionRunning || mCardReaderSectionRunning || mPcscSectionRunning || mRemoteDeviceSectionRunning;
220238 }
221239
222240
332350 void DiagnosisModel::onAntivirusInformationChanged()
333351 {
334352 mAntivirusSection->removeAllItems();
353 mAntivirusSectionRunning = false;
335354
336355 const auto& antivirusInfos = mAntivirusDetection.getAntivirusInformations();
337356 if (antivirusInfos.isEmpty())
356375 }
357376
358377 mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection});
378 Q_EMIT fireRunningChanged();
359379 }
360380
361381
370390 void DiagnosisModel::onFirewallInformationReady()
371391 {
372392 mFirewallSection->removeAllItems();
393 mFirewallSectionRunning = false;
373394
374395 mFirewallSection->addTitleWithoutContent(tr("Firewall information"));
375396 auto installedFirewalls = mFirewallDetection.getDetectedFirewalls();
428449 }
429450
430451 mFirewallSection->addItem(tr("Windows firewall profiles"), windowsFirewallProfiles.join(QStringLiteral("\n")));
431 mFirewallSection->addItemWithoutTitle(tr("Warning: The current firewall status can be obscured by additional Group Policies on your system, often set by system administrators."));
432452
433453 mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection});
454 Q_EMIT fireRunningChanged();
434455 }
435456
436457
445466 void DiagnosisModel::onPcscInfoChanged()
446467 {
447468 mPcscSection->removeAllItems();
469 mPcscSectionRunning = false;
448470
449471 mPcscSection->addTitleWithoutContent(tr("PC/SC information"));
450472 mPcscSection->addItem(tr("Version"), mContext->getPcscVersion());
476498 }
477499
478500 mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection});
501 Q_EMIT fireRunningChanged();
479502 }
480503
481504
482505 void DiagnosisModel::onRemoteInfosChanged()
483506 {
484507 mRemoteDeviceSection->removeAllItems();
508 mRemoteDeviceSectionRunning = false;
485509
486510 const RemoteServiceSettings& settings = Env::getSingleton<AppSettings>()->getRemoteServiceSettings();
487511 const auto& trustedCertificates = settings.getTrustedCertificates();
501525 if (!info.getFingerprint().isEmpty())
502526 {
503527 const QString& timestamp = LanguageLoader::getInstance().getUsedLocale().toString(info.getLastConnected(), tr("dd.MM.yyyy, hh:mm:ss"));
504 mRemoteDeviceSection->addItem(info.getName(), tr("Last connection: %1").arg(timestamp));
528 mRemoteDeviceSection->addItem(info.getNameEscaped(), tr("Last connection: %1").arg(timestamp));
505529 }
506530 else
507531 {
510534 }
511535
512536 mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection});
537 Q_EMIT fireRunningChanged();
513538 }
514539
515540
516541 void DiagnosisModel::onReaderInfosChanged()
517542 {
518543 mCardReaderSection->removeAllItems();
544 mCardReaderSectionRunning = false;
519545
520546 mCardReaderSection->addTitleWithoutContent(tr("Connected Card reader"));
521547
542568 }
543569
544570 mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection});
571 Q_EMIT fireRunningChanged();
545572 }
546573
547574
4949
5050 private:
5151 friend class ::test_DiagnosisModel;
52 QVector<QSharedPointer<ContentItem> > mContentItems;
52 QVector<QSharedPointer<ContentItem>> mContentItems;
5353
5454 public:
5555 explicit SectionModel(QObject* pParent = nullptr);
6464 void addTitleWithoutContent(const QString& pTitle);
6565 void removeAllItems();
6666 void emitDataChangedForItem(const QSharedPointer<ContentItem>& pItem);
67 void replaceWithSections(QVector<QSharedPointer<SectionModel> > pSections);
67 void replaceWithSections(QVector<QSharedPointer<SectionModel>> pSections);
6868 QStringList getAsPlaintext(const QString& pPrependString = QString()) const;
6969 };
7070
7676
7777 private:
7878 friend class ::test_DiagnosisModel;
79 QVector<QPair<QString, QSharedPointer<SectionModel> > > mSections;
79 QVector<QPair<QString, QSharedPointer<SectionModel>>> mSections;
8080 QSharedPointer<DiagnosisContext> mContext;
8181 DiagnosisAntivirusDetection mAntivirusDetection;
8282 DiagnosisFirewallDetection mFirewallDetection;
8787 QSharedPointer<SectionModel> mCombinedNetworkSection;
8888 QSharedPointer<SectionModel> mCombinedAntivirusFirewallSection;
8989 QSharedPointer<SectionModel> mAntivirusSection;
90 bool mAntivirusSectionRunning;
9091 QSharedPointer<SectionModel> mFirewallSection;
92 bool mFirewallSectionRunning;
9193 QSharedPointer<SectionModel> mCombinedReaderSection;
9294 QSharedPointer<SectionModel> mCardReaderSection;
95 bool mCardReaderSectionRunning;
9396 QSharedPointer<SectionModel> mPcscSection;
97 bool mPcscSectionRunning;
9498 QSharedPointer<SectionModel> mRemoteDeviceSection;
99 bool mRemoteDeviceSectionRunning;
95100
96101 QSharedPointer<SectionModel> createAusweisApp2Section();
97102 void createNetworkSection();
114119 Q_INVOKABLE QString getCreationTimeString() const;
115120 QString getAsPlaintext() const;
116121 QString boolToString(bool pBoolean);
122 bool isRunning() const;
123
124 Q_SIGNALS:
125 void fireRunningChanged();
117126
118127 private Q_SLOTS:
119128 void onTimestampChanged();
215215
216216 if (!info.getFingerprint().isEmpty())
217217 {
218 const auto& deviceName = QSharedPointer<DiagnosisItem>::create(info.getName());
218 const auto& deviceName = QSharedPointer<DiagnosisItem>::create(info.getNameEscaped());
219219 mPairedDevices->addChild(deviceName);
220220
221221 const auto& deviceFingerprint = QSharedPointer<DiagnosisItem>::create((tr("Certificate fingerprint: %1").arg(info.getFingerprint())));
5757 class SelfAuthenticationData
5858 {
5959 public:
60 using OrderedSelfData = QVector<QPair<QString, QString> >;
60 using OrderedSelfData = QVector<QPair<QString, QString>>;
6161
6262 private:
6363 class SelfData
244244 mTerminalCvc = pTerminalCvc;
245245
246246 const CHAT& terminalChat = mTerminalCvc->getBody().getCHAT();
247 bool canAllowed = terminalChat.getAccessRights().contains(AccessRight::CAN_ALLOWED);
247 bool canAllowed = terminalChat.getAccessRights().contains(AccessRight::CAN_ALLOWED) &&
248 (Env::getSingleton<AppSettings>()->isUsedAsSDK() || Env::getSingleton<AppSettings>()->getGeneralSettings().isEnableCanAllowed());
248249 setCanAllowedMode(canAllowed);
249250 qDebug() << "CAN allowed mode:" << canAllowed;
250251
7676 QSharedPointer<DIDAuthenticateResponseEAC2> mDIDAuthenticateResponseEACAdditionalInputType;
7777 QSharedPointer<DIDAuthenticateEACAdditional> mDIDAuthenticateEACAdditionalInputType;
7878 QSharedPointer<DIDAuthenticateResponseEAC2> mDIDAuthenticateResponseEAC2;
79 QVector<QSharedPointer<Transmit> > mTransmits;
80 QVector<QSharedPointer<TransmitResponse> > mTransmitResponses;
79 QVector<QSharedPointer<Transmit>> mTransmits;
80 QVector<QSharedPointer<TransmitResponse>> mTransmitResponses;
8181 QSharedPointer<Disconnect> mDisconnect;
8282 QSharedPointer<DisconnectResponse> mDisconnectResponse;
8383 QSharedPointer<StartPaosResponse> mStartPaosResponse;
168168 {
169169 QUrl originUrl = UrlUtil::getUrlOrigin(pUrl);
170170 qDebug() << "Adding certificate CN=" << pCert.subjectInfo(QSslCertificate::CommonName) << "SN=" << pCert.serialNumber() << "for URL origin" << originUrl;
171 mCertificates.insertMulti(originUrl, pCert);
171 mCertificates.insert(originUrl, pCert);
172172 }
173173
174174
383383 }
384384
385385
386 const QVector<QSharedPointer<TransmitResponse> >& getTransmitResponses()
386 const QVector<QSharedPointer<TransmitResponse>>& getTransmitResponses()
387387 {
388388 return mTransmitResponses;
389389 }
396396 }
397397
398398
399 const QVector<QSharedPointer<Transmit> >& getTransmits()
399 const QVector<QSharedPointer<Transmit>>& getTransmits()
400400 {
401401 return mTransmits;
402402 }
472472 CVCertificateChain getChainForCertificationAuthority(const EstablishPaceChannelOutput& pPaceOutput) const;
473473
474474
475 void initCvcChainBuilder(const QVector<QSharedPointer<const CVCertificate> >& pAdditionalCertificates = QVector<QSharedPointer<const CVCertificate> >());
475 void initCvcChainBuilder(const QVector<QSharedPointer<const CVCertificate>>& pAdditionalCertificates = QVector<QSharedPointer<const CVCertificate>>());
476476
477477
478478 const QSharedPointer<const CVCertificate>& getDvCvc() const
107107
108108 ResourceLoader::getInstance().init();
109109
110 #ifndef QT_NO_NETWORKPROXY
111110 NetworkManager::setApplicationProxyFactory();
112111 connect(Env::getSingleton<NetworkManager>(), &NetworkManager::fireProxyAuthenticationRequired, this, &AppController::fireProxyAuthenticationRequired);
113 #endif
114112
115113 connect(this, &AppController::fireShutdown, Env::getSingleton<NetworkManager>(), &NetworkManager::onShutdown, Qt::QueuedConnection);
116114 }
505503 connect(this, &AppController::fireApplicationActivated, pPlugin, &UIPlugIn::fireApplicationActivated);
506504 connect(this, &AppController::fireUiDomination, pPlugin, &UIPlugIn::onUiDomination);
507505 connect(this, &AppController::fireUiDominationReleased, pPlugin, &UIPlugIn::onUiDominationReleased);
508
509 #ifndef QT_NO_NETWORKPROXY
510506 connect(this, &AppController::fireProxyAuthenticationRequired, pPlugin, &UIPlugIn::onProxyAuthenticationRequired);
511 #endif
512507
513508 connect(pPlugin, &UIPlugIn::fireChangePinRequest, this, &AppController::onChangePinRequested, Qt::QueuedConnection);
514509 connect(pPlugin, &UIPlugIn::fireSelfAuthenticationRequested, this, &AppController::onSelfAuthenticationRequested, Qt::QueuedConnection);
7373 void fireHideUi();
7474 void fireShowUserInformation(const QString& pInformationMessage);
7575 void fireShowReaderSettings();
76 #ifndef QT_NO_NETWORKPROXY
7776 void fireProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator);
78 #endif
7977 void fireApplicationActivated();
8078 void fireUiDomination(const UIPlugIn* pUi, const QString& pInformation, bool pAccepted);
8179 void fireUiDominationReleased();
1111 #include "states/StateParseTcTokenUrl.h"
1212 #include "states/StateProcessing.h"
1313 #include "states/StateRedirectBrowser.h"
14 #include "states/StateSelectPasswordId.h"
1514 #include "states/StateSendWhitelistSurvey.h"
1615 #include "states/StateWriteHistory.h"
1716
3535 mLocation = getField(pData, QStringLiteral("location"));
3636 mInstallTime = getField(pData, QStringLiteral("install-time"));
3737 }
38
3938
4039 private:
4140 QString getField(const QString& pData, const QString& pFieldName)
9089 return !mIfdManufacturer.isEmpty();
9190 }
9291
93
9492 private:
9593 QString getField(const QSettings& pSettings, const QString& pFieldName)
9694 {
4343 return state;
4444 }
4545
46
4746 Q_SIGNALS:
4847 void fireComplete();
4948
2626 friend class TestAuthContext;
2727
2828 private:
29 QVector<QSharedPointer<const CVCertificate> > mCvCertificates;
29 QVector<QSharedPointer<const CVCertificate>> mCvCertificates;
3030 QByteArray mCertificateDescriptionAsBinary;
3131 QSharedPointer<const CertificateDescription> mCertificateDescription;
3232 QSharedPointer<const CHAT> mRequiredChat, mOptionalChat;
8181 mTransactionInfo = pTransactionInfo;
8282 }
8383
84
8584 public:
8685 Eac1InputType();
8786 ~Eac1InputType();
110109 }
111110
112111
113 const QVector<QSharedPointer<const CVCertificate> >& getCvCertificates() const
112 const QVector<QSharedPointer<const CVCertificate>>& getCvCertificates() const
114113 {
115114 return mCvCertificates;
116115 }
2222
2323 private:
2424 QByteArrayList mCvCertificatesAsBinary;
25 QVector<QSharedPointer<const CVCertificate> > mCvCertificates;
25 QVector<QSharedPointer<const CVCertificate>> mCvCertificates;
2626 QString mSignature;
2727 QString mEphemeralPublicKey;
2828 void appendCvcert(const QSharedPointer<const CVCertificate>& pCert);
3636
3737 const QString& getSignature() const;
3838 const QString& getEphemeralPublicKey() const;
39 const QVector<QSharedPointer<const CVCertificate> >& getCvCertificates() const;
39 const QVector<QSharedPointer<const CVCertificate>>& getCvCertificates() const;
4040 const QByteArrayList& getCvCertificatesAsBinary() const;
4141 };
4242
113113 {
114114 writeTextElement(QStringLiteral("CertificationAuthorityReference"), reference);
115115 }
116 if (!mEfCardAccess.isNull())
117 {
118 writeTextElement(QStringLiteral("EFCardAccess"), mEfCardAccess);
119 }
120 if (!mIdPICC.isNull())
121 {
122 writeTextElement(QStringLiteral("IDPICC"), mIdPICC);
123 }
124 if (!mChallenge.isNull())
125 {
126 writeTextElement(QStringLiteral("Challenge"), mChallenge);
127 }
116
117 writeTextElement(QStringLiteral("EFCardAccess"), mEfCardAccess);
118 writeTextElement(QStringLiteral("IDPICC"), mIdPICC);
119 writeTextElement(QStringLiteral("Challenge"), mChallenge);
128120
129121 mWriter.writeEndElement(); // AuthenticationProtocolData
130122 }
4444 const QSharedPointer<const CertificateDescription>& getCertificateDescription() const;
4545 const QByteArray& getCertificateDescriptionAsBinary() const;
4646 const ConnectionHandle& getConnectionHandle() const;
47 const QVector<QSharedPointer<const CVCertificate> >& getCvCertificates() const;
47 const QVector<QSharedPointer<const CVCertificate>>& getCvCertificates() const;
4848 const QString& getDidName() const;
4949 const QSharedPointer<const CHAT>& getOptionalChat() const;
5050 const QSharedPointer<const CHAT>& getRequiredChat() const;
3636 const QString& getDidName() const;
3737 const QString& getSignature() const;
3838 const QString& getEphemeralPublicKey() const;
39 const QVector<QSharedPointer<const CVCertificate> >& getCvCertificates() const;
39 const QVector<QSharedPointer<const CVCertificate>>& getCvCertificates() const;
4040 const QByteArrayList& getCvCertificatesAsBinary() const;
4141 };
4242
2727 getContext()->setWorkflowFinished(true);
2828 }
2929
30
3130 public:
3231 explicit FinalState(const QSharedPointer<WorkflowContext>& pContext)
3332 : AbstractState(pContext, false)
3838 {
3939 qCritical() << certificateDescError;
4040 const auto& issuerName = TlsChecker::getCertificateIssuerName(certificate);
41 updateStatus(GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_Hash_Not_In_Description, issuerName));
41 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Hash_Not_In_Description, {GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, issuerName}
42 });
4243 Q_EMIT fireAbort();
4344 return;
4445 }
185185 {
186186 if (TlsChecker::containsFatalError(mReply, pErrors))
187187 {
188 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_Ssl_Establishment_Error));
188 reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
189 });
189190 }
190191 }
191192
223224 context->addCertificateData(pUrl, pCertificate);
224225 };
225226
226 const auto& issuerName = TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate());
227 const GlobalStatus::ExternalInfoMap infoMap {
228 {GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate())},
229 {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
230 };
227231 switch (CertificateChecker::checkAndSaveCertificate(pSslConfiguration.peerCertificate(), mUrl, context->getDidAuthenticateEac1(), context->getDvCvc(), saveCertificateFunc))
228232 {
229233 case CertificateChecker::CertificateStatus::Good:
230234 break;
231235
232236 case CertificateChecker::CertificateStatus::Unsupported_Algorithm_Or_Length:
233 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length, issuerName));
237 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length, infoMap});
234238 return false;
235239
236240 case CertificateChecker::CertificateStatus::Hash_Not_In_Description:
237 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Hash_Not_In_Certificate_Description, issuerName));
241 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Hash_Not_In_Certificate_Description, infoMap});
238242 return false;
239243 }
240244
241245 if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey()))
242246 {
243 reportCommunicationError(GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length);
247 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
248 });
244249 return false;
245250 }
246251
251256 void StateCheckRefreshAddress::onNetworkReply()
252257 {
253258 const auto statusCode = NetworkManager::getLoggedStatusCode(mReply, spawnMessageLogger(network));
254
255259 if (mReply->error() != QNetworkReply::NoError)
256260 {
257261 qCritical() << "An error occured:" << mReply->errorString();
258262 switch (NetworkManager::toNetworkError(mReply.data()))
259263 {
260264 case NetworkManager::NetworkError::ServiceUnavailable:
261 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_ServiceUnavailable));
265 reportCommunicationError({GlobalStatus::Code::Network_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
266 });
262267 break;
263268
264269 case NetworkManager::NetworkError::TimeOut:
265 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_TimeOut));
270 reportCommunicationError({GlobalStatus::Code::Network_TimeOut, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
271 });
266272 break;
267273
268274 case NetworkManager::NetworkError::ProxyError:
269 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_Proxy_Error));
275 reportCommunicationError({GlobalStatus::Code::Network_Proxy_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
276 });
270277 break;
271278
272279 case NetworkManager::NetworkError::SecurityError:
273 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_Ssl_Establishment_Error));
280 reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
281 });
274282 break;
275283
276284 case NetworkManager::NetworkError::OtherError:
277 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_Other_Error));
285 reportCommunicationError({GlobalStatus::Code::Network_Other_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
286 });
278287 break;
279288 }
280289 return;
283292 if (statusCode != HTTP_STATUS_FOUND && statusCode != HTTP_STATUS_SEE_OTHER && statusCode != HTTP_STATUS_TEMPORARY_REDIRECT)
284293 {
285294 qCritical() << "Got unexpected status code:" << statusCode;
286 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Expected_Redirect, QString::number(statusCode)));
295 const GlobalStatus::ExternalInfoMap infoMap {
296 {GlobalStatus::ExternalInformation::HTTP_STATUS_CODE, QString::number(statusCode)},
297 {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
298 };
299 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Expected_Redirect, infoMap});
287300 return;
288301 }
289302
291304 if (redirectUrl.isEmpty())
292305 {
293306 qCritical() << "Got empty redirect URL";
294 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url));
307 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
308 });
295309 return;
296310 }
297311
298312 if (!redirectUrl.isValid())
299313 {
300314 qCritical() << "Got malformed redirect URL:" << redirectUrl;
301 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Malformed_Redirect_Url, QString::fromLatin1(redirectUrl.toEncoded())));
315 const GlobalStatus::ExternalInfoMap infoMap {
316 {GlobalStatus::ExternalInformation::REDIRECT_URL, redirectUrl.toString()},
317 {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()}
318 };
319 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Malformed_Redirect_Url, infoMap});
302320 return;
303321 }
304322
313331 else
314332 {
315333 qCritical() << httpsError;
316 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Invalid_Scheme, redirectUrl.scheme()));
334 const QMap<GlobalStatus::ExternalInformation, QString> infoMap {
335 {GlobalStatus::ExternalInformation::URL_SCHEME, redirectUrl.scheme()},
336 {GlobalStatus::ExternalInformation::LAST_URL, redirectUrl.toString()}
337 };
338 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Invalid_Scheme, infoMap});
317339 return;
318340 }
319341 }
368390
369391 mConnections += connect(mReply.data(), &QNetworkReply::encrypted, this, &StateCheckRefreshAddress::onSslHandshakeDoneFetchingServerCertificate);
370392 mConnections += connect(mReply.data(), &QNetworkReply::sslErrors, this, &StateCheckRefreshAddress::onSslErrors);
393 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
394 mConnections += connect(mReply.data(), &QNetworkReply::errorOccurred, this, &StateCheckRefreshAddress::onNetworkErrorFetchingServerCertificate);
395 #else
371396 mConnections += connect(mReply.data(), QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), this, &StateCheckRefreshAddress::onNetworkErrorFetchingServerCertificate);
397 #endif
372398 }
373399
374400
406432 return;
407433 }
408434 qCritical() << "An error occured fetching the server certificate:" << mReply->errorString();
409 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url));
435 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
436 });
410437 }
411438
412439
9797 if (TlsChecker::containsFatalError(mReply, pErrors))
9898 {
9999 qCCritical(network) << GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error);
100 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error);
100 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
101 });
101102 Q_EMIT fireAbort();
102103 }
103104 }
121122 case GlobalStatus::Code::Workflow_TrustedChannel_Ssl_Certificate_Unsupported_Algorithm_Or_Length:
122123 case GlobalStatus::Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length:
123124 {
124 const auto& issuerName = TlsChecker::getCertificateIssuerName(cfg.peerCertificate());
125 updateStatus(GlobalStatus(statusCode, issuerName));
125 const GlobalStatus::ExternalInfoMap infoMap {
126 {GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(cfg.peerCertificate())},
127 {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
128 };
129 updateStatus({statusCode, infoMap});
126130 break;
127131 }
128132
129133 default:
130 updateStatus(statusCode);
134 updateStatus({statusCode, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
135 });
131136 break;
132137 }
133138 abort = true;
148153 else
149154 {
150155 qCCritical(network) << sessionFailedError;
151 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error);
156 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
157 });
152158 abort = true;
153159 }
154160 }
288294 if (statusCode >= 500)
289295 {
290296 qCCritical(network) << GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_Error_From_Server);
291 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Error_From_Server);
297 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Error_From_Server, {GlobalStatus::ExternalInformation::LAST_URL, reply->url().toString()}
298 });
292299 Q_EMIT fireAbort();
293300 return;
294301 }
296303 if (statusCode >= 400)
297304 {
298305 qCCritical(network) << GlobalStatus(GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer);
299 updateStatus(GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer);
306 updateStatus({GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, reply->url().toString()}
307 });
300308 Q_EMIT fireAbort();
301309 return;
302310 }
319327 if (paosHandler.getDetectedPaosType() == PaosType::UNKNOWN)
320328 {
321329 qCCritical(network) << "The program received an unknown message from the server.";
322 updateStatus(GlobalStatus::Code::Workflow_Unknown_Paos_From_EidServer);
330 updateStatus({GlobalStatus::Code::Workflow_Unknown_Paos_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, reply->url().toString()}
331 });
323332 Q_EMIT fireAbort();
324333 }
325334 else
326335 {
327336 qCCritical(network) << "The program received an unexpected message from the server.";
328 updateStatus(GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer);
337 updateStatus({GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, reply->url().toString()}
338 });
329339 Q_EMIT fireAbort();
330340 }
331341 return;
6565 {
6666 }
6767
68
6968 protected:
7069 virtual QSharedPointer<PaosMessage> getAsMessage() override
7170 {
10099 Q_EMIT fireReceivedStartPaosResponse();
101100 }
102101 }
103
104102
105103 Q_SIGNALS:
106104 void fireReceivedDidList();
124122 {
125123 }
126124
127
128125 protected:
129126 virtual QSharedPointer<PaosMessage> getAsMessage() override
130127 {
155152 Q_EMIT fireReceivedStartPaosResponse();
156153 }
157154 }
158
159155
160156 Q_SIGNALS:
161157 void fireReceivedExtractCvcsFromEac1InputType();
178174 {
179175 }
180176
181
182177 protected:
183178 virtual QSharedPointer<PaosMessage> getAsMessage() override
184179 {
209204 Q_EMIT fireReceivedStartPaosResponse();
210205 }
211206 }
212
213207
214208 Q_SIGNALS:
215209 void fireReceivedDisconnect();
231225 {
232226 }
233227
234
235228 protected:
236229 virtual QSharedPointer<PaosMessage> getAsMessage() override
237230 {
262255 Q_EMIT fireReceivedStartPaosResponse();
263256 }
264257 }
265
266258
267259 Q_SIGNALS:
268260 void fireReceivedDisconnect();
284276 {
285277 }
286278
287
288279 protected:
289280 virtual QSharedPointer<PaosMessage> getAsMessage() override
290281 {
311302 Q_EMIT fireReceivedStartPaosResponse();
312303 }
313304 }
314
315305
316306 Q_SIGNALS:
317307 void fireReceivedStartPaosResponse();
332322 {
333323 }
334324
335
336325 protected:
337326 virtual QSharedPointer<PaosMessage> getAsMessage() override
338327 {
363352 Q_EMIT fireReceivedStartPaosResponse();
364353 }
365354 }
366
367355
368356 Q_SIGNALS:
369357 void fireReceivedDisconnect();
385373 {
386374 }
387375
388
389376 protected:
390377 virtual QSharedPointer<PaosMessage> getAsMessage() override
391378 {
416403 Q_EMIT fireReceivedStartPaosResponse();
417404 }
418405 }
419
420406
421407 Q_SIGNALS:
422408 void fireReceivedDisconnect();
436422 {
437423 }
438424
439
440425 protected:
441426 virtual QSharedPointer<PaosMessage> getAsMessage() override
442427 {
7979 context->addCertificateData(pUrl, pCertificate);
8080 };
8181
82 const auto& issuerName = TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate());
82 GlobalStatus::ExternalInfoMap infoMap {
83 {GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate())}
84 };
85 if (!mReply.isNull())
86 {
87 infoMap.insert(GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString());
88 }
89
8390 switch (CertificateChecker::checkAndSaveCertificate(pSslConfiguration.peerCertificate(), getContext()->getRefreshUrl(), context->getDidAuthenticateEac1(), context->getDvCvc(), saveCertificateFunc))
8491 {
8592 case CertificateChecker::CertificateStatus::Good:
8693 break;
8794
8895 case CertificateChecker::CertificateStatus::Unsupported_Algorithm_Or_Length:
89 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length, issuerName));
96 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length, infoMap));
9097 return false;
9198
9299 case CertificateChecker::CertificateStatus::Hash_Not_In_Description:
93 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Hash_Not_In_Certificate_Description, issuerName));
100 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Workflow_Network_Ssl_Hash_Not_In_Certificate_Description, infoMap));
94101 return false;
95102 }
96103
97104 if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey()))
98105 {
99 reportCommunicationError(GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length);
106 reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap});
100107 return false;
101108 }
102109
108115 {
109116 if (TlsChecker::containsFatalError(mReply, pErrors))
110117 {
111 reportCommunicationError(GlobalStatus(GlobalStatus::Code::Network_Ssl_Establishment_Error));
118 GlobalStatus::ExternalInfoMap infoMap;
119 if (!mReply.isNull())
120 {
121 infoMap.insert(GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString());
122 }
123
124 reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, infoMap});
112125 }
113126 }
114127
7979 qCritical() << httpsError1;
8080 qCritical() << httpsError2;
8181 getContext()->setTcTokenNotFound(false);
82 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error);
82 const GlobalStatus::ExternalInfoMap& infoMap {
83 {GlobalStatus::ExternalInformation::LAST_URL, pUrl.toString()},
84 {GlobalStatus::ExternalInformation::URL_SCHEME, pUrl.scheme()}
85 };
86 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error, infoMap});
8387 return false;
8488 }
8589 }
113117 const auto& cfg = mReply->sslConfiguration();
114118 TlsChecker::logSslConfig(cfg, spawnMessageLogger(network));
115119
120 const GlobalStatus status {GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
121 };
116122 // At this point we can only check the certificate key's length.
117123 if (!TlsChecker::hasValidCertificateKeyLength(cfg.peerCertificate()))
118124 {
119125 mReply->abort();
120126 qCritical() << "Error while connecting to the provider. The server's SSL certificate uses an unsupported key algorithm or length.";
121 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error);
127 updateStatus(status);
122128 Q_EMIT fireAbort();
123129 return;
124130 }
127133 {
128134 mReply->abort();
129135 qCritical() << "Error while connecting to the provider. The SSL connection uses an unsupported key algorithm or length.";
130 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error);
136 updateStatus(status);
131137 Q_EMIT fireAbort();
132138 return;
133139 }
166172 if (statusCode != HTTP_STATUS_SEE_OTHER && statusCode != HTTP_STATUS_FOUND && statusCode != HTTP_STATUS_TEMPORARY_REDIRECT)
167173 {
168174 qCritical() << "Error while connecting to the provider. The server returns an unexpected status code:" << statusCode;
169 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error);
175 const GlobalStatus::ExternalInfoMap infoMap {
176 {GlobalStatus::ExternalInformation::HTTP_STATUS_CODE, QString::number(statusCode)},
177 {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
178 };
179 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error, infoMap});
170180 Q_EMIT fireAbort();
171181 return;
172182 }
183193 if (data.isEmpty())
184194 {
185195 qDebug() << "Received no data.";
186 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_No_Data_Received);
196 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_No_Data_Received, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
197 });
187198 Q_EMIT fireAbort();
188199 return;
189200 }
204215 }
205216
206217 qCritical() << "TCToken invalid";
207 updateStatus(GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error);
218 updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()}
219 });
208220 Q_EMIT fireAbort();
209221 }
2323 friend class StateBuilder;
2424 friend class ::test_StatePreVerification;
2525
26 const QVector<QSharedPointer<const CVCertificate> > mTrustedCvcas;
26 const QVector<QSharedPointer<const CVCertificate>> mTrustedCvcas;
2727 const QDateTime mValidationDateTime;
2828
2929 explicit StatePreVerification(const QSharedPointer<WorkflowContext>& pContext);
3030 virtual void run() override;
3131
32 bool isValid(const QVector<QSharedPointer<const CVCertificate> >& pCertificates);
33 void saveCvcaLinkCertificates(const QVector<QSharedPointer<const CVCertificate> >& pCertificates);
32 bool isValid(const QVector<QSharedPointer<const CVCertificate>>& pCertificates);
33 void saveCvcaLinkCertificates(const QVector<QSharedPointer<const CVCertificate>>& pCertificates);
3434 };
3535
3636 } // namespace governikus
2222 else
2323 {
2424 qCritical() << "Cannot send \"Processing\" to caller:" << activationContext->getSendError();
25 updateStatus(GlobalStatus(GlobalStatus::Code::Workflow_Processing_Error, activationContext->getSendError()));
25 updateStatus({GlobalStatus::Code::Workflow_Processing_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()}
26 });
2627 Q_EMIT fireAbort();
2728 }
2829 }
6969 else
7070 {
7171 qCritical() << "Cannot send error page to caller:" << activationContext->getSendError();
72 updateStatus(GlobalStatus(GlobalStatus::Code::Workflow_Error_Page_Transmission_Error, activationContext->getSendError()));
72 updateStatus({GlobalStatus::Code::Workflow_Error_Page_Transmission_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()}
73 });
7374 Q_EMIT fireAbort();
7475 }
7576 }
9899 if (!activationContext->sendRedirect(pRedirectAddress, GlobalStatus(pResult)))
99100 {
100101 qCritical() << "Cannot send redirect to caller:" << activationContext->getSendError();
101 updateStatus(GlobalStatus(GlobalStatus::Code::Workflow_Redirect_Transmission_Error, activationContext->getSendError()));
102 updateStatus({GlobalStatus::Code::Workflow_Redirect_Transmission_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()}
103 });
102104 Q_EMIT fireAbort();
103105 return false;
104106 }
+0
-29
src/core/states/StateSelectPasswordId.cpp less more
0 /*!
1 * \copyright Copyright (c) 2018-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #include "StateSelectPasswordId.h"
5
6
7 using namespace governikus;
8
9
10 StateSelectPasswordId::StateSelectPasswordId(const QSharedPointer<WorkflowContext>& pContext)
11 : AbstractState(pContext, false)
12 , GenericContextContainer(pContext)
13 {
14 }
15
16
17 void StateSelectPasswordId::run()
18 {
19 const bool canAllowed = getContext()->isCanAllowedMode();
20 qDebug() << "CAN allowed:" << canAllowed;
21 if (canAllowed)
22 {
23 Q_EMIT firePasswordIdCAN();
24 return;
25 }
26
27 Q_EMIT fireContinue();
28 }
+0
-28
src/core/states/StateSelectPasswordId.h less more
0 /*!
1 * \copyright Copyright (c) 2018-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #pragma once
5
6 #include "AbstractState.h"
7 #include "context/WorkflowContext.h"
8 #include "GenericContextContainer.h"
9
10 namespace governikus
11 {
12
13 class StateSelectPasswordId
14 : public AbstractState
15 , public GenericContextContainer<WorkflowContext>
16 {
17 Q_OBJECT
18 friend class StateBuilder;
19
20 explicit StateSelectPasswordId(const QSharedPointer<WorkflowContext>& pContext);
21 virtual void run() override;
22
23 Q_SIGNALS:
24 void firePasswordIdCAN();
25 };
26
27 } // namespace governikus
66 #include "asn1/AccessRoleAndRight.h"
77
88 #include "AppSettings.h"
9 #include "LanguageLoader.h"
910
1011 using namespace governikus;
1112
4243 auto subjectUrl = certDesc->getSubjectUrl();
4344
4445 CVCertificateBody body = getContext()->getDidAuthenticateEac1()->getCvCertificates().at(0)->getBody();
45 QString effectiveDate = body.getCertificateEffectiveDate().toString(Qt::DefaultLocaleShortDate);
46 QString expirationDate = body.getCertificateExpirationDate().toString(Qt::DefaultLocaleShortDate);
46 const auto locale = LanguageLoader::getInstance().getUsedLocale();
47 const auto effectiveDate = locale.toString(body.getCertificateEffectiveDate(), QLocale::ShortFormat);
48 const auto expirationDate = locale.toString(body.getCertificateExpirationDate(), QLocale::ShortFormat);
4749 //: LABEL ALL_PLATFORMS
4850 QString validity = tr("Validity:\n%1 - %2").arg(effectiveDate, expirationDate);
4951
3636 public:
3737 PdfExporter(const QString& pFilename, bool pOpenFile = true, bool pFixFilename = true);
3838 bool exportHistory();
39 bool exportSelfInfo(const QDateTime& pDate, const QVector<QPair<QString, QString> >& pInfoData);
39 bool exportSelfInfo(const QDateTime& pDate, const QVector<QPair<QString, QString>>& pInfoData);
4040 };
4141
4242 } // namespace governikus
131131 return;
132132 }
133133
134 const auto hasError = mCurrentReply->error() != QNetworkReply::NoError;
134135 const auto statusCode = NetworkManager::getLoggedStatusCode(mCurrentReply, spawnMessageLogger(network));
135136 switch (statusCode)
136137 {
143144 lastModified = QDateTime::currentDateTime();
144145 }
145146
146 Q_EMIT fireDownloadSuccess(mCurrentRequest->url(), lastModified, mCurrentReply->readAll());
147 const auto readData = mCurrentReply->readAll();
148 if (!hasError && readData.size() > 0)
149 {
150 Q_EMIT fireDownloadSuccess(mCurrentRequest->url(), lastModified, readData);
151 }
152 else
153 {
154 qCCritical(fileprovider).nospace() << "Received no data." << mCurrentReply->errorString() << " [" << textForLog << "]";
155 Q_EMIT fireDownloadFailed(url, NetworkManager::toStatus(mCurrentReply).getStatusCode());
156 }
147157 break;
148158 }
149159
156166 break;
157167
158168 default:
159 if (mCurrentReply->error() != QNetworkReply::NoError)
169 if (hasError)
160170 {
161171 qCCritical(fileprovider).nospace() << mCurrentReply->errorString() << " [" << textForLog << "]";
162172 Q_EMIT fireDownloadFailed(url, NetworkManager::toStatus(mCurrentReply).getStatusCode());
2828 private:
2929 QSharedPointer<QNetworkRequest> mCurrentRequest;
3030 QNetworkReply* mCurrentReply;
31 QQueue<QSharedPointer<QNetworkRequest> > mPendingRequests;
31 QQueue<QSharedPointer<QNetworkRequest>> mPendingRequests;
3232
3333 void scheduleDownload(QSharedPointer<QNetworkRequest> pDownloadRequest);
3434 void startDownloadIfPending();
2121 friend class Env;
2222
2323 private:
24 QHash<QString, QSharedPointer<UpdatableFile> > mUpdatableFiles;
24 QHash<QString, QSharedPointer<UpdatableFile>> mUpdatableFiles;
2525 QMutex mGetFileMutex;
2626
2727 protected:
196196 {
197197 if (pUpdateUrl == mUpdateUrl)
198198 {
199 Q_EMIT fireNoUpdateAvailable();
200
199201 cleanupAfterUpdate([&](){
200202 clearDirty();
201203 });
220222 {
221223 qCCritical(fileprovider) << "Not all data could not be written to file:" << pFilePath;
222224 file.close();
225 file.remove();
223226 return false;
224227 }
225228
7171
7272 Q_SIGNALS:
7373 void fireUpdated();
74 void fireNoUpdateAvailable();
7475
7576 };
7677
2828 ~BuildHelper() = delete;
2929
3030 public:
31 static QVector<QPair<QLatin1String, QString> > getInformationHeader();
31 static QVector<QPair<QLatin1String, QString>> getInformationHeader();
3232 static void processInformationHeader(const std::function<void(const QString&, const QString&)>& pFunc, bool pTranslate = true);
3333
3434
4242 {
4343 }
4444
45
4645 public:
4746 static GlobalStatus toGlobalStatus(CardReturnCode pCode);
4847 static bool equalsWrongPacePassword(CardReturnCode pCode);
593593 switch (getMajor())
594594 {
595595 case Major::Unknown:
596 return GlobalStatus(GlobalStatus::Code::Unknown_Error, message);
596 return {GlobalStatus::Code::Unknown_Error, {GlobalStatus::ExternalInformation::ECARDAPI_ERROR, message}
597 };
597598
598599 case Major::Ok:
599600 if (isOk())
603604 Q_FALLTHROUGH();
604605
605606 case Major::Error:
606 return GlobalStatus(toStatus(getMinor()), message, toStatus(d->mOrigin));
607 return {toStatus(getMinor()), {GlobalStatus::ExternalInformation::ECARDAPI_ERROR, message}, toStatus(d->mOrigin)};
607608
608609 case Major::Warning:
609 return GlobalStatus(GlobalStatus::Code::Paos_Unexpected_Warning, message);
610 return {GlobalStatus::Code::Paos_Unexpected_Warning, {GlobalStatus::ExternalInformation::ECARDAPI_ERROR, message}
611 };
610612 }
611613
612614 Q_UNREACHABLE();
9595 mutable QReadWriteLock mLock;
9696 #endif
9797
98 QMap<Identifier, QWeakPointer<QObject> > mSharedInstances;
98 QMap<Identifier, QWeakPointer<QObject>> mSharedInstances;
9999 mutable QReadWriteLock mSharedInstancesLock;
100100
101101 static Env& getInstance();
203203 // unlock would allow to delete the wrapper.
204204 for (auto mock : qAsConst(mInstancesCreator)) // clazy:exclude=range-loop
205205 {
206 auto creator = mock.dynamicCast<FuncWrapper<T, Args ...> >();
206 auto creator = mock.dynamicCast<FuncWrapper<T, Args ...>>();
207207 if (creator)
208208 {
209209 locker.unlock();
215215
216216 return newObject<T>(std::forward<Args>(pArgs) ...);
217217 }
218
219218
220219 protected:
221220 Env();
283282
284283 for (const auto& mock : qAsConst(holder.mInstancesCreator))
285284 {
286 if (mock.dynamicCast<FuncWrapper<T, Args ...> >())
285 if (mock.dynamicCast<FuncWrapper<T, Args ...>>())
287286 {
288287 return mock->getCounter();
289288 }
298297 {
299298 Q_ASSERT(pFunc);
300299
301 const auto& value = QSharedPointer<FuncWrapper<T, Args ...> >::create(std::move(pFunc));
300 const auto& value = QSharedPointer<FuncWrapper<T, Args ...>>::create(std::move(pFunc));
302301
303302 auto& holder = getInstance();
304303 const QWriteLocker locker(&holder.mLock);
307306 while (iter.hasNext())
308307 {
309308 iter.next();
310 if (iter.value().dynamicCast<FuncWrapper<T, Args ...> >())
309 if (iter.value().dynamicCast<FuncWrapper<T, Args ...>>())
311310 {
312311 iter.setValue(value);
313312 return;
3434 #endif
3535 }
3636
37
3837 public:
3938 static QString getPath(const QString& pFilename,
4039 QStandardPaths::LocateOption pOption = QStandardPaths::LocateFile,
4140 QStandardPaths::StandardLocation pStandard = QStandardPaths::AppDataLocation)
4241 {
43 #if defined(Q_OS_LINUX) || (defined(Q_OS_BSD4) && !defined(Q_OS_MACOS) && !defined(Q_OS_IOS))
42 #if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || (defined(Q_OS_BSD4) && !defined(Q_OS_MACOS) && !defined(Q_OS_IOS))
4443 const auto match = QStandardPaths::locate(pStandard, pFilename, pOption);
4544 if (!match.isNull())
4645 {
1919 * where readers has type QVector<Reader>
2020 */
2121 template<typename S, typename T>
22 typename std::enable_if<!std::is_void<T>::value, QVector<T> >::type map(const std::function<T(const S&)>& pFunc, const QVector<S>& pItems)
22 typename std::enable_if<!std::is_void<T>::value, QVector<T>>::type map(const std::function<T(const S&)>& pFunc, const QVector<S>& pItems)
2323 {
2424 const int sz = pItems.size();
2525 QVector<T> result(sz);
3838 * where readers has type QList<Reader>
3939 */
4040 template<typename S, typename T>
41 typename std::enable_if<!std::is_void<T>::value, QList<T> >::type map(const std::function<T(const S&)>& pFunc, const QList<S>& pItems)
41 typename std::enable_if<!std::is_void<T>::value, QList<T>>::type map(const std::function<T(const S&)>& pFunc, const QList<S>& pItems)
4242 {
4343 const int sz = pItems.size();
4444 QList<T> result;
5757 * where readers has type QVector<Reader>
5858 */
5959 template<typename T>
60 typename std::enable_if<!std::is_void<T>::value, QVector<T> >::type filter(const std::function<bool(const T&)>& pFunc, const QVector<T>& pItems)
60 typename std::enable_if<!std::is_void<T>::value, QVector<T>>::type filter(const std::function<bool(const T&)>& pFunc, const QVector<T>& pItems)
6161 {
6262 QVector<T> result;
6363 for (const T& item : pItems)
1515 });
1616
1717
18 const QString GlobalStatus::getExternalInfo(int pIndex) const
19 {
20 return d->mExternalInformation.value(pIndex);
18 QString GlobalStatus::getExternalInfo(ExternalInformation pType) const
19 {
20 return d->mExternalInformation.value(pType);
2121 }
2222
2323
3636 case Code::Workflow_Certificate_Sop_Error:
3737 case Code::Workflow_Error_Page_Transmission_Error:
3838 case Code::Workflow_Processing_Error:
39 case Code::Workflow_Redirect_Transmission_Error:
4039 case Code::Workflow_TrustedChannel_Establishment_Error:
4140 case Code::Workflow_TrustedChannel_Error_From_Server:
4241 case Code::Workflow_TrustedChannel_No_Data_Received:
189188 case Code::Workflow_TrustedChannel_Hash_Not_In_Description:
190189 case Code::Workflow_Network_Ssl_Hash_Not_In_Certificate_Description:
191190 //: ERROR ALL_PLATFORMS The TLS certificate was not folded with the Authorization Certificate, thus violating the security requirements. Might also be caused by a firewall and/or the antivirus software.
192 return tr("Hash of TLS certificate not in certificate description (issuer: %1). This indicates a misconfiguration or manipulation of the certificate. Please check that your antivirus-software and firewalls are not interfering with TLS traffic.").arg(getExternalInfo());
191 return tr("Hash of TLS certificate not in certificate description (issuer: %1). This indicates a misconfiguration or manipulation of the certificate. Please check that your antivirus-software and firewalls are not interfering with TLS traffic.").arg(getExternalInfo(ExternalInformation::CERTIFICATE_ISSUER_NAME));
193192
194193 case Code::Workflow_TrustedChannel_No_Data_Received:
195194 //: ERROR_MASKED ALL_PLATFORMS Received an empty TC token.
243242 case Code::Workflow_TrustedChannel_Ssl_Certificate_Unsupported_Algorithm_Or_Length:
244243 case Code::Workflow_Network_Ssl_Certificate_Unsupported_Algorithm_Or_Length:
245244 //: ERROR ALL_PLATFORMS Received a TLS certificate that uses an invalid algorithm or key length.
246 return tr("Error while connecting to the server. The TLS certificate uses an unsupported key algorithm or length. Certificate issuer: %1").arg(getExternalInfo());
245 return tr("Error while connecting to the server. The TLS certificate uses an unsupported key algorithm or length. Certificate issuer: %1").arg(getExternalInfo(ExternalInformation::CERTIFICATE_ISSUER_NAME));
247246
248247 case Code::Workflow_Network_Empty_Redirect_Url:
249248 //: ERROR_MASKED ALL_PLATFORMS The redirect URL could not be determined because the server sent an empty response.
251250
252251 case Code::Workflow_Network_Expected_Redirect:
253252 //: ERROR_MASKED ALL_PLATFORMS The redirect URL could not be determined due to an erroneous HTTP code.
254 return tr("Expected redirect, got %1").arg(getExternalInfo());
253 return tr("Expected redirect, got %1").arg(getExternalInfo(ExternalInformation::HTTP_STATUS_CODE));
255254
256255 case Code::Workflow_Network_Invalid_Scheme:
257256 //: ERROR_MASKED ALL_PLATFORMS The redirect URL could not be determined because the redirect URL did not adhere to the HTTPS scheme.
258 return tr("Invalid scheme: %1").arg(getExternalInfo());
257 return tr("Invalid scheme: %1").arg(getExternalInfo(ExternalInformation::URL_SCHEME));
259258
260259 case Code::Workflow_Network_Malformed_Redirect_Url:
261260 //: ERROR_MASKED ALL_PLATFORMS The redirect URL could not be determined because the redirect URL was invalid.
262 return tr("Malformed redirect URL: %1").arg(getExternalInfo());
261 return tr("Malformed redirect URL: %1").arg(getExternalInfo(ExternalInformation::REDIRECT_URL));
263262
264263 case Code::Workflow_Cancellation_By_User:
264 //: ERROR ALL_PLATFORMS The user cancelled the authentication in the UI.
265 return tr("The process has been cancelled.");
266
265267 case Code::Card_Cancellation_By_User:
266 //: ERROR ALL_PLATFORMS The user cancelled the authentication in either the UI or the card reader.
267 return tr("The process has been cancelled.");
268 //: ERROR ALL_PLATFORMS The user cancelled the authentication on his card reader.
269 return tr("The process has been cancelled by the card reader.");
268270
269271 case Code::Paos_Generic_Server_Error:
270272 case Code::Paos_Unexpected_Warning:
302304
303305 case Code::Card_Invalid_Can:
304306 //: ERROR ALL_PLATFORMS The ID card declined the CAN.
305 return tr("The given card access number (CAN) is not correct.");
307 return tr("The given Card Access Number (CAN) is not correct.");
306308
307309 case Code::Card_Invalid_Puk:
308310 //: ERROR ALL_PLATFORMS The ID card declined the PUK.
378380 }
379381
380382
383 QString GlobalStatus::getExternalInfo(const QString& pToken) const
384 {
385 if (d->mExternalInformation.empty())
386 {
387 return {};
388 }
389
390 if (d->mExternalInformation.size() == 1)
391 {
392 return d->mExternalInformation.first();
393 }
394
395 QStringList keyValue;
396 const auto& keys = d->mExternalInformation.keys();
397 for (const auto key : keys)
398 {
399 keyValue << QStringLiteral("%1: %2").arg(Enum<ExternalInformation>::getName(key), d->mExternalInformation[key]);
400 }
401
402 return keyValue.join(pToken);
403 }
404
405
381406 GlobalStatus::Origin GlobalStatus::getOrigin() const
382407 {
383408 return d->mOrigin;
88 #include "EnumHelper.h"
99
1010 #include <QCoreApplication>
11 #include <QMap>
12 #include <QPair>
1113 #include <QSharedData>
1214
1315 namespace governikus
117119 Server, Client
118120 };
119121
122 enum class ExternalInformation
123 {
124 ECARDAPI_ERROR,
125 LAST_URL,
126 HTTP_STATUS_CODE,
127 REDIRECT_URL,
128 CERTIFICATE_ISSUER_NAME,
129 URL_SCHEME,
130 ACTIVATION_ERROR
131 };
132
133 using ExternalInfoMap = QMap<ExternalInformation, QString>;
134
120135 Q_ENUM(Code)
121136 Q_ENUM(Origin)
137 Q_ENUM(ExternalInformation)
122138
123139 private:
124140 class InternalStatus
126142 {
127143 public:
128144 const Code mStatusCode;
129 const QStringList mExternalInformation;
145 const ExternalInfoMap mExternalInformation;
130146 const Origin mOrigin;
131147
132 InternalStatus(Code pStatusCode, const QStringList& pExternalInformation, const Origin pOrigin)
148 InternalStatus(Code pStatusCode, const ExternalInfoMap& pExternalInformation, const Origin pOrigin)
133149 : mStatusCode(pStatusCode)
134150 , mExternalInformation(pExternalInformation)
151 , mOrigin(pOrigin)
152 {
153 }
154
155
156 InternalStatus(Code pStatusCode, const QPair<ExternalInformation, QString>& pExternalInformation, const Origin pOrigin)
157 : mStatusCode(pStatusCode)
158 , mExternalInformation({
159 {pExternalInformation.first, pExternalInformation.second}
160 })
135161 , mOrigin(pOrigin)
136162 {
137163 }
148174 };
149175
150176 QSharedDataPointer<InternalStatus> d;
151 const QString getExternalInfo(int pIndex = 0) const;
177 QString getExternalInfo(ExternalInformation pType) const;
152178
153179 QString toErrorDescriptionInternal() const;
154180
155181 public:
156 GlobalStatus(Code pStatusCode = Code::Unknown_Error, const QStringList& pExternalInformation = QStringList(), const Origin pOrigin = Origin::Client)
182 GlobalStatus(Code pStatusCode, const ExternalInfoMap& pExternalInformation, const Origin pOrigin = Origin::Client)
157183 : d(new InternalStatus(pStatusCode, pExternalInformation, pOrigin))
158184 {
159185 }
160186
161187
162 GlobalStatus(Code pStatusCode, const QString& pExternalInformation, const Origin pOrigin = Origin::Client)
163 : GlobalStatus(pStatusCode, QStringList(pExternalInformation), pOrigin)
188 GlobalStatus(Code pStatusCode, const QPair<ExternalInformation, QString>& pExternalInformation, const Origin pOrigin = Origin::Client)
189 : d(new InternalStatus(pStatusCode, pExternalInformation, pOrigin))
190 {
191 }
192
193
194 GlobalStatus(Code pStatusCode = Code::Unknown_Error, const Origin pOrigin = Origin::Client)
195 : d(new InternalStatus(pStatusCode, ExternalInfoMap(), pOrigin))
164196 {
165197 }
166198
171203 Code getStatusCode() const;
172204
173205 QString toErrorDescription(const bool pSimplifiedVersion = false) const;
206 QString getExternalInfo(const QString& pToken = QStringLiteral("; ")) const;
174207
175208 Origin getOrigin() const;
176209 bool isOriginServer() const;
1717 {
1818 private:
1919 friend class ::test_Initializer;
20 std::list<std::function<void()> > mRegisteredFunctions;
20 std::list<std::function<void()>> mRegisteredFunctions;
2121
2222 protected:
2323 Initializer() = default;
2727 static QLocale mDefaultLanguage;
2828
2929 QString mPath;
30 QVector<QSharedPointer<QTranslator> > mTranslatorList;
30 QVector<QSharedPointer<QTranslator>> mTranslatorList;
3131 const QStringList mComponentList;
3232 QLocale mUsedLocale;
3333
371371
372372 bool LogHandler::copy(const QString& pDest)
373373 {
374 const QMutexLocker mutexLocker(&mMutex);
375
376 if (useLogfile())
377 {
378 return copyOther(mLogFile.fileName(), pDest);
379 }
380
381 return false;
382 }
383
384
385 bool LogHandler::copyOther(const QString& pSource, const QString& pDest) const
386 {
374387 if (pDest.trimmed().isEmpty())
375388 {
376389 return false;
377390 }
378391
379 const QMutexLocker mutexLocker(&mMutex);
380 return QFile::copy(mLogFile.fileName(), pDest);
392 if (pSource != mLogFile.fileName() && !getOtherLogfiles().contains(pSource))
393 {
394 return false;
395 }
396
397 if (QFile::exists(pDest) && !QFile::remove(pDest))
398 {
399 return false;
400 }
401
402 return QFile::copy(pSource, pDest);
381403 }
382404
383405
2121 QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, category().categoryName())
2222
2323 class test_LogHandler;
24 class test_LogModel;
2425
2526 namespace governikus
2627 {
3132 Q_OBJECT
3233 friend class Env;
3334 friend class ::test_LogHandler;
35 friend class ::test_LogModel;
3436
3537 struct LogWindowEntry
3638 {
8688
8789 void setAutoRemove(bool pRemove);
8890 bool copy(const QString& pDest);
91 bool copyOther(const QString& pSource, const QString& pDest) const;
8992 void resetBacklog();
9093 QByteArray getBacklog(bool pAll = false);
9194 QByteArray getCriticalLogWindow();
4545
4646 entropy += static_cast<T>(std::chrono::system_clock::now().time_since_epoch().count());
4747 entropy += std::random_device()();
48 entropy += static_cast<T>(qrand());
4948 entropy += QRandomGenerator::securelySeeded().generate();
5049
5150 UniversalBuffer<T> buffer;
156155 buffer.number = mGenerator();
157156 RAND_seed(buffer.data, sizeof(std::mt19937::result_type));
158157
159 static const int MINIMUM_ENTROPY_SOURCES = 5;
158 static const int MINIMUM_ENTROPY_SOURCES = 4;
160159 mSecureRandom = seed.size() >= MINIMUM_ENTROPY_SOURCES;
161160 }
162161
1414 {
1515
1616 QT_WARNING_PUSH
17 QT_WARNING_DISABLE_DEPRECATED
17 QT_WARNING_DISABLE_DEPRECATED
1818
1919 class [[deprecated ("Use qScopeGuard")]] ScopeGuard
2020 {
3232
3333 public:
3434 ScopeGuard(const ScopeGuard& pCopy) = delete;
35 ScopeGuard(const ScopeGuard && pCopy) = delete;
35 ScopeGuard(const ScopeGuard&& pCopy) = delete;
3636 ScopeGuard& operator=(const ScopeGuard& pCopy) = delete;
3737 ScopeGuard& operator=(const ScopeGuard&& pCopy) = delete;
3838
3939 ~ScopeGuard();
40
41 void dismiss()
42 {
43 setEnabled(false);
44 }
45
46
4047 };
4148
4249 #if (QT_VERSION < QT_VERSION_CHECK(5, 12, 0))
8383 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
8484 QCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
8585 #endif
86 #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
8786 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
88 #endif
8987
9088 QCoreApplication::setOrganizationName(QStringLiteral(VENDOR));
9189 QCoreApplication::setOrganizationDomain(QStringLiteral(VENDOR_DOMAIN));
3030 , mOptionNoLogFile(QStringLiteral("no-logfile"), QStringLiteral("Disable logfile."))
3131 , mOptionNoLogHandler(QStringLiteral("no-loghandler"), QStringLiteral("Disable default log handler."))
3232 , mOptionShowWindow(QStringLiteral("show"), QStringLiteral("Show window on startup."))
33 , mOptionProxy(QStringLiteral("no-proxy"), QStringLiteral("Disable system proxy."))
33 , mOptionProxy(QStringLiteral("no-proxy"), QStringLiteral("Ignore proxy settings."))
3434 , mOptionUi(QStringLiteral("ui"), QStringLiteral("Use given UI plugin."), UILoader::getInstance().getDefault().join(QLatin1Char(',')))
3535 , mOptionPort(QStringLiteral("port"), QStringLiteral("Use listening port."), QString::number(PortFile::cDefaultPort))
3636 {
1818 Q_OBJECT
1919
2020 public:
21 explicit DatagramHandler(bool pListen = true);
21 explicit DatagramHandler(bool pEnableListening = true);
2222 virtual ~DatagramHandler();
2323 virtual bool isBound() const = 0;
2424 virtual bool send(const QByteArray& pData) = 0;
2626 }
2727
2828
29 template<> DatagramHandler* createNewObject<DatagramHandler*, bool>(bool&& pListen)
30 {
31 return new DatagramHandlerImpl(pListen);
29 template<> DatagramHandler* createNewObject<DatagramHandler*, bool>(bool&& pEnableListening)
30 {
31 return new DatagramHandlerImpl(pEnableListening);
3232 }
3333
3434
3636
3737 quint16 DatagramHandlerImpl::cPort = PortFile::cDefaultPort;
3838
39 DatagramHandlerImpl::DatagramHandlerImpl(bool pListen, quint16 pPort)
39 DatagramHandlerImpl::DatagramHandlerImpl(bool pEnableListening, quint16 pPort)
4040 : DatagramHandler()
41 , mSocket(new QUdpSocket)
41 , mSocket()
4242 , mMulticastLock()
4343 , mUsedPort(pPort)
4444 , mPortFile(QStringLiteral("udp"))
45 {
46 #ifndef QT_NO_NETWORKPROXY
45 , mEnableListening(pEnableListening)
46 {
47 resetSocket();
48 }
49
50
51 void DatagramHandlerImpl::resetSocket()
52 {
53 mSocket.reset(new QUdpSocket);
4754 mSocket->setProxy(QNetworkProxy::NoProxy);
48 #endif
4955
5056 connect(mSocket.data(), &QUdpSocket::readyRead, this, &DatagramHandlerImpl::onReadyRead);
5157
52 if (!pListen)
58 if (!mEnableListening)
5359 {
5460 qCDebug(network) << "Skipping binding";
5561
9399
94100 bool DatagramHandlerImpl::send(const QByteArray& pData)
95101 {
96 return sendToAllAddressEntries(pData, 0);
102 if (!sendToAllAddressEntries(pData, 0))
103 {
104 qCDebug(network) << "Socket error, resetting broadcasting socket.";
105 resetSocket();
106 return false;
107 }
108 return true;
97109 }
98110
99111
118130 const auto& entries = interface.addressEntries();
119131 for (const QNetworkAddressEntry& addressEntry : entries)
120132 {
121 switch (addressEntry.ip().protocol())
133 const auto ipAddr = addressEntry.ip();
134 if (ipAddr.isLoopback())
135 {
136 continue;
137 }
138
139 switch (ipAddr.protocol())
122140 {
123141 case QAbstractSocket::NetworkLayerProtocol::IPv4Protocol:
124142 {
125143 const QHostAddress& broadcastAddr = addressEntry.broadcast();
144 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
145 if (broadcastAddr.isNull() || !ipAddr.isGlobal())
146 #else
126147 if (broadcastAddr.isNull())
127 {
128 continue;
129 }
130 if (addressEntry.ip().isEqual(QHostAddress::LocalHost, QHostAddress::TolerantConversion))
148 #endif
131149 {
132150 continue;
133151 }
143161 continue;
144162 }
145163
146 const QString& scopeId = addressEntry.ip().scopeId();
164 const QString& scopeId = ipAddr.scopeId();
165 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
166 if (scopeId.isEmpty() || !(ipAddr.isLinkLocal() || ipAddr.isUniqueLocalUnicast()))
167 #else
147168 if (scopeId.isEmpty())
169 #endif
148170 {
149171 continue;
150172 }
159181
160182 default:
161183 {
162 qCDebug(network) << "Skipping unknown protocol type:" << addressEntry.ip().protocol();
184 qCDebug(network) << "Skipping unknown protocol type:" << ipAddr.protocol();
163185 }
164186 }
165187 }
3030 QScopedPointer<MulticastLock> mMulticastLock;
3131 quint16 mUsedPort;
3232 PortFile mPortFile;
33 bool mEnableListening;
3334
35 void resetSocket();
3436 bool sendToAddress(const QByteArray& pData, const QHostAddress& pAddress, quint16 pPort = 0);
3537 bool sendToAllAddressEntries(const QByteArray& pData, quint16 pPort);
3638
3739 public:
3840 static quint16 cPort;
3941
40 DatagramHandlerImpl(bool pListen = true, quint16 pPort = DatagramHandlerImpl::cPort);
42 DatagramHandlerImpl(bool pEnableListening = true, quint16 pPort = DatagramHandlerImpl::cPort);
4143 virtual ~DatagramHandlerImpl() override;
4244
4345 virtual bool isBound() const override;
33
44 #include "NetworkManager.h"
55
6 #include "AppSettings.h"
67 #include "NetworkReplyError.h"
78 #include "NetworkReplyTimeout.h"
89 #include "SecureStorage.h"
3233 , mTrackedConnections()
3334 , mNetAccessManager(new QNetworkAccessManager())
3435 {
35 #ifndef QT_NO_NETWORKPROXY
3636 connect(mNetAccessManager.data(), &QNetworkAccessManager::proxyAuthenticationRequired, this, &NetworkManager::fireProxyAuthenticationRequired);
37 #endif
37
38 connect(&Env::getSingleton<AppSettings>()->getGeneralSettings(), &GeneralSettings::fireProxyChanged, this, &NetworkManager::onProxyChanged);
3839 }
3940
4041
158159 }
159160
160161
162 void NetworkManager::onProxyChanged()
163 {
164 setApplicationProxyFactory();
165 }
166
167
161168 NetworkManager::NetworkError NetworkManager::toNetworkError(const QNetworkReply* const pNetworkReply)
162169 {
163170 qCDebug(network) << "Select error message for:" << pNetworkReply->error();
190197
191198 GlobalStatus NetworkManager::toTrustedChannelStatus(const QNetworkReply* const pNetworkReply)
192199 {
200 const GlobalStatus::ExternalInfoMap infoMap {
201 {GlobalStatus::ExternalInformation::LAST_URL, pNetworkReply->url().toString()}
202 };
193203 switch (toNetworkError(pNetworkReply))
194204 {
195205 case NetworkManager::NetworkError::ServiceUnavailable:
196 return GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable;
206 return {GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable, infoMap};
197207
198208 case NetworkManager::NetworkError::TimeOut:
199 return GlobalStatus::Code::Workflow_TrustedChannel_TimeOut;
209 return {GlobalStatus::Code::Workflow_TrustedChannel_TimeOut, infoMap};
200210
201211 case NetworkManager::NetworkError::ProxyError:
202 return GlobalStatus::Code::Workflow_TrustedChannel_Proxy_Error;
212 return {GlobalStatus::Code::Workflow_TrustedChannel_Proxy_Error, infoMap};
203213
204214 case NetworkManager::NetworkError::SecurityError:
205 return GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error;
215 return {GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error, infoMap};
206216
207217 case NetworkManager::NetworkError::OtherError:
208 return GlobalStatus::Code::Workflow_TrustedChannel_Other_Network_Error;
209 }
210
211 return GlobalStatus::Code::Unknown_Error;
218 return {GlobalStatus::Code::Workflow_TrustedChannel_Other_Network_Error, infoMap};
219 }
220
221 return {GlobalStatus::Code::Unknown_Error, infoMap};
212222 }
213223
214224
215225 GlobalStatus NetworkManager::toStatus(const QNetworkReply* const pNetworkReply)
216226 {
227 const GlobalStatus::ExternalInfoMap infoMap {
228 {GlobalStatus::ExternalInformation::LAST_URL, pNetworkReply->url().toString()}
229 };
217230 switch (toNetworkError(pNetworkReply))
218231 {
219232 case NetworkManager::NetworkError::ServiceUnavailable:
220 return GlobalStatus::Code::Network_ServiceUnavailable;
233 return {GlobalStatus::Code::Network_ServiceUnavailable, infoMap};
221234
222235 case NetworkManager::NetworkError::TimeOut:
223 return GlobalStatus::Code::Network_TimeOut;
236 return {GlobalStatus::Code::Network_TimeOut, infoMap};
224237
225238 case NetworkManager::NetworkError::ProxyError:
226 return GlobalStatus::Code::Network_Proxy_Error;
239 return {GlobalStatus::Code::Network_Proxy_Error, infoMap};
227240
228241 case NetworkManager::NetworkError::SecurityError:
229 return GlobalStatus::Code::Network_Ssl_Establishment_Error;
242 return {GlobalStatus::Code::Network_Ssl_Establishment_Error, infoMap};
230243
231244 case NetworkManager::NetworkError::OtherError:
232 return GlobalStatus::Code::Network_Other_Error;
233 }
234
235 return GlobalStatus::Code::Unknown_Error;
245 return {GlobalStatus::Code::Network_Other_Error, infoMap};
246 }
247
248 return {GlobalStatus::Code::Unknown_Error, infoMap};
236249 }
237250
238251
293306 }
294307
295308
296 #ifndef QT_NO_NETWORKPROXY
297309 namespace
298310 {
299311 class NoProxyFactory
343355
344356 };
345357
358 class CustomProxyFactory
359 : public QNetworkProxyFactory
360 {
361 public:
362 CustomProxyFactory()
363 : QNetworkProxyFactory()
364 {
365 }
366
367
368 virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery& pInputQuery = QNetworkProxyQuery()) override
369 {
370 qCDebug(network) << pInputQuery;
371 const auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
372 auto proxy = QNetworkProxy(settings.getCustomProxyType(), settings.getCustomProxyHost(), settings.getCustomProxyPort());
373 auto proxies = QList<QNetworkProxy>({proxy});
374 qCDebug(network) << "Found proxies" << proxies;
375 return proxies;
376 }
377
378
379 };
380
346381 } // namespace
347382
348383 void NetworkManager::setApplicationProxyFactory()
349384 {
385 const auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
350386 if (Q_UNLIKELY(mLockProxy))
351387 {
352 qCWarning(network) << "Won't use system proxy because user locked it!";
388 qCWarning(network) << "Won't use any proxy because user locked it!";
353389 qCDebug(network) << "proxy -> none";
354390 QNetworkProxyFactory::setApplicationProxyFactory(new NoProxyFactory());
355391 }
392 else if (settings.useCustomProxy())
393 {
394 qCDebug(network) << "proxy -> custom";
395 QNetworkProxyFactory::setApplicationProxyFactory(new CustomProxyFactory());
396 }
356397 else
357398 {
358399 qCDebug(network) << "proxy -> system";
359400 QNetworkProxyFactory::setApplicationProxyFactory(new SystemProxyFactory());
360401 }
361402 }
362
363
364 #endif
4242
4343 public Q_SLOTS:
4444 void onShutdown();
45 void onProxyChanged();
4546
4647 protected:
4748 NetworkManager();
1616
1717 void NetworkReplyError::onErrorSignals()
1818 {
19 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
20 Q_EMIT errorOccurred(NetworkError::OperationCanceledError);
21 #else
1922 Q_EMIT error(NetworkError::OperationCanceledError);
23 #endif
2024 Q_EMIT finished();
2125 }
2226
00 /*!
1 * \brief Provides information about the Wifi status
1 * \brief Provides information about the WiFi status
22 *
33 * \copyright Copyright (c) 2017-2020 Governikus GmbH & Co. KG, Germany
44 */
88
99 #include <QHostAddress>
1010 #include <QObject>
11
12 #if defined(Q_OS_IOS)
13 #include <Network/Network.h>
14 #endif
1115
1216 class test_WifiInfo;
1317
2226 private:
2327 friend class ::test_WifiInfo;
2428 bool mWifiEnabled;
29 #if defined(Q_OS_ANDROID)
2530 int mWifiCheckTimerId;
31 #elif defined(Q_OS_IOS)
32 nw_path_monitor_t mMonitor;
33 #endif
2634
2735 static bool isPrivateIp(const QHostAddress& pAddress);
2836 static bool hasPrivateIpAddress();
2937
3038 bool getCurrentWifiEnabled();
3139
40 #if defined(Q_OS_ANDROID)
41
3242 protected:
3343 void timerEvent(QTimerEvent* pEvent) override;
44 #endif
3445
3546 public:
3647 WifiInfo();
48 #if defined(Q_OS_IOS)
49 virtual ~WifiInfo() override;
50 #else
3751 virtual ~WifiInfo() override = default;
52 #endif
3853
3954 bool isWifiEnabled();
4055
99 #include <QtAndroid>
1010 #include <QTimerEvent>
1111
12 Q_DECLARE_LOGGING_CATEGORY(qml)
12 Q_DECLARE_LOGGING_CATEGORY(network)
1313
1414
1515 using namespace governikus;
3030 const QAndroidJniObject context(QtAndroid::androidContext());
3131 if (!context.isValid())
3232 {
33 qCCritical(qml) << "Cannot determine android context.";
33 qCCritical(network) << "Cannot determine android context.";
3434 return false;
3535 }
3636
4141
4242 if (env->ExceptionCheck())
4343 {
44 qCCritical(qml) << "Cannot call WifiInfo.wifiEnabled()";
44 qCCritical(network) << "Cannot call WifiInfo.wifiEnabled()";
4545 env->ExceptionDescribe();
4646 env->ExceptionClear();
4747 return false;
77 #include <QLoggingCategory>
88 #include <QTimerEvent>
99
10 Q_DECLARE_LOGGING_CATEGORY(qml)
10 Q_DECLARE_LOGGING_CATEGORY(network)
1111
1212
1313 using namespace governikus;
1616 WifiInfo::WifiInfo()
1717 : QObject()
1818 , mWifiEnabled(getCurrentWifiEnabled())
19 , mWifiCheckTimerId(0)
2019 {
20 qCDebug(network) << "NOT IMPLEMENTED";
2121 }
2222
2323
2727 }
2828
2929
30 void WifiInfo::timerEvent(QTimerEvent* pEvent)
31 {
32 QObject::timerEvent(pEvent);
33 }
34
35
3630 bool WifiInfo::isWifiEnabled()
3731 {
38 #ifndef QT_NO_DEBUG
39 if (!QCoreApplication::applicationName().startsWith(QLatin1String("QmlTest")))
40
41 #endif
42 {
43 qCWarning(qml) << "NOT IMPLEMENTED";
44 }
45
4632 return mWifiEnabled;
4733 }
4834
77 #include <QTimerEvent>
88
99 #import <Foundation/Foundation.h>
10 #import <ifaddrs.h>
11 #import <net/if.h>
1210 #import <UIKit/UIKit.h>
1311
14 Q_DECLARE_LOGGING_CATEGORY(qml)
12 Q_DECLARE_LOGGING_CATEGORY(network)
1513
1614
1715 using namespace governikus;
1816
19
2017 WifiInfo::WifiInfo()
2118 : QObject()
22 , mWifiEnabled(getCurrentWifiEnabled())
19 , mWifiEnabled(false)
2320 {
24 const int timeoutMs = 1000;
25 mWifiCheckTimerId = startTimer(timeoutMs);
21 mMonitor = nw_path_monitor_create();
22 nw_path_monitor_update_handler_t handler = ^(nw_path_t path){
23 mWifiEnabled = nw_path_uses_interface_type(path, nw_interface_type_wifi);
24
25 qCDebug(network) << "WiFi status changed to:" << mWifiEnabled;
26
27 Q_EMIT fireWifiEnabledChanged(mWifiEnabled);
28 };
29
30 nw_path_monitor_set_queue(mMonitor, dispatch_get_main_queue());
31
32 nw_path_monitor_set_update_handler(mMonitor, handler);
33 nw_path_monitor_start(mMonitor);
2634 }
2735
2836
2937 bool WifiInfo::getCurrentWifiEnabled()
3038 {
31 struct ifaddrs* interfaces;
32 if (!getifaddrs(&interfaces))
33 {
34
35 int en0Count = 0;
36 int awdl0Count = 0;
37
38 for (struct ifaddrs* interface = interfaces; interface != nullptr; interface = interface->ifa_next)
39 {
40 if (!(interface->ifa_flags & IFF_UP))
41 {
42 continue;
43 }
44
45 if (std::strcmp(interface->ifa_name, "en0") == 0)
46 {
47 ++en0Count;
48 }
49 else if (std::strcmp(interface->ifa_name, "awdl0") == 0)
50 {
51 ++awdl0Count;
52 }
53 }
54
55 freeifaddrs(interfaces);
56
57 // iOS doesn't provide an api to determine if wifi is enabled/connected
58 // On iOS 13 and hopefully later, we can, however, use the network interfaces to
59 // infer this in an undocumented hacky way:
60 // If there is more than one interface with the name "awdl0" it means wifi is enabled.
61 // If there is more than one interface with the name "en0" it means wifi is connected.
62 if (awdl0Count > 1 || en0Count > 1) // Enabled or connected
63 {
64 return true;
65 }
66 }
67
68 return false;
39 return isWifiEnabled();
6940 }
7041
7142
72 void WifiInfo::timerEvent(QTimerEvent* pEvent)
43 WifiInfo::~WifiInfo()
7344 {
74 if (pEvent->timerId() == mWifiCheckTimerId)
75 {
76 pEvent->accept();
77
78 const bool currentEnabled = getCurrentWifiEnabled() || hasPrivateIpAddress();
79 if (mWifiEnabled != currentEnabled)
80 {
81 mWifiEnabled = currentEnabled;
82 Q_EMIT fireWifiEnabledChanged(mWifiEnabled);
83 }
84 }
85
86 QObject::timerEvent(pEvent);
45 nw_path_monitor_cancel(mMonitor);
8746 }
8847
8948
3131 void fireEstablishConnectionDone(const QSharedPointer<RemoteDeviceListEntry>& pEntry, const GlobalStatus& pStatus);
3232
3333 void fireNewRemoteDispatcher(const QSharedPointer<RemoteDispatcherClient>& pRemoteDispatcher);
34 void fireRemoteDevicesInfo(const QVector<QSharedPointer<RemoteDeviceListEntry> >& pRemoteDevices);
34 void fireRemoteDevicesInfo(const QVector<QSharedPointer<RemoteDeviceListEntry>>& pRemoteDevices);
3535 void fireDispatcherDestroyed(GlobalStatus::Code pCloseCode, const QString& pId);
3636 void fireDetectionChanged();
3737 void fireCertificateRemoved(const QString& pDeviceName);
4646
4747 Q_INVOKABLE virtual void establishConnection(const QSharedPointer<RemoteDeviceListEntry>& pEntry, const QString& pPsk) = 0;
4848
49 virtual QVector<QSharedPointer<RemoteDeviceListEntry> > getAnnouncingRemoteDevices() const;
49 virtual QVector<QSharedPointer<RemoteDeviceListEntry>> getAnnouncingRemoteDevices() const;
5050 Q_INVOKABLE virtual void requestRemoteDevices();
5151 virtual QStringList getConnectedDeviceIDs() const;
5252 virtual QVector<RemoteServiceSettings::RemoteInfo> getConnectedDeviceInfos() = 0;
152152 {
153153 qCCritical(remote_device) << "Remote device refused connection seven times, removing certificate with fingerprint:" << pRemoteDeviceDescriptor.getIfdId();
154154 RemoteServiceSettings& settings = Env::getSingleton<AppSettings>()->getRemoteServiceSettings();
155 QString deviceName;
155 QString deviceNameEscaped;
156156 const auto& infos = settings.getRemoteInfos();
157157 for (const auto& remoteInfo : infos)
158158 {
159159 if (remoteInfo.getFingerprint() == pRemoteDeviceDescriptor.getIfdId())
160160 {
161 deviceName = remoteInfo.getName();
161 deviceNameEscaped = remoteInfo.getNameEscaped();
162162 }
163163 }
164164 settings.removeTrustedCertificate(pRemoteDeviceDescriptor.getIfdId());
165165 mErrorCounter[pRemoteDeviceDescriptor.getIfdId()] = 0;
166 if (!deviceName.isEmpty())
166 if (!deviceNameEscaped.isEmpty())
167167 {
168 Q_EMIT fireCertificateRemoved(deviceName);
168 Q_EMIT fireCertificateRemoved(deviceNameEscaped);
169169 }
170170 }
171171 }
3737
3838 QThread mRemoteConnectorThread;
3939 QPointer<RemoteConnector> mRemoteConnector;
40 QVector<QSharedPointer<RemoteDeviceListEntry> > mRemoteConnectorPending;
40 QVector<QSharedPointer<RemoteDeviceListEntry>> mRemoteConnectorPending;
4141 QStringList mConnectedDeviceIds;
4242
4343 void bootstrapRemoteConnectorThread();
6161
6262 Q_INVOKABLE virtual void establishConnection(const QSharedPointer<RemoteDeviceListEntry>& pEntry, const QString& pPsk) override;
6363
64 virtual QVector<QSharedPointer<RemoteDeviceListEntry> > getAnnouncingRemoteDevices() const override;
64 virtual QVector<QSharedPointer<RemoteDeviceListEntry>> getAnnouncingRemoteDevices() const override;
6565 Q_INVOKABLE virtual void requestRemoteDevices() override;
6666 virtual QStringList getConnectedDeviceIDs() const override;
6767 virtual QVector<RemoteServiceSettings::RemoteInfo> getConnectedDeviceInfos() override;
203203 connect(mSocket.data(), &QWebSocket::preSharedKeyAuthenticationRequired, this, &ConnectRequest::onPreSharedKeyAuthenticationRequired);
204204 connect(mSocket.data(), &QWebSocket::sslErrors, this, &ConnectRequest::onSslErrors);
205205
206 #ifndef QT_NO_NETWORKPROXY
207206 mSocket->setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
208 #endif
209207 connect(mSocket.data(), &QWebSocket::connected, this, &ConnectRequest::onConnected);
210208 connect(mSocket.data(), QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &ConnectRequest::onError);
211209
2222
2323 private:
2424 const int mConnectTimeoutMs;
25 QVector<QSharedPointer<ConnectRequest> > mPendingRequests;
25 QVector<QSharedPointer<ConnectRequest>> mPendingRequests;
2626
2727 void removeRequest(const RemoteDeviceDescriptor& pRemoteDeviceDescriptor);
2828
176176
177177 void RemoteDeviceListImpl::clear()
178178 {
179 mResponsiveList.clear();
179 decltype(mResponsiveList) removedDevices;
180 mResponsiveList.swap(removedDevices);
181 for (const auto& entry : removedDevices)
182 {
183 Q_EMIT fireDeviceVanished(entry);
184 }
180185 }
181186
182187
5555
5656 virtual void update(const RemoteDeviceDescriptor& pDescriptor) = 0;
5757 virtual void clear() = 0;
58 virtual QVector<QSharedPointer<RemoteDeviceListEntry> > getRemoteDevices() const;
58 virtual QVector<QSharedPointer<RemoteDeviceListEntry>> getRemoteDevices() const;
5959 };
6060
6161
6767 private:
6868 QTimer mTimer;
6969 const int mReaderResponsiveTimeout;
70 QVector<QSharedPointer<RemoteDeviceListEntry> > mResponsiveList;
70 QVector<QSharedPointer<RemoteDeviceListEntry>> mResponsiveList;
7171
7272 private Q_SLOTS:
7373 void onProcessUnresponsiveRemoteReaders();
7878
7979 virtual void update(const RemoteDeviceDescriptor& pDescriptor) override;
8080 virtual void clear() override;
81 virtual QVector<QSharedPointer<RemoteDeviceListEntry> > getRemoteDevices() const override;
81 virtual QVector<QSharedPointer<RemoteDeviceListEntry>> getRemoteDevices() const override;
8282 };
8383
8484
9999 {
100100 RemoteServiceSettings& settings = Env::getSingleton<AppSettings>()->getRemoteServiceSettings();
101101 auto info = settings.getRemoteInfo(getId());
102 info.setName(pName);
102 info.setNameUnescaped(pName);
103103 settings.updateRemoteInfo(info);
104104 }
105105
2323 : QTcpServer()
2424 , mPsk()
2525 {
26 #ifndef QT_NO_NETWORKPROXY
2726 //listening with proxy leads to socket error QNativeSocketEnginePrivate::InvalidProxyTypeString
2827 setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
29 #endif
3028 }
3129
3230
8078
8179 if (Q_LIKELY(mSocket->setSocketDescriptor(pSocketDescriptor)))
8280 {
81 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
82 connect(mSocket.data(), &QAbstractSocket::errorOccurred, this, &RemoteTlsServer::onError);
83 #else
84 connect(mSocket.data(), QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
85 this, &RemoteTlsServer::onError);
86 #endif
87
8388 connect(mSocket.data(), QOverload<const QList<QSslError>&>::of(&QSslSocket::sslErrors),
8489 this, &RemoteTlsServer::onSslErrors);
85 connect(mSocket.data(), QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
86 this, &RemoteTlsServer::onError);
8790 connect(mSocket.data(), &QSslSocket::preSharedKeyAuthenticationRequired,
8891 this, &RemoteTlsServer::onPreSharedKeyAuthenticationRequired);
8992 connect(mSocket.data(), &QSslSocket::encrypted, this, &RemoteTlsServer::onEncrypted);
5252 private:
5353 QPointer<ReaderManager> mReaderManager;
5454 const QSharedPointer<RemoteDispatcherServer> mRemoteDispatcher;
55 QMap<QString, QSharedPointer<CardConnection> > mCardConnections;
55 QMap<QString, QSharedPointer<CardConnection>> mCardConnections;
5656
5757 QString slotHandleForReaderName(const QString& pReaderName) const;
5858 QString convertSlotHandleBackwardsCompatibility(const QString& pReaderName);
55 #include "Discovery.h"
66
77 #include "Initializer.h"
8 #include "RemoteServiceSettings.h"
89
910 #include <QJsonArray>
1011 #include <QJsonObject>
5657
5758 mIfdName = getStringValue(pMessageObject, IFD_NAME());
5859 mIfdId = getStringValue(pMessageObject, IFD_ID());
60 if (!mIfdId.isEmpty() && mIfdId.size() != 64)
61 {
62 const QSslCertificate ifdCertificate(mIfdId.toLatin1());
63 qCDebug(remote_device) << "Received ifdId is not a fingerprint. Interpretion as a certificate to create our own fingerprint" << (ifdCertificate.isNull() ? "failed" : "succeeded");
64 if (!ifdCertificate.isNull())
65 {
66 mIfdId = RemoteServiceSettings::generateFingerprint(ifdCertificate);
67 }
68 }
5969 mPort = static_cast<quint16>(getIntValue(pMessageObject, PORT()));
6070
6171 if (!pMessageObject.contains(SUPPORTED_API()))
157157 RemoteServiceSettings& settings = Env::getSingleton<AppSettings>()->getRemoteServiceSettings();
158158 auto info = settings.getRemoteInfo(pId);
159159 bool initialPairing = false;
160 if (info.getName().isEmpty())
160 if (info.getNameEscaped().isEmpty())
161161 {
162162 initialPairing = true;
163163 }
164 info.setName(pIfdName);
164 info.setNameUnescaped(pIfdName);
165165 settings.updateRemoteInfo(info);
166166
167167 const auto& remoteDispatcher = mDispatcherList[pId];
2929 private:
3030 QTimer mScanTimer;
3131 QMultiMap<QString, QString> mReadersForDispatcher;
32 QMap<QString, QSharedPointer<RemoteDispatcherClient> > mDispatcherList;
32 QMap<QString, QSharedPointer<RemoteDispatcherClient>> mDispatcherList;
3333 QMap<QString, Reader*> mReaderList;
3434 bool mConnectToPairedReaders;
3535 bool mConnectionCheckInProgress;
4545 void onDispatcherClosed(GlobalStatus::Code pCloseCode, const QString& pId);
4646 void addRemoteDispatcher(const QSharedPointer<RemoteDispatcherClient>& pRemoteDispatcher);
4747 void connectToPairedReaders();
48 void continueConnectToPairedReaders(const QVector<QSharedPointer<RemoteDeviceListEntry> >& pRemoteDevices);
48 void continueConnectToPairedReaders(const QVector<QSharedPointer<RemoteDeviceListEntry>>& pRemoteDevices);
4949
5050 public:
5151 RemoteReaderManagerPlugIn();
2323 Q_DECLARE_LOGGING_CATEGORY(appupdate)
2424
2525 AppUpdater::AppUpdater()
26 : mIgnoreNextVersionskip(false)
26 : mForceUpdate(false)
2727 , mAppUpdateJsonUrl()
2828 , mAppUpdateData()
2929 {
3939 }
4040
4141
42 void AppUpdater::checkAppUpdate(bool pIgnoreNextVersionskip)
42 void AppUpdater::checkAppUpdate(bool pForceUpdate)
4343 {
44 mIgnoreNextVersionskip = pIgnoreNextVersionskip;
44 mForceUpdate = pForceUpdate;
4545 mAppUpdateData = AppUpdateData();
4646
4747 auto* downloader = Env::getSingleton<Downloader>();
7979
8080 if (VersionNumber(version) > VersionNumber::getApplicationVersion())
8181 {
82 if (!mIgnoreNextVersionskip && version == Env::getSingleton<AppSettings>()->getGeneralSettings().getSkipVersion())
82 if (!mForceUpdate && version == Env::getSingleton<AppSettings>()->getGeneralSettings().getSkipVersion())
8383 {
8484 qCInfo(appupdate) << "Version will be skipped:" << version;
8585 Q_EMIT fireAppUpdateCheckFinished(false, GlobalStatus::Code::No_Error);
8686 }
8787 else
8888 {
89 mIgnoreNextVersionskip = false;
89 mForceUpdate = false;
9090 qCInfo(appupdate) << "Found new version:" << version << ", greater than old version" << QCoreApplication::applicationVersion();
9191 Env::getSingleton<Downloader>()->download(mAppUpdateData.getNotesUrl());
9292 return;
2222 private:
2323 friend class Env;
2424 friend class ::test_AppUpdater;
25 bool mIgnoreNextVersionskip;
25 bool mForceUpdate;
2626 QUrl mAppUpdateJsonUrl;
2727 AppUpdateData mAppUpdateData;
2828
3434 static AppUpdater& getInstance();
3535
3636 public:
37 void checkAppUpdate(bool pIgnoreNextVersionskip = false);
37 void checkAppUpdate(bool pForceUpdate = false);
3838 const AppUpdateData& getUpdateData() const;
3939 void skipVersion(const QString& pVersion);
4040
1414
1515 #include <QMetaObject>
1616
17
1718 using namespace governikus;
1819
20
1921 defineSingleton(Service)
22
23
24 void Service::doAppUpdate(UpdateType pType, bool pForceUpdate)
25 {
26 switch (pType)
27 {
28 case UpdateType::APP:
29 mExplicitSuccessMessage = pForceUpdate;
30 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
31 mTimer.start(mOneDayInMs);
32 if (pForceUpdate || Env::getSingleton<AppSettings>()->getGeneralSettings().isAutoUpdateCheck())
33 {
34 Env::getSingleton<AppUpdater>()->checkAppUpdate(pForceUpdate);
35 break;
36 }
37 #endif
38 Q_FALLTHROUGH();
39
40 case UpdateType::PROVIDER:
41 Env::getSingleton<ProviderConfiguration>()->update();
42 break;
43
44 case UpdateType::READER:
45 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
46 Env::getSingleton<ReaderConfiguration>()->update();
47 #endif
48 break;
49 }
50 }
51
52
53 void Service::onTimedUpdateTriggered()
54 {
55 mUpdateScheduled = true;
56 Q_EMIT fireUpdateScheduled();
57 }
58
59
60 void Service::onProviderUpdateFinished()
61 {
62 doAppUpdate(UpdateType::READER);
63 }
64
65
66 void Service::onAppUpdateFinished(bool pUpdateAvailable, const GlobalStatus& pError)
67 {
68 if (pUpdateAvailable || pError.isError() || mExplicitSuccessMessage)
69 {
70 Q_EMIT fireAppUpdateFinished(pUpdateAvailable, pError);
71 }
72
73 if (pError.isNoError())
74 {
75 doAppUpdate(UpdateType::PROVIDER);
76 }
77 }
78
2079
2180 Service::Service()
2281 : mTimer(this)
2483 , mExplicitSuccessMessage(true)
2584 {
2685 connect(&mTimer, &QTimer::timeout, this, &Service::onTimedUpdateTriggered);
86 connect(Env::getSingleton<ProviderConfiguration>(), &ProviderConfiguration::fireUpdated, this, &Service::onProviderUpdateFinished);
87 connect(Env::getSingleton<ProviderConfiguration>(), &ProviderConfiguration::fireNoUpdateAvailable, this, &Service::onProviderUpdateFinished);
2788 connect(Env::getSingleton<AppUpdater>(), &AppUpdater::fireAppUpdateCheckFinished, this, &Service::onAppUpdateFinished);
2889
2990 mTimer.setSingleShot(true);
3798 }
3899
39100
40 void Service::updateConfigurations()
101 void Service::updateApp()
41102 {
42 QMetaObject::invokeMethod(this, &Service::doConfigurationsUpdate, Qt::QueuedConnection);
43 }
44
45
46 void Service::updateApp(bool pIgnoreNextVersionskip)
47 {
48 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
49 mExplicitSuccessMessage = pIgnoreNextVersionskip;
50 mTimer.start(mOneDayInMs);
51 QMetaObject::invokeMethod(this, [ = ] {
52 doAppUpdate(pIgnoreNextVersionskip);
53 }, Qt::QueuedConnection);
54 #else
55 Q_UNUSED(pIgnoreNextVersionskip)
56 #endif
57 }
58
59
60 void Service::doConfigurationsUpdate()
61 {
62 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
63 Env::getSingleton<ReaderConfiguration>()->update();
64 #endif
65
66 Env::getSingleton<ProviderConfiguration>()->update();
67 }
68
69
70 void Service::doAppUpdate(bool pIgnoreNextVersionskip)
71 {
72 Env::getSingleton<AppUpdater>()->checkAppUpdate(pIgnoreNextVersionskip);
73 }
74
75
76 void Service::onTimedUpdateTriggered()
77 {
78 mUpdateScheduled = true;
79 Q_EMIT fireUpdateScheduled();
103 doAppUpdate(UpdateType::APP, true);
80104 }
81105
82106
91115 if (mUpdateScheduled)
92116 {
93117 mUpdateScheduled = false;
94 updateConfigurations();
95 if (Env::getSingleton<AppSettings>()->getGeneralSettings().isAutoUpdateCheck())
96 {
97 updateApp();
98 }
118 doAppUpdate(UpdateType::APP);
99119 }
100120 }
101121
104124 {
105125 return Env::getSingleton<AppUpdater>()->getUpdateData();
106126 }
107
108
109 void Service::onAppUpdateFinished(bool pUpdateAvailable, const GlobalStatus& pError)
110 {
111 if (pUpdateAvailable || pError.isError() || mExplicitSuccessMessage)
112 {
113 Q_EMIT fireAppUpdateFinished(pUpdateAvailable, pError);
114 }
115 }
1717 friend class Env;
1818
1919 private:
20 enum class UpdateType
21 {
22 APP, PROVIDER, READER
23 };
24
2025 QTimer mTimer;
2126 bool mUpdateScheduled;
2227 bool mExplicitSuccessMessage;
2328 const int mOneDayInMs = 1000 * 60 * 60 * 24;
29
30 void doAppUpdate(UpdateType pType, bool pForceUpdate = false);
31
32 private Q_SLOTS:
33 void onTimedUpdateTriggered();
34 void onProviderUpdateFinished();
35 void onAppUpdateFinished(bool pUpdateAvailable, const GlobalStatus& pError);
2436
2537 protected:
2638 Service();
2739 virtual ~Service() = default;
2840 static Service& getInstance();
2941
30 private Q_SLOTS:
31 void doConfigurationsUpdate();
32 void doAppUpdate(bool pIgnoreNextVersionskip);
33 void onTimedUpdateTriggered();
34 void onAppUpdateFinished(bool pUpdateAvailable, const GlobalStatus& pError);
35
3642 public:
37 void updateConfigurations();
38 void updateApp(bool pIgnoreNextVersionskip = false);
43 void updateApp();
3944 bool isUpdateScheduled();
4045 Q_INVOKABLE void runUpdateIfNeeded();
4146 const AppUpdateData& getUpdateData() const;
3333 SETTINGS_NAME(SETTINGS_NAME_USE_SELF_AUTH_TEST_URI, "selfauthTestUri")
3434 SETTINGS_NAME(SETTINGS_NAME_LANGUAGE, "language")
3535 SETTINGS_NAME(SETTINGS_NAME_SELECTED_UI, "selectedUi")
36 SETTINGS_NAME(SETTINGS_NAME_SCREEN_ORIENTATION, "screenOrientation")
3637 SETTINGS_NAME(SETTINGS_NAME_DEVICE_SURVEY_PENDING, "deviceSurveyPending")
3738 SETTINGS_NAME(SETTINGS_NAME_LAST_READER_PLUGIN_TYPE, "lastTechnology")
3839 SETTINGS_NAME(SETTINGS_NAME_IN_APP_NOTIFICATIONS, "showInAppNotifications")
3940 SETTINGS_NAME(SETTINGS_NAME_REQUEST_STORE_FEEDBACK, "requestStoreFeedback")
40 SETTINGS_NAME(SETTINGS_GROUP_NAME_COMMON, "common")
4141 SETTINGS_NAME(SETTINGS_NAME_AUTO, "autoUpdateCheck")
4242 SETTINGS_NAME(SETTINGS_NAME_KEYLESS_PASSWORD, "keylessPassword")
4343 SETTINGS_NAME(SETTINGS_NAME_VISUAL_PRIVACY, "visualPrivacy")
4444 SETTINGS_NAME(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD, "shuffleScreenKeyboard")
45 SETTINGS_NAME(SETTINGS_NAME_CUSTOM_PROXY_HOST, "customProxyHost")
46 SETTINGS_NAME(SETTINGS_NAME_CUSTOM_PROXY_PORT, "customProxyPort")
47 SETTINGS_NAME(SETTINGS_NAME_CUSTOM_PROXY_TYPE, "customProxyType")
48 SETTINGS_NAME(SETTINGS_NAME_USE_CUSTOM_PROXY, "useCustomProxy")
49 SETTINGS_NAME(SETTINGS_NAME_ENABLE_CAN_ALLOWED, "enableCanAllowed")
50 SETTINGS_NAME(SETTINGS_NAME_SKIP_RIGHTS_ON_CAN_ALLOWED, "skipRightsOnCanAllowed")
4551 } // namespace
4652
4753 GeneralSettings::GeneralSettings()
5965 mStoreCommon->beginGroup(QStringLiteral("providers"));
6066 mStoreCommon->remove(QString()); // remove the whole group
6167 mStoreCommon->endGroup();
62 }
63
64 mStoreCommon->beginGroup(SETTINGS_GROUP_NAME_COMMON());
68
69 // With 1.20.1 the common values are moved to the general values
70
71 mStoreCommon->beginGroup(QStringLiteral("common"));
72 if (!autoUpdateCheckIsSetByAdmin() && mStoreCommon->contains(SETTINGS_NAME_AUTO()))
73 {
74 mStoreGeneral->setValue(SETTINGS_NAME_AUTO(), mStoreCommon->value(SETTINGS_NAME_AUTO()).toBool());
75 }
76 if (mStoreCommon->contains(SETTINGS_NAME_KEYLESS_PASSWORD()))
77 {
78 mStoreGeneral->setValue(SETTINGS_NAME_KEYLESS_PASSWORD(), mStoreCommon->value(SETTINGS_NAME_KEYLESS_PASSWORD()).toBool());
79 }
80 if (mStoreCommon->contains(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD()))
81 {
82 mStoreGeneral->setValue(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD(), mStoreCommon->value(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD()).toBool());
83 }
84 mStoreCommon->remove(QString()); // remove the whole group
85 mStoreCommon->endGroup();
86 }
6587
6688 // QFuture.result() crashes under linux and win if uninitalized
6789 mAutoStart = QtConcurrent::run([] {
371393 }
372394
373395
396 QString GeneralSettings::getScreenOrientation() const
397 {
398 return mStoreGeneral->value(SETTINGS_NAME_SCREEN_ORIENTATION(), QStringLiteral("auto")).toString();
399 }
400
401
402 void GeneralSettings::setScreenOrientation(const QString& pScreenOrientation)
403 {
404 if (pScreenOrientation != getScreenOrientation())
405 {
406 mStoreGeneral->setValue(SETTINGS_NAME_SCREEN_ORIENTATION(), pScreenOrientation);
407 Q_EMIT fireSettingsChanged();
408 }
409 }
410
411
374412 bool GeneralSettings::askForDeviceSurvey() const
375413 {
376414 return !mStoreGeneral->contains(SETTINGS_NAME_DEVICE_SURVEY_PENDING());
447485 {
448486 if (autoUpdateCheckIsSetByAdmin())
449487 {
450 mStoreCommon->remove(SETTINGS_NAME_AUTO());
451 // Start writing the new path since 1.17, too, so that we can rely on it in a future version.
452488 mStoreGeneral->remove(SETTINGS_NAME_AUTO());
453489 }
454490
455491 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
456 return mStoreCommon->value(SETTINGS_NAME_AUTO(), true).toBool();
492 return mStoreGeneral->value(SETTINGS_NAME_AUTO(), true).toBool();
457493
458494 #else
459 return mStoreCommon->value(SETTINGS_NAME_AUTO(), false).toBool();
495 return mStoreGeneral->value(SETTINGS_NAME_AUTO(), false).toBool();
460496
461497 #endif
462498 }
474510 #endif
475511 #endif
476512
477 settings.beginGroup(SETTINGS_GROUP_NAME_COMMON());
478513 return settings.contains(SETTINGS_NAME_AUTO());
479514 }
480515
483518 {
484519 if (!autoUpdateCheckIsSetByAdmin() && pAutoUpdateCheck != isAutoUpdateCheck())
485520 {
486 mStoreCommon->setValue(SETTINGS_NAME_AUTO(), pAutoUpdateCheck);
487 // Start writing the new path since 1.17, too, so that we can rely on it in a future version.
488521 mStoreGeneral->setValue(SETTINGS_NAME_AUTO(), pAutoUpdateCheck);
489522 Q_EMIT fireSettingsChanged();
490523 }
493526
494527 bool GeneralSettings::isUseScreenKeyboard() const
495528 {
496 return mStoreCommon->value(SETTINGS_NAME_KEYLESS_PASSWORD(), false).toBool();
529 return mStoreGeneral->value(SETTINGS_NAME_KEYLESS_PASSWORD(), false).toBool();
497530 }
498531
499532
501534 {
502535 if (pUseScreenKeyboard != isUseScreenKeyboard())
503536 {
504 mStoreCommon->setValue(SETTINGS_NAME_KEYLESS_PASSWORD(), pUseScreenKeyboard);
505 // Start writing the new path since 1.17, too, so that we can rely on it in a future version.
506537 mStoreGeneral->setValue(SETTINGS_NAME_KEYLESS_PASSWORD(), pUseScreenKeyboard);
507538 Q_EMIT fireSettingsChanged();
508539 }
527558
528559 bool GeneralSettings::isShuffleScreenKeyboard() const
529560 {
530 return mStoreCommon->value(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD(), false).toBool();
561 return mStoreGeneral->value(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD(), false).toBool();
531562 }
532563
533564
535566 {
536567 if (pShuffleScreenKeyboard != isShuffleScreenKeyboard())
537568 {
538 mStoreCommon->setValue(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD(), pShuffleScreenKeyboard);
569 mStoreGeneral->setValue(SETTINGS_NAME_SHUFFLE_SCREEN_KEYBOARD(), pShuffleScreenKeyboard);
570 Q_EMIT fireSettingsChanged();
571 }
572 }
573
574
575 bool GeneralSettings::isEnableCanAllowed() const
576 {
577 return mStoreGeneral->value(SETTINGS_NAME_ENABLE_CAN_ALLOWED(), false).toBool();
578 }
579
580
581 void GeneralSettings::setEnableCanAllowed(bool pEnableCanAllowed)
582 {
583 if (pEnableCanAllowed != isEnableCanAllowed())
584 {
585 mStoreGeneral->setValue(SETTINGS_NAME_ENABLE_CAN_ALLOWED(), pEnableCanAllowed);
586 Q_EMIT fireSettingsChanged();
587 }
588 }
589
590
591 bool GeneralSettings::isSkipRightsOnCanAllowed() const
592 {
593 if (!isEnableCanAllowed())
594 {
595 return false;
596 }
597 return mStoreGeneral->value(SETTINGS_NAME_SKIP_RIGHTS_ON_CAN_ALLOWED(), false).toBool();
598 }
599
600
601 void GeneralSettings::setSkipRightsOnCanAllowed(bool pSkipRightsOnCanAllowed)
602 {
603 if (pSkipRightsOnCanAllowed != isSkipRightsOnCanAllowed())
604 {
605 mStoreGeneral->setValue(SETTINGS_NAME_SKIP_RIGHTS_ON_CAN_ALLOWED(), pSkipRightsOnCanAllowed);
539606 Q_EMIT fireSettingsChanged();
540607 }
541608 }
560627 Q_EMIT fireShowInAppNotificationsChanged();
561628 }
562629 }
630
631
632 bool GeneralSettings::isCustomProxyHost() const
633 {
634 return !getCustomProxyHost().isEmpty();
635 }
636
637
638 QString GeneralSettings::getCustomProxyHost() const
639 {
640 return mStoreGeneral->value(SETTINGS_NAME_CUSTOM_PROXY_HOST(), QString()).toString();
641 }
642
643
644 bool GeneralSettings::isCustomProxyType() const
645 {
646 return getCustomProxyType() != QNetworkProxy::ProxyType::NoProxy;
647 }
648
649
650 QNetworkProxy::ProxyType GeneralSettings::getCustomProxyType() const
651 {
652 QNetworkProxy::ProxyType result;
653 auto value = mStoreGeneral->value(SETTINGS_NAME_CUSTOM_PROXY_TYPE(), QString()).toString().toLower();
654 if (value == QLatin1String("socks5"))
655 {
656 result = QNetworkProxy::ProxyType::Socks5Proxy;
657 }
658 else if (value == QLatin1String("http"))
659 {
660 result = QNetworkProxy::ProxyType::HttpProxy;
661 }
662 else
663 {
664 result = QNetworkProxy::ProxyType::NoProxy;
665 }
666 return result;
667 }
668
669
670 bool GeneralSettings::isCustomProxyPort() const
671 {
672 return getCustomProxyPort() != 0;
673 }
674
675
676 quint16 GeneralSettings::getCustomProxyPort() const
677 {
678 return static_cast<quint16>(mStoreGeneral->value(SETTINGS_NAME_CUSTOM_PROXY_PORT(), 0).toInt());
679 }
680
681
682 bool GeneralSettings::customProxyAttributesPresent() const
683 {
684 return isCustomProxyHost() && isCustomProxyType() && isCustomProxyPort();
685 }
686
687
688 bool GeneralSettings::useCustomProxy() const
689 {
690 bool useCustomProxy = mStoreGeneral->value(SETTINGS_NAME_USE_CUSTOM_PROXY(), true).toBool();
691 return useCustomProxy && customProxyAttributesPresent();
692 }
693
694
695 void GeneralSettings::setUseCustomProxy(bool pUseCustomProxy)
696 {
697 if (useCustomProxy() != pUseCustomProxy)
698 {
699 mStoreGeneral->setValue(SETTINGS_NAME_USE_CUSTOM_PROXY(), pUseCustomProxy);
700 Q_EMIT fireProxyChanged();
701 }
702 }
88 #include "AbstractSettings.h"
99
1010 #include <QFuture>
11 #include <QNetworkProxy>
1112 #include <QUuid>
1213
1314 class test_GeneralSettings;
8384 QString getSelectedUi() const;
8485 void setSelectedUi(const QString& pSelectedUi);
8586
87 QString getScreenOrientation() const;
88 void setScreenOrientation(const QString& pScreenOrientation);
89
8690 bool askForDeviceSurvey() const;
8791 bool isDeviceSurveyPending() const;
8892 void setDeviceSurveyPending(bool pDeviceSurveyPending);
108112 bool isShuffleScreenKeyboard() const;
109113 void setShuffleScreenKeyboard(bool pShuffleScreenKeyboard);
110114
115 bool isEnableCanAllowed() const;
116 void setEnableCanAllowed(bool pEnableCanAllowed);
117
118 bool isSkipRightsOnCanAllowed() const;
119 void setSkipRightsOnCanAllowed(bool pSkipRightsOnCanAllowed);
120
111121 bool isShowInAppNotifications() const;
112122 void setShowInAppNotifications(bool pShowInAppNotifications);
123
124 bool isCustomProxyType() const;
125 QNetworkProxy::ProxyType getCustomProxyType() const;
126
127 bool isCustomProxyHost() const;
128 QString getCustomProxyHost() const;
129
130 bool isCustomProxyPort() const;
131 quint16 getCustomProxyPort() const;
132
133 bool customProxyAttributesPresent() const;
134 bool useCustomProxy() const;
135 void setUseCustomProxy(bool pUseCustomProxy);
113136
114137 Q_SIGNALS:
115138 void fireLanguageChanged();
116139 void fireDeveloperOptionsChanged();
117140 void fireShowInAppNotificationsChanged();
141 void fireProxyChanged();
118142 };
119143
120144
342342 }
343343
344344
345 QString RemoteServiceSettings::escapeDeviceName(const QString& pDeviceNameUnescaped)
346 {
347 return pDeviceNameUnescaped.left(33).toHtmlEscaped();
348 }
349
350
345351 RemoteServiceSettings::RemoteInfo::RemoteInfo(const QString& pFingerprint,
346 const QDateTime& pLastConnected,
347 const QString& pName)
352 const QDateTime& pLastConnected)
348353 : mFingerprint(pFingerprint)
349 , mName(pName)
354 , mName()
350355 , mLastConnected(pLastConnected)
351356 {
352357 }
378383 }
379384
380385
381 const QString& RemoteServiceSettings::RemoteInfo::getName() const
382 {
383 return mName;
384 }
385
386
387 void RemoteServiceSettings::RemoteInfo::setName(const QString& pName)
386 QString RemoteServiceSettings::RemoteInfo::getNameEscaped() const
387 {
388 return RemoteServiceSettings::escapeDeviceName(mName);
389 }
390
391
392 void RemoteServiceSettings::RemoteInfo::setNameUnescaped(const QString& pName)
388393 {
389394 mName = pName;
390395 }
4646 QDateTime mLastConnected;
4747
4848 RemoteInfo(const QString& pFingerprint,
49 const QDateTime& pLastConnected = QDateTime(),
50 const QString& pName = QString());
49 const QDateTime& pLastConnected);
5150
5251 public:
5352 RemoteInfo() = default;
5756
5857 const QString& getFingerprint() const;
5958
60 const QString& getName() const;
61 void setName(const QString& pName);
59 QString getNameEscaped() const;
60 void setNameUnescaped(const QString& pName);
6261
6362 const QDateTime& getLastConnected() const;
6463 void setLastConnected(const QDateTime& pLastConnected);
107106 QVector<RemoteInfo> getRemoteInfos() const;
108107 bool updateRemoteInfo(const RemoteInfo& pInfo);
109108
109 static QString escapeDeviceName(const QString& pDeviceNameUnescaped);
110
110111 Q_SIGNALS:
111112 void fireTrustedCertificatesChanged();
112113 void fireTrustedRemoteInfosChanged();
3636 }
3737
3838
39 #ifndef QT_NO_NETWORKPROXY
4039 void UIPlugIn::onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator)
4140 {
4241 Q_UNUSED(pProxy)
5554 void UIPlugIn::onUiDominationReleased()
5655 {
5756 }
58
59
60 #endif
4444 virtual void onShowUi(UiModule pModule);
4545 virtual void onHideUi();
4646 virtual void onShowReaderSettings();
47 #ifndef QT_NO_NETWORKPROXY
4847 virtual void onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator);
49 #endif
5048 virtual void onUiDomination(const UIPlugIn* pUi, const QString& pInformation, bool pAccepted);
5149 virtual void onUiDominationReleased();
5250
77 #include "GlobalStatus.h"
88 #include "LogHandler.h"
99
10 #include <QUrl>
11
1210 namespace governikus
1311 {
1412
15 QString generateMailBody(const GlobalStatus& pStatus)
13 QString generateMailBody(const GlobalStatus& pStatus, const QUrl& pServiceUrl)
1614 {
1715 const auto& logHandler = Env::getSingleton<LogHandler>();
1816 QStringList mailBody(QObject::tr("Please describe the error that occurred."));
3634 mailBody << newLine + QObject::tr("Error code") + QLatin1Char(':');
3735 mailBody << getEnumName(pStatus.getStatusCode());
3836
37 if (!pServiceUrl.isEmpty())
38 {
39 const auto& serviceUrlStub = pServiceUrl.scheme() + QStringLiteral("://") + pServiceUrl.authority();
40 mailBody << newLine + QObject::tr("Service URL") + QLatin1Char(':') << serviceUrlStub;
41 }
42
43 mailBody << newLine + QObject::tr("Parameter of occurred error:") << pStatus.getExternalInfo(newLine);
44
3945 if (logHandler->hasCriticalLog())
4046 {
4147 const QString criticalMessages = QString::fromUtf8(logHandler->getCriticalLogWindow());
4248 mailBody << newLine + QObject::tr("Critical errors:") + newLine + criticalMessages;
4349 }
4450
45 return mailBody.join(newLine);
51 // We need to replace the ambersand char since it will signal the end of the predefined mail body
52 // and everything beyond that ambersand will be missing from the mail.
53 return mailBody.join(newLine).replace(QStringLiteral("&"), QStringLiteral("%26"));
4654 }
4755
4856
44 #pragma once
55
66 #include <QString>
7 #include <QUrl>
78
89 namespace governikus
910 {
1011
1112 class GlobalStatus;
1213
13 QString generateMailBody(const GlobalStatus&);
14 QString generateMailBody(const GlobalStatus& pStatus, const QUrl& pServiceUrl = {});
1415
1516 } // namespace governikus
260260 }
261261
262262
263 QString ReaderDriverModel::getEmptyListDescriptionString() const
264 {
265 const QString& url = HelpAction::getOnlineUrl(QStringLiteral("readerDeviceTab"));
263 QString ReaderDriverModel::getEmptyListDescriptionStringQml() const
264 {
265 return getEmptyListDescriptionString(false);
266 }
267
268
269 QString ReaderDriverModel::getEmptyListDescriptionString(bool pWidgetUiHelp) const
270 {
271 const QString& onlineHelpSection = pWidgetUiHelp ? QStringLiteral("readerDeviceTab") : QStringLiteral("settingsPcscReader");
272 const QString& url = HelpAction::getOnlineUrl(onlineHelpSection, pWidgetUiHelp);
266273 //: Is embedded in a sentence.
267274 const QString& hyperlink = QStringLiteral("<a href=\"%1\">%2</a>").arg(url, tr("online help"));
268275 //: INFO ALL_PLATFORMS No card reader was found, the message contains a link to the installation section of the manual.
2323 Q_OBJECT
2424
2525 Q_PROPERTY(QString noReaderFoundIconPath READ getNoReaderFoundIconPath CONSTANT)
26 Q_PROPERTY(QString emptyListDescriptionString READ getEmptyListDescriptionString NOTIFY fireLanguageChanged)
26 Q_PROPERTY(QString emptyListDescriptionString READ getEmptyListDescriptionStringQml NOTIFY fireLanguageChanged)
2727 Q_PROPERTY(QString lastUpdatedInformation READ getLastUpdatedInformation NOTIFY fireModelChanged)
2828
2929 private:
6666 QString getReaderImagePath(const QModelIndex& pIndex) const;
6767 QString getNoReaderFoundIconPath() const;
6868 QString getHTMLDescription(const QModelIndex& pIndex) const;
69 QString getEmptyListDescriptionString() const;
69 QString getEmptyListDescriptionStringQml() const;
70 QString getEmptyListDescriptionString(bool pWidgetUiHelp = true) const;
7071 bool isInstalledSupportedReader(const QModelIndex& pIndex) const;
7172 QString getLastUpdatedInformation() const;
7273
1515
1616 using namespace governikus;
1717
18 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceName, const QString& pId, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry)
19 : mDeviceName(pDeviceName)
18 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceNameEscaped, const QString& pId, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry)
19 : mDeviceName(pDeviceNameEscaped)
2020 , mId(pId)
2121 , mPaired(false)
2222 , mNetworkVisible(false)
2525 , mLastConnected()
2626 , mRemoteDeviceListEntry(pRemoteDeviceListEntry)
2727 {
28 }
29
30
31 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceName, const QString& pId, bool pNetworkVisible, bool pConnected, bool pSupported, const QDateTime& pLastConnected, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry)
32 : mDeviceName(pDeviceName)
28 Q_ASSERT(!mDeviceName.contains(QLatin1Char('<')));
29 }
30
31
32 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceNameEscaped, const QString& pId, bool pNetworkVisible, bool pConnected, bool pSupported, const QDateTime& pLastConnected, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry)
33 : mDeviceName(pDeviceNameEscaped)
3334 , mId(pId)
3435 , mPaired(true)
3536 , mNetworkVisible(pNetworkVisible)
3839 , mLastConnected(pLastConnected)
3940 , mRemoteDeviceListEntry(pRemoteDeviceListEntry)
4041 {
41 }
42
43
44 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceName)
45 : mDeviceName(pDeviceName)
42 Q_ASSERT(!mDeviceName.contains(QLatin1Char('<')));
43 }
44
45
46 RemoteDeviceModelEntry::RemoteDeviceModelEntry(const QString& pDeviceNameEscaped)
47 : mDeviceName(pDeviceNameEscaped)
4648 , mId()
4749 , mPaired(false)
4850 , mNetworkVisible(false)
5153 , mLastConnected()
5254 , mRemoteDeviceListEntry(nullptr)
5355 {
56 Q_ASSERT(!mDeviceName.contains(QLatin1Char('<')));
5457 }
5558
5659
6063 }
6164
6265
63 QString RemoteDeviceModelEntry::getDeviceName() const
66 QString RemoteDeviceModelEntry::getDeviceNameEscaped() const
6467 {
6568 return mDeviceName;
6669 }
266269 supported = true;
267270 }
268271 auto modelEntry = RemoteDeviceModelEntry(
269 pairedReader.getName(),
272 pairedReader.getNameEscaped(),
270273 pairedReader.getFingerprint(),
271274 visible,
272275 connected,
326329 for (auto deviceListEntry : announcingRemoteDevices)
327330 {
328331 const auto& deviceDescriptor = deviceListEntry->getRemoteDeviceDescriptor();
329 auto modelEntry = RemoteDeviceModelEntry(deviceDescriptor.getIfdName(), deviceDescriptor.getIfdId(), deviceListEntry);
332 auto modelEntry = RemoteDeviceModelEntry(RemoteServiceSettings::escapeDeviceName(deviceDescriptor.getIfdName()), deviceDescriptor.getIfdId(), deviceListEntry);
330333 presentReaders.append(modelEntry);
331334 }
332335
404407 }
405408 else
406409 {
407 return reader.getDeviceName();
410 return reader.getDeviceNameEscaped();
408411 }
409412
410413 case REMOTE_DEVICE_NAME:
411 return reader.getDeviceName();
414 return reader.getDeviceNameEscaped();
412415
413416 case REMOTE_DEVICE_STATUS:
414417 return getStatus(reader);
568571 }
569572
570573
571 QString RemoteDeviceModel::getEmptyListDescriptionString() const
572 {
573 const QString& url = HelpAction::getOnlineUrl(QStringLiteral("readerDeviceTab"));
574 QString RemoteDeviceModel::getEmptyListDescriptionStringQml() const
575 {
576 return getEmptyListDescriptionString(false);
577 }
578
579
580 QString RemoteDeviceModel::getEmptyListDescriptionString(bool pWidgetUiHelp) const
581 {
582 const QString& onlineHelpSection = pWidgetUiHelp ? QStringLiteral("readerDeviceTab") : QStringLiteral("settingsRemoteReader");
583 const QString& url = HelpAction::getOnlineUrl(onlineHelpSection, pWidgetUiHelp);
574584 //: Is embedded in a sentence.
575585 const QString& hyperlink = QStringLiteral("<a href=\"%1\">%2</a>").arg(url, tr("online help"));
576586 //: INFO ALL_PLATFORMS No smartphone with enabled remote service was found on the same network.
3636 QSharedPointer<RemoteDeviceListEntry> mRemoteDeviceListEntry;
3737
3838 public:
39 RemoteDeviceModelEntry(const QString& pDeviceName, const QString& mId, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry);
40 RemoteDeviceModelEntry(const QString& pDeviceName, const QString& mId, bool pNetworkVisible, bool pConnected, bool pSupported, const QDateTime& pLastConnected, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry);
41 RemoteDeviceModelEntry(const QString& pDeviceName = QStringLiteral("UnknownReader"));
39 RemoteDeviceModelEntry(const QString& pDeviceNameEscaped, const QString& mId, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry);
40 RemoteDeviceModelEntry(const QString& pDeviceNameEscaped, const QString& mId, bool pNetworkVisible, bool pConnected, bool pSupported, const QDateTime& pLastConnected, QSharedPointer<RemoteDeviceListEntry>& pRemoteDeviceListEntry);
41 RemoteDeviceModelEntry(const QString& pDeviceNameEscaped = QStringLiteral("UnknownReader"));
4242
4343 bool isPaired() const;
4444 void setPaired(bool pPaired);
5353 bool operator==(const RemoteDeviceModelEntry& pOther) const;
5454
5555 const QSharedPointer<RemoteDeviceListEntry> getRemoteDeviceListEntry() const;
56 QString getDeviceName() const;
56 QString getDeviceNameEscaped() const;
5757
5858 };
5959
6262 {
6363 Q_OBJECT
6464
65 Q_PROPERTY(QString emptyListDescriptionString READ getEmptyListDescriptionString NOTIFY fireLanguageChanged)
65 Q_PROPERTY(QString emptyListDescriptionString READ getEmptyListDescriptionStringQml NOTIFY fireLanguageChanged)
6666
6767 private:
6868 friend class ::test_RemoteDeviceModel;
120120 void forgetDevice(const QModelIndex& pIndex);
121121 void forgetDevice(const QString& pDeviceId);
122122
123 QString getEmptyListDescriptionString() const;
123 QString getEmptyListDescriptionStringQml() const;
124 QString getEmptyListDescriptionString(bool pWidgetUiHelp = true) const;
124125
125126 public Q_SLOTS:
126127 void onUiShown();
3232
3333 TrayIcon::TrayIcon()
3434 : QObject()
35 #ifdef Q_OS_MACOS
36 , mIcon(QStringLiteral(":/images/macos/appIcon.svg"))
37 #else
3538 , mIcon(QStringLiteral(":/images/npa.svg"))
39 #endif
3640 #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
3741 , mTrayIcon(nullptr)
3842 #endif
99
1010 #include "AppSettings.h"
1111 #include "BuildHelper.h"
12 #include "DpiCalculator.h"
1312 #include "Env.h"
1413 #include "HelpAction.h"
1514 #include "ReaderInfo.h"
6261
6362 ApplicationModel::ApplicationModel()
6463 : mContext()
65 , mDpiScale(DpiCalculator::getDpiScale())
66 , mScaleFactor(mDpiScale)
64 , mScaleFactor(DEFAULT_SCALE_FACTOR)
6765 , mWifiInfo()
6866 , mWifiEnabled(false)
6967 , mBluetoothResponding(true)
8078 connect(readerManager, &ReaderManager::fireReaderPropertiesUpdated, this, &ApplicationModel::fireReaderPropertiesUpdated);
8179 connect(readerManager, &ReaderManager::fireStatusChanged, this, &ApplicationModel::onStatusChanged);
8280 connect(readerManager, &ReaderManager::fireStatusChanged, this, &ApplicationModel::fireBluetoothReaderChanged);
83 connect(readerManager, &ReaderManager::fireReaderAdded, this, &ApplicationModel::fireSelectedReaderChanged);
84 connect(readerManager, &ReaderManager::fireReaderRemoved, this, &ApplicationModel::fireSelectedReaderChanged);
81 connect(readerManager, &ReaderManager::fireReaderAdded, this, &ApplicationModel::fireAvailableReaderChanged);
82 connect(readerManager, &ReaderManager::fireReaderRemoved, this, &ApplicationModel::fireAvailableReaderChanged);
8583 connect(&mWifiInfo, &WifiInfo::fireWifiEnabledChanged, this, &ApplicationModel::onWifiEnabledChanged);
8684
8785 onWifiEnabledChanged();
9896 {
9997 if (mContext)
10098 {
101 disconnect(mContext.data(), &WorkflowContext::fireReaderPlugInTypesChanged, this, &ApplicationModel::fireSelectedReaderChanged);
99 disconnect(mContext.data(), &WorkflowContext::fireReaderPlugInTypesChanged, this, &ApplicationModel::fireAvailableReaderChanged);
102100 }
103101
104102 if ((mContext = pContext))
105103 {
106 connect(mContext.data(), &WorkflowContext::fireReaderPlugInTypesChanged, this, &ApplicationModel::fireSelectedReaderChanged);
107 connect(mContext.data(), &WorkflowContext::fireReaderNameChanged, this, &ApplicationModel::fireSelectedReaderChanged);
104 connect(mContext.data(), &WorkflowContext::fireReaderPlugInTypesChanged, this, &ApplicationModel::fireAvailableReaderChanged);
105 connect(mContext.data(), &WorkflowContext::fireReaderNameChanged, this, &ApplicationModel::fireAvailableReaderChanged);
108106 connect(mContext.data(), &WorkflowContext::fireReaderNameChanged, this, &ApplicationModel::fireReaderPropertiesUpdated);
109107 connect(mContext.data(), &WorkflowContext::fireReaderInfoChanged, this, &ApplicationModel::fireReaderPropertiesUpdated);
110108 }
272270 }
273271
274272
275 qreal ApplicationModel::getDpiScale() const
276 {
277 return mDpiScale;
278 }
279
280
281273 qreal ApplicationModel::getScaleFactor() const
282274 {
283275 return mScaleFactor;
286278
287279 void ApplicationModel::setScaleFactor(qreal pScaleFactor)
288280 {
289 pScaleFactor *= mDpiScale;
281 pScaleFactor *= DEFAULT_SCALE_FACTOR;
290282
291283 if (qAbs(pScaleFactor - mScaleFactor) > 0)
292284 {
314306 }
315307
316308
317 bool ApplicationModel::foundSelectedReader() const
309 int ApplicationModel::getAvailableReader() const
318310 {
319311 if (!mContext)
320312 {
321 return false;
322 }
323
324 return !Env::getSingleton<ReaderManager>()->getReaderInfos(ReaderFilter(mContext->getReaderPlugInTypes())).isEmpty();
313 return 0;
314 }
315
316 return Env::getSingleton<ReaderManager>()->getReaderInfos(ReaderFilter(mContext->getReaderPlugInTypes())).size();
325317 }
326318
327319
481473 qCCritical(qml) << "Suppressing an unexpected exception.";
482474 env->ExceptionDescribe();
483475 env->ExceptionClear();
484 // The toast was probably not displayed (e.g. DeadObjectException). We halt on error
485 // since it is used to display information to the user as required by the TR.
476 // The toast was probably not displayed (e.g. DeadObjectException). We halt on error
477 // since it is used to display information to the user as required by the TR.
486478 Q_ASSERT(false);
487479 }
488480 });
531523 #endif
532524
533525
526 #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
527 QString ApplicationModel::onlineHelpUrl(const QString& pHelpSectionName)
528 {
529 return HelpAction::getOnlineUrl(pHelpSectionName, false);
530 }
531
532
534533 void ApplicationModel::openOnlineHelp(const QString& pHelpSectionName)
535534 {
536 #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
537 qCWarning(qml) << "NOT IMPLEMENTED:" << pHelpSectionName;
538 #else
539535 HelpAction::openContextHelp(pHelpSectionName, false);
540 #endif
541 }
536 }
537
538
539 #endif
542540
543541
544542 void ApplicationModel::onWifiEnabledChanged()
4343 Q_PROPERTY(bool bluetoothAvailable READ isBluetoothAvailable CONSTANT)
4444 Q_PROPERTY(bool locationPermissionRequired READ locationPermissionRequired NOTIFY fireBluetoothReaderChanged)
4545
46 Q_PROPERTY(qreal dpiScale READ getDpiScale CONSTANT)
4746 Q_PROPERTY(qreal scaleFactor READ getScaleFactor WRITE setScaleFactor NOTIFY fireScaleFactorChanged)
4847 Q_PROPERTY(bool wifiEnabled READ isWifiEnabled NOTIFY fireWifiEnabledChanged)
4948
5049 Q_PROPERTY(QString currentWorkflow READ getCurrentWorkflow NOTIFY fireCurrentWorkflowChanged)
51 Q_PROPERTY(bool foundSelectedReader READ foundSelectedReader NOTIFY fireSelectedReaderChanged)
50 Q_PROPERTY(int availableReader READ getAvailableReader NOTIFY fireAvailableReaderChanged)
5251
5352 Q_PROPERTY(QString feedback READ getFeedback NOTIFY fireFeedbackChanged)
5453
5857 ReaderManagerPlugInInfo getFirstPlugInInfo(ReaderManagerPlugInType pType) const;
5958
6059 private:
61 qreal mDpiScale;
60 constexpr static qreal DEFAULT_SCALE_FACTOR = 0.6;
6261 qreal mScaleFactor;
6362 WifiInfo mWifiInfo;
6463 bool mWifiEnabled;
112111 bool locationPermissionRequired() const;
113112
114113 bool isWifiEnabled() const;
115 qreal getDpiScale() const;
116114 qreal getScaleFactor() const;
117115 void setScaleFactor(qreal pScaleFactor);
118116
119117 QString getCurrentWorkflow() const;
120 bool foundSelectedReader() const;
118 int getAvailableReader() const;
121119
122120 QString getFeedback() const;
123121
133131 Q_INVOKABLE void showSettings(const QString& pAction);
134132 Q_INVOKABLE void showFeedback(const QString& pMessage, bool pReplaceExisting = false);
135133 Q_INVOKABLE void keepScreenOn(bool pActive);
134 #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
135 Q_INVOKABLE QString onlineHelpUrl(const QString& pHelpSectionName);
136136 Q_INVOKABLE void openOnlineHelp(const QString& pHelpSectionName);
137 #endif
137138 Q_INVOKABLE QString stripHtmlTags(QString pString) const;
138139 #ifdef Q_OS_IOS
139140 Q_INVOKABLE void showAppStoreRatingDialog();
152153 void fireBluetoothReaderChanged();
153154
154155 void fireCurrentWorkflowChanged();
155 void fireSelectedReaderChanged();
156 void fireAvailableReaderChanged();
156157
157158 void fireScaleFactorChanged();
158159 void fireWifiEnabledChanged();
6969 }
7070
7171
72 QString AuthModel::getErrorHeader() const
73 {
74 if (!mContext || mContext->getTcTokenUrl().isEmpty())
75 {
76 return QString();
77 }
78
79 const auto& tcTokenUrl = mContext->getTcTokenUrl();
80 return tcTokenUrl.scheme() + QStringLiteral("://") + tcTokenUrl.authority();
81 }
82
83
84 QString AuthModel::getErrorText() const
85 {
86 if (!mContext)
87 {
88 return QString();
89 }
90
91 const auto& status = mContext->getStatus();
92 const auto& externalInfo = status.getExternalInfo();
93 const auto& errorDescription = status.toErrorDescription(false);
94 if (externalInfo.isEmpty() || errorDescription == externalInfo)
95 {
96 return errorDescription;
97 }
98
99 return errorDescription + QStringLiteral("\n(%1)").arg(externalInfo);
100 }
101
102
103 QString AuthModel::getStatusCode() const
104 {
105 const auto statusCode = mContext ? mContext->getStatus().getStatusCode() : GlobalStatus::Code::Unknown_Error;
106 return getEnumName(statusCode);
107 }
108
109
72110 AuthModel& AuthModel::getInstance()
73111 {
74112 return *Instance;
2626 Q_PROPERTY(QString transactionInfo READ getTransactionInfo NOTIFY fireTransactionInfoChanged)
2727 Q_PROPERTY(int progressValue READ getProgressValue NOTIFY fireProgressChanged)
2828 Q_PROPERTY(QString progressMessage READ getProgressMessage NOTIFY fireProgressChanged)
29 Q_PROPERTY(QString errorHeader READ getErrorHeader NOTIFY fireResultChanged)
30 Q_PROPERTY(QString errorText READ getErrorText NOTIFY fireResultChanged)
31 Q_PROPERTY(QString statusCode READ getStatusCode NOTIFY fireResultChanged)
2932
3033 private:
3134 QSharedPointer<AuthContext> mContext;
4245 const QString& getTransactionInfo() const;
4346 int getProgressValue() const;
4447 const QString getProgressMessage() const;
48 QString getErrorHeader() const;
49 QString getErrorText() const;
50 QString getStatusCode() const;
4551
4652 Q_INVOKABLE void setSkipRedirect(bool pSkipRedirect);
4753
44 #include "CertificateDescriptionModel.h"
55
66 #include "AppSettings.h"
7 #include "LanguageLoader.h"
78 #include "SecureStorage.h"
89
910
124125 if (mContext && mContext->getDidAuthenticateEac1() && !mContext->getDidAuthenticateEac1()->getCvCertificates().isEmpty())
125126 {
126127 const CVCertificateBody body = mContext->getDidAuthenticateEac1()->getCvCertificates().at(0)->getBody();
127 const QString effectiveDate = body.getCertificateEffectiveDate().toString(Qt::DefaultLocaleShortDate);
128 const QString expirationDate = body.getCertificateExpirationDate().toString(Qt::DefaultLocaleShortDate);
128 const auto locale = LanguageLoader::getInstance().getUsedLocale();
129 const auto effectiveDate = locale.toString(body.getCertificateEffectiveDate(), QLocale::ShortFormat);
130 const auto expirationDate = locale.toString(body.getCertificateExpirationDate(), QLocale::ShortFormat);
129131
130132 return QStringLiteral("%1 - %2").arg(effectiveDate, expirationDate);
131133 }
2424 Q_PROPERTY(QString subjectName READ getSubjectName NOTIFY fireChanged)
2525 Q_PROPERTY(QString purpose READ getPurpose NOTIFY fireChanged)
2626
27 QVector<QPair<QString, QString> > mData;
27 QVector<QPair<QString, QString>> mData;
2828 QSharedPointer<AuthContext> mContext;
2929
3030 inline QSharedPointer<const CertificateDescription> getCertificateDescription() const;
+0
-57
src/ui/qml/DpiCalculator.cpp less more
0 /*
1 * \copyright Copyright (c) 2015-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #include "DpiCalculator.h"
5
6 #include <QGuiApplication>
7 #include <QLoggingCategory>
8 #include <QScreen>
9
10
11 using namespace governikus;
12
13
14 Q_DECLARE_LOGGING_CATEGORY(qml)
15
16
17 qreal DpiCalculator::getDpi()
18 {
19 qreal dpi = 0.0;
20 auto app = static_cast<QGuiApplication*>(QCoreApplication::instance());
21 auto screen = app->primaryScreen();
22 if (screen)
23 {
24 #if defined(Q_OS_ANDROID)
25 auto envDpi = qgetenv("QT_ANDROID_THEME_DISPLAY_DPI");
26 bool ok;
27 dpi = envDpi.toDouble(&ok);
28 if (!ok)
29 {
30 qCCritical(qml) << "Cannot get screen dpi";
31 dpi = -1.0;
32 }
33 #elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
34 // The physical DPI changes on Apple devices with screen scaling, on other platforms it behaves the other way around.
35 dpi = screen->physicalDotsPerInch();
36 #else
37 dpi = screen->logicalDotsPerInch();
38 #endif
39 qCInfo(qml) << "Determined dpi:"
40 << screen->logicalDotsPerInch() << "(logical),"
41 << screen->physicalDotsPerInch() << "(physical)";
42 }
43
44 qCInfo(qml) << "Using dpi" << dpi;
45
46 #ifndef QT_NO_DEBUG
47 const char* const overrideDpi = "OVERRIDE_DPI";
48 if (!qEnvironmentVariableIsEmpty(overrideDpi))
49 {
50 dpi = qEnvironmentVariableIntValue(overrideDpi);
51 qCDebug(qml) << "Override DPI:" << dpi;
52 }
53 #endif
54
55 return dpi;
56 }
+0
-31
src/ui/qml/DpiCalculator.h less more
0 /*!
1 * \copyright Copyright (c) 2015-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #pragma once
5
6 #include <QtGlobal>
7
8 namespace governikus
9 {
10
11 class DpiCalculator
12 {
13 private:
14 DpiCalculator()
15 {
16 }
17
18
19 static qreal getDpi();
20
21 public:
22 static qreal getDpiScale()
23 {
24 return getDpi() / 160;
25 }
26
27
28 };
29
30 } // namespace governikus
33
44 #include "LogModel.h"
55
6 #include "ApplicationModel.h"
67 #include "LanguageLoader.h"
78 #include "LogHandler.h"
89 #include "PlatformHelper.h"
1112 #include "SingletonHelper.h"
1213
1314 #include <QDir>
15 #include <QFile>
1416 #include <QFileInfo>
1517 #include <QtMath>
1618
6062 , mSelectedLogFile(-1)
6163 , mLogEntries()
6264 {
65 mLogFiles += QString(); // dummy entry for "current logfile"
66 const auto logHandler = Env::getSingleton<LogHandler>();
67 for (const auto& entry : logHandler->getOtherLogfiles())
68 {
69 mLogFiles += entry.absoluteFilePath();
70 }
71
6372 setLogfile(0);
73
6474 connect(Env::getSingleton<SettingsModel>(), &SettingsModel::fireLanguageChanged, this, &LogModel::fireLogFilesChanged); // needed to translate the "Current log" entry on language change
6575 }
6676
7181 }
7282
7383
74 QStringList LogModel::getLogfiles()
75 {
76 mLogFiles.clear();
77 mLogFiles += QString();
78 const auto& logHandler = Env::getSingleton<LogHandler>();
79
84 QStringList LogModel::getLogfiles() const
85 {
86 const auto logHandler = Env::getSingleton<LogHandler>();
8087 QStringList logFileNames;
8188 //: LABEL ALL_PLATFORMS
8289 logFileNames += tr("Current log");
83 const auto& logFiles = logHandler->getOtherLogfiles();
84 for (const auto& entry : logFiles)
85 {
86 mLogFiles += entry.absoluteFilePath();
87 logFileNames += LanguageLoader::getInstance().getUsedLocale().toString(logHandler->getFileDate(entry), tr("dd.MM.yyyy hh:mm:ss"));
88 }
89
90 setLogfile(0);
90 for (const auto& entry : qAsConst(mLogFiles))
91 {
92 if (!entry.isEmpty())
93 {
94 logFileNames += LanguageLoader::getInstance().getUsedLocale().toString(logHandler->getFileDate(entry), tr("dd.MM.yyyy hh:mm:ss"));
95 }
96 }
97
9198 return logFileNames;
9299 }
93100
114121
115122 void LogModel::removeCurrentLogfile()
116123 {
117 QFile::remove(mLogFiles[mSelectedLogFile]);
124 if (mSelectedLogFile == 0)
125 {
126 return;
127 }
128
129 if (!QFile::remove(mLogFiles[mSelectedLogFile]))
130 {
131 qDebug() << mLogFiles[mSelectedLogFile] << "could not be removed";
132 return;
133 }
134
135 mLogFiles.removeAt(mSelectedLogFile);
118136 Q_EMIT fireLogFilesChanged();
119137 }
120138
121139
122140 void LogModel::setLogfile(int pIndex)
123141 {
142 if (pIndex < 0 || pIndex >= mLogFiles.size())
143 {
144 qDebug() << "Called with invalid index:" << pIndex;
145 return;
146 }
147
124148 if (pIndex == mSelectedLogFile)
125149 {
126150 return;
127151 }
128152
129153 mSelectedLogFile = pIndex;
130 const auto& logHandler = Env::getSingleton<LogHandler>();
154 const auto logHandler = Env::getSingleton<LogHandler>();
131155
132156 if (pIndex == 0)
133157 {
134 const auto& backLog = logHandler->getBacklog();
135 QTextStream in(backLog);
158 QTextStream in(logHandler->useLogfile() ? logHandler->getBacklog() : tr("The logfile is disabled.").toUtf8());
159 in.setCodec("UTF-8");
160
136161 setLogEntries(in);
137162 connect(logHandler, &LogHandler::fireLog, this, &LogModel::onNewLogMsg);
138163 }
143168 if (inputFile.open(QIODevice::ReadOnly))
144169 {
145170 QTextStream in(&inputFile);
171 in.setCodec("UTF-8");
146172 setLogEntries(in);
147173 inputFile.close();
148174 }
152178
153179 void LogModel::saveCurrentLogfile(const QUrl& pFilename) const
154180 {
181 bool success = false;
182 const auto logHandler = Env::getSingleton<LogHandler>();
155183 const QString logfilePath = mLogFiles.at(mSelectedLogFile);
156184
157185 if (logfilePath.isEmpty())
158186 {
159 const auto& logHandler = Env::getSingleton<LogHandler>();
160 logHandler->copy(pFilename.toLocalFile());
187 success = logHandler->copy(pFilename.toLocalFile());
161188 }
162189 else
163190 {
164 QFile::copy(logfilePath, pFilename.toLocalFile());
165 }
191 success = logHandler->copyOther(logfilePath, pFilename.toLocalFile());
192 }
193
194 const auto applicationModel = Env::getSingleton<ApplicationModel>();
195 applicationModel->showFeedback((success ? tr("Successfully saved logfile to \"%1\"") : tr("Error while saving logfile to \"%1\"")).arg(pFilename.toLocalFile()));
166196 }
167197
168198
5050 static LogModel& getInstance();
5151
5252 public:
53 QStringList getLogfiles();
53 QStringList getLogfiles() const;
5454 Q_INVOKABLE QDateTime getCurrentLogfileDate() const;
5555 Q_INVOKABLE void removeOtherLogfiles();
5656 Q_INVOKABLE void removeCurrentLogfile();
6060 connect(mContext.data(), &WorkflowContext::firePaceResultUpdated, this, &NumberModel::fireInputErrorChanged);
6161
6262 // The length of the pin doesn't matter for the core. Requesting
63 // a 5- or 6-digit PIN is only part of the gui. Therefore we handle
63 // a five- or six-digit PIN is only part of the gui. Therefore we handle
6464 // this state in the NumberModel. The only case where the core need
65 // to know if the transport PIN should be requested is, when we
65 // to know if the Transport PIN should be requested is, when we
6666 // are in an authentication workflow and want to start a pin change.
67 // Therefore we enqueue a ChangePinContext with the transport PIN
67 // Therefore we enqueue a ChangePinContext with the Transport PIN
6868 // request and consider it in this function.
6969 const QSharedPointer<ChangePinContext> context = mContext.objectCast<ChangePinContext>();
7070 mRequestTransportPin |= (context && context->requestTransportPin());
235235 return QString();
236236
237237 case CardReturnCode::INVALID_PIN:
238 //: INFO ALL_PLATFORMS The wrong PIN was entered on the first attempt.
239 return tr("The given PIN is not correct. You have 2 tries to enter the correct PIN.");
238 //: INFO ALL_PLATFORMS The wrong (Transport) PIN was entered on the first attempt.
239 return tr("The given %1 is not correct. You have two attempts to enter the correct %1.").arg(isRequestTransportPin() ? tr("Transport PIN") : tr("PIN"));
240240
241241 case CardReturnCode::INVALID_PIN_2:
242 //: INFO ALL_PLATFORMS The wrong PIN was entered twice, the next attempt requires the CAN for additional verification.
243 return tr("A wrong PIN has been entered twice on your ID card. "
244 "Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. "
245 "You can find your card access number (CAN) on the front of your ID card.");
242 //: INFO ALL_PLATFORMS The wrong (Transport) PIN was entered twice, the next attempt requires the CAN for additional verification.
243 return tr("A wrong %1 has been entered twice on your ID card. "
244 "For a third attempt, please first enter the six-digit Card Access Number (CAN). "
245 "You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.").arg(isRequestTransportPin() ? tr("Transport PIN") : tr("PIN"));
246246
247247 case CardReturnCode::INVALID_PIN_3:
248 //: INFO ALL_PLATFORMS The PIN was entered wrongfully three times, the ID card needs to be unlocked using the PUK.
249 return tr("A wrong PIN has been entered three times on your ID card. "
250 "Your PIN is now blocked. "
251 "To unblock your PIN you have to enter the PUK.");
248 //: INFO ALL_PLATFORMS The (Transport) PIN was entered wrongfully three times, the ID card needs to be unlocked using the PUK.
249 return tr("A wrong %1 has been entered three times on your ID card. "
250 "Your %1 is now blocked. "
251 "You have to enter the PUK to remove the block.").arg(isRequestTransportPin() ? tr("Transport PIN") : tr("PIN"));
252252
253253 case CardReturnCode::INVALID_CAN:
254254 //: INFO ALL_PLATFORMS The CAN was entered wrongfully and needs to be supplied again.
255 return tr("The entered card access number (CAN) is incorrect. Please try again.");
255 return tr("The entered Card Access Number (CAN) is incorrect. Please try again.");
256256
257257 case CardReturnCode::INVALID_PUK:
258258 //: INFO ALL_PLATFORMS The PUK entered wrongfully and needs to be supplied again.
3232
3333 int ProviderCategoryFilterModel::getAdditionalResultCount() const
3434 {
35 if (mSearchString.isEmpty())
35 if (mSearchString.isEmpty() || mSelectedCategories.isEmpty())
3636 {
3737 return 0;
3838 }
3939
4040 auto excludedCategories = ProviderModel::getProviderCategories() - mSelectedCategories;
41 if (excludedCategories.isEmpty())
42 {
43 return 0;
44 }
45
4146 return resultCountForFilter(excludedCategories, mSearchString);
4247 }
4348
0 /*!
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #include "ProxyCredentials.h"
5
6
7 using namespace governikus;
8
9
10 QString ProxyCredentials::createUrl(const QNetworkProxy& pProxy)
11 {
12 QUrl url;
13 switch (pProxy.type())
14 {
15 case QNetworkProxy::Socks5Proxy:
16 url.setScheme(QStringLiteral("socks5"));
17 break;
18
19 case QNetworkProxy::FtpCachingProxy:
20 url.setScheme(QStringLiteral("ftp"));
21 break;
22
23 default:
24 url.setScheme(QStringLiteral("http"));
25 }
26 url.setHost(pProxy.hostName());
27 url.setPort(pProxy.port());
28
29 return url.toString();
30 }
31
32
33 ProxyCredentials::ProxyCredentials(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator)
34 : QObject()
35 , mLoop()
36 , mAuthenticator(pAuthenticator)
37 , mProposedUser(pProxy.user())
38 , mUrl(createUrl(pProxy))
39 {
40 }
41
42
43 QString ProxyCredentials::getProposedUser() const
44 {
45 return mProposedUser;
46 }
47
48
49 QString ProxyCredentials::getUrl() const
50 {
51 return mUrl;
52 }
53
54
55 QString ProxyCredentials::getUser() const
56 {
57 if (mAuthenticator)
58 {
59 return mAuthenticator->user();
60 }
61
62 return QString();
63 }
64
65
66 void ProxyCredentials::setUser(const QString& pUser)
67 {
68 if (mAuthenticator)
69 {
70 mAuthenticator->setUser(pUser);
71 }
72 }
73
74
75 QString ProxyCredentials::getPassword() const
76 {
77 if (mAuthenticator)
78 {
79 return mAuthenticator->password();
80 }
81
82 return QString();
83 }
84
85
86 void ProxyCredentials::setPassword(const QString& pPassword)
87 {
88 if (mAuthenticator)
89 {
90 mAuthenticator->setPassword(pPassword);
91 }
92 }
93
94
95 void ProxyCredentials::confirmInput()
96 {
97 mLoop.exit();
98 }
99
100
101 void ProxyCredentials::waitForConfirmation()
102 {
103 mLoop.exec();
104 }
0 /*!
1 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 #pragma once
5
6 #include <QAuthenticator>
7 #include <QEventLoop>
8 #include <QNetworkProxy>
9
10
11 namespace governikus
12 {
13
14 class ProxyCredentials
15 : public QObject
16 {
17 Q_OBJECT
18
19 Q_PROPERTY(QString proposedUser READ getProposedUser CONSTANT)
20 Q_PROPERTY(QString url READ getUrl CONSTANT)
21 Q_PROPERTY(QString user READ getUser WRITE setUser)
22 Q_PROPERTY(QString password READ getPassword WRITE setPassword)
23
24 private:
25 QEventLoop mLoop;
26 QAuthenticator* mAuthenticator;
27 const QString mProposedUser;
28 const QString mUrl;
29
30 QString createUrl(const QNetworkProxy& pProxy);
31
32 public:
33 ProxyCredentials(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator);
34
35 QString getProposedUser() const;
36 QString getUrl() const;
37
38 QString getUser() const;
39 void setUser(const QString& pUser);
40
41 QString getPassword() const;
42 void setPassword(const QString& pPassword);
43
44 Q_INVOKABLE void confirmInput();
45 void waitForConfirmation();
46 };
47
48
49 } // namespace governikus
180180 auto* const remoteClient = Env::getSingleton<RemoteClient>();
181181 disconnect(remoteClient, &RemoteClient::fireEstablishConnectionDone, this, &RemoteServiceModel::onEstablishConnectionDone);
182182 qDebug() << "Pairing finished:" << pStatus;
183 const auto deviceName = pEntry->getRemoteDeviceDescriptor().getIfdName();
183 const auto deviceName = RemoteServiceSettings::escapeDeviceName(pEntry->getRemoteDeviceDescriptor().getIfdName());
184184 if (pStatus.isError())
185185 {
186186 Q_EMIT firePairingFailed(deviceName, pStatus.toErrorDescription());
197197 if (mContext && pConnected)
198198 {
199199 const RemoteServiceSettings& settings = Env::getSingleton<AppSettings>()->getRemoteServiceSettings();
200 const QString peerName = settings.getRemoteInfo(mContext->getRemoteServer()->getCurrentCertificate()).getName();
200 const QString peerName = settings.getRemoteInfo(mContext->getRemoteServer()->getCurrentCertificate()).getNameEscaped();
201201 //: INFO ANDROID IOS The smartphone is connected as card reader (SaK) and currently processing an authentication request. The user is asked to pay attention the its screen.
202202 mConnectionInfo = tr("Please pay attention to the display on your other device \"%1\".").arg(peerName);
203203 Q_EMIT fireConnectionInfoChanged();
349349 }
350350 if (!pWifiEnabled)
351351 {
352 //: INFO ALL_PLATFORMS The wifi feature is not enabled but required to use the smartphone as a card reader (SaK).
352 //: INFO ALL_PLATFORMS The WiFi feature is not enabled but required to use the smartphone as a card reader (SaK).
353353 return tr("Please connect your WiFi to use the remote service.");
354354 }
355355
385385 QStringList deviceNames;
386386 for (const auto& info : deviceInfos)
387387 {
388 deviceNames.append(QLatin1Char('"') + info.getName() + QLatin1Char('"'));
388 deviceNames.append(QLatin1Char('"') + info.getNameEscaped() + QLatin1Char('"'));
389389 }
390390 mConnectedServerDeviceNames = deviceNames.join(QLatin1String(", "));
391391 Q_EMIT fireConnectedServerDeviceNamesChanged();
1717 defineSingleton(SelfDiagnosisModel)
1818
1919
20 bool SelfDiagnosisModel::isRunning() const
21 {
22 return mDiagnosisModel.isRunning();
23 }
24
25
2026 SelfDiagnosisModel::SelfDiagnosisModel(QObject* pParent)
2127 : QObject(pParent)
2228 , mDiagnosisContext(new DiagnosisContext)
2430 {
2531 const GeneralSettings& generalSettings = Env::getSingleton<AppSettings>()->getGeneralSettings();
2632 connect(&generalSettings, &GeneralSettings::fireLanguageChanged, this, &SelfDiagnosisModel::fireSectionContentModelChanged);
33 connect(&mDiagnosisModel, &DiagnosisModel::fireRunningChanged, this, &SelfDiagnosisModel::fireRunningChanged);
2734 }
2835
2936
2424 friend class Env;
2525
2626 Q_PROPERTY(QAbstractListModel * sectionsModel READ getSectionsModel CONSTANT)
27 Q_PROPERTY(bool running READ isRunning NOTIFY fireRunningChanged)
2728
2829 private:
30 bool isRunning() const;
31
2932 QSharedPointer<DiagnosisContext> mDiagnosisContext;
3033 DiagnosisModel mDiagnosisModel;
3134 QScopedPointer<DiagnosisController> mDiagnosisController;
4548 Q_SIGNALS:
4649 void fireSectionContentModelChanged();
4750 void fireCurrentSectionChanged();
51 void fireRunningChanged();
4852 };
4953
5054 } // namespace governikus
66 #include "AppSettings.h"
77 #include "HistorySettings.h"
88 #include "LanguageLoader.h"
9 #include "NetworkManager.h"
910 #include "PlatformHelper.h"
1011 #include "Service.h"
1112 #include "SingletonHelper.h"
2324
2425 SettingsModel::SettingsModel()
2526 : QObject()
27 , mAdvancedSettings(false)
2628 , mIsStartedByAuth(false)
2729 , mShowBetaTesting(true)
2830 {
6870 settings.setLanguage(QLocale(pLanguage).language());
6971 settings.save();
7072 Q_EMIT fireLanguageChanged();
73 }
74 }
75
76
77 bool SettingsModel::isAdvancedSettings() const
78 {
79 return mAdvancedSettings;
80 }
81
82
83 void SettingsModel::setAdvancedSettings(bool pEnabled)
84 {
85 if (mAdvancedSettings != pEnabled)
86 {
87 mAdvancedSettings = pEnabled;
88 Q_EMIT fireAdvancedSettingsChanged();
7189 }
7290 }
7391
245263 }
246264
247265
266 bool SettingsModel::isEnableCanAllowed() const
267 {
268 return Env::getSingleton<AppSettings>()->getGeneralSettings().isEnableCanAllowed();
269 }
270
271
272 void SettingsModel::setEnableCanAllowed(bool pEnableCanAllowed)
273 {
274 if (isEnableCanAllowed() != pEnableCanAllowed)
275 {
276 auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
277 settings.setEnableCanAllowed(pEnableCanAllowed);
278 settings.save();
279 Q_EMIT fireCanAllowedChanged();
280 }
281 }
282
283
284 bool SettingsModel::isSkipRightsOnCanAllowed() const
285 {
286 return Env::getSingleton<AppSettings>()->getGeneralSettings().isSkipRightsOnCanAllowed();
287 }
288
289
290 void SettingsModel::setSkipRightsOnCanAllowed(bool pSkipRightsOnCanAllowed)
291 {
292 if (isSkipRightsOnCanAllowed() != pSkipRightsOnCanAllowed)
293 {
294 auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
295 settings.setSkipRightsOnCanAllowed(pSkipRightsOnCanAllowed);
296 settings.save();
297 Q_EMIT fireCanAllowedChanged();
298 }
299 }
300
301
248302 bool SettingsModel::isShowSetupAssistantOnStart() const
249303 {
250304 auto& generalSettings = Env::getSingleton<AppSettings>()->getGeneralSettings();
451505
452506 void SettingsModel::updateApp()
453507 {
454 Env::getSingleton<Service>()->updateApp(true);
508 Env::getSingleton<Service>()->updateApp();
455509 }
456510
457511
460514 auto* dataModel = Env::getSingleton<AppUpdateDataModel>();
461515 return dataModel;
462516 }
517
518
519 QUrl SettingsModel::getCustomProxyUrl() const
520 {
521 auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
522 QUrl url;
523 switch (settings.getCustomProxyType())
524 {
525 case QNetworkProxy::Socks5Proxy:
526 url.setScheme(QLatin1String("socks5"));
527 break;
528
529 case QNetworkProxy::HttpProxy:
530 url.setScheme(QLatin1String("http"));
531 break;
532
533 default:
534 url.setScheme(QLatin1String("unknown"));
535 break;
536 }
537 url.setHost(settings.getCustomProxyHost());
538 url.setPort(settings.getCustomProxyPort());
539 return url.toString();
540 }
541
542
543 bool SettingsModel::isCustomProxyAttributesPresent() const
544 {
545 return Env::getSingleton<AppSettings>()->getGeneralSettings().customProxyAttributesPresent();
546 }
547
548
549 bool SettingsModel::isUseCustomProxy()
550 {
551 return Env::getSingleton<AppSettings>()->getGeneralSettings().useCustomProxy();
552 }
553
554
555 void SettingsModel::setUseCustomProxy(bool pUseCustomProxy)
556 {
557 Env::getSingleton<AppSettings>()->getGeneralSettings().setUseCustomProxy(pUseCustomProxy);
558 }
99 #include "Env.h"
1010
1111 #include <QObject>
12 #include <QUrl>
1213
1314 namespace governikus
1415 {
2122
2223 Q_PROPERTY(QString translationTrigger READ getEmptyString NOTIFY fireLanguageChanged)
2324 Q_PROPERTY(QString language READ getLanguage WRITE setLanguage NOTIFY fireLanguageChanged)
25 Q_PROPERTY(bool advancedSettings READ isAdvancedSettings WRITE setAdvancedSettings NOTIFY fireAdvancedSettingsChanged)
2426 Q_PROPERTY(bool developerOptions READ isDeveloperOptions WRITE setDeveloperOptions NOTIFY fireDeveloperOptionsChanged)
2527 Q_PROPERTY(bool developerMode READ isDeveloperMode WRITE setDeveloperMode NOTIFY fireDeveloperOptionsChanged)
2628 Q_PROPERTY(bool showBetaTesting MEMBER mShowBetaTesting NOTIFY fireDeveloperOptionsChanged)
3133 Q_PROPERTY(bool useScreenKeyboard READ isUseScreenKeyboard WRITE setUseScreenKeyboard NOTIFY fireScreenKeyboardChanged)
3234 Q_PROPERTY(bool visualPrivacy READ isVisualPrivacy WRITE setVisualPrivacy NOTIFY fireScreenKeyboardChanged)
3335 Q_PROPERTY(bool shuffleScreenKeyboard READ isShuffleScreenKeyboard WRITE setShuffleScreenKeyboard NOTIFY fireScreenKeyboardChanged)
36 Q_PROPERTY(bool enableCanAllowed READ isEnableCanAllowed WRITE setEnableCanAllowed NOTIFY fireCanAllowedChanged)
37 Q_PROPERTY(bool skipRightsOnCanAllowed READ isSkipRightsOnCanAllowed WRITE setSkipRightsOnCanAllowed NOTIFY fireCanAllowedChanged)
3438 Q_PROPERTY(bool showSetupAssistantOnStart READ isShowSetupAssistantOnStart WRITE setShowSetupAssistantOnStart NOTIFY fireShowSetupAssistantOnStartChanged)
3539 Q_PROPERTY(bool autoStartAvailable READ isAutoStartAvailable CONSTANT)
3640 Q_PROPERTY(bool autoStartApp READ isAutoStart WRITE setAutoStart NOTIFY fireAutoStartChanged)
4448 Q_PROPERTY(bool showInAppNotifications READ isShowInAppNotifications WRITE setShowInAppNotifications NOTIFY fireShowInAppNotificationsChanged)
4549 Q_PROPERTY(AppUpdateDataModel * appUpdateData READ getAppUpdateData NOTIFY fireAppUpdateDataChanged)
4650 Q_PROPERTY(bool showNewUiHint READ isShowNewUiHint WRITE setShowNewUiHint NOTIFY fireShowNewUiHintChanged)
51 Q_PROPERTY(QUrl customProxyUrl READ getCustomProxyUrl CONSTANT)
52 Q_PROPERTY(bool customProxyAttributesPresent READ isCustomProxyAttributesPresent CONSTANT)
53 Q_PROPERTY(bool useCustomProxy READ isUseCustomProxy WRITE setUseCustomProxy)
4754
4855 private:
56 bool mAdvancedSettings;
4957 bool mIsStartedByAuth;
5058 bool mShowBetaTesting;
5159
5866 QString getEmptyString();
5967 QString getLanguage() const;
6068 void setLanguage(const QString& pLanguage);
69
70 bool isAdvancedSettings() const;
71 void setAdvancedSettings(bool pEnabled);
6172
6273 bool isDeveloperOptions() const;
6374 void setDeveloperOptions(bool pEnabled);
90101 bool isShuffleScreenKeyboard() const;
91102 void setShuffleScreenKeyboard(bool pShuffleScreenKeyboard);
92103
104 bool isEnableCanAllowed() const;
105 void setEnableCanAllowed(bool pEnableCanAllowed);
106
107 bool isSkipRightsOnCanAllowed() const;
108 void setSkipRightsOnCanAllowed(bool pSkipRightsOnCanAllowed);
109
93110 bool isShowSetupAssistantOnStart() const;
94111 void setShowSetupAssistantOnStart(bool pShowSetupAssistantOnStart);
95112
118135 bool isShowNewUiHint() const;
119136 void setShowNewUiHint(bool pShowNewUiHint);
120137
138 QUrl getCustomProxyUrl() const;
139 bool isCustomProxyAttributesPresent() const;
140 bool isUseCustomProxy();
141 void setUseCustomProxy(bool pUseCustomProxy);
142
121143 Q_INVOKABLE bool requestStoreFeedback() const;
122144 Q_INVOKABLE void hideFutureStoreFeedbackDialogs();
123145
130152
131153 Q_SIGNALS:
132154 void fireLanguageChanged();
155 void fireAdvancedSettingsChanged();
133156 void fireDeveloperOptionsChanged();
134157 void fireDeviceNameChanged();
135158 void firePinPadModeChanged();
136159 void fireHistoryEnabledChanged();
137160 void fireScreenKeyboardChanged();
161 void fireCanAllowedChanged();
138162 void fireShowSetupAssistantOnStartChanged();
139163 void fireAutoStartChanged();
140164 void fireAutoCloseWindowAfterAuthenticationChanged();
160160 auto* service = Env::getSingleton<Service>();
161161 connect(service, &Service::fireAppUpdateFinished, this, &UIPlugInQml::onUpdateAvailable);
162162 connect(service, &Service::fireUpdateScheduled, this, &UIPlugInQml::onUpdateScheduled);
163 service->runUpdateIfNeeded();
164163
165164 init();
166165 }
204203 // Activate logging of Qt scenegraph information on startup, e.g. GL_RENDERER, GL_VERSION, ...
205204 qputenv("QSG_INFO", "1");
206205
206 #ifdef Q_OS_ANDROID
207 const auto orientation = isTabletLayout()
208 ? "SCREEN_ORIENTATION_SENSOR_LANDSCAPE"
209 : "SCREEN_ORIENTATION_PORTRAIT";
210 QtAndroid::androidActivity().callMethod<void>("setRequestedOrientation", "(I)V", QAndroidJniObject::getStaticField<jint>("android/content/pm/ActivityInfo", orientation));
211 #endif
212
207213 mEngine.reset(new QQmlApplicationEngine());
208214
209215 connect(mEngine.data(), &QQmlApplicationEngine::warnings, this, &UIPlugInQml::onQmlWarnings, Qt::QueuedConnection);
225231 mEngine->addImportPath(getPath(QStringLiteral("qml/")).toString());
226232 mEngine->load(getPath(QStringLiteral("qml/main.qml")));
227233
228 if (!mEngine->rootObjects().isEmpty())
229 {
230 QQuickWindow* rootWindow = qobject_cast<QQuickWindow*>(mEngine->rootObjects().first());
231 if (rootWindow != nullptr)
232 {
234 QQuickWindow* rootWindow = getRootWindow();
235 if (rootWindow != nullptr)
236 {
233237 #if defined(Q_OS_WIN) && QT_VERSION < QT_VERSION_CHECK(5, 14, 1)
234 // we need to call create() explicitly because Windows needs a handle to fire WM_ENDSESSION!
235 // Since we start as a systemtray only we don't have a correct handle until we call show()
236 rootWindow->create();
237 #endif
238 connect(rootWindow, &QQuickWindow::sceneGraphError, this, &UIPlugInQml::onSceneGraphError);
239 qCDebug(qml) << "Using renderer interface:" << rootWindow->rendererInterface()->graphicsApi();
240 }
241 }
242
243 Env::getSingleton<Service>()->updateConfigurations();
238 // we need to call create() explicitly because Windows needs a handle to fire WM_ENDSESSION!
239 // Since we start as a systemtray only we don't have a correct handle until we call show()
240 rootWindow->create();
241 #endif
242 connect(rootWindow, &QQuickWindow::sceneGraphError, this, &UIPlugInQml::onSceneGraphError);
243 qCDebug(qml) << "Using renderer interface:" << rootWindow->rendererInterface()->graphicsApi();
244 }
244245
245246 onWindowPaletteChanged();
246247 }
247248
248249
249 void UIPlugInQml::hide()
250 void UIPlugInQml::hideFromTaskbar()
250251 {
251252 PlatformTools::hideFromTaskbar();
252253 }
280281
281282 #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
282283 const QString platform = QStringLiteral("mobile,");
283 const QString tablet = (isTablet() ? QStringLiteral("tablet,") : QStringLiteral("phone,"));
284 const QString tablet = (isTabletLayout() ? QStringLiteral("tablet,") : QStringLiteral("phone,"));
284285 const QString brand = QGuiApplication::platformName();
285286 #else
286287 const QString platform = QStringLiteral("desktop,");
287288 const QString tablet;
288 #if defined(Q_OS_MAC)
289 const QString brand = QStringLiteral("mac");
289 #if defined(Q_OS_WIN)
290 const QString brand = QStringLiteral("win");
290291 #else
291 const QString brand = QStringLiteral("win");
292 const QString brand = QStringLiteral("nowin");
292293 #endif
293294 #endif
294295
298299
299300 void UIPlugInQml::onWorkflowStarted(QSharedPointer<WorkflowContext> pContext)
300301 {
302 if (isDominated())
303 {
304 return;
305 }
306
301307 Env::getSingleton<ApplicationModel>()->keepScreenOn(true);
302308 Env::getSingleton<ApplicationModel>()->resetContext(pContext);
303309 Env::getSingleton<NumberModel>()->resetContext(pContext);
355361 // workflows and never manually brought to foreground in between.
356362 if (!pContext.objectCast<SelfAuthContext>() && !pContext->hasNextWorkflowPending() && generalSettings.isAutoCloseWindowAfterAuthentication() && !showUpdateInformationIfPending())
357363 {
358 Q_EMIT fireHideRequest();
364 onHideUi();
359365 }
360366 }
361367
391397 void UIPlugInQml::onShowUi(UiModule pModule)
392398 {
393399 PlatformTools::restoreToTaskbar();
400 if (isDominated())
401 {
402 pModule = UiModule::CURRENT;
403 }
394404 Q_EMIT fireShowRequest(pModule);
405
406 Env::getSingleton<Service>()->runUpdateIfNeeded();
395407 }
396408
397409
398410 void UIPlugInQml::onHideUi()
399411 {
400412 Q_EMIT fireHideRequest();
413 }
414
415
416 void UIPlugInQml::onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator)
417 {
418 ProxyCredentials proxyCredentials(pProxy, pAuthenticator);
419
420 Q_EMIT fireProxyAuthenticationRequired(&proxyCredentials);
421 proxyCredentials.waitForConfirmation();
401422 }
402423
403424
444465
445466 void UIPlugInQml::onUpdateScheduled()
446467 {
447 Env::getSingleton<Service>()->runUpdateIfNeeded();
468 if (!isHidden())
469 {
470 Env::getSingleton<Service>()->runUpdateIfNeeded();
471 }
448472 }
449473
450474
464488 }
465489
466490
491 bool UIPlugInQml::isTabletLayout() const
492 {
493 const auto screenOrientationSetting = Env::getSingleton<AppSettings>()->getGeneralSettings().getScreenOrientation();
494 if (screenOrientationSetting == QLatin1String("landscape"))
495 {
496 return true;
497 }
498 if (screenOrientationSetting == QLatin1String("portrait"))
499 {
500 return false;
501 }
502 return isTablet();
503 }
504
505
467506 bool UIPlugInQml::showUpdateInformationIfPending()
468507 {
469508 if (!mUpdateInformationPending)
492531 }
493532
494533 return QUrl::fromLocalFile(FileDestination::getPath(pRelativePath, QStandardPaths::LocateDirectory));
534 }
535
536
537 QQuickWindow* UIPlugInQml::getRootWindow() const
538 {
539 if (mEngine->rootObjects().isEmpty())
540 {
541 return nullptr;
542 }
543
544 return qobject_cast<QQuickWindow*>(mEngine->rootObjects().first());
545 }
546
547
548 bool UIPlugInQml::isHidden() const
549 {
550 QQuickWindow* rootWindow = getRootWindow();
551 return !rootWindow || rootWindow->visibility() == QWindow::Hidden;
495552 }
496553
497554
659716 if (mExplicitPlatformStyle != pPlatformStyle)
660717 {
661718 mExplicitPlatformStyle = pPlatformStyle;
719 Env::getSingleton<AppSettings>()->getGeneralSettings().setScreenOrientation(pPlatformStyle.indexOf(QLatin1String("tablet")) == -1 ? QStringLiteral("portrait") : QStringLiteral("landscape"));
662720 doRefresh();
663721 }
664722 }
1111 #include "GlobalStatus.h"
1212 #include "HistoryModel.h"
1313 #include "NumberModel.h"
14 #include "ProxyCredentials.h"
1415 #include "SettingsModel.h"
1516 #include "TrayIcon.h"
1617 #include "UIPlugIn.h"
4041 Q_PROPERTY(QVariantMap safeAreaMargins READ getSafeAreaMargins NOTIFY fireSafeAreaMarginsChanged)
4142 Q_PROPERTY(bool highContrastEnabled READ isHighContrastEnabled NOTIFY fireHighContrastEnabledChanged)
4243 Q_PROPERTY(QString fixedFontFamily READ getFixedFontFamily CONSTANT)
44 Q_PROPERTY(bool tablet READ isTablet CONSTANT)
4345
4446 private:
4547 QScopedPointer<QQmlApplicationEngine> mEngine;
5961
6062 QString getPlatformSelectors() const;
6163 static QUrl getPath(const QString& pRelativePath, bool pQrc = true);
64 QQuickWindow* getRootWindow() const;
65 bool isHidden() const;
6266 bool isTablet() const;
67 bool isTabletLayout() const;
6368 bool showUpdateInformationIfPending();
6469
6570 public:
7984
8085 Q_INVOKABLE void applyPlatformStyle(const QString& pPlatformStyle);
8186 Q_INVOKABLE void init();
82 Q_INVOKABLE void hide();
87 Q_INVOKABLE void hideFromTaskbar();
8388 Q_INVOKABLE void switchUi();
8489
8590 Q_SIGNALS:
8893 void fireDominatorChanged();
8994 void fireSafeAreaMarginsChanged();
9095 void fireHighContrastEnabledChanged();
96 void fireProxyAuthenticationRequired(ProxyCredentials* pProxyCredentials);
9197
9298 private Q_SLOTS:
9399 void show();
97103 virtual void onApplicationStarted() override;
98104 virtual void onShowUi(UiModule pModule) override;
99105 virtual void onHideUi() override;
106 virtual void onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator) override;
100107 virtual void onUiDomination(const UIPlugIn* pUi, const QString& pInformation, bool pAccepted) override;
101108 virtual void onUiDominationReleased() override;
102109 void onShowUserInformation(const QString& pMessage);
2222 LABEL = Qt::UserRole + 1,
2323 TEXT
2424 };
25 QVector<QPair<QString, QString> > mData;
25 QVector<QPair<QString, QString>> mData;
2626
2727 void init();
2828
44 #include "WorkflowModel.h"
55
66 #include "AppSettings.h"
7 #include "context/AuthContext.h"
78 #include "Email.h"
89 #include "FuncUtils.h"
910 #include "GeneralSettings.h"
218219 void WorkflowModel::sendResultMail() const
219220 {
220221 Q_ASSERT(mContext);
221 const GlobalStatus status = mContext->getStatus();
222 const auto& status = mContext->getStatus();
222223 //: Subject from error report mail
223224 QString mailSubject = tr("AusweisApp2 error report - %1").arg(status.toErrorDescription());
224 QString mailBody = generateMailBody(status);
225 const auto& authContext = qobject_cast<AuthContext*>(mContext);
226 QString mailBody = generateMailBody(status, authContext.isNull() ? QUrl() : authContext->getTcTokenUrl());
225227 QString url = QStringLiteral("mailto:support@ausweisapp.de?subject=%1&body=%2").arg(mailSubject, mailBody);
226228
227229 QDesktopServices::openUrl(url);
1414 #include "workflow/WorkflowGui.h"
1515
1616 #include <QApplication>
17 #include <QAuthenticator>
1718 #include <QCloseEvent>
1819 #include <QDesktopWidget>
1920 #include <QFile>
2122 #include <QLoggingCategory>
2223 #include <QMenu>
2324 #include <QMessageBox>
24
25 #ifndef QT_NO_NETWORKPROXY
26 #include <QAuthenticator>
27 #include <QNetworkProxy>
28 #endif
25 #include <QNetworkProxy>
2926
3027
3128 using namespace governikus;
289286 messageBox.setWindowTitle(QCoreApplication::applicationName() + QStringLiteral(" - ") + tr("Information"));
290287 messageBox.setWindowModality(Qt::WindowModal);
291288 messageBox.setWindowFlags(messageBox.windowFlags() & ~Qt::WindowContextHelpButtonHint);
292 messageBox.setText(tr("Did you change the transport PIN already?<br><br>Prior to the first use of the online identification function you have to replace the transport PIN by an individual 6-digit PIN. Online identification with transport PIN is not possible."));
289 messageBox.setText(tr("Did you change the Transport PIN already?<br><br>Prior to the first use of the online identification function you have to replace the Transport PIN by an individual six-digit PIN. Online identification with Transport PIN is not possible."));
293290 messageBox.setStandardButtons(QMessageBox::Yes);
294291 messageBox.button(QMessageBox::Yes)->setFocus();
295 auto changePinButton = messageBox.addButton(tr("No, change transport PIN now"), QMessageBox::NoRole);
292 auto changePinButton = messageBox.addButton(tr("No, change Transport PIN now"), QMessageBox::NoRole);
296293 messageBox.exec();
297294
298295 if (messageBox.clickedButton() != changePinButton)
431428 }
432429
433430
434 #ifndef QT_NO_NETWORKPROXY
435431 void AppQtGui::onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator)
436432 {
437433 CredentialDialog dialog(mMainWidget);
443439 pAuthenticator->setPassword(dialog.getPassword());
444440 }
445441 }
446
447
448 #endif
449442
450443
451444 void AppQtGui::show(UiModule pModule)
5555 virtual void show(UiModule pModule = UiModule::CURRENT);
5656 virtual void onApplicationStarted();
5757 virtual void onShowUserInformation(const QString& pAppName);
58 #ifndef QT_NO_NETWORKPROXY
5958 void onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator);
60 #endif
6159
6260 private Q_SLOTS:
6361 void onCloseWindowRequested(bool* pDoClose);
5050 filename = QFileDialog::getSaveFileName(this,
5151 QCoreApplication::applicationName() + QStringLiteral(" - ") + tr("Save"),
5252 QDir::homePath() + QLatin1Char('/') + filename,
53 tr("Text files") + QStringLiteral(" (*.txt)"));
53 tr("Textfiles") + QStringLiteral(" (*.txt)"));
5454
5555 if (filename.isEmpty())
5656 {
107107
108108 void GeneralSettingsWidget::onUpdateCheckButtonClicked()
109109 {
110 Env::getSingleton<Service>()->updateApp(true);
110 Env::getSingleton<Service>()->updateApp();
111111 }
112112
113113
7373
7474 qCDebug(gui) << "File location:" << filename;
7575
76 if (QFile::exists(filename))
77 {
78 const bool deleted = QFile::remove(filename);
79 qCDebug(gui) << "Delete file location:" << deleted;
80 }
81
82 const bool copied = pSource.isEmpty() ? Env::getSingleton<LogHandler>()->copy(filename) : QFile::copy(pSource, filename);
76 const auto logHandler = Env::getSingleton<LogHandler>();
77 const bool copied = pSource.isEmpty() ? logHandler->copy(filename) : logHandler->copyOther(pSource, filename);
8378 qCDebug(gui) << "Copy log to file location:" << copied;
8479 if (!copied)
8580 {
4343 <property name="text">
4444 <string>Select a secure PIN that consists of six digits. Do not select a number that can be guessed easily, such as &quot;123456&quot;, your date of birth or any other number that is printed on your ID card.
4545
46 When you change your PIN for the first time, please enter your five-digit transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your transport PIN with the letter sent to you by your competent authority.
46 When you change your PIN for the first time, please enter the five-digit Transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your Transport PIN with the letter sent to you by your competent authority.
4747
4848 Please note that the PIN may only consist of digits (0-9).</string>
4949 </property>
7979 <property name="text">
8080 <string>Select a secure PIN that consists of six digits. Do not select a number that can be guessed easily, such as &quot;123456&quot;, your date of birth or any other number that is printed on your ID card.
8181
82 When you change your PIN for the first time, please enter your five-digit transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your transport PIN with the letter sent to you by your competent authority.
82 When you change your PIN for the first time, please enter the five-digit Transport PIN in the field &quot;Current PIN / Transport PIN&quot;. You received your Transport PIN with the letter sent to you by your competent authority.
8383
8484 Please note that the PIN may only consist of digits (0-9).</string>
8585 </property>
155155 <enum>Qt::TabFocus</enum>
156156 </property>
157157 <property name="accessibleName">
158 <string>Display of the card access number (CAN) in the lower right corner of the id card</string>
158 <string>Display of the Card Access Number (CAN) in the lower right corner of the id card</string>
159159 </property>
160160 <property name="pixmap">
161161 <pixmap resource="../../../resources/ausweisapp.qrc">:/images/canHint.png</pixmap>
171171 <enum>Qt::TabFocus</enum>
172172 </property>
173173 <property name="text">
174 <string>A wrong PIN has been entered twice on your ID card. Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. You can find your card access number (CAN) on the front of your ID card.</string>
174 <string>A wrong PIN has been entered twice on your ID card. For a third attempt, please first enter the six-digit Card Access Number (CAN). You can find your Card Access Number (CAN) in the bottom right on the front of your ID card.</string>
175175 </property>
176176 <property name="wordWrap">
177177 <bool>true</bool>
601601 <enum>Qt::TabFocus</enum>
602602 </property>
603603 <property name="text">
604 <string>Card access number (CAN):</string>
604 <string>Card Access Number (CAN):</string>
605605 </property>
606606 </widget>
607607 </item>
10061006 <item>
10071007 <widget class="QLabel" name="label_7">
10081008 <property name="text">
1009 <string>Click on &quot;Change PIN&quot; to enter your card access number (CAN) and then set a new PIN. You can find your card access number (CAN) on the front side of your ID card next to the date of expiry. On the electronic residence permit the card access number (CAN) is printed above your signature.</string>
1009 <string>Click on &quot;Change PIN&quot; to enter your Card Access Number (CAN) and then set a new PIN. You can find your Card Access Number (CAN) on the front side of your ID card next to the date of expiry. On the electronic residence permit the Card Access Number (CAN) is printed above your signature.</string>
10101010 </property>
10111011 <property name="alignment">
10121012 <set>Qt::AlignCenter</set>
7474 }
7575 else
7676 {
77 QToolTip::showText(mUi->pinEntryLine->mapToGlobal(QPoint(0, 0)), tr("A pairing code has to be 4 digits long."), mUi->pinEntryLine, QRect(), 3000);
77 QToolTip::showText(mUi->pinEntryLine->mapToGlobal(QPoint(0, 0)), tr("A pairing code has to be four digits long."), mUi->pinEntryLine, QRect(), 3000);
7878 }
7979 }
4848 </size>
4949 </property>
5050 <property name="text">
51 <string>Enter the 4-digit pairing code shown on your other device.</string>
51 <string>Enter the four-digit pairing code shown on your other device.</string>
5252 </property>
5353 <property name="alignment">
5454 <set>Qt::AlignCenter</set>
207207 const QWidget* const currentWidget = mUi->settingsTabWidget->currentWidget();
208208 if (currentWidget == mUi->pinTab)
209209 {
210 if (mWorkflowRunning == true)
210 if (mWorkflowRunning)
211211 {
212212 mUi->pinTab->continueWorkflow();
213213 }
248248
249249 void SettingsWidget::onCancelButtonClicked()
250250 {
251 if (mWorkflowRunning == true)
251 if (mWorkflowRunning)
252252 {
253253 mUi->pinTab->cancelWorkflow();
254254 }
166166
167167 auto* conclusionPageVLayout = new QVBoxLayout(conclusionPage);
168168
169 const auto& title = tr("Personal 6-digit PIN");
170 const auto& desc = tr("Prior to the first use of the online identification function, you have to replace the transport PIN by an individual 6-digit PIN. "
171 "The transport PIN was sent to you by postal mail.");
169 const auto& title = tr("Personal six-digit PIN");
170 const auto& desc = tr("Prior to the first use of the online identification function, you have to replace the Transport PIN by an individual six-digit PIN. "
171 "The Transport PIN was sent to you by postal mail.");
172172 QLabel* transportPinLabel = new QLabel(createDescription(title, desc));
173173 transportPinLabel->setWordWrap(true);
174174 transportPinLabel->setFocusPolicy(Qt::TabFocus);
107107 }
108108
109109
110 #ifndef QT_NO_NETWORKPROXY
111110 void UIPlugInWidgets::onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator)
112111 {
113112 mGui.onProxyAuthenticationRequired(pProxy, pAuthenticator);
114113 }
115
116
117 #endif
118114
119115
120116 void UIPlugInWidgets::onUiDomination(const UIPlugIn* pUi, const QString& pInformation, bool pAccepted)
3232 virtual void onApplicationStarted() override;
3333 virtual void onShowUi(UiModule pModule) override;
3434 virtual void onHideUi() override;
35 #ifndef QT_NO_NETWORKPROXY
3635 virtual void onProxyAuthenticationRequired(const QNetworkProxy& pProxy, QAuthenticator* pAuthenticator) override;
37 #endif
3836 virtual void onUiDomination(const UIPlugIn* pUi, const QString& pInformation, bool pAccepted) override;
3937 virtual void onUiDominationReleased() override;
4038 };
2020 switch (pReturnCode)
2121 {
2222 case CardReturnCode::INVALID_CAN:
23 title = tr("Wrong card access number (CAN)");
23 title = tr("Wrong Card Access Number (CAN)");
2424 if (pCanAllowedMode)
2525 {
26 text = tr("The given card access number (CAN) is not correct.");
26 text = tr("The given Card Access Number (CAN) is not correct.");
2727 }
2828 else
2929 {
30 text = tr("The given card access number (CAN) is not correct. You have one more try to enter the correct PIN."
31 " Please mind that you have to acknowledge this last try with your card access number (CAN).");
30 text = tr("The given Card Access Number (CAN) is not correct. You have one more try to enter the correct PIN."
31 " Please mind that you have to acknowledge this last try with your Card Access Number (CAN).");
3232 }
3333 break;
3434
5252 case CardReturnCode::INVALID_PIN_2:
5353 title = tr("Wrong PIN");
5454 text = tr("The given PIN is not correct. You have one more try to enter the correct PIN."
55 " Please mind that you have to acknowledge this last try with your card access"
56 " number (CAN).");
55 " Please mind that you have to acknowledge this last try with your Card Access"
56 " Number (CAN).");
5757 break;
5858
5959 case CardReturnCode::INVALID_PIN_3:
88
99 using namespace governikus;
1010
11 ListItem::ListItem(QWidget* pParent, Qt::WindowFlags pWindowFlags)
12 : QWidget(pParent, pWindowFlags)
11 ListItem::ListItem(QWidget* pParent)
12 : QWidget(pParent)
1313 {
1414 }
1515
1515 Q_OBJECT
1616
1717 public:
18 ListItem(QWidget* pParent = nullptr, Qt::WindowFlags pWindowFlags = 0);
18 ListItem(QWidget* pParent = nullptr);
1919 virtual ~ListItem() override;
2020
2121 void paintEvent(QPaintEvent*) override;
88 #include "CardConnection.h"
99 #include "DetailDialog.h"
1010 #include "generic/PasswordEdit.h"
11 #include "LanguageLoader.h"
1112 #include "RandomPinDialog.h"
1213
1314 #include <QApplication>
122123 {
123124 if (mContext->isCanAllowedMode())
124125 {
125 mUi->pinGroupBox->setTitle(tr("Please enter the 6-digit card access number (CAN) for identification."));
126 mUi->pinGroupBox->setTitle(tr("Please enter the six-digit Card Access Number (CAN) for identification."));
126127 }
127128 else if (cardConnection->getReaderInfo().getRetryCounter() == 1)
128129 {
129 mUi->pinGroupBox->setTitle(tr("Please enter your 6-digit card access number (CAN) and your PIN for identification."));
130 mUi->pinGroupBox->setTitle(tr("Please enter your six-digit Card Access Number (CAN) and your PIN for identification."));
130131 }
131132 else
132133 {
133 mUi->pinGroupBox->setTitle(tr("Please enter your 6-digit PIN for identification"));
134 mUi->pinGroupBox->setTitle(tr("Please enter your six-digit PIN for identification"));
134135 }
135136
136137 if (cardConnection->getReaderInfo().isBasicReader())
187188
188189 auto eac1 = mContext->getDidAuthenticateEac1();
189190 CVCertificateBody body = eac1->getCvCertificates().at(0)->getBody();
190 QString effectiveDate = body.getCertificateEffectiveDate().toString(Qt::DefaultLocaleShortDate);
191 QString expirationDate = body.getCertificateExpirationDate().toString(Qt::DefaultLocaleShortDate);
191 const auto locale = LanguageLoader::getInstance().getUsedLocale();
192 const auto effectiveDate = locale.toString(body.getCertificateEffectiveDate(), QLocale::ShortFormat);
193 const auto expirationDate = locale.toString(body.getCertificateExpirationDate(), QLocale::ShortFormat);
192194 auto certificateDescription = eac1->getCertificateDescription();
193195
194196 QString details;
391393 mCANField->configureValidation(onlyNumbersExpression, allowedDigitsMsg);
392394 connect(mCANField, &PasswordEdit::textEdited, this, &StepAuthenticationEac1Widget::canTextEdited);
393395
394 QLabel* canLabel = new QLabel(tr("Card access number (CAN):"));
396 QLabel* canLabel = new QLabel(tr("Card Access Number (CAN):"));
395397 canLabel->setFocusPolicy(Qt::TabFocus);
396398 basicReaderWidgetLayout->addWidget(canLabel);
397399 basicReaderWidgetLayout->addWidget(mCANField);
423425 mPINField->setEnabled(false);
424426 }
425427
426 const QString labelLabel = mContext->isCanAllowedMode() == false ? tr("PIN:") : tr("Card access number (CAN):");
428 const QString labelLabel = mContext->isCanAllowedMode() ? tr("Card Access Number (CAN):") : tr("PIN:");
427429 QLabel* pinLabel = new QLabel(labelLabel);
428430 pinLabel->setFocusPolicy(Qt::TabFocus);
429431 basicReaderWidgetLayout->addWidget(pinLabel);
175175 QStringList deviceNames;
176176 for (const auto& info : deviceInfos)
177177 {
178 deviceNames.append(QLatin1Char('"') + info.getName() + QLatin1Char('"'));
178 deviceNames.append(QLatin1Char('"') + info.getNameEscaped() + QLatin1Char('"'));
179179 }
180180 return deviceNames.join(QLatin1String(", "));
181181 }
6868 Q_EMIT mDelegate->setCancelButtonState(pState);
6969 }
7070
71
7271 protected:
7372 QScopedPointer<StepGuiDelegate> mDelegate;
7473
6969 pStepUi->activate();
7070 }
7171
72
7372 private:
7473 void deactivateCurrentStepUi()
7574 {
5656 {
5757 }
5858
59
6059 public Q_SLOTS:
6160 virtual void onCloseActiveDialogs();
6261
2828 const QString mModelName;
2929 const QString mAusweisAppVersionNumber;
3030
31 QVector<QPair<QString, QString> > mData;
31 QVector<QPair<QString, QString>> mData;
3232
3333 enum UserRoles
3434 {
0 qt5_add_resources(QRC_FIXTURE "fixture/fixture.qrc")
1 ADD_OBJECT_LIBRARY(QRC_FIXTURE_OBJ ${QRC_FIXTURE} Qt5::Core)
2
3
40 FUNCTION(EXTRACT_TESTNAME result filepath)
51 STRING(REPLACE ".cpp" "" testname ${filepath})
62 STRING(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" testname ${testname})
7167 ENDFUNCTION()
7268
7369 IF(TARGET Qt5::Test)
70 qt5_add_resources(QRC_FIXTURE "fixture/fixture.qrc")
71 ADD_OBJECT_LIBRARY(QRC_FIXTURE_OBJ ${QRC_FIXTURE} Qt5::Core)
72
7473 ADD_SUBDIRECTORY(helper)
7574 IF(TARGET Qt5::Qml AND TARGET Qt5::QuickTest)
7675 ADD_SUBDIRECTORY(qml)
7776 ENDIF()
7877 ADD_SUBDIRECTORY(qt)
78 ADD_SUBDIRECTORY(json)
7979 ENDIF()
7474 return mLastData;
7575 }
7676
77
7877 Q_SIGNALS:
7978 void fireReply();
8079 };
6363 mEvent = pEvent;
6464 }
6565
66
6766 private:
6867 virtual Reader::CardEvent updateCard() override
6968 {
1818
1919 PersoSimController::PersoSimController()
2020 : QObject()
21 , mProcess(nullptr)
21 , mProcess()
2222 , mSocket(new QTcpSocket)
2323 {
2424 }
6363
6464 bool PersoSimController::shutdown()
6565 {
66 if (mProcess != nullptr)
66 if (!mProcess.isNull())
6767 {
6868 write("shutdown\n");
6969 mSocket->close();
8080
8181 bool PersoSimController::startProcess()
8282 {
83 if (mProcess != nullptr)
83 if (!mProcess.isNull())
8484 {
8585 return false;
8686 }
8787
88 mProcess = new QProcess;
88 mProcess.reset(new QProcess);
8989 mProcess->setProcessChannelMode(QProcess::ForwardedErrorChannel);
9090
9191 connect(mSocket.data(), &QTcpSocket::readyRead, this, &PersoSimController::newData);
9292
93 mProcess->start(QStringLiteral(PERSOSIM_EXECUTABLE));
93 mProcess->start(QStringLiteral(PERSOSIM_EXECUTABLE), QStringList());
9494 if (!mProcess->waitForStarted(-1))
9595 {
9696 qDebug() << PERSOSIM_EXECUTABLE;
88 #include <QByteArray>
99 #include <QObject>
1010 #include <QProcess>
11 #include <QScopedPointer>
1112 #include <QTcpSocket>
1213
1314 namespace governikus
2829 bool shutdown();
2930
3031 private:
31 QProcess* mProcess;
32 QScopedPointer<QProcess> mProcess;
3233 const QSharedPointer<QTcpSocket> mSocket;
3334
3435 bool startProcess();
1212
1313 void WebSocketHelper::connectWebsocket(int pPort)
1414 {
15 QEventLoop eventLoop;
16
17 connect(&mWebSocket, &QWebSocket::connected, &eventLoop, &QEventLoop::quit);
18 connect(&mWebSocket, &QWebSocket::disconnected, &eventLoop, &QEventLoop::quit);
19 connect(&mWebSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), &eventLoop, &QEventLoop::quit);
20
2115 const QString address = QStringLiteral("ws://localhost:%1/eID-Kernel").arg(pPort);
2216 mWebSocket.open(QUrl(address));
23
24 QTimer timer;
25 timer.setSingleShot(true);
26 timer.setInterval(mConnectionTiemout);
27 connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
28
29 eventLoop.exec();
3017 }
3118
3219
4027 : mConnectionTiemout(pConnectionTimeout)
4128 {
4229 connect(&mWebSocket, &QWebSocket::textMessageReceived, this, &WebSocketHelper::onTextMessageReceived);
30 connectWebsocket(pPort);
31 }
4332
44 const qint64 start = QDateTime::currentMSecsSinceEpoch();
45 do
46 {
47 connectWebsocket(pPort);
48 }
49 while (mWebSocket.state() != QAbstractSocket::SocketState::ConnectedState
50 && mWebSocket.error() == QAbstractSocket::SocketError::ConnectionRefusedError
51 && QDateTime::currentMSecsSinceEpoch() - start < mConnectionTiemout);
33
34 bool WebSocketHelper::isConnected() const
35 {
36 return mWebSocket.state() == QAbstractSocket::SocketState::ConnectedState;
5237 }
5338
5439
7863 QEventLoop eventLoop;
7964 connect(&mWebSocket, &QWebSocket::textMessageReceived, &eventLoop, &QEventLoop::quit);
8065
81 QTimer timer;
82 timer.setSingleShot(true);
83 timer.setInterval(mConnectionTiemout);
84 connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
66 QTimer::singleShot(mConnectionTiemout, &eventLoop, &QEventLoop::quit);
8567
8668 eventLoop.exec();
8769 }
2828
2929 public:
3030 WebSocketHelper(int pPort, int pConnectionTimeout = 15000);
31
31 bool isConnected() const;
3232 QAbstractSocket::SocketState getState() const;
3333 bool waitForMessage(const std::function<bool(const QJsonObject&)>& pMessageMatcher);
3434 void sendMessage(const QString& pMessage);
0 FIND_PROGRAM(JSONSCHEMA_BIN NAMES jsonschema jsonschema-3 python-jsonschema python3-jsonschema py-jsonschema py3-jsonschema CMAKE_FIND_ROOT_PATH_BOTH)
1
2 IF(JSONSCHEMA_BIN)
3 SET(JSON_FILES updatable-files/supported-providers.json)
4
5 FOREACH(jsonfile ${JSON_FILES})
6 SET(file ${RESOURCES_DIR}/${jsonfile})
7 IF(NOT EXISTS "${file}")
8 MESSAGE(FATAL_ERROR "File does not exist: ${file}")
9 ENDIF()
10
11 GET_FILENAME_COMPONENT(filename ${file} NAME)
12 SET(schema ${RESOURCES_DIR}/json-schemas/${filename})
13
14 ADD_TEST(NAME ${filename} COMMAND ${JSONSCHEMA_BIN} -i ${file} ${schema})
15 SET_TESTS_PROPERTIES(${filename} PROPERTIES LABELS "json" TIMEOUT 10)
16 ENDFOREACH()
17 ENDIF()
1414 ", parent);
1515 item.destroy();
1616 }
17
18 function test_load_FocusFrame() {
19 var item = createTemporaryQmlObject("
20 import Governikus.View 1.0;
21 FocusFrame {}
22 ", parent);
23 item.destroy();
24 }
25
26 function test_load_FocusPoint() {
27 var item = createTemporaryQmlObject("
28 import Governikus.View 1.0;
29 FocusPoint {}
30 ", parent);
31 item.destroy();
32 }
3317 }
179179 ", parent);
180180 item.destroy();
181181 }
182
183 function test_load_ProxyCredentialsPopup() {
184 var item = createTemporaryQmlObject("
185 import Governikus.Global 1.0;
186 ProxyCredentialsPopup {}
187 ", parent);
188 item.destroy();
189 }
182190 }
1414 ", parent);
1515 item.destroy();
1616 }
17
18 function test_load_FocusFrame() {
19 var item = createTemporaryQmlObject("
20 import Governikus.View 1.0;
21 FocusFrame {}
22 ", parent);
23 item.destroy();
24 }
25
26 function test_load_FocusPoint() {
27 var item = createTemporaryQmlObject("
28 import Governikus.View 1.0;
29 FocusPoint {}
30 ", parent);
31 item.destroy();
32 }
1733 }
+0
-18
test/qml/mobile/test_DeveloperView.qml less more
0 /*
1 * \copyright Copyright (c) 2017-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtTest 1.10
5
6 TestCase {
7 name: "ModuleImportTest"
8 id: parent
9
10 function test_load_DeveloperView() {
11 var item = createTemporaryQmlObject("
12 import Governikus.DeveloperView 1.0;
13 DeveloperView {}
14 ", parent);
15 item.destroy();
16 }
17 }
0 /*
1 * \copyright Copyright (c) 2017-2020 Governikus GmbH & Co. KG, Germany
2 */
3
4 import QtTest 1.10
5
6 TestCase {
7 name: "ModuleImportTest"
8 id: parent
9
10 function test_load_SettingsView() {
11 var item = createTemporaryQmlObject("
12 import Governikus.SettingsView 1.0;
13 SettingsView {}
14 ", parent);
15 item.destroy();
16 }
17 }
4141 QTest::newRow("WriteResidencePermitI") << AccessRight::WRITE_DG19;
4242 QTest::newRow("WriteResidencePermitII") << AccessRight::WRITE_DG20;
4343 }
44
4544
4645 private Q_SLOTS:
4746 void checkAccessRightNames_data()
3232 BN_bn2bin(pBigNum, buf.data());
3333 return QByteArray(reinterpret_cast<char*>(buf.data()), bufLen);
3434 }
35
3635
3736 private Q_SLOTS:
3837 void initTestCase()
139138 #else
140139 const BIGNUM* r = nullptr;
141140 const BIGNUM* s = nullptr;
142 ECDSA_SIG_get0(ecdsaSignature.data(), &r, &s);
141 ECDSA_SIG_get0(ecdsaSignature, &r, &s);
143142 #endif
144143
145144 QCOMPARE(valueOf(r).toHex(), QByteArray("9f25ebfaf4b91e4c60a1683754c5dc076a3179753ef97d9f8cb01fe1dcd3b8c8"));
5858 {
5959 auto cvc = CVCertificate::fromHex(TestFileHelper::readFile(":/card/cvdv-DEDVeIDDPST00035.hex"));
6060
61 QVERIFY(cvc->getBody().getPublicKey().getUncompressedPublicPoint().isNull() == false);
62 QVERIFY(cvc->getBody().getPublicKey().getEcKey().isNull());
61 QVERIFY(!cvc->getBody().getPublicKey().getUncompressedPublicPoint().isNull());
62 QVERIFY(!cvc->getBody().getPublicKey().getEcKey());
6363 }
6464
6565
6767 {
6868 auto cvc = CVCertificate::fromHex(TestFileHelper::readFile(":/card/cvca-DETESTeID00002_DETESTeID00001.hex"));
6969
70 QVERIFY(cvc->getBody().getPublicKey().getUncompressedPublicPoint().isNull() == false);
71 QVERIFY(cvc->getBody().getPublicKey().getEcKey().isNull() == false);
70 QVERIFY(!cvc->getBody().getPublicKey().getUncompressedPublicPoint().isNull());
71 QVERIFY(cvc->getBody().getPublicKey().getEcKey());
7272 }
7373
7474
5353 }
5454 return output;
5555 }
56
5756
5857 private Q_SLOTS:
5958 void initTestCase()
3737 }
3838 return pChild.at(0) == pParent.at(1);
3939 }
40
4140
4241 private Q_SLOTS:
4342 void testEmpty()
2424 QSharedPointer<CHAT> chat = CHAT::fromHex(pHexEncodedChat);
2525 return chat->encode().toHex().toUpper();
2626 }
27
2827
2928 private Q_SLOTS:
3029 void createEmpty()
3535 return QByteArray(reinterpret_cast<const char*>(buf.data()), buf.size());
3636 }
3737
38
3938 private Q_SLOTS:
4039 void parseCrap()
4140 {
195194 QVERIFY(ecdsaPublicKey != nullptr);
196195 QVERIFY(ecdsaPublicKey->getEcKey() != nullptr);
197196
198 const EC_GROUP* ecGroup = EC_KEY_get0_group(ecdsaPublicKey->getEcKey().data());
197 const EC_GROUP* ecGroup = EC_KEY_get0_group(ecdsaPublicKey->getEcKey());
199198 BIGNUM* a = BN_new(), * b = BN_new(), * p = BN_new(), * cofactor = BN_new(), * order = BN_new();
200199 EC_GROUP_get_curve_GFp(ecGroup, p, a, b, nullptr);
201200
248247 QVERIFY(ecdsaPublicKey != nullptr);
249248 QVERIFY(ecdsaPublicKey->getEcKey() != nullptr);
250249
251 const EC_GROUP* ecGroup = EC_KEY_get0_group(ecdsaPublicKey->getEcKey().data());
250 const EC_GROUP* ecGroup = EC_KEY_get0_group(ecdsaPublicKey->getEcKey());
252251 BIGNUM* a = BN_new(), * b = BN_new(), * p = BN_new(), * cofactor = BN_new(), * order = BN_new();
253252 EC_GROUP_get_curve_GFp(ecGroup, p, a, b, nullptr);
254253
3535 QByteArray bytes = TestFileHelper::readFile(pName);
3636 return CVCertificate::fromHex(bytes);
3737 }
38
3938
4039 private Q_SLOTS:
4140 void init()
2727 CVCertificateChainBuilder builder(false);
2828 return builder.getChainStartingWith(certificate);
2929 }
30
3130
3231 private Q_SLOTS:
3332 void init()
2828 MockCardConfig cardConfig(transmitConfigs);
2929 mReader->setCard(cardConfig);
3030 }
31
3231
3332 private Q_SLOTS:
3433 void init()
2020 : mTimeoutSeconds(5)
2121 {
2222 }
23
2423
2524 private:
2625 const quint8 mTimeoutSeconds;
4040 QCOMPARE(info.getUrl(), KOMFORT_DRIVER_URL);
4141 }
4242
43
4443 private Q_SLOTS:
4544 void initTestCase()
4645 {
3434 }
3535 return count;
3636 }
37
3837
3938 private Q_SLOTS:
4039 void initTestCase()
3434 }
3535 return count;
3636 }
37
3837
3938 private Q_SLOTS:
4039 void initTestCase()
1919 {
2020 QCOMPARE(mMseBuilder->build().getData(), pExpectedContent);
2121 }
22
2322
2423 private Q_SLOTS:
2524 void init()
7878 return result;
7979 }
8080
81
8281 private Q_SLOTS:
8382 void init()
8483 {
277277 }
278278
279279
280 void testCheckAttachedEidServices()
281 {
282 uint attachedEidCounter = 0;
283
284 const auto& providers = Env::getSingleton<ProviderConfiguration>()->getProviderConfigurationInfos();
285 for (const auto& provider : providers)
286 {
287 const auto& urls = provider.getSubjectUrls();
288 for (const auto& urlString : urls)
289 {
290 const auto& subjectHost = QUrl(urlString).host();
291 if (subjectHost == provider.getAddressDomain() || subjectHost == provider.getHomepageBase())
292 {
293 attachedEidCounter++;
294 }
295 }
296 }
297
298 QCOMPARE(attachedEidCounter, 18);
299 }
300
301
302 void testCheckServicesWithoutAnOwnEidServer()
303 {
304 const auto& providers = Env::getSingleton<ProviderConfiguration>()->getProviderConfigurationInfos();
305 for (const auto& provider : providers)
306 {
307 QVERIFY2(!provider.getSubjectUrls().isEmpty() || !provider.getSubjectUrlInfo().isEmpty(), provider.getShortName().toString().toStdString().c_str());
308 }
309 }
310
311
312 void testCheckUniqueSubjectUrls()
313 {
314 QSet<QString> subjectUrls;
315 uint subjectUrlCounter = 0;
316
317 const auto& providers = Env::getSingleton<ProviderConfiguration>()->getProviderConfigurationInfos();
318 for (const auto& provider : providers)
319 {
320 const auto& urls = provider.getSubjectUrls();
321 for (const auto& urlString : urls)
322 {
323 QUrl url(urlString);
324 QVERIFY(url.isValid());
325 QCOMPARE(urlString, QString("https://%1").arg(url.host()));
326
327 subjectUrls += urlString;
328 subjectUrlCounter++;
329 }
330 }
331
332 QCOMPARE(subjectUrls.size(), subjectUrlCounter);
333 }
334
335
336 void testCheckUrlFormat()
337 {
338 const auto& providers = Env::getSingleton<ProviderConfiguration>()->getProviderConfigurationInfos();
339 for (const auto& provider : providers)
340 {
341 QVERIFY(QUrl(provider.getAddress()).isValid());
342 QVERIFY(!provider.getAddress().endsWith('/'));
343 QVERIFY(QUrl(provider.getHomepage()).isValid());
344 QVERIFY(!provider.getHomepage().endsWith('/'));
345 }
346 }
347
348
280349 };
281350
282351 QTEST_GUILESS_MAIN(test_ProviderConfiguration)
99 #include "TestFileHelper.h"
1010
1111 #include <QtTest>
12
13 #include <algorithm>
1214
1315
1416 using namespace governikus;
249251 {
250252 QTest::addColumn<int>("count");
251253
252 const int desktop = 62;
254 const int desktop = 80;
253255 QTest::newRow("win") << desktop;
254256 QTest::newRow("mac") << desktop;
255257 QTest::newRow("linux") << desktop;
256258 QTest::newRow("android") << desktop;
257 QTest::newRow("ios") << 30;
259 QTest::newRow("ios") << 41;
258260 }
259261
260262
263265 QFETCH(int, count);
264266
265267 QByteArray data = TestFileHelper::readFile(QStringLiteral(":/updatable-files/supported-providers.json"));
266
267268 const auto providers = ProviderConfigurationParser::parseProvider(data, QLatin1String(QTest::currentDataTag()));
268
269269 QCOMPARE(providers.size(), count);
270
271 auto sortedProviders = providers;
272 std::sort(sortedProviders.begin(), sortedProviders.end());
273 QCOMPARE(providers, sortedProviders);
270274 }
271275
272276
3333 Env::set(ReaderDetector::staticMetaObject, &mMockReaderDetector);
3434 }
3535
36
3736 private:
3837 static const int cCardReadersInConfigurationFile;
3938
7978 QTest::newRow("REINER SCT cyberJack RFID komfort") << UsbId(0x0C4B, 0x0501) << "REINER SCT cyberJack RFID komfort" << "REINER SCT cyberJack RFID komfort" << "img_Reiner_SCT_cyberjack_RFID_komfort" << "REINER SCT cyberJack RFID komfort";
8079 QTest::newRow("REINER SCT cyberJack RFID standard") << UsbId(0x0C4B, 0x0500) << "REINER SCT cyberJack RFID standard" << "REINER SCT cyberJack RFID standard" << "img_Reiner_SCT_cyberjack_RFID_standard" << "REINER SCT cyberJack RFID standard";
8180 QTest::newRow("REINER SCT cyberJack RFID basis") << UsbId(0x0C4B, 0x9102) << "REINER SCT cyberJack RFID basis" << "REINER SCT cyberJack RFID basis" << "img_Reiner_SCT_cyberjack_RFID_basis" << "REINER SCT cyberJack RFID basis";
82 QTest::newRow("REINER SCT cyberJack wave") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave" << "img_cyberjack_wave" << "REINER SCT cyberJack wave";
81 QTest::newRow("REINER SCT cyberJack wave") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave" << "img_cyberjack_wave" << "REINER SCT cyberJack wave( USB 1)?$";
8382
8483 QTest::newRow("KOBIL IDToken") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken" << "KOBIL IDToken" << "img_KOBIL_ID_Token" << "KOBIL (Systems )?IDToken";
8584
86 QTest::newRow("SCM SDI011") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader" << "SDI011 Contactless Reader" << "img_Identive_SDI011" << "SDI011 Contactless Reader|SDI011 USB Smart Card Reader(\\(1\\)|\\(2\\))";
85 QTest::newRow("SCM SDI011") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader" << "SDI011 Contactless Reader" << "img_Identive_SDI011" << "(SCM Microsystems Inc. SDI011G (Contactless| Smart Card) Reader 0)|(SDI011 (USB Smart Card|Contactless) Reader(\\(1\\)|\\(2\\))?)";
8786 QTest::newRow("SCM SCL011") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "SCL01x Contactless Reader" << "img_Identive_SCL011" << "^(SCM Microsystems Inc. )?SCL011 Contactless Reader( 0)?$";
8887
8988 QTest::newRow("ACS-ACR1281U") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U" << "img_ACS_ACR1281U" << "ACS ACR1281 PICC Reader( 0)?";
90 QTest::newRow("ACS-ACR1252U") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader PICC 0" << "ACS ACR1252U" << "img_ACS_ACR1252U" << "ACS ACR1252 1S CL Reader PICC 0|ACS ACR1252 Dual Reader\\(2\\)";
89 QTest::newRow("ACS-ACR1252U") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader PICC 0" << "ACS ACR1252U" << "img_ACS_ACR1252U" << "ACS ACR1252 (1S CL|Dual)? Reader PICC 0|ACS ACR1252 Dual Reader\\(2\\)";
9190
9291 QTest::newRow("OMNIKEY 5021") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5021-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "OMNIKEY CardMan 5x21-CL 0|OMNIKEY CardMan \\(076B:5340\\) 5021 CL";
93 QTest::newRow("OMNIKEY 5022") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "OMNIKEY 5022-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "HID Global OMNIKEY 5022 Smart Card Reader 0|HID Global OMNIKEY 5022 Smart Card Reader";
92 QTest::newRow("OMNIKEY 5022") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "OMNIKEY 5022-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "HID Global OMNIKEY 5022 Smart Card Reader( 0)?$";
9493 QTest::newRow("OMNIKEY 5321 v2") << UsbId(0x076B, 0x5321) << "OOMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5321 v2" << "img_HID_Global_OMNIKEY_5321_V2" << R"(OMNIKEY CardMan 5x21-CL 0|OMNIKEY CardMan \(076B:5321\) 5321(\(1\)|\(2\)))";
9594 QTest::newRow("OMNIKEY 5421") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5421" << "img_HID_Omnikey_542x" << R"(OMNIKEY CardMan 5x21-CL 0|OMNIKEY Smart Card Reader USB 0|OMNIKEY CardMan \(076B:5421\) 5421(\(1\)|\(2\)))";
9695 QTest::newRow("OMNIKEY 5422") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY 5422CL Smartcard Reader 0" << "OMNIKEY 5422" << "img_HID_Omnikey_542x" << R"(HID Global OMNIKEY 5422CL Smartcard Reader 0|HID Global OMNIKEY Smartcard Reader (\(1\)|\(2\)))";
10099 QTest::newRow("Gemalto-Prox-DU") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contactless_" << "Prox-DU HID" << "img_Gemalto_Prox_DU" << R"(Gemalto .*Prox(-DU| Dual)( Contactless_| USB PC Link(Reader| Reader)(\(2\)|\(1\))))";
101100 QTest::newRow("Gemalto-Prox-SU") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contactless_" << "Gemalto Prox-SU Contactless" << "img_Gemalto_Prox_SU" << R"(Gemalto Prox( |-)SU( Contactless_| USB PC LinkReader(\(1\)|\(2\))))";
102101
103 QTest::newRow("Identiv-SCL-3711") << UsbId(0x04E6, 0x5591) << "SCM Microsystems SCL3711 reader & NFC device 0" << "Identiv SCL3711" << "img_Identive_SCL3711" << "(SCM Microsystems SCL3711 reader & NFC device 0|SCL3711 reader and NFC device)";
102 QTest::newRow("Identiv-SCL-3711") << UsbId(0x04E6, 0x5591) << "SCM Microsystems SCL3711 reader & NFC device 0" << "Identiv SCL3711" << "img_Identive_SCL3711" << "(SCM Microsystems SCL3711 reader & NFC device 0|SCL3711 Reader and NFC device)";
104103 QTest::newRow("Identiv-Cloud-3700-F") << UsbId(0x04E6, 0x5790) << "Identiv CLOUD 3700 F Contactless Reader 0" << "Identiv Cloud 3700 F" << "img_Identive_Cloud_3700_F" << "(Identiv CLOUD 3700 F Contactless Reader 0|Identiv uTrust 3700 F CL Reader)";
105104 QTest::newRow("Identiv-Cloud-4700-F") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contactless Reader 1" << "Identiv Cloud 4700 F" << "img_Identive_Cloud_4700_F" << "(Identive CLOUD 4700 F Contactless Reader( 0| 1)|Identiv uTrust 4700 F Dual Interface Reader\\(2\\))";
106105 QTest::newRow("Identiv-Cloud-4701-F") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contactless Reader 0" << "Identiv Cloud 4701 F" << "img_Identive_Cloud_4701_F" << "(Identiv CLOUD 4701 F Contactless Reader( 0| 1)|Identiv uTrust 4701 F Dual Interface Reader)";
146145 QTest::newRow("PersoSim native") << UsbId(0x0000, 0x0001) << "PersoSim Virtual Card Reader 0" << QStringLiteral("PersoSim");
147146
148147 QTest::newRow("REINER SCT cyberJack RFID komfort-windows-7-10") << UsbId(0x0C4B, 0x0501) << "REINER SCT cyberJack RFID komfort USB 1" << "REINER SCT cyberJack RFID komfort";
149 QTest::newRow("REINER SCT cyberJack RFID komfort-macosx-10.11-10.14") << UsbId(0x0C4B, 0x0501) << "REINER SCT cyberJack RFID komfort" << "REINER SCT cyberJack RFID komfort";
148 QTest::newRow("REINER SCT cyberJack RFID komfort-macosx-10.12-10.15") << UsbId(0x0C4B, 0x0501) << "REINER SCT cyberJack RFID komfort" << "REINER SCT cyberJack RFID komfort";
150149
151150 QTest::newRow("REINER SCT cyberJack RFID standard-windows-7-10") << UsbId(0x0C4B, 0x0500) << "REINER SCT cyberJack RFID standard USB 1" << "REINER SCT cyberJack RFID standard";
152 QTest::newRow("REINER SCT cyberJack RFID standard-macosx-10.11-10.14") << UsbId(0x0C4B, 0x0500) << "REINER SCT cyberJack RFID standard" << "REINER SCT cyberJack RFID standard";
151 QTest::newRow("REINER SCT cyberJack RFID standard-macosx-10.12-10.15") << UsbId(0x0C4B, 0x0500) << "REINER SCT cyberJack RFID standard" << "REINER SCT cyberJack RFID standard";
153152
154153 QTest::newRow("REINER SCT cyberJack RFID basis-windows-7-10") << UsbId(0x0C4B, 0x9102) << "REINER SCT cyberJack RFID basis 0" << "REINER SCT cyberJack RFID basis";
155 QTest::newRow("REINER SCT cyberJack RFID basis-macosx-10.11-10.14") << UsbId(0x0C4B, 0x9102) << "REINER SCT cyberJack RFID basis" << "REINER SCT cyberJack RFID basis";
156
157 QTest::newRow("REINER SCT cyberJack wave-windows-7-10-1") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave 0" << "REINER SCT cyberJack wave";
154 QTest::newRow("REINER SCT cyberJack RFID basis-macosx-10.12-10.15") << UsbId(0x0C4B, 0x9102) << "REINER SCT cyberJack RFID basis" << "REINER SCT cyberJack RFID basis";
155
156 QTest::newRow("REINER SCT cyberJack wave-windows-7-10-1") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave 0" << "REINER SCT cyberJack wave 0";
158157 QTest::newRow("REINER SCT cyberJack wave-windows-7-10-2") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave USB 1" << "REINER SCT cyberJack wave";
159 QTest::newRow("REINER SCT cyberJack wave-macosx-10.11-10.14") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave";
158 QTest::newRow("REINER SCT cyberJack wave-macosx-10.12-10.15") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave";
160159
161160 QTest::newRow("KOBIL IDToken-windows-7-10") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 0" << "KOBIL IDToken";
162 QTest::newRow("KOBIL IDToken-macosx-10.11-10.14") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken" << "KOBIL IDToken";
161 QTest::newRow("KOBIL IDToken-macosx-10.12-10.14") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken" << "KOBIL IDToken";
163162
164163 QTest::newRow("SCM SDI011-windows-7-10-1") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader 0" << "SDI011 Contactless Reader";
165164 QTest::newRow("SCM SDI011-windows-7-10-2") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Smart Card Reader 0" << "SCM Microsystems Inc. SDI011 Smart Card Reader 0";
166165 QTest::newRow("SCM SDI011-windows-7-10-3") << UsbId(0x04E6, 0x512B) << "SDI011 Contactless Reader" << "SDI011 Contactless Reader";
167 QTest::newRow("SCM SDI011-macosx-10.11-10.14-1") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(1)" << "SDI011 Contactless Reader";
168 QTest::newRow("SCM SDI011-macosx-10.11-10.14-2") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(2)" << "SDI011 Contactless Reader";
169 QTest::newRow("SCM SDI011-macosx-10.10-10:14-3") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "SDI011 Contactless Reader";
166 QTest::newRow("SCM SDI011-windows-7-10-4") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011G Contactless Reader 0" << "SDI011 Contactless Reader";
167 QTest::newRow("SCM SDI011-windows-7-10-5") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011G Smart Card Reader 0" << "SCM Microsystems Inc. SDI011G Smart Card Reader 0";
168 QTest::newRow("SCM SDI011-macosx-10.12-10.14-1") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(1)" << "SDI011 Contactless Reader";
169 QTest::newRow("SCM SDI011-macosx-10.12-10.14-2") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(2)" << "SDI011 Contactless Reader";
170 QTest::newRow("SCM SDI011-macosx-10.12-10.15-1") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "SDI011 Contactless Reader";
171 QTest::newRow("SCM SDI011-macosx-10.12-10.15-2") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(2)" << "SDI011 Contactless Reader";
170172
171173 QTest::newRow("SCM SCL011-windows-7-10-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "SCL01x Contactless Reader";
172174 QTest::newRow("SCM SCL011-windows-7-10-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader 0" << "SCL01x Contactless Reader";
173 QTest::newRow("SCM SCL011-macosx-10.11-10.14-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "SCL01x Contactless Reader";
174 QTest::newRow("SCM SCL011-macosx-10.11-10-14-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "SCL01x Contactless Reader";
175 QTest::newRow("SCM SCL011-macosx-10.12-10.14-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "SCL01x Contactless Reader";
176 QTest::newRow("SCM SCL011-macosx-10.12-10-14-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "SCL01x Contactless Reader";
175177
176178 QTest::newRow("ACS-ACR1281U-windows-7-10") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader 0" << "ACS ACR1281U";
177 QTest::newRow("ACS-ACR1281U-macosx-10.11-10.14") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U";
179 QTest::newRow("ACS-ACR1281U-macosx-10.12-10.15") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U";
178180
179181 QTest::newRow("ACS-ACR1252U-windows-7-10-1") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader PICC 0" << "ACS ACR1252U";
180182 QTest::newRow("ACS-ACR1252U-windows-7-10-2") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader SAM 0" << "ACS ACR1252 1S CL Reader SAM 0";
181 QTest::newRow("ACS-ACR1252U-macosx-10.11-10.14-1") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(1)" << "ACS ACR1252 Dual Reader(1)";
182 QTest::newRow("ACS-ACR1252U-macosx-10.11-10.14-2") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(2)" << "ACS ACR1252U";
183 QTest::newRow("ACS-ACR1252U-windows-7-10-3") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader PICC 0" << "ACS ACR1252U";
184 QTest::newRow("ACS-ACR1252U-windows-7-10-4") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader SAM 0" << "ACS ACR1252 Dual Reader SAM 0";
185 QTest::newRow("ACS-ACR1252U-macosx-10.12-10.15-1") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(1)" << "ACS ACR1252 Dual Reader(1)";
186 QTest::newRow("ACS-ACR1252U-macosx-10.12-10.15-2") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(2)" << "ACS ACR1252U";
183187
184188 QTest::newRow("OMNIKEY 5021-windows-7-10") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5021-CL";
185 QTest::newRow("OMNIKEY 5021-macosx-10.11-10.14") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan (076B:5340) 5021 CL" << "OMNIKEY 5021-CL";
189 QTest::newRow("OMNIKEY 5021-macosx-10.12-10.15") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan (076B:5340) 5021 CL" << "OMNIKEY 5021-CL";
186190
187191 QTest::newRow("OMNIKEY 5022-windows-7-10") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "OMNIKEY 5022-CL";
188 QTest::newRow("OMNIKEY 5022-macosx-10.11-10.14") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader" << "OMNIKEY 5022-CL";
192 QTest::newRow("OMNIKEY 5022-macosx-10.12-10.15") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader" << "OMNIKEY 5022-CL";
189193
190194 QTest::newRow("OMNIKEY 5321 v2-windows-7-10-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan 5x21 0" << "OMNIKEY CardMan 5x21 0";
191195 QTest::newRow("OMNIKEY 5321 v2-windows-7-10-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5321 v2";
192 QTest::newRow("OMNIKEY 5321 v2-macosx-10.11-10.11-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(1)" << "OMNIKEY 5321 v2";
193 QTest::newRow("OMNIKEY 5321 v2-macosx-10.11-10.14-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(2)" << "OMNIKEY 5321 v2";
196 QTest::newRow("OMNIKEY 5321 v2-macosx-10.12-10.15-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(1)" << "OMNIKEY 5321 v2";
197 QTest::newRow("OMNIKEY 5321 v2-macosx-10.12-10.15-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(2)" << "OMNIKEY 5321 v2";
194198
195199 QTest::newRow("OMNIKEY 5421-windows-7-10-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan 5x21 0" << "OMNIKEY CardMan 5x21 0";
196200 QTest::newRow("OMNIKEY 5421-windows-7-10-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan 5x21-CL 0" << "OMNIKEY 5421";
197201 QTest::newRow("OMNIKEY 5421-windows-7-10-3") << UsbId(0x076B, 0x5421) << "OMNIKEY Smart Card Reader USB 0" << "OMNIKEY 5421";
198 QTest::newRow("OMNIKEY 5421-macosx-10.11-10.14-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(1)" << "OMNIKEY 5421";
199 QTest::newRow("OMNIKEY 5421-macosx-10.11-10.14-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(2)" << "OMNIKEY 5421";
202 QTest::newRow("OMNIKEY 5421-macosx-10.12-10.15-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(1)" << "OMNIKEY 5421";
203 QTest::newRow("OMNIKEY 5421-macosx-10.12-10.15-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(2)" << "OMNIKEY 5421";
200204
201205 QTest::newRow("OMNIKEY 5422-windows-7-10-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY 5422 Smartcard Reader 0" << "HID Global OMNIKEY 5422 Smartcard Reader 0";
202206 QTest::newRow("OMNIKEY 5422-windows-7-10-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY 5422CL Smartcard Reader 0" << "OMNIKEY 5422";
203 QTest::newRow("OMNIKEY 5421-macosx-10.13-10.14-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (1)" << "OMNIKEY 5422";
204 QTest::newRow("OMNIKEY 5421-macosx-10.13-10.14-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (2)" << "OMNIKEY 5422";
207 QTest::newRow("OMNIKEY 5422-macosx-10.13-10.15-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (1)" << "OMNIKEY 5422";
208 QTest::newRow("OMNIKEY 5422-macosx-10.13-10.15-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (2)" << "OMNIKEY 5422";
205209
206210 QTest::newRow("FEIG OBID myAXXESS RFID-Reader-windows-7-10") << UsbId(0x0AB1, 0x0003) << "FEIG ELECTRONIC GmbH OBID myAXXESS basic Slot:CL 358334430" << "OBID RFID-Reader";
207211
208212 QTest::newRow("Gemalto-Prox-DU-windows-7-10-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contactless_10900383 0" << "Prox-DU HID";
209213 QTest::newRow("Gemalto-Prox-DU-windows-7-10-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contact_10900383 0" << "Gemalto Prox-DU Contact_10900383 0";
210 QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.11-10.14-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(1)" << "Prox-DU HID";
211 QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.11-10.14-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(2)" << "Prox-DU HID";
214 QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.12-10.15-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(1)" << "Prox-DU HID";
215 QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.12-10.15-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(2)" << "Prox-DU HID";
212216
213217 QTest::newRow("Gemalto-Prox-SU-windows-7-10-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contactless_10800004 0" << "Gemalto Prox-SU Contactless";
214218 QTest::newRow("Gemalto-Prox-SU-windows-7-10-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contact_10800004 0" << "Gemalto Prox-SU Contact_10800004 0";
215 QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.11-10.14-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(1)" << "Gemalto Prox-SU Contactless";
216 QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.11-10.14-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(2)" << "Gemalto Prox-SU Contactless";
219 QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.12-10.15-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(1)" << "Gemalto Prox-SU Contactless";
220 QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.12-10.15-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(2)" << "Gemalto Prox-SU Contactless";
217221
218222 QTest::newRow("Identiv-SCL-3711-windows-7-10") << UsbId(0x04E6, 0x5591) << "SCM Microsystems SCL3711 reader & NFC device 0" << "Identiv SCL3711";
223 QTest::newRow("Identiv-SCL-3711--F-macosx-10.12") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711";
224 QTest::newRow("Identiv-SCL-3711--F-macosx-10.14-10.15") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711";
219225
220226 QTest::newRow("Identiv-Cloud-3700-F-windows-7-10") << UsbId(0x04E6, 0x5790) << "Identiv CLOUD 3700 F Contactless Reader 0" << "Identiv Cloud 3700 F";
221 QTest::newRow("Identiv-Cloud-3700-F-macosx-10.11-10.14") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F CL Reader" << "Identiv Cloud 3700 F";
227 QTest::newRow("Identiv-Cloud-3700-F-macosx-10.12-10.15") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F CL Reader" << "Identiv Cloud 3700 F";
222228
223229 QTest::newRow("Identiv-Cloud-4700-F-windows-7-10-1") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contact Reader 0" << "Identive CLOUD 4700 F Contact Reader 0";
224230 QTest::newRow("Identiv-Cloud-4700-F-windows-7-10-2") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contactless Reader 0" << "Identiv Cloud 4700 F";
225231 QTest::newRow("Identiv-Cloud-4700-F-windows-7-10-3") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contactless Reader 1" << "Identiv Cloud 4700 F";
226 QTest::newRow("Identiv-Cloud-4700-F-macosx-10.11-10.14-1") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(2)" << "Identiv Cloud 4700 F";
227 QTest::newRow("Identiv-Cloud-4700-F-macosx-10.11-10.14-2") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(1)" << "Identiv uTrust 4700 F Dual Interface Reader(1)";
232 QTest::newRow("Identiv-Cloud-4700-F-macosx-10.12-10.15-1") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(2)" << "Identiv Cloud 4700 F";
233 QTest::newRow("Identiv-Cloud-4700-F-macosx-10.12-10.15-2") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(1)" << "Identiv uTrust 4700 F Dual Interface Reader(1)";
228234
229235 QTest::newRow("Identiv-Cloud-4701-F-windows-7-10-1") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contact Reader 0" << "Identiv CLOUD 4701 F Contact Reader 0";
230236 QTest::newRow("Identiv-Cloud-4701-F-windows-7-10-2") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contactless Reader 1" << "Identiv Cloud 4701 F";
231237 QTest::newRow("Identiv-Cloud-4701-F-windows-7-10-3") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contactless Reader 0" << "Identiv Cloud 4701 F";
232 QTest::newRow("Identiv-Cloud-4701-F-macosx-10.11-10.14-1") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(1)" << "Identiv Cloud 4701 F";
233 QTest::newRow("Identiv-Cloud-4701-F-macosx-10.11-10.14-2") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(2)" << "Identiv Cloud 4701 F";
238 QTest::newRow("Identiv-Cloud-4701-F-macosx-10.12-10.15-1") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(1)" << "Identiv Cloud 4701 F";
239 QTest::newRow("Identiv-Cloud-4701-F-macosx-10.12-10.15-2") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(2)" << "Identiv Cloud 4701 F";
234240
235241 QTest::newRow("Cherry-TC-1200-windows-7-10-1") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx-CL 0" << "Cherry TC-1200";
236242 QTest::newRow("Cherry-TC-1200-windows-10") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx 0" << "Cherry Smartcard Terminal TC 12xx 0";
237 QTest::newRow("Cherry-TC-1200-macosx-10.13-10.14") << UsbId(0x046A, 0x0091) << "Cherry SC Reader (046A:0091)" << "Cherry TC-1200";
243 QTest::newRow("Cherry-TC-1200-macosx-10.12-10.15") << UsbId(0x046A, 0x0091) << "Cherry SC Reader (046A:0091)" << "Cherry TC-1200";
238244 QTest::newRow("Cherry-TC-1200-linux") << UsbId(0x046A, 0x0091) << "Cherry TC 1200" << "Cherry TC-1200";
239245
240246 QTest::newRow("Cherry-TC-1300-windows-7-10-1") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx-CL 0" << "Cherry TC-1300";
241247 QTest::newRow("Cherry-TC-1300-windows-7-10-2") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx 0" << "Cherry Smartcard Terminal TC 13xx 0";
242 QTest::newRow("Cherry-TC-1300-macosx-10.11-10.14-1") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(1)" << "Cherry TC-1300";
243 QTest::newRow("Cherry-TC-1300-macosx-10.11-10.14-2") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(2)" << "Cherry TC-1300";
248 QTest::newRow("Cherry-TC-1300-macosx-10.12-10.15-1") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(1)" << "Cherry TC-1300";
249 QTest::newRow("Cherry-TC-1300-macosx-10.12-10.15-2") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(2)" << "Cherry TC-1300";
244250 QTest::newRow("Cherry-TC-1300-linux") << UsbId(0x046A, 0x0092) << "Cherry TC 1300" << "Cherry TC-1300";
245251
246252 QTest::newRow("Cherry-ST-1275-windows-7-10-1") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X 0" << "Cherry SmartTerminal XX7X 0";
247253 QTest::newRow("Cherry-ST-1275-windows-7-10-2") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X-RF 0" << "Cherry ST-1275";
248254
249255 QTest::newRow("Signotec Omega Pad-windows-7-10") << UsbId(0x2133, 0x010B) << "NXP PR533 0" << "Signotec Omega Pad";
250 QTest::newRow("Signotec Omega Pad-macosx-10.11-10.14") << UsbId(0x2133, 0x010B) << "NXP PR533" << "Signotec Omega Pad";
256 QTest::newRow("Signotec Omega Pad-macosx-10.12-10.15") << UsbId(0x2133, 0x010B) << "NXP PR533" << "Signotec Omega Pad";
251257 }
252258
253259
9494 return QStringLiteral("{ %1\n}").arg(pDevices);
9595 }
9696
97
9897 private Q_SLOTS:
9998 void invalidJsonDocument_parseReturnsNullDeviceInfo()
10099 {
5858
5959 clearSignals();
6060 }
61
6261
6362 private Q_SLOTS:
6463 void init()
356355 }
357356
358357
358 void test_MultiCertificatesUrl()
359 {
360 AuthContext context(nullptr);
361
362 QCOMPARE(context.getCertificateList().size(), 0);
363 context.addCertificateData(QUrl("https://governikus.de"), QSslCertificate());
364 QCOMPARE(context.getCertificateList().size(), 1);
365 context.addCertificateData(QUrl("https://governikus.de"), QSslCertificate());
366 QCOMPARE(context.getCertificateList().size(), 2);
367 }
368
369
359370 };
360371
361372 QTEST_GUILESS_MAIN(test_AuthContext)
6464
6565 mChangePinContext->setStateApproved();
6666 }
67
6867
6968 private Q_SLOTS:
7069 void initTestCase()
150149 QCOMPARE(mChangePinContext->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_Cancellation_By_User);
151150 }
152151
153
154152 Q_SIGNALS:
155153 void fireEidCardInserted();
156154 };
2222 {
2323 return TestFileHelper::readFile(QString(":/card/").append(pFileName));
2424 }
25
2625
2726 private Q_SLOTS:
2827 void type()
3636
3737 TransmitResponse responseWithApdu;
3838 responseWithApdu.setMessageId("dummy");
39 responseWithApdu.setOutputApdus(QByteArrayList {"bla"});
39 responseWithApdu.setOutputApdus(QByteArrayList{"bla"});
4040 elem = responseWithApdu.marshall();
4141
4242 QVERIFY(elem.contains("<OutputAPDU>bla</OutputAPDU>"));
5050
5151 QCOMPARE(inputApdusInfos[0].getAcceptableStatusCodes(), QByteArrayList());
5252 QCOMPARE(inputApdusInfos[1].getAcceptableStatusCodes(), QByteArrayList());
53 QCOMPARE(inputApdusInfos[2].getAcceptableStatusCodes(), QByteArrayList {"9000"});
54 QCOMPARE(inputApdusInfos[3].getAcceptableStatusCodes(), QByteArrayList {"9001"});
53 QCOMPARE(inputApdusInfos[2].getAcceptableStatusCodes(), QByteArrayList{"9000"});
54 QCOMPARE(inputApdusInfos[3].getAcceptableStatusCodes(), QByteArrayList{"9001"});
5555 QCOMPARE(inputApdusInfos[4].getAcceptableStatusCodes(), QByteArrayList());
56 QCOMPARE(inputApdusInfos[5].getAcceptableStatusCodes(), QByteArrayList {"9002"});
57 QCOMPARE(inputApdusInfos[6].getAcceptableStatusCodes(), QByteArrayList {"9003"});
56 QCOMPARE(inputApdusInfos[5].getAcceptableStatusCodes(), QByteArrayList{"9002"});
57 QCOMPARE(inputApdusInfos[6].getAcceptableStatusCodes(), QByteArrayList{"9003"});
5858 }
5959
6060
8787
8888 QCOMPARE(inputApdusInfos[0].getAcceptableStatusCodes(), QByteArrayList());
8989 QCOMPARE(inputApdusInfos[1].getAcceptableStatusCodes(), QByteArrayList());
90 QCOMPARE(inputApdusInfos[2].getAcceptableStatusCodes(), QByteArrayList {"9000"});
91 QCOMPARE(inputApdusInfos[3].getAcceptableStatusCodes(), QByteArrayList {"9001"});
90 QCOMPARE(inputApdusInfos[2].getAcceptableStatusCodes(), QByteArrayList{"9000"});
91 QCOMPARE(inputApdusInfos[3].getAcceptableStatusCodes(), QByteArrayList{"9001"});
9292 QCOMPARE(inputApdusInfos[4].getAcceptableStatusCodes(), QByteArrayList());
93 QCOMPARE(inputApdusInfos[5].getAcceptableStatusCodes(), QByteArrayList {"9002"});
94 QCOMPARE(inputApdusInfos[6].getAcceptableStatusCodes(), QByteArrayList {"9003"});
93 QCOMPARE(inputApdusInfos[5].getAcceptableStatusCodes(), QByteArrayList{"9002"});
94 QCOMPARE(inputApdusInfos[6].getAcceptableStatusCodes(), QByteArrayList{"9003"});
9595 }
9696
9797
4747 return QSharedPointer<TcToken>(new TcToken(data));
4848 }
4949
50
5150 private Q_SLOTS:
5251 void init()
5352 {
7979 BIGNUM* signaturePart = signature->r;
8080 #else
8181 const BIGNUM* signaturePart = nullptr;
82 ECDSA_SIG_get0(signature.data(), &signaturePart, nullptr);
82 ECDSA_SIG_get0(signature, &signaturePart, nullptr);
8383 #endif
8484 BN_pseudo_rand(const_cast<BIGNUM*>(signaturePart), BN_num_bits(signaturePart), 0, 0);
8585
2727 const auto& buffer = command.getBuffer();
2828 return QSharedPointer<const IfdEstablishPaceChannel>(new IfdEstablishPaceChannel("slot", buffer));
2929 }
30
3130
3231 private Q_SLOTS:
3332 void init()
+0
-47
test/qt/core/states/test_StateSelectPasswordId.cpp less more
0 /*!
1 * \brief Tests the StateSelectPasswordId
2 *
3 * \copyright Copyright (c) 2018-2020 Governikus GmbH & Co. KG, Germany
4 */
5
6 #include "states/StateSelectPasswordId.h"
7
8 #include "states/StateBuilder.h"
9
10 #include <QtTest>
11
12 using namespace governikus;
13
14
15 class test_StateSelectPasswordId
16 : public QObject
17 {
18 Q_OBJECT
19
20 private Q_SLOTS:
21 void test_Run()
22 {
23 QSharedPointer<WorkflowContext> context(new WorkflowContext());
24 const auto& state = StateBuilder::createState<StateSelectPasswordId>(context);
25 QSignalSpy spyPasswordIdCAN(state, &StateSelectPasswordId::firePasswordIdCAN);
26 QSignalSpy spyContinue(state, &StateSelectPasswordId::fireContinue);
27
28 context->setCanAllowedMode(true);
29 context->setStateApproved();
30 QTest::ignoreMessage(QtDebugMsg, "CAN allowed: true");
31 QTest::ignoreMessage(QtDebugMsg, "Running state \"StateSelectPasswordId\"");
32 state->onStateApprovedChanged();
33 QCOMPARE(spyPasswordIdCAN.count(), 1);
34
35 context->setCanAllowedMode(false);
36 QTest::ignoreMessage(QtDebugMsg, "CAN allowed: false");
37 QTest::ignoreMessage(QtDebugMsg, "Running state \"StateSelectPasswordId\"");
38 state->onStateApprovedChanged();
39 QCOMPARE(spyContinue.count(), 1);
40 }
41
42
43 };
44
45 QTEST_GUILESS_MAIN(test_StateSelectPasswordId)
46 #include "test_StateSelectPasswordId.moc"
2525 QByteArray rawData = TestFileHelper::readFile(filePath);
2626 return QString::fromUtf8(rawData);
2727 }
28
2928
3029 private Q_SLOTS:
3130 void init()
5656
5757 return offset == pSection.size();
5858 }
59
6059
6160 private Q_SLOTS:
6261 void init()
2525 QByteArray rawData = TestFileHelper::readFile(filePath);
2626 return QString::fromUtf8(rawData);
2727 }
28
2928
3029 private Q_SLOTS:
3130 void init()
2424 QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
2525 }
2626
27
2827 public:
2928 test_TcToken()
3029 : tokenXmlOk(":/tctoken/ok.xml")
3332 checkAndOpenFile(tokenXmlOk);
3433 checkAndOpenFile(tokenXmlBroken);
3534 }
36
3735
3836 private Q_SLOTS:
3937 void parsedValues()
6868 QCOMPARE(url, pUrl);
6969 }
7070
71
7271 private Q_SLOTS:
7372 void initTestCase()
7473 {
105104 mMockNetworkManager.fireFinished();
106105
107106 verifySuccessReply(spy, url, timestampOnServer, fileContent);
107 }
108
109
110 void downloadEmptyFile()
111 {
112 const QByteArray fileContent;
113 const QDateTime timestampOnServer(QDate(2017, 6, 1), QTime(12, 00, 0, 0));
114 auto* const reply = new MockNetworkReply(fileContent, HTTP_STATUS_OK);
115 reply->setFileModificationTimestamp(timestampOnServer);
116 mMockNetworkManager.setNextReply(reply);
117
118 auto* const downloader = Env::getSingleton<Downloader>();
119 QSignalSpy spy(downloader, &Downloader::fireDownloadFailed);
120
121 const QUrl url("http://server/reader/icons/icon.png");
122 downloader->download(url);
123
124 mMockNetworkManager.fireFinished();
125
126 verifyFailedReply(spy, url, GlobalStatus::Code::Network_Other_Error);
108127 }
109128
110129
4747 QVERIFY(updatableFile11.data() != updatableFile2.data());
4848 }
4949
50
5150 public:
5251 test_FileProvider()
5352 : mSection("reader")
5151 QVERIFY(file.remove());
5252 QVERIFY(!file.exists());
5353 }
54
5554
5655 private Q_SLOTS:
5756 void cleanup()
275274 QVERIFY(!testfile.exists());
276275 }
277276
278
279277 public:
280278 test_UpdatableFile()
281279 : mSection("reader")
2222 void check_errorCodeToMessage()
2323 {
2424 QCOMPARE(CardReturnCodeUtil::toGlobalStatus(CardReturnCode::CANCELLATION_BY_USER).toErrorDescription(),
25 QString("The process has been cancelled."));
25 QString("The process has been cancelled by the card reader."));
2626 }
2727
2828
3636 {
3737 const ECardApiResult& result = ECardApiResult(CardReturnCodeUtil::toGlobalStatus(CardReturnCode::CANCELLATION_BY_USER));
3838 QCOMPARE(result.getMinor(), ECardApiResult::Minor::SAL_Cancellation_by_User);
39 QCOMPARE(result.getMessage(), QString("The process has been cancelled."));
39 QCOMPARE(result.getMessage(), QString("The process has been cancelled by the card reader."));
4040 }
4141
4242
1919 {
2020 return QJsonDocument(pObj).toJson(QJsonDocument::Compact);
2121 }
22
2322
2423 private Q_SLOTS:
2524 void initTestCase()
9695 qDebug() << ECardApiResult(CardReturnCodeUtil::toGlobalStatus(CardReturnCode::CANCELLATION_BY_USER));
9796 QCOMPARE(spy.count(), 1);
9897 param = spy.takeFirst();
99 QVERIFY(param.at(0).toString().contains("Result: \"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error | http://www.bsi.bund.de/ecard/api/1.1/resultminor/sal#cancellationByUser | The process has been cancelled.\""));
98 QVERIFY(param.at(0).toString().contains("Result: \"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error | http://www.bsi.bund.de/ecard/api/1.1/resultminor/sal#cancellationByUser | The process has been cancelled by the card reader.\""));
10099
101100 spy.clear();
102101
123122
124123 expected = "{\"description\":\"The process has been cancelled.\","
125124 "\"language\":\"en\",\"major\":\"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error\","
126 "\"message\":\"The process has been cancelled.\","
125 "\"message\":\"The process has been cancelled by the card reader.\","
127126 "\"minor\":\"http://www.bsi.bund.de/ecard/api/1.1/resultminor/sal#cancellationByUser\"}";
128127 QCOMPARE(bytes(ECardApiResult(CardReturnCodeUtil::toGlobalStatus(CardReturnCode::CANCELLATION_BY_USER)).toJson()), expected);
129128
4444 auto result = spy.takeFirst();
4545 QVERIFY(result.at(0).toString().endsWith(pExpectedOutput));
4646 }
47
4847
4948 private Q_SLOTS:
5049 void initTestCase()
8080 virtual ~TestInstance()
8181 {
8282 }
83
8483
8584 public:
8685 static TestInstance& getInstance()
2828 void test_IsCancellationByUser()
2929 {
3030 GlobalStatus status1;
31 GlobalStatus status2(GlobalStatus::Code::Workflow_Cancellation_By_User, QStringList(), Origin::Client);
32 GlobalStatus status3(GlobalStatus::Code::Card_Cancellation_By_User, QStringList(), Origin::Client);
33 GlobalStatus status4(GlobalStatus::Code::Paos_Error_SAL_Cancellation_by_User, QStringList(), Origin::Client);
31 GlobalStatus status2(GlobalStatus::Code::Workflow_Cancellation_By_User, Origin::Client);
32 GlobalStatus status3(GlobalStatus::Code::Card_Cancellation_By_User, Origin::Client);
33 GlobalStatus status4(GlobalStatus::Code::Paos_Error_SAL_Cancellation_by_User, Origin::Client);
3434
3535 QVERIFY(!status1.isCancellationByUser());
3636 QVERIFY(status2.isCancellationByUser());
7676 QFETCH(GlobalStatus::Code, code);
7777 QFETCH(QString, message);
7878
79 GlobalStatus status(code, QStringList(), Origin::Client);
79 GlobalStatus status(code, Origin::Client);
8080
8181 QCOMPARE(status.toErrorDescription(false), message);
8282 }
4040
4141 void benchmark()
4242 {
43 QBENCHMARK {
43 QBENCHMARK{
4444 QCOMPARE(LanguageLoader::getInstance().getAvailableLocales().size(), 6);
4545 }
4646 }
55
66 #include "LogHandler.h"
77
8 #include <QDir>
9 #include <QFile>
810 #include <QtTest>
911
1012 #ifndef Q_OS_WIN
4446 }
4547
4648
49 QString randomLogFileName(bool pAutoRemove = true)
50 {
51 QTemporaryFile tmp(LogHandler::getLogFileTemplate());
52 tmp.open();
53 tmp.setAutoRemove(pAutoRemove);
54 return tmp.fileName();
55 }
56
4757 private Q_SLOTS:
4858 void initTestCase()
4959 {
6171
6272 void benchmark()
6373 {
64 QBENCHMARK {
74 QBENCHMARK{
6575 qDebug() << "Add some dummy" << "messages" << "in different" << "strings";
6676 }
6777 }
114124
115125 void otherLogFilesWithoutCurrent()
116126 {
127 Env::getSingleton<LogHandler>()->setLogfile(true);
128
117129 auto list = Env::getSingleton<LogHandler>()->getOtherLogfiles();
118130 QVERIFY(!list.contains(Env::getSingleton<LogHandler>()->mLogFile));
131
132 Env::getSingleton<LogHandler>()->setLogfile(false);
133 auto nextList = Env::getSingleton<LogHandler>()->getOtherLogfiles();
134 QCOMPARE(list, nextList);
119135 }
120136
121137
130146 }
131147
132148
133 void copyFile()
149 void copyFileFail()
134150 {
135151 qDebug() << "dummy";
136152 QVERIFY(!Env::getSingleton<LogHandler>()->copy(QString()));
137153 QVERIFY(!Env::getSingleton<LogHandler>()->copy(QStringLiteral(" ")));
154 }
155
156
157 void copyFileOverwrite()
158 {
159 qDebug() << "dummy";
160 const QString fileName = randomLogFileName();
161 QVERIFY(Env::getSingleton<LogHandler>()->copy(fileName));
162 QVERIFY(QFile::exists(fileName));
163 QVERIFY(Env::getSingleton<LogHandler>()->copy(fileName));
164 QVERIFY(QFile::exists(fileName));
165
166 Env::getSingleton<LogHandler>()->setLogfile(false);
167 QVERIFY(!Env::getSingleton<LogHandler>()->copy(fileName));
168 QVERIFY(QFile::exists(fileName));
169 }
170
171
172 void copyOther_data()
173 {
174 QTest::addColumn<bool>("withLogFile");
175
176 QTest::newRow("true") << true;
177 QTest::newRow("false") << false;
178 }
179
180
181 void copyOther()
182 {
183 QFETCH(bool, withLogFile);
184
185 Env::getSingleton<LogHandler>()->setLogfile(withLogFile);
186
187 const QString logFileName = randomLogFileName(false);
188 QVERIFY(QFile::exists(logFileName));
189 const QString targetFileName = randomLogFileName();
190 QVERIFY(Env::getSingleton<LogHandler>()->copyOther(logFileName, targetFileName));
191 QVERIFY(QFile::exists(targetFileName));
192 QVERIFY(QFile::remove(targetFileName));
193 QVERIFY(QFile::remove(logFileName));
194 QVERIFY(!Env::getSingleton<LogHandler>()->copyOther(QStringLiteral("foo.log"), targetFileName));
195 QVERIFY(!QFile::exists(targetFileName));
138196 }
139197
140198
9292
9393 QSignalSpy spy(Env::getSingleton<LogHandler>(), &LogHandler::fireLog);
9494 QUdpSocket clientSocket;
95 #ifndef QT_NO_NETWORKPROXY
9695 clientSocket.setProxy(QNetworkProxy::NoProxy);
97 #endif
9896
9997 auto written = clientSocket.writeDatagram("dummy", QHostAddress::LocalHost, socket.staticCast<DatagramHandlerImpl>()->mSocket->localPort());
10098 QTRY_COMPARE(spySocket.count(), 1);
130128 QSignalSpy spySocket(socket.data(), &DatagramHandler::fireNewMessage);
131129
132130 QUdpSocket clientSocket;
133 #ifndef QT_NO_NETWORKPROXY
134131 clientSocket.setProxy(QNetworkProxy::NoProxy);
135 #endif
136132
137133 QByteArray data("{\"key\":\"value\"}");
138134 auto written = clientSocket.writeDatagram(data, broadcast ? QHostAddress::Broadcast : QHostAddress::LocalHost, socket.staticCast<DatagramHandlerImpl>()->mSocket->localPort());
158154 QFETCH(bool, broadcast);
159155
160156 QUdpSocket receiver;
161 #ifndef QT_NO_NETWORKPROXY
162157 receiver.setProxy(QNetworkProxy::NoProxy);
163 #endif
164158
165159 QVERIFY(receiver.bind());
166160 QSignalSpy spyReceiver(&receiver, &QUdpSocket::readyRead);
7878 reply.setNetworkError(QNetworkReply::ServiceUnavailableError, "dummy error msg");
7979
8080 QCOMPARE(NetworkManager::toNetworkError(&reply), NetworkManager::NetworkError::ServiceUnavailable);
81 QCOMPARE(NetworkManager::toTrustedChannelStatus(&reply), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable));
82 QCOMPARE(NetworkManager::toStatus(&reply), GlobalStatus(GlobalStatus::Code::Network_ServiceUnavailable));
81 QCOMPARE(NetworkManager::toTrustedChannelStatus(&reply), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, reply.url().toString()}));
82 QCOMPARE(NetworkManager::toStatus(&reply), GlobalStatus(GlobalStatus::Code::Network_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, reply.url().toString()}));
8383 }
8484
8585
134134 controller.run();
135135
136136 QTRY_COMPARE(spy.count(), 1);
137 QCOMPARE(context->getStatus(), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable));
137 QCOMPARE(context->getStatus(), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, reply->url().toString()}));
138138 }
139139
140140
3535 BIO_free(bio);
3636 return key;
3737 }
38
3938
4039 private Q_SLOTS:
4140 void initTestCase()
155155 QVERIFY(discovery.isIncomplete());
156156 QCOMPARE(discovery.getType(), RemoteCardMessageType::UNDEFINED);
157157
158 QCOMPARE(logSpy.count(), 1);
158 QCOMPARE(logSpy.count(), 2);
159159 QVERIFY(logSpy.at(0).at(0).toString().contains("The value of msg should be REMOTE_IFD"));
160 QVERIFY(logSpy.at(1).at(0).toString().contains("Received ifdId is not a fingerprint. Interpretion as a certificate to create our own fingerprint failed"));
160161 }
161162
162163
181182 QVERIFY(!discovery.isIncomplete());
182183 QCOMPARE(discovery.getContextHandle(), QString());
183184
184 QCOMPARE(logSpy.count(), 0);
185 QCOMPARE(logSpy.count(), 1);
186 QVERIFY(logSpy.at(0).at(0).toString().contains("Received ifdId is not a fingerprint. Interpretion as a certificate to create our own fingerprint failed"));
185187 }
186188
187189
234236 QVERIFY(discovery.isIncomplete());
235237 QCOMPARE(discovery.getSupportedApis(), QVector<IfdVersion::Version>({IfdVersion::Version::v_test}));
236238
239 QCOMPARE(logSpy.count(), 2);
240 QVERIFY(logSpy.at(0).at(0).toString().contains("Received ifdId is not a fingerprint. Interpretion as a certificate to create our own fingerprint failed"));
241 QVERIFY(logSpy.at(1).at(0).toString().contains("The value of \"SupportedAPI\" should be of type \"string array\""));
242 }
243
244
245 void sameIfdId()
246 {
247 QSignalSpy logSpy(Env::getSingleton<LogHandler>(), &LogHandler::fireLog);
248
249 const QByteArray messageHash(R"({
250 "IFDID": "0575e99867361c26442ece18bed6f955ab7dd269ae8f42d3a21af0e734c3d8d9",
251 "IFDName": "Sony Xperia Z5 compact",
252 "SupportedAPI": ["IFDInterface_WebSocket_v0", "IFDInterface_WebSocket_v_test"],
253 "msg": "REMOTE_IFD",
254 "port": 24728
255 })");
256 const QJsonObject& objHash = QJsonDocument::fromJson(messageHash).object();
257 const Discovery discoveryHash(objHash);
258 QCOMPARE(logSpy.count(), 0);
259
260 const QByteArray messageCert(R"({
261 "IFDID": "-----BEGIN CERTIFICATE-----
262 MIIC4zCCAcsCBEQvMpowDQYJKoZIhvcNAQELBQAwNDEUMBIGA1UEAwwLQXVzd2Vp
263 c0FwcDIxHDAaBgNVBAUTEzY0MTgwMjY3MTE5MTA5MjY2MzQwIhgPMTk3MDAxMDEw
264 MDAwMDBaGA85OTk5MTIzMTIzNTk1OVowNDEUMBIGA1UEAwwLQXVzd2Vpc0FwcDIx
265 HDAaBgNVBAUTEzY0MTgwMjY3MTE5MTA5MjY2MzQwggEiMA0GCSqGSIb3DQEBAQUA
266 A4IBDwAwggEKAoIBAQDGJ9C76Cb8iHuaZJxcFY0NpNllcAK5JKcrigKBki7EvF9z
267 5Q/MNek2pxwTMp5SilUDJOkwgcTdm7liC/Zx+lPX8MZjhWxV73DGt9DDyJh91ypl
268 6B8vZbpJlL83Vo4C4BLBG6ZaElPpyTitWWKQ4BFUoH0h2utsNFV7FHz+1oZcvhv0
269 gQuzd7gQaVV6mzCePRn+4qgxYSXSJ8Ix21udgT3LoHDOBrOWSIt0g/Q1mkzJcnaC
270 EnS2s6Ib0xPY5PsL1YN/dZn88/gs9Za4rZSBGIIDrpCt5WCkYbkg45LwXLmaPUrg
271 uuFIFIR0HH4pxgajLHpMgYaszxkg4SkdxwJ8vIytAgMBAAEwDQYJKoZIhvcNAQEL
272 BQADggEBAB4grwHZ8NMrs3vRInJQc3ftYDCAjDPjjTg/G4BVz07DmlQZpFyPfInb
273 UaKfpMlaEd1EoRuNIxC796+rZhy+j97DoLkT1qnPP30GLwlZaVZeOCKIIQ+tGjUU
274 cWhhIC6kRCPIQAKxKDNGIUwBAkwludieGa7Ytl7qmnnJDMNe+Ox7Sf+UOa12bJKH
275 d27MYoWMfecJdTmF8xXQ7EEYjMwWHd5t5tJG9AVgzhO8zC+iJTqc9I34sIa8+9WE
276 oQu+/VZgDkJaSdDJ4LqVFIvUy3CFGh6ahDVsHGC5kTDm5EQWh3puWR0AkIjUWMPi
277 xU/nr0Jsab99VgX4/nnCW92v/DIRc1c=
278 -----END CERTIFICATE-----",
279 "IFDName": "Sony Xperia Z5 compact",
280 "SupportedAPI": ["IFDInterface_WebSocket_v0", "IFDInterface_WebSocket_v_test"],
281 "msg": "REMOTE_IFD",
282 "port": 24728
283 })");
284 const QJsonObject& objCert = QJsonDocument::fromJson(messageCert).object();
285 const Discovery discoveryCert(objCert);
237286 QCOMPARE(logSpy.count(), 1);
238 QVERIFY(logSpy.at(0).at(0).toString().contains("The value of \"SupportedAPI\" should be of type \"string array\""));
287 QVERIFY(logSpy.at(0).at(0).toString().contains("Received ifdId is not a fingerprint. Interpretion as a certificate to create our own fingerprint succeeded"));
288
289 QCOMPARE(discoveryHash.getIfdId(), discoveryCert.getIfdId());
239290 }
240291
241292
116116 QCOMPARE(logSpy.count(), 1);
117117 QVERIFY(logSpy.at(0).at(0).toString().contains(QString("Invalid messageType received: \"")));
118118 }
119
120119
121120 private Q_SLOTS:
122121 void initTestCase()
122122 QVERIFY(signalFound);
123123 }
124124
125
126125 private Q_SLOTS:
127126 void initTestCase()
128127 {
303302 settings.setTrustedCertificates(trustedCertificates);
304303 webSocketServer.setSslConfiguration(sslConfigServer);
305304
306 #ifndef QT_NO_NETWORKPROXY
307305 // Listening with proxy leads to socket error QNativeSocketEnginePrivate::InvalidProxyTypeString
308306 webSocketServer.setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
309 #endif
310307 webSocketServer.listen(QHostAddress(QHostAddress::LocalHost));
311308 const quint16 serverPort = webSocketServer.serverPort();
312309
368365 config.setLocalCertificate(pair.getCertificate());
369366 webSocketServer.setSslConfiguration(config);
370367
371 #ifndef QT_NO_NETWORKPROXY
372368 // Listening with proxy leads to socket error QNativeSocketEnginePrivate::InvalidProxyTypeString
373369 webSocketServer.setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
374 #endif
375370 webSocketServer.listen(QHostAddress(QHostAddress::LocalHost));
376371 const quint16 serverPort = webSocketServer.serverPort();
377372
2020 private Q_SLOTS:
2121 void init()
2222 {
23 mName = QStringLiteral("name");
23 mName = QStringLiteral("name&lt;");
2424 mModel.reset(new RemoteDeviceModel());
25 mEntry.reset(new RemoteDeviceModelEntry(mName));
25 mEntry = QSharedPointer<RemoteDeviceModelEntry>::create(mName);
2626 }
2727
2828
4141 }
4242
4343
44 void test_DeviceName()
45 {
46 QCOMPARE(mEntry->getDeviceName(), mName);
44 void test_DeviceNameEscaped()
45 {
46 QCOMPARE(mEntry->getDeviceNameEscaped(), mName);
4747 }
4848
4949
181181 void test_GetRemoteDeviceListEntryModelIndex()
182182 {
183183 QSharedPointer<RemoteDeviceListEntry> listEntry(new RemoteDeviceListEntry(RemoteDeviceDescriptor()));
184 RemoteDeviceModelEntry entry1(QString("entry 1"), QString("01"), listEntry);
184 RemoteDeviceModelEntry entry1(QString("entry 1"), QStringLiteral("01"), listEntry);
185185 RemoteDeviceModelEntry entry2(QString("entry 2"));
186186 mModel->mAllRemoteReaders << entry1 << entry2;
187187
2828 Q_EMIT fireSend(pData);
2929 return true;
3030 }
31
3231
3332 Q_SIGNALS:
3433 void fireSend(const QByteArray& pData);
5858 qRegisterMetaType<QSslPreSharedKeyAuthenticator>("QSslPreSharedKeyAuthenticator*");
5959 QSignalSpy clientPsk(&client, &QSslSocket::preSharedKeyAuthenticationRequired);
6060 QSignalSpy clientEncrypted(&client, &QSslSocket::encrypted);
61 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
62 QSignalSpy clientErrors(&client, &QAbstractSocket::errorOccurred);
63 #else
6164 QSignalSpy clientErrors(&client, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error));
65 #endif
6266 client.connectToHostEncrypted(QHostAddress(QHostAddress::LocalHost).toString(), server.serverPort());
6367
6468 QTRY_COMPARE(clientErrors.count(), 1);
4242 }
4343 }
4444
45
4645 private Q_SLOTS:
4746 void onPreSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator* pAuthenticator)
4847 {
107107 QVERIFY(!pContextHandle.isEmpty());
108108 }
109109
110
111110 private Q_SLOTS:
112111 void initTestCase()
113112 {
55
66 #include <QCoreApplication>
77 #include <QFile>
8 #include <QSslKey>
89 #include <QtTest>
910
1011 #include "FileDestination.h"
1617
1718 Q_DECLARE_METATYPE(SecureStorage::TlsSuite)
1819 Q_DECLARE_METATYPE(QSsl::SslProtocol)
20 Q_DECLARE_METATYPE(QSsl::KeyAlgorithm)
1921
2022 class test_SecureStorage
2123 : public QObject
7375 return comments;
7476 }
7577
76
7778 private Q_SLOTS:
7879 void testGetCVRootCertificatesUnique()
7980 {
166167 QTest::addColumn<QString>("subjectInfo");
167168 QTest::addColumn<QString>("issuerInfo");
168169 QTest::addColumn<QString>("expiryDate");
169
170 QTest::newRow("production") << 0 << "appl.governikus-asp.de" << "TeleSec ServerPass Class 2 CA" << "2020-12-06T23:59:59Z";
171 QTest::newRow("ci") << 1 << "*.govkg.de" << "TeleSec ServerPass Class 2 CA" << "2021-03-12T23:59:59Z";
170 QTest::addColumn<int>("length");
171 QTest::addColumn<QSsl::KeyAlgorithm>("algorithm");
172
173 QTest::newRow("production") << 0 << "appl.governikus-asp.de" << "TeleSec ServerPass Class 2 CA" << "2020-12-06T23:59:59Z" << 4096 << QSsl::Rsa;
174 QTest::newRow("production_next") << 1 << "appl.governikus-asp.de" << "TeleSec ServerPass Class 2 CA" << "2022-06-22T23:59:59Z" << 4096 << QSsl::Rsa;
175 QTest::newRow("ci") << 2 << "*.govkg.de" << "TeleSec ServerPass Class 2 CA" << "2021-03-12T23:59:59Z" << 4096 << QSsl::Rsa;
172176 }
173177
174178
176180 {
177181 const auto secureStorage = Env::getSingleton<SecureStorage>();
178182 const auto& certificates = secureStorage->getUpdateCertificates();
179 QCOMPARE(certificates.count(), 2);
183 QCOMPARE(certificates.count(), 3);
180184
181185 QFETCH(int, index);
182186 QFETCH(QString, subjectInfo);
183187 QFETCH(QString, issuerInfo);
184188 QFETCH(QString, expiryDate);
189 QFETCH(int, length);
190 QFETCH(QSsl::KeyAlgorithm, algorithm);
185191
186192 QVERIFY(certificates.count() - index > 0);
187193
189195 QCOMPARE(cert.subjectInfo(QSslCertificate::CommonName).at(0), subjectInfo);
190196 QCOMPARE(cert.issuerInfo(QSslCertificate::CommonName).at(0), issuerInfo);
191197 QCOMPARE(cert.expiryDate(), QDateTime::fromString(expiryDate, Qt::ISODate));
198 QCOMPARE(cert.publicKey().length(), length);
199 QCOMPARE(cert.publicKey().algorithm(), algorithm);
192200 }
193201
194202
126126 return QString("NO_INFO");
127127 }
128128
129
130129 private Q_SLOTS:
131130 void initTestCase()
132131 {
3535 #endif
3636 }
3737
38
3938 private Q_SLOTS:
4039 void init()
4140 {
135134
136135 settings.setShuffleScreenKeyboard(initial);
137136 QCOMPARE(settings.isShuffleScreenKeyboard(), initial);
137 settings.save();
138 }
139
140
141 void testCanAllowed()
142 {
143 auto& settings = Env::getSingleton<AppSettings>()->getGeneralSettings();
144
145 settings.setEnableCanAllowed(true);
146 QVERIFY(settings.isEnableCanAllowed());
147 QVERIFY(!settings.isSkipRightsOnCanAllowed());
148
149 settings.setSkipRightsOnCanAllowed(true);
150 QVERIFY(settings.isSkipRightsOnCanAllowed());
151
152 settings.setEnableCanAllowed(false);
153 QVERIFY(!settings.isEnableCanAllowed());
154 QVERIFY(!settings.isSkipRightsOnCanAllowed());
155
156 settings.setEnableCanAllowed(true);
157 QVERIFY(settings.isEnableCanAllowed());
158 QVERIFY(settings.isSkipRightsOnCanAllowed());
159
160 settings.setEnableCanAllowed(false);
161 settings.setSkipRightsOnCanAllowed(false);
162 QVERIFY(!settings.isEnableCanAllowed());
163 QVERIFY(!settings.isSkipRightsOnCanAllowed());
138164 settings.save();
139165 }
140166
155181 QCOMPARE(settings.isDeveloperMode(), false);
156182 QCOMPARE(settings.useSelfAuthTestUri(), false);
157183 QCOMPARE(settings.isUseScreenKeyboard(), false);
184 QCOMPARE(settings.isEnableCanAllowed(), false);
185 QCOMPARE(settings.isSkipRightsOnCanAllowed(), false);
158186 QCOMPARE(settings.isShowSetupAssistant(), true);
159187 QCOMPARE(settings.isShowNewUiHint(), true);
160188 QCOMPARE(settings.isShowInAppNotifications(), getNotificationsOsDefault());
8181 RemoteServiceSettings settings;
8282 QVERIFY(settings.getTrustedCertificates().isEmpty());
8383
84 const QList<QSslCertificate> certs{
84 const QList<QSslCertificate> certs {
8585 pair1.getCertificate(), pair1.getCertificate(), pair2.getCertificate()
8686 };
8787 settings.setTrustedCertificates(certs);
221221 QCOMPARE(settings.getRemoteInfos().size(), 0);
222222
223223 const auto& current = QDateTime::currentDateTime();
224 RemoteServiceSettings::RemoteInfo a(QString("a"), current, QString("dummy for A"));
225 RemoteServiceSettings::RemoteInfo b(QString("b"), current, QString("dummy for B"));
224 RemoteServiceSettings::RemoteInfo a(QStringLiteral("a"), current);
225 a.setNameUnescaped(QStringLiteral("dummy for A"));
226 RemoteServiceSettings::RemoteInfo b(QStringLiteral("b"), current);
227 b.setNameUnescaped(QStringLiteral("dummy for B"));
226228
227229 QVERIFY(a == a);
228230 QVERIFY(b == b);
235237 QCOMPARE(first, a);
236238 QCOMPARE(second, b);
237239 QCOMPARE(first.getFingerprint(), QString("a"));
238 QCOMPARE(first.getName(), QString("dummy for A"));
240 QCOMPARE(first.getNameEscaped(), QStringLiteral("dummy for A"));
239241 QCOMPARE(first.getLastConnected(), current);
240242 QCOMPARE(second.getFingerprint(), QString("b"));
241 QCOMPARE(second.getName(), QString("dummy for B"));
243 QCOMPARE(second.getNameEscaped(), QStringLiteral("dummy for B"));
242244 QCOMPARE(second.getLastConnected(), current);
243245
244246 settings.setRemoteInfos({});
260262 settings.addTrustedCertificate(a);
261263 settings.addTrustedCertificate(b);
262264 QCOMPARE(settings.getRemoteInfos().size(), 2);
263 QCOMPARE(settings.getRemoteInfos().at(0).getName(), QString());
265 QCOMPARE(settings.getRemoteInfos().at(0).getNameEscaped(), QString());
264266
265267 auto aInfo = settings.getRemoteInfo(a);
266 aInfo.setName(QString("dummy"));
268 aInfo.setNameUnescaped(QString("dummy"));
267269 QVERIFY(settings.updateRemoteInfo(aInfo));
268 QCOMPARE(settings.getRemoteInfos().at(0).getName(), QString("dummy"));
270 QCOMPARE(settings.getRemoteInfos().at(0).getNameEscaped(), QString("dummy"));
269271 QCOMPARE(settings.getRemoteInfos().size(), 2);
270272
271273 auto c = KeyPair::generate().getCertificate();
275277
276278 settings.addTrustedCertificate(c);
277279 cInfo = settings.getRemoteInfo(c);
278 cInfo.setName("c");
280 cInfo.setNameUnescaped("c");
279281 settings.updateRemoteInfo(cInfo);
280282 QCOMPARE(settings.getRemoteInfos().size(), 3);
281 QCOMPARE(settings.getRemoteInfos().at(0).getName(), QString("dummy"));
282 QCOMPARE(settings.getRemoteInfos().at(1).getName(), QString());
283 QCOMPARE(settings.getRemoteInfos().at(2).getName(), QString("c"));
283 QCOMPARE(settings.getRemoteInfos().at(0).getNameEscaped(), QString("dummy"));
284 QCOMPARE(settings.getRemoteInfos().at(1).getNameEscaped(), QString());
285 QCOMPARE(settings.getRemoteInfos().at(2).getNameEscaped(), QString("c"));
284286 QCOMPARE(settings.getRemoteInfos().at(2).getFingerprint(),
285287 QString::fromLatin1(c.digest(QCryptographicHash::Sha256).toHex()));
286288 }
296298 settings.addTrustedCertificate(a);
297299
298300 auto aInfo = settings.getRemoteInfo(a);
299 aInfo.setName("hallo");
301 aInfo.setNameUnescaped("<b>hallo</b>");
300302 QVERIFY(settings.updateRemoteInfo(aInfo));
301303
302304 QCOMPARE(settings.getRemoteInfos().size(), 1);
303 QCOMPARE(settings.getRemoteInfos().at(0).getName(), QString("hallo"));
305 QCOMPARE(settings.getRemoteInfos().at(0).getNameEscaped(), QStringLiteral("&lt;b&gt;hallo&lt;/b&gt;"));
304306 }
305307
306308
5151 return aux;
5252 }
5353
54
5554 private Q_SLOTS:
5655 void nonExistingTransactionInfo()
5756 {
2525 context->setOptionalAccessRights({AccessRight::AGE_VERIFICATION});
2626 return context;
2727 }
28
2928
3029 private Q_SLOTS:
3130 void getCertificateBadState()
3131 {
3232 setValidState(pDispatcher, pSelectReader, pBasicReader, pPasswordID);
3333 }
34
3534
3635 private Q_SLOTS:
3736 void initTestCase()
3131 {
3232 setValidState(pDispatcher, pSelectReader, pBasicReader, pPasswordID);
3333 }
34
3534
3635 private Q_SLOTS:
3736 void initTestCase()
3131 {
3232 setValidState(pDispatcher, pSelectReader, pBasicReader, pPasswordID);
3333 }
34
3534
3635 private Q_SLOTS:
3736 void initTestCase()
2626 QSharedPointer<WorkflowContext> context(new WorkflowContext());
2727 pDispatcher.init(context);
2828 }
29
3029
3130 private Q_SLOTS:
3231 void initTestCase()
2929
3030 return QJsonObject();
3131 }
32
3332
3433 private Q_SLOTS:
3534 void cleanup()
7272 return infos;
7373 }
7474
75
7675 private Q_SLOTS:
7776 void init()
7877 {
44 */
55
66 #include "LogModel.h"
7
8 #include "LogHandler.h"
79
810 #include <QDebug>
911 #include <QtTest>
131133 }
132134
133135
136 void test_RemoveOldLogfile()
137 {
138 {
139 QTemporaryFile oldLogfile(LogHandler::getLogFileTemplate());
140 oldLogfile.setAutoRemove(false);
141 QVERIFY(oldLogfile.open());
142 QVERIFY(!oldLogfile.fileName().isNull());
143 }
144
145 // We need to reset() the model since the list of "old" logfiles
146 // is only populated in the ctor of LogModel.
147 mModel.reset(new LogModel());
148
149 QCOMPARE(mModel->getLogfiles().size(), 2);
150 mModel->removeCurrentLogfile();
151 QCOMPARE(mModel->getLogfiles().size(), 2);
152 mModel->setLogfile(1);
153 mModel->removeCurrentLogfile();
154 QCOMPARE(mModel->getLogfiles().size(), 1);
155 }
156
157
134158 };
135159
136160 QTEST_GUILESS_MAIN(test_LogModel)
244244 context->setCardConnection(connection);
245245
246246 context->setLastPaceResult(CardReturnCode::INVALID_PIN);
247 QCOMPARE(mModel->getInputError(), tr("The given PIN is not correct. You have 2 tries to enter the correct PIN."));
247 QCOMPARE(mModel->getInputError(), tr("The given PIN is not correct. You have two attempts to enter the correct PIN."));
248248 QVERIFY(mModel->hasError());
249249
250250 context->setLastPaceResult(CardReturnCode::INVALID_PIN_2);
251251 QCOMPARE(mModel->getInputError(), tr("A wrong PIN has been entered twice on your ID card. "
252 "Prior to a third attempt, you have to enter your 6-digit card access number (CAN) first. "
253 "You can find your card access number (CAN) on the front of your ID card."));
252 "For a third attempt, please first enter the six-digit Card Access Number (CAN). "
253 "You can find your Card Access Number (CAN) in the bottom right on the front of your ID card."));
254254 QVERIFY(mModel->hasError());
255255
256256 context->setLastPaceResult(CardReturnCode::INVALID_PIN_3);
257257 QCOMPARE(mModel->getInputError(), tr("A wrong PIN has been entered three times on your ID card. "
258258 "Your PIN is now blocked. "
259 "To unblock your PIN you have to enter the PUK."));
259 "You have to enter the PUK to remove the block."));
260260 QVERIFY(mModel->hasError());
261261
262262 context->setLastPaceResult(CardReturnCode::INVALID_CAN);
263 QCOMPARE(mModel->getInputError(), tr("The entered card access number (CAN) is incorrect. Please try again."));
263 QCOMPARE(mModel->getInputError(), tr("The entered Card Access Number (CAN) is incorrect. Please try again."));
264264
265265 context->setLastPaceResult(CardReturnCode::INVALID_PUK);
266266 QCOMPARE(mModel->getInputError(), tr("The entered PUK is incorrect. Please try again."));
275275 tr("https://www.ausweisapp.bund.de/en/qa/support/"),
276276 tr("AusweisApp2 Support")));
277277 QVERIFY(mModel->hasError());
278
279 mModel->setRequestTransportPin(true);
280 context->setLastPaceResult(CardReturnCode::INVALID_PIN);
281 QCOMPARE(mModel->getInputError(), tr("The given Transport PIN is not correct. You have two attempts to enter the correct Transport PIN."));
282 context->setLastPaceResult(CardReturnCode::INVALID_PIN_2);
283 QCOMPARE(mModel->getInputError(), tr("A wrong Transport PIN has been entered twice on your ID card. "
284 "For a third attempt, please first enter the six-digit Card Access Number (CAN). "
285 "You can find your Card Access Number (CAN) in the bottom right on the front of your ID card."));
286 context->setLastPaceResult(CardReturnCode::INVALID_PIN_3);
287 QCOMPARE(mModel->getInputError(), tr("A wrong Transport PIN has been entered three times on your ID card. "
288 "Your Transport PIN is now blocked. "
289 "You have to enter the PUK to remove the block."));
278290
279291 connectionThread.quit();
280292 connectionThread.wait();
4747 HistoryModel model;
4848 mModel->setSourceModel(&model);
4949
50 HistoryInfo historyInfo1("SubjectName", QString("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen/"), "Usage", QDateTime::currentDateTime(), "TermOfUsage", {"RequestedData"});
50 HistoryInfo historyInfo1("SubjectName", QString("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen"), "Usage", QDateTime::currentDateTime(), "TermOfUsage", {"RequestedData"});
5151 HistoryInfo historyInfo2("SubjectName", QString("https://test.de"), "Usage", QDateTime::currentDateTime(), "TermOfUsage", {"RequestedData"});
5252 Env::getSingleton<AppSettings>()->getHistorySettings().addHistoryInfo(historyInfo1);
5353 Env::getSingleton<AppSettings>()->getHistorySettings().addHistoryInfo(historyInfo2);
54 const QString providerAddress("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen/");
54 const QString providerAddress("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen");
5555 mModel->setProviderAddress(providerAddress);
5656
5757 QVERIFY(!mModel->filterAcceptsRow(0, QModelIndex()));
6666 mModel->setProviderAddress(invalidProviderAddress);
6767 QCOMPARE(mModel->mProvider.getAddress(), QString());
6868
69 const QString validProviderAddress("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen/");
69 const QString validProviderAddress("https://www.ausweisapp.bund.de/online-ausweisen/meine-daten-auslesen");
7070 mModel->setProviderAddress(validProviderAddress);
7171 QCOMPARE(mModel->mProvider.getAddress(), validProviderAddress);
7272 }
0 /*!
1 * \brief Unit tests for \ref ProxyCredentials
2 *
3 * \copyright Copyright (c) 2020 Governikus GmbH & Co. KG, Germany
4 */
5
6 #include "ProxyCredentials.h"
7
8
9 #include <QElapsedTimer>
10 #include <QtTest>
11 #include <QTimer>
12
13
14 using namespace governikus;
15
16
17 Q_DECLARE_METATYPE(QNetworkProxy::ProxyType)
18
19
20 class test_ProxyCredentials
21 : public QObject
22 {
23 Q_OBJECT
24
25 private Q_SLOTS:
26 void test_Url_data()
27 {
28 QTest::addColumn<QNetworkProxy::ProxyType>("type");
29 QTest::addColumn<QString>("url");
30
31 QTest::newRow("NoProxy") << QNetworkProxy::NoProxy << "http://proxy.example.com:1337";
32 QTest::newRow("DefaultProxy") << QNetworkProxy::DefaultProxy << "http://proxy.example.com:1337";
33 QTest::newRow("Socks5Proxy") << QNetworkProxy::Socks5Proxy << "socks5://proxy.example.com:1337";
34 QTest::newRow("HttpProxy") << QNetworkProxy::HttpProxy << "http://proxy.example.com:1337";
35 QTest::newRow("HttpCachingProxy") << QNetworkProxy::HttpCachingProxy << "http://proxy.example.com:1337";
36 QTest::newRow("FtpCachingProxy") << QNetworkProxy::FtpCachingProxy << "ftp://proxy.example.com:1337";
37 }
38
39
40 void test_Url()
41 {
42 QFETCH(QNetworkProxy::ProxyType, type);
43 QFETCH(QString, url);
44
45 QNetworkProxy proxy(QNetworkProxy::HttpProxy, "proxy.example.com", 1337, "Test");
46 proxy.setType(type);
47 QAuthenticator authenticator;
48
49 ProxyCredentials proxyCredentials(proxy, &authenticator);
50 QCOMPARE(proxyCredentials.getUrl(), url);
51 }
52
53
54 void test_Credentials()
55 {
56 QNetworkProxy proxy(QNetworkProxy::HttpProxy, "proxy.example.com", 1337, "Test");
57 QAuthenticator authenticator;
58
59 ProxyCredentials proxyCredentials(proxy, &authenticator);
60 QCOMPARE(proxyCredentials.getProposedUser(), "Test");
61
62 QCOMPARE(proxyCredentials.getUser(), "");
63 proxyCredentials.setUser("TestUser");
64 QCOMPARE(proxyCredentials.getUser(), "TestUser");
65
66 QCOMPARE(proxyCredentials.getPassword(), "");
67 proxyCredentials.setPassword("TestPassword");
68 QCOMPARE(proxyCredentials.getPassword(), "TestPassword");
69 }
70
71
72 void test_BlockingWait()
73 {
74 const int waitFor = 500;
75 const int tolerance = 10;
76
77 QNetworkProxy proxy(QNetworkProxy::HttpProxy, "proxy.example.com", 1337, "Test");
78 QAuthenticator authenticator;
79 ProxyCredentials proxyCredentials(proxy, &authenticator);
80
81 QElapsedTimer timer;
82 timer.start();
83
84 QTimer::singleShot(waitFor, this, [&proxyCredentials] {
85 proxyCredentials.confirmInput();
86 });
87
88 proxyCredentials.waitForConfirmation();
89 QVERIFY(timer.elapsed() >= waitFor - tolerance);
90 }
91
92
93 };
94
95 QTEST_GUILESS_MAIN(test_ProxyCredentials)
96 #include "test_ProxyCredentials.moc"
4040
4141 return command.getBuffer();
4242 }
43
4443
4544 private Q_SLOTS:
4645 void initTestCase()
2020 Q_OBJECT
2121
2222 private:
23 static const int PROCESS_TIMEOUT = 75000;
23 static const int PROCESS_TIMEOUT = 15000;
2424
2525 QScopedPointer<QProcess> mApp2;
2626 QScopedPointer<WebSocketHelper> mHelper;
2727
28 bool isQmlEngineInitDone(const bool pCheckDoneAndSuccessful)
29 {
28 QString getLogData()
29 {
30 QString logData;
3031 mHelper->sendMessage(QStringLiteral("{\"cmd\": \"GET_LOG\"}"));
31
32 bool initContainedInLog = false;
33 bool initContainedAndSuccess = false;
34 bool showUiReceived = false;
35 bool noQmlWarning = true;
36 QString logData;
37 mHelper->waitForMessage([&initContainedInLog, &initContainedAndSuccess, &showUiReceived, &noQmlWarning, &logData](const QJsonObject& pMessage){
38 if (pMessage[QLatin1String("data")].isNull())
32 mHelper->waitForMessage([&logData](const QJsonObject& pMessage){
33 if (pMessage["msg"] != "LOG")
3934 {
4035 return false;
4136 }
4237
43 const QString& data = pMessage[QLatin1String("data")].toString();
44 logData = data;
45 initContainedInLog = data.contains(QLatin1String("QML engine initialization finished"));
46 initContainedAndSuccess = data.contains(QLatin1String("QML engine initialization finished with 0 warnings."));
47 showUiReceived = (data.count(QStringLiteral("/eID-Client?showui=")) == 3);
48 noQmlWarning = !data.contains(QRegularExpression(" W .*\\.qml:"));
38 auto jsonData = pMessage[QLatin1String("data")];
39 if (!jsonData.isNull())
40 {
41 logData = jsonData.toString();
42 }
4943
5044 return true;
5145 });
52
53 if (pCheckDoneAndSuccessful)
54 {
55 if (initContainedAndSuccess && showUiReceived && noQmlWarning)
56 {
57 return true;
58 }
59
46 return logData;
47 }
48
49
50 bool isQmlEngineInitDone()
51 {
52 return getLogData().contains(QStringLiteral("QML engine initialization finished"));
53 }
54
55
56 bool isQmlEngineInitSuccess()
57 {
58 const QString logData = getLogData();
59
60 bool initContainedAndSuccess = logData.contains(QLatin1String("QML engine initialization finished with 0 warnings."));
61 bool noQmlWarning = !logData.contains(QRegularExpression(" W .*\\.qml:"));
62
63 bool success = initContainedAndSuccess && noQmlWarning;
64 if (!success)
65 {
6066 qDebug().noquote() << "Error output from AusweisApp2 process:\n" << logData;
61 return false;
62 }
63
64 return initContainedInLog;
65 }
66
67 }
68 return success;
69 }
70
71
72 bool isShowUiInLog(const QString& showUi)
73 {
74 return getLogData().contains(QStringLiteral(" \"GET\" | QUrl(\"/eID-Client?showui=%1\")").arg(showUi));
75 }
6776
6877 private Q_SLOTS:
6978 void initTestCase()
8190 QTest::newRow("Android Tablet") << QString("mobile,android,tablet");
8291 QTest::newRow("iOS") << QString("mobile,ios,phone");
8392 QTest::newRow("iOS Tablet") << QString("mobile,ios,tablet");
84 QTest::newRow("macOS") << QString("desktop,mac");
93 #ifdef Q_OS_WIN
8594 QTest::newRow("Windows") << QString("desktop,win");
95 #else
96 QTest::newRow("macOS") << QString("desktop,nowin");
97 #endif
8698 }
8799
88100
123135 QTextStream(&portInfoFile) >> applicationPort;
124136 QVERIFY(applicationPort > 0);
125137
138 mHelper.reset(new WebSocketHelper(applicationPort));
139 QTRY_VERIFY_WITH_TIMEOUT(mHelper->isConnected(), PROCESS_TIMEOUT);
140
141 QTRY_VERIFY_WITH_TIMEOUT(!getLogData().isEmpty(), PROCESS_TIMEOUT);
142 QTRY_VERIFY_WITH_TIMEOUT(isQmlEngineInitDone(), PROCESS_TIMEOUT);
143 QVERIFY(isQmlEngineInitSuccess());
144
126145 const QString showUiUri = QStringLiteral("http://localhost:%1/eID-Client?showui=%2").arg(applicationPort);
127146 QNetworkAccessManager accessManager;
128147 QSignalSpy logSpy(&accessManager, &QNetworkAccessManager::finished);
148
129149 accessManager.get(QNetworkRequest(QUrl(showUiUri.arg("IDENTIFY"))));
130150 QTRY_COMPARE_WITH_TIMEOUT(logSpy.size(), 1, PROCESS_TIMEOUT);
151 QTRY_VERIFY_WITH_TIMEOUT(isShowUiInLog(QStringLiteral("IDENTIFY")), PROCESS_TIMEOUT);
152
131153 accessManager.get(QNetworkRequest(QUrl(showUiUri.arg("SETTINGS"))));
132154 QTRY_COMPARE_WITH_TIMEOUT(logSpy.size(), 2, PROCESS_TIMEOUT);
155 QTRY_VERIFY_WITH_TIMEOUT(isShowUiInLog(QStringLiteral("SETTINGS")), PROCESS_TIMEOUT);
156
133157 accessManager.get(QNetworkRequest(QUrl(showUiUri.arg("UPDATEINFORMATION"))));
134158 QTRY_COMPARE_WITH_TIMEOUT(logSpy.size(), 3, PROCESS_TIMEOUT);
135
136 mHelper.reset(new WebSocketHelper(applicationPort));
137 QCOMPARE(mHelper->getState(), QAbstractSocket::SocketState::ConnectedState);
138
139 QTRY_VERIFY_WITH_TIMEOUT(isQmlEngineInitDone(false), PROCESS_TIMEOUT);
140 QVERIFY(isQmlEngineInitDone(true));
159 QTRY_VERIFY_WITH_TIMEOUT(isShowUiInLog(QStringLiteral("UPDATEINFORMATION")), PROCESS_TIMEOUT);
160
161 QVERIFY(isQmlEngineInitSuccess());
141162 }
142163
143164
6767 QVERIFY(webSocketPort > 0);
6868
6969 mHelper.reset(new WebSocketHelper(webSocketPort));
70 QCOMPARE(mHelper->getState(), QAbstractSocket::SocketState::ConnectedState);
70 QTRY_VERIFY_WITH_TIMEOUT(mHelper->isConnected(), PROCESS_TIMEOUT);
7171 }
7272
7373
4848 {
4949 return QUrl::fromLocalFile(helpDir.path()).toString() + QString::fromLatin1(pStr);
5050 }
51
5251
5352 private Q_SLOTS:
5453 void init()
5959 Env::set(ReaderDetector::staticMetaObject, &mMockReaderDetector);
6060 Env::set(ReaderManager::staticMetaObject, &mMockReaderManager);
6161 }
62
6362
6463 private:
6564 QScopedPointer<MockReaderConfiguration> mMockReaderConfiguration;
0 # Uncrustify_d-0.70.1_f
0 # Uncrustify_d-0.71.0_f
11 newlines = lf
22 input_tab_size = 4
33 output_tab_size = 4
55 string_escape_char2 = 0
66 string_replace_tab_chars = false
77 tok_split_gte = false
8 disable_processing_nl_cont = false
89 disable_processing_cmt = ""
910 enable_processing_cmt = ""
1011 enable_digraphs = false
2021 sp_cpp_lambda_assign = ignore
2122 sp_cpp_lambda_square_paren = ignore
2223 sp_cpp_lambda_square_brace = ignore
24 sp_cpp_lambda_paren_brace = ignore
2325 sp_cpp_lambda_fparen = ignore
2426 sp_assign_default = force
2527 sp_before_assign = force
128130 sp_inside_braces_empty = remove
129131 sp_trailing_return = ignore
130132 sp_type_func = remove
131 sp_type_brace_init_lst = ignore
133 sp_type_brace_init_lst = remove
132134 sp_func_proto_paren = remove
133135 sp_func_proto_paren_empty = ignore
134136 sp_func_type_paren = ignore
157159 sp_after_throw = ignore
158160 sp_catch_paren = force
159161 sp_oc_catch_paren = ignore
162 sp_before_oc_proto_list = ignore
160163 sp_oc_classname_paren = ignore
161164 sp_version_paren = ignore
162165 sp_scope_paren = ignore
175178 sp_brace_finally = ignore
176179 sp_try_brace = ignore
177180 sp_getset_brace = ignore
178 sp_word_brace = add
181 sp_word_brace_init_lst = add
179182 sp_word_brace_ns = add
180183 sp_before_dc = remove
181184 sp_after_dc = remove
282285 indent_member = 0
283286 indent_member_single = false
284287 indent_sing_line_comments = 0
288 indent_sparen_extra = 0
285289 indent_relative_single_line_comments = false
286290 indent_switch_case = 4
287291 indent_switch_break_with_case = false
306310 indent_square_nl = false
307311 indent_preserve_sql = false
308312 indent_align_assign = true
313 indent_off_after_assign = false
309314 indent_align_paren = true
315 indent_oc_inside_msg_sel = false
310316 indent_oc_block = false
311317 indent_oc_block_msg = 0
312318 indent_oc_msg_colon = 0
320326 indent_vbrace_open_on_tabstop = false
321327 indent_token_after_brace = true
322328 indent_cpp_lambda_body = true
329 indent_compound_literal_return = true
323330 indent_using_block = true
324331 indent_ternary_operator = 0
332 indent_inside_ternary_operator = false
333 indent_off_after_return = false
325334 indent_off_after_return_new = false
326335 indent_single_after_return = false
327336 indent_ignore_asm_block = false
365374 nl_elseif_brace = force
366375 nl_else_brace = force
367376 nl_else_if = remove
377 nl_before_opening_brace_func_class_def = ignore
368378 nl_before_if_closing_paren = ignore
369379 nl_brace_finally = force
370380 nl_finally_brace = force
431441 nl_func_def_start_multi_line = false
432442 nl_func_decl_args = ignore
433443 nl_func_def_args = ignore
444 nl_func_call_args = ignore
434445 nl_func_decl_args_multi_line = false
435446 nl_func_def_args_multi_line = false
436447 nl_func_decl_end = ignore
443454 nl_func_def_empty = ignore
444455 nl_func_call_empty = ignore
445456 nl_func_call_start = ignore
457 nl_func_call_end = ignore
446458 nl_func_call_start_multi_line = false
447459 nl_func_call_args_multi_line = false
448460 nl_func_call_end_multi_line = false
461 nl_func_call_args_multi_line_ignore_closures = false
449462 nl_template_start = false
450463 nl_template_args = false
451464 nl_template_end = false
543556 nl_remove_extra_newlines = 0
544557 nl_after_annotation = ignore
545558 nl_between_annotation = ignore
559 nl_before_whole_file_ifdef = 0
560 nl_after_whole_file_ifdef = 0
561 nl_before_whole_file_endif = 0
562 nl_after_whole_file_endif = 0
546563 pos_arith = ignore
547564 pos_assign = ignore
548565 pos_bool = ignore
623640 align_oc_msg_colon_span = 0
624641 align_oc_msg_colon_first = false
625642 align_oc_decl_colon = false
643 align_oc_msg_colon_xcode_like = false
626644 cmt_width = 0
627645 cmt_reflow_mode = 0
628646 cmt_convert_tab_to_spaces = false
671689 mod_sort_import = true
672690 mod_sort_using = false
673691 mod_sort_include = true
692 mod_sort_incl_import_prioritize_filename = false
693 mod_sort_incl_import_prioritize_extensionless = false
694 mod_sort_incl_import_prioritize_angle_over_quotes = false
695 mod_sort_incl_import_ignore_extension = false
696 mod_sort_incl_import_grouping_enabled = false
674697 mod_move_case_break = true
675698 mod_case_brace = ignore
676699 mod_remove_empty_return = false
706729 indent_cpp_lambda_only_once = false
707730 use_sp_after_angle_always = false
708731 use_options_overriding_for_qt_macros = true
732 use_form_feed_no_more_as_whitespace_character = false
709733 warn_level_tabs_found_in_verbatim_string_literals = 2
734 debug_max_number_of_loops = 0
735 debug_line_number_to_protocol = 0
710736 macro-open ASN1_ITEM_TEMPLATE
711737 macro-close ASN1_ITEM_TEMPLATE_END
712738 # option(s) with 'not default' value: 157