WP DSGVO Tools - Version 3.0.20

Version Description

  • translation fixes
  • popup "all details" language fix
  • popup css compatibility improved
  • popup button alignment fixed
  • darkmode improvements
  • added hoster
Download this release

Release Info

Developer shapepress
Plugin Icon 128x128 WP DSGVO Tools
Version 3.0.20
Comparing to
See all releases

Code changes from version 2.2.24 to 3.0.20

Files changed (131) hide show
  1. .buildpath +0 -5
  2. .project +0 -22
  3. Licensing/GPL.txt +84 -84
  4. Licensing/README_License.txt +4 -4
  5. README.txt +168 -330
  6. README_DE.txt +0 -245
  7. admin/base.php +61 -109
  8. admin/class-sp-dsgvo-admin-action.php +24 -24
  9. admin/class-sp-dsgvo-admin-tab.php +59 -45
  10. admin/class-sp-dsgvo-admin.php +303 -315
  11. admin/css/bootstrap.min.css +13 -0
  12. admin/css/fonts/open-sans/opensans-bold-webfont.woff2 +0 -0
  13. admin/css/fonts/open-sans/opensans-bolditalic-webfont.woff2 +0 -0
  14. admin/css/fonts/open-sans/opensans-italic-webfont.woff2 +0 -0
  15. admin/css/fonts/open-sans/opensans-light-webfont.woff2 +0 -0
  16. admin/css/fonts/open-sans/opensans-lightitalic-webfont.woff2 +0 -0
  17. admin/css/fonts/open-sans/opensans-regular-webfont.woff2 +0 -0
  18. admin/css/fonts/open-sans/opensans-semibold-webfont.woff2 +0 -0
  19. admin/css/fonts/open-sans/opensans-semibolditalic-webfont.woff2 +0 -0
  20. admin/css/sp-dsgvo-admin.css +584 -158
  21. admin/images/cookies/Cookie1.png +0 -0
  22. admin/images/cookies/Cookie10.png +0 -0
  23. admin/images/cookies/Cookie11.png +0 -0
  24. admin/images/cookies/Cookie12.png +0 -0
  25. admin/images/cookies/Cookie13.png +0 -0
  26. admin/images/cookies/Cookie14.png +0 -0
  27. admin/images/cookies/Cookie2.png +0 -0
  28. admin/images/cookies/Cookie3.png +0 -0
  29. admin/images/cookies/Cookie4.png +0 -0
  30. admin/images/cookies/Cookie5.png +0 -0
  31. admin/images/cookies/Cookie6.png +0 -0
  32. admin/images/cookies/Cookie7.png +0 -0
  33. admin/images/cookies/Cookie8.png +0 -0
  34. admin/images/cookies/Cookie9.png +0 -0
  35. admin/images/logobackupsvg +9 -9
  36. admin/js/bootstrap.min.js +7 -0
  37. admin/js/sp-dsgvo-admin.js +466 -186
  38. admin/tabs/common-settings/class-sp-dsgvo-common-settings-action.php +0 -46
  39. admin/tabs/common-settings/page.php +0 -254
  40. admin/tabs/cookie-notice/class-sp-dsgvo-cookie-notice-action.php +0 -88
  41. admin/tabs/cookie-notice/page.php +0 -729
  42. admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-action.php +23 -23
  43. admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-tab.php +34 -34
  44. admin/tabs/gravity-forms/page.php +60 -60
  45. admin/tabs/imprint/class-sp-dsgvo-imprint-action.php +0 -27
  46. admin/tabs/imprint/class-sp-dsgvo-imprint-tab.php +0 -17
  47. admin/tabs/imprint/page.php +0 -69
  48. admin/tabs/integrations/class-sp-dsgvo-integrations-action.php +22 -22
  49. admin/tabs/integrations/class-sp-dsgvo-integrations-tab.php +16 -16
  50. admin/tabs/integrations/page.php +45 -45
  51. admin/tabs/premium/class-sp-dsgvo-premium-action.php +0 -15
  52. admin/tabs/premium/class-sp-dsgvo-premium-tab.php +0 -15
  53. admin/tabs/premium/page.php +0 -1
  54. admin/tabs/privacy-policy/class-sp-dsgvo-privacy-policy-tab.php +0 -17
  55. admin/tabs/privacy-policy/page.php +0 -97
  56. admin/tabs/services/class-sp-dsgvo-add-service-action.php +0 -41
  57. admin/tabs/services/class-sp-dsgvo-delete-service-action.php +0 -30
  58. admin/tabs/services/class-sp-dsgvo-services-action.php +0 -44
  59. admin/tabs/services/class-sp-dsgvo-services-tab.php +0 -16
  60. admin/tabs/services/page.php +0 -200
  61. admin/tabs/setup/class-sp-dsgvo-create-page-action.php +101 -128
  62. admin/tabs/setup/class-sp-dsgvo-setup-tab.php +15 -15
  63. admin/tabs/setup/page.php +8 -8
  64. admin/tabs/subject-access-request/class-sp-dsgvo-subject-access-request-action.php +0 -43
  65. admin/tabs/subject-access-request/page.php +0 -230
  66. admin/tabs/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php +0 -56
  67. admin/tabs/super-unsubscribe/page.php +0 -345
  68. admin/tabs/terms-conditions/class-sp-dsgvo-terms-conditions-action.php +0 -54
  69. admin/tabs/terms-conditions/class-sp-dsgvo-terms-conditions-tab.php +0 -14
  70. admin/tabs/terms-conditions/page.php +0 -129
  71. admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-action.php +41 -0
  72. admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-activate-action.php +123 -118
  73. admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-tab.php +17 -17
  74. admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-validate-license-action.php +85 -81
  75. admin/tabs/{privacy-policy → v3/common-settings}/class-sp-dsgvo-privacy-policy-action.php +49 -40
  76. admin/tabs/v3/common-settings/page.php +352 -0
  77. admin/tabs/v3/info/class-sp-dsgvo-info-tab.php +17 -0
  78. admin/tabs/v3/info/page.php +85 -0
  79. admin/tabs/v3/operator/class-sp-dsgvo-imprint-action.php +34 -0
  80. admin/tabs/v3/operator/class-sp-dsgvo-operator-action.php +83 -0
  81. admin/tabs/v3/operator/class-sp-dsgvo-operator-tab.php +17 -0
  82. admin/tabs/v3/operator/page.php +557 -0
  83. admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-action.php +60 -0
  84. admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-tab.php +17 -0
  85. admin/tabs/v3/page-basics/page.php +467 -0
  86. admin/tabs/v3/popup-notice/class-sp-dsgvo-cookie-notice-action.php +49 -0
  87. admin/tabs/{cookie-notice → v3/popup-notice}/class-sp-dsgvo-cookie-notice-tab.php +17 -17
  88. admin/tabs/v3/popup-notice/page.php +375 -0
  89. admin/tabs/v3/stats/class-sp-dsgvo-stats-action.php +19 -0
  90. admin/tabs/v3/stats/class-sp-dsgvo-stats-tab.php +17 -0
  91. admin/tabs/v3/stats/page.php +50 -0
  92. admin/tabs/v3/subject-access-request/class-sp-dsgvo-subject-access-request-action.php +52 -0
  93. admin/tabs/{subject-access-request → v3/subject-access-request}/class-sp-dsgvo-subject-access-request-tab.php +16 -16
  94. admin/tabs/v3/subject-access-request/page.php +298 -0
  95. admin/tabs/{super-unsubscribe → v3/super-unsubscribe}/class-sp-dsgvo-dismiss-unsubscribe-action.php +16 -20
  96. admin/tabs/v3/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php +75 -0
  97. admin/tabs/{super-unsubscribe → v3/super-unsubscribe}/class-sp-dsgvo-super-unsubscribe-tab.php +15 -15
  98. admin/tabs/v3/super-unsubscribe/page.php +433 -0
  99. admin/tabs/v3/targeting/class-sp-dsgvo-targeting-action.php +19 -0
  100. admin/tabs/v3/targeting/class-sp-dsgvo-targeting-tab.php +17 -0
  101. admin/tabs/v3/targeting/page.php +34 -0
  102. imprint.txt +0 -18
  103. includes/class-sp-dsgvo-activator.php +35 -35
  104. includes/class-sp-dsgvo-ajax-action.php +220 -240
  105. includes/class-sp-dsgvo-cache-manager.php +50 -0
  106. includes/class-sp-dsgvo-constants.php +418 -0
  107. includes/class-sp-dsgvo-cookie-category-api.php +75 -0
  108. includes/class-sp-dsgvo-cron.php +88 -88
  109. includes/class-sp-dsgvo-data-collecter.php +469 -469
  110. includes/class-sp-dsgvo-deactivator.php +36 -36
  111. includes/class-sp-dsgvo-integration-api-base.php +291 -0
  112. includes/class-sp-dsgvo-integration.php +103 -97
  113. includes/class-sp-dsgvo-javascript.php +102 -0
  114. includes/class-sp-dsgvo-language-tools.php +219 -0
  115. includes/class-sp-dsgvo-loader.php +128 -128
  116. includes/class-sp-dsgvo-log.php +146 -146
  117. includes/class-sp-dsgvo-mail.php +399 -399
  118. includes/class-sp-dsgvo-migrator.php +99 -0
  119. includes/class-sp-dsgvo-pdf.php +70 -70
  120. includes/class-sp-dsgvo-settings-polylang.php +89 -68
  121. includes/class-sp-dsgvo-settings.php +289 -319
  122. includes/class-sp-dsgvo-slim-model.php +654 -655
  123. includes/class-sp-dsgvo-upgrade-notice-tools.php +101 -0
  124. includes/class-sp-dsgvo.php +444 -399
  125. includes/cron/do-check-privacy-policy-texts.php +78 -0
  126. includes/cron/do-delete-data-request.php +34 -34
  127. includes/cron/do-subject-access-request.php +34 -34
  128. includes/cron/do-validate-license.php +81 -77
  129. includes/emails/feedback.html +16 -16
  130. includes/emails/footer.html +10 -10
  131. includes/emails/header.html +214 -219
.buildpath DELETED
@@ -1,5 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <buildpath>
3
- <buildpathentry kind="src" path=""/>
4
- <buildpathentry kind="con" path="org.eclipse.php.core.LANGUAGE"/>
5
- </buildpath>
 
 
 
 
 
.project DELETED
@@ -1,22 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <projectDescription>
3
- <name>shapepress-dsgvo</name>
4
- <comment></comment>
5
- <projects>
6
- </projects>
7
- <buildSpec>
8
- <buildCommand>
9
- <name>org.eclipse.wst.validation.validationbuilder</name>
10
- <arguments>
11
- </arguments>
12
- </buildCommand>
13
- <buildCommand>
14
- <name>org.eclipse.dltk.core.scriptbuilder</name>
15
- <arguments>
16
- </arguments>
17
- </buildCommand>
18
- </buildSpec>
19
- <natures>
20
- <nature>org.eclipse.php.core.PHPNature</nature>
21
- </natures>
22
- </projectDescription>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Licensing/GPL.txt CHANGED
@@ -1,85 +1,85 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 2, June 1991
3
-
4
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
6
-
7
- Everyone is permitted to copy and distribute verbatim copies
8
- of this license document, but changing it is not allowed.
9
-
10
- Preamble
11
-
12
- The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
13
-
14
- When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
15
-
16
- To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
17
-
18
- For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
19
-
20
- We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
21
-
22
- Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
23
-
24
- Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
25
-
26
- The precise terms and conditions for copying, distribution and modification follow.
27
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
28
-
29
- 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
30
-
31
- Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
32
-
33
- 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
34
-
35
- You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
36
-
37
- 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
38
-
39
- a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
40
- b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
41
- c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
42
-
43
- These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
44
-
45
- Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
46
-
47
- In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
48
-
49
- 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
50
-
51
- a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
52
- b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
53
- c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
54
-
55
- The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
56
-
57
- If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
58
-
59
- 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
60
-
61
- 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
62
-
63
- 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
64
-
65
- 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
66
-
67
- If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
68
-
69
- It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
70
-
71
- This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
72
-
73
- 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
74
-
75
- 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
76
-
77
- Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
78
-
79
- 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
80
-
81
- NO WARRANTY
82
-
83
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
84
-
85
  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
6
+
7
+ Everyone is permitted to copy and distribute verbatim copies
8
+ of this license document, but changing it is not allowed.
9
+
10
+ Preamble
11
+
12
+ The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
13
+
14
+ When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
15
+
16
+ To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
17
+
18
+ For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
19
+
20
+ We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
21
+
22
+ Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
23
+
24
+ Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
25
+
26
+ The precise terms and conditions for copying, distribution and modification follow.
27
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
28
+
29
+ 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
30
+
31
+ Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
32
+
33
+ 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
34
+
35
+ You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
36
+
37
+ 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
38
+
39
+ a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
40
+ b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
41
+ c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
42
+
43
+ These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
44
+
45
+ Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
46
+
47
+ In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
48
+
49
+ 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
50
+
51
+ a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
52
+ b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
53
+ c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
54
+
55
+ The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
56
+
57
+ If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
58
+
59
+ 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
60
+
61
+ 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
62
+
63
+ 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
64
+
65
+ 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
66
+
67
+ If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
68
+
69
+ It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
70
+
71
+ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
72
+
73
+ 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
74
+
75
+ 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
76
+
77
+ Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
78
+
79
+ 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
80
+
81
+ NO WARRANTY
82
+
83
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
84
+
85
  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Licensing/README_License.txt CHANGED
@@ -1,5 +1,5 @@
1
- This theme or plugin is comprised of two parts.
2
-
3
- (1) the PHP code and integrated HTML are licensed under the General Public
4
- License (GPL). You will find a copy of the GPL in the same directory as this
5
  text file.
1
+ This theme or plugin is comprised of two parts.
2
+
3
+ (1) the PHP code and integrated HTML are licensed under the General Public
4
+ License (GPL). You will find a copy of the GPL in the same directory as this
5
  text file.
README.txt CHANGED
@@ -1,330 +1,168 @@
1
- === WP DSGVO Tools (GDPR) ===
2
- Contributors: Shapepress
3
- Donate link: https://wp-dsgvo.eu
4
- Tags: gdpr, dsgvo, datenschutz, wordpress, compliance, data, privacy, woocommerce,
5
- Requires at least: 3.0.1
6
- Tested up to: 5.3.0
7
- Stable tag: 2.2.24
8
- Requires PHP: 5.6.0
9
- License: GPLv2 or later
10
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
-
12
- WP DSGVO Tools (GDPR) help you to fulfill the GDPR (DGSVO) compliance guidance (<a target="_blank" href="https://ico.org.uk/for-organisations/data-protection-reform/overview-of-the-gdpr/">GDPR</a>)
13
-
14
- == Description ==
15
-
16
- Prepare your WordPress Website & WooCommerce Shop for the GDPR and secure your user data with our plugin.
17
- Easy installation, dozens of useful features, and lots of information on how to make your website compliant. It has been developed in cooperation with lawyers.
18
- Try it for free and expand your webshop with our premium version.
19
-
20
- Features
21
- * Legally compliant privacy texts &amp; templates
22
- * Google Analytics &amp; FB-Pixel compliant setup
23
- * Cookie Notice with selective Opt-In &amp; Opt-Out
24
- * Right to be forgotten (with time management)
25
- * Automated directory query (as PDF and JSON) &amp; deletion
26
- * **WPML** support incl compliant privacy texts &amp; templates (by WPML String Translations)
27
- * Contact Form 7 Integration
28
- * Additional checkbox at blog comments to accept privacy policy
29
- * Pseudonymization
30
- * Catalog to list data processing activities
31
- * Tipps &amp; Help
32
- * Free Updates
33
- * PHP 7.3 compatibility
34
-
35
- **Blog Edition**
36
- * All features of Free Edition
37
- * **customizable Cookie Notice**
38
- * Customizeable text of comments checkbox
39
- * **Customizeable tracker scripts for Google Analytics and FB Pixel**
40
- * **Overlay** for Cookie Notice to prevent clicking anywhere else before accept/deny of the cookie notice
41
-
42
- **Premium Edition**
43
- * All features of Free and Blog Edition
44
- * Cookie Notice in style of a popup window/dialog
45
- * **Woocommerce integration**
46
- * Gravity Forms integration
47
- * Mailchimp integration
48
- * **bbPress** integration
49
- * **buddyPress** integration
50
- * **Email notifications on new requests**
51
- * Support forum &amp; ticket based support
52
- * 12 months updates of premium features
53
-
54
- Optional features
55
- * Expert advice
56
-
57
- A full list of all features you can find at <a href="https://wp-dsgvo.eu/en/features/" target="_blank">https://wp-dsgvo.eu/en/features/</a>.
58
-
59
- **SUPPORT**
60
- Support requests by mail to <a href="mailto:support@wp-dsgvo.eu">support@wp-dsgvo.eu</a>
61
-
62
- == Installation ==
63
-
64
- Just install via wordpress plugin feature or upload zip and activate it.
65
-
66
- Important: Disable other cookie notice plugins and Google Analytics or FB Pixel plugins before installing.
67
-
68
- == Screenshots ==
69
-
70
- 1. The Cookie Popup window
71
- 2. Settings for Cookie Popup
72
- 3. Settings for Cookie Notice
73
- 4. Settings for company data which are used for privacy policy and imprint
74
- 5. Dashboard page of user data requests
75
- 6. Settings for comments checkbox
76
- 7. Settings for generated imprint
77
- 8. Settings for generated privacy policy
78
- 9. User defined settings of tracker of users/visitor
79
- 10. Settings for trackers (Google Analytics, FB Pixel)
80
-
81
-
82
- == Changelog ==
83
- = 2.2.24 =
84
- * prepared info for v3
85
- * added arial to tcpdf fonts
86
-
87
- = 2.2.23 =
88
- * fixed bug in combination with elementor plugin
89
- * added tcpdf fonts for compatibility
90
-
91
- = 2.2.22 =
92
- * custom script fixes
93
-
94
- = 2.2.21 =
95
- * CSFR improvements
96
-
97
- = 2.2.20 =
98
- * CSFR bugfix at SAR
99
-
100
- = 2.2.19 =
101
- * security update
102
-
103
- = 2.2.18 =
104
- * style compatibility
105
-
106
- = 2.2.17 =
107
- * fixed font issue
108
-
109
- = 2.2.16 =
110
- * wordpress plugin directory fixes
111
-
112
- = 2.2.15 =
113
- * compatibility fixes
114
-
115
- = 2.2.14 =
116
- * stability updates
117
- * bugfixes at sar and unsubscribe
118
-
119
- = 2.2.13 =
120
- * cookie check improved
121
-
122
- = 2.2.12 =
123
- * error handling at logging
124
- * some php 7.3 warnings removed
125
-
126
- = 2.2.11 =
127
- * fixed bug where reset button of imprint and privacy policy have not been visible if no wpml was used
128
-
129
- = 2.2.10 =
130
- * updated privacy_policy (please refresh your privacy policy texts)
131
- * fixed cookie validity bug with popup
132
-
133
- = 2.2.9 =
134
- * Bugfix "Reload on confirm" checkbox
135
-
136
- = 2.2.8 =
137
- * Security improvement
138
- * Hide Cookie Notice Popup for Googlebot
139
- * Improved User Privacy Settings
140
- * Fixed bug with cookie validity time
141
-
142
- = 2.2.7 =
143
- * WPML improvement
144
-
145
- = 2.2.6 =
146
- * WPML improvement
147
-
148
- = 2.2.5 =
149
- * compatibility issues
150
-
151
- = 2.2.4 =
152
- * Improved uninstall method
153
- * Jetpack compatibility issue solved with comments checkbox
154
- * improved compatibility with some themes
155
- * removed menu for non admins
156
-
157
- = 2.2.3 =
158
- * Little improvements and fixes
159
-
160
- = 2.2.2 =
161
- * Bugfix Comments Checkbox Backend
162
-
163
- = 2.2.1 =
164
- * Bugfix Comments Checkbox Backend
165
-
166
- = 2.2.0 =
167
- * Language templates for en_GB
168
- * WPML stabilization
169
- * Moved comment checkbox before "Send-Button" and improved validation
170
- * Moved Woocommerce privacy-policy checkbox before "Send-Button"
171
- * Improved uninstall method
172
- * Cleaned logging
173
- * Bugfix at saving custom tracker scripts
174
-
175
- = 2.1.3 =
176
- * Bugfixes at PDF generation
177
-
178
- = 2.1.2 =
179
- * Bugfix Woocommerce checkout checkbox: default text now gets displayed correct.
180
-
181
- = 2.1.1 =
182
- * &Auml;nderung des TCPDF PDF Creator String da manche Virenscanner diesen als bedrohlich einstuften und dies zu Fehler beim Laden f&uuml;hrte
183
- * Verbesserung des Cookie Popups
184
- * Fehlerbehebung bei den Datenschutzeinstellungen der Benutzer in Kombination mit dem Cookie Popups
185
- * Fehlerbehebung bei der Polylang Integration
186
-
187
- = 2.1.0 =
188
- * Bugfix Sprachdateien/Mehrsprachigkeit
189
- * Geschwindigkeit des Cookie Poups verbessert
190
- * M&ouml;glichkeit zum Umbennen der Buttons im Cookie Popup erg&auml;nzt
191
- * Fehlerbehebung bei Cookie Opt-Out
192
- * Debugwarnungen korrigiert bzw. entfernt
193
- * Fehlerbehebung: Eigener Trackingcode wird nun korrekt &uuml;bernommen.
194
- * TCPDF Konflikt behoben
195
- * Security verbessert
196
- * Polylang Plugin Kompatibilit&auml;t verbessert
197
- * Bugfix Buddypress Integration
198
-
199
- = 2.0.4 =
200
- * Bugfix: Abschalten der Cookie Notice
201
-
202
- = 2.0.3 =
203
- * Sprachdateien f&uuml;r Deutsch (Sie) erg&auml;nzt
204
- * Fehler beim Akzeptieren des Cookie Popups behoben
205
-
206
- = 2.0.2 =
207
- * Fehler beim Laden der Email Templates behoben falls die eingestellte Sprache de_DE_formal ist.
208
-
209
- = 2.0.1 =
210
- * Standardwert f&uuml;r die Cookie Notice Art
211
-
212
- = 2.0.0 =
213
- * Cookie Notice Popup (Premium Edition)
214
- * HTML nun im Hinweisfeld f&uuml;r Kommentare m&ouml;glich
215
- * Bugfix: mehr als 10 Anfragen in der Liste bei Datenauszug und L&ouml;schanfrage m&ouml;glich
216
- * Bugfix: Kompatibilit&auml;t zum Divi Theme hergestellt
217
- * Text bei WooCommerce Datenschutzcheckbox nun editierbar
218
- * Benutzerdefinierte Trackerscripts f&uuml;r Google Analytics und FB Pixel (ab Blog Edition)
219
- * kleinere Bugfixes und Verbesserungen
220
-
221
- = 1.5.6 =
222
- * Aktivierungsprobleme behoben
223
-
224
- = 1.5.1 =
225
- * Bugfixes
226
-
227
- = 1.5.0 =
228
- * WPML Unterst&uuml;tzung (nur Premium) inkl. englischer Datenschutztexte
229
- * WooCommerce Option zur Zustimmung der Datenschutzbestimmungen beim Checkout (nur Premium)
230
- * Kleine Fehlerbehebungen
231
-
232
- = 1.4.6 =
233
- * CSS Verbeserung bei Cookie Notice
234
- * Konfigurierbare Checkboxen bei Datenauszug- und L&ouml;schanfrage zur Zustimmung der Datenspeicherung
235
-
236
- = 1.4.5 =
237
- * CF7 Fehlerbehebung
238
- * CF7 M&ouml;glichkeit zur Ersetzung des Texts bei Acceptance Checkboxen mit dem DSGVO Zustimmungstext
239
- * Flamingo Integration f&uumlr; CF7 beim Datenauszug und L&ouml;schanfrage
240
- * diverse CSS Verbesserungen zur besseren Themekompatibilit&auml;t
241
- * Fehlerbehebung beim Datenauszug mit WooCommerce
242
- * Link zu den FB Terms aktualisiert
243
- * Fehlerbehebung bei Speicherung der Animationseinstellung der Cookie Notice
244
- * Option zum Verhindern des Setzens eines Cookies bei Ablehnung und Weiterleitung
245
-
246
- = 1.4.4 =
247
- * Korrektur Email Betreff bei L&ouml;schanfrage
248
-
249
- = 1.4.3 =
250
- * Feature Request: Overlay bei Cookie Notice um ein Agieren vor Zustimmung/Ablehnung zu verhindern
251
-
252
- = 1.4.2 =
253
- * Problem mit Cookie Notice behoben
254
-
255
- = 1.4.1 =
256
- * Umlaute in den Betreffzeilen der Mails korrigiert
257
-
258
- = 1.4.0 =
259
- * bbPress Integration bei Datenauszug und L&ouml:schanfrage (nur Premium)
260
- * buddyPress Integration (Felder, Nachrichten) bei Datenauszug und L&ouml:schanfrage (nur Premium)
261
- * Styles der Formulare und Buttons werden nun haupts&auml;chlich vom Theme &uuml;bernommen
262
- * Placeholder bei Datenauszug und L&ouml;schanfrage angepasst
263
- * [user_privacy_settings] Cache Problem gel&ouml;st
264
- * [user_privacy_settings] nun responsive
265
- * Absenderemailadresse bei generierten Mails wird nun von den Einstellungen &uuml;bernommen
266
- * Kleinere Fehlerbehebungen
267
-
268
- = 1.3.8 =
269
- * Kosmetik
270
-
271
- = 1.3.7 =
272
- * Diverese Fehlerbehebungen
273
-
274
- = 1.3.6 =
275
- * &Uuml;berarbeitung des Datenauszug Templates
276
- * Erg&auml;nzung der Kommentartexte bei eingeloggten User beim Datenauszug
277
- * Skriptverbesserung Kommentarcheckbox
278
- * Filter zur Erweiterung des Datenauszugs und der L&ouml;schanfrage
279
-
280
- = 1.3.5 =
281
- * Verbesserung bei Kommentarcheckbox
282
-
283
- = 1.3.4 =
284
- * UTF-8 Codierungsoptimierung
285
-
286
- = 1.3.3 =
287
- * Verbesserung beim Opt-Out von GA
288
-
289
- = 1.3.2 =
290
- * Kleine Fehlerbehebungen und Korrekturen
291
-
292
- = 1.3.1 =
293
- * Fehlerbehebung Texte der Kommentar Checkbox
294
-
295
- = 1.3.0 =
296
- * automatische Benachrichtigung via Email bei neuen Datenauszugs- und L&ouml;schanfragen (nur Premium)
297
- * Fehlerbehebung Cookie Notice: Ablehnen Button mit der Weiterleitung
298
- * Fehlerbehung Cookie Notice: Icon ausblenden
299
- * Fehlerbehebung: Allgemein mit Sonderzeichen und Schreibfehler
300
- * Fehlerbebehung Email Templates: Sonderzeichen nun html codiert
301
- * diverse Fehlerbehebungen
302
-
303
- = 1.2.2 =
304
- * Lizenzierung angepasst
305
-
306
- = 1.2.1 =
307
- * Texte der Checkbox bei den Kommentaren nun anpassbar (ab Blog Edition)
308
- * Cookie Notice Validierung im Zusammenhang mit div. Caches behoben
309
- * Administratoren von L&ouml;schanfragen ausgenommen
310
-
311
- = 1.2.0 =
312
- * Problemen mit CSS Styles der Cookie Notice behoben
313
- * M&ouml;glichkeit zur farblichen Anpassung der Cookie Notice hinzugef&uuml;gt (ab Blog Edition)
314
- * Fehler beim Opt-In von Google Analytics behoben
315
-
316
- = 1.1.2 =
317
- * Funktionsnamenskonflikt behoben (manche User erhielten einen HTTP 500 in Kombination mit anderen Plugins)
318
-
319
- = 1.1.1 =
320
- * Verbesserungen bei der Tracker-Einbindung
321
-
322
- = 1.1.0 =
323
- * Diverse Fehlerbehebungen und Optimierungen
324
-
325
- = 1.0.0 =
326
- * Initiale Version von WP DSGVO Tools.
327
-
328
- == Upgrade Notice ==
329
- = 2.2.23 =
330
- * Our big update - version 3 coming soon
1
+ === WP DSGVO Tools (GDPR) ===
2
+ Contributors: legalweb
3
+ Donate link: https://legalweb.io
4
+ Tags: gdpr, dsgvo, datenschutz, privacy, privacy policy, imprint, impressum, wordpress, compliance, privacy, woocommerce, law
5
+ Requires at least: 3.0.1
6
+ Tested up to: 5.3.3
7
+ Stable tag: 3.0.20
8
+ Requires PHP: 5.6.0
9
+ License: GPLv2 or later
10
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
+
12
+ WP DSGVO Tools (GDPR) by <a target="_blank" href="https://www.legalweb.io">legalweb.io</a> help you to fulfill the GDPR (DSGVO) compliance guidance (<a target="_blank" href="https://ico.org.uk/for-organisations/data-protection-reform/overview-of-the-gdpr/">GDPR</a>)
13
+
14
+ == Description ==
15
+
16
+ Make WordPress Website & WooCommerce Shop GDPR compliant and provide legally compliant privacy policy texts.
17
+ Easy installation, dozens of useful features, and lots of information on how to make your website compliant. Made by IT professionals and lawyers (Visit <a target="_blank" href="https://www.legalweb.io">legalweb.io</a> for more information).
18
+ Try it for free and expand your features with our premium version.
19
+ Important note: This plugin only supports/helps you to fulfill GDPR (DSGVO) compliance guidance. Installing is not enough - a correct configuration of this plugin by a site administrator is mandatory to be to achieve conformity. 100% conformity only by the plugin can't be guaranteed because it depends on several other aspects.
20
+
21
+ Free Features
22
+ * Legally compliant privacy texts for AT, DE and third states
23
+ * Cookie Notice and Cookie Popup with selective Opt-In &amp; Opt-Out
24
+ * Google Analytics, Matomo &amp; WP Statistics GDPR compliant integration
25
+ * Right to be forgotten (with time management)
26
+ * Automated directory query (as PDF and JSON) &amp; deletion
27
+ * Translatable, multi language support - officially WPML certified
28
+ * Pseudonymization
29
+ * Catalog to list data processing activities
30
+ * PHP 7.3 compatibility
31
+
32
+ **Premium Edition**
33
+ * All features of Free Edition
34
+ * Cookie Notice and Cookie Popup styling
35
+ * Cookie Notice style templates
36
+ * Automatic update of privacy policy texts
37
+ * Google Tag Manager compatibility (Opt-In for Tags)
38
+ * Customizable scripts of supported integrations
39
+ * More integrations: Facebook Pixel, Criteo, Clicky, Piwik, Etracker, Hotjar, Bing Ads, LinkedIn Pixel - will be continuously expanded
40
+ * Dozens of integrations for subject access request and delete request (WooCommerce, Gravity Forms, bbPress, buddyPress
41
+ * Get email notifications on new requests
42
+ * 12 months subscription of premium features
43
+
44
+ A full list of all features you can find at <a href="https://legalweb.io" target="_blank">https://legalweb.io</a>.
45
+
46
+ **SUPPORT**
47
+ Support requests only at <a href="https://legalweb.freshdesk.com/">https://legalweb.freshdesk.com</a>
48
+
49
+ == Installation ==
50
+
51
+ Just install via wordpress plugin feature or upload zip and activate it.
52
+
53
+ Important: Disable other cookie notice plugins and Google Analytics or FB Pixel plugins before installing.
54
+
55
+ == Screenshots ==
56
+
57
+ 1. The Cookie Popup window
58
+ 2. Common Settings
59
+ 3. Settings for Cookie Popup and Notice
60
+ 4. Settings for page operator which are used for privacy policy and imprint
61
+ 5. Settings about the page basics
62
+ 6. Statistic integrations
63
+ 7. Targeting integrations
64
+ 8. SAR settings
65
+ 9. Pseudonymization Settings
66
+
67
+ == Changelog ==
68
+ = 3.0.20 =
69
+ * translation fixes
70
+ * popup "all details" language fix
71
+ * popup css compatibility improved
72
+ * popup button alignment fixed
73
+ * darkmode improvements
74
+ * added hoster
75
+
76
+ = 3.0.19 =
77
+ * popup logo fixes
78
+ * js bug fixes
79
+ * operator tab saving fixes
80
+ * gtag manager fix
81
+
82
+ = 3.0.18 =
83
+ * improved the text notification of free license
84
+ * optional email notification when new privacy texts are downloadable
85
+ * renamed icon file names to avoid a broken image link
86
+ * fixed translation errors
87
+ * darkmode color compatibility improved
88
+
89
+ = 3.0.17 =
90
+ * GTAG Manager fix
91
+
92
+ = 3.0.16 =
93
+ * fallback language for legal texts
94
+ * added LinkedIn Pixel, Bing Ads UET as targeting integration
95
+ * added Hotjar as statistic integration
96
+ * added SiteGround (Hosting) and Mailpoet (newslettering)
97
+
98
+ = 3.0.15 =
99
+ * translation improvement
100
+ * js script bugfix
101
+
102
+ = 3.0.14 =
103
+ * js frontenend fix
104
+ * clear caches of common plugin on saving of cookie notice/popup relevant data
105
+ * added techn. necessary integrations feature to popup
106
+ * allow "auto opt-in" for piwik and matomo according to latest gdpr facts
107
+ * updated legal texts
108
+ * added "no integration mode" for popup, just do display text and ok button
109
+ * newsletter provider added to backend and privacy policy
110
+
111
+ = 3.0.13 =
112
+ * fixes in imprint and privacy policy shortcode
113
+ * fixes casing of included fonts
114
+ * added WP Statistics
115
+ * added new hoster: lima city
116
+ * removed duplicated header in privacy policy
117
+ * css compatibility improvements
118
+ * improved translations
119
+
120
+ = 3.0.12 =
121
+ * down to 3.0.1
122
+ * moved styling functionality to Free version
123
+ * compatibility improvements to themes used by our users
124
+ * translation updates & fixes
125
+ * backend fix at delete request page actions
126
+ * css & html fixes of the frontend
127
+ * option to show popup although it's not needed
128
+ * fixed http 500 error at some installations with endless loop
129
+ * fixed casing of included fonts
130
+ * updated legal texts
131
+ * fixed click handler on mobile devices
132
+ * reacted to a lot of user wishes
133
+
134
+ = 3.0.0 =
135
+ * Redesigned the backend, separated functions, improved usability, added more help texts
136
+ * Redesigned frontend to ensure GDPR compliance - full opt-in for supported services/integrations
137
+ * Dynamic generation of valid and compliant privacy policy for AT, DE and third states + privacy policy text upgrade service
138
+ * Added Matomo in Free version, moved FB Pixel to Premium/Blog
139
+ * Sorted out unneeded or non mandatory functions in case of GDPR
140
+ * Cookie Popup now in all versions/editions
141
+ * Styles for cookie notice
142
+ * Dark mode for cookie popup
143
+ * TCPDF update to latest bits + improvement of compatibility to other plugins
144
+ * a lot of other bugfixes and improvements
145
+
146
+ = 2.2.24 =
147
+ * prepared info for v3
148
+ * added arial to TCPDF fonts
149
+
150
+ = 2.0.0 =
151
+ * A short time after v1, version 2 arrived with a lot of improvements & new features
152
+
153
+ = 1.0.0 =
154
+ * In the beginning there was a version 1
155
+
156
+ == Upgrade Notice ==
157
+ = 3.0.14 =
158
+ * Important: In V3 a lot of important changes have been made. Please check all your settings after updating to ensure correct functionality
159
+ * THE PLUGIN NEEDS A COMPLETE RECONFIGURATION TO FULFILL THE LATEST GDPR LAWS
160
+ * Changes:
161
+ * Redesigned the backend, separated functions, improved usability, added more help texts
162
+ * Redesigned frontend to ensure GDPR compliance - full opt-in for supported services/integrations
163
+ * Dynamic generation of valid and compliant privacy policy for AT and DE and third states + policy text upgrade service
164
+ * Matomo Integration in Free version, Facebook Pixel moved to Premium but still exists in Blog
165
+ * Sorted out unneeded or non mandatory functions in case of GDPR
166
+ * Cookie Popup now in all versions/editions
167
+ * WP DSGVO Tools (GDPR) now gets maintained by legalweb.io
168
+ * and much more
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README_DE.txt DELETED
@@ -1,245 +0,0 @@
1
- === WP DSGVO Tools ===
2
- Contributors: Shapepress
3
- Donate link: https://wp-dsgvo.eu
4
- Tags: gdpr, dsgvo, datenschutz, wordpress, compliance, data
5
- Requires at least: 3.0.1
6
- Tested up to: 5.0.0
7
- Stable tag: 2.1.4
8
- Requires PHP: 5.6.0
9
- License: GPLv2 or later
10
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
-
12
- WP DSGVO Tools (GDPR) helfen beim Erf&uuml;llen der Richtlinien der Datenschutzgrundverordnung, spezialisiert auf &Ouml;sterreich und Deutschland.
13
-
14
- == Description ==
15
-
16
- Bereiten Sie Ihre WordPress Website auf die DSGVO vor und sichern Sie Ihre Userdaten ganz einfach mit unserem Plugin ab. Einfache Installation, dutzende n&uuml;tzliche Funktionen und schon sind die wichtigsten Ma&szlig;nahmen f&uuml;r Ihre Website gesetzt.
17
- Immer dann wenn Sie Personenbezogene Daten verarbeiten, m&uuml;ssen Sie sich um die sichere Verarbeitung, Handhabung &amp; Verwaltung dieser k&uuml;mmern. Unsere Plugin hilft Ihnen bei dieser aufwendigen Aufgabe.
18
- **Auf Deutsches &amp; &Ouml;sterreichisches Recht gepr&uuml;ft**.
19
- Unser Plugin ist unverbindlich, wurde aber **mit Rechtsanw&auml;lten gemeinsam entwickelt**.
20
-
21
- Features
22
- * Rechtskonforme Datenschutztexte
23
- * Google Analytics &amp; FB-Pixel konform einrichten
24
- * Cookie Notice mit selektiven Opt-In &amp; Opt-Out
25
- * Recht auf Vergessenheit (mit Zeit Option)
26
- * Userdaten Auskunft (als PDF und JSON) &amp; L&ouml;schung
27
- * **WPML** Unterst&uuml;tzung inkl. englischer Datenschutztexte (String Translations)
28
- * Contact Form 7 Integration
29
- * Blog Kommentare Checkbox f&uuml;r DSGVO Zustimmung
30
- * Pseudonomisierung
31
- * VdV (Verzeichnis der Verarbeitungst&auml;tigkeiten)
32
- * Tipps &amp; Hilfe
33
- * Kostenlose Updates
34
- * PHP 7.2 Kompatibiltit&auml;t
35
-
36
- **Blog Edition**
37
- * Alle Features der Free Edition
38
- * **anpassbare Cookie Notice**
39
- * Texte der Checkbox bei den Kommentaren anpassbar
40
- * **Benutzerdefinierte Trackerscripts f&uuml;r Google Analytics und FB Pixel m&ouml;glich**
41
- * **Overlay** bei Cookie Notice um ein Agieren vor Zustimmung/Ablehnung zu verhindern
42
-
43
- **Premium Edition**
44
- * Alle Features der Free und Blog Edition
45
- * Popup f&uuml;r Cookie Notice
46
- * **Woocommerce Integration**
47
- * Gravity Forms Integration
48
- * Mailchimp Integration
49
- * **bbPress** Integration
50
- * **buddyPress** Integration
51
- * **Cookie Notice anpassbar**
52
- * **Email Benachrichtigung bei neuen Anfragen**
53
- * Support Forum &amp; professioneller Support
54
- * 12 Monate Premium Updates
55
-
56
- Optionale Features
57
- * Expertenberatung
58
-
59
- Eine detailierte Liste aller Funktionen finden Sie auf <a href="https://wp-dsgvo.eu/funktionen/" target="_blank">https://wp-dsgvo.eu/funktionen/</a>.
60
-
61
- **SUPPORT**
62
- Supportanfragen bitte ausschlie&szlig;lich per Email an <a href="mailto:support@wp-dsgvo.eu">support@wp-dsgvo.eu</a>
63
-
64
- == Installation ==
65
-
66
- Das Plugin per ZIP hochladen bzw. &uuml;ber den Wordpress Plugin-Installer installieren und aktivieren. Danach k&ouml;nnen alle Einstellungen angepasst werden.
67
-
68
- WICHTIG: Vor der Installation bitte alle bisher aktivierten Cookie Notice/Google Analytics/FB Pixel Plugins deaktivieren bzw. deinstallieren. Ansonsten kann des zu Kompatibilt&auml;tsproblemen kommen.
69
-
70
- == Screenshots ==
71
-
72
- 1. Das Cookie Popup Fenster
73
- 2. Einstellungen zum Cookie Popup
74
- 3. Einstellungen zur Cookie Notice
75
- 4. Einstellungen zu den Unternehmensdaten die als Basis f&uuml;r Impressum und Datenschutzvereinbarung gelten
76
- 5. Ansicht im Dashboard der Datenauszuganfragen
77
- 6. Einstellungen zur Checkbox bei Kommentaren
78
- 7. Einstellungen zum generierten Impressum
79
- 8. Einstellungen zur generierten Datenschutzvereinbarung
80
- 9. Benutzerdefinierte Einstellungen der Tracker der Benutzer/Besucher
81
- 10. Einstellungen zu den Trackern (Google Analytics, FB Pixel)
82
-
83
- == Changelog ==
84
-
85
- = 2.2.0 =
86
- * Templates f&uuml;r en_GB
87
- * WPML Stabilisierung
88
- * Checkbox bei Kommentaren nun vor dem "Senden-Button", sowie Verbesserung der Validierung
89
- * Woocommerce Checkbox zur Zustimmung der Datenschutzbestimmungen vor den Senden-Button verschoben
90
- * Verbesserung der Plugin-Deinstallationsroutine
91
- * Logging bereinigt
92
- * Fehlerbehebung des ben. def. Tracking Codes
93
-
94
- = 2.1.3 =
95
- * Fehlerbehebung beim Datenauszug bei der PDF Generierung
96
-
97
- = 2.1.2 =
98
- * Bugfix Woocommerce Checkout Checkbox: Standardtext wird nun korrekt angezeigt.
99
-
100
- = 2.1.1 =
101
- * &Auml;nderung des TCPDF PDF Creator String da manche Virenscanner diesen als bedrohlich einstuften und dies zu Fehler beim Laden f&uuml;hrte
102
- * Verbesserung des Cookie Popups
103
- * Fehlerbehebung bei den Datenschutzeinstellungen der Benutzer in Kombination mit dem Cookie Popups
104
- * Fehlerbehebung bei der Polylang Integration
105
-
106
- = 2.1.0 =
107
- * Bugfix Sprachdateien/Mehrsprachigkeit
108
- * Geschwindigkeit des Cookie Poups verbessert
109
- * M&ouml;glichkeit zum Umbennen der Buttons im Cookie Popup erg&auml;nzt
110
- * Fehlerbehebung bei Cookie Opt-Out
111
- * Debugwarnungen korrigiert bzw. entfernt
112
- * Fehlerbehebung: Eigener Trackingcode wird nun korrekt &uuml;bernommen.
113
- * TCPDF Konflikt behoben
114
- * Security verbessert
115
- * Polylang Plugin Kompatibilit&auml;t verbessert
116
- * Bugfix Buddypress Integration
117
-
118
- = 2.0.4 =
119
- * Bugfix: Abschalten der Cookie Notice
120
-
121
- = 2.0.3 =
122
- * Sprachdateien f&uuml;r Deutsch (Sie) erg&auml;nzt
123
- * Fehler beim Akzeptieren des Cookie Popups behoben
124
-
125
- = 2.0.2 =
126
- * Fehler beim Laden der Email Templates behoben falls die eingestellte Sprache de_DE_formal ist.
127
-
128
- = 2.0.1 =
129
- * Standardwert f&uuml;r die Cookie Notice Art
130
-
131
- = 2.0.0 =
132
- * Cookie Notice Popup (Premium Edition)
133
- * HTML nun im Hinweisfeld f&uuml;r Kommentare m&ouml;glich
134
- * Bugfix: mehr als 10 Anfragen in der Liste bei Datenauszug und L&ouml;schanfrage m&ouml;glich
135
- * Bugfix: Kompatibilit&auml;t zum Divi Theme hergestellt
136
- * Text bei WooCommerce Datenschutzcheckbox nun editierbar
137
- * Benutzerdefinierte Trackerscripts f&uuml;r Google Analytics und FB Pixel (ab Blog Edition)
138
- * kleinere Bugfixes und Verbesserungen
139
-
140
- = 1.5.6 =
141
- * Aktivierungsprobleme behoben
142
-
143
- = 1.5.1 =
144
- * Bugfixes
145
-
146
- = 1.5.0 =
147
- * WPML Unterst&uuml;tzung (nur Premium) inkl. englischer Datenschutztexte
148
- * WooCommerce Option zur Zustimmung der Datenschutzbestimmungen beim Checkout (nur Premium)
149
- * Kleine Fehlerbehebungen
150
-
151
- = 1.4.6 =
152
- * CSS Verbeserung bei Cookie Notice
153
- * Konfigurierbare Checkboxen bei Datenauszug- und L&ouml;schanfrage zur Zustimmung der Datenspeicherung
154
-
155
- = 1.4.5 =
156
- * CF7 Fehlerbehebung
157
- * CF7 M&ouml;glichkeit zur Ersetzung des Texts bei Acceptance Checkboxen mit dem DSGVO Zustimmungstext
158
- * Flamingo Integration f&uumlr; CF7 beim Datenauszug und L&ouml;schanfrage
159
- * diverse CSS Verbesserungen zur besseren Themekompatibilit&auml;t
160
- * Fehlerbehebung beim Datenauszug mit WooCommerce
161
- * Link zu den FB Terms aktualisiert
162
- * Fehlerbehebung bei Speicherung der Animationseinstellung der Cookie Notice
163
- * Option zum Verhindern des Setzens eines Cookies bei Ablehnung und Weiterleitung
164
-
165
- = 1.4.4 =
166
- * Korrektur Email Betreff bei L&ouml;schanfrage
167
-
168
- = 1.4.3 =
169
- * Feature Request: Overlay bei Cookie Notice um ein Agieren vor Zustimmung/Ablehnung zu verhindern
170
-
171
- = 1.4.2 =
172
- * Problem mit Cookie Notice behoben
173
-
174
- = 1.4.1 =
175
- * Umlaute in den Betreffzeilen der Mails korrigiert
176
-
177
- = 1.4.0 =
178
- * bbPress Integration bei Datenauszug und L&ouml:schanfrage (nur Premium)
179
- * buddyPress Integration (Felder, Nachrichten) bei Datenauszug und L&ouml:schanfrage (nur Premium)
180
- * Styles der Formulare und Buttons werden nun haupts&auml;chlich vom Theme &uuml;bernommen
181
- * Placeholder bei Datenauszug und L&ouml;schanfrage angepasst
182
- * [user_privacy_settings] Cache Problem gel&ouml;st
183
- * [user_privacy_settings] nun responsive
184
- * Absenderemailadresse bei generierten Mails wird nun von den Einstellungen &uuml;bernommen
185
- * Kleinere Fehlerbehebungen
186
-
187
- = 1.3.8 =
188
- * Kosmetik
189
-
190
- = 1.3.7 =
191
- * Diverese Fehlerbehebungen
192
-
193
- = 1.3.6 =
194
- * &Uuml;berarbeitung des Datenauszug Templates
195
- * Erg&auml;nzung der Kommentartexte bei eingeloggten User beim Datenauszug
196
- * Skriptverbesserung Kommentarcheckbox
197
- * Filter zur Erweiterung des Datenauszugs und der L&ouml;schanfrage
198
-
199
- = 1.3.5 =
200
- * Verbesserung bei Kommentarcheckbox
201
-
202
- = 1.3.4 =
203
- * UTF-8 Codierungsoptimierung
204
-
205
- = 1.3.3 =
206
- * Verbesserung beim Opt-Out von GA
207
-
208
- = 1.3.2 =
209
- * Kleine Fehlerbehebungen und Korrekturen
210
-
211
- = 1.3.1 =
212
- * Fehlerbehebung Texte der Kommentar Checkbox
213
-
214
- = 1.3.0 =
215
- * automatische Benachrichtigung via Email bei neuen Datenauszugs- und L&ouml;schanfragen (nur Premium)
216
- * Fehlerbehebung Cookie Notice: Ablehnen Button mit der Weiterleitung
217
- * Fehlerbehung Cookie Notice: Icon ausblenden
218
- * Fehlerbehebung: Allgemein mit Sonderzeichen und Schreibfehler
219
- * Fehlerbebehung Email Templates: Sonderzeichen nun html codiert
220
- * diverse Fehlerbehebungen
221
-
222
- = 1.2.2 =
223
- * Lizenzierung angepasst
224
-
225
- = 1.2.1 =
226
- * Texte der Checkbox bei den Kommentaren nun anpassbar (ab Blog Edition)
227
- * Cookie Notice Validierung im Zusammenhang mit div. Caches behoben
228
- * Administratoren von L&ouml;schanfragen ausgenommen
229
-
230
- = 1.2.0 =
231
- * Problemen mit CSS Styles der Cookie Notice behoben
232
- * M&ouml;glichkeit zur farblichen Anpassung der Cookie Notice hinzugef&uuml;gt (ab Blog Edition)
233
- * Fehler beim Opt-In von Google Analytics behoben
234
-
235
- = 1.1.2 =
236
- * Funktionsnamenskonflikt behoben (manche User erhielten einen HTTP 500 in Kombination mit anderen Plugins)
237
-
238
- = 1.1.1 =
239
- * Verbesserungen bei der Tracker-Einbindung
240
-
241
- = 1.1.0 =
242
- * Diverse Fehlerbehebungen und Optimierungen
243
-
244
- = 1.0.0 =
245
- * Initiale Version von WP DSGVO Tools.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/base.php CHANGED
@@ -1,109 +1,61 @@
1
- <div class="wrap dsgvo-wrap" style="">
2
- <h2><?php _e('WP DSGVO Tools (GDPR)', 'shapepress-dsgvo'); ?></h2>
3
-
4
- <h2 class="nav-tab-wrapper">
5
- <?php foreach($tabs as $t): ?>
6
- <?php if(!$t->isHidden()): ?>
7
- <a href="<?= $t->uri() ?>"
8
- class="nav-tab <?= ($tab === $t->slug)? 'nav-tab-active' : '' ?> <?= ($t->isHighlighted())? 'nav-tab-highlighted' : '' ?>">
9
- <?= $t->title ?>
10
- </a>
11
- <?php endif; ?>
12
- <?php endforeach; ?>
13
- </h2>
14
-
15
- <?php
16
- if (isset($tabs[$tab])) {
17
- $tabs[$tab]->page();
18
- } else {
19
- $tabs['common-settings']->page();
20
- }
21
- ?>
22
- </div>
23
-
24
-
25
- <div class="wrap-premium">
26
-
27
- <form id="checklist-form" method="post"
28
- action="<?= admin_url('/admin-ajax.php'); ?>">
29
- <input type="hidden" name="action" value="admin-common-action">
30
-
31
- <div style="border: dashed 1px black; padding: 10px;">
32
- <span style="font-size: 1.2rem; line-height: 1.3rem;"><?php _e('WP DSGVO Tools is not binding and does not replace expert advice','shapepress-dsgvo')?></span>
33
- </div>
34
- <h2 style="margin-bottom: 0"><?php _e('GDPR website self check','shapepress-dsgvo')?></h2>
35
- <small>(<?php _e('Includes only your web presence!','shapepress-dsgvo')?>)</small>
36
- <ul id="dsgvo-checklist">
37
- <li><input id="cb_spdsgvo_cl_vdv" name="cb_spdsgvo_cl_vdv"
38
- type="checkbox" class="cbChecklist" value="1"
39
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_vdv') === '1')? ' checked ' : ''; ?> /><span>
40
- <?php _e('VdV (directory of processing times)','shapepress-dsgvo')?> <a href="https://www.wp-dsgvo.eu/spdsgvo-bin/wp-dsgvp-tools-vdv.xls"><?php _e('downloaded','shapepress-dsgvo')?></a>
41
- &amp; <?php _e('filled','shapepress-dsgvo')?>
42
- </span></li>
43
- <li><input id="cb_spdsgvo_cl_filled_out"
44
- name="cb_spdsgvo_cl_filled_out" type="checkbox" class="cbChecklist"
45
- value="1"
46
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_filled_out') === '1')? ' checked ' : ''; ?> /><span>
47
- <?php _e('WP DSGVO Tools plugin completely filled','shapepress-dsgvo')?></span></li>
48
- <li><input id="cb_spdsgvo_cl_maintainance"
49
- name="cb_spdsgvo_cl_maintainance" type="checkbox"
50
- class="cbChecklist" value="1"
51
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_maintainance') === '1')? ' checked ' : ''; ?> /><span>
52
- <?php _e('Monthly maintenance of the website (maintenance contract with the web designer)','shapepress-dsgvo')?></span></li>
53
- <li><input id="cb_spdsgvo_cl_security" name="cb_spdsgvo_cl_security"
54
- type="checkbox" class="cbChecklist" value="1"
55
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_security') === '1')? ' checked ' : ''; ?> /><span>
56
- <?php _e('Security Precautions (strong passwords, who has access, ...)','shapepress-dsgvo')?></span></li>
57
- <li><input id="cb_spdsgvo_cl_hosting" name="cb_spdsgvo_cl_hosting"
58
- type="checkbox" class="cbChecklist" value="1"
59
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_hosting') === '1')? ' checked ' : ''; ?> /><span>
60
- <?php _e('GDPR compliant and secure web hosting? Our recommendation:','shapepress-dsgvo')?> <a
61
- href="https://raidboxes.de/?aid=14330" target="_blank">Raidboxes</a>
62
- </span></li>
63
- <li><input id="cb_spdsgvo_cl_plugins" name="cb_spdsgvo_cl_plugins"
64
- type="checkbox" class="cbChecklist" value="1"
65
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_plugins') === '1')? ' checked ' : ''; ?> /><span>
66
- <?php _e('Check the security of unsupported plugins','shapepress-dsgvo')?></span></li>
67
- <li><input id="cb_spdsgvo_cl_experts" name="cb_spdsgvo_cl_experts"
68
- type="checkbox" class="cbChecklist" value="1"
69
- <?= (SPDSGVOSettings::get('cb_spdsgvo_cl_experts') === '1')? ' checked ' : ''; ?> /><span>
70
- <a href="https://www.wp-dsgvo.eu/experten/"
71
- target="_blank"><?php _e('Expert advice','shapepress-dsgvo')?></a> <?php _e('requested','shapepress-dsgvo')?>
72
- </span></li>
73
- </ul>
74
- <?php if (isValidPremiumEdition() == false && isValidBlogEdition() == false) : ?>
75
- <h1 style="margin-top: 1em"><?php _e('Blog Edition','shapepress-dsgvo')?></h1>
76
- <ul id="dsgvo-premium-featurelist">
77
- <li><?php _e('Stylish Cookie Notice: Customize the look & feel of your Wordpress Page!','shapepress-dsgvo')?></li>
78
- <li><?php _e('Texts customizable with comment checkbox','shapepress-dsgvo')?></li>
79
- </ul>
80
- <div>
81
- <a href="https://www.wp-dsgvo.eu/shop" target="_blank"
82
- class="button button-primary" style="font-size: 1rem"><?php _e('Get the Blog Edition now','shapepress-dsgvo')?></a>
83
- </div>
84
- <?php endif;?>
85
- <?php if(isValidPremiumEdition() == false):?>
86
- <h1 style="margin-top: 1em"><?php _e('Upgrade to Premium','shapepress-dsgvo')?></h1>
87
- <ul id="dsgvo-premium-featurelist">
88
- <li><?php _e('Cookie Notice Popup','shapepress-dsgvo')?></li>
89
- <li><?php _e('Support & Community','shapepress-dsgvo')?></li>
90
- <li><?php _e('More Integrations','shapepress-dsgvo')?></li>
91
- <li><?php _e('Automatic user data reports','shapepress-dsgvo')?></li>
92
- <li><?php _e('Email notifications','shapepress-dsgvo')?></li>
93
- <li><?php _e('Style & Customization (from Blog Edition)','shapepress-dsgvo')?></li>
94
- <li><?php _e('and much more','shapepress-dsgvo')?></li>
95
- </ul>
96
- <div>
97
- <a href="https://www.wp-dsgvo.eu/shop" target="_blank"
98
- class="button button-primary" style="font-size: 1rem"><?php _e('Get Premium version now','shapepress-dsgvo')?></a>
99
- </div>
100
- <ul id="dsgvo-premium-featurelist-tipps">
101
- <li><?php _e('FAQ & checklists','shapepress-dsgvo')?></li>
102
- <li><?php _e('GDPR experts booking','shapepress-dsgvo')?></li>
103
- <li><?php _e('Book legal advice','shapepress-dsgvo')?></li>
104
- </ul>
105
- <?php endif;?>
106
-
107
-
108
- </form>
109
- </div>
1
+ <div class="wrap"></div>
2
+
3
+ <div class="sp-dsgvo" style="padding-right: 15px">
4
+ <nav class="navbar navbar-expand-lg navbar-dark bg-primary mb-2 text-white">
5
+ <a class="navbar-brand" href="#">
6
+ <img src="<?php echo SPDSGVO::pluginURI('public\images\legalwebio-logo-icon-white.svg'); ?>" width="30" height="30" class="d-inline-block align-top" alt="">
7
+ <a class="navbar-brand"><?php _e('WP DSGVO Tools (GDPR) by legalweb.io', 'shapepress-dsgvo'); ?></a>
8
+ </a>
9
+ </nav>
10
+
11
+ <!--
12
+ <div class="jumbotron">
13
+ <div class="container">
14
+ <h1 class="display-3">Hello, world!</h1>
15
+ <p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
16
+ <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more »</a></p>
17
+ </div>
18
+ </div>
19
+ -->
20
+ <nav aria-label="breadcrumb">
21
+ <ol class="breadcrumb">
22
+ <li class="breadcrumb-item"><a href="#"><?php _e('WP DSGVO Tools (GDPR)', 'shapepress-dsgvo'); ?></a></li>
23
+ <li class="breadcrumb-item active" aria-current="page"><?= __($tabs[$tab]->getTabTitle(),'shapepress-dsgvo');;?></li>
24
+ </ol>
25
+ </nav>
26
+ <div class="row">
27
+ <div class="col-12 col-sm-12 col-md-12 col-lg-9 container-fluid sp-dsgvo-content-container">
28
+ <?php
29
+
30
+ if (isset($tabs[$tab])) {
31
+ $tabs[$tab]->page();
32
+ ?>
33
+ <script>
34
+ var spDsgvoActiveAdminSubmenu = '<?= $tabs[$tab]->slug ?>';
35
+
36
+ </script>
37
+ <?php
38
+ } else {
39
+ $tabs['common-settings']->page();
40
+ }
41
+
42
+ ?>
43
+ </div>
44
+ <div class="col-12 col-sm-12 col-md-12 col-lg-3 sp-dsgvo-side-container">
45
+ <div class="card border-info bg-light" style="">
46
+ <div class="card-header"><?= __("What's new, what has changed in V3",'shapepress-dsgvo')?></div>
47
+ <div class="card-body">
48
+
49
+ <h4 class="card-subtitle"><?= __("What has changed",'shapepress-dsgvo')?></h4>
50
+ <p class="card-text"><?= __('Since the confusion over GDPR among the website operators became more and more and the number of GDPR warnings increased, we decided to get IT and legal experts directly into the team, so that we can provide WP DSGVO Tools as full GDPR compliant solution for Wordpress. WP DSGVO Tools by Shapepress has thus become WP DSGVO Tools (GDPR) by legalweb.io','shapepress-dsgvo')?></p>
51
+
52
+ <h4 class="card-subtitle"><?= __("What's new",'shapepress-dsgvo')?></h4>
53
+ <p class="card-text"><?= __('In general, the whole plugin has been redesigned from the ground up, features needed improved (integration of trackers, integration of the popup or the notice), unnecessary features removed (eg checkboxes for comments, registration, ..), the backend is more user-friendly and much more. One of our newest and for you one of the most important features is that we generate due to their settings / configuration individual, legally compliant data protection regulations, valid for the supported destination countries (at present AT and DE)','shapepress-dsgvo')?></p>
54
+
55
+ <h4 class="card-subtitle"><?= __("A look into the future",'shapepress-dsgvo')?></h4>
56
+ <p class="card-text"><?= __('In order to increase the compatibility of WP DSGVO tools (GDPR) many more integration are planned (YouTube, Google Maps, Facebook, ...) and also under development. In order to further and better support you in the topic of data protection, we will provide FAQs with the most common questions about data protection and GDPR, explanatory videos exclusively for premium customers in the future.','shapepress-dsgvo')?></p>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/class-sp-dsgvo-admin-action.php CHANGED
@@ -1,24 +1,24 @@
1
- <?php
2
-
3
- Class SPDSGVOAdminAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-common-action';
6
-
7
- protected function run(){
8
- $this->requireAdmin();
9
-
10
- SPDSGVOSettings::set('cb_spdsgvo_cl_vdv', $this->get('cb_spdsgvo_cl_vdv', '0'));
11
- SPDSGVOSettings::set('cb_spdsgvo_cl_filled_out', $this->get('cb_spdsgvo_cl_filled_out', '0'));
12
- SPDSGVOSettings::set('cb_spdsgvo_cl_maintainance', $this->get('cb_spdsgvo_cl_maintainance', '0'));
13
- SPDSGVOSettings::set('cb_spdsgvo_cl_security', $this->get('cb_spdsgvo_cl_security', '0'));
14
- SPDSGVOSettings::set('cb_spdsgvo_cl_hosting', $this->get('cb_spdsgvo_cl_hosting', '0'));
15
- SPDSGVOSettings::set('cb_spdsgvo_cl_plugins', $this->get('cb_spdsgvo_cl_plugins', '0'));
16
- SPDSGVOSettings::set('cb_spdsgvo_cl_experts', $this->get('cb_spdsgvo_cl_experts', '0'));
17
-
18
- $this->returnBack();
19
- }
20
- }
21
-
22
- SPDSGVOAdminAction::listen();
23
-
24
-
1
+ <?php
2
+
3
+ Class SPDSGVOAdminAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-common-action';
6
+
7
+ protected function run(){
8
+ $this->requireAdmin();
9
+
10
+ SPDSGVOSettings::set('cb_spdsgvo_cl_vdv', $this->get('cb_spdsgvo_cl_vdv', '0'));
11
+ SPDSGVOSettings::set('cb_spdsgvo_cl_filled_out', $this->get('cb_spdsgvo_cl_filled_out', '0'));
12
+ SPDSGVOSettings::set('cb_spdsgvo_cl_maintainance', $this->get('cb_spdsgvo_cl_maintainance', '0'));
13
+ SPDSGVOSettings::set('cb_spdsgvo_cl_security', $this->get('cb_spdsgvo_cl_security', '0'));
14
+ SPDSGVOSettings::set('cb_spdsgvo_cl_hosting', $this->get('cb_spdsgvo_cl_hosting', '0'));
15
+ SPDSGVOSettings::set('cb_spdsgvo_cl_plugins', $this->get('cb_spdsgvo_cl_plugins', '0'));
16
+ SPDSGVOSettings::set('cb_spdsgvo_cl_experts', $this->get('cb_spdsgvo_cl_experts', '0'));
17
+
18
+ $this->returnBack();
19
+ }
20
+ }
21
+
22
+ SPDSGVOAdminAction::listen();
23
+
24
+
admin/class-sp-dsgvo-admin-tab.php CHANGED
@@ -1,46 +1,60 @@
1
- <?php
2
-
3
- /**
4
- * Abstract class that provides boilerplate methods for an extension.
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Abstract class that provides boilerplate methods for an extension.
15
- *
16
- *
17
- * @since 1.0.0
18
- * @package WP DSGVO Tools
19
- * @subpackage WP DSGVO Tools/includes
20
- * @author Shapepress eU
21
- */
22
- abstract class SPDSGVOAdminTab{
23
-
24
- public $isHidden = false;
25
- public $isHighlighted = false;
26
-
27
- public function uri(){
28
- return sprintf('%sadmin.php?page=sp-dsgvo&tab=%s', get_admin_url(), $this->slug);
29
- }
30
-
31
- public function isHidden(){
32
- if(!isset($this->isHidden)){
33
- return false;
34
- }
35
-
36
- return $this->isHidden;
37
- }
38
-
39
- public function isHighlighted(){
40
- if(!isset($this->isHighlighted)){
41
- return false;
42
- }
43
-
44
- return $this->isHighlighted;
45
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  }
1
+ <?php
2
+
3
+ /**
4
+ * Abstract class that provides boilerplate methods for an extension.
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Abstract class that provides boilerplate methods for an extension.
15
+ *
16
+ *
17
+ * @since 1.0.0
18
+ * @package WP DSGVO Tools
19
+ * @subpackage WP DSGVO Tools/includes
20
+ * @author Shapepress eU
21
+ */
22
+ abstract class SPDSGVOAdminTab{
23
+
24
+ public $isHidden = false;
25
+ public $isHighlighted = false;
26
+
27
+ public function uri(){
28
+ return sprintf('%sadmin.php?page=sp-dsgvo&tab=%s', get_admin_url(), $this->slug);
29
+ }
30
+
31
+ public function isHidden(){
32
+ if(!isset($this->isHidden)){
33
+ return false;
34
+ }
35
+
36
+ return $this->isHidden;
37
+ }
38
+
39
+ public function isHighlighted(){
40
+ if(!isset($this->isHighlighted)){
41
+ return false;
42
+ }
43
+
44
+ return $this->isHighlighted;
45
+ }
46
+
47
+ public static function getClassName(){
48
+ return get_called_class();
49
+ }
50
+
51
+ public static function getTabTitle(){
52
+ $class = self::getClassName();
53
+ $reflection = new ReflectionClass($class);
54
+ $tab = $reflection->newInstanceWithoutConstructor();
55
+ if(!isset($tab->title)){
56
+ throw new Exception(__("Public property \$action not provied", 'shapepress-dsgvo'));
57
+ }
58
+ return $tab->title;
59
+ }
60
  }
admin/class-sp-dsgvo-admin.php CHANGED
@@ -1,315 +1,303 @@
1
- <?php
2
-
3
- /**
4
- * The admin-specific functionality of the plugin.
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/admin
11
- */
12
-
13
- /**
14
- * The admin-specific functionality of the plugin.
15
- *
16
- * Defines the plugin name, version, and two examples hooks for how to
17
- * enqueue the admin-specific stylesheet and JavaScript.
18
- *
19
- * @package WP DSGVO Tools
20
- * @subpackage WP DSGVO Tools/admin
21
- * @author Shapepress eU
22
- */
23
- class SPDSGVOAdmin{
24
-
25
-
26
- public $tabs = array();
27
-
28
- /**
29
- * Initialize the class and set its properties.
30
- *
31
- * @since 1.0.0
32
- * @param string $sp_dsgvo The name of this plugin.
33
- * @param string $version The version of this plugin.
34
- */
35
- public function __construct(){
36
- $this->tabs = array_merge(array(
37
- //'overview' => new SPDSGVOOverviewTab,
38
- 'common-settings' => new SPDSGVOCommonSettingsTab,
39
- 'cookie-notice' => new SPDSGVOCookieNoticeTab,
40
- 'services' => new SPDSGVOServicesTab,
41
- 'subject-access-request' => new SPDSGVOSubjectAccessRequestTab,
42
- 'super-unsubscribe' => new SPDSGVOSuperUnsubscribeTab,
43
- //'terms-conditions' => new SPDSGVOTermsConditionsTab,
44
- 'privacy-policy' => new SPDSGVOPrivacyPolicyTab,
45
- 'imprint' => new SPDSGVOImprintTab,
46
- 'integrations' => new SPDSGVOIntegrationsTab
47
- )
48
- );
49
-
50
- if (isValidPremiumEdition())
51
- {
52
- $this->tabs = array_merge( $this->tabs,SPDSGVOIntegration::getAllIntegrations());
53
-
54
- // Gravity Forms Tab
55
- if(class_exists('GFAPI')){
56
- $this->tabs = array_merge( $this->tabs, array('gravity-forms' => new SPDSGVOGravityFormsTab) );
57
- }
58
- }
59
-
60
- //$this->tabs = array_merge( $this->tabs, array('premium' => new SPDSGVOPremiumTab) );
61
- }
62
-
63
- public function menuItem()
64
- {
65
- global $submenu;
66
-
67
- $user = wp_get_current_user();
68
- $allowed_roles = array('administrator');
69
-
70
- if( array_intersect($allowed_roles, $user->roles ) || is_super_admin() ) {
71
-
72
-
73
- $svg = 'data:image/svg+xml;base64,'. base64_encode(file_get_contents(SPDSGVO::pluginDir('admin/images/logo.svg')));
74
- add_menu_page('WP DSGVO Tools', 'WP DSGVO Tools', 'manage_options', 'sp-dsgvo', array($this, 'adminPage'), $svg);
75
-
76
- //add_submenu_page('sp-dsgvo', 'Terms & Conditions', 'Terms & Conditions', 'manage_options', 'admin.php?page=sp-dsgvo&tab=terms-conditions');
77
- add_submenu_page('sp-dsgvo', __('Privacy policy','shapepress-dsgvo'), __('Privacy policy','shapepress-dsgvo'), 'manage_options', 'admin.php?page=sp-dsgvo&tab=privacy-policy');
78
- add_submenu_page('sp-dsgvo', __('Imprint','shapepress-dsgvo'), __('Imprint','shapepress-dsgvo'), 'manage_options', 'admin.php?page=sp-dsgvo&tab=imprint');
79
- //add_submenu_page('sp-dsgvo', 'Integrations', 'Integrations', 'manage_options', 'admin.php?page=sp-dsgvo&tab=integrations');
80
-
81
- $index = 8;
82
- $menu_slug = 'sp-dsgvo';
83
-
84
- $submenu[$menu_slug][$index++] = array(__('Experts Info','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/experten');
85
- $submenu[$menu_slug][$index++] = array(__('Legal advice','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/tipps-hilfe');
86
- $submenu[$menu_slug][$index++] = array(__('FAQ','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/faq');
87
- $submenu[$menu_slug][$index++] = array(__('About WP DSGVO Tools','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/about');
88
- }
89
- }
90
-
91
-
92
- public function adminPage(){
93
- $tabs = $this->tabs;
94
-
95
- if(isset($_GET['tab'])){
96
- $tab = sanitize_text_field($_GET['tab']);
97
- }else{
98
- $tab = 'common-settings';
99
- // if(in_array('setup', array_keys($this->tabs))){
100
- // $tab = 'setup';
101
- // }else{
102
- // $tab = 'overview';
103
- // }
104
- }
105
-
106
- include SPDSGVO::pluginDir('admin/base.php');
107
- }
108
-
109
- /**
110
- * Register the stylesheets for the admin area.
111
- *
112
- * @since 1.0.0
113
- */
114
- public function enqueue_styles(){
115
- wp_enqueue_style(sp_dsgvo_VERSION, plugin_dir_url(__FILE__). 'css/sp-dsgvo-admin.css', array(), sp_dsgvo_VERSION, 'all' );
116
- }
117
-
118
- /**
119
- * Register the JavaScript for the admin area.
120
- *
121
- * @since 1.0.0
122
- */
123
- public function enqueue_scripts(){
124
- /* i592995 */
125
- wp_enqueue_media();
126
- /* i592995 */
127
- wp_enqueue_script(sp_dsgvo_VERSION, plugin_dir_url(__FILE__). 'js/sp-dsgvo-admin.js', array('jquery'), sp_dsgvo_VERSION, false );
128
-
129
- /* i592995 */
130
- wp_localize_script(sp_dsgvo_VERSION, 'args', array(
131
- 'ajaxurl' => admin_url('admin-ajax.php'),
132
- 'dismiss_confirm' => __('Are you sure you want to dismiss this request?', 'shapepress-dsgvo')
133
- ));
134
- /* i592995 */
135
-
136
- }
137
-
138
-
139
-
140
- public function enqueueColorPicker($hook_suffix){
141
- wp_enqueue_style( 'wp-color-picker' );
142
- wp_enqueue_script( 'wp-color-picker');
143
- }
144
-
145
-
146
- public function addCustomPostStates($states, $post){
147
-
148
- $pages = array(
149
- SPDSGVOSettings::get('user_permissions_page') => __('Privacy settings user page','shapepress-dsgvo'),
150
- SPDSGVOSettings::get('super_unsubscribe_page') => __('Delete request page','shapepress-dsgvo'),
151
- SPDSGVOSettings::get('terms_conditions_page') => __('Terms page','shapepress-dsgvo'),
152
- SPDSGVOSettings::get('explicit_permission_page') => __('Explicit permissions page','shapepress-dsgvo'),
153
- SPDSGVOSettings::get('opt_out_page') => __('Opt Out page','shapepress-dsgvo'),
154
- SPDSGVOSettings::get('privacy_policy_page') => __('Privacy policy page','shapepress-dsgvo'),
155
- SPDSGVOSettings::get('sar_page') => __('Subject access request page','shapepress-dsgvo'),
156
- SPDSGVOSettings::get('imprint_page') => __('Imprint page','shapepress-dsgvo')
157
- );
158
-
159
- if(in_array($post->ID, array_keys($pages))){
160
- $states[] = $pages[$post->ID];
161
- }
162
-
163
- return $states;
164
- }
165
-
166
-
167
- /**
168
- * Filter: Adds Extra Column to users table
169
- *
170
- * @since 1.0.0
171
- * @author Shapepress eU
172
- */
173
- public function addExplicitPermissionColumn($column){
174
- $column['terms'] = 'Terms';
175
- return $column;
176
- }
177
-
178
- /**
179
- * Filter: Adds Extra Column to users table
180
- *
181
- * @since 1.0.0
182
- * @author Shapepress eU
183
- */
184
- public function explicitPermissionColumnCallback($val, $columnName, $userID){
185
- switch($columnName){
186
- case 'terms':
187
- return (hasUserAgreedToTerms($userID))? '<span class="dashicons dashicons-yes"></span>' : '<span class="dashicons dashicons-no"></span>' ;
188
- break;
189
-
190
- default:
191
- return '';
192
- }
193
-
194
- return '';
195
- }
196
-
197
-
198
- /**
199
- * Hook: Displays User Permission status
200
- *
201
- * @since 1.0.0
202
- * @author Shapepress eU
203
- * @param WP_User $user
204
- */
205
- public function showPermissonStatus($user){
206
- ?>
207
- <h2><?php _e('Privacy settings of the user','shapepress-dsgvo')?></h2>
208
- <table class="form-table">
209
- <tbody>
210
-
211
- <tr class="user-profile-picture">
212
- <th><?php _e('Dienste','shapepress-dsgvo')?></th>
213
- <td>
214
- <ul>
215
- <?php foreach(SPDSGVOSettings::get('services') as $slug => $service): ?>
216
- <li>
217
- <strong><?= $service['name'] ?>:</strong>
218
- <?= (hasUserGivenPermissionFor($service['slug']))? '<span class="dashicons dashicons-yes"></span>' : '<span class="dashicons dashicons-no"></span>' ?>
219
- </li>
220
- <?php endforeach; ?>
221
- </ul>
222
- </td>
223
- </tr>
224
-
225
- </tbody>
226
- </table>
227
- <?php
228
- }
229
-
230
-
231
- /*
232
- * Gravity Forms Action
233
- */
234
- public function gf_after_submisison_cleanse( $entry, $form ){
235
-
236
- // DELETE ALL ENTRIES
237
- if( SPDSGVOSettings::get('gf_save_no_data') ){
238
- GFAPI::delete_entry( $entry['id'] );
239
- return;
240
- }
241
-
242
- // DELETE IP and USER AGENT
243
- if( SPDSGVOSettings::get('gf_no_ip_meta') ){
244
- GFAPI::update_entry_property( $entry['id'], 'ip', '' );
245
- GFAPI::update_entry_property( $entry['id'], 'user_agent', '' );
246
- }
247
-
248
- // update fields to 'removed' that have been selected as 'do not save'
249
- $fields_to_delete = SPDSGVOSettings::get('gf_save_no_');
250
- if( !is_array($fields_to_delete) ){
251
- return;
252
- }
253
- if( isset($fields_to_delete[$form['id']]) ){
254
- foreach($fields_to_delete[$form['id']] as $field_id=>$check){
255
- if(!$check){
256
- continue;
257
- }
258
-
259
- if( isset($entry[$field_id]) ){
260
- // single level data
261
- GFAPI::update_entry_field( $entry['id'], $field_id, 'Removed' );
262
- } else {
263
- // multi level data (eg checkbox)
264
- $fields = preg_grep("/^".$field_id.".([0-9]*)$/", array_keys($entry)); // find keys like 2.1, 2.2 etc
265
-
266
- foreach( $fields as $field_id_key){
267
- if( $entry[$field_id_key] != '' ){
268
- GFAPI::update_entry_field( $entry['id'], $field_id_key, 'Removed' );
269
- }
270
- }
271
- }
272
-
273
- }
274
- }
275
-
276
- }
277
-
278
- function dsvgvo_admin_notices() {
279
-
280
- if (SPDSGVOSettings::get('google_gdpr_refresh_notice') != '1') {
281
- $class = 'notice notice-warning is-dismissible google-gdpr-refresh-notice';
282
- $message = __( 'Attention. Google has changed his GDPR texts. Please refresh your Privacy Policy by pressing "Reload ... template" button under privacy policy settings.', 'shapepress-dsgvo' );
283
-
284
- printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
285
- }
286
-
287
- if (isPremiumEdition() && SPDSGVOSettings::get('show_invalid_license_notice') != '0')
288
- {
289
- $class = 'notice notice-warning is-dismissible license-invalid-notice';
290
- $message = __( 'Attention. Your license is not valid any more. Please check WP DSGVO Tools settings to extend your license or visit <a href="URL_HERE" target="_blank">https://wp-dsgvo.eu/shop</a> to extend it.', 'shapepress-dsgvo' );
291
- $message = str_replace('URL_HERE', getExtensionProductUrl(), $message);
292
-
293
- printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
294
- }
295
-
296
- if (isPremiumEdition() && SPDSGVOSettings::get('show_revoke_license_notice') === '1')
297
- {
298
- $class = 'notice notice-warning is-dismissible license-revoke-notice';
299
- $message = __( 'Attention. Your license is going to get invalid in a few days. Please check WP DSGVO Tools settings to extend your license or visit <a href="URL_HERE" target="_blank">https://wp-dsgvo.eu/shop</a> to extend it.', 'shapepress-dsgvo' );
300
- $message = str_replace('URL_HERE', getExtensionProductUrl(), $message);
301
-
302
- printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
303
- }
304
- }
305
-
306
- function showUpgradeMessage($currentPluginMetadata, $newPluginMetadata)
307
- {
308
- if (isset($newPluginMetadata->upgrade_notice) && strlen(trim($newPluginMetadata->upgrade_notice)) > 0){
309
- $output = '<div class="sp-dsgvo_plugin_upgrade_notice"><div class="header">'. __('Important Upgrade Notice:','shapepress-dsgvo') .'</div> ';
310
- $output .= $newPluginMetadata->upgrade_notice . '</div>';
311
- $output = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $output);
312
- echo $output;
313
- }
314
- }
315
- }
1
+ <?php
2
+
3
+ /**
4
+ * The admin-specific functionality of the plugin.
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/admin
11
+ */
12
+
13
+ /**
14
+ * The admin-specific functionality of the plugin.
15
+ *
16
+ * Defines the plugin name, version, and two examples hooks for how to
17
+ * enqueue the admin-specific stylesheet and JavaScript.
18
+ *
19
+ * @package WP DSGVO Tools
20
+ * @subpackage WP DSGVO Tools/admin
21
+ * @author Shapepress eU
22
+ */
23
+ class SPDSGVOAdmin{
24
+
25
+
26
+ public $tabs = array();
27
+
28
+ /**
29
+ * Initialize the class and set its properties.
30
+ *
31
+ * @since 1.0.0
32
+ * @param string $sp_dsgvo The name of this plugin.
33
+ * @param string $version The version of this plugin.
34
+ */
35
+ public function __construct(){
36
+ $this->tabs = array_merge(array(
37
+ //'overview' => new SPDSGVOOverviewTab,
38
+ 'common-settings' => new SPDSGVOCommonSettingsTab,
39
+ 'cookie-notice' => new SPDSGVOCookieNoticeTab,
40
+ 'operator' => new SPDSGVOOperatorTab,
41
+ 'page-basics' => new SPDSGVOPageBasicsTab,
42
+ 'statistic-integrations' => new SPDSGVOStatisticIntegrationsTab,
43
+ 'targeting-integrations' => new SPDSGVOTargetingIntegrationsTab,
44
+ 'subject-access-request' => new SPDSGVOSubjectAccessRequestTab,
45
+ 'super-unsubscribe' => new SPDSGVOSuperUnsubscribeTab,
46
+ 'integrations' => new SPDSGVOIntegrationsTab,
47
+ 'info' => new SPDSGVOInfoTab
48
+ ));
49
+
50
+ if (isValidPremiumEdition())
51
+ {
52
+ // Gravity Forms Tab
53
+ if(class_exists('GFAPI')){
54
+ $this->tabs = array_merge( $this->tabs, array('gravity-forms' => new SPDSGVOGravityFormsTab) );
55
+ }
56
+ }
57
+ }
58
+
59
+ public function menuItem()
60
+ {
61
+ global $submenu;
62
+
63
+ $user = wp_get_current_user();
64
+ $allowed_roles = array('administrator');
65
+
66
+ if( array_intersect($allowed_roles, $user->roles ) || is_super_admin() ) {
67
+
68
+
69
+ $svg = 'data:image/svg+xml;base64,'. base64_encode(file_get_contents(SPDSGVO::pluginDir('public/images/legalwebio-logo-icon-white.svg')));
70
+ add_menu_page('WP DSGVO Tools', 'WP DSGVO Tools', 'manage_options', 'sp-dsgvo', array($this, 'adminPage'), $svg, null);
71
+
72
+ //add_submenu_page('sp-dsgvo', __('V3 definitely read','shapepress-dsgvo'), __('V3 definitely read','shapepress-dsgvo'), 'manage_options', 'admin.php?page=sp-dsgvo&tab=info');
73
+
74
+ add_submenu_page('sp-dsgvo', __('Common','shapepress-dsgvo'), __('Common','shapepress-dsgvo'), 'manage_options', 'sp-dsgvo', array($this, 'adminPage'));
75
+
76
+
77
+ $first = true;
78
+ foreach($this->tabs as $t):
79
+ if ($first === true) {
80
+ $first = false;
81
+ continue;
82
+ }
83
+ if(!$t->isHidden()):
84
+ add_submenu_page('sp-dsgvo', $t->title, $t->title, 'manage_options', 'admin.php?page=sp-dsgvo&tab='.$t->slug);
85
+
86
+ endif;
87
+ endforeach;
88
+
89
+ //add_submenu_page('sp-dsgvo', 'Terms & Conditions', 'Terms & Conditions', 'manage_options', 'admin.php?page=sp-dsgvo&tab=terms-conditions');
90
+ //add_submenu_page('sp-dsgvo', __('Privacy policy','shapepress-dsgvo'), __('Privacy policy','shapepress-dsgvo'), 'manage_options', 'admin.php?page=sp-dsgvo&tab=privacy-policy');
91
+ //add_submenu_page('sp-dsgvo', __('Imprint','shapepress-dsgvo'), __('Imprint','shapepress-dsgvo'), 'manage_options', 'admin.php?page=sp-dsgvo&tab=imprint');
92
+ //add_submenu_page('sp-dsgvo', 'Integrations', 'Integrations', 'manage_options', 'admin.php?page=sp-dsgvo&tab=integrations');
93
+
94
+
95
+
96
+ $index = 6 + count($this->tabs);
97
+ $menu_slug = 'sp-dsgvo';
98
+
99
+ //$submenu[$menu_slug][$index++] = array(__('Experts Info','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/experten');
100
+ //$submenu[$menu_slug][$index++] = array(__('Legal advice','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/tipps-hilfe');
101
+ $submenu[$menu_slug][$index++] = array(__('FAQ','shapepress-dsgvo'), 'manage_options', 'https://legalweb.io/wp-content/uploads/2019/11/mr-legalweb_web.pdf');
102
+ //$submenu[$menu_slug][$index++] = array(__('About WP DSGVO Tools','shapepress-dsgvo'), 'manage_options', 'https://wp-dsgvo.eu/about');
103
+ $submenu[$menu_slug][$index++] = array(__('About legal web','shapepress-dsgvo'), 'manage_options', 'https://legalweb.io');
104
+ }
105
+ }
106
+
107
+
108
+ public function adminPage(){
109
+ $tabs = $this->tabs;
110
+
111
+ if(isset($_GET['tab'])){
112
+ $tab = sanitize_text_field($_GET['tab']);
113
+ }else{
114
+ $tab = 'common-settings';
115
+ // if(in_array('setup', array_keys($this->tabs))){
116
+ // $tab = 'setup';
117
+ // }else{
118
+ // $tab = 'overview';
119
+ // }
120
+ }
121
+
122
+ include SPDSGVO::pluginDir('admin/base.php');
123
+ }
124
+
125
+ /**
126
+ * Register the stylesheets for the admin area.
127
+ *
128
+ * @since 1.0.0
129
+ */
130
+ public function enqueue_styles(){
131
+ wp_enqueue_style(sp_dsgvo_NAME.'-bootstrap', plugin_dir_url(__FILE__). 'css/bootstrap.min.css', array(), sp_dsgvo_VERSION, 'all' );
132
+ wp_enqueue_style(sp_dsgvo_NAME, plugin_dir_url(__FILE__). 'css/sp-dsgvo-admin.css', array(), sp_dsgvo_VERSION, 'all' );
133
+ }
134
+
135
+ /**
136
+ * Register the JavaScript for the admin area.
137
+ *
138
+ * @since 1.0.0
139
+ */
140
+ public function enqueue_scripts(){
141
+ /* i592995 */
142
+ wp_enqueue_media();
143
+ /* i592995 */
144
+ wp_enqueue_script(sp_dsgvo_NAME, plugin_dir_url(__FILE__). 'js/sp-dsgvo-admin.js', array('jquery'), sp_dsgvo_VERSION, false );
145
+
146
+ /* i592995 */
147
+ wp_localize_script(sp_dsgvo_NAME, 'args', array(
148
+ 'ajaxurl' => admin_url('admin-ajax.php'),
149
+ 'dismiss_confirm' => __('Are you sure you want to dismiss this request?', 'shapepress-dsgvo')
150
+ ));
151
+
152
+ // wp_enqueue_script(sp_dsgvo_NAME.'-bootstrap', plugin_dir_url(__FILE__). 'js/bootstrap-min.js', array('jquery'), sp_dsgvo_VERSION, false );
153
+
154
+
155
+ }
156
+
157
+
158
+
159
+ public function enqueueColorPicker($hook_suffix){
160
+ wp_enqueue_style( 'wp-color-picker' );
161
+ wp_enqueue_script( 'wp-color-picker');
162
+ }
163
+
164
+
165
+ public function addCustomPostStates($states, $post){
166
+
167
+ $pages = array(
168
+ SPDSGVOSettings::get('user_permissions_page') => __('Privacy settings user page','shapepress-dsgvo'),
169
+ SPDSGVOSettings::get('super_unsubscribe_page') => __('Delete request page','shapepress-dsgvo'),
170
+ SPDSGVOSettings::get('terms_conditions_page') => __('Terms page','shapepress-dsgvo'),
171
+ SPDSGVOSettings::get('explicit_permission_page') => __('Explicit permissions page','shapepress-dsgvo'),
172
+ SPDSGVOSettings::get('opt_out_page') => __('Opt Out page','shapepress-dsgvo'),
173
+ SPDSGVOSettings::get('privacy_policy_page') => __('Privacy policy page','shapepress-dsgvo'),
174
+ SPDSGVOSettings::get('sar_page') => __('Subject access request page','shapepress-dsgvo'),
175
+ SPDSGVOSettings::get('imprint_page') => __('Imprint page','shapepress-dsgvo')
176
+ );
177
+
178
+ if(in_array($post->ID, array_keys($pages))){
179
+ $states[] = $pages[$post->ID];
180
+ }
181
+
182
+ return $states;
183
+ }
184
+
185
+
186
+ /**
187
+ * Filter: Adds Extra Column to users table
188
+ *
189
+ * @since 1.0.0
190
+ * @author Shapepress eU
191
+ */
192
+ public function addExplicitPermissionColumn($column){
193
+ $column['terms'] = 'Terms';
194
+ return $column;
195
+ }
196
+
197
+
198
+ /*
199
+ * Gravity Forms Action
200
+ */
201
+ public function gf_after_submisison_cleanse( $entry, $form ){
202
+
203
+ // DELETE ALL ENTRIES
204
+ if( SPDSGVOSettings::get('gf_save_no_data') ){
205
+ GFAPI::delete_entry( $entry['id'] );
206
+ return;
207
+ }
208
+
209
+ // DELETE IP and USER AGENT
210
+ if( SPDSGVOSettings::get('gf_no_ip_meta') ){
211
+ GFAPI::update_entry_property( $entry['id'], 'ip', '' );
212
+ GFAPI::update_entry_property( $entry['id'], 'user_agent', '' );
213
+ }
214
+
215
+ // update fields to 'removed' that have been selected as 'do not save'
216
+ $fields_to_delete = SPDSGVOSettings::get('gf_save_no_');
217
+ if( !is_array($fields_to_delete) ){
218
+ return;
219
+ }
220
+ if( isset($fields_to_delete[$form['id']]) ){
221
+ foreach($fields_to_delete[$form['id']] as $field_id=>$check){
222
+ if(!$check){
223
+ continue;
224
+ }
225
+
226
+ if( isset($entry[$field_id]) ){
227
+ // single level data
228
+ GFAPI::update_entry_field( $entry['id'], $field_id, 'Removed' );
229
+ } else {
230
+ // multi level data (eg checkbox)
231
+ $fields = preg_grep("/^".$field_id.".([0-9]*)$/", array_keys($entry)); // find keys like 2.1, 2.2 etc
232
+
233
+ foreach( $fields as $field_id_key){
234
+ if( $entry[$field_id_key] != '' ){
235
+ GFAPI::update_entry_field( $entry['id'], $field_id_key, 'Removed' );
236
+ }
237
+ }
238
+ }
239
+
240
+ }
241
+ }
242
+
243
+ }
244
+
245
+ function dsvgvo_admin_notices() {
246
+
247
+ if (SPDSGVOSettings::get('google_gdpr_refresh_notice') != '1') {
248
+ $class = 'notice notice-warning is-dismissible google-gdpr-refresh-notice';
249
+ $message = __( 'Attention. Google has changed his GDPR texts. Please refresh your Privacy Policy by pressing "Reload ... template" button under privacy policy settings.', 'shapepress-dsgvo' );
250
+
251
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
252
+ }
253
+
254
+ if (isPremiumEdition() && SPDSGVOSettings::get('show_invalid_license_notice') != '0')
255
+ {
256
+ $class = 'notice notice-warning is-dismissible license-invalid-notice';
257
+ $message = __( 'Attention. Your license is not valid any more. Please check WP DSGVO Tools settings to extend your license or visit <a href="URL_HERE" target="_blank">https://wp-dsgvo.eu/shop</a> to extend it.', 'shapepress-dsgvo' );
258
+ $message = str_replace('URL_HERE', getExtensionProductUrl(), $message);
259
+
260
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
261
+ }
262
+
263
+ if (isPremiumEdition() && SPDSGVOSettings::get('show_revoke_license_notice') === '1')
264
+ {
265
+ $class = 'notice notice-warning is-dismissible license-revoke-notice';
266
+ $message = __( 'Attention. Your license is going to get invalid in a few days. Please check WP DSGVO Tools settings to extend your license or visit <a href="URL_HERE" target="_blank">https://wp-dsgvo.eu/shop</a> to extend it.', 'shapepress-dsgvo' );
267
+ $message = str_replace('URL_HERE', getExtensionProductUrl(), $message);
268
+
269
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
270
+ }
271
+
272
+ if (SPDSGVOSettings::get('show_notice_privacy_policy_texts_outdated') === '1')
273
+ {
274
+ $class = 'notice notice-warning is-dismissible privacy-policy-texts-outdated-notice';
275
+ $message = __( 'Attention. There are newer texts for the privacy policy. Please refresh them ensure compliance. <a href="#" class="privacy-policy-texts-refresh-link">Refresh Texts</a>', 'shapepress-dsgvo' );
276
+ //$url = admin_url( '/admin.php?page=sp-dsgvo&action='.SPDSGVOUpdatePrivacyPolicyTextsAction::getActionName(), 'https' );
277
+ //$message = str_replace('URL_HERE', $url, $message);
278
+
279
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
280
+ }
281
+
282
+ if (SPDSGVOSettings::get('show_notice_update_check_settings') === '1')
283
+ {
284
+ $class = 'notice notice-warning is-dismissible update-check-settings-notice';
285
+ $message = __( 'Attention. Due to our mayor update you need to check all settings of WP DSGVO Tools (GDPR), especially page opator setting to ensure that the plugin outputs legal compliant texts. Also select the correct country to ensure to get the corect text base. We are sorry for this additional work, but otherwise we cant produce legal compliant texts for privacy policy, popup and the imprint.', 'shapepress-dsgvo' );
286
+
287
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), $message );
288
+ }
289
+ }
290
+
291
+ function showUpgradeMessage($currentPluginMetadata, $newPluginMetadata)
292
+ {
293
+ // currently we use the inbuilt methods for displaying the notice
294
+ //(new SPDSGVOUpgradeNoticeTools())->in_plugin_update_message($data, $response);
295
+ if (isset($newPluginMetadata->upgrade_notice) && strlen(trim($newPluginMetadata->upgrade_notice)) > 0){
296
+ $output = '<div class="sp-dsgvo_plugin_upgrade_notice"><div class="header">'. __('Important Upgrade Notice:','shapepress-dsgvo') .'</div> ';
297
+ $output .= $newPluginMetadata->upgrade_notice . '</div>';
298
+ $output = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $output);
299
+ echo $output;
300
+ }
301
+ }
302
+
303
+ }
 
 
 
 
 
 
 
 
 
 
 
 
admin/css/bootstrap.min.css ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootswatch v4.3.1
3
+ * Homepage: https://bootswatch.com
4
+ * Copyright 2012-2019 Thomas Park
5
+ * Licensed under MIT
6
+ * Based on Bootstrap
7
+ @import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700");.sp-dsgvo{/*!
8
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
9
+ * Copyright 2011-2019 The Bootstrap Authors
10
+ * Copyright 2011-2019 Twitter, Inc.
11
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
12
+
13
+ */}.sp-dsgvo :root{--blue: #008cba;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #F04124;--orange: #fd7e14;--yellow: #E99002;--green: #43ac6a;--teal: #20c997;--cyan: #5bc0de;--white: #fff;--gray: #888;--gray-dark: #333;--primary: #008cba;--secondary: #eee;--success: #43ac6a;--info: #5bc0de;--warning: #E99002;--danger: #F04124;--light: #eee;--dark: #222;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}.sp-dsgvo *,.sp-dsgvo *::before,.sp-dsgvo *::after{-webkit-box-sizing:border-box;box-sizing:border-box}.sp-dsgvo html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sp-dsgvo article,.sp-dsgvo aside,.sp-dsgvo figcaption,.sp-dsgvo figure,.sp-dsgvo footer,.sp-dsgvo header,.sp-dsgvo hgroup,.sp-dsgvo main,.sp-dsgvo nav,.sp-dsgvo section{display:block}.sp-dsgvo body{margin:0;font-family:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:0.9375rem;font-weight:400;line-height:1.5;color:#222;text-align:left;background-color:#fff}.sp-dsgvo [tabindex="-1"]:focus{outline:0 !important}.sp-dsgvo hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}.sp-dsgvo h1,.sp-dsgvo h2,.sp-dsgvo h3,.sp-dsgvo h4,.sp-dsgvo h5,.sp-dsgvo h6{margin-top:0;margin-bottom:0.5rem}.sp-dsgvo p{margin-top:0;margin-bottom:1rem}.sp-dsgvo abbr[title],.sp-dsgvo abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}.sp-dsgvo address{margin-bottom:1rem;font-style:normal;line-height:inherit}.sp-dsgvo ol,.sp-dsgvo ul,.sp-dsgvo dl{margin-top:0;margin-bottom:1rem}.sp-dsgvo ol ol,.sp-dsgvo ul ul,.sp-dsgvo ol ul,.sp-dsgvo ul ol{margin-bottom:0}.sp-dsgvo dt{font-weight:700}.sp-dsgvo dd{margin-bottom:.5rem;margin-left:0}.sp-dsgvo blockquote{margin:0 0 1rem}.sp-dsgvo b,.sp-dsgvo strong{font-weight:bolder}.sp-dsgvo small{font-size:80%}.sp-dsgvo sub,.sp-dsgvo sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.sp-dsgvo sub{bottom:-.25em}.sp-dsgvo sup{top:-.5em}.sp-dsgvo a{color:#008cba;text-decoration:none;background-color:transparent}.sp-dsgvo a:hover{color:#00526e;text-decoration:underline}.sp-dsgvo a:not([href]):not([tabindex]){color:inherit;text-decoration:none}.sp-dsgvo a:not([href]):not([tabindex]):hover,.sp-dsgvo a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}.sp-dsgvo a:not([href]):not([tabindex]):focus{outline:0}.sp-dsgvo pre,.sp-dsgvo code,.sp-dsgvo kbd,.sp-dsgvo samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}.sp-dsgvo pre{margin-top:0;margin-bottom:1rem;overflow:auto}.sp-dsgvo figure{margin:0 0 1rem}.sp-dsgvo img{vertical-align:middle;border-style:none}.sp-dsgvo svg{overflow:hidden;vertical-align:middle}.sp-dsgvo table{border-collapse:collapse}.sp-dsgvo caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#888;text-align:left;caption-side:bottom}.sp-dsgvo th{text-align:inherit}.sp-dsgvo label{display:inline-block;margin-bottom:0.5rem}.sp-dsgvo button{border-radius:0}.sp-dsgvo button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.sp-dsgvo input,.sp-dsgvo button,.sp-dsgvo select,.sp-dsgvo optgroup,.sp-dsgvo textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}.sp-dsgvo button,.sp-dsgvo input{overflow:visible}.sp-dsgvo button,.sp-dsgvo select{text-transform:none}.sp-dsgvo select{word-wrap:normal}.sp-dsgvo button,.sp-dsgvo [type="button"],.sp-dsgvo [type="reset"],.sp-dsgvo [type="submit"]{-webkit-appearance:button}.sp-dsgvo button:not(:disabled),.sp-dsgvo [type="button"]:not(:disabled),.sp-dsgvo [type="reset"]:not(:disabled),.sp-dsgvo [type="submit"]:not(:disabled){cursor:pointer}.sp-dsgvo button::-moz-focus-inner,.sp-dsgvo [type="button"]::-moz-focus-inner,.sp-dsgvo [type="reset"]::-moz-focus-inner,.sp-dsgvo [type="submit"]::-moz-focus-inner{padding:0;border-style:none}.sp-dsgvo input[type="radio"],.sp-dsgvo input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}.sp-dsgvo input[type="date"],.sp-dsgvo input[type="time"],.sp-dsgvo input[type="datetime-local"],.sp-dsgvo input[type="month"]{-webkit-appearance:listbox}.sp-dsgvo textarea{overflow:auto;resize:vertical}.sp-dsgvo fieldset{min-width:0;padding:0;margin:0;border:0}.sp-dsgvo legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}.sp-dsgvo progress{vertical-align:baseline}.sp-dsgvo [type="number"]::-webkit-inner-spin-button,.sp-dsgvo [type="number"]::-webkit-outer-spin-button{height:auto}.sp-dsgvo [type="search"]{outline-offset:-2px;-webkit-appearance:none}.sp-dsgvo [type="search"]::-webkit-search-decoration{-webkit-appearance:none}.sp-dsgvo ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}.sp-dsgvo output{display:inline-block}.sp-dsgvo summary{display:list-item;cursor:pointer}.sp-dsgvo template{display:none}.sp-dsgvo [hidden]{display:none !important}.sp-dsgvo h1,.sp-dsgvo h2,.sp-dsgvo h3,.sp-dsgvo h4,.sp-dsgvo h5,.sp-dsgvo h6,.sp-dsgvo .h1,.sp-dsgvo .h2,.sp-dsgvo .h3,.sp-dsgvo .h4,.sp-dsgvo .h5,.sp-dsgvo .h6{margin-bottom:0.5rem;font-weight:300;line-height:1.2}.sp-dsgvo h1,.sp-dsgvo .h1{font-size:2.34375rem}.sp-dsgvo h2,.sp-dsgvo .h2{font-size:1.875rem}.sp-dsgvo h3,.sp-dsgvo .h3{font-size:1.640625rem}.sp-dsgvo h4,.sp-dsgvo .h4{font-size:1.40625rem}.sp-dsgvo h5,.sp-dsgvo .h5{font-size:1.171875rem}.sp-dsgvo h6,.sp-dsgvo .h6{font-size:0.9375rem}.sp-dsgvo .lead{font-size:1.171875rem;font-weight:300}.sp-dsgvo .display-1{font-size:6rem;font-weight:300;line-height:1.2}.sp-dsgvo .display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.sp-dsgvo .display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.sp-dsgvo .display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.sp-dsgvo hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}.sp-dsgvo small,.sp-dsgvo .small{font-size:80%;font-weight:400}.sp-dsgvo mark,.sp-dsgvo .mark{padding:0.2em;background-color:#fcf8e3}.sp-dsgvo .list-unstyled{padding-left:0;list-style:none}.sp-dsgvo .list-inline{padding-left:0;list-style:none}.sp-dsgvo .list-inline-item{display:inline-block}.sp-dsgvo .list-inline-item:not(:last-child){margin-right:0.5rem}.sp-dsgvo .initialism{font-size:90%;text-transform:uppercase}.sp-dsgvo .blockquote{margin-bottom:1rem;font-size:1.171875rem}.sp-dsgvo .blockquote-footer{display:block;font-size:80%;color:#888}.sp-dsgvo .blockquote-footer::before{content:"\2014\00A0"}.sp-dsgvo .img-fluid{max-width:100%;height:auto}.sp-dsgvo .img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0px;max-width:100%;height:auto}.sp-dsgvo .figure{display:inline-block}.sp-dsgvo .figure-img{margin-bottom:0.5rem;line-height:1}.sp-dsgvo .figure-caption{font-size:90%;color:#888}.sp-dsgvo code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>.sp-dsgvo code{color:inherit}.sp-dsgvo kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#222;border-radius:0px}.sp-dsgvo kbd kbd{padding:0;font-size:100%;font-weight:700}.sp-dsgvo pre{display:block;font-size:87.5%;color:#222}.sp-dsgvo pre code{font-size:inherit;color:inherit;word-break:normal}.sp-dsgvo .pre-scrollable{max-height:340px;overflow-y:scroll}.sp-dsgvo .container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.sp-dsgvo .container{max-width:540px}}@media (min-width: 768px){.sp-dsgvo .container{max-width:720px}}@media (min-width: 992px){.sp-dsgvo .container{max-width:960px}}@media (min-width: 1200px){.sp-dsgvo .container{max-width:1140px}}.sp-dsgvo .container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.sp-dsgvo .row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.sp-dsgvo .no-gutters{margin-right:0;margin-left:0}.sp-dsgvo .no-gutters>.col,.sp-dsgvo .no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.sp-dsgvo .col-1,.sp-dsgvo .col-2,.sp-dsgvo .col-3,.sp-dsgvo .col-4,.sp-dsgvo .col-5,.sp-dsgvo .col-6,.sp-dsgvo .col-7,.sp-dsgvo .col-8,.sp-dsgvo .col-9,.sp-dsgvo .col-10,.sp-dsgvo .col-11,.sp-dsgvo .col-12,.sp-dsgvo .col,.sp-dsgvo .col-auto,.sp-dsgvo .col-sm-1,.sp-dsgvo .col-sm-2,.sp-dsgvo .col-sm-3,.sp-dsgvo .col-sm-4,.sp-dsgvo .col-sm-5,.sp-dsgvo .col-sm-6,.sp-dsgvo .col-sm-7,.sp-dsgvo .col-sm-8,.sp-dsgvo .col-sm-9,.sp-dsgvo .col-sm-10,.sp-dsgvo .col-sm-11,.sp-dsgvo .col-sm-12,.sp-dsgvo .col-sm,.sp-dsgvo .col-sm-auto,.sp-dsgvo .col-md-1,.sp-dsgvo .col-md-2,.sp-dsgvo .col-md-3,.sp-dsgvo .col-md-4,.sp-dsgvo .col-md-5,.sp-dsgvo .col-md-6,.sp-dsgvo .col-md-7,.sp-dsgvo .col-md-8,.sp-dsgvo .col-md-9,.sp-dsgvo .col-md-10,.sp-dsgvo .col-md-11,.sp-dsgvo .col-md-12,.sp-dsgvo .col-md,.sp-dsgvo .col-md-auto,.sp-dsgvo .col-lg-1,.sp-dsgvo .col-lg-2,.sp-dsgvo .col-lg-3,.sp-dsgvo .col-lg-4,.sp-dsgvo .col-lg-5,.sp-dsgvo .col-lg-6,.sp-dsgvo .col-lg-7,.sp-dsgvo .col-lg-8,.sp-dsgvo .col-lg-9,.sp-dsgvo .col-lg-10,.sp-dsgvo .col-lg-11,.sp-dsgvo .col-lg-12,.sp-dsgvo .col-lg,.sp-dsgvo .col-lg-auto,.sp-dsgvo .col-xl-1,.sp-dsgvo .col-xl-2,.sp-dsgvo .col-xl-3,.sp-dsgvo .col-xl-4,.sp-dsgvo .col-xl-5,.sp-dsgvo .col-xl-6,.sp-dsgvo .col-xl-7,.sp-dsgvo .col-xl-8,.sp-dsgvo .col-xl-9,.sp-dsgvo .col-xl-10,.sp-dsgvo .col-xl-11,.sp-dsgvo .col-xl-12,.sp-dsgvo .col-xl,.sp-dsgvo .col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.sp-dsgvo .col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.sp-dsgvo .col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.sp-dsgvo .col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.sp-dsgvo .col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.sp-dsgvo .col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.sp-dsgvo .col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.sp-dsgvo .col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.sp-dsgvo .col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.sp-dsgvo .col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.sp-dsgvo .col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.sp-dsgvo .col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.sp-dsgvo .col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.sp-dsgvo .col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.sp-dsgvo .col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.sp-dsgvo .order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.sp-dsgvo .order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.sp-dsgvo .order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.sp-dsgvo .order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.sp-dsgvo .order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.sp-dsgvo .order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.sp-dsgvo .order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.sp-dsgvo .order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.sp-dsgvo .order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.sp-dsgvo .order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.sp-dsgvo .order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.sp-dsgvo .order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.sp-dsgvo .order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.sp-dsgvo .order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.sp-dsgvo .order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.sp-dsgvo .offset-1{margin-left:8.3333333333%}.sp-dsgvo .offset-2{margin-left:16.6666666667%}.sp-dsgvo .offset-3{margin-left:25%}.sp-dsgvo .offset-4{margin-left:33.3333333333%}.sp-dsgvo .offset-5{margin-left:41.6666666667%}.sp-dsgvo .offset-6{margin-left:50%}.sp-dsgvo .offset-7{margin-left:58.3333333333%}.sp-dsgvo .offset-8{margin-left:66.6666666667%}.sp-dsgvo .offset-9{margin-left:75%}.sp-dsgvo .offset-10{margin-left:83.3333333333%}.sp-dsgvo .offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.sp-dsgvo .col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.sp-dsgvo .col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.sp-dsgvo .col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.sp-dsgvo .col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.sp-dsgvo .col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.sp-dsgvo .col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.sp-dsgvo .col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.sp-dsgvo .col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.sp-dsgvo .col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.sp-dsgvo .col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.sp-dsgvo .col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.sp-dsgvo .col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.sp-dsgvo .col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.sp-dsgvo .col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.sp-dsgvo .order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.sp-dsgvo .order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.sp-dsgvo .order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.sp-dsgvo .order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.sp-dsgvo .order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.sp-dsgvo .order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.sp-dsgvo .order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.sp-dsgvo .order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.sp-dsgvo .order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.sp-dsgvo .order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.sp-dsgvo .order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.sp-dsgvo .order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.sp-dsgvo .order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.sp-dsgvo .order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.sp-dsgvo .order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.sp-dsgvo .offset-sm-0{margin-left:0}.sp-dsgvo .offset-sm-1{margin-left:8.3333333333%}.sp-dsgvo .offset-sm-2{margin-left:16.6666666667%}.sp-dsgvo .offset-sm-3{margin-left:25%}.sp-dsgvo .offset-sm-4{margin-left:33.3333333333%}.sp-dsgvo .offset-sm-5{margin-left:41.6666666667%}.sp-dsgvo .offset-sm-6{margin-left:50%}.sp-dsgvo .offset-sm-7{margin-left:58.3333333333%}.sp-dsgvo .offset-sm-8{margin-left:66.6666666667%}.sp-dsgvo .offset-sm-9{margin-left:75%}.sp-dsgvo .offset-sm-10{margin-left:83.3333333333%}.sp-dsgvo .offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.sp-dsgvo .col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.sp-dsgvo .col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.sp-dsgvo .col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.sp-dsgvo .col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.sp-dsgvo .col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.sp-dsgvo .col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.sp-dsgvo .col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.sp-dsgvo .col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.sp-dsgvo .col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.sp-dsgvo .col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.sp-dsgvo .col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.sp-dsgvo .col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.sp-dsgvo .col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.sp-dsgvo .col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.sp-dsgvo .order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.sp-dsgvo .order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.sp-dsgvo .order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.sp-dsgvo .order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.sp-dsgvo .order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.sp-dsgvo .order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.sp-dsgvo .order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.sp-dsgvo .order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.sp-dsgvo .order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.sp-dsgvo .order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.sp-dsgvo .order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.sp-dsgvo .order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.sp-dsgvo .order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.sp-dsgvo .order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.sp-dsgvo .order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.sp-dsgvo .offset-md-0{margin-left:0}.sp-dsgvo .offset-md-1{margin-left:8.3333333333%}.sp-dsgvo .offset-md-2{margin-left:16.6666666667%}.sp-dsgvo .offset-md-3{margin-left:25%}.sp-dsgvo .offset-md-4{margin-left:33.3333333333%}.sp-dsgvo .offset-md-5{margin-left:41.6666666667%}.sp-dsgvo .offset-md-6{margin-left:50%}.sp-dsgvo .offset-md-7{margin-left:58.3333333333%}.sp-dsgvo .offset-md-8{margin-left:66.6666666667%}.sp-dsgvo .offset-md-9{margin-left:75%}.sp-dsgvo .offset-md-10{margin-left:83.3333333333%}.sp-dsgvo .offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.sp-dsgvo .col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.sp-dsgvo .col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.sp-dsgvo .col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.sp-dsgvo .col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.sp-dsgvo .col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.sp-dsgvo .col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.sp-dsgvo .col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.sp-dsgvo .col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.sp-dsgvo .col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.sp-dsgvo .col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.sp-dsgvo .col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.sp-dsgvo .col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.sp-dsgvo .col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.sp-dsgvo .col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.sp-dsgvo .order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.sp-dsgvo .order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.sp-dsgvo .order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.sp-dsgvo .order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.sp-dsgvo .order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.sp-dsgvo .order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.sp-dsgvo .order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.sp-dsgvo .order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.sp-dsgvo .order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.sp-dsgvo .order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.sp-dsgvo .order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.sp-dsgvo .order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.sp-dsgvo .order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.sp-dsgvo .order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.sp-dsgvo .order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.sp-dsgvo .offset-lg-0{margin-left:0}.sp-dsgvo .offset-lg-1{margin-left:8.3333333333%}.sp-dsgvo .offset-lg-2{margin-left:16.6666666667%}.sp-dsgvo .offset-lg-3{margin-left:25%}.sp-dsgvo .offset-lg-4{margin-left:33.3333333333%}.sp-dsgvo .offset-lg-5{margin-left:41.6666666667%}.sp-dsgvo .offset-lg-6{margin-left:50%}.sp-dsgvo .offset-lg-7{margin-left:58.3333333333%}.sp-dsgvo .offset-lg-8{margin-left:66.6666666667%}.sp-dsgvo .offset-lg-9{margin-left:75%}.sp-dsgvo .offset-lg-10{margin-left:83.3333333333%}.sp-dsgvo .offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.sp-dsgvo .col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.sp-dsgvo .col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.sp-dsgvo .col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.sp-dsgvo .col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.sp-dsgvo .col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.sp-dsgvo .col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.sp-dsgvo .col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.sp-dsgvo .col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.sp-dsgvo .col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.sp-dsgvo .col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.sp-dsgvo .col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.sp-dsgvo .col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.sp-dsgvo .col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.sp-dsgvo .col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.sp-dsgvo .order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.sp-dsgvo .order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.sp-dsgvo .order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.sp-dsgvo .order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.sp-dsgvo .order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.sp-dsgvo .order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.sp-dsgvo .order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.sp-dsgvo .order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.sp-dsgvo .order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.sp-dsgvo .order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.sp-dsgvo .order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.sp-dsgvo .order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.sp-dsgvo .order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.sp-dsgvo .order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.sp-dsgvo .order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.sp-dsgvo .offset-xl-0{margin-left:0}.sp-dsgvo .offset-xl-1{margin-left:8.3333333333%}.sp-dsgvo .offset-xl-2{margin-left:16.6666666667%}.sp-dsgvo .offset-xl-3{margin-left:25%}.sp-dsgvo .offset-xl-4{margin-left:33.3333333333%}.sp-dsgvo .offset-xl-5{margin-left:41.6666666667%}.sp-dsgvo .offset-xl-6{margin-left:50%}.sp-dsgvo .offset-xl-7{margin-left:58.3333333333%}.sp-dsgvo .offset-xl-8{margin-left:66.6666666667%}.sp-dsgvo .offset-xl-9{margin-left:75%}.sp-dsgvo .offset-xl-10{margin-left:83.3333333333%}.sp-dsgvo .offset-xl-11{margin-left:91.6666666667%}}.sp-dsgvo .table{width:100%;margin-bottom:1rem;color:#222}.sp-dsgvo .table th,.sp-dsgvo .table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.sp-dsgvo .table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.sp-dsgvo .table tbody+tbody{border-top:2px solid #dee2e6}.sp-dsgvo .table-sm th,.sp-dsgvo .table-sm td{padding:0.3rem}.sp-dsgvo .table-bordered{border:1px solid #dee2e6}.sp-dsgvo .table-bordered th,.sp-dsgvo .table-bordered td{border:1px solid #dee2e6}.sp-dsgvo .table-bordered thead th,.sp-dsgvo .table-bordered thead td{border-bottom-width:2px}.sp-dsgvo .table-borderless th,.sp-dsgvo .table-borderless td,.sp-dsgvo .table-borderless thead th,.sp-dsgvo .table-borderless tbody+tbody{border:0}.sp-dsgvo .table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.sp-dsgvo .table-hover tbody tr:hover{color:#222;background-color:rgba(0,0,0,0.075)}.sp-dsgvo .table-primary,.sp-dsgvo .table-primary>th,.sp-dsgvo .table-primary>td{background-color:#b8dfec}.sp-dsgvo .table-primary th,.sp-dsgvo .table-primary td,.sp-dsgvo .table-primary thead th,.sp-dsgvo .table-primary tbody+tbody{border-color:#7ac3db}.sp-dsgvo .table-hover .table-primary:hover{background-color:#a4d6e7}.sp-dsgvo .table-hover .table-primary:hover>td,.sp-dsgvo .table-hover .table-primary:hover>th{background-color:#a4d6e7}.sp-dsgvo .table-secondary,.sp-dsgvo .table-secondary>th,.sp-dsgvo .table-secondary>td{background-color:#fafafa}.sp-dsgvo .table-secondary th,.sp-dsgvo .table-secondary td,.sp-dsgvo .table-secondary thead th,.sp-dsgvo .table-secondary tbody+tbody{border-color:#f6f6f6}.sp-dsgvo .table-hover .table-secondary:hover{background-color:#ededed}.sp-dsgvo .table-hover .table-secondary:hover>td,.sp-dsgvo .table-hover .table-secondary:hover>th{background-color:#ededed}.sp-dsgvo .table-success,.sp-dsgvo .table-success>th,.sp-dsgvo .table-success>td{background-color:#cae8d5}.sp-dsgvo .table-success th,.sp-dsgvo .table-success td,.sp-dsgvo .table-success thead th,.sp-dsgvo .table-success tbody+tbody{border-color:#9dd4b2}.sp-dsgvo .table-hover .table-success:hover{background-color:#b8e0c7}.sp-dsgvo .table-hover .table-success:hover>td,.sp-dsgvo .table-hover .table-success:hover>th{background-color:#b8e0c7}.sp-dsgvo .table-info,.sp-dsgvo .table-info>th,.sp-dsgvo .table-info>td{background-color:#d1edf6}.sp-dsgvo .table-info th,.sp-dsgvo .table-info td,.sp-dsgvo .table-info thead th,.sp-dsgvo .table-info tbody+tbody{border-color:#aadeee}.sp-dsgvo .table-hover .table-info:hover{background-color:#bce5f2}.sp-dsgvo .table-hover .table-info:hover>td,.sp-dsgvo .table-hover .table-info:hover>th{background-color:#bce5f2}.sp-dsgvo .table-warning,.sp-dsgvo .table-warning>th,.sp-dsgvo .table-warning>td{background-color:#f9e0b8}.sp-dsgvo .table-warning th,.sp-dsgvo .table-warning td,.sp-dsgvo .table-warning thead th,.sp-dsgvo .table-warning tbody+tbody{border-color:#f4c57b}.sp-dsgvo .table-hover .table-warning:hover{background-color:#f7d6a0}.sp-dsgvo .table-hover .table-warning:hover>td,.sp-dsgvo .table-hover .table-warning:hover>th{background-color:#f7d6a0}.sp-dsgvo .table-danger,.sp-dsgvo .table-danger>th,.sp-dsgvo .table-danger>td{background-color:#fbcac2}.sp-dsgvo .table-danger th,.sp-dsgvo .table-danger td,.sp-dsgvo .table-danger thead th,.sp-dsgvo .table-danger tbody+tbody{border-color:#f79c8d}.sp-dsgvo .table-hover .table-danger:hover{background-color:#f9b5aa}.sp-dsgvo .table-hover .table-danger:hover>td,.sp-dsgvo .table-hover .table-danger:hover>th{background-color:#f9b5aa}.sp-dsgvo .table-light,.sp-dsgvo .table-light>th,.sp-dsgvo .table-light>td{background-color:#fafafa}.sp-dsgvo .table-light th,.sp-dsgvo .table-light td,.sp-dsgvo .table-light thead th,.sp-dsgvo .table-light tbody+tbody{border-color:#f6f6f6}.sp-dsgvo .table-hover .table-light:hover{background-color:#ededed}.sp-dsgvo .table-hover .table-light:hover>td,.sp-dsgvo .table-hover .table-light:hover>th{background-color:#ededed}.sp-dsgvo .table-dark,.sp-dsgvo .table-dark>th,.sp-dsgvo .table-dark>td{background-color:#c1c1c1}.sp-dsgvo .table-dark th,.sp-dsgvo .table-dark td,.sp-dsgvo .table-dark thead th,.sp-dsgvo .table-dark tbody+tbody{border-color:#8c8c8c}.sp-dsgvo .table-hover .table-dark:hover{background-color:#b4b4b4}.sp-dsgvo .table-hover .table-dark:hover>td,.sp-dsgvo .table-hover .table-dark:hover>th{background-color:#b4b4b4}.sp-dsgvo .table-active,.sp-dsgvo .table-active>th,.sp-dsgvo .table-active>td{background-color:rgba(0,0,0,0.075)}.sp-dsgvo .table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.sp-dsgvo .table-hover .table-active:hover>td,.sp-dsgvo .table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.sp-dsgvo .table .thead-dark th{color:#fff;background-color:#333;border-color:#464646}.sp-dsgvo .table .thead-light th{color:#495057;background-color:#eee;border-color:#dee2e6}.sp-dsgvo .table-dark{color:#fff;background-color:#333}.sp-dsgvo .table-dark th,.sp-dsgvo .table-dark td,.sp-dsgvo .table-dark thead th{border-color:#464646}.sp-dsgvo .table-dark.table-bordered{border:0}.sp-dsgvo .table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.sp-dsgvo .table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.sp-dsgvo .table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sp-dsgvo .table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.sp-dsgvo .table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sp-dsgvo .table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.sp-dsgvo .table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sp-dsgvo .table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.sp-dsgvo .table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sp-dsgvo .table-responsive-xl>.table-bordered{border:0}}.sp-dsgvo .table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sp-dsgvo .table-responsive>.table-bordered{border:0}.sp-dsgvo .form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.5rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border-radius:0px;-webkit-transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .form-control{-webkit-transition:none;transition:none}}.sp-dsgvo .form-control::-ms-expand{background-color:transparent;border:0}.sp-dsgvo .form-control:focus{color:#495057;background-color:#fff;border-color:#3bceff;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .form-control::-webkit-input-placeholder{color:#888;opacity:1}.sp-dsgvo .form-control::-ms-input-placeholder{color:#888;opacity:1}.sp-dsgvo .form-control::placeholder{color:#888;opacity:1}.sp-dsgvo .form-control:disabled,.sp-dsgvo .form-control[readonly]{background-color:#eee;opacity:1}.sp-dsgvo select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.sp-dsgvo .form-control-file,.sp-dsgvo .form-control-range{display:block;width:100%}.sp-dsgvo .col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.sp-dsgvo .col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.171875rem;line-height:1.5}.sp-dsgvo .col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.8203125rem;line-height:1.5}.sp-dsgvo .form-control-plaintext{display:block;width:100%;padding-top:0.375rem;padding-bottom:0.375rem;margin-bottom:0;line-height:1.5;color:#222;background-color:transparent;border:solid transparent;border-width:1px 0}.sp-dsgvo .form-control-plaintext.form-control-sm,.sp-dsgvo .form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.sp-dsgvo .form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0px}.sp-dsgvo .form-control-lg{height:calc(1.5em + 1rem + 2px);padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0px}.sp-dsgvo select.form-control[size],.sp-dsgvo select.form-control[multiple]{height:auto}.sp-dsgvo textarea.form-control{height:auto}.sp-dsgvo .form-group{margin-bottom:1rem}.sp-dsgvo .form-text{display:block;margin-top:0.25rem}.sp-dsgvo .form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.sp-dsgvo .form-row>.col,.sp-dsgvo .form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.sp-dsgvo .form-check{position:relative;display:block;padding-left:1.25rem}.sp-dsgvo .form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.sp-dsgvo .form-check-input:disabled ~ .form-check-label{color:#888}.sp-dsgvo .form-check-label{margin-bottom:0}.sp-dsgvo .form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.sp-dsgvo .form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.sp-dsgvo .valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#43ac6a}.sp-dsgvo .valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(67,172,106,0.9);border-radius:0px}.was-validated .sp-dsgvo .form-control:valid,.sp-dsgvo .form-control.is-valid{border-color:#43ac6a;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2343ac6a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(0.375em + 0.1875rem);background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .sp-dsgvo .form-control:valid:focus,.sp-dsgvo .form-control.is-valid:focus{border-color:#43ac6a;-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25)}.was-validated .sp-dsgvo .form-control:valid ~ .valid-feedback,.was-validated .sp-dsgvo .form-control:valid ~ .valid-tooltip,.sp-dsgvo .form-control.is-valid ~ .valid-feedback,.sp-dsgvo .form-control.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo textarea.form-control:valid,.sp-dsgvo textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .sp-dsgvo .custom-select:valid,.sp-dsgvo .custom-select.is-valid{border-color:#43ac6a;padding-right:calc((1em + 0.75rem) * 3 / 4 + 1.5rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2343ac6a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.5rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .sp-dsgvo .custom-select:valid:focus,.sp-dsgvo .custom-select.is-valid:focus{border-color:#43ac6a;-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25)}.was-validated .sp-dsgvo .custom-select:valid ~ .valid-feedback,.was-validated .sp-dsgvo .custom-select:valid ~ .valid-tooltip,.sp-dsgvo .custom-select.is-valid ~ .valid-feedback,.sp-dsgvo .custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo .form-control-file:valid ~ .valid-feedback,.was-validated .sp-dsgvo .form-control-file:valid ~ .valid-tooltip,.sp-dsgvo .form-control-file.is-valid ~ .valid-feedback,.sp-dsgvo .form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo .form-check-input:valid ~ .form-check-label,.sp-dsgvo .form-check-input.is-valid ~ .form-check-label{color:#43ac6a}.was-validated .sp-dsgvo .form-check-input:valid ~ .valid-feedback,.was-validated .sp-dsgvo .form-check-input:valid ~ .valid-tooltip,.sp-dsgvo .form-check-input.is-valid ~ .valid-feedback,.sp-dsgvo .form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo .custom-control-input:valid ~ .custom-control-label,.sp-dsgvo .custom-control-input.is-valid ~ .custom-control-label{color:#43ac6a}.was-validated .sp-dsgvo .custom-control-input:valid ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-valid ~ .custom-control-label::before{border-color:#43ac6a}.was-validated .sp-dsgvo .custom-control-input:valid ~ .valid-feedback,.was-validated .sp-dsgvo .custom-control-input:valid ~ .valid-tooltip,.sp-dsgvo .custom-control-input.is-valid ~ .valid-feedback,.sp-dsgvo .custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo .custom-control-input:valid:checked ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#61c185;background-color:#61c185}.was-validated .sp-dsgvo .custom-control-input:valid:focus ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25)}.was-validated .sp-dsgvo .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#43ac6a}.was-validated .sp-dsgvo .custom-file-input:valid ~ .custom-file-label,.sp-dsgvo .custom-file-input.is-valid ~ .custom-file-label{border-color:#43ac6a}.was-validated .sp-dsgvo .custom-file-input:valid ~ .valid-feedback,.was-validated .sp-dsgvo .custom-file-input:valid ~ .valid-tooltip,.sp-dsgvo .custom-file-input.is-valid ~ .valid-feedback,.sp-dsgvo .custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .sp-dsgvo .custom-file-input:valid:focus ~ .custom-file-label,.sp-dsgvo .custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#43ac6a;-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.25)}.sp-dsgvo .invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#F04124}.sp-dsgvo .invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(240,65,36,0.9);border-radius:0px}.was-validated .sp-dsgvo .form-control:invalid,.sp-dsgvo .form-control.is-invalid{border-color:#F04124;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23F04124' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23F04124' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(0.375em + 0.1875rem);background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .sp-dsgvo .form-control:invalid:focus,.sp-dsgvo .form-control.is-invalid:focus{border-color:#F04124;-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25)}.was-validated .sp-dsgvo .form-control:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .form-control:invalid ~ .invalid-tooltip,.sp-dsgvo .form-control.is-invalid ~ .invalid-feedback,.sp-dsgvo .form-control.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo textarea.form-control:invalid,.sp-dsgvo textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .sp-dsgvo .custom-select:invalid,.sp-dsgvo .custom-select.is-invalid{border-color:#F04124;padding-right:calc((1em + 0.75rem) * 3 / 4 + 1.5rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23F04124' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23F04124' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.5rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .sp-dsgvo .custom-select:invalid:focus,.sp-dsgvo .custom-select.is-invalid:focus{border-color:#F04124;-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25)}.was-validated .sp-dsgvo .custom-select:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .custom-select:invalid ~ .invalid-tooltip,.sp-dsgvo .custom-select.is-invalid ~ .invalid-feedback,.sp-dsgvo .custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo .form-control-file:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .form-control-file:invalid ~ .invalid-tooltip,.sp-dsgvo .form-control-file.is-invalid ~ .invalid-feedback,.sp-dsgvo .form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo .form-check-input:invalid ~ .form-check-label,.sp-dsgvo .form-check-input.is-invalid ~ .form-check-label{color:#F04124}.was-validated .sp-dsgvo .form-check-input:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .form-check-input:invalid ~ .invalid-tooltip,.sp-dsgvo .form-check-input.is-invalid ~ .invalid-feedback,.sp-dsgvo .form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo .custom-control-input:invalid ~ .custom-control-label,.sp-dsgvo .custom-control-input.is-invalid ~ .custom-control-label{color:#F04124}.was-validated .sp-dsgvo .custom-control-input:invalid ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#F04124}.was-validated .sp-dsgvo .custom-control-input:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .custom-control-input:invalid ~ .invalid-tooltip,.sp-dsgvo .custom-control-input.is-invalid ~ .invalid-feedback,.sp-dsgvo .custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo .custom-control-input:invalid:checked ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#f36a54;background-color:#f36a54}.was-validated .sp-dsgvo .custom-control-input:invalid:focus ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25)}.was-validated .sp-dsgvo .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.sp-dsgvo .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#F04124}.was-validated .sp-dsgvo .custom-file-input:invalid ~ .custom-file-label,.sp-dsgvo .custom-file-input.is-invalid ~ .custom-file-label{border-color:#F04124}.was-validated .sp-dsgvo .custom-file-input:invalid ~ .invalid-feedback,.was-validated .sp-dsgvo .custom-file-input:invalid ~ .invalid-tooltip,.sp-dsgvo .custom-file-input.is-invalid ~ .invalid-feedback,.sp-dsgvo .custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .sp-dsgvo .custom-file-input:invalid:focus ~ .custom-file-label,.sp-dsgvo .custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#F04124;-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.25)}.sp-dsgvo .form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sp-dsgvo .form-inline .form-check{width:100%}@media (min-width: 576px){.sp-dsgvo .form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.sp-dsgvo .form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.sp-dsgvo .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.sp-dsgvo .form-inline .form-control-plaintext{display:inline-block}.sp-dsgvo .form-inline .input-group,.sp-dsgvo .form-inline .custom-select{width:auto}.sp-dsgvo .form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.sp-dsgvo .form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:0.25rem;margin-left:0}.sp-dsgvo .form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.sp-dsgvo .form-inline .custom-control-label{margin-bottom:0}}.sp-dsgvo .btn{display:inline-block;font-weight:300;color:#222;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:0.375rem 0.5rem;font-size:0.9375rem;line-height:1.5;border-radius:0px;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .btn{-webkit-transition:none;transition:none}}.sp-dsgvo .btn:hover{color:#222;text-decoration:none}.sp-dsgvo .btn:focus,.sp-dsgvo .btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .btn.disabled,.sp-dsgvo .btn:disabled{opacity:0.65}.sp-dsgvo a.btn.disabled,.sp-dsgvo fieldset:disabled a.btn{pointer-events:none}.sp-dsgvo .btn-primary{color:#fff;background-color:#008cba;border-color:#008cba}.sp-dsgvo .btn-primary:hover{color:#fff;background-color:#006f94;border-color:#006687}.sp-dsgvo .btn-primary:focus,.sp-dsgvo .btn-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(38,157,196,0.5);box-shadow:0 0 0 0.2rem rgba(38,157,196,0.5)}.sp-dsgvo .btn-primary.disabled,.sp-dsgvo .btn-primary:disabled{color:#fff;background-color:#008cba;border-color:#008cba}.sp-dsgvo .btn-primary:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-primary:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-primary.dropdown-toggle{color:#fff;background-color:#006687;border-color:#005c7a}.sp-dsgvo .btn-primary:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-primary:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(38,157,196,0.5);box-shadow:0 0 0 0.2rem rgba(38,157,196,0.5)}.sp-dsgvo .btn-secondary{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-secondary:hover{color:#222;background-color:#dbdbdb;border-color:#d5d4d4}.sp-dsgvo .btn-secondary:focus,.sp-dsgvo .btn-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5);box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5)}.sp-dsgvo .btn-secondary.disabled,.sp-dsgvo .btn-secondary:disabled{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-secondary:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-secondary:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-secondary.dropdown-toggle{color:#222;background-color:#d5d4d4;border-color:#cecece}.sp-dsgvo .btn-secondary:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5);box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5)}.sp-dsgvo .btn-success{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.sp-dsgvo .btn-success:hover{color:#fff;background-color:#389059;border-color:#358753}.sp-dsgvo .btn-success:focus,.sp-dsgvo .btn-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(95,184,128,0.5);box-shadow:0 0 0 0.2rem rgba(95,184,128,0.5)}.sp-dsgvo .btn-success.disabled,.sp-dsgvo .btn-success:disabled{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.sp-dsgvo .btn-success:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-success:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-success.dropdown-toggle{color:#fff;background-color:#358753;border-color:#317e4e}.sp-dsgvo .btn-success:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-success:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(95,184,128,0.5);box-shadow:0 0 0 0.2rem rgba(95,184,128,0.5)}.sp-dsgvo .btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.sp-dsgvo .btn-info:hover{color:#fff;background-color:#3bb4d8;border-color:#31b0d5}.sp-dsgvo .btn-info:focus,.sp-dsgvo .btn-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(116,201,227,0.5);box-shadow:0 0 0 0.2rem rgba(116,201,227,0.5)}.sp-dsgvo .btn-info.disabled,.sp-dsgvo .btn-info:disabled{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.sp-dsgvo .btn-info:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-info:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aaacf}.sp-dsgvo .btn-info:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-info:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(116,201,227,0.5);box-shadow:0 0 0 0.2rem rgba(116,201,227,0.5)}.sp-dsgvo .btn-warning{color:#fff;background-color:#E99002;border-color:#E99002}.sp-dsgvo .btn-warning:hover{color:#fff;background-color:#c37902;border-color:#b67102}.sp-dsgvo .btn-warning:focus,.sp-dsgvo .btn-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,161,40,0.5);box-shadow:0 0 0 0.2rem rgba(236,161,40,0.5)}.sp-dsgvo .btn-warning.disabled,.sp-dsgvo .btn-warning:disabled{color:#fff;background-color:#E99002;border-color:#E99002}.sp-dsgvo .btn-warning:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-warning:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-warning.dropdown-toggle{color:#fff;background-color:#b67102;border-color:#aa6901}.sp-dsgvo .btn-warning:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-warning:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,161,40,0.5);box-shadow:0 0 0 0.2rem rgba(236,161,40,0.5)}.sp-dsgvo .btn-danger{color:#fff;background-color:#F04124;border-color:#F04124}.sp-dsgvo .btn-danger:hover{color:#fff;background-color:#df2d0f;border-color:#d32a0e}.sp-dsgvo .btn-danger:focus,.sp-dsgvo .btn-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(242,94,69,0.5);box-shadow:0 0 0 0.2rem rgba(242,94,69,0.5)}.sp-dsgvo .btn-danger.disabled,.sp-dsgvo .btn-danger:disabled{color:#fff;background-color:#F04124;border-color:#F04124}.sp-dsgvo .btn-danger:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-danger:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-danger.dropdown-toggle{color:#fff;background-color:#d32a0e;border-color:#c7280e}.sp-dsgvo .btn-danger:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-danger:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(242,94,69,0.5);box-shadow:0 0 0 0.2rem rgba(242,94,69,0.5)}.sp-dsgvo .btn-light{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-light:hover{color:#222;background-color:#dbdbdb;border-color:#d5d4d4}.sp-dsgvo .btn-light:focus,.sp-dsgvo .btn-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5);box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5)}.sp-dsgvo .btn-light.disabled,.sp-dsgvo .btn-light:disabled{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-light:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-light:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-light.dropdown-toggle{color:#222;background-color:#d5d4d4;border-color:#cecece}.sp-dsgvo .btn-light:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-light:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5);box-shadow:0 0 0 0.2rem rgba(207,207,207,0.5)}.sp-dsgvo .btn-dark{color:#fff;background-color:#222;border-color:#222}.sp-dsgvo .btn-dark:hover{color:#fff;background-color:#0f0f0f;border-color:#090808}.sp-dsgvo .btn-dark:focus,.sp-dsgvo .btn-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5);box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5)}.sp-dsgvo .btn-dark.disabled,.sp-dsgvo .btn-dark:disabled{color:#fff;background-color:#222;border-color:#222}.sp-dsgvo .btn-dark:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-dark:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-dark.dropdown-toggle{color:#fff;background-color:#090808;border-color:#020202}.sp-dsgvo .btn-dark:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-dark:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5);box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5)}.sp-dsgvo .btn-outline-primary{color:#008cba;border-color:#008cba}.sp-dsgvo .btn-outline-primary:hover{color:#fff;background-color:#008cba;border-color:#008cba}.sp-dsgvo .btn-outline-primary:focus,.sp-dsgvo .btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5)}.sp-dsgvo .btn-outline-primary.disabled,.sp-dsgvo .btn-outline-primary:disabled{color:#008cba;background-color:transparent}.sp-dsgvo .btn-outline-primary:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-primary:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-primary.dropdown-toggle{color:#fff;background-color:#008cba;border-color:#008cba}.sp-dsgvo .btn-outline-primary:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5)}.sp-dsgvo .btn-outline-secondary{color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-secondary:hover{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-secondary:focus,.sp-dsgvo .btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .btn-outline-secondary.disabled,.sp-dsgvo .btn-outline-secondary:disabled{color:#eee;background-color:transparent}.sp-dsgvo .btn-outline-secondary:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-secondary.dropdown-toggle{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .btn-outline-success{color:#43ac6a;border-color:#43ac6a}.sp-dsgvo .btn-outline-success:hover{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.sp-dsgvo .btn-outline-success:focus,.sp-dsgvo .btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5)}.sp-dsgvo .btn-outline-success.disabled,.sp-dsgvo .btn-outline-success:disabled{color:#43ac6a;background-color:transparent}.sp-dsgvo .btn-outline-success:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-success:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-success.dropdown-toggle{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.sp-dsgvo .btn-outline-success:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5)}.sp-dsgvo .btn-outline-info{color:#5bc0de;border-color:#5bc0de}.sp-dsgvo .btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.sp-dsgvo .btn-outline-info:focus,.sp-dsgvo .btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5);box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5)}.sp-dsgvo .btn-outline-info.disabled,.sp-dsgvo .btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.sp-dsgvo .btn-outline-info:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-info:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.sp-dsgvo .btn-outline-info:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5);box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5)}.sp-dsgvo .btn-outline-warning{color:#E99002;border-color:#E99002}.sp-dsgvo .btn-outline-warning:hover{color:#fff;background-color:#E99002;border-color:#E99002}.sp-dsgvo .btn-outline-warning:focus,.sp-dsgvo .btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5);box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5)}.sp-dsgvo .btn-outline-warning.disabled,.sp-dsgvo .btn-outline-warning:disabled{color:#E99002;background-color:transparent}.sp-dsgvo .btn-outline-warning:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-warning:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-warning.dropdown-toggle{color:#fff;background-color:#E99002;border-color:#E99002}.sp-dsgvo .btn-outline-warning:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5);box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5)}.sp-dsgvo .btn-outline-danger{color:#F04124;border-color:#F04124}.sp-dsgvo .btn-outline-danger:hover{color:#fff;background-color:#F04124;border-color:#F04124}.sp-dsgvo .btn-outline-danger:focus,.sp-dsgvo .btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5)}.sp-dsgvo .btn-outline-danger.disabled,.sp-dsgvo .btn-outline-danger:disabled{color:#F04124;background-color:transparent}.sp-dsgvo .btn-outline-danger:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-danger:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-danger.dropdown-toggle{color:#fff;background-color:#F04124;border-color:#F04124}.sp-dsgvo .btn-outline-danger:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5)}.sp-dsgvo .btn-outline-light{color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-light:hover{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-light:focus,.sp-dsgvo .btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .btn-outline-light.disabled,.sp-dsgvo .btn-outline-light:disabled{color:#eee;background-color:transparent}.sp-dsgvo .btn-outline-light:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-light:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-light.dropdown-toggle{color:#222;background-color:#eee;border-color:#eee}.sp-dsgvo .btn-outline-light:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .btn-outline-dark{color:#222;border-color:#222}.sp-dsgvo .btn-outline-dark:hover{color:#fff;background-color:#222;border-color:#222}.sp-dsgvo .btn-outline-dark:focus,.sp-dsgvo .btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.sp-dsgvo .btn-outline-dark.disabled,.sp-dsgvo .btn-outline-dark:disabled{color:#222;background-color:transparent}.sp-dsgvo .btn-outline-dark:not(:disabled):not(.disabled):active,.sp-dsgvo .btn-outline-dark:not(:disabled):not(.disabled).active,.show>.sp-dsgvo .btn-outline-dark.dropdown-toggle{color:#fff;background-color:#222;border-color:#222}.sp-dsgvo .btn-outline-dark:not(:disabled):not(.disabled):active:focus,.sp-dsgvo .btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.sp-dsgvo .btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.sp-dsgvo .btn-link{font-weight:400;color:#008cba;text-decoration:none}.sp-dsgvo .btn-link:hover{color:#00526e;text-decoration:underline}.sp-dsgvo .btn-link:focus,.sp-dsgvo .btn-link.focus{text-decoration:underline;-webkit-box-shadow:none;box-shadow:none}.sp-dsgvo .btn-link:disabled,.sp-dsgvo .btn-link.disabled{color:#888;pointer-events:none}.sp-dsgvo .btn-lg,.sp-dsgvo .btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0px}.sp-dsgvo .btn-sm,.sp-dsgvo .btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0px}.sp-dsgvo .btn-block{display:block;width:100%}.sp-dsgvo .btn-block+.btn-block{margin-top:0.5rem}.sp-dsgvo input[type="submit"].btn-block,.sp-dsgvo input[type="reset"].btn-block,.sp-dsgvo input[type="button"].btn-block{width:100%}.sp-dsgvo .fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.sp-dsgvo .fade{-webkit-transition:none;transition:none}}.sp-dsgvo .fade:not(.show){opacity:0}.sp-dsgvo .collapse:not(.show){display:none}.sp-dsgvo .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.sp-dsgvo .collapsing{-webkit-transition:none;transition:none}}.sp-dsgvo .dropup,.sp-dsgvo .dropright,.sp-dsgvo .dropdown,.sp-dsgvo .dropleft{position:relative}.sp-dsgvo .dropdown-toggle{white-space:nowrap}.sp-dsgvo .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.sp-dsgvo .dropdown-toggle:empty::after{margin-left:0}.sp-dsgvo .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:0.9375rem;color:#222;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);border-radius:0px}.sp-dsgvo .dropdown-menu-left{right:auto;left:0}.sp-dsgvo .dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.sp-dsgvo .dropdown-menu-sm-left{right:auto;left:0}.sp-dsgvo .dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.sp-dsgvo .dropdown-menu-md-left{right:auto;left:0}.sp-dsgvo .dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.sp-dsgvo .dropdown-menu-lg-left{right:auto;left:0}.sp-dsgvo .dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.sp-dsgvo .dropdown-menu-xl-left{right:auto;left:0}.sp-dsgvo .dropdown-menu-xl-right{right:0;left:auto}}.sp-dsgvo .dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.sp-dsgvo .dropup .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.sp-dsgvo .dropup .dropdown-toggle:empty::after{margin-left:0}.sp-dsgvo .dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.sp-dsgvo .dropright .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.sp-dsgvo .dropright .dropdown-toggle:empty::after{margin-left:0}.sp-dsgvo .dropright .dropdown-toggle::after{vertical-align:0}.sp-dsgvo .dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.sp-dsgvo .dropleft .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:""}.sp-dsgvo .dropleft .dropdown-toggle::after{display:none}.sp-dsgvo .dropleft .dropdown-toggle::before{display:inline-block;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.sp-dsgvo .dropleft .dropdown-toggle:empty::after{margin-left:0}.sp-dsgvo .dropleft .dropdown-toggle::before{vertical-align:0}.sp-dsgvo .dropdown-menu[x-placement^="top"],.sp-dsgvo .dropdown-menu[x-placement^="right"],.sp-dsgvo .dropdown-menu[x-placement^="bottom"],.sp-dsgvo .dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.sp-dsgvo .dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,0.1)}.sp-dsgvo .dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#222;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.sp-dsgvo .dropdown-item:hover,.sp-dsgvo .dropdown-item:focus{color:#151515;text-decoration:none;background-color:#f8f9fa}.sp-dsgvo .dropdown-item.active,.sp-dsgvo .dropdown-item:active{color:#fff;text-decoration:none;background-color:#008cba}.sp-dsgvo .dropdown-item.disabled,.sp-dsgvo .dropdown-item:disabled{color:#888;pointer-events:none;background-color:transparent}.sp-dsgvo .dropdown-menu.show{display:block}.sp-dsgvo .dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.8203125rem;color:#888;white-space:nowrap}.sp-dsgvo .dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#222}.sp-dsgvo .btn-group,.sp-dsgvo .btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.sp-dsgvo .btn-group>.btn,.sp-dsgvo .btn-group-vertical>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sp-dsgvo .btn-group>.btn:hover,.sp-dsgvo .btn-group-vertical>.btn:hover{z-index:1}.sp-dsgvo .btn-group>.btn:focus,.sp-dsgvo .btn-group>.btn:active,.sp-dsgvo .btn-group>.btn.active,.sp-dsgvo .btn-group-vertical>.btn:focus,.sp-dsgvo .btn-group-vertical>.btn:active,.sp-dsgvo .btn-group-vertical>.btn.active{z-index:1}.sp-dsgvo .btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .btn-toolbar .input-group{width:auto}.sp-dsgvo .btn-group>.btn:not(:first-child),.sp-dsgvo .btn-group>.btn-group:not(:first-child){margin-left:-1px}.sp-dsgvo .btn-group>.btn:not(:last-child):not(.dropdown-toggle),.sp-dsgvo .btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.sp-dsgvo .btn-group>.btn:not(:first-child),.sp-dsgvo .btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.sp-dsgvo .dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.sp-dsgvo .dropdown-toggle-split::after,.dropup .sp-dsgvo .dropdown-toggle-split::after,.dropright .sp-dsgvo .dropdown-toggle-split::after{margin-left:0}.dropleft .sp-dsgvo .dropdown-toggle-split::before{margin-right:0}.sp-dsgvo .btn-sm+.dropdown-toggle-split,.sp-dsgvo .btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.sp-dsgvo .btn-lg+.dropdown-toggle-split,.sp-dsgvo .btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.sp-dsgvo .btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.sp-dsgvo .btn-group-vertical>.btn,.sp-dsgvo .btn-group-vertical>.btn-group{width:100%}.sp-dsgvo .btn-group-vertical>.btn:not(:first-child),.sp-dsgvo .btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.sp-dsgvo .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.sp-dsgvo .btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.sp-dsgvo .btn-group-vertical>.btn:not(:first-child),.sp-dsgvo .btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.sp-dsgvo .btn-group-toggle>.btn,.sp-dsgvo .btn-group-toggle>.btn-group>.btn{margin-bottom:0}.sp-dsgvo .btn-group-toggle>.btn input[type="radio"],.sp-dsgvo .btn-group-toggle>.btn input[type="checkbox"],.sp-dsgvo .btn-group-toggle>.btn-group>.btn input[type="radio"],.sp-dsgvo .btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.sp-dsgvo .input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.sp-dsgvo .input-group>.form-control,.sp-dsgvo .input-group>.form-control-plaintext,.sp-dsgvo .input-group>.custom-select,.sp-dsgvo .input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.sp-dsgvo .input-group>.form-control+.form-control,.sp-dsgvo .input-group>.form-control+.custom-select,.sp-dsgvo .input-group>.form-control+.custom-file,.sp-dsgvo .input-group>.form-control-plaintext+.form-control,.sp-dsgvo .input-group>.form-control-plaintext+.custom-select,.sp-dsgvo .input-group>.form-control-plaintext+.custom-file,.sp-dsgvo .input-group>.custom-select+.form-control,.sp-dsgvo .input-group>.custom-select+.custom-select,.sp-dsgvo .input-group>.custom-select+.custom-file,.sp-dsgvo .input-group>.custom-file+.form-control,.sp-dsgvo .input-group>.custom-file+.custom-select,.sp-dsgvo .input-group>.custom-file+.custom-file{margin-left:-1px}.sp-dsgvo .input-group>.form-control:focus,.sp-dsgvo .input-group>.custom-select:focus,.sp-dsgvo .input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.sp-dsgvo .input-group>.custom-file .custom-file-input:focus{z-index:4}.sp-dsgvo .input-group>.form-control:not(:last-child),.sp-dsgvo .input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.sp-dsgvo .input-group>.form-control:not(:first-child),.sp-dsgvo .input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.sp-dsgvo .input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sp-dsgvo .input-group>.custom-file:not(:last-child) .custom-file-label,.sp-dsgvo .input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.sp-dsgvo .input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.sp-dsgvo .input-group-prepend,.sp-dsgvo .input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.sp-dsgvo .input-group-prepend .btn,.sp-dsgvo .input-group-append .btn{position:relative;z-index:2}.sp-dsgvo .input-group-prepend .btn:focus,.sp-dsgvo .input-group-append .btn:focus{z-index:3}.sp-dsgvo .input-group-prepend .btn+.btn,.sp-dsgvo .input-group-prepend .btn+.input-group-text,.sp-dsgvo .input-group-prepend .input-group-text+.input-group-text,.sp-dsgvo .input-group-prepend .input-group-text+.btn,.sp-dsgvo .input-group-append .btn+.btn,.sp-dsgvo .input-group-append .btn+.input-group-text,.sp-dsgvo .input-group-append .input-group-text+.input-group-text,.sp-dsgvo .input-group-append .input-group-text+.btn{margin-left:-1px}.sp-dsgvo .input-group-prepend{margin-right:-1px}.sp-dsgvo .input-group-append{margin-left:-1px}.sp-dsgvo .input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.375rem 0.5rem;margin-bottom:0;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eee;border:1px solid #ccc;border-radius:0px}.sp-dsgvo .input-group-text input[type="radio"],.sp-dsgvo .input-group-text input[type="checkbox"]{margin-top:0}.sp-dsgvo .input-group-lg>.form-control:not(textarea),.sp-dsgvo .input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.sp-dsgvo .input-group-lg>.form-control,.sp-dsgvo .input-group-lg>.custom-select,.sp-dsgvo .input-group-lg>.input-group-prepend>.input-group-text,.sp-dsgvo .input-group-lg>.input-group-append>.input-group-text,.sp-dsgvo .input-group-lg>.input-group-prepend>.btn,.sp-dsgvo .input-group-lg>.input-group-append>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0px}.sp-dsgvo .input-group-sm>.form-control:not(textarea),.sp-dsgvo .input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.sp-dsgvo .input-group-sm>.form-control,.sp-dsgvo .input-group-sm>.custom-select,.sp-dsgvo .input-group-sm>.input-group-prepend>.input-group-text,.sp-dsgvo .input-group-sm>.input-group-append>.input-group-text,.sp-dsgvo .input-group-sm>.input-group-prepend>.btn,.sp-dsgvo .input-group-sm>.input-group-append>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0px}.sp-dsgvo .input-group-lg>.custom-select,.sp-dsgvo .input-group-sm>.custom-select{padding-right:1.5rem}.sp-dsgvo .input-group>.input-group-prepend>.btn,.sp-dsgvo .input-group>.input-group-prepend>.input-group-text,.sp-dsgvo .input-group>.input-group-append:not(:last-child)>.btn,.sp-dsgvo .input-group>.input-group-append:not(:last-child)>.input-group-text,.sp-dsgvo .input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.sp-dsgvo .input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.sp-dsgvo .input-group>.input-group-append>.btn,.sp-dsgvo .input-group>.input-group-append>.input-group-text,.sp-dsgvo .input-group>.input-group-prepend:not(:first-child)>.btn,.sp-dsgvo .input-group>.input-group-prepend:not(:first-child)>.input-group-text,.sp-dsgvo .input-group>.input-group-prepend:first-child>.btn:not(:first-child),.sp-dsgvo .input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.sp-dsgvo .custom-control{position:relative;display:block;min-height:1.40625rem;padding-left:1.5rem}.sp-dsgvo .custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.sp-dsgvo .custom-control-input{position:absolute;z-index:-1;opacity:0}.sp-dsgvo .custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#008cba;background-color:#008cba}.sp-dsgvo .custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#3bceff}.sp-dsgvo .custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#6edbff;border-color:#6edbff}.sp-dsgvo .custom-control-input:disabled ~ .custom-control-label{color:#888}.sp-dsgvo .custom-control-input:disabled ~ .custom-control-label::before{background-color:#eee}.sp-dsgvo .custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.sp-dsgvo .custom-control-label::before{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.sp-dsgvo .custom-control-label::after{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.sp-dsgvo .custom-checkbox .custom-control-label::before{border-radius:0px}.sp-dsgvo .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.sp-dsgvo .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#008cba;background-color:#008cba}.sp-dsgvo .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.sp-dsgvo .custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,140,186,0.5)}.sp-dsgvo .custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,140,186,0.5)}.sp-dsgvo .custom-radio .custom-control-label::before{border-radius:50%}.sp-dsgvo .custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.sp-dsgvo .custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,140,186,0.5)}.sp-dsgvo .custom-switch{padding-left:2.25rem}.sp-dsgvo .custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:0.5rem}.sp-dsgvo .custom-switch .custom-control-label::after{top:calc(0.203125rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:0.5rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .custom-switch .custom-control-label::after{-webkit-transition:none;transition:none}}.sp-dsgvo .custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.sp-dsgvo .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,140,186,0.5)}.sp-dsgvo .custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1.5rem 0.375rem 0.5rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px;background-color:#fff;border:1px solid #ccc;border-radius:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sp-dsgvo .custom-select:focus{border-color:#3bceff;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-select:focus::-ms-value{color:#495057;background-color:#fff}.sp-dsgvo .custom-select[multiple],.sp-dsgvo .custom-select[size]:not([size="1"]){height:auto;padding-right:0.5rem;background-image:none}.sp-dsgvo .custom-select:disabled{color:#888;background-color:#eee}.sp-dsgvo .custom-select::-ms-expand{display:none}.sp-dsgvo .custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:0.25rem;padding-bottom:0.25rem;padding-left:0.5rem;font-size:0.8203125rem}.sp-dsgvo .custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;font-size:1.171875rem}.sp-dsgvo .custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.sp-dsgvo .custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;opacity:0}.sp-dsgvo .custom-file-input:focus ~ .custom-file-label{border-color:#3bceff;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-file-input:disabled ~ .custom-file-label{background-color:#eee}.sp-dsgvo .custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.sp-dsgvo .custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.sp-dsgvo .custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.5rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ccc;border-radius:0px}.sp-dsgvo .custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:0.375rem 0.5rem;line-height:1.5;color:#495057;content:"Browse";background-color:#eee;border-left:inherit;border-radius:0 0px 0px 0}.sp-dsgvo .custom-range{width:100%;height:calc(1rem + 0.4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sp-dsgvo .custom-range:focus{outline:none}.sp-dsgvo .custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .custom-range::-moz-focus-outer{border:0}.sp-dsgvo .custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#008cba;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.sp-dsgvo .custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.sp-dsgvo .custom-range::-webkit-slider-thumb:active{background-color:#6edbff}.sp-dsgvo .custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.sp-dsgvo .custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#008cba;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.sp-dsgvo .custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.sp-dsgvo .custom-range::-moz-range-thumb:active{background-color:#6edbff}.sp-dsgvo .custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.sp-dsgvo .custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#008cba;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.sp-dsgvo .custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.sp-dsgvo .custom-range::-ms-thumb:active{background-color:#6edbff}.sp-dsgvo .custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.sp-dsgvo .custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.sp-dsgvo .custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.sp-dsgvo .custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.sp-dsgvo .custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.sp-dsgvo .custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.sp-dsgvo .custom-range:disabled::-moz-range-track{cursor:default}.sp-dsgvo .custom-range:disabled::-ms-thumb{background-color:#adb5bd}.sp-dsgvo .custom-control-label::before,.sp-dsgvo .custom-file-label,.sp-dsgvo .custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .custom-control-label::before,.sp-dsgvo .custom-file-label,.sp-dsgvo .custom-select{-webkit-transition:none;transition:none}}.sp-dsgvo .nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.sp-dsgvo .nav-link{display:block;padding:0.5rem 1rem}.sp-dsgvo .nav-link:hover,.sp-dsgvo .nav-link:focus{text-decoration:none}.sp-dsgvo .nav-link.disabled{color:#ccc;pointer-events:none;cursor:default}.sp-dsgvo .nav-tabs{border-bottom:1px solid rgba(0,0,0,0.1)}.sp-dsgvo .nav-tabs .nav-item{margin-bottom:-1px}.sp-dsgvo .nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0px;border-top-right-radius:0px}.sp-dsgvo .nav-tabs .nav-link:hover,.sp-dsgvo .nav-tabs .nav-link:focus{border-color:rgba(0,0,0,0.1)}.sp-dsgvo .nav-tabs .nav-link.disabled{color:#ccc;background-color:transparent;border-color:transparent}.sp-dsgvo .nav-tabs .nav-link.active,.sp-dsgvo .nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:rgba(0,0,0,0.1)}.sp-dsgvo .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.sp-dsgvo .nav-pills .nav-link{border-radius:0px}.sp-dsgvo .nav-pills .nav-link.active,.sp-dsgvo .nav-pills .show>.nav-link{color:#fff;background-color:#008cba}.sp-dsgvo .nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.sp-dsgvo .nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.sp-dsgvo .tab-content>.tab-pane{display:none}.sp-dsgvo .tab-content>.active{display:block}.sp-dsgvo .navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0.5rem 1rem}.sp-dsgvo .navbar>.container,.sp-dsgvo .navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.sp-dsgvo .navbar-brand{display:inline-block;padding-top:0.32421875rem;padding-bottom:0.32421875rem;margin-right:1rem;font-size:1.171875rem;line-height:inherit;white-space:nowrap}.sp-dsgvo .navbar-brand:hover,.sp-dsgvo .navbar-brand:focus{text-decoration:none}.sp-dsgvo .navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.sp-dsgvo .navbar-nav .nav-link{padding-right:0;padding-left:0}.sp-dsgvo .navbar-nav .dropdown-menu{position:static;float:none}.sp-dsgvo .navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.sp-dsgvo .navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sp-dsgvo .navbar-toggler{padding:0.25rem 0.75rem;font-size:1.171875rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0px}.sp-dsgvo .navbar-toggler:hover,.sp-dsgvo .navbar-toggler:focus{text-decoration:none}.sp-dsgvo .navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.sp-dsgvo .navbar-expand-sm>.container,.sp-dsgvo .navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.sp-dsgvo .navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.sp-dsgvo .navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.sp-dsgvo .navbar-expand-sm>.container,.sp-dsgvo .navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.sp-dsgvo .navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.sp-dsgvo .navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.sp-dsgvo .navbar-expand-md>.container,.sp-dsgvo .navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.sp-dsgvo .navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.sp-dsgvo .navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.sp-dsgvo .navbar-expand-md>.container,.sp-dsgvo .navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.sp-dsgvo .navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.sp-dsgvo .navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.sp-dsgvo .navbar-expand-lg>.container,.sp-dsgvo .navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.sp-dsgvo .navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.sp-dsgvo .navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.sp-dsgvo .navbar-expand-lg>.container,.sp-dsgvo .navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.sp-dsgvo .navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.sp-dsgvo .navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.sp-dsgvo .navbar-expand-xl>.container,.sp-dsgvo .navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.sp-dsgvo .navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.sp-dsgvo .navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.sp-dsgvo .navbar-expand-xl>.container,.sp-dsgvo .navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.sp-dsgvo .navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.sp-dsgvo .navbar-expand-xl .navbar-toggler{display:none}}.sp-dsgvo .navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sp-dsgvo .navbar-expand>.container,.sp-dsgvo .navbar-expand>.container-fluid{padding-right:0;padding-left:0}.sp-dsgvo .navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .navbar-expand .navbar-nav .dropdown-menu{position:absolute}.sp-dsgvo .navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.sp-dsgvo .navbar-expand>.container,.sp-dsgvo .navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.sp-dsgvo .navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.sp-dsgvo .navbar-expand .navbar-toggler{display:none}.sp-dsgvo .navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.sp-dsgvo .navbar-light .navbar-brand:hover,.sp-dsgvo .navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.sp-dsgvo .navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.sp-dsgvo .navbar-light .navbar-nav .nav-link:hover,.sp-dsgvo .navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.sp-dsgvo .navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.sp-dsgvo .navbar-light .navbar-nav .show>.nav-link,.sp-dsgvo .navbar-light .navbar-nav .active>.nav-link,.sp-dsgvo .navbar-light .navbar-nav .nav-link.show,.sp-dsgvo .navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.sp-dsgvo .navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.sp-dsgvo .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.sp-dsgvo .navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.sp-dsgvo .navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.sp-dsgvo .navbar-light .navbar-text a:hover,.sp-dsgvo .navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.sp-dsgvo .navbar-dark .navbar-brand{color:#fff}.sp-dsgvo .navbar-dark .navbar-brand:hover,.sp-dsgvo .navbar-dark .navbar-brand:focus{color:#fff}.sp-dsgvo .navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.7)}.sp-dsgvo .navbar-dark .navbar-nav .nav-link:hover,.sp-dsgvo .navbar-dark .navbar-nav .nav-link:focus{color:#fff}.sp-dsgvo .navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.sp-dsgvo .navbar-dark .navbar-nav .show>.nav-link,.sp-dsgvo .navbar-dark .navbar-nav .active>.nav-link,.sp-dsgvo .navbar-dark .navbar-nav .nav-link.show,.sp-dsgvo .navbar-dark .navbar-nav .nav-link.active{color:#fff}.sp-dsgvo .navbar-dark .navbar-toggler{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.1)}.sp-dsgvo .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.7)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.sp-dsgvo .navbar-dark .navbar-text{color:rgba(255,255,255,0.7)}.sp-dsgvo .navbar-dark .navbar-text a{color:#fff}.sp-dsgvo .navbar-dark .navbar-text a:hover,.sp-dsgvo .navbar-dark .navbar-text a:focus{color:#fff}.sp-dsgvo .card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0px}.sp-dsgvo .card>hr{margin-right:0;margin-left:0}.sp-dsgvo .card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0px;border-top-right-radius:0px}.sp-dsgvo .card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.sp-dsgvo .card-title{margin-bottom:0.75rem}.sp-dsgvo .card-subtitle{margin-top:-0.375rem;margin-bottom:0}.sp-dsgvo .card-text:last-child{margin-bottom:0}.sp-dsgvo .card-link:hover{text-decoration:none}.sp-dsgvo .card-link+.card-link{margin-left:1.25rem}.sp-dsgvo .card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.sp-dsgvo .card-header:first-child{border-radius:0px 0px 0 0}.sp-dsgvo .card-header+.list-group .list-group-item:first-child{border-top:0}.sp-dsgvo .card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.sp-dsgvo .card-footer:last-child{border-radius:0 0 0px 0px}.sp-dsgvo .card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.sp-dsgvo .card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.sp-dsgvo .card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.sp-dsgvo .card-img{width:100%;border-radius:0px}.sp-dsgvo .card-img-top{width:100%;border-top-left-radius:0px;border-top-right-radius:0px}.sp-dsgvo .card-img-bottom{width:100%;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.sp-dsgvo .card-deck .card{margin-bottom:15px}@media (min-width: 576px){.sp-dsgvo .card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.sp-dsgvo .card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.sp-dsgvo .card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.sp-dsgvo .card-group>.card{margin-bottom:15px}@media (min-width: 576px){.sp-dsgvo .card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.sp-dsgvo .card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.sp-dsgvo .card-group>.card+.card{margin-left:0;border-left:0}.sp-dsgvo .card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.sp-dsgvo .card-group>.card:not(:last-child) .card-img-top,.sp-dsgvo .card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.sp-dsgvo .card-group>.card:not(:last-child) .card-img-bottom,.sp-dsgvo .card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.sp-dsgvo .card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.sp-dsgvo .card-group>.card:not(:first-child) .card-img-top,.sp-dsgvo .card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.sp-dsgvo .card-group>.card:not(:first-child) .card-img-bottom,.sp-dsgvo .card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.sp-dsgvo .card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.sp-dsgvo .card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.sp-dsgvo .card-columns .card{display:inline-block;width:100%}}.sp-dsgvo .accordion>.card{overflow:hidden}.sp-dsgvo .accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.sp-dsgvo .accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.sp-dsgvo .accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.sp-dsgvo .accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.sp-dsgvo .accordion>.card .card-header{margin-bottom:-1px}.sp-dsgvo .breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eee;border-radius:0px}.sp-dsgvo .breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.sp-dsgvo .breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#888;content:"/"}.sp-dsgvo .breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.sp-dsgvo .breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.sp-dsgvo .breadcrumb-item.active{color:#888}.sp-dsgvo .pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:0px}.sp-dsgvo .page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#888;background-color:#fff;border:1px solid rgba(0,0,0,0.1)}.sp-dsgvo .page-link:hover{z-index:2;color:#00526e;text-decoration:none;background-color:#eee;border-color:#dee2e6}.sp-dsgvo .page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.25)}.sp-dsgvo .page-item:first-child .page-link{margin-left:0;border-top-left-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .page-item:last-child .page-link{border-top-right-radius:0px;border-bottom-right-radius:0px}.sp-dsgvo .page-item.active .page-link{z-index:1;color:#fff;background-color:#008cba;border-color:#0079a1}.sp-dsgvo .page-item.disabled .page-link{color:#eee;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.sp-dsgvo .pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.171875rem;line-height:1.5}.sp-dsgvo .pagination-lg .page-item:first-child .page-link{border-top-left-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .pagination-lg .page-item:last-child .page-link{border-top-right-radius:0px;border-bottom-right-radius:0px}.sp-dsgvo .pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}.sp-dsgvo .pagination-sm .page-item:first-child .page-link{border-top-left-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .pagination-sm .page-item:last-child .page-link{border-top-right-radius:0px;border-bottom-right-radius:0px}.sp-dsgvo .badge{display:inline-block;padding:0.25em 1rem;font-size:75%;font-weight:300;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0px;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .badge{-webkit-transition:none;transition:none}}a.sp-dsgvo .badge:hover,a.sp-dsgvo .badge:focus{text-decoration:none}.sp-dsgvo .badge:empty{display:none}.sp-dsgvo .btn .badge{position:relative;top:-1px}.sp-dsgvo .badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.sp-dsgvo .badge-primary{color:#fff;background-color:#008cba}a.sp-dsgvo .badge-primary:hover,a.sp-dsgvo .badge-primary:focus{color:#fff;background-color:#006687}a.sp-dsgvo .badge-primary:focus,a.sp-dsgvo .badge-primary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5);box-shadow:0 0 0 0.2rem rgba(0,140,186,0.5)}.sp-dsgvo .badge-secondary{color:#222;background-color:#eee}a.sp-dsgvo .badge-secondary:hover,a.sp-dsgvo .badge-secondary:focus{color:#222;background-color:#d5d4d4}a.sp-dsgvo .badge-secondary:focus,a.sp-dsgvo .badge-secondary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .badge-success{color:#fff;background-color:#43ac6a}a.sp-dsgvo .badge-success:hover,a.sp-dsgvo .badge-success:focus{color:#fff;background-color:#358753}a.sp-dsgvo .badge-success:focus,a.sp-dsgvo .badge-success.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5);box-shadow:0 0 0 0.2rem rgba(67,172,106,0.5)}.sp-dsgvo .badge-info{color:#fff;background-color:#5bc0de}a.sp-dsgvo .badge-info:hover,a.sp-dsgvo .badge-info:focus{color:#fff;background-color:#31b0d5}a.sp-dsgvo .badge-info:focus,a.sp-dsgvo .badge-info.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5);box-shadow:0 0 0 0.2rem rgba(91,192,222,0.5)}.sp-dsgvo .badge-warning{color:#fff;background-color:#E99002}a.sp-dsgvo .badge-warning:hover,a.sp-dsgvo .badge-warning:focus{color:#fff;background-color:#b67102}a.sp-dsgvo .badge-warning:focus,a.sp-dsgvo .badge-warning.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5);box-shadow:0 0 0 0.2rem rgba(233,144,2,0.5)}.sp-dsgvo .badge-danger{color:#fff;background-color:#F04124}a.sp-dsgvo .badge-danger:hover,a.sp-dsgvo .badge-danger:focus{color:#fff;background-color:#d32a0e}a.sp-dsgvo .badge-danger:focus,a.sp-dsgvo .badge-danger.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5);box-shadow:0 0 0 0.2rem rgba(240,65,36,0.5)}.sp-dsgvo .badge-light{color:#222;background-color:#eee}a.sp-dsgvo .badge-light:hover,a.sp-dsgvo .badge-light:focus{color:#222;background-color:#d5d4d4}a.sp-dsgvo .badge-light:focus,a.sp-dsgvo .badge-light.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5);box-shadow:0 0 0 0.2rem rgba(238,238,238,0.5)}.sp-dsgvo .badge-dark{color:#fff;background-color:#222}a.sp-dsgvo .badge-dark:hover,a.sp-dsgvo .badge-dark:focus{color:#fff;background-color:#090808}a.sp-dsgvo .badge-dark:focus,a.sp-dsgvo .badge-dark.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.sp-dsgvo .jumbotron{padding:4rem 2rem;margin-bottom:4rem;background-color:#eee;border-radius:0px}@media (min-width: 576px){.sp-dsgvo .jumbotron{padding:8rem 4rem}}.sp-dsgvo .jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.sp-dsgvo .alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0px}.sp-dsgvo .alert-heading{color:inherit}.sp-dsgvo .alert-link{font-weight:700}.sp-dsgvo .alert-dismissible{padding-right:3.90625rem}.sp-dsgvo .alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.sp-dsgvo .alert-primary{color:#004961;background-color:#cce8f1;border-color:#b8dfec}.sp-dsgvo .alert-primary hr{border-top-color:#a4d6e7}.sp-dsgvo .alert-primary .alert-link{color:#00232e}.sp-dsgvo .alert-secondary{color:#7c7c7c;background-color:#fcfcfc;border-color:#fafafa}.sp-dsgvo .alert-secondary hr{border-top-color:#ededed}.sp-dsgvo .alert-secondary .alert-link{color:#636262}.sp-dsgvo .alert-success{color:#235937;background-color:#d9eee1;border-color:#cae8d5}.sp-dsgvo .alert-success hr{border-top-color:#b8e0c7}.sp-dsgvo .alert-success .alert-link{color:#153420}.sp-dsgvo .alert-info{color:#2f6473;background-color:#def2f8;border-color:#d1edf6}.sp-dsgvo .alert-info hr{border-top-color:#bce5f2}.sp-dsgvo .alert-info .alert-link{color:#20454f}.sp-dsgvo .alert-warning{color:#794b01;background-color:#fbe9cc;border-color:#f9e0b8}.sp-dsgvo .alert-warning hr{border-top-color:#f7d6a0}.sp-dsgvo .alert-warning .alert-link{color:#462c01}.sp-dsgvo .alert-danger{color:#7d2213;background-color:#fcd9d3;border-color:#fbcac2}.sp-dsgvo .alert-danger hr{border-top-color:#f9b5aa}.sp-dsgvo .alert-danger .alert-link{color:#51160c}.sp-dsgvo .alert-light{color:#7c7c7c;background-color:#fcfcfc;border-color:#fafafa}.sp-dsgvo .alert-light hr{border-top-color:#ededed}.sp-dsgvo .alert-light .alert-link{color:#636262}.sp-dsgvo .alert-dark{color:#121212;background-color:lightgray;border-color:#c1c1c1}.sp-dsgvo .alert-dark hr{border-top-color:#b4b4b4}.sp-dsgvo .alert-dark .alert-link{color:black}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.sp-dsgvo .progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:0.703125rem;background-color:#ccc;border-radius:0px}.sp-dsgvo .progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#008cba;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.sp-dsgvo .progress-bar{-webkit-transition:none;transition:none}}.sp-dsgvo .progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.sp-dsgvo .progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.sp-dsgvo .progress-bar-animated{-webkit-animation:none;animation:none}}.sp-dsgvo .media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.sp-dsgvo .media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.sp-dsgvo .list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.sp-dsgvo .list-group-item-action{width:100%;color:#495057;text-align:inherit}.sp-dsgvo .list-group-item-action:hover,.sp-dsgvo .list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.sp-dsgvo .list-group-item-action:active{color:#222;background-color:#eee}.sp-dsgvo .list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.sp-dsgvo .list-group-item:first-child{border-top-left-radius:0px;border-top-right-radius:0px}.sp-dsgvo .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .list-group-item.disabled,.sp-dsgvo .list-group-item:disabled{color:#888;pointer-events:none;background-color:#eee}.sp-dsgvo .list-group-item.active{z-index:2;color:#fff;background-color:#008cba;border-color:#008cba}.sp-dsgvo .list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.sp-dsgvo .list-group-horizontal .list-group-item:first-child{border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0}.sp-dsgvo .list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0}@media (min-width: 576px){.sp-dsgvo .list-group-horizontal-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.sp-dsgvo .list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0}.sp-dsgvo .list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0}}@media (min-width: 768px){.sp-dsgvo .list-group-horizontal-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.sp-dsgvo .list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0}.sp-dsgvo .list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0}}@media (min-width: 992px){.sp-dsgvo .list-group-horizontal-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.sp-dsgvo .list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0}.sp-dsgvo .list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0}}@media (min-width: 1200px){.sp-dsgvo .list-group-horizontal-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.sp-dsgvo .list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.sp-dsgvo .list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0}.sp-dsgvo .list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0}}.sp-dsgvo .list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.sp-dsgvo .list-group-flush .list-group-item:last-child{margin-bottom:-1px}.sp-dsgvo .list-group-flush:first-child .list-group-item:first-child{border-top:0}.sp-dsgvo .list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.sp-dsgvo .list-group-item-primary{color:#004961;background-color:#b8dfec}.sp-dsgvo .list-group-item-primary.list-group-item-action:hover,.sp-dsgvo .list-group-item-primary.list-group-item-action:focus{color:#004961;background-color:#a4d6e7}.sp-dsgvo .list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004961;border-color:#004961}.sp-dsgvo .list-group-item-secondary{color:#7c7c7c;background-color:#fafafa}.sp-dsgvo .list-group-item-secondary.list-group-item-action:hover,.sp-dsgvo .list-group-item-secondary.list-group-item-action:focus{color:#7c7c7c;background-color:#ededed}.sp-dsgvo .list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#7c7c7c;border-color:#7c7c7c}.sp-dsgvo .list-group-item-success{color:#235937;background-color:#cae8d5}.sp-dsgvo .list-group-item-success.list-group-item-action:hover,.sp-dsgvo .list-group-item-success.list-group-item-action:focus{color:#235937;background-color:#b8e0c7}.sp-dsgvo .list-group-item-success.list-group-item-action.active{color:#fff;background-color:#235937;border-color:#235937}.sp-dsgvo .list-group-item-info{color:#2f6473;background-color:#d1edf6}.sp-dsgvo .list-group-item-info.list-group-item-action:hover,.sp-dsgvo .list-group-item-info.list-group-item-action:focus{color:#2f6473;background-color:#bce5f2}.sp-dsgvo .list-group-item-info.list-group-item-action.active{color:#fff;background-color:#2f6473;border-color:#2f6473}.sp-dsgvo .list-group-item-warning{color:#794b01;background-color:#f9e0b8}.sp-dsgvo .list-group-item-warning.list-group-item-action:hover,.sp-dsgvo .list-group-item-warning.list-group-item-action:focus{color:#794b01;background-color:#f7d6a0}.sp-dsgvo .list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#794b01;border-color:#794b01}.sp-dsgvo .list-group-item-danger{color:#7d2213;background-color:#fbcac2}.sp-dsgvo .list-group-item-danger.list-group-item-action:hover,.sp-dsgvo .list-group-item-danger.list-group-item-action:focus{color:#7d2213;background-color:#f9b5aa}.sp-dsgvo .list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7d2213;border-color:#7d2213}.sp-dsgvo .list-group-item-light{color:#7c7c7c;background-color:#fafafa}.sp-dsgvo .list-group-item-light.list-group-item-action:hover,.sp-dsgvo .list-group-item-light.list-group-item-action:focus{color:#7c7c7c;background-color:#ededed}.sp-dsgvo .list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7c7c7c;border-color:#7c7c7c}.sp-dsgvo .list-group-item-dark{color:#121212;background-color:#c1c1c1}.sp-dsgvo .list-group-item-dark.list-group-item-action:hover,.sp-dsgvo .list-group-item-dark.list-group-item-action:focus{color:#121212;background-color:#b4b4b4}.sp-dsgvo .list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#121212;border-color:#121212}.sp-dsgvo .close{float:right;font-size:1.40625rem;font-weight:700;line-height:1;color:#888;text-shadow:none;opacity:.5}.sp-dsgvo .close:hover{color:#888;text-decoration:none}.sp-dsgvo .close:not(:disabled):not(.disabled):hover,.sp-dsgvo .close:not(:disabled):not(.disabled):focus{opacity:.75}.sp-dsgvo button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sp-dsgvo a.close.disabled{pointer-events:none}.sp-dsgvo .toast{max-width:350px;overflow:hidden;font-size:0.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);-webkit-box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:0.25rem}.sp-dsgvo .toast:not(:last-child){margin-bottom:0.75rem}.sp-dsgvo .toast.showing{opacity:1}.sp-dsgvo .toast.show{display:block;opacity:1}.sp-dsgvo .toast.hide{display:none}.sp-dsgvo .toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.25rem 0.75rem;color:#888;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.sp-dsgvo .toast-body{padding:0.75rem}.sp-dsgvo .modal-open{overflow:hidden}.sp-dsgvo .modal-open .modal{overflow-x:hidden;overflow-y:auto}.sp-dsgvo .modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.sp-dsgvo .modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .sp-dsgvo .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -50px);transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .sp-dsgvo .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .sp-dsgvo .modal-dialog{-webkit-transform:none;transform:none}.sp-dsgvo .modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.sp-dsgvo .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.sp-dsgvo .modal-dialog-scrollable .modal-header,.sp-dsgvo .modal-dialog-scrollable .modal-footer{-ms-flex-negative:0;flex-shrink:0}.sp-dsgvo .modal-dialog-scrollable .modal-body{overflow-y:auto}.sp-dsgvo .modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.sp-dsgvo .modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.sp-dsgvo .modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.sp-dsgvo .modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.sp-dsgvo .modal-dialog-centered.modal-dialog-scrollable::before{content:none}.sp-dsgvo .modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0px;outline:0}.sp-dsgvo .modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.sp-dsgvo .modal-backdrop.fade{opacity:0}.sp-dsgvo .modal-backdrop.show{opacity:0.5}.sp-dsgvo .modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:0px;border-top-right-radius:0px}.sp-dsgvo .modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.sp-dsgvo .modal-title{margin-bottom:0;line-height:1.5}.sp-dsgvo .modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.sp-dsgvo .modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.sp-dsgvo .modal-footer>:not(:first-child){margin-left:.25rem}.sp-dsgvo .modal-footer>:not(:last-child){margin-right:.25rem}.sp-dsgvo .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.sp-dsgvo .modal-dialog{max-width:500px;margin:1.75rem auto}.sp-dsgvo .modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.sp-dsgvo .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.sp-dsgvo .modal-dialog-centered{min-height:calc(100% - 3.5rem)}.sp-dsgvo .modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.sp-dsgvo .modal-sm{max-width:300px}}@media (min-width: 992px){.sp-dsgvo .modal-lg,.sp-dsgvo .modal-xl{max-width:800px}}@media (min-width: 1200px){.sp-dsgvo .modal-xl{max-width:1140px}}.sp-dsgvo .tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;opacity:0}.sp-dsgvo .tooltip.show{opacity:0.9}.sp-dsgvo .tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.sp-dsgvo .tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.sp-dsgvo .bs-tooltip-top,.sp-dsgvo .bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.sp-dsgvo .bs-tooltip-top .arrow,.sp-dsgvo .bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.sp-dsgvo .bs-tooltip-top .arrow::before,.sp-dsgvo .bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.sp-dsgvo .bs-tooltip-right,.sp-dsgvo .bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.sp-dsgvo .bs-tooltip-right .arrow,.sp-dsgvo .bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.sp-dsgvo .bs-tooltip-right .arrow::before,.sp-dsgvo .bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.sp-dsgvo .bs-tooltip-bottom,.sp-dsgvo .bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.sp-dsgvo .bs-tooltip-bottom .arrow,.sp-dsgvo .bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.sp-dsgvo .bs-tooltip-bottom .arrow::before,.sp-dsgvo .bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.sp-dsgvo .bs-tooltip-left,.sp-dsgvo .bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.sp-dsgvo .bs-tooltip-left .arrow,.sp-dsgvo .bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.sp-dsgvo .bs-tooltip-left .arrow::before,.sp-dsgvo .bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.sp-dsgvo .tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0px}.sp-dsgvo .popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0px}.sp-dsgvo .popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0px}.sp-dsgvo .popover .arrow::before,.sp-dsgvo .popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.sp-dsgvo .bs-popover-top,.sp-dsgvo .bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.sp-dsgvo .bs-popover-top>.arrow,.sp-dsgvo .bs-popover-auto[x-placement^="top"]>.arrow{bottom:calc((0.5rem + 1px) * -1)}.sp-dsgvo .bs-popover-top>.arrow::before,.sp-dsgvo .bs-popover-auto[x-placement^="top"]>.arrow::before{bottom:0;border-width:0.5rem 0.5rem 0;border-top-color:rgba(0,0,0,0.25)}.sp-dsgvo .bs-popover-top>.arrow::after,.sp-dsgvo .bs-popover-auto[x-placement^="top"]>.arrow::after{bottom:1px;border-width:0.5rem 0.5rem 0;border-top-color:#fff}.sp-dsgvo .bs-popover-right,.sp-dsgvo .bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.sp-dsgvo .bs-popover-right>.arrow,.sp-dsgvo .bs-popover-auto[x-placement^="right"]>.arrow{left:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0px 0}.sp-dsgvo .bs-popover-right>.arrow::before,.sp-dsgvo .bs-popover-auto[x-placement^="right"]>.arrow::before{left:0;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:rgba(0,0,0,0.25)}.sp-dsgvo .bs-popover-right>.arrow::after,.sp-dsgvo .bs-popover-auto[x-placement^="right"]>.arrow::after{left:1px;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:#fff}.sp-dsgvo .bs-popover-bottom,.sp-dsgvo .bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.sp-dsgvo .bs-popover-bottom>.arrow,.sp-dsgvo .bs-popover-auto[x-placement^="bottom"]>.arrow{top:calc((0.5rem + 1px) * -1)}.sp-dsgvo .bs-popover-bottom>.arrow::before,.sp-dsgvo .bs-popover-auto[x-placement^="bottom"]>.arrow::before{top:0;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:rgba(0,0,0,0.25)}.sp-dsgvo .bs-popover-bottom>.arrow::after,.sp-dsgvo .bs-popover-auto[x-placement^="bottom"]>.arrow::after{top:1px;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:#fff}.sp-dsgvo .bs-popover-bottom .popover-header::before,.sp-dsgvo .bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.sp-dsgvo .bs-popover-left,.sp-dsgvo .bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.sp-dsgvo .bs-popover-left>.arrow,.sp-dsgvo .bs-popover-auto[x-placement^="left"]>.arrow{right:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0px 0}.sp-dsgvo .bs-popover-left>.arrow::before,.sp-dsgvo .bs-popover-auto[x-placement^="left"]>.arrow::before{right:0;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:rgba(0,0,0,0.25)}.sp-dsgvo .bs-popover-left>.arrow::after,.sp-dsgvo .bs-popover-auto[x-placement^="left"]>.arrow::after{right:1px;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:#fff}.sp-dsgvo .popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:0.9375rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0px - 1px);border-top-right-radius:calc(0px - 1px)}.sp-dsgvo .popover-header:empty{display:none}.sp-dsgvo .popover-body{padding:0.5rem 0.75rem;color:#222}.sp-dsgvo .carousel{position:relative}.sp-dsgvo .carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.sp-dsgvo .carousel-inner{position:relative;width:100%;overflow:hidden}.sp-dsgvo .carousel-inner::after{display:block;clear:both;content:""}.sp-dsgvo .carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 0.6s ease-in-out;transition:-webkit-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out}@media (prefers-reduced-motion: reduce){.sp-dsgvo .carousel-item{-webkit-transition:none;transition:none}}.sp-dsgvo .carousel-item.active,.sp-dsgvo .carousel-item-next,.sp-dsgvo .carousel-item-prev{display:block}.sp-dsgvo .carousel-item-next:not(.carousel-item-left),.sp-dsgvo .active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.sp-dsgvo .carousel-item-prev:not(.carousel-item-right),.sp-dsgvo .active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.sp-dsgvo .carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.sp-dsgvo .carousel-fade .carousel-item.active,.sp-dsgvo .carousel-fade .carousel-item-next.carousel-item-left,.sp-dsgvo .carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.sp-dsgvo .carousel-fade .active.carousel-item-left,.sp-dsgvo .carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:0s 0.6s opacity;transition:0s 0.6s opacity}@media (prefers-reduced-motion: reduce){.sp-dsgvo .carousel-fade .active.carousel-item-left,.sp-dsgvo .carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.sp-dsgvo .carousel-control-prev,.sp-dsgvo .carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5;-webkit-transition:opacity 0.15s ease;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.sp-dsgvo .carousel-control-prev,.sp-dsgvo .carousel-control-next{-webkit-transition:none;transition:none}}.sp-dsgvo .carousel-control-prev:hover,.sp-dsgvo .carousel-control-prev:focus,.sp-dsgvo .carousel-control-next:hover,.sp-dsgvo .carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:0.9}.sp-dsgvo .carousel-control-prev{left:0}.sp-dsgvo .carousel-control-next{right:0}.sp-dsgvo .carousel-control-prev-icon,.sp-dsgvo .carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50% / 100% 100%}.sp-dsgvo .carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.sp-dsgvo .carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.sp-dsgvo .carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.sp-dsgvo .carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity 0.6s ease;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.sp-dsgvo .carousel-indicators li{-webkit-transition:none;transition:none}}.sp-dsgvo .carousel-indicators .active{opacity:1}.sp-dsgvo .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sp-dsgvo .spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:0.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.sp-dsgvo .spinner-border-sm{width:1rem;height:1rem;border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.sp-dsgvo .spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.sp-dsgvo .spinner-grow-sm{width:1rem;height:1rem}.sp-dsgvo .align-baseline{vertical-align:baseline !important}.sp-dsgvo .align-top{vertical-align:top !important}.sp-dsgvo .align-middle{vertical-align:middle !important}.sp-dsgvo .align-bottom{vertical-align:bottom !important}.sp-dsgvo .align-text-bottom{vertical-align:text-bottom !important}.sp-dsgvo .align-text-top{vertical-align:text-top !important}.sp-dsgvo .bg-primary{background-color:#008cba !important}.sp-dsgvo a.bg-primary:hover,.sp-dsgvo a.bg-primary:focus,.sp-dsgvo button.bg-primary:hover,.sp-dsgvo button.bg-primary:focus{background-color:#006687 !important}.sp-dsgvo .bg-secondary{background-color:#eee !important}.sp-dsgvo a.bg-secondary:hover,.sp-dsgvo a.bg-secondary:focus,.sp-dsgvo button.bg-secondary:hover,.sp-dsgvo button.bg-secondary:focus{background-color:#d5d4d4 !important}.sp-dsgvo .bg-success{background-color:#43ac6a !important}.sp-dsgvo a.bg-success:hover,.sp-dsgvo a.bg-success:focus,.sp-dsgvo button.bg-success:hover,.sp-dsgvo button.bg-success:focus{background-color:#358753 !important}.sp-dsgvo .bg-info{background-color:#5bc0de !important}.sp-dsgvo a.bg-info:hover,.sp-dsgvo a.bg-info:focus,.sp-dsgvo button.bg-info:hover,.sp-dsgvo button.bg-info:focus{background-color:#31b0d5 !important}.sp-dsgvo .bg-warning{background-color:#E99002 !important}.sp-dsgvo a.bg-warning:hover,.sp-dsgvo a.bg-warning:focus,.sp-dsgvo button.bg-warning:hover,.sp-dsgvo button.bg-warning:focus{background-color:#b67102 !important}.sp-dsgvo .bg-danger{background-color:#F04124 !important}.sp-dsgvo a.bg-danger:hover,.sp-dsgvo a.bg-danger:focus,.sp-dsgvo button.bg-danger:hover,.sp-dsgvo button.bg-danger:focus{background-color:#d32a0e !important}.sp-dsgvo .bg-light{background-color:#eee !important}.sp-dsgvo a.bg-light:hover,.sp-dsgvo a.bg-light:focus,.sp-dsgvo button.bg-light:hover,.sp-dsgvo button.bg-light:focus{background-color:#d5d4d4 !important}.sp-dsgvo .bg-dark{background-color:#222 !important}.sp-dsgvo a.bg-dark:hover,.sp-dsgvo a.bg-dark:focus,.sp-dsgvo button.bg-dark:hover,.sp-dsgvo button.bg-dark:focus{background-color:#090808 !important}.sp-dsgvo .bg-white{background-color:#fff !important}.sp-dsgvo .bg-transparent{background-color:transparent !important}.sp-dsgvo .border{border:1px solid #dee2e6 !important}.sp-dsgvo .border-top{border-top:1px solid #dee2e6 !important}.sp-dsgvo .border-right{border-right:1px solid #dee2e6 !important}.sp-dsgvo .border-bottom{border-bottom:1px solid #dee2e6 !important}.sp-dsgvo .border-left{border-left:1px solid #dee2e6 !important}.sp-dsgvo .border-0{border:0 !important}.sp-dsgvo .border-top-0{border-top:0 !important}.sp-dsgvo .border-right-0{border-right:0 !important}.sp-dsgvo .border-bottom-0{border-bottom:0 !important}.sp-dsgvo .border-left-0{border-left:0 !important}.sp-dsgvo .border-primary{border-color:#008cba !important}.sp-dsgvo .border-secondary{border-color:#eee !important}.sp-dsgvo .border-success{border-color:#43ac6a !important}.sp-dsgvo .border-info{border-color:#5bc0de !important}.sp-dsgvo .border-warning{border-color:#E99002 !important}.sp-dsgvo .border-danger{border-color:#F04124 !important}.sp-dsgvo .border-light{border-color:#eee !important}.sp-dsgvo .border-dark{border-color:#222 !important}.sp-dsgvo .border-white{border-color:#fff !important}.sp-dsgvo .rounded-sm{border-radius:0px !important}.sp-dsgvo .rounded{border-radius:0px !important}.sp-dsgvo .rounded-top{border-top-left-radius:0px !important;border-top-right-radius:0px !important}.sp-dsgvo .rounded-right{border-top-right-radius:0px !important;border-bottom-right-radius:0px !important}.sp-dsgvo .rounded-bottom{border-bottom-right-radius:0px !important;border-bottom-left-radius:0px !important}.sp-dsgvo .rounded-left{border-top-left-radius:0px !important;border-bottom-left-radius:0px !important}.sp-dsgvo .rounded-lg{border-radius:0px !important}.sp-dsgvo .rounded-circle{border-radius:50% !important}.sp-dsgvo .rounded-pill{border-radius:50rem !important}.sp-dsgvo .rounded-0{border-radius:0 !important}.sp-dsgvo .clearfix::after{display:block;clear:both;content:""}.sp-dsgvo .d-none{display:none !important}.sp-dsgvo .d-inline{display:inline !important}.sp-dsgvo .d-inline-block{display:inline-block !important}.sp-dsgvo .d-block{display:block !important}.sp-dsgvo .d-table{display:table !important}.sp-dsgvo .d-table-row{display:table-row !important}.sp-dsgvo .d-table-cell{display:table-cell !important}.sp-dsgvo .d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.sp-dsgvo .d-sm-none{display:none !important}.sp-dsgvo .d-sm-inline{display:inline !important}.sp-dsgvo .d-sm-inline-block{display:inline-block !important}.sp-dsgvo .d-sm-block{display:block !important}.sp-dsgvo .d-sm-table{display:table !important}.sp-dsgvo .d-sm-table-row{display:table-row !important}.sp-dsgvo .d-sm-table-cell{display:table-cell !important}.sp-dsgvo .d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.sp-dsgvo .d-md-none{display:none !important}.sp-dsgvo .d-md-inline{display:inline !important}.sp-dsgvo .d-md-inline-block{display:inline-block !important}.sp-dsgvo .d-md-block{display:block !important}.sp-dsgvo .d-md-table{display:table !important}.sp-dsgvo .d-md-table-row{display:table-row !important}.sp-dsgvo .d-md-table-cell{display:table-cell !important}.sp-dsgvo .d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.sp-dsgvo .d-lg-none{display:none !important}.sp-dsgvo .d-lg-inline{display:inline !important}.sp-dsgvo .d-lg-inline-block{display:inline-block !important}.sp-dsgvo .d-lg-block{display:block !important}.sp-dsgvo .d-lg-table{display:table !important}.sp-dsgvo .d-lg-table-row{display:table-row !important}.sp-dsgvo .d-lg-table-cell{display:table-cell !important}.sp-dsgvo .d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.sp-dsgvo .d-xl-none{display:none !important}.sp-dsgvo .d-xl-inline{display:inline !important}.sp-dsgvo .d-xl-inline-block{display:inline-block !important}.sp-dsgvo .d-xl-block{display:block !important}.sp-dsgvo .d-xl-table{display:table !important}.sp-dsgvo .d-xl-table-row{display:table-row !important}.sp-dsgvo .d-xl-table-cell{display:table-cell !important}.sp-dsgvo .d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.sp-dsgvo .d-print-none{display:none !important}.sp-dsgvo .d-print-inline{display:inline !important}.sp-dsgvo .d-print-inline-block{display:inline-block !important}.sp-dsgvo .d-print-block{display:block !important}.sp-dsgvo .d-print-table{display:table !important}.sp-dsgvo .d-print-table-row{display:table-row !important}.sp-dsgvo .d-print-table-cell{display:table-cell !important}.sp-dsgvo .d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.sp-dsgvo .d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.sp-dsgvo .embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.sp-dsgvo .embed-responsive::before{display:block;content:""}.sp-dsgvo .embed-responsive .embed-responsive-item,.sp-dsgvo .embed-responsive iframe,.sp-dsgvo .embed-responsive embed,.sp-dsgvo .embed-responsive object,.sp-dsgvo .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.sp-dsgvo .embed-responsive-21by9::before{padding-top:42.8571428571%}.sp-dsgvo .embed-responsive-16by9::before{padding-top:56.25%}.sp-dsgvo .embed-responsive-4by3::before{padding-top:75%}.sp-dsgvo .embed-responsive-1by1::before{padding-top:100%}.sp-dsgvo .flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.sp-dsgvo .flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.sp-dsgvo .flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.sp-dsgvo .flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.sp-dsgvo .flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.sp-dsgvo .flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.sp-dsgvo .flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.sp-dsgvo .flex-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.sp-dsgvo .flex-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.sp-dsgvo .flex-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.sp-dsgvo .flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.sp-dsgvo .flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.sp-dsgvo .justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.sp-dsgvo .justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.sp-dsgvo .justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.sp-dsgvo .justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.sp-dsgvo .justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.sp-dsgvo .align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.sp-dsgvo .align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.sp-dsgvo .align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.sp-dsgvo .align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.sp-dsgvo .align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.sp-dsgvo .align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.sp-dsgvo .align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.sp-dsgvo .align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.sp-dsgvo .align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.sp-dsgvo .align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.sp-dsgvo .align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.sp-dsgvo .align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.sp-dsgvo .align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.sp-dsgvo .align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.sp-dsgvo .align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.sp-dsgvo .align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.sp-dsgvo .align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.sp-dsgvo .flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.sp-dsgvo .flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.sp-dsgvo .flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.sp-dsgvo .flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.sp-dsgvo .flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.sp-dsgvo .flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.sp-dsgvo .flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.sp-dsgvo .flex-sm-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.sp-dsgvo .flex-sm-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.sp-dsgvo .flex-sm-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.sp-dsgvo .flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.sp-dsgvo .flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.sp-dsgvo .justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.sp-dsgvo .justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.sp-dsgvo .justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.sp-dsgvo .justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.sp-dsgvo .justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.sp-dsgvo .align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.sp-dsgvo .align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.sp-dsgvo .align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.sp-dsgvo .align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.sp-dsgvo .align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.sp-dsgvo .align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.sp-dsgvo .align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.sp-dsgvo .align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.sp-dsgvo .align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.sp-dsgvo .align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.sp-dsgvo .align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.sp-dsgvo .align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.sp-dsgvo .align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.sp-dsgvo .align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.sp-dsgvo .align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.sp-dsgvo .align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.sp-dsgvo .align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.sp-dsgvo .flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.sp-dsgvo .flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.sp-dsgvo .flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.sp-dsgvo .flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.sp-dsgvo .flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.sp-dsgvo .flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.sp-dsgvo .flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.sp-dsgvo .flex-md-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.sp-dsgvo .flex-md-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.sp-dsgvo .flex-md-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.sp-dsgvo .flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.sp-dsgvo .flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.sp-dsgvo .justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.sp-dsgvo .justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.sp-dsgvo .justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.sp-dsgvo .justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.sp-dsgvo .justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.sp-dsgvo .align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.sp-dsgvo .align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.sp-dsgvo .align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.sp-dsgvo .align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.sp-dsgvo .align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.sp-dsgvo .align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.sp-dsgvo .align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.sp-dsgvo .align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.sp-dsgvo .align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.sp-dsgvo .align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.sp-dsgvo .align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.sp-dsgvo .align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.sp-dsgvo .align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.sp-dsgvo .align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.sp-dsgvo .align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.sp-dsgvo .align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.sp-dsgvo .align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.sp-dsgvo .flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.sp-dsgvo .flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.sp-dsgvo .flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.sp-dsgvo .flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.sp-dsgvo .flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.sp-dsgvo .flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.sp-dsgvo .flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.sp-dsgvo .flex-lg-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.sp-dsgvo .flex-lg-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.sp-dsgvo .flex-lg-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.sp-dsgvo .flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.sp-dsgvo .flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.sp-dsgvo .justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.sp-dsgvo .justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.sp-dsgvo .justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.sp-dsgvo .justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.sp-dsgvo .justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.sp-dsgvo .align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.sp-dsgvo .align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.sp-dsgvo .align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.sp-dsgvo .align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.sp-dsgvo .align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.sp-dsgvo .align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.sp-dsgvo .align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.sp-dsgvo .align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.sp-dsgvo .align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.sp-dsgvo .align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.sp-dsgvo .align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.sp-dsgvo .align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.sp-dsgvo .align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.sp-dsgvo .align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.sp-dsgvo .align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.sp-dsgvo .align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.sp-dsgvo .align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.sp-dsgvo .flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.sp-dsgvo .flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.sp-dsgvo .flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.sp-dsgvo .flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.sp-dsgvo .flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.sp-dsgvo .flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.sp-dsgvo .flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.sp-dsgvo .flex-xl-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.sp-dsgvo .flex-xl-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.sp-dsgvo .flex-xl-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.sp-dsgvo .flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.sp-dsgvo .flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.sp-dsgvo .justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.sp-dsgvo .justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.sp-dsgvo .justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.sp-dsgvo .justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.sp-dsgvo .justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.sp-dsgvo .align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.sp-dsgvo .align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.sp-dsgvo .align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.sp-dsgvo .align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.sp-dsgvo .align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.sp-dsgvo .align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.sp-dsgvo .align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.sp-dsgvo .align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.sp-dsgvo .align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.sp-dsgvo .align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.sp-dsgvo .align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.sp-dsgvo .align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.sp-dsgvo .align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.sp-dsgvo .align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.sp-dsgvo .align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.sp-dsgvo .align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.sp-dsgvo .align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.sp-dsgvo .float-left{float:left !important}.sp-dsgvo .float-right{float:right !important}.sp-dsgvo .float-none{float:none !important}@media (min-width: 576px){.sp-dsgvo .float-sm-left{float:left !important}.sp-dsgvo .float-sm-right{float:right !important}.sp-dsgvo .float-sm-none{float:none !important}}@media (min-width: 768px){.sp-dsgvo .float-md-left{float:left !important}.sp-dsgvo .float-md-right{float:right !important}.sp-dsgvo .float-md-none{float:none !important}}@media (min-width: 992px){.sp-dsgvo .float-lg-left{float:left !important}.sp-dsgvo .float-lg-right{float:right !important}.sp-dsgvo .float-lg-none{float:none !important}}@media (min-width: 1200px){.sp-dsgvo .float-xl-left{float:left !important}.sp-dsgvo .float-xl-right{float:right !important}.sp-dsgvo .float-xl-none{float:none !important}}.sp-dsgvo .overflow-auto{overflow:auto !important}.sp-dsgvo .overflow-hidden{overflow:hidden !important}.sp-dsgvo .position-static{position:static !important}.sp-dsgvo .position-relative{position:relative !important}.sp-dsgvo .position-absolute{position:absolute !important}.sp-dsgvo .position-fixed{position:fixed !important}.sp-dsgvo .position-sticky{position:-webkit-sticky !important;position:sticky !important}.sp-dsgvo .fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.sp-dsgvo .fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sp-dsgvo .sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sp-dsgvo .sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sp-dsgvo .sr-only-focusable:active,.sp-dsgvo .sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.sp-dsgvo .shadow-sm{-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.sp-dsgvo .shadow{-webkit-box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.sp-dsgvo .shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important;box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.sp-dsgvo .shadow-none{-webkit-box-shadow:none !important;box-shadow:none !important}.sp-dsgvo .w-25{width:25% !important}.sp-dsgvo .w-50{width:50% !important}.sp-dsgvo .w-75{width:75% !important}.sp-dsgvo .w-100{width:100% !important}.sp-dsgvo .w-auto{width:auto !important}.sp-dsgvo .h-25{height:25% !important}.sp-dsgvo .h-50{height:50% !important}.sp-dsgvo .h-75{height:75% !important}.sp-dsgvo .h-100{height:100% !important}.sp-dsgvo .h-auto{height:auto !important}.sp-dsgvo .mw-100{max-width:100% !important}.sp-dsgvo .mh-100{max-height:100% !important}.sp-dsgvo .min-vw-100{min-width:100vw !important}.sp-dsgvo .min-vh-100{min-height:100vh !important}.sp-dsgvo .vw-100{width:100vw !important}.sp-dsgvo .vh-100{height:100vh !important}.sp-dsgvo .stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.sp-dsgvo .m-0{margin:0 !important}.sp-dsgvo .mt-0,.sp-dsgvo .my-0{margin-top:0 !important}.sp-dsgvo .mr-0,.sp-dsgvo .mx-0{margin-right:0 !important}.sp-dsgvo .mb-0,.sp-dsgvo .my-0{margin-bottom:0 !important}.sp-dsgvo .ml-0,.sp-dsgvo .mx-0{margin-left:0 !important}.sp-dsgvo .m-1{margin:0.25rem !important}.sp-dsgvo .mt-1,.sp-dsgvo .my-1{margin-top:0.25rem !important}.sp-dsgvo .mr-1,.sp-dsgvo .mx-1{margin-right:0.25rem !important}.sp-dsgvo .mb-1,.sp-dsgvo .my-1{margin-bottom:0.25rem !important}.sp-dsgvo .ml-1,.sp-dsgvo .mx-1{margin-left:0.25rem !important}.sp-dsgvo .m-2{margin:0.5rem !important}.sp-dsgvo .mt-2,.sp-dsgvo .my-2{margin-top:0.5rem !important}.sp-dsgvo .mr-2,.sp-dsgvo .mx-2{margin-right:0.5rem !important}.sp-dsgvo .mb-2,.sp-dsgvo .my-2{margin-bottom:0.5rem !important}.sp-dsgvo .ml-2,.sp-dsgvo .mx-2{margin-left:0.5rem !important}.sp-dsgvo .m-3{margin:1rem !important}.sp-dsgvo .mt-3,.sp-dsgvo .my-3{margin-top:1rem !important}.sp-dsgvo .mr-3,.sp-dsgvo .mx-3{margin-right:1rem !important}.sp-dsgvo .mb-3,.sp-dsgvo .my-3{margin-bottom:1rem !important}.sp-dsgvo .ml-3,.sp-dsgvo .mx-3{margin-left:1rem !important}.sp-dsgvo .m-4{margin:1.5rem !important}.sp-dsgvo .mt-4,.sp-dsgvo .my-4{margin-top:1.5rem !important}.sp-dsgvo .mr-4,.sp-dsgvo .mx-4{margin-right:1.5rem !important}.sp-dsgvo .mb-4,.sp-dsgvo .my-4{margin-bottom:1.5rem !important}.sp-dsgvo .ml-4,.sp-dsgvo .mx-4{margin-left:1.5rem !important}.sp-dsgvo .m-5{margin:3rem !important}.sp-dsgvo .mt-5,.sp-dsgvo .my-5{margin-top:3rem !important}.sp-dsgvo .mr-5,.sp-dsgvo .mx-5{margin-right:3rem !important}.sp-dsgvo .mb-5,.sp-dsgvo .my-5{margin-bottom:3rem !important}.sp-dsgvo .ml-5,.sp-dsgvo .mx-5{margin-left:3rem !important}.sp-dsgvo .p-0{padding:0 !important}.sp-dsgvo .pt-0,.sp-dsgvo .py-0{padding-top:0 !important}.sp-dsgvo .pr-0,.sp-dsgvo .px-0{padding-right:0 !important}.sp-dsgvo .pb-0,.sp-dsgvo .py-0{padding-bottom:0 !important}.sp-dsgvo .pl-0,.sp-dsgvo .px-0{padding-left:0 !important}.sp-dsgvo .p-1{padding:0.25rem !important}.sp-dsgvo .pt-1,.sp-dsgvo .py-1{padding-top:0.25rem !important}.sp-dsgvo .pr-1,.sp-dsgvo .px-1{padding-right:0.25rem !important}.sp-dsgvo .pb-1,.sp-dsgvo .py-1{padding-bottom:0.25rem !important}.sp-dsgvo .pl-1,.sp-dsgvo .px-1{padding-left:0.25rem !important}.sp-dsgvo .p-2{padding:0.5rem !important}.sp-dsgvo .pt-2,.sp-dsgvo .py-2{padding-top:0.5rem !important}.sp-dsgvo .pr-2,.sp-dsgvo .px-2{padding-right:0.5rem !important}.sp-dsgvo .pb-2,.sp-dsgvo .py-2{padding-bottom:0.5rem !important}.sp-dsgvo .pl-2,.sp-dsgvo .px-2{padding-left:0.5rem !important}.sp-dsgvo .p-3{padding:1rem !important}.sp-dsgvo .pt-3,.sp-dsgvo .py-3{padding-top:1rem !important}.sp-dsgvo .pr-3,.sp-dsgvo .px-3{padding-right:1rem !important}.sp-dsgvo .pb-3,.sp-dsgvo .py-3{padding-bottom:1rem !important}.sp-dsgvo .pl-3,.sp-dsgvo .px-3{padding-left:1rem !important}.sp-dsgvo .p-4{padding:1.5rem !important}.sp-dsgvo .pt-4,.sp-dsgvo .py-4{padding-top:1.5rem !important}.sp-dsgvo .pr-4,.sp-dsgvo .px-4{padding-right:1.5rem !important}.sp-dsgvo .pb-4,.sp-dsgvo .py-4{padding-bottom:1.5rem !important}.sp-dsgvo .pl-4,.sp-dsgvo .px-4{padding-left:1.5rem !important}.sp-dsgvo .p-5{padding:3rem !important}.sp-dsgvo .pt-5,.sp-dsgvo .py-5{padding-top:3rem !important}.sp-dsgvo .pr-5,.sp-dsgvo .px-5{padding-right:3rem !important}.sp-dsgvo .pb-5,.sp-dsgvo .py-5{padding-bottom:3rem !important}.sp-dsgvo .pl-5,.sp-dsgvo .px-5{padding-left:3rem !important}.sp-dsgvo .m-n1{margin:-0.25rem !important}.sp-dsgvo .mt-n1,.sp-dsgvo .my-n1{margin-top:-0.25rem !important}.sp-dsgvo .mr-n1,.sp-dsgvo .mx-n1{margin-right:-0.25rem !important}.sp-dsgvo .mb-n1,.sp-dsgvo .my-n1{margin-bottom:-0.25rem !important}.sp-dsgvo .ml-n1,.sp-dsgvo .mx-n1{margin-left:-0.25rem !important}.sp-dsgvo .m-n2{margin:-0.5rem !important}.sp-dsgvo .mt-n2,.sp-dsgvo .my-n2{margin-top:-0.5rem !important}.sp-dsgvo .mr-n2,.sp-dsgvo .mx-n2{margin-right:-0.5rem !important}.sp-dsgvo .mb-n2,.sp-dsgvo .my-n2{margin-bottom:-0.5rem !important}.sp-dsgvo .ml-n2,.sp-dsgvo .mx-n2{margin-left:-0.5rem !important}.sp-dsgvo .m-n3{margin:-1rem !important}.sp-dsgvo .mt-n3,.sp-dsgvo .my-n3{margin-top:-1rem !important}.sp-dsgvo .mr-n3,.sp-dsgvo .mx-n3{margin-right:-1rem !important}.sp-dsgvo .mb-n3,.sp-dsgvo .my-n3{margin-bottom:-1rem !important}.sp-dsgvo .ml-n3,.sp-dsgvo .mx-n3{margin-left:-1rem !important}.sp-dsgvo .m-n4{margin:-1.5rem !important}.sp-dsgvo .mt-n4,.sp-dsgvo .my-n4{margin-top:-1.5rem !important}.sp-dsgvo .mr-n4,.sp-dsgvo .mx-n4{margin-right:-1.5rem !important}.sp-dsgvo .mb-n4,.sp-dsgvo .my-n4{margin-bottom:-1.5rem !important}.sp-dsgvo .ml-n4,.sp-dsgvo .mx-n4{margin-left:-1.5rem !important}.sp-dsgvo .m-n5{margin:-3rem !important}.sp-dsgvo .mt-n5,.sp-dsgvo .my-n5{margin-top:-3rem !important}.sp-dsgvo .mr-n5,.sp-dsgvo .mx-n5{margin-right:-3rem !important}.sp-dsgvo .mb-n5,.sp-dsgvo .my-n5{margin-bottom:-3rem !important}.sp-dsgvo .ml-n5,.sp-dsgvo .mx-n5{margin-left:-3rem !important}.sp-dsgvo .m-auto{margin:auto !important}.sp-dsgvo .mt-auto,.sp-dsgvo .my-auto{margin-top:auto !important}.sp-dsgvo .mr-auto,.sp-dsgvo .mx-auto{margin-right:auto !important}.sp-dsgvo .mb-auto,.sp-dsgvo .my-auto{margin-bottom:auto !important}.sp-dsgvo .ml-auto,.sp-dsgvo .mx-auto{margin-left:auto !important}@media (min-width: 576px){.sp-dsgvo .m-sm-0{margin:0 !important}.sp-dsgvo .mt-sm-0,.sp-dsgvo .my-sm-0{margin-top:0 !important}.sp-dsgvo .mr-sm-0,.sp-dsgvo .mx-sm-0{margin-right:0 !important}.sp-dsgvo .mb-sm-0,.sp-dsgvo .my-sm-0{margin-bottom:0 !important}.sp-dsgvo .ml-sm-0,.sp-dsgvo .mx-sm-0{margin-left:0 !important}.sp-dsgvo .m-sm-1{margin:0.25rem !important}.sp-dsgvo .mt-sm-1,.sp-dsgvo .my-sm-1{margin-top:0.25rem !important}.sp-dsgvo .mr-sm-1,.sp-dsgvo .mx-sm-1{margin-right:0.25rem !important}.sp-dsgvo .mb-sm-1,.sp-dsgvo .my-sm-1{margin-bottom:0.25rem !important}.sp-dsgvo .ml-sm-1,.sp-dsgvo .mx-sm-1{margin-left:0.25rem !important}.sp-dsgvo .m-sm-2{margin:0.5rem !important}.sp-dsgvo .mt-sm-2,.sp-dsgvo .my-sm-2{margin-top:0.5rem !important}.sp-dsgvo .mr-sm-2,.sp-dsgvo .mx-sm-2{margin-right:0.5rem !important}.sp-dsgvo .mb-sm-2,.sp-dsgvo .my-sm-2{margin-bottom:0.5rem !important}.sp-dsgvo .ml-sm-2,.sp-dsgvo .mx-sm-2{margin-left:0.5rem !important}.sp-dsgvo .m-sm-3{margin:1rem !important}.sp-dsgvo .mt-sm-3,.sp-dsgvo .my-sm-3{margin-top:1rem !important}.sp-dsgvo .mr-sm-3,.sp-dsgvo .mx-sm-3{margin-right:1rem !important}.sp-dsgvo .mb-sm-3,.sp-dsgvo .my-sm-3{margin-bottom:1rem !important}.sp-dsgvo .ml-sm-3,.sp-dsgvo .mx-sm-3{margin-left:1rem !important}.sp-dsgvo .m-sm-4{margin:1.5rem !important}.sp-dsgvo .mt-sm-4,.sp-dsgvo .my-sm-4{margin-top:1.5rem !important}.sp-dsgvo .mr-sm-4,.sp-dsgvo .mx-sm-4{margin-right:1.5rem !important}.sp-dsgvo .mb-sm-4,.sp-dsgvo .my-sm-4{margin-bottom:1.5rem !important}.sp-dsgvo .ml-sm-4,.sp-dsgvo .mx-sm-4{margin-left:1.5rem !important}.sp-dsgvo .m-sm-5{margin:3rem !important}.sp-dsgvo .mt-sm-5,.sp-dsgvo .my-sm-5{margin-top:3rem !important}.sp-dsgvo .mr-sm-5,.sp-dsgvo .mx-sm-5{margin-right:3rem !important}.sp-dsgvo .mb-sm-5,.sp-dsgvo .my-sm-5{margin-bottom:3rem !important}.sp-dsgvo .ml-sm-5,.sp-dsgvo .mx-sm-5{margin-left:3rem !important}.sp-dsgvo .p-sm-0{padding:0 !important}.sp-dsgvo .pt-sm-0,.sp-dsgvo .py-sm-0{padding-top:0 !important}.sp-dsgvo .pr-sm-0,.sp-dsgvo .px-sm-0{padding-right:0 !important}.sp-dsgvo .pb-sm-0,.sp-dsgvo .py-sm-0{padding-bottom:0 !important}.sp-dsgvo .pl-sm-0,.sp-dsgvo .px-sm-0{padding-left:0 !important}.sp-dsgvo .p-sm-1{padding:0.25rem !important}.sp-dsgvo .pt-sm-1,.sp-dsgvo .py-sm-1{padding-top:0.25rem !important}.sp-dsgvo .pr-sm-1,.sp-dsgvo .px-sm-1{padding-right:0.25rem !important}.sp-dsgvo .pb-sm-1,.sp-dsgvo .py-sm-1{padding-bottom:0.25rem !important}.sp-dsgvo .pl-sm-1,.sp-dsgvo .px-sm-1{padding-left:0.25rem !important}.sp-dsgvo .p-sm-2{padding:0.5rem !important}.sp-dsgvo .pt-sm-2,.sp-dsgvo .py-sm-2{padding-top:0.5rem !important}.sp-dsgvo .pr-sm-2,.sp-dsgvo .px-sm-2{padding-right:0.5rem !important}.sp-dsgvo .pb-sm-2,.sp-dsgvo .py-sm-2{padding-bottom:0.5rem !important}.sp-dsgvo .pl-sm-2,.sp-dsgvo .px-sm-2{padding-left:0.5rem !important}.sp-dsgvo .p-sm-3{padding:1rem !important}.sp-dsgvo .pt-sm-3,.sp-dsgvo .py-sm-3{padding-top:1rem !important}.sp-dsgvo .pr-sm-3,.sp-dsgvo .px-sm-3{padding-right:1rem !important}.sp-dsgvo .pb-sm-3,.sp-dsgvo .py-sm-3{padding-bottom:1rem !important}.sp-dsgvo .pl-sm-3,.sp-dsgvo .px-sm-3{padding-left:1rem !important}.sp-dsgvo .p-sm-4{padding:1.5rem !important}.sp-dsgvo .pt-sm-4,.sp-dsgvo .py-sm-4{padding-top:1.5rem !important}.sp-dsgvo .pr-sm-4,.sp-dsgvo .px-sm-4{padding-right:1.5rem !important}.sp-dsgvo .pb-sm-4,.sp-dsgvo .py-sm-4{padding-bottom:1.5rem !important}.sp-dsgvo .pl-sm-4,.sp-dsgvo .px-sm-4{padding-left:1.5rem !important}.sp-dsgvo .p-sm-5{padding:3rem !important}.sp-dsgvo .pt-sm-5,.sp-dsgvo .py-sm-5{padding-top:3rem !important}.sp-dsgvo .pr-sm-5,.sp-dsgvo .px-sm-5{padding-right:3rem !important}.sp-dsgvo .pb-sm-5,.sp-dsgvo .py-sm-5{padding-bottom:3rem !important}.sp-dsgvo .pl-sm-5,.sp-dsgvo .px-sm-5{padding-left:3rem !important}.sp-dsgvo .m-sm-n1{margin:-0.25rem !important}.sp-dsgvo .mt-sm-n1,.sp-dsgvo .my-sm-n1{margin-top:-0.25rem !important}.sp-dsgvo .mr-sm-n1,.sp-dsgvo .mx-sm-n1{margin-right:-0.25rem !important}.sp-dsgvo .mb-sm-n1,.sp-dsgvo .my-sm-n1{margin-bottom:-0.25rem !important}.sp-dsgvo .ml-sm-n1,.sp-dsgvo .mx-sm-n1{margin-left:-0.25rem !important}.sp-dsgvo .m-sm-n2{margin:-0.5rem !important}.sp-dsgvo .mt-sm-n2,.sp-dsgvo .my-sm-n2{margin-top:-0.5rem !important}.sp-dsgvo .mr-sm-n2,.sp-dsgvo .mx-sm-n2{margin-right:-0.5rem !important}.sp-dsgvo .mb-sm-n2,.sp-dsgvo .my-sm-n2{margin-bottom:-0.5rem !important}.sp-dsgvo .ml-sm-n2,.sp-dsgvo .mx-sm-n2{margin-left:-0.5rem !important}.sp-dsgvo .m-sm-n3{margin:-1rem !important}.sp-dsgvo .mt-sm-n3,.sp-dsgvo .my-sm-n3{margin-top:-1rem !important}.sp-dsgvo .mr-sm-n3,.sp-dsgvo .mx-sm-n3{margin-right:-1rem !important}.sp-dsgvo .mb-sm-n3,.sp-dsgvo .my-sm-n3{margin-bottom:-1rem !important}.sp-dsgvo .ml-sm-n3,.sp-dsgvo .mx-sm-n3{margin-left:-1rem !important}.sp-dsgvo .m-sm-n4{margin:-1.5rem !important}.sp-dsgvo .mt-sm-n4,.sp-dsgvo .my-sm-n4{margin-top:-1.5rem !important}.sp-dsgvo .mr-sm-n4,.sp-dsgvo .mx-sm-n4{margin-right:-1.5rem !important}.sp-dsgvo .mb-sm-n4,.sp-dsgvo .my-sm-n4{margin-bottom:-1.5rem !important}.sp-dsgvo .ml-sm-n4,.sp-dsgvo .mx-sm-n4{margin-left:-1.5rem !important}.sp-dsgvo .m-sm-n5{margin:-3rem !important}.sp-dsgvo .mt-sm-n5,.sp-dsgvo .my-sm-n5{margin-top:-3rem !important}.sp-dsgvo .mr-sm-n5,.sp-dsgvo .mx-sm-n5{margin-right:-3rem !important}.sp-dsgvo .mb-sm-n5,.sp-dsgvo .my-sm-n5{margin-bottom:-3rem !important}.sp-dsgvo .ml-sm-n5,.sp-dsgvo .mx-sm-n5{margin-left:-3rem !important}.sp-dsgvo .m-sm-auto{margin:auto !important}.sp-dsgvo .mt-sm-auto,.sp-dsgvo .my-sm-auto{margin-top:auto !important}.sp-dsgvo .mr-sm-auto,.sp-dsgvo .mx-sm-auto{margin-right:auto !important}.sp-dsgvo .mb-sm-auto,.sp-dsgvo .my-sm-auto{margin-bottom:auto !important}.sp-dsgvo .ml-sm-auto,.sp-dsgvo .mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.sp-dsgvo .m-md-0{margin:0 !important}.sp-dsgvo .mt-md-0,.sp-dsgvo .my-md-0{margin-top:0 !important}.sp-dsgvo .mr-md-0,.sp-dsgvo .mx-md-0{margin-right:0 !important}.sp-dsgvo .mb-md-0,.sp-dsgvo .my-md-0{margin-bottom:0 !important}.sp-dsgvo .ml-md-0,.sp-dsgvo .mx-md-0{margin-left:0 !important}.sp-dsgvo .m-md-1{margin:0.25rem !important}.sp-dsgvo .mt-md-1,.sp-dsgvo .my-md-1{margin-top:0.25rem !important}.sp-dsgvo .mr-md-1,.sp-dsgvo .mx-md-1{margin-right:0.25rem !important}.sp-dsgvo .mb-md-1,.sp-dsgvo .my-md-1{margin-bottom:0.25rem !important}.sp-dsgvo .ml-md-1,.sp-dsgvo .mx-md-1{margin-left:0.25rem !important}.sp-dsgvo .m-md-2{margin:0.5rem !important}.sp-dsgvo .mt-md-2,.sp-dsgvo .my-md-2{margin-top:0.5rem !important}.sp-dsgvo .mr-md-2,.sp-dsgvo .mx-md-2{margin-right:0.5rem !important}.sp-dsgvo .mb-md-2,.sp-dsgvo .my-md-2{margin-bottom:0.5rem !important}.sp-dsgvo .ml-md-2,.sp-dsgvo .mx-md-2{margin-left:0.5rem !important}.sp-dsgvo .m-md-3{margin:1rem !important}.sp-dsgvo .mt-md-3,.sp-dsgvo .my-md-3{margin-top:1rem !important}.sp-dsgvo .mr-md-3,.sp-dsgvo .mx-md-3{margin-right:1rem !important}.sp-dsgvo .mb-md-3,.sp-dsgvo .my-md-3{margin-bottom:1rem !important}.sp-dsgvo .ml-md-3,.sp-dsgvo .mx-md-3{margin-left:1rem !important}.sp-dsgvo .m-md-4{margin:1.5rem !important}.sp-dsgvo .mt-md-4,.sp-dsgvo .my-md-4{margin-top:1.5rem !important}.sp-dsgvo .mr-md-4,.sp-dsgvo .mx-md-4{margin-right:1.5rem !important}.sp-dsgvo .mb-md-4,.sp-dsgvo .my-md-4{margin-bottom:1.5rem !important}.sp-dsgvo .ml-md-4,.sp-dsgvo .mx-md-4{margin-left:1.5rem !important}.sp-dsgvo .m-md-5{margin:3rem !important}.sp-dsgvo .mt-md-5,.sp-dsgvo .my-md-5{margin-top:3rem !important}.sp-dsgvo .mr-md-5,.sp-dsgvo .mx-md-5{margin-right:3rem !important}.sp-dsgvo .mb-md-5,.sp-dsgvo .my-md-5{margin-bottom:3rem !important}.sp-dsgvo .ml-md-5,.sp-dsgvo .mx-md-5{margin-left:3rem !important}.sp-dsgvo .p-md-0{padding:0 !important}.sp-dsgvo .pt-md-0,.sp-dsgvo .py-md-0{padding-top:0 !important}.sp-dsgvo .pr-md-0,.sp-dsgvo .px-md-0{padding-right:0 !important}.sp-dsgvo .pb-md-0,.sp-dsgvo .py-md-0{padding-bottom:0 !important}.sp-dsgvo .pl-md-0,.sp-dsgvo .px-md-0{padding-left:0 !important}.sp-dsgvo .p-md-1{padding:0.25rem !important}.sp-dsgvo .pt-md-1,.sp-dsgvo .py-md-1{padding-top:0.25rem !important}.sp-dsgvo .pr-md-1,.sp-dsgvo .px-md-1{padding-right:0.25rem !important}.sp-dsgvo .pb-md-1,.sp-dsgvo .py-md-1{padding-bottom:0.25rem !important}.sp-dsgvo .pl-md-1,.sp-dsgvo .px-md-1{padding-left:0.25rem !important}.sp-dsgvo .p-md-2{padding:0.5rem !important}.sp-dsgvo .pt-md-2,.sp-dsgvo .py-md-2{padding-top:0.5rem !important}.sp-dsgvo .pr-md-2,.sp-dsgvo .px-md-2{padding-right:0.5rem !important}.sp-dsgvo .pb-md-2,.sp-dsgvo .py-md-2{padding-bottom:0.5rem !important}.sp-dsgvo .pl-md-2,.sp-dsgvo .px-md-2{padding-left:0.5rem !important}.sp-dsgvo .p-md-3{padding:1rem !important}.sp-dsgvo .pt-md-3,.sp-dsgvo .py-md-3{padding-top:1rem !important}.sp-dsgvo .pr-md-3,.sp-dsgvo .px-md-3{padding-right:1rem !important}.sp-dsgvo .pb-md-3,.sp-dsgvo .py-md-3{padding-bottom:1rem !important}.sp-dsgvo .pl-md-3,.sp-dsgvo .px-md-3{padding-left:1rem !important}.sp-dsgvo .p-md-4{padding:1.5rem !important}.sp-dsgvo .pt-md-4,.sp-dsgvo .py-md-4{padding-top:1.5rem !important}.sp-dsgvo .pr-md-4,.sp-dsgvo .px-md-4{padding-right:1.5rem !important}.sp-dsgvo .pb-md-4,.sp-dsgvo .py-md-4{padding-bottom:1.5rem !important}.sp-dsgvo .pl-md-4,.sp-dsgvo .px-md-4{padding-left:1.5rem !important}.sp-dsgvo .p-md-5{padding:3rem !important}.sp-dsgvo .pt-md-5,.sp-dsgvo .py-md-5{padding-top:3rem !important}.sp-dsgvo .pr-md-5,.sp-dsgvo .px-md-5{padding-right:3rem !important}.sp-dsgvo .pb-md-5,.sp-dsgvo .py-md-5{padding-bottom:3rem !important}.sp-dsgvo .pl-md-5,.sp-dsgvo .px-md-5{padding-left:3rem !important}.sp-dsgvo .m-md-n1{margin:-0.25rem !important}.sp-dsgvo .mt-md-n1,.sp-dsgvo .my-md-n1{margin-top:-0.25rem !important}.sp-dsgvo .mr-md-n1,.sp-dsgvo .mx-md-n1{margin-right:-0.25rem !important}.sp-dsgvo .mb-md-n1,.sp-dsgvo .my-md-n1{margin-bottom:-0.25rem !important}.sp-dsgvo .ml-md-n1,.sp-dsgvo .mx-md-n1{margin-left:-0.25rem !important}.sp-dsgvo .m-md-n2{margin:-0.5rem !important}.sp-dsgvo .mt-md-n2,.sp-dsgvo .my-md-n2{margin-top:-0.5rem !important}.sp-dsgvo .mr-md-n2,.sp-dsgvo .mx-md-n2{margin-right:-0.5rem !important}.sp-dsgvo .mb-md-n2,.sp-dsgvo .my-md-n2{margin-bottom:-0.5rem !important}.sp-dsgvo .ml-md-n2,.sp-dsgvo .mx-md-n2{margin-left:-0.5rem !important}.sp-dsgvo .m-md-n3{margin:-1rem !important}.sp-dsgvo .mt-md-n3,.sp-dsgvo .my-md-n3{margin-top:-1rem !important}.sp-dsgvo .mr-md-n3,.sp-dsgvo .mx-md-n3{margin-right:-1rem !important}.sp-dsgvo .mb-md-n3,.sp-dsgvo .my-md-n3{margin-bottom:-1rem !important}.sp-dsgvo .ml-md-n3,.sp-dsgvo .mx-md-n3{margin-left:-1rem !important}.sp-dsgvo .m-md-n4{margin:-1.5rem !important}.sp-dsgvo .mt-md-n4,.sp-dsgvo .my-md-n4{margin-top:-1.5rem !important}.sp-dsgvo .mr-md-n4,.sp-dsgvo .mx-md-n4{margin-right:-1.5rem !important}.sp-dsgvo .mb-md-n4,.sp-dsgvo .my-md-n4{margin-bottom:-1.5rem !important}.sp-dsgvo .ml-md-n4,.sp-dsgvo .mx-md-n4{margin-left:-1.5rem !important}.sp-dsgvo .m-md-n5{margin:-3rem !important}.sp-dsgvo .mt-md-n5,.sp-dsgvo .my-md-n5{margin-top:-3rem !important}.sp-dsgvo .mr-md-n5,.sp-dsgvo .mx-md-n5{margin-right:-3rem !important}.sp-dsgvo .mb-md-n5,.sp-dsgvo .my-md-n5{margin-bottom:-3rem !important}.sp-dsgvo .ml-md-n5,.sp-dsgvo .mx-md-n5{margin-left:-3rem !important}.sp-dsgvo .m-md-auto{margin:auto !important}.sp-dsgvo .mt-md-auto,.sp-dsgvo .my-md-auto{margin-top:auto !important}.sp-dsgvo .mr-md-auto,.sp-dsgvo .mx-md-auto{margin-right:auto !important}.sp-dsgvo .mb-md-auto,.sp-dsgvo .my-md-auto{margin-bottom:auto !important}.sp-dsgvo .ml-md-auto,.sp-dsgvo .mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.sp-dsgvo .m-lg-0{margin:0 !important}.sp-dsgvo .mt-lg-0,.sp-dsgvo .my-lg-0{margin-top:0 !important}.sp-dsgvo .mr-lg-0,.sp-dsgvo .mx-lg-0{margin-right:0 !important}.sp-dsgvo .mb-lg-0,.sp-dsgvo .my-lg-0{margin-bottom:0 !important}.sp-dsgvo .ml-lg-0,.sp-dsgvo .mx-lg-0{margin-left:0 !important}.sp-dsgvo .m-lg-1{margin:0.25rem !important}.sp-dsgvo .mt-lg-1,.sp-dsgvo .my-lg-1{margin-top:0.25rem !important}.sp-dsgvo .mr-lg-1,.sp-dsgvo .mx-lg-1{margin-right:0.25rem !important}.sp-dsgvo .mb-lg-1,.sp-dsgvo .my-lg-1{margin-bottom:0.25rem !important}.sp-dsgvo .ml-lg-1,.sp-dsgvo .mx-lg-1{margin-left:0.25rem !important}.sp-dsgvo .m-lg-2{margin:0.5rem !important}.sp-dsgvo .mt-lg-2,.sp-dsgvo .my-lg-2{margin-top:0.5rem !important}.sp-dsgvo .mr-lg-2,.sp-dsgvo .mx-lg-2{margin-right:0.5rem !important}.sp-dsgvo .mb-lg-2,.sp-dsgvo .my-lg-2{margin-bottom:0.5rem !important}.sp-dsgvo .ml-lg-2,.sp-dsgvo .mx-lg-2{margin-left:0.5rem !important}.sp-dsgvo .m-lg-3{margin:1rem !important}.sp-dsgvo .mt-lg-3,.sp-dsgvo .my-lg-3{margin-top:1rem !important}.sp-dsgvo .mr-lg-3,.sp-dsgvo .mx-lg-3{margin-right:1rem !important}.sp-dsgvo .mb-lg-3,.sp-dsgvo .my-lg-3{margin-bottom:1rem !important}.sp-dsgvo .ml-lg-3,.sp-dsgvo .mx-lg-3{margin-left:1rem !important}.sp-dsgvo .m-lg-4{margin:1.5rem !important}.sp-dsgvo .mt-lg-4,.sp-dsgvo .my-lg-4{margin-top:1.5rem !important}.sp-dsgvo .mr-lg-4,.sp-dsgvo .mx-lg-4{margin-right:1.5rem !important}.sp-dsgvo .mb-lg-4,.sp-dsgvo .my-lg-4{margin-bottom:1.5rem !important}.sp-dsgvo .ml-lg-4,.sp-dsgvo .mx-lg-4{margin-left:1.5rem !important}.sp-dsgvo .m-lg-5{margin:3rem !important}.sp-dsgvo .mt-lg-5,.sp-dsgvo .my-lg-5{margin-top:3rem !important}.sp-dsgvo .mr-lg-5,.sp-dsgvo .mx-lg-5{margin-right:3rem !important}.sp-dsgvo .mb-lg-5,.sp-dsgvo .my-lg-5{margin-bottom:3rem !important}.sp-dsgvo .ml-lg-5,.sp-dsgvo .mx-lg-5{margin-left:3rem !important}.sp-dsgvo .p-lg-0{padding:0 !important}.sp-dsgvo .pt-lg-0,.sp-dsgvo .py-lg-0{padding-top:0 !important}.sp-dsgvo .pr-lg-0,.sp-dsgvo .px-lg-0{padding-right:0 !important}.sp-dsgvo .pb-lg-0,.sp-dsgvo .py-lg-0{padding-bottom:0 !important}.sp-dsgvo .pl-lg-0,.sp-dsgvo .px-lg-0{padding-left:0 !important}.sp-dsgvo .p-lg-1{padding:0.25rem !important}.sp-dsgvo .pt-lg-1,.sp-dsgvo .py-lg-1{padding-top:0.25rem !important}.sp-dsgvo .pr-lg-1,.sp-dsgvo .px-lg-1{padding-right:0.25rem !important}.sp-dsgvo .pb-lg-1,.sp-dsgvo .py-lg-1{padding-bottom:0.25rem !important}.sp-dsgvo .pl-lg-1,.sp-dsgvo .px-lg-1{padding-left:0.25rem !important}.sp-dsgvo .p-lg-2{padding:0.5rem !important}.sp-dsgvo .pt-lg-2,.sp-dsgvo .py-lg-2{padding-top:0.5rem !important}.sp-dsgvo .pr-lg-2,.sp-dsgvo .px-lg-2{padding-right:0.5rem !important}.sp-dsgvo .pb-lg-2,.sp-dsgvo .py-lg-2{padding-bottom:0.5rem !important}.sp-dsgvo .pl-lg-2,.sp-dsgvo .px-lg-2{padding-left:0.5rem !important}.sp-dsgvo .p-lg-3{padding:1rem !important}.sp-dsgvo .pt-lg-3,.sp-dsgvo .py-lg-3{padding-top:1rem !important}.sp-dsgvo .pr-lg-3,.sp-dsgvo .px-lg-3{padding-right:1rem !important}.sp-dsgvo .pb-lg-3,.sp-dsgvo .py-lg-3{padding-bottom:1rem !important}.sp-dsgvo .pl-lg-3,.sp-dsgvo .px-lg-3{padding-left:1rem !important}.sp-dsgvo .p-lg-4{padding:1.5rem !important}.sp-dsgvo .pt-lg-4,.sp-dsgvo .py-lg-4{padding-top:1.5rem !important}.sp-dsgvo .pr-lg-4,.sp-dsgvo .px-lg-4{padding-right:1.5rem !important}.sp-dsgvo .pb-lg-4,.sp-dsgvo .py-lg-4{padding-bottom:1.5rem !important}.sp-dsgvo .pl-lg-4,.sp-dsgvo .px-lg-4{padding-left:1.5rem !important}.sp-dsgvo .p-lg-5{padding:3rem !important}.sp-dsgvo .pt-lg-5,.sp-dsgvo .py-lg-5{padding-top:3rem !important}.sp-dsgvo .pr-lg-5,.sp-dsgvo .px-lg-5{padding-right:3rem !important}.sp-dsgvo .pb-lg-5,.sp-dsgvo .py-lg-5{padding-bottom:3rem !important}.sp-dsgvo .pl-lg-5,.sp-dsgvo .px-lg-5{padding-left:3rem !important}.sp-dsgvo .m-lg-n1{margin:-0.25rem !important}.sp-dsgvo .mt-lg-n1,.sp-dsgvo .my-lg-n1{margin-top:-0.25rem !important}.sp-dsgvo .mr-lg-n1,.sp-dsgvo .mx-lg-n1{margin-right:-0.25rem !important}.sp-dsgvo .mb-lg-n1,.sp-dsgvo .my-lg-n1{margin-bottom:-0.25rem !important}.sp-dsgvo .ml-lg-n1,.sp-dsgvo .mx-lg-n1{margin-left:-0.25rem !important}.sp-dsgvo .m-lg-n2{margin:-0.5rem !important}.sp-dsgvo .mt-lg-n2,.sp-dsgvo .my-lg-n2{margin-top:-0.5rem !important}.sp-dsgvo .mr-lg-n2,.sp-dsgvo .mx-lg-n2{margin-right:-0.5rem !important}.sp-dsgvo .mb-lg-n2,.sp-dsgvo .my-lg-n2{margin-bottom:-0.5rem !important}.sp-dsgvo .ml-lg-n2,.sp-dsgvo .mx-lg-n2{margin-left:-0.5rem !important}.sp-dsgvo .m-lg-n3{margin:-1rem !important}.sp-dsgvo .mt-lg-n3,.sp-dsgvo .my-lg-n3{margin-top:-1rem !important}.sp-dsgvo .mr-lg-n3,.sp-dsgvo .mx-lg-n3{margin-right:-1rem !important}.sp-dsgvo .mb-lg-n3,.sp-dsgvo .my-lg-n3{margin-bottom:-1rem !important}.sp-dsgvo .ml-lg-n3,.sp-dsgvo .mx-lg-n3{margin-left:-1rem !important}.sp-dsgvo .m-lg-n4{margin:-1.5rem !important}.sp-dsgvo .mt-lg-n4,.sp-dsgvo .my-lg-n4{margin-top:-1.5rem !important}.sp-dsgvo .mr-lg-n4,.sp-dsgvo .mx-lg-n4{margin-right:-1.5rem !important}.sp-dsgvo .mb-lg-n4,.sp-dsgvo .my-lg-n4{margin-bottom:-1.5rem !important}.sp-dsgvo .ml-lg-n4,.sp-dsgvo .mx-lg-n4{margin-left:-1.5rem !important}.sp-dsgvo .m-lg-n5{margin:-3rem !important}.sp-dsgvo .mt-lg-n5,.sp-dsgvo .my-lg-n5{margin-top:-3rem !important}.sp-dsgvo .mr-lg-n5,.sp-dsgvo .mx-lg-n5{margin-right:-3rem !important}.sp-dsgvo .mb-lg-n5,.sp-dsgvo .my-lg-n5{margin-bottom:-3rem !important}.sp-dsgvo .ml-lg-n5,.sp-dsgvo .mx-lg-n5{margin-left:-3rem !important}.sp-dsgvo .m-lg-auto{margin:auto !important}.sp-dsgvo .mt-lg-auto,.sp-dsgvo .my-lg-auto{margin-top:auto !important}.sp-dsgvo .mr-lg-auto,.sp-dsgvo .mx-lg-auto{margin-right:auto !important}.sp-dsgvo .mb-lg-auto,.sp-dsgvo .my-lg-auto{margin-bottom:auto !important}.sp-dsgvo .ml-lg-auto,.sp-dsgvo .mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.sp-dsgvo .m-xl-0{margin:0 !important}.sp-dsgvo .mt-xl-0,.sp-dsgvo .my-xl-0{margin-top:0 !important}.sp-dsgvo .mr-xl-0,.sp-dsgvo .mx-xl-0{margin-right:0 !important}.sp-dsgvo .mb-xl-0,.sp-dsgvo .my-xl-0{margin-bottom:0 !important}.sp-dsgvo .ml-xl-0,.sp-dsgvo .mx-xl-0{margin-left:0 !important}.sp-dsgvo .m-xl-1{margin:0.25rem !important}.sp-dsgvo .mt-xl-1,.sp-dsgvo .my-xl-1{margin-top:0.25rem !important}.sp-dsgvo .mr-xl-1,.sp-dsgvo .mx-xl-1{margin-right:0.25rem !important}.sp-dsgvo .mb-xl-1,.sp-dsgvo .my-xl-1{margin-bottom:0.25rem !important}.sp-dsgvo .ml-xl-1,.sp-dsgvo .mx-xl-1{margin-left:0.25rem !important}.sp-dsgvo .m-xl-2{margin:0.5rem !important}.sp-dsgvo .mt-xl-2,.sp-dsgvo .my-xl-2{margin-top:0.5rem !important}.sp-dsgvo .mr-xl-2,.sp-dsgvo .mx-xl-2{margin-right:0.5rem !important}.sp-dsgvo .mb-xl-2,.sp-dsgvo .my-xl-2{margin-bottom:0.5rem !important}.sp-dsgvo .ml-xl-2,.sp-dsgvo .mx-xl-2{margin-left:0.5rem !important}.sp-dsgvo .m-xl-3{margin:1rem !important}.sp-dsgvo .mt-xl-3,.sp-dsgvo .my-xl-3{margin-top:1rem !important}.sp-dsgvo .mr-xl-3,.sp-dsgvo .mx-xl-3{margin-right:1rem !important}.sp-dsgvo .mb-xl-3,.sp-dsgvo .my-xl-3{margin-bottom:1rem !important}.sp-dsgvo .ml-xl-3,.sp-dsgvo .mx-xl-3{margin-left:1rem !important}.sp-dsgvo .m-xl-4{margin:1.5rem !important}.sp-dsgvo .mt-xl-4,.sp-dsgvo .my-xl-4{margin-top:1.5rem !important}.sp-dsgvo .mr-xl-4,.sp-dsgvo .mx-xl-4{margin-right:1.5rem !important}.sp-dsgvo .mb-xl-4,.sp-dsgvo .my-xl-4{margin-bottom:1.5rem !important}.sp-dsgvo .ml-xl-4,.sp-dsgvo .mx-xl-4{margin-left:1.5rem !important}.sp-dsgvo .m-xl-5{margin:3rem !important}.sp-dsgvo .mt-xl-5,.sp-dsgvo .my-xl-5{margin-top:3rem !important}.sp-dsgvo .mr-xl-5,.sp-dsgvo .mx-xl-5{margin-right:3rem !important}.sp-dsgvo .mb-xl-5,.sp-dsgvo .my-xl-5{margin-bottom:3rem !important}.sp-dsgvo .ml-xl-5,.sp-dsgvo .mx-xl-5{margin-left:3rem !important}.sp-dsgvo .p-xl-0{padding:0 !important}.sp-dsgvo .pt-xl-0,.sp-dsgvo .py-xl-0{padding-top:0 !important}.sp-dsgvo .pr-xl-0,.sp-dsgvo .px-xl-0{padding-right:0 !important}.sp-dsgvo .pb-xl-0,.sp-dsgvo .py-xl-0{padding-bottom:0 !important}.sp-dsgvo .pl-xl-0,.sp-dsgvo .px-xl-0{padding-left:0 !important}.sp-dsgvo .p-xl-1{padding:0.25rem !important}.sp-dsgvo .pt-xl-1,.sp-dsgvo .py-xl-1{padding-top:0.25rem !important}.sp-dsgvo .pr-xl-1,.sp-dsgvo .px-xl-1{padding-right:0.25rem !important}.sp-dsgvo .pb-xl-1,.sp-dsgvo .py-xl-1{padding-bottom:0.25rem !important}.sp-dsgvo .pl-xl-1,.sp-dsgvo .px-xl-1{padding-left:0.25rem !important}.sp-dsgvo .p-xl-2{padding:0.5rem !important}.sp-dsgvo .pt-xl-2,.sp-dsgvo .py-xl-2{padding-top:0.5rem !important}.sp-dsgvo .pr-xl-2,.sp-dsgvo .px-xl-2{padding-right:0.5rem !important}.sp-dsgvo .pb-xl-2,.sp-dsgvo .py-xl-2{padding-bottom:0.5rem !important}.sp-dsgvo .pl-xl-2,.sp-dsgvo .px-xl-2{padding-left:0.5rem !important}.sp-dsgvo .p-xl-3{padding:1rem !important}.sp-dsgvo .pt-xl-3,.sp-dsgvo .py-xl-3{padding-top:1rem !important}.sp-dsgvo .pr-xl-3,.sp-dsgvo .px-xl-3{padding-right:1rem !important}.sp-dsgvo .pb-xl-3,.sp-dsgvo .py-xl-3{padding-bottom:1rem !important}.sp-dsgvo .pl-xl-3,.sp-dsgvo .px-xl-3{padding-left:1rem !important}.sp-dsgvo .p-xl-4{padding:1.5rem !important}.sp-dsgvo .pt-xl-4,.sp-dsgvo .py-xl-4{padding-top:1.5rem !important}.sp-dsgvo .pr-xl-4,.sp-dsgvo .px-xl-4{padding-right:1.5rem !important}.sp-dsgvo .pb-xl-4,.sp-dsgvo .py-xl-4{padding-bottom:1.5rem !important}.sp-dsgvo .pl-xl-4,.sp-dsgvo .px-xl-4{padding-left:1.5rem !important}.sp-dsgvo .p-xl-5{padding:3rem !important}.sp-dsgvo .pt-xl-5,.sp-dsgvo .py-xl-5{padding-top:3rem !important}.sp-dsgvo .pr-xl-5,.sp-dsgvo .px-xl-5{padding-right:3rem !important}.sp-dsgvo .pb-xl-5,.sp-dsgvo .py-xl-5{padding-bottom:3rem !important}.sp-dsgvo .pl-xl-5,.sp-dsgvo .px-xl-5{padding-left:3rem !important}.sp-dsgvo .m-xl-n1{margin:-0.25rem !important}.sp-dsgvo .mt-xl-n1,.sp-dsgvo .my-xl-n1{margin-top:-0.25rem !important}.sp-dsgvo .mr-xl-n1,.sp-dsgvo .mx-xl-n1{margin-right:-0.25rem !important}.sp-dsgvo .mb-xl-n1,.sp-dsgvo .my-xl-n1{margin-bottom:-0.25rem !important}.sp-dsgvo .ml-xl-n1,.sp-dsgvo .mx-xl-n1{margin-left:-0.25rem !important}.sp-dsgvo .m-xl-n2{margin:-0.5rem !important}.sp-dsgvo .mt-xl-n2,.sp-dsgvo .my-xl-n2{margin-top:-0.5rem !important}.sp-dsgvo .mr-xl-n2,.sp-dsgvo .mx-xl-n2{margin-right:-0.5rem !important}.sp-dsgvo .mb-xl-n2,.sp-dsgvo .my-xl-n2{margin-bottom:-0.5rem !important}.sp-dsgvo .ml-xl-n2,.sp-dsgvo .mx-xl-n2{margin-left:-0.5rem !important}.sp-dsgvo .m-xl-n3{margin:-1rem !important}.sp-dsgvo .mt-xl-n3,.sp-dsgvo .my-xl-n3{margin-top:-1rem !important}.sp-dsgvo .mr-xl-n3,.sp-dsgvo .mx-xl-n3{margin-right:-1rem !important}.sp-dsgvo .mb-xl-n3,.sp-dsgvo .my-xl-n3{margin-bottom:-1rem !important}.sp-dsgvo .ml-xl-n3,.sp-dsgvo .mx-xl-n3{margin-left:-1rem !important}.sp-dsgvo .m-xl-n4{margin:-1.5rem !important}.sp-dsgvo .mt-xl-n4,.sp-dsgvo .my-xl-n4{margin-top:-1.5rem !important}.sp-dsgvo .mr-xl-n4,.sp-dsgvo .mx-xl-n4{margin-right:-1.5rem !important}.sp-dsgvo .mb-xl-n4,.sp-dsgvo .my-xl-n4{margin-bottom:-1.5rem !important}.sp-dsgvo .ml-xl-n4,.sp-dsgvo .mx-xl-n4{margin-left:-1.5rem !important}.sp-dsgvo .m-xl-n5{margin:-3rem !important}.sp-dsgvo .mt-xl-n5,.sp-dsgvo .my-xl-n5{margin-top:-3rem !important}.sp-dsgvo .mr-xl-n5,.sp-dsgvo .mx-xl-n5{margin-right:-3rem !important}.sp-dsgvo .mb-xl-n5,.sp-dsgvo .my-xl-n5{margin-bottom:-3rem !important}.sp-dsgvo .ml-xl-n5,.sp-dsgvo .mx-xl-n5{margin-left:-3rem !important}.sp-dsgvo .m-xl-auto{margin:auto !important}.sp-dsgvo .mt-xl-auto,.sp-dsgvo .my-xl-auto{margin-top:auto !important}.sp-dsgvo .mr-xl-auto,.sp-dsgvo .mx-xl-auto{margin-right:auto !important}.sp-dsgvo .mb-xl-auto,.sp-dsgvo .my-xl-auto{margin-bottom:auto !important}.sp-dsgvo .ml-xl-auto,.sp-dsgvo .mx-xl-auto{margin-left:auto !important}}.sp-dsgvo .text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important}.sp-dsgvo .text-justify{text-align:justify !important}.sp-dsgvo .text-wrap{white-space:normal !important}.sp-dsgvo .text-nowrap{white-space:nowrap !important}.sp-dsgvo .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sp-dsgvo .text-left{text-align:left !important}.sp-dsgvo .text-right{text-align:right !important}.sp-dsgvo .text-center{text-align:center !important}@media (min-width: 576px){.sp-dsgvo .text-sm-left{text-align:left !important}.sp-dsgvo .text-sm-right{text-align:right !important}.sp-dsgvo .text-sm-center{text-align:center !important}}@media (min-width: 768px){.sp-dsgvo .text-md-left{text-align:left !important}.sp-dsgvo .text-md-right{text-align:right !important}.sp-dsgvo .text-md-center{text-align:center !important}}@media (min-width: 992px){.sp-dsgvo .text-lg-left{text-align:left !important}.sp-dsgvo .text-lg-right{text-align:right !important}.sp-dsgvo .text-lg-center{text-align:center !important}}@media (min-width: 1200px){.sp-dsgvo .text-xl-left{text-align:left !important}.sp-dsgvo .text-xl-right{text-align:right !important}.sp-dsgvo .text-xl-center{text-align:center !important}}.sp-dsgvo .text-lowercase{text-transform:lowercase !important}.sp-dsgvo .text-uppercase{text-transform:uppercase !important}.sp-dsgvo .text-capitalize{text-transform:capitalize !important}.sp-dsgvo .font-weight-light{font-weight:300 !important}.sp-dsgvo .font-weight-lighter{font-weight:lighter !important}.sp-dsgvo .font-weight-normal{font-weight:400 !important}.sp-dsgvo .font-weight-bold{font-weight:700 !important}.sp-dsgvo .font-weight-bolder{font-weight:bolder !important}.sp-dsgvo .font-italic{font-style:italic !important}.sp-dsgvo .text-white{color:#fff !important}.sp-dsgvo .text-primary{color:#008cba !important}.sp-dsgvo a.text-primary:hover,.sp-dsgvo a.text-primary:focus{color:#00526e !important}.sp-dsgvo .text-secondary{color:#eee !important}.sp-dsgvo a.text-secondary:hover,.sp-dsgvo a.text-secondary:focus{color:#c8c8c8 !important}.sp-dsgvo .text-success{color:#43ac6a !important}.sp-dsgvo a.text-success:hover,.sp-dsgvo a.text-success:focus{color:#2e7548 !important}.sp-dsgvo .text-info{color:#5bc0de !important}.sp-dsgvo a.text-info:hover,.sp-dsgvo a.text-info:focus{color:#28a1c5 !important}.sp-dsgvo .text-warning{color:#E99002 !important}.sp-dsgvo a.text-warning:hover,.sp-dsgvo a.text-warning:focus{color:#9d6101 !important}.sp-dsgvo .text-danger{color:#F04124 !important}.sp-dsgvo a.text-danger:hover,.sp-dsgvo a.text-danger:focus{color:#bb260d !important}.sp-dsgvo .text-light{color:#eee !important}.sp-dsgvo a.text-light:hover,.sp-dsgvo a.text-light:focus{color:#c8c8c8 !important}.sp-dsgvo .text-dark{color:#222 !important}.sp-dsgvo a.text-dark:hover,.sp-dsgvo a.text-dark:focus{color:black !important}.sp-dsgvo .text-body{color:#222 !important}.sp-dsgvo .text-muted{color:#888 !important}.sp-dsgvo .text-black-50{color:rgba(0,0,0,0.5) !important}.sp-dsgvo .text-white-50{color:rgba(255,255,255,0.5) !important}.sp-dsgvo .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.sp-dsgvo .text-decoration-none{text-decoration:none !important}.sp-dsgvo .text-break{word-break:break-word !important;overflow-wrap:break-word !important}.sp-dsgvo .text-reset{color:inherit !important}.sp-dsgvo .visible{visibility:visible !important}.sp-dsgvo .invisible{visibility:hidden !important}@media print{.sp-dsgvo *,.sp-dsgvo *::before,.sp-dsgvo *::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}.sp-dsgvo a:not(.btn){text-decoration:underline}.sp-dsgvo abbr[title]::after{content:" (" attr(title) ")"}.sp-dsgvo pre{white-space:pre-wrap !important}.sp-dsgvo pre,.sp-dsgvo blockquote{border:1px solid #adb5bd;page-break-inside:avoid}.sp-dsgvo thead{display:table-header-group}.sp-dsgvo tr,.sp-dsgvo img{page-break-inside:avoid}.sp-dsgvo p,.sp-dsgvo h2,.sp-dsgvo h3{orphans:3;widows:3}.sp-dsgvo h2,.sp-dsgvo h3{page-break-after:avoid}@page{.sp-dsgvo{size:a3}}.sp-dsgvo body{min-width:992px !important}.sp-dsgvo .container{min-width:992px !important}.sp-dsgvo .navbar{display:none}.sp-dsgvo .badge{border:1px solid #000}.sp-dsgvo .table{border-collapse:collapse !important}.sp-dsgvo .table td,.sp-dsgvo .table th{background-color:#fff !important}.sp-dsgvo .table-bordered th,.sp-dsgvo .table-bordered td{border:1px solid #dee2e6 !important}.sp-dsgvo .table-dark{color:inherit}.sp-dsgvo .table-dark th,.sp-dsgvo .table-dark td,.sp-dsgvo .table-dark thead th,.sp-dsgvo .table-dark tbody+tbody{border-color:#dee2e6}.sp-dsgvo .table .thead-dark th{color:inherit;border-color:#dee2e6}}.sp-dsgvo .navbar{font-size:0.8203125rem;font-weight:300}.sp-dsgvo .bg-primary .dropdown-menu{background-color:#008cba}.sp-dsgvo .bg-primary .dropdown-menu .dropdown-item,.sp-dsgvo .bg-primary .dropdown-menu .dropdown-item:focus{color:rgba(255,255,255,0.7)}.sp-dsgvo .bg-primary .dropdown-menu .dropdown-item.active,.sp-dsgvo .bg-primary .dropdown-menu .dropdown-item:hover,.sp-dsgvo .bg-primary .dropdown-menu .dropdown-item:focus{background-color:#0079a1;color:#fff}.sp-dsgvo .bg-dark{background-color:#333 !important}.sp-dsgvo .bg-dark .dropdown-menu{background-color:#333}.sp-dsgvo .bg-dark .dropdown-menu .dropdown-item,.sp-dsgvo .bg-dark .dropdown-menu .dropdown-item:focus{color:rgba(255,255,255,0.7)}.sp-dsgvo .bg-dark .dropdown-menu .dropdown-item.active,.sp-dsgvo .bg-dark .dropdown-menu .dropdown-item:hover,.sp-dsgvo .bg-dark .dropdown-menu .dropdown-item:focus{background-color:#262626;color:#fff}.sp-dsgvo .bg-light .dropdown-menu{background-color:#eee}.sp-dsgvo .bg-light .dropdown-menu .dropdown-item,.sp-dsgvo .bg-light .dropdown-menu .dropdown-item:focus{color:rgba(0,0,0,0.5)}.sp-dsgvo .bg-light .dropdown-menu .dropdown-item.active,.sp-dsgvo .bg-light .dropdown-menu .dropdown-item:hover,.sp-dsgvo .bg-light .dropdown-menu .dropdown-item:focus{background-color:#fbfbfb;color:rgba(0,0,0,0.7)}.sp-dsgvo .btn-primary{border-color:#0079a1}.sp-dsgvo .btn-secondary{border-color:#e1e1e1}.sp-dsgvo .btn-success{border-color:#3c9a5f}.sp-dsgvo .btn-info{border-color:#46b8da;color:#fff}.sp-dsgvo .btn-danger{border-color:#ea2f10}.sp-dsgvo .btn-warning{border-color:#d08002;color:#fff}.sp-dsgvo .btn-light{border-color:#e1e1e1}.sp-dsgvo .btn-dark{border-color:#151515}.sp-dsgvo .btn-group .dropdown-menu{border-top-width:0}.sp-dsgvo .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu{background-color:#008cba;border-color:#0079a1}.sp-dsgvo .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu .dropdown-item:focus{background-color:#006d91}.sp-dsgvo .btn-group .dropdown-toggle.btn-secondary ~ .dropdown-menu{background-color:#eee;border-color:#e1e1e1}.sp-dsgvo .btn-group .dropdown-toggle.btn-secondary ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-secondary ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-secondary ~ .dropdown-menu .dropdown-item:focus{background-color:#dadada}.sp-dsgvo .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu{background-color:#43ac6a;border-color:#3c9a5f}.sp-dsgvo .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu .dropdown-item:focus{background-color:#388f58}.sp-dsgvo .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu{background-color:#5bc0de;border-color:#46b8da}.sp-dsgvo .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu .dropdown-item:focus{background-color:#39b3d7}.sp-dsgvo .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu{background-color:#E99002;border-color:#d08002}.sp-dsgvo .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu .dropdown-item:focus{background-color:#c17702}.sp-dsgvo .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu{background-color:#F04124;border-color:#0079a1}.sp-dsgvo .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu .dropdown-item{color:#fff}.sp-dsgvo .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu .dropdown-item:hover,.sp-dsgvo .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu .dropdown-item:focus{background-color:#dc2c0f}.sp-dsgvo .text-secondary{color:#495057 !important}.sp-dsgvo .blockquote-footer{color:#888}.sp-dsgvo table{font-size:0.8203125rem}.sp-dsgvo .table-primary,.sp-dsgvo .table-success,.sp-dsgvo .table-info,.sp-dsgvo .table-warning,.sp-dsgvo .table-danger{color:#fff}.sp-dsgvo .table-primary,.sp-dsgvo .table-primary>th,.sp-dsgvo .table-primary>td{background-color:#008cba}.sp-dsgvo .table-secondary,.sp-dsgvo .table-secondary>th,.sp-dsgvo .table-secondary>td{background-color:#eee}.sp-dsgvo .table-light,.sp-dsgvo .table-light>th,.sp-dsgvo .table-light>td{background-color:#eee}.sp-dsgvo .table-dark,.sp-dsgvo .table-dark>th,.sp-dsgvo .table-dark>td{background-color:#222}.sp-dsgvo .table-success,.sp-dsgvo .table-success>th,.sp-dsgvo .table-success>td{background-color:#43ac6a}.sp-dsgvo .table-info,.sp-dsgvo .table-info>th,.sp-dsgvo .table-info>td{background-color:#5bc0de}.sp-dsgvo .table-danger,.sp-dsgvo .table-danger>th,.sp-dsgvo .table-danger>td{background-color:#F04124}.sp-dsgvo .table-warning,.sp-dsgvo .table-warning>th,.sp-dsgvo .table-warning>td{background-color:#E99002}.sp-dsgvo .table-active,.sp-dsgvo .table-active>th,.sp-dsgvo .table-active>td{background-color:rgba(0,0,0,0.075)}.sp-dsgvo .table-hover .table-primary:hover,.sp-dsgvo .table-hover .table-primary:hover>th,.sp-dsgvo .table-hover .table-primary:hover>td{background-color:#0079a1}.sp-dsgvo .table-hover .table-secondary:hover,.sp-dsgvo .table-hover .table-secondary:hover>th,.sp-dsgvo .table-hover .table-secondary:hover>td{background-color:#e1e1e1}.sp-dsgvo .table-hover .table-light:hover,.sp-dsgvo .table-hover .table-light:hover>th,.sp-dsgvo .table-hover .table-light:hover>td{background-color:#e1e1e1}.sp-dsgvo .table-hover .table-dark:hover,.sp-dsgvo .table-hover .table-dark:hover>th,.sp-dsgvo .table-hover .table-dark:hover>td{background-color:#151515}.sp-dsgvo .table-hover .table-success:hover,.sp-dsgvo .table-hover .table-success:hover>th,.sp-dsgvo .table-hover .table-success:hover>td{background-color:#3c9a5f}.sp-dsgvo .table-hover .table-info:hover,.sp-dsgvo .table-hover .table-info:hover>th,.sp-dsgvo .table-hover .table-info:hover>td{background-color:#46b8da}.sp-dsgvo .table-hover .table-danger:hover,.sp-dsgvo .table-hover .table-danger:hover>th,.sp-dsgvo .table-hover .table-danger:hover>td{background-color:#ea2f10}.sp-dsgvo .table-hover .table-warning:hover,.sp-dsgvo .table-hover .table-warning:hover>th,.sp-dsgvo .table-hover .table-warning:hover>td{background-color:#d08002}.sp-dsgvo .table-hover .table-active:hover,.sp-dsgvo .table-hover .table-active:hover>th,.sp-dsgvo .table-hover .table-active:hover>td{background-color:rgba(0,0,0,0.075)}.sp-dsgvo label,.sp-dsgvo .control-label,.sp-dsgvo .help-block,.sp-dsgvo .checkbox,.sp-dsgvo .radio,.sp-dsgvo .form-control-feedback{font-size:0.8203125rem}.sp-dsgvo .dropdown-item{padding-top:0.75rem;padding-bottom:0.75rem;font-size:0.8203125rem;font-weight:300}.sp-dsgvo .nav-tabs .nav-link,.sp-dsgvo .nav-tabs .nav-link.disabled,.sp-dsgvo .nav-tabs .nav-link.disabled:hover,.sp-dsgvo .nav-tabs .nav-link.disabled:focus{border-color:rgba(0,0,0,0.1);background-color:#eee}.sp-dsgvo .nav-tabs .nav-link:hover,.sp-dsgvo .nav-tabs .nav-link:focus{background-color:#fbfbfb}.sp-dsgvo .nav-pills .active{border:1px solid #0079a1}.sp-dsgvo .breadcrumb{border:1px solid rgba(0,0,0,0.1);border-radius:3px;font-size:0.8203125rem;font-weight:300;text-transform:uppercase}.sp-dsgvo .pagination{font-weight:300}.sp-dsgvo .pagination .page-link{border-color:transparent;border-radius:3px;margin-left:0.1em;margin-right:0.1em}.sp-dsgvo .pagination .page-link:hover,.sp-dsgvo .pagination .page-link:focus{text-decoration:none}.sp-dsgvo .pagination .page-item.disabled .page-link{border-color:transparent}.sp-dsgvo .pagination .page-item:first-child .page-link,.sp-dsgvo .pagination .page-item:last-child .page-link,.sp-dsgvo .pagination-lg .page-item:first-child .page-link,.sp-dsgvo .pagination-lg .page-item:last-child .page-link,.sp-dsgvo .pagination-sm .page-item:first-child .page-link,.sp-dsgvo .pagination-sm .page-item:last-child .page-link{border-radius:3px}.sp-dsgvo .list-group{font-size:0.8203125rem;font-weight:300}.sp-dsgvo .close{opacity:0.6;text-shadow:none}.sp-dsgvo .close:hover,.sp-dsgvo .close:focus{opacity:1}.sp-dsgvo .alert{font-size:0.8203125rem;font-weight:300;color:#fff}.sp-dsgvo .alert-primary,.sp-dsgvo .alert-primary>th,.sp-dsgvo .alert-primary>td{background-color:#008cba}.sp-dsgvo .alert-secondary,.sp-dsgvo .alert-secondary>th,.sp-dsgvo .alert-secondary>td{background-color:#eee}.sp-dsgvo .alert-success,.sp-dsgvo .alert-success>th,.sp-dsgvo .alert-success>td{background-color:#43ac6a}.sp-dsgvo .alert-info,.sp-dsgvo .alert-info>th,.sp-dsgvo .alert-info>td{background-color:#5bc0de}.sp-dsgvo .alert-danger,.sp-dsgvo .alert-danger>th,.sp-dsgvo .alert-danger>td{background-color:#F04124}.sp-dsgvo .alert-warning,.sp-dsgvo .alert-warning>th,.sp-dsgvo .alert-warning>td{background-color:#E99002}.sp-dsgvo .alert-dark,.sp-dsgvo .alert-dark>th,.sp-dsgvo .alert-dark>td{background-color:#222}.sp-dsgvo .alert-light,.sp-dsgvo .alert-light>th,.sp-dsgvo .alert-light>td{background-color:#eee}.sp-dsgvo .alert .alert-link{font-weight:normal;color:#fff;text-decoration:underline}.sp-dsgvo .alert-secondary,.sp-dsgvo .alert-secondary a:not(.btn),.sp-dsgvo .alert-secondary .alert-link,.sp-dsgvo .alert-light,.sp-dsgvo .alert-light a:not(.btn),.sp-dsgvo .alert-light .alert-link{color:#222}.sp-dsgvo .badge{padding-bottom:.3em}.sp-dsgvo .badge-warning,.sp-dsgvo .badge-info{color:#fff}.sp-dsgvo .progress[value]{height:22px;padding:2px;background-color:#f6f6f6;border:1px solid #ccc}.sp-dsgvo .popover-header{border-top-left-radius:0;border-top-right-radius:0}
admin/css/fonts/open-sans/opensans-bold-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-bolditalic-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-italic-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-light-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-lightitalic-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-regular-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-semibold-webfont.woff2 ADDED
Binary file
admin/css/fonts/open-sans/opensans-semibolditalic-webfont.woff2 ADDED
Binary file
admin/css/sp-dsgvo-admin.css CHANGED
@@ -1,159 +1,585 @@
1
- /**
2
- * All of the CSS for your admin-specific functionality should be
3
- * included in this file.
4
- */
5
- hr.sp-dsgvo {
6
- border: 0;
7
- margin-top: 20px;
8
- border-top: 1px solid #bbb;
9
- border-bottom: 1px solid #fafafa;
10
- }
11
-
12
- .dsgvo-wrap {
13
- background-color: white;
14
- padding-left: 15px;
15
- padding-right: 15px;
16
- float: left;
17
- width: calc(100% - 400px);
18
-
19
- }
20
-
21
- /*************************
22
- * Third-party Services
23
- ************************/
24
- textarea.aio-transparent, input.aio-transparent {
25
- border: 1px solid rgba(0, 0, 0, 0);
26
- background: transparent;
27
- -webkit-box-shadow: none;
28
- -moz-box-shadow: none;
29
- box-shadow: none;
30
- cursor: pointer;
31
- }
32
-
33
- textarea:focus.aio-transparent, input:focus.aio-transparent {
34
- border: 1px solid #ddd;
35
- }
36
-
37
- textarea:hover.aio-transparent, input:hover.aio-transparent {
38
- border: 1px solid #eee;
39
- }
40
-
41
- .form-table th {
42
- padding: 10px 10px 10px 0;
43
- }
44
-
45
- .form-table td {
46
- padding: 10px 10px 10px 0;
47
- }
48
-
49
- .form-table .info-text {
50
- font-style: italic;
51
- font-size: 90%;
52
- }
53
-
54
- .wrap-premium {
55
- float: left;
56
- width: 340px;
57
- margin-top: 20px;
58
- }
59
-
60
- #dsgvo-checklist {
61
- padding-left: 15px;
62
- }
63
-
64
- #dsgvo-checklist li {
65
- margin-bottom: 15px;
66
- }
67
-
68
- #dsgvo-premium-featurelist {
69
- padding-left: 20px;
70
- }
71
-
72
- #dsgvo-premium-featurelist li {
73
- margin-bottom: 15px;
74
- font-weight: 600;
75
- font-size: 1rem;
76
- }
77
-
78
- #dsgvo-premium-featurelist li:before {
79
- content: "\f147";
80
- font-family: dashicons;
81
- display: inline-block;
82
- width: 30px;
83
- height: 20px;
84
- line-height: 20px;
85
- font-weight: 400;
86
- font-style: normal;
87
- vertical-align: top;
88
- text-align: center;
89
- color: orange;
90
- font-size: 30px;
91
- }
92
-
93
- #dsgvo-premium-featurelist-tipps {
94
- padding-left: 20px;
95
- }
96
-
97
- #dsgvo-premium-featurelist-tipps li {
98
- margin-bottom: 15px;
99
- font-weight: 600;
100
- font-size: 1rem;
101
- }
102
- #dsgvo-premium-featurelist-tipps li:before {
103
- content: "\f103";
104
- font-family: dashicons;
105
- display: inline-block;
106
- width: 30px;
107
- height: 20px;
108
- line-height: 20px;
109
- font-size : 20px;
110
- font-weight: 400;
111
- font-style: normal;
112
- vertical-align: top;
113
- text-align: center;
114
- color: orange;
115
- }
116
-
117
- /* i592995 */
118
-
119
- .sp-cookie-notice-settings:not(.active),
120
- .policy-popup-settings:not(.active) {
121
- display: none;
122
- }
123
-
124
- .woo-privacy-text {
125
- width: 100%;
126
- }
127
-
128
- .ga-code,
129
- .fb-pixel-code {
130
- display: block;
131
- width: 100%;
132
- height: 200px;
133
- }
134
-
135
- .unsubscribe-dismiss {
136
- cursor: pointer;
137
- }
138
-
139
- .unsubscribe-dismiss line {
140
- stroke: #000000;
141
- stroke-width: 2px;
142
- }
143
-
144
- .form-table td {
145
- vertical-align: top;
146
- }
147
-
148
- /* i592995 */
149
-
150
- .sp-dsgvo_plugin_upgrade_notice > div.header{
151
- background-color: #d54e21;
152
- padding: 10px;
153
- color: #f9f9f9;
154
- margin-top: 10px
155
- }
156
- p.sp-dsgvo_plugin_upgrade_notice:before
157
- {
158
- content:none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  }
1
+ /* latin */
2
+ @font-face {
3
+ font-family: 'Open Sans';
4
+ font-style: italic;
5
+ font-weight: 300;
6
+ src: local('Open Sans Light Italic'),
7
+ local('OpenSans-LightItalic'),
8
+ url(fonts/open-sans/opensans-lightitalic-webfont.woff2) format('woff2');
9
+
10
+ }
11
+
12
+ /* latin */
13
+ @font-face {
14
+ font-family: 'Open Sans';
15
+ font-style: italic;
16
+ font-weight: 400;
17
+ src: local('Open Sans Italic'),
18
+ local('OpenSans-Italic'),
19
+ url(fonts/open-sans/opensans-italic-webfont.woff2) format('woff2');
20
+ }
21
+
22
+ /* latin */
23
+ @font-face {
24
+ font-family: 'Open Sans';
25
+ font-style: italic;
26
+ font-weight: 700;
27
+ src: local('Open Sans Bold Italic'),
28
+ local('OpenSans-BoldItalic'),
29
+ url(fonts/open-sans/opensans-bolditalic-webfont.woff2) format('woff2');
30
+ }
31
+
32
+ /* latin */
33
+ @font-face {
34
+ font-family: 'Open Sans';
35
+ font-style: normal;
36
+ font-weight: 300;
37
+ src: local('Open Sans Light'),
38
+ local('OpenSans-Light'),
39
+ url(fonts/open-sans/opensans-light-webfont.woff2) format('woff2');
40
+ }
41
+
42
+ /* latin */
43
+ @font-face {
44
+ font-family: 'Open Sans';
45
+ font-style: normal;
46
+ font-weight: 400;
47
+ src: local('Open Sans Regular'),
48
+ local('OpenSans-Regular'),
49
+ url(fonts/open-sans/opensans-regular-webfont.woff2) format('woff2');
50
+ }
51
+
52
+ /* latin */
53
+ @font-face {
54
+ font-family: 'Open Sans';
55
+ font-style: normal;
56
+ font-weight: 700;
57
+ src: local('Open Sans Bold'),
58
+ local('OpenSans-Bold'),
59
+ url(fonts/open-sans/opensans-bold-webfont.woff2) format('woff2');
60
+ }
61
+
62
+ /**
63
+ * All of the CSS for your admin-specific functionality should be
64
+ * included in this file.
65
+ */
66
+
67
+ .sp-dsgvo {
68
+ font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
69
+ }
70
+
71
+ /* bootstrap overrides */
72
+ .sp-dsgvo .breadcrumb
73
+ {
74
+ margin-left: 0 !important;
75
+ margin-bottom: 0 !important;
76
+ font-weight: 500 !important;
77
+ }
78
+
79
+ .sp-dsgvo .card {
80
+ padding: 0;
81
+ }
82
+ .sp-dsgvo h4.card-title{
83
+ margin-bottom: 0;
84
+ }
85
+
86
+ .sp-dsgvo label {
87
+ font-weight: 500 !important;
88
+ }
89
+
90
+ .sp-dsgvo .custom-control-label {
91
+ font-weight: 400 !important;
92
+ }
93
+
94
+ .sp-dsgvo select
95
+ {
96
+ max-width: initial;
97
+ }
98
+
99
+ @media (min-width: 576px) {
100
+ .sp-dsgvo .card-columns {
101
+ -webkit-column-count: 2;
102
+ column-count: 2;
103
+ -webkit-column-gap: 1rem;
104
+ column-gap: 1rem;
105
+ orphans: 1;
106
+ widows: 1;
107
+ }
108
+ }
109
+
110
+ .sp-dsgvo .form-control-plaintext {
111
+ -webkit-box-shadow: none;
112
+ -moz-box-shadow: none;
113
+ box-shadow: none;
114
+ }
115
+ /* bootstrap overrides end */
116
+
117
+
118
+
119
+
120
+ hr.sp-dsgvo {
121
+ border: 0;
122
+ margin-top: 20px;
123
+ border-top: 1px solid #bbb;
124
+ border-bottom: 1px solid #fafafa;
125
+ }
126
+
127
+ .dsgvo-wrap {
128
+ /* background-color: white; */
129
+ /*padding-left: 15px; */
130
+ /*padding-right: 15px;*/
131
+ float: left;
132
+ width: calc(100% - 310px);
133
+
134
+ }
135
+
136
+ .dsgvo-wrap .form-table {
137
+ margin-top: 0;
138
+ }
139
+
140
+
141
+ .w-100 {
142
+ width: 100%;
143
+ }
144
+
145
+ .position-relative {
146
+ position: relative;
147
+ }
148
+
149
+ .sp-dsgvo-overlay {
150
+ position: absolute;
151
+ top: 0;
152
+ left: 0;
153
+ width: 100%;
154
+ height: 100%;
155
+ background-color: rgba(0, 0, 0, 0.5) !important;
156
+ border-radius: 2px;
157
+ z-index: 20;
158
+ }
159
+
160
+ .sp-dsgvo-overlay-text {
161
+ position: absolute;
162
+ top: 50%;
163
+ left: 50%;
164
+ text-align: center;
165
+ font-size: 14px;
166
+ color: white;
167
+ background-color: #ffffff;
168
+ opacity: 0.9;
169
+ border-radius: 3px;
170
+ border: 1px solid orange;
171
+ transform: translate(-50%, -50%);
172
+ -ms-transform: translate(-50%, -50%);
173
+ }
174
+
175
+ .woo-privacy-text {
176
+ width: 100%;
177
+ }
178
+
179
+ textarea.own-code-text {
180
+ font-size: 12px !important;
181
+ font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif !important;
182
+ }
183
+
184
+ .unsubscribe-dismiss {
185
+ cursor: pointer;
186
+ }
187
+
188
+ .unsubscribe-dismiss line {
189
+ stroke: #000000;
190
+ stroke-width: 2px;
191
+ }
192
+
193
+ .form-table td {
194
+ vertical-align: top;
195
+ }
196
+
197
+ .form-table tbody {
198
+ display: table;
199
+ width: 100%;
200
+ }
201
+
202
+ /* p912419 */
203
+
204
+
205
+ /* slider checkboxes */
206
+ .wrap.dsgvo-wrap .main-title {
207
+ /*display: flex;*/
208
+ justify-content: left;
209
+ align-items: center;
210
+ }
211
+
212
+ .wrap.dsgvo-wrap .main-title h2 {
213
+ font-size: 200%;
214
+ margin-top: 0.8em;
215
+ margin-bottom: 0.8em;
216
+ padding-top: 5px;
217
+ }
218
+
219
+ .wrap.dsgvo-wrap .main-title > img {
220
+ width: 30px;
221
+ margin-right: 10px;
222
+ float: left;
223
+ }
224
+
225
+ .wrap.dsgvo-wrap input[type="checkbox"]:not(.checkbox) {
226
+ width: 3.5em;
227
+ height: 2em;
228
+ border-radius: 3em;
229
+ position: relative;
230
+ cursor: pointer;
231
+ outline: none;
232
+ -webkit-transition: all .2s ease-in-out;
233
+ transition: all .2s ease-in-out;
234
+ }
235
+
236
+ .wrap.dsgvo-wrap input[type=checkbox]:not(.checkbox):before {
237
+ display: none;
238
+ }
239
+
240
+ .wrap.dsgvo-wrap input[type=checkbox]:not(.checkbox):after {
241
+ position: absolute;
242
+ content: "";
243
+ width: 1em;
244
+ height: 1em;
245
+ border-radius: 50%;
246
+ background: #f0f0f0;
247
+ -webkit-box-shadow: 0 0 0.25em rgba(0, 0, 0, .3);
248
+ box-shadow: 0 0 0.25em rgba(0, 0, 0, .3);
249
+ -webkit-transform: scale(.7);
250
+ transform: scale(.7);
251
+ left: 0;
252
+ -webkit-transition: all .2s ease-in-out;
253
+ transition: all .2s ease-in-out;
254
+ top: 22%;
255
+ }
256
+
257
+ .wrap.dsgvo-wrap input[type=checkbox]:not(.checkbox):checked:after {
258
+ left: calc(100% - 2em);
259
+ background: #0085ba;
260
+ width: 2em;
261
+ height: 2em;
262
+ top: 0;
263
+ }
264
+
265
+ .wrap.dsgvo-wrap .module-title {
266
+ /*background-color: #122459;*/
267
+ background: rgb(18, 36, 89);
268
+ background: linear-gradient(90deg, rgba(18, 36, 89, 1) 0%, rgba(241, 241, 241, 1) 70%);
269
+ padding-left: 5px;
270
+ padding-top: 10px;
271
+ padding-bottom: 10px;
272
+ font-weight: bold;
273
+ color: #ffffff;
274
+ border-radius: 0.2rem;
275
+ text-transform: uppercase;
276
+ margin-bottom: 10px;
277
+ }
278
+
279
+ /* design layout changes */
280
+ .wpk-main-design--margin-bottom {
281
+ margin-bottom: 20px;
282
+ }
283
+
284
+ .wpk-main-design--margin-top {
285
+ margin-top: 20px;
286
+ }
287
+
288
+ .wpk-main-design--one-table {
289
+ display: block;
290
+ width: 100%;
291
+ background-color: #ffffff;
292
+ box-sizing: border-box;
293
+ padding: 15px;
294
+ /*box-shadow: 0 1px 5px;*/
295
+ border-radius: 0.2rem;
296
+ }
297
+
298
+ .wpk-main-design--one-table_special {
299
+ width: 100%;
300
+ box-sizing: border-box;
301
+ padding: 15px;
302
+ /*box-shadow: 0 1px 5px !important;*/
303
+ border-radius: 0.2rem;
304
+ }
305
+
306
+ .wpk-main-design--two-table__left {
307
+ display: inline-block;
308
+ width: calc(50% - 10px);
309
+ box-sizing: border-box;
310
+ padding: 15px;
311
+ margin-right: 10px;
312
+ margin-bottom: 10px;
313
+ background: #ffffff;
314
+ /*box-shadow: 0 1px 5px;*/
315
+ border-radius: 0.2rem;
316
+ float:left;
317
+ }
318
+
319
+ .wpk-main-design--two-table__right {
320
+ display: inline-block;
321
+ float: left;
322
+ width: calc(50% - 10px);
323
+ box-sizing: border-box;
324
+ padding: 15px;
325
+ margin-bottom: 10px;
326
+ background: #ffffff;
327
+ border-radius: 0.2rem;
328
+ /*box-shadow: 0 1px 5px;*/
329
+ }
330
+
331
+ .wpk-main-design--one-table th, .wpk-main-design--one-table_special th, .wpk-main-design--two-table__left th, .wpk-main-design--two-table__right th,
332
+ .wpk-main-design--one-table thead tr th, .wpk-main-design--one-table_special thead tr th, .wpk-main-design--two-table__left thead tr th, .wpk-main-design--two-table__right thead tr th {
333
+ background-color: #122459;
334
+ border-radius: 0.2rem;
335
+ text-align: center;
336
+ color: white;
337
+ text-transform: uppercase;
338
+ }
339
+
340
+ .wpk-main-design--one-table input[type="text"],
341
+ .wpk-main-design--one-table_special input[type="text"],
342
+ .wpk-main-design--two-table__left input[type="text"],
343
+ .wpk-main-design--two-table__right input[type="text"],
344
+ .input-w100 input[type="text"] {
345
+ width: 100%;
346
+ }
347
+
348
+ .wpk-main-design--one-table select,
349
+ .wpk-main-design--one-table_special select,
350
+ .wpk-main-design--two-table__left select,
351
+ .wpk-main-design--two-table__right select {
352
+ width: 100%;
353
+ }
354
+
355
+ .wpk-main-design--submit {
356
+ width: 100%;
357
+ display: inline-block;
358
+ }
359
+
360
+ /* Advanced Cookie Styles */
361
+ .cookie-notive-settings-advanced tbody {
362
+ display: block;
363
+ }
364
+
365
+ .cookie-notive-settings-advanced tbody tr {
366
+ width: 100%;
367
+ box-sizing: border-box;
368
+ }
369
+
370
+ .cn_advanced_cookie_textarea {
371
+ display: block;
372
+ padding: 0 35px;
373
+ }
374
+
375
+ .cn_advanced_cookie_textarea td {
376
+ width: 49%;
377
+ display: inline-block;
378
+ }
379
+
380
+ /* cookie styles admin css */
381
+ img[class*="cookie-style-admin-show--"] {
382
+ width: 100%;
383
+ box-shadow: 0px 0 5px;
384
+ display: none;
385
+ }
386
+
387
+ .wpk-admin-cookie-scan-done {
388
+ color: green;
389
+ }
390
+
391
+
392
+ /* responsive */
393
+ input[name="dsgvo_licence"] {
394
+ width: 200px;
395
+ }
396
+
397
+ .wpk-company-data > tbody > tr > td > label > input[type="text"],
398
+ input[name="cn_button_text_ok"],
399
+ input[name="cn_button_text_cancel"],
400
+ input[name="cn_decline_target_url"],
401
+ input[name="cn_button_text_more"] {
402
+ width: 100%;
403
+ }
404
+
405
+ input[name="sar_dsgvo_accepted_text"],
406
+ input[name="su_dsgvo_accepted_text"] {
407
+ width: 550px;
408
+ }
409
+
410
+ .spdsgvo-d-none
411
+ {
412
+ display: none;
413
+ }
414
+ .spdsgvo-d-block
415
+ {
416
+ display: block;
417
+ }
418
+
419
+ @media only screen and (max-width: 986px) {
420
+
421
+ .dsgvo-wrap {
422
+ width: calc(100% - 50px);
423
+ }
424
+
425
+ .wpk-main-design--two-table__left,
426
+ .wpk-main-design--two-table__right {
427
+ width: 100%;
428
+ }
429
+
430
+ /* tabs */
431
+ .nav-tab-wrapper > a {
432
+ width: 95%;
433
+ text-align: center;
434
+ }
435
+
436
+ .dsgvo-wrap {
437
+ width: calc(100% - 50px);
438
+ }
439
+
440
+ .wpk-main-design--two-table__left,
441
+ .wpk-main-design--two-table__right {
442
+ width: 100%;
443
+ }
444
+
445
+ .wpk-main-design--two-table__right {
446
+ margin-top: 25px;
447
+ }
448
+
449
+ /* common settings */
450
+ input[name="dsgvo_licence"] {
451
+ width: 100%;
452
+ }
453
+
454
+ input[name="spdsgvo_comments_checkbox_confirm"],
455
+ .wpk-company-data > tbody > tr > td > label > input[type="text"] {
456
+ width: 100% !important;
457
+ }
458
+
459
+ /* subject access request */
460
+ input[name="sar_dsgvo_accepted_text"] {
461
+ width: 100%;
462
+ }
463
+
464
+ /* Delete request */
465
+ input[name="su_dsgvo_accepted_text"] {
466
+ width: 100%;
467
+ }
468
+ }
469
+
470
+ /* Responsive fixes services table */
471
+
472
+ @media only screen and (max-width: 768px) {
473
+ .wpk-services-table > thead > tr {
474
+ display: flex;
475
+ flex-direction: column;
476
+ width: 100%;
477
+ min-width: 275px;
478
+ }
479
+
480
+ .wpk-services-table > thead > tr > th {
481
+ width: 100% !important;
482
+ padding: 8px 0;
483
+ text-align: center;
484
+ }
485
+
486
+ .wpk-services-table > tbody > tr,
487
+ .wpk-unsub-table > tbody > tr {
488
+ display: flex;
489
+ flex-direction: column;
490
+ width: 100%;
491
+ min-width: 275px;
492
+ }
493
+
494
+ .wpk-services-table > tbody > tr > td,
495
+ .wpk-unsub-table > tbody > tr > td {
496
+ width: 100% !important;
497
+ text-align: center;
498
+ padding: 8px 0;
499
+ }
500
+
501
+ .wpk-services-table > tbody > tr > td > input,
502
+ .wpk-services-table > tbody > tr > td > textarea {
503
+ text-align: center;
504
+ }
505
+
506
+ .wpk-services-table-name {
507
+ font-weight: bold;
508
+ display: block;
509
+ }
510
+
511
+ .wpk-services-table > tfoot,
512
+ .wpk-services-table > thead,
513
+ .wpk-unsub-table > thead,
514
+ .wpk-unsub-table > tfoot {
515
+ display: none;
516
+ }
517
+ }
518
+
519
+
520
+ @media only screen and (max-width: 1268px) and (min-width: 769px) {
521
+ .wpk-services-table > tbody > tr > td > input,
522
+ .wpk-services-table > tbody > tr > td > textarea,
523
+ .wpk-services-table > tbody > tr > td > select {
524
+ width: 100%;
525
+ }
526
+
527
+ .wpk-services-table > tbody > tr > td input {
528
+ width: 100%;
529
+ font-size: 1em !important;
530
+ }
531
+
532
+ .wpk-services-table .image-preview-wrapper {
533
+ display: none;
534
+ }
535
+ }
536
+
537
+ @media only screen and (min-width: 769px) {
538
+ .wpk-services-table-name {
539
+ display: none;
540
+ }
541
+
542
+ .wpk-services-table > tbody > tr > td > input,
543
+ .wpk-services-table > tbody > tr > td > textarea,
544
+ .wpk-services-table > tbody > tr > td > select {
545
+ width: 100%;
546
+ }
547
+
548
+ .image-preview-wrapper > input {
549
+ padding: 0;
550
+ }
551
+ }
552
+
553
+ @media only screen and (max-width: 1268px) {
554
+ .wrap-premium {
555
+ width: calc(100% - 20px);
556
+ }
557
+
558
+ .dsgvo-wrap {
559
+ width: calc(100% - 40px);
560
+ }
561
+ }
562
+
563
+ @media only screen and (min-width: 1269px) {
564
+ .wpk-company-data > tbody > tr > td > label > input[type="text"],
565
+ input[name="cn_button_text_ok"],
566
+ input[name="cn_button_text_cancel"],
567
+ input[name="cn_decline_target_url"],
568
+ input[name="cn_button_text_more"] {
569
+ width: 100%;
570
+ }
571
+ }
572
+
573
+ .sp-dsgvo_plugin_upgrade_notice > div.header{
574
+ background-color: #d54e21;
575
+ padding: 10px;
576
+ color: #f9f9f9;
577
+ margin-top: 10px
578
+ }
579
+ p.sp-dsgvo_plugin_upgrade_notice:before
580
+ {
581
+ content:none;
582
+ }
583
+
584
+ .dsgvo-image-upload img {
585
  }
admin/images/cookies/Cookie1.png ADDED
Binary file
admin/images/cookies/Cookie10.png ADDED
Binary file
admin/images/cookies/Cookie11.png ADDED
Binary file
admin/images/cookies/Cookie12.png ADDED
Binary file
admin/images/cookies/Cookie13.png ADDED
Binary file
admin/images/cookies/Cookie14.png ADDED
Binary file
admin/images/cookies/Cookie2.png ADDED
Binary file
admin/images/cookies/Cookie3.png ADDED
Binary file
admin/images/cookies/Cookie4.png ADDED
Binary file
admin/images/cookies/Cookie5.png ADDED
Binary file
admin/images/cookies/Cookie6.png ADDED
Binary file
admin/images/cookies/Cookie7.png ADDED
Binary file
admin/images/cookies/Cookie8.png ADDED
Binary file
admin/images/cookies/Cookie9.png ADDED
Binary file
admin/images/logobackupsvg CHANGED
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
4
- <title>Combined Shape</title>
5
- <desc>Created with Sketch.</desc>
6
- <defs></defs>
7
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8
- <path d="M19.3593492,33.4750511 L12.3057597,26.4214616 C11.3817513,25.4974532 9.88363778,25.4974532 8.95962941,26.4214616 C8.03562104,27.34547 8.03562104,28.8435835 8.95962941,29.7675919 L17.6862841,38.4942465 C18.1482882,38.9562507 18.7538187,39.1872528 19.3593492,39.1872528 C19.9648797,39.1872528 20.5704102,38.9562507 21.0324144,38.4942465 L21.0324144,38.4942465 L41.9673137,17.5593472 C42.8913221,16.6353388 42.8913221,15.1372252 41.9673137,14.2132169 C41.0433054,13.2892085 39.5451918,13.2892085 38.6211834,14.2132169 L38.6211834,14.2132169 L19.3593492,33.4750511 Z M25.7313287,50.1953496 C11.92421,50.1953496 0.731328714,39.0024683 0.731328714,25.1953496 C0.731328714,11.3882308 11.92421,0.195349574 25.7313287,0.195349574 C39.5384475,0.195349574 50.7313287,11.3882308 50.7313287,25.1953496 C50.7313287,39.0024683 39.5384475,50.1953496 25.7313287,50.1953496 Z" id="Combined-Shape" fill="#9FA3A8"></path>
9
- </g>
10
  </svg>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
4
+ <title>Combined Shape</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs></defs>
7
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8
+ <path d="M19.3593492,33.4750511 L12.3057597,26.4214616 C11.3817513,25.4974532 9.88363778,25.4974532 8.95962941,26.4214616 C8.03562104,27.34547 8.03562104,28.8435835 8.95962941,29.7675919 L17.6862841,38.4942465 C18.1482882,38.9562507 18.7538187,39.1872528 19.3593492,39.1872528 C19.9648797,39.1872528 20.5704102,38.9562507 21.0324144,38.4942465 L21.0324144,38.4942465 L41.9673137,17.5593472 C42.8913221,16.6353388 42.8913221,15.1372252 41.9673137,14.2132169 C41.0433054,13.2892085 39.5451918,13.2892085 38.6211834,14.2132169 L38.6211834,14.2132169 L19.3593492,33.4750511 Z M25.7313287,50.1953496 C11.92421,50.1953496 0.731328714,39.0024683 0.731328714,25.1953496 C0.731328714,11.3882308 11.92421,0.195349574 25.7313287,0.195349574 C39.5384475,0.195349574 50.7313287,11.3882308 50.7313287,25.1953496 C50.7313287,39.0024683 39.5384475,50.1953496 25.7313287,50.1953496 Z" id="Combined-Shape" fill="#9FA3A8"></path>
9
+ </g>
10
  </svg>
admin/js/bootstrap.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,u=u&&u.hasOwnProperty("default")?u.default:u;var e="transitionend";function n(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};g.fn.emulateTransitionEnd=n,g.event.special[_.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=g.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",d="fade",m="show",p=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=g(t).closest("."+f)[0]),n},t._triggerCloseEvent=function(t){var e=g.Event(h.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(m),g(e).hasClass(d)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),g.fn[o]=p._jQueryInterface,g.fn[o].Constructor=p,g.fn[o].noConflict=function(){return g.fn[o]=c,p._jQueryInterface};var v="button",y="bs.button",E="."+y,C=".data-api",T=g.fn[v],S="active",b="btn",I="focus",D='[data-toggle^="button"]',w='[data-toggle="buttons"]',A='input:not([type="hidden"])',N=".active",O=".btn",k={CLICK_DATA_API:"click"+E+C,FOCUS_BLUR_DATA_API:"focus"+E+C+" blur"+E+C},P=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(w)[0];if(n){var i=this._element.querySelector(A);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(N);o&&g(o).removeClass(S)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(S),g(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S)},t.dispose=function(){g.removeData(this._element,y),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(y);t||(t=new n(this),g(this).data(y,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g(document).on(k.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;g(e).hasClass(b)||(e=g(e).closest(O)),P._jQueryInterface.call(g(e),"toggle")}).on(k.FOCUS_BLUR_DATA_API,D,function(t){var e=g(t.target).closest(O)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g.fn[v]=P._jQueryInterface,g.fn[v].Constructor=P,g.fn[v].noConflict=function(){return g.fn[v]=T,P._jQueryInterface};var L="carousel",j="bs.carousel",H="."+j,R=".data-api",x=g.fn[L],F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},U={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},W="next",q="prev",M="left",K="right",Q={SLIDE:"slide"+H,SLID:"slid"+H,KEYDOWN:"keydown"+H,MOUSEENTER:"mouseenter"+H,MOUSELEAVE:"mouseleave"+H,TOUCHSTART:"touchstart"+H,TOUCHMOVE:"touchmove"+H,TOUCHEND:"touchend"+H,POINTERDOWN:"pointerdown"+H,POINTERUP:"pointerup"+H,DRAG_START:"dragstart"+H,LOAD_DATA_API:"load"+H+R,CLICK_DATA_API:"click"+H+R},B="carousel",V="active",Y="slide",z="carousel-item-right",X="carousel-item-left",$="carousel-item-next",G="carousel-item-prev",J="pointer-event",Z=".active",tt=".active.carousel-item",et=".carousel-item",nt=".carousel-item img",it=".carousel-item-next, .carousel-item-prev",ot=".carousel-indicators",rt="[data-slide], [data-slide-to]",st='[data-ride="carousel"]',at={TOUCH:"touch",PEN:"pen"},lt=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(ot),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(W)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(it)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(tt);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?W:q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(H),g.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),_.typeCheckConfig(L,t,U),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};g(this._element.querySelectorAll(nt)).on(Q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Q.POINTERDOWN,function(t){return e(t)}),g(this._element).on(Q.POINTERUP,function(t){return i(t)}),this._element.classList.add(J)):(g(this._element).on(Q.TOUCHSTART,function(t){return e(t)}),g(this._element).on(Q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),g(this._element).on(Q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(et)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===W,i=t===q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===q?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(tt)),o=g.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(Z));g(e).removeClass(V);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(V)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(tt),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===W?(n=X,i=$,M):(n=z,i=G,K),l&&g(l).hasClass(V))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass(Y)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass(V),g(s).removeClass(V+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(V),g(l).addClass(V),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(j),e=l({},F,g(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(B)){var i=l({},g(n).data(),g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(j).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return F}}]),r}();g(document).on(Q.CLICK_DATA_API,rt,lt._dataApiClickHandler),g(window).on(Q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(st)),e=0,n=t.length;e<n;e++){var i=g(t[e]);lt._jQueryInterface.call(i,i.data())}}),g.fn[L]=lt._jQueryInterface,g.fn[L].Constructor=lt,g.fn[L].noConflict=function(){return g.fn[L]=x,lt._jQueryInterface};var ct="collapse",ht="bs.collapse",ut="."+ht,ft=g.fn[ct],dt={toggle:!0,parent:""},gt={toggle:"boolean",parent:"(string|element)"},_t={SHOW:"show"+ut,SHOWN:"shown"+ut,HIDE:"hide"+ut,HIDDEN:"hidden"+ut,CLICK_DATA_API:"click"+ut+".data-api"},mt="show",pt="collapse",vt="collapsing",yt="collapsed",Et="width",Ct="height",Tt=".show, .collapsing",St='[data-toggle="collapse"]',bt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(St)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Tt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(pt)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(ht))&&e._isTransitioning))){var i=g.Event(_t.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(ht,null));var o=this._getDimension();g(this._element).removeClass(pt).addClass(vt),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(yt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(vt).addClass(pt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(_t.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(mt)){var e=g.Event(_t.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(vt).removeClass(pt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(mt)||g(r).addClass(yt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(vt).addClass(pt).trigger(_t.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,ht),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},dt,t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ct,t,gt),t},t._getDimension=function(){return g(this._element).hasClass(Et)?Et:Ct},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(mt);e.length&&g(e).toggleClass(yt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(ht),n=l({},dt,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ht,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return dt}}]),a}();g(document).on(_t.CLICK_DATA_API,St,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(ht)?"toggle":n.data();bt._jQueryInterface.call(t,e)})}),g.fn[ct]=bt._jQueryInterface,g.fn[ct].Constructor=bt,g.fn[ct].noConflict=function(){return g.fn[ct]=ft,bt._jQueryInterface};var It="dropdown",Dt="bs.dropdown",wt="."+Dt,At=".data-api",Nt=g.fn[It],Ot=new RegExp("38|40|27"),kt={HIDE:"hide"+wt,HIDDEN:"hidden"+wt,SHOW:"show"+wt,SHOWN:"shown"+wt,CLICK:"click"+wt,CLICK_DATA_API:"click"+wt+At,KEYDOWN_DATA_API:"keydown"+wt+At,KEYUP_DATA_API:"keyup"+wt+At},Pt="disabled",Lt="show",jt="dropup",Ht="dropright",Rt="dropleft",xt="dropdown-menu-right",Ft="position-static",Ut='[data-toggle="dropdown"]',Wt=".dropdown form",qt=".dropdown-menu",Mt=".navbar-nav",Kt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Qt="top-start",Bt="top-end",Vt="bottom-start",Yt="bottom-end",zt="right-start",Xt="left-start",$t={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Gt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Jt=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)){var t=c._getParentFromElement(this._element),e=g(this._menu).hasClass(Lt);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=g.Event(kt.SHOW,n);if(g(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof u)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(t).addClass(Ft),this._popper=new u(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(t).closest(Mt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Lt),g(t).toggleClass(Lt).trigger(g.Event(kt.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||g(this._element).hasClass(Pt)||g(this._menu).hasClass(Lt))){var t={relatedTarget:this._element},e=g.Event(kt.SHOW,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)&&g(this._menu).hasClass(Lt)){var t={relatedTarget:this._element},e=g.Event(kt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Dt),g(this._element).off(wt),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(kt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,g(this._element).data(),t),_.typeCheckConfig(It,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Vt;return t.hasClass(jt)?(e=Qt,g(this._menu).hasClass(xt)&&(e=Bt)):t.hasClass(Ht)?e=zt:t.hasClass(Rt)?e=Xt:g(this._menu).hasClass(xt)&&(e=Yt),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Dt);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(Dt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Ut)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Dt),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Lt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(kt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),g(a).removeClass(Lt),g(o).removeClass(Lt).trigger(g.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(qt).length)):Ot.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Pt))){var e=c._getParentFromElement(this),n=g(e).hasClass(Lt);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Kt));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Ut);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return $t}},{key:"DefaultType",get:function(){return Gt}}]),c}();g(document).on(kt.KEYDOWN_DATA_API,Ut,Jt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,qt,Jt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Jt._clearMenus).on(kt.CLICK_DATA_API,Ut,function(t){t.preventDefault(),t.stopPropagation(),Jt._jQueryInterface.call(g(this),"toggle")}).on(kt.CLICK_DATA_API,Wt,function(t){t.stopPropagation()}),g.fn[It]=Jt._jQueryInterface,g.fn[It].Constructor=Jt,g.fn[It].noConflict=function(){return g.fn[It]=Nt,Jt._jQueryInterface};var Zt="modal",te="bs.modal",ee="."+te,ne=g.fn[Zt],ie={backdrop:!0,keyboard:!0,focus:!0,show:!0},oe={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},re={HIDE:"hide"+ee,HIDDEN:"hidden"+ee,SHOW:"show"+ee,SHOWN:"shown"+ee,FOCUSIN:"focusin"+ee,RESIZE:"resize"+ee,CLICK_DISMISS:"click.dismiss"+ee,KEYDOWN_DISMISS:"keydown.dismiss"+ee,MOUSEUP_DISMISS:"mouseup.dismiss"+ee,MOUSEDOWN_DISMISS:"mousedown.dismiss"+ee,CLICK_DATA_API:"click"+ee+".data-api"},se="modal-dialog-scrollable",ae="modal-scrollbar-measure",le="modal-backdrop",ce="modal-open",he="fade",ue="show",fe=".modal-dialog",de=".modal-body",ge='[data-toggle="modal"]',_e='[data-dismiss="modal"]',me=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",pe=".sticky-top",ve=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(fe),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(he)&&(this._isTransitioning=!0);var n=g.Event(re.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(re.CLICK_DISMISS,_e,function(t){return e.hide(t)}),g(this._dialog).on(re.MOUSEDOWN_DISMISS,function(){g(e._element).one(re.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(re.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(he);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(re.FOCUSIN),g(this._element).removeClass(ue),g(this._element).off(re.CLICK_DISMISS),g(this._dialog).off(re.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(ee)}),g(document).off(re.FOCUSIN),g.removeData(this._element,te),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},ie,t),_.typeCheckConfig(Zt,t,oe),t},t._showElement=function(t){var e=this,n=g(this._element).hasClass(he);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(se)?this._dialog.querySelector(de).scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ue),this._config.focus&&this._enforceFocus();var i=g.Event(re.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(i)};if(n){var r=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;g(document).off(re.FOCUSIN).on(re.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(re.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||g(this._element).off(re.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(re.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(re.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(ce),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(re.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(he)?he:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=le,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(re.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ue),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ue);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(he)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(me)),e=[].slice.call(document.querySelectorAll(pe));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css("padding-right");g(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css("margin-right");g(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=g(document.body).css("padding-right");g(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}g(document.body).addClass(ce)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(me));g(t).each(function(t,e){var n=g(e).data("padding-right");g(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+pe));g(e).each(function(t,e){var n=g(e).data("margin-right");"undefined"!=typeof n&&g(e).css("margin-right",n).removeData("margin-right")});var n=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=ae,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(te),e=l({},ie,g(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(te,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ie}}]),o}();g(document).on(re.CLICK_DATA_API,ge,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(te)?"toggle":l({},g(e).data(),g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(re.SHOW,function(t){t.isDefaultPrevented()||r.one(re.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});ve._jQueryInterface.call(g(e),o,this)}),g.fn[Zt]=ve._jQueryInterface,g.fn[Zt].Constructor=ve,g.fn[Zt].noConflict=function(){return g.fn[Zt]=ne,ve._jQueryInterface};var ye=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Ee={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Se(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===ye.indexOf(n)||Boolean(t.nodeValue.match(Ce)||t.nodeValue.match(Te));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var be="tooltip",Ie="bs.tooltip",De="."+Ie,we=g.fn[be],Ae="bs-tooltip",Ne=new RegExp("(^|\\s)"+Ae+"\\S+","g"),Oe=["sanitize","whiteList","sanitizeFn"],ke={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},Pe={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Le={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ye),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ye,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Je}},{key:"NAME",get:function(){return Ve}},{key:"DATA_KEY",get:function(){return Ye}},{key:"Event",get:function(){return rn}},{key:"EVENT_KEY",get:function(){return ze}},{key:"DefaultType",get:function(){return Ze}}]),i}(Be);g.fn[Ve]=sn._jQueryInterface,g.fn[Ve].Constructor=sn,g.fn[Ve].noConflict=function(){return g.fn[Ve]=Xe,sn._jQueryInterface};var an="scrollspy",ln="bs.scrollspy",cn="."+ln,hn=g.fn[an],un={offset:10,method:"auto",target:""},fn={offset:"number",method:"string",target:"(string|element)"},dn={ACTIVATE:"activate"+cn,SCROLL:"scroll"+cn,LOAD_DATA_API:"load"+cn+".data-api"},gn="dropdown-item",_n="active",mn='[data-spy="scroll"]',pn=".nav, .list-group",vn=".nav-link",yn=".nav-item",En=".list-group-item",Cn=".dropdown",Tn=".dropdown-item",Sn=".dropdown-toggle",bn="offset",In="position",Dn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+vn+","+this._config.target+" "+En+","+this._config.target+" "+Tn,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(dn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bn:In,o="auto"===this._config.method?t:this._config.method,r=o===In?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,ln),g(this._scrollElement).off(cn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},un,"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(an),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(an,t,fn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(gn)?(n.closest(Cn).find(Sn).addClass(_n),n.addClass(_n)):(n.addClass(_n),n.parents(pn).prev(vn+", "+En).addClass(_n),n.parents(pn).prev(yn).children(vn).addClass(_n)),g(this._scrollElement).trigger(dn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(_n)}).forEach(function(t){return t.classList.remove(_n)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(ln);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(ln,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return un}}]),n}();g(window).on(dn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(mn)),e=t.length;e--;){var n=g(t[e]);Dn._jQueryInterface.call(n,n.data())}}),g.fn[an]=Dn._jQueryInterface,g.fn[an].Constructor=Dn,g.fn[an].noConflict=function(){return g.fn[an]=hn,Dn._jQueryInterface};var wn="bs.tab",An="."+wn,Nn=g.fn.tab,On={HIDE:"hide"+An,HIDDEN:"hidden"+An,SHOW:"show"+An,SHOWN:"shown"+An,CLICK_DATA_API:"click"+An+".data-api"},kn="dropdown-menu",Pn="active",Ln="disabled",jn="fade",Hn="show",Rn=".dropdown",xn=".nav, .list-group",Fn=".active",Un="> li > .active",Wn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',qn=".dropdown-toggle",Mn="> .dropdown-menu .active",Kn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Pn)||g(this._element).hasClass(Ln))){var t,i,e=g(this._element).closest(xn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Un:Fn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(On.HIDE,{relatedTarget:this._element}),a=g.Event(On.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(On.HIDDEN,{relatedTarget:n._element}),e=g.Event(On.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,wn),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Fn):g(e).find(Un))[0],r=n&&o&&g(o).hasClass(jn),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(Hn).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Pn);var i=g(e.parentNode).find(Mn)[0];i&&g(i).removeClass(Pn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Pn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(jn)&&t.classList.add(Hn),t.parentNode&&g(t.parentNode).hasClass(kn)){var o=g(t).closest(Rn)[0];if(o){var r=[].slice.call(o.querySelectorAll(qn));g(r).addClass(Pn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(wn);if(e||(e=new i(this),t.data(wn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(On.CLICK_DATA_API,Wn,function(t){t.preventDefault(),Kn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Kn._jQueryInterface,g.fn.tab.Constructor=Kn,g.fn.tab.noConflict=function(){return g.fn.tab=Nn,Kn._jQueryInterface};var Qn="toast",Bn="bs.toast",Vn="."+Bn,Yn=g.fn[Qn],zn={CLICK_DISMISS:"click.dismiss"+Vn,HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn},Xn="fade",$n="hide",Gn="show",Jn="showing",Zn={animation:"boolean",autohide:"boolean",delay:"number"},ti={animation:!0,autohide:!0,delay:500},ei='[data-dismiss="toast"]',ni=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(zn.SHOW),this._config.animation&&this._element.classList.add(Xn);var e=function(){t._element.classList.remove(Jn),t._element.classList.add(Gn),g(t._element).trigger(zn.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($n),this._element.classList.add(Jn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Gn)&&(g(this._element).trigger(zn.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Gn)&&this._element.classList.remove(Gn),g(this._element).off(zn.CLICK_DISMISS),g.removeData(this._element,Bn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},ti,g(this._element).data(),"object"==typeof t&&t?t:{}),_.typeCheckConfig(Qn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(zn.CLICK_DISMISS,ei,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($n),g(t._element).trigger(zn.HIDDEN)};if(this._element.classList.remove(Gn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Bn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Zn}},{key:"Default",get:function(){return ti}}]),i}();g.fn[Qn]=ni._jQueryInterface,g.fn[Qn].Constructor=ni,g.fn[Qn].noConflict=function(){return g.fn[Qn]=Yn,ni._jQueryInterface},function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=_,t.Alert=p,t.Button=P,t.Carousel=lt,t.Collapse=bt,t.Dropdown=Jt,t.Modal=ve,t.Popover=sn,t.Scrollspy=Dn,t.Tab=Kn,t.Toast=ni,t.Tooltip=Be,Object.defineProperty(t,"__esModule",{value:!0})});
7
+ //# sourceMappingURL=bootstrap.min.js.map
admin/js/sp-dsgvo-admin.js CHANGED
@@ -1,186 +1,466 @@
1
- (function($){
2
-
3
- $(document).ready(function(){
4
-
5
- /************************
6
- * Settings
7
- *************************/
8
- $('.btn-settings').click(function(){
9
- if($(this).attr('data-state') == 'closed'){
10
- $('.btn-settings-show').show();
11
- $(this).attr('data-state', 'open');
12
- $(this).find('.state').html('Hide');
13
- }else{
14
- $('.btn-settings-show').hide();
15
- $(this).attr('data-state', 'closed');
16
- $(this).find('.state').html('Show');
17
- }
18
- });
19
-
20
-
21
- /************************
22
- * SAR
23
- *************************/
24
- $('#process_now').change(function(){
25
- var checkbox = document.getElementById('process_now');
26
- if(checkbox){
27
- if(checkbox.checked){
28
- $('#display_email').closest('tr').show();
29
- }else{
30
- $('#display_email').closest('tr').hide();
31
- }
32
- }
33
- });
34
-
35
- $('.cbChecklist').on('change', function () {
36
- var input = $(this).next('span');
37
- if (this.checked) {
38
- $(input).css('textDecoration', 'line-through');
39
- } else {
40
- $(input).css('textDecoration', 'none');
41
- }
42
- $('#checklist-form').submit();
43
- });
44
-
45
- /* i592995 */
46
- function checkNoticeType($select) {
47
- var val = $select.val(),
48
- $popupSettings = $('.policy-popup-settings'),
49
- $noticeSettings = $('.sp-cookie-notice-settings');
50
-
51
- if(val == 'cookie_notice') {
52
- $popupSettings.removeClass('active');
53
- $noticeSettings.addClass('active');
54
- } else if(val == 'policy_popup') {
55
- $popupSettings.addClass('active');
56
- $noticeSettings.removeClass('active');
57
- } else {
58
- $popupSettings.removeClass('active');
59
- $noticeSettings.removeClass('active');
60
- }
61
- }
62
-
63
- var $noticeType = $('#cookie_notice_display');
64
- if($noticeType.length > 0) {
65
- checkNoticeType($noticeType);
66
-
67
- $noticeType.on('change', function() {
68
- var $this = $(this);
69
- checkNoticeType($this);
70
- });
71
- }
72
-
73
- $('.unsubscribe-dismiss').on('click tap', function() {
74
- var $this = $(this),
75
- id = $this.attr('data-id');
76
- var nonce = $this.attr('data-nonce');
77
-
78
- if(confirm(args.dismiss_confirm)) {
79
- $this.parent().parent().fadeOut(500);
80
- $.post( args.ajaxurl, {
81
- action: 'admin-dismiss-unsubscribe',
82
- id: id,
83
- _wpnonce:nonce
84
- },
85
- function( data ) {
86
- } );
87
- }
88
- });
89
- /* i592995 */
90
-
91
- $('.google-gdpr-refresh-notice').on('click tap', function() {
92
-
93
- $.post( args.ajaxurl, {
94
- action: 'notice-action',
95
- id: 'google-gdpr-refresh-notice'
96
- });
97
-
98
- });
99
-
100
- $('.license-invalid-notice').on('click tap', function() {
101
-
102
- $.post( args.ajaxurl, {
103
- action: 'notice-action',
104
- id: 'license-invalid-notice'
105
- });
106
-
107
- });
108
-
109
- $('.license-revoke-notice').on('click tap', function() {
110
-
111
- $.post( args.ajaxurl, {
112
- action: 'notice-action',
113
- id: 'license-revoke-notice'
114
- });
115
-
116
- });
117
-
118
- });
119
- })( jQuery );
120
-
121
- /* i592995 */
122
- // THIS PART OF THE SCRIPT ADDS UPLOAD IMAGE Buttons
123
-
124
- jQuery( document ).ready( function( $ ) {
125
-
126
- function prepareUpload($upload) {
127
- // Uploading files
128
- var file_frame;
129
- var wp_media_post_id = wp.media.model.settings.post.id; // Store the old id
130
- var set_to_post_id = $upload.find('.image-id').val(); // Set this
131
- $upload.find('.button').on('click', function( event ){
132
- event.preventDefault();
133
- // If the media frame already exists, reopen it.
134
- if ( file_frame ) {
135
- // Set the post ID to what we want
136
- file_frame.uploader.uploader.param( 'post_id', set_to_post_id );
137
- // Open frame
138
- file_frame.open();
139
- return;
140
- } else {
141
- // Set the wp.media post id so the uploader grabs the ID we want when initialised
142
- wp.media.model.settings.post.id = set_to_post_id;
143
- }
144
- // Create the media frame.
145
- file_frame = wp.media.frames.file_frame = wp.media({
146
- multiple: false // Set to true to allow multiple files to be selected
147
- });
148
- // When an image is selected, run a callback.
149
- file_frame.on( 'select', function() {
150
- // We set multiple to false so only get one image from the uploader
151
- attachment = file_frame.state().get('selection').first().toJSON();
152
- // Do something with attachment.id and/or attachment.url here
153
- $upload.find('.image-preview').attr( 'src', attachment.url );
154
- $upload.find('.image-id').val( attachment.id );
155
- // Restore the main post ID
156
- wp.media.model.settings.post.id = wp_media_post_id;
157
- });
158
- // Finally, open the modal
159
- file_frame.open();
160
- });
161
- // Restore the main ID when the add media button is pressed
162
- jQuery( 'a.add_media' ).on( 'click', function() {
163
- wp.media.model.settings.post.id = wp_media_post_id;
164
- });
165
- }
166
-
167
- $('.dsgvo-image-upload').each(function() {
168
- var $this = $(this);
169
-
170
- prepareUpload($this);
171
- });
172
-
173
- $('#own_code').on('change', function() {
174
- var $this = $(this);
175
- $this.toggleClass('active');
176
-
177
- if($this.hasClass('active')) {
178
- $('#ga_code').removeAttr('disabled');
179
- $('#fb_pixel_code').removeAttr('disabled');
180
- } else {
181
- $('#ga_code').attr('disabled', 'disabled');
182
- $('#fb_pixel_code').attr('disabled', 'disabled');
183
- }
184
- });
185
-
186
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var spDsgvoActiveAdminSubmenu = '';
2
+
3
+ (function($){
4
+
5
+ $(document).ready(function(){
6
+
7
+ /************************
8
+ * Settings
9
+ *************************/
10
+ $('.btn-settings').click(function(){
11
+ if($(this).attr('data-state') == 'closed'){
12
+ $('.btn-settings-show').show();
13
+ $(this).attr('data-state', 'open');
14
+ $(this).find('.state').html('Hide');
15
+ }else{
16
+ $('.btn-settings-show').hide();
17
+ $(this).attr('data-state', 'closed');
18
+ $(this).find('.state').html('Show');
19
+ }
20
+ });
21
+
22
+
23
+ /************************
24
+ * SAR
25
+ *************************/
26
+ $('#process_now').change(function(){
27
+ var checkbox = document.getElementById('process_now');
28
+ if(checkbox){
29
+ if(checkbox.checked){
30
+ $('#display_email').closest('tr').show();
31
+ }else{
32
+ $('#display_email').closest('tr').hide();
33
+ }
34
+ }
35
+ });
36
+
37
+ $('.cbChecklist').on('change', function () {
38
+ var input = $(this).next('span');
39
+ if (this.checked) {
40
+ $(input).css('textDecoration', 'line-through');
41
+ } else {
42
+ $(input).css('textDecoration', 'none');
43
+ }
44
+ $('#checklist-form').submit();
45
+ });
46
+
47
+
48
+ $('.unsubscribe-dismiss').on('click tap', function() {
49
+ var $this = $(this),
50
+ id = $this.attr('data-id');
51
+
52
+ if(confirm(args.dismiss_confirm)) {
53
+ $this.parent().parent().fadeOut(500);
54
+ $.post( args.ajaxurl, {
55
+ action: 'admin-dismiss-unsubscribe',
56
+ id: id
57
+ },
58
+ function( data ) {
59
+ } );
60
+ }
61
+ });
62
+ /* i592995 */
63
+
64
+ $('.google-gdpr-refresh-notice').on('click tap', function() {
65
+
66
+ $.post( args.ajaxurl, {
67
+ action: 'notice-action',
68
+ id: 'google-gdpr-refresh-notice'
69
+ });
70
+
71
+ });
72
+
73
+ $('.license-invalid-notice').on('click tap', function() {
74
+
75
+ $.post( args.ajaxurl, {
76
+ action: 'notice-action',
77
+ id: 'license-invalid-notice'
78
+ });
79
+
80
+ });
81
+
82
+ $('.privacy-policy-texts-outdated-notice').on('click tap', function() {
83
+
84
+ $.post( args.ajaxurl, {
85
+ action: 'notice-action',
86
+ id: 'privacy-policy-texts-outdated-notice'
87
+ });
88
+
89
+ });
90
+
91
+ $('.update-check-settings-notice').on('click tap', function() {
92
+
93
+ $.post( args.ajaxurl, {
94
+ action: 'notice-action',
95
+ id: 'update-check-settings-notice'
96
+ });
97
+
98
+ });
99
+
100
+ $('.privacy-policy-texts-refresh-link').on('click tap', function() {
101
+
102
+ $('#progress-pp-texts-reload').show();
103
+ $('#btn-refresh-pp-texts').hide();
104
+ $.post( args.ajaxurl, {
105
+ action: 'update-privacy-policy-texts-action',
106
+ id: ''
107
+ }, function (data) {
108
+ location.reload();
109
+ });
110
+
111
+ });
112
+
113
+ $('.license-revoke-notice').on('click tap', function() {
114
+
115
+ $.post( args.ajaxurl, {
116
+ action: 'notice-action',
117
+ id: 'license-revoke-notice'
118
+ });
119
+
120
+ });
121
+
122
+ /* p912419 */
123
+ var DeclineCheckbox = document.getElementById('decline_button_allowed');
124
+ $(DeclineCheckbox).on('change', function(){
125
+ if(DeclineCheckbox){
126
+ if(DeclineCheckbox.checked){
127
+ $('#decline_button_text_color').closest('tr').show();
128
+ $('#decline_button_bg_color').closest('tr').show();
129
+ }else{
130
+ $('#decline_button_text_color').closest('tr').hide();
131
+ $('#decline_button_bg_color').closest('tr').hide();
132
+ }
133
+ }
134
+ });
135
+ $(DeclineCheckbox).trigger('change');
136
+
137
+ // Advanced Cookie Settings
138
+ var AdvancedDeclineCheckbox = document.getElementById('cn_activate_advanced_settings_btn');
139
+ $(AdvancedDeclineCheckbox).on('change', function(){
140
+ if(AdvancedDeclineCheckbox){
141
+ if(AdvancedDeclineCheckbox.checked){
142
+ $('.cn_advanced_cookie_info').show();
143
+ }else{
144
+ $('.cn_advanced_cookie_info').hide();
145
+ $('#cn_advanced_cookie_settings_textarea').prop('checked', false);
146
+ $('#cn_advanced_cookie_settings_textarea').trigger('change');
147
+ }
148
+ }
149
+ });
150
+ $(AdvancedDeclineCheckbox).trigger('change');
151
+
152
+
153
+ // backend cookie selector
154
+ var CookieViewSelector = $('#cookie_style');
155
+ var CookieImg = $('img[class*="cookie-style-admin-show--"]');
156
+ $(CookieViewSelector).on('change', function(){
157
+ var val = $(this).val();
158
+ var CurrentImg = $('img[class*="cookie-style-admin-show--' + val +'"]');
159
+ $(CookieImg).hide();
160
+ $(CurrentImg).show();
161
+
162
+ if (val == '00')
163
+ {
164
+ $('.cn-customize-standard-notice-container').show();
165
+ } else
166
+ {
167
+ $('.cn-customize-standard-notice-container').hide();
168
+ }
169
+ });
170
+ $(CookieViewSelector).trigger('change');
171
+
172
+ /* end p912419 */
173
+ if($('#su_email_content').length > 0 ) {
174
+ wp.editor.initialize( 'su_email_content' );
175
+ }
176
+ if($('#sar_email_content').length > 0) {
177
+ wp.editor.initialize( 'sar_email_content' );
178
+ }
179
+
180
+ function spDsgvoMarkActiveAdminSubmenu(activeSlug)
181
+ {
182
+ $('a[href^="admin.php?page=sp-dsgvo&tab=info"]').css('color','#28a745');
183
+ $('a[href^="admin.php?page=sp-dsgvo&tab=info"]').css('font-weight','500');
184
+
185
+ if(document.URL.indexOf("admin.php?page=sp-dsgvo") < 0){
186
+ return;
187
+ }
188
+
189
+ //alert(activeSlug);
190
+ $('a[href*="admin.php?page=sp-dsgvo"]').each(function() {
191
+ $(this).parent().removeClass('current');
192
+ });
193
+ if(activeSlug == 'common-settings')
194
+ {
195
+ $('a[href$="admin.php?page=sp-dsgvo"]').parent().addClass('current');
196
+ } else {
197
+ $('a[href^="admin.php?page=sp-dsgvo&tab=' + activeSlug + '"]').parent().addClass('current');
198
+ }
199
+ }
200
+
201
+ spDsgvoMarkActiveAdminSubmenu(spDsgvoActiveAdminSubmenu);
202
+
203
+ // ***** page operator ****
204
+ $("#page_operator_type").on('change', function(){
205
+ var val = $(this).val();
206
+
207
+ $('.page-operator-type-container').hide();
208
+ $('.label-operator-type').hide();
209
+ var label = 'corporate';
210
+ if (val != '') label = 'oneman-private';
211
+ switch (val) {
212
+ case 'private': break;
213
+ case 'one-man': break;
214
+ case 'corporation': break;
215
+ case 'society': break;
216
+ }
217
+ $('.page-operator-type-container-'+val).show();
218
+ $('.label-operator-type-'+val).show();
219
+
220
+ });
221
+
222
+ $("#spdsgvo_company_info_countrycode").on('change', function(){
223
+ var val = $(this).val();
224
+
225
+ if (val)
226
+ {
227
+ $('.page-operator-container-us').show();
228
+ } else
229
+ {
230
+ $('.page-operator-container-us').hide();
231
+ }
232
+
233
+ });
234
+
235
+
236
+ $("input[name='operator_pp_responsibility_type']").change(function() {
237
+
238
+ $(".container-pp-responsibility").removeClass('spdsgvo-d-block').addClass('spdsgvo-d-none');
239
+ $(".container-dso-contact").removeClass('spdsgvo-d-block').addClass('spdsgvo-d-none');
240
+
241
+ let val = $("input[name=operator_pp_responsibility_type]:checked").val();
242
+
243
+ let visibleDsoTypeContainerId = '';
244
+ switch (val) {
245
+ case 'internal': visibleDsoTypeContainerId = 'container-pp-responsibility-internal'; break;
246
+ case 'external': visibleDsoTypeContainerId = 'container-pp-responsibility-external';break;
247
+ case 'none': visibleDsoTypeContainerId = 'container-pp-responsibility-none';break;
248
+ default: visibleDsoTypeContainerId = '';
249
+ }
250
+
251
+ if (visibleDsoTypeContainerId != '') $('#'+visibleDsoTypeContainerId).addClass('spdsgvo-d-block');
252
+
253
+
254
+
255
+ });
256
+
257
+ $("input[name='operator_pp_responsibility_contact']").change(function() {
258
+
259
+ $(".container-dso-contact").removeClass('spdsgvo-d-block').addClass('spdsgvo-d-none');
260
+
261
+ let val = $("input[name=operator_pp_responsibility_contact]:checked").val();
262
+
263
+ let visibleDsoContactContainerId = '';
264
+
265
+ switch (val) {
266
+ case 'internal': visibleDsoContactContainerId = 'container-dso-contact-internal'; break;
267
+ case 'external': visibleDsoContactContainerId = 'container-dso-contact-external'; break;
268
+ case 'no': visibleDsoContactContainerId = ''; break; // nothing to do here
269
+ default: visibleDsoContactContainerId = '';
270
+ }
271
+
272
+ if (visibleDsoContactContainerId != '') $('#'+visibleDsoContactContainerId).addClass('spdsgvo-d-block');
273
+ });
274
+
275
+ // page basics
276
+ $("#page_basics_hosting_provider_other").change(function() {
277
+
278
+ if($("#page_basics_hosting_provider_other").is(':checked'))
279
+ $("#container-other-provider").show(); // checked
280
+ else
281
+ $("#container-other-provider").hide(); // unchecked
282
+ });
283
+
284
+ $("#page_basics_use_logfiles").change(function() {
285
+
286
+ if($("#page_basics_use_logfiles").is(':checked'))
287
+ $("#container-logfiles-life").show(); // checked
288
+ else
289
+ $("#container-logfiles-life").hide(); // unchecked
290
+ });
291
+
292
+ $("#page_basics_use_cdn").change(function() {
293
+
294
+ if($("#page_basics_use_cdn").is(':checked'))
295
+ $("#container-basics-use-cdn").show(); // checked
296
+ else
297
+ $("#container-basics-use-cdn").hide(); // unchecked
298
+ });
299
+
300
+ $("#page_basics_cdn_provider_other").change(function() {
301
+
302
+ if($("#page_basics_cdn_provider_other").is(':checked'))
303
+ $("#container-other-cdn").show(); // checked
304
+ else
305
+ $("#container-other-cdn").hide(); // unchecked
306
+ });
307
+
308
+ $("#page_basics_use_payment_provider").change(function() {
309
+
310
+ if($("#page_basics_use_payment_provider").is(':checked'))
311
+ $("#container-basics-use-payment-provider").show(); // checked
312
+ else
313
+ $("#container-basics-use-payment-provider").hide(); // unchecked
314
+ });
315
+
316
+ $("#page_basics_font_provider_google-fonts").change(function() {
317
+
318
+ if($("#page_basics_font_provider_google-fonts").is(':checked'))
319
+ $("#container-block-google-fonts").show(); // checked
320
+ else
321
+ $("#container-block-google-fonts").hide(); // unchecked
322
+ });
323
+
324
+ $("#page_basics_forms_comments").change(function() {
325
+
326
+ if($("#page_basics_forms_comments").is(':checked'))
327
+ $(".container-basics-forms_comments").show(); // checked
328
+ else
329
+ $(".container-basics-forms_comments").hide(); // unchecked
330
+ });
331
+
332
+ $("#page_basics_security_provider_other").change(function() {
333
+
334
+ if($("#page_basics_security_provider_other").is(':checked'))
335
+ $("#container-other-security").show(); // checked
336
+ else
337
+ $("#container-other-security").hide(); // unchecked
338
+ });
339
+
340
+ $("#page_basics_use_newsletter_provider").change(function() {
341
+
342
+ if($("#page_basics_use_newsletter_provider").is(':checked'))
343
+ $("#container-basics-use-newsletter").show(); // checked
344
+ else
345
+ $("#container-basics-use-newsletter").hide(); // unchecked
346
+ });
347
+
348
+ $("#page_basics_newsletter_other").change(function() {
349
+
350
+ if($("#page_basics_newsletter_other").is(':checked'))
351
+ $("#container-other-newsletter").show(); // checked
352
+ else
353
+ $("#container-other-newsletter").hide(); // unchecked
354
+ });
355
+
356
+ $('#btnIncreaseCookieVersion').on('click tap', function (event) {
357
+
358
+ $('#cookie_version').val((new Date()).getTime());
359
+ });
360
+
361
+ /*
362
+ $(function() {
363
+ $('.color-field').wpColorPicker();
364
+ });
365
+ */
366
+ });
367
+ })( jQuery );
368
+
369
+
370
+
371
+ /* i592995 */
372
+ // THIS PART OF THE SCRIPT ADDS UPLOAD IMAGE Buttons
373
+
374
+ jQuery( document ).ready( function( $ ) {
375
+
376
+ function prepareUpload($upload) {
377
+ // Uploading files
378
+ var file_frame;
379
+ var wp_media_post_id = wp.media.model.settings.post.id; // Store the old id
380
+ var set_to_post_id = $upload.find('.image-id').val(); // Set this
381
+
382
+ $upload.find('#logo_upload_image_button').on('click', function( event ){
383
+ event.preventDefault();
384
+ // If the media frame already exists, reopen it.
385
+ if ( file_frame ) {
386
+ // Set the post ID to what we want
387
+ file_frame.uploader.uploader.param( 'post_id', set_to_post_id );
388
+ // Open frame
389
+ file_frame.open();
390
+ return;
391
+ } else {
392
+ // Set the wp.media post id so the uploader grabs the ID we want when initialised
393
+ wp.media.model.settings.post.id = set_to_post_id;
394
+ }
395
+ // Create the media frame.
396
+ file_frame = wp.media.frames.file_frame = wp.media({
397
+ multiple: false // Set to true to allow multiple files to be selected
398
+ });
399
+ // When an image is selected, run a callback.
400
+ file_frame.on( 'select', function() {
401
+ // We set multiple to false so only get one image from the uploader
402
+ attachment = file_frame.state().get('selection').first().toJSON();
403
+ // Do something with attachment.id and/or attachment.url here
404
+ $upload.find('.image-preview').attr( 'src', attachment.url );
405
+ $upload.find('.image-id').val( attachment.id );
406
+ // Restore the main post ID
407
+ wp.media.model.settings.post.id = wp_media_post_id;
408
+ });
409
+ // Finally, open the modal
410
+ file_frame.open();
411
+ });
412
+
413
+ // Restore the main ID when the add media button is pressed
414
+ jQuery( 'a.add_media' ).on( 'click', function() {
415
+ wp.media.model.settings.post.id = wp_media_post_id;
416
+ });
417
+ }
418
+
419
+ $('.dsgvo-image-upload').each(function() {
420
+ var $this = $(this);
421
+
422
+ prepareUpload($this);
423
+ });
424
+
425
+ $('#own_code').on('change', function() {
426
+ var $this = $(this);
427
+ $this.toggleClass('active');
428
+
429
+ if($this.hasClass('active')) {
430
+ $('#ga_code').removeAttr('disabled');
431
+ $('#fb_pixel_code').removeAttr('disabled');
432
+ } else {
433
+ $('#ga_code').attr('disabled', 'disabled');
434
+ $('#fb_pixel_code').attr('disabled', 'disabled');
435
+ }
436
+ });
437
+
438
+ $('.own-code-toggle').on('change', function() {
439
+ var $this = $(this);
440
+
441
+
442
+ if($(this).is(':checked')) {
443
+ $(this).parents('.card-body').find('[class*="own-code-text"]').removeAttr('disabled');
444
+ } else {
445
+ $(this).parents('.card-body').find('[class*="own-code-text"]').attr('disabled', 'disabled');
446
+ }
447
+ });
448
+
449
+ $.fn.detectFont = function() {
450
+ var fonts = $(this).css('font-family').split(",");
451
+ if ( fonts.length == 1 )
452
+ return fonts[0];
453
+
454
+ var element = $(this);
455
+ var detectedFont = null;
456
+ fonts.forEach( function( font ) {
457
+ var clone = element.clone().css({'visibility': 'hidden', 'font-family': font}).appendTo('body');
458
+ if ( element.width() == clone.width() )
459
+ detectedFont = font;
460
+ clone.remove();
461
+ });
462
+
463
+ return detectedFont;
464
+ }
465
+
466
+ });
admin/tabs/common-settings/class-sp-dsgvo-common-settings-action.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOCommonSettingsAction extends SPDSGVOAjaxAction
4
- {
5
-
6
- protected $action = 'admin-common-settings';
7
-
8
- protected function run()
9
- {
10
- $this->checkCSRF();
11
- $this->requireAdmin();
12
-
13
- SPDSGVOSettings::set('admin_email', sanitize_email($this->get('admin_email', '')));
14
- SPDSGVOSettings::set('use_wpml_strings', $this->get('use_wpml_strings', '0'));
15
-
16
- SPDSGVOSettings::set('sp_dsgvo_comments_checkbox', $this->get('sp_dsgvo_comments_checkbox', '0'));
17
- if (isValidBlogEdition() || isValidPremiumEdition())
18
- {
19
-
20
- }
21
-
22
- SPDSGVOSettings::set('spdsgvo_comments_checkbox_info', $this->get('spdsgvo_comments_checkbox_info', ''));
23
- SPDSGVOSettings::set('spdsgvo_comments_checkbox_confirm', $this->get('spdsgvo_comments_checkbox_confirm', ''));
24
- SPDSGVOSettings::set('spdsgvo_comments_checkbox_text', $this->get('spdsgvo_comments_checkbox_text', ''));
25
- SPDSGVOSettings::set('sp_dsgvo_cf7_acceptance_replace', $this->get('sp_dsgvo_cf7_acceptance_replace', ''));
26
-
27
- SPDSGVOSettings::set('spdsgvo_company_info_name', $this->get('spdsgvo_company_info_name', ''));
28
- SPDSGVOSettings::set('spdsgvo_company_info_street', $this->get('spdsgvo_company_info_street', ''));
29
- SPDSGVOSettings::set('spdsgvo_company_info_loc_zip', $this->get('spdsgvo_company_info_loc_zip', ''));
30
- SPDSGVOSettings::set('spdsgvo_company_fn_nr', $this->get('spdsgvo_company_fn_nr', ''));
31
- SPDSGVOSettings::set('spdsgvo_company_law_loc', $this->get('spdsgvo_company_law_loc', ''));
32
- SPDSGVOSettings::set('spdsgvo_company_uid_nr', $this->get('spdsgvo_company_uid_nr', ''));
33
- SPDSGVOSettings::set('spdsgvo_company_law_person', $this->get('spdsgvo_company_law_person', ''));
34
- SPDSGVOSettings::set('spdsgvo_company_chairmen', $this->get('spdsgvo_company_chairmen', ''));
35
- SPDSGVOSettings::set('spdsgvo_company_resp_content', $this->get('spdsgvo_company_resp_content', ''));
36
- SPDSGVOSettings::set('spdsgvo_company_info_phone', $this->get('spdsgvo_company_info_phone', ''));
37
- SPDSGVOSettings::set('spdsgvo_company_info_fax', $this->get('spdsgvo_company_info_fax', ''));
38
- SPDSGVOSettings::set('spdsgvo_company_info_email', $this->get('spdsgvo_company_info_email', ''));
39
- SPDSGVOSettings::set('spdsgvo_newsletter_service', $this->get('spdsgvo_newsletter_service', ''));
40
- SPDSGVOSettings::set('spdsgvo_newsletter_service_privacy_policy_url', $this->get('spdsgvo_newsletter_service_privacy_policy_url', ''));
41
-
42
- $this->returnBack();
43
- }
44
- }
45
-
46
- SPDSGVOCommonSettingsAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/common-settings/page.php DELETED
@@ -1,254 +0,0 @@
1
-
2
- <h1><?php _e('Activate Blog/Premium','shapepress-dsgvo')?></h1>
3
-
4
- <table class="form-table">
5
- <tr>
6
- <th scope="row"><?php _e('License','shapepress-dsgvo')?></th>
7
- <td>
8
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>" style="display: inline">
9
- <input type="hidden" name="action" value="admin-common-settings-activate">
10
- <?php wp_nonce_field( SPDSGVOCommonSettingsActivateAction::getActionName(). '-nonce' ); ?>
11
- <label for="dsgvo_licence"> <input name="dsgvo_licence"
12
- type="text" id="dsgvo_licence" style="width: 200px"
13
- value="<?= SPDSGVOSettings::get('dsgvo_licence'); ?>">
14
- </label>
15
- <?php if(SPDSGVOSettings::get('license_activated') === '1'): ?>
16
- <input type="submit" class="button button-primary" value="<?= __('Deactivate license','shapepress-dsgvo')?>" />
17
- <?php else: ?>
18
- <input type="submit" class="button button-primary" value="<?= __('Activate license','shapepress-dsgvo')?>" />
19
- <span class="info-text"><?php _e('Activating the license unlocks more features.','shapepress-dsgvo'); ?></span>
20
- <?php endif; ?>
21
- </form>
22
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>" style="display: inline">
23
- <input type="hidden" name="action" value="admin-common-settings-validate-license">
24
- <input type="submit" class="button button-secondary" value="<?= __('Refresh license','shapepress-dsgvo')?>" />
25
- </form>
26
- <?php if(licenseIsGoingToRunningOut()): ?>
27
- <a href="<?= getExtensionProductUrl();?>" class="button button-secondary" style="background-color: #aed581;" target="_blank" ><?= __('Extend license now and gain discount','shapepress-dsgvo')?></a>
28
- <?php endif; ?>
29
- </td>
30
- </tr>
31
- <tr>
32
- <th></th>
33
- <td>
34
- <?php if(SPDSGVOSettings::get('license_activated') === '1'): ?>
35
- <div style="font-weight:500">
36
- <?php if(isPremiumEdition()): ?>
37
- <?= isValidPremiumEdition() ? _e('Premium version has been activated','shapepress-dsgvo') : ('<span style ="color: red;">'. __('Invalid or expired license.','shapepress-dsgvo'). "</span>"); ?>
38
- <?php endif; ?>
39
- <?php if(isBlogEdition()): ?>
40
- <?= isValidBlogEdition() ? _e('Blog version has been activated','shapepress-dsgvo') : _e('Invalid license.','shapepress-dsgvo'); ?>
41
- <?php endif; ?>
42
- </div>
43
-
44
- <?php if(isPremiumEdition() && SPDSGVOSettings::get('licence_details_fetched') === '1'): ?>
45
- <div><div style="font-weight:500; width: 150px; float:left;"><?php _e('Activated on:','shapepress-dsgvo'); ?></div> <?= date("d.m.Y", strtotime(SPDSGVOSettings::get('licence_activated_on'))); ?></div>
46
- <div><div style="font-weight:500; width: 150px; float:left;"><?php _e('Status:','shapepress-dsgvo'); ?></div> <?= SPDSGVOSettings::get('licence_status'); ?></div>
47
- <?php if (isUnlimitedLicense(SPDSGVOSettings::get('dsgvo_licence')) == false) :?>
48
- <div><div style="font-weight:500; width: 150px; float:left;"><?php _e('Valid to:','shapepress-dsgvo'); ?></div> <?= date("d.m.Y", strtotime(SPDSGVOSettings::get('licence_valid_to'))); ?></div>
49
- <?php endif; ?>
50
- <?php if( SPDSGVOSettings::get('licence_details_fetched_new') === '1'): ?>
51
- <div><div style="font-weight:500; width: 150px; float:left;"><?php _e('Last validation:','shapepress-dsgvo'); ?></div> <?= date_i18n("d.m.Y H:i", strtotime(SPDSGVOSettings::get('licence_details_fetched_on'))); ?></div>
52
- <div><div style="font-weight:500; width: 150px; float:left;"><?php _e('Remaining activations:','shapepress-dsgvo'); ?></div> <?= SPDSGVOSettings::get('licence_number_use_remaining'); ?></div>
53
- <?php endif; ?>
54
- <?php endif; ?>
55
- <?php else: ?>
56
- <span class="info-text"><?php _e('Activating the license unlocks more features.','shapepress-dsgvo'); ?></span>
57
- <?php endif; ?>
58
- </td>
59
- </tr>
60
- <tr>
61
- <th></th>
62
- <td></td>
63
- </tr>
64
- </table>
65
-
66
-
67
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
68
- <input type="hidden" name="action" value="admin-common-settings">
69
- <?php wp_nonce_field( SPDSGVOCommonSettingsAction::getActionName(). '-nonce' ); ?>
70
- <input type="hidden" value="<?= SPDSGVOSettings::get('dsgvo_licence'); ?>" id="dsgvo_licence_hidden" name="dsgvo_licence_hidden" />
71
-
72
- <h1><?php _e('Common Settings','shapepress-dsgvo')?></h1>
73
-
74
- <table class="form-table">
75
- <tr>
76
- <th scope="row"><?php _e('Admin Email','shapepress-dsgvo')?></th>
77
- <td><label for="admin_email"> <input name="admin_email"
78
- type="text" id="admin_email" style="width: 300px"
79
- value="<?= esc_html( SPDSGVOSettings::get('admin_email')); ?>">
80
- </label><span class="info-text"><?php _e('Used by sending emails.','shapepress-dsgvo')?></span></td>
81
- </tr>
82
- <!--
83
- <tr>
84
- <th scope="row"><?php _e('Use WPML Strings','shapepress-dsgvo')?></th>
85
- <td><label for="use_wpml_strings"> <input
86
- name="use_wpml_strings" type="checkbox"
87
- id="use_wpml_strings" value="1"
88
- <?= (SPDSGVOSettings::get('use_wpml_strings') === '1')? ' checked ' : ''; ?>>
89
- </label><span class="info-text"><?php _e('Use WPML String Translation for text inputs. (E.g. Checkbox for comments.)','shapepress-dsgvo')?></span></td>
90
- </tr>
91
- -->
92
- </table>
93
-
94
- <?php if (isLicenceValid()) : ?>
95
- <h2><?php _e('Comments','shapepress-dsgvo')?></h2>
96
- <?php else : ?>
97
- <h2><?php _e('Comments','shapepress-dsgvo')?></h2><span style="color: orange"><?php _e('Customizing possible with Blog/Premium edition.','shapepress-dsgvo')?></span>
98
- <small><a href="https://www.wp-dsgvo.eu/shop"><?php _e('Click here to get a license.','shapepress-dsgvo')?></a></small>
99
- <?php endif; ?>
100
- <?php $disableCommentInputs = isLicenceValid() == false; ?>
101
- <table class="form-table">
102
- <tr>
103
- <th scope="row"><?php _e('Checkbox for comments:','shapepress-dsgvo')?></th>
104
- <td><label for="sp_dsgvo_comments_checkbox"> <input
105
- name="sp_dsgvo_comments_checkbox" type="checkbox"
106
- id="sp_dsgvo_comments_checkbox" value="1"
107
- <?= (SPDSGVOSettings::get('sp_dsgvo_comments_checkbox') === '1')? ' checked ' : ''; ?>>
108
- </label><span class="info-text"><?php _e('Displays at checkbox which requires confirmation when creating a comment.','shapepress-dsgvo')?></span>
109
- <span class="info-text"><?php _e('Important: Not compatible in combination with Jetpack comment form.','shapepress-dsgvo')?></span>
110
- </td>
111
- </tr>
112
- <?php if (class_exists('WPCF7_ContactForm')) : ?>
113
- <tr>
114
-
115
- <td><?php _e('Replace CF7 Acceptance text','shapepress-dsgvo')?></td>
116
- <td><label for="sp_dsgvo_cf7_acceptance_replace"> <input
117
- name="sp_dsgvo_cf7_acceptance_replace" type="checkbox"
118
- id="sp_dsgvo_cf7_acceptance_replace" value="1"
119
- <?= (SPDSGVOSettings::get('sp_dsgvo_cf7_acceptance_replace') === '1')? ' checked ' : ''; ?>>
120
- </label><span class="info-text"><?php _e('Replaces the text of CF7 Acceptance Checkboxes with following text. (Add to your form: [acceptance dsgvo] Text[/acceptance])','shapepress-dsgvo')?></span></td>
121
- </tr>
122
- <?php endif; ?>
123
- <tr>
124
- <th scope="row"><?php _e('Text','shapepress-dsgvo')?></th>
125
- <td><label for="spdsgvo_comments_checkbox_text"> <textarea name="spdsgvo_comments_checkbox_text"
126
- placeholder="<?php _e('Message text:','shapepress-dsgvo')?>" id="spdsgvo_comments_checkbox_text" rows="3"
127
- <?= $disableCommentInputs ? 'disabled' : ''; ?>
128
- style="width: 100%"><?= htmlentities(SPDSGVOSettings::get('spdsgvo_comments_checkbox_text')) ?></textarea>
129
- </label></td>
130
- </tr>
131
- <tr>
132
- <th scope="row"><?php _e('Info text:','shapepress-dsgvo')?></th>
133
- <td><label for="spdsgvo_comments_checkbox_info"> <input
134
- name="spdsgvo_comments_checkbox_info" type="text" style="width: 500px"
135
- <?= $disableCommentInputs ? 'disabled' : ''; ?>
136
- id="spdsgvo_comments_checkbox_info" value="<?= htmlentities(SPDSGVOSettings::get('spdsgvo_comments_checkbox_info')); ?>">
137
- </label></td>
138
- </tr>
139
- <tr>
140
- <th scope="row"><?php _e('Confirmation text','shapepress-dsgvo')?></th>
141
- <td><label for="spdsgvo_comments_checkbox_confirm"> <input
142
- name="spdsgvo_comments_checkbox_confirm" type="text" style="width: 300px"
143
- <?= $disableCommentInputs ? 'disabled' : ''; ?>
144
- id="spdsgvo_comments_checkbox_confirm" value="<?= htmlentities(SPDSGVOSettings::get('spdsgvo_comments_checkbox_confirm')); ?>">
145
- </label></td>
146
- </tr>
147
- </table>
148
-
149
- <p><?php _e('<strong>Important Note:</strong> If you use WPML you can translate these inputs via WPML String Translations.','shapepress-dsgvo')?></p>
150
-
151
-
152
- <hr class="sp-dsgvo">
153
-
154
- <h2><?php _e('Company data','shapepress-dsgvo')?></h2>
155
- <p><?php _e('The following input fields represent the basic data necessary for the creation of GDPR compliant data protection regulations and an imprint.<br />All entries made here are automatically used in the privacy policy and imprint generated by the WP DSGVO Tools Plugin.','shapepress-dsgvo')?></p>
156
-
157
- <table class="form-table">
158
- <tr>
159
- <td><?php _e('Company name:','shapepress-dsgvo')?></td>
160
- <td><label for="spdsgvo_company_info_name"> <input name="spdsgvo_company_info_name"
161
- type="text" id="spdsgvo_company_info_name" style="width: 300px"
162
- value="<?= SPDSGVOSettings::get('spdsgvo_company_info_name'); ?>">
163
- </label><span class="info-text"></span></td>
164
- </tr>
165
- <tr>
166
- <td><?php _e('Street:','shapepress-dsgvo')?></td>
167
- <td><label for="spdsgvo_company_info_street"> <input name="spdsgvo_company_info_street"
168
- type="text" id="spdsgvo_company_info_street" style="width: 300px"
169
- value="<?= SPDSGVOSettings::get('spdsgvo_company_info_street'); ?>">
170
- </label><span class="info-text"></span></td>
171
- </tr>
172
- <tr>
173
- <td><?php _e('ZIP + Location:','shapepress-dsgvo')?></td>
174
- <td><label for="spdsgvo_company_info_loc_zip"> <input name="spdsgvo_company_info_loc_zip"
175
- type="text" id="spdsgvo_company_info_loc_zip" style="width: 300px"
176
- value="<?= SPDSGVOSettings::get('spdsgvo_company_info_loc_zip'); ?>">
177
- </label><span class="info-text"></span></td>
178
- </tr>
179
- <tr>
180
- <td><?php _e('Commercial book no.:','shapepress-dsgvo')?></td>
181
- <td><label for="spdsgvo_company_fn_nr"> <input name="spdsgvo_company_fn_nr"
182
- type="text" id="spdsgvo_company_fn_nr" style="width: 300px"
183
- value="<?= SPDSGVOSettings::get('spdsgvo_company_fn_nr'); ?>">
184
- </label><span class="info-text"></span></td>
185
- </tr>
186
- <tr>
187
- <td><?php _e('§11 Place of Jurisdiction:','shapepress-dsgvo')?></td>
188
- <td><label for="spdsgvo_company_law_loc"> <input name="spdsgvo_company_law_loc"
189
- type="text" id="spdsgvo_company_law_loc" style="width: 300px"
190
- value="<?= SPDSGVOSettings::get('spdsgvo_company_law_loc'); ?>">
191
- </label><span class="info-text"></span></td>
192
- </tr>
193
- <tr>
194
- <td><?php _e('VAT No.:','shapepress-dsgvo')?></td>
195
- <td><label for="spdsgvo_company_uid_nr"> <input name="spdsgvo_company_uid_nr"
196
- type="text" id="spdsgvo_company_uid_nr" style="width: 300px"
197
- value="<?= SPDSGVOSettings::get('spdsgvo_company_uid_nr'); ?>">
198
- </label><span class="info-text"></span></td>
199
- </tr>
200
- <tr>
201
- <td><?php _e('Legal representatives:','shapepress-dsgvo')?></td>
202
- <td><label for="spdsgvo_company_law_person"> <input name="spdsgvo_company_law_person"
203
- type="text" id="spdsgvo_company_law_person" style="width: 300px"
204
- value="<?= SPDSGVOSettings::get('spdsgvo_company_law_person'); ?>">
205
- </label><span class="info-text"><?php _e('The person who legally represents the company.','shapepress-dsgvo')?></span></td>
206
- </tr>
207
- <tr>
208
- <td><?php _e('Shareholder','shapepress-dsgvo')?></td>
209
- <td><label for="spdsgvo_company_chairmen"> <input name="spdsgvo_company_chairmen"
210
- type="text" id="spdsgvo_company_chairmen" style="width: 300px"
211
- value="<?= SPDSGVOSettings::get('spdsgvo_company_chairmen'); ?>">
212
- </label><span class="info-text"><?php _e('In case of companies please contact all shareholders here.','shapepress-dsgvo')?></span></td>
213
- </tr>
214
- <tr>
215
- <td><?php _e('Responsible for content:','shapepress-dsgvo')?></td>
216
- <td><label for="spdsgvo_company_resp_content"> <input name="spdsgvo_company_resp_content"
217
- type="text" id="spdsgvo_company_resp_content" style="width: 300px"
218
- value="<?= SPDSGVOSettings::get('spdsgvo_company_resp_content'); ?>">
219
- </label><span class="info-text"><?php _e('The person responsible for the content on this website.','shapepress-dsgvo')?></span></td>
220
- </tr>
221
- <tr>
222
- <td><?php _e('Phone:','shapepress-dsgvo')?></td>
223
- <td><label for="spdsgvo_company_info_phone"> <input name="spdsgvo_company_info_phone"
224
- type="text" id="spdsgvo_company_info_phone" style="width: 300px"
225
- value="<?= SPDSGVOSettings::get('spdsgvo_company_info_phone'); ?>">
226
- </label><span class="info-text"></span></td>
227
- </tr>
228
- <tr>
229
- <td><?php _e('Email:','shapepress-dsgvo')?></td>
230
- <td><label for="spdsgvo_company_info_email"> <input name="spdsgvo_company_info_email"
231
- type="text" id="spdsgvo_company_info_email" style="width: 300px"
232
- value="<?= SPDSGVOSettings::get('spdsgvo_company_info_email'); ?>">
233
- </label><span class="info-text"></span></td>
234
- </tr>
235
- <tr>
236
- <td><?php _e('Newsletter service:','shapepress-dsgvo')?></td>
237
- <td><label for="spdsgvo_newsletter_service"> <input name="spdsgvo_newsletter_service"
238
- type="text" id="spdsgvo_newsletter_service" style="width: 300px"
239
- value="<?= SPDSGVOSettings::get('spdsgvo_newsletter_service'); ?>">
240
- </label><span class="info-text"><?php _e('Name of the shipping service provider with which the newsletters will be sent.','shapepress-dsgvo')?></span></td>
241
- </tr>
242
- <tr>
243
- <td><?php _e('URL Privacy Police of Newsletter Service:','shapepress-dsgvo')?></td>
244
- <td><label for="spdsgvo_newsletter_service_privacy_policy_url"> <input name="spdsgvo_newsletter_service_privacy_policy_url"
245
- type="text" id="spdsgvo_newsletter_service_privacy_policy_url" style="width: 300px"
246
- value="<?= SPDSGVOSettings::get('spdsgvo_newsletter_service_privacy_policy_url'); ?>">
247
- </label><span class="info-text"><?php _e('The URL to the terms of the newsletter service.','shapepress-dsgvo')?></span></td>
248
- </tr>
249
- </table>
250
-
251
-
252
- <br>
253
- <?php submit_button(); ?>
254
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/cookie-notice/class-sp-dsgvo-cookie-notice-action.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOCookieNoticeAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-cookie-notice';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- SPDSGVOSettings::set('cn_tracker_init', $this->get('cn_tracker_init', 'on_load'));
12
-
13
- SPDSGVOSettings::set('ga_enable_analytics', $this->get('ga_enable_analytics', '0'));
14
- SPDSGVOSettings::set('ga_tag_number', $this->get('ga_tag_number', ''));
15
-
16
- SPDSGVOSettings::set('fb_enable_pixel', $this->get('fb_enable_pixel', '0'));
17
- SPDSGVOSettings::set('fb_pixel_number', $this->get('fb_pixel_number', ''));
18
-
19
- SPDSGVOSettings::set('display_cookie_notice', $this->get('display_cookie_notice', '0'));
20
- SPDSGVOSettings::set('cookie_notice_custom_text', $this->get('cookie_notice_custom_text', ''));
21
- SPDSGVOSettings::set('cn_cookie_validity', $this->get('cn_cookie_validity', '86400'));
22
-
23
- SPDSGVOSettings::set('cn_button_text_ok', $this->get('cn_button_text_ok', ''));
24
- SPDSGVOSettings::set('cn_reload_on_confirm', $this->get('cn_reload_on_confirm', '0'));
25
-
26
- SPDSGVOSettings::set('cn_activate_cancel_btn', $this->get('cn_activate_cancel_btn', '0'));
27
- SPDSGVOSettings::set('cn_button_text_cancel', $this->get('cn_button_text_cancel', ''));
28
- SPDSGVOSettings::set('cn_decline_target_url', $this->get('cn_decline_target_url', ''));
29
- SPDSGVOSettings::set('cn_decline_no_cookie', $this->get('cn_decline_no_cookie', '0'));
30
-
31
- SPDSGVOSettings::set('cn_activate_more_btn', $this->get('cn_activate_more_btn', '0'));
32
- SPDSGVOSettings::set('cn_button_text_more', $this->get('cn_button_text_more', ''));
33
- SPDSGVOSettings::set('cn_read_more_page', $this->get('cn_read_more_page', ''));
34
-
35
- SPDSGVOSettings::set('cn_position', $this->get('cn_position', 'bottom'));
36
- SPDSGVOSettings::set('cn_animation', $this->get('cn_animation', 'none'));
37
- SPDSGVOSettings::set('cookie_notice_display', $this->get('cookie_notice_display', 'no_popup'));
38
-
39
- SPDSGVOSettings::set('cn_show_dsgvo_icon', $this->get('cn_show_dsgvo_icon', '0'));
40
-
41
- if (isValidBlogEdition() || isValidPremiumEdition())
42
- {
43
- SPDSGVOSettings::set('cn_background_color', $this->get('cn_background_color', '#333333'));
44
- SPDSGVOSettings::set('cn_text_color', $this->get('cn_text_color', '#ffffff'));
45
- SPDSGVOSettings::set('cn_background_color_button', $this->get('cn_background_color_button', '#F3F3F3'));
46
- SPDSGVOSettings::set('cn_text_color_button', $this->get('cn_text_color_button', '#333333'));
47
- SPDSGVOSettings::set('cn_custom_css_container', $this->get('cn_custom_css_container', ''));
48
- SPDSGVOSettings::set('cn_custom_css_text', $this->get('cn_custom_css_text', ''));
49
- SPDSGVOSettings::set('cn_custom_css_buttons', $this->get('cn_custom_css_buttons', ''));
50
-
51
- SPDSGVOSettings::set('cn_size_text', $this->get('cn_size_text', 'auto'));
52
- SPDSGVOSettings::set('cn_height_container', $this->get('cn_height_container', 'auto'));
53
- SPDSGVOSettings::set('cn_use_overlay', $this->get('cn_use_overlay', '0'));
54
- }
55
-
56
- if (isValidPremiumEdition() || isValidBlogEdition())
57
- {
58
- SPDSGVOSettings::set('ga_code', $this->get('ga_code', ''));
59
- SPDSGVOSettings::set('fb_pixel_code', $this->get('fb_pixel_code', ''));
60
- SPDSGVOSettings::set('own_code', $this->get('own_code', ''));
61
- }
62
-
63
- if (isValidPremiumEdition())
64
- {
65
- /* i592995 */
66
- SPDSGVOSettings::set('logo_image_id', $this->get('logo_image_id', ''));
67
- SPDSGVOSettings::set('close_button_action', $this->get('close_button_action', '0'));
68
- SPDSGVOSettings::set('close_button_url', $this->get('close_button_url', ''));
69
- SPDSGVOSettings::set('accept_button_text', $this->get('accept_button_text', ''));
70
- SPDSGVOSettings::set('more_options_button_text', $this->get('more_options_button_text', ''));
71
- SPDSGVOSettings::set('accordion_top', $this->get('accordion_top', ''));
72
- SPDSGVOSettings::set('popup_background', $this->get('popup_background', '#ffffff'));
73
- SPDSGVOSettings::set('separators_color', $this->get('separators_color', '#f1f1f1'));
74
- SPDSGVOSettings::set('text_color', $this->get('text_color', '#222222'));
75
- SPDSGVOSettings::set('links_color', $this->get('links_color', '#4285f'));
76
- SPDSGVOSettings::set('links_color_hover', $this->get('links_color_hover', '#4285f'));
77
- SPDSGVOSettings::set('accept_button_text_color', $this->get('accept_button_text_color', '#ffffff'));
78
- SPDSGVOSettings::set('accept_button_bg_color', $this->get('accept_button_bg_color', '#4285f'));
79
- SPDSGVOSettings::set('cn_reload_on_confirm_popup', $this->get('cn_reload_on_confirm_popup', '0'));
80
- /* i592995 */
81
- SPDSGVOSettings::set('cn_cookie_validity_popup', $this->get('cn_cookie_validity_popup', '86400'));
82
- }
83
-
84
- $this->returnBack();
85
- }
86
- }
87
-
88
- SPDSGVOCookieNoticeAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/cookie-notice/page.php DELETED
@@ -1,729 +0,0 @@
1
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
2
- <input type="hidden" name="action" value="admin-cookie-notice">
3
- <?php wp_nonce_field( SPDSGVOCookieNoticeAction::getActionName(). '-nonce' ); ?>
4
-
5
- <h1><?php _e('Cookie Notice','shapepress-dsgvo')?></h1>
6
-
7
- <table class="form-table">
8
- <tr>
9
- <th scope="row"><?php _e('Tracker initialization:','shapepress-dsgvo')?></th>
10
- <td>
11
- <?php $cnTrackerInit = SPDSGVOSettings::get('cn_tracker_init'); ?>
12
- <label for="cn_tracker_init"> <select name="cn_tracker_init"
13
- id="cn_tracker_init">
14
- <option value="on_load" <?= selected($cnTrackerInit == 'on_load') ?>> <?php _e('When loading the page','shapepress-dsgvo')?></option>
15
- <option value="after_confirm" <?= selected($cnTrackerInit == 'after_confirm') ?>><?php _e('After approval of the cookie','shapepress-dsgvo')?></option>
16
- </select>
17
- </label> <span class="info-text"><?php _e('Specifies when the trackers should be active. Whether before the consent of the cookie or after clicking on Ok. For After approval Reload after approval must be checked.','shapepress-dsgvo')?></span>
18
- </td>
19
- </tr>
20
- </table>
21
-
22
- <table class="form-table" style="margin-top: 0">
23
- <tbody>
24
- <tr>
25
- <td style="width: 50%;">
26
- <table class="form-table">
27
- <tr>
28
- <th scope="row"><?php _e('Google Analyics','shapepress-dsgvo')?></th>
29
- <td><label for="ga_enable_analytics"> <input
30
- name="ga_enable_analytics" type="checkbox"
31
- id="ga_enable_analytics" value="1"
32
- <?= (SPDSGVOSettings::get('ga_enable_analytics') === '1')? ' checked ' : ''; ?>>
33
- </label></td>
34
- </tr>
35
- <tr>
36
- <th scope="row"><?php _e('GTAG number:','shapepress-dsgvo')?></th>
37
- <td><label for="ga_tag_number"> <input name="ga_tag_number"
38
- type="text" id="ga_tag_number" placeholder="XX-XXXXXX-X"
39
- value="<?= SPDSGVOSettings::get('ga_tag_number'); ?>">
40
- </label></td>
41
- </tr>
42
-
43
- <tr>
44
- <td colspan="2" class="info-text"><?php _e('The IP address will be anonymously and visitors get the option refuse tracking. <br />Tip: Country specific geodata will be further tracked even with anonymization.','shapepress-dsgvo')?>
45
- </td>
46
- </tr>
47
- </table>
48
- </td>
49
- <td style="width: 50%:">
50
- <table class="form-table">
51
- <tr>
52
- <th scope="row"><?php _e('Facebook Pixel','shapepress-dsgvo')?></th>
53
- <td><label for="fb_enable_pixel"> <input name="fb_enable_pixel"
54
- type="checkbox" id="fb_enable_pixel" value="1"
55
- <?= (SPDSGVOSettings::get('fb_enable_pixel') === '1')? ' checked ' : ''; ?>>
56
- </label></td>
57
- </tr>
58
- <tr>
59
- <th scope="row"><?php _e('FB Pixel Id:','shapepress-dsgvo')?></th>
60
- <td><label for="fb_pixel_number"> <input name="fb_pixel_number"
61
- type="text" id="fb_pixel_number" placeholder="123456789"
62
- value="<?= SPDSGVOSettings::get('fb_pixel_number'); ?>">
63
- </label></td>
64
- </tr>
65
-
66
- <tr>
67
- <td colspan="2" style="vertical-align: top" class="info-text"><?php _e('Visitors maintained the opportunity to reject the tracking.','shapepress-dsgvo')?></td>
68
- </tr>
69
- </table>
70
- </td>
71
- </tr>
72
-
73
- <!-- i592995 -->
74
- <?php $disableOwnTracker = (isValidBlogEdition() || isValidPremiumEdition()) == false; ?>
75
- <tr>
76
- <th scope="row">
77
- <?php _e('Use your own Codes (at own risk)','shapepress-dsgvo')?>
78
- <label for="own_code"> <input
79
- name="own_code" type="checkbox"
80
- id="own_code" value="1"
81
- <?= $disableOwnTracker ? 'disabled' : true; ?>
82
- <?= (SPDSGVOSettings::get('own_code') === '1')? ' checked ' : ''; ?>>
83
- </label>
84
- </th>
85
- <td>
86
- </td>
87
- </tr>
88
-
89
- <tr>
90
- <td>
91
- <table class="form-table">
92
-
93
- <?php
94
- $ga_code = SPDSGVOSettings::get('ga_code', '');
95
- if($ga_code == '') {
96
- $ga_code = googleAnalyticsScript(true);
97
- }
98
- ?>
99
-
100
- <tr>
101
- <th scope="row"><?php _e('Google Analytics code:','shapepress-dsgvo')?></th>
102
- <td>
103
- <label for="ga_code">
104
- <textarea id="ga_code" name="ga_code" class="ga-code" <?= (SPDSGVOSettings::get('own_code') === '1')? '' : 'disabled'; ?>>
105
- <?php echo $ga_code; ?>
106
- </textarea>
107
- <?php _e('If left blank, the standard GA script will be used','shapepress-dsgvo'); ?>
108
- </label>
109
- </td>
110
- </tr>
111
- <!-- .i592995 -->
112
- </table>
113
- </td>
114
- <td>
115
- <table class="form-table">
116
- <!-- .i592995 -->
117
-
118
- <?php
119
- $fb_pixel_code = SPDSGVOSettings::get('fb_pixel_code', '');
120
- if($fb_pixel_code == '') {
121
- $fb_pixel_code = facebookPixelScript(true);
122
- }
123
- ?>
124
-
125
- <tr>
126
- <th scope="row"><?php _e('Facebook Pixel code:','shapepress-dsgvo')?></th>
127
- <td>
128
- <label for="fb_pixel_code">
129
- <textarea id="fb_pixel_code" name="fb_pixel_code" class="fb-pixel-code" <?= (SPDSGVOSettings::get('own_code') === '1')? '' : 'disabled'; ?>>
130
- <?php echo $fb_pixel_code; ?>
131
- </textarea>
132
- <?php _e('If left blank, the standard FB Pixel script will be used. [pixel_number] will be replaced with FB Pixel ID.','shapepress-dsgvo'); ?>
133
- </label>
134
- </td>
135
- </tr>
136
- </table>
137
- </td>
138
- </tr>
139
-
140
- <!-- i592995 -->
141
-
142
- </table>
143
- <hr class="sp-dsgvo">
144
-
145
- <p><?php _e('<strong>Important Note:</strong> If you use WPML you can translate these inputs via WPML String Translations.','shapepress-dsgvo')?></p>
146
-
147
- <!-- i592995 -->
148
- <table class="form-table">
149
- <tr>
150
- <th scope="row"><?php _e('Notice type','shapepress-dsgvo')?></th>
151
- <td>
152
- <label for="cookie_notice_display">
153
- <select id="cookie_notice_display" name="cookie_notice_display">
154
- <option value="no_popup" <?php if(SPDSGVOSettings::get('cookie_notice_display') == 'no_popup') {echo 'selected';} ?>><?php _e('No notice','shapepress-dsgvo')?></option>
155
- <option value="cookie_notice" <?php if(SPDSGVOSettings::get('cookie_notice_display') == 'cookie_notice') {echo 'selected';} ?>><?php _e('Cookie Notice','shapepress-dsgvo')?></option>
156
- <?php if(isValidPremiumEdition()):?>
157
- <option value="policy_popup" <?php if(SPDSGVOSettings::get('cookie_notice_display') == 'policy_popup') {echo 'selected';} ?>><?php _e('Privacy Popup','shapepress-dsgvo')?></option>
158
- <?php endif?>
159
- </select><!-- #cookie_notice_display -->
160
- </label>
161
- </td>
162
- </tr>
163
- </table>
164
-
165
- <table class="form-table policy-popup-settings" id="policy_popup_settings">
166
-
167
- <tr>
168
- <th scope="row"><?php _e('Validity:','shapepress-dsgvo')?></th>
169
- <td>
170
- <?php $cnCookieValidity = SPDSGVOSettings::get('cn_cookie_validity_popup'); ?>
171
- <label for="cn_cookie_validity_popup"> <select name="cn_cookie_validity_popup"
172
- id="cn_cookie_validity_popup">
173
- <option value="86400" <?= selected($cnCookieValidity == 86400) ?>>1
174
- <?php _e('Day','shapepress-dsgvo')?></option>
175
- <option value="604800" <?= selected($cnCookieValidity == 604800) ?>>1
176
- <?php _e('Week','shapepress-dsgvo')?></option>
177
- <option value="2592000"
178
- <?= selected($cnCookieValidity == 2592000) ?>>1 <?php _e('Month','shapepress-dsgvo')?></option>
179
- <option value="7862400"
180
- <?= selected($cnCookieValidity == 7862400) ?>>2 <?php _e('Month','shapepress-dsgvo')?></option>
181
- <option value="15811200"
182
- <?= selected($cnCookieValidity == 15811200) ?>>6 <?php _e('Month','shapepress-dsgvo')?></option>
183
- <option value="31536000"
184
- <?= selected($cnCookieValidity == 31536000) ?>>1 <?php _e('Year','shapepress-dsgvo')?></option>
185
- </select>
186
- </label> <span class="info-text"><?php _e('For this period, the cookie is navigation use validly.','shapepress-dsgvo')?></span>
187
- </td>
188
- </tr>
189
-
190
- <tr>
191
- <th scope="row"><?php _e('Popup logo','shapepress-dsgvo')?></th>
192
- <td>
193
- <?php
194
- $src = '';
195
- $img_id = '';
196
- if(SPDSGVOSettings::get('logo_image_id', '') != '') {
197
- $img_id = SPDSGVOSettings::get('logo_image_id');
198
- $src = wp_get_attachment_url(intval($img_id));
199
- }
200
- ?>
201
- <?php $disableUploadButton = (isValidBlogEdition() || isValidPremiumEdition()) == false; ?>
202
- <div class="dsgvo-image-upload">
203
- <div class='image-preview-wrapper'>
204
- <img id='logo_image-preview' class="image-preview" src='<?php echo $src; ?>' style="width: 200px">
205
- </div>
206
- <input id="logo_upload_image_button" type="button"
207
- class="button"
208
- <?= $disableUploadButton ? 'disabled' : true; ?>
209
- value="<?php _e( 'Upload image', 'shapepress-dsgvo' ); ?>" />
210
- <input type='hidden' class="image-id" name='logo_image_id' id='logo_image_id' value='<?php echo $img_id; ?>'>
211
- </div><!-- .dsgvo-image-upload -->
212
- </td>
213
- </tr>
214
-
215
- <tr>
216
- <th scope="row"><?php _e('Close button action','shapepress-dsgvo')?></th>
217
- <td>
218
- <label for="close_button_action">
219
- <select id="close_button_action" name="close_button_action">
220
- <option value="0" <?php if(SPDSGVOSettings::get('close_button_action') == '0') {echo 'selected';} ?>><?php _e('Close popup','shapepress-dsgvo')?></option>
221
- <option value="1" <?php if(SPDSGVOSettings::get('close_button_action') == '1') {echo 'selected';} ?>><?php _e('Redirect to URL','shapepress-dsgvo')?></option>
222
- </select><!-- #close_button_action -->
223
- </label>
224
- </td>
225
- </tr>
226
-
227
- <tr>
228
- <th scope="row"><?php _e('Reload after confirm:','shapepress-dsgvo')?></th>
229
-
230
- <td><label for="cn_reload_on_confirm_popup"> <input
231
- name="cn_reload_on_confirm_popup" type="checkbox"
232
- id="cn_reload_on_confirm_popup" value="1"
233
- <?= (SPDSGVOSettings::get('cn_reload_on_confirm_popup') === '1')? ' checked ' : ''; ?>>
234
- </label><span class="info-text"><?php _e('Enable this option to reload the page after accepting cookies.','shapepress-dsgvo')?></span></td>
235
-
236
- </tr>
237
-
238
- <tr>
239
- <th scope="row"><?php _e('Accept button custom text','shapepress-dsgvo')?></th>
240
- <td>
241
- <label for="accept_button_text">
242
- <input type="text" value="<?php echo SPDSGVOSettings::get('accept_button_text', ''); ?>" name="accept_button_text" id="accept_button_text" />
243
- </label>
244
- </td>
245
- </tr>
246
-
247
- <tr>
248
- <th scope="row"><?php _e('More Options button custom text','shapepress-dsgvo')?></th>
249
- <td>
250
- <label for="more_options_button_text">
251
- <input type="text" value="<?php echo SPDSGVOSettings::get('more_options_button_text', ''); ?>" name="more_options_button_text" id="more_options_button_text" />
252
- </label>
253
- </td>
254
- </tr>
255
-
256
- <tr>
257
- <th scope="row"><?php _e('Close button URL','shapepress-dsgvo')?></th>
258
- <td>
259
- <label for="close_button_url">
260
- <input type="text" value="<?php echo SPDSGVOSettings::get('close_button_url', ''); ?>" name="close_button_url" id="close_button_url" />
261
- </label>
262
- </td>
263
- </tr>
264
-
265
- <tr>
266
- <th scope="row"><?php _e('Accordion title text','shapepress-dsgvo')?></th>
267
- <td>
268
- <label for="accordion_top">
269
- <input type="text" value="<?php echo SPDSGVOSettings::get('accordion_top', ''); ?>" name="accordion_top" id="accordion_top" />
270
- </label>
271
- </td>
272
- </tr>
273
-
274
- <tr>
275
- <?php
276
- $val = SPDSGVOSettings::get('popup_background');
277
- if($val == '') {
278
- $val = '#ffffff';
279
- }
280
- ?>
281
- <td style="width: 200px"><?php _e('Popup background:','shapepress-dsgvo')?></td>
282
- <td><label for="popup_background"> <input
283
- name="popup_background" type="color" id="popup_background"
284
- value="<?php echo $val; ?>">
285
- </label>
286
- </td>
287
- </tr>
288
-
289
- <tr>
290
- <?php
291
- $val = SPDSGVOSettings::get('separators_color');
292
- if($val == '') {
293
- $val = '#f1f1f1';
294
- }
295
- ?>
296
- <td style="width: 200px"><?php _e('Separators color:','shapepress-dsgvo')?></td>
297
- <td><label for="separators_color"> <input
298
- name="separators_color" type="color" id="separators_color"
299
- value="<?php echo $val; ?>">
300
- </label>
301
- </td>
302
- </tr>
303
-
304
- <tr>
305
- <?php
306
- $val = SPDSGVOSettings::get('text_color');
307
- if($val == '') {
308
- $val = '#222222';
309
- }
310
- ?>
311
- <td style="width: 200px"><?php _e('Font color:','shapepress-dsgvo')?></td>
312
- <td><label for="text_color"> <input
313
- name="text_color" type="color" id="text_color"
314
- value="<?php echo $val; ?>">
315
- </label>
316
- </td>
317
- </tr>
318
-
319
- <tr>
320
- <?php
321
- $val = SPDSGVOSettings::get('links_color');
322
- if($val == '') {
323
- $val = '#4285f4';
324
- }
325
- ?>
326
- <td style="width: 200px"><?php _e('Links color:','shapepress-dsgvo')?></td>
327
- <td><label for="links_color"> <input
328
- name="links_color" type="color" id="links_color"
329
- value="<?php echo $val; ?>">
330
- </label>
331
- </td>
332
- </tr>
333
-
334
- <tr>
335
- <?php
336
- $val = SPDSGVOSettings::get('links_color_hover');
337
- if($val == '') {
338
- $val = '#4285f4';
339
- }
340
- ?>
341
- <td style="width: 200px"><?php _e('Links color (hover):','shapepress-dsgvo')?></td>
342
- <td><label for="links_color_hover"> <input
343
- name="links_color_hover" type="color" id="links_color_hover"
344
- value="<?php echo $val; ?>">
345
- </label>
346
- </td>
347
- </tr>
348
-
349
- <tr>
350
- <?php
351
- $val = SPDSGVOSettings::get('accept_button_text_color');
352
- if($val == '') {
353
- $val = '#ffffff';
354
- }
355
- ?>
356
- <td style="width: 200px"><?php _e('Accept button font color:','shapepress-dsgvo')?></td>
357
- <td><label for="accept_button_text_color"> <input
358
- name="accept_button_text_color" type="color" id="accept_button_text_color"
359
- value="<?php echo $val; ?>">
360
- </label>
361
- </td>
362
- </tr>
363
-
364
- <tr>
365
- <?php
366
- $val = SPDSGVOSettings::get('accept_button_bg_color');
367
- if($val == '') {
368
- $val = '#4285f4';
369
- }
370
- ?>
371
- <td style="width: 200px"><?php _e('Accept button background color:','shapepress-dsgvo')?></td>
372
- <td><label for="accept_button_bg_color"> <input
373
- name="accept_button_bg_color" type="color" id="accept_button_bg_color"
374
- value="<?php echo $val; ?>">
375
- </label>
376
- </td>
377
- </tr>
378
-
379
- </table>
380
-
381
- <table class="form-table sp-cookie-notice-settings">
382
- <?php /*
383
- <tr>
384
-
385
- <th scope="row"><?php _e('Cookie Notice','shapepress-dsgvo')?></th>
386
- <td><label for="display_cookie_notice"> <input
387
- name="display_cookie_notice" type="checkbox"
388
- id="display_cookie_notice" value="1"
389
- <?= (SPDSGVOSettings::get('display_cookie_notice') === '1')? ' checked ' : ''; ?>>
390
- </label></td>
391
- </tr>
392
-
393
- */ ?>
394
-
395
- <!-- i592995 -->
396
-
397
- <tr>
398
- <th scope="row"><?php _e('Notice text:','shapepress-dsgvo')?></th>
399
- <td><textarea name="cookie_notice_custom_text"
400
- placeholder="<?php _e('Insert the text here', 'shapepress-dsgvo'); ?>" id="cookie_notice_custom_text" rows="10"
401
- style="width: 100%"><?= SPDSGVOSettings::get('cookie_notice_custom_text') ?></textarea></td>
402
- </tr>
403
- <tr>
404
- <td><?php _e('Validity:','shapepress-dsgvo')?></td>
405
- <td>
406
- <?php $cnCookieValidity = SPDSGVOSettings::get('cn_cookie_validity'); ?>
407
- <label for="cn_cookie_validity"> <select name="cn_cookie_validity"
408
- id="cn_cookie_validity">
409
- <option value="86400" <?= selected($cnCookieValidity == 86400) ?>>1
410
- <?php _e('Day','shapepress-dsgvo')?></option>
411
- <option value="604800" <?= selected($cnCookieValidity == 604800) ?>>1
412
- <?php _e('Week','shapepress-dsgvo')?></option>
413
- <option value="2592000"
414
- <?= selected($cnCookieValidity == 2592000) ?>>1 <?php _e('Month','shapepress-dsgvo')?></option>
415
- <option value="7862400"
416
- <?= selected($cnCookieValidity == 7862400) ?>>2 <?php _e('Month','shapepress-dsgvo')?></option>
417
- <option value="15811200"
418
- <?= selected($cnCookieValidity == 15811200) ?>>6 <?php _e('Month','shapepress-dsgvo')?></option>
419
- <option value="31536000"
420
- <?= selected($cnCookieValidity == 31536000) ?>>1 <?php _e('Year','shapepress-dsgvo')?></option>
421
- </select>
422
- </label> <span class="info-text"><?php _e('For this period, the cookie is navigation use validly.','shapepress-dsgvo')?></span>
423
- </td>
424
- </tr>
425
- <tr>
426
- <th scope="row"></th>
427
- <td></td>
428
- </tr>
429
-
430
- <tr>
431
- <th scope="row"><?php _e('Confirmation','shapepress-dsgvo')?></th>
432
- <td></td>
433
- </tr>
434
-
435
- <tr>
436
- <td><?php _e('Button text:','shapepress-dsgvo')?></td>
437
-
438
- <td><label for="cn_button_text_ok"> <input name="cn_button_text_ok"
439
- style="width: 300px" type="text" id="cn_button_text_ok"
440
- value="<?= SPDSGVOSettings::get('cn_button_text_ok'); ?>"
441
- placeholder="<?php _e('zB.: Ok', 'shapepress-dsgvo'); ?>">
442
- </label><span class="info-text"><?php _e('The text to be displayed is to accept the note and hide the message.','shapepress-dsgvo')?></span></td>
443
-
444
- </tr>
445
-
446
- <tr>
447
- <td><?php _e('Reload after confirm:','shapepress-dsgvo')?></td>
448
-
449
- <td><label for="cn_reload_on_confirm"> <input
450
- name="cn_reload_on_confirm" type="checkbox"
451
- id="cn_reload_on_confirm" value="1"
452
- <?= (SPDSGVOSettings::get('cn_reload_on_confirm') === '1')? ' checked ' : ''; ?>>
453
- </label><span class="info-text"><?php _e('Enable this option to reload the page after accepting cookies.','shapepress-dsgvo')?></span></td>
454
-
455
- </tr>
456
-
457
- <tr>
458
- <th scope="row"><?php _e('Decline','shapepress-dsgvo')?></th>
459
- <td></td>
460
- </tr>
461
-
462
- <tr>
463
- <td><?php _e('Button active:','shapepress-dsgvo')?></td>
464
-
465
- <td><label for="cn_activate_cancel_btn"> <input
466
- name="cn_activate_cancel_btn" type="checkbox"
467
- id="cn_activate_cancel_btn" value="1"
468
- <?= (SPDSGVOSettings::get('cn_activate_cancel_btn') === '1')? ' checked ' : ''; ?>>
469
- </label></td>
470
-
471
- </tr>
472
- <tr>
473
- <td><?php _e('Button text:','shapepress-dsgvo')?></td>
474
-
475
- <td><label for="cn_button_text_cancel"> <input
476
- name="cn_button_text_cancel" type="text" id="cn_button_text_cancel"
477
- style="width: 300px"
478
- value="<?= SPDSGVOSettings::get('cn_button_text_cancel'); ?>"
479
- placeholder="<?php _e('eg.: Decline','shapepress-dsgvo')?>">
480
- </label><span class="info-text"><?php _e('The text of the option to decline cookies.','shapepress-dsgvo')?></span></td>
481
-
482
- </tr>
483
-
484
- <tr>
485
- <td><?php _e('Link target for rejection:','shapepress-dsgvo')?></td>
486
-
487
- <td><label for="cn_decline_target_url"> <input
488
- name="cn_decline_target_url" type="text" id="cn_decline_target_url"
489
- style="width: 300px"
490
- value="<?= SPDSGVOSettings::get('cn_decline_target_url'); ?>"
491
- placeholder="<?php _e('zb.: www.google.at','shapepress-dsgvo')?>">
492
- </label><span class="info-text"><?php _e('Specifies the destination where visitors who want to reject the message should be forwarded.','shapepress-dsgvo')?></span></td>
493
-
494
- </tr>
495
- <tr>
496
- <td><?php _e('Do not set a cookie on forwarding:','shapepress-dsgvo')?></td>
497
- <td><label for="cn_decline_no_cookie"> <input
498
- name="cn_decline_no_cookie" type="checkbox"
499
- id="cn_decline_no_cookie" value="1"
500
- <?= (SPDSGVOSettings::get('cn_decline_no_cookie') === '1')? ' checked ' : ''; ?>>
501
- </label><span class="info-text"><?php _e('If active, the visitor refuses and returns to the page, the notice will reappear.','shapepress-dsgvo')?></span></td>
502
- </tr>
503
-
504
- <tr>
505
- <th scope="row"><?php _e('Read more','shapepress-dsgvo')?></th>
506
- <td></td>
507
- </tr>
508
-
509
- <tr>
510
- <td><?php _e('Button active:','shapepress-dsgvo')?></td>
511
-
512
- <td><label for="cn_activate_more_btn"> <input
513
- name="cn_activate_more_btn" type="checkbox"
514
- id="cn_activate_more_btn" value="1"
515
- <?= (SPDSGVOSettings::get('cn_activate_more_btn') === '1')? ' checked ' : ''; ?>>
516
- </label></td>
517
-
518
- </tr>
519
-
520
- <tr>
521
- <td><?php _e('Button text:','shapepress-dsgvo')?></td>
522
-
523
- <td><label for="cn_button_text_more"> <input
524
- name="cn_button_text_more" type="text" id="cn_button_text_more"
525
- style="width: 300px"
526
- value="<?= SPDSGVOSettings::get('cn_button_text_more'); ?>"
527
- placeholder="<?php _e('zB.: Erfahre mehr','shapepress-dsgvo')?>">
528
- </label><span class="info-text"><?php _e('The text of the option to obtain more information','shapepress-dsgvo')?></span></td>
529
-
530
- </tr>
531
- <tr>
532
- <td><?php _e('Link destination to read on:','shapepress-dsgvo')?></td>
533
-
534
- <td>
535
- <?php $readMorePage = SPDSGVOSettings::get('cn_read_more_page'); ?>
536
- <label for="cn_read_more_page"><select style="width: 300px"
537
- name="cn_read_more_page" id="cn_read_more_page">
538
- <option value="0">W&auml;hlen</option>
539
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
540
- <option <?= selected($readMorePage == $page->ID) ?>
541
- value="<?= $page->ID ?>">
542
- <?= $page->post_title ?>
543
- </option>
544
- <?php endforeach; ?>
545
- </select> </label><span class="info-text"><?php _e('Specifies the destination to where visitors will find more information about cookies.','shapepress-dsgvo')?></span>
546
- </td>
547
-
548
- </tr>
549
-
550
- <tr>
551
- <th scope="row" colspan="2"><?php _e('Options for displaying the cookie notice.','shapepress-dsgvo')?></th>
552
- </tr>
553
-
554
- <tr>
555
- <td><?php _e('Position:','shapepress-dsgvo')?></td>
556
- <td>
557
- <?php $cnNoticePosition = SPDSGVOSettings::get('cn_position'); ?>
558
- <label for="cn_position"> <select name="cn_position" id="cn_position">
559
- <option value="top" <?= selected($cnNoticePosition == 'top') ?>><?php _e('On top','shapepress-dsgvo')?></option>
560
- <option value="bottom"
561
- <?= selected($cnNoticePosition == 'bottom') ?>><?php _e('Bottom','shapepress-dsgvo')?></option>
562
- </select>
563
- </label> <span class="info-text"><?php _e('Specifies the location where the cookie notice should be displayed.','shapepress-dsgvo')?></span>
564
- </td>
565
- </tr>
566
- <tr>
567
- <td><?php _e('Animation','shapepress-dsgvo')?></td>
568
- <td>
569
- <?php $cnNoticeAnimation = SPDSGVOSettings::get('cn_animation'); ?>
570
- <label for="cn_animation"> <select name="cn_animation"
571
- id="cn_animation">
572
- <option value="none" <?= selected($cnNoticeAnimation == 'none') ?>><?php _e('None','shapepress-dsgvo')?></option>
573
- <option value="fade"
574
- <?= selected($cnNoticeAnimation == 'fade') ?>><?php _e('fade','shapepress-dsgvo')?></option>
575
- <option value="hide"
576
- <?= selected($cnNoticeAnimation == 'hide') ?>><?php _e('hide','shapepress-dsgvo')?></option>
577
- </select>
578
- </label> <span class="info-text"><?php _e('Animation when accepting the cookie message.','shapepress-dsgvo')?></span>
579
- </td>
580
- </tr>
581
- </tbody>
582
- </table>
583
-
584
- <?php $disableCnStylingOptionTableInput = (isValidBlogEdition() || isValidPremiumEdition()) == false; ?>
585
- <table class="form-table sp-cookie-notice-settings" id="cnStylingOptionTable">
586
- <tbody>
587
- <tr>
588
- <?php if (isValidBlogEdition() || isValidPremiumEdition()) : ?>
589
- <th scope="row" colspan="2"><?php _e('Color adjustment','shapepress-dsgvo')?></th>
590
- <?php else : ?>
591
- <th scope="row" colspan="2"><?php _e('Color adjustment','shapepress-dsgvo')?><span style="color: orange"><?php _e('Possible with blog or premium edition','shapepress-dsgvo')?></span>
592
- <small><a href="https://www.wp-dsgvo.eu/shop"><?php _e('Click here to get a license','shapepress-dsgvo')?></a></small>
593
- </th>
594
- <?php endif; ?>
595
- </tr>
596
- <tr>
597
- <td style="width: 200px"><?php _e('Background:','shapepress-dsgvo')?></td>
598
- <td><label for="cn_background_color"> <input
599
- name="cn_background_color" type="color" id="cn_background_color"
600
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
601
- value="<?= SPDSGVOSettings::get('cn_background_color'); ?>">
602
- </label>
603
- </td>
604
- </tr>
605
- <tr>
606
- <td><?php _e('Text:','shapepress-dsgvo')?></td>
607
- <td><label for="cn_text_color"> <input
608
- name="cn_text_color" type="color" id="cn_text_color"
609
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
610
- value="<?= SPDSGVOSettings::get('cn_text_color'); ?>">
611
- </label></td>
612
- </tr>
613
- <tr>
614
- <td><?php _e('Buttons','shapepress-dsgvo')?></td>
615
- <td><?php _e('Background','shapepress-dsgvo')?> <label for="cn_background_color"> <input
616
- name="cn_background_color_button" type="color" id="cn_background_color_button"
617
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
618
- value="<?= SPDSGVOSettings::get('cn_background_color_button'); ?>">
619
- </label>
620
- <?php _e('Font:','shapepress-dsgvo')?> <label for="cn_text_color_button"> <input
621
- name="cn_text_color_button" type="color" id="cn_text_color_button"
622
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
623
- value="<?= SPDSGVOSettings::get('cn_text_color_button'); ?>">
624
- </label></td>
625
- </tr>
626
- <tr>
627
- <th scope="row"><?php _e('CSS Classes','shapepress-dsgvo')?></th>
628
- <td><span class="info-text"><?php _e('The colors listed under "Color Changes“ must be overwritten with !Important.','shapepress-dsgvo')?></span></td>
629
- </tr>
630
- <tr>
631
- <td><?php _e('Cookie notice:','shapepress-dsgvo')?></td>
632
- <td><label for="cn_custom_css_container"> <input
633
- name="cn_custom_css_container" type="text" id="cn_custom_css_container"
634
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
635
- value="<?= SPDSGVOSettings::get('cn_custom_css_container'); ?>">
636
- </label></td>
637
- </tr>
638
- <tr>
639
- <td><?php _e('Text','shapepress-dsgvo')?></td>
640
- <td><label for="cn_custom_css_text"> <input
641
- name="cn_custom_css_text" type="text" id="cn_custom_css_text"
642
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
643
- value="<?= SPDSGVOSettings::get('cn_custom_css_text'); ?>">
644
- </label></td>
645
- </tr>
646
- <tr>
647
- <td><?php _e('Buttons:','shapepress-dsgvo')?></td>
648
- <td><label for="cn_custom_css_buttons"> <input
649
- name="cn_custom_css_buttons" type="text" id="cn_custom_css_buttons"
650
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
651
- value="<?= SPDSGVOSettings::get('cn_custom_css_buttons'); ?>">
652
- </label></td>
653
- </tr>
654
- <tr>
655
- <th scope="row" colspan="2"><?php _e('Further display options','shapepress-dsgvo')?></th>
656
- </tr>
657
- <tr>
658
- <td><?php _e('Font size','shapepress-dsgvo')?></td>
659
- <td><label for="cn_size_text">
660
-
661
- <?php $cnSizeText = SPDSGVOSettings::get('cn_size_text'); ?>
662
- <select name="cn_size_text"
663
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
664
- id="cn_size_text">
665
- <option value="auto" <?= selected($cnSizeText == '11px') ?>><?php _e('Default','shapepress-dsgvo')?></option>
666
- <option value="11px" <?= selected($cnSizeText == '11px') ?>>11px</option>
667
- <option value="12px" <?= selected($cnSizeText == '12px') ?>>12px</option>
668
- <option value="13px" <?= selected($cnSizeText == '13px') ?>>13px</option>
669
- <option value="14px" <?= selected($cnSizeText == '14px') ?>>14px</option>
670
- <option value="15px" <?= selected($cnSizeText == '15px') ?>>15px</option>
671
- <option value="16px" <?= selected($cnSizeText == '16px') ?>>16px</option>
672
- <option value="17px" <?= selected($cnSizeText == '17px') ?>>17px</option>
673
- <option value="18px" <?= selected($cnSizeText == '18px') ?>>18px</option>
674
- <option value="19px" <?= selected($cnSizeText == '19px') ?>>19px</option>
675
- <option value="20px" <?= selected($cnSizeText == '20px') ?>>20px</option>
676
- </select>
677
-
678
- </label></td>
679
- </tr>
680
- <tr>
681
- <td><?php _e('Height of cookie notice','shapepress-dsgvo')?></td>
682
- <td><label for="cn_height_container">
683
-
684
- <?php $cnHeightContainer = SPDSGVOSettings::get('cn_height_container'); ?>
685
- <select name="cn_height_container"
686
- <?= $disableCnStylingOptionTableInput ? 'disabled' : true; ?>
687
- id="cn_height_container">
688
- <option value="auto" <?= selected($cnHeightContainer == 'auto') ?>><?php _e('Default','shapepress-dsgvo')?></option>
689
- <option value="40px" <?= selected($cnHeightContainer == '40px') ?>>40px</option>
690
- <option value="45px" <?= selected($cnHeightContainer == '45px') ?>>45px</option>
691
- <option value="50px" <?= selected($cnHeightContainer == '50px') ?>>50px</option>
692
- <option value="55px" <?= selected($cnHeightContainer == '55px') ?>>55px</option>
693
- <option value="60px" <?= selected($cnHeightContainer == '60px') ?>>60px</option>
694
- <option value="65px" <?= selected($cnHeightContainer == '65px') ?>>65px</option>
695
- <option value="70px" <?= selected($cnHeightContainer == '70px') ?>>70px</option>
696
- <option value="75px" <?= selected($cnHeightContainer == '75px') ?>>75px</option>
697
- <option value="80px" <?= selected($cnHeightContainer == '80px') ?>>80px</option>
698
- </select>
699
-
700
- </label></td>
701
- </tr>
702
- <tr>
703
- <td><?php _e('Show icon:','shapepress-dsgvo')?></td>
704
- <td><label for="cn_show_dsgvo_icon"> <input
705
- name="cn_show_dsgvo_icon" type="checkbox"
706
- id="cn_show_dsgvo_icon" value="1"
707
- <?= (SPDSGVOSettings::get('cn_show_dsgvo_icon') === '1')? ' checked ' : ''; ?>>
708
- </label></td>
709
- </tr>
710
- <tr>
711
- <td><?php _e('Use overlay','shapepress-dsgvo')?></td>
712
- <td><label for="cn_use_overlay"> <input
713
- name="cn_use_overlay" type="checkbox"
714
- <?= $disableCnStylingOptionTableInput ? 'disabled' : ''; ?>
715
- id="cn_use_overlay" value="1"
716
- <?= (SPDSGVOSettings::get('cn_use_overlay') === '1')? ' checked ' : ''; ?>>
717
- </label><span class="info-text"><?php _e('Displays a gray background and prevents the visitor from interacting with the site before making a choice.','shapepress-dsgvo')?></span></td>
718
- </tr>
719
- </tbody>
720
- </table>
721
-
722
- <hr class="sp-dsgvo">
723
-
724
-
725
-
726
-
727
- <br>
728
- <?php submit_button(); ?>
729
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-action.php CHANGED
@@ -1,23 +1,23 @@
1
- <?php
2
-
3
- Class SPDSGVOGravityFormsAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-gravity-forms';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- SPDSGVOSettings::set('gf_save_no_data', $this->get('gf_save_no_data'), '0');
12
-
13
- SPDSGVOSettings::set('gf_no_ip_meta', $this->get('gf_no_ip_meta'), '0');
14
-
15
- SPDSGVOSettings::set('gf_save_no_', $this->get('gf_save_no_'), []);
16
-
17
- $this->returnBack();
18
- }
19
- }
20
-
21
- SPDSGVOGravityFormsAction::listen();
22
-
23
-
1
+ <?php
2
+
3
+ Class SPDSGVOGravityFormsAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-gravity-forms';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+ SPDSGVOSettings::set('gf_save_no_data', $this->get('gf_save_no_data'), '0');
12
+
13
+ SPDSGVOSettings::set('gf_no_ip_meta', $this->get('gf_no_ip_meta'), '0');
14
+
15
+ SPDSGVOSettings::set('gf_save_no_', $this->get('gf_save_no_'), []);
16
+
17
+ $this->returnBack();
18
+ }
19
+ }
20
+
21
+ SPDSGVOGravityFormsAction::listen();
22
+
23
+
admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-tab.php CHANGED
@@ -1,34 +1,34 @@
1
- <?php
2
-
3
- class SPDSGVOGravityFormsTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Gravity Forms';
6
- public $slug = 'gravity-forms';
7
-
8
- public function __construct(){
9
-
10
- $this->title = __('Gravity Forms','shapepress-dsgvo');
11
- }
12
-
13
- public function page(){
14
- include plugin_dir_path(__FILE__) .'page.php';
15
- }
16
-
17
-
18
- /**
19
- * Returns an array of Gravity Forms data.
20
- */
21
- public static function get_gf_forms() {
22
-
23
- $output = array();
24
- $forms = GFAPI::get_forms();
25
-
26
- foreach ( $forms as $form ) {
27
- $output[ $form['id'] ] = $form;
28
- }
29
-
30
- return $output;
31
-
32
- }
33
-
34
- }
1
+ <?php
2
+
3
+ class SPDSGVOGravityFormsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Gravity Forms';
6
+ public $slug = 'gravity-forms';
7
+
8
+ public function __construct(){
9
+
10
+ $this->title = __('Gravity Forms','shapepress-dsgvo');
11
+ }
12
+
13
+ public function page(){
14
+ include plugin_dir_path(__FILE__) .'page.php';
15
+ }
16
+
17
+
18
+ /**
19
+ * Returns an array of Gravity Forms data.
20
+ */
21
+ public static function get_gf_forms() {
22
+
23
+ $output = array();
24
+ $forms = GFAPI::get_forms();
25
+
26
+ foreach ( $forms as $form ) {
27
+ $output[ $form['id'] ] = $form;
28
+ }
29
+
30
+ return $output;
31
+
32
+ }
33
+
34
+ }
admin/tabs/gravity-forms/page.php CHANGED
@@ -1,60 +1,60 @@
1
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
2
- <input type="hidden" name="action" value="admin-gravity-forms">
3
- <?php wp_nonce_field( SPDSGVOGravityFormsAction::getActionName(). '-nonce' ); ?>
4
-
5
- <h1><?php _e('Gravity Forms','shapepress-dsgvo')?></h1>
6
-
7
- <p><?php _e('With these settings the saving behavior of Gravity Forms can be configured.','shapepress-dsgvo')?></p>
8
-
9
- <hr>
10
-
11
- <table class="form-table">
12
- <tbody>
13
- <tr>
14
- <th scope="row"><?php _e('Do not save form data in the database','shapepress-dsgvo')?></th>
15
- <td><label for="gf_save_no_data"> <input name="gf_save_no_data"
16
- type="checkbox" id="gf_save_no_data" value="1"
17
- <?= (SPDSGVOSettings::get('gf_save_no_data') === '1')? ' checked ' : ''; ?>>
18
- </label> <span class="info-text"><?php _e('If activated, no data will be stored, but only sent by e-mail. (Note: This option overrides form-specific settings).).','shapepress-dsgvo')?></span></td>
19
- </tr>
20
- <tr>
21
- <th scope="row"><?php _e('Do not save IP address and user agent in database','shapepress-dsgvo')?></th>
22
- <td><label for="gf_no_ip_meta"> <input name="gf_no_ip_meta"
23
- type="checkbox" id="gf_no_ip_meta" value="1"
24
- <?= (SPDSGVOSettings::get('gf_no_ip_meta') === '1')? ' checked ' : ''; ?>>
25
- </label> <span class="info-text"><?php _e('By default, if this checkbox is checked, this will be prevented from saving the IP address and user agent of the sender.','shapepress-dsgvo')?></span></td>
26
- </tr>
27
-
28
- </tbody>
29
- </table>
30
-
31
- <?php $gf_save_no_ = SPDSGVOSettings::get('gf_save_no_');?>
32
-
33
- <div>
34
-
35
- <h2><?php _e('Specific form settings','shapepress-dsgvo')?></h2>
36
- <h4><?php _e('For each Gravity Forms form, it can be subsequently defined for each field whether the data of the input field is stored in the database or not.','shapepress-dsgvo')?></h4>
37
- <table class="form-table ">
38
- <tbody>
39
- <?php foreach( SPDSGVOGravityFormsTab::get_gf_forms() as $form ) :?>
40
- <tr>
41
- <th scope="row">Form: <?= $form['title'];?></th>
42
- <td>
43
- <?php foreach( $form['fields'] as $field ): ?>
44
-
45
- <input type="checkbox" id="" value="1"
46
- name="gf_save_no_[<?= $form['id'];?>][<?= $field->id;?>]"
47
- <?= (isset( $gf_save_no_[$form['id']][$field->id] ) && $gf_save_no_[$form['id']][$field->id] === '1')? ' checked ' : ''; ?>> <?= $field->label; ?> <small><em>(<?php _e('Nicht in der Datenbank speichern.','shapepress-dsgvo'); ?>)</em></small>
48
-
49
- <?php endforeach; ?>
50
- </td>
51
- </tr>
52
- <?php endforeach; ?>
53
-
54
- </tbody>
55
- </table>
56
- </div>
57
- <hr>
58
-
59
- <?php submit_button(); ?>
60
- </form>
1
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
2
+ <input type="hidden" name="action" value="admin-gravity-forms">
3
+ <?php wp_nonce_field( SPDSGVOGravityFormsAction::getActionName(). '-nonce' ); ?>
4
+
5
+ <h1><?php _e('Gravity Forms','shapepress-dsgvo')?></h1>
6
+
7
+ <p><?php _e('With these settings the saving behavior of Gravity Forms can be configured.','shapepress-dsgvo')?></p>
8
+
9
+ <hr>
10
+
11
+ <table class="form-table">
12
+ <tbody>
13
+ <tr>
14
+ <th scope="row"><?php _e('Do not save form data in the database','shapepress-dsgvo')?></th>
15
+ <td><label for="gf_save_no_data"> <input name="gf_save_no_data"
16
+ type="checkbox" id="gf_save_no_data" value="1"
17
+ <?= (SPDSGVOSettings::get('gf_save_no_data') === '1')? ' checked ' : ''; ?>>
18
+ </label> <span class="info-text"><?php _e('If activated, no data will be stored, but only sent by e-mail. (Note: This option overrides form-specific settings).).','shapepress-dsgvo')?></span></td>
19
+ </tr>
20
+ <tr>
21
+ <th scope="row"><?php _e('Do not save IP address and user agent in database','shapepress-dsgvo')?></th>
22
+ <td><label for="gf_no_ip_meta"> <input name="gf_no_ip_meta"
23
+ type="checkbox" id="gf_no_ip_meta" value="1"
24
+ <?= (SPDSGVOSettings::get('gf_no_ip_meta') === '1')? ' checked ' : ''; ?>>
25
+ </label> <span class="info-text"><?php _e('By default, if this checkbox is checked, this will be prevented from saving the IP address and user agent of the sender.','shapepress-dsgvo')?></span></td>
26
+ </tr>
27
+
28
+ </tbody>
29
+ </table>
30
+
31
+ <?php $gf_save_no_ = SPDSGVOSettings::get('gf_save_no_');?>
32
+
33
+ <div>
34
+
35
+ <h2><?php _e('Specific form settings','shapepress-dsgvo')?></h2>
36
+ <h4><?php _e('For each Gravity Forms form, it can be subsequently defined for each field whether the data of the input field is stored in the database or not.','shapepress-dsgvo')?></h4>
37
+ <table class="form-table ">
38
+ <tbody>
39
+ <?php foreach( SPDSGVOGravityFormsTab::get_gf_forms() as $form ) :?>
40
+ <tr>
41
+ <th scope="row">Form: <?= $form['title'];?></th>
42
+ <td>
43
+ <?php foreach( $form['fields'] as $field ): ?>
44
+
45
+ <input type="checkbox" id="" value="1"
46
+ name="gf_save_no_[<?= $form['id'];?>][<?= $field->id;?>]"
47
+ <?= (isset( $gf_save_no_[$form['id']][$field->id] ) && $gf_save_no_[$form['id']][$field->id] === '1')? ' checked ' : ''; ?>> <?= $field->label; ?> <small><em>(<?php _e('Nicht in der Datenbank speichern.','shapepress-dsgvo'); ?>)</em></small>
48
+
49
+ <?php endforeach; ?>
50
+ </td>
51
+ </tr>
52
+ <?php endforeach; ?>
53
+
54
+ </tbody>
55
+ </table>
56
+ </div>
57
+ <hr>
58
+
59
+ <?php submit_button(); ?>
60
+ </form>
admin/tabs/imprint/class-sp-dsgvo-imprint-action.php DELETED
@@ -1,27 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOImprintAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'imprint';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- if($this->has('imprint_page')){
12
- SPDSGVOSettings::set('imprint_page', $this->get('imprint_page', '0'));
13
- }
14
-
15
- // Update privacy policy
16
- if($this->has('imprint')){
17
- SPDSGVOSettings::set('imprint_hash', wp_hash($this->get('imprint')));
18
- SPDSGVOSettings::set('imprint', $this->get('imprint'));
19
- SPDSGVOLog::insert("Imprint updated by {$this->user->user_email}");
20
- }
21
-
22
-
23
- $this->returnBack();
24
- }
25
- }
26
-
27
- SPDSGVOImprintAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/imprint/class-sp-dsgvo-imprint-tab.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOImprintTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Impressum';
6
- public $slug = 'imprint';
7
- public $isHidden = TRUE;
8
-
9
- public function __construct(){
10
-
11
- $this->title = __('Imprint','shapepress-dsgvo');
12
- }
13
-
14
- public function page(){
15
- include plugin_dir_path(__FILE__) .'page.php';
16
- }
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/imprint/page.php DELETED
@@ -1,69 +0,0 @@
1
- <h1><?php _e('Imprint', 'shapepress-dsgvo'); ?></h1>
2
- <p><?php _e('With the shortcode <code>[imprint]</code> an inprint automatically gets generated. The data will be taken from general settings.', 'shapepress-dsgvo'); ?></p>
3
-
4
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
5
- <input type="hidden" name="action" value="imprint">
6
- <?php wp_nonce_field( SPDSGVOImprintAction::getActionName(). '-nonce' ); ?>
7
-
8
- <table class="form-table btn-settings-show">
9
- <tbody>
10
- <tr>
11
- <th scope="row"><?php _e('Imprint Page','shapepress-dsgvo')?></th>
12
- <td>
13
-
14
- <?php $imprintPage = SPDSGVOSettings::get('imprint_page'); ?>
15
- <label for="imprint_page"><?php _e('Page', 'shapepress-dsgvo'); ?>:
16
- <select name="imprint_page" id="imprint_page">
17
- <option value="0"><?php _e('Select','shapepress-dsgvo')?></option>
18
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
19
- <option <?= selected($imprintPage == $page->ID) ?> value="<?= $page->ID ?>">
20
- <?= $page->post_title ?>
21
- </option>
22
- <?php endforeach; ?>
23
- </select>
24
- </label>
25
-
26
- <?php if($imprintPage == '0'): ?>
27
- <p><?php _e('Create a page that uses the shortcode <code>[imprint]</code>.','shapepress-dsgvo')?><a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('imprint_page' => '1')) ?>"><?php _e('Create page','shapepress-dsgvo')?></a></p>
28
- <?php elseif(!pageContainsString($imprintPage, 'imprint')): ?>
29
- <p><?php _e('Attention: The shortcode <code>[imprint]</code> was not found on the page you selected.','shapepress-dsgvo')?> <a href="<?= get_edit_post_link($imprintPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a></p>
30
- <?php else: ?>
31
- <a href="<?= get_edit_post_link($imprintPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
32
- <?php endif; ?>
33
- </td>
34
- </tr>
35
-
36
-
37
- </tbody>
38
- </table>
39
- <hr class="sp-dsgvo">
40
- <br>
41
- <?php if (spWpmlUsed() == true): ?>
42
- <p><?php _e('<strong>Important Note:</strong> Because you use WPML the English Version of the imprint was set by default. You can translate it via WMPL String Translation. Search for text-domain "shapepress-dsgvo" and name "imprint".','shapepress-dsgvo')?>&nbsp;
43
-
44
- </p>
45
- <?php else: ?>
46
- <p><?php _e('<strong>Important Note:</strong> If you use WPML you can translate these inputs via WPML String Translations.','shapepress-dsgvo')?></p>
47
- <?php endif; ?>
48
- <p>
49
- <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('reset_imprint_page' => '1','imprint_page_language' => 'en_EN')) ?>"><?php _e('Reload English template','shapepress-dsgvo')?></a>
50
- <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('reset_imprint_page' => '1','imprint_page_language' => 'de_DE')) ?>"><?php _e('Reload German template','shapepress-dsgvo')?></a>
51
- </p>
52
- <!--
53
- <span class="info-text" style="margin-bottom: 20px;"><?php _e('Note: In order to be able to reset or reload the text (eg: after changing the language), highlight the text, delete it and click save. Thus, the text is reloaded.','shapepress-dsgvo')?></span>
54
- -->
55
- <div style="clear: both"></div>
56
- <br>
57
- <?php
58
- $imprintContent = SPDSGVOSettings::get('imprint');
59
- if ($imprintContent == NULL || strlen($imprintContent) < 10)
60
- {
61
- $imprintContent = file_get_contents(SPDSGVO::pluginDir('/templates/'.spDsgvoGetLocale().'/imprint.txt'));
62
-
63
-
64
- }
65
- wp_editor($imprintContent, 'imprint', array('textarea_rows'=> '20'));
66
-
67
- ?>
68
- <?php submit_button(); ?>
69
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/integrations/class-sp-dsgvo-integrations-action.php CHANGED
@@ -1,22 +1,22 @@
1
- <?php
2
-
3
- Class SPDSGVOIntegrationsAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'SPDSGVO-integrations-submit';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- $time = time();
12
- SPDSGVOSettings::set('integration_enable_key', $time);
13
-
14
- foreach($this->get('integrations') as $integrationSlug => $value){
15
- SPDSGVOSettings::set('is_enabled_'. $integrationSlug, $time);
16
- }
17
-
18
- $this->returnBack();
19
- }
20
- }
21
-
22
- SPDSGVOIntegrationsAction::listen();
1
+ <?php
2
+
3
+ Class SPDSGVOIntegrationsAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'SPDSGVO-integrations-submit';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+ $time = time();
12
+ SPDSGVOSettings::set('integration_enable_key', $time);
13
+
14
+ foreach($this->get('integrations') as $integrationSlug => $value){
15
+ SPDSGVOSettings::set('is_enabled_'. $integrationSlug, $time);
16
+ }
17
+
18
+ $this->returnBack();
19
+ }
20
+ }
21
+
22
+ SPDSGVOIntegrationsAction::listen();
admin/tabs/integrations/class-sp-dsgvo-integrations-tab.php CHANGED
@@ -1,16 +1,16 @@
1
- <?php
2
-
3
- class SPDSGVOIntegrationsTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Integrations';
6
- public $slug = 'integrations';
7
- public $isHidden = true;
8
-
9
- public function __construct(){
10
- $this->title = __('Integrations','shapepress-dsgvo');
11
- }
12
-
13
- public function page(){
14
- include plugin_dir_path(__FILE__) .'page.php';
15
- }
16
- }
1
+ <?php
2
+
3
+ class SPDSGVOIntegrationsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Integrations';
6
+ public $slug = 'integrations';
7
+ public $isHidden = true;
8
+
9
+ public function __construct(){
10
+ $this->title = __('Integrations','shapepress-dsgvo');
11
+ }
12
+
13
+ public function page(){
14
+ include plugin_dir_path(__FILE__) .'page.php';
15
+ }
16
+ }
admin/tabs/integrations/page.php CHANGED
@@ -1,45 +1,45 @@
1
- <h1><?php _e('Integrations', 'shapepress-dsgvo'); ?></h1>
2
- <hr>
3
-
4
- <form method="post" action="<?= SPDSGVOIntegrationsAction::formURL() ?>">
5
- <input type="hidden" name="action" value="<?= SPDSGVOIntegrationsAction::getActionName() ?>">
6
- <?php wp_nonce_field( SPDSGVOIntegrationsAction::getActionName(). '-nonce' ); ?>
7
-
8
- <table class="form-table">
9
- <tbody>
10
-
11
- <?php $integrations = SPDSGVOIntegration::getAllIntegrations(FALSE); ?>
12
- <?php if(count($integrations) === 0): ?>
13
-
14
- <tr>
15
- <th scope="row"><?php _e('No integrations installed','shapepress-dsgvo')?></th>
16
- <td></td>
17
- </tr>
18
-
19
- <?php else: ?>
20
-
21
- <?php foreach($integrations as $key => $integration): ?>
22
-
23
- <tr>
24
- <th scope="row"><?= $integration->title ?></th>
25
- <td>
26
- <fieldset>
27
- <legend class="screen-reader-text">
28
- <span><?= $integration->title ?></span>
29
- </legend>
30
-
31
- <label for="<?= $integration->slug ?>">
32
- <input name="integrations[<?= $integration->slug ?>]" type="checkbox" id="<?= $integration->slug ?>" value="1" <?= (SPDSGVOIntegration::isEnabled($integration->slug))? ' checked ' : ''; ?>>
33
- </label>
34
- </fieldset>
35
- </td>
36
- </tr>
37
-
38
- <?php endforeach; ?>
39
- <?php endif; ?>
40
-
41
- </tbody>
42
- </table>
43
-
44
- <?php submit_button(); ?>
45
- </form>
1
+ <h1><?php _e('Integrations', 'shapepress-dsgvo'); ?></h1>
2
+ <hr>
3
+
4
+ <form method="post" action="<?= SPDSGVOIntegrationsAction::formURL() ?>">
5
+ <input type="hidden" name="action" value="<?= SPDSGVOIntegrationsAction::getActionName() ?>">
6
+ <?php wp_nonce_field( SPDSGVOIntegrationsAction::getActionName(). '-nonce' ); ?>
7
+
8
+ <table class="form-table">
9
+ <tbody>
10
+
11
+ <?php $integrations = SPDSGVOIntegration::getAllIntegrations(FALSE); ?>
12
+ <?php if(count($integrations) === 0): ?>
13
+
14
+ <tr>
15
+ <th scope="row"><?php _e('No integrations installed','shapepress-dsgvo')?></th>
16
+ <td></td>
17
+ </tr>
18
+
19
+ <?php else: ?>
20
+
21
+ <?php foreach($integrations as $key => $integration): ?>
22
+
23
+ <tr>
24
+ <th scope="row"><?= $integration->title ?></th>
25
+ <td>
26
+ <fieldset>
27
+ <legend class="screen-reader-text">
28
+ <span><?= $integration->title ?></span>
29
+ </legend>
30
+
31
+ <label for="<?= $integration->slug ?>">
32
+ <input name="integrations[<?= $integration->slug ?>]" type="checkbox" id="<?= $integration->slug ?>" value="1" <?= (SPDSGVOIntegration::isEnabled($integration->slug))? ' checked ' : ''; ?>>
33
+ </label>
34
+ </fieldset>
35
+ </td>
36
+ </tr>
37
+
38
+ <?php endforeach; ?>
39
+ <?php endif; ?>
40
+
41
+ </tbody>
42
+ </table>
43
+
44
+ <?php submit_button(); ?>
45
+ </form>
admin/tabs/premium/class-sp-dsgvo-premium-action.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOPremiumAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'premium';
6
-
7
- protected function run(){
8
- $this->requireAdmin();
9
-
10
-
11
- $this->returnBack();
12
- }
13
- }
14
-
15
- SPDSGVOPremiumAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/premium/class-sp-dsgvo-premium-tab.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOPremiumTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Premium';
6
- public $slug = 'premium';
7
- public $isHidden = FALSE;
8
- public $isHighlighted = TRUE;
9
-
10
- public function __construct(){}
11
-
12
- public function page(){
13
- include plugin_dir_path(__FILE__) .'page.php';
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/premium/page.php DELETED
@@ -1 +0,0 @@
1
- <h1>Premium Optionen</h1>
 
admin/tabs/privacy-policy/class-sp-dsgvo-privacy-policy-tab.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOPrivacyPolicyTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Privacy Policy';
6
- public $slug = 'privacy-policy';
7
- public $isHidden = TRUE;
8
-
9
- public function __construct(){
10
-
11
- $this->title = __('Privacy Policy','shapepress-dsgvo');
12
- }
13
-
14
- public function page(){
15
- include plugin_dir_path(__FILE__) .'page.php';
16
- }
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/privacy-policy/page.php DELETED
@@ -1,97 +0,0 @@
1
- <h1><?php _e('Privacy policy','shapepress-dsgvo')?></h1>
2
- <p>
3
- <?php _e('The shortcode <code>[privacy_policy]</code> generates a privacy page from the input made under General Settings.','shapepress-dsgvo')?>
4
- </p>
5
- <p><?php _e('Initially, this text is filled with a template. The text blocks in the square brackets ([]) are filled with the values ​​that you entered in the General Settings. You can customize the entire text to your requirements, as well as delete passages if they do not apply to them.','shapepress-dsgvo')?>
6
- </p>
7
-
8
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
9
- <?php wp_nonce_field( SPDSGVOPrivacyPolicyAction::getActionName(). '-nonce' ); ?>
10
- <table class="form-table btn-settings-show">
11
- <tbody>
12
- <tr>
13
- <th scope="row"><?php _e('Privacy policy page','shapepress-dsgvo')?></th>
14
- <td>
15
- <?php $privacyPolicyPage = SPDSGVOSettings::get('privacy_policy_page'); ?>
16
- <label for="privacy_policy_page"><?php _e('Page', 'shapepress-dsgvo'); ?>:
17
- <select name="privacy_policy_page" id="privacy_policy_page">
18
- <option value="0"><?php _e('Select', 'shapepress-dsgvo'); ?></option>
19
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
20
- <option <?= selected($privacyPolicyPage == $page->ID) ?> value="<?= $page->ID ?>">
21
- <?= $page->post_title ?>
22
- </option>
23
- <?php endforeach; ?>
24
- </select>
25
- </label>
26
-
27
- <?php if($privacyPolicyPage == '0'): ?>
28
- <p><?php _e('Create a page that uses the shortcode <code>[privacy_policy]</code>.','shapepress-dsgvo')?> <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('privacy_policy_page' => '1')) ?>"><?php _e('Create page','shapepress-dsgvo')?></a></p>
29
- <?php elseif(!pageContainsString($privacyPolicyPage, 'privacy_policy')): ?>
30
- <p><?php _e('Attention: The shortcode <code>[privacy_policy]</code> was not found on the page you selected.','shapepress-dsgvo')?> <a href="<?= get_edit_post_link($privacyPolicyPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a></p>
31
- <?php else: ?>
32
- <a href="<?= get_edit_post_link($privacyPolicyPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
33
- <?php endif; ?>
34
- </td>
35
- </tr>
36
- <?php if (isValidPremiumEdition()) : ?>
37
- <tr>
38
- <th scope="row"><?php _e('Show checkbox at WooCommerce checkout to confirm privacy policy','shapepress-dsgvo')?></th>
39
- <td><label for="woo_show_privacy_checkbox"> <input
40
- name="woo_show_privacy_checkbox" type="checkbox"
41
- id="woo_show_privacy_checkbox" value="1"
42
- <?= (SPDSGVOSettings::get('woo_show_privacy_checkbox') === '1')? ' checked ' : ''; ?>>
43
- </label></td>
44
- </tr>
45
-
46
- <!-- i592995 -->
47
- <tr>
48
- <?php
49
- $privacy_text = SPDSGVOSettings::get('woo_privacy_text', '');
50
- if($privacy_text == '') {
51
- $privacy_text = __('I have read and accepted the Privacy Policy.','shapepress-dsgvo');
52
- }
53
- ?>
54
- <th scope="row"><?php _e('WooCommerce privacy policy text','shapepress-dsgvo')?></th>
55
- <td><label for="woo_privacy_text">
56
- <input type="text" name="woo_privacy_text" id="woo_privacy_text" class="woo-privacy-text" value="<?php echo $privacy_text; ?>" />
57
- </label></td>
58
- </tr>
59
- <!-- i592995 -->
60
- <?php endif; ?>
61
- </tbody>
62
- </table>
63
- <hr class="sp-dsgvo">
64
- <br>
65
- <?php if (spWpmlUsed() == true): ?>
66
- <p><?php _e('<strong>Important Note:</strong> Because you use WPML the English Version of the privacy policy was set by default. You can translate it via WMPL String Translation. Search for text-domain "shapepress-dsgvo" and name "privacy_policy".','shapepress-dsgvo')?>&nbsp;
67
- </p>
68
- <?php else: ?>
69
- <p><?php _e('<strong>Important Note:</strong> If you use WPML you can translate these inputs via WPML String Translations.','shapepress-dsgvo')?></p>
70
- <?php endif; ?>
71
- <p>
72
- <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('reset_privacy_policy_page' => '1','privacy_policy_language' => 'en_EN')) ?>"><?php _e('Reload English template','shapepress-dsgvo')?></a>
73
- <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('reset_privacy_policy_page' => '1','privacy_policy_language' => 'de_DE')) ?>"><?php _e('Reload German template','shapepress-dsgvo')?></a>
74
- </p>
75
- <!--
76
- <span class="info-text" style="margin-bottom: 20px;"><?php _e('Note: In order to be able to reset or reload the text (eg: after changing the language), highlight the text, delete it and click save. Thus, the text is reloaded.','shapepress-dsgvo')?></span>
77
- -->
78
- <div style="clear: both"></div>
79
- <br>
80
-
81
- <input type="hidden" name="action" value="privacy-policy">
82
-
83
- <br>
84
- <?php
85
- $pageContent = SPDSGVOSettings::get('privacy_policy');
86
- if ($pageContent == NULL || strlen($pageContent) < 10)
87
- {
88
- $pageContent = file_get_contents(SPDSGVO::pluginDir('/templates/'.spDsgvoGetLocale().'/privacy-policy.txt'));
89
-
90
- //$pageContent = mb_convert_encoding($pageContent, 'HTML-ENTITIES', "UTF-8");
91
- }
92
-
93
- wp_editor($pageContent, 'privacy_policy', array('textarea_rows'=> '20'));
94
- ?>
95
- <?php submit_button(); ?>
96
-
97
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/services/class-sp-dsgvo-add-service-action.php DELETED
@@ -1,41 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOAddServiceAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-add-service';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- if(!empty($this->get('new_name')) && !empty($this->get('new_reason'))){
12
-
13
- // Make Slug
14
- $slug = $slug_ = SPDSGVO::slugify($this->get('new_name'));
15
- $tries = 0;
16
- while(in_array($slug, array_keys($meta))){
17
- $tries++;
18
- $slug = ($slug_ .'-'. $tries);
19
- }
20
-
21
- /* i592995 */
22
- // Append new service to services
23
- $meta = SPDSGVOSettings::get('services');
24
- if(!is_array($meta)){ $meta = array(); }
25
- $meta[$slug] = array(
26
- 'slug' => $slug,
27
- 'name' => $this->get('new_name'),
28
- 'reason' => $this->get('new_reason'),
29
- 'link' => $this->get('new_link'),
30
- 'default' => $this->get('new_default'),
31
- 'image' => $this->get('new_image')
32
- );
33
- /* i592995 */
34
- SPDSGVOSettings::set('services', $meta);
35
- }
36
-
37
- $this->returnBack();
38
- }
39
- }
40
-
41
- SPDSGVOAddServiceAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/services/class-sp-dsgvo-delete-service-action.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVODeleteServiceAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'delete-service';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
-
12
- $services = SPDSGVOSettings::get('services');
13
-
14
- if(is_array($services)){
15
- $meta = array();
16
- foreach($services as $slug => $service){
17
- if($slug !== $this->get('slug')){
18
- $meta[$slug] = $service;
19
- }
20
- }
21
-
22
- SPDSGVOSettings::set('services', $meta);
23
- SPDSGVOLog::insert(__('Third-party service deleted by', 'shapepress-dsgvo') . " {$this->user->user_email}");
24
- }
25
-
26
- $this->returnBack();
27
- }
28
- }
29
-
30
- SPDSGVODeleteServiceAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/services/class-sp-dsgvo-services-action.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOServicesAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-services';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
-
12
- // User permissons page
13
- if($this->has('user_permissions_page')){
14
- SPDSGVOSettings::set('user_permissions_page', $this->get('user_permissions_page'));
15
- }
16
-
17
- // Update Services
18
- if($this->has('services')){
19
- $services = $this->get('services', NULL, FALSE);
20
- $meta = array();
21
- if(is_array($services)){
22
- /* i592995 */
23
- foreach($services as $key => $service){
24
- $meta[$service['slug']] = array(
25
- 'slug' => stripslashes($service['slug']),
26
- 'name' => stripslashes($service['name']),
27
- 'reason' => stripslashes($service['reason']),
28
- 'link' => stripslashes($service['link']),
29
- 'image' => stripslashes($service['image']),
30
- 'default' => stripslashes($service['default']),
31
- );
32
- }
33
- /* i592995 */
34
- }
35
-
36
- SPDSGVOSettings::set('services', $meta);
37
- }
38
-
39
-
40
- $this->returnBack();
41
- }
42
- }
43
-
44
- SPDSGVOServicesAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/services/class-sp-dsgvo-services-tab.php DELETED
@@ -1,16 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOServicesTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Privacy policy & Plugins';
6
- public $slug = 'services';
7
-
8
- public function __construct(){
9
-
10
- $this->title = __('Privacy policy & Plugins','shapepress-dsgvo');
11
- }
12
-
13
- public function page(){
14
- include plugin_dir_path(__FILE__) .'page.php';
15
- }
16
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/services/page.php DELETED
@@ -1,200 +0,0 @@
1
- <h1><?php _e('Privacy: Settings and 3rd party plugins','shapepress-dsgvo')?></h1>
2
- <p><?php _e('All 3rd Party Plugins (Google Analytics, Facebook Pixel, ..) can be listed here to give their users a selective opt-in / opt-out.','shapepress-dsgvo')?></p>
3
- <p><?php _e('With the shortcode <code>[display_services]</code> these services can then be displayed to the user.','shapepress-dsgvo')?></p>
4
-
5
-
6
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
7
- <input type="hidden" name="action" value="admin-services">
8
- <?php wp_nonce_field( SPDSGVOServicesAction::getActionName(). '-nonce' ); ?>
9
-
10
- <table class="form-table btn-settings-show" >
11
- <tbody>
12
- <tr>
13
- <th scope="row"><?php _e('Datenschutz Seite für ihre Benutzer','shapepress-dsgvo')?></th>
14
- <td>
15
-
16
- <ul>
17
- <li>
18
- <label for="user_permissions_page"><?php _e('Page','shapepress-dsgvo')?>
19
- <select name="user_permissions_page" id="user_permissions_page">
20
- <option value="0"><?php _e('Select','shapepress-dsgvo')?></option>
21
-
22
- <?php $userPermissionsPage = SPDSGVOSettings::get('user_permissions_page'); ?>
23
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
24
- <option <?= selected($userPermissionsPage == $page->ID) ?> value="<?= $page->ID ?>">
25
- <?= $page->post_title ?>
26
- </option>
27
- <?php endforeach; ?>
28
- </select>
29
- </label>
30
- <span class="info-text"><?php _e('Specifies the page where users have the option to customize their privacy settings (selective opt-in / opt-out).','shapepress-dsgvo')?></span>
31
- </li>
32
- </ul>
33
-
34
- <?php if($userPermissionsPage == '0'): ?>
35
- <p>
36
- <?php _e('Create a page that uses the shortcode <code>[user_privacy_settings_form]</code>.','shapepress-dsgvo')?>
37
- <a class="button button-default"
38
- href="<?= SPDSGVOCreatePageAction::url(array('user_privacy_settings_page' => '1')) ?>"><?php _e('Create page','shapepress-dsgvo')?></a>
39
- </p>
40
-
41
- <?php elseif($userPermissionsPage != '0' && strpos(get_post($userPermissionsPage)->post_content, 'user_privacy_settings_form') === FALSE): ?>
42
- <p><?php _e('Attention: The shortcode <code>[user_privacy_settings_form]</code> was not found on the selected page. The form will not be displayed.','shapepress-dsgvo')?> <a href="<?= get_edit_post_link($userPermissionsPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a></p>
43
- <?php else: ?>
44
- <a href="<?= get_edit_post_link($userPermissionsPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a> <br/>
45
- <?php _e('The shortcode <code>[user_privacy_settings_form]</code> allows the user to activate or deactivate services on the selected page.','shapepress-dsgvo')?>
46
-
47
- <?php endif; ?>
48
- </td>
49
- </tr>
50
- </tbody>
51
- </table>
52
- <hr class="sp-dsgvo">
53
-
54
-
55
-
56
- <table class="widefat fixed" cellspacing="0">
57
- <thead>
58
- <tr>
59
- <th id="slug" class="manage-column column-slug" scope="col" style="width:12%"><?php _e('Slug','shapepress-dsgvo')?></th>
60
- <th id="name" class="manage-column column-name" scope="col"><?php _e('Name','shapepress-dsgvo')?></th>
61
- <th id="reason" class="manage-column column-reason" scope="col"><?php _e('Reason','shapepress-dsgvo')?></th>
62
- <th id="reason" class="manage-column column-link" scope="col"><?php _e('Terms Url','shapepress-dsgvo')?></th>
63
- <th id="default" class="manage-column column-default" scope="col" style="width:10%"><?php _e('Default','shapepress-dsgvo')?></th>
64
- <th id="image" class="manage-column column-image" scope="col" style="width:10%"><?php _e('Image','shapepress-dsgvo')?></th>
65
- <th id="delete" class="manage-column column-delete" scope="col" style="width:10%"><?php _e('Delete','shapepress-dsgvo')?></th>
66
- </tr>
67
- </thead>
68
-
69
- <tbody>
70
- <?php $i = 0; // AB: This is justified ?>
71
- <?php foreach(SPDSGVOSettings::get('services') as $slug => $service): ?>
72
-
73
- <tr class="<?= ($i % 2 == 0)? 'alternate' : '' ?>">
74
- <td class="column-slug">
75
- <span><?= $slug ?></span>
76
- <input type="hidden" name="services[<?= $slug ?>][slug]" value="<?= $slug ?>">
77
- </td>
78
- <td class="column-name">
79
- <input type="text" class="aio-transparent" name="services[<?= $slug ?>][name]" value="<?= $service['name'] ?>">
80
- </td>
81
- <td class="column-reason">
82
- <textarea class="aio-transparent" name="services[<?= $slug ?>][reason]" id="" cols="30" rows="5"><?= $service['reason'] ?></textarea>
83
- </td>
84
-
85
- <td class="column-link">
86
- <input type="text" class="aio-transparent" placeholder="<?php _e('Terms & Conditions link', 'shapepress-dsgvo'); ?>" name="services[<?= $slug ?>][link]" value="<?= $service['link'] ?>">
87
- </td>
88
- <td class="column-default">
89
- <select name="services[<?= $slug ?>][default]">
90
- <option <?= ($service['default'] == '1')? ' selected ' : '' ?> value="1"><?php _e('Enabled','shapepress-dsgvo')?></option>
91
- <option <?= ($service['default'] == '0')? ' selected ' : '' ?> value="0"><?php _e('Disabled','shapepress-dsgvo')?></option>
92
- </select>
93
- </td>
94
- <!-- i592995 -->
95
- <td class="column-image">
96
- <?php
97
- $src = '';
98
- $img_id = '';
99
- if(isset($service['image'])) {
100
- $img_id = $service['image'];
101
- $src = wp_get_attachment_url(intval($img_id));
102
- }
103
- ?>
104
-
105
- <div class="dsgvo-image-upload">
106
- <div class='image-preview-wrapper'>
107
- <img id='<?= $slug ?>_image-preview' class="image-preview" src='<?php echo $src; ?>' style="width: 100%">
108
- </div>
109
- <input id="<?= $slug ?>_upload_image_button" type="button" class="button" value="<?php _e( 'Upload image', 'shapepress-dsgvo' ); ?>" />
110
- <input type='hidden' class="image-id" name='services[<?= $slug ?>][image]' id='<?= $slug ?>_image_id' value='<?php echo $img_id; ?>'>
111
- </div><!-- .dsgvo-image-upload -->
112
- </td>
113
- <!-- i592995 -->
114
- <td class="column-reason">
115
- <?php
116
- $action_url = wp_nonce_url( SPDSGVODeleteServiceAction::url(['slug' => $slug]), SPDSGVODeleteServiceAction::getActionName(). '-nonce' );
117
-
118
- ?>
119
- <a href="<?= esc_url( $action_url ) ?>"><?php _e('Delete','shapepress-dsgvo')?></a>
120
- </td>
121
- </tr>
122
-
123
- <?php $i++; ?>
124
- <?php endforeach; ?>
125
- </tbody>
126
-
127
- <tfoot>
128
- <tr>
129
- <th class="manage-column column-slug" scope="col"><?php _e('Slug','shapepress-dsgvo')?></th>
130
- <th class="manage-column column-name" scope="col"><?php _e('Name','shapepress-dsgvo')?></th>
131
- <th class="manage-column column-reason" scope="col"><?php _e('Reason','shapepress-dsgvo')?></th>
132
- <th class="manage-column column-link" scope="col"><?php _e('Terms Url','shapepress-dsgvo')?></th>
133
- <th class="manage-column column-default" scope="col"><?php _e('Default','shapepress-dsgvo')?></th>
134
- <th class="manage-column column-delete" scope="col"><?php _e('Delete','shapepress-dsgvo')?></th>
135
- </tr>
136
- </tfoot>
137
- </table>
138
-
139
- <?php submit_button(); ?>
140
- </form>
141
-
142
-
143
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
144
- <input type="hidden" name="action" value="admin-add-service">
145
- <?php wp_nonce_field( SPDSGVOAddServiceAction::getActionName(). '-nonce' ); ?>
146
- <br><br>
147
-
148
- <h3><?php _e('Add service','shapepress-dsgvo')?></h3>
149
- <table class="form-table">
150
- <tbody>
151
- <tr>
152
- <th scope="row"><label for="new_name"><?php _e('Name','shapepress-dsgvo')?></label></th>
153
- <td>
154
- <input name="new_name" type="text" id="new_name" value="" class="regular-text ltr">
155
- <p class="description" ><?php _e('Service name','shapepress-dsgvo')?></p>
156
- </td>
157
- </tr>
158
- <tr>
159
- <th scope="row"><label for="new_reason"><?php _e('Reason','shapepress-dsgvo')?></label></th>
160
- <td>
161
- <input name="new_reason" type="text" id="new_reason" value="" class="regular-text ltr">
162
- <p class="description"><?php _e('Reason for use','shapepress-dsgvo')?></p>
163
- </td>
164
- </tr>
165
- <tr>
166
- <th scope="row"><label for="new_link"><?php _e('Terms Url','shapepress-dsgvo')?></label></th>
167
- <td>
168
- <input name="new_link" type="text" id="new_link" value="" class="regular-text ltr">
169
- <p class="description"><?php _e('The URL pointing to the terms of the service','shapepress-dsgvo')?></p>
170
- </td>
171
- </tr>
172
- <tr>
173
- <th scope="row"><label for="new_default"><?php _e('Default','shapepress-dsgvo')?></label></th>
174
- <td>
175
- <select name="new_default">
176
- <option value="1"><?php _e('Enabled','shapepress-dsgvo')?></option>
177
- <option value="0"><?php _e('Disabled','shapepress-dsgvo')?></option>
178
- </select>
179
- <p class="description"><?php _e('Indicates whether the service should be enabled by default or not.','shapepress-dsgvo')?></p>
180
- </td>
181
- </tr>
182
- <!-- i592995 -->
183
- <tr>
184
- <th scope="row"><label for="new_image"><?php _e('Image','shapepress-dsgvo')?></label></th>
185
- <td>
186
- <div class="dsgvo-image-upload">
187
- <div class='image-preview-wrapper'>
188
- <img id='image-preview-new' class="image-preview" src='' style="width: 200px">
189
- </div>
190
- <input id="upload_image_button_new" type="button" class="button" value="<?php _e( 'Upload image', 'shapepress-dsgvo' ); ?>" />
191
- <input type='hidden' class="image-id" name='new_image' id='new_image' value=''>
192
- </div><!-- .dsgvo-image-upload -->
193
- </td>
194
- </tr>
195
- <!-- i592995 -->
196
- </tbody>
197
- </table>
198
-
199
- <?php submit_button(__('Add service','shapepress-dsgvo')); ?>
200
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/setup/class-sp-dsgvo-create-page-action.php CHANGED
@@ -1,128 +1,101 @@
1
- <?php
2
-
3
- Class SPDSGVOCreatePageAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-create-page';
6
-
7
- protected function run(){
8
- $this->requireAdmin();
9
-
10
- // Init Settings
11
- if(class_exists('SPDSGVOLog')){
12
- if(SPDSGVOLog::tableExists() === FALSE){
13
- if(class_exists('SPDSGVOSettings')){
14
- SPDSGVOSettings::init();
15
- }
16
-
17
- SPDSGVOLog::migrate();
18
- SPDSGVOLog::insert(__('Plugin installed', 'shapepress-dsgvo'));
19
- }
20
- }
21
-
22
-
23
- // License Key
24
- if($this->has('license_key')){
25
- SPDSGVOSettings::set('show_setup', '0');
26
- SPDSGVOSettings::set('license_key', $this->get('license_key'));
27
- }
28
-
29
-
30
- // Create Pages (set-up page)
31
- if($this->has('display_cookie_notice')){
32
- SPDSGVOSettings::set('display_cookie_notice', '1');
33
- }
34
-
35
- if($this->has('sar')){
36
- $ID = $this->createPage(__('Subject Access Request','shapepress-dsgvo'), '[sar_form]');
37
- SPDSGVOSettings::set('sar_page', $ID);
38
- }
39
-
40
- if($this->has('user_privacy_settings_page')){
41
- $ID = $this->createPage(__('User privacy settings','shapepress-dsgvo'), '[user_privacy_settings_form]');
42
- SPDSGVOSettings::set('user_permissions_page', $ID);
43
- }
44
-
45
- if($this->has('terms_conditions_page')){
46
- $ID = $this->createPage(__('Terms & Conditions', 'shapepress-dsgvo'), '[terms_conditions]');
47
- SPDSGVOSettings::set('terms_conditions_page', $ID);
48
- }
49
-
50
- if($this->has('privacy_policy_page')){
51
- $ID = $this->createPage(__('Privacy Policy','shapepress-dsgvo'), '[privacy_policy]');
52
- SPDSGVOSettings::set('privacy_policy_page', $ID);
53
- }
54
-
55
- if($this->has('super_unsubscribe_page')){
56
- $ID = $this->createPage(__('Delete Request','shapepress-dsgvo'), '[unsubscribe_form]');
57
- SPDSGVOSettings::set('super_unsubscribe_page', $ID);
58
- }
59
-
60
-
61
- if($this->has('imprint_page')){
62
- $ID = $this->createPage(__('Imprint','shapepress-dsgvo'), '[imprint]');
63
- SPDSGVOSettings::set('imprint_page', $ID);
64
- }
65
-
66
- if($this->has('reset_imprint_page') && $this->has('imprint_page_language')){
67
- $this->resetImprintToLanguage($this->get('imprint_page_language'));
68
- }
69
-
70
- if($this->has('reset_privacy_policy_page') && $this->has('privacy_policy_language')){
71
- $this->resetPrivacyPolicyToLanguage($this->get('privacy_policy_language'));
72
- }
73
-
74
-
75
- // Other Pages
76
- if($this->has('explicit_permission_page')){
77
- $ID = $this->createPage(__('Terms & Conditions', 'shapepress-dsgvo'), '[explicit_permission]');
78
- SPDSGVOSettings::set('explicit_permission_page', $ID);
79
- }
80
-
81
-
82
-
83
- if($this->has('opt_out_page')){
84
- $ID = $this->createPage(__('Opt-out', 'shapepress-dsgvo'), '[decline_permission]');
85
- SPDSGVOSettings::set('opt_out_page', $ID);
86
- }
87
-
88
-
89
- // Show Set Up
90
- if($this->has('show_setup')){
91
- SPDSGVOSettings::set('show_setup', '1');
92
- }
93
-
94
-
95
- $this->returnBack();
96
- }
97
-
98
-
99
- public function createPage($title, $content){
100
- return wp_insert_post(array(
101
- 'post_title' => $title,
102
- 'post_content' => $content,
103
- 'post_type' => 'page',
104
- 'post_status' => 'publish'
105
- ));
106
- }
107
-
108
- public function resetImprintToLanguage($language)
109
- {
110
- $imprint = file_get_contents(SPDSGVO::pluginDir('/templates/'.$language.'/imprint.txt'));
111
- SPDSGVOSettings::set('imprint_hash', wp_hash($imprint));
112
- SPDSGVOSettings::set('imprint', $imprint);
113
- }
114
-
115
- public function resetPrivacyPolicyToLanguage($language)
116
- {
117
- $privacyPolicy = file_get_contents(SPDSGVO::pluginDir('/templates/'.$language.'/privacy-policy.txt'));
118
- SPDSGVOSettings::set('privacy_policy_hash', wp_hash($privacyPolicy));
119
- SPDSGVOSettings::set('privacy_policy', $privacyPolicy);
120
- SPDSGVOSettings::set('google_gdpr_refresh_notice', '1');
121
- $version = SPDSGVOSettings::get('privacy_policy_version');
122
- $version = intval($version);
123
- $version++;
124
- $version = SPDSGVOSettings::set('privacy_policy_version', $version);
125
- }
126
- }
127
-
128
- SPDSGVOCreatePageAction::listen();
1
+ <?php
2
+
3
+ Class SPDSGVOCreatePageAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-create-page';
6
+
7
+ protected function run(){
8
+ $this->requireAdmin();
9
+
10
+ // Init Settings
11
+ if(class_exists('SPDSGVOLog')){
12
+ if(SPDSGVOLog::tableExists() === FALSE){
13
+ if(class_exists('SPDSGVOSettings')){
14
+ SPDSGVOSettings::init();
15
+ }
16
+
17
+ SPDSGVOLog::migrate();
18
+ SPDSGVOLog::insert(__('Plugin installed', 'shapepress-dsgvo'));
19
+ }
20
+ }
21
+
22
+
23
+ // License Key
24
+ if($this->has('license_key')){
25
+ SPDSGVOSettings::set('show_setup', '0');
26
+ SPDSGVOSettings::set('license_key', $this->get('license_key'));
27
+ }
28
+
29
+
30
+ // Create Pages (set-up page)
31
+ if($this->has('display_cookie_notice')){
32
+ SPDSGVOSettings::set('display_cookie_notice', '1');
33
+ }
34
+
35
+ if($this->has('sar')){
36
+ $ID = $this->createPage(__('Subject Access Request','shapepress-dsgvo'), '[sar_form]');
37
+ SPDSGVOSettings::set('sar_page', $ID);
38
+ }
39
+
40
+ if($this->has('user_privacy_settings_page')){
41
+ $ID = $this->createPage(__('User privacy settings','shapepress-dsgvo'), '[user_privacy_settings_form]');
42
+ SPDSGVOSettings::set('user_permissions_page', $ID);
43
+ }
44
+
45
+ if($this->has('terms_conditions_page')){
46
+ $ID = $this->createPage(__('Terms & Conditions', 'shapepress-dsgvo'), '[terms_conditions]');
47
+ SPDSGVOSettings::set('terms_conditions_page', $ID);
48
+ }
49
+
50
+ if($this->has('privacy_policy_page')){
51
+ $ID = $this->createPage(__('Privacy Policy','shapepress-dsgvo'), '[privacy_policy]');
52
+ SPDSGVOSettings::set('privacy_policy_page', $ID);
53
+ }
54
+
55
+ if($this->has('super_unsubscribe_page')){
56
+ $ID = $this->createPage(__('Delete Request','shapepress-dsgvo'), '[unsubscribe_form]');
57
+ SPDSGVOSettings::set('super_unsubscribe_page', $ID);
58
+ }
59
+
60
+
61
+ if($this->has('imprint_page')){
62
+ $ID = $this->createPage(__('Imprint','shapepress-dsgvo'), '[imprint]');
63
+ SPDSGVOSettings::set('imprint_page', $ID);
64
+ }
65
+
66
+ // Other Pages
67
+ if($this->has('explicit_permission_page')){
68
+ $ID = $this->createPage(__('Terms & Conditions', 'shapepress-dsgvo'), '[explicit_permission]');
69
+ SPDSGVOSettings::set('explicit_permission_page', $ID);
70
+ }
71
+
72
+
73
+
74
+ if($this->has('opt_out_page')){
75
+ $ID = $this->createPage(__('Opt-out', 'shapepress-dsgvo'), '[decline_permission]');
76
+ SPDSGVOSettings::set('opt_out_page', $ID);
77
+ }
78
+
79
+
80
+ // Show Set Up
81
+ if($this->has('show_setup')){
82
+ SPDSGVOSettings::set('show_setup', '1');
83
+ }
84
+
85
+
86
+ $this->returnBack();
87
+ }
88
+
89
+
90
+ public function createPage($title, $content){
91
+ return wp_insert_post(array(
92
+ 'post_title' => $title,
93
+ 'post_content' => $content,
94
+ 'post_type' => 'page',
95
+ 'post_status' => 'publish'
96
+ ));
97
+ }
98
+
99
+ }
100
+
101
+ SPDSGVOCreatePageAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/setup/class-sp-dsgvo-setup-tab.php CHANGED
@@ -1,15 +1,15 @@
1
- <?php
2
-
3
- class SPDSGVOSetupTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Setup';
6
- public $slug = 'setup';
7
-
8
- public function __construct(){
9
- $this->title = __('Setup','shapepress-dsgvo');
10
- }
11
-
12
- public function page(){
13
- include plugin_dir_path(__FILE__) .'page.php';
14
- }
15
- }
1
+ <?php
2
+
3
+ class SPDSGVOSetupTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Setup';
6
+ public $slug = 'setup';
7
+
8
+ public function __construct(){
9
+ $this->title = __('Setup','shapepress-dsgvo');
10
+ }
11
+
12
+ public function page(){
13
+ include plugin_dir_path(__FILE__) .'page.php';
14
+ }
15
+ }
admin/tabs/setup/page.php CHANGED
@@ -1,8 +1,8 @@
1
- <h1><?php _e('Setup', 'shapepress-dsgvo'); ?></h1><hr>
2
-
3
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
4
- <input type="hidden" name="action" value="<?= SPDSGVOCreatePageAction::getActionName(); ?>">
5
-
6
-
7
-
8
- </form>
1
+ <h1><?php _e('Setup', 'shapepress-dsgvo'); ?></h1><hr>
2
+
3
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
4
+ <input type="hidden" name="action" value="<?= SPDSGVOCreatePageAction::getActionName(); ?>">
5
+
6
+
7
+
8
+ </form>
admin/tabs/subject-access-request/class-sp-dsgvo-subject-access-request-action.php DELETED
@@ -1,43 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOAdminSubjectAccessRequestAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-subject-access-request';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- if ($this->has('process') == false && $this->get('all') != '1')
12
- {
13
-
14
- SPDSGVOSettings::set('sar_cron', $this->get('sar_cron', '0'));
15
- if (isValidPremiumEdition())
16
- {
17
- SPDSGVOSettings::set('sar_email_notification', $this->get('sar_email_notification', '0'));
18
- }
19
-
20
- SPDSGVOSettings::set('sar_dsgvo_accepted_text', $this->get('sar_dsgvo_accepted_text', ''));
21
-
22
- if($this->has('sar_page')){
23
- SPDSGVOSettings::set('sar_page', $this->get('sar_page'));
24
- }
25
- }
26
-
27
- if($this->has('process')){
28
- $ID = $this->get('process');
29
- SPDSGVOSubjectAccessRequest::doByID($ID);
30
- }
31
-
32
- if($this->get('all') == '1'){
33
- foreach(SPDSGVOSubjectAccessRequest::finder('pending') as $sar){
34
- $sar->doSubjectAccessRequest();
35
- }
36
- }
37
-
38
-
39
- $this->returnBack();
40
- }
41
- }
42
-
43
- SPDSGVOAdminSubjectAccessRequestAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/subject-access-request/page.php DELETED
@@ -1,230 +0,0 @@
1
- <h1><?php _e('Subject Access Requests','shapepress-dsgvo')?></h1>
2
- <p><?php _e('This feature allows users to request a digest of all data stored by you. <br> All data in your database is checked for confidential data and sent to the User by email.','shapepress-dsgvo')?>
3
- </p>
4
-
5
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
6
- <input type="hidden" name="action"
7
- value="<?= SPDSGVOAdminSubjectAccessRequestAction::getActionName(); ?>">
8
- <?php wp_nonce_field( SPDSGVOAdminSubjectAccessRequestAction::getActionName(). '-nonce' ); ?>
9
-
10
- <?php $disablePremiumFeatures = isValidPremiumEdition() == false; ?>
11
-
12
- <table class="form-table">
13
- <tbody>
14
- <tr>
15
- <th scope="row"><?php _e('Automatic processing','shapepress-dsgvo')?></th>
16
- <td>
17
- <?php $sarCron = SPDSGVOSettings::get('sar_cron'); ?>
18
- <label for="sar_cron"> <select name="sar_cron"
19
- id="sar_cron">
20
- <option value="0" <?= selected($sarCron === '0') ?>><?php _e('none','shapepress-dsgvo')?></option>
21
- <option value="1" <?= selected($sarCron === '1') ?>>1 <?php _e('day','shapepress-dsgvo')?></option>
22
- <option value="2" <?= selected($sarCron === '2') ?>>2 <?php _e('days','shapepress-dsgvo')?></option>
23
- <option value="3" <?= selected($sarCron === '3') ?>>3 <?php _e('days','shapepress-dsgvo')?></option>
24
- <option value="7" <?= selected($sarCron === '4') ?>>1 <?php _e('weeks','shapepress-dsgvo')?></option>
25
- </select>
26
- </label>
27
- <span class="info-text"><?php _e('Requests will be automatically processed after the set time and sent to the user.','shapepress-dsgvo')?></span></td>
28
- </tr>
29
-
30
- <tr>
31
- <th scope="row"><?php _e('Email for new application:','shapepress-dsgvo')?></th>
32
- <td>
33
- <input
34
- name="sar_email_notification" type="checkbox"
35
- id="sar_email_notification" value="1"
36
- <?= $disablePremiumFeatures ? 'disabled' : true; ?>
37
- <?= (SPDSGVOSettings::get('sar_email_notification') === '1')? ' checked ' : ''; ?>>
38
- <span class="info-text"><?php _e('Send a notification for a new application to the admin email address.','shapepress-dsgvo')?></span>
39
- </td>
40
- </tr>
41
- <tr>
42
- <td><?php _e('GDPR consent text:','shapepress-dsgvo')?></td>
43
- <td>
44
- <input
45
- name="sar_dsgvo_accepted_text" type="text" style="width: 550px;"
46
- id="sar_dsgvo_accepted_text" value="<?= SPDSGVOSettings::get('sar_dsgvo_accepted_text'); ?>">
47
- <span class="info-text"><?php _e('The text to be displayed in the GDPR checkbox for data storage.','shapepress-dsgvo')?></span>
48
- </td>
49
- </tr>
50
-
51
- <tr>
52
- <th scope="row"><?php _e('Request page:','shapepress-dsgvo')?></th>
53
- <td>
54
-
55
- <?php $sarPage = SPDSGVOSettings::get('sar_page'); ?>
56
- <label for="sar_page"><select name="sar_page" id="sar_page">
57
- <option value="0"><?php _e('Select','shapepress-dsgvo')?></option>
58
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
59
- <option <?= selected($sarPage == $page->ID) ?>
60
- value="<?= $page->ID ?>">
61
- <?= $page->post_title ?>
62
- </option>
63
- <?php endforeach; ?>
64
- </select>
65
- </label>
66
- <span class="info-text"><?php _e('Specifies the page on which users have the option to request their data extract.','shapepress-dsgvo')?></span>
67
-
68
- <?php if($sarPage == '0'): ?>
69
- <p>
70
- <?php _e('Create a page using the shortcode <code>[sar_form]</code>.','shapepress-dsgvo')?>
71
- <a class="button button-default"
72
- href="<?= SPDSGVOCreatePageAction::url(array('sar' => '1')) ?>"><?php _e('Create page','shapepress-dsgvo')?></a>
73
- </p>
74
- <?php elseif(!pageContainsString($sarPage, 'sar_form')): ?>
75
- <p>
76
- <?php _e('Attention: The shortcode <code>[sar_form]</code> of the selected page was not found. Thus, the user has no opportunity to request the data.','shapepress-dsgvo')?> <a
77
- href="<?= get_edit_post_link($sarPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
78
- </p>
79
- <?php else: ?>
80
- <a href="<?= get_edit_post_link($sarPage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
81
- <?php endif; ?>
82
- </td>
83
- </tr>
84
-
85
- <tr>
86
- <th><?php submit_button(); ?></th>
87
- <td></td>
88
- </tr>
89
- </tbody>
90
- </table>
91
-
92
- <hr class="sp-dsgvo">
93
- </form>
94
-
95
-
96
- <?php $pending = SPDSGVOSubjectAccessRequest::finder('pending'); ?>
97
- <table class="widefat fixed" cellspacing="0">
98
- <thead>
99
- <tr>
100
- <th id="request_id" class="manage-column column-request_id"
101
- scope="col" style="width: 10%"><?php _e('ID','shapepress-dsgvo')?></th>
102
- <th id="email" class="manage-column column-email" scope="col"
103
- style="width: 20%"><?php _e('Email','shapepress-dsgvo')?></th>
104
- <th id="first_name" class="manage-column column-first_name"
105
- scope="col" style="width: 15%"><?php _e('First name','shapepress-dsgvo')?></th>
106
- <th id="last_name" class="manage-column column-last_name" scope="col"
107
- style="width: 15%"><?php _e('Last name','shapepress-dsgvo')?></th>
108
- <th id="dsgvo_accepted" class="manage-column column-dsgvo_accepted" scope="col"
109
- style="width: 15%"><?php _e('GDPR approval','shapepress-dsgvo')?></th>
110
- <th id="process" class="manage-column column-process" scope="col"
111
- style="width: 15%"><?php _e('Run','shapepress-dsgvo')?></th>
112
- <!-- i592995 -->
113
- <th id="dismiss" class="manage-column column-dismiss" scope="col"
114
- style="width: 15%"><?php _e('Dismiss','shapepress-dsgvo')?></th>
115
- <!-- i592995 -->
116
- </tr>
117
- </thead>
118
-
119
- <tbody>
120
- <?php if(count($pending) !== 0): ?>
121
- <?php foreach($pending as $key => $pendingRequest): ?>
122
-
123
- <tr class="<?= ($key % 2 == 0)? 'alternate' : '' ?>">
124
- <td class="column-request-id">
125
- <?= $pendingRequest->ID ?>
126
- </td>
127
- <td class="column-email"><strong><?= $pendingRequest->email ?></strong>
128
- </td>
129
- <td class="column-integrations">
130
- <?= $pendingRequest->first_name ?>
131
- </td>
132
- <td class="column-auto-deleting-on">
133
- <?= $pendingRequest->last_name ?>
134
- </td>
135
- <td class="column-auto-deleting-on">
136
- <?= $pendingRequest->dsgvo_accepted === '1' ? 'Yes' : 'No' ?>
137
- </td>
138
- <td class="column-unsubscribe-user"><a class="button-primary"
139
- href="<?= wp_nonce_url(SPDSGVOAdminSubjectAccessRequestAction::url(array('process' => $pendingRequest->ID)),
140
- SPDSGVOAdminSubjectAccessRequestAction::getActionName() .'-nonce') ?>"><?php _e('Run', 'shapepress-dsgvo'); ?></a></td>
141
- <!-- i592995 -->
142
- <td class="column-dismiss">
143
- <svg class="unsubscribe-dismiss" width="10" height="10" data-id="<?php echo $pendingRequest->ID; ?>">
144
- <line x1="0" y1="0" x2="10" y2="10" />
145
- <line x1="0" y1="10" x2="10" y2="0" />
146
- </svg>
147
- </td>
148
- <!-- i592995 -->
149
- </tr>
150
-
151
- <?php endforeach; ?>
152
- <?php else: ?>
153
- <tr>
154
- <td class="column-slug" colspan="2"><?php _e('No open requests','shapepress-dsgvo')?></td>
155
- <td class="column-default"></td>
156
- <td class="column-reason"></td>
157
- </tr>
158
- <?php endif; ?>
159
- </tbody>
160
-
161
- <tfoot>
162
- <tr>
163
- <th class="manage-column column-request_id" scope="col"><?php _e('ID','shapepress-dsgvo')?></th>
164
- <th class="manage-column column-email" scope="col"><?php _e('Email','shapepress-dsgvo')?></th>
165
- <th class="manage-column column-first_name" scope="col"><?php _e('First name','shapepress-dsgvo')?></th>
166
- <th class="manage-column column-last_name" scope="col"><?php _e('Last name','shapepress-dsgvo')?></th>
167
- <th class="manage-column column-dsgvo_accepted" scope="col"><?php _e('GDPR approval','shapepress-dsgvo')?></th>
168
- <th class="manage-column column-process" scope="col"><?php _e('Run','shapepress-dsgvo')?></th>
169
- <!-- i592995 -->
170
- <th class="manage-column column-dismiss" scope="col"><?php _e('Dismiss','shapepress-dsgvo')?></th>
171
- <!-- i592995 -->
172
- </tr>
173
- </tfoot>
174
- </table>
175
-
176
- <?php if(count($pending) !== 0): ?>
177
- <p>
178
- <a class="button-primary"
179
- href="<?= wp_nonce_url(SPDSGVOAdminSubjectAccessRequestAction::url(array('all' => '1')),
180
- SPDSGVOAdminSubjectAccessRequestAction::getActionName() .'-nonce')?>"><?php _e('Run all','shapepress-dsgvo')?></a>
181
- </p>
182
- <?php endif; ?>
183
-
184
-
185
-
186
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
187
- <input type="hidden" name="action"
188
- value="<?= SPDSGVOSubjectAccessRequestAction::getActionName(); ?>"> <input
189
- type="hidden" name="is_admin" value="1"> <br>
190
- <?php wp_nonce_field( SPDSGVOSubjectAccessRequestAction::getActionName(). '-nonce' ); ?>
191
- <br>
192
-
193
- <h3><?php _e('Add entry','shapepress-dsgvo')?></h3>
194
- <table class="form-table">
195
- <tbody>
196
- <tr>
197
- <th scope="row"><label for="email"><?php _e('Email','shapepress-dsgvo')?> <span style="color: #F00">*</span></label></th>
198
- <td><input name="email" type="email" id="email" value=""
199
- class="regular-text ltr" required></td>
200
- </tr>
201
- <tr>
202
- <th scope="row"><label for="first_name"><?php _e('First name','shapepress-dsgvo')?></label></th>
203
- <td><input name="first_name" type="text" id="first_name" value=""
204
- class="regular-text ltr"></td>
205
- </tr>
206
- <tr>
207
- <th scope="row"><label for="last_name"><?php _e('Last name','shapepress-dsgvo')?></label></th>
208
- <td><input name="last_name" type="text" id="last_name" value=""
209
- class="regular-text ltr"></td>
210
- </tr>
211
- <tr>
212
- <th scope="row"><label for="dsgvo_checkbox"><?php _e('GDPR approval','shapepress-dsgvo')?></label></th>
213
- <td><input name="dsgvo_checkbox" type="checkbox" id="dsgvo_checkbox"
214
- value="1"></td>
215
- </tr>
216
- <tr>
217
- <th scope="row"><label for="process_now"><?php _e('Run now','shapepress-dsgvo')?></label></th>
218
- <td><input name="process_now" type="checkbox" id="process_now"
219
- value="1"></td>
220
- </tr>
221
- <tr style="display: none;">
222
- <th scope="row"><label for="display_email"><?php _e('Show email','shapepress-dsgvo')?></label></th>
223
- <td><input name="display_email" type="checkbox" id="display_email"
224
- value="1"></td>
225
- </tr>
226
- </tbody>
227
- </table>
228
-
229
- <?php submit_button(__('Add','shapepress-dsgvo')); ?>
230
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php DELETED
@@ -1,56 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOSuperUnsubscribeAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-super-unsubscribe';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
- if ($this->has('process') == false && $this->get('all') != '1')
12
- {
13
-
14
- // unsubscribe_auto_delete
15
- SPDSGVOSettings::set('unsubscribe_auto_delete', $this->get('unsubscribe_auto_delete', '0'));
16
- if (isValidPremiumEdition())
17
- {
18
- SPDSGVOSettings::set('su_email_notification', $this->get('su_email_notification', '0'));
19
- SPDSGVOSettings::set('su_woo_data_action', $this->get('su_woo_data_action', 'ignore'));
20
- SPDSGVOSettings::set('su_bbpress_data_action', $this->get('su_bbpress_data_action', 'ignore'));
21
- SPDSGVOSettings::set('su_buddypress_data_action', $this->get('su_buddypress_data_action', 'ignore'));
22
- SPDSGVOSettings::set('su_cf7_data_action', $this->get('su_cf7_data_action', 'ignore'));
23
- }
24
- SPDSGVOSettings::set('su_dsgvo_accepted_text', $this->get('su_dsgvo_accepted_text', ''));
25
-
26
- // unsubscribe auto delete tme
27
- SPDSGVOSettings::set('su_auto_del_time', $this->get('su_auto_del_time', '0'));
28
-
29
- // Set super_unsubscribe_page
30
- if($this->has('super_unsubscribe_page')){
31
- SPDSGVOSettings::set('super_unsubscribe_page', $this->get('super_unsubscribe_page'));
32
- }
33
- }
34
-
35
- // Unsubscribe single user
36
- if($this->has('process')){
37
- $unsubscriber = SPDSGVOUnsubscriber::find($this->get('process'));
38
- if(isset($unsubscriber)){
39
- $unsubscriber->doSuperUnsubscribe();
40
- }
41
- }
42
-
43
-
44
- // Unsubscribe all
45
- if($this->get('all') == '1'){
46
- foreach(SPDSGVOUnsubscriber::all() as $unsubscriber){
47
- $unsubscriber->doSuperUnsubscribe();
48
- }
49
- }
50
-
51
-
52
- $this->returnBack();
53
- }
54
- }
55
-
56
- SPDSGVOSuperUnsubscribeAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/super-unsubscribe/page.php DELETED
@@ -1,345 +0,0 @@
1
- <h1><?php _e('Delete Requests','shapepress-dsgvo')?></h1>
2
- <p><?php _e('Here you will find all deletion requests that users have made on their site. With a click on "delete now " you delete all stored data of the user on their side including Plugins.','shapepress-dsgvo')?>
3
- </p>
4
-
5
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
6
- <input type="hidden" name="action"
7
- value="<?= SPDSGVOSuperUnsubscribeAction::getActionName(); ?>">
8
- <input
9
- type="hidden" name="CSRF" value="<?= sp_dsgvo_CSRF_TOKEN() ?>">
10
- <?php wp_nonce_field( SPDSGVOSuperUnsubscribeAction::getActionName(). '-nonce' ); ?>
11
- <?php $disablePremiumFeatures = isValidPremiumEdition() == false; ?>
12
-
13
- <table class="form-table">
14
- <tbody>
15
- <tr>
16
- <th scope="row"><?php _e('Automatic processing','shapepress-dsgvo')?></th>
17
- <td></td>
18
- </tr>
19
- <tr>
20
- <td><?php _e('Immediately on request','shapepress-dsgvo')?></td>
21
- <td><label for="unsubscribe_auto_delete"> <input
22
- name="unsubscribe_auto_delete" type="checkbox"
23
- id="unsubscribe_auto_delete" value="1"
24
- <?= (SPDSGVOSettings::get('unsubscribe_auto_delete') === '1')? ' checked ' : ''; ?>>
25
- </label>
26
- <span class="info-text"><?php _e('If enabled, delete requests are performed immediately.','shapepress-dsgvo')?></span></td>
27
- </tr>
28
- <tr>
29
- <td><?php _e('Email for new application:','shapepress-dsgvo')?></td>
30
- <td>
31
- <input
32
- name="su_email_notification" type="checkbox"
33
- id="su_email_notification" value="1"
34
- <?= $disablePremiumFeatures ? 'disabled' : true; ?>
35
- <?= (SPDSGVOSettings::get('su_email_notification') === '1')? ' checked ' : ''; ?>>
36
- <span class="info-text"><?php _e('Send a notification for a new application to the admin email address.','shapepress-dsgvo')?></span>
37
- </td>
38
- </tr>
39
- <tr>
40
- <td><?php _e('GDPR confirmation text:','shapepress-dsgvo')?></td>
41
- <td>
42
- <input
43
- name="su_dsgvo_accepted_text" type="text" style="width: 550px;"
44
- id="su_dsgvo_accepted_text" value="<?= SPDSGVOSettings::get('su_dsgvo_accepted_text'); ?>">
45
- <span class="info-text"><?php _e('The text to be displayed in the GDPR checkbox for data deletion.','shapepress-dsgvo')?></span>
46
- </td>
47
- </tr>
48
- <tr>
49
- <td><?php _e('After period','shapepress-dsgvo')?></td>
50
- <td>
51
- <?php $suAutoDelTime = SPDSGVOSettings::get('su_auto_del_time'); ?>
52
- <label for="su_auto_del_time"> <select name="su_auto_del_time"
53
- id="su_auto_del_time">
54
- <option value="0" <?= selected($suAutoDelTime === '0') ?>><?php _e('none','shapepress-dsgvo')?></option>
55
- <option value="1m" <?= selected($suAutoDelTime === '1m') ?>>1 <?php _e('month','shapepress-dsgvo')?></option>
56
- <option value="3m" <?= selected($suAutoDelTime === '3m') ?>>3 <?php _e('months','shapepress-dsgvo')?></option>
57
- <option value="6m" <?= selected($suAutoDelTime === '6m') ?>>6 <?php _e('months','shapepress-dsgvo')?></option>
58
- <option value="1y" <?= selected($suAutoDelTime === '1y') ?>>1 <?php _e('year','shapepress-dsgvo')?></option>
59
- <option value="6y" <?= selected($suAutoDelTime === '6y') ?>>6 <?php _e('years','shapepress-dsgvo')?></option>
60
- <option value="7y" <?= selected($suAutoDelTime === '7y') ?>>7 <?php _e('years','shapepress-dsgvo')?></option>
61
- </select>
62
- </label>
63
- <span class="info-text"><?php _e('Data is automatically deleted after the set time. Ensures the maximum retention time.','shapepress-dsgvo')?></span></td>
64
- </tr>
65
-
66
- <?php if (isValidPremiumEdition()) : ?>
67
- <tr>
68
- <td><?php _e('WooCommerce Data','shapepress-dsgvo')?></td>
69
- <td>
70
- <?php $wooDataAction = SPDSGVOSettings::get('su_woo_data_action'); ?>
71
- <label for="su_woo_data_action"> <select name="su_woo_data_action"
72
- id="su_woo_data_action">
73
- <option value="ignore" <?= selected($wooDataAction === 'ignore') ?>><?php _e('No action','shapepress-dsgvo')?></option>
74
- <option value="pseudo" <?= selected($wooDataAction === 'pseudo') ?>><?php _e('Pseudonymise','shapepress-dsgvo')?></option>
75
- <option value="del" <?= selected($wooDataAction === 'del') ?>><?php _e('Delete','shapepress-dsgvo')?></option>
76
- </select>
77
- </label>
78
- <span class="info-text"><?php _e('Specifies what should happen to personal data of orders.','shapepress-dsgvo')?></span></td>
79
- </tr>
80
- <tr>
81
- <td><?php _e('bbPress Data','shapepress-dsgvo')?></td>
82
- <td>
83
- <?php $bbPDataAction = SPDSGVOSettings::get('su_bbpress_data_action'); ?>
84
- <label for="su_bbpress_data_action"> <select name="su_bbpress_data_action"
85
- id="su_bbpress_data_action">
86
- <option value="ignore" <?= selected($bbPDataAction === 'ignore') ?>><?php _e('No action','shapepress-dsgvo')?></option>
87
- <option value="pseudo" <?= selected($wooDataAction === 'pseudo') ?>><?php _e('Pseudonymise','shapepress-dsgvo')?></option>
88
- <option value="del" <?= selected($bbPDataAction === 'del') ?>><?php _e('Delete','shapepress-dsgvo')?></option>
89
- </select>
90
- </label>
91
- <span class="info-text"><?php _e('Specifies what should happen with forum entries.','shapepress-dsgvo')?></span></td>
92
- </tr>
93
- <tr>
94
- <td><?php _e('buddyPress Data','shapepress-dsgvo')?></td>
95
- <td>
96
- <?php $buddyPressDataAction = SPDSGVOSettings::get('su_buddypress_data_action'); ?>
97
- <label for="su_buddypress_data_action"> <select name="su_buddypress_data_action"
98
- id="su_buddypress_data_action">
99
- <option value="ignore" <?= selected($buddyPressDataAction === 'ignore') ?>><?php _e('No action','shapepress-dsgvo')?></option>
100
- <option value="pseudo" <?= selected($buddyPressDataAction === 'pseudo') ?>><?php _e('Pseudonymise','shapepress-dsgvo')?></option>
101
- <option value="del" <?= selected($buddyPressDataAction === 'del') ?>><?php _e('Delete','shapepress-dsgvo')?></option>
102
- </select>
103
- </label>
104
- <span class="info-text"><?php _e('Specifies what should happen with PNs and extended profile fields.','shapepress-dsgvo')?></span></td>
105
- </tr>
106
- <tr>
107
- <td><?php _e('CF7/Flamingo Data','shapepress-dsgvo')?></td>
108
- <td>
109
- <?php $cf7DataAction = SPDSGVOSettings::get('su_cf7_data_action'); ?>
110
- <label for="su_cf7_data_action"> <select name="su_cf7_data_action"
111
- id="su_cf7_data_action">
112
- <option value="ignore" <?= selected($cf7DataAction === 'ignore') ?>><?php _e('No action','shapepress-dsgvo')?></option>
113
- <option value="pseudo" <?= selected($cf7DataAction === 'pseudo') ?>><?php _e('Pseudonymise','shapepress-dsgvo')?></option>
114
- <option value="del" <?= selected($cf7DataAction === 'del') ?>><?php _e('Delete','shapepress-dsgvo')?></option>
115
- </select>
116
- </label>
117
- <span class="info-text"><?php _e('Specifies what to do with contact entries and messages.','shapepress-dsgvo')?></span></td>
118
- </tr>
119
- <?php endif;?>
120
-
121
- <tr>
122
- <th scope="row"><?php _e('Page for deletion request:','shapepress-dsgvo')?></th>
123
- <td>
124
-
125
- <?php $unsubscribePage = SPDSGVOSettings::get('super_unsubscribe_page'); ?>
126
- <label for="super_unsubscribe_page"><select
127
- name="super_unsubscribe_page" id="super_unsubscribe_page">
128
- <option value="0"><?php _e('Select','shapepress-dsgvo')?></option>
129
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
130
- <option <?= selected($unsubscribePage == $page->ID) ?>
131
- value="<?= $page->ID ?>">
132
- <?= $page->post_title ?>
133
- </option>
134
- <?php endforeach; ?>
135
- </select>
136
- </label>
137
-
138
- <?php if($unsubscribePage == '0'): ?>
139
- <p>
140
- <?php _e('Create a page using the shortcode <code>[unsubscribe_form]</code>.','shapepress-dsgvo')?>
141
- <a class="button button-default"
142
- href="<?= SPDSGVOCreatePageAction::url(array('super_unsubscribe_page' => '1')) ?>"><?php _e('Create page','shapepress-dsgvo')?></a>
143
- </p>
144
- <?php elseif(!pageContainsString($unsubscribePage, 'unsubscribe_form')): ?>
145
- <p>
146
- <?php _e('Attention: The shortcode <code>[unsubscribe_form]</code> that should be on the selected page was not found. Thus, the user has no opportunity to ask a deletion request.','shapepress-dsgvo')?> <a
147
- href="<?= get_edit_post_link($unsubscribePage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
148
- </p>
149
- <?php else: ?>
150
- <a href="<?= get_edit_post_link($unsubscribePage) ?>"><?php _e('Edit page','shapepress-dsgvo')?></a>
151
- <?php endif; ?>
152
- </td>
153
- </tr>
154
-
155
- <tr>
156
- <th><?php submit_button(); ?></th>
157
- <td></td>
158
- </tr>
159
- </tbody>
160
- </table>
161
-
162
- <hr class="sp-dsgvo">
163
- </form>
164
-
165
- <?php
166
- $statuses = array(
167
- 'pending',
168
- 'done'
169
- );
170
- if (isset($_GET['status']) && in_array($_GET['status'], $statuses)) {
171
- $status = sanitize_text_field($_GET['status']);
172
- } else {
173
- $status = 'pending';
174
- }
175
- ?>
176
-
177
- <ul class="subsubsub">
178
- <li>
179
- <a
180
- href="<?= SPDSGVO::adminURL(array('tab' => 'super-unsubscribe', 'status' => 'pending')) ?>"
181
- class="<?= ($status === 'pending')? 'current' : ''; ?>" aria-current="page">
182
- <?php _e('Pending','shapepress-dsgvo')?>
183
- </a>
184
- </li>
185
- <li>
186
- <a
187
- href="<?= SPDSGVO::adminURL(array('tab' => 'super-unsubscribe', 'status' => 'done')) ?>"
188
- class="<?= ($status === 'done')? 'current' : ''; ?>" aria-current="page">
189
- <?php _e('Done','shapepress-dsgvo')?>
190
- </a>
191
- </li>
192
- </ul>
193
- <br>
194
- <br>
195
-
196
- <?php $confirmed = SPDSGVOUnsubscriber::finder('status', array('status' => $status)); ?>
197
- <table class="widefat fixed" cellspacing="0">
198
- <thead>
199
- <tr>
200
- <th id="request_id" class="manage-column column-request_id"
201
- scope="col" style="width: 10%"><?php _e('ID','shapepress-dsgvo')?></th>
202
- <th id="email" class="manage-column column-email" scope="col"
203
- style="width: 20%"><?php _e('Email','shapepress-dsgvo')?></th>
204
- <th id="first_name" class="manage-column column-first_name"
205
- scope="col" style="width: 15%"><?php _e('First name','shapepress-dsgvo')?></th>
206
- <th id="last_name" class="manage-column column-last_name" scope="col"
207
- style="width: 15%"><?php _e('Last name','shapepress-dsgvo')?></th>
208
- <th id="dsgvo_accepted" class="manage-column column-dsgvo_accepted" scope="col"
209
- style="width: 15%"><?php _e('GDPR approval','shapepress-dsgvo')?></th>
210
- <th id="status" class="manage-column column-status" scope="col"
211
- style="width: 15%"><?php _e('State','shapepress-dsgvo')?></th>
212
- <th id="process" class="manage-column column-process" scope="col"
213
- style="width: 15%"><?php _e('Delete now','shapepress-dsgvo')?></th>
214
- <!-- .i592995 -->
215
- <th id="dismiss" class="manage-column column-dismiss" scope="col"
216
- style="width: 15%"><?php _e('Dismiss','shapepress-dsgvo')?></th>
217
- <!-- .i592995 -->
218
- </tr>
219
- </thead>
220
-
221
- <tbody>
222
- <?php if(count($confirmed) !== 0): ?>
223
- <?php foreach($confirmed as $key => $confirmedRequest): ?>
224
-
225
- <tr class="<?= ($key % 2 == 0)? 'alternate' : '' ?>">
226
- <td class="column-request-id">
227
- <?= $confirmedRequest->ID ?>
228
- </td>
229
- <td class="column-email"><strong><?= $confirmedRequest->email ?></strong>
230
- </td>
231
- <td class="column-integrations">
232
- <?= $confirmedRequest->first_name ?>
233
- </td>
234
- <td class="column-auto-deleting-on">
235
- <?= $confirmedRequest->last_name ?>
236
- </td>
237
- <td class="column-auto-deleting-on">
238
- <?= $confirmedRequest->dsgvo_accepted === '1' ? 'Ja' : 'Nein' ?>
239
- </td>
240
- <td class="column-auto-deleting-on">
241
- <?= ucfirst($confirmedRequest->status) ?>
242
- </td>
243
- <td class="column-unsubscribe-user">
244
-
245
- <?php if($status == 'done'): ?>
246
- <a class="button-primary disabled" href="#"><?php _e('Delete now','shapepress-dsgvo')?></a>
247
- <?php else: ?>
248
- <a class="button-primary"
249
- href="<?= wp_nonce_url(SPDSGVOSuperUnsubscribeAction::url(array('process' => $confirmedRequest->ID)),
250
- SPDSGVOSuperUnsubscribeAction::getActionName() .'-nonce') ?>"><?php _e('Delete now','shapepress-dsgvo')?></a>
251
- <?php endif; ?>
252
- </td>
253
- <!-- .i592995 -->
254
- <td class="column-dismiss">
255
- <svg class="unsubscribe-dismiss" width="10" height="10" data-id="<?php echo $confirmedRequest->ID; ?>" data-nonce="<?php echo wp_create_nonce( SPDSGVODismissUnsubscribeAction::getActionName() .'-nonce' ) ?>">
256
- <line x1="0" y1="0" x2="10" y2="10" />
257
- <line x1="0" y1="10" x2="10" y2="0" />
258
- </svg>
259
- </td>
260
- <!-- .i592995 -->
261
- </tr>
262
-
263
- <?php endforeach; ?>
264
- <?php else: ?>
265
- <tr>
266
- <td class="column-slug" colspan="2">
267
- <?php if($status == 'done'): ?>
268
- <h4><?php _e('No requests done','shapepress-dsgvo')?></h4>
269
- <?php else: ?>
270
- <h4><?php _e('No pending requests','shapepress-dsgvo')?></h4>
271
- <?php endif; ?>
272
- </td>
273
- <td class="column-default"></td>
274
- <td class="column-reason"></td>
275
- </tr>
276
- <?php endif; ?>
277
- </tbody>
278
-
279
- <tfoot>
280
- <tr>
281
- <th class="manage-column column-request_id" scope="col"><?php _e('ID','shapepress-dsgvo')?></th>
282
- <th class="manage-column column-email" scope="col"><?php _e('Email','shapepress-dsgvo')?></th>
283
- <th class="manage-column column-first_name" scope="col"><?php _e('First name','shapepress-dsgvo')?></th>
284
- <th class="manage-column column-last_name" scope="col"><?php _e('Last name','shapepress-dsgvo')?></th>
285
- <th class="manage-column column-dsgvo_accepted" scope="col"><?php _e('GDPR approval','shapepress-dsgvo')?></th>
286
- <th class="manage-column column-status" scope="col"><?php _e('State','shapepress-dsgvo')?></th>
287
- <th class="manage-column column-process" scope="col"><?php _e('Delete now','shapepress-dsgvo')?></th>
288
- <!-- .i592995 -->
289
- <th class="manage-column column-dismiss" scope="col"><?php _e('Dismiss','shapepress-dsgvo')?></th>
290
- <!-- .i592995 -->
291
- </tr>
292
- </tfoot>
293
- </table>
294
-
295
- <?php if(isset($pending) && count($pending) !== 0): ?>
296
- <p>
297
- <a class="button-primary"
298
- href="<?= wp_nonce_url(SPDSGVOSuperUnsubscribeAction::url(array('all' => '1')),
299
- SPDSGVOSuperUnsubscribeAction::getActionName() .'-nonce')?>"><?php _e('Delete all','shapepress-dsgvo')?></a>
300
- </p>
301
- <?php endif; ?>
302
-
303
-
304
- <br>
305
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
306
- <input type="hidden" name="action"
307
- value="<?= SPDSGVOSuperUnsubscribeFormAction::getActionName(); ?>"> <input
308
- type="hidden" name="is_admin" value="1"> <br>
309
- <?php wp_nonce_field( SPDSGVOSuperUnsubscribeFormAction::getActionName(). '-nonce' ); ?>
310
- <br>
311
-
312
- <h3><?php _e('Add entry','shapepress-dsgvo')?></h3>
313
- <span style="color:red"><?php _e('ATTENTION: Executing this action deletes the account (except administrators).','shapepress-dsgvo')?></span>
314
- <table class="form-table">
315
- <tbody>
316
- <tr>
317
- <th scope="row"><label for="email"><?php _e('Email','shapepress-dsgvo')?> <span style="color: #F00">*</span></label></th>
318
- <td><input name="email" type="email" id="email" value=""
319
- class="regular-text ltr" required></td>
320
- </tr>
321
- <tr>
322
- <th scope="row"><label for="first_name"><?php _e('First name','shapepress-dsgvo')?></label></th>
323
- <td><input name="first_name" type="text" id="first_name" value=""
324
- class="regular-text ltr"></td>
325
- </tr>
326
- <tr>
327
- <th scope="row"><label for="last_name"><?php _e('Last name','shapepress-dsgvo')?></label></th>
328
- <td><input name="last_name" type="text" id="last_name" value=""
329
- class="regular-text ltr"></td>
330
- </tr>
331
- <tr>
332
- <th scope="row"><label for="dsgvo_checkbox"><?php _e('GDPR approval','shapepress-dsgvo')?></label></th>
333
- <td><input name="dsgvo_checkbox" type="checkbox" id="dsgvo_checkbox"
334
- value="1"></td>
335
- </tr>
336
- <tr>
337
- <th scope="row"><label for="process_now"><?php _e('Run without user confirmation','shapepress-dsgvo')?></label></th>
338
- <td><input name="process_now" type="checkbox" id="process_now"
339
- value="1"></td>
340
- </tr>
341
- </tbody>
342
- </table>
343
-
344
- <?php submit_button(__('Add','shapepress-dsgvo')); ?>
345
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/terms-conditions/class-sp-dsgvo-terms-conditions-action.php DELETED
@@ -1,54 +0,0 @@
1
- <?php
2
-
3
- Class SPDSGVOTermsConditionsAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'terms-conditions';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
-
12
- // Set T&C's Page
13
- if($this->has('terms_conditions_page')){
14
- SPDSGVOSettings::set('terms_conditions_page', $this->get('terms_conditions_page'));
15
- }
16
-
17
- // Set force explicit permission for authenticated users
18
- if($this->has('force_explicit_permission_authenticated')){
19
- SPDSGVOSettings::set('force_explicit_permission_authenticated', $this->get('force_explicit_permission_authenticated', '0'));
20
- }
21
-
22
- // Set force explicit permission for non-authenticated users
23
- if($this->has('force_explicit_permission_public')){
24
- SPDSGVOSettings::set('force_explicit_permission_public', $this->get('force_explicit_permission_public', '0'));
25
- }
26
-
27
- // Set explicit permission_page
28
- if($this->has('explicit_permission_page')){
29
- SPDSGVOSettings::set('explicit_permission_page', $this->get('explicit_permission_page'));
30
- }
31
-
32
- // Set opt out page
33
- if($this->has('opt_out_page')){
34
- SPDSGVOSettings::set('opt_out_page', $this->get('opt_out_page'));
35
- }
36
-
37
- // Update Terms & Conditions
38
- if($this->has('terms_conditions')){
39
- $version = SPDSGVOSettings::get('terms_conditions_version');
40
- $version = intval($version);
41
- $version++;
42
- $version = SPDSGVOSettings::set('terms_conditions_version', $version);
43
- SPDSGVOSettings::set('terms_conditions_hash', wp_hash($this->get('terms_conditions')));
44
-
45
- SPDSGVOSettings::set('terms_conditions', $this->get('terms_conditions'));
46
- SPDSGVOLog::insert("Terms and Conditions updated by {$this->user->user_email}");
47
- }
48
-
49
-
50
- $this->returnBack();
51
- }
52
- }
53
-
54
- SPDSGVOTermsConditionsAction::listen();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/terms-conditions/class-sp-dsgvo-terms-conditions-tab.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
-
3
- class SPDSGVOTermsConditionsTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Terms Conditions';
6
- public $slug = 'terms-conditions';
7
- public $isHidden = TRUE;
8
-
9
- public function __construct(){}
10
-
11
- public function page(){
12
- include plugin_dir_path(__FILE__) .'page.php';
13
- }
14
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/terms-conditions/page.php DELETED
@@ -1,129 +0,0 @@
1
- <h1>Terms &amp; Conditions</h1>
2
- <p>Use the shortcode <code>[terms_conditions]</code> to display the terms and conditions.</p>
3
- <a href="#" class="button button-default btn-settings" data-state="closed"><span class="state">Show</span> Settings</a>
4
-
5
-
6
- <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
7
- <input type="hidden" name="action" value="terms-conditions">
8
- <?php wp_nonce_field( SPDSGVOTermsConditionsAction::getActionName(). '-nonce' ); ?>
9
-
10
- <table class="form-table btn-settings-show" style="display: none;">
11
- <tbody>
12
- <tr>
13
- <th scope="row">Terms &amp; Conditions page</th>
14
- <td>
15
- <fieldset>
16
- <legend class="screen-reader-text">
17
- <span>Terms &amp; Conditions page</span>
18
- </legend>
19
-
20
- <?php $termsConditionsPage = SPDSGVOSettings::get('terms_conditions_page'); ?>
21
- <label for="terms_conditions_page">Page:
22
- <select name="terms_conditions_page" id="terms_conditions_page">
23
- <option value="0">Select</option>
24
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
25
- <option <?= selected($termsConditionsPage == $page->ID) ?> value="<?= $page->ID ?>">
26
- <?= $page->post_title ?>
27
- </option>
28
- <?php endforeach; ?>
29
- </select>
30
- </label>
31
-
32
- <?php if($termsConditionsPage == '0'): ?>
33
- <p>Create a page that use <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('terms_conditions_page' => '1')) ?>">Create page</a></p>
34
- <?php elseif(!pageContainsString($termsConditionsPage, 'terms_conditions')): ?>
35
- <p>Warning: The shortcode <code>[terms_conditions]</code> was not detected on the page you have selected. <a href="<?= get_edit_post_link($termsConditionsPage) ?>">Edit Page</a></p>
36
- <?php else: ?>
37
- <a href="<?= get_edit_post_link($termsConditionsPage) ?>">Edit page</a>
38
- <?php endif; ?>
39
- </fieldset>
40
- </td>
41
- </tr>
42
-
43
- <tr>
44
- <th scope="row">Require users to give agree</th>
45
- <td>
46
- <fieldset>
47
- <legend class="screen-reader-text">
48
- <span>Require users to give agree</span>
49
- </legend>
50
-
51
- <p>
52
- <label for="force_explicit_permission_authenticated">
53
- <input name="force_explicit_permission_authenticated" type="checkbox" id="force_explicit_permission_authenticated" value="1" <?= checked(SPDSGVOSettings::get('force_explicit_permission_authenticated') === '1') ?>>
54
- Logged in users
55
- </label>
56
- </p>
57
-
58
- <p>
59
- <label for="force_explicit_permission_public">
60
- <input name="force_explicit_permission_public" type="checkbox" id="force_explicit_permission_public" value="1" <?= checked(SPDSGVOSettings::get('force_explicit_permission_public') === '1') ?>>
61
- Not logged in users
62
- </label>
63
- <p class="description">This will redirect users to your terms and conditions page, they will have to agree to your T&amp;C’s to access the site.</p>
64
- </p>
65
-
66
-
67
- <?php $explicitPermissionPage = SPDSGVOSettings::get('explicit_permission_page'); ?>
68
- <label for="explicit_permission_page">Page:
69
- <select name="explicit_permission_page" id="explicit_permission_page">
70
- <option value="0">Select</option>
71
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
72
- <option <?= selected($explicitPermissionPage == $page->ID) ?> value="<?= $page->ID ?>">
73
- <?= $page->post_title ?>
74
- </option>
75
- <?php endforeach; ?>
76
- </select>
77
- </label>
78
-
79
- <?php if($explicitPermissionPage == '0'): ?>
80
- <p>Create a page that uses the shortcode <code>[explicit_permission]</code> <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('explicit_permission_page' => '1')) ?>">Create page</a></p>
81
- <?php elseif(!pageContainsString($explicitPermissionPage, 'explicit_permission')): ?>
82
- <p>Warning: The shortcode <code>[explicit_permission]</code> was not detected on the page you have selected. <a href="<?= get_edit_post_link($explicitPermissionPage) ?>">Edit Page</a></p>
83
- <?php else: ?>
84
- <a href="<?= get_edit_post_link($explicitPermissionPage) ?>">Edit page</a>
85
- <?php endif; ?>
86
- </fieldset>
87
- </td>
88
- </tr>
89
-
90
- <tr>
91
- <th scope="row">Opt-out</th>
92
- <td>
93
- <fieldset>
94
- <legend class="screen-reader-text">
95
- <span>Opt-out</span>
96
- </legend>
97
-
98
- <?php $optOutPage = SPDSGVOSettings::get('opt_out_page'); ?>
99
- <label for="opt_out_page">Page:
100
- <select name="opt_out_page" id="opt_out_page">
101
- <option value="0">Select</option>
102
- <?php foreach(get_pages(array('number' => 0)) as $key => $page): ?>
103
- <option <?= selected($optOutPage == $page->ID) ?> value="<?= $page->ID ?>">
104
- <?= $page->post_title ?>
105
- </option>
106
- <?php endforeach; ?>
107
- </select>
108
- </label>
109
-
110
- <?php if($optOutPage == '0'): ?>
111
- <p>Create a page that uses the shortcode <code>[decline_permission]</code> <a class="button button-default" href="<?= SPDSGVOCreatePageAction::url(array('opt_out_page' => '1')) ?>">Create page</a></p>
112
- <?php elseif(!pageContainsString($optOutPage, 'decline_permission')): ?>
113
- <p>Warning: The shortcode <code>[decline_permission]</code> was not detected on the page you have selected. <a href="<?= get_edit_post_link($optOutPage) ?>">Edit Page</a></p>
114
- <?php else: ?>
115
- <a href="<?= get_edit_post_link($optOutPage) ?>">Edit page</a>
116
- <?php endif; ?>
117
- </fieldset>
118
- </td>
119
- </tr>
120
- </tbody>
121
- </table>
122
- <hr class="sp-dsgvo">
123
-
124
-
125
- <br>
126
- <?php wp_editor(SPDSGVOSettings::get('terms_conditions'), 'terms_conditions', array('textarea_rows'=> '20')); ?>
127
- <?php submit_button(); ?>
128
- </form>
129
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-action.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOCommonSettingsAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-common-settings';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+
12
+ $subform = $this->get('subform');
13
+ if (empty(($subform))) return;
14
+
15
+ if ($subform == 'common-settings')
16
+ {
17
+ SPDSGVOSettings::set('admin_email', $this->get('admin_email', ''));
18
+ SPDSGVOSettings::set('dsgvo_auto_update', $this->get('dsgvo_auto_update', '0'));
19
+ } elseif ($subform == 'forms')
20
+ {
21
+ /*
22
+ * not needed for now
23
+ SPDSGVOSettings::set('sp_dsgvo_comments_checkbox', $this->get('sp_dsgvo_comments_checkbox', '0'));
24
+ SPDSGVOSettings::set('spdsgvo_comments_checkbox_text', $this->get('spdsgvo_comments_checkbox_text', ''));
25
+
26
+ SPDSGVOSettings::set('sp_dsgvo_cf7_acceptance_replace', $this->get('sp_dsgvo_cf7_acceptance_replace', '0'));
27
+
28
+ SPDSGVOSettings::set('wp_signup_show_privacy_checkbox', $this->get('wp_signup_show_privacy_checkbox', '0'));
29
+ SPDSGVOSettings::set('wp_signup_checkbox_text', $this->get('wp_signup_checkbox_text', ''));
30
+ */
31
+ SPDSGVOSettings::set('woo_show_privacy_checkbox', $this->get('woo_show_privacy_checkbox', '0'));
32
+ SPDSGVOSettings::set('woo_privacy_text', $this->get('woo_privacy_text', ''));
33
+
34
+ }
35
+
36
+
37
+ $this->returnBack();
38
+ }
39
+ }
40
+
41
+ SPDSGVOCommonSettingsAction::listen();
admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-activate-action.php RENAMED
@@ -1,118 +1,123 @@
1
- <?php
2
-
3
- class SPDSGVOCommonSettingsActivateAction extends SPDSGVOAjaxAction
4
- {
5
-
6
- protected $action = 'admin-common-settings-activate';
7
-
8
- protected function run()
9
- {
10
- $this->requireAdmin();
11
-
12
- $oldLicenceKey = SPDSGVOSettings::get('dsgvo_licence');
13
- $licenceKey = $this->get('dsgvo_licence', '');
14
-
15
- if (SPDSGVOSettings::get('license_activated') === '0')
16
- {
17
- //error_log('activating licence '.$licenceKey);
18
- SPDSGVOSettings::set('license_activated', '0');
19
- SPDSGVOSettings::set('license_key_error', '1');
20
-
21
- $url = 'https://wp-dsgvo.eu/spdsgvo-bin/activate.php';
22
- $url .= '?license_key=' .$licenceKey;
23
-
24
- $request = wp_remote_get($url);
25
-
26
- if( is_wp_error( $request ) ) {
27
-
28
- error_log(__('error during license activation: ', 'shapepress-dsgvo') . $request); // Bail early
29
- } else {
30
- $result = wp_remote_retrieve_body( $request );
31
- if (strpos($result, 'OK') !== false) {
32
- SPDSGVOSettings::set('license_key_error', '0');
33
- SPDSGVOSettings::set('license_activated', '1');
34
- } else
35
- {
36
- SPDSGVOSettings::set('license_activation_error', $result);
37
- SPDSGVOSettings::set('license_key_error', '1');
38
- }
39
-
40
- }
41
- } elseif(SPDSGVOSettings::get('license_activated') === '1')
42
- {
43
- $url = 'https://wp-dsgvo.eu/spdsgvo-bin/deactivate.php';
44
- $url .= '?license_key=' .$licenceKey;
45
-
46
- $request = wp_remote_get($url);
47
-
48
- if( is_wp_error( $request ) ) {
49
-
50
- error_log(__('error during license activation: ', 'shapepress-dsgvo').$request); // Bail early
51
- } else {
52
- $result = wp_remote_retrieve_body( $request );
53
- if (strpos($result, 'OK') !== false) {
54
- SPDSGVOSettings::set('license_key_error', '1');
55
- SPDSGVOSettings::set('license_activated', '0');
56
- SPDSGVOSettings::set('licence_valid_to', '');
57
- SPDSGVOSettings::set('licence_activated_on', '');
58
- } else
59
- {
60
-
61
- }
62
- }
63
- }
64
-
65
-
66
- if ($licenceKey !== '' && SPDSGVOSettings::get('license_activated') === '1') {
67
-
68
- //error_log('validating licence '.$licenceKey);
69
-
70
- $url = 'https://wp-dsgvo.eu/spdsgvo-bin/licensedetails.php';
71
- $url .= '?license_key=' .$licenceKey;
72
-
73
- $request = wp_remote_get($url);
74
-
75
- if( is_wp_error( $request ) ) {
76
-
77
- error_log(__('error during license details: ', 'shapepress-dsgvo').$request); // Bail early
78
- } else {
79
-
80
- $body = wp_remote_retrieve_body( $request );
81
-
82
- if ($body !== false)
83
- {
84
- if ($body !== false)
85
- {
86
- SPDSGVOSettings::set('licence_details_fetched', '1');
87
- SPDSGVOSettings::set('licence_details_fetched_new', '1');
88
- SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
89
- SPDSGVOSettings::set('show_invalid_license_notice', '0');
90
- SPDSGVOSettings::set('show_revoke_license_notice', '0');
91
-
92
- $data = json_decode( $body );
93
- SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
94
- SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
95
- SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
96
- SPDSGVOSettings::set('licence_status', $data->license_status);
97
-
98
- if (isPremiumEdition() && strtotime($data->expiration_date) < strtotime('today'))
99
- {
100
- SPDSGVOSettings::set('show_invalid_license_notice', '1');
101
- }
102
-
103
- if (isPremiumEdition() && strtotime($data->expiration_date) <= strtotime('today -14 days'))
104
- {
105
- SPDSGVOSettings::set('show_revoke_license_notice', '1');
106
- }
107
- }
108
- }
109
- }
110
- }
111
-
112
- SPDSGVOSettings::set('dsgvo_licence', $licenceKey);
113
-
114
- $this->returnBack();
115
- }
116
- }
117
-
118
- SPDSGVOCommonSettingsActivateAction::listen();
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOCommonSettingsActivateAction extends SPDSGVOAjaxAction
4
+ {
5
+
6
+ protected $action = 'admin-common-settings-activate';
7
+
8
+ protected function run()
9
+ {
10
+ $this->requireAdmin();
11
+
12
+ $oldLicenceKey = SPDSGVOSettings::get('dsgvo_licence');
13
+ $licenceKey = $this->get('dsgvo_licence', '');
14
+
15
+ if (SPDSGVOSettings::get('license_activated') === '0')
16
+ {
17
+ $siteUrl = get_site_url();
18
+ $homeUrl = get_home_url();
19
+
20
+ //error_log('activating licence '.$licenceKey);
21
+ SPDSGVOSettings::set('license_activated', '0');
22
+ SPDSGVOSettings::set('license_key_error', '1');
23
+
24
+ $url = SPDSGVOConstants::LEGAL_WEB_BASE_URL .'/spdsgvo-bin/activate.php';
25
+ $url .= '?license_key=' .$licenceKey;
26
+ $url .= '&site_url=' .$siteUrl;
27
+ $url .= '&home_url=' .$homeUrl;
28
+
29
+ $request = wp_remote_get($url);
30
+
31
+ if( is_wp_error( $request ) ) {
32
+
33
+ error_log(__('error during license activation: ', 'shapepress-dsgvo') . $request->get_error_message()); // Bail early
34
+ } else {
35
+ $result = wp_remote_retrieve_body( $request );
36
+ if (strpos($result, 'OK') !== false) {
37
+ SPDSGVOSettings::set('license_key_error', '0');
38
+ SPDSGVOSettings::set('license_activated', '1');
39
+ } else
40
+ {
41
+ SPDSGVOSettings::set('license_activation_error', $result);
42
+ SPDSGVOSettings::set('license_key_error', '1');
43
+ }
44
+
45
+ }
46
+ } elseif(SPDSGVOSettings::get('license_activated') === '1')
47
+ {
48
+ $url = 'https://wp-dsgvo.eu/spdsgvo-bin/deactivate.php';
49
+ $url .= '?license_key=' .$licenceKey;
50
+
51
+ $request = wp_remote_get($url);
52
+
53
+ if( is_wp_error( $request ) ) {
54
+
55
+ error_log(__('error during license activation: ', 'shapepress-dsgvo').$request->get_error_message()); // Bail early
56
+ } else {
57
+ $result = wp_remote_retrieve_body( $request );
58
+ if (strpos($result, 'OK') !== false) {
59
+ SPDSGVOSettings::set('license_key_error', '1');
60
+ SPDSGVOSettings::set('license_activated', '0');
61
+ SPDSGVOSettings::set('licence_valid_to', '');
62
+ SPDSGVOSettings::set('licence_activated_on', '');
63
+ } else
64
+ {
65
+
66
+ }
67
+ }
68
+ }
69
+
70
+
71
+ if ($licenceKey !== '' && SPDSGVOSettings::get('license_activated') === '1') {
72
+
73
+ //error_log('validating licence '.$licenceKey);
74
+
75
+ $url = 'https://wp-dsgvo.eu/spdsgvo-bin/licensedetails.php';
76
+ $url .= '?license_key=' .$licenceKey;
77
+
78
+ $request = wp_remote_get($url);
79
+
80
+ if( is_wp_error( $request ) ) {
81
+
82
+ error_log(__('error during license details: ', 'shapepress-dsgvo').$request->get_error_message()); // Bail early
83
+ } else {
84
+
85
+ $body = wp_remote_retrieve_body( $request );
86
+
87
+ if ($body !== false)
88
+ {
89
+ if ($body !== false)
90
+ {
91
+ SPDSGVOSettings::set('licence_details_fetched', '1');
92
+ SPDSGVOSettings::set('licence_details_fetched_new', '1');
93
+ SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
94
+ SPDSGVOSettings::set('show_invalid_license_notice', '0');
95
+ SPDSGVOSettings::set('show_revoke_license_notice', '0');
96
+
97
+ $data = json_decode( $body );
98
+ SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
99
+ SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
100
+ SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
101
+ SPDSGVOSettings::set('licence_status', $data->license_status);
102
+
103
+ if (isPremiumEdition() && strtotime($data->expiration_date) < strtotime('today'))
104
+ {
105
+ SPDSGVOSettings::set('show_invalid_license_notice', '1');
106
+ }
107
+
108
+ if (isPremiumEdition() && strtotime($data->expiration_date) <= strtotime('today -14 days'))
109
+ {
110
+ SPDSGVOSettings::set('show_revoke_license_notice', '1');
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ SPDSGVOSettings::set('dsgvo_licence', $licenceKey);
118
+
119
+ $this->returnBack();
120
+ }
121
+ }
122
+
123
+ SPDSGVOCommonSettingsActivateAction::listen();
admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-tab.php RENAMED
@@ -1,17 +1,17 @@
1
- <?php
2
-
3
- class SPDSGVOCommonSettingsTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Allgemeine Einstellungen';
6
- public $slug = 'common-settings';
7
- public $isHidden = FALSE;
8
-
9
- public function __construct(){
10
-
11
- $this->title = __('Common Settings','shapepress-dsgvo');
12
- }
13
-
14
- public function page(){
15
- include plugin_dir_path(__FILE__) .'page.php';
16
- }
17
- }
1
+ <?php
2
+
3
+ class SPDSGVOCommonSettingsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Common Settings';
6
+ public $slug = 'common-settings';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ //$this->title = __('Tracking Scripts (GA & FB Pixel)','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/{common-settings → v3/common-settings}/class-sp-dsgvo-common-settings-validate-license-action.php RENAMED
@@ -1,81 +1,85 @@
1
- <?php
2
-
3
- class SPDSGVOCommonSettingsValidateLicenseAction extends SPDSGVOAjaxAction
4
- {
5
-
6
- protected $action = 'admin-common-settings-validate-license';
7
-
8
- protected function run()
9
- {
10
- $this->requireAdmin();
11
- error_log('admin-common-settings-validate-license');
12
-
13
- $licActivated = SPDSGVOSettings::get('license_activated');
14
- $licenceKey = SPDSGVOSettings::get('dsgvo_licence');
15
- $oldLicenseStatus = SPDSGVOSettings::get('licence_status');
16
-
17
- if ($licenceKey !== '' && SPDSGVOSettings::get('license_activated') === '1') {
18
-
19
- error_log('validating licence '.$licenceKey);
20
-
21
- $url = 'https://wp-dsgvo.eu/spdsgvo-bin/licensedetails.php';
22
- $url .= '?license_key=' .$licenceKey;
23
-
24
- $request = wp_remote_get($url);
25
-
26
- if( is_wp_error( $request ) ) {
27
-
28
- error_log(__('error during license validation: ', 'shapepress-dsgvo').$request); // Bail early
29
- } else {
30
-
31
- $body = wp_remote_retrieve_body( $request );
32
- error_log('body: '.$body);
33
-
34
- if ($body !== false)
35
- {
36
- SPDSGVOSettings::set('licence_details_fetched', '1');
37
- SPDSGVOSettings::set('licence_details_fetched_new', '1');
38
- SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
39
- SPDSGVOSettings::set('show_invalid_license_notice', '0');
40
- SPDSGVOSettings::set('show_revoke_license_notice', '0');
41
-
42
- $data = json_decode( $body );
43
- SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
44
- SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
45
- SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
46
- SPDSGVOSettings::set('licence_status', $data->license_status);
47
-
48
- if (isPremiumEdition() && isLicenceValid() === false)
49
- {
50
- error_log("WP DSGVO Tools (GDPR) license is invalid.");
51
- SPDSGVOSettings::set('show_invalid_license_notice', '1');
52
- }
53
-
54
- if (licenseIsGoingToRunningOut())
55
- {
56
- error_log("WP DSGVO Tools (GDPR) license is going to running out in a few days");
57
- SPDSGVOSettings::set('show_revoke_license_notice', '1');
58
- }
59
-
60
- if (hasValidLicenseStatus($oldLicenseStatus, $licActivated)=== true
61
- && hasValidLicenseStatus($data->license_status, $licActivated) === false)
62
- {
63
- error_log("WP DSGVO Tools (GDPR) license got invalid now. sending email to ".SPDSGVOSettings::get('admin_email'));
64
- wp_mail(SPDSGVOSettings::get('admin_email'),
65
- __('WP DSGVO Tools (GPDR) License Error','shapepress-dsgvo').': '. parse_url(home_url(), PHP_URL_HOST),
66
- __('Your license has expired. Please renew it according to the hint at the plugin settings page.','shapepress-dsgvo'));
67
- }
68
- }
69
- }
70
- }
71
-
72
- $this->returnBack();
73
- }
74
-
75
- public function doAction()
76
- {
77
- $this->run();
78
- }
79
- }
80
-
81
- SPDSGVOCommonSettingsValidateLicenseAction::listen();
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOCommonSettingsValidateLicenseAction extends SPDSGVOAjaxAction
4
+ {
5
+
6
+ protected $action = 'admin-common-settings-validate-license';
7
+
8
+ protected function run()
9
+ {
10
+ $this->requireAdmin();
11
+ error_log('admin-common-settings-validate-license');
12
+
13
+ $licActivated = SPDSGVOSettings::get('license_activated');
14
+ $licenceKey = SPDSGVOSettings::get('dsgvo_licence');
15
+ $oldLicenseStatus = SPDSGVOSettings::get('licence_status');
16
+
17
+ if ($licenceKey !== '' && SPDSGVOSettings::get('license_activated') === '1') {
18
+
19
+ error_log('validating licence '.$licenceKey);
20
+ $siteUrl = get_site_url();
21
+ $homeUrl = get_home_url();
22
+
23
+ $url = SPDSGVOConstants::LEGAL_WEB_BASE_URL .'/spdsgvo-bin/licensedetails.php';
24
+ $url .= '?license_key=' .$licenceKey;
25
+ $url .= '&site_url=' .$siteUrl;
26
+ $url .= '&home_url=' .$homeUrl;
27
+
28
+ $request = wp_remote_get($url);
29
+
30
+ if( is_wp_error( $request ) ) {
31
+
32
+ error_log(__('error during license validation: ', 'shapepress-dsgvo').$request->get_error_message()); // Bail early
33
+ } else {
34
+
35
+ $body = wp_remote_retrieve_body( $request );
36
+ error_log('body: '.$body);
37
+
38
+ if ($body !== false)
39
+ {
40
+ SPDSGVOSettings::set('licence_details_fetched', '1');
41
+ SPDSGVOSettings::set('licence_details_fetched_new', '1');
42
+ SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
43
+ SPDSGVOSettings::set('show_invalid_license_notice', '0');
44
+ SPDSGVOSettings::set('show_revoke_license_notice', '0');
45
+
46
+ $data = json_decode( $body );
47
+ SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
48
+ SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
49
+ SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
50
+ SPDSGVOSettings::set('licence_status', $data->license_status);
51
+
52
+ if (isPremiumEdition() && isLicenceValid() === false)
53
+ {
54
+ error_log("WP DSGVO Tools (GDPR) license is invalid.");
55
+ SPDSGVOSettings::set('show_invalid_license_notice', '1');
56
+ }
57
+
58
+ if (licenseIsGoingToRunningOut())
59
+ {
60
+ error_log("WP DSGVO Tools (GDPR) license is going to running out in a few days");
61
+ SPDSGVOSettings::set('show_revoke_license_notice', '1');
62
+ }
63
+
64
+ if (hasValidLicenseStatus($oldLicenseStatus, $licActivated)=== true
65
+ && hasValidLicenseStatus($data->license_status, $licActivated) === false)
66
+ {
67
+ error_log("WP DSGVO Tools (GDPR) license got invalid now. sending email to ".SPDSGVOSettings::get('admin_email'));
68
+ wp_mail(SPDSGVOSettings::get('admin_email'),
69
+ __('WP DSGVO Tools (GPDR) License Error','shapepress-dsgvo').': '. parse_url(home_url(), PHP_URL_HOST),
70
+ __('Your license has expired. Please renew it according to the hint at the plugin settings page.','shapepress-dsgvo'));
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ $this->returnBack();
77
+ }
78
+
79
+ public function doAction()
80
+ {
81
+ $this->run();
82
+ }
83
+ }
84
+
85
+ SPDSGVOCommonSettingsValidateLicenseAction::listen();
admin/tabs/{privacy-policy → v3/common-settings}/class-sp-dsgvo-privacy-policy-action.php RENAMED
@@ -1,40 +1,49 @@
1
- <?php
2
-
3
- Class SPDSGVOPrivacyPolicyAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'privacy-policy';
6
-
7
- protected function run(){
8
- $this->checkCSRF();
9
- $this->requireAdmin();
10
-
11
-
12
- // Set privacy policy page
13
- if($this->has('privacy_policy_page')){
14
- SPDSGVOSettings::set('privacy_policy_page', $this->get('privacy_policy_page', '0'));
15
- }
16
-
17
-
18
- SPDSGVOSettings::set('woo_show_privacy_checkbox', $this->get('woo_show_privacy_checkbox', '0'));
19
- SPDSGVOSettings::set('woo_show_privacy_checkbox_register', $this->get('woo_show_privacy_checkbox_register', '0'));
20
- /* i592995 */
21
- SPDSGVOSettings::set('woo_privacy_text', $this->get('woo_privacy_text', ''));
22
- /* i592995 */
23
-
24
- // Update privacy policy
25
- if($this->has('privacy_policy')){
26
- $version = SPDSGVOSettings::get('privacy_policy_version');
27
- $version = intval($version);
28
- $version++;
29
- $version = SPDSGVOSettings::set('privacy_policy_version', $version);
30
- SPDSGVOSettings::set('privacy_policy_hash', wp_hash($this->get('privacy_policy')));
31
- SPDSGVOSettings::set('privacy_policy', $this->get('privacy_policy'));
32
- SPDSGVOLog::insert("Privacy policy updated by {$this->user->user_email}");
33
- }
34
-
35
-
36
- $this->returnBack();
37
- }
38
- }
39
-
40
- SPDSGVOPrivacyPolicyAction::listen();
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOPrivacyPolicyAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'privacy-policy';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+
12
+ // Set privacy policy page
13
+ if($this->has('privacy_policy_page')){
14
+ SPDSGVOSettings::set('privacy_policy_page', $this->get('privacy_policy_page', '0'));
15
+ }
16
+
17
+
18
+ SPDSGVOSettings::set('privacy_policy_title_html_htag', $this->get('privacy_policy_title_html_htag', 'h1'));
19
+ SPDSGVOSettings::set('privacy_policy_subtitle_html_htag', $this->get('privacy_policy_subtitle_html_htag', 'h2'));
20
+ SPDSGVOSettings::set('privacy_policy_subsubtitle_html_htag', $this->get('privacy_policy_subsubtitle_html_htag', 'h3'));
21
+
22
+
23
+ SPDSGVOSettings::set('woo_show_privacy_checkbox', $this->get('woo_show_privacy_checkbox', '0'));
24
+ SPDSGVOSettings::set('woo_show_privacy_checkbox_register', $this->get('woo_show_privacy_checkbox_register', '0'));
25
+ /* i592995 */
26
+ SPDSGVOSettings::set('woo_privacy_text', $this->get('woo_privacy_text', ''));
27
+ /* i592995 */
28
+
29
+ SPDSGVOSettings::set('pp_texts_notification_mail', $this->get('pp_texts_notification_mail', '0'));
30
+
31
+ // Update privacy policy
32
+ if($this->has('privacy_policy')){
33
+ $version = SPDSGVOSettings::get('privacy_policy_version');
34
+ $version = intval($version);
35
+ $version++;
36
+ $version = SPDSGVOSettings::set('privacy_policy_version', $version);
37
+ SPDSGVOSettings::set('privacy_policy_hash', wp_hash($this->get('privacy_policy')));
38
+ SPDSGVOSettings::set('privacy_policy', $this->get('privacy_policy'));
39
+ SPDSGVOLog::insert("Privacy policy updated by {$this->user->user_email}");
40
+ }
41
+
42
+ SPDSGVOSettings::set('wp_signup_show_privacy_checkbox', $this->get('wp_signup_show_privacy_checkbox', '0'));
43
+ SPDSGVOSettings::set('wp_signup_checkbox_text', $this->get('wp_signup_checkbox_text', ''));
44
+
45
+ $this->returnBack();
46
+ }
47
+ }
48
+
49
+ SPDSGVOPrivacyPolicyAction::listen();
admin/tabs/v3/common-settings/page.php ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+ <!--
8
+ <h1 class="module-title"><?php _e(SPDSGVOCommonSettingsTab::getTabTitle(), 'shapepress-dsgvo') ?></h1>
9
+ -->
10
+
11
+ <div class="card-columns">
12
+
13
+ <!-- licensing -->
14
+ <div class="card">
15
+ <div class="card-header">
16
+ <h4 class="card-title"><?php _e('Licensing', 'shapepress-dsgvo') ?></h4>
17
+ </div>
18
+ <div class="card-body">
19
+ <h6 class="card-subtitle mb-2"><?php _e('Activate Premium Version', 'shapepress-dsgvo') ?></h6>
20
+
21
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>" style="display: inline">
22
+ <input type="hidden" name="action" value="<?= SPDSGVOCommonSettingsActivateAction::getActionName() ?>">
23
+ <?php wp_nonce_field(SPDSGVOCommonSettingsActivateAction::getActionName() . '-nonce'); ?>
24
+
25
+ <div class="form-group">
26
+ <label for="exampleInputEmail1"><?php _e('License', 'shapepress-dsgvo') ?></label>
27
+ <input type="text" class="form-control" id="dsgvo_licence" name="dsgvo_licence" aria-describedby="licenseHelp" placeholder="<?= __('Enter License Number', 'shapepress-dsgvo'); ?>"
28
+ value="<?= SPDSGVOSettings::get('dsgvo_licence'); ?>">
29
+ <small id="licenseHelp" class="form-text text-muted"><?php _e('An activated license unlocks all features.', 'shapepress-dsgvo'); ?></small>
30
+ </div>
31
+ <div class="form-group">
32
+ <?php if (SPDSGVOSettings::get('license_activated') === '1'): ?>
33
+ <input type="submit" class="btn btn-primary btn-block"
34
+ value="<?= __('Deactivate license', 'shapepress-dsgvo') ?>"/>
35
+ <?php else: ?>
36
+ <input type="submit" class="btn btn-primary btn-block"
37
+ value="<?= __('Activate license', 'shapepress-dsgvo') ?>"/>
38
+ <span class="info-text"><?php _e('Activating the license unlocks more features.', 'shapepress-dsgvo'); ?></span>
39
+ <?php endif; ?>
40
+ </div>
41
+
42
+ </form>
43
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>" style="display: inline">
44
+ <div class="form-group">
45
+ <input type="hidden" name="action"
46
+ value="<?= SPDSGVOCommonSettingsValidateLicenseAction::getActionName() ?>">
47
+ <input type="submit" class="btn btn-secondary btn-block"
48
+ value="<?= __('Refresh license', 'shapepress-dsgvo') ?>"/>
49
+ </div>
50
+ </form>
51
+ <div>
52
+ <?php if (licenseIsGoingToRunningOut()): ?>
53
+ <a href="<?= getExtensionProductUrl(); ?>" class="btn btn-secondary btn-block"
54
+ style="background-color: #aed581;"
55
+ target="_blank"><?= __('Extend license now and gain discount', 'shapepress-dsgvo') ?></a>
56
+ <?php endif; ?>
57
+ </div>
58
+ <div>
59
+ <?php if (SPDSGVOSettings::get('license_activated') === '1'): ?>
60
+ <div style="font-weight:500">
61
+ <?php if (isPremiumEdition()): ?>
62
+ <?= isValidPremiumEdition() ? _e('Premium version has been activated', 'shapepress-dsgvo') : ('<span style ="color: red;">' . __('Invalid or expired license.', 'shapepress-dsgvo') . "</span>"); ?>
63
+ <?php endif; ?>
64
+ <?php if (isBlogEdition()): ?>
65
+ <?= isValidBlogEdition() ? _e('Blog version has been activated', 'shapepress-dsgvo') : _e('Invalid license.', 'shapepress-dsgvo'); ?>
66
+ <?php endif; ?>
67
+ </div>
68
+
69
+ <?php if (isPremiumEdition() && SPDSGVOSettings::get('licence_details_fetched') === '1'): ?>
70
+ <div>
71
+ <div style="font-weight:500; width: 150px; float:left;"><?php _e('Activated on:', 'shapepress-dsgvo'); ?></div> <?= date("d.m.Y", strtotime(SPDSGVOSettings::get('licence_activated_on'))); ?>
72
+ </div>
73
+ <div>
74
+ <div style="font-weight:500; width: 150px; float:left;"><?php _e('Status:', 'shapepress-dsgvo'); ?></div> <?= SPDSGVOSettings::get('licence_status'); ?>
75
+ </div>
76
+ <?php if (isUnlimitedLicense(SPDSGVOSettings::get('dsgvo_licence')) == false) : ?>
77
+ <div>
78
+ <div style="font-weight:500; width: 150px; float:left;"><?php _e('Valid to:', 'shapepress-dsgvo'); ?></div> <?= date("d.m.Y", strtotime(SPDSGVOSettings::get('licence_valid_to'))); ?>
79
+ </div>
80
+ <?php endif; ?>
81
+ <?php if (SPDSGVOSettings::get('licence_details_fetched_new') === '1'): ?>
82
+ <div>
83
+ <div style="font-weight:500; width: 150px; float:left;"><?php _e('Last validation:', 'shapepress-dsgvo'); ?></div> <?= date_i18n("d.m.Y H:i", strtotime(SPDSGVOSettings::get('licence_details_fetched_on'))); ?>
84
+ </div>
85
+ <div>
86
+ <div style="font-weight:500; width: 150px; float:left;"><?php _e('Remaining activations:', 'shapepress-dsgvo'); ?></div> <?= SPDSGVOSettings::get('licence_number_use_remaining'); ?>
87
+ </div>
88
+ <?php endif; ?>
89
+ <?php endif; ?>
90
+ <?php endif; ?>
91
+ </div>
92
+
93
+ </div>
94
+ </div>
95
+
96
+ <!-- common settings -->
97
+ <div class="card">
98
+ <div class="card-header">
99
+ <h4 class="card-title"><?php _e('Common Settings', 'shapepress-dsgvo') ?></h4>
100
+ </div>
101
+ <div class="card-body">
102
+
103
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
104
+ <input type="hidden" name="action" value="<?= SPDSGVOCommonSettingsAction::getActionName() ?>">
105
+ <?php wp_nonce_field(SPDSGVOCommonSettingsAction::getActionName() . '-nonce'); ?>
106
+ <input type="hidden" value="<?= SPDSGVOSettings::get('dsgvo_licence'); ?>" id="dsgvo_licence_hidden"
107
+ name="dsgvo_licence_hidden"/>
108
+ <input type="hidden" value="common-settings" id="subform" name="subform"/>
109
+ <?php
110
+ spDsgvoWriteInput('text', '', 'admin_email', SPDSGVOSettings::get('admin_email'),
111
+ __('Admin email address', 'shapepress-dsgvo'),
112
+ __('A valid email address', 'shapepress-dsgvo'),
113
+ __('Used for sending emails for notifications.', 'shapepress-dsgvo'));
114
+
115
+ /*
116
+ spDsgvoWriteInput('toggle', '', 'dsgvo_auto_update', SPDSGVOSettings::get('dsgvo_auto_update'),
117
+ __('Plugin auto-update', 'shapepress-dsgvo'),
118
+ '',
119
+ __('The plugin will install updates automatically.', 'shapepress-dsgvo'));
120
+ */
121
+ ?>
122
+ <div class="form-group">
123
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
124
+ </div>
125
+ </form>
126
+
127
+ </div>
128
+ </div>
129
+
130
+ <!-- privacy policy -->
131
+ <div class="card">
132
+ <div class="card-header">
133
+ <h4 class="card-title"><?php _e('Privacy Policy', 'shapepress-dsgvo') ?></h4>
134
+ </div>
135
+ <div class="card-body">
136
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
137
+ <input type="hidden" name="action" value="<?= SPDSGVOPrivacyPolicyAction::getActionName(); ?>">
138
+ <?php wp_nonce_field(SPDSGVOPrivacyPolicyAction::getActionName() . '-nonce'); ?>
139
+
140
+ <div class="form-group">
141
+ <?php $privacyPolicyPage = SPDSGVOSettings::get('privacy_policy_page'); ?>
142
+ <label for="privacy_policy_page"><?php _e('Privacy policy page', 'shapepress-dsgvo') ?></label>
143
+ <select class="form-control" name="privacy_policy_page" id="privacy_policy_page">
144
+ <option value="0"><?php _e('Select', 'shapepress-dsgvo'); ?></option>
145
+ <?php foreach (get_pages(array('number' => 0)) as $key => $page): ?>
146
+ <option <?= selected($privacyPolicyPage == $page->ID) ?> value="<?= $page->ID ?>">
147
+ <?= $page->post_title ?>
148
+ </option>
149
+ <?php endforeach; ?>
150
+ </select>
151
+
152
+
153
+
154
+ </div>
155
+ <div class="form-group">
156
+ <?php if ($privacyPolicyPage == '0'): ?>
157
+ <small><?php _e('Create a page that uses the shortcode <code>[privacy_policy]</code>.', 'shapepress-dsgvo') ?>
158
+ <a class="btn btn-secondary btn-block"
159
+ href="<?= SPDSGVOCreatePageAction::url(array('privacy_policy_page' => '1')) ?>"><?php _e('Create page', 'shapepress-dsgvo') ?></a>
160
+ </small>
161
+ <?php elseif (!pageContainsString($privacyPolicyPage, 'privacy_policy')): ?>
162
+ <small><?php _e('Attention: The shortcode <code>[privacy_policy]</code> was not found on the page you selected.', 'shapepress-dsgvo') ?>
163
+ <a class="btn btn-secondary btn-block" target="_blank"
164
+ href="<?= get_edit_post_link($privacyPolicyPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
165
+ </small>
166
+ <?php else: ?>
167
+ <small class="form-text text-muted"><?= __('The page can also by edited and text could be extended by the editing the selected page with the Wordpress page editor like Gutenberg.','shapepress-dsgvo') ?></small>
168
+ <a class="btn btn-secondary btn-block" target="_blank"
169
+ href="<?= get_edit_post_link($privacyPolicyPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
170
+ <?php endif; ?>
171
+ </div>
172
+ <div class="position-relative">
173
+
174
+ <div class="form-group">
175
+ <?php $hTagTitle = SPDSGVOSettings::get('privacy_policy_title_html_htag') ?>
176
+ <label for="privacy_policy_title_html_htag"><?php _e('Header stile of title', 'shapepress-dsgvo') ?></label>
177
+ <select class="form-control" name="privacy_policy_title_html_htag" id="privacy_policy_title_html_htag">
178
+ <option value="h1" <?= selected($hTagTitle == 'h1') ?>>h1</option>
179
+ <option value="h2" <?= selected($hTagTitle == 'h2') ?>>h2</option>
180
+ <option value="h3" <?= selected($hTagTitle == 'h3') ?>>h3</option>
181
+ <option value="h4" <?= selected($hTagTitle == 'h4') ?>>h4</option>
182
+ <option value="h5" <?= selected($hTagTitle == 'h5') ?>>h5</option>
183
+ <option value="h6" <?= selected($hTagTitle == 'h6') ?>>h6</option>
184
+ </select>
185
+ <small class="form-text text-muted"><?php _e('Specifies the html header tag of the header of the privacy policy.', 'shapepress-dsgvo') ?></small>
186
+ </div>
187
+ <div class="form-group">
188
+ <?php $hTagSubTitle = SPDSGVOSettings::get('privacy_policy_subtitle_html_htag') ?>
189
+ <label for="privacy_policy_title_html_htag"><?php _e('Header stile of subtitles', 'shapepress-dsgvo') ?></label>
190
+ <select class="form-control" name="privacy_policy_subtitle_html_htag" id="privacy_policy_subtitle_html_htag">
191
+ <option value="h1" <?= selected($hTagSubTitle == 'h1') ?>>h1</option>
192
+ <option value="h2" <?= selected($hTagSubTitle == 'h2') ?>>h2</option>
193
+ <option value="h3" <?= selected($hTagSubTitle == 'h3') ?>>h3</option>
194
+ <option value="h4" <?= selected($hTagSubTitle == 'h4') ?>>h4</option>
195
+ <option value="h5" <?= selected($hTagSubTitle == 'h5') ?>>h5</option>
196
+ <option value="h6" <?= selected($hTagSubTitle == 'h6') ?>>h6</option>
197
+ </select>
198
+ <small class="form-text text-muted"><?php _e('Specifies the html header tag of the subtitles of the privacy policy.', 'shapepress-dsgvo') ?></small>
199
+ </div>
200
+ <div class="form-group">
201
+ <?php $hTagSubSubTitle = SPDSGVOSettings::get('privacy_policy_subsubtitle_html_htag') ?>
202
+ <label for="privacy_policy_title_html_htag"><?php _e('Header stile of "subsubtitles"', 'shapepress-dsgvo') ?></label>
203
+ <select class="form-control" name="privacy_policy_subsubtitle_html_htag" id="privacy_policy_subsubtitle_html_htag">
204
+ <option value="h1" <?= selected($hTagSubSubTitle == 'h1') ?>>h1</option>
205
+ <option value="h2" <?= selected($hTagSubSubTitle == 'h2') ?>>h2</option>
206
+ <option value="h3" <?= selected($hTagSubSubTitle == 'h3') ?>>h3</option>
207
+ <option value="h4" <?= selected($hTagSubSubTitle == 'h4') ?>>h4</option>
208
+ <option value="h5" <?= selected($hTagSubSubTitle == 'h5') ?>>h5</option>
209
+ <option value="h6" <?= selected($hTagSubSubTitle == 'h6') ?>>h6</option>
210
+ </select>
211
+ <small class="form-text text-muted"><?php _e('Specifies the html header tag of the "subsubtitles" of the privacy policy.', 'shapepress-dsgvo') ?></small>
212
+ </div>
213
+ </div>
214
+ <?php
215
+ spDsgvoWriteInput('toggle', '', 'pp_texts_notification_mail', SPDSGVOSettings::get('pp_texts_notification_mail'),
216
+ __('Email notification when new texts are downloadable', 'shapepress-dsgvo'),
217
+ '',
218
+ '');
219
+ ?>
220
+ <div class="form-group">
221
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
222
+ </div>
223
+ <div>
224
+ <label for="textsVersion"><?= __('Privacy policy texts','shapepress-dsgvo');?></label>
225
+ </div>
226
+
227
+ <div class="form-row">
228
+
229
+ <div class="col">
230
+ <label for="textsVersion"><?= __('Date of Version','shapepress-dsgvo');?></label>
231
+ <input type="text" readonly="" class="form-control-plaintext" id="textVersion" value="<?= date("d.m.y H:i", SPDSGVOSettings::get('legal_web_texts_version'))?>">
232
+ </div>
233
+ <div class="col">
234
+ <label for="textsVersion"><?= __('Last update check','shapepress-dsgvo');?></label>
235
+ <input type="text" readonly="" class="form-control-plaintext" id="textVersion" value="<?= date("d.m.y H:i",SPDSGVOSettings::get('legal_web_texts_last_check'))?>">
236
+ </div>
237
+ </div>
238
+ <div class="form-group">
239
+ <div class="progress" id="progress-pp-texts-reload" style="display: none">
240
+ <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"></div>
241
+ </div>
242
+ <input id="btn-refresh-pp-texts" type="button" class="btn btn-outline-primary btn-block privacy-policy-texts-refresh-link" value="<?= _e('Reload Privacy Policy texts', 'shapepress-dsgvo');?>">
243
+ </div>
244
+
245
+ </form>
246
+ </div>
247
+ </div>
248
+
249
+
250
+ <!-- forms -->
251
+
252
+ <div class="card">
253
+ <div class="card-header">
254
+ <h4 class="card-title"><?php _e('Additional Texts', 'shapepress-dsgvo') ?></h4>
255
+ </div>
256
+ <div class="card-body">
257
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
258
+ <input type="hidden" name="action" value="<?= SPDSGVOCommonSettingsAction::getActionName() ?>">
259
+ <?php wp_nonce_field(SPDSGVOCommonSettingsAction::getActionName() . '-nonce'); ?>
260
+ <input type="hidden" value="<?= SPDSGVOSettings::get('dsgvo_licence'); ?>" id="dsgvo_licence_hidden"
261
+ name="dsgvo_licence_hidden"/>
262
+ <input type="hidden" value="forms" id="subform" name="subform"/>
263
+
264
+ <div class="form-group">
265
+ <small class="form-text text-muted"><?= __('The registration form and comments feature do not require any additional phrases such as "I agree to the privacy policy" or "more privacy information". It is enough if there is a link to the privacy policy on the respective page in the footer.','shapepress-dsgvo'); ?></small>
266
+ </div>
267
+ <?php
268
+ /*
269
+ spDsgvoWriteInput('toggle', '', 'sp_dsgvo_comments_checkbox', SPDSGVOSettings::get('sp_dsgvo_comments_checkbox'),
270
+ __('Notice text at comments', 'shapepress-dsgvo'),
271
+ '',
272
+ __('Displays at notice text when creating a comment. Important: Not compatible in combination with Jetpack comment form.', 'shapepress-dsgvo'));
273
+
274
+ if (class_exists('WPCF7_ContactForm')) {
275
+ spDsgvoWriteInput('toggle', '', 'sp_dsgvo_cf7_acceptance_replace', SPDSGVOSettings::get('sp_dsgvo_cf7_acceptance_replace'),
276
+ __('Replace CF7 Acceptance text', 'shapepress-dsgvo'),
277
+ '',
278
+ __('Replaces the text of CF7 Acceptance Checkboxes with following text. (Add to your form: [acceptance dsgvo] Text[/acceptance])', 'shapepress-dsgvo'));
279
+ }
280
+ */
281
+ ?>
282
+
283
+ <div class="position-relative">
284
+
285
+ <? //php spDsgvoWritePremiumOverlayIfInvalid($isBlog || $isPremium); ?>
286
+
287
+ <?php
288
+ /*
289
+ spDsgvoWriteInput('textarea', '', 'spdsgvo_comments_checkbox_text',
290
+ htmlentities(trim(SPDSGVOSettings::get('spdsgvo_comments_checkbox_text'))),
291
+ __('Text to display at comment forms', 'shapepress-dsgvo'),
292
+ __('A message text', 'shapepress-dsgvo'),
293
+ __('This text gets displayed at every comment form on your page, so that your user confirm to the privacy policy with committing the form.', 'shapepress-dsgvo'));
294
+ */
295
+ ?>
296
+ </div>
297
+
298
+ <?php
299
+ /*
300
+ spDsgvoWriteInput('toggle', '', 'wp_signup_show_privacy_checkbox', SPDSGVOSettings::get('wp_signup_show_privacy_checkbox'),
301
+ __('Notice text at sign-up form', 'shapepress-dsgvo'),
302
+ '',
303
+ __('Displays a text at user sign-up form to confirm to the privacy policy.', 'shapepress-dsgvo'));
304
+ */
305
+ ?>
306
+
307
+ <div class="position-relative">
308
+ <?php spDsgvoWritePremiumOverlayIfInvalid($isBlog || $isPremium); ?>
309
+ <?php
310
+ /*
311
+ spDsgvoWriteInput('textarea', '', 'wp_signup_checkbox_text',
312
+ htmlentities(trim(SPDSGVOSettings::get('wp_signup_checkbox_text'))),
313
+ __('Text to display at sign-up form', 'shapepress-dsgvo'),
314
+ __('A message text', 'shapepress-dsgvo'),
315
+ __('This text gets displayed at the sign-up form on your page, so that your user confirm to the privacy policy with committing the form.', 'shapepress-dsgvo'));
316
+ */
317
+ ?>
318
+ </div>
319
+
320
+ <?php
321
+ spDsgvoWriteInput('toggle', '', 'woo_show_privacy_checkbox', SPDSGVOSettings::get('woo_show_privacy_checkbox'),
322
+ __('Checkout text at WooCommerce checkout', 'shapepress-dsgvo'),
323
+ '',
324
+ __('Possibility to display a custom text at the WooCommerce checkout form to ensure terms & conditions.', 'shapepress-dsgvo'));
325
+ ?>
326
+
327
+ <div class="position-relative">
328
+ <?php spDsgvoWritePremiumOverlayIfInvalid($isBlog || $isPremium); ?>
329
+ <?php
330
+ spDsgvoWriteInput('textarea', '', 'woo_privacy_text',
331
+ htmlentities(trim(SPDSGVOSettings::get('woo_privacy_text'))),
332
+ __('Text to display at WooCommerce checkout form', 'shapepress-dsgvo'),
333
+ __('A message text', 'shapepress-dsgvo'),
334
+ '');
335
+ ?>
336
+ </div>
337
+
338
+ <div class="form-group">
339
+ <?= __('<strong>Important Note:</strong> If you use WPML you can translate these inputs via WPML String Translations.', 'shapepress-dsgvo') ?>
340
+ </div>
341
+ <div class="form-group">
342
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
343
+ </div>
344
+ </form>
345
+ </div>
346
+ </div>
347
+
348
+ </div>
349
+
350
+
351
+
352
+
admin/tabs/v3/info/class-sp-dsgvo-info-tab.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOInfoTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'V3 must read';
6
+ public $slug = 'info';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ $this->title = __('V3 must read','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/info/page.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card col-12">
9
+ <div class="card-header"><?php _e('IMPORTANT, OTHERWISE YOUR WEBSITE WILL NOT CONFORM TO PRIVACY','shapepress-dsgvo')?></div>
10
+ <div class="card-body">
11
+ <h6 class="card-subtitle"> <?php _e('You need to take 10 minutes to read this text and to reconfigure WP DSGVO Tools (GDPR).','shapepress-dsgvo')?></h6>
12
+
13
+ </div>
14
+ </div>
15
+ <div class="card-columns">
16
+ <div class="card">
17
+ <div class="card-header"><?php _e('1. GDPR GUIDANCE','shapepress-dsgvo')?></div>
18
+ <div class="card-body">
19
+ <?php _e('WP DSGVO Tools helps you to design your website correctly. Nevertheless, WP DSGVO does not replace any individual legal advice and no control over whether all aspects of your website have been taken into account.','shapepress-dsgvo'); ?>
20
+ </div>
21
+ </div>
22
+ <div class="card">
23
+ <div class="card-header"><?php _e('2. NEW LEGAL POSITION','shapepress-dsgvo')?></div>
24
+ <div class="card-body">
25
+ <?php _e('New judgments of the European Court of Justice and requirements of data protection authorities have a massive impact on websites and web marketing.<br />WP DSGVO V3 has implemented these requirements to get the consent of the web user to various services. WP DSGVO was fundamentally changed. with the support of data protection lawyer Peter Harlander of (§) MARKETINGRECHT.EU. WP DSGVO was fundamentally changed.<br /><strong> You must go through WP DSGVO point by point and make sure everything is set correctly. </strong> <br />If you are interested, you can read additional details on the legal requirements in the PDF from (§) MARKETINGRECHT.EU or directly from the data protection authorities:<br /><a href="https://www.marketingrecht.eu/downloads/legalweb-mr.pdf" target="_blank"> • https://www.marketingrecht.eu/downloads/legalweb-mr.pdf</a><br /><a href="https://www.baden-wuerttemberg.datenschutz.de/zum-einsatz-von-cookies-und-cookie-bannern-was-gilt-es-bei-einwilligungen-zu-tun-eugh-urteil-planet49/" target="_blank">• https://www.baden-wuerttemberg.datenschutz.de/zum-einsatz-von-cookies-und-cookie-bannern-was-gilt-es-bei-einwilligungen-zu-tun-eugh-urteil-planet49/</a><br />','shapepress-dsgvo'); ?>
26
+ </div>
27
+ </div>
28
+ <div class="card">
29
+ <div class="card-header"><?php _e('3. NEW OPTIONS','shapepress-dsgvo')?></div>
30
+ <div class="card-body">
31
+ <?php _e('Other providers sometimes offer options such as "resume consent", "pre-selected services" or "no disapprove button". These options are meanwhile illegal. The offerers who offer such options, want to meet the website operators who, contrary to the opinion of the courts and data protection authorities still want to have it.<br /><br />We have only included options that are currently considered to be privacy-compliant (according to most lawyers) because we believe that very few WP DSGVO Tools (GDPR) users will hire a privacy expert to design their website.<br /><br />WP DSGVO Tools (GDPR) does not replace individual legal advice, but we want to get you in the right direction as much as possible. This is only possible if we do not even offer unnecessary risk factors. Also you can find out more details in the PDF of (§) MARKETINGRECHT.EU.','shapepress-dsgvo'); ?>
32
+ </div>
33
+ </div>
34
+ <div class="card">
35
+ <div class="card-header"><?php _e('4. ALL IN ONE','shapepress-dsgvo')?></div>
36
+ <div class="card-body">
37
+ <?php _e('<strong>You need to configure WP DSGVO correctly.</strong> WP DSGVO will then create a legally compliant cookie popup and the corresponding privacy policy.<br /><br />The Free version primary contains all the services that private websites need. The Premium version includes services primarily used by professional marketing companies and agencies. It is important that you choose the version that contains as many services as possible of your website.<br /><br />For not included services you have to make your own. Our plugin is designed for standard configured services. Special settings may require special configurations.<br /><strong>Other services are ongoing</strong>. Soon, the Free Version and the Premium Version will be equipped with privacy tools for embeddings such as Youtube, Open Street Map, Google Maps, Facebook, Instagram etc. New marketing tools will be added to the Premium version.<br /><br />Requests for additional (frequently used) services for the Premium version can be made at <a href="https://legalweb.freshdesk.com" target="_blank">https://legalweb.freshdesk.com/</a>.','shapepress-dsgvo'); ?>
38
+ </div>
39
+ </div>
40
+ <div class="card">
41
+ <div class="card-header"><?php _e('5. BUT NO COOKIE POPUP?','shapepress-dsgvo')?></div>
42
+ <div class="card-body">
43
+ <?php _e('Many Web site operators were irritated because WP DSGVO Tools (GDPR) V3 does not produce a cookie popup (correct) in some configurations.<br /><br /><strong>In addition the short legal explanation:</strong> the Cookie Popup serves "only" to obtain the consent of the website users to the processing of their personal data. This consent is not necessary if the tool for operating the website is necessarily technically necessary. <br /><br />According to data protection authorities, an analysis tool is basically technically necessary. However, it is not necessary for the provider of the analysis tool to process the data for his own purposes. <br /><br />Therefore, a local Matomo or WP Statistics (the data remains with the website operator) do not need consent and thus no popup. <br /><br />A Google Analytics, however, according to the data protection authorities, a consent and thus the popup, because Google further processed the analysis data. (<a href="https://datenschutz-hamburg.de/pressemitteilungen/2019/11/2019-11-14-google-analytics" target="_blank">https://datenschutz-hamburg.de/pressemitteilungen/2019/11/2019-11-14-google-analytics</a>) <br /><br />If Matomo or WP Statistics are the only services, it will not pop up. If you really want to have it different (because he represents a different view of the law), there is now an option to include technically necessary services like Matomo or WP Statistics in the popup.','shapepress-dsgvo'); ?>
44
+ </div>
45
+ </div>
46
+ <div class="card">
47
+ <div class="card-header"><?php _e('6. FACEBOOK PIXEL','shapepress-dsgvo')?></div>
48
+ <div class="card-body">
49
+ <?php _e('The update brings a little re-sharpening. Facebook Pixel is no longer included in the Free Version. Facebook Pixel is primarily a marketing tool for optimizing paid Facebook advertising. Therefore, it has migrated to the premium version, which is aimed at companies and agencies. <br /><br />In return, the Free Version receives two new additional features: <br />• Access to multilingual legal texts created by lawyers and accurately translated by sworn and court-certified interpreters. <br /><br />• Access to privacy tools for embeddings such as Youtube, Google Maps, Open Street Map, Facebook, Instagram, etc. soon. <br /><br />The paid Blogger version still has access to Facebook Pixel and of course gets the same new features as the free version.','shapepress-dsgvo'); ?>
50
+ </div>
51
+ </div>
52
+ <div class="card">
53
+ <div class="card-header"><?php _e('7. LICENSE MODEL','shapepress-dsgvo')?></div>
54
+ <div class="card-body">
55
+ <?php _e('We simplified the license model. There are only Free and Premium (1, 25, 100). The Blogger version is no longer available. If you already have these, you can of course reuse them and even get new functions with the update.','shapepress-dsgvo'); ?>
56
+ </div>
57
+ </div>
58
+ <div class="card">
59
+ <div class="card-header"><?php _e('8. SUPPORT','shapepress-dsgvo')?></div>
60
+ <div class="card-body">
61
+ <?php _e('The conversion was really profound. With more than 40,000 installations, one or two websites may experience problems. We\'ll be happy to help if you report the problem at <a href="https://wordpress.org/support/plugin/shapepress-dsgvo/" target="_blank">https://wordpress.org/support/plugin/shapepress-dsgvo/</a> (for Free versions) or <a href="https://legalweb.freshdesk.com/" target="_blank">https://legalweb.freshdesk.com/</a> (for Blog and Premium versions).','shapepress-dsgvo'); ?>
62
+ </div>
63
+ </div>
64
+ <div class="card">
65
+ <div class="card-header"><?php _e('9. RATING','shapepress-dsgvo')?></div>
66
+ <div class="card-body">
67
+ <?php _e('Unfortunately, there were some users who did not ask a support question, but have immediately "avenged" conversion issues with a 1-star rating. As a result, we have fallen from 4.5 stars to 3.5 stars. Please do not do that and use the support, we really like to help!<br /> <br />1-star ratings for small bugs, which the support immediately does, are a real problem - for us and for all users of WP DSGVO. Because the long term can only handle the effort if at least some of the massive development costs come in again due to good valuations of premium versions. <br /> <br />Stuck in WP DSGVO<br />• Over 2,500 internal hours worked by developers and lawyers<br /> • External costs for developers for special requirements<br /> • High external costs for sworn and court-certified interpreters for 100 percent correct translation of legal texts<br /> <br />If this is worth more than 1 star, we would really appreciate it: <br /> <a href="https://wordpress.org/support/plugin/shapepress-dsgvo/reviews/#new-post" target="_blank">https://wordpress.org/support/plugin/shapepress-dsgvo/reviews/#new-post</a>','shapepress-dsgvo'); ?>
68
+ </div>
69
+ </div>
70
+ <div class="card">
71
+ <div class="card-header"><?php _e('10. COMMUNITY','shapepress-dsgvo')?></div>
72
+ <div class="card-body">
73
+ <?php _e('We are happy to be able to give the Wordpress Community WP DSGVO a small thank you for Wordpress and thousands of great plugins.<br /> <br />We will always provide the Wordpress community with a free version for private blogs and websites. <br /> <br />This is currently used by about 40,000 website operators.','shapepress-dsgvo'); ?>
74
+ </div>
75
+ </div>
76
+ <div class="card">
77
+ <div class="card-header"><?php _e('11. SHAPEPRESS + MARKETINGRECHT.EU = LEGALWEB','shapepress-dsgvo')?></div>
78
+ <div class="card-body">
79
+ <?php _e('No, we were not bought. On the contrary. We met with (§) MARKETINGRECHT.EU brought a data protection lawyer on board. This ensures that WP DSGVO is always up-to-date.','shapepress-dsgvo'); ?>
80
+ </div>
81
+ </div>
82
+
83
+ </div>
84
+
85
+
admin/tabs/v3/operator/class-sp-dsgvo-imprint-action.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOImprintAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'imprint';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+
12
+ $subform = $this->get('subform');
13
+ if (empty(($subform))) return;
14
+
15
+ if ($subform == 'imprint-settings')
16
+ {
17
+ if($this->has('imprint_page')){
18
+ SPDSGVOSettings::set('imprint_page', $this->get('imprint_page', '0'));
19
+ }
20
+ } elseif ($subform == 'imprint-content')
21
+ {
22
+ // Update imprint
23
+ if($this->has('imprint')){
24
+ SPDSGVOSettings::set('imprint_hash', wp_hash($this->get('imprint')));
25
+ SPDSGVOSettings::set('imprint', $this->get('imprint'));
26
+ SPDSGVOLog::insert("Imprint updated by {$this->user->user_email}");
27
+ }
28
+ }
29
+
30
+ $this->returnBack();
31
+ }
32
+ }
33
+
34
+ SPDSGVOImprintAction::listen();
admin/tabs/v3/operator/class-sp-dsgvo-operator-action.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOOperatorAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-operator';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+ $textRefreshNeeded = $this->get('spdsgvo_company_info_countrycode', '') != SPDSGVOSettings::get('spdsgvo_company_info_countrycode');
12
+
13
+ SPDSGVOSettings::set('page_operator_type', $this->get('page_operator_type', ''));
14
+ SPDSGVOSettings::set('page_operator_corporate_name', $this->get('page_operator_corporate_name', ''));
15
+ SPDSGVOSettings::set('page_operator_corporate_ceo', $this->get('page_operator_corporate_ceo', ''));
16
+
17
+ SPDSGVOSettings::set('page_operator_company_law_person', $this->get('page_operator_company_law_person', ''));
18
+ SPDSGVOSettings::set('page_operator_company_name', $this->get('page_operator_company_name', ''));
19
+ SPDSGVOSettings::set('page_operator_operator_name', $this->get('page_operator_operator_name', ''));
20
+ SPDSGVOSettings::set('spdsgvo_company_info_countrycode', $this->get('spdsgvo_company_info_countrycode', ''));
21
+
22
+ SPDSGVOSettings::set('spdsgvo_company_info_street', $this->get('spdsgvo_company_info_street', ''));
23
+ SPDSGVOSettings::set('spdsgvo_company_info_loc', $this->get('spdsgvo_company_info_loc', ''));
24
+ SPDSGVOSettings::set('spdsgvo_company_info_zip', $this->get('spdsgvo_company_info_zip', ''));
25
+ SPDSGVOSettings::set('spdsgvo_company_info_countrycode', $this->get('spdsgvo_company_info_countrycode', ''));
26
+ SPDSGVOSettings::set('spdsgvo_company_info_phone', $this->get('spdsgvo_company_info_phone', ''));
27
+ SPDSGVOSettings::set('spdsgvo_company_info_email', $this->get('spdsgvo_company_info_email', ''));
28
+
29
+ SPDSGVOSettings::set('spdsgvo_company_fn_nr', $this->get('spdsgvo_company_fn_nr', ''));
30
+ SPDSGVOSettings::set('spdsgvo_company_law_loc', $this->get('spdsgvo_company_law_loc', ''));
31
+ SPDSGVOSettings::set('spdsgvo_company_uid_nr', $this->get('spdsgvo_company_uid_nr', ''));
32
+ SPDSGVOSettings::set('spdsgvo_company_law_person', $this->get('spdsgvo_company_law_person', ''));
33
+ SPDSGVOSettings::set('spdsgvo_company_chairmen', $this->get('spdsgvo_company_chairmen', ''));
34
+ SPDSGVOSettings::set('spdsgvo_company_resp_content', $this->get('spdsgvo_company_resp_content', ''));
35
+
36
+ SPDSGVOSettings::set('page_operator_society_name', $this->get('page_operator_society_name', ''));
37
+ SPDSGVOSettings::set('page_operator_society_board', $this->get('page_operator_society_board', ''));
38
+ SPDSGVOSettings::set('page_operator_society_number', $this->get('page_operator_society_number', ''));
39
+
40
+ SPDSGVOSettings::set('page_operator_privacy_shield', $this->get('page_operator_privacy_shield', '0'));
41
+
42
+ SPDSGVOSettings::set('operator_pp_responsibility_type', $this->get('operator_pp_responsibility_type', ''));
43
+ SPDSGVOSettings::set('operator_pp_dso_intern_name', $this->get('operator_pp_dso_intern_name', ''));
44
+ SPDSGVOSettings::set('operator_pp_dso_intern_phone', $this->get('operator_pp_dso_intern_phone', ''));
45
+ SPDSGVOSettings::set('operator_pp_dso_intern_email', $this->get('operator_pp_dso_intern_email', ''));
46
+
47
+ SPDSGVOSettings::set('operator_pp_dso_external_company', $this->get('operator_pp_dso_external_company', ''));
48
+ SPDSGVOSettings::set('operator_pp_dso_external_name', $this->get('operator_pp_dso_external_name', ''));
49
+ SPDSGVOSettings::set('operator_pp_dso_external_street', $this->get('operator_pp_dso_external_street', ''));
50
+ SPDSGVOSettings::set('operator_pp_dso_external_loc', $this->get('operator_pp_dso_external_loc', ''));
51
+ SPDSGVOSettings::set('operator_pp_dso_external_zip', $this->get('operator_pp_dso_external_zip', ''));
52
+ SPDSGVOSettings::set('operator_pp_dso_external_countrycode', $this->get('operator_pp_dso_external_countrycode', ''));
53
+ SPDSGVOSettings::set('operator_pp_dso_external_phone', $this->get('operator_pp_dso_external_phone', ''));
54
+ SPDSGVOSettings::set('operator_pp_dso_external_email', $this->get('operator_pp_dso_external_email', ''));
55
+
56
+ SPDSGVOSettings::set('operator_pp_responsibility_contact', $this->get('operator_pp_responsibility_contact', ''));
57
+ SPDSGVOSettings::set('operator_pp_dso_contact_intern_name', $this->get('operator_pp_dso_contact_intern_name', ''));
58
+ SPDSGVOSettings::set('operator_pp_dso_contact_intern_phone', $this->get('operator_pp_dso_contact_intern_phone', ''));
59
+ SPDSGVOSettings::set('operator_pp_dso_contact_intern_email', $this->get('operator_pp_dso_contact_intern_email', ''));
60
+
61
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_company', $this->get('operator_pp_dso_contact_external_company', ''));
62
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_name', $this->get('operator_pp_dso_contact_external_name', ''));
63
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_street', $this->get('operator_pp_dso_contact_external_street', ''));
64
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_loc', $this->get('operator_pp_dso_contact_external_loc', ''));
65
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_zip', $this->get('operator_pp_dso_contact_external_zip', ''));
66
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_countrycode', $this->get('operator_pp_dso_contact_external_countrycode', ''));
67
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_phone', $this->get('operator_pp_dso_contact_external_phone', ''));
68
+ SPDSGVOSettings::set('operator_pp_dso_contact_external_email', $this->get('operator_pp_dso_contact_external_email', ''));
69
+
70
+ if ($textRefreshNeeded)
71
+ {
72
+ SPDSGVOSettings::set('show_notice_privacy_policy_texts_outdated', '1');
73
+ try {
74
+ SPDSGVOLanguageTools::updateLwTexts();
75
+ } catch (Exception $e) {}
76
+ }
77
+
78
+ SPDSGVOCacheManager::clearCaches();
79
+ $this->returnBack();
80
+ }
81
+ }
82
+
83
+ SPDSGVOOperatorAction::listen();
admin/tabs/v3/operator/class-sp-dsgvo-operator-tab.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOOperatorTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Operator';
6
+ public $slug = 'operator';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ $this->title = __('Operator','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/operator/page.php ADDED
@@ -0,0 +1,557 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+
10
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
11
+ <input type="hidden" name="action" value="<?= SPDSGVOOperatorAction::getActionName() ?>">
12
+ <?php wp_nonce_field(SPDSGVOOperatorAction::getActionName() . '-nonce'); ?>
13
+ <!-- operator person details-->
14
+ <div class="card">
15
+ <div class="card-header">
16
+ <h4 class="card-title"><?php _e('Wordpress Page/Blog Operator', 'shapepress-dsgvo') ?></h4>
17
+ </div>
18
+ <div class="card-body">
19
+ <div class="form">
20
+ <input type="hidden" name="action" value="<?= SPDSGVOOperatorAction::getActionName() ?>">
21
+ <?php wp_nonce_field(SPDSGVOOperatorAction::getActionName() . '-nonce'); ?>
22
+
23
+ <div class="form-group">
24
+ <?php $operatorType = SPDSGVOSettings::get('page_operator_type');?>
25
+ <label for="page_operator_type"><?php _e('Page operator type', 'shapepress-dsgvo') ?></label>
26
+ <select class="form-control" id="page_operator_type" name="page_operator_type">
27
+ <option value="private" <?php if ($operatorType == 'private') {
28
+ echo 'selected';
29
+ } ?>><?php _e('Private citizen', 'shapepress-dsgvo') ?></option>
30
+ <option value="one-man" <?php if ($operatorType == 'one-man') {
31
+ echo 'selected';
32
+ } ?>><?php _e('One-man business', 'shapepress-dsgvo') ?></option>
33
+ <option value="corporation" <?php if ($operatorType == 'corporation') {
34
+ echo 'selected';
35
+ } ?>><?php _e('Corporation', 'shapepress-dsgvo') ?></option>
36
+ <option value="society" <?php if ($operatorType == 'society') {
37
+ echo 'selected';
38
+ } ?>><?php _e('Society', 'shapepress-dsgvo') ?></option>
39
+
40
+ </select>
41
+ </div>
42
+
43
+ <div class="page-operator-type-container page-operator-type-container-corporation <?= $operatorType == 'corporation' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
44
+ <?php
45
+ // in case corperate
46
+ spDsgvoWriteInput('text', '', 'page_operator_corporate_name', SPDSGVOSettings::get('page_operator_corporate_name'),
47
+ __('Company + legal form', 'shapepress-dsgvo'),
48
+ '',
49
+ __('The name of the company including the legal form.', 'shapepress-dsgvo'));
50
+ ?>
51
+
52
+ <?php
53
+ spDsgvoWriteInput('text', '', 'page_operator_corporate_ceo', SPDSGVOSettings::get('page_operator_corporate_ceo'),
54
+ __('Executive director', 'shapepress-dsgvo'),
55
+ '',
56
+ '');
57
+ ?>
58
+
59
+ <?php
60
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_chairmen', SPDSGVOSettings::get('spdsgvo_company_chairmen'),
61
+ __('Shareholder', 'shapepress-dsgvo'),
62
+ '',
63
+ '');
64
+ ?>
65
+ </div>
66
+
67
+ <div class="page-operator-type-container page-operator-type-container-one-man <?= $operatorType == 'one-man' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
68
+ <?php
69
+ // in case of one-man
70
+ spDsgvoWriteInput('text', '', 'page_operator_company_law_person', SPDSGVOSettings::get('page_operator_company_law_person'),
71
+ __('Full Name of the company owner', 'shapepress-dsgvo'),
72
+ '',
73
+ __('The name of person who legally represents the company including all titles if wished.', 'shapepress-dsgvo'));
74
+ ?>
75
+
76
+ <?php
77
+ // in case of one-man
78
+ spDsgvoWriteInput('text', '', 'page_operator_company_name', SPDSGVOSettings::get('page_operator_company_name'),
79
+ __('Business name', 'shapepress-dsgvo'),
80
+ '',
81
+ __('The name of the company.', 'shapepress-dsgvo'));
82
+ ?>
83
+ </div>
84
+
85
+ <div class="page-operator-type-container page-operator-type-container-private <?= $operatorType == 'private' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
86
+ <?php
87
+ // in case of private
88
+ spDsgvoWriteInput('text', '', 'page_operator_operator_name', SPDSGVOSettings::get('page_operator_operator_name'),
89
+ __('First and last name', 'shapepress-dsgvo'),
90
+ '',
91
+ '');
92
+ ?>
93
+ </div>
94
+
95
+ <div class="page-operator-type-container page-operator-type-container-society <?= $operatorType == 'society' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
96
+ <?php
97
+
98
+ spDsgvoWriteInput('text', '', 'page_operator_society_name', SPDSGVOSettings::get('page_operator_society_name'),
99
+ __('Society name', 'shapepress-dsgvo'),
100
+ '',
101
+ __('The full name of the society.', 'shapepress-dsgvo'));
102
+ ?>
103
+ <?php
104
+
105
+ spDsgvoWriteInput('text', '', 'page_operator_society_board', SPDSGVOSettings::get('page_operator_society_board'),
106
+ __('Simplifying board', 'shapepress-dsgvo'),
107
+ '',
108
+ '');
109
+ ?>
110
+ <?php
111
+
112
+ spDsgvoWriteInput('text', '', 'page_operator_society_number', SPDSGVOSettings::get('page_operator_society_number'),
113
+ __('Society number', 'shapepress-dsgvo'),
114
+ '',
115
+ '');
116
+ ?>
117
+ </div>
118
+
119
+ <div class="form-group">
120
+ <?php
121
+ $selectedCountry = SPDSGVOSettings::get('spdsgvo_company_info_countrycode');
122
+ $countryList = SPDSGVOConstants::getCountries();
123
+ ?>
124
+ <div class="label-operator-type label-operator-type-private <?= $operatorType == 'private' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'; ?>">
125
+ <label for="spdsgvo_company_info_countrycode"><?php _e('Place of residence', 'shapepress-dsgvo') ?></label>
126
+ </div>
127
+ <div class="label-operator-type label-operator-type-one-man <?= $operatorType == 'one-man' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'; ?>">
128
+ <label for="spdsgvo_company_info_countrycode"><?php _e('Registered business address', 'shapepress-dsgvo') ?></label>
129
+ </div>
130
+ <div class="label-operator-type label-operator-type-society <?= $operatorType == 'society' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'; ?>">
131
+ <label for="spdsgvo_company_info_countrycode"><?php _e('Club seat', 'shapepress-dsgvo') ?></label>
132
+ </div>
133
+ <div class="label-operator-type label-operator-type-corporation <?= $operatorType == 'corporation' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'; ?>">
134
+ <label for="spdsgvo_company_info_countrycode"><?php _e('Registered business address', 'shapepress-dsgvo') ?></label>
135
+ </div>
136
+
137
+ <select name="spdsgvo_company_info_countrycode" id="spdsgvo_company_info_countrycode" class="form-control">
138
+ <?php foreach ($countryList as $key => $name) :?>
139
+ <option value="<?= $key?>" <?php selected($selectedCountry, $key); ?>><?= $name; ?></option>
140
+ <?php endforeach; ?>
141
+ </select>
142
+ <small class="form-text text-muted"><?php _e('Important: This setting defines the legal basis of all the texts which WP DSGVO Tools (GDPR) provides. Setting a wrong country risks to be not confirm with the GDPR.', 'shapepress-dsgvo') ?></small>
143
+ </div>
144
+
145
+ <?php
146
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_info_street', SPDSGVOSettings::get('spdsgvo_company_info_street'),
147
+ __('Street', 'shapepress-dsgvo'),
148
+ '',
149
+ '');
150
+ ?>
151
+
152
+ <?php
153
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_info_zip', SPDSGVOSettings::get('spdsgvo_company_info_zip'),
154
+ __('ZIP code', 'shapepress-dsgvo'),
155
+ '',
156
+ '');
157
+ ?>
158
+
159
+ <?php
160
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_info_loc', SPDSGVOSettings::get('spdsgvo_company_info_loc'),
161
+ __('Location', 'shapepress-dsgvo'),
162
+ '',
163
+ '');
164
+ ?>
165
+
166
+
167
+
168
+ <?php
169
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_info_phone', SPDSGVOSettings::get('spdsgvo_company_info_phone'),
170
+ __('Phone', 'shapepress-dsgvo'),
171
+ '',
172
+ '');
173
+ ?>
174
+
175
+ <?php
176
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_info_email', SPDSGVOSettings::get('spdsgvo_company_info_email'),
177
+ __('Email', 'shapepress-dsgvo'),
178
+ '',
179
+ '');
180
+ ?>
181
+
182
+ <!-- US privacy shield -->
183
+
184
+ <div class="page-operator-container-us <?= $selectedCountry == 'US' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>"">
185
+ <?php
186
+
187
+ spDsgvoWriteInput('switch', '', 'page_operator_privacy_shield', SPDSGVOSettings::get('page_operator_privacy_shield', '0'),
188
+ __('Privacy Shield', 'shapepress-dsgvo'),
189
+ '',
190
+ __('Enable, if you/your business is privacy shield certified.','shapepress-dsgvo'));
191
+
192
+ ?>
193
+ </div>
194
+
195
+ <div class="page-operator-type-container page-operator-type-container-one-man page-operator-type-container-corporation page-operator-type-container-society <?= $operatorType != 'private' ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
196
+ <?php
197
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_fn_nr', SPDSGVOSettings::get('spdsgvo_company_fn_nr'),
198
+ __('Commercial book no.', 'shapepress-dsgvo'),
199
+ '',
200
+ '');
201
+ ?>
202
+
203
+ <?php
204
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_law_loc', SPDSGVOSettings::get('spdsgvo_company_law_loc'),
205
+ __('§11 Place of Jurisdiction', 'shapepress-dsgvo'),
206
+ '',
207
+ '');
208
+ ?>
209
+
210
+ <?php
211
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_uid_nr', SPDSGVOSettings::get('spdsgvo_company_uid_nr'),
212
+ __('VAT No.:', 'shapepress-dsgvo'),
213
+ '',
214
+ '');
215
+ ?>
216
+
217
+ <?php
218
+ /*
219
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_law_person', SPDSGVOSettings::get('spdsgvo_company_law_person'),
220
+ __('Legal representatives', 'shapepress-dsgvo'),
221
+ '',
222
+ __('The person who legally represents the company.', 'shapepress-dsgvo'));
223
+ */
224
+ ?>
225
+ </div>
226
+
227
+
228
+
229
+
230
+ <?php
231
+ spDsgvoWriteInput('text', '', 'spdsgvo_company_resp_content', SPDSGVOSettings::get('spdsgvo_company_resp_content'),
232
+ __('Responsible for content', 'shapepress-dsgvo'),
233
+ '',
234
+ __('The person who is responsible for the content of this website.', 'shapepress-dsgvo'));
235
+ ?>
236
+
237
+ <div class="form-group">
238
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
239
+ </div>
240
+
241
+ </div>
242
+ </div>
243
+ </div>
244
+
245
+ <!-- dso -->
246
+ <div class="card">
247
+ <div class="card-header">
248
+ <h4 class="card-title"><?php _e('Privacy Policy Basics', 'shapepress-dsgvo') ?></h4>
249
+ </div>
250
+ <div class="card-body">
251
+ <div class="form">
252
+ <input type="hidden" name="action" value="<?= SPDSGVOOperatorAction::getActionName() ?>">
253
+ <?php wp_nonce_field(SPDSGVOOperatorAction::getActionName() . '-nonce'); ?>
254
+
255
+ <div class="form-group">
256
+ <?php $operator_pp_responsibility_type = SPDSGVOSettings::get('operator_pp_responsibility_type'); ?>
257
+ <label><?php _e('Do you have a data security officer?', 'shapepress-dsgvo') ?></label>
258
+ <?php
259
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_type_intern', 'operator_pp_responsibility_type',
260
+ $operator_pp_responsibility_type,
261
+ __('Yes, internal', 'shapepress-dsgvo'),
262
+ '',
263
+ '', false, '', 'internal');
264
+ ?>
265
+ <?php
266
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_type_extern', 'operator_pp_responsibility_type',
267
+ $operator_pp_responsibility_type,
268
+ __('Yes, external', 'shapepress-dsgvo'),
269
+ '',
270
+ '', false, '', 'external');
271
+ ?>
272
+ <?php
273
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_type_none', 'operator_pp_responsibility_type',
274
+ $operator_pp_responsibility_type,
275
+ __('No, we do not have', 'shapepress-dsgvo'),
276
+ '',
277
+ '', false, '', 'none');
278
+ ?>
279
+ <small class="form-text text-muted"><?= __('Specifies if your company has an inhouse data security officer, an external person or no responsible person.', 'shapepress-dsgvo') ?></small>
280
+ </div>
281
+
282
+ <div id="container-pp-responsibility-internal" class="container-pp-responsibility <?= $operator_pp_responsibility_type == 'internal' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'?>">
283
+
284
+ <label><?php _e('Internal data security officer', 'shapepress-dsgvo') ?></label>
285
+
286
+ <?php
287
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_intern_name', SPDSGVOSettings::get('operator_pp_dso_intern_name'),
288
+ __('Name', 'shapepress-dsgvo'),
289
+ '',
290
+ '');
291
+ ?>
292
+
293
+ <?php
294
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_intern_phone', SPDSGVOSettings::get('operator_pp_dso_intern_phone'),
295
+ __('Phone', 'shapepress-dsgvo'),
296
+ '',
297
+ '');
298
+ ?>
299
+
300
+ <?php
301
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_intern_email', SPDSGVOSettings::get('operator_pp_dso_intern_email'),
302
+ __('Email', 'shapepress-dsgvo'),
303
+ '',
304
+ '');
305
+ ?>
306
+
307
+ </div>
308
+
309
+ <div id="container-pp-responsibility-external"
310
+ class="form-group container-pp-responsibility <?= $operator_pp_responsibility_type == 'external' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'?>">
311
+
312
+ <label><?php _e('External data security officer', 'shapepress-dsgvo') ?></label>
313
+
314
+ <?php
315
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_company', SPDSGVOSettings::get('operator_pp_dso_external_company'),
316
+ __('Company name', 'shapepress-dsgvo'),
317
+ '',
318
+ '');
319
+ ?>
320
+
321
+ <?php
322
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_name', SPDSGVOSettings::get('operator_pp_dso_external_name'),
323
+ __('Name', 'shapepress-dsgvo'),
324
+ '',
325
+ '');
326
+ ?>
327
+
328
+ <?php
329
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_street', SPDSGVOSettings::get('operator_pp_dso_external_street'),
330
+ __('Street', 'shapepress-dsgvo'),
331
+ '',
332
+ '');
333
+ ?>
334
+
335
+ <?php
336
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_zip', SPDSGVOSettings::get('operator_pp_dso_external_zip'),
337
+ __('ZIP code', 'shapepress-dsgvo'),
338
+ '',
339
+ '');
340
+ ?>
341
+
342
+ <?php
343
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_loc', SPDSGVOSettings::get('operator_pp_dso_external_loc'),
344
+ __('Location', 'shapepress-dsgvo'),
345
+ '',
346
+ '');
347
+ ?>
348
+
349
+ <div class="form-group">
350
+ <?php
351
+ $selectedCountry = SPDSGVOSettings::get('operator_pp_dso_external_countrycode');
352
+ ?>
353
+ <label for="operator_pp_dso_external_countrycode"><?php _e('Country:', 'shapepress-dsgvo') ?></label>
354
+ <select name="operator_pp_dso_external_countrycode" id="operator_pp_dso_external_countrycode" class="form-control">
355
+ <option value="AT" <?php selected($selectedCountry, 'AT'); ?>><?php _e('Austria', 'shapepress-dsgvo') ?></option>
356
+ <option value="DE" <?php selected($selectedCountry, 'DE'); ?>><?php _e('Germany', 'shapepress-dsgvo') ?></option>
357
+ </select>
358
+ </div>
359
+
360
+ <?php
361
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_phone', SPDSGVOSettings::get('operator_pp_dso_external_phone'),
362
+ __('Phone', 'shapepress-dsgvo'),
363
+ '',
364
+ '');
365
+ ?>
366
+
367
+ <?php
368
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_external_email', SPDSGVOSettings::get('operator_pp_dso_external_email'),
369
+ __('Email', 'shapepress-dsgvo'),
370
+ '',
371
+ '');
372
+ ?>
373
+
374
+ </div>
375
+
376
+ <div id="container-pp-responsibility-none"
377
+ class="form-group container-pp-responsibility <?= $operator_pp_responsibility_type == 'none' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'?>">
378
+
379
+ <?php $operator_pp_responsibility_contact = SPDSGVOSettings::get('operator_pp_responsibility_contact'); ?>
380
+ <label><?php _e('Does your company has responsible person for privacy issues?', 'shapepress-dsgvo') ?></label>
381
+ <?php
382
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_contact_intern', 'operator_pp_responsibility_contact',
383
+ $operator_pp_responsibility_contact,
384
+ __('Yes, internal', 'shapepress-dsgvo'),
385
+ '',
386
+ '', false, '', 'internal');
387
+ ?>
388
+ <?php
389
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_contact_extern', 'operator_pp_responsibility_contact',
390
+ $operator_pp_responsibility_contact,
391
+ __('Yes, external', 'shapepress-dsgvo'),
392
+ '',
393
+ '', false, '', 'external');
394
+ ?>
395
+ <?php
396
+ spDsgvoWriteInput('radio', 'operator_pp_responsibility_contact_none', 'operator_pp_responsibility_contact',
397
+ $operator_pp_responsibility_contact,
398
+ __('No, we do not have', 'shapepress-dsgvo'),
399
+ '',
400
+ '', false, '', 'no');
401
+ ?>
402
+ <small class="form-text text-muted"><?= __('Specifies if your company has responsible person for privacy issues .', 'shapepress-dsgvo') ?></small>
403
+
404
+ </div>
405
+
406
+ <div id="container-dso-contact-internal"
407
+ class="container-dso-contact <?= $operator_pp_responsibility_type == 'none' && $operator_pp_responsibility_contact == 'internal' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'?>">
408
+
409
+ <label><?php _e('Internal contact for privacy issues', 'shapepress-dsgvo') ?></label>
410
+
411
+ <?php
412
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_intern_name', SPDSGVOSettings::get('operator_pp_dso_contact_intern_name'),
413
+ __('Name', 'shapepress-dsgvo'),
414
+ '',
415
+ '');
416
+ ?>
417
+
418
+ <?php
419
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_intern_phone', SPDSGVOSettings::get('operator_pp_dso_contact_intern_phone'),
420
+ __('Phone', 'shapepress-dsgvo'),
421
+ '',
422
+ '');
423
+ ?>
424
+
425
+ <?php
426
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_intern_email', SPDSGVOSettings::get('operator_pp_dso_contact_intern_email'),
427
+ __('Email', 'shapepress-dsgvo'),
428
+ '',
429
+ '');
430
+ ?>
431
+
432
+ </div>
433
+
434
+ <div id="container-dso-contact-external"
435
+ class="container-dso-contact <?= $operator_pp_responsibility_type == 'none' && $operator_pp_responsibility_contact == 'external' ? 'spdsgvo-d-block' : 'spdsgvo-d-none'?>">
436
+
437
+ <label><?php _e('External contact for privacy issues', 'shapepress-dsgvo') ?></label>
438
+
439
+
440
+ <?php
441
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_company', SPDSGVOSettings::get('operator_pp_dso_contact_external_company'),
442
+ __('Company/First- and lastname', 'shapepress-dsgvo'),
443
+ '',
444
+ '');
445
+ ?>
446
+
447
+ <?php
448
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_name', SPDSGVOSettings::get('operator_pp_dso_contact_external_name'),
449
+ __('Name', 'shapepress-dsgvo'),
450
+ '',
451
+ '');
452
+ ?>
453
+
454
+ <?php
455
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_street', SPDSGVOSettings::get('operator_pp_dso_contact_external_street'),
456
+ __('Street', 'shapepress-dsgvo'),
457
+ '',
458
+ '');
459
+ ?>
460
+
461
+ <?php
462
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_zip', SPDSGVOSettings::get('operator_pp_dso_contact_external_zip'),
463
+ __('ZIP code', 'shapepress-dsgvo'),
464
+ '',
465
+ '');
466
+ ?>
467
+
468
+ <?php
469
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_loc', SPDSGVOSettings::get('operator_pp_dso_contact_external_loc'),
470
+ __('Location', 'shapepress-dsgvo'),
471
+ '',
472
+ '');
473
+ ?>
474
+
475
+ <div class="form-group">
476
+ <?php
477
+ $selectedCountry = SPDSGVOSettings::get('operator_pp_dso_contact_external_countrycode');
478
+ ?>
479
+ <label for="operator_pp_dso_contact_external_countrycode"><?php _e('Country:', 'shapepress-dsgvo') ?></label>
480
+ <select name="operator_pp_dso_contact_external_countrycode" id="operator_pp_dso_contact_external_countrycode" class="form-control">
481
+ <option value="AT" <?php selected($selectedCountry, 'AT'); ?>><?php _e('Austria', 'shapepress-dsgvo') ?></option>
482
+ <option value="DE" <?php selected($selectedCountry, 'DE'); ?>><?php _e('Germany', 'shapepress-dsgvo') ?></option>
483
+ </select>
484
+ </div>
485
+
486
+ <?php
487
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_phone', SPDSGVOSettings::get('operator_pp_dso_contact_external_phone'),
488
+ __('Phone', 'shapepress-dsgvo'),
489
+ '',
490
+ '');
491
+ ?>
492
+
493
+ <?php
494
+ spDsgvoWriteInput('text', '', 'operator_pp_dso_contact_external_email', SPDSGVOSettings::get('operator_pp_dso_contact_external_email'),
495
+ __('Email', 'shapepress-dsgvo'),
496
+ '',
497
+ '');
498
+ ?>
499
+
500
+ </div>
501
+
502
+ <div class="form-group">
503
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
504
+ </div>
505
+ </div>
506
+ </div>
507
+ </div>
508
+
509
+ </form>
510
+ <!-- imprint -->
511
+ <div class="card">
512
+ <div class="card-header">
513
+ <h4 class="card-title"><?php _e('Imprint settings', 'shapepress-dsgvo') ?></h4>
514
+ </div>
515
+ <div class="card-body">
516
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
517
+ <input type="hidden" name="action" value="<?= SPDSGVOImprintAction::getActionName(); ?>">
518
+ <?php wp_nonce_field(SPDSGVOImprintAction::getActionName() . '-nonce'); ?>
519
+ <input type="hidden" name="subform" value="imprint-settings">
520
+
521
+ <div class="form-group">
522
+ <?php $imprintPage = SPDSGVOSettings::get('imprint_page'); ?>
523
+ <label for="imprint_page"><?php _e('Imprint page', 'shapepress-dsgvo') ?></label>
524
+ <select class="form-control" name="imprint_page" id="imprint_page">
525
+ <option value="0"><?php _e('Select', 'shapepress-dsgvo'); ?></option>
526
+ <?php foreach (get_pages(array('number' => 0)) as $key => $page): ?>
527
+ <option <?= selected($imprintPage == $page->ID) ?> value="<?= $page->ID ?>">
528
+ <?= $page->post_title ?>
529
+ </option>
530
+ <?php endforeach; ?>
531
+ </select>
532
+ </div>
533
+ <div class="form-group">
534
+ <?php if ($imprintPage == '0'): ?>
535
+ <small><?php _e('Create a page that uses the shortcode <code>[imprint]</code>.', 'shapepress-dsgvo') ?>
536
+ <a class="btn btn-secondary btn-block"
537
+ href="<?= SPDSGVOCreatePageAction::url(array('imprint_page' => '1')) ?>"><?php _e('Create page', 'shapepress-dsgvo') ?></a>
538
+ </small>
539
+ <?php elseif (!pageContainsString($imprintPage, 'imprint')): ?>
540
+ <small><?php _e('Attention: The shortcode <code>[imprint]</code> was not found on the page you selected.', 'shapepress-dsgvo') ?>
541
+ <a class="btn btn-secondary btn-block"
542
+ href="<?= get_edit_post_link($imprintPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
543
+ </small>
544
+ <?php else: ?>
545
+ <small class="form-text text-muted"><?= __('The page can also by edited and text could be extended by the editing the selected page with the Wordpress page editor like Gutenberg.','shapepress-dsgvo') ?></small>
546
+ <a class="btn btn-secondary btn-block"
547
+ href="<?= get_edit_post_link($imprintPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
548
+ <?php endif; ?>
549
+ </div>
550
+ <div class="form-group">
551
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
552
+ </div>
553
+ </form>
554
+ </div>
555
+ </div>
556
+
557
+ </div>
admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-action.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOPageBasicsAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-page-basics';
6
+
7
+
8
+
9
+
10
+ public static function getDefaultOtherText()
11
+ {
12
+ return __("<strong>Service:</strong> Name of the service<br /><strong>Operator:</strong> Company, address, state<br /><strong>Privacy Policy:</strong> Link Privacy Policy<br /><strong>Privacy Shield:</strong> Link Privacy Shield (only required with US service providers)<br />", 'shapepress-dsgvo');
13
+ }
14
+
15
+
16
+ protected function run(){
17
+ $this->checkCSRF();
18
+ $this->requireAdmin();
19
+
20
+ SPDSGVOSettings::set('page_basics_hosting_provider', $this->get('page_basics_hosting_provider'));
21
+ SPDSGVOSettings::set('page_basics_other_provider_text', $this->get('otherProviderText'));
22
+
23
+ SPDSGVOSettings::set('page_basics_use_logfiles', $this->get('page_basics_use_logfiles'));
24
+ SPDSGVOSettings::set('page_basics_logfiles_life', $this->get('page_basics_logfiles_life'));
25
+
26
+ SPDSGVOSettings::set('page_basics_use_cdn', $this->get('page_basics_use_cdn'));
27
+ SPDSGVOSettings::set('page_basics_cdn_provider', $this->get('page_basics_cdn_provider'));
28
+ SPDSGVOSettings::set('page_basics_other_cdn_provider_text', $this->get('otherCdnProviderText'));
29
+
30
+ SPDSGVOSettings::set('page_basics_use_payment_provider', $this->get('page_basics_use_payment_provider'));
31
+ SPDSGVOSettings::set('page_basics_payment_provider', $this->get('page_basics_payment_provider'));
32
+
33
+ SPDSGVOSettings::set('page_basics_font_provider', $this->get('page_basics_font_provider'));
34
+ SPDSGVOSettings::set('page_basics_block_google_fonts', $this->get('page_basics_block_google_fonts'));
35
+
36
+
37
+ SPDSGVOSettings::set('page_basics_forms_contact', $this->get('page_basics_forms_contact'));
38
+ SPDSGVOSettings::set('page_basics_forms_application', $this->get('page_basics_forms_application'));
39
+ SPDSGVOSettings::set('page_basics_forms_contest', $this->get('page_basics_forms_contest'));
40
+ SPDSGVOSettings::set('page_basics_forms_registration', $this->get('page_basics_forms_registration'));
41
+ SPDSGVOSettings::set('page_basics_forms_comments', $this->get('page_basics_forms_comments'));
42
+ SPDSGVOSettings::set('page_basics_forms_comments_publish_type', $this->get('page_basics_forms_comments_publish_type'));
43
+
44
+ SPDSGVOSettings::set('page_basics_security_provider', $this->get('page_basics_security_provider'));
45
+ SPDSGVOSettings::set('page_basics_other_security_provider_text', $this->get('otherSecurityProviderText'));
46
+
47
+ SPDSGVOSettings::set('page_basics_embeddings', $this->get('page_basics_embeddings'));
48
+
49
+ if (isValidPremiumEdition()) {
50
+ SPDSGVOSettings::set('page_basics_use_newsletter_provider', $this->get('page_basics_use_newsletter_provider'));
51
+ SPDSGVOSettings::set('page_basics_newsletter_provider', $this->get('page_basics_newsletter_provider'));
52
+ SPDSGVOSettings::set('page_basics_other_newsletter_provider_text', $this->get('page_basics_other_newsletter_provider_text'));
53
+ }
54
+
55
+
56
+ $this->returnBack();
57
+ }
58
+ }
59
+
60
+ SPDSGVOPageBasicsAction::listen();
admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-tab.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOPageBasicsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Page Basics';
6
+ public $slug = 'page-basics';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ $this->title = __('Page Basics','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/page-basics/page.php ADDED
@@ -0,0 +1,467 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
8
+ <input type="hidden" name="action" value="<?= SPDSGVOPageBasicsAction::getActionName() ?>">
9
+ <?php wp_nonce_field(SPDSGVOPageBasicsAction::getActionName() . '-nonce'); ?>
10
+
11
+ <div class="card-columns">
12
+ <!-- hosting -->
13
+ <div class="card">
14
+ <div class="card-header">
15
+ <h4 class="card-title"><?php _e('Hosting Provider', 'shapepress-dsgvo') ?></h4>
16
+ </div>
17
+ <div class="card-body">
18
+ <div class="form">
19
+ <input type="hidden" name="action" value="<?= SPDSGVOPageBasicsAction::getActionName() ?>">
20
+ <?php wp_nonce_field(SPDSGVOPageBasicsAction::getActionName() . '-nonce'); ?>
21
+
22
+ <div class="form-group">
23
+ <?php
24
+ $selectedHostingProvider = SPDSGVOSettings::get('page_basics_hosting_provider');
25
+ if (empty($selectedHostingProvider)) $selectedHostingProvider = array();
26
+ foreach (SPDSGVOConstants::getHostingProvider() as $key => $value)
27
+ {
28
+ $checked = in_array($key, $selectedHostingProvider); // hack initial value
29
+ spDsgvoWriteInput('switch', 'page_basics_hosting_provider_'.$key, 'page_basics_hosting_provider[]',
30
+ $checked ? $key : $key.'1',
31
+ __($value, 'shapepress-dsgvo'),
32
+ '',
33
+ '', false,'', $key);
34
+ }
35
+ ?>
36
+ </div>
37
+
38
+ <div class="form-group <?= checked(in_array('other', $selectedHostingProvider)) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>"
39
+ id="container-other-provider">
40
+ <label><?php _e('Other Hosting Provider', 'shapepress-dsgvo') ?></label>
41
+ <small class="form-text text-muted"><?php _e('Please complete those services that you have included in your website but are not listed in the list. The privacy policy of the respective service provider can be found on the website of the provider. In order to determine whether the US service provider Privacy Shield is certified, a query can be made in the list provided at this link: <a href="https://www.privacyshield.gov/list" target="_blank">https://www.privacyshield.gov/list.</a>', 'shapepress-dsgvo') ?></small>
42
+
43
+ <?php
44
+ $otherProviderText = SPDSGVOSettings::get('page_basics_other_provider_text');
45
+ if (empty($otherProviderText)) $otherProviderText = SPDSGVOPageBasicsAction::getDefaultOtherText();
46
+ ?>
47
+ <?php wp_editor($otherProviderText, 'otherProviderText', array('textarea_rows' => '10', 'drag_drop_upload' => 'false', 'teeny' => true, 'media_buttons' => false)); ?>
48
+
49
+ </div>
50
+
51
+ <div class="form-group">
52
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+
58
+ <div class="card">
59
+ <div class="card-header">
60
+ <h4 class="card-title"><?php _e('Server Basics', 'shapepress-dsgvo') ?></h4>
61
+ </div>
62
+ <div class="card-body">
63
+ <div class="form" >
64
+
65
+ <?php
66
+ $useLogFiles = SPDSGVOSettings::get('page_basics_use_logfiles');
67
+
68
+ spDsgvoWriteInput('switch', '', 'page_basics_use_logfiles', $useLogFiles,
69
+ __('Usage of log files', 'shapepress-dsgvo'),
70
+ '',
71
+ __('Enable, if your hoster/server stores log files.','shapepress-dsgvo'));
72
+
73
+ ?>
74
+
75
+ <div id="container-logfiles-life" class="<?= $useLogFiles == 1 ? '' : 'spdsgvo-d-none';?>">
76
+ <?php
77
+
78
+ spDsgvoWriteInput('text', '', 'page_basics_logfiles_life', SPDSGVOSettings::get('page_basics_logfiles_life'),
79
+ __('Storage life (days)', 'shapepress-dsgvo'),
80
+ __('e.g. 7','shapepress-dsgvo'),
81
+ __('Specify after how much days the files will be deleted.','shapepress-dsgvo'));
82
+
83
+ ?>
84
+ </div>
85
+
86
+ <div class="form-group">
87
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+
93
+ <!-- cdn -->
94
+ <div class="card">
95
+ <div class="card-header">
96
+ <h4 class="card-title"><?php _e('CDN Provider', 'shapepress-dsgvo') ?></h4>
97
+ </div>
98
+ <div class="card-body">
99
+ <div class="form">
100
+
101
+ <?php
102
+ $useCdnProvider = SPDSGVOSettings::get('page_basics_use_cdn');
103
+
104
+ spDsgvoWriteInput('switch', '', 'page_basics_use_cdn', $useCdnProvider,
105
+ __('Use of a CDN Server/Provider', 'shapepress-dsgvo'),
106
+ '',
107
+ __('Enable, if you use a CDN server for static content (CSS, Javascripts, Images,...).','shapepress-dsgvo'));
108
+
109
+ ?>
110
+
111
+ <div class="form-group <?= $useCdnProvider == 1 ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>" id="container-basics-use-cdn">
112
+ <label><?php _e('CDN Provider', 'shapepress-dsgvo') ?></label>
113
+ <?php
114
+
115
+ $selectedCdnProvider = SPDSGVOSettings::get('page_basics_cdn_provider');
116
+ if (empty($selectedCdnProvider)) $selectedCdnProvider = array();
117
+ foreach (SPDSGVOConstants::getCDNServers() as $key => $value)
118
+ {
119
+ $checked = in_array($key, $selectedCdnProvider); // hack initial value
120
+ spDsgvoWriteInput('switch', 'page_basics_cdn_provider_'.$key, 'page_basics_cdn_provider[]',
121
+ $checked ? $key : $key.'1',
122
+ __($value, 'shapepress-dsgvo'),
123
+ '',
124
+ '', false,'', $key);
125
+ }
126
+ ?>
127
+
128
+ <div id="container-other-cdn" class="form-table <?= checked(in_array('other', $selectedCdnProvider)) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
129
+
130
+ <label><?php _e('Other CDN Provider', 'shapepress-dsgvo') ?></label>
131
+ <small class="form-text text-muted"><?php _e('If you do not use any of the services proposed by us, you would need to complete the privacy policy for the service you use in this text box.', 'shapepress-dsgvo') ?></small>
132
+
133
+ <?php
134
+ $otherCdnProviderText = SPDSGVOSettings::get('page_basics_other_cdn_provider_text');
135
+ if (empty($otherCdnProviderText)) $otherCdnProviderText = SPDSGVOPageBasicsAction::getDefaultOtherText();
136
+ ?>
137
+ <?php wp_editor($otherCdnProviderText, 'otherCdnProviderText', array('textarea_rows' => '10', 'drag_drop_upload' => 'false', 'teeny' => true, 'media_buttons' => false)); ?>
138
+
139
+ </div>
140
+
141
+ </div>
142
+ <div class="form-group">
143
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
144
+ </div>
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- payment -->
150
+ <div class="card">
151
+ <div class="card-header">
152
+ <h4 class="card-title"><?php _e('Webshop/Check Out Process', 'shapepress-dsgvo') ?></h4>
153
+ </div>
154
+ <div class="card-body">
155
+ <div class="form">
156
+
157
+ <div class="position-relative">
158
+ <?php spDsgvoWritePremiumOverlayIfInvalid($hasValidLicense); ?>
159
+ <?php
160
+ $usePaymentProvider = SPDSGVOSettings::get('page_basics_use_payment_provider', '0');
161
+
162
+ spDsgvoWriteInput('switch', '', 'page_basics_use_payment_provider', $usePaymentProvider,
163
+ __('Use of Payment Provider', 'shapepress-dsgvo'),
164
+ '',
165
+ __('Enable, if you use payment provider in your online shop.','shapepress-dsgvo'));
166
+
167
+ ?>
168
+
169
+ <div class="form-group <?= $usePaymentProvider == 1 ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>" id="container-basics-use-payment-provider">
170
+ <label><?php _e('Payment Provider', 'shapepress-dsgvo') ?></label>
171
+ <?php
172
+
173
+ $selectedPaymentProvider = SPDSGVOSettings::get('page_basics_payment_provider');
174
+ if (empty($selectedPaymentProvider)) $selectedPaymentProvider = array();
175
+ foreach (SPDSGVOConstants::getPaymentProvider() as $key => $value)
176
+ {
177
+ $checked = in_array($key, $selectedPaymentProvider); // hack initial value
178
+ spDsgvoWriteInput('switch', 'page_basics_payment_provider_'.$key, 'page_basics_payment_provider[]',
179
+ $checked ? $key : $key.'1',
180
+ __($value, 'shapepress-dsgvo'),
181
+ '',
182
+ '', false,'', $key);
183
+ }
184
+ ?>
185
+
186
+
187
+ </div>
188
+ <div class="form-group">
189
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <!-- fonts -->
197
+ <div class="card">
198
+ <div class="card-header">
199
+ <h4 class="card-title"><?php _e('Fonts', 'shapepress-dsgvo') ?></h4>
200
+ </div>
201
+ <div class="card-body">
202
+ <div class="form" method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
203
+
204
+ <div class="form-group">
205
+ <small class="form-text text-muted"><?php _e('Specify which types of font frameworks/services are used. This information is required for the generation of a valid privacy policy.', 'shapepress-dsgvo') ?></small>
206
+
207
+ </div>
208
+ <div class="form-group">
209
+ <?php
210
+ $selectedFontProvider = SPDSGVOSettings::get('page_basics_font_provider');
211
+ if (empty($selectedFontProvider)) $selectedFontProvider = array();
212
+ foreach (SPDSGVOConstants::getFontServices() as $key => $value)
213
+ {
214
+ $checked = in_array($key, $selectedFontProvider); // hack initial value
215
+ spDsgvoWriteInput('switch', 'page_basics_font_provider_'.$key, 'page_basics_font_provider[]',
216
+ $checked ? $key : $key.'1',
217
+ $value,
218
+ '',
219
+ '', false,'', $key);
220
+ }
221
+ ?>
222
+ </div>
223
+ <div id="container-block-google-fonts" class="<?= checked('1', SPDSGVOSettings::get('page_basics_use_google_fonts')) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
224
+ <?php
225
+ spDsgvoWriteInput('switch', ''.$key, 'page_basics_block_google_fonts]', SPDSGVOSettings::get('page_basics_use_google_fonts'),
226
+ __('Block Google Fonts', 'shapepress-dsgvo'),
227
+ '',
228
+ __('Block Google Fonts until the visitor opted-in.', 'shapepress-dsgvo'));
229
+ ?>
230
+ </div>
231
+ <div class="form-group">
232
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
233
+ </div>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <!-- forms -->
239
+ <div class="card">
240
+ <div class="card-header">
241
+ <h4 class="card-title"><?php _e('Forms', 'shapepress-dsgvo') ?></h4>
242
+ </div>
243
+ <div class="card-body">
244
+ <div class="form">
245
+
246
+ <div class="form-group">
247
+ <small class="form-text text-muted"><?php _e('If your website use any kind of forms, check them to provide the texts in the privacy policy.', 'shapepress-dsgvo') ?></small>
248
+ </div>
249
+
250
+ <?php
251
+ spDsgvoWriteInput('switch', '', 'page_basics_forms_contact', SPDSGVOSettings::get('page_basics_forms_contact'),
252
+ __('Contact form', 'shapepress-dsgvo'),
253
+ '',
254
+ __('Enable if your website provides a contact form.', 'shapepress-dsgvo'));
255
+ ?>
256
+ <?php
257
+ spDsgvoWriteInput('switch', '', 'page_basics_forms_application', SPDSGVOSettings::get('page_basics_forms_application'),
258
+ __('Application form', 'shapepress-dsgvo'),
259
+ '',
260
+ __('Enable if your website provides a application form.', 'shapepress-dsgvo'));
261
+ ?>
262
+
263
+ <?php
264
+ spDsgvoWriteInput('switch', '', 'page_basics_forms_contest', SPDSGVOSettings::get('page_basics_forms_contest'),
265
+ __('Promotional contest or game form', 'shapepress-dsgvo'),
266
+ '',
267
+ __('Enable if your website provides a contest form.', 'shapepress-dsgvo'));
268
+ ?>
269
+
270
+ <?php
271
+ spDsgvoWriteInput('switch', '', 'page_basics_forms_registration', SPDSGVOSettings::get('page_basics_forms_registration'),
272
+ __('Registration/Sign up form', 'shapepress-dsgvo'),
273
+ '',
274
+ __('Enable if your website provides your visitors the possibility to sign up. Also during ordering process.', 'shapepress-dsgvo'));
275
+ ?>
276
+ <?php
277
+ spDsgvoWriteInput('switch', '', 'page_basics_forms_comments', SPDSGVOSettings::get('page_basics_forms_comments'),
278
+ __('Comments form', 'shapepress-dsgvo'),
279
+ '',
280
+ __('Enable if your visitor can comment your posts.', 'shapepress-dsgvo'));
281
+ ?>
282
+
283
+ <div class="container-basics-forms_comments <?= checked('1', SPDSGVOSettings::get('page_basics_forms_comments')) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
284
+
285
+ <div class="form-group">
286
+ <label><?php _e('Which personal data of the website visitor will be published in a commentary?', 'shapepress-dsgvo') ?></label>
287
+ <?php
288
+ spDsgvoWriteInput('radio', 'page_basics_forms_comments_name_comment', 'page_basics_forms_comments_publish_type',
289
+ SPDSGVOSettings::get('page_basics_forms_comments_publish_type'),
290
+ __('Name and comment', 'shapepress-dsgvo'),
291
+ '',
292
+ '', false, '', 'name_comment');
293
+ ?>
294
+ <?php
295
+ spDsgvoWriteInput('radio', 'page_basics_forms_comments_nick_comment', 'page_basics_forms_comments_publish_type',
296
+ SPDSGVOSettings::get('page_basics_forms_comments_publish_type'),
297
+ __('Nick and comment', 'shapepress-dsgvo'),
298
+ '',
299
+ '', false, '', 'nick_comment');
300
+ ?>
301
+
302
+ </div>
303
+ </div>
304
+
305
+ <div class="form-group">
306
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ <!-- security services -->
313
+ <div class="card">
314
+ <div class="card-header">
315
+ <h4 class="card-title"><?php _e('Captcha Services', 'shapepress-dsgvo') ?></h4>
316
+ </div>
317
+ <div class="card-body">
318
+ <div class="form">
319
+
320
+ <div class="form-group">
321
+ <small class="form-text text-muted"> <?php _e('Do you use Captcha services? E.g. as part of forms for preventing entries by bots?', 'shapepress-dsgvo') ?></small>
322
+ </div>
323
+
324
+ <div class="form-group">
325
+
326
+ <?php
327
+ $selectedSecurityProvider = SPDSGVOSettings::get('page_basics_security_provider');
328
+ if (empty($selectedSecurityProvider)) $selectedSecurityProvider = array();
329
+ foreach (SPDSGVOConstants::getSecurityServices() as $key => $value)
330
+ {
331
+ $checked = in_array($key, $selectedSecurityProvider); // hack initial value
332
+ spDsgvoWriteInput('switch', 'page_basics_security_provider_'.$key, 'page_basics_security_provider[]',
333
+ $checked ? $key : $key.'1',
334
+ $value,
335
+ '',
336
+ '', false,'', $key);
337
+ }
338
+ ?>
339
+
340
+ </div>
341
+
342
+ <div id="container-other-security" class="form-table <?= checked(in_array('other', $selectedSecurityProvider)) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
343
+
344
+ <div class="form-group">
345
+ <small class="text-muted form-text"><?php _e('Please complete those services that you have included in your website but are not listed in the list. The privacy policy of the respective service provider can be found on the website of the provider. In order to determine whether the US service provider Privacy Shield is certified, a query can be made in the list provided at this link: <a href="https://www.privacyshield.gov/list" target="_blank">https://www.privacyshield.gov/list</a>.', 'shapepress-dsgvo') ?></small>
346
+ </div>
347
+ <div class="form-group">
348
+ <?php
349
+ $otherSecurityProviderText = SPDSGVOSettings::get('page_basics_other_security_provider_text');
350
+ if (empty($otherSecurityProviderText)) $otherSecurityProviderText = SPDSGVOPageBasicsAction::getDefaultOtherText();
351
+ ?>
352
+ <?php wp_editor($otherSecurityProviderText, 'otherSecurityProviderText', array('textarea_rows' => '10', 'drag_drop_upload' => 'false', 'teeny' => true, 'media_buttons' => false)); ?>
353
+ </div>
354
+
355
+ </div>
356
+
357
+ <div class="form-group">
358
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
359
+ </div>
360
+ </div>
361
+ </div>
362
+ </div>
363
+
364
+ <!-- embeddings -->
365
+ <div class="card">
366
+ <div class="card-header">
367
+ <h4 class="card-title"><?php _e('Embeddings', 'shapepress-dsgvo') ?></h4>
368
+ </div>
369
+ <div class="card-body">
370
+ <div class="form" method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
371
+
372
+ <div class="form-group">
373
+ <small class="form-text text-muted"><?php _e('Specify which embeddings are used. This information is required for the generation of a valid privacy policy. Important: Opt-In functionality for these embeddings will come soon and is currently not supported.', 'shapepress-dsgvo') ?></small>
374
+
375
+ </div>
376
+ <div class="form-group">
377
+ <?php
378
+ $selectedEmbeddings = SPDSGVOSettings::get('page_basics_embeddings');
379
+ if (empty($selectedEmbeddings)) $selectedEmbeddings = array();
380
+ foreach (SPDSGVOConstants::getEmbeddingIntegrations() as $key => $value)
381
+ {
382
+ $checked = in_array($key, $selectedEmbeddings); // hack initial value
383
+ spDsgvoWriteInput('switch', 'page_basics_embeddings_'.$key, 'page_basics_embeddings[]',
384
+ $checked ? $key : $key.'1',
385
+ $value,
386
+ '',
387
+ '', false,'', $key);
388
+ }
389
+ ?>
390
+ </div>
391
+ <div id="container-block-google-fonts" class="<?= checked('1', SPDSGVOSettings::get('page_basics_use_google_fonts')) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
392
+ <?php
393
+ spDsgvoWriteInput('switch', ''.$key, 'page_basics_block_google_fonts]', SPDSGVOSettings::get('page_basics_use_google_fonts'),
394
+ __('Block Google Fonts', 'shapepress-dsgvo'),
395
+ '',
396
+ __('Block Google Fonts until the visitor opted-in.', 'shapepress-dsgvo'));
397
+ ?>
398
+ </div>
399
+ <div class="form-group">
400
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
401
+ </div>
402
+ </div>
403
+ </div>
404
+ </div>
405
+
406
+ <!-- newsletter service -->
407
+ <div class="card">
408
+ <div class="card-header">
409
+ <h4 class="card-title"><?php _e('Newsletter Services', 'shapepress-dsgvo') ?></h4>
410
+ </div>
411
+ <div class="card-body">
412
+ <div class="position-relative">
413
+ <?php spDsgvoWritePremiumOverlayIfInvalid($isPremium); ?>
414
+ <div class="form" method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
415
+
416
+ <?php
417
+ $useNewsletterProvider = SPDSGVOSettings::get('page_basics_use_newsletter_provider', '0');
418
+
419
+ spDsgvoWriteInput('switch', '', 'page_basics_use_newsletter_provider', $useNewsletterProvider,
420
+ __('Use of Newsletter Service', 'shapepress-dsgvo'),
421
+ '',
422
+ __('Enable, if you use newsletter provider/services. Important: Add a checkbox wherever you have your sign-up to the newsletter to request the users confirmation.','shapepress-dsgvo'));
423
+
424
+ ?>
425
+
426
+ <div id="container-basics-use-newsletter" <div class="<?= $useNewsletterProvider == 1 ? 'spdsgvo-d-block' : 'spdsgvo-d-none';?>">
427
+ <div class="form-group">
428
+ <?php
429
+ $selectedNewsletter = SPDSGVOSettings::get('page_basics_newsletter_provider');
430
+ if (empty($selectedNewsletter)) $selectedNewsletter = array();
431
+ foreach (SPDSGVOConstants::getNewsletterIntegrations() as $key => $value)
432
+ {
433
+ $checked = in_array($key, $selectedNewsletter); // hack initial value
434
+ spDsgvoWriteInput('switch', 'page_basics_newsletter_'.$key, 'page_basics_newsletter_provider[]',
435
+ $checked ? $key : $key.'1',
436
+ $value,
437
+ '',
438
+ '', false,'', $key);
439
+ }
440
+ ?>
441
+ </div>
442
+
443
+ <div id="container-other-newsletter" class="form-table <?= checked(in_array('other', $selectedNewsletter)) ? 'spdsgvo-d-block' : 'spdsgvo-d-none' ?>">
444
+
445
+ <div class="form-group">
446
+ <small class="text-muted form-text"><?php _e('Please complete those services that you have included in your website but are not listed in the list. The privacy policy of the respective service provider can be found on the website of the provider. In order to determine whether the US service provider Privacy Shield is certified, a query can be made in the list provided at this link: <a href="https://www.privacyshield.gov/list" target="_blank">https://www.privacyshield.gov/list</a>.', 'shapepress-dsgvo') ?></small>
447
+ </div>
448
+ <div class="form-group">
449
+ <?php
450
+ $otherNewsletterText = SPDSGVOSettings::get('page_basics_other_newsletter_provider_text');
451
+ if (empty($otherNewsletterText)) $otherNewsletterText = SPDSGVOPageBasicsAction::getDefaultOtherText();
452
+ ?>
453
+ <?php wp_editor($otherNewsletterText, 'page_basics_other_newsletter_provider_text', array('textarea_rows' => '10', 'drag_drop_upload' => 'false', 'teeny' => true, 'media_buttons' => false)); ?>
454
+ </div>
455
+
456
+ </div>
457
+ </div>
458
+ <div class="form-group">
459
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div>
465
+
466
+ </div>
467
+ </form>
admin/tabs/v3/popup-notice/class-sp-dsgvo-cookie-notice-action.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOCookieNoticeAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-cookie-notice';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+
12
+ SPDSGVOSettings::set('cookie_notice_display', $this->get('cookie_notice_display', 'none'));
13
+ SPDSGVOSettings::set('show_notice_on_close', $this->get('show_notice_on_close', '0'));
14
+ SPDSGVOSettings::set('force_cookie_info', $this->get('force_cookie_info', '0'));
15
+ SPDSGVOSettings::set('cookie_notice_text', $this->get('cookie_notice_text', ''));
16
+ SPDSGVOSettings::set('cn_cookie_validity', $this->get('cn_cookie_validity', '86400'));
17
+ SPDSGVOSettings::set('cookie_version', $this->get('cookie_version', ''));
18
+ SPDSGVOSettings::set('cn_position', $this->get('cn_position', 'bottom'));
19
+ SPDSGVOSettings::set('cn_animation', $this->get('cn_animation', 'none'));
20
+ SPDSGVOSettings::set('cn_size_text', $this->get('cn_size_text', 'auto'));
21
+ SPDSGVOSettings::set('popup_dark_mode', $this->get('popup_dark_mode', '0'));
22
+
23
+ SPDSGVOSettings::set('cn_show_dsgvo_icon', $this->get('cn_show_dsgvo_icon', '0'));
24
+
25
+
26
+ SPDSGVOSettings::set('cn_background_color', $this->get('cn_background_color', '#333333'));
27
+ SPDSGVOSettings::set('cn_text_color', $this->get('cn_text_color', '#ffffff'));
28
+ SPDSGVOSettings::set('cn_background_color_button', $this->get('cn_background_color_button', '#F3F3F3'));
29
+ SPDSGVOSettings::set('cn_text_color_button', $this->get('cn_text_color_button', '#333333'));
30
+ SPDSGVOSettings::set('cn_custom_css_container', $this->get('cn_custom_css_container', ''));
31
+ SPDSGVOSettings::set('cn_custom_css_text', $this->get('cn_custom_css_text', ''));
32
+ SPDSGVOSettings::set('cn_custom_css_buttons', $this->get('cn_custom_css_buttons', ''));
33
+
34
+
35
+ SPDSGVOSettings::set('cn_height_container', $this->get('cn_height_container', 'auto'));
36
+
37
+ SPDSGVOSettings::set('cn_use_overlay', $this->get('cn_use_overlay', '0'));
38
+
39
+
40
+ SPDSGVOSettings::set('logo_image_id', $this->get('logo_image_id', ''));
41
+ SPDSGVOSettings::set('cookie_style', $this->get('cookie_style', '00'));
42
+
43
+
44
+ SPDSGVOCacheManager::clearCaches();
45
+ $this->returnBack();
46
+ }
47
+ }
48
+
49
+ SPDSGVOCookieNoticeAction::listen();
admin/tabs/{cookie-notice → v3/popup-notice}/class-sp-dsgvo-cookie-notice-tab.php RENAMED
@@ -1,17 +1,17 @@
1
- <?php
2
-
3
- class SPDSGVOCookieNoticeTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Cookie Notice';
6
- public $slug = 'cookie-notice';
7
- public $isHidden = FALSE;
8
-
9
- public function __construct(){
10
-
11
- $this->title = __('Cookie Notice','shapepress-dsgvo');
12
- }
13
-
14
- public function page(){
15
- include plugin_dir_path(__FILE__) .'page.php';
16
- }
17
- }
1
+ <?php
2
+
3
+ class SPDSGVOCookieNoticeTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Cookie Notice / Popup';
6
+ public $slug = 'cookie-notice';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ //$this->title = __('Cookie Notice / Popup','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/popup-notice/page.php ADDED
@@ -0,0 +1,375 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
10
+ <input type="hidden" name="action" value="<?= SPDSGVOCookieNoticeAction::getActionName();?>">
11
+ <?php wp_nonce_field(SPDSGVOCookieNoticeAction::getActionName() . '-nonce'); ?>
12
+ <!-- notice/popup general -->
13
+ <div class="card">
14
+ <div class="card-header">
15
+ <h4 class="card-title"><?php _e('Common Settings Cookie Notice/Popup', 'shapepress-dsgvo') ?></h4>
16
+ </div>
17
+ <div class="card-body">
18
+ <div class="form">
19
+
20
+ <div class="form-group">
21
+ <label for="cookie_notice_display"><?php _e('Cookie Notice/Popup type', 'shapepress-dsgvo') ?></label>
22
+ <select class="form-control" id="cookie_notice_display" name="cookie_notice_display">
23
+ <option value="none" <?php if (SPDSGVOSettings::get('cookie_notice_display') == 'no_popup') {
24
+ echo 'selected';
25
+ } ?>><?php _e('No notice, no popup, no cookie selection.', 'shapepress-dsgvo') ?></option>
26
+ <option value="cookie_notice" <?php if (SPDSGVOSettings::get('cookie_notice_display') == 'cookie_notice') {
27
+ echo 'selected';
28
+ } ?>><?php _e('Cookie Notice', 'shapepress-dsgvo') ?></option>
29
+
30
+ <option value="policy_popup" <?php if (SPDSGVOSettings::get('cookie_notice_display') == 'policy_popup') {
31
+ echo 'selected';
32
+ } ?>><?php _e('Cookie Popup', 'shapepress-dsgvo') ?></option>
33
+ </select><!-- #cookie_notice_display -->
34
+ <small class="form-text text-muted"><?= __('Defines what the user gets shown when he visits the page. None means this feature is deactivated an no cookie selection can be made. You can show the popup again by giving any html element the class "sp-dsgvo-show-privacy-popup". If your visitor clicks on it, the popup gets shown again and the visitor can change his settings.', 'shapepress-dsgvo') ?></small>
35
+ </div>
36
+
37
+ <?php
38
+ spDsgvoWriteInput('toggle', '', 'show_notice_on_close', SPDSGVOSettings::get('show_notice_on_close'),
39
+ __('Show cookie notice when popup gets closed without choice', 'shapepress-dsgvo'),
40
+ '',
41
+ __('Show the cookie notice if the user does not make a choice because he closes the popup.', 'shapepress-dsgvo'));
42
+
43
+ ?>
44
+
45
+ <?php
46
+ spDsgvoWriteInput('toggle', '', 'force_cookie_info', SPDSGVOSettings::get('force_cookie_info'),
47
+ __('Show cookie notice/popup in any case (though not required)', 'shapepress-dsgvo'),
48
+ '',
49
+ __('Show the cookie notice/popup although it is not necessary because no integrations are used. Also show technically necessary integrations and integrations like matomo/piwik/WP Statistics,.. for which no opt-in by your user is required by GDPR. If you have not any integrations enabled, only the popup with an OK button will be shown.', 'shapepress-dsgvo'));
50
+
51
+ ?>
52
+
53
+ <div class="form-group">
54
+ <?php $cnCookieValidity = SPDSGVOSettings::get('cn_cookie_validity'); ?>
55
+ <label for="cn_cookie_validity"><?php _e('Cookie lifetime', 'shapepress-dsgvo') ?></label>
56
+ <select class="form-control" name="cn_cookie_validity" id="cn_cookie_validity">
57
+ <option value="86400" <?= selected($cnCookieValidity == 86400) ?>>1
58
+ <?php _e('Day', 'shapepress-dsgvo') ?></option>
59
+ <option value="604800" <?= selected($cnCookieValidity == 604800) ?>>1
60
+ <?php _e('Week', 'shapepress-dsgvo') ?></option>
61
+ <option value="2592000"
62
+ <?= selected($cnCookieValidity == 2592000) ?>>1 <?php _e('Month',
63
+ 'shapepress-dsgvo') ?></option>
64
+ <option value="7862400"
65
+ <?= selected($cnCookieValidity == 7862400) ?>>2 <?php _e('Month',
66
+ 'shapepress-dsgvo') ?></option>
67
+ <option value="15811200"
68
+ <?= selected($cnCookieValidity == 15811200) ?>>6 <?php _e('Month',
69
+ 'shapepress-dsgvo') ?></option>
70
+ <option value="31536000"
71
+ <?= selected($cnCookieValidity == 31536000) ?>>1 <?php _e('Year',
72
+ 'shapepress-dsgvo') ?></option>
73
+ </select>
74
+ <small class="form-text text-muted"><?php _e('For this period, the cookie gets stored. After this period your visitors have to make the cookie choice again.', 'shapepress-dsgvo') ?></small>
75
+ </div>
76
+
77
+
78
+
79
+ <?php
80
+ spDsgvoWriteInput('text', '', 'cookie_version', SPDSGVOSettings::get('cookie_version'),
81
+ __('Cookie version', 'shapepress-dsgvo'),
82
+ '',
83
+ '', true, '', '1', false);
84
+
85
+ ?>
86
+
87
+ <div class="form-group">
88
+ <input id="btnIncreaseCookieVersion" type="button" class="btn btn-outline-primary btn-block" value="<?php _e('Refresh/Update Cookie Version', 'shapepress-dsgvo') ?>" />
89
+ <small class="form-text text-muted"><?php _e('If you have made changes at your cookie settings (style, integrations,..) you can force your visitors to make a choice again when you increase the version.', 'shapepress-dsgvo') ?></small>
90
+ </div>
91
+
92
+ <div class="form-group">
93
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+
99
+ <! -- popup styling -->
100
+ <div class="card">
101
+ <div class="card-header">
102
+ <h4 class="card-title"><?php _e('Cookie Popup customization', 'shapepress-dsgvo') ?></h4>
103
+ </div>
104
+ <div class="card-body">
105
+ <div class="form">
106
+
107
+ <?php
108
+ spDsgvoWriteInput('toggle', '', 'popup_dark_mode', SPDSGVOSettings::get('popup_dark_mode'),
109
+ __('Enable Dark Mode of the popup', 'shapepress-dsgvo'),
110
+ '',
111
+ __('Shows the popup in dark colors.', 'shapepress-dsgvo'));
112
+
113
+ ?>
114
+
115
+
116
+ <?php
117
+ $src = '';
118
+ $img_id = '';
119
+ if (SPDSGVOSettings::get('logo_image_id', '') != '') {
120
+ $img_id = SPDSGVOSettings::get('logo_image_id');
121
+ $src = wp_get_attachment_url(intval($img_id));
122
+ }
123
+ if (empty($src)) $src= sp_dsgvo_URL . 'public/images/legalwebio-icon.png';
124
+ ?>
125
+ <div class="form-group dsgvo-image-upload">
126
+ <label><?php _e('Popup header logo', 'shapepress-dsgvo') ?></label>
127
+ <small class="form-text text-muted"><?php _e('We recommend to use a square image.', 'shapepress-dsgvo') ?></small>
128
+ <div class="image-preview-wrapper d-flex justify-content-center pb-2" >
129
+ <img id='logo_image-preview' class="image-preview mb-3" src='<?php echo $src; ?>'
130
+ style="height: 50px">
131
+ </div>
132
+ <div class="position-relative w-100">
133
+
134
+ <input id="logo_upload_image_button" type="button"
135
+ class="btn btn-secondary btn-block"
136
+ value="<?php _e('Upload image', 'shapepress-dsgvo'); ?>"/>
137
+ <input type='hidden' class="image-id" name='logo_image_id' id='logo_image_id'
138
+ value='<?php echo $img_id; ?>'>
139
+ </div>
140
+ </div><!-- .dsgvo-image-upload -->
141
+ <div class="form-group mt-5">
142
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
143
+ </div>
144
+ </div>
145
+ </div>
146
+ </div>
147
+
148
+ <! -- notice styling -->
149
+ <div class="card">
150
+ <div class="card-header">
151
+ <h4 class="card-title"><?php _e('Cookie Notice customization', 'shapepress-dsgvo') ?></h4>
152
+ </div>
153
+ <div class="card-body">
154
+ <div class="form">
155
+
156
+
157
+ <div class="position-relative">
158
+
159
+ <div class="form-group">
160
+ <label for="cookie_style"><?php _e('Cookie notice style', 'shapepress-dsgvo') ?></label>
161
+
162
+ <?php // todo: set names for styles, add default style?>
163
+ <?php $cnCookieStyle = SPDSGVOSettings::get('cookie_style'); ?>
164
+ <select class="form-control" id="cookie_style" name="cookie_style"
165
+ <?= $hasValidLicense == false ? 'disabled' : ''; ?>>
166
+ <option value="00" <?= selected($cnCookieStyle == '00') ?>><?php _e('Default', 'shapepress-dsgvo') ?></option>
167
+ <option value="01" <?= selected($cnCookieStyle == '01') ?>>1</option>
168
+ <option value="02" <?= selected($cnCookieStyle == '02') ?>>2</option>
169
+ <option value="03" <?= selected($cnCookieStyle == '03') ?>>3</option>
170
+ <option value="04" <?= selected($cnCookieStyle == '04') ?>>4</option>
171
+ <option value="05" <?= selected($cnCookieStyle == '05') ?>>5</option>
172
+ <option value="06" <?= selected($cnCookieStyle == '06') ?>>6</option>
173
+ <option value="07" <?= selected($cnCookieStyle == '07') ?>>7</option>
174
+ <option value="08" <?= selected($cnCookieStyle == '08') ?>>8</option>
175
+ <option value="09" <?= selected($cnCookieStyle == '09') ?>>9</option>
176
+ <option value="10" <?= selected($cnCookieStyle == '10') ?>>10</option>
177
+ <option value="11" <?= selected($cnCookieStyle == '11') ?>>11</option>
178
+ <option value="12" <?= selected($cnCookieStyle == '12') ?>>12</option>
179
+ <!--
180
+ <option value="13" <?= selected($cnCookieStyle == '13') ?>>13</option>
181
+ <option value="14" <?= selected($cnCookieStyle == '14') ?>>14</option>
182
+ -->
183
+ </select>
184
+ <small class="form-text text-muted"><?= __('Choose one of our cookie notice style templates.', 'shapepress-dsgvo') ?></small>
185
+
186
+ </div>
187
+
188
+ <div class="form-group">
189
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie1.png') ?>"
190
+ class="cookie-style-admin-show--01">
191
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie2.png') ?>"
192
+ class="cookie-style-admin-show--02">
193
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie3.png') ?>"
194
+ class="cookie-style-admin-show--03">
195
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie4.png') ?>"
196
+ class="cookie-style-admin-show--04">
197
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie5.png') ?>"
198
+ class="cookie-style-admin-show--05">
199
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie6.png') ?>"
200
+ class="cookie-style-admin-show--06">
201
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie7.png') ?>"
202
+ class="cookie-style-admin-show--07">
203
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie8.png') ?>"
204
+ class="cookie-style-admin-show--08">
205
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie9.png') ?>"
206
+ class="cookie-style-admin-show--09">
207
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie10.png') ?>"
208
+ class="cookie-style-admin-show--10">
209
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie11.png') ?>"
210
+ class="cookie-style-admin-show--11">
211
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie12.png') ?>"
212
+ class="cookie-style-admin-show--12">
213
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie13.png') ?>"
214
+ class="cookie-style-admin-show--13">
215
+ <img src="<?php echo SPDSGVO::pluginURI('admin\images\cookies\Cookie14.png') ?>"
216
+ class="cookie-style-admin-show--14">
217
+ </div>
218
+ </div>
219
+ <div class="form-group">
220
+ <?php
221
+ spDsgvoWriteInput('textarea', '', 'cookie_notice_text',
222
+ trim(SPDSGVOSettings::get('cookie_notice_text')),
223
+ __('Cookie Notice text', 'shapepress-dsgvo'),
224
+ __('A message text', 'shapepress-dsgvo'),
225
+ __('This text gets displayed within the cookie notice. If you use WPML you can translate these inputs via WPML String Translations.', 'shapepress-dsgvo'), false);
226
+ ?>
227
+ <small class="form-text text-warning"><?= __('Warning: If you change this text by your own you risk not be confirm with the GDPR.', 'shapepress-dsgvo')?></small>
228
+ </div>
229
+
230
+ <div class="form-group">
231
+ <?php $cnNoticePosition = SPDSGVOSettings::get('cn_position'); ?>
232
+ <label for="cn_position"><?php _e('Position:', 'shapepress-dsgvo') ?></label>
233
+ <select class="form-control" name="cn_position" id="cn_position">
234
+ <option value="top" <?= selected($cnNoticePosition == 'top') ?>><?php _e('On top',
235
+ 'shapepress-dsgvo') ?></option>
236
+ <option value="bottom"
237
+ <?= selected($cnNoticePosition == 'bottom') ?>><?php _e('Bottom',
238
+ 'shapepress-dsgvo') ?></option>
239
+ </select>
240
+ <small class="form-text text-muted"><?php _e('Specifies the location where the cookie notice should be displayed.', 'shapepress-dsgvo') ?></small>
241
+ </div>
242
+
243
+ <div class="form-group">
244
+ <?php $cnNoticeAnimation = SPDSGVOSettings::get('cn_animation'); ?>
245
+ <label for="cn_animation"><?php _e('Animation', 'shapepress-dsgvo') ?></label>
246
+ <select class="form-control" name="cn_animation" id="cn_animation">
247
+ <option value="none" <?= selected($cnNoticeAnimation == 'none') ?>><?php _e('None',
248
+ 'shapepress-dsgvo') ?></option>
249
+ <option value="fade"
250
+ <?= selected($cnNoticeAnimation == 'fade') ?>><?php _e('fade',
251
+ 'shapepress-dsgvo') ?></option>
252
+ <option value="hide"
253
+ <?= selected($cnNoticeAnimation == 'hide') ?>><?php _e('hide',
254
+ 'shapepress-dsgvo') ?></option>
255
+ </select>
256
+ <small class="form-text text-muted"><?php _e('Animation when accepting the cookie message.', 'shapepress-dsgvo') ?></small>
257
+ </div>
258
+
259
+ <div class="form-group">
260
+ <label for="cn_size_text"><?php _e('Font size', 'shapepress-dsgvo') ?></label>
261
+
262
+ <?php $cnSizeText = SPDSGVOSettings::get('cn_size_text'); ?>
263
+ <select class="form-control" name="cn_size_text"
264
+ id="cn_size_text">
265
+ <option value="inherit" <?= selected($cnSizeText == 'inherit') ?>><?php _e('Default',
266
+ 'shapepress-dsgvo') ?></option>
267
+ <option value="11px" <?= selected($cnSizeText == '11px') ?>>11px</option>
268
+ <option value="12px" <?= selected($cnSizeText == '12px') ?>>12px</option>
269
+ <option value="13px" <?= selected($cnSizeText == '13px') ?>>13px</option>
270
+ <option value="14px" <?= selected($cnSizeText == '14px') ?>>14px</option>
271
+ <option value="15px" <?= selected($cnSizeText == '15px') ?>>15px</option>
272
+ <option value="16px" <?= selected($cnSizeText == '16px') ?>>16px</option>
273
+ <option value="17px" <?= selected($cnSizeText == '17px') ?>>17px</option>
274
+ <option value="18px" <?= selected($cnSizeText == '18px') ?>>18px</option>
275
+ <option value="19px" <?= selected($cnSizeText == '19px') ?>>19px</option>
276
+ <option value="20px" <?= selected($cnSizeText == '20px') ?>>20px</option>
277
+ </select>
278
+ </div>
279
+ <div class="position-relative">
280
+
281
+
282
+ <div class="cn-customize-standard-notice-container <?= $cnCookieStyle == '00' ? 'spdsgvo-d-block': 'spdsgvo-d-none'?>">
283
+
284
+
285
+ <?php
286
+ spDsgvoWriteInput('color', '', 'cn_background_color', SPDSGVOSettings::get('cn_background_color'),
287
+ __('Background color', 'shapepress-dsgvo'),
288
+ '',
289
+ __('Specifies the background color of the cookie notice.', 'shapepress-dsgvo'));
290
+ ?>
291
+
292
+ <?php
293
+ spDsgvoWriteInput('color', '', 'cn_text_color', SPDSGVOSettings::get('cn_text_color'),
294
+ __('Text/Font color', 'shapepress-dsgvo'),
295
+ '',
296
+ __('Specifies the text/font color of the cookie notice text.', 'shapepress-dsgvo'));
297
+ ?>
298
+
299
+ <?php
300
+ spDsgvoWriteInput('color', '', 'cn_background_color_button', SPDSGVOSettings::get('cn_background_color_button'),
301
+ __('Button background color', 'shapepress-dsgvo'),
302
+ '',
303
+ __('Specifies the background color of the cookie notice button.', 'shapepress-dsgvo'));
304
+ ?>
305
+
306
+ <?php
307
+ spDsgvoWriteInput('color', '', 'cn_text_color_button', SPDSGVOSettings::get('cn_text_color_button'),
308
+ __('Button text/font color', 'shapepress-dsgvo'),
309
+ '',
310
+ __('Specifies the text/font color of the cookie notice button.', 'shapepress-dsgvo'));
311
+ ?>
312
+
313
+ <?php
314
+ spDsgvoWriteInput('text', '', 'cn_custom_css_container', SPDSGVOSettings::get('cn_custom_css_container'),
315
+ __('CSS class cookie notice', 'shapepress-dsgvo'),
316
+ __('.myClass1 .myClass2', 'shapepress-dsgvo'),
317
+ __('Specifies one or multiple additional classes for the cookie notice. Please specify them without leading "."', 'shapepress-dsgvo'));
318
+ ?>
319
+
320
+ <?php
321
+ spDsgvoWriteInput('text', '', 'cn_custom_css_text', SPDSGVOSettings::get('cn_custom_css_text'),
322
+ __('CSS class text', 'shapepress-dsgvo'),
323
+ __('.myClass1 .myClass2', 'shapepress-dsgvo'),
324
+ __('Specifies one or multiple additional classes for the text of cookie notice. Please specify them with leading "."', 'shapepress-dsgvo'));
325
+ ?>
326
+
327
+ <?php
328
+ spDsgvoWriteInput('text', '', 'cn_custom_css_buttons', SPDSGVOSettings::get('cn_custom_css_buttons'),
329
+ __('CSS class button', 'shapepress-dsgvo'),
330
+ __('.myClass1 .myClass2', 'shapepress-dsgvo'),
331
+ __('Specifies one or multiple additional classes for the button of cookie notice. Please specify them with leading "."', 'shapepress-dsgvo'));
332
+ ?>
333
+
334
+
335
+
336
+ <div class="form-group">
337
+ <label for="cn_height_container"><?php _e('Height of cookie notice', 'shapepress-dsgvo') ?></label>
338
+
339
+ <?php $cnHeightContainer = SPDSGVOSettings::get('cn_height_container'); ?>
340
+ <select class="form-control" name="cn_height_container"
341
+ id="cn_height_container">
342
+ <option value="auto" <?= selected($cnHeightContainer == 'auto') ?>><?php _e('Default',
343
+ 'shapepress-dsgvo') ?></option>
344
+ <option value="40px" <?= selected($cnHeightContainer == '40px') ?>>40px</option>
345
+ <option value="45px" <?= selected($cnHeightContainer == '45px') ?>>45px</option>
346
+ <option value="50px" <?= selected($cnHeightContainer == '50px') ?>>50px</option>
347
+ <option value="55px" <?= selected($cnHeightContainer == '55px') ?>>55px</option>
348
+ <option value="60px" <?= selected($cnHeightContainer == '60px') ?>>60px</option>
349
+ <option value="65px" <?= selected($cnHeightContainer == '65px') ?>>65px</option>
350
+ <option value="70px" <?= selected($cnHeightContainer == '70px') ?>>70px</option>
351
+ <option value="75px" <?= selected($cnHeightContainer == '75px') ?>>75px</option>
352
+ <option value="80px" <?= selected($cnHeightContainer == '80px') ?>>80px</option>
353
+ </select>
354
+ </div>
355
+
356
+ </div>
357
+ </div>
358
+
359
+
360
+ <div class="form-group cn-customize-standard-notice-container <?= $cnCookieStyle == '00' ? 'spdsgvo-d-block': 'spdsgvo-d-none'?>">
361
+ <?php
362
+ spDsgvoWriteInput('toggle', '', 'cn_show_dsgvo_icon', SPDSGVOSettings::get('cn_show_dsgvo_icon'),
363
+ __('Show WP DSGVO Tools (GDPR) icon', 'shapepress-dsgvo'),
364
+ '',
365
+ __('Displays the WP DSGVO Tools (GDPR) icon on the left side of the cookie notice.', 'shapepress-dsgvo'));
366
+ ?>
367
+ </div>
368
+ <div class="form-group">
369
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
370
+ </div>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </form>
375
+ </div>
admin/tabs/v3/stats/class-sp-dsgvo-stats-action.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOStatisticIntegrationAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-statistic-integrations';
6
+
7
+
8
+
9
+
10
+ protected function run(){
11
+ $this->checkCSRF();
12
+ $this->requireAdmin();
13
+
14
+
15
+ $this->returnBack();
16
+ }
17
+ }
18
+
19
+ SPDSGVOStatisticIntegrationAction::listen();
admin/tabs/v3/stats/class-sp-dsgvo-stats-tab.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOStatisticIntegrationsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Statistics';
6
+ public $slug = 'statistic-integrations';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ $this->title = __('Statistics','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/stats/page.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+
10
+
11
+
12
+
13
+ <?php
14
+ $integrations = SPDSGVOIntegration::getAllIntegrations(SPDSGVOConstants::CATEGORY_SLUG_STATISTICS, FALSE);
15
+
16
+ $integrationsMandatory = SPDSGVOIntegration::getAllIntegrations(SPDSGVOConstants::CATEGORY_SLUG_MANDATORY, FALSE);
17
+ foreach($integrationsMandatory as $key => $integration)
18
+ {
19
+ if ($integration->apiInstance->getCategory(true) == SPDSGVOConstants::CATEGORY_SLUG_STATISTICS)
20
+ {
21
+ $integrations[] = $integration;
22
+ }
23
+ }
24
+
25
+ uasort($integrations, function($a, $b) {
26
+ return $a->isPremium < $b->isPremium ? -1 : 1;
27
+ });
28
+
29
+ //sort_integrations_by_premium_and_name($integrations,array('isPremium', 'title'));
30
+ ?>
31
+ <?php if(count($integrations) === 0): ?>
32
+
33
+ <div class="card">
34
+ <div class="card-header"><?php _e('Information','shapepress-dsgvo')?></div>
35
+ <div class="card-body"><?php _e('No integrations installed','shapepress-dsgvo')?></div>
36
+ </div>
37
+ </div>
38
+
39
+ <?php else: ?>
40
+
41
+ <?php foreach($integrations as $key => $integration): ?>
42
+
43
+ <?php $integration->view() ?>
44
+
45
+ <?php endforeach; ?>
46
+ <?php endif; ?>
47
+
48
+ </div>
49
+
50
+
admin/tabs/v3/subject-access-request/class-sp-dsgvo-subject-access-request-action.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOAdminSubjectAccessRequestAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-subject-access-request';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+ if ($this->has('process') == false && $this->get('all') != '1')
12
+ {
13
+ $subform = $this->get('subform');
14
+ if (empty(($subform))) return;
15
+
16
+ if ($subform == 'common-settings')
17
+ {
18
+ SPDSGVOSettings::set('sar_cron', $this->get('sar_cron', '0'));
19
+ SPDSGVOSettings::set('sar_dsgvo_accepted_text', $this->get('sar_dsgvo_accepted_text', ''));
20
+ if($this->has('sar_page')){
21
+ SPDSGVOSettings::set('sar_page', $this->get('sar_page'));
22
+ }
23
+
24
+ } elseif ($subform == 'notification-settings')
25
+ {
26
+ if (isValidPremiumEdition())
27
+ {
28
+ SPDSGVOSettings::set('sar_email_notification', $this->get('sar_email_notification', '0'));
29
+ SPDSGVOSettings::set('sar_email_title', $this->get('sar_email_title', ''));
30
+ SPDSGVOSettings::set('sar_email_content', $this->get('sar_email_content', ''));
31
+ }
32
+ }
33
+
34
+ }
35
+
36
+ if($this->has('process')){
37
+ $ID = $this->get('process');
38
+ SPDSGVOSubjectAccessRequest::doByID($ID);
39
+ }
40
+
41
+ if($this->get('all') == '1'){
42
+ foreach(SPDSGVOSubjectAccessRequest::finder('pending') as $sar){
43
+ $sar->doSubjectAccessRequest();
44
+ }
45
+ }
46
+
47
+
48
+ $this->returnBack();
49
+ }
50
+ }
51
+
52
+ SPDSGVOAdminSubjectAccessRequestAction::listen();
admin/tabs/{subject-access-request → v3/subject-access-request}/class-sp-dsgvo-subject-access-request-tab.php RENAMED
@@ -1,16 +1,16 @@
1
- <?php
2
-
3
- class SPDSGVOSubjectAccessRequestTab extends SPDSGVOAdminTab{
4
-
5
- public $title ='Subject Access Request';
6
- public $slug = 'subject-access-request';
7
-
8
- public function __construct(){
9
-
10
- $this->title = __('Subject Access Request','shapepress-dsgvo');
11
- }
12
-
13
- public function page(){
14
- include plugin_dir_path(__FILE__) .'page.php';
15
- }
16
- }
1
+ <?php
2
+
3
+ class SPDSGVOSubjectAccessRequestTab extends SPDSGVOAdminTab{
4
+
5
+ public $title ='Subject Access Request';
6
+ public $slug = 'subject-access-request';
7
+
8
+ public function __construct(){
9
+
10
+ $this->title = __('Subject Access Request','shapepress-dsgvo');
11
+ }
12
+
13
+ public function page(){
14
+ include plugin_dir_path(__FILE__) .'page.php';
15
+ }
16
+ }
admin/tabs/v3/subject-access-request/page.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+
10
+ <!-- sar general -->
11
+ <div class="card">
12
+ <div class="card-header">
13
+ <h4 class="card-title"><?php _e('Common Settings', 'shapepress-dsgvo') ?></h4>
14
+ </div>
15
+ <div class="card-body">
16
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
17
+ <input type="hidden" name="action" value="<?= SPDSGVOAdminSubjectAccessRequestAction::getActionName(); ?>">
18
+ <input type="hidden" name="subform" value="common-settings" />
19
+ <?php wp_nonce_field(SPDSGVOAdminSubjectAccessRequestAction::getActionName() . '-nonce'); ?>
20
+
21
+ <div class="form-group">
22
+ <label for="sar_cron"><?php _e('Automatic processing', 'shapepress-dsgvo') ?></label>
23
+ <?php $sarCron = SPDSGVOSettings::get('sar_cron'); ?>
24
+ <select class="form-control" name="sar_cron" id="sar_cron">
25
+ <option value="0" <?= selected($sarCron === '0') ?>><?php _e('none', 'shapepress-dsgvo') ?></option>
26
+ <option value="1" <?= selected($sarCron === '1') ?>>
27
+ 1 <?php _e('day', 'shapepress-dsgvo') ?></option>
28
+ <option value="2" <?= selected($sarCron === '2') ?>>
29
+ 2 <?php _e('days', 'shapepress-dsgvo') ?></option>
30
+ <option value="3" <?= selected($sarCron === '3') ?>>
31
+ 3 <?php _e('days', 'shapepress-dsgvo') ?></option>
32
+ <option value="7" <?= selected($sarCron === '4') ?>>
33
+ 1 <?php _e('weeks', 'shapepress-dsgvo') ?></option>
34
+ </select>
35
+
36
+ <small class="form-text text-muted"><?php _e('Requests will be automatically processed after the set time and sent to the user.', 'shapepress-dsgvo') ?></small>
37
+ </div>
38
+
39
+ <?php
40
+ spDsgvoWriteInput('textarea', '', 'sar_dsgvo_accepted_text', SPDSGVOSettings::get('sar_dsgvo_accepted_text'),
41
+ __('GDPR consent text', 'shapepress-dsgvo'),
42
+ '',
43
+ __('The text which gets displayed during a SAR request.', 'shapepress-dsgvo'));
44
+ ?>
45
+
46
+ <div class="form-group">
47
+ <?php $sarPage = SPDSGVOSettings::get('sar_page'); ?>
48
+ <label for="sar_page"><?php _e('SAR request page', 'shapepress-dsgvo') ?></label>
49
+ <select class="form-control" name="sar_page" id="sar_page">
50
+ <option value="0"><?php _e('Select', 'shapepress-dsgvo'); ?></option>
51
+ <?php foreach (get_pages(array('number' => 0)) as $key => $page): ?>
52
+ <option <?= selected($sarPage == $page->ID) ?> value="<?= $page->ID ?>">
53
+ <?= $page->post_title ?>
54
+ </option>
55
+ <?php endforeach; ?>
56
+ </select>
57
+ <small class="form-text text-muted"><?php _e('Specifies the page on which users have the option to request their data extract.', 'shapepress-dsgvo') ?></small>
58
+
59
+
60
+ </div>
61
+ <div class="form-group">
62
+ <?php if ($sarPage == '0'): ?>
63
+ <small><?php _e('Create a page that uses the shortcode <code>[sar_form]</code>.', 'shapepress-dsgvo') ?>
64
+ <a class="btn btn-secondary btn-block"
65
+ href="<?= SPDSGVOCreatePageAction::url(array('sar' => '1')) ?>"><?php _e('Create page', 'shapepress-dsgvo') ?></a>
66
+ </small>
67
+ <?php elseif (!pageContainsString($sarPage, 'sar_form')): ?>
68
+ <small><?php _e('Attention: The shortcode <code>[sar_form]</code> was not found on the page you selected.', 'shapepress-dsgvo') ?>
69
+ <a class="btn btn-secondary btn-block"
70
+ href="<?= get_edit_post_link($sarPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
71
+ </small>
72
+ <?php else: ?>
73
+ <a class="btn btn-secondary btn-block"
74
+ href="<?= get_edit_post_link($sarPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
75
+ <?php endif; ?>
76
+ </div>
77
+
78
+ <div class="form-group">
79
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
80
+ </div>
81
+
82
+ </form>
83
+ </div>
84
+ </div>
85
+
86
+ <!-- notifaction settings -->
87
+ <div class="card">
88
+ <div class="card-header">
89
+ <h4 class="card-title"><?php _e('Notification settings', 'shapepress-dsgvo') ?></h4>
90
+ </div>
91
+ <div class="card-body">
92
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
93
+ <input type="hidden" name="action"
94
+ value="<?= SPDSGVOAdminSubjectAccessRequestAction::getActionName(); ?>">
95
+ <input type="hidden" name="subform" value="notification-settings" />
96
+ <?php wp_nonce_field(SPDSGVOAdminSubjectAccessRequestAction::getActionName() . '-nonce'); ?>
97
+
98
+ <div class="position-relative">
99
+ <?php spDsgvoWritePremiumOverlayIfInvalid($hasValidLicense); ?>
100
+
101
+ <?php
102
+ spDsgvoWriteInput('switch', '', 'sar_email_notification', SPDSGVOSettings::get('sar_email_notification'),
103
+ __('Email for new application', 'shapepress-dsgvo'),
104
+ '',
105
+ __('If enabled a notification by email gets send to the email of the admin.', 'shapepress-dsgvo'));
106
+ ?>
107
+
108
+ <?php
109
+
110
+
111
+ $title = !empty(SPDSGVOSettings::get('sar_email_title')) ? SPDSGVOSettings::get('sar_email_title') : __('Confirmation of delete request', 'shapepress-dsgvo');
112
+ $content = !empty(SPDSGVOSettings::get('sar_email_content')) ? SPDSGVOSettings::get('sar_email_content') : '';
113
+ ?>
114
+
115
+ <?php
116
+ spDsgvoWriteInput('text', '', 'sar_email_title', $title,
117
+ __('Title of the email', 'shapepress-dsgvo'),
118
+ '',
119
+ '');
120
+ ?>
121
+
122
+
123
+
124
+ <div class="form-group">
125
+ <label><?= __('Content of the email', 'shapepress-dsgvo')?></label>
126
+ <?php wp_editor($content, 'sar_email_content',
127
+ array('textarea_rows' => '10', 'drag_drop_upload' => 'false', 'teeny' => true, 'media_buttons' => false)); ?>
128
+ <small class="form-text text-muted"><?= __('Specify the email body. Use {{breakdown}} for data summary, {{count}} for amount of data, {{zip_link}} for URL to the data download and {{confirm_link}} for delete confirmation URL.','shapepress-dsgvo');?></small>
129
+ </div>
130
+
131
+ </div>
132
+
133
+ <div class="form-group">
134
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
135
+ </div>
136
+ </form>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ <div class="card col-12">
142
+ <div class="card-header">
143
+ <h4 class="card-title"><?php _e('Subject Access Requests', 'shapepress-dsgvo') ?></h4>
144
+ <small class="card-subtitle text-muted"><?php _e('This feature allows users to request a digest of all data stored by you. <br> All data in your database is checked for confidential data and sent to the User by email.', 'shapepress-dsgvo') ?></small>
145
+ </div>
146
+ <div class="card-body">
147
+ <?php $pending = SPDSGVOSubjectAccessRequest::finder('pending'); ?>
148
+ <table class="table table-hover table-striped " cellspacing="0">
149
+ <thead>
150
+ <tr>
151
+ <th id="request_id" class="manage-column column-request_id"
152
+ scope="col" style="width: 10%"><?php _e('ID', 'shapepress-dsgvo') ?></th>
153
+ <th id="email" class="manage-column column-email" scope="col"
154
+ style="width: 20%"><?php _e('Email', 'shapepress-dsgvo') ?></th>
155
+ <th id="first_name" class="manage-column column-first_name"
156
+ scope="col" style="width: 15%"><?php _e('First name', 'shapepress-dsgvo') ?></th>
157
+ <th id="last_name" class="manage-column column-last_name" scope="col"
158
+ style="width: 15%"><?php _e('Last name', 'shapepress-dsgvo') ?></th>
159
+ <th id="dsgvo_accepted" class="manage-column column-dsgvo_accepted" scope="col"
160
+ style="width: 15%"><?php _e('GDPR approval', 'shapepress-dsgvo') ?></th>
161
+ <th id="process" class="manage-column column-process" scope="col"
162
+ style="width: 15%"><?php _e('Run', 'shapepress-dsgvo') ?></th>
163
+ <!-- i592995 -->
164
+ <th id="dismiss" class="manage-column column-dismiss" scope="col"
165
+ style="width: 15%"><?php _e('Dismiss', 'shapepress-dsgvo') ?></th>
166
+ <!-- i592995 -->
167
+ </tr>
168
+ </thead>
169
+
170
+ <tbody>
171
+ <?php if (count($pending) !== 0): ?>
172
+ <?php foreach ($pending as $key => $pendingRequest): ?>
173
+
174
+ <tr class="<?= ($key % 2 == 0) ? 'alternate' : '' ?>">
175
+ <td class="column-request-id">
176
+ <?= $pendingRequest->ID ?>
177
+ </td>
178
+ <td class="column-email"><strong><?= $pendingRequest->email ?></strong>
179
+ </td>
180
+ <td class="column-integrations">
181
+ <?= $pendingRequest->first_name ?>
182
+ </td>
183
+ <td class="column-auto-deleting-on">
184
+ <?= $pendingRequest->last_name ?>
185
+ </td>
186
+ <td class="column-auto-deleting-on">
187
+ <?= $pendingRequest->dsgvo_accepted === '1' ? __('Yes', 'shapepress-dsgvo') : __('No', 'shapepress-dsgvo') ?>
188
+ </td>
189
+ <td class="column-unsubscribe-user"><a class="btn btn-outline-primary"
190
+ href="<?= wp_nonce_url(SPDSGVOAdminSubjectAccessRequestAction::url(array('process' => $pendingRequest->ID)),
191
+ SPDSGVOAdminSubjectAccessRequestAction::getActionName() . '-nonce') ?>"><?php _e('Run', 'shapepress-dsgvo'); ?></a>
192
+ </td>
193
+ <!-- i592995 -->
194
+ <td class="column-dismiss">
195
+ <svg class="unsubscribe-dismiss" width="10" height="10"
196
+ data-id="<?php echo $pendingRequest->ID; ?>">
197
+ <line x1="0" y1="0" x2="10" y2="10"/>
198
+ <line x1="0" y1="10" x2="10" y2="0"/>
199
+ </svg>
200
+ </td>
201
+ <!-- i592995 -->
202
+ </tr>
203
+
204
+ <?php endforeach; ?>
205
+ <?php else: ?>
206
+ <tr>
207
+ <td class="column-slug" colspan="5"><?php _e('No open requests', 'shapepress-dsgvo') ?></td>
208
+ <td class="column-default"></td>
209
+ <td class="column-reason"></td>
210
+ </tr>
211
+ <?php endif; ?>
212
+ </tbody>
213
+
214
+ <tfoot>
215
+ <tr>
216
+ <th class="manage-column column-request_id" scope="col"><?php _e('ID', 'shapepress-dsgvo') ?></th>
217
+ <th class="manage-column column-email" scope="col"><?php _e('Email', 'shapepress-dsgvo') ?></th>
218
+ <th class="manage-column column-first_name" scope="col"><?php _e('First name', 'shapepress-dsgvo') ?></th>
219
+ <th class="manage-column column-last_name" scope="col"><?php _e('Last name', 'shapepress-dsgvo') ?></th>
220
+ <th class="manage-column column-dsgvo_accepted"
221
+ scope="col"><?php _e('GDPR approval', 'shapepress-dsgvo') ?></th>
222
+ <th class="manage-column column-process" scope="col"><?php _e('Run', 'shapepress-dsgvo') ?></th>
223
+ <!-- i592995 -->
224
+ <th class="manage-column column-dismiss" scope="col"><?php _e('Dismiss', 'shapepress-dsgvo') ?></th>
225
+ <!-- i592995 -->
226
+ </tr>
227
+ </tfoot>
228
+ </table>
229
+
230
+ <?php if (count($pending) !== 0): ?>
231
+ <p>
232
+ <a class="button-primary"
233
+ href="<?= wp_nonce_url(SPDSGVOAdminSubjectAccessRequestAction::url(array('all' => '1')),
234
+ SPDSGVOAdminSubjectAccessRequestAction::getActionName() . '-nonce') ?>"><?php _e('Run all', 'shapepress-dsgvo') ?></a>
235
+ </p>
236
+ <?php endif; ?>
237
+ </div>
238
+ </div>
239
+
240
+ <div class="card-columns">
241
+ <div class="card">
242
+ <div class="card-header">
243
+ <h4 class="card-title"><?php _e('Add entry', 'shapepress-dsgvo') ?></h4>
244
+ </div>
245
+ <div class="card-body">
246
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
247
+ <input type="hidden" name="action"
248
+ value="<?= SPDSGVOSubjectAccessRequestAction::getActionName(); ?>"> <input
249
+ type="hidden" name="is_admin" value="1"> <br>
250
+ <?php wp_nonce_field(SPDSGVOSubjectAccessRequestAction::getActionName() . '-nonce'); ?>
251
+
252
+ <?php
253
+ spDsgvoWriteInput('text', '', 'email', '',
254
+ __('Email', 'shapepress-dsgvo'),
255
+ '',
256
+ '');
257
+ ?>
258
+
259
+ <?php
260
+ spDsgvoWriteInput('text', '', 'first_name', '',
261
+ __('First name', 'shapepress-dsgvo'),
262
+ '',
263
+ '');
264
+ ?>
265
+
266
+ <?php
267
+ spDsgvoWriteInput('text', '', 'last_name', '',
268
+ __('Last name', 'shapepress-dsgvo'),
269
+ '',
270
+ '');
271
+ ?>
272
+
273
+ <?php
274
+ spDsgvoWriteInput('switch', '', 'dsgvo_checkbox', '',
275
+ __('GDPR confirmation', 'shapepress-dsgvo'),
276
+ '',
277
+ '');
278
+ ?>
279
+
280
+ <?php
281
+ spDsgvoWriteInput('switch', '', 'process_now', '',
282
+ __('Run now', 'shapepress-dsgvo'),
283
+ '',
284
+ '');
285
+ ?>
286
+ <?php
287
+ spDsgvoWriteInput('switch', '', 'display_email', '',
288
+ __('Show email', 'shapepress-dsgvo'),
289
+ '',
290
+ '');
291
+ ?>
292
+ <div class="form-group">
293
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Add entry', 'shapepress-dsgvo');?>">
294
+ </div>
295
+ </form>
296
+ </div>
297
+ </div>
298
+ </div>
admin/tabs/{super-unsubscribe → v3/super-unsubscribe}/class-sp-dsgvo-dismiss-unsubscribe-action.php RENAMED
@@ -1,20 +1,16 @@
1
- <?php
2
- /* i592995 */
3
- Class SPDSGVODismissUnsubscribeAction extends SPDSGVOAjaxAction{
4
-
5
- protected $action = 'admin-dismiss-unsubscribe';
6
-
7
- protected function run(){
8
-
9
- //$this->checkCSRF();
10
- $this->requireAdmin();
11
-
12
- $id = $this->get('id');
13
- wp_delete_post($id);
14
- die();
15
- }
16
- }
17
-
18
- SPDSGVODismissUnsubscribeAction::listen();
19
-
20
- /* i592995 */
1
+ <?php
2
+ /* i592995 */
3
+ Class SPDSGVODismissUnsubscribeAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-dismiss-unsubscribe';
6
+
7
+ protected function run(){
8
+ $id = $this->get('id');
9
+ wp_delete_post($id);
10
+ die();
11
+ }
12
+ }
13
+
14
+ SPDSGVODismissUnsubscribeAction::listen();
15
+
16
+ /* i592995 */
 
 
 
 
admin/tabs/v3/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOSuperUnsubscribeAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-super-unsubscribe';
6
+
7
+ protected function run(){
8
+ $this->checkCSRF();
9
+ $this->requireAdmin();
10
+
11
+ if ($this->has('process') == false && $this->get('all') != '1')
12
+ {
13
+ $subform = $this->get('subform');
14
+ if (empty(($subform))) return;
15
+
16
+ if ($subform == 'common-settings')
17
+ {
18
+ SPDSGVOSettings::set('unsubscribe_auto_delete', $this->get('unsubscribe_auto_delete', '0'));
19
+ SPDSGVOSettings::set('su_auto_del_time', $this->get('su_auto_del_time', '0'));
20
+ SPDSGVOSettings::set('su_dsgvo_accepted_text', $this->get('su_dsgvo_accepted_text', ''));
21
+
22
+ // Set super_unsubscribe_page
23
+ if($this->has('super_unsubscribe_page')){
24
+ SPDSGVOSettings::set('super_unsubscribe_page', $this->get('super_unsubscribe_page'));
25
+ }
26
+
27
+ }elseif ($subform == 'notification-settings') {
28
+
29
+ if (isValidPremiumEdition())
30
+ {
31
+ SPDSGVOSettings::set('su_email_notification', $this->get('su_email_notification', '0'));
32
+ SPDSGVOSettings::set('su_email_title', $this->get('su_email_title', ''));
33
+ SPDSGVOSettings::set('su_email_content', $this->get('su_email_content', ''));
34
+ }
35
+ } elseif ($subform == 'integration-settings') {
36
+ if (isValidPremiumEdition())
37
+ {
38
+ SPDSGVOSettings::set('su_woo_data_action', $this->get('su_woo_data_action', 'ignore'));
39
+ SPDSGVOSettings::set('su_bbpress_data_action', $this->get('su_bbpress_data_action', 'ignore'));
40
+ SPDSGVOSettings::set('su_buddypress_data_action', $this->get('su_buddypress_data_action', 'ignore'));
41
+ SPDSGVOSettings::set('su_cf7_data_action', $this->get('su_cf7_data_action', 'ignore'));
42
+ }
43
+ }
44
+
45
+
46
+ // unsubscribe_auto_delete
47
+
48
+
49
+
50
+
51
+
52
+ }
53
+
54
+ // Unsubscribe single user
55
+ if($this->has('process')){
56
+ $unsubscriber = SPDSGVOUnsubscriber::find($this->get('process'));
57
+ if(isset($unsubscriber)){
58
+ $unsubscriber->doSuperUnsubscribe();
59
+ }
60
+ }
61
+
62
+
63
+ // Unsubscribe all
64
+ if($this->get('all') == '1'){
65
+ foreach(SPDSGVOUnsubscriber::all() as $unsubscriber){
66
+ $unsubscriber->doSuperUnsubscribe();
67
+ }
68
+ }
69
+
70
+
71
+ $this->returnBack();
72
+ }
73
+ }
74
+
75
+ SPDSGVOSuperUnsubscribeAction::listen();
admin/tabs/{super-unsubscribe → v3/super-unsubscribe}/class-sp-dsgvo-super-unsubscribe-tab.php RENAMED
@@ -1,15 +1,15 @@
1
- <?php
2
-
3
- class SPDSGVOSuperUnsubscribeTab extends SPDSGVOAdminTab{
4
-
5
- public $title = 'Delete request';
6
- public $slug = 'super-unsubscribe';
7
-
8
- public function __construct(){
9
- $this->title = __('Delete request','shapepress-dsgvo');
10
- }
11
-
12
- public function page(){
13
- include plugin_dir_path(__FILE__) .'page.php';
14
- }
15
- }
1
+ <?php
2
+
3
+ class SPDSGVOSuperUnsubscribeTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Delete request';
6
+ public $slug = 'super-unsubscribe';
7
+
8
+ public function __construct(){
9
+ $this->title = __('Delete request','shapepress-dsgvo');
10
+ }
11
+
12
+ public function page(){
13
+ include plugin_dir_path(__FILE__) .'page.php';
14
+ }
15
+ }
admin/tabs/v3/super-unsubscribe/page.php ADDED
@@ -0,0 +1,433 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+
10
+ <div class="card">
11
+ <div class="card-header">
12
+ <h4 class="card-title"><?php _e('Common Settings', 'shapepress-dsgvo') ?></h4>
13
+ </div>
14
+ <div class="card-body">
15
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
16
+ <input type="hidden" name="action" value="<?= SPDSGVOSuperUnsubscribeAction::getActionName(); ?>"> <input
17
+ type="hidden" name="CSRF" value="<?= sp_dsgvo_CSRF_TOKEN() ?>">
18
+ <input type="hidden" name="subform" value="common-settings" />
19
+ <?php wp_nonce_field(SPDSGVOSuperUnsubscribeAction::getActionName() . '-nonce'); ?>
20
+
21
+ <?php
22
+ spDsgvoWriteInput('switch', '', 'unsubscribe_auto_delete', SPDSGVOSettings::get('unsubscribe_auto_delete'),
23
+ __('Automatic processing on request', 'shapepress-dsgvo'),
24
+ '',
25
+ __('If enabled, delete requests are performed immediately.', 'shapepress-dsgvo'));
26
+ ?>
27
+
28
+ <div class="form-group">
29
+ <label for="sar_cron"><?php _e('After period', 'shapepress-dsgvo') ?></label>
30
+ <?php $suAutoDelTime = SPDSGVOSettings::get('su_auto_del_time'); ?>
31
+ <select class="form-control" name="su_auto_del_time" id="su_auto_del_time">
32
+ <option value="0" <?= selected($suAutoDelTime === '0') ?>><?php _e('none', 'shapepress-dsgvo') ?></option>
33
+ <option value="1m" <?= selected($suAutoDelTime === '1m') ?>>
34
+ 1 <?php _e('month', 'shapepress-dsgvo') ?></option>
35
+ <option value="3m" <?= selected($suAutoDelTime === '3m') ?>>
36
+ 3 <?php _e('months', 'shapepress-dsgvo') ?></option>
37
+ <option value="6m" <?= selected($suAutoDelTime === '6m') ?>>
38
+ 6 <?php _e('months', 'shapepress-dsgvo') ?></option>
39
+ <option value="1y" <?= selected($suAutoDelTime === '1y') ?>>
40
+ 1 <?php _e('year', 'shapepress-dsgvo') ?></option>
41
+ <option value="6y" <?= selected($suAutoDelTime === '6y') ?>>
42
+ 6 <?php _e('years', 'shapepress-dsgvo') ?></option>
43
+ <option value="7y" <?= selected($suAutoDelTime === '7y') ?>>
44
+ 7 <?php _e('years', 'shapepress-dsgvo') ?></option>
45
+ </select>
46
+
47
+ <small class="form-text text-muted"><?php _e('Data is automatically deleted after the set time. Ensures the maximum retention time.', 'shapepress-dsgvo') ?></small>
48
+ </div>
49
+
50
+ <?php
51
+ spDsgvoWriteInput('textarea', '', 'su_dsgvo_accepted_text', SPDSGVOSettings::get('su_dsgvo_accepted_text'),
52
+ __('Text on new application', 'shapepress-dsgvo'),
53
+ '',
54
+ __('The text which gets displayed during a delete request.', 'shapepress-dsgvo'));
55
+ ?>
56
+
57
+ <div class="form-group">
58
+ <?php $suPage = SPDSGVOSettings::get('super_unsubscribe_page');
59
+ if (isset($suPage) == false) $suPage = 0;
60
+ ?>
61
+ <label for="super_unsubscribe_page"><?php _e('Delete request page', 'shapepress-dsgvo') ?></label>
62
+ <select class="form-control" name="super_unsubscribe_page" id="super_unsubscribe_page">
63
+ <option value="0"><?php _e('Select', 'shapepress-dsgvo'); ?></option>
64
+ <?php foreach (get_pages(array('number' => 0)) as $key => $page): ?>
65
+ <option <?= selected($suPage == $page->ID) ?> value="<?= $page->ID ?>">
66
+ <?= $page->post_title ?>
67
+ </option>
68
+ <?php endforeach; ?>
69
+ </select>
70
+ <small class="form-text text-muted"><?php _e('Specifies the page on which users have the option to delete their data.', 'shapepress-dsgvo') ?></small>
71
+ </div>
72
+ <div class="form-group">
73
+ <?php if ($suPage == '0'): ?>
74
+ <small><?php _e('Create a page that uses the shortcode <code>[unsubscribe_form]</code>.', 'shapepress-dsgvo') ?>
75
+ <a class="btn btn-secondary btn-block"
76
+ href="<?= SPDSGVOCreatePageAction::url(array('super_unsubscribe_page' => '1')) ?>"><?php _e('Create page', 'shapepress-dsgvo') ?></a>
77
+ </small>
78
+ <?php elseif (!pageContainsString($suPage, 'unsubscribe_form')): ?>
79
+ <small><?php _e('Attention: The shortcode <code>[unsubscribe_form]</code> that should be on the selected page was not found. Thus, the user has no opportunity to ask a deletion request.', 'shapepress-dsgvo') ?>
80
+ <a class="btn btn-secondary btn-block"
81
+ href="<?= get_edit_post_link($suPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
82
+ </small>
83
+ <?php else: ?>
84
+ <a class="btn btn-secondary btn-block"
85
+ href="<?= get_edit_post_link($suPage) ?>"><?php _e('Edit page', 'shapepress-dsgvo') ?></a>
86
+ <?php endif; ?>
87
+ </div>
88
+
89
+ <div class="form-group">
90
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
91
+ </div>
92
+
93
+ </form>
94
+
95
+ </div>
96
+ </div>
97
+
98
+ <div class="card">
99
+ <div class="card-header">
100
+ <h4 class="card-title"><?php _e('Integrations', 'shapepress-dsgvo') ?></h4>
101
+ </div>
102
+ <div class="card-body">
103
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
104
+ <input type="hidden" name="action"
105
+ value="<?= SPDSGVOSuperUnsubscribeAction::getActionName(); ?>">
106
+ <input type="hidden" name="subform" value="integration-settings" />
107
+ <?php wp_nonce_field(SPDSGVOSuperUnsubscribeAction::getActionName() . '-nonce'); ?>
108
+
109
+ <div class="position-relative">
110
+ <?php spDsgvoWritePremiumOverlayIfInvalid($hasValidLicense); ?>
111
+
112
+ <div class="form-group">
113
+ <label for="su_woo_data_action"><?php _e('WooCommerce Data', 'shapepress-dsgvo') ?></label>
114
+ <?php $wooDataAction = SPDSGVOSettings::get('su_woo_data_action'); ?>
115
+ <select class="form-control" name="su_woo_data_action" id="su_woo_data_action">
116
+ <option value="ignore" <?= selected($wooDataAction === 'ignore') ?>><?php _e('No action', 'shapepress-dsgvo') ?></option>
117
+ <option value="pseudo" <?= selected($wooDataAction === 'pseudo') ?>><?php _e('Pseudonymise', 'shapepress-dsgvo') ?></option>
118
+ <option value="del" <?= selected($wooDataAction === 'del') ?>><?php _e('Delete', 'shapepress-dsgvo') ?></option>
119
+ </select>
120
+ <small class="form-text text-muted"><?php _e('Specifies what should happen to personal data of orders.', 'shapepress-dsgvo') ?></small>
121
+ </div>
122
+
123
+ <div class="form-group">
124
+ <label for="su_bbpress_data_action"><?php _e('bbPress Data', 'shapepress-dsgvo') ?></label>
125
+ <?php $bbPDataAction = SPDSGVOSettings::get('su_bbpress_data_action'); ?>
126
+ <select class="form-control" name="su_bbpress_data_action" id="su_bbpress_data_action">
127
+ <option value="ignore" <?= selected($bbPDataAction === 'ignore') ?>><?php _e('No action', 'shapepress-dsgvo') ?></option>
128
+ <option value="pseudo" <?= selected($bbPDataAction === 'pseudo') ?>><?php _e('Pseudonymise', 'shapepress-dsgvo') ?></option>
129
+ <option value="del" <?= selected($bbPDataAction === 'del') ?>><?php _e('Delete', 'shapepress-dsgvo') ?></option>
130
+ </select>
131
+ <small class="form-text text-muted"><?php _e('Specifies what should happen with forum entries.', 'shapepress-dsgvo') ?></small>
132
+ </div>
133
+
134
+ <div class="form-group">
135
+ <label for="su_buddypress_data_action"><?php _e('buddyPress Data', 'shapepress-dsgvo') ?></label>
136
+ <?php $buddyPressDataAction = SPDSGVOSettings::get('su_buddypress_data_action'); ?>
137
+ <select class="form-control" name="su_buddypress_data_action" id="su_buddypress_data_action">
138
+ <option value="ignore" <?= selected($buddyPressDataAction === 'ignore') ?>><?php _e('No action', 'shapepress-dsgvo') ?></option>
139
+ <option value="pseudo" <?= selected($buddyPressDataAction === 'pseudo') ?>><?php _e('Pseudonymise', 'shapepress-dsgvo') ?></option>
140
+ <option value="del" <?= selected($buddyPressDataAction === 'del') ?>><?php _e('Delete', 'shapepress-dsgvo') ?></option>
141
+ </select>
142
+ <small class="form-text text-muted"><?php _e('Specifies what should happen with forum entries.', 'shapepress-dsgvo') ?></small>
143
+ </div>
144
+
145
+ <div class="form-group">
146
+ <label for="su_cf7_data_action"><?php _e('CF7/Flamingo Data', 'shapepress-dsgvo') ?></label>
147
+ <?php $cf7DataAction = SPDSGVOSettings::get('su_cf7_data_action'); ?>
148
+ <select class="form-control" name="su_cf7_data_action" id="su_cf7_data_action">
149
+ <option value="ignore" <?= selected($cf7DataAction === 'ignore') ?>><?php _e('No action', 'shapepress-dsgvo') ?></option>
150
+ <option value="pseudo" <?= selected($cf7DataAction === 'pseudo') ?>><?php _e('Pseudonymise', 'shapepress-dsgvo') ?></option>
151
+ <option value="del" <?= selected($cf7DataAction === 'del') ?>><?php _e('Delete', 'shapepress-dsgvo') ?></option>
152
+ </select>
153
+ <small class="form-text text-muted"><?php _e('Specifies what to do with contact entries and messages.', 'shapepress-dsgvo') ?></small>
154
+ </div>
155
+
156
+ <div class="form-group">
157
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
158
+ </div>
159
+ </div>
160
+
161
+ </form>
162
+ </div>
163
+ </div>
164
+
165
+ <div class="card">
166
+ <div class="card-header">
167
+ <h4 class="card-title"><?php _e('Notification settings', 'shapepress-dsgvo') ?></h4>
168
+ </div>
169
+ <div class="card-body">
170
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
171
+ <input type="hidden" name="action"
172
+ value="<?= SPDSGVOSuperUnsubscribeAction::getActionName(); ?>">
173
+ <input type="hidden" name="subform" value="notification-settings" />
174
+ <?php wp_nonce_field(SPDSGVOSuperUnsubscribeAction::getActionName() . '-nonce'); ?>
175
+
176
+ <div class="position-relative">
177
+ <?php spDsgvoWritePremiumOverlayIfInvalid($hasValidLicense); ?>
178
+
179
+ <?php
180
+ spDsgvoWriteInput('switch', '', 'su_email_notification', SPDSGVOSettings::get('su_email_notification'),
181
+ __('Email for new application', 'shapepress-dsgvo'),
182
+ '',
183
+ __('If enabled a notification by email gets send to the email of the admin.', 'shapepress-dsgvo'));
184
+ ?>
185
+
186
+ <?php
187
+
188
+ wp_enqueue_editor();
189
+
190
+ $title = !empty(SPDSGVOSettings::get('su_email_title')) ? SPDSGVOSettings::get('su_email_title') : __('Confirmation of delete request', 'shapepress-dsgvo');
191
+ $content = !empty(SPDSGVOSettings::get('su_email_content')) ? SPDSGVOSettings::get('su_email_content') : '';
192
+ ?>
193
+
194
+ <?php
195
+ spDsgvoWriteInput('text', '', 'su_email_title', $title,
196
+ __('Title of the email', 'shapepress-dsgvo'),
197
+ '',
198
+ '');
199
+ ?>
200
+
201
+ <?php
202
+ spDsgvoWriteInput('textarea', '', 'su_email_content', $content,
203
+ __('Content of the email', 'shapepress-dsgvo'),
204
+ '',
205
+ __('Specify the delete request email body. Use {{confirm_link}} for confirmation URL and {{website} for website URL.','shapepress-dsgvo'));
206
+ ?>
207
+
208
+ </div>
209
+
210
+ <div class="form-group">
211
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Save changes', 'shapepress-dsgvo');?>">
212
+ </div>
213
+ </form>
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <?php
219
+ $statuses = array(
220
+ 'pending',
221
+ 'done'
222
+ );
223
+ if (isset($_GET['status']) && in_array($_GET['status'], $statuses)) {
224
+ $status = sanitize_text_field($_GET['status']);
225
+ } else {
226
+ $status = 'pending';
227
+ }
228
+ ?>
229
+
230
+ <div class="card col-12">
231
+ <div class="card-header">
232
+ <h4 class="card-title"><?php _e('Delete Requests', 'shapepress-dsgvo') ?></h4>
233
+ <small class="card-subtitle text-muted"><?php _e('Here you will find all deletion requests that users have made on their site. With a click on "delete now " you delete all stored data of the user on their side including Plugins.', 'shapepress-dsgvo') ?></small>
234
+ </div>
235
+ <div class="card-body">
236
+ <?php $confirmed = SPDSGVOUnsubscriber::finder('status', array('status' => $status)); ?>
237
+ <ul class="subsubsub">
238
+ <li>
239
+ <a
240
+ href="<?= SPDSGVO::adminURL(array('tab' => 'super-unsubscribe', 'status' => 'pending')) ?>"
241
+ class="<?= ($status === 'pending') ? 'current' : ''; ?>" aria-current="page">
242
+ <?php _e('Pending', 'shapepress-dsgvo') ?>
243
+ </a>
244
+ </li>
245
+ <li>
246
+ <a
247
+ href="<?= SPDSGVO::adminURL(array('tab' => 'super-unsubscribe', 'status' => 'done')) ?>"
248
+ class="<?= ($status === 'done') ? 'current' : ''; ?>" aria-current="page">
249
+ <?php _e('Done', 'shapepress-dsgvo') ?>
250
+ </a>
251
+ </li>
252
+ </ul>
253
+ <table class="table table-striped table-hover" cellspacing="0">
254
+ <thead>
255
+
256
+ <tr>
257
+ <th id="request_id" class="manage-column column-request_id"
258
+ scope="col" style="width: 10%"><?php _e('ID', 'shapepress-dsgvo') ?></th>
259
+ <th id="email" class="manage-column column-email" scope="col"
260
+ style="width: 20%"><?php _e('Email', 'shapepress-dsgvo') ?></th>
261
+ <th id="first_name" class="manage-column column-first_name"
262
+ scope="col" style="width: 15%"><?php _e('First name', 'shapepress-dsgvo') ?></th>
263
+ <th id="last_name" class="manage-column column-last_name" scope="col"
264
+ style="width: 15%"><?php _e('Last name', 'shapepress-dsgvo') ?></th>
265
+ <th id="dsgvo_accepted" class="manage-column column-dsgvo_accepted" scope="col"
266
+ style="width: 15%"><?php _e('GDPR approval', 'shapepress-dsgvo') ?></th>
267
+ <th id="status" class="manage-column column-status" scope="col"
268
+ style="width: 15%"><?php _e('State', 'shapepress-dsgvo') ?></th>
269
+ <th id="process" class="manage-column column-process" scope="col"
270
+ style="width: 15%"><?php _e('Delete now', 'shapepress-dsgvo') ?></th>
271
+ <!-- .i592995 -->
272
+ <th id="dismiss" class="manage-column column-dismiss" scope="col"
273
+ style="width: 15%"><?php _e('Dismiss', 'shapepress-dsgvo') ?></th>
274
+ <!-- .i592995 -->
275
+ </tr>
276
+ </thead>
277
+
278
+ <tbody>
279
+ <?php if (count($confirmed) !== 0): ?>
280
+ <?php foreach ($confirmed as $key => $confirmedRequest): ?>
281
+
282
+ <tr class="<?= ($key % 2 == 0) ? 'alternate' : '' ?>">
283
+ <td class="column-request-id">
284
+ <span class="wpk-services-table-name"><?php _e('ID', 'shapepress-dsgvo') ?></span>
285
+ <?= $confirmedRequest->ID ?>
286
+ </td>
287
+ <td class="column-email">
288
+ <span class="wpk-services-table-name"><?php _e('Email', 'shapepress-dsgvo') ?></span>
289
+ <strong><?= $confirmedRequest->email ?></strong>
290
+ </td>
291
+ <td class="column-integrations">
292
+ <span class="wpk-services-table-name"><?php _e('First name', 'shapepress-dsgvo') ?></span>
293
+ <?= $confirmedRequest->first_name ?>
294
+ </td>
295
+ <td class="column-auto-deleting-on">
296
+ <span class="wpk-services-table-name"><?php _e('Last name', 'shapepress-dsgvo') ?></span>
297
+ <?= $confirmedRequest->last_name ?>
298
+ </td>
299
+ <td class="column-auto-deleting-on">
300
+ <span class="wpk-services-table-name"><?php _e('GDPR approval', 'shapepress-dsgvo') ?></span>
301
+ <?= $confirmedRequest->dsgvo_accepted === '1' ? _e('Yes', 'shapepress-dsgvo') : _e('No', 'shapepress-dsgvo') ?>
302
+ </td>
303
+ <td class="column-auto-deleting-on">
304
+ <span class="wpk-services-table-name"><?php _e('State', 'shapepress-dsgvo') ?></span>
305
+ <?= ucfirst($confirmedRequest->status) ?>
306
+ </td>
307
+ <td class="column-unsubscribe-user">
308
+ <span class="wpk-services-table-name"><?php _e('Delete now', 'shapepress-dsgvo') ?></span>
309
+ <?php if ($status == 'done'): ?>
310
+ <a class="button-primary disabled" href="#"><?php _e('Delete', 'shapepress-dsgvo') ?></a>
311
+ <?php else: ?>
312
+ <a class="button-primary"
313
+ href="<?= wp_nonce_url(SPDSGVOSuperUnsubscribeAction::url(array('process' => $confirmedRequest->ID)),
314
+ SPDSGVOSuperUnsubscribeAction::getActionName() . '-nonce') ?>"><?php _e('Delete now', 'shapepress-dsgvo') ?></a>
315
+ <?php endif; ?>
316
+ </td>
317
+ <!-- .i592995 -->
318
+ <td class="column-dismiss">
319
+ <span class="wpk-services-table-name"><?php _e('Dismiss', 'shapepress-dsgvo') ?></span>
320
+ <svg class="unsubscribe-dismiss" width="10" height="10"
321
+ data-id="<?php echo $confirmedRequest->ID; ?>">
322
+ <line x1="0" y1="0" x2="10" y2="10"/>
323
+ <line x1="0" y1="10" x2="10" y2="0"/>
324
+ </svg>
325
+ </td>
326
+ <!-- .i592995 -->
327
+ </tr>
328
+
329
+ <?php endforeach; ?>
330
+ <?php else: ?>
331
+ <tr>
332
+ <td class="column-slug" colspan="6">
333
+ <?php if ($status == 'done'): ?>
334
+ <?php _e('No requests done', 'shapepress-dsgvo') ?>
335
+ <?php else: ?>
336
+ <?php _e('No pending requests', 'shapepress-dsgvo') ?>
337
+ <?php endif; ?>
338
+ </td>
339
+ <td class="column-default"></td>
340
+ <td class="column-reason"></td>
341
+ </tr>
342
+ <?php endif; ?>
343
+ </tbody>
344
+
345
+ <tfoot>
346
+ <tr>
347
+ <th class="manage-column column-request_id" scope="col"><?php _e('ID', 'shapepress-dsgvo') ?></th>
348
+ <th class="manage-column column-email" scope="col"><?php _e('Email', 'shapepress-dsgvo') ?></th>
349
+ <th class="manage-column column-first_name" scope="col"><?php _e('First name', 'shapepress-dsgvo') ?></th>
350
+ <th class="manage-column column-last_name" scope="col"><?php _e('Last name', 'shapepress-dsgvo') ?></th>
351
+ <th class="manage-column column-dsgvo_accepted"
352
+ scope="col"><?php _e('GDPR approval', 'shapepress-dsgvo') ?></th>
353
+ <th class="manage-column column-status" scope="col"><?php _e('State', 'shapepress-dsgvo') ?></th>
354
+ <th class="manage-column column-process" scope="col"><?php _e('Delete now', 'shapepress-dsgvo') ?></th>
355
+ <!-- .i592995 -->
356
+ <th class="manage-column column-dismiss" scope="col"><?php _e('Dismiss', 'shapepress-dsgvo') ?></th>
357
+ <!-- .i592995 -->
358
+ </tr>
359
+ </tfoot>
360
+ </table>
361
+
362
+ <?php if (isset($pending) && count($pending) !== 0): ?>
363
+ <p>
364
+ <a class="button-primary"
365
+ href="<?= wp_nonce_url(SPDSGVOSuperUnsubscribeAction::url(array('all' => '1')),
366
+ SPDSGVOSuperUnsubscribeAction::getActionName() . '-nonce') ?>"><?php _e('Delete all', 'shapepress-dsgvo') ?></a>
367
+ </p>
368
+ <?php endif; ?>
369
+ </div>
370
+ </div>
371
+
372
+
373
+
374
+ <div class="card-columns">
375
+ <div class="card">
376
+ <div class="card-header">
377
+ <h4 class="card-title"><?php _e('Add entry', 'shapepress-dsgvo') ?></h4>
378
+ <small class="card-subtitle text-danger"><?php _e('ATTENTION: Executing this action deletes the account (except administrators).', 'shapepress-dsgvo') ?></small>
379
+ </div>
380
+ <div class="card-body">
381
+ <form method="post" action="<?= admin_url('/admin-ajax.php'); ?>">
382
+ <input type="hidden" name="action"
383
+ value="<?= SPDSGVOSuperUnsubscribeFormAction::getActionName(); ?>"> <input
384
+ type="hidden" name="is_admin" value="1"> <br>
385
+ <?php wp_nonce_field(SPDSGVOSuperUnsubscribeFormAction::getActionName() . '-nonce'); ?>
386
+
387
+ <?php
388
+ spDsgvoWriteInput('text', '', 'email', '',
389
+ __('Email', 'shapepress-dsgvo'),
390
+ '',
391
+ '');
392
+ ?>
393
+
394
+ <?php
395
+ spDsgvoWriteInput('text', '', 'first_name', '',
396
+ __('First name', 'shapepress-dsgvo'),
397
+ '',
398
+ '');
399
+ ?>
400
+
401
+ <?php
402
+ spDsgvoWriteInput('text', '', 'last_name', '',
403
+ __('Last name', 'shapepress-dsgvo'),
404
+ '',
405
+ '');
406
+ ?>
407
+
408
+ <?php
409
+ spDsgvoWriteInput('switch', '', 'dsgvo_checkbox', '',
410
+ __('GDPR confirmation', 'shapepress-dsgvo'),
411
+ '',
412
+ '');
413
+ ?>
414
+
415
+ <?php
416
+ spDsgvoWriteInput('switch', '', 'process_now', '',
417
+ __('Run without user confirmation', 'shapepress-dsgvo'),
418
+ '',
419
+ '');
420
+ ?>
421
+ <?php
422
+ spDsgvoWriteInput('switch', '', 'display_email', '',
423
+ __('Show email', 'shapepress-dsgvo'),
424
+ '',
425
+ '');
426
+ ?>
427
+ <div class="form-group">
428
+ <input type="submit" class="btn btn-primary btn-block" value="<?= _e('Add entry', 'shapepress-dsgvo');?>">
429
+ </div>
430
+ </form>
431
+ </div>
432
+ </div>
433
+ </div>
admin/tabs/v3/targeting/class-sp-dsgvo-targeting-action.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class SPDSGVOTargetingIntegrationAction extends SPDSGVOAjaxAction{
4
+
5
+ protected $action = 'admin-targeting-integrations';
6
+
7
+
8
+
9
+
10
+ protected function run(){
11
+ $this->checkCSRF();
12
+ $this->requireAdmin();
13
+
14
+
15
+ $this->returnBack();
16
+ }
17
+ }
18
+
19
+ SPDSGVOTargetingIntegrationAction::listen();
admin/tabs/v3/targeting/class-sp-dsgvo-targeting-tab.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOTargetingIntegrationsTab extends SPDSGVOAdminTab{
4
+
5
+ public $title = 'Targeting';
6
+ public $slug = 'targeting-integrations';
7
+ public $isHidden = FALSE;
8
+
9
+ public function __construct(){
10
+
11
+ $this->title = __('Targeting','shapepress-dsgvo');
12
+ }
13
+
14
+ public function page(){
15
+ include plugin_dir_path(__FILE__) .'page.php';
16
+ }
17
+ }
admin/tabs/v3/targeting/page.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $isPremium = isValidPremiumEdition();
3
+ $isBlog = isValidBlogEdition();
4
+ $hasValidLicense = isValidPremiumEdition() || isValidBlogEdition();
5
+
6
+ ?>
7
+
8
+ <div class="card-columns">
9
+
10
+
11
+
12
+
13
+ <?php
14
+ $integrations = SPDSGVOIntegration::getAllIntegrations(SPDSGVOConstants::CATEGORY_SLUG_TARGETING, FALSE);
15
+ ?>
16
+ <?php if(count($integrations) === 0): ?>
17
+
18
+ <div class="card">
19
+ <div class="card-header"><?php _e('Information','shapepress-dsgvo')?></div>
20
+ <div class="card-body"><?php _e('No integrations installed','shapepress-dsgvo')?></div>
21
+ </div>
22
+ </div>
23
+
24
+ <?php else: ?>
25
+
26
+ <?php foreach($integrations as $key => $integration): ?>
27
+
28
+ <?php $integration->view() ?>
29
+
30
+ <?php endforeach; ?>
31
+ <?php endif; ?>
32
+
33
+ </div>
34
+
imprint.txt DELETED
@@ -1,18 +0,0 @@
1
- [company_name]
2
- Inhaber: [company_owner]
3
- [adress_street]
4
- [adress_zip_location]
5
-
6
- Gesch&auml;ftsf&uuml;hrung: [company_law_person]
7
- Gesellschafter: [company_management]
8
-
9
- Telefonnummer: [comm_phone]
10
- E-Mailadresse: [comm_email]
11
-
12
- Registergericht &amp; Registernummer: [company_register_court], [company_register_nr]
13
-
14
- Umsatzsteuer-Identifikationsnummer: [company_uid]
15
-
16
- Inhaltlich verantwortlich: [content_responsible]
17
-
18
- Plattform der Europ&auml;ischen Kommission zur Online-Streitbeilegung (OS) f&uuml;r Verbraucher: <a href"https://ec.europa.eu/consumers/odr/" target="_blank">https://ec.europa.eu/consumers/odr/</a>. Wir sind nicht bereit und nicht verpflichtet an einem Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-sp-dsgvo-activator.php CHANGED
@@ -1,35 +1,35 @@
1
- <?php
2
-
3
- /**
4
- * Fired during plugin activation
5
- *
6
- * @link http://example.com
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Fired during plugin activation.
15
- *
16
- * This class defines all code necessary to run during the plugin's activation.
17
- *
18
- * @since 1.0.0
19
- * @package WP DSGVO Tools
20
- * @subpackage WP DSGVO Tools/includes
21
- * @author Shapepress eU
22
- */
23
- class SPDSGVOActivator {
24
-
25
- /**
26
- * Short Description. (use period)
27
- *
28
- * Long Description.
29
- *
30
- * @since 1.0.0
31
- */
32
- public static function activate() {
33
-
34
- }
35
- }
1
+ <?php
2
+
3
+ /**
4
+ * Fired during plugin activation
5
+ *
6
+ * @link http://example.com
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Fired during plugin activation.
15
+ *
16
+ * This class defines all code necessary to run during the plugin's activation.
17
+ *
18
+ * @since 1.0.0
19
+ * @package WP DSGVO Tools
20
+ * @subpackage WP DSGVO Tools/includes
21
+ * @author Shapepress eU
22
+ */
23
+ class SPDSGVOActivator {
24
+
25
+ /**
26
+ * Short Description. (use period)
27
+ *
28
+ * Long Description.
29
+ *
30
+ * @since 1.0.0
31
+ */
32
+ public static function activate() {
33
+
34
+ }
35
+ }
includes/class-sp-dsgvo-ajax-action.php CHANGED
@@ -1,240 +1,220 @@
1
- <?php
2
-
3
- /**
4
- * The file that defines the core plugin class
5
- *
6
- * A class definition that includes attributes and functions used across both the
7
- * public-facing side of the site and the admin area.
8
- *
9
- * @link https://wp-dsgvo.eu
10
- * @since 1.0.0
11
- *
12
- * @package WP DSGVO Tools
13
- * @subpackage WP DSGVO Tools/includes
14
- */
15
-
16
- /**
17
- * The core plugin class.
18
- *
19
- * This is used to define internationalization, admin-specific hooks, and
20
- * public-facing site hooks.
21
- *
22
- * Also maintains the unique identifier of this plugin as well as the current
23
- * version of the plugin.
24
- *
25
- * @since 1.0.0
26
- * @package WP DSGVO Tools
27
- * @subpackage WP DSGVO Tools/includes
28
- * @author Shapepress eU
29
- */
30
- abstract class SPDSGVOAjaxAction{
31
-
32
- protected $action;
33
- public $request;
34
- public $user;
35
-
36
- abstract protected function run();
37
-
38
- public function __construct(){
39
- $this->request = $_REQUEST;
40
- if($this->isLoggedIn()){
41
- $this->user = wp_get_current_user();
42
- }
43
- }
44
-
45
- public static function boot(){
46
- $class = self::getClassName();
47
- $action = new $class;
48
- $action->run();
49
-
50
- if($action->has('href')){
51
- wp_redirect($action->get('href'));
52
- }else{
53
- if(isset($_SERVER['HTTP_REFERER'])) {
54
- header('Location: '. $_SERVER['HTTP_REFERER']);
55
- }
56
- else
57
- {
58
- //it was not sent, perform your default actions here
59
- }
60
-
61
- }
62
-
63
- die;
64
- }
65
-
66
- public static function listen($public = TRUE){
67
- $actionName = self::getActionName();
68
- $className = self::getClassName();
69
- add_action("wp_ajax_{$actionName}", array($className, 'boot'));
70
-
71
- if($public){
72
- add_action("wp_ajax_nopriv_{$actionName}", array($className, 'boot'));
73
- }
74
- }
75
-
76
-
77
- // -----------------------------------------------------
78
- // UTILITY METHODS
79
- // -----------------------------------------------------
80
- public static function getClassName(){
81
- return get_called_class();
82
- }
83
-
84
- public static function formURL(){
85
- return admin_url('/admin-ajax.php');
86
- }
87
-
88
- public static function getActionName(){
89
- $class = self::getClassName();
90
- $reflection = new ReflectionClass($class);
91
- $action = $reflection->newInstanceWithoutConstructor();
92
- if(!isset($action->action)){
93
- throw new Exception(__("Public property \$action not provied", 'shapepress-dsgvo'));
94
- }
95
- return $action->action;
96
- }
97
-
98
- public function requireAdmin(){
99
- if(!current_user_can('administrator')){
100
- echo '0';
101
- die;
102
- }
103
- }
104
-
105
- public function checkCSRF(){
106
-
107
- $actionName = self::getActionName().'-nonce';
108
- $submittedNonce = $_REQUEST['_wpnonce'];
109
-
110
- if ( wp_verify_nonce( $submittedNonce, $actionName ) ) {
111
- return TRUE;
112
- } else
113
- {
114
- echo 'CSRF ERROR: Nonce not valid';
115
- die;
116
- //return FALSE;
117
- }
118
- /*
119
- if(!$this->has('CSRF')){
120
- echo '1. CSRF ERROR';
121
- die;
122
- }
123
-
124
- if(!$this->user instanceof WP_User){
125
- echo '2. CSRF ERROR';
126
- die;
127
- }
128
-
129
- if($this->get('CSRF', '') !== get_user_meta($this->user->ID, 'sp_dsgvo_CSRF_token', TRUE)){
130
- echo '3. CSRF ERROR';
131
- die;
132
- }
133
-
134
-
135
- update_user_meta($this->user->ID, 'sp_dsgvo_CSRF_token', wp_generate_password(20, FALSE, FALSE));
136
-
137
- return TRUE;
138
- */
139
- }
140
-
141
- public function error($message){
142
- echo $message;
143
- die();
144
- }
145
-
146
-
147
- // -----------------------------------------------------
148
- // JSONResponse
149
- // -----------------------------------------------------
150
- public function JSONResponse($response){
151
- wp_send_json($response);
152
- }
153
-
154
-
155
- // -----------------------------------------------------
156
- // Helpers
157
- // -----------------------------------------------------
158
- public static function ajaxURL(){
159
- ?>
160
- <script type="text/javascript">
161
- var ajaxurl = '<?php echo admin_url('/admin-ajax.php'); ?>';
162
- </script>
163
- <?php
164
- }
165
-
166
- public static function WP_HeadAjaxURL(){
167
- add_action('wp_head', array('WP_AJAX', 'ajaxURL'));
168
- }
169
-
170
- public static function url($params = array()){
171
- $params = http_build_query(array_merge(array(
172
- 'action' => (new static())->action,
173
- ), $params));
174
-
175
- return admin_url('/admin-ajax.php') .'?'. $params;
176
- }
177
-
178
- public function isLoggedIn(){
179
- return is_user_logged_in();
180
- }
181
-
182
- public function has($key){
183
- if(isset($this->request[$key])){
184
- return TRUE;
185
- }
186
- return FALSE;
187
- }
188
-
189
- /**
190
- * Get parameter from $_REQUEST array
191
- * @param string $key key
192
- * @param string $default default string
193
- * @return mixed
194
- */
195
- public function get($key, $default = NULL, $stripslashes = TRUE){
196
- if($this->has($key)){
197
-
198
- if(is_array($this->request[$key])){
199
- return $this->request[$key];
200
- }
201
-
202
- if($stripslashes){
203
- return stripslashes($this->request[$key]);
204
- }
205
-
206
- return $this->request[$key];
207
- }
208
- return $default;
209
- }
210
-
211
- public function returnBack(){
212
- if(isset($_SERVER['HTTP_REFERER'])){
213
- header('Location: '. $_SERVER['HTTP_REFERER']);
214
- die();
215
- }
216
-
217
- return FALSE;
218
- }
219
-
220
- public function returnRedirect($url, $params = array()){
221
- $url .= '?'. http_build_query($params);
222
- header('Location: '. $url);
223
- die();
224
- }
225
-
226
- /**
227
- * @param string|array $type The type of request you want to check. If an array
228
- * this method will return true if the request matches any type.
229
- * @return [type] [description]
230
- */
231
- public function requestType($requestType = NULL){
232
- if(!is_null($requestType)){
233
- if(is_array($requestType)){
234
- return in_array($_SERVER['REQUEST_METHOD'], array_map('strtoupper', $requestType));
235
- }
236
- return ($_SERVER['REQUEST_METHOD'] === strtoupper($requestType));
237
- }
238
- return $_SERVER['REQUEST_METHOD'];
239
- }
240
- }
1
+ <?php
2
+
3
+ /**
4
+ * The file that defines the core plugin class
5
+ *
6
+ * A class definition that includes attributes and functions used across both the
7
+ * public-facing side of the site and the admin area.
8
+ *
9
+ * @link https://wp-dsgvo.eu
10
+ * @since 1.0.0
11
+ *
12
+ * @package WP DSGVO Tools
13
+ * @subpackage WP DSGVO Tools/includes
14
+ */
15
+
16
+ /**
17
+ * The core plugin class.
18
+ *
19
+ * This is used to define internationalization, admin-specific hooks, and
20
+ * public-facing site hooks.
21
+ *
22
+ * Also maintains the unique identifier of this plugin as well as the current
23
+ * version of the plugin.
24
+ *
25
+ * @since 1.0.0
26
+ * @package WP DSGVO Tools
27
+ * @subpackage WP DSGVO Tools/includes
28
+ * @author Shapepress eU
29
+ */
30
+ abstract class SPDSGVOAjaxAction{
31
+
32
+ protected $action;
33
+ public $request;
34
+ public $user;
35
+
36
+ abstract protected function run();
37
+
38
+ public function __construct(){
39
+ $this->request = $_REQUEST;
40
+ if($this->isLoggedIn()){
41
+ $this->user = wp_get_current_user();
42
+ }
43
+ }
44
+
45
+ public static function boot(){
46
+ $class = self::getClassName();
47
+ $action = new $class;
48
+ $action->run();
49
+
50
+ if($action->has('href')){
51
+ wp_redirect($action->get('href'));
52
+ }else{
53
+ if(isset($_SERVER['HTTP_REFERER'])) {
54
+ header('Location: '. $_SERVER['HTTP_REFERER']);
55
+ }
56
+ else
57
+ {
58
+ //it was not sent, perform your default actions here
59
+ }
60
+
61
+ }
62
+
63
+ die;
64
+ }
65
+
66
+ public static function listen($public = TRUE){
67
+ $actionName = self::getActionName();
68
+ $className = self::getClassName();
69
+ add_action("wp_ajax_{$actionName}", array($className, 'boot'));
70
+
71
+ if($public){
72
+ add_action("wp_ajax_nopriv_{$actionName}", array($className, 'boot'));
73
+ }
74
+ }
75
+
76
+
77
+ // -----------------------------------------------------
78
+ // UTILITY METHODS
79
+ // -----------------------------------------------------
80
+ public static function getClassName(){
81
+ return get_called_class();
82
+ }
83
+
84
+ public static function formURL(){
85
+ return admin_url('/admin-ajax.php');
86
+ }
87
+
88
+ public static function getActionName(){
89
+ $class = self::getClassName();
90
+ $reflection = new ReflectionClass($class);
91
+ $action = $reflection->newInstanceWithoutConstructor();
92
+ if(!isset($action->action)){
93
+ throw new Exception(__("Public property \$action not provied", 'shapepress-dsgvo'));
94
+ }
95
+ return $action->action;
96
+ }
97
+
98
+ public function requireAdmin(){
99
+ if(!current_user_can('administrator')){
100
+ echo '0';
101
+ die;
102
+ }
103
+ }
104
+
105
+ public function checkCSRF(){
106
+
107
+ $actionName = self::getActionName().'-nonce';
108
+ $submittedNonce = $_REQUEST['_wpnonce'];
109
+
110
+ if ( wp_verify_nonce( $submittedNonce, $actionName ) ) {
111
+ return TRUE;
112
+ } else
113
+ {
114
+ echo 'CSRF ERROR: Nonce not valid';
115
+ die;
116
+ //return FALSE;
117
+ }
118
+
119
+ }
120
+
121
+ public function error($message){
122
+ echo $message;
123
+ die();
124
+ }
125
+
126
+
127
+ // -----------------------------------------------------
128
+ // JSONResponse
129
+ // -----------------------------------------------------
130
+ public function JSONResponse($response){
131
+ wp_send_json($response);
132
+ }
133
+
134
+
135
+ // -----------------------------------------------------
136
+ // Helpers
137
+ // -----------------------------------------------------
138
+ public static function ajaxURL(){
139
+ ?>
140
+ <script type="text/javascript">
141
+ var ajaxurl = '<?php echo admin_url('/admin-ajax.php'); ?>';
142
+ </script>
143
+ <?php
144
+ }
145
+
146
+ public static function WP_HeadAjaxURL(){
147
+ add_action('wp_head', array('WP_AJAX', 'ajaxURL'));
148
+ }
149
+
150
+ public static function url($params = array()){
151
+ $params = http_build_query(array_merge(array(
152
+ 'action' => (new static())->action,
153
+ ), $params));
154
+
155
+ return admin_url('/admin-ajax.php') .'?'. $params;
156
+ }
157
+
158
+ public function isLoggedIn(){
159
+ return is_user_logged_in();
160
+ }
161
+
162
+ public function has($key){
163
+ if(isset($this->request[$key])){
164
+ return TRUE;
165
+ }
166
+ return FALSE;
167
+ }
168
+
169
+ /**
170
+ * Get parameter from $_REQUEST array
171
+ * @param string $key key
172
+ * @param string $default default string
173
+ * @return mixed
174
+ */
175
+ public function get($key, $default = NULL, $stripslashes = TRUE){
176
+ if($this->has($key)){
177
+
178
+ if(is_array($this->request[$key])){
179
+ return $this->request[$key];
180
+ }
181
+
182
+ if($stripslashes){
183
+ return stripslashes($this->request[$key]);
184
+ }
185
+
186
+ return $this->request[$key];
187
+ }
188
+ return $default;
189
+ }
190
+
191
+ public function returnBack(){
192
+ if(isset($_SERVER['HTTP_REFERER'])){
193
+ header('Location: '. $_SERVER['HTTP_REFERER']);
194
+ die();
195
+ }
196
+
197
+ return FALSE;
198
+ }
199
+
200
+ public function returnRedirect($url, $params = array()){
201
+ $url .= '?'. http_build_query($params);
202
+ header('Location: '. $url);
203
+ die();
204
+ }
205
+
206
+ /**
207
+ * @param string|array $type The type of request you want to check. If an array
208
+ * this method will return true if the request matches any type.
209
+ * @return [type] [description]
210
+ */
211
+ public function requestType($requestType = NULL){
212
+ if(!is_null($requestType)){
213
+ if(is_array($requestType)){
214
+ return in_array($_SERVER['REQUEST_METHOD'], array_map('strtoupper', $requestType));
215
+ }
216
+ return ($_SERVER['REQUEST_METHOD'] === strtoupper($requestType));
217
+ }
218
+ return $_SERVER['REQUEST_METHOD'];
219
+ }
220
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-sp-dsgvo-cache-manager.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOCacheManager
4
+ {
5
+
6
+ public static function clearCaches()
7
+ {
8
+ try {
9
+
10
+ // clear autoptimize
11
+ if (class_exists('autoptimizeCache')) {
12
+ if (function_exists('autoptimizeCache')) {
13
+ autoptimizeCache::clearall();
14
+ }
15
+ }
16
+
17
+ // Clear Litespeed cache
18
+ method_exists('LiteSpeed_Cache_API', 'purge_all') && LiteSpeed_Cache_API::purge_all();
19
+
20
+ // WP Super Cache
21
+ if (function_exists('wp_cache_clear_cache'))
22
+ {
23
+ wp_cache_clear_cache();
24
+ }
25
+ // W3 Total Cache
26
+ if (function_exists('w3tc_pgcache_flush'))
27
+ {
28
+ w3tc_pgcache_flush();
29
+ }
30
+ // Site Ground Cache
31
+ if (class_exists('SG_CachePress_Supercacher') && method_exists('SG_CachePress_Supercacher ', 'purge_cache'))
32
+ {
33
+ SG_CachePress_Supercacher::purge_cache(true);
34
+ }
35
+ // Endurance Cache
36
+ if (class_exists('Endurance_Page_Cache'))
37
+ {
38
+ $e = new Endurance_Page_Cache;
39
+ $e->purge_all();
40
+ }
41
+ // WP Fastest Cache
42
+ if (isset($GLOBALS['wp_fastest_cache']) && method_exists($GLOBALS['wp_fastest_cache'], 'deleteCache'))
43
+ {
44
+ $GLOBALS['wp_fastest_cache']->deleteCache(true);
45
+ }
46
+
47
+ } catch (Exception $e) {
48
+ }
49
+ }
50
+ }
includes/class-sp-dsgvo-constants.php ADDED
@@ -0,0 +1,418 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOConstants
4
+ {
5
+ const CATEGORY_SLUG_STATISTICS = 'statistics';
6
+ const CATEGORY_SLUG_TARGETING = 'targeting';
7
+ const CATEGORY_SLUG_EMBEDDINGS = 'embeddings';
8
+ const CATEGORY_SLUG_LIVECHAT = 'live-chat';
9
+ const CATEGORY_SLUG_CHATBOTS = 'chat-bots';
10
+ const CATEGORY_SLUG_PLUGINS = 'plugins';
11
+ const CATEGORY_SLUG_MANDATORY = 'necessary';
12
+
13
+
14
+
15
+ const LEGAL_WEB_BASE_URL = "https://www.legalweb.io";
16
+ const LEGAL_WEB_TEXT_SERVICE_URL = 'https://www.legalweb.io/textservice/textService.php';
17
+ const LEGAL_WEB_TEXT_SERVICE_VERSION = '1';
18
+
19
+ const CCOKIE_NAME = 'sp_dsgvo_cookie_settings';
20
+ const CCOKIE_NAME_INTEGRATION = 'sp_dsgvo_integration_settings';
21
+
22
+ const OPTIONS_PREFIX = "sp_dsgvo_";
23
+
24
+ public static function getSecurityServices()
25
+ {
26
+ return array('local-security-question' => 'Eine lokale Sicherheitsabfrage',
27
+ 'google-recaptcha' => 'Google reCAPTCHA',
28
+ 'other' => 'Sonstige');
29
+ }
30
+
31
+ public static function getCDNServers()
32
+ {
33
+ return array('akamai-cdn' => 'Akamai CDN',
34
+ 'aws-cloudfront-cdn' => 'AWS Cloudfront CDN',
35
+ 'azure-cdn' => 'Azure CDN',
36
+ 'bunny-cdn' => 'Bunny CDN',
37
+ 'cachefly' => 'CacheFly',
38
+ 'cdn-net' => 'CDN.NET',
39
+ 'cdn-77' => 'CDN 77',
40
+ 'cloudflare' => 'Cloudflare CDN',
41
+ 'fastly-cdn' => 'Fastly CDN',
42
+ 'google-cloud' => 'Google Cloud CDN',
43
+ 'g-core-labs-cdn' => 'G-Core Labs CDN',
44
+ //'key' => 'Key CDN',
45
+ 'medianova' => 'Medianova',
46
+ 'ovh-cdn' => 'OVH CDN',
47
+ 'stackpath' => 'StackPath',
48
+ 'other' => __('Other Server','shapepress-dsvgo')
49
+ );
50
+ }
51
+
52
+ public static function getHostingProvider()
53
+ {
54
+ return array (
55
+ 'eins-und-eins-ionos-se' => '1&1 IONOS SE',
56
+ 'einsblue' => '1blu',
57
+ 'amazon-aws' => 'Amazon AWS',
58
+ 'alfahosting' => 'Alfahosting',
59
+ 'all-inkl' => 'All-inkl.com',
60
+ 'awardspace' => 'Awardspace',
61
+ 'contabo' => 'Contabo',
62
+ 'dogado' => 'Dogado',
63
+ 'domainfactory' => 'domainfactory GmbH',
64
+ 'dzwi' => 'DWZI GmbH',
65
+ 'godaddy' => 'GoDaddy',
66
+ 'hetzner' => 'Hetzner Online GmbH',
67
+ 'host-europe' => 'Host Europe GmbH',
68
+ 'host-profis' => 'HostProfis ISP Telekom GmbH',
69
+ 'lima-city' => 'Lima City',
70
+ 'magenta' => 'Magenta-/ T-Mobile Austria GmbH',
71
+ 'mittwald' => 'Mittwald CM Service GmbH & Co. KG',
72
+ 'microsoft-azure' => 'Microsoft Azure',
73
+ 'netcup' => 'Netcup',
74
+ 'platform-sh' => 'platformSH',
75
+ 'rackspace' => 'Rackspace',
76
+ 'raidboxes' => 'Raidboxes',
77
+ 'schlundtech' => 'Schlundtech',
78
+ 'siteground' => 'SiteGround',
79
+ 'strato' => 'Strato',
80
+ 'telekom-austria' => 'Telekom Austria AG',
81
+ 'uniteddomains' => 'UnitedDomains',
82
+ 'vautron' => 'Vautron Rechenzentrum AG',
83
+ 'webgo' => 'webgo',
84
+ 'worldfouryou' => 'World4You Internet Services GmbH',
85
+ //'wix' => 'wix.com',
86
+ 'zap-hosting' => 'ZAP-Hosting',
87
+ 'other' => __('Other Provider','shapepress-dsvgo')
88
+ );
89
+ }
90
+
91
+ public static function getFontServices()
92
+ {
93
+ return array('google-fonts' => 'Google Fonts',
94
+ 'adobe-fonts' => 'Adobe Fonts',
95
+ 'fontawesome' => 'Font Awesome',
96
+ 'fonts-com' => 'Fonts.com');
97
+ }
98
+
99
+ public static function getPaymentProvider()
100
+ {
101
+ return array (
102
+ 'cash' => __('Cash','shapepress-dsgvo'),
103
+ 'cod' => __('Cash on delivery','shapepress-dsgvo'),
104
+ 'bank-transfer' => __('Bank Transfer','shapepress-dsgvo'),
105
+ 'ein-und-eins' => '1 & 1 ipayment',
106
+ 'amazon-pay' => 'Amazon Pay',
107
+ 'apple-pay' => 'Apple Pay',
108
+ 'arvato' => 'Arvato Infoscore',
109
+ 'bs-card-service' => 'B+S Card Services',
110
+ 'commdoo' => 'Commdoo',
111
+ 'concardis' => 'Concardis',
112
+ 'deutsche-card-services' => 'Deutsche Card Services',
113
+ 'docdata-payments' => 'Docdata Payments',
114
+ 'easycash' => 'Easycash',
115
+ 'easypay' => 'Easypay',
116
+ 'ecardon' => 'Ecardon',
117
+ 'eos' => 'EOS',
118
+ 'google-pay' => 'Google Pay',
119
+ 'heidelpay' => 'Heidelpay',
120
+ 'klarna' => 'Klarna',
121
+ 'girosolution' => 'Girosolution',
122
+ 'micropayment' => 'Micropayment',
123
+ 'mpay' => 'mPay24',
124
+ 'novalnet' => 'Novalnet',
125
+ 'paymorrow' => 'Paymorrow',
126
+ 'payone' => 'PAYONE',
127
+ 'paypal' => 'PayPal',
128
+ 'secupay' => 'Secupay',
129
+ 'stripe' => 'Stripe',
130
+ 'telecash' => 'Telecash',
131
+ 'vr-pay-virtuell' => 'VR-Pay Virtuell',
132
+ 'wirecard' => 'Wirecard',
133
+ );
134
+ }
135
+
136
+ public static function getEmbeddingIntegrations()
137
+ {
138
+ return array(
139
+ 'google-maps' => 'Google Maps',
140
+ 'open-street-map' => 'OpenStreetMap',
141
+ 'youtube' => 'YouTube',
142
+ 'vimeo' => 'Vimeo'
143
+ );
144
+ }
145
+
146
+ public static function getNewsletterIntegrations()
147
+ {
148
+ return array(
149
+ 'own' => __('By own web/email server','shapepress-dsvgo'),
150
+ 'aweber' => 'AWeber',
151
+ 'active-campaign' => 'ActiveCampaign',
152
+ 'clever-research' => 'CleverReach',
153
+ 'mail-chimp' => 'MailChimp',
154
+ 'mail-jet' => 'Mailjet',
155
+ 'mailpoet' => 'MailPoet',
156
+ 'newsletter-2-go' => 'newslettertwogo',
157
+ 'rapid-mail' => 'Rapidmail',
158
+ 'other' => __('Other','shapepress-dsvgo')
159
+ );
160
+ }
161
+
162
+
163
+ public static function getCountries()
164
+ {
165
+ return array(
166
+ 'AF' => __('Afghanistan', 'shapepress-dsgvo'),
167
+ 'AX' => __('&#197;land Islands', 'shapepress-dsgvo'),
168
+ 'AL' => __('Albania', 'shapepress-dsgvo'),
169
+ 'DZ' => __('Algeria', 'shapepress-dsgvo'),
170
+ 'AS' => __('American Samoa', 'shapepress-dsgvo'),
171
+ 'AD' => __('Andorra', 'shapepress-dsgvo'),
172
+ 'AO' => __('Angola', 'shapepress-dsgvo'),
173
+ 'AI' => __('Anguilla', 'shapepress-dsgvo'),
174
+ 'AQ' => __('Antarctica', 'shapepress-dsgvo'),
175
+ 'AG' => __('Antigua and Barbuda', 'shapepress-dsgvo'),
176
+ 'AR' => __('Argentina', 'shapepress-dsgvo'),
177
+ 'AM' => __('Armenia', 'shapepress-dsgvo'),
178
+ 'AW' => __('Aruba', 'shapepress-dsgvo'),
179
+ 'AU' => __('Australia', 'shapepress-dsgvo'),
180
+ 'AT' => __('Austria', 'shapepress-dsgvo'),
181
+ 'AZ' => __('Azerbaijan', 'shapepress-dsgvo'),
182
+ 'BS' => __('Bahamas', 'shapepress-dsgvo'),
183
+ 'BH' => __('Bahrain', 'shapepress-dsgvo'),
184
+ 'BD' => __('Bangladesh', 'shapepress-dsgvo'),
185
+ 'BB' => __('Barbados', 'shapepress-dsgvo'),
186
+ 'BY' => __('Belarus', 'shapepress-dsgvo'),
187
+ 'BE' => __('Belgium', 'shapepress-dsgvo'),
188
+ 'PW' => __('Belau', 'shapepress-dsgvo'),
189
+ 'BZ' => __('Belize', 'shapepress-dsgvo'),
190
+ 'BJ' => __('Benin', 'shapepress-dsgvo'),
191
+ 'BM' => __('Bermuda', 'shapepress-dsgvo'),
192
+ 'BT' => __('Bhutan', 'shapepress-dsgvo'),
193
+ 'BO' => __('Bolivia', 'shapepress-dsgvo'),
194
+ 'BQ' => __('Bonaire, Saint Eustatius and Saba', 'shapepress-dsgvo'),
195
+ 'BA' => __('Bosnia and Herzegovina', 'shapepress-dsgvo'),
196
+ 'BW' => __('Botswana', 'shapepress-dsgvo'),
197
+ 'BV' => __('Bouvet Island', 'shapepress-dsgvo'),
198
+ 'BR' => __('Brazil', 'shapepress-dsgvo'),
199
+ 'IO' => __('British Indian Ocean Territory', 'shapepress-dsgvo'),
200
+ 'BN' => __('Brunei', 'shapepress-dsgvo'),
201
+ 'BG' => __('Bulgaria', 'shapepress-dsgvo'),
202
+ 'BF' => __('Burkina Faso', 'shapepress-dsgvo'),
203
+ 'BI' => __('Burundi', 'shapepress-dsgvo'),
204
+ 'KH' => __('Cambodia', 'shapepress-dsgvo'),
205
+ 'CM' => __('Cameroon', 'shapepress-dsgvo'),
206
+ 'CA' => __('Canada', 'shapepress-dsgvo'),
207
+ 'CV' => __('Cape Verde', 'shapepress-dsgvo'),
208
+ 'KY' => __('Cayman Islands', 'shapepress-dsgvo'),
209
+ 'CF' => __('Central African Republic', 'shapepress-dsgvo'),
210
+ 'TD' => __('Chad', 'shapepress-dsgvo'),
211
+ 'CL' => __('Chile', 'shapepress-dsgvo'),
212
+ 'CN' => __('China', 'shapepress-dsgvo'),
213
+ 'CX' => __('Christmas Island', 'shapepress-dsgvo'),
214
+ 'CC' => __('Cocos (Keeling) Islands', 'shapepress-dsgvo'),
215
+ 'CO' => __('Colombia', 'shapepress-dsgvo'),
216
+ 'KM' => __('Comoros', 'shapepress-dsgvo'),
217
+ 'CG' => __('Congo (Brazzaville)', 'shapepress-dsgvo'),
218
+ 'CD' => __('Congo (Kinshasa)', 'shapepress-dsgvo'),
219
+ 'CK' => __('Cook Islands', 'shapepress-dsgvo'),
220
+ 'CR' => __('Costa Rica', 'shapepress-dsgvo'),
221
+ 'HR' => __('Croatia', 'shapepress-dsgvo'),
222
+ 'CU' => __('Cuba', 'shapepress-dsgvo'),
223
+ 'CW' => __('Cura&ccedil;ao', 'shapepress-dsgvo'),
224
+ 'CY' => __('Cyprus', 'shapepress-dsgvo'),
225
+ 'CZ' => __('Czech Republic', 'shapepress-dsgvo'),
226
+ 'DK' => __('Denmark', 'shapepress-dsgvo'),
227
+ 'DJ' => __('Djibouti', 'shapepress-dsgvo'),
228
+ 'DM' => __('Dominica', 'shapepress-dsgvo'),
229
+ 'DO' => __('Dominican Republic', 'shapepress-dsgvo'),
230
+ 'EC' => __('Ecuador', 'shapepress-dsgvo'),
231
+ 'EG' => __('Egypt', 'shapepress-dsgvo'),
232
+ 'SV' => __('El Salvador', 'shapepress-dsgvo'),
233
+ 'GQ' => __('Equatorial Guinea', 'shapepress-dsgvo'),
234
+ 'ER' => __('Eritrea', 'shapepress-dsgvo'),
235
+ 'EE' => __('Estonia', 'shapepress-dsgvo'),
236
+ 'ET' => __('Ethiopia', 'shapepress-dsgvo'),
237
+ 'FK' => __('Falkland Islands', 'shapepress-dsgvo'),
238
+ 'FO' => __('Faroe Islands', 'shapepress-dsgvo'),
239
+ 'FJ' => __('Fiji', 'shapepress-dsgvo'),
240
+ 'FI' => __('Finland', 'shapepress-dsgvo'),
241
+ 'FR' => __('France', 'shapepress-dsgvo'),
242
+ 'GF' => __('French Guiana', 'shapepress-dsgvo'),
243
+ 'PF' => __('French Polynesia', 'shapepress-dsgvo'),
244
+ 'TF' => __('French Southern Territories', 'shapepress-dsgvo'),
245
+ 'GA' => __('Gabon', 'shapepress-dsgvo'),
246
+ 'GM' => __('Gambia', 'shapepress-dsgvo'),
247
+ 'GE' => __('Georgia', 'shapepress-dsgvo'),
248
+ 'DE' => __('Germany', 'shapepress-dsgvo'),
249
+ 'GH' => __('Ghana', 'shapepress-dsgvo'),
250
+ 'GI' => __('Gibraltar', 'shapepress-dsgvo'),
251
+ 'GR' => __('Greece', 'shapepress-dsgvo'),
252
+ 'GL' => __('Greenland', 'shapepress-dsgvo'),
253
+ 'GD' => __('Grenada', 'shapepress-dsgvo'),
254
+ 'GP' => __('Guadeloupe', 'shapepress-dsgvo'),
255
+ 'GU' => __('Guam', 'shapepress-dsgvo'),
256
+ 'GT' => __('Guatemala', 'shapepress-dsgvo'),
257
+ 'GG' => __('Guernsey', 'shapepress-dsgvo'),
258
+ 'GN' => __('Guinea', 'shapepress-dsgvo'),
259
+ 'GW' => __('Guinea-Bissau', 'shapepress-dsgvo'),
260
+ 'GY' => __('Guyana', 'shapepress-dsgvo'),
261
+ 'HT' => __('Haiti', 'shapepress-dsgvo'),
262
+ 'HM' => __('Heard Island and McDonald Islands', 'shapepress-dsgvo'),
263
+ 'HN' => __('Honduras', 'shapepress-dsgvo'),
264
+ 'HK' => __('Hong Kong', 'shapepress-dsgvo'),
265
+ 'HU' => __('Hungary', 'shapepress-dsgvo'),
266
+ 'IS' => __('Iceland', 'shapepress-dsgvo'),
267
+ 'IN' => __('India', 'shapepress-dsgvo'),
268
+ 'ID' => __('Indonesia', 'shapepress-dsgvo'),
269
+ 'IR' => __('Iran', 'shapepress-dsgvo'),
270
+ 'IQ' => __('Iraq', 'shapepress-dsgvo'),
271
+ 'IE' => __('Ireland', 'shapepress-dsgvo'),
272
+ 'IM' => __('Isle of Man', 'shapepress-dsgvo'),
273
+ 'IL' => __('Israel', 'shapepress-dsgvo'),
274
+ 'IT' => __('Italy', 'shapepress-dsgvo'),
275
+ 'CI' => __('Ivory Coast', 'shapepress-dsgvo'),
276
+ 'JM' => __('Jamaica', 'shapepress-dsgvo'),
277
+ 'JP' => __('Japan', 'shapepress-dsgvo'),
278
+ 'JE' => __('Jersey', 'shapepress-dsgvo'),
279
+ 'JO' => __('Jordan', 'shapepress-dsgvo'),
280
+ 'KZ' => __('Kazakhstan', 'shapepress-dsgvo'),
281
+ 'KE' => __('Kenya', 'shapepress-dsgvo'),
282
+ 'KI' => __('Kiribati', 'shapepress-dsgvo'),
283
+ 'KW' => __('Kuwait', 'shapepress-dsgvo'),
284
+ 'KG' => __('Kyrgyzstan', 'shapepress-dsgvo'),
285
+ 'LA' => __('Laos', 'shapepress-dsgvo'),
286
+ 'LV' => __('Latvia', 'shapepress-dsgvo'),
287
+ 'LB' => __('Lebanon', 'shapepress-dsgvo'),
288
+ 'LS' => __('Lesotho', 'shapepress-dsgvo'),
289
+ 'LR' => __('Liberia', 'shapepress-dsgvo'),
290
+ 'LY' => __('Libya', 'shapepress-dsgvo'),
291
+ 'LI' => __('Liechtenstein', 'shapepress-dsgvo'),
292
+ 'LT' => __('Lithuania', 'shapepress-dsgvo'),
293
+ 'LU' => __('Luxembourg', 'shapepress-dsgvo'),
294
+ 'MO' => __('Macao', 'shapepress-dsgvo'),
295
+ 'MK' => __('North Macedonia', 'shapepress-dsgvo'),
296
+ 'MG' => __('Madagascar', 'shapepress-dsgvo'),
297
+ 'MW' => __('Malawi', 'shapepress-dsgvo'),
298
+ 'MY' => __('Malaysia', 'shapepress-dsgvo'),
299
+ 'MV' => __('Maldives', 'shapepress-dsgvo'),
300
+ 'ML' => __('Mali', 'shapepress-dsgvo'),
301
+ 'MT' => __('Malta', 'shapepress-dsgvo'),
302
+ 'MH' => __('Marshall Islands', 'shapepress-dsgvo'),
303
+ 'MQ' => __('Martinique', 'shapepress-dsgvo'),
304
+ 'MR' => __('Mauritania', 'shapepress-dsgvo'),
305
+ 'MU' => __('Mauritius', 'shapepress-dsgvo'),
306
+ 'YT' => __('Mayotte', 'shapepress-dsgvo'),
307
+ 'MX' => __('Mexico', 'shapepress-dsgvo'),
308
+ 'FM' => __('Micronesia', 'shapepress-dsgvo'),
309
+ 'MD' => __('Moldova', 'shapepress-dsgvo'),
310
+ 'MC' => __('Monaco', 'shapepress-dsgvo'),
311
+ 'MN' => __('Mongolia', 'shapepress-dsgvo'),
312
+ 'ME' => __('Montenegro', 'shapepress-dsgvo'),
313
+ 'MS' => __('Montserrat', 'shapepress-dsgvo'),
314
+ 'MA' => __('Morocco', 'shapepress-dsgvo'),
315
+ 'MZ' => __('Mozambique', 'shapepress-dsgvo'),
316
+ 'MM' => __('Myanmar', 'shapepress-dsgvo'),
317
+ 'NA' => __('Namibia', 'shapepress-dsgvo'),
318
+ 'NR' => __('Nauru', 'shapepress-dsgvo'),
319
+ 'NP' => __('Nepal', 'shapepress-dsgvo'),
320
+ 'NL' => __('Netherlands', 'shapepress-dsgvo'),
321
+ 'NC' => __('New Caledonia', 'shapepress-dsgvo'),
322
+ 'NZ' => __('New Zealand', 'shapepress-dsgvo'),
323
+ 'NI' => __('Nicaragua', 'shapepress-dsgvo'),
324
+ 'NE' => __('Niger', 'shapepress-dsgvo'),
325
+ 'NG' => __('Nigeria', 'shapepress-dsgvo'),
326
+ 'NU' => __('Niue', 'shapepress-dsgvo'),
327
+ 'NF' => __('Norfolk Island', 'shapepress-dsgvo'),
328
+ 'MP' => __('Northern Mariana Islands', 'shapepress-dsgvo'),
329
+ 'KP' => __('North Korea', 'shapepress-dsgvo'),
330
+ 'NO' => __('Norway', 'shapepress-dsgvo'),
331
+ 'OM' => __('Oman', 'shapepress-dsgvo'),
332
+ 'PK' => __('Pakistan', 'shapepress-dsgvo'),
333
+ 'PS' => __('Palestinian Territory', 'shapepress-dsgvo'),
334
+ 'PA' => __('Panama', 'shapepress-dsgvo'),
335
+ 'PG' => __('Papua New Guinea', 'shapepress-dsgvo'),
336
+ 'PY' => __('Paraguay', 'shapepress-dsgvo'),
337
+ 'PE' => __('Peru', 'shapepress-dsgvo'),
338
+ 'PH' => __('Philippines', 'shapepress-dsgvo'),
339
+ 'PN' => __('Pitcairn', 'shapepress-dsgvo'),
340
+ 'PL' => __('Poland', 'shapepress-dsgvo'),
341
+ 'PT' => __('Portugal', 'shapepress-dsgvo'),
342
+ 'PR' => __('Puerto Rico', 'shapepress-dsgvo'),
343
+ 'QA' => __('Qatar', 'shapepress-dsgvo'),
344
+ 'RE' => __('Reunion', 'shapepress-dsgvo'),
345
+ 'RO' => __('Romania', 'shapepress-dsgvo'),
346
+ 'RU' => __('Russia', 'shapepress-dsgvo'),
347
+ 'RW' => __('Rwanda', 'shapepress-dsgvo'),
348
+ 'BL' => __('Saint Barth&eacute;lemy', 'shapepress-dsgvo'),
349
+ 'SH' => __('Saint Helena', 'shapepress-dsgvo'),
350
+ 'KN' => __('Saint Kitts and Nevis', 'shapepress-dsgvo'),
351
+ 'LC' => __('Saint Lucia', 'shapepress-dsgvo'),
352
+ 'MF' => __('Saint Martin (French part)', 'shapepress-dsgvo'),
353
+ 'SX' => __('Saint Martin (Dutch part)', 'shapepress-dsgvo'),
354
+ 'PM' => __('Saint Pierre and Miquelon', 'shapepress-dsgvo'),
355
+ 'VC' => __('Saint Vincent and the Grenadines', 'shapepress-dsgvo'),
356
+ 'SM' => __('San Marino', 'shapepress-dsgvo'),
357
+ 'ST' => __('S&atilde;o Tom&eacute; and Pr&iacute;ncipe', 'shapepress-dsgvo'),
358
+ 'SA' => __('Saudi Arabia', 'shapepress-dsgvo'),
359
+ 'SN' => __('Senegal', 'shapepress-dsgvo'),
360
+ 'RS' => __('Serbia', 'shapepress-dsgvo'),
361
+ 'SC' => __('Seychelles', 'shapepress-dsgvo'),
362
+ 'SL' => __('Sierra Leone', 'shapepress-dsgvo'),
363
+ 'SG' => __('Singapore', 'shapepress-dsgvo'),
364
+ 'SK' => __('Slovakia', 'shapepress-dsgvo'),
365
+ 'SI' => __('Slovenia', 'shapepress-dsgvo'),
366
+ 'SB' => __('Solomon Islands', 'shapepress-dsgvo'),
367
+ 'SO' => __('Somalia', 'shapepress-dsgvo'),
368
+ 'ZA' => __('South Africa', 'shapepress-dsgvo'),
369
+ 'GS' => __('South Georgia/Sandwich Islands', 'shapepress-dsgvo'),
370
+ 'KR' => __('South Korea', 'shapepress-dsgvo'),
371
+ 'SS' => __('South Sudan', 'shapepress-dsgvo'),
372
+ 'ES' => __('Spain', 'shapepress-dsgvo'),
373
+ 'LK' => __('Sri Lanka', 'shapepress-dsgvo'),
374
+ 'SD' => __('Sudan', 'shapepress-dsgvo'),
375
+ 'SR' => __('Suriname', 'shapepress-dsgvo'),
376
+ 'SJ' => __('Svalbard and Jan Mayen', 'shapepress-dsgvo'),
377
+ 'SZ' => __('Swaziland', 'shapepress-dsgvo'),
378
+ 'SE' => __('Sweden', 'shapepress-dsgvo'),
379
+ 'CH' => __('Switzerland', 'shapepress-dsgvo'),
380
+ 'SY' => __('Syria', 'shapepress-dsgvo'),
381
+ 'TW' => __('Taiwan', 'shapepress-dsgvo'),
382
+ 'TJ' => __('Tajikistan', 'shapepress-dsgvo'),
383
+ 'TZ' => __('Tanzania', 'shapepress-dsgvo'),
384
+ 'TH' => __('Thailand', 'shapepress-dsgvo'),
385
+ 'TL' => __('Timor-Leste', 'shapepress-dsgvo'),
386
+ 'TG' => __('Togo', 'shapepress-dsgvo'),
387
+ 'TK' => __('Tokelau', 'shapepress-dsgvo'),
388
+ 'TO' => __('Tonga', 'shapepress-dsgvo'),
389
+ 'TT' => __('Trinidad and Tobago', 'shapepress-dsgvo'),
390
+ 'TN' => __('Tunisia', 'shapepress-dsgvo'),
391
+ 'TR' => __('Turkey', 'shapepress-dsgvo'),
392
+ 'TM' => __('Turkmenistan', 'shapepress-dsgvo'),
393
+ 'TC' => __('Turks and Caicos Islands', 'shapepress-dsgvo'),
394
+ 'TV' => __('Tuvalu', 'shapepress-dsgvo'),
395
+ 'UG' => __('Uganda', 'shapepress-dsgvo'),
396
+ 'UA' => __('Ukraine', 'shapepress-dsgvo'),
397
+ 'AE' => __('United Arab Emirates', 'shapepress-dsgvo'),
398
+ 'GB' => __('United Kingdom (UK)', 'shapepress-dsgvo'),
399
+ 'US' => __('United States (US)', 'shapepress-dsgvo'),
400
+ 'UM' => __('United States (US) Minor Outlying Islands', 'shapepress-dsgvo'),
401
+ 'UY' => __('Uruguay', 'shapepress-dsgvo'),
402
+ 'UZ' => __('Uzbekistan', 'shapepress-dsgvo'),
403
+ 'VU' => __('Vanuatu', 'shapepress-dsgvo'),
404
+ 'VA' => __('Vatican', 'shapepress-dsgvo'),
405
+ 'VE' => __('Venezuela', 'shapepress-dsgvo'),
406
+ 'VN' => __('Vietnam', 'shapepress-dsgvo'),
407
+ 'VG' => __('Virgin Islands (British)', 'shapepress-dsgvo'),
408
+ 'VI' => __('Virgin Islands (US)', 'shapepress-dsgvo'),
409
+ 'WF' => __('Wallis and Futuna', 'shapepress-dsgvo'),
410
+ 'EH' => __('Western Sahara', 'shapepress-dsgvo'),
411
+ 'WS' => __('Samoa', 'shapepress-dsgvo'),
412
+ 'YE' => __('Yemen', 'shapepress-dsgvo'),
413
+ 'ZM' => __('Zambia', 'shapepress-dsgvo'),
414
+ 'ZW' => __('Zimbabwe', 'shapepress-dsgvo'),
415
+ );
416
+
417
+ }
418
+ }
includes/class-sp-dsgvo-cookie-category-api.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOCookieCategoryApi
4
+ {
5
+
6
+ public static function getAllCategoryNames()
7
+ {
8
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_STATISTICS;
9
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_TARGETING;
10
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_EMBEDDINGS;
11
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_LIVECHAT;
12
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_CHATBOTS;
13
+ $result[] = SPDSGVOConstants::CATEGORY_SLUG_MANDATORY;
14
+
15
+ return $result;
16
+ }
17
+
18
+ public static function getCookieCategories()
19
+ {
20
+ $cookieCategories = array(
21
+ SPDSGVOConstants::CATEGORY_SLUG_STATISTICS => array(
22
+ 'title' => __('Analysis / Statistics', 'shapepress-dsgvo'),
23
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_STATISTICS,
24
+ 'description' => __('Anonymous evaluation for troubleshooting and further development', 'shapepress-dsgvo'),
25
+ 'orderId' => '10'
26
+ ),
27
+ SPDSGVOConstants::CATEGORY_SLUG_TARGETING => array(
28
+ 'title' => __('Targeting / Profiling / Ads', 'shapepress-dsgvo'),
29
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_TARGETING,
30
+ 'description' => __('Target group-specific information outside our website', 'shapepress-dsgvo'),
31
+ 'orderId' => '20'
32
+ ),
33
+ SPDSGVOConstants::CATEGORY_SLUG_EMBEDDINGS => array(
34
+ 'title' => __('Embeddings', 'shapepress-dsgvo'),
35
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_EMBEDDINGS,
36
+ 'description' => __('Integration of additional information', 'shapepress-dsgvo'),
37
+ 'orderId' => '30'
38
+ ),
39
+ SPDSGVOConstants::CATEGORY_SLUG_LIVECHAT => array(
40
+ 'title' => __('Live Chat', 'shapepress-dsgvo'),
41
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_LIVECHAT,
42
+ 'description' => __('Personal support from our support team', 'shapepress-dsgvo'),
43
+ 'orderId' => '40'
44
+ ),
45
+ SPDSGVOConstants::CATEGORY_SLUG_CHATBOTS => array(
46
+ 'title' => __('Chat Bots', 'shapepress-dsgvo'),
47
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_CHATBOTS,
48
+ 'description' => __('Support from our support team', 'shapepress-dsgvo'),
49
+ 'orderId' => '50'
50
+ ),
51
+ SPDSGVOConstants::CATEGORY_SLUG_MANDATORY => array(
52
+ 'title' => __('Necessaray Services', 'shapepress-dsgvo'),
53
+ 'slug' => SPDSGVOConstants::CATEGORY_SLUG_MANDATORY,
54
+ 'description' => __('Unconditional technically necessary services for the provision of the website', 'shapepress-dsgvo'),
55
+ 'orderId' => '100'
56
+ )
57
+ );
58
+
59
+ uasort($cookieCategories, function($a, $b) {
60
+ return $a['orderId'] > $b['orderId'] ? 1 : -1;
61
+ });
62
+
63
+ return $cookieCategories;
64
+ }
65
+
66
+ public static function getCookieCategory($categorySlug)
67
+ {
68
+ if (array_key_exists($categorySlug, self::getCookieCategories()) == false) return null;
69
+
70
+ return self::getCookieCategories()[$categorySlug];
71
+ }
72
+
73
+
74
+
75
+ }
includes/class-sp-dsgvo-cron.php CHANGED
@@ -1,88 +1,88 @@
1
- <?php
2
-
3
- Class SPDSGVOCron{
4
-
5
- public function slug(){
6
- $reflect = new ReflectionClass($this);
7
- $class = $reflect->getShortName();
8
- return 'wp_cron__'. strtolower($class);
9
- }
10
-
11
- public function schedule(){
12
- return 'schedule_'. $this->slug();
13
- }
14
-
15
- public function calculateInterval(){
16
- if(is_array($this->interval)){
17
- $interval = 0;
18
-
19
- if( isset($this->interval['seconds']) &&
20
- (is_int($this->interval['seconds']) || is_float($this->interval['seconds']))){
21
- $interval = $interval + ($this->interval['seconds']);
22
- }
23
-
24
- if( isset($this->interval['minutes']) &&
25
- (is_int($this->interval['minutes']) || is_float($this->interval['minutes']))){
26
- $interval = $interval + ($this->interval['minutes'] * 60);
27
- }
28
-
29
- if( isset($this->interval['hours']) &&
30
- (is_int($this->interval['hours']) || is_float($this->interval['hours']))){
31
- $interval = $interval + ($this->interval['hours'] * 3600);
32
- }
33
-
34
- if( isset($this->interval['days']) &&
35
- (is_int($this->interval['days']) || is_float($this->interval['days']))){
36
- $interval = $interval + ($this->interval['days'] * 86400);
37
- }
38
-
39
- if( isset($this->interval['weeks']) &&
40
- (is_int($this->interval['weeks']) || is_float($this->interval['weeks']))){
41
- $interval = $interval + ($this->interval['weeks'] * 604800);
42
- }
43
-
44
- if( isset($this->interval['months']) &&
45
- (is_int($this->interval['months']) || is_float($this->interval['months']))){
46
- $interval = $interval + ($this->interval['months'] * 2628000);
47
- }
48
-
49
- return $interval;
50
-
51
- }else if(is_int($this->interval)){
52
- return $this->interval;
53
- }else{
54
- // parse string??
55
- }
56
-
57
- throw new Exception("Interval not valid");
58
- }
59
-
60
- public function scheduleFilter($schedules){
61
- $interval = $this->calculateInterval();
62
-
63
- if(!in_array($this->schedule(), array_keys($schedules))){
64
- $schedules[$this->schedule()] = array(
65
- 'interval' => $interval,
66
- 'display' => __('All', 'shapepress-dsgvo') . ' '. floor($interval / 60) .' ' . __('Minutes', 'shapepress-dsgvo'),
67
- );
68
- }
69
-
70
- return $schedules;
71
- }
72
-
73
- public static function register(){
74
- $class = get_called_class();
75
- $self = new $class;
76
- $slug = $self->slug();
77
-
78
- add_filter('cron_schedules', array($self, 'scheduleFilter'));
79
-
80
- if(!wp_next_scheduled($slug)){
81
- wp_schedule_event(time(), $self->schedule(), $slug);
82
- }
83
-
84
- if(method_exists($self, 'handle')){
85
- add_action($slug, array($self, 'handle'));
86
- }
87
- }
88
- }
1
+ <?php
2
+
3
+ Class SPDSGVOCron{
4
+
5
+ public function slug(){
6
+ $reflect = new ReflectionClass($this);
7
+ $class = $reflect->getShortName();
8
+ return 'wp_cron__'. strtolower($class);
9
+ }
10
+
11
+ public function schedule(){
12
+ return 'schedule_'. $this->slug();
13
+ }
14
+
15
+ public function calculateInterval(){
16
+ if(is_array($this->interval)){
17
+ $interval = 0;
18
+
19
+ if( isset($this->interval['seconds']) &&
20
+ (is_int($this->interval['seconds']) || is_float($this->interval['seconds']))){
21
+ $interval = $interval + ($this->interval['seconds']);
22
+ }
23
+
24
+ if( isset($this->interval['minutes']) &&
25
+ (is_int($this->interval['minutes']) || is_float($this->interval['minutes']))){
26
+ $interval = $interval + ($this->interval['minutes'] * 60);
27
+ }
28
+
29
+ if( isset($this->interval['hours']) &&
30
+ (is_int($this->interval['hours']) || is_float($this->interval['hours']))){
31
+ $interval = $interval + ($this->interval['hours'] * 3600);
32
+ }
33
+
34
+ if( isset($this->interval['days']) &&
35
+ (is_int($this->interval['days']) || is_float($this->interval['days']))){
36
+ $interval = $interval + ($this->interval['days'] * 86400);
37
+ }
38
+
39
+ if( isset($this->interval['weeks']) &&
40
+ (is_int($this->interval['weeks']) || is_float($this->interval['weeks']))){
41
+ $interval = $interval + ($this->interval['weeks'] * 604800);
42
+ }
43
+
44
+ if( isset($this->interval['months']) &&
45
+ (is_int($this->interval['months']) || is_float($this->interval['months']))){
46
+ $interval = $interval + ($this->interval['months'] * 2628000);
47
+ }
48
+
49
+ return $interval;
50
+
51
+ }else if(is_int($this->interval)){
52
+ return $this->interval;
53
+ }else{
54
+ // parse string??
55
+ }
56
+
57
+ throw new Exception("Interval not valid");
58
+ }
59
+
60
+ public function scheduleFilter($schedules){
61
+ $interval = $this->calculateInterval();
62
+
63
+ if(!in_array($this->schedule(), array_keys($schedules))){
64
+ $schedules[$this->schedule()] = array(
65
+ 'interval' => $interval,
66
+ 'display' => __('All', 'shapepress-dsgvo') . ' '. floor($interval / 60) .' ' . __('Minutes', 'shapepress-dsgvo'),
67
+ );
68
+ }
69
+
70
+ return $schedules;
71
+ }
72
+
73
+ public static function register(){
74
+ $class = get_called_class();
75
+ $self = new $class;
76
+ $slug = $self->slug();
77
+
78
+ add_filter('cron_schedules', array($self, 'scheduleFilter'));
79
+
80
+ if(!wp_next_scheduled($slug)){
81
+ wp_schedule_event(time(), $self->schedule(), $slug);
82
+ }
83
+
84
+ if(method_exists($self, 'handle')){
85
+ add_action($slug, array($self, 'handle'));
86
+ }
87
+ }
88
+ }
includes/class-sp-dsgvo-data-collecter.php CHANGED
@@ -1,469 +1,469 @@
1
- <?php
2
-
3
- /**
4
- * Fired during plugin deactivation
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Fired during plugin deactivation.
15
- *
16
- * This class defines all code necessary to run during the plugin's deactivation.
17
- *
18
- * @since 1.0.0
19
- * @package WP DSGVO Tools
20
- * @subpackage WP DSGVO Tools/includes
21
- * @author Shapepress eU
22
- */
23
- class SPDSGVODataCollecter
24
- {
25
-
26
- public $email;
27
-
28
- public $firstName;
29
-
30
- public $lastName;
31
-
32
- public $user = NULL;
33
-
34
- public $totalFound = 0;
35
-
36
- public $data = array();
37
-
38
- public $identifiers = array();
39
-
40
- public $tables = array();
41
-
42
- public $sensativeKeys = array(
43
- 'company',
44
- 'country',
45
- 'county',
46
- 'city',
47
- 'state',
48
- 'address',
49
- 'first_name',
50
- 'last_name',
51
- 'zip',
52
- 'zip_code',
53
- 'post_code',
54
- 'postcode',
55
- 'email',
56
- 'phone',
57
- 'ip',
58
- 'ip_address'
59
- );
60
-
61
- public function __construct($email, $firstName = '', $lastName = '')
62
- {
63
- $this->email = $email;
64
-
65
- if (! empty($firstName)) {
66
- $this->addIdentifier($firstName, __('Name','shapepress-dsgvo'));
67
- $this->firstName = $firstName;
68
- }
69
-
70
- if (! empty($lastName)) {
71
- $this->addIdentifier($lastName, __('Name','shapepress-dsgvo'));
72
- $this->lastName = $lastName;
73
- }
74
-
75
- $this->user = get_user_by('email', $this->email);
76
- if (is_a($this->user, 'WP_User')) {
77
- $this->addIdentifier($this->user->user_login, __('Login','shapepress-dsgvo'));
78
- $this->addIdentifier($this->user->user_nicename, __('Name','shapepress-dsgvo'));
79
- $this->addIdentifier($this->user->user_email, __('Email','shapepress-dsgvo'));
80
- $this->addIdentifier($this->user->user_url, __('Url','shapepress-dsgvo'));
81
- $this->addIdentifier($this->user->display_name, __('Display Name','shapepress-dsgvo'));
82
- $this->addIdentifier(str_replace('www.', '', @parse_url($this->user->user_url)['host']), __('Url','shapepress-dsgvo'));
83
- }
84
- }
85
-
86
- public function sar()
87
- {
88
- if (is_a($this->user, 'WP_User')) {
89
- $this->crawlLocal();
90
- }else
91
- {
92
- $this->crawlLocal(); // both for now because it only crawls comments
93
- }
94
-
95
- $this->integrationsSAR();
96
-
97
- if (isValidPremiumEdition())
98
- {
99
- try {
100
- $customData = apply_filters('spdsgvo_custom_sar', $this->email);
101
-
102
- //error_log('custom filter result. '.$customData);
103
- if ($customData === $this->email) $customData = NULL;
104
- if ($customData)
105
- {
106
- foreach ($customData as $data) {
107
- $this->addData($data, __('Advanced', 'shapepress-dsgvo'), 'spdsgvo_custom_sar');
108
- }
109
- }
110
-
111
- } catch (Exception $e) {
112
- error_log($e);
113
- }
114
- }
115
-
116
- return $this->getData();
117
- }
118
-
119
- public function crawlLocal()
120
- {
121
- global $wpdb;
122
-
123
- if (! is_a($this->user, 'WP_User')) {
124
-
125
- // search public comments and then return
126
-
127
- $comments = get_comments(array(
128
- 'author_email' => $this->email,
129
- 'type' => ''
130
- ));
131
- foreach ($comments as $comment) {
132
- $this->addData($comment->comment_author, __('Name','shapepress-dsgvo'));
133
- $this->addData($comment->comment_author_email, __('Email','shapepress-dsgvo'));
134
- $this->addData($comment->comment_author_url, __('Url','shapepress-dsgvo'));
135
- $this->addData($comment->comment_author_IP, __('IP Address','shapepress-dsgvo'));
136
- $this->addData($comment->comment_content, __('Comment','shapepress-dsgvo'));
137
- }
138
-
139
- return;
140
- }
141
-
142
- // ====================================================
143
- // WP_User
144
- // ====================================================
145
- $this->addData($this->user->user_login, __('User name','shapepress-dsgvo'));
146
- $this->addData($this->user->user_nicename, __('Name','shapepress-dsgvo'));
147
- $this->addData($this->user->user_url, __('Url','shapepress-dsgvo'));
148
- $this->addData($this->user->display_name, __('Display name','shapepress-dsgvo'));
149
-
150
- // ====================================================
151
- // WP_Usermeta
152
- // ====================================================
153
- foreach (get_user_meta($this->user->ID) as $key => $meta) {
154
- if ($this->isSensativeKey($key)) {
155
- foreach ($meta as $metaValue) {
156
- $this->addData($metaValue);
157
- }
158
- }
159
- }
160
-
161
- // ====================================================
162
- // WP_Comments
163
- // ====================================================
164
- $comments = get_comments(array(
165
- 'user_id' => $this->user->ID
166
- ));
167
- //error_log('comments1: '.implode(', ',$comments));
168
- foreach ($comments as $comment) {
169
- $this->addData($comment->comment_author, __('Name','shapepress-dsgvo'));
170
- $this->addData($comment->comment_author_email, __('Email','shapepress-dsgvo'));
171
- $this->addData($comment->comment_author_url, __('Url','shapepress-dsgvo'));
172
- $this->addData($comment->comment_author_IP, __('IP Address','shapepress-dsgvo'));
173
- $this->addData($comment->comment_content, __('Comment','shapepress-dsgvo'));
174
- }
175
-
176
-
177
- }
178
-
179
- public function integrationsSAR()
180
- {
181
- foreach (SPDSGVOIntegration::getAllIntegrations() as $integration) {
182
- if (method_exists($integration, 'onSubjectAccessRequest')) {
183
- try {
184
- $data = $integration->onSubjectAccessRequest($this->email, $this->firstName, $this->lastName, $this->user);
185
- if (is_array($data)) {
186
- foreach ($data as $value) {
187
- if (is_string($value)) {
188
- $this->addData($value, $integration->title, $integration->name);
189
- } else if (is_array($value)) {
190
- foreach ($value as $valueItem) {
191
- if (is_string($valueItem)) {
192
- $this->addData($valueItem, $integration->title, $integration->name);
193
- }
194
- }
195
- }
196
- }
197
- }
198
- } catch (Exception $e) {}
199
- }
200
- }
201
- }
202
-
203
- public function superUnsubscribe()
204
- {
205
- $this->user = get_user_by('email', $this->email);
206
-
207
- if (is_a($this->user, 'WP_User')) {
208
- $this->superUnsubscribeLocal();
209
- } else
210
- {
211
- $this->superUnsubscribeLocal();
212
- }
213
-
214
- if (isValidPremiumEdition())
215
- {
216
- try {
217
- apply_filters('spdsgvo_custom_unsubscribe', $this->email);
218
-
219
- } catch (Exception $e) {
220
- error_log($e);
221
- }
222
- }
223
-
224
- $this->superUnsubscribeIntegrations();
225
- }
226
-
227
- public function superUnsubscribeLocal()
228
- {
229
- global $wpdb;
230
-
231
- if (! is_a($this->user, 'WP_User')) { // only do commments for not registered ones
232
-
233
- // ======================================================================
234
- // WP_Comments
235
- // ======================================================================
236
- //error_log('not a user '.$this->email);
237
- $wpdb->get_results($wpdb->prepare("
238
- UPDATE $wpdb->comments
239
- SET
240
- comment_author = 'Deleted User',
241
- comment_author_email = %s,
242
- comment_author_url = '',
243
- comment_author_IP = '000.000.000.00'
244
- WHERE comment_author_email = '". $this->email ."'", 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
245
-
246
-
247
- return;
248
- }
249
-
250
- $userID = wp_update_user(array(
251
- 'ID' => $this->user->ID,
252
- 'user_pass' => wp_generate_password(),
253
- 'user_nicename' => 'Deleted User',
254
- 'user_url' => '',
255
- 'display_name' => 'Deleted User',
256
- 'nickname' => 'Deleted User',
257
- 'first_name' => 'Deleted',
258
- 'last_name' => 'User',
259
- 'description' => '',
260
- 'rich_editing' => '',
261
- 'user_registered' => '',
262
- 'role' => '',
263
- 'jabber' => '',
264
- 'aim' => '',
265
- 'yim' => '',
266
- 'show_admin_bar_front' => ''
267
- ));
268
-
269
- $wpdb->get_results($wpdb->prepare("
270
- UPDATE $wpdb->users
271
- SET
272
- user_login = %s,
273
- user_email = %s
274
- WHERE ID = {$this->user->ID}", 'deleted_user_' . wp_generate_password(10, FALSE, FALSE), 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
275
-
276
- // ======================================================================
277
- // WP_Comments
278
- // ======================================================================
279
- $wpdb->get_results($wpdb->prepare("
280
- UPDATE $wpdb->comments
281
- SET
282
- comment_author = 'Deleted User',
283
- comment_author_email = %s,
284
- comment_author_url = '',
285
- comment_author_IP = '000.000.000.00'
286
- WHERE user_id = %d", $this->user->ID, 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
287
-
288
- // ======================================================================
289
- // WP_UserMeta
290
- // ======================================================================
291
- $meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d", $this->user->ID));
292
-
293
- foreach ($meta as $row) {
294
- if ($this->isSensativeKey($row->meta_key)) {
295
- $wpdb->get_results($wpdb->prepare("
296
- UPDATE $wpdb->usermeta
297
- SET
298
- meta_value = 'Deleted'
299
- WHERE umeta_id = %d", $row->umeta_id));
300
- }
301
- }
302
- }
303
-
304
- public function superUnsubscribeIntegrations()
305
- {
306
- foreach (SPDSGVOIntegration::getAllIntegrations() as $integration) {
307
- if (method_exists($integration, 'onSuperUnsubscribe')) {
308
- try {
309
- $integration->onSuperUnsubscribe($this->email, $this->firstName, $this->lastName, $this->user);
310
- } catch (Exception $e) {}
311
- }
312
- }
313
- }
314
-
315
- // ======================================================================
316
- // Helpers
317
- // ======================================================================
318
- public function addIdentifier($identifier, $type)
319
- {
320
- $identifier = strtolower($identifier);
321
-
322
- if (empty($identifier)) {
323
- return;
324
- }
325
-
326
- if (! in_array($identifier, $this->identifiers)) {
327
- $this->identifiers[] = (object) [
328
- 'value' => $identifier,
329
- 'type' => $type
330
- ];
331
- }
332
- }
333
-
334
- public function addData($data, $type = 'misc', $source = 'database')
335
- {
336
- // $data = strtolower($data);
337
- if (empty($data)) {
338
- return;
339
- }
340
- if ($data === '::1') {
341
- return;
342
- }
343
-
344
- foreach ($this->data as $d) {
345
- if ($d->data === $data) {
346
- return;
347
- }
348
- }
349
-
350
- if ($type === 'misc') {
351
- $type = $this->guessDataType($data);
352
- $type = ($type === FALSE) ? 'misc' : $type;
353
- }
354
-
355
- $this->data[] = (object) array(
356
- 'data' => $data,
357
- 'type' => $type,
358
- 'source' => $source
359
- );
360
- $this->totalFound ++;
361
- }
362
-
363
- public function guessDataType($data)
364
- {
365
- $dataToCheck = strtolower($data);
366
-
367
- // IP Addresses
368
- preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $dataToCheck, $IPAddresses);
369
- foreach ($IPAddresses[0] as $ip) {
370
- return 'IP';
371
- }
372
-
373
- // Email
374
- preg_match_all('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $dataToCheck, $emailAdresses);
375
- foreach ($emailAdresses[0] as $emailAddress) {
376
- return __('Email','shapepress-dsgvo');
377
- }
378
-
379
- // Post Code
380
- preg_match_all('/((GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) [0-9][ABD-HJLNP-UW-Z]{2}))/i', $dataToCheck, $postCodes);
381
- foreach ($postCodes[0] as $postCode) {
382
- return __('ZIP Code','shapepress-dsgvo');
383
- }
384
-
385
- // Phone Number
386
- preg_match_all('/^[().+\d -]{5,15}$/', $dataToCheck, $phoneNumbers);
387
- foreach ($phoneNumbers[0] as $phoneNumber) {
388
- if (strlen($phoneNumber) >= 7) {
389
- return __('Phone number','shapepress-dsgvo');
390
- }
391
- }
392
-
393
- // URLs
394
- preg_match_all('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', $dataToCheck, $URLs);
395
- foreach ($URLs[0] as $url) {
396
- if (! empty($url)) {
397
- if (strpos($url, @parse_url($url)['host']) === FALSE) {
398
- if (filter_var($url, FILTER_VALIDATE_URL)) {
399
- return __('Url','shapepress-dsgvo');
400
- }
401
- }
402
- }
403
- }
404
-
405
- // Address
406
- if (strpos($dataToCheck, 'road') !== FALSE || strpos($dataToCheck, 'street') !== FALSE) {
407
- return __('Address','shapepress-dsgvo');
408
- }
409
-
410
- foreach ($this->identifiers as $key => $identifier) {
411
- if ($identifier->value == $dataToCheck) {
412
- return $identifier->type;
413
- }
414
- }
415
-
416
- return false;
417
- }
418
-
419
- public function getData()
420
- {
421
- $done = array();
422
- $data = array();
423
-
424
- foreach ($this->data as $d) {
425
- if (! in_array($d->data, $done)) {
426
- $done[] = $d->data;
427
- $data[] = $d;
428
- }
429
- }
430
-
431
- return $data;
432
- }
433
-
434
- public function getDataByType()
435
- {
436
- $done = array();
437
- $data = array();
438
-
439
- foreach ($this->data as $d) {
440
- if (! in_array($d->data, $done)) {
441
- $done[] = $d->data;
442
-
443
- if (! isset($data[$d->type])) {
444
- $data[$d->type] = array();
445
- }
446
-
447
- $data[$d->type][] = $d;
448
- }
449
- }
450
-
451
- return $data;
452
- }
453
-
454
- public function isSensativeKey($key)
455
- {
456
- return (str_replace($this->sensativeKeys, '', $key) !== $key);
457
- }
458
-
459
- public function searchStringForKnownIdentifiers($string)
460
- {
461
- $identifiers = array_unique($this->identifiers);
462
-
463
- foreach ($identifiers as $identifier) {
464
- if (strpos($string, $identifier) !== FALSE) {
465
- $this->addData($string);
466
- }
467
- }
468
- }
469
- }
1
+ <?php
2
+
3
+ /**
4
+ * Fired during plugin deactivation
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Fired during plugin deactivation.
15
+ *
16
+ * This class defines all code necessary to run during the plugin's deactivation.
17
+ *
18
+ * @since 1.0.0
19
+ * @package WP DSGVO Tools
20
+ * @subpackage WP DSGVO Tools/includes
21
+ * @author Shapepress eU
22
+ */
23
+ class SPDSGVODataCollecter
24
+ {
25
+
26
+ public $email;
27
+
28
+ public $firstName;
29
+
30
+ public $lastName;
31
+
32
+ public $user = NULL;
33
+
34
+ public $totalFound = 0;
35
+
36
+ public $data = array();
37
+
38
+ public $identifiers = array();
39
+
40
+ public $tables = array();
41
+
42
+ public $sensativeKeys = array(
43
+ 'company',
44
+ 'country',
45
+ 'county',
46
+ 'city',
47
+ 'state',
48
+ 'address',
49
+ 'first_name',
50
+ 'last_name',
51
+ 'zip',
52
+ 'zip_code',
53
+ 'post_code',
54
+ 'postcode',
55
+ 'email',
56
+ 'phone',
57
+ 'ip',
58
+ 'ip_address'
59
+ );
60
+
61
+ public function __construct($email, $firstName = '', $lastName = '')
62
+ {
63
+ $this->email = $email;
64
+
65
+ if (! empty($firstName)) {
66
+ $this->addIdentifier($firstName, __('Name','shapepress-dsgvo'));
67
+ $this->firstName = $firstName;
68
+ }
69
+
70
+ if (! empty($lastName)) {
71
+ $this->addIdentifier($lastName, __('Name','shapepress-dsgvo'));
72
+ $this->lastName = $lastName;
73
+ }
74
+
75
+ $this->user = get_user_by('email', $this->email);
76
+ if (is_a($this->user, 'WP_User')) {
77
+ $this->addIdentifier($this->user->user_login, __('Login','shapepress-dsgvo'));
78
+ $this->addIdentifier($this->user->user_nicename, __('Name','shapepress-dsgvo'));
79
+ $this->addIdentifier($this->user->user_email, __('Email','shapepress-dsgvo'));
80
+ $this->addIdentifier($this->user->user_url, __('Url','shapepress-dsgvo'));
81
+ $this->addIdentifier($this->user->display_name, __('Display Name','shapepress-dsgvo'));
82
+ $this->addIdentifier(str_replace('www.', '', @parse_url($this->user->user_url)['host']), __('Url','shapepress-dsgvo'));
83
+ }
84
+ }
85
+
86
+ public function sar()
87
+ {
88
+ if (is_a($this->user, 'WP_User')) {
89
+ $this->crawlLocal();
90
+ }else
91
+ {
92
+ $this->crawlLocal(); // both for now because it only crawls comments
93
+ }
94
+
95
+ $this->integrationsSAR();
96
+
97
+ if (isValidPremiumEdition())
98
+ {
99
+ try {
100
+ $customData = apply_filters('spdsgvo_custom_sar', $this->email);
101
+
102
+ //error_log('custom filter result. '.$customData);
103
+ if ($customData === $this->email) $customData = NULL;
104
+ if ($customData)
105
+ {
106
+ foreach ($customData as $data) {
107
+ $this->addData($data, __('Advanced', 'shapepress-dsgvo'), 'spdsgvo_custom_sar');
108
+ }
109
+ }
110
+
111
+ } catch (Exception $e) {
112
+ error_log($e);
113
+ }
114
+ }
115
+
116
+ return $this->getData();
117
+ }
118
+
119
+ public function crawlLocal()
120
+ {
121
+ global $wpdb;
122
+
123
+ if (! is_a($this->user, 'WP_User')) {
124
+
125
+ // search public comments and then return
126
+
127
+ $comments = get_comments(array(
128
+ 'author_email' => $this->email,
129
+ 'type' => ''
130
+ ));
131
+ foreach ($comments as $comment) {
132
+ $this->addData($comment->comment_author, __('Name','shapepress-dsgvo'));
133
+ $this->addData($comment->comment_author_email, __('Email','shapepress-dsgvo'));
134
+ $this->addData($comment->comment_author_url, __('Url','shapepress-dsgvo'));
135
+ $this->addData($comment->comment_author_IP, __('IP Address','shapepress-dsgvo'));
136
+ $this->addData($comment->comment_content, __('Comment','shapepress-dsgvo'));
137
+ }
138
+
139
+ return;
140
+ }
141
+
142
+ // ====================================================
143
+ // WP_User
144
+ // ====================================================
145
+ $this->addData($this->user->user_login, __('User name','shapepress-dsgvo'));
146
+ $this->addData($this->user->user_nicename, __('Name','shapepress-dsgvo'));
147
+ $this->addData($this->user->user_url, __('Url','shapepress-dsgvo'));
148
+ $this->addData($this->user->display_name, __('Display name','shapepress-dsgvo'));
149
+
150
+ // ====================================================
151
+ // WP_Usermeta
152
+ // ====================================================
153
+ foreach (get_user_meta($this->user->ID) as $key => $meta) {
154
+ if ($this->isSensativeKey($key)) {
155
+ foreach ($meta as $metaValue) {
156
+ $this->addData($metaValue);
157
+ }
158
+ }
159
+ }
160
+
161
+ // ====================================================
162
+ // WP_Comments
163
+ // ====================================================
164
+ $comments = get_comments(array(
165
+ 'user_id' => $this->user->ID
166
+ ));
167
+ //error_log('comments1: '.implode(', ',$comments));
168
+ foreach ($comments as $comment) {
169
+ $this->addData($comment->comment_author, __('Name','shapepress-dsgvo'));
170
+ $this->addData($comment->comment_author_email, __('Email','shapepress-dsgvo'));
171
+ $this->addData($comment->comment_author_url, __('Url','shapepress-dsgvo'));
172
+ $this->addData($comment->comment_author_IP, __('IP Address','shapepress-dsgvo'));
173
+ $this->addData($comment->comment_content, __('Comment','shapepress-dsgvo'));
174
+ }
175
+
176
+
177
+ }
178
+
179
+ public function integrationsSAR()
180
+ {
181
+ foreach (SPDSGVOIntegration::getAllIntegrations(SPDSGVOConstants::CATEGORY_SLUG_PLUGINS) as $integration) {
182
+ if (method_exists($integration, 'onSubjectAccessRequest')) {
183
+ try {
184
+ $data = $integration->onSubjectAccessRequest($this->email, $this->firstName, $this->lastName, $this->user);
185
+ if (is_array($data)) {
186
+ foreach ($data as $value) {
187
+ if (is_string($value)) {
188
+ $this->addData($value, $integration->title, $integration->name);
189
+ } else if (is_array($value)) {
190
+ foreach ($value as $valueItem) {
191
+ if (is_string($valueItem)) {
192
+ $this->addData($valueItem, $integration->title, $integration->name);
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ } catch (Exception $e) {}
199
+ }
200
+ }
201
+ }
202
+
203
+ public function superUnsubscribe()
204
+ {
205
+ $this->user = get_user_by('email', $this->email);
206
+
207
+ if (is_a($this->user, 'WP_User')) {
208
+ $this->superUnsubscribeLocal();
209
+ } else
210
+ {
211
+ $this->superUnsubscribeLocal();
212
+ }
213
+
214
+ if (isValidPremiumEdition())
215
+ {
216
+ try {
217
+ apply_filters('spdsgvo_custom_unsubscribe', $this->email);
218
+
219
+ } catch (Exception $e) {
220
+ error_log($e);
221
+ }
222
+ }
223
+
224
+ $this->superUnsubscribeIntegrations();
225
+ }
226
+
227
+ public function superUnsubscribeLocal()
228
+ {
229
+ global $wpdb;
230
+
231
+ if (! is_a($this->user, 'WP_User')) { // only do commments for not registered ones
232
+
233
+ // ======================================================================
234
+ // WP_Comments
235
+ // ======================================================================
236
+ //error_log('not a user '.$this->email);
237
+ $wpdb->get_results($wpdb->prepare("
238
+ UPDATE $wpdb->comments
239
+ SET
240
+ comment_author = 'Deleted User',
241
+ comment_author_email = %s,
242
+ comment_author_url = '',
243
+ comment_author_IP = '000.000.000.00'
244
+ WHERE comment_author_email = '". $this->email ."'", 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
245
+
246
+
247
+ return;
248
+ }
249
+
250
+ $userID = wp_update_user(array(
251
+ 'ID' => $this->user->ID,
252
+ 'user_pass' => wp_generate_password(),
253
+ 'user_nicename' => 'Deleted User',
254
+ 'user_url' => '',
255
+ 'display_name' => 'Deleted User',
256
+ 'nickname' => 'Deleted User',
257
+ 'first_name' => 'Deleted',
258
+ 'last_name' => 'User',
259
+ 'description' => '',
260
+ 'rich_editing' => '',
261
+ 'user_registered' => '',
262
+ 'role' => '',
263
+ 'jabber' => '',
264
+ 'aim' => '',
265
+ 'yim' => '',
266
+ 'show_admin_bar_front' => ''
267
+ ));
268
+
269
+ $wpdb->get_results($wpdb->prepare("
270
+ UPDATE $wpdb->users
271
+ SET
272
+ user_login = %s,
273
+ user_email = %s
274
+ WHERE ID = {$this->user->ID}", 'deleted_user_' . wp_generate_password(10, FALSE, FALSE), 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
275
+
276
+ // ======================================================================
277
+ // WP_Comments
278
+ // ======================================================================
279
+ $wpdb->get_results($wpdb->prepare("
280
+ UPDATE $wpdb->comments
281
+ SET
282
+ comment_author = 'Deleted User',
283
+ comment_author_email = %s,
284
+ comment_author_url = '',
285
+ comment_author_IP = '000.000.000.00'
286
+ WHERE user_id = %d", $this->user->ID, 'deleted_user_' . wp_generate_password(10, FALSE, FALSE) . '@example.com'));
287
+
288
+ // ======================================================================
289
+ // WP_UserMeta
290
+ // ======================================================================
291
+ $meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d", $this->user->ID));
292
+
293
+ foreach ($meta as $row) {
294
+ if ($this->isSensativeKey($row->meta_key)) {
295
+ $wpdb->get_results($wpdb->prepare("
296
+ UPDATE $wpdb->usermeta
297
+ SET
298
+ meta_value = 'Deleted'
299
+ WHERE umeta_id = %d", $row->umeta_id));
300
+ }
301
+ }
302
+ }
303
+
304
+ public function superUnsubscribeIntegrations()
305
+ {
306
+ foreach (SPDSGVOIntegration::getAllIntegrations(SPDSGVOConstants::CATEGORY_SLUG_PLUGINS) as $integration) {
307
+ if (method_exists($integration, 'onSuperUnsubscribe')) {
308
+ try {
309
+ $integration->onSuperUnsubscribe($this->email, $this->firstName, $this->lastName, $this->user);
310
+ } catch (Exception $e) {}
311
+ }
312
+ }
313
+ }
314
+
315
+ // ======================================================================
316
+ // Helpers
317
+ // ======================================================================
318
+ public function addIdentifier($identifier, $type)
319
+ {
320
+ $identifier = strtolower($identifier);
321
+
322
+ if (empty($identifier)) {
323
+ return;
324
+ }
325
+
326
+ if (! in_array($identifier, $this->identifiers)) {
327
+ $this->identifiers[] = (object) [
328
+ 'value' => $identifier,
329
+ 'type' => $type
330
+ ];
331
+ }
332
+ }
333
+
334
+ public function addData($data, $type = 'misc', $source = 'database')
335
+ {
336
+ // $data = strtolower($data);
337
+ if (empty($data)) {
338
+ return;
339
+ }
340
+ if ($data === '::1') {
341
+ return;
342
+ }
343
+
344
+ foreach ($this->data as $d) {
345
+ if ($d->data === $data) {
346
+ return;
347
+ }
348
+ }
349
+
350
+ if ($type === 'misc') {
351
+ $type = $this->guessDataType($data);
352
+ $type = ($type === FALSE) ? 'misc' : $type;
353
+ }
354
+
355
+ $this->data[] = (object) array(
356
+ 'data' => $data,
357
+ 'type' => $type,
358
+ 'source' => $source
359
+ );
360
+ $this->totalFound ++;
361
+ }
362
+
363
+ public function guessDataType($data)
364
+ {
365
+ $dataToCheck = strtolower($data);
366
+
367
+ // IP Addresses
368
+ preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $dataToCheck, $IPAddresses);
369
+ foreach ($IPAddresses[0] as $ip) {
370
+ return 'IP';
371
+ }
372
+
373
+ // Email
374
+ preg_match_all('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $dataToCheck, $emailAdresses);
375
+ foreach ($emailAdresses[0] as $emailAddress) {
376
+ return __('Email','shapepress-dsgvo');
377
+ }
378
+
379
+ // Post Code
380
+ preg_match_all('/((GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) [0-9][ABD-HJLNP-UW-Z]{2}))/i', $dataToCheck, $postCodes);
381
+ foreach ($postCodes[0] as $postCode) {
382
+ return __('ZIP Code','shapepress-dsgvo');
383
+ }
384
+
385
+ // Phone Number
386
+ preg_match_all('/^[().+\d -]{5,15}$/', $dataToCheck, $phoneNumbers);
387
+ foreach ($phoneNumbers[0] as $phoneNumber) {
388
+ if (strlen($phoneNumber) >= 7) {
389
+ return __('Phone number','shapepress-dsgvo');
390
+ }
391
+ }
392
+
393
+ // URLs
394
+ preg_match_all('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', $dataToCheck, $URLs);
395
+ foreach ($URLs[0] as $url) {
396
+ if (! empty($url)) {
397
+ if (strpos($url, @parse_url($url)['host']) === FALSE) {
398
+ if (filter_var($url, FILTER_VALIDATE_URL)) {
399
+ return __('Url','shapepress-dsgvo');
400
+ }
401
+ }
402
+ }
403
+ }
404
+
405
+ // Address
406
+ if (strpos($dataToCheck, 'road') !== FALSE || strpos($dataToCheck, 'street') !== FALSE) {
407
+ return __('Address','shapepress-dsgvo');
408
+ }
409
+
410
+ foreach ($this->identifiers as $key => $identifier) {
411
+ if ($identifier->value == $dataToCheck) {
412
+ return $identifier->type;
413
+ }
414
+ }
415
+
416
+ return false;
417
+ }
418
+
419
+ public function getData()
420
+ {
421
+ $done = array();
422
+ $data = array();
423
+
424
+ foreach ($this->data as $d) {
425
+ if (! in_array($d->data, $done)) {
426
+ $done[] = $d->data;
427
+ $data[] = $d;
428
+ }
429
+ }
430
+
431
+ return $data;
432
+ }
433
+
434
+ public function getDataByType()
435
+ {
436
+ $done = array();
437
+ $data = array();
438
+
439
+ foreach ($this->data as $d) {
440
+ if (! in_array($d->data, $done)) {
441
+ $done[] = $d->data;
442
+
443
+ if (! isset($data[$d->type])) {
444
+ $data[$d->type] = array();
445
+ }
446
+
447
+ $data[$d->type][] = $d;
448
+ }
449
+ }
450
+
451
+ return $data;
452
+ }
453
+
454
+ public function isSensativeKey($key)
455
+ {
456
+ return (str_replace($this->sensativeKeys, '', $key) !== $key);
457
+ }
458
+
459
+ public function searchStringForKnownIdentifiers($string)
460
+ {
461
+ $identifiers = array_unique($this->identifiers);
462
+
463
+ foreach ($identifiers as $identifier) {
464
+ if (strpos($string, $identifier) !== FALSE) {
465
+ $this->addData($string);
466
+ }
467
+ }
468
+ }
469
+ }
includes/class-sp-dsgvo-deactivator.php CHANGED
@@ -1,36 +1,36 @@
1
- <?php
2
-
3
- /**
4
- * Fired during plugin deactivation
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Fired during plugin deactivation.
15
- *
16
- * This class defines all code necessary to run during the plugin's deactivation.
17
- *
18
- * @since 1.0.0
19
- * @package WP DSGVO Tools
20
- * @subpackage WP DSGVO Tools/includes
21
- * @author Shapepress eU
22
- */
23
- class SPDSGVODeactivator {
24
-
25
- /**
26
- * Short Description. (use period)
27
- *
28
- * Long Description.
29
- *
30
- * @since 1.0.0
31
- */
32
- public static function deactivate(){
33
-
34
- }
35
-
36
- }
1
+ <?php
2
+
3
+ /**
4
+ * Fired during plugin deactivation
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Fired during plugin deactivation.
15
+ *
16
+ * This class defines all code necessary to run during the plugin's deactivation.
17
+ *
18
+ * @since 1.0.0
19
+ * @package WP DSGVO Tools
20
+ * @subpackage WP DSGVO Tools/includes
21
+ * @author Shapepress eU
22
+ */
23
+ class SPDSGVODeactivator {
24
+
25
+ /**
26
+ * Short Description. (use period)
27
+ *
28
+ * Long Description.
29
+ *
30
+ * @since 1.0.0
31
+ */
32
+ public static function deactivate(){
33
+
34
+ }
35
+
36
+ }
includes/class-sp-dsgvo-integration-api-base.php ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ abstract class SPDSGVOIntegrationApiBase
4
+ {
5
+
6
+ public $name = "";
7
+ public $company = "";
8
+ public $country = "";
9
+ public $slug = '';
10
+ public $storageId = '';
11
+ public $cookieCategory ='';
12
+ public $cookieNames = '';
13
+ public $isPremium = false;
14
+ public $insertLocation = 'body';
15
+ public $isTagManagerCompatible = false;
16
+ public $optInNeeded = true;
17
+ public $optionTechMandatory = false;
18
+
19
+ protected function __construct()
20
+ {
21
+ }
22
+
23
+ final private function __clone()
24
+ {
25
+ }
26
+
27
+ final public static function getInstance()
28
+ {
29
+ static $instances = array();
30
+
31
+ $calledClass = get_called_class();
32
+
33
+ if (!isset($instances[$calledClass]))
34
+ {
35
+ $instances[$calledClass] = new $calledClass();
36
+ }
37
+
38
+ return $instances[$calledClass];
39
+ }
40
+
41
+ public final function getName()
42
+ {
43
+ return $this->name;
44
+ }
45
+
46
+ public final function getCompany()
47
+ {
48
+ return $this->company;
49
+ }
50
+
51
+ public final function getCountry()
52
+ {
53
+ return __($this->country, 'shapepress-dsgvo');
54
+ }
55
+
56
+ public final function getStorageId()
57
+ {
58
+ return $this->storageId;
59
+ }
60
+
61
+ public final function getSlug()
62
+ {
63
+ return $this->slug;
64
+ }
65
+
66
+ public final function getCookieNames()
67
+ {
68
+ return $this->cookieNames;
69
+ }
70
+
71
+ public final function getCategory($backendMode = false)
72
+ {
73
+ if ($backendMode == false && $this->getIsTechMandatoryOptionEnabled() == true)
74
+ {
75
+ $settings = $this->getSettings();
76
+ if ($settings['showAsTechMandatory'] == '1') return SPDSGVOConstants::CATEGORY_SLUG_MANDATORY;
77
+ else return $this->cookieCategory;
78
+ } else {
79
+ return $this->cookieCategory;
80
+ }
81
+ }
82
+
83
+ public final function getIsPremium()
84
+ {
85
+ return $this->isPremium;
86
+ }
87
+
88
+ public final function getInsertLocation()
89
+ {
90
+ return $this->insertLocation;
91
+
92
+ }
93
+
94
+ public final function getIsTagManagerCompatible()
95
+ {
96
+ return $this->isTagManagerCompatible;
97
+
98
+ }
99
+
100
+ public function getIfOptInNeeded()
101
+ {
102
+ return $this->optInNeeded;
103
+
104
+ }
105
+
106
+ public function getIsTechMandatoryOptionEnabled()
107
+ {
108
+ return $this->optionTechMandatory;
109
+ }
110
+
111
+ public function getDefaultSettings($ownCodeEnabledByDefault = false)
112
+ {
113
+ $settings = array();
114
+ $settings['enabled'] = '0';
115
+ $settings['propertyId'] = '';
116
+ $settings['useOwnCode'] = $ownCodeEnabledByDefault ? '1' : '0';
117
+ $settings['jsCode'] = $this->getDefaultJsCode('YourCodeHere');
118
+ $settings['cookieNames'] = $this->cookieNames;
119
+ $settings['withGtm'] = '0';
120
+ $settings['showAsTechMandatory'] = '0';
121
+
122
+ return $settings;
123
+ }
124
+
125
+ public function getJsCode($settings = null)
126
+ {
127
+ if (isset($settings) == false)
128
+ {
129
+ $settings = $this->getSettings();
130
+ }
131
+
132
+ if (empty($settings['jsCode'])) {
133
+ $settings['jsCode'] = $this->getDefaultJsCode($settings['propertyId']);
134
+ }
135
+
136
+ return $settings['jsCode'];
137
+ }
138
+
139
+ public final function checkIfIntegrationIsAllowed($integrationSlug)
140
+ {
141
+ // first check if the visitor interacted with our notice/plugin
142
+ $cookieDecisionMade = isset($_COOKIE[SPDSGVOConstants::CCOKIE_NAME]);
143
+ if ($cookieDecisionMade == false) return false;
144
+
145
+ // the settings are stored in an array like "integration-slug" => '0'
146
+ $integrationSettings = json_decode(stripslashes($_COOKIE[SPDSGVOConstants::CCOKIE_NAME]));
147
+ if (isset($integrationSettings->integrations) == false) return false;
148
+
149
+ return in_array($integrationSlug, $integrationSettings->integrations);
150
+
151
+
152
+ }
153
+
154
+ public final function getIsEnabled()
155
+ {
156
+ $settings = $this->getSettings();
157
+
158
+ return $settings['enabled'] == '1';
159
+ }
160
+
161
+ public final function getSettings()
162
+ {
163
+ $storageId = 'integration_'.$this->storageId;
164
+ $defaultSettings = $this->getDefaultSettings();
165
+ $settings = SPDSGVOSettings::get($storageId);
166
+ if (is_array($settings) == false) $settings = [];
167
+
168
+ $settings = array_merge($defaultSettings, $settings);
169
+
170
+ return $settings;
171
+ }
172
+
173
+ public final function setSettings($settings)
174
+ {
175
+ $storageId = 'integration_'.$this->storageId;
176
+
177
+ SPDSGVOSettings::set($storageId, $settings);
178
+ SPDSGVOCacheManager::clearCaches();
179
+ }
180
+
181
+ protected function checkIfIntegrationIsAllowedByCookie($settings)
182
+ {
183
+ $integrationAllowed = false;
184
+ if ($this->getIfOptInNeeded() == false) return true;
185
+
186
+ if (array_key_exists('cloudMode', $settings) && $settings['cloudMode'] == '0')
187
+ {
188
+ $integrationAllowed = true;
189
+ } else
190
+ {
191
+ $integrationAllowed = $this->checkIfIntegrationIsAllowed($this->slug);
192
+ }
193
+
194
+ return $integrationAllowed;
195
+ }
196
+
197
+ public function processHeadAction()
198
+ {
199
+ if ($this->insertLocation != 'head') return;
200
+
201
+ $settings = $this->getSettings();
202
+
203
+ if ($settings['enabled'] == '0') return;
204
+ $propertyId = $settings['propertyId'];
205
+
206
+ $integrationAllowed = $this->checkIfIntegrationIsAllowedByCookie($settings);
207
+
208
+ $jsCode = $this->getJsCode($settings);
209
+
210
+ $result = "";
211
+
212
+ $result = "<!-- id='sp-dsgvo-script-container-$this->slug' class='sp-dsgvo-script-container'-->$jsCode<!-- end sp-dsgvo-script-container-$this->slug -->";
213
+
214
+ if ($integrationAllowed) {
215
+ echo $result;
216
+ }
217
+ return;
218
+ }
219
+
220
+ public function processBodyEndAction()
221
+ {
222
+ if ($this->insertLocation != 'body') return;
223
+
224
+ $settings = $this->getSettings();
225
+
226
+ if ($settings['enabled'] == '0') return;
227
+ $propertyId = $settings['propertyId'];
228
+
229
+ $integrationAllowed = $this->checkIfIntegrationIsAllowedByCookie($settings);
230
+ $jsCode = $this->getJsCode($settings);
231
+
232
+ $result = "";
233
+
234
+ $result = "<div class='sp-dsgvo-script-container sp-dsgvo-script-container-$this->slug'>
235
+ $jsCode<!-- hook body-->
236
+ </div>";
237
+
238
+ if ($integrationAllowed) {
239
+ echo $result;
240
+ }
241
+ return;
242
+ }
243
+
244
+ public function processBodyStartAction()
245
+ {
246
+ if ($this->insertLocation != 'body') return;
247
+
248
+ $settings = $this->getSettings();
249
+
250
+ if ($settings['enabled'] == '0') return;
251
+ $propertyId = $settings['propertyId'];
252
+
253
+ $integrationAllowed = $this->checkIfIntegrationIsAllowedByCookie($settings);
254
+ $jsCode = $this->getJsCode($settings);
255
+
256
+ $result = "";
257
+
258
+ $result = "<div class='sp-dsgvo-script-container sp-dsgvo-script-container-$this->slug'>
259
+ $jsCode<!-- hook body-->
260
+ </div>";
261
+
262
+ if ($integrationAllowed) {
263
+ echo $result;
264
+ }
265
+ return;
266
+ }
267
+
268
+ public final function register(){
269
+ $class = get_called_class();
270
+ $self = new $class();
271
+
272
+ add_filter('sp_dsgvo_integrationapis_'.$this->getCategory(), array($class::getInstance(), 'registerCallback'));
273
+
274
+ }
275
+
276
+ public function registerCallback($integrations)
277
+ {
278
+
279
+ $class = get_called_class();
280
+ $slug = $class::getInstance()->getSlug();
281
+
282
+ $integrations[$slug] = $class::getInstance();
283
+ return $integrations;
284
+
285
+ }
286
+
287
+ public static function getAllIntegrationApis($type, $safe = TRUE)
288
+ {
289
+ return apply_filters('sp_dsgvo_integrationapis_'.$type, array());
290
+ }
291
+ }
includes/class-sp-dsgvo-integration.php CHANGED
@@ -1,98 +1,104 @@
1
- <?php
2
-
3
- class SPDSGVOIntegration extends SPDSGVOAdminTab{
4
-
5
- public function __construct(){
6
- $this->isHidden = FALSE;
7
-
8
- if(method_exists($this, 'boot')){
9
- $this->boot();
10
- }
11
- }
12
-
13
- public static function register(){
14
- $class = get_called_class();
15
- $self = new $class();
16
-
17
- if(method_exists($self, 'viewSubmit')){
18
- $action = $class::action();
19
- add_action("wp_ajax_{$action}", array($self, 'viewSubmit'));
20
- add_action("wp_ajax_nopriv_{$action}", array($self, 'viewSubmit'));
21
- }
22
-
23
- add_filter('sp_dsgvo_integrations', array($class, 'registerCallback'));
24
-
25
- if(self::isEnabled($self->slug)){
26
- add_filter('sp_dsgvo_integrations_safe', array($class, 'registerCallback'));
27
- }
28
- }
29
-
30
- public static function registerCallback($integrations){
31
- $class = get_called_class();
32
- $self = new $class;
33
- $integrations[$self->slug] = $self;
34
- return $integrations;
35
- }
36
-
37
- public static function getAllIntegrations($safe = TRUE){
38
- if($safe){
39
- return apply_filters('sp_dsgvo_integrations_safe', array());
40
- }else{
41
- return apply_filters('sp_dsgvo_integrations', array());
42
- }
43
- }
44
-
45
- public static function action(){
46
- $class = get_called_class();
47
- return 'SPDSGVO-integration-'. self::slug();
48
- }
49
-
50
- public static function slug(){
51
- $class = get_called_class();
52
- $self = new $class;
53
- return $self->slug;
54
- }
55
-
56
- // Note: I did this because I don't
57
- // like the method name page() now,
58
- // I prefur name view() instead. So
59
- // that's why this dirty function exists
60
- public function page(){
61
- if(method_exists($this, 'view')){
62
- $this->view();
63
- }
64
- }
65
-
66
-
67
- // -----------------------------------------------------
68
- // Helpers
69
- // -----------------------------------------------------
70
- public static function formURL(){
71
- return admin_url('/admin-ajax.php');
72
- }
73
-
74
- public static function isEnabled($slug){
75
- return SPDSGVOSettings::get('is_enabled_'.$slug) === SPDSGVOSettings::get('integration_enable_key');
76
- }
77
-
78
- public function has($key){
79
- return isset($_REQUEST[$key]);
80
- }
81
-
82
- public function get($key, $default = NULL, $stripslashes = TRUE){
83
- if($this->has($key)){
84
- if($stripslashes){
85
- return stripslashes($_REQUEST[$key]);
86
- }
87
- return $_REQUEST[$key];
88
- }
89
- return $default;
90
- }
91
-
92
- public function redirectBack(){
93
- ob_clean();
94
- header('Location: '. $_SERVER['HTTP_REFERER']);
95
- die();
96
- }
97
-
 
 
 
 
 
 
98
  }
1
+ <?php
2
+
3
+ class SPDSGVOIntegration extends SPDSGVOAdminTab{
4
+
5
+ public $integrationCategory = '';
6
+ public $slug = '';
7
+ public $title = '';
8
+ public $isPremium = false;
9
+ public $apiInstance = null;
10
+
11
+ public function __construct(){
12
+ $this->isHidden = FALSE;
13
+
14
+ if(method_exists($this, 'boot')){
15
+ $this->boot();
16
+ }
17
+ }
18
+
19
+ public static function register(){
20
+ $class = get_called_class();
21
+ $self = new $class();
22
+
23
+ if(method_exists($self, 'viewSubmit')){
24
+ $action = $class::action();
25
+ add_action("wp_ajax_{$action}", array($self, 'viewSubmit'));
26
+ add_action("wp_ajax_nopriv_{$action}", array($self, 'viewSubmit'));
27
+ }
28
+
29
+ add_filter('sp_dsgvo_integrations_'.$self->integrationCategory, array($class, 'registerCallback'));
30
+
31
+ if(self::isEnabled($self->slug)){
32
+ add_filter('sp_dsgvo_integrations_safe_'.$self->integrationCategory, array($class, 'registerCallback'));
33
+ }
34
+ }
35
+
36
+ public static function registerCallback($integrations){
37
+ $class = get_called_class();
38
+ $self = new $class;
39
+ $integrations[$self->slug] = $self;
40
+ return $integrations;
41
+ }
42
+
43
+ public static function getAllIntegrations($type, $safe = TRUE){
44
+ if($safe){
45
+ return apply_filters('sp_dsgvo_integrations_safe_'.$type, array());
46
+ }else{
47
+ return apply_filters('sp_dsgvo_integrations_'.$type, array());
48
+ }
49
+ }
50
+
51
+ public static function action(){
52
+ $class = get_called_class();
53
+ return 'SPDSGVO-integration-'. self::slug();
54
+ }
55
+
56
+ public static function slug(){
57
+ $class = get_called_class();
58
+ $self = new $class;
59
+ return $self->slug;
60
+ }
61
+
62
+ // Note: I did this because I don't
63
+ // like the method name page() now,
64
+ // I prefur name view() instead. So
65
+ // that's why this dirty function exists
66
+ public function page(){
67
+ if(method_exists($this, 'view')){
68
+ $this->view();
69
+ }
70
+ }
71
+
72
+
73
+ // -----------------------------------------------------
74
+ // Helpers
75
+ // -----------------------------------------------------
76
+ public static function formURL(){
77
+ return admin_url('/admin-ajax.php');
78
+ }
79
+
80
+ public static function isEnabled($slug){
81
+ return SPDSGVOSettings::get('is_enabled_'.$slug) === SPDSGVOSettings::get('integration_enable_key');
82
+ }
83
+
84
+ public function has($key){
85
+ return isset($_REQUEST[$key]);
86
+ }
87
+
88
+ public function get($key, $default = NULL, $stripslashes = TRUE){
89
+ if($this->has($key)){
90
+ if($stripslashes){
91
+ return stripslashes($_REQUEST[$key]);
92
+ }
93
+ return $_REQUEST[$key];
94
+ }
95
+ return $default;
96
+ }
97
+
98
+ public function redirectBack(){
99
+ ob_clean();
100
+ header('Location: '. $_SERVER['HTTP_REFERER']);
101
+ die();
102
+ }
103
+
104
  }
includes/class-sp-dsgvo-javascript.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOJavascript
4
+ {
5
+ final public static function getInstance()
6
+ {
7
+ static $instances = array();
8
+
9
+ $calledClass = get_called_class();
10
+
11
+ if (!isset($instances[$calledClass]))
12
+ {
13
+ $instances[$calledClass] = new $calledClass();
14
+ }
15
+
16
+ return $instances[$calledClass];
17
+ }
18
+
19
+ public function register()
20
+ {
21
+ $settings = SPDSGVOSettings::getAll();
22
+
23
+ $integrationConfig = array();
24
+
25
+ $allCategories = SPDSGVOCookieCategoryApi::getCookieCategories();
26
+
27
+ $allIntegrationSlugs = [];
28
+ $gtmNeeded = 0;
29
+ foreach ($allCategories as $currentCategory)
30
+ {
31
+ $categorySlug = $currentCategory['slug'];
32
+ $categoryData = $currentCategory;
33
+ if ($categoryData == null) return;
34
+
35
+
36
+ // fetch all integrations with given category and check if they are enabled
37
+ $integrations = SPDSGVOIntegrationApiBase::getAllIntegrationApis($categorySlug, FALSE);
38
+
39
+ foreach ($integrations as $integrationSlug => $integration)
40
+ {
41
+ if ($integration->getIsEnabled() == false) continue;
42
+ if ($integration->getIfOptInNeeded() == false) continue;
43
+
44
+ $allIntegrationSlugs[] = $integrationSlug;
45
+
46
+ $integrationSettings = $settings['integration_'.$integration->getStorageId()];
47
+ $integrationConfig[] = [
48
+ 'slug' => $integrationSlug,
49
+ 'category' => $integration->getCategory(),
50
+ //'enabled' => $integration->getIsEnabled(),
51
+ 'cookieNames' => $integration->getCookieNames(),
52
+ 'insertLocation' => $integration->getInsertLocation(),
53
+ 'withGtm' => (array_key_exists('withGtm', $integrationSettings) && $integrationSettings['withGtm'] != '0') ? '1' : '0',
54
+ 'jsCode' => base64_encode(($integration->getJsCode($integrationSettings)))
55
+ ];
56
+
57
+ $gtmNeeded += (array_key_exists('withGtm', $integrationSettings) && $integrationSettings['withGtm'] != '0') ? 1 : 0;
58
+ if ($gtmNeeded > 0)
59
+ {
60
+ $allIntegrationSlugs[] = SPDSGVOGoogleTagmanagerApi::getInstance()->getSlug();
61
+ $integrationConfig[] = [
62
+ 'slug' => SPDSGVOGoogleTagmanagerApi::getInstance()->getSlug(),
63
+ 'category' => SPDSGVOGoogleTagmanagerApi::getInstance()->getCategory(),
64
+ //'enabled' => $integration->getIsEnabled(),
65
+ 'cookieNames' => SPDSGVOGoogleTagmanagerApi::getInstance()->getCookieNames(),
66
+ 'insertLocation' => SPDSGVOGoogleTagmanagerApi::getInstance()->getInsertLocation(),
67
+ 'withGtm' => '0',
68
+ 'jsCode' => base64_encode((SPDSGVOGoogleTagmanagerApi::getInstance()->getJsCode()))
69
+ ];
70
+ }
71
+ }
72
+ }
73
+
74
+ $generalConfig = [
75
+ 'ajaxUrl' => admin_url('admin-ajax.php'),
76
+ 'cookieName' => SPDSGVOConstants::CCOKIE_NAME,
77
+ 'cookieVersion' => $settings['cookie_version'],
78
+ 'cookieLifeTime' => $settings['cn_cookie_validity'],
79
+ //'cookieDomain' => '',
80
+ 'locale' => SPDSGVOLanguageTools::getInstance()->getCurrentLanguageCode(),
81
+ 'privacyPolicyPageId' => $settings['privacy_policy_page'],
82
+ 'privacyPolicyPageUrl' => get_permalink($settings['privacy_policy_page']),
83
+ 'imprintPageId' => $settings['imprint_page'],
84
+ 'imprintPageUrl' => get_permalink($settings['imprint_page']),
85
+ 'showNoticeOnClose' => $settings['show_notice_on_close'],
86
+ 'initialDisplayType' => $settings['cookie_notice_display'],
87
+ 'allIntegrationSlugs' => $allIntegrationSlugs,
88
+ 'noticeHideEffect' =>$settings['cn_animation'],
89
+ 'noticeOnScroll' => false,
90
+ 'noticeOnScrollOffset' => 100,
91
+ 'currentPageId' => get_the_ID(),
92
+ 'forceCookieInfo' => $settings['force_cookie_info']
93
+ ];
94
+
95
+ wp_localize_script(sp_dsgvo_NAME, 'spDsgvoGeneralConfig', $generalConfig);
96
+
97
+
98
+ wp_localize_script(sp_dsgvo_NAME, 'spDsgvoIntegrationConfig', $integrationConfig);
99
+
100
+ }
101
+
102
+ }
includes/class-sp-dsgvo-language-tools.php ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOLanguageTools
4
+ {
5
+ public $defaultLanguage = 'en_EN';
6
+
7
+
8
+ private static $instance;
9
+
10
+ public function __construct()
11
+ {
12
+ $this->defaultLanguage = get_option('WPLANG', 'en_EN');
13
+ }
14
+
15
+
16
+ public static function init()
17
+ {
18
+ return new self;
19
+ }
20
+
21
+ public static function getInstance()
22
+ {
23
+ if (null === self::$instance) {
24
+ self::$instance = new self;
25
+ }
26
+
27
+ return self::$instance;
28
+ }
29
+
30
+ public function checkIfLanguagePluginIsActive()
31
+ {
32
+ return $this->getTypeOfLanguagePlugin() != 'none';
33
+ }
34
+
35
+ public function getTypeOfLanguagePlugin()
36
+ {
37
+ if ((defined('ICL_LANGUAGE_CODE') || defined('POLYLANG_FILE')) == false) return 'none';
38
+ else {
39
+ if(function_exists('icl_get_languages')) return 'wpml';
40
+ if(function_exists('pll_current_language')) return 'polylang';
41
+ }
42
+
43
+ return "none";
44
+ }
45
+
46
+ public function getCurrentLanguageCode()
47
+ {
48
+ $currentLanguage = null;
49
+
50
+ switch ($this->getTypeOfLanguagePlugin())
51
+ {
52
+ case "wpml":
53
+ $currentLanguage = apply_filters('wpml_current_language', null);
54
+ break;
55
+ case "polylang":
56
+ $currentLanguage = pll_current_language();
57
+ // get default language if we dont get a current one
58
+ if (empty($currentLanguage)) {
59
+ $currentLanguage = pll_default_language();
60
+ }
61
+ break;
62
+ case "none":
63
+ $currentLanguage = $this->defaultLanguage;
64
+ break;
65
+ default:
66
+ $currentLanguage = $this->defaultLanguage;
67
+ }
68
+
69
+ if (empty($currentLanguage) || $currentLanguage === 'all') {
70
+ $currentLanguage = $this->getDefaultLanguageCode();
71
+ }
72
+
73
+ return $this->normalizeLocaleCode($currentLanguage);
74
+ }
75
+
76
+ public function getDefaultLanguageCode()
77
+ {
78
+ $currentLanguage = null;
79
+
80
+ switch ($this->getTypeOfLanguagePlugin())
81
+ {
82
+ case "wpml":
83
+ $currentLanguage = apply_filters('wpml_default_language', null);
84
+ break;
85
+ case "polylang":
86
+ $currentLanguage = pll_default_language();
87
+ // get default language if we dont get a current one
88
+ if (empty($currentLanguage)) {
89
+ $currentLanguage = pll_default_language();
90
+ }
91
+ break;
92
+ case "none":
93
+ $currentLanguage = $this->defaultLanguage;
94
+ break;
95
+ default:
96
+ $currentLanguage = $this->defaultLanguage;
97
+ }
98
+
99
+ if (empty($currentLanguage) || $currentLanguage === 'all') {
100
+ $currentLanguage = $this->defaultLanguage;
101
+ }
102
+
103
+ return $this->normalizeLocaleCode($currentLanguage);
104
+
105
+ }
106
+
107
+ static function normalizeLocaleCode($locale)
108
+ {
109
+ try {
110
+ if (substr( $locale, 0, 2 ) === 'de') $locale = 'de_DE';
111
+ if (substr( $locale, 0, 2 ) === 'en') $locale = 'en_EN';
112
+ if (substr( $locale, 0, 2 ) === 'fr') $locale = 'fr_FR';
113
+ if (substr( $locale, 0, 2 ) === 'it') $locale = 'it_IT';
114
+ if ($locale === "") $locale = "en_EN";
115
+ return $locale;
116
+ } catch (Exception $e) {
117
+ return 'en_EN';
118
+ }
119
+ }
120
+
121
+ public static function updateLwTexts()
122
+ {
123
+ $lang = SPDSGVOSettings::get('spdsgvo_company_info_countrycode', '');
124
+ if ($lang == '') return;
125
+
126
+
127
+ $version = SPDSGVOSettings::get('legal_web_texts_version', '0');
128
+
129
+ $url = SPDSGVOConstants::LEGAL_WEB_TEXT_SERVICE_URL;
130
+ $url .= '?lang=' . $lang;
131
+ $url .= '&version=' . $version;
132
+ $url .= '&apiVersion=' . SPDSGVOConstants::LEGAL_WEB_TEXT_SERVICE_VERSION;
133
+
134
+ $request = wp_remote_get($url);
135
+
136
+ if (is_wp_error($request)) {
137
+
138
+ error_log(__('error while updating language texts: ', 'shapepress-dsgvo') . $request->get_error_message()); // Bail early
139
+ } else {
140
+ SPDSGVOSettings::set('legal_web_texts_last_check', time());
141
+
142
+ $result = wp_remote_retrieve_body($request);
143
+ if (strpos($result, "INFO") === 0)
144
+ {
145
+ // file actual, just return saved texts
146
+ $existingTexts = SPDSGVOSettings::get('legal_web_texts', '');
147
+ return $existingTexts;
148
+ } else if (strpos($result, "ERROR") !== 0) {
149
+
150
+ $resultCleaned = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $result);
151
+
152
+ // try to create json. if success then store
153
+ $xmlTextsJson = json_decode($resultCleaned, true);
154
+
155
+ if ($xmlTextsJson != null) {
156
+ $xmlTextsBase64 = base64_encode($xmlTextsJson['Texts']);
157
+ $version = $xmlTextsJson['Version'];
158
+ $lang = $xmlTextsJson['Language'];
159
+ if ($version == null || $version == '') $version = time();
160
+
161
+ SPDSGVOSettings::set('legal_web_texts', $xmlTextsBase64);
162
+ SPDSGVOSettings::set('legal_web_texts_version', $version);
163
+ SPDSGVOSettings::set('legal_web_texts_lang', $lang);
164
+ SPDSGVOSettings::set('legal_web_texts_last_update', time());
165
+ SPDSGVOSettings::set('show_notice_privacy_policy_texts_outdated', '0');
166
+
167
+ return $xmlTextsBase64;
168
+ } else {
169
+ $jsonError = json_last_error();
170
+ error_log('wrong texts received. json_error: '.$jsonError); // Bail early
171
+ }
172
+
173
+ } else
174
+ {
175
+ error_log('shapepress-dsgvo: updateLwTexts: '. $result);
176
+ }
177
+ }
178
+ }
179
+
180
+
181
+ static function getLwText($slug, $textId, $lang = '')
182
+ {
183
+
184
+ $enc = SPDSGVOSettings::get('legal_web_texts', '');
185
+ if ($enc == null || strlen($enc) < 10)
186
+ {
187
+ $enc = self::updateLwTexts();
188
+ }
189
+ if ($enc == null || strlen($enc) < 10) return '';
190
+
191
+ $dec = base64_decode($enc);
192
+ $xmlTexts = json_decode($dec, true);
193
+ if ($xmlTexts == false) return '';
194
+
195
+ if (array_key_exists($slug, $xmlTexts) == false) return '';
196
+
197
+ if ($lang == '' )$lang = self::normalizeLocaleCode((new self)->getCurrentLanguageCode());
198
+ if (array_key_exists($textId, $xmlTexts[$slug]) == false) return '';
199
+ // check if needed lang exists. if not, take default lang
200
+ if (array_key_exists($lang, $xmlTexts[$slug][$textId]) == false)
201
+ {
202
+ $defaultLang = self::normalizeLocaleCode(SPDSGVOLanguageTools::getInstance()->getDefaultLanguageCode());
203
+ if (array_key_exists($defaultLang, $xmlTexts[$slug][$textId]) == false)
204
+ {
205
+ return trim($xmlTexts[$slug][$textId]['en_EN']);
206
+ } else {
207
+ return trim($xmlTexts[$slug][$textId][$defaultLang]);
208
+ }
209
+
210
+ }
211
+
212
+ return trim($xmlTexts[$slug][$textId][$lang]);
213
+ }
214
+
215
+ static function getPrivacyPolicyText($slug, $lang='')
216
+ {
217
+ return self::getLwText($slug, 'privacy-policy', $lang);
218
+ }
219
+ }
includes/class-sp-dsgvo-loader.php CHANGED
@@ -1,128 +1,128 @@
1
- <?php
2
-
3
- /**
4
- * Register all actions and filters for the plugin
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Register all actions and filters for the plugin.
15
- *
16
- * Maintain a list of all hooks that are registered throughout
17
- * the plugin, and register them with the WordPress API. Call the
18
- * run function to execute the list of actions and filters.
19
- *
20
- * @package WP DSGVO Tools
21
- * @subpackage WP DSGVO Tools/includes
22
- * @author Shapepress eU
23
- */
24
- class SPDSGVOLoader{
25
-
26
- /**
27
- * The array of actions registered with WordPress.
28
- *
29
- * @since 1.0.0
30
- * @access protected
31
- * @var array $actions The actions registered with WordPress to fire when the plugin loads.
32
- */
33
- protected $actions;
34
-
35
- /**
36
- * The array of filters registered with WordPress.
37
- *
38
- * @since 1.0.0
39
- * @access protected
40
- * @var array $filters The filters registered with WordPress to fire when the plugin loads.
41
- */
42
- protected $filters;
43
-
44
- /**
45
- * Initialize the collections used to maintain the actions and filters.
46
- *
47
- * @since 1.0.0
48
- */
49
- public function __construct() {
50
-
51
- $this->actions = array();
52
- $this->filters = array();
53
-
54
- }
55
-
56
- /**
57
- * Add a new action to the collection to be registered with WordPress.
58
- *
59
- * @since 1.0.0
60
- * @param string $hook The name of the WordPress action that is being registered.
61
- * @param object $component A reference to the instance of the object on which the action is defined.
62
- * @param string $callback The name of the function definition on the $component.
63
- * @param int $priority Optional. The priority at which the function should be fired. Default is 10.
64
- * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1.
65
- */
66
- public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
67
- $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
68
- }
69
-
70
- /**
71
- * Add a new filter to the collection to be registered with WordPress.
72
- *
73
- * @since 1.0.0
74
- * @param string $hook The name of the WordPress filter that is being registered.
75
- * @param object $component A reference to the instance of the object on which the filter is defined.
76
- * @param string $callback The name of the function definition on the $component.
77
- * @param int $priority Optional. The priority at which the function should be fired. Default is 10.
78
- * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1
79
- */
80
- public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
81
- $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
82
- }
83
-
84
- /**
85
- * A utility function that is used to register the actions and hooks into a single
86
- * collection.
87
- *
88
- * @since 1.0.0
89
- * @access private
90
- * @param array $hooks The collection of hooks that is being registered (that is, actions or filters).
91
- * @param string $hook The name of the WordPress filter that is being registered.
92
- * @param object $component A reference to the instance of the object on which the filter is defined.
93
- * @param string $callback The name of the function definition on the $component.
94
- * @param int $priority The priority at which the function should be fired.
95
- * @param int $accepted_args The number of arguments that should be passed to the $callback.
96
- * @return array The collection of actions and filters registered with WordPress.
97
- */
98
- private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
99
-
100
- $hooks[] = array(
101
- 'hook' => $hook,
102
- 'component' => $component,
103
- 'callback' => $callback,
104
- 'priority' => $priority,
105
- 'accepted_args' => $accepted_args
106
- );
107
-
108
- return $hooks;
109
-
110
- }
111
-
112
- /**
113
- * Register the filters and actions with WordPress.
114
- *
115
- * @since 1.0.0
116
- */
117
- public function run(){
118
- foreach ( $this->filters as $hook ) {
119
- add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
120
- }
121
-
122
- foreach ( $this->actions as $hook ) {
123
- add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
124
- }
125
-
126
- }
127
-
128
- }
1
+ <?php
2
+
3
+ /**
4
+ * Register all actions and filters for the plugin
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Register all actions and filters for the plugin.
15
+ *
16
+ * Maintain a list of all hooks that are registered throughout
17
+ * the plugin, and register them with the WordPress API. Call the
18
+ * run function to execute the list of actions and filters.
19
+ *
20
+ * @package WP DSGVO Tools
21
+ * @subpackage WP DSGVO Tools/includes
22
+ * @author Shapepress eU
23
+ */
24
+ class SPDSGVOLoader{
25
+
26
+ /**
27
+ * The array of actions registered with WordPress.
28
+ *
29
+ * @since 1.0.0
30
+ * @access protected
31
+ * @var array $actions The actions registered with WordPress to fire when the plugin loads.
32
+ */
33
+ protected $actions;
34
+
35
+ /**
36
+ * The array of filters registered with WordPress.
37
+ *
38
+ * @since 1.0.0
39
+ * @access protected
40
+ * @var array $filters The filters registered with WordPress to fire when the plugin loads.
41
+ */
42
+ protected $filters;
43
+
44
+ /**
45
+ * Initialize the collections used to maintain the actions and filters.
46
+ *
47
+ * @since 1.0.0
48
+ */
49
+ public function __construct() {
50
+
51
+ $this->actions = array();
52
+ $this->filters = array();
53
+
54
+ }
55
+
56
+ /**
57
+ * Add a new action to the collection to be registered with WordPress.
58
+ *
59
+ * @since 1.0.0
60
+ * @param string $hook The name of the WordPress action that is being registered.
61
+ * @param object $component A reference to the instance of the object on which the action is defined.
62
+ * @param string $callback The name of the function definition on the $component.
63
+ * @param int $priority Optional. The priority at which the function should be fired. Default is 10.
64
+ * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1.
65
+ */
66
+ public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
67
+ $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
68
+ }
69
+
70
+ /**
71
+ * Add a new filter to the collection to be registered with WordPress.
72
+ *
73
+ * @since 1.0.0
74
+ * @param string $hook The name of the WordPress filter that is being registered.
75
+ * @param object $component A reference to the instance of the object on which the filter is defined.
76
+ * @param string $callback The name of the function definition on the $component.
77
+ * @param int $priority Optional. The priority at which the function should be fired. Default is 10.
78
+ * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1
79
+ */
80
+ public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
81
+ $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
82
+ }
83
+
84
+ /**
85
+ * A utility function that is used to register the actions and hooks into a single
86
+ * collection.
87
+ *
88
+ * @since 1.0.0
89
+ * @access private
90
+ * @param array $hooks The collection of hooks that is being registered (that is, actions or filters).
91
+ * @param string $hook The name of the WordPress filter that is being registered.
92
+ * @param object $component A reference to the instance of the object on which the filter is defined.
93
+ * @param string $callback The name of the function definition on the $component.
94
+ * @param int $priority The priority at which the function should be fired.
95
+ * @param int $accepted_args The number of arguments that should be passed to the $callback.
96
+ * @return array The collection of actions and filters registered with WordPress.
97
+ */
98
+ private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
99
+
100
+ $hooks[] = array(
101
+ 'hook' => $hook,
102
+ 'component' => $component,
103
+ 'callback' => $callback,
104
+ 'priority' => $priority,
105
+ 'accepted_args' => $accepted_args
106
+ );
107
+
108
+ return $hooks;
109
+
110
+ }
111
+
112
+ /**
113
+ * Register the filters and actions with WordPress.
114
+ *
115
+ * @since 1.0.0
116
+ */
117
+ public function run(){
118
+ foreach ( $this->filters as $hook ) {
119
+ add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
120
+ }
121
+
122
+ foreach ( $this->actions as $hook ) {
123
+ add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
124
+ }
125
+
126
+ }
127
+
128
+ }
includes/class-sp-dsgvo-log.php CHANGED
@@ -1,147 +1,147 @@
1
- <?php
2
-
3
- /**
4
- * Post Model for Logs
5
- *
6
- * @link http://example.com
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Post Model for Logs
15
- *
16
- * @since 1.0.0
17
- * @package WP DSGVO Tools
18
- * @subpackage WP DSGVO Tools/includes
19
- * @author Shapepress eU
20
- */
21
- class SPDSGVOLog
22
- {
23
-
24
- public static $tableName = 'sp_dsgvo_logs';
25
-
26
- public $ID;
27
-
28
- public $date;
29
-
30
- public $content;
31
-
32
- public function __construct($content = '')
33
- {
34
- $this->content = $content;
35
- $this->date = date("Y-m-d H:i:s");
36
-
37
- try {
38
- if($this->tableExists() === FALSE){
39
- $this->migrate();
40
- }
41
- } catch (Exception $e){}
42
- }
43
-
44
- public function boot()
45
- {
46
- global $wpdb;
47
- $tableName = $wpdb->prefix . self::$tableName;
48
- $result = $wpdb->get_results("SELECT * from {$tableName} WHERE `ID` = {$this->ID}");
49
-
50
- if (isset($result[0]->log_content)) {
51
- $this->date = $result[0]->log_date;
52
- $this->content = $result[0]->log_content;
53
- }
54
- }
55
-
56
- public static function migrate()
57
- {
58
- global $wpdb;
59
- $tableName = $wpdb->prefix . self::$tableName;
60
-
61
- $wpdb->get_var("
62
- CREATE TABLE `{$tableName}` (
63
- `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
64
- `log_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
65
- `log_content` longtext NOT NULL,
66
- PRIMARY KEY (`ID`)
67
- )
68
- ");
69
-
70
- $error = $wpdb->last_error;
71
- return ($error) ? $error : TRUE;
72
- }
73
-
74
- public static function tableExists()
75
- {
76
- global $wpdb;
77
-
78
- $tableName = $wpdb->prefix . self::$tableName;
79
-
80
- return $wpdb->get_var("SHOW TABLES LIKE '$tableName'") == $tableName;
81
- }
82
-
83
- public static function insert($content)
84
- {
85
- $log = new self($content);
86
- $log->save();
87
- return $log;
88
- }
89
-
90
- public static function find($ID)
91
- {
92
- $log = new self();
93
- $log->ID = $ID;
94
- $log->boot();
95
- return $log;
96
- }
97
-
98
- public static function all()
99
- {
100
- try {
101
- global $wpdb;
102
- $tableName = $wpdb->prefix . self::$tableName;
103
-
104
- $result = $wpdb->get_results("SELECT * FROM {$tableName} ORDER BY ID DESC");
105
-
106
- $logs = array();
107
- foreach ($result as $key => $row) {
108
- array_push($logs, self::find($row->ID));
109
- }
110
-
111
- return $logs;
112
- } catch (Exception $e){
113
- return array();
114
- }
115
- }
116
-
117
- public static function mostRecent($limit = 15)
118
- {
119
- try {
120
- global $wpdb;
121
- $tableName = $wpdb->prefix . self::$tableName;
122
-
123
- $result = $wpdb->get_results("SELECT * FROM {$tableName} ORDER BY ID DESC LIMIT {$limit}");
124
-
125
- $logs = array();
126
- foreach ($result as $key => $row) {
127
- array_push($logs, self::find($row->ID));
128
- }
129
-
130
- return $logs;
131
- } catch (Exception $e){
132
- return array();
133
- }
134
- }
135
-
136
- public function save()
137
- {
138
- try {
139
- global $wpdb;
140
- $tableName = $wpdb->prefix . self::$tableName;
141
-
142
- $wpdb->get_results("
143
- INSERT INTO {$tableName} (log_date, log_content) VALUES('{$this->date}', '$this->content')
144
- ");
145
- } catch (Exception $e){}
146
- }
147
  }
1
+ <?php
2
+
3
+ /**
4
+ * Post Model for Logs
5
+ *
6
+ * @link http://example.com
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Post Model for Logs
15
+ *
16
+ * @since 1.0.0
17
+ * @package WP DSGVO Tools
18
+ * @subpackage WP DSGVO Tools/includes
19
+ * @author Shapepress eU
20
+ */
21
+ class SPDSGVOLog
22
+ {
23
+
24
+ public static $tableName = 'sp_dsgvo_logs';
25
+
26
+ public $ID;
27
+
28
+ public $date;
29
+
30
+ public $content;
31
+
32
+ public function __construct($content = '')
33
+ {
34
+ $this->content = $content;
35
+ $this->date = date("Y-m-d H:i:s");
36
+
37
+ try {
38
+ if($this->tableExists() === FALSE){
39
+ $this->migrate();
40
+ }
41
+ } catch (Exception $e){}
42
+ }
43
+
44
+ public function boot()
45
+ {
46
+ global $wpdb;
47
+ $tableName = $wpdb->prefix . self::$tableName;
48
+ $result = $wpdb->get_results("SELECT * from {$tableName} WHERE `ID` = {$this->ID}");
49
+
50
+ if (isset($result[0]->log_content)) {
51
+ $this->date = $result[0]->log_date;
52
+ $this->content = $result[0]->log_content;
53
+ }
54
+ }
55
+
56
+ public static function migrate()
57
+ {
58
+ global $wpdb;
59
+ $tableName = $wpdb->prefix . self::$tableName;
60
+
61
+ $wpdb->get_var("
62
+ CREATE TABLE `{$tableName}` (
63
+ `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
64
+ `log_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
65
+ `log_content` longtext NOT NULL,
66
+ PRIMARY KEY (`ID`)
67
+ )
68
+ ");
69
+
70
+ $error = $wpdb->last_error;
71
+ return ($error) ? $error : TRUE;
72
+ }
73
+
74
+ public static function tableExists()
75
+ {
76
+ global $wpdb;
77
+
78
+ $tableName = $wpdb->prefix . self::$tableName;
79
+
80
+ return $wpdb->get_var("SHOW TABLES LIKE '$tableName'") == $tableName;
81
+ }
82
+
83
+ public static function insert($content)
84
+ {
85
+ $log = new self($content);
86
+ $log->save();
87
+ return $log;
88
+ }
89
+
90
+ public static function find($ID)
91
+ {
92
+ $log = new self();
93
+ $log->ID = $ID;
94
+ $log->boot();
95
+ return $log;
96
+ }
97
+
98
+ public static function all()
99
+ {
100
+ try {
101
+ global $wpdb;
102
+ $tableName = $wpdb->prefix . self::$tableName;
103
+
104
+ $result = $wpdb->get_results("SELECT * FROM {$tableName} ORDER BY ID DESC");
105
+
106
+ $logs = array();
107
+ foreach ($result as $key => $row) {
108
+ array_push($logs, self::find($row->ID));
109
+ }
110
+
111
+ return $logs;
112
+ } catch (Exception $e){
113
+ return array();
114
+ }
115
+ }
116
+
117
+ public static function mostRecent($limit = 15)
118
+ {
119
+ try {
120
+ global $wpdb;
121
+ $tableName = $wpdb->prefix . self::$tableName;
122
+
123
+ $result = $wpdb->get_results("SELECT * FROM {$tableName} ORDER BY ID DESC LIMIT {$limit}");
124
+
125
+ $logs = array();
126
+ foreach ($result as $key => $row) {
127
+ array_push($logs, self::find($row->ID));
128
+ }
129
+
130
+ return $logs;
131
+ } catch (Exception $e){
132
+ return array();
133
+ }
134
+ }
135
+
136
+ public function save()
137
+ {
138
+ try {
139
+ global $wpdb;
140
+ $tableName = $wpdb->prefix . self::$tableName;
141
+
142
+ $wpdb->get_results("
143
+ INSERT INTO {$tableName} (log_date, log_content) VALUES('{$this->date}', '$this->content')
144
+ ");
145
+ } catch (Exception $e){}
146
+ }
147
  }
includes/class-sp-dsgvo-mail.php CHANGED
@@ -1,399 +1,399 @@
1
- <?php
2
-
3
- /**
4
- * WP_Mail
5
- *
6
- * A simple class for creating and
7
- * sending Emails using WordPress
8
- *
9
- * @author Shapepress.com
10
- */
11
- Class SPDSGVOMail
12
- {
13
-
14
- private $to = array();
15
- private $cc = array();
16
- private $bcc = array();
17
- private $subject = '';
18
- private $from = '';
19
- private $headers = array();
20
- private $attachments = array();
21
- private $sendAsHTML = TRUE;
22
-
23
- private $beforeTemplate = FALSE;
24
- private $beforeVariables = array();
25
- private $template = FALSE;
26
- private $variables = array();
27
- private $afterTemplate = FALSE;
28
- private $afterVariables = array();
29
-
30
-
31
- public function __construct(){}
32
-
33
- public static function init(){
34
- return new self;
35
- }
36
-
37
-
38
- /**
39
- * Set recipients
40
- * @param Array|String $to
41
- * @return Object $this
42
- */
43
- public function to($to){
44
- if(is_array($to)){
45
- $this->to = $to;
46
- }else{
47
- $this->to = array($to);
48
- }
49
- return $this;
50
- }
51
-
52
-
53
- /**
54
- * Get recipients
55
- * @return Array $to
56
- */
57
- public function getTo(){
58
- return $this->to;
59
- }
60
-
61
-
62
- /**
63
- * Set Cc recipients
64
- * @param String|Array $cc
65
- * @return Object $this
66
- */
67
- public function cc($cc){
68
- if(is_array($cc)){
69
- $this->cc = $cc;
70
- }else{
71
- $this->cc = array($cc);
72
- }
73
- return $this;
74
- }
75
-
76
-
77
- /**
78
- * Get Cc recipients
79
- * @return Array $cc
80
- */
81
- public function getCc(){
82
- return $this->cc;
83
- }
84
-
85
-
86
- /**
87
- * Set Email Bcc recipients
88
- * @param String|Array $bcc
89
- * @return Object $this
90
- */
91
- public function bcc($bcc){
92
- if(is_array($bcc)){
93
- $this->bcc = $bcc;
94
- }else{
95
- $this->bcc = array($bcc);
96
- }
97
-
98
- return $this;
99
- }
100
-
101
-
102
- /**
103
- * Set email Bcc recipients
104
- * @return Array $bcc
105
- */
106
- public function getBcc(){
107
- return $this->bcc;
108
- }
109
-
110
-
111
- /**
112
- * Set email Subject
113
- * @param Srting $subject
114
- * @return Object $this
115
- */
116
- public function subject($subject){
117
- $this->subject = $subject;
118
- return $this;
119
- }
120
-
121
-
122
- /**
123
- * Retruns email subject
124
- * @return Array
125
- */
126
- public function getSubject(){
127
- return $this->subject;
128
- }
129
-
130
-
131
- /**
132
- * Set From header
133
- * @param String
134
- * @return Object $this
135
- */
136
- public function from($from){
137
- $this->from = $from;
138
- return $this;
139
- }
140
-
141
- /**
142
- * Set the email's headers
143
- * @param String|Array $headers [description]
144
- * @return Object $this
145
- */
146
- public function headers($headers){
147
- if(is_array($headers)){
148
- $this->headers = $headers;
149
- }else{
150
- $this->headers = array($headers);
151
- }
152
-
153
- return $this;
154
- }
155
-
156
-
157
- /**
158
- * Retruns headers
159
- * @return Array
160
- */
161
- public function getHeaders(){
162
- return $this->headers;
163
- }
164
-
165
-
166
- /**
167
- * Returns email content type
168
- * @return String
169
- */
170
- public function HTMLFilter(){
171
- return 'text/html';
172
- }
173
-
174
-
175
- /**
176
- * Set email content type
177
- * @param Bool $html
178
- * @return Object $this
179
- */
180
- public function sendAsHTML($html){
181
- $this->sendAsHTML = $html;
182
- return $this;
183
- }
184
-
185
-
186
- /**
187
- * Attach a file or array of files.
188
- * Filepaths must be absolute.
189
- * @param String|Array $path
190
- * @throws Exception
191
- * @return Object $this
192
- */
193
- public function attach($path){
194
- if(is_array($path)){
195
- $this->attachments = array();
196
- foreach($path as $path_) {
197
- if(!file_exists($path_)){
198
- throw new Exception(__('Attachment not found at', 'shapepress-dsgvo') . " $path");
199
- }else{
200
- $this->attachments[] = $path_;
201
- }
202
- }
203
- }else{
204
- if(!file_exists($path)){
205
- throw new Exception(__('Attachment not found at', 'shapepress-dsgvo') . " $path");
206
- }
207
- $this->attachments = array($path);
208
- }
209
-
210
- return $this;
211
- }
212
-
213
-
214
- /**
215
- * Set the before-template file
216
- * @param string $template Path to HTML template
217
- * @param array $variables
218
- * @throws Exception
219
- * @return Object $this
220
- */
221
- public function beforeTemplate($template, $variables = NULL){
222
- if(!file_exists($template)){
223
- throw new Exception(__('Template file not found', 'shapepress-dsgvo'));
224
- }
225
-
226
- if(is_array($variables)){
227
- $this->beforeVariables = $variables;
228
- }
229
-
230
- $this->beforeTemplate = $template;
231
- return $this;
232
- }
233
-
234
-
235
- /**
236
- * Set the template file
237
- * @param string $template Path to HTML template
238
- * @param array $variables
239
- * @throws Exception
240
- * @return Object $this
241
- */
242
- public function template($template, $variables = NULL){
243
- if(!file_exists($template)){
244
- throw new Exception('File not found');
245
- }
246
-
247
- if(is_array($variables)){
248
- $this->variables = $variables;
249
- }
250
-
251
- $this->template = $template;
252
- return $this;
253
- }
254
-
255
-
256
- /**
257
- * Set the after-template file
258
- * @param string $template Path to HTML template
259
- * @param array $variables
260
- * @throws Exception
261
- * @return Object $this
262
- */
263
- public function afterTemplate($template, $variables = NULL){
264
- if(!file_exists($template)){
265
- throw new Exception(__('Template file not found', 'shapepress-dsgvo'));
266
- }
267
-
268
- if(is_array($variables)){
269
- $this->afterVariables = $variables;
270
- }
271
-
272
- $this->afterTemplate = $template;
273
- return $this;
274
- }
275
-
276
-
277
- /**
278
- * Renders the template
279
- * @return string
280
- */
281
- public function render(){
282
- return $this->renderPart('before') .
283
- $this->renderPart('main') .
284
- $this->renderPart('after');
285
- }
286
-
287
-
288
- /**
289
- * Render a specific part of the email
290
- * @author Shapepress eU
291
- * @param string $part before, after, main
292
- * @return string
293
- */
294
- public function renderPart($part = 'main'){
295
- switch($part){
296
- case 'before':
297
- $templateFile = $this->beforeTemplate;
298
- $variables = $this->beforeVariables;
299
- break;
300
-
301
- case 'after':
302
- $templateFile = $this->afterTemplate;
303
- $variables = $this->afterVariables;
304
- break;
305
-
306
- case 'main':
307
- default:
308
- $templateFile = $this->template;
309
- $variables = $this->variables;
310
- break;
311
- }
312
-
313
- if($templateFile === FALSE){
314
- return '';
315
- }
316
-
317
-
318
- /* WP KRAKEN START */
319
-
320
- //$template = file_get_contents($templateFile);
321
-
322
- ob_start();
323
- include $templateFile;
324
- $template = ob_get_clean();
325
-
326
- /* WP KRAKEN END */
327
-
328
- if(!is_array($variables) || empty($variables)){
329
- return $template;
330
- }
331
-
332
- preg_match_all('/\{\{\s*.+?\s*\}\}/', $template, $matches);
333
- foreach($matches[0] as $match){
334
- $var = str_replace('{', '', str_replace('}', '', preg_replace('/\s+/', '', $match)));
335
-
336
- if(isset($variables[$var])){
337
- $template = str_replace($match, $variables[$var], $template);
338
- }
339
- }
340
-
341
- return $template;
342
- }
343
-
344
-
345
- /**
346
- * Builds Email Headers
347
- * @return string email headers
348
- */
349
- private function buildHeaders(){
350
- $headers = '';
351
-
352
- $headers .= implode("\r\n", $this->headers) ."\r\n";
353
- $headers .= 'MIME-Version: 1.0 \r\n';
354
- $headers .= 'Content-Type: text/plain; charset=utf-8 \r\n';
355
-
356
- foreach($this->bcc as $bcc){
357
- $headers .= sprintf("Bcc: %s \r\n", $bcc);
358
- }
359
-
360
- foreach($this->cc as $cc){
361
- $headers .= sprintf("Cc: %s \r\n", $cc);
362
- }
363
-
364
- if(!empty($this->from)){
365
- $headers .= sprintf("From: %s \r\n", $this->from);
366
- }
367
-
368
- return $headers;
369
- }
370
-
371
-
372
- /**
373
- * Set the wp_mail_content_type filter, if necessary
374
- */
375
- private function beforeSend(){
376
- if(count($this->to) === 0){
377
- throw new Exception(__('You must set at least 1 recipient', 'shapepress-dsgvo'));
378
- }
379
-
380
- if(empty($this->template)){
381
- throw new Exception(__('You must set a template', 'shapepress-dsgvo'));
382
- }
383
-
384
- if($this->sendAsHTML){
385
- add_filter('wp_mail_content_type', array($this, 'HTMLFilter'));
386
- }
387
- }
388
-
389
-
390
- /**
391
- * Sends a rendered email using
392
- * WordPress's wp_mail() function
393
- * @return bool
394
- */
395
- public function send(){
396
- $this->beforeSend();
397
- return wp_mail($this->to, $this->subject, $this->render(), $this->buildHeaders(), $this->attachments);
398
- }
399
- }
1
+ <?php
2
+
3
+ /**
4
+ * WP_Mail
5
+ *
6
+ * A simple class for creating and
7
+ * sending Emails using WordPress
8
+ *
9
+ * @author Shapepress.com
10
+ */
11
+ Class SPDSGVOMail
12
+ {
13
+
14
+ private $to = array();
15
+ private $cc = array();
16
+ private $bcc = array();
17
+ private $subject = '';
18
+ private $from = '';
19
+ private $headers = array();
20
+ private $attachments = array();
21
+ private $sendAsHTML = TRUE;
22
+
23
+ private $beforeTemplate = FALSE;
24
+ private $beforeVariables = array();
25
+ private $template = FALSE;
26
+ private $variables = array();
27
+ private $afterTemplate = FALSE;
28
+ private $afterVariables = array();
29
+
30
+
31
+ public function __construct(){}
32
+
33
+ public static function init(){
34
+ return new self;
35
+ }
36
+
37
+
38
+ /**
39
+ * Set recipients
40
+ * @param Array|String $to
41
+ * @return Object $this
42
+ */
43
+ public function to($to){
44
+ if(is_array($to)){
45
+ $this->to = $to;
46
+ }else{
47
+ $this->to = array($to);
48
+ }
49
+ return $this;
50
+ }
51
+
52
+
53
+ /**
54
+ * Get recipients
55
+ * @return Array $to
56
+ */
57
+ public function getTo(){
58
+ return $this->to;
59
+ }
60
+
61
+
62
+ /**
63
+ * Set Cc recipients
64
+ * @param String|Array $cc
65
+ * @return Object $this
66
+ */
67
+ public function cc($cc){
68
+ if(is_array($cc)){
69
+ $this->cc = $cc;
70
+ }else{
71
+ $this->cc = array($cc);
72
+ }
73
+ return $this;
74
+ }
75
+
76
+
77
+ /**
78
+ * Get Cc recipients
79
+ * @return Array $cc
80
+ */
81
+ public function getCc(){
82
+ return $this->cc;
83
+ }
84
+
85
+
86
+ /**
87
+ * Set Email Bcc recipients
88
+ * @param String|Array $bcc
89
+ * @return Object $this
90
+ */
91
+ public function bcc($bcc){
92
+ if(is_array($bcc)){
93
+ $this->bcc = $bcc;
94
+ }else{
95
+ $this->bcc = array($bcc);
96
+ }
97
+
98
+ return $this;
99
+ }
100
+
101
+
102
+ /**
103
+ * Set email Bcc recipients
104
+ * @return Array $bcc
105
+ */
106
+ public function getBcc(){
107
+ return $this->bcc;
108
+ }
109
+
110
+
111
+ /**
112
+ * Set email Subject
113
+ * @param Srting $subject
114
+ * @return Object $this
115
+ */
116
+ public function subject($subject){
117
+ $this->subject = $subject;
118
+ return $this;
119
+ }
120
+
121
+
122
+ /**
123
+ * Retruns email subject
124
+ * @return Array
125
+ */
126
+ public function getSubject(){
127
+ return $this->subject;
128
+ }
129
+
130
+
131
+ /**
132
+ * Set From header
133
+ * @param String
134
+ * @return Object $this
135
+ */
136
+ public function from($from){
137
+ $this->from = $from;
138
+ return $this;
139
+ }
140
+
141
+ /**
142
+ * Set the email's headers
143
+ * @param String|Array $headers [description]
144
+ * @return Object $this
145
+ */
146
+ public function headers($headers){
147
+ if(is_array($headers)){
148
+ $this->headers = $headers;
149
+ }else{
150
+ $this->headers = array($headers);
151
+ }
152
+
153
+ return $this;
154
+ }
155
+
156
+
157
+ /**
158
+ * Retruns headers
159
+ * @return Array
160
+ */
161
+ public function getHeaders(){
162
+ return $this->headers;
163
+ }
164
+
165
+
166
+ /**
167
+ * Returns email content type
168
+ * @return String
169
+ */
170
+ public function HTMLFilter(){
171
+ return 'text/html';
172
+ }
173
+
174
+
175
+ /**
176
+ * Set email content type
177
+ * @param Bool $html
178
+ * @return Object $this
179
+ */
180
+ public function sendAsHTML($html){
181
+ $this->sendAsHTML = $html;
182
+ return $this;
183
+ }
184
+
185
+
186
+ /**
187
+ * Attach a file or array of files.
188
+ * Filepaths must be absolute.
189
+ * @param String|Array $path
190
+ * @throws Exception
191
+ * @return Object $this
192
+ */
193
+ public function attach($path){
194
+ if(is_array($path)){
195
+ $this->attachments = array();
196
+ foreach($path as $path_) {
197
+ if(!file_exists($path_)){
198
+ throw new Exception(__('Attachment not found at', 'shapepress-dsgvo') . " $path");
199
+ }else{
200
+ $this->attachments[] = $path_;
201
+ }
202
+ }
203
+ }else{
204
+ if(!file_exists($path)){
205
+ throw new Exception(__('Attachment not found at', 'shapepress-dsgvo') . " $path");
206
+ }
207
+ $this->attachments = array($path);
208
+ }
209
+
210
+ return $this;
211
+ }
212
+
213
+
214
+ /**
215
+ * Set the before-template file
216
+ * @param string $template Path to HTML template
217
+ * @param array $variables
218
+ * @throws Exception
219
+ * @return Object $this
220
+ */
221
+ public function beforeTemplate($template, $variables = NULL){
222
+ if(!file_exists($template)){
223
+ throw new Exception(__('Template file not found', 'shapepress-dsgvo'));
224
+ }
225
+
226
+ if(is_array($variables)){
227
+ $this->beforeVariables = $variables;
228
+ }
229
+
230
+ $this->beforeTemplate = $template;
231
+ return $this;
232
+ }
233
+
234
+
235
+ /**
236
+ * Set the template file
237
+ * @param string $template Path to HTML template
238
+ * @param array $variables
239
+ * @throws Exception
240
+ * @return Object $this
241
+ */
242
+ public function template($template, $variables = NULL){
243
+ if(!file_exists($template)){
244
+ throw new Exception('File not found');
245
+ }
246
+
247
+ if(is_array($variables)){
248
+ $this->variables = $variables;
249
+ }
250
+
251
+ $this->template = $template;
252
+ return $this;
253
+ }
254
+
255
+
256
+ /**
257
+ * Set the after-template file
258
+ * @param string $template Path to HTML template
259
+ * @param array $variables
260
+ * @throws Exception
261
+ * @return Object $this
262
+ */
263
+ public function afterTemplate($template, $variables = NULL){
264
+ if(!file_exists($template)){
265
+ throw new Exception(__('Template file not found', 'shapepress-dsgvo'));
266
+ }
267
+
268
+ if(is_array($variables)){
269
+ $this->afterVariables = $variables;
270
+ }
271
+
272
+ $this->afterTemplate = $template;
273
+ return $this;
274
+ }
275
+
276
+
277
+ /**
278
+ * Renders the template
279
+ * @return string
280
+ */
281
+ public function render(){
282
+ return $this->renderPart('before') .
283
+ $this->renderPart('main') .
284
+ $this->renderPart('after');
285
+ }
286
+
287
+
288
+ /**
289
+ * Render a specific part of the email
290
+ * @author Shapepress eU
291
+ * @param string $part before, after, main
292
+ * @return string
293
+ */
294
+ public function renderPart($part = 'main'){
295
+ switch($part){
296
+ case 'before':
297
+ $templateFile = $this->beforeTemplate;
298
+ $variables = $this->beforeVariables;
299
+ break;
300
+
301
+ case 'after':
302
+ $templateFile = $this->afterTemplate;
303
+ $variables = $this->afterVariables;
304
+ break;
305
+
306
+ case 'main':
307
+ default:
308
+ $templateFile = $this->template;
309
+ $variables = $this->variables;
310
+ break;
311
+ }
312
+
313
+ if($templateFile === FALSE){
314
+ return '';
315
+ }
316
+
317
+
318
+ /* WP KRAKEN START */
319
+
320
+ //$template = file_get_contents($templateFile);
321
+
322
+ ob_start();
323
+ include $templateFile;
324
+ $template = ob_get_clean();
325
+
326
+ /* WP KRAKEN END */
327
+
328
+ if(!is_array($variables) || empty($variables)){
329
+ return $template;
330
+ }
331
+
332
+ preg_match_all('/\{\{\s*.+?\s*\}\}/', $template, $matches);
333
+ foreach($matches[0] as $match){
334
+ $var = str_replace('{', '', str_replace('}', '', preg_replace('/\s+/', '', $match)));
335
+
336
+ if(isset($variables[$var])){
337
+ $template = str_replace($match, $variables[$var], $template);
338
+ }
339
+ }
340
+
341
+ return $template;
342
+ }
343
+
344
+
345
+ /**
346
+ * Builds Email Headers
347
+ * @return string email headers
348
+ */
349
+ private function buildHeaders(){
350
+ $headers = '';
351
+
352
+ $headers .= implode("\r\n", $this->headers) ."\r\n";
353
+ $headers .= 'MIME-Version: 1.0 \r\n';
354
+ $headers .= 'Content-Type: text/plain; charset=utf-8 \r\n';
355
+
356
+ foreach($this->bcc as $bcc){
357
+ $headers .= sprintf("Bcc: %s \r\n", $bcc);
358
+ }
359
+
360
+ foreach($this->cc as $cc){
361
+ $headers .= sprintf("Cc: %s \r\n", $cc);
362
+ }
363
+
364
+ if(!empty($this->from)){
365
+ $headers .= sprintf("From: %s \r\n", $this->from);
366
+ }
367
+
368
+ return $headers;
369
+ }
370
+
371
+
372
+ /**
373
+ * Set the wp_mail_content_type filter, if necessary
374
+ */
375
+ private function beforeSend(){
376
+ if(count($this->to) === 0){
377
+ throw new Exception(__('You must set at least 1 recipient', 'shapepress-dsgvo'));
378
+ }
379
+
380
+ if(empty($this->template)){
381
+ throw new Exception(__('You must set a template', 'shapepress-dsgvo'));
382
+ }
383
+
384
+ if($this->sendAsHTML){
385
+ add_filter('wp_mail_content_type', array($this, 'HTMLFilter'));
386
+ }
387
+ }
388
+
389
+
390
+ /**
391
+ * Sends a rendered email using
392
+ * WordPress's wp_mail() function
393
+ * @return bool
394
+ */
395
+ public function send(){
396
+ $this->beforeSend();
397
+ return wp_mail($this->to, $this->subject, $this->render(), $this->buildHeaders(), $this->attachments);
398
+ }
399
+ }
includes/class-sp-dsgvo-migrator.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOMigrator
4
+ {
5
+
6
+ private static $instance;
7
+
8
+ private static $migrationJobs = array('3.0.0' => '300');
9
+
10
+ public function __construct()
11
+ {
12
+ }
13
+
14
+
15
+ public static function init()
16
+ {
17
+ return new self;
18
+ }
19
+
20
+ public static function getInstance()
21
+ {
22
+ if (null === self::$instance) {
23
+ self::$instance = new self;
24
+ }
25
+
26
+ return self::$instance;
27
+ }
28
+
29
+ public function checkForMigrations($upgrader, $updateData)
30
+ {
31
+ if ($updateData['action'] == 'update' && $updateData['type'] == 'plugin' && !empty($updateData['plugins'])) {
32
+ if (in_array(sp_dsgvo_PLUGIN_NAME, $updateData['plugins'])) {
33
+ $this->doMigrations();
34
+ }
35
+ }
36
+ }
37
+
38
+ public function doMigrations()
39
+ {
40
+ // check the last version
41
+ $currentVersion = SPDSGVOSettings::get('plugin_version');
42
+ $migrationHistory = SPDSGVOSettings::get('migration_history');
43
+ if (isset($migrationHistory) == false || is_array($migrationHistory) == false) {
44
+ $migrationHistory = [];
45
+ }
46
+
47
+ if (array_key_exists(sp_dsgvo_VERSION, self::$migrationJobs) == false) {
48
+ // only set version
49
+ SPDSGVOSettings::set(sp_dsgvo_VERSION);
50
+ return;
51
+ }
52
+
53
+ foreach (self::$migrationJobs as $key => $value) {
54
+ if (in_array($key, $migrationHistory) == false) {
55
+ $methodNameOfMigration = 'upgrade_' . str_replace('.', '', sp_dsgvo_VERSION);
56
+ if (method_exists(self::getInstance(), $methodNameOfMigration)) {
57
+ call_user_func(array(self::getInstance(), $methodNameOfMigration));
58
+ $migrationHistory[] = $key;
59
+ SPDSGVOSettings::set('migration_history', $migrationHistory); // always save after an successfull job
60
+ }
61
+ }
62
+ }
63
+
64
+ // inc version for next time update
65
+ SPDSGVOSettings::set('plugin_version', sp_dsgvo_VERSION);
66
+ SPDSGVOSettings::set('migration_history', $migrationHistory);
67
+
68
+ }
69
+
70
+ public function upgrade_300()
71
+ {
72
+
73
+ // set tracker settings to new objects
74
+ if (SPDSGVOSettings::get('ga_enable_analytics') == '1') {
75
+
76
+ $settings = SPDSGVOGoogleAnalyticsApi::getInstance()->getDefaultSettings();
77
+ $settings['enabled'] = '1';
78
+ $settings['propertyId'] = SPDSGVOSettings::get('ga_tag_number');
79
+ $settings['useOwnCode'] = SPDSGVOSettings::get('own_code') == '1' ? '1' : '0';
80
+ if ($settings['useOwnCode'] == '1') {
81
+ $settings['jsCode'] = SPDSGVOSettings::get('ga_code');
82
+ }
83
+
84
+ SPDSGVOGoogleAnalyticsApi::getInstance()->setSettings($settings);
85
+ }
86
+
87
+ if (SPDSGVOSettings::get('fb_enable_pixel') == '1') {
88
+
89
+ $settings = SPDSGVOFbPixelApi::getInstance()->getDefaultSettings();
90
+ $settings['enabled'] = '1';
91
+ $settings['propertyId'] = SPDSGVOSettings::get('fb_pixel_number');
92
+ $settings['useOwnCode'] = SPDSGVOSettings::get('own_code') == '1' ? '1' : '0';
93
+ if ($settings['useOwnCode'] == '1') {
94
+ $settings['jsCode'] = SPDSGVOSettings::get('fb_pixel_code');
95
+ }
96
+ SPDSGVOFbPixelApi::getInstance()->setSettings($settings);
97
+ }
98
+ }
99
+ }
includes/class-sp-dsgvo-pdf.php CHANGED
@@ -1,71 +1,71 @@
1
- <?php
2
-
3
- /**
4
- * Extension of TCPDF
5
- *
6
- * @link http://example.com
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Extension of TCPDF
15
- *
16
- * @since 1.0.0
17
- * @package WP DSGVO Tools
18
- * @subpackage WP DSGVO Tools/includes
19
- * @author Shapepress eU
20
- */
21
- class SPDSGVOPDF extends DSGVOTCPDF
22
- {
23
-
24
- public function coloredTable($data)
25
- {
26
- $this->SetFillColor(56, 64, 94);
27
- $this->SetTextColor(255);
28
- $this->SetDrawColor(128, 0, 0);
29
- $this->SetLineWidth(0.3);
30
- $this->SetFont('', 'B');
31
-
32
- $width = array(
33
- 60,
34
- 110
35
- );
36
- //$this->Cell($width[0], 7, 'Typ', 1, 0, 'C', 1);
37
- //$this->Cell($width[1], 7, 'Daten', 1, 0, 'C', 1);
38
-
39
- $this->Ln();
40
- $this->SetFillColor(224, 235, 255);
41
- $this->SetTextColor(0);
42
- $this->SetFont('');
43
-
44
- $fill = 0;
45
- foreach ($data as $type => $d) {
46
- $data = array();
47
- error_log('type: '.$type);
48
- $title = "<strong>" . $type . "</strong>";
49
-
50
- $this->writeHTML($title, true, false, true, false, '');
51
-
52
- if (is_array($d)) {
53
- foreach ($d as $value) {
54
- if (! empty($value)) {
55
- array_push($data, $value->data);
56
-
57
- $span = "<span>" . $value->data . "</span>";
58
- $this->writeHTML($span, true, false, true, false, '');
59
- }
60
- }
61
- }
62
-
63
- //$this->MultiCell($width[0], 6, $type, 'LR', 'L', $fill, 0, '', '', true, 0, false, true, 0);
64
- //$this->MultiCell($width[1], 6, implode(', ', $data), 'LR', 'L', $fill, 0, '', '', true, 0, false, true, 0);
65
- $this->Ln();
66
- $fill = ! $fill;
67
- }
68
-
69
- $this->Cell(array_sum($width), 0, '', 'T');
70
- }
71
  }
1
+ <?php
2
+
3
+ /**
4
+ * Extension of TCPDF
5
+ *
6
+ * @link http://example.com
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Extension of TCPDF
15
+ *
16
+ * @since 1.0.0
17
+ * @package WP DSGVO Tools
18
+ * @subpackage WP DSGVO Tools/includes
19
+ * @author Shapepress eU
20
+ */
21
+ class SPDSGVOPDF extends DSGVOTCPDF
22
+ {
23
+
24
+ public function coloredTable($data)
25
+ {
26
+ $this->SetFillColor(56, 64, 94);
27
+ $this->SetTextColor(255);
28
+ $this->SetDrawColor(128, 0, 0);
29
+ $this->SetLineWidth(0.3);
30
+ $this->SetFont('', 'B');
31
+
32
+ $width = array(
33
+ 60,
34
+ 110
35
+ );
36
+ //$this->Cell($width[0], 7, 'Typ', 1, 0, 'C', 1);
37
+ //$this->Cell($width[1], 7, 'Daten', 1, 0, 'C', 1);
38
+
39
+ $this->Ln();
40
+ $this->SetFillColor(224, 235, 255);
41
+ $this->SetTextColor(0);
42
+ $this->SetFont('');
43
+
44
+ $fill = 0;
45
+ foreach ($data as $type => $d) {
46
+ $data = array();
47
+ //error_log('type: '.$type);
48
+ $title = "<strong>" . $type . "</strong>";
49
+
50
+ $this->writeHTML($title, true, false, true, false, '');
51
+
52
+ if (is_array($d)) {
53
+ foreach ($d as $value) {
54
+ if (! empty($value)) {
55
+ array_push($data, $value->data);
56
+
57
+ $span = "<span>" . $value->data . "</span>";
58
+ $this->writeHTML($span, true, false, true, false, '');
59
+ }
60
+ }
61
+ }
62
+
63
+ //$this->MultiCell($width[0], 6, $type, 'LR', 'L', $fill, 0, '', '', true, 0, false, true, 0);
64
+ //$this->MultiCell($width[1], 6, implode(', ', $data), 'LR', 'L', $fill, 0, '', '', true, 0, false, true, 0);
65
+ $this->Ln();
66
+ $fill = ! $fill;
67
+ }
68
+
69
+ $this->Cell(array_sum($width), 0, '', 'T');
70
+ }
71
  }
includes/class-sp-dsgvo-settings-polylang.php CHANGED
@@ -1,68 +1,89 @@
1
- <?php
2
-
3
- /**
4
- * Register settings strings for Polylang
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- *
15
- * @package WP DSGVO Tools
16
- * @subpackage WP DSGVO Tools/includes
17
- * @author Shapepress eU
18
- */
19
- class SPDSGVOSettingsPolylang {
20
-
21
- public $defaults = array();
22
-
23
- public function __construct() {
24
- if(function_exists('icl_register_string')) :
25
- //ok
26
- icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_info', SPDSGVOSettings::get('spdsgvo_comments_checkbox_info'));
27
- //ok
28
- icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_confirm', SPDSGVOSettings::get('spdsgvo_comments_checkbox_confirm'));
29
- //ok
30
- icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_text', SPDSGVOSettings::get('spdsgvo_comments_checkbox_text'));
31
- //ok
32
- icl_register_string('shapepress-dsgvo', 'sar_dsgvo_accepted_text', SPDSGVOSettings::get('sar_dsgvo_accepted_text'));
33
- //ok
34
- icl_register_string('shapepress-dsgvo', 'services_cookies_reason', SPDSGVOSettings::get('services')['cookies']['reason']);
35
- //ok
36
- icl_register_string('shapepress-dsgvo', 'services_google-analytics_reason', SPDSGVOSettings::get('services')['google-analytics']['reason']);
37
- //ok
38
- icl_register_string('shapepress-dsgvo', 'services_facebook-pixel_reason', SPDSGVOSettings::get('services')['facebook-pixel']['reason']);
39
- //ok
40
- icl_register_string('shapepress-dsgvo', 'su_dsgvo_accepted_text', SPDSGVOSettings::get('su_dsgvo_accepted_text'));
41
- //ok
42
- icl_register_string('shapepress-dsgvo', 'cookie_notice', SPDSGVOSettings::get('cookie_notice'));
43
- //ok
44
- icl_register_string('shapepress-dsgvo', 'cookie_notice_custom_text', SPDSGVOSettings::get('cookie_notice_custom_text'));
45
- //ok
46
- icl_register_string('shapepress-dsgvo', 'cn_button_text_ok', SPDSGVOSettings::get('cn_button_text_ok'));
47
- //ok
48
- icl_register_string('shapepress-dsgvo', 'cn_button_text_cancel', SPDSGVOSettings::get('cn_button_text_cancel'));
49
- //ok
50
- icl_register_string('shapepress-dsgvo', 'cn_button_text_more', SPDSGVOSettings::get('cn_button_text_more'));
51
-
52
- icl_register_string('shapepress-dsgvo', 'terms_conditions', SPDSGVOSettings::get('terms_conditions'));
53
- //ok
54
- icl_register_string('shapepress-dsgvo', 'privacy_policy', SPDSGVOSettings::get('privacy_policy'));
55
- //ok
56
- icl_register_string('shapepress-dsgvo', 'imprint', SPDSGVOSettings::get('imprint'));
57
- //ok
58
- icl_register_string('shapepress-dsgvo', 'accept_button_text', SPDSGVOSettings::get('accept_button_text'));
59
-
60
- icl_register_string('shapepress-dsgvo', 'more_options_button_text', SPDSGVOSettings::get('more_options_button_text'));
61
- icl_register_string('shapepress-dsgvo', 'close_button_url', SPDSGVOSettings::get('close_button_url'));
62
- icl_register_string('shapepress-dsgvo', 'accordion_top', SPDSGVOSettings::get('accordion_top'));
63
- endif;
64
- }
65
-
66
- }
67
-
68
- new SPDSGVOSettingsPolylang();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Register settings strings for Polylang
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ *
15
+ * @package WP DSGVO Tools
16
+ * @subpackage WP DSGVO Tools/includes
17
+ * @author Shapepress eU
18
+ */
19
+ class SPDSGVOSettingsPolylang {
20
+
21
+ public $defaults = array();
22
+
23
+ public function __construct() {
24
+ if(function_exists('icl_register_string')) :
25
+ //ok
26
+ icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_info', SPDSGVOSettings::get('spdsgvo_comments_checkbox_info'));
27
+ //ok
28
+ icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_confirm', SPDSGVOSettings::get('spdsgvo_comments_checkbox_confirm'));
29
+ //ok
30
+ icl_register_string('shapepress-dsgvo', 'spdsgvo_comments_checkbox_text', SPDSGVOSettings::get('spdsgvo_comments_checkbox_text'));
31
+ //ok
32
+ icl_register_string('shapepress-dsgvo', 'sar_dsgvo_accepted_text', SPDSGVOSettings::get('sar_dsgvo_accepted_text'));
33
+ //ok
34
+
35
+ if(is_array(SPDSGVOSettings::get( 'services' ))) {
36
+ // Prevents illegal string offset warnings
37
+
38
+ if ( isset( SPDSGVOSettings::get( 'services' )['cookies'] )
39
+ && isset( SPDSGVOSettings::get( 'services' )['cookies']['reason'] ) ) {
40
+ //ok
41
+ icl_register_string( 'shapepress-dsgvo', 'services_cookies_reason', SPDSGVOSettings::get( 'services' )['cookies']['reason'] );
42
+ }
43
+
44
+ if ( isset( SPDSGVOSettings::get( 'services' )['google-analytics'] )
45
+ && isset( SPDSGVOSettings::get( 'services' )['cookies']['reason'] ) ) {
46
+ //ok
47
+ icl_register_string( 'shapepress-dsgvo', 'services_google-analytics_reason', SPDSGVOSettings::get( 'services' )['google-analytics']['reason'] );
48
+ }
49
+
50
+ if ( isset( SPDSGVOSettings::get( 'services' )['google-fonts'] )
51
+ && isset( SPDSGVOSettings::get( 'services' )['cookies']['reason'] ) ) {
52
+ //ok
53
+ icl_register_string( 'shapepress-dsgvo', 'services_google-fonts_reason', SPDSGVOSettings::get( 'services' )['google-fonts']['reason'] );
54
+ }
55
+
56
+ if ( isset( SPDSGVOSettings::get( 'services' )['facebook-pixel'] )
57
+ && isset( SPDSGVOSettings::get( 'services' )['cookies']['reason'] ) ) {
58
+ //pl
59
+ icl_register_string( 'shapepress-dsgvo', 'services_facebook-pixel_reason', SPDSGVOSettings::get( 'services' )['facebook-pixel']['reason'] );
60
+ }
61
+ }
62
+ //ok
63
+ icl_register_string('shapepress-dsgvo', 'su_dsgvo_accepted_text', SPDSGVOSettings::get('su_dsgvo_accepted_text'));
64
+ //ok
65
+ icl_register_string('shapepress-dsgvo', 'cookie_notice_text', SPDSGVOSettings::get('cookie_notice_custom_text'));
66
+ //ok
67
+ icl_register_string('shapepress-dsgvo', 'cn_button_text_ok', SPDSGVOSettings::get('cn_button_text_ok'));
68
+ //ok
69
+ icl_register_string('shapepress-dsgvo', 'cn_button_text_cancel', SPDSGVOSettings::get('cn_button_text_cancel'));
70
+ //ok
71
+ icl_register_string('shapepress-dsgvo', 'cn_button_text_more', SPDSGVOSettings::get('cn_button_text_more'));
72
+
73
+ icl_register_string('shapepress-dsgvo', 'terms_conditions', SPDSGVOSettings::get('terms_conditions'));
74
+ //ok
75
+ icl_register_string('shapepress-dsgvo', 'privacy_policy', SPDSGVOSettings::get('privacy_policy'));
76
+ //ok
77
+ icl_register_string('shapepress-dsgvo', 'imprint', SPDSGVOSettings::get('imprint'));
78
+ //ok
79
+ icl_register_string('shapepress-dsgvo', 'accept_button_text', SPDSGVOSettings::get('accept_button_text'));
80
+
81
+ icl_register_string('shapepress-dsgvo', 'more_options_button_text', SPDSGVOSettings::get('more_options_button_text'));
82
+ icl_register_string('shapepress-dsgvo', 'close_button_url', SPDSGVOSettings::get('close_button_url'));
83
+ icl_register_string('shapepress-dsgvo', 'accordion_top', SPDSGVOSettings::get('accordion_top'));
84
+ endif;
85
+ }
86
+
87
+ }
88
+
89
+ new SPDSGVOSettingsPolylang();
includes/class-sp-dsgvo-settings.php CHANGED
@@ -1,319 +1,289 @@
1
- <?php
2
-
3
- /**
4
- * Register all actions and filters for the plugin
5
- *
6
- * @link https://wp-dsgvo.eu
7
- * @since 1.0.0
8
- *
9
- * @package WP DSGVO Tools
10
- * @subpackage WP DSGVO Tools/includes
11
- */
12
-
13
- /**
14
- * Register all actions and filters for the plugin.
15
- *
16
- * Maintain a list of all hooks that are registered throughout
17
- * the plugin, and register them with the WordPress API. Call the
18
- * run function to execute the list of actions and filters.
19
- *
20
- * @package WP DSGVO Tools
21
- * @subpackage WP DSGVO Tools/includes
22
- * @author Shapepress eU
23
- */
24
- class SPDSGVOSettings{
25
-
26
- public $defaults = array();
27
-
28
-
29
- public function __construct() {
30
-
31
- // dummy translation here
32
- __('WP DSGVO Tools (GDPR) help you to fulfill the GDPR (DGSVO) compliance guidance (<a target="_blank" href="https://ico.org.uk/for-organisations/data-protection-reform/overview-of-the-gdpr/">GDPR</a>)', 'shapepress-dsgvo');
33
-
34
- $this->defaults = array(
35
- /////////////////////////////////////
36
- // common settings
37
- /////////////////////////////////////
38
- 'show_setup' => '0',
39
- 'license_key_error' => '1',
40
- 'license_activated' => '0',
41
- 'licence_activated_on' => '2018-05-01',
42
- 'licence_valid_to' => '',
43
- 'licence_details_fetched' => '0',
44
- 'licence_details_fetched_new' => '0',
45
- 'show_invalid_license_notice' => '0',
46
- 'show_revoke_license_notice' => '0',
47
- 'licence_number_use_remaining' => '0',
48
- 'licence_status' => '',
49
- 'api_key' => '',
50
- 'admin_email' => '',
51
- 'use_wpml_strings' => '0',
52
- 'sp_dsgvo_comments_checkbox' => '0',
53
- 'spdsgvo_comments_checkbox_confirm' => __('I confirm','shapepress-dsgvo'),
54
- 'spdsgvo_comments_checkbox_info' => __('The confirmation to GDPR is mandatory.','shapepress-dsgvo'),
55
- 'spdsgvo_comments_checkbox_text' => __('This form stores your name, email address and content so that we can evaluate the comments on our site. For more information, visit our Privacy Policy page.','shapepress-dsgvo'),
56
-
57
- 'spdsgvo_company_info_name' => '',
58
- 'spdsgvo_company_info_street' => '',
59
- 'spdsgvo_company_info_loc_zip' => '',
60
- 'spdsgvo_company_fn_nr' => '',
61
- 'spdsgvo_company_law_loc' => '',
62
- 'spdsgvo_company_uid_nr' => '',
63
- 'spdsgvo_company_law_person' => '',
64
- 'spdsgvo_company_chairmen' => '',
65
- 'spdsgvo_company_resp_content' => '',
66
- 'spdsgvo_company_info_phone' => '',
67
- 'spdsgvo_company_info_fax' => '',
68
- 'spdsgvo_company_info_email' => '',
69
- 'spdsgvo_newsletter_service' => '',
70
- 'spdsgvo_newsletter_service_privacy_policy_url' => '',
71
-
72
-
73
-
74
- /////////////////////////////////////
75
- // SAR
76
- /////////////////////////////////////
77
- 'sar_cron' => '0',
78
- 'sar_page' => '0',
79
- 'sar_email_notification' => '0',
80
- 'sar_dsgvo_accepted_text' => __('I agree to the storage of the data for processing within the meaning of the GDPR.','shapepress-dsgvo'),
81
-
82
- /////////////////////////////////////
83
- // Third-party Services
84
- /////////////////////////////////////
85
- 'user_permissions_page' => '0',
86
-
87
- 'services' => array(
88
- 'cookies' => array(
89
- 'slug' => 'cookies',
90
- 'name' => 'Cookies',
91
- 'reason' => __('We use cookies to analyze visitor behavior.','shapepress-dsgvo'),
92
- 'link' => '',
93
- 'default' => '1',
94
- ),
95
- 'google-analytics' => array(
96
- 'slug' => 'google-analytics',
97
- 'name' => 'Google Analytics',
98
- 'reason' => __('Google Analytics is used to analyze website traffic.','shapepress-dsgvo'),
99
- 'link' => 'https://www.google.com/analytics/terms/us.html',
100
- 'default' => '1',
101
- ),
102
- 'facebook-pixel' => array(
103
- 'slug' => 'facebook-pixel',
104
- 'name' => 'Facebook Pixel',
105
- 'reason' => __('Facebook Pixel is used to analyze visitor behavior.','shapepress-dsgvo'),
106
- 'link' => 'https://www.facebook.com/legal/terms/update',
107
- 'default' => '1',
108
- )
109
- ),
110
-
111
-
112
- /////////////////////////////////////
113
- // Unsubscribe Page
114
- /////////////////////////////////////
115
- 'super_unsubscribe_page' => '0',
116
- 'unsubscribe_auto_delete' => '0',
117
- 'su_auto_del_time' => '0',
118
- 'su_woo_data_action' => 'ignore',
119
- 'su_bbpress_data_action' => 'ignore',
120
- 'su_buddypress_data_action' => 'ignore',
121
- 'su_email_notification' => '0',
122
- 'su_dsgvo_accepted_text' => __('I agree to the storage of the data for processing within the meaning of the GDPR.','shapepress-dsgvo'),
123
-
124
-
125
- /////////////////////////////////////
126
- // Cookie Notice
127
- /////////////////////////////////////
128
- 'display_cookie_notice' => '0',
129
- 'cookie_notice' => __("This website uses cookies. By clicking 'accept' you are providing consent to us using cookies on this browser.", 'shapepress-dsgvo'),
130
- 'cookie_notice_custom_css' => "",
131
- 'cn_tracker_init' => 'on_load',
132
- 'ga_enable_analytics' => '0',
133
- 'ga_tag_number' => '',
134
- 'fb_enable_pixel' => '0',
135
- 'fb_pixel_number' => '',
136
- 'display_cookie_notice' => '0',
137
- 'cookie_notice_custom_text' => __('We use cookies to give you the best user experience. If you continue to use this site, we assume that you agree.','shapepress-dsgvo'),
138
- 'cn_cookie_validity' => '86400',
139
- 'cn_button_text_ok' => __('OK','shapepress-dsgvo'),
140
- 'cn_reload_on_confirm' => '0',
141
- 'cn_reload_on_confirm_popup' => '0',
142
- 'cn_activate_cancel_btn' => '1',
143
- 'cn_button_text_cancel' => __('Deny','shapepress-dsgvo'),
144
- 'cn_decline_target_url' => '',
145
- 'cn_activate_more_btn' => '0',
146
- 'cn_button_text_more' => __('More information','shapepress-dsgvo'),
147
- 'cn_read_more_page' => '',
148
- 'cn_position' => 'bottom',
149
- 'cn_animation' => 'none',
150
- 'cn_background_color' => '#333333',
151
- 'cn_text_color' => '#ffffff',
152
- 'cn_background_color_button' => '#F3F3F3',
153
- 'cn_text_color_button' => '#333333',
154
- 'cn_custom_css_container' => '',
155
- 'cn_custom_css_text' => '',
156
- 'cn_custom_css_buttons' => '',
157
- 'cn_size_text' => '13px',
158
- 'cn_height_container' => 'auto',
159
- 'cn_show_dsgvo_icon' => '0',
160
- 'cn_use_overlay' => '0',
161
- 'cookie_notice_display' => 'cookie_notice',
162
-
163
-
164
- /////////////////////////////////////
165
- // Terms Conditions
166
- /////////////////////////////////////
167
- 'terms_conditions' => '',
168
- 'terms_conditions_page' => '0',
169
- 'terms_conditions_version' => '1',
170
- 'terms_conditions_hash' => '',
171
- 'force_explicit_permission_public' => '0',
172
- 'force_explicit_permission_authenticated' => '0',
173
- 'explicit_permission_page' => '0',
174
- 'opt_out_page' => '0',
175
-
176
-
177
- /////////////////////////////////////
178
- // Privacy Policy
179
- /////////////////////////////////////
180
- 'privacy_policy' => '',
181
- 'privacy_policy_page' => '0',
182
- 'privacy_policy_version' => '1',
183
- 'privacy_policy_hash' => '',
184
- 'woo_show_privacy_checkbox' => '0',
185
- 'woo_show_privacy_checkbox_register' => '0',
186
- 'woo_privacy_text' => __('I have read and accepted the Privacy Policy.','shapepress-dsgvo'),
187
-
188
- /////////////////////////////////////
189
- // imprint
190
- /////////////////////////////////////
191
- 'imprint' => '',
192
- 'imprint_page' => '0',
193
- 'imprint_version' => '1',
194
- 'imprint_hash' => '',
195
-
196
- 'cb_spdsgvo_cl_vdv' => '0',
197
- 'cb_spdsgvo_cl_filled_out' => '0',
198
- 'cb_spdsgvo_cl_maintainance' => '0',
199
- 'cb_spdsgvo_cl_security' => '0',
200
- 'cb_spdsgvo_cl_hosting' => '0',
201
- 'cb_spdsgvo_cl_plugins' => '0',
202
- 'cb_spdsgvo_cl_experts' => '0',
203
-
204
- 'google_gdpr_refresh_notice' => '0'
205
-
206
- );
207
- }
208
-
209
- public static function init(){
210
-
211
- $sInstance = (new self);
212
- $users = get_users(array('role' => 'administrator'));
213
- $admin = (isset($users[0]))? $users[0] : FALSE;
214
- if(!self::get('admin_email')){
215
- if($admin){
216
- self::set('admin_email', $admin->user_email);
217
- }
218
- }
219
-
220
-
221
- if(!self::get('privacy_policy')){
222
- $privacyPolicy = file_get_contents(SPDSGVO::pluginDir('/templates/'.spDsgvoGetLocaleWithWpmlSupport().'/privacy-policy.txt'));
223
- // if($admin){
224
- // $privacyPolicy = str_replace('[name]', $admin->display_name, $privacyPolicy);
225
- // $privacyPolicy = str_replace('[email]', $admin->user_email, $privacyPolicy);
226
- // }
227
- SPDSGVOSettings::set('privacy_policy_hash', wp_hash($privacyPolicy));
228
- SPDSGVOSettings::set('google_gdpr_refresh_notice', '1');
229
- self::set('privacy_policy', $privacyPolicy);
230
- }
231
-
232
-
233
- if(!self::get('terms_conditions')){
234
- $termsConditions = '';// file_get_contents(SPDSGVO::pluginDir('terms-conditions.txt'));
235
- SPDSGVOSettings::set('terms_conditions_hash', wp_hash($termsConditions));
236
- self::set('terms_conditions', $termsConditions);
237
- }
238
-
239
- if(!self::get('imprint')){
240
- $imprint = file_get_contents(SPDSGVO::pluginDir('/templates/'.spDsgvoGetLocaleWithWpmlSupport().'/imprint.txt'));
241
- SPDSGVOSettings::set('imprint_hash', wp_hash($imprint));
242
- self::set('imprint', $imprint);
243
- }
244
-
245
-
246
- if(!self::get('services')){
247
- self::set('services', array(
248
- 'cookies' => array(
249
- 'slug' => 'cookies',
250
- 'name' => 'Cookies',
251
- 'reason' => __('We use cookies to analyze visitor behavior.','shapepress-dsgvo'),
252
- 'link' => '',
253
- 'default' => '0',
254
- ),
255
- 'google-analytics' => array(
256
- 'slug' => 'google-analytics',
257
- 'name' => 'Google Analytics',
258
- 'reason' => __('Google Analytics is used to analyze website traffic.','shapepress-dsgvo'),
259
- 'link' => 'https://www.google.com/analytics/terms/us.html',
260
- 'default' => '0',
261
- ),
262
- 'facebook-pixel' => array(
263
- 'slug' => 'facebook-pixel',
264
- 'name' => 'Facebook Pixel',
265
- 'reason' => __('Facebook Pixel is used to analyze visitor behavior.','shapepress-dsgvo'),
266
- 'link' => 'https://www.facebook.com/legal/terms/update',
267
- 'default' => '0',
268
- )
269
-
270
- ));
271
- }
272
-
273
-
274
- foreach($sInstance->defaults as $setting => $value){
275
- if(!self::get($setting)){
276
- self::set($setting, $value);
277
- }
278
- }
279
- }
280
-
281
- public static function set($property, $value){
282
- update_option('sp_dsgvo_'.$property, $value);
283
- }
284
-
285
- public static function get($property){
286
- $value = get_option('sp_dsgvo_'.$property);
287
-
288
- if($value !== '0'){
289
- if(!$value || empty($value)){
290
-
291
- $value = self::getDefault($property);
292
- }
293
- }
294
-
295
- return $value;
296
- }
297
-
298
- public static function getDefault($property){
299
-
300
- $sInstance = new self;
301
-
302
- if (array_key_exists($property, $sInstance->defaults))
303
- {
304
- return $sInstance->defaults[$property];
305
- } else
306
- {
307
- return '';
308
- }
309
- }
310
-
311
-
312
- public function __get($property){
313
- return self::get($property);
314
- }
315
-
316
- public function __set($property, $value){
317
- return self::set($property, $value);
318
- }
319
- }
1
+ <?php
2
+
3
+ /**
4
+ * Register all actions and filters for the plugin
5
+ *
6
+ * @link https://wp-dsgvo.eu
7
+ * @since 1.0.0
8
+ *
9
+ * @package WP DSGVO Tools
10
+ * @subpackage WP DSGVO Tools/includes
11
+ */
12
+
13
+ /**
14
+ * Register all actions and filters for the plugin.
15
+ *
16
+ * Maintain a list of all hooks that are registered throughout
17
+ * the plugin, and register them with the WordPress API. Call the
18
+ * run function to execute the list of actions and filters.
19
+ *
20
+ * @package WP DSGVO Tools
21
+ * @subpackage WP DSGVO Tools/includes
22
+ * @author Shapepress eU
23
+ */
24
+ class SPDSGVOSettings{
25
+
26
+ public $defaults = array();
27
+
28
+ private static $instance;
29
+ public static function getInstance()
30
+ {
31
+ if (null === self::$instance) {
32
+ self::$instance = new self;
33
+ }
34
+
35
+ return self::$instance;
36
+ }
37
+
38
+ public function __construct() {
39
+
40
+ // dummy translation here
41
+ __('WP DSGVO Tools (GDPR) help you to fulfill the GDPR (DGSVO) compliance guidance (<a target="_blank" href="https://ico.org.uk/for-organisations/data-protection-reform/overview-of-the-gdpr/">GDPR</a>)', 'shapepress-dsgvo');
42
+
43
+ $this->defaults = array(
44
+ /////////////////////////////////////
45
+ // common settings
46
+ ////////////////////////////////////
47
+ 'plugin_version' => '0',
48
+ 'migration_history' => '',
49
+ 'show_setup' => '0',
50
+ 'license_key_error' => '1',
51
+ 'license_activated' => '0',
52
+ 'licence_activated_on' => '2018-05-01',
53
+ 'licence_valid_to' => '',
54
+ 'licence_details_fetched' => '0',
55
+ 'licence_details_fetched_new' => '0',
56
+ 'show_invalid_license_notice' => '0',
57
+ 'show_revoke_license_notice' => '0',
58
+ 'licence_number_use_remaining' => '0',
59
+ 'licence_status' => '',
60
+ 'api_key' => '',
61
+ 'admin_email' => '',
62
+ 'use_wpml_strings' => '0',
63
+ 'dsgvo_auto_update' => '0',
64
+ 'dsgvo_block_google_fonts' => '0',
65
+ 'sp_dsgvo_comments_checkbox' => '0',
66
+ 'spdsgvo_comments_checkbox_confirm' => __('I confirm','shapepress-dsgvo'),
67
+ 'spdsgvo_comments_checkbox_info' => __('The confirmation to GDPR is mandatory.','shapepress-dsgvo'),
68
+ 'spdsgvo_comments_checkbox_text' => __('This form stores your name, email address and content so that we can evaluate the comments on our site. For more information, visit our Privacy Policy page.','shapepress-dsgvo'),
69
+
70
+ 'page_operator_type' => 'one-man',
71
+ 'page_operator_company_name' => '',
72
+ 'page_operator_company_law_person' => '',
73
+ 'page_operator_operator_name' => '',
74
+ 'spdsgvo_company_info_name' => '',
75
+ 'spdsgvo_company_info_street' => '',
76
+ 'spdsgvo_company_info_loc_zip' => '',
77
+ 'spdsgvo_company_info_countrycode' => 'DE',
78
+ 'spdsgvo_company_fn_nr' => '',
79
+ 'spdsgvo_company_law_loc' => '',
80
+ 'spdsgvo_company_uid_nr' => '',
81
+ 'spdsgvo_company_law_person' => '',
82
+ 'spdsgvo_company_chairmen' => '',
83
+ 'spdsgvo_company_resp_content' => '',
84
+ 'spdsgvo_company_info_phone' => '',
85
+ 'spdsgvo_company_info_fax' => '',
86
+ 'spdsgvo_company_info_email' => '',
87
+ 'spdsgvo_newsletter_service' => '',
88
+ 'spdsgvo_newsletter_service_privacy_policy_url' => '',
89
+
90
+
91
+
92
+ /////////////////////////////////////
93
+ // SAR
94
+ /////////////////////////////////////
95
+ 'sar_cron' => '0',
96
+ 'sar_page' => '0',
97
+ 'sar_email_notification' => '0',
98
+ 'sar_dsgvo_accepted_text' => __('I agree to the storage of the data for processing within the meaning of the GDPR.','shapepress-dsgvo'),
99
+
100
+ /////////////////////////////////////
101
+ // Third-party Services
102
+ /////////////////////////////////////
103
+ 'user_permissions_page' => '0',
104
+
105
+
106
+ /////////////////////////////////////
107
+ // Unsubscribe Page
108
+ /////////////////////////////////////
109
+ 'super_unsubscribe_page' => '0',
110
+ 'unsubscribe_auto_delete' => '0',
111
+ 'su_auto_del_time' => '0',
112
+ 'su_woo_data_action' => 'ignore',
113
+ 'su_bbpress_data_action' => 'ignore',
114
+ 'su_buddypress_data_action' => 'ignore',
115
+ 'su_email_notification' => '0',
116
+ 'su_dsgvo_accepted_text' => __('I agree to the storage of the data for processing within the meaning of the GDPR.','shapepress-dsgvo'),
117
+
118
+
119
+ /////////////////////////////////////
120
+ // Cookie Notice
121
+ ////////////////////////////////////
122
+ 'cookie_version' => '0',
123
+ 'display_cookie_notice' => '0',
124
+ 'force_cookie_info' => '0',
125
+ 'cookie_notice_custom_css' => "",
126
+ 'cookie_notice_text' => __('In case you want to change your privacy settings (e.g. issue consent or revoke an already issued consent) please click on the button below.','shapepress-dsgvo'),
127
+ 'cn_cookie_validity' => '86400',
128
+ 'cn_button_text_ok' => __('OK','shapepress-dsgvo'),
129
+ 'cn_reload_on_confirm' => '0',
130
+ 'cn_reload_on_confirm_popup' => '0',
131
+ 'cn_activate_cancel_btn' => '1',
132
+ 'cn_button_text_cancel' => __('Deny','shapepress-dsgvo'),
133
+ 'cn_decline_target_url' => '',
134
+ 'cn_activate_more_btn' => '0',
135
+ 'cn_button_text_more' => __('More information','shapepress-dsgvo'),
136
+ 'cn_read_more_page' => '',
137
+ 'cn_position' => 'bottom',
138
+ 'cn_animation' => 'none',
139
+ 'cn_background_color' => '#333333',
140
+ 'cn_text_color' => '#ffffff',
141
+ 'cn_background_color_button' => '#F3F3F3',
142
+ 'cn_text_color_button' => '#333333',
143
+ 'cn_custom_css_container' => '',
144
+ 'cn_custom_css_text' => '',
145
+ 'cn_custom_css_buttons' => '',
146
+ 'cn_size_text' => '13px',
147
+ 'cn_height_container' => 'auto',
148
+ 'cn_show_dsgvo_icon' => '0',
149
+ 'cn_use_overlay' => '0',
150
+ 'cookie_notice_display' => 'none',
151
+ 'show_notice_on_close' => '0',
152
+ 'cookie_style' => '00',
153
+ 'logo_image_id' => '0',
154
+
155
+
156
+ /////////////////////////////////////
157
+ // Privacy Policy
158
+ /////////////////////////////////////
159
+ 'privacy_policy' => '',
160
+ 'privacy_policy_page' => '0',
161
+ 'privacy_policy_version' => '1',
162
+ 'privacy_policy_hash' => '',
163
+ 'woo_show_privacy_checkbox' => '0',
164
+ 'woo_show_privacy_checkbox_register' => '0',
165
+ 'woo_privacy_text' => '',
166
+ 'wp_signup_checkbox_text' => '',
167
+ 'wp_signup_checkbox_error' => '',
168
+ 'wp_signup_show_privacy_checkbox' => '0',
169
+ 'privacy_policy_title_html_htag' => 'h1',
170
+ 'privacy_policy_subtitle_html_htag' => 'h2',
171
+ 'privacy_policy_subsubtitle_html_htag' => 'h3',
172
+ 'legal_web_texts_version' => '0',
173
+ 'legal_web_texts_last_check' => '0',
174
+ 'pp_texts_notification_mail' => '0',
175
+
176
+ /////////////////////////////////////
177
+ // imprint
178
+ /////////////////////////////////////
179
+ 'imprint' => '',
180
+ 'imprint_page' => '0',
181
+ 'imprint_version' => '1',
182
+ 'imprint_hash' => '',
183
+
184
+ 'cb_spdsgvo_cl_vdv' => '0',
185
+ 'cb_spdsgvo_cl_filled_out' => '0',
186
+ 'cb_spdsgvo_cl_maintainance' => '0',
187
+ 'cb_spdsgvo_cl_security' => '0',
188
+ 'cb_spdsgvo_cl_hosting' => '0',
189
+ 'cb_spdsgvo_cl_plugins' => '0',
190
+ 'cb_spdsgvo_cl_experts' => '0',
191
+
192
+ 'google_gdpr_refresh_notice' => '0',
193
+ 'show_notice_update_check_settings' => '1'
194
+
195
+ );
196
+
197
+
198
+ }
199
+
200
+ public static function init(){
201
+
202
+ $sInstance = (new self);
203
+ $users = get_users(array('role' => 'administrator'));
204
+ $admin = (isset($users[0]))? $users[0] : FALSE;
205
+ if(!self::get('admin_email')){
206
+ if($admin){
207
+ self::set('admin_email', $admin->user_email);
208
+ }
209
+ }
210
+
211
+ foreach($sInstance->defaults as $setting => $value){
212
+ if(!self::get($setting)){
213
+ self::set($setting, $value);
214
+ }
215
+ }
216
+ }
217
+
218
+ public static function set($property, $value){
219
+ update_option(SPDSGVOConstants::OPTIONS_PREFIX.$property, $value);
220
+ }
221
+
222
+ public static function get($property){
223
+ $value = get_option(SPDSGVOConstants::OPTIONS_PREFIX .$property);
224
+
225
+ if($value !== '0'){
226
+ if(!$value || empty($value)){
227
+
228
+ $value = self::getDefault($property);
229
+ }
230
+ }
231
+
232
+ return $value;
233
+ }
234
+
235
+ public static function getDefault($property){
236
+
237
+ $sInstance = new self;
238
+
239
+ if (array_key_exists($property, $sInstance->defaults))
240
+ {
241
+ return $sInstance->defaults[$property];
242
+ } else
243
+ {
244
+ return '';
245
+ }
246
+ }
247
+
248
+ public static function getAll()
249
+ {
250
+ $all_options = wp_load_alloptions();
251
+ $my_options = array();
252
+ foreach( $all_options as $name => $value ) {
253
+ if(strpos($name,SPDSGVOConstants::OPTIONS_PREFIX) !== false) {
254
+ if($value !== '0'){
255
+ if(!$value || empty($value)){
256
+
257
+ $value = self::getDefault($name);
258
+ } else
259
+ {
260
+ // check if its an array
261
+ //if (strpos($value, 'a:') === 0)
262
+ if (is_serialized($value))
263
+ {
264
+ try {
265
+ $newArray = unserialize($value);
266
+ //if ($newArray == false) echo 'SERIALIZE: '.$name .': '.$value;
267
+ if ($newArray != false && is_array($newArray))
268
+ {
269
+ $value = $newArray;
270
+ }
271
+ } catch (Exception $ex) {}
272
+ }
273
+
274
+ }
275
+ }
276
+ $my_options[str_replace(SPDSGVOConstants::OPTIONS_PREFIX,'', $name)] = $value;
277
+ }
278
+ }
279
+ return array_merge(SPDSGVOSettings::getInstance()->defaults, $my_options);
280
+ }
281
+
282
+ public function __get($property){
283
+ return self::get($property);
284
+ }
285
+
286
+ public function __set($property, $value){
287
+ return self::set($property, $value);
288
+ }
289
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-sp-dsgvo-slim-model.php CHANGED
@@ -1,655 +1,654 @@
1
- <?php
2
-
3
- /**
4
- * WP_Model
5
- *
6
- * A simple class for creating active
7
- * record, eloquent-esque models of WordPress Posts.
8
- *
9
- * @author Shapepress.com
10
- */
11
- Abstract Class SPDSGVOModel{
12
-
13
- public $ID;
14
- public $_post;
15
- public $data = array();
16
- public $attributes = array();
17
- public $default = array();
18
- public $virtual = array();
19
-
20
-
21
- /**
22
- * Create a new instace with data
23
- *
24
- * @param array $insert
25
- * @return void
26
- */
27
- public function __construct(Array $insert = array()){
28
- if(!empty($this->default)){
29
- foreach($this->default as $attribute => $value){
30
- $this->data[$attribute] = $value;
31
- }
32
- }
33
-
34
- foreach($insert as $attribute => $value){
35
- if(in_array($attribute, $this->attributes)){
36
- $this->set($attribute, $value);
37
- }
38
- }
39
-
40
- $this->set('title', isset($insert['title'])? $insert['title'] : '');
41
- $this->set('content', isset($insert['content'])? $insert['content'] : '');
42
- $this->boot();
43
- }
44
-
45
- /**
46
- * Initalize the model, load in any addional data
47
- *
48
- * @return void
49
- */
50
- protected function boot(){
51
- $this->triggerEvent('booting');
52
-
53
- if(isset($this->ID)){
54
- $this->_post = get_post($this->ID);
55
- $this->set('title', $this->_post->post_title);
56
- $this->set('content', $this->_post->post_content);
57
-
58
- foreach($this->attributes as $attribute){
59
- $meta = $this->getMeta($attribute);
60
- if(empty($meta) && isset($this->default[$attribute])){
61
- $this->set($attribute, $this->default[$attribute]);
62
- }else{
63
- $this->set($attribute, $meta);
64
- }
65
- }
66
- }
67
-
68
- $this->triggerEvent('booted');
69
- }
70
-
71
- /**
72
- * Register the post type using the propery $postType as the post type
73
- *
74
- * @param array $args see: register_post_type()
75
- * @return void
76
- */
77
- public static function register($args = array()){
78
- $postType = self::getPostType();
79
-
80
- register_post_type($postType, $args);
81
- }
82
-
83
- /**
84
- * Create a new model with data, save and return the model
85
- *
86
- * @param array $insert
87
- */
88
- public static function insert(Array $insert = array()){
89
- return self::newInstance($insert)->save();
90
- }
91
-
92
-
93
- // -----------------------------------------------------
94
- // EVENTS
95
- // -----------------------------------------------------
96
- /**
97
- * Fire event if the event method exists
98
- *
99
- * @param string $event event name
100
- * @return bool
101
- */
102
- protected function triggerEvent($event){
103
- if(method_exists($this, $event)){
104
- $this->$event($this);
105
- return TRUE;
106
- }
107
-
108
- return FALSE;
109
- }
110
-
111
-
112
- // -----------------------------------------------------
113
- // UTILITY METHODS
114
- // -----------------------------------------------------
115
- /**
116
- * Create a new model without calling the constructor.
117
- *
118
- * @return object
119
- */
120
- protected static function newWithoutConstructor(){
121
- $class = get_called_class();
122
- $reflection = new ReflectionClass($class);
123
- return $reflection->newInstanceWithoutConstructor();
124
- }
125
-
126
- public static function extract($array, $column){
127
- $return = array();
128
-
129
- if(is_array($array)){
130
- foreach($array as $value){
131
- if(is_object($value)){
132
- $return[] = @$value->$column;
133
- }elseif(is_array($value)){
134
- $return[] = @$value[$column];
135
- }
136
- }
137
- }
138
-
139
- return $return;
140
- }
141
-
142
- private function getAttributes(){
143
- return array_merge($this->attributes, array('title', 'content', 'the_content'));
144
- }
145
-
146
- /**
147
- * Returns the post type
148
- *
149
- * @return string
150
- *
151
- * @throws \Exception
152
- */
153
- public static function getPostType(){
154
- $model = self::newWithoutConstructor();
155
-
156
- if(isset($model->postType)){
157
- return $model->postType;
158
- }
159
-
160
- throw new Exception('$postType not defined');
161
- }
162
-
163
- /**
164
- * Returns a new model
165
- *
166
- * @return object
167
- */
168
- public static function newInstance($insert = array()){
169
- $class = get_called_class();
170
- return new $class($insert);
171
- }
172
-
173
- /**
174
- * Returns TRUE if $attribute is in the $virtual array
175
- * and has a corresponding vitaul property method
176
- *
177
- * @param string $attribute
178
- * @return bool
179
- */
180
- public function isVirtualProperty($attribute){
181
- return (isset($this->virtual) &&
182
- in_array($attribute, $this->virtual) &&
183
- method_exists($this, ('_get'. ucfirst($attribute))));
184
- }
185
-
186
- /**
187
- * Calls virtual property method
188
- *
189
- * @param string $attribute
190
- * @return mixed
191
- */
192
- public function getVirtualProperty($attribute){
193
- return call_user_func(array($this, ('_get'. ucfirst($attribute))));
194
- }
195
-
196
-
197
-
198
- // -----------------------------------------------------
199
- // Meta
200
- // -----------------------------------------------------
201
- /**
202
- * Returns meta value for a meta key
203
- *
204
- * @param string meta_key
205
- * @return string
206
- */
207
- public function getMeta($key){
208
- return get_post_meta($this->ID, $key, TRUE);
209
- }
210
-
211
- /**
212
- * Set meta value for a meta key
213
- *
214
- * @param string meta_key
215
- * @param string meta_value
216
- * @return void
217
- */
218
- public function setMeta($key, $value){
219
- update_post_meta($this->ID, $key, $value);
220
- }
221
-
222
- /**
223
- * Delete meta's meta
224
- *
225
- * @param string meta_key
226
- * @return void
227
- */
228
- public function deleteMeta($key){
229
- delete_post_meta($this->ID, $key);
230
- }
231
-
232
-
233
- // -----------------------------------------------------
234
- // GETTERS & SETTERS
235
- // -----------------------------------------------------
236
- /**
237
- * Get property of model or $default
238
- *
239
- * @param property $attribute
240
- * @param property $default
241
- * @return mixed
242
- *
243
- * @todo investagte this method
244
- */
245
- public function get($attribute, $default = NULL){
246
- if($attribute === 'the_content'){
247
- return apply_filters('the_content', $this->data['content']);
248
- }elseif(isset($this->data[$attribute])){
249
- return $this->data[$attribute];
250
- }else{
251
- return $default;
252
- }
253
- }
254
-
255
- /**
256
- * Set propert of the model
257
- *
258
- * @param string $attribute
259
- * @param string $value
260
- * @return void
261
- */
262
- public function set($attribute, $value){
263
- if(in_array($attribute, $this->getAttributes())){
264
- $this->data[$attribute] = $value;
265
- }
266
- }
267
-
268
- // -----------------------------------------------------
269
- // MAGIC METHODS
270
- // -----------------------------------------------------
271
- /**
272
- * @return void
273
- */
274
- public function __set($attribute, $value){
275
- if(in_array($attribute, $this->getAttributes())){
276
- $this->set($attribute, $value);
277
- }
278
- }
279
-
280
- /**
281
- * @return void
282
- */
283
- public function __get($attribute){
284
- if(in_array($attribute, $this->getAttributes())){
285
- return $this->get($attribute);
286
- }else if($this->isVirtualProperty($attribute)){
287
- return $this->getVirtualProperty($attribute);
288
- }else if($attribute === 'post_title'){
289
- return $this->title;
290
- }else if($attribute === 'post_content'){
291
- return $this->content;
292
- }
293
- }
294
-
295
-
296
- // -----------------------------------------------------
297
- // HELPER METHODS
298
- // -----------------------------------------------------
299
- /**
300
- * Check if the post exists by Post ID
301
- *
302
- * @param string|int $ID Post ID
303
- * @param bool $postTypeSafe Require post to be the same post type as the model
304
- * @return bool
305
- */
306
- public static function exists($ID, $postTypeSafe = TRUE){
307
- if($postTypeSafe){
308
- if(
309
- (get_post_status($ID) !== FALSE) &&
310
- (get_post_type($ID) === self::getPostType())){
311
- return TRUE;
312
- }
313
- }else{
314
- return (get_post_status($ID) !== FALSE);
315
- }
316
-
317
- return FALSE;
318
- }
319
-
320
- /**
321
- * Returns the total posts without using WP_Model::all()
322
- *
323
- * @return int
324
- */
325
- public static function count($postStatus = 'publish'){
326
- $count = wp_count_posts(self::getPostType());
327
- return !is_null($count)? (isset($count->$postStatus)? intval($count->$postStatus) : 0) : 0;
328
- }
329
-
330
- /**
331
- * Returns the original post object
332
- *
333
- * @return WP_Post
334
- */
335
- public function post(){
336
- return $this->_post;
337
- }
338
-
339
- /**
340
- * Returns TRUE if the model's post has an associated featured image
341
- *
342
- * @return bool
343
- */
344
- public function hasFeaturedImage(){
345
- return (get_the_post_thumbnail_url($this->ID) !== FALSE)? TRUE : FALSE;
346
- }
347
-
348
- /**
349
- * Get model's featured image or return $default if it does not exist
350
- *
351
- * @param string $default
352
- * @return string
353
- */
354
- public function featuredImage($default = ''){
355
- $featuredImage = get_the_post_thumbnail_url($this->ID);
356
- return ($featuredImage !== FALSE)? $featuredImage : $default;
357
- }
358
-
359
- /**
360
- * Returns an asoc array representaion of the model
361
- *
362
- * @return array
363
- */
364
- public function toArray(){
365
- $model = array();
366
-
367
- foreach($this->attributes as $key => $attribute){
368
- if(!empty($this->protected) && !in_array($attribute, $this->protected)){
369
- // Do not add to $model
370
- }else{
371
- $model[$attribute] = $this->$attribute;
372
- }
373
- }
374
-
375
- if(!empty($this->serialize)){
376
- foreach($this->serialize as $key => $attribute){
377
- if(!empty($this->protected) && !in_array($attribute, $this->protected)){
378
- // Do not add to $model
379
- }else{
380
- $model[$attribute] = $this->$attribute;
381
- }
382
- }
383
- }
384
-
385
- $model['ID'] = $this->ID;
386
- $model['title'] = $this->title;
387
- $model['content'] = $this->content;
388
- return $model;
389
- }
390
-
391
- public function postDate($format = 'd-m-Y'){
392
- return date($format, strtotime($this->_post->post_date));
393
- }
394
-
395
- /**
396
- * Get the model for a single page or in the loop
397
- *
398
- * @return object|NULL
399
- */
400
- public static function single(){
401
- return self::find(get_the_ID());
402
- }
403
-
404
- /**
405
- * returns the post's permalink
406
- *
407
- * @return string
408
- */
409
- public function permalink(){
410
- return get_permalink($this->ID);
411
- }
412
-
413
-
414
- // ----------------------------------------------------
415
- // FINDERS
416
- // ----------------------------------------------------
417
- /**
418
- * Find model by it's post ID
419
- *
420
- * @param int $ID
421
- * @return Object|NULL
422
- */
423
- public static function find($ID){
424
- if(self::exists($ID)){
425
- $class = self::newInstance();
426
- $class->ID = $ID;
427
- $class->boot();
428
- return $class;
429
- }
430
-
431
- return NULL;
432
- }
433
-
434
- /**
435
- * Find most recent models
436
- * @param integer $limit
437
- * @return Array
438
- */
439
- public static function latest($limit = 1){
440
- $class = get_called_class();
441
- return $class::finder('Latest__', array('limit' => $limit));
442
- }
443
-
444
- public static function _finderLatest__($args){
445
- return array(
446
- 'posts_per_page' => (isset($args['limit'])? $args['limit'] : 3),
447
- );
448
- }
449
-
450
- public static function _postFinderLatest__($results, $args){
451
- if($args['limit'] == '1'){
452
- return @$results[0];
453
- }
454
- return $results;
455
- }
456
-
457
- /**
458
- * Returns all models
459
- *
460
- * @param string $limit
461
- * @return array
462
- */
463
- public static function all($limit = '999999999'){
464
- $return = array();
465
- $args = array(
466
- 'post_type' => self::getPostType(),
467
- 'posts_per_page' => $limit,
468
- 'order' => 'DESC',
469
- 'orderby' => 'id',
470
- 'post_status' => array('publish'),
471
- );
472
-
473
- foreach((new WP_Query($args))->get_posts() as $post){
474
- $return[] = self::find($post->ID);
475
- }
476
-
477
- return $return;
478
- }
479
-
480
- /**
481
- * Retun an array of models as asoc array. Key by $value
482
- *
483
- * @param string $value
484
- * @param array $models
485
- * @return array
486
- */
487
- public static function asList($value = NULL, $models = FALSE){
488
- if(!is_array($models)){
489
- $self = get_called_class();
490
- $models = $self::all();
491
- }
492
-
493
- $return = array();
494
- foreach($models as $model){
495
- if(is_int($model) || $model instanceof WP_Post){
496
- $model = self::find($model->ID);
497
- }
498
-
499
- if(is_null($value)){
500
- $return[$model->ID] = $model;
501
- }else{
502
- $return[$model->ID] = $model->$value;
503
- }
504
- }
505
-
506
- return $return;
507
- }
508
-
509
- /**
510
- * Execute funder method
511
- *
512
- * @param string $finder
513
- * @param array $arguments
514
- * @return array
515
- */
516
- public static function finder($finder, Array $arguments = array()){
517
- $return = array();
518
- $finderMethod = '_finder'.ucfirst($finder);
519
- $class = get_called_class();
520
- $model = $class::newWithoutConstructor();
521
- if(!in_array($finderMethod, self::extract(( new ReflectionClass(get_called_class()) )->getMethods(), 'name'))){
522
- throw new Exception("Finder method {$finderMethod} not found in {$class}");
523
- }
524
-
525
- $args = $model->$finderMethod($arguments);
526
- if(!is_array($args)){
527
- throw new Exception("Finder method must return an array");
528
- }
529
-
530
- $args['post_type'] = self::getPostType();
531
- /* i592995 */
532
- $args['posts_per_page'] = -1;
533
- /* i592995 */
534
- foreach((new WP_Query($args))->get_posts() as $key => $post){
535
- $return[] = self::find($post->ID);
536
- }
537
-
538
- $postFinderMethod = '_postFinder'.ucfirst($finder);
539
- if(in_array($postFinderMethod, self::extract(( new ReflectionClass(get_called_class()) )->getMethods(), 'name'))){
540
- return $model->$postFinderMethod($return, $arguments);
541
- }
542
-
543
- return $return;
544
- }
545
-
546
- /**
547
- * @return void
548
- */
549
- public static function in(Array $ids = array()){
550
- $results = array();
551
- if(!is_array($ids)){
552
- $ids = func_get_args();
553
- }
554
-
555
- foreach($ids as $key => $id){
556
- if(self::exists($id)){
557
- $results[] = self::find($id);
558
- }
559
- }
560
-
561
- return $results;
562
- }
563
-
564
- // -----------------------------------------------------
565
- // SAVE
566
- // -----------------------------------------------------
567
- /**
568
- * Save the model and all of it's associated data
569
- *
570
- * @param Array $overrides List of parameters to override for wp_insert_post(), such as post_status
571
- *
572
- * @return Object $this
573
- */
574
- public function save($overrides = array()){
575
- $this->triggerEvent('saving');
576
-
577
- $overwrite = array_merge($overrides, array(
578
- 'post_type' => self::getPostType()
579
- ));
580
-
581
- if(!is_null($this->ID)){
582
-
583
- $defaults = array(
584
- 'ID' => $this->ID,
585
- 'post_title' => $this->title,
586
- 'post_content' => ($this->content !== NULL)? $this->content : ' ',
587
- );
588
- wp_update_post(array_merge($defaults, $overwrite));
589
-
590
- }else{
591
-
592
- $this->triggerEvent('inserting');
593
- $defaults = array(
594
- 'post_status' => 'publish',
595
- 'post_title' => $this->title,
596
- 'post_content' => ($this->content !== NULL)? $this->content : ' ',
597
- );
598
- $this->ID = wp_insert_post(array_merge($defaults, $overwrite));
599
- $this->_post = get_post($this->ID);
600
- $this->triggerEvent('inserted');
601
-
602
- }
603
-
604
- foreach($this->attributes as $attribute){
605
- $this->setMeta($attribute, $this->get($attribute, ''));
606
- }
607
-
608
- $this->setMeta('_id', $this->ID);
609
- $this->triggerEvent('saved');
610
- return $this;
611
- }
612
-
613
- // -----------------------------------------------------
614
- // DELETE
615
- // -----------------------------------------------------
616
- /**
617
- * @return void
618
- */
619
- public function delete(){
620
- $this->triggerEvent('deleting');
621
- wp_trash_post($this->ID);
622
- $this->triggerEvent('deleted');
623
- }
624
-
625
- /**
626
- * @return void
627
- */
628
- public function hardDelete(){
629
- $this->triggerEvent('hardDeleting');
630
-
631
- wp_update_post(array(
632
- 'ID' => $this->ID,
633
- 'post_title' => '',
634
- 'post_content' => '',
635
- ));
636
-
637
- foreach($this->attributes as $attribute){
638
- $this->deleteMeta($attribute);
639
- $this->set($attribute, NULL);
640
- }
641
-
642
- $this->setMeta('_id', $this->ID);
643
- $this->setMeta('_hardDeleted', '1');
644
- wp_delete_post($this->ID, TRUE);
645
- $this->triggerEvent('hardDeleted');
646
- }
647
-
648
- /**
649
- * @return void
650
- */
651
- public static function restore($ID){
652
- wp_untrash_post($ID);
653
- return self::find($ID);
654
- }
655
- }
1
+ <?php
2
+
3
+ /**
4
+ * WP_Model
5
+ *
6
+ * A simple class for creating active
7
+ * record, eloquent-esque models of WordPress Posts.
8
+ *
9
+ * @author Shapepress.com
10
+ */
11
+ Abstract Class SPDSGVOModel{
12
+
13
+ public $ID;
14
+ public $_post;
15
+ public $data = array();
16
+ public $attributes = array();
17
+ public $default = array();
18
+ public $virtual = array();
19
+
20
+
21
+ /**
22
+ * Create a new instace with data
23
+ *
24
+ * @param array $insert
25
+ * @return void
26
+ */
27
+ public function __construct(Array $insert = array()){
28
+ if(!empty($this->default)){
29
+ foreach($this->default as $attribute => $value){
30
+ $this->data[$attribute] = $value;
31
+ }
32
+ }
33
+
34
+ foreach($insert as $attribute => $value){
35
+ if(in_array($attribute, $this->attributes)){
36
+ $this->set($attribute, $value);
37
+ }
38
+ }
39
+
40
+ $this->set('title', isset($insert['title'])? $insert['title'] : '');
41
+ $this->set('content', isset($insert['content'])? $insert['content'] : '');
42
+ $this->boot();
43
+ }
44
+
45
+ /**
46
+ * Initalize the model, load in any addional data
47
+ *
48
+ * @return void
49
+ */
50
+ protected function boot(){
51
+ $this->triggerEvent('booting');
52
+
53
+ if(isset($this->ID)){
54
+ $this->_post = get_post($this->ID);
55
+ $this->set('title', $this->_post->post_title);
56
+ $this->set('content', $this->_post->post_content);
57
+
58
+ foreach($this->attributes as $attribute){
59
+ $meta = $this->getMeta($attribute);
60
+ if(empty($meta) && isset($this->default[$attribute])){
61
+ $this->set($attribute, $this->default[$attribute]);
62
+ }else{
63
+ $this->set($attribute, $meta);
64
+ }
65
+ }
66
+ }
67
+
68
+ $this->triggerEvent('booted');
69
+ }
70
+
71
+ /**
72
+ * Register the post type using the propery $postType as the post type
73
+ *
74
+ * @param array $args see: register_post_type()
75
+ * @return void
76
+ */
77
+ public static function register($args = array()){
78
+ $postType = self::getPostType();
79
+
80
+ register_post_type($postType, $args);
81
+ }
82
+
83
+ /**
84
+ * Create a new model with data, save and return the model
85
+ *
86
+ * @param array $insert
87
+ */
88
+ public static function insert(Array $insert = array()){
89
+ return self::newInstance($insert)->save();
90
+ }
91
+
92
+
93
+ // -----------------------------------------------------
94
+ // EVENTS
95
+ // -----------------------------------------------------
96
+ /**
97
+ * Fire event if the event method exists
98
+ *
99
+ * @param string $event event name
100
+ * @return bool
101
+ */
102
+ protected function triggerEvent($event){
103
+ if(method_exists($this, $event)){
104
+ $this->$event($this);
105
+ return TRUE;
106
+ }
107
+
108
+ return FALSE;
109
+ }
110
+
111
+
112
+ // -----------------------------------------------------
113
+ // UTILITY METHODS
114
+ // -----------------------------------------------------
115
+ /**
116
+ * Create a new model without calling the constructor.
117
+ *
118
+ * @return object
119
+ */
120
+ protected static function newWithoutConstructor(){
121
+ $class = get_called_class();
122
+ $reflection = new ReflectionClass($class);
123
+ return $reflection->newInstanceWithoutConstructor();
124
+ }
125
+
126
+ public static function extract($array, $column){
127
+ $return = array();
128
+
129
+ if(is_array($array)){
130
+ foreach($array as $value){
131
+ if(is_object($value)){
132
+ $return[] = @$value->$column;
133
+ }elseif(is_array($value)){
134
+ $return[] = @$value[$column];
135
+ }
136
+ }
137
+ }
138
+
139
+ return $return;
140
+ }
141
+
142
+ private function getAttributes(){
143
+ return array_merge($this->attributes, array('title', 'content', 'the_content'));
144
+ }
145
+
146
+ /**
147
+ * Returns the post type
148
+ *
149
+ * @return string
150
+ *
151
+ * @throws \Exception
152
+ */
153
+ public static function getPostType(){
154
+ $model = self::newWithoutConstructor();
155
+
156
+ if(isset($model->postType)){
157
+ return $model->postType;
158
+ }
159
+
160
+ throw new Exception('$postType not defined');
161
+ }
162
+
163
+ /**
164
+ * Returns a new model
165
+ *
166
+ * @return object
167
+ */
168
+ public static function newInstance($insert = array()){
169
+ $class = get_called_class();
170
+ return new $class($insert);
171
+ }
172
+
173
+ /**
174
+ * Returns TRUE if $attribute is in the $virtual array
175
+ * and has a corresponding vitaul property method
176
+ *
177
+ * @param string $attribute
178
+ * @return bool
179
+ */
180
+ public function isVirtualProperty($attribute){
181
+ return (isset($this->virtual) &&
182
+ in_array($attribute, $this->virtual) &&
183
+ method_exists($this, ('_get'. ucfirst($attribute))));
184
+ }
185
+
186
+ /**
187
+ * Calls virtual property method
188
+ *
189
+ * @param string $attribute
190
+ * @return mixed
191
+ */
192
+ public function getVirtualProperty($attribute){
193
+ return call_user_func(array($this, ('_get'. ucfirst($attribute))));
194
+ }
195
+
196
+
197
+
198
+ // -----------------------------------------------------
199
+ // Meta
200
+ // -----------------------------------------------------
201
+ /**
202
+ * Returns meta value for a meta key
203
+ *
204
+ * @param string meta_key
205
+ * @return string
206
+ */
207
+ public function getMeta($key){
208
+ return get_post_meta($this->ID, $key, TRUE);
209
+ }
210
+
211
+ /**
212
+ * Set meta value for a meta key
213
+ *
214
+ * @param string meta_key
215
+ * @param string meta_value
216
+ * @return void
217
+ */
218
+ public function setMeta($key, $value){
219
+ update_post_meta($this->ID, $key, $value);
220
+ }
221
+
222
+ /**
223
+ * Delete meta's meta
224
+ *
225
+ * @param string meta_key
226
+ * @return void
227
+ */
228
+ public function deleteMeta($key){
229
+ delete_post_meta($this->ID, $key);
230
+ }
231
+
232
+
233
+ // -----------------------------------------------------
234
+ // GETTERS & SETTERS
235
+ // -----------------------------------------------------
236
+ /**
237
+ * Get property of model or $default
238
+ *
239
+ * @param property $attribute
240
+ * @param property $default
241
+ * @return mixed
242
+ *
243
+ */
244
+ public function get($attribute, $default = NULL){
245
+ if($attribute === 'the_content'){
246
+ return apply_filters('the_content', $this->data['content']);
247
+ }elseif(isset($this->data[$attribute])){
248
+ return $this->data[$attribute];
249
+ }else{
250
+ return $default;
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Set propert of the model
256
+ *
257
+ * @param string $attribute
258
+ * @param string $value
259
+ * @return void
260
+ */
261
+ public function set($attribute, $value){
262
+ if(in_array($attribute, $this->getAttributes())){
263
+ $this->data[$attribute] = $value;
264
+ }
265
+ }
266
+
267
+ // -----------------------------------------------------
268
+ // MAGIC METHODS
269
+ // -----------------------------------------------------
270
+ /**
271
+ * @return void
272
+ */
273
+ public function __set($attribute, $value){
274
+ if(in_array($attribute, $this->getAttributes())){
275
+ $this->set($attribute, $value);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * @return void
281
+ */
282
+ public function __get($attribute){
283
+ if(in_array($attribute, $this->getAttributes())){
284
+ return $this->get($attribute);
285
+ }else if($this->isVirtualProperty($attribute)){
286
+ return $this->getVirtualProperty($attribute);
287
+ }else if($attribute === 'post_title'){
288
+ return $this->title;
289
+ }else if($attribute === 'post_content'){
290
+ return $this->content;
291
+ }
292
+ }
293
+
294
+
295
+ // -----------------------------------------------------
296
+ // HELPER METHODS
297
+ // -----------------------------------------------------
298
+ /**
299
+ * Check if the post exists by Post ID
300
+ *
301
+ * @param string|int $ID Post ID
302
+ * @param bool $postTypeSafe Require post to be the same post type as the model
303
+ * @return bool
304
+ */
305
+ public static function exists($ID, $postTypeSafe = TRUE){
306
+ if($postTypeSafe){
307
+ if(
308
+ (get_post_status($ID) !== FALSE) &&
309
+ (get_post_type($ID) === self::getPostType())){
310
+ return TRUE;
311
+ }
312
+ }else{
313
+ return (get_post_status($ID) !== FALSE);
314
+ }
315
+
316
+ return FALSE;
317
+ }
318
+
319
+ /**
320
+ * Returns the total posts without using WP_Model::all()
321
+ *
322
+ * @return int
323
+ */
324
+ public static function count($postStatus = 'publish'){
325
+ $count = wp_count_posts(self::getPostType());
326
+ return !is_null($count)? (isset($count->$postStatus)? intval($count->$postStatus) : 0) : 0;
327
+ }
328
+
329
+ /**
330
+ * Returns the original post object
331
+ *
332
+ * @return WP_Post
333
+ */
334
+ public function post(){
335
+ return $this->_post;
336
+ }
337
+
338
+ /**
339
+ * Returns TRUE if the model's post has an associated featured image
340
+ *
341
+ * @return bool
342
+ */
343
+ public function hasFeaturedImage(){
344
+ return (get_the_post_thumbnail_url($this->ID) !== FALSE)? TRUE : FALSE;
345
+ }
346
+
347
+ /**
348
+ * Get model's featured image or return $default if it does not exist
349
+ *
350
+ * @param string $default
351
+ * @return string
352
+ */
353
+ public function featuredImage($default = ''){
354
+ $featuredImage = get_the_post_thumbnail_url($this->ID);
355
+ return ($featuredImage !== FALSE)? $featuredImage : $default;
356
+ }
357
+
358
+ /**
359
+ * Returns an asoc array representaion of the model
360
+ *
361
+ * @return array
362
+ */
363
+ public function toArray(){
364
+ $model = array();
365
+
366
+ foreach($this->attributes as $key => $attribute){
367
+ if(!empty($this->protected) && !in_array($attribute, $this->protected)){
368
+ // Do not add to $model
369
+ }else{
370
+ $model[$attribute] = $this->$attribute;
371
+ }
372
+ }
373
+
374
+ if(!empty($this->serialize)){
375
+ foreach($this->serialize as $key => $attribute){
376
+ if(!empty($this->protected) && !in_array($attribute, $this->protected)){
377
+ // Do not add to $model
378
+ }else{
379
+ $model[$attribute] = $this->$attribute;
380
+ }
381
+ }
382
+ }
383
+
384
+ $model['ID'] = $this->ID;
385
+ $model['title'] = $this->title;
386
+ $model['content'] = $this->content;
387
+ return $model;
388
+ }
389
+
390
+ public function postDate($format = 'd-m-Y'){
391
+ return date($format, strtotime($this->_post->post_date));
392
+ }
393
+
394
+ /**
395
+ * Get the model for a single page or in the loop
396
+ *
397
+ * @return object|NULL
398
+ */
399
+ public static function single(){
400
+ return self::find(get_the_ID());
401
+ }
402
+
403
+ /**
404
+ * returns the post's permalink
405
+ *
406
+ * @return string
407
+ */
408
+ public function permalink(){
409
+ return get_permalink($this->ID);
410
+ }
411
+
412
+
413
+ // ----------------------------------------------------
414
+ // FINDERS
415
+ // ----------------------------------------------------
416
+ /**
417
+ * Find model by it's post ID
418
+ *
419
+ * @param int $ID
420
+ * @return Object|NULL
421
+ */
422
+ public static function find($ID){
423
+ if(self::exists($ID)){
424
+ $class = self::newInstance();
425
+ $class->ID = $ID;
426
+ $class->boot();
427
+ return $class;
428
+ }
429
+
430
+ return NULL;
431
+ }
432
+
433
+ /**
434
+ * Find most recent models
435
+ * @param integer $limit
436
+ * @return Array
437
+ */
438
+ public static function latest($limit = 1){
439
+ $class = get_called_class();
440
+ return $class::finder('Latest__', array('limit' => $limit));
441
+ }
442
+
443
+ public static function _finderLatest__($args){
444
+ return array(
445
+ 'posts_per_page' => (isset($args['limit'])? $args['limit'] : 3),
446
+ );
447
+ }
448
+
449
+ public static function _postFinderLatest__($results, $args){
450
+ if($args['limit'] == '1'){
451
+ return @$results[0];
452
+ }
453
+ return $results;
454
+ }
455
+
456
+ /**
457
+ * Returns all models
458
+ *
459
+ * @param string $limit
460
+ * @return array
461
+ */
462
+ public static function all($limit = '999999999'){
463
+ $return = array();
464
+ $args = array(
465
+ 'post_type' => self::getPostType(),
466
+ 'posts_per_page' => $limit,
467
+ 'order' => 'DESC',
468
+ 'orderby' => 'id',
469
+ 'post_status' => array('publish'),
470
+ );
471
+
472
+ foreach((new WP_Query($args))->get_posts() as $post){
473
+ $return[] = self::find($post->ID);
474
+ }
475
+
476
+ return $return;
477
+ }
478
+
479
+ /**
480
+ * Retun an array of models as asoc array. Key by $value
481
+ *
482
+ * @param string $value
483
+ * @param array $models
484
+ * @return array
485
+ */
486
+ public static function asList($value = NULL, $models = FALSE){
487
+ if(!is_array($models)){
488
+ $self = get_called_class();
489
+ $models = $self::all();
490
+ }
491
+
492
+ $return = array();
493
+ foreach($models as $model){
494
+ if(is_int($model) || $model instanceof WP_Post){
495
+ $model = self::find($model->ID);
496
+ }
497
+
498
+ if(is_null($value)){
499
+ $return[$model->ID] = $model;
500
+ }else{
501
+ $return[$model->ID] = $model->$value;
502
+ }
503
+ }
504
+
505
+ return $return;
506
+ }
507
+
508
+ /**
509
+ * Execute funder method
510
+ *
511
+ * @param string $finder
512
+ * @param array $arguments
513
+ * @return array
514
+ */
515
+ public static function finder($finder, Array $arguments = array()){
516
+ $return = array();
517
+ $finderMethod = '_finder'.ucfirst($finder);
518
+ $class = get_called_class();
519
+ $model = $class::newWithoutConstructor();
520
+ if(!in_array($finderMethod, self::extract(( new ReflectionClass(get_called_class()) )->getMethods(), 'name'))){
521
+ throw new Exception("Finder method {$finderMethod} not found in {$class}");
522
+ }
523
+
524
+ $args = $model->$finderMethod($arguments);
525
+ if(!is_array($args)){
526
+ throw new Exception("Finder method must return an array");
527
+ }
528
+
529
+ $args['post_type'] = self::getPostType();
530
+ /* i592995 */
531
+ $args['posts_per_page'] = -1;
532
+ /* i592995 */
533
+ foreach((new WP_Query($args))->get_posts() as $key => $post){
534
+ $return[] = self::find($post->ID);
535
+ }
536
+
537
+ $postFinderMethod = '_postFinder'.ucfirst($finder);
538
+ if(in_array($postFinderMethod, self::extract(( new ReflectionClass(get_called_class()) )->getMethods(), 'name'))){
539
+ return $model->$postFinderMethod($return, $arguments);
540
+ }
541
+
542
+ return $return;
543
+ }
544
+
545
+ /**
546
+ * @return void
547
+ */
548
+ public static function in(Array $ids = array()){
549
+ $results = array();
550
+ if(!is_array($ids)){
551
+ $ids = func_get_args();
552
+ }
553
+
554
+ foreach($ids as $key => $id){
555
+ if(self::exists($id)){
556
+ $results[] = self::find($id);
557
+ }
558
+ }
559
+
560
+ return $results;
561
+ }
562
+
563
+ // -----------------------------------------------------
564
+ // SAVE
565
+ // -----------------------------------------------------
566
+ /**
567
+ * Save the model and all of it's associated data
568
+ *
569
+ * @param Array $overrides List of parameters to override for wp_insert_post(), such as post_status
570
+ *
571
+ * @return Object $this
572
+ */
573
+ public function save($overrides = array()){
574
+ $this->triggerEvent('saving');
575
+
576
+ $overwrite = array_merge($overrides, array(
577
+ 'post_type' => self::getPostType()
578
+ ));
579
+
580
+ if(!is_null($this->ID)){
581
+
582
+ $defaults = array(
583
+ 'ID' => $this->ID,
584
+ 'post_title' => $this->title,
585
+ 'post_content' => ($this->content !== NULL)? $this->content : ' ',
586
+ );
587
+ wp_update_post(array_merge($defaults, $overwrite));
588
+
589
+ }else{
590
+
591
+ $this->triggerEvent('inserting');
592
+ $defaults = array(
593
+ 'post_status' => 'publish',
594
+ 'post_title' => $this->title,
595
+ 'post_content' => ($this->content !== NULL)? $this->content : ' ',
596
+ );
597
+ $this->ID = wp_insert_post(array_merge($defaults, $overwrite));
598
+ $this->_post = get_post($this->ID);
599
+ $this->triggerEvent('inserted');
600
+
601
+ }
602
+
603
+ foreach($this->attributes as $attribute){
604
+ $this->setMeta($attribute, $this->get($attribute, ''));
605
+ }
606
+
607
+ $this->setMeta('_id', $this->ID);
608
+ $this->triggerEvent('saved');
609
+ return $this;
610
+ }
611
+
612
+ // -----------------------------------------------------
613
+ // DELETE
614
+ // -----------------------------------------------------
615
+ /**
616
+ * @return void
617
+ */
618
+ public function delete(){
619
+ $this->triggerEvent('deleting');
620
+ wp_trash_post($this->ID);
621
+ $this->triggerEvent('deleted');
622
+ }
623
+
624
+ /**
625
+ * @return void
626
+ */
627
+ public function hardDelete(){
628
+ $this->triggerEvent('hardDeleting');
629
+
630
+ wp_update_post(array(
631
+ 'ID' => $this->ID,
632
+ 'post_title' => '',
633
+ 'post_content' => '',
634
+ ));
635
+
636
+ foreach($this->attributes as $attribute){
637
+ $this->deleteMeta($attribute);
638
+ $this->set($attribute, NULL);
639
+ }
640
+
641
+ $this->setMeta('_id', $this->ID);
642
+ $this->setMeta('_hardDeleted', '1');
643
+ wp_delete_post($this->ID, TRUE);
644
+ $this->triggerEvent('hardDeleted');
645
+ }
646
+
647
+ /**
648
+ * @return void
649
+ */
650
+ public static function restore($ID){
651
+ wp_untrash_post($ID);
652
+ return self::find($ID);
653
+ }
654
+ }
 
includes/class-sp-dsgvo-upgrade-notice-tools.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SPDSGVOUpgradeNoticeTools {
4
+
5
+ /**
6
+ * The upgrade notice shown inline.
7
+ *
8
+ * @var string
9
+ */
10
+ protected $upgrade_notice = '';
11
+
12
+
13
+ /**
14
+ * Show plugin changes on the plugins screen. Code adapted from W3 Total Cache.
15
+ *
16
+ * @param array $args Unused parameter.
17
+ * @param stdClass $response Plugin update response.
18
+ */
19
+ public function in_plugin_update_message( $args, $response ) {
20
+ $this->new_version = $response->new_version;
21
+ $this->upgrade_notice = $this->get_upgrade_notice( $response->url, $response->new_version );
22
+
23
+ $current_version_parts = explode( '.', sp_dsgvo_VERSION );
24
+ $new_version_parts = explode( '.', $this->new_version );
25
+
26
+ // If user has already moved to the minor version, we don't need to flag up anything.
27
+ if ( version_compare( $current_version_parts[0] . '.' . $current_version_parts[1], $new_version_parts[0] . '.' . $new_version_parts[1], '=' ) ) {
28
+ return;
29
+ }
30
+
31
+ if (empty($this->upgrade_notice ) == false)
32
+ {
33
+ echo $this->upgrade_notice ;
34
+ }
35
+
36
+ }
37
+
38
+ /**
39
+ * Get the upgrade notice from WordPress.org.
40
+ *
41
+ * @param string $version WooCommerce new version.
42
+ * @return string
43
+ */
44
+ protected function get_upgrade_notice($repoUrl, $version ) {
45
+ $transient_name = 'shapepress-dsgvo_upgrade_notice_' . $version;
46
+ $upgrade_notice = get_transient( $transient_name );
47
+ $upgrade_notice = ''; // dont use for now
48
+
49
+ if (empty($upgrade_notice) ) {
50
+ $response = wp_safe_remote_get( 'https://plugins.svn.wordpress.org/shapepress-dsgvo/trunk/README.txt' );
51
+
52
+ if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) {
53
+ $upgrade_notice = $this->parse_update_notice( $response['body'], $version );
54
+ set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS );
55
+ }
56
+ }
57
+ return $upgrade_notice;
58
+ }
59
+
60
+ /**
61
+ * Parse update notice from readme file.
62
+ *
63
+ * @param string $content WooCommerce readme file content.
64
+ * @param string $new_version WooCommerce new version.
65
+ * @return string
66
+ */
67
+ private function parse_update_notice( $content, $new_version ) {
68
+ $version_parts = explode( '.', $new_version );
69
+ $check_for_notices = array(
70
+ $version_parts[0] . '.0', // Major.
71
+ $version_parts[0] . '.0.0', // Major.
72
+ $version_parts[0] . '.' . $version_parts[1], // Minor.
73
+ $version_parts[0] . '.' . $version_parts[1] . '.' . $version_parts[2], // Patch.
74
+ );
75
+ $notice_regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( $new_version ) . '\s*=|$)~Uis';
76
+ $upgrade_notice = '';
77
+
78
+ foreach ( $check_for_notices as $check_version ) {
79
+ if ( version_compare( sp_dsgvo_VERSION, $check_version, '>' ) ) {
80
+ continue;
81
+ }
82
+
83
+ $matches = null;
84
+ if ( preg_match( $notice_regexp, $content, $matches ) ) {
85
+ $notices = (array) preg_split( '~[\r\n]+~', trim( $matches[2] ) );
86
+
87
+ if ( version_compare( trim( $matches[1] ), $check_version, '=' ) ) {
88
+ $upgrade_notice .= '<p class="sp-dsgvo_plugin_upgrade_notice">';
89
+
90
+ foreach ( $notices as $index => $line ) {
91
+ $upgrade_notice .= preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '<a href="${2}">${1}</a>', $line );
92
+ }
93
+
94
+ $upgrade_notice .= '</p>';
95
+ }
96
+ //break;
97
+ }
98
+ }
99
+ return $upgrade_notice;
100
+ }
101
+ }
includes/class-sp-dsgvo.php CHANGED
@@ -1,399 +1,444 @@
1
- <?php
2
-
3
- /**
4
- * The file that defines the core plugin class
5
- *
6
- * A class definition that includes attributes and functions used across both the
7
- * public-facing side of the site and the admin area.
8
- *
9
- * @link https://wp-dsgvo.eu
10
- * @since 1.0.0
11
- *
12
- * @package WP DSGVO Tools
13
- * @subpackage WP DSGVO Tools/includes
14
- */
15
-
16
- /**
17
- * The core plugin class.
18
- *
19
- * This is used to define internationalization, admin-specific hooks, and
20
- * public-facing site hooks.
21
- *
22
- * Also maintains the unique identifier of this plugin as well as the current
23
- * version of the plugin.
24
- *
25
- * @since 1.0.0
26
- * @package WP DSGVO Tools
27
- * @subpackage WP DSGVO Tools/includes
28
- * @author Shapepress eU
29
- */
30
- class SPDSGVO{
31
- /**
32
- * The loader that's responsible for maintaining and registering all hooks that power
33
- * the plugin.
34
- *
35
- * @since 1.0.0
36
- * @access protected
37
- * @var sp_dsgvo_Loader $loader Maintains and registers all hooks for the plugin.
38
- */
39
- protected $loader;
40
-
41
- /**
42
- * The current version of the plugin.
43
- *
44
- * @since 1.0.0
45
- * @access protected
46
- * @var string $version The current version of the plugin.
47
- */
48
- protected $version;
49
-
50
- /**
51
- * Singleton
52
- *
53
- * @since 1.0.0
54
- * @access protected
55
- * @var object $instance The singleton instance
56
- */
57
- protected static $instance = null;
58
-
59
- protected function __construct(){
60
- $this->version = sp_dsgvo_VERSION;
61
- $this->loadDependencies();
62
- $this->defineAdminHooks();
63
- $this->definePublicHooks();
64
- }
65
-
66
- protected function __clone(){}
67
-
68
- public static function instance(){
69
- if(!isset(static::$instance)){
70
- static::$instance = new static;
71
- }
72
-
73
- return static::$instance;
74
- }
75
-
76
- private function loadDependencies(){
77
- require_once plugin_dir_path(dirname(__FILE__)) .'includes/class-sp-dsgvo-loader.php';
78
- $this->loader = new SPDSGVOLoader();
79
-
80
- if(file_exists(dirname(dirname(__FILE__)) .'/vendor/autoload.php')){
81
- require_once dirname(dirname(__FILE__)) .'/vendor/autoload.php';
82
- }
83
-
84
- if(!class_exists('TCPDF')){
85
- require_once SPDSGVO::pluginDir('includes/lib/tcpdf/dsgdf.php');
86
- require_once SPDSGVO::pluginDir('includes/class-sp-dsgvo-pdf.php');
87
- }
88
-
89
- $load = array(
90
- //======================================================================
91
- // Libraries
92
- //======================================================================
93
- SPDSGVO::pluginDir('includes/helpers.php'),
94
- SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin.php'),
95
- SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin-tab.php'),
96
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-ajax-action.php'),
97
- SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin-action.php'),
98
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-settings.php'),
99
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-settings-polylang.php'),
100
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-mail.php'),
101
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-data-collecter.php'),
102
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-log.php'),
103
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-integration.php'),
104
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-slim-model.php'),
105
- SPDSGVO::pluginDir('includes/class-sp-dsgvo-cron.php'),
106
- SPDSGVO::pluginDir('public/class-sp-dsgvo-public.php'),
107
-
108
-
109
- //======================================================================
110
- // Models
111
- //======================================================================
112
- SPDSGVO::pluginDir('includes/models/unsubscriber.php'),
113
- SPDSGVO::pluginDir('includes/models/subject-access-request.php'),
114
-
115
-
116
- //======================================================================
117
- // Cron
118
- //======================================================================
119
- SPDSGVO::pluginDir('includes/cron/do-subject-access-request.php'),
120
- SPDSGVO::pluginDir('includes/cron/do-delete-data-request.php'),
121
- SPDSGVO::pluginDir('includes/cron/do-validate-license.php'),
122
-
123
-
124
- //======================================================================
125
- // Actions
126
- //======================================================================
127
- SPDSGVO::pluginDir('public/actions/unsubscribe.php'),
128
- SPDSGVO::pluginDir('public/actions/explicit-permission.php'),
129
- SPDSGVO::pluginDir('public/actions/user-permissions.php'),
130
- /* i592995 */
131
- SPDSGVO::pluginDir('public/actions/popup-accept.php'),
132
- /* i592995 */
133
- SPDSGVO::pluginDir('public/actions/notice-action.php'),
134
-
135
-
136
- //======================================================================
137
- // Shortcodes
138
- //======================================================================
139
- // SAR
140
- SPDSGVO::pluginDir('public/shortcodes/subject-access-request/download-subject-access-request.php'),
141
- SPDSGVO::pluginDir('public/shortcodes/subject-access-request/subject-access-request-action.php'),
142
- SPDSGVO::pluginDir('public/shortcodes/subject-access-request/subject-access-request.php'),
143
-
144
- // Super Unsubscribe
145
- SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-form.php'),
146
- SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-form-action.php'),
147
- SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-confirm-action.php'),
148
-
149
-
150
- SPDSGVO::pluginDir('public/shortcodes/privacy-policy.php'),
151
- SPDSGVO::pluginDir('public/shortcodes/explicit-permission.php'),
152
- SPDSGVO::pluginDir('public/shortcodes/decline-permission.php'),
153
- SPDSGVO::pluginDir('public/shortcodes/privacy-settings-form.php'),
154
- /* i592995 */
155
- SPDSGVO::pluginDir('public/shortcodes/privacy-settings-form-alt.php'),
156
- /* i592995 */
157
- SPDSGVO::pluginDir('public/shortcodes/display-services.php'),
158
- SPDSGVO::pluginDir('public/shortcodes/imprint.php'),
159
-
160
- //======================================================================
161
- // Default Integrations
162
- //======================================================================
163
- SPDSGVO::pluginDir('includes/integrations/mailchimp/MailchimpIntegration.php'),
164
- SPDSGVO::pluginDir('includes/integrations/woocommerce/WoocommerceIntegration.php'),
165
- SPDSGVO::pluginDir('includes/integrations/cf7/Cf7Integration.php'),
166
- SPDSGVO::pluginDir('includes/integrations/bbpress/BbpressIntegration.php'),
167
- SPDSGVO::pluginDir('includes/integrations/buddypress/BuddyPressIntegration.php'),
168
-
169
-
170
- //======================================================================
171
- // Admin Pages
172
- //======================================================================
173
-
174
- // Subject Access Request
175
- SPDSGVO::pluginDir('admin/tabs/subject-access-request/class-sp-dsgvo-subject-access-request-tab.php'),
176
- SPDSGVO::pluginDir('admin/tabs/subject-access-request/class-sp-dsgvo-subject-access-request-action.php'),
177
-
178
- // Super Unsubscribe
179
- SPDSGVO::pluginDir('admin/tabs/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-tab.php'),
180
- SPDSGVO::pluginDir('admin/tabs/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php'),
181
- /* i592995 */
182
- SPDSGVO::pluginDir('admin/tabs/super-unsubscribe/class-sp-dsgvo-dismiss-unsubscribe-action.php'),
183
- /* i592995 */
184
-
185
- // Services
186
- SPDSGVO::pluginDir('admin/tabs/services/class-sp-dsgvo-services-tab.php'),
187
- SPDSGVO::pluginDir('admin/tabs/services/class-sp-dsgvo-services-action.php'),
188
- SPDSGVO::pluginDir('admin/tabs/services/class-sp-dsgvo-delete-service-action.php'),
189
- SPDSGVO::pluginDir('admin/tabs/services/class-sp-dsgvo-add-service-action.php'),
190
-
191
- // Privacy Policy
192
- SPDSGVO::pluginDir('admin/tabs/privacy-policy/class-sp-dsgvo-privacy-policy-tab.php'),
193
- SPDSGVO::pluginDir('admin/tabs/privacy-policy/class-sp-dsgvo-privacy-policy-action.php'),
194
-
195
- // Imprint
196
- SPDSGVO::pluginDir('admin/tabs/imprint/class-sp-dsgvo-imprint-tab.php'),
197
- SPDSGVO::pluginDir('admin/tabs/imprint/class-sp-dsgvo-imprint-action.php'),
198
-
199
-
200
- // Common Settings
201
- SPDSGVO::pluginDir('admin/tabs/common-settings/class-sp-dsgvo-common-settings-tab.php'),
202
- SPDSGVO::pluginDir('admin/tabs/common-settings/class-sp-dsgvo-common-settings-action.php'),
203
- SPDSGVO::pluginDir('admin/tabs/common-settings/class-sp-dsgvo-common-settings-activate-action.php'),
204
- SPDSGVO::pluginDir('admin/tabs/common-settings/class-sp-dsgvo-common-settings-validate-license-action.php'),
205
-
206
- // Cookie Notice
207
- SPDSGVO::pluginDir('admin/tabs/cookie-notice/class-sp-dsgvo-cookie-notice-tab.php'),
208
- SPDSGVO::pluginDir('admin/tabs/cookie-notice/class-sp-dsgvo-cookie-notice-action.php'),
209
-
210
- // Integrations
211
- SPDSGVO::pluginDir('admin/tabs/integrations/class-sp-dsgvo-integrations-tab.php'),
212
- SPDSGVO::pluginDir('admin/tabs/integrations/class-sp-dsgvo-integrations-action.php'),
213
-
214
- // Imprint
215
- SPDSGVO::pluginDir('admin/tabs/setup/class-sp-dsgvo-setup-tab.php'),
216
- SPDSGVO::pluginDir('admin/tabs/setup/class-sp-dsgvo-create-page-action.php'),
217
- );
218
-
219
- // Gravity Forms
220
- if(class_exists( 'GFAPI' )){
221
- $load[] = SPDSGVO::pluginDir('admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-tab.php');
222
- $load[] = SPDSGVO::pluginDir('admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-action.php');
223
- }
224
-
225
- foreach($load as $path){
226
- require_once $path;
227
- }
228
-
229
- do_action('sp_dsgvo_booted');
230
- }
231
-
232
- public static function version(){
233
- return (new self)->version;
234
- }
235
-
236
- public static function isTesting(){
237
- return (defined('sp_dsgvo_TESTING') && sp_dsgvo_TESTING === '1');
238
- }
239
-
240
-
241
-
242
- /**
243
- * Register all of the hooks related to the admin area functionality
244
- * of the plugin.
245
- *
246
- * @since 1.0.0
247
- * @access private
248
- */
249
- private function defineAdminHooks(){
250
-
251
- $admin = new SPDSGVOAdmin();
252
- $this->loader->add_action('init', $admin, 'adminInit');
253
- $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueue_styles');
254
- $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueue_scripts');
255
-
256
- $this->loader->add_action('admin_menu', $admin, 'menuItem');
257
-
258
- // $this->loader->add_filter('manage_users_columns', $admin, 'addExplicitPermissionColumn');
259
- // $this->loader->add_filter('manage_users_custom_column', $admin, 'explicitPermissionColumnCallback', 1, 3);
260
-
261
- $this->loader->add_action('show_user_profile', $admin, 'showPermissonStatus');
262
- $this->loader->add_action('edit_user_profile', $admin, 'showPermissonStatus');
263
-
264
- $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueueColorPicker');
265
- $this->loader->add_action('display_post_states', $admin, 'addCustomPostStates', 1, 3);
266
-
267
- // gravity forms action
268
- $this->loader->add_action('gform_after_submission', $admin, 'gf_after_submisison_cleanse', 10, 2);
269
- $this->loader->add_action('admin_notices', $admin, 'dsvgvo_admin_notices' );
270
-
271
- // upgrade notice
272
- $this->loader->add_action( 'in_plugin_update_message-shapepress-dsgvo/sp-dsgvo.php', $admin,'showUpgradeMessage', 10, 2 );
273
- }
274
-
275
- /**
276
- * Register all of the hooks related to the public-facing functionality
277
- * of the plugin.
278
- *
279
- * @since 1.0.0
280
- * @access private
281
- */
282
- private function definePublicHooks(){
283
- $public = new SPDSGVOPublic();
284
- //add_filter( 'the_content', array( $public, 'addContent' ),99 );
285
- $this->loader->add_action('wp_enqueue_scripts', $public, 'enqueue_styles');
286
- $this->loader->add_action('wp_enqueue_scripts', $public, 'enqueue_scripts');
287
- $this->loader->add_action('upload_mimes', $public, 'allowJSON');
288
- $this->loader->add_action('user_register', $public, 'newUserRegistered', 10, 1);
289
- $this->loader->add_action('wp', $public, 'forcePermisson');
290
- $this->loader->add_action('init', $public, 'publicInit');
291
- $this->loader->add_action('sp_dsgvo_collect_user_data', $public, 'collectUserData');
292
- $this->loader->add_action('wp_print_footer_scripts', $public, 'wp_print_footer_scripts');
293
- $this->loader->add_action('wp_footer', $public, 'writeFooterScripts', 1000);
294
- $this->loader->add_action('wp_head', $public, 'writeHeaderScripts');
295
- $this->loader->add_filter('comment_form_field_comment', $public, 'fallbackAddCommentsCheckBoxForDSGVO', 20 );
296
- $this->loader->add_action('preprocess_comment', $public, 'customValidateCheckbox');
297
- $this->loader->add_action('wpcf7_init', $public, 'wpcf7AddDsgvoTag' );
298
- $this->loader->add_action('woocommerce_review_order_before_submit', $public, 'wooAddCustomFields', 20 );
299
- $this->loader->add_action('woocommerce_checkout_process', $public, 'wooAddCustomCheckout', 20);
300
- $this->loader->add_action('woocommerce_checkout_update_order_meta', $public, 'wooUpdateOrderMeta', 20);
301
- }
302
-
303
- /**
304
- * Run the loader to execute all of the hooks with WordPress.
305
- *
306
- * @since 1.0.0
307
- */
308
- public function run(){
309
- $this->loader->run();
310
- }
311
-
312
- /**
313
- * The name of the plugin used to uniquely identify it within the context of
314
- * WordPress and to define internationalization functionality.
315
- *
316
- * @since 1.0.0
317
- * @return string The name of the plugin.
318
- */
319
- public function get_sp_dsgvo() {
320
- return sp_dsgvo_NAME;
321
- }
322
-
323
- /**
324
- * The reference to the class that orchestrates the hooks with the plugin.
325
- *
326
- * @since 1.0.0
327
- * @return sp_dsgvo_Loader Orchestrates the hooks of the plugin.
328
- */
329
- public function get_loader() {
330
- return $this->loader;
331
- }
332
-
333
- /**
334
- * Retrieve the version number of the plugin.
335
- *
336
- * @since 1.0.0
337
- * @return string The version number of the plugin.
338
- */
339
- public function get_version() {
340
- return $this->version;
341
- }
342
-
343
- public function testPermissions(){
344
- return wp_upload_bits('sp-dsgvo-test-file.txt', NULL, time())['error'] === FALSE;
345
- }
346
-
347
-
348
- //======================================================================
349
- // Helpers
350
- //======================================================================
351
- public static function adminURL($params = NULL){
352
- if(is_null($params)){
353
- $params = array();
354
- }
355
-
356
- $params = http_build_query(array_merge(array(
357
- 'page' => 'sp-dsgvo',
358
- ), $params));
359
-
360
- return admin_url() .'?'. $params;
361
- }
362
-
363
- public static function pluginDir($append = ''){
364
- return plugin_dir_path(dirname(__FILE__)) . $append;
365
- }
366
-
367
- public static function pluginURI($append = ''){
368
- return plugin_dir_url(dirname(__FILE__)) . $append;
369
- }
370
-
371
- public static function isAjax(){
372
- return (strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') !== FALSE);
373
- }
374
-
375
- public function slugify($text){
376
- $text = preg_replace('~[^\pL\d]+~u', '-', $text);
377
-
378
- // transliterate
379
- $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
380
-
381
- // remove unwanted characters
382
- $text = preg_replace('~[^-\w]+~', '', $text);
383
-
384
- // trim
385
- $text = trim($text, '-');
386
-
387
- // remove duplicate -
388
- $text = preg_replace('~-+~', '-', $text);
389
-
390
- // lowercase
391
- $text = strtolower($text);
392
-
393
- if(empty($text)){
394
- return 'n-a';
395
- }
396
-
397
- return $text;
398
- }
399
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * The file that defines the core plugin class
5
+ *
6
+ * A class definition that includes attributes and functions used across both the
7
+ * public-facing side of the site and the admin area.
8
+ *
9
+ * @link https://wp-dsgvo.eu
10
+ * @since 1.0.0
11
+ *
12
+ * @package WP DSGVO Tools
13
+ * @subpackage WP DSGVO Tools/includes
14
+ */
15
+
16
+ /**
17
+ * The core plugin class.
18
+ *
19
+ * This is used to define internationalization, admin-specific hooks, and
20
+ * public-facing site hooks.
21
+ *
22
+ * Also maintains the unique identifier of this plugin as well as the current
23
+ * version of the plugin.
24
+ *
25
+ * @since 1.0.0
26
+ * @package WP DSGVO Tools
27
+ * @subpackage WP DSGVO Tools/includes
28
+ * @author Shapepress eU
29
+ */
30
+ class SPDSGVO{
31
+ /**
32
+ * The loader that's responsible for maintaining and registering all hooks that power
33
+ * the plugin.
34
+ *
35
+ * @since 1.0.0
36
+ * @access protected
37
+ * @var sp_dsgvo_Loader $loader Maintains and registers all hooks for the plugin.
38
+ */
39
+ protected $loader;
40
+
41
+ /**
42
+ * The current version of the plugin.
43
+ *
44
+ * @since 1.0.0
45
+ * @access protected
46
+ * @var string $version The current version of the plugin.
47
+ */
48
+ protected $version;
49
+
50
+ /**
51
+ * Singleton
52
+ *
53
+ * @since 1.0.0
54
+ * @access protected
55
+ * @var object $instance The singleton instance
56
+ */
57
+ protected static $instance = null;
58
+
59
+ protected function __construct(){
60
+ $this->version = sp_dsgvo_VERSION;
61
+ $this->loadDependencies();
62
+ $this->defineAdminHooks();
63
+ $this->definePublicHooks();
64
+ }
65
+
66
+ protected function __clone(){}
67
+
68
+ public static function instance(){
69
+ if(!isset(static::$instance)){
70
+ static::$instance = new static;
71
+ }
72
+
73
+ return static::$instance;
74
+ }
75
+
76
+ private function loadDependencies(){
77
+ require_once plugin_dir_path(dirname(__FILE__)) .'includes/class-sp-dsgvo-loader.php';
78
+ $this->loader = new SPDSGVOLoader();
79
+
80
+ if(file_exists(dirname(dirname(__FILE__)) .'/vendor/autoload.php')){
81
+ require_once dirname(dirname(__FILE__)) .'/vendor/autoload.php';
82
+ }
83
+
84
+ if(!class_exists('TCPDF')){
85
+ require_once SPDSGVO::pluginDir('includes/lib/tcpdf/dsgdf.php');
86
+ require_once SPDSGVO::pluginDir('includes/class-sp-dsgvo-pdf.php');
87
+ }
88
+
89
+ $load = array(
90
+ //======================================================================
91
+ // Libraries
92
+ //======================================================================
93
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-constants.php'),
94
+ SPDSGVO::pluginDir('includes/helpers.php'),
95
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-cache-manager.php'),
96
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-migrator.php'),
97
+ SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin.php'),
98
+ SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin-tab.php'),
99
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-ajax-action.php'),
100
+ SPDSGVO::pluginDir('admin/class-sp-dsgvo-admin-action.php'),
101
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-settings.php'),
102
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-settings-polylang.php'),
103
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-mail.php'),
104
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-data-collecter.php'),
105
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-log.php'),
106
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-integration-api-base.php'),
107
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-integration.php'),
108
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-javascript.php'),
109
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-slim-model.php'),
110
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-cron.php'),
111
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-language-tools.php'),
112
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-cookie-category-api.php'),
113
+ SPDSGVO::pluginDir('includes/class-sp-dsgvo-upgrade-notice-tools.php'),
114
+ SPDSGVO::pluginDir('public/class-sp-dsgvo-public.php'),
115
+
116
+
117
+ //======================================================================
118
+ // Models
119
+ //======================================================================
120
+ SPDSGVO::pluginDir('includes/models/unsubscriber.php'),
121
+ SPDSGVO::pluginDir('includes/models/subject-access-request.php'),
122
+
123
+
124
+ //======================================================================
125
+ // Cron
126
+ //======================================================================
127
+ SPDSGVO::pluginDir('includes/cron/do-subject-access-request.php'),
128
+ SPDSGVO::pluginDir('includes/cron/do-delete-data-request.php'),
129
+ SPDSGVO::pluginDir('includes/cron/do-validate-license.php'),
130
+ SPDSGVO::pluginDir('includes/cron/do-check-privacy-policy-texts.php'),
131
+
132
+ //======================================================================
133
+ // Actions
134
+ //======================================================================
135
+ SPDSGVO::pluginDir('public/actions/unsubscribe.php'),
136
+ SPDSGVO::pluginDir('public/actions/user-permissions.php'),
137
+ /* i592995 */
138
+ SPDSGVO::pluginDir('public/actions/popup-accept.php'),
139
+ /* i592995 */
140
+ SPDSGVO::pluginDir('public/actions/notice-action.php'),
141
+ SPDSGVO::pluginDir('public/actions/legal-web-text-action.php'),
142
+ SPDSGVO::pluginDir('public/actions/update-privacy-policy-texts-action.php'),
143
+
144
+
145
+ //======================================================================
146
+ // Shortcodes
147
+ //======================================================================
148
+ // SAR
149
+ SPDSGVO::pluginDir('public/shortcodes/subject-access-request/download-subject-access-request.php'),
150
+ SPDSGVO::pluginDir('public/shortcodes/subject-access-request/subject-access-request-action.php'),
151
+ SPDSGVO::pluginDir('public/shortcodes/subject-access-request/subject-access-request.php'),
152
+
153
+ // Super Unsubscribe
154
+ SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-form.php'),
155
+ SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-form-action.php'),
156
+ SPDSGVO::pluginDir('public/shortcodes/super-unsubscribe/unsubscribe-confirm-action.php'),
157
+
158
+
159
+ SPDSGVO::pluginDir('public/shortcodes/privacy-policy.php'),
160
+ SPDSGVO::pluginDir('public/shortcodes/imprint.php'),
161
+
162
+ //======================================================================
163
+ // Default Integrations
164
+ //======================================================================
165
+ SPDSGVO::pluginDir('includes/integrations/mailchimp/MailchimpIntegration.php'),
166
+ SPDSGVO::pluginDir('includes/integrations/woocommerce/WoocommerceIntegration.php'),
167
+ SPDSGVO::pluginDir('includes/integrations/cf7/Cf7Integration.php'),
168
+ SPDSGVO::pluginDir('includes/integrations/bbpress/BbpressIntegration.php'),
169
+ SPDSGVO::pluginDir('includes/integrations/buddypress/BuddyPressIntegration.php'),
170
+
171
+ // statistics
172
+ SPDSGVO::pluginDir('includes/integrations/statistics/googleanalytics/class-sp-dsgvo-google-analytics-api.php'),
173
+ SPDSGVO::pluginDir('includes/integrations/statistics/googleanalytics/class-sp-dsgvo-google-analytics-integration.php'),
174
+ SPDSGVO::pluginDir('includes/integrations/statistics/matomo/class-sp-dsgvo-matomo-api.php'),
175
+ SPDSGVO::pluginDir('includes/integrations/statistics/matomo/class-sp-dsgvo-matomo-integration.php'),
176
+ SPDSGVO::pluginDir('includes/integrations/statistics/wpstatistics/class-sp-dsgvo-wpstatistics-api.php'),
177
+ SPDSGVO::pluginDir('includes/integrations/statistics/wpstatistics/class-sp-dsgvo-wpstatistics-integration.php'),
178
+ SPDSGVO::pluginDir('includes/integrations/statistics/googletagmanager/class-sp-dsgvo-google-tagmanager-api.php'),
179
+ SPDSGVO::pluginDir('includes/integrations/statistics/googletagmanager/class-sp-dsgvo-google-tagmanager-integration.php'),
180
+ SPDSGVO::pluginDir('includes/integrations/statistics/clicky/class-sp-dsgvo-clicky-api.php'),
181
+ SPDSGVO::pluginDir('includes/integrations/statistics/clicky/class-sp-dsgvo-clicky-integration.php'),
182
+
183
+ SPDSGVO::pluginDir('includes/integrations/statistics/piwik/class-sp-dsgvo-piwik-api.php'),
184
+ SPDSGVO::pluginDir('includes/integrations/statistics/piwik/class-sp-dsgvo-piwik-integration.php'),
185
+ SPDSGVO::pluginDir('includes/integrations/statistics/etracker/class-sp-dsgvo-etracker-api.php'),
186
+ SPDSGVO::pluginDir('includes/integrations/statistics/etracker/class-sp-dsgvo-etracker-integration.php'),
187
+ SPDSGVO::pluginDir('includes/integrations/statistics/hotjar/class-sp-dsgvo-hotjar-api.php'),
188
+ SPDSGVO::pluginDir('includes/integrations/statistics/hotjar/class-sp-dsgvo-hotjar-integration.php'),
189
+
190
+ // targeting
191
+ SPDSGVO::pluginDir('includes/integrations/targeting/fbpixel/class-sp-dsgvo-fb-pixel-api.php'),
192
+ SPDSGVO::pluginDir('includes/integrations/targeting/fbpixel/class-sp-dsgvo-fb-pixel-integration.php'),
193
+ SPDSGVO::pluginDir('includes/integrations/targeting/criteo/class-sp-dsgvo-criteo-api.php'),
194
+ SPDSGVO::pluginDir('includes/integrations/targeting/criteo/class-sp-dsgvo-criteo-integration.php'),
195
+ SPDSGVO::pluginDir('includes/integrations/targeting/linkedinpixel/class-sp-dsgvo-linkedin-pixel-api.php'),
196
+ SPDSGVO::pluginDir('includes/integrations/targeting/linkedinpixel/class-sp-dsgvo-linkedin-pixel-integration.php'),
197
+ SPDSGVO::pluginDir('includes/integrations/targeting/bingadsuet/class-sp-dsgvo-bing-ads-uet-api.php'),
198
+ SPDSGVO::pluginDir('includes/integrations/targeting/bingadsuet/class-sp-dsgvo-bing-ads-uet-integration.php'),
199
+ //======================================================================
200
+ // Admin Pages
201
+ //======================================================================
202
+
203
+ SPDSGVO::pluginDir('admin/tabs/v3/info/class-sp-dsgvo-info-tab.php'),
204
+
205
+ SPDSGVO::pluginDir('admin/tabs/setup/class-sp-dsgvo-create-page-action.php'),
206
+
207
+ // Subject Access Request
208
+ SPDSGVO::pluginDir('admin/tabs/v3/subject-access-request/class-sp-dsgvo-subject-access-request-tab.php'),
209
+ SPDSGVO::pluginDir('admin/tabs/v3/subject-access-request/class-sp-dsgvo-subject-access-request-action.php'),
210
+
211
+ // Super Unsubscribe
212
+ SPDSGVO::pluginDir('admin/tabs/v3/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-tab.php'),
213
+ SPDSGVO::pluginDir('admin/tabs/v3/super-unsubscribe/class-sp-dsgvo-super-unsubscribe-action.php'),
214
+ /* i592995 */
215
+ SPDSGVO::pluginDir('admin/tabs/v3/super-unsubscribe/class-sp-dsgvo-dismiss-unsubscribe-action.php'),
216
+ /* i592995 */
217
+
218
+
219
+
220
+ // Common Settings
221
+ SPDSGVO::pluginDir('admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-tab.php'),
222
+ SPDSGVO::pluginDir('admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-action.php'),
223
+ SPDSGVO::pluginDir('admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-activate-action.php'),
224
+ SPDSGVO::pluginDir('admin/tabs/v3/common-settings/class-sp-dsgvo-common-settings-validate-license-action.php'),
225
+
226
+ SPDSGVO::pluginDir('admin/tabs/v3/common-settings/class-sp-dsgvo-privacy-policy-action.php'),
227
+
228
+
229
+ // Cookie Notice
230
+ SPDSGVO::pluginDir('admin/tabs/v3/popup-notice/class-sp-dsgvo-cookie-notice-tab.php'),
231
+ SPDSGVO::pluginDir('admin/tabs/v3/popup-notice/class-sp-dsgvo-cookie-notice-action.php'),
232
+
233
+ // Operator
234
+ SPDSGVO::pluginDir('admin/tabs/v3/operator/class-sp-dsgvo-operator-tab.php'),
235
+ SPDSGVO::pluginDir('admin/tabs/v3/operator/class-sp-dsgvo-operator-action.php'),
236
+ SPDSGVO::pluginDir('admin/tabs/v3/operator/class-sp-dsgvo-imprint-action.php'),
237
+
238
+ // Page Basics
239
+ SPDSGVO::pluginDir('admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-tab.php'),
240
+ SPDSGVO::pluginDir('admin/tabs/v3/page-basics/class-sp-dsgvo-page-basics-action.php'),
241
+
242
+ // Statistic Integrations
243
+ SPDSGVO::pluginDir('admin/tabs/v3/stats/class-sp-dsgvo-stats-tab.php'),
244
+ SPDSGVO::pluginDir('admin/tabs/v3/stats/class-sp-dsgvo-stats-action.php'),
245
+
246
+ // Targeting Integrations
247
+ SPDSGVO::pluginDir('admin/tabs/v3/targeting/class-sp-dsgvo-targeting-tab.php'),
248
+ SPDSGVO::pluginDir('admin/tabs/v3/targeting/class-sp-dsgvo-targeting-action.php'),
249
+
250
+ // Integrations
251
+ SPDSGVO::pluginDir('admin/tabs/integrations/class-sp-dsgvo-integrations-tab.php'),
252
+ SPDSGVO::pluginDir('admin/tabs/integrations/class-sp-dsgvo-integrations-action.php'),
253
+
254
+ );
255
+
256
+ // Gravity Forms
257
+ if(class_exists( 'GFAPI' )){
258
+ $load[] = SPDSGVO::pluginDir('admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-tab.php');
259
+ $load[] = SPDSGVO::pluginDir('admin/tabs/gravity-forms/class-sp-dsgvo-gravity-forms-action.php');
260
+ }
261
+
262
+ foreach($load as $path){
263
+ require_once $path;
264
+ }
265
+
266
+ do_action('sp_dsgvo_booted');
267
+ }
268
+
269
+ public static function version(){
270
+ return (new self)->version;
271
+ }
272
+
273
+ public static function isTesting(){
274
+ return (defined('sp_dsgvo_TESTING') && sp_dsgvo_TESTING === '1');
275
+ }
276
+
277
+
278
+
279
+ /**
280
+ * Register all of the hooks related to the admin area functionality
281
+ * of the plugin.
282
+ *
283
+ * @since 1.0.0
284
+ * @access private
285
+ */
286
+ private function defineAdminHooks(){
287
+ $admin = new SPDSGVOAdmin();
288
+ $this->loader->add_action('init', $admin, 'adminInit');
289
+ $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueue_styles');
290
+ $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueue_scripts');
291
+
292
+ $this->loader->add_action('admin_menu', $admin, 'menuItem');
293
+
294
+ // $this->loader->add_filter('manage_users_columns', $admin, 'addExplicitPermissionColumn');
295
+ // $this->loader->add_filter('manage_users_custom_column', $admin, 'explicitPermissionColumnCallback', 1, 3);
296
+
297
+ //$this->loader->add_action('show_user_profile', $admin, 'showCustomProfileFields');
298
+ //$this->loader->add_action('edit_user_profile', $admin, 'showCustomProfileFields');
299
+
300
+ $this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueueColorPicker');
301
+ $this->loader->add_action('display_post_states', $admin, 'addCustomPostStates', 1, 3);
302
+
303
+ // gravity forms action
304
+ $this->loader->add_action('gform_after_submission', $admin, 'gf_after_submisison_cleanse', 10, 2);
305
+ $this->loader->add_action('admin_notices', $admin, 'dsvgvo_admin_notices' );
306
+
307
+ // upgrade notice
308
+ $this->loader->add_action( 'in_plugin_update_message-shapepress-dsgvo/sp-dsgvo.php', $admin,'showUpgradeMessage', 10, 2 );
309
+ // do migration logic
310
+ $this->loader->add_action('upgrader_process_complete', SPDSGVOMigrator::getInstance(), 'checkForMigrations', 10, 2);
311
+ }
312
+
313
+ /**
314
+ * Register all of the hooks related to the public-facing functionality
315
+ * of the plugin.
316
+ *
317
+ * @since 1.0.0
318
+ * @access private
319
+ */
320
+ private function definePublicHooks(){
321
+ $public = new SPDSGVOPublic();
322
+ $this->loader->add_action('wp_enqueue_scripts', $public, 'enqueue_styles');
323
+ $this->loader->add_action('wp_enqueue_scripts', $public, 'enqueue_scripts');
324
+ $this->loader->add_action('wp_enqueue_scripts', SPDSGVOJavascript::getInstance(), 'register');
325
+ $this->loader->add_action('upload_mimes', $public, 'allowJSON');
326
+ //$this->loader->add_action('user_register', $public, 'newUserRegistered', 10, 1);
327
+ //$this->loader->add_action('wp', $public, 'forcePermisson');
328
+ $this->loader->add_action('init', $public, 'publicInit');
329
+ $this->loader->add_action('sp_dsgvo_collect_user_data', $public, 'collectUserData');
330
+ $this->loader->add_action('wp_print_footer_scripts', $public, 'wp_print_footer_scripts');
331
+ $this->loader->add_action('wp_footer', $public, 'writeFooterScripts', 1000);
332
+ $this->loader->add_action('wp_head', $public, 'writeHeaderScripts');
333
+ $this->loader->add_action('wp_body_open', $public, 'writeBodyStartScripts');
334
+
335
+ /**
336
+ * If activated by user, block google-fonts if cookies are not accepted
337
+ */
338
+ /*
339
+ if(hasUserGivenPermissionFor('google-fonts')) {
340
+ SPDSGVOPublic::blockGoogleFonts();
341
+ }
342
+ */
343
+
344
+ $this->loader->add_action('woocommerce_review_order_before_submit', $public, 'wooAddCustomFields', 20 );
345
+
346
+ }
347
+
348
+ /**
349
+ * Run the loader to execute all of the hooks with WordPress.
350
+ *
351
+ * @since 1.0.0
352
+ */
353
+ public function run(){
354
+ $this->loader->run();
355
+ }
356
+
357
+ /**
358
+ * The name of the plugin used to uniquely identify it within the context of
359
+ * WordPress and to define internationalization functionality.
360
+ *
361
+ * @since 1.0.0
362
+ * @return string The name of the plugin.
363
+ */
364
+ public function get_sp_dsgvo() {
365
+ return sp_dsgvo_NAME;
366
+ }
367
+
368
+ /**
369
+ * The reference to the class that orchestrates the hooks with the plugin.
370
+ *
371
+ * @since 1.0.0
372
+ * @return sp_dsgvo_Loader Orchestrates the hooks of the plugin.
373
+ */
374
+ public function get_loader() {
375
+ return $this->loader;
376
+ }
377
+
378
+ /**
379
+ * Retrieve the version number of the plugin.
380
+ *
381
+ * @since 1.0.0
382
+ * @return string The version number of the plugin.
383
+ */
384
+ public function get_version() {
385
+ return $this->version;
386
+ }
387
+
388
+ public function testPermissions(){
389
+ return wp_upload_bits('sp-dsgvo-test-file.txt', NULL, time())['error'] === FALSE;
390
+ }
391
+
392
+
393
+ //======================================================================
394
+ // Helpers
395
+ //======================================================================
396
+ public static function adminURL($params = NULL){
397
+ if(is_null($params)){
398
+ $params = array();
399
+ }
400
+
401
+ $params = http_build_query(array_merge(array(
402
+ 'page' => 'sp-dsgvo',
403
+ ), $params));
404
+
405
+ return admin_url() .'?'. $params;
406
+ }
407
+
408
+ public static function pluginDir($append = ''){
409
+ return plugin_dir_path(dirname(__FILE__)) . $append;
410
+ }
411
+
412
+ public static function pluginURI($append = ''){
413
+ return plugin_dir_url(dirname(__FILE__)) . $append;
414
+ }
415
+
416
+ public static function isAjax(){
417
+ return (strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') !== FALSE);
418
+ }
419
+
420
+ public function slugify($text){
421
+ $text = preg_replace('~[^\pL\d]+~u', '-', $text);
422
+
423
+ // transliterate
424
+ $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
425
+
426
+ // remove unwanted characters
427
+ $text = preg_replace('~[^-\w]+~', '', $text);
428
+
429
+ // trim
430
+ $text = trim($text, '-');
431
+
432
+ // remove duplicate -
433
+ $text = preg_replace('~-+~', '-', $text);
434
+
435
+ // lowercase
436
+ $text = strtolower($text);
437
+
438
+ if(empty($text)){
439
+ return 'n-a';
440
+ }
441
+
442
+ return $text;
443
+ }
444
+ }
includes/cron/do-check-privacy-policy-texts.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class DoCheckPrivacyPolicyTexts extends SPDSGVOCron
4
+ {
5
+
6
+ public $interval = array(
7
+ 'days' => 1,
8
+ );
9
+
10
+ public function handle()
11
+ {
12
+ $localTextsLanguage = SPDSGVOSettings::get('legal_web_texts_lang');
13
+ $localTextsVersion = SPDSGVOSettings::get('legal_web_texts_version');
14
+ $localTextsLastUpdate = SPDSGVOSettings::get('legal_web_texts_last_update');
15
+
16
+
17
+ $url = SPDSGVOConstants::LEGAL_WEB_TEXT_SERVICE_URL;
18
+ $url .= '?lang=' . $localTextsLanguage;
19
+ $url .= '&version=' . $localTextsVersion;
20
+ $url .= '&apiVersion=' . SPDSGVOConstants::LEGAL_WEB_TEXT_SERVICE_VERSION;
21
+
22
+ $request = wp_remote_get($url);
23
+ if (is_wp_error($request)) {
24
+ $error_string = $request->get_error_message();
25
+ error_log(__('error while updating language texts: ', 'shapepress-dsgvo') . $error_string); // Bail early
26
+ } else {
27
+
28
+ SPDSGVOSettings::set('legal_web_texts_last_check', time());
29
+
30
+ $result = wp_remote_retrieve_body($request);
31
+ if (strpos($result, "INFO") === 0) {
32
+ // file actual, just do nothing
33
+ } elseif (empty($result) == false && strpos($result, "ERROR") !== 0) {
34
+ // if premium then update texts, otherwise bring a notice
35
+
36
+ $resultCleaned = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $result);
37
+
38
+ // try to create json. if success then store
39
+ $xmlTextsJson = json_decode($resultCleaned, true);
40
+
41
+ if ($xmlTextsJson != null) {
42
+
43
+ // if premium then update texts, otherwise bring a notice
44
+ if (isValidPremiumEdition() == false) {
45
+ SPDSGVOSettings::set('show_notice_privacy_policy_texts_outdated', '1');
46
+
47
+ if (SPDSGVOSettings::get('pp_texts_notification_mail') == '1') {
48
+ wp_mail(SPDSGVOSettings::get('admin_email'),
49
+ __('WP DSGVO Tools (GPDR) Privacy policy texts outdated', 'shapepress-dsgvo') . ': ' . parse_url(home_url(), PHP_URL_HOST),
50
+ __('Attention. There are newer texts for the privacy policy. Please refresh them ensure compliance.', 'shapepress-dsgvo'));
51
+ }
52
+ return;
53
+ }
54
+
55
+ $xmlTextsBase64 = base64_encode($xmlTextsJson['Texts']);
56
+ $version = $xmlTextsJson['Version'];
57
+ if ($version == null || $version == '') $version = time();
58
+
59
+ SPDSGVOSettings::set('legal_web_texts', $xmlTextsBase64);
60
+ SPDSGVOSettings::set('legal_web_texts_version', $version);
61
+ SPDSGVOSettings::set('legal_web_texts_lang', $localTextsLanguage);
62
+ SPDSGVOSettings::set('legal_web_texts_last_update', time());
63
+
64
+ return $xmlTextsBase64;
65
+ } else {
66
+ $jsonError = json_last_error();
67
+ error_log('wrong texts received. json_error: ' . $jsonError); // Bail early
68
+ }
69
+
70
+ } else {
71
+ error_log('ERROR: shapepress-dsgvo: DoCheckPrivacyPolicyTexts: ' . $result);
72
+ }
73
+ }
74
+
75
+ }
76
+ }
77
+
78
+ DoCheckPrivacyPolicyTexts::register();
includes/cron/do-delete-data-request.php CHANGED
@@ -1,34 +1,34 @@
1
- <?php
2
-
3
- Class DoDSGVODeleteDataRequest extends SPDSGVOCron{
4
-
5
- public $interval = array(
6
- 'days' => 1,
7
- );
8
-
9
- public function handle(){
10
- $delCron = SPDSGVOSettings::get('su_auto_del_time');
11
- if($delCron !== '0'){
12
-
13
- $daysAgo = strtotime('-'.$delCron.' day');
14
-
15
- error_log(__('DoDSGVODeleteDataRequest with days:', 'shapepress-dsgvo').' '.$delCron . ' ' . __('and intval:', 'shapepress-dsgvo') . ' '.$daysAgo);
16
-
17
- foreach(SPDSGVOUnsubscriber::finder('pending') as $sar){
18
-
19
- $post = $sar->_post;// get_post($sar->ID);
20
- error_log(__('doing sar', 'shapepress-dsgvo') . ' '. $sar->ID . ' ' . __('with intval', 'shapepress-dsgvo') . ' '. intval(strtotime($post->post_date)));
21
-
22
- if (intval(strtotime($post->post_date)) <= intval($daysAgo))
23
- {
24
- $sar->doSuperUnsubscribe();
25
- } else
26
- {
27
- error_log(__('sar', 'shapepress-dsgvo') . ' '. $sar->ID . ' ' . __('has not the date to process', 'shapepress-dsgvo'));
28
- }
29
- }
30
- }
31
- }
32
- }
33
-
34
- DoDSGVODeleteDataRequest::register();
1
+ <?php
2
+
3
+ Class DoDSGVODeleteDataRequest extends SPDSGVOCron{
4
+
5
+ public $interval = array(
6
+ 'days' => 1,
7
+ );
8
+
9
+ public function handle(){
10
+ $delCron = SPDSGVOSettings::get('su_auto_del_time');
11
+ if($delCron !== '0'){
12
+
13
+ $daysAgo = strtotime('-'.$delCron.' day');
14
+
15
+ error_log(__('DoDSGVODeleteDataRequest with days:', 'shapepress-dsgvo').' '.$delCron . ' ' . __('and intval:', 'shapepress-dsgvo') . ' '.$daysAgo);
16
+
17
+ foreach(SPDSGVOUnsubscriber::finder('pending') as $sar){
18
+
19
+ $post = $sar->_post;// get_post($sar->ID);
20
+ error_log(__('doing sar', 'shapepress-dsgvo') . ' '. $sar->ID . ' ' . __('with intval', 'shapepress-dsgvo') . ' '. intval(strtotime($post->post_date)));
21
+
22
+ if (intval(strtotime($post->post_date)) <= intval($daysAgo))
23
+ {
24
+ $sar->doSuperUnsubscribe();
25
+ } else
26
+ {
27
+ error_log(__('sar', 'shapepress-dsgvo') . ' '. $sar->ID . ' ' . __('has not the date to process', 'shapepress-dsgvo'));
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ DoDSGVODeleteDataRequest::register();
includes/cron/do-subject-access-request.php CHANGED
@@ -1,34 +1,34 @@
1
- <?php
2
-
3
- Class DoDSGVOSubjectAccessRequest extends SPDSGVOCron{
4
-
5
- public $interval = array(
6
- 'days' => 1,
7
- );
8
-
9
- public function handle(){
10
- $sarCron = SPDSGVOSettings::get('sar_cron');
11
- if($sarCron !== '0'){
12
-
13
- $daysAgo = strtotime('-'.$sarCron.' day');
14
-
15
- //error_log('DoDSGVOSubjectAccessRequest with days: '.$sarCron . ' and intval: '.$daysAgo);
16
-
17
- foreach(SPDSGVOSubjectAccessRequest::finder('pending') as $sar){
18
-
19
- $post = $sar->_post;// get_post($sar->ID);
20
- //error_log('doing sar '. $sar->ID . ' with intval '. intval(strtotime($post->post_date)));
21
-
22
- if (intval(strtotime($post->post_date)) <= intval($daysAgo))
23
- {
24
- $sar->doSubjectAccessRequest();
25
- } else
26
- {
27
- //error_log('sar '. $sar->ID . ' has not the date to process');
28
- }
29
- }
30
- }
31
- }
32
- }
33
-
34
- DoDSGVOSubjectAccessRequest::register();
1
+ <?php
2
+
3
+ Class DoDSGVOSubjectAccessRequest extends SPDSGVOCron{
4
+
5
+ public $interval = array(
6
+ 'days' => 1,
7
+ );
8
+
9
+ public function handle(){
10
+ $sarCron = SPDSGVOSettings::get('sar_cron');
11
+ if($sarCron !== '0'){
12
+
13
+ $daysAgo = strtotime('-'.$sarCron.' day');
14
+
15
+ //error_log('DoDSGVOSubjectAccessRequest with days: '.$sarCron . ' and intval: '.$daysAgo);
16
+
17
+ foreach(SPDSGVOSubjectAccessRequest::finder('pending') as $sar){
18
+
19
+ $post = $sar->_post;// get_post($sar->ID);
20
+ //error_log('doing sar '. $sar->ID . ' with intval '. intval(strtotime($post->post_date)));
21
+
22
+ if (intval(strtotime($post->post_date)) <= intval($daysAgo))
23
+ {
24
+ $sar->doSubjectAccessRequest();
25
+ } else
26
+ {
27
+ //error_log('sar '. $sar->ID . ' has not the date to process');
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ DoDSGVOSubjectAccessRequest::register();
includes/cron/do-validate-license.php CHANGED
@@ -1,77 +1,81 @@
1
- <?php
2
-
3
- Class DoValidateLicense extends SPDSGVOCron{
4
-
5
- public $interval = array(
6
- 'days' => 1,
7
- );
8
-
9
- public function handle(){
10
- error_log("DoValidateLicense called");
11
- $licActivated = SPDSGVOSettings::get('license_activated');
12
- $licenceKey = SPDSGVOSettings::get('dsgvo_licence');
13
- $oldLicenseStatus = SPDSGVOSettings::get('licence_status');
14
-
15
- if($licActivated === '1' && $licenceKey !== ''){
16
-
17
- error_log("DoValidateLicense starting");
18
-
19
- error_log('validating licence '.$licenceKey);
20
-
21
- $url = 'https://wp-dsgvo.eu/spdsgvo-bin/licensedetails.php';
22
- $url .= '?license_key=' .$licenceKey;
23
-
24
- $request = wp_remote_get($url);
25
-
26
- if( is_wp_error( $request ) ) {
27
-
28
- error_log(__('error during license validation: ', 'shapepress-dsgvo').$request); // Bail early
29
- } else {
30
-
31
- $body = wp_remote_retrieve_body( $request );
32
- error_log('body: '.$body);
33
-
34
- if ($body !== false)
35
- {
36
- SPDSGVOSettings::set('licence_details_fetched', '1');
37
- SPDSGVOSettings::set('licence_details_fetched_new', '1');
38
- SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
39
- SPDSGVOSettings::set('show_invalid_license_notice', '0');
40
- SPDSGVOSettings::set('show_revoke_license_notice', '0');
41
-
42
- $data = json_decode( $body );
43
- SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
44
- SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
45
- SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
46
- SPDSGVOSettings::set('licence_status', $data->license_status);
47
-
48
- if (isPremiumEdition() && isLicenceValid() === false)
49
- {
50
- error_log("WP DSGVO Tools (GDPR) license is invalid.");
51
- SPDSGVOSettings::set('show_invalid_license_notice', '1');
52
- }
53
-
54
- if (licenseIsGoingToRunningOut())
55
- {
56
- error_log("WP DSGVO Tools (GDPR) license is going to running out in a few days");
57
- SPDSGVOSettings::set('show_revoke_license_notice', '1');
58
- }
59
-
60
- if (hasValidLicenseStatus($oldLicenseStatus, $licActivated)=== true
61
- && hasValidLicenseStatus($data->license_status, $licActivated) === false)
62
- {
63
- error_log("WP DSGVO Tools (GDPR) license got invalid now. sending email to ".SPDSGVOSettings::get('admin_email'));
64
- wp_mail(SPDSGVOSettings::get('admin_email'),
65
- __('WP DSGVO Tools (GPDR) License Error','shapepress-dsgvo').': '. parse_url(home_url(), PHP_URL_HOST),
66
- __('Your license has expired. Please renew it according to the hint at the plugin settings page.','shapepress-dsgvo'));
67
- }
68
-
69
- }
70
- }
71
-
72
- error_log("DoValidateLicense finished");
73
- }
74
- }
75
- }
76
-
77
- DoValidateLicense::register();
 
 
 
 
1
+ <?php
2
+
3
+ Class DoValidateLicense extends SPDSGVOCron{
4
+
5
+ public $interval = array(
6
+ 'days' => 1,
7
+ );
8
+
9
+ public function handle(){
10
+ //error_log("DoValidateLicense called");
11
+ $licActivated = SPDSGVOSettings::get('license_activated');
12
+ $licenceKey = SPDSGVOSettings::get('dsgvo_licence');
13
+ $oldLicenseStatus = SPDSGVOSettings::get('licence_status');
14
+ $siteUrl = get_site_url();
15
+ $homeUrl = get_home_url();
16
+
17
+ if($licActivated === '1' && $licenceKey !== ''){
18
+
19
+ //error_log("DoValidateLicense starting");
20
+
21
+ //error_log('validating licence '.$licenceKey);
22
+
23
+ $url = 'https://legalweb.io/spdsgvo-bin/licensedetails.php';
24
+ $url .= '?license_key=' .$licenceKey;
25
+ $url .= '&site_url=' .$siteUrl;
26
+ $url .= '&home_url=' .$homeUrl;
27
+
28
+ $request = wp_remote_get($url);
29
+
30
+ if( is_wp_error( $request ) ) {
31
+
32
+ error_log(__('error during license validation: ', 'shapepress-dsgvo').$request->get_error_message()); // Bail early
33
+ } else {
34
+
35
+ $body = wp_remote_retrieve_body( $request );
36
+ //error_log('body: '.$body);
37
+
38
+ if ($body !== false)
39
+ {
40
+ SPDSGVOSettings::set('licence_details_fetched', '1');
41
+ SPDSGVOSettings::set('licence_details_fetched_new', '1');
42
+ SPDSGVOSettings::set('licence_details_fetched_on', date("D M d, Y G:i"));
43
+ SPDSGVOSettings::set('show_invalid_license_notice', '0');
44
+ SPDSGVOSettings::set('show_revoke_license_notice', '0');
45
+
46
+ $data = json_decode( $body );
47
+ SPDSGVOSettings::set('licence_activated_on', $data->activation_date);
48
+ SPDSGVOSettings::set('licence_valid_to', $data->expiration_date);
49
+ SPDSGVOSettings::set('licence_number_use_remaining', $data->number_use_remaining);
50
+ SPDSGVOSettings::set('licence_status', $data->license_status);
51
+
52
+ if (isPremiumEdition() && isLicenceValid() === false)
53
+ {
54
+ error_log("WP DSGVO Tools (GDPR) license is invalid.");
55
+ SPDSGVOSettings::set('show_invalid_license_notice', '1');
56
+ }
57
+
58
+ if (licenseIsGoingToRunningOut())
59
+ {
60
+ error_log("WP DSGVO Tools (GDPR) license is going to running out in a few days");
61
+ SPDSGVOSettings::set('show_revoke_license_notice', '1');
62
+ }
63
+
64
+ if (hasValidLicenseStatus($oldLicenseStatus, $licActivated)=== true
65
+ && hasValidLicenseStatus($data->license_status, $licActivated) === false)
66
+ {
67
+ error_log("WP DSGVO Tools (GDPR) license got invalid now. sending email to ".SPDSGVOSettings::get('admin_email'));
68
+ wp_mail(SPDSGVOSettings::get('admin_email'),
69
+ __('WP DSGVO Tools (GPDR) License Error','shapepress-dsgvo').': '. parse_url(home_url(), PHP_URL_HOST),
70
+ __('Your license has expired. Please renew it according to the hint at the plugin settings page.','shapepress-dsgvo'));
71
+ }
72
+
73
+ }
74
+ }
75
+
76
+ //error_log("DoValidateLicense finished");
77
+ }
78
+ }
79
+ }
80
+
81
+ DoValidateLicense::register();
includes/emails/feedback.html CHANGED
@@ -1,17 +1,17 @@
1
- <h1>WP DSGVO Tools Feedback</h1>
2
-
3
- <p>
4
- <strong>From:</strong><br>
5
- {{home_url}} <br>
6
- {{user}}
7
- </p>
8
-
9
- <p>
10
- <strong>Reason:</strong><br>
11
- {{reason}}
12
- </p>
13
-
14
- <p>
15
- <strong>Message:</strong><br>
16
- {{message}}
17
  </p>
1
+ <h1>WP DSGVO Tools Feedback</h1>
2
+
3
+ <p>
4
+ <strong>From:</strong><br>
5
+ {{home_url}} <br>
6
+ {{user}}
7
+ </p>
8
+
9
+ <p>
10
+ <strong>Reason:</strong><br>
11
+ {{reason}}
12
+ </p>
13
+
14
+ <p>
15
+ <strong>Message:</strong><br>
16
+ {{message}}
17
  </p>
includes/emails/footer.html CHANGED
@@ -1,11 +1,11 @@
1
- </table>
2
- </td>
3
- </tr>
4
- </tbody>
5
- </table>
6
- </td>
7
- </tr>
8
- </tbody>
9
- </table>
10
- </body>
11
  </html>
1
+ </table>
2
+ </td>
3
+ </tr>
4
+ </tbody>
5
+ </table>
6
+ </td>
7
+ </tr>
8
+ </tbody>
9
+ </table>
10
+ </body>
11
  </html>
includes/emails/header.html CHANGED
@@ -1,220 +1,220 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html xmlns="http://www.w3.org/1999/xhtml">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
- <title>WP DSGVO Tools</title>
6
- <style type="text/css">
7
- body {
8
- padding-top: 0 !important;
9
- padding-bottom: 0 !important;
10
- padding-top: 0 !important;
11
- padding-bottom: 0 !important;
12
- margin:0 !important;
13
- width: 100% !important;
14
- -webkit-text-size-adjust: 100% !important;
15
- -ms-text-size-adjust: 100% !important;
16
- -webkit-font-smoothing: antialiased !important;
17
- }
18
- .tableContent img {
19
- border: 0 !important;
20
- display: block !important;
21
- outline: none !important;
22
- }
23
- a{
24
- color:#382F2E;
25
- }
26
- p, h1,h2,ul,ol,li,div{
27
- margin:0;
28
- padding:0;
29
- }
30
- h1,h2{
31
- font-weight: normal;
32
- background:transparent !important;
33
- border:none !important;
34
- }
35
- @media only screen and (max-width:480px)
36
- {
37
- table[class="MainContainer"], td[class="cell"]
38
- {
39
- width: 100% !important;
40
- height:auto !important;
41
- }
42
- td[class="specbundle"]
43
- {
44
- width: 100% !important;
45
- float:left !important;
46
- font-size:13px !important;
47
- line-height:17px !important;
48
- display:block !important;
49
- padding-bottom:15px !important;
50
- }
51
- td[class="specbundle2"]
52
- {
53
- width:80% !important;
54
- float:left !important;
55
- font-size:13px !important;
56
- line-height:17px !important;
57
- display:block !important;
58
- padding-bottom:10px !important;
59
- padding-left:10% !important;
60
- padding-right:10% !important;
61
- }
62
- td[class="spechide"]
63
- {
64
- display:none !important;
65
- }
66
- img[class="banner"]
67
- {
68
- width: 100% !important;
69
- height: auto !important;
70
- }
71
- td[class="left_pad"]
72
- {
73
- padding-left:15px !important;
74
- padding-right:15px !important;
75
- }
76
- }
77
- @media only screen and (max-width:540px)
78
- {
79
- table[class="MainContainer"], td[class="cell"]
80
- {
81
- width: 100% !important;
82
- height:auto !important;
83
- }
84
- td[class="specbundle"]
85
- {
86
- width: 100% !important;
87
- float:left !important;
88
- font-size:13px !important;
89
- line-height:17px !important;
90
- display:block !important;
91
- padding-bottom:15px !important;
92
- }
93
- td[class="specbundle2"]
94
- {
95
- width:80% !important;
96
- float:left !important;
97
- font-size:13px !important;
98
- line-height:17px !important;
99
- display:block !important;
100
- padding-bottom:10px !important;
101
- padding-left:10% !important;
102
- padding-right:10% !important;
103
- }
104
- td[class="spechide"]
105
- {
106
- display:none !important;
107
- }
108
- img[class="banner"]
109
- {
110
- width: 100% !important;
111
- height: auto !important;
112
- }
113
- td[class="left_pad"]
114
- {
115
- padding-left:15px !important;
116
- padding-right:15px !important;
117
- }
118
- }
119
- .contentEditable h2.big,.contentEditable h1.big{
120
- font-size: 26px !important;
121
- }
122
- .contentEditable h2.bigger,.contentEditable h1.bigger{
123
- font-size: 37px !important;
124
- }
125
- td,table{
126
- vertical-align: top;
127
- }
128
- td.middle{
129
- vertical-align: middle;
130
- }
131
- a.link1{
132
- font-size:13px;
133
- color:#27A1E5;
134
- line-height: 24px;
135
- text-decoration:none;
136
- }
137
- a{
138
- text-decoration: none;
139
- }
140
- .link2{
141
- color:#ffffff;
142
- border-top:10px solid #27A1E5;
143
- border-bottom:10px solid #27A1E5;
144
- border-left:18px solid #27A1E5;
145
- border-right:18px solid #27A1E5;
146
- border-radius:3px;
147
- -moz-border-radius:3px;
148
- -webkit-border-radius:3px;
149
- background:#27A1E5;
150
- }
151
- .link3{
152
- color:#555555;
153
- border:1px solid #cccccc;
154
- padding:10px 18px;
155
- border-radius:3px;
156
- -moz-border-radius:3px;
157
- -webkit-border-radius:3px;
158
- background:#ffffff;
159
- }
160
- .link4{
161
- color:#27A1E5;
162
- line-height: 24px;
163
- }
164
- h2,h1{
165
- line-height: 20px;
166
- }
167
- p{
168
- font-size: 14px;
169
- line-height: 21px;
170
- color:#AAAAAA;
171
- }
172
- .contentEditable li{
173
- }
174
- .appart p{
175
- }
176
- .bgItem{
177
- background: #ffffff;
178
- }
179
- .bgBody{
180
- background: #ffffff;
181
- }
182
- img {
183
- outline:none;
184
- text-decoration:none;
185
- -ms-interpolation-mode: bicubic;
186
- width: auto;
187
- max-width: 100%;
188
- clear: both;
189
- display: block;
190
- float: none;
191
- }
192
-
193
- ul ul{
194
- margin-left: 15px;
195
- }
196
- ul li{
197
- color:#444444;
198
- }
199
- </style>
200
- <script type="colorScheme" class="swatch active">
201
- {
202
- "name":"Default",
203
- "bgBody":"ffffff",
204
- "link":"27A1E5",
205
- "color":"AAAAAA",
206
- "bgItem":"ffffff",
207
- "title":"444444"
208
- }
209
- </script>
210
- </head>
211
- <body paddingwidth="0" paddingheight="0" bgcolor="#d1d3d4" style="padding-top: 0; padding-bottom: 0; padding-top: 0; padding-bottom: 0; background-repeat: repeat; width: 100% !important; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; -webkit-font-smoothing: antialiased;" offset="0" toppadding="0" leftpadding="0">
212
- <table width="100%" border="0" cellspacing="0" cellpadding="0">
213
- <tbody>
214
- <tr>
215
- <td>
216
- <table width="600" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#ffffff" style="font-family:helvetica, sans-serif;" class="MainContainer">
217
- <tbody>
218
- <tr>
219
- <td>
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>WP DSGVO Tools</title>
6
+ <style type="text/css">
7
+ body {
8
+ padding-top: 0 !important;
9
+ padding-bottom: 0 !important;
10
+ padding-top: 0 !important;
11
+ padding-bottom: 0 !important;
12
+ margin:0 !important;
13
+ width: 100% !important;
14
+ -webkit-text-size-adjust: 100% !important;
15
+ -ms-text-size-adjust: 100% !important;
16
+ -webkit-font-smoothing: antialiased !important;
17
+ }
18
+ .tableContent img {
19
+ border: 0 !important;
20
+ display: block !important;
21
+ outline: none !important;
22
+ }
23
+ a{
24
+ color:#382F2E;
25
+ }
26
+ p, h1,h2,ul,ol,li,div{
27
+ margin:0;
28
+ padding:0;
29
+ }
30
+ h1,h2{
31
+ font-weight: normal;
32
+ background:transparent !important;
33
+ border:none !important;
34
+ }
35
+ @media only screen and (max-width:480px)
36
+ {
37
+ table[class="MainContainer"], td[class="cell"]
38
+ {
39
+ width: 100% !important;
40
+ height:auto !important;
41
+ }
42
+ td[class="specbundle"]
43
+ {
44
+ width: 100% !important;
45
+ float:left !important;
46
+ font-size:13px !important;
47
+ line-height:17px !important;
48
+ display:block !important;
49
+ padding-bottom:15px !important;
50
+ }
51
+ td[class="specbundle2"]
52
+ {
53
+ width:80% !important;
54
+ float:left !important;
55
+ font-size:13px !important;
56
+ line-height:17px !important;
57
+ display:block !important;
58
+ padding-bottom:10px !important;
59
+ padding-left:10% !important;
60
+ padding-right:10% !important;
61
+ }
62
+ td[class="spechide"]
63
+ {
64
+ display:none !important;
65
+ }
66
+ img[class="banner"]
67
+ {
68
+ width: 100% !important;
69
+ height: auto !important;
70
+ }
71
+ td[class="left_pad"]
72
+ {
73
+ padding-left:15px !important;
74
+ padding-right:15px !important;
75
+ }
76
+ }
77
+ @media only screen and (max-width:540px)
78
+ {
79
+ table[class="MainContainer"], td[class="cell"]
80
+ {
81
+ width: 100% !important;
82
+ height:auto !important;
83
+ }
84
+ td[class="specbundle"]
85
+ {
86
+ width: 100% !important;
87
+ float:left !important;
88
+ font-size:13px !important;
89
+ line-height:17px !important;
90
+ display:block !important;
91
+ padding-bottom:15px !important;
92
+ }
93
+ td[class="specbundle2"]
94
+ {
95
+ width:80% !important;
96
+ float:left !important;
97
+ font-size:13px !important;
98
+ line-height:17px !important;
99
+ display:block !important;
100
+ padding-bottom:10px !important;
101
+ padding-left:10% !important;
102
+ padding-right:10% !important;
103
+ }
104
+ td[class="spechide"]
105
+ {
106
+ display:none !important;
107
+ }
108
+ img[class="banner"]
109
+ {
110
+ width: 100% !important;
111
+ height: auto !important;
112
+ }
113
+ td[class="left_pad"]
114
+ {
115
+ padding-left:15px !important;
116
+ padding-right:15px !important;
117
+ }
118
+ }
119
+ .contentEditable h2.big,.contentEditable h1.big{
120
+ font-size: 26px !important;
121
+ }
122
+ .contentEditable h2.bigger,.contentEditable h1.bigger{
123
+ font-size: 37px !important;
124
+ }
125
+ td,table{
126
+ vertical-align: top;
127
+ }
128
+ td.middle{
129
+ vertical-align: middle;
130
+ }
131
+ a.link1{
132
+ font-size:13px;
133
+ color:#27A1E5;
134
+ line-height: 24px;
135
+ text-decoration:none;
136
+ }
137
+ a{
138
+ text-decoration: none;
139
+ }
140
+ .link2{
141
+ color:#ffffff;
142
+ border-top:10px solid #27A1E5;
143
+ border-bottom:10px solid #27A1E5;
144
+ border-left:18px solid #27A1E5;
145
+ border-right:18px solid #27A1E5;
146
+ border-radius:3px;
147
+ -moz-border-radius:3px;
148
+ -webkit-border-radius:3px;
149
+ background:#27A1E5;
150
+ }
151
+ .link3{
152
+ color:#555555;
153
+ border:1px solid #cccccc;
154
+ padding:10px 18px;
155
+ border-radius:3px;
156
+ -moz-border-radius:3px;
157
+ -webkit-border-radius:3px;
158
+ background:#ffffff;
159
+ }
160
+ .link4{
161
+ color:#27A1E5;
162
+ line-height: 24px;
163
+ }
164
+ h2,h1{
165
+ line-height: 20px;
166
+ }
167
+ p{
168
+ font-size: 14px;
169
+ line-height: 21px;
170
+ color:#AAAAAA;
171
+ }
172
+ .contentEditable li{
173
+ }
174
+ .appart p{
175
+ }
176
+ .bgItem{
177
+ background: #ffffff;
178
+ }
179
+ .bgBody{
180
+ background: #ffffff;
181
+ }
182
+ img {
183
+ outline:none;
184
+ text-decoration:none;
185
+ -ms-interpolation-mode: bicubic;
186
+ width: auto;
187
+ max-width: 100%;
188
+ clear: both;
189
+ display: block;
190
+ float: none;
191
+ }
192
+
193
+ ul ul{
194
+ margin-left: 15px;
195
+ }
196
+ ul li{
197
+ color:#444444;
198
+ }
199
+ </style>
200
+ <script type="colorScheme" class="swatch active">
201
+ {
202
+ "name":"Default",
203
+ "bgBody":"ffffff",
204
+ "link":"27A1E5",
205
+ "color":"AAAAAA",
206
+ "bgItem":"ffffff",
207
+ "title":"444444"
208
+ }
209
+ </script>
210
+ </head>
211
+ <body paddingwidth="0" paddingheight="0" bgcolor="#d1d3d4" style="padding-top: 0; padding-bottom: 0; padding-top: 0; padding-bottom: 0; background-repeat: repeat; width: 100% !important; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; -webkit-font-smoothing: antialiased;" offset="0" toppadding="0" leftpadding="0">
212
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
213
+ <tbody>
214
+