WooCommerce Germanized - Version 1.6.3

Version Description

  • Feature - Encryption for Direct Debit Gateway data
  • Feature - Install German Formal Language (see Systemstatus > Germanized > Tools)
  • Feature - Tool to delete Germanized Text Options (will we replaced by defaults)
  • Fix - Double-Opt-In even if checkout shouldn't be disabled
  • Fix - Trusted Shops Template SKU Parameter
  • Fix - Trusted Shops Product Sticker Star Size
Download this release

Release Info

Developer vendidero
Plugin Icon 128x128 WooCommerce Germanized
Version 1.6.3
Comparing to
See all releases

Code changes from version 1.6.2 to 1.6.3

Files changed (43) hide show
  1. i18n/languages/woocommerce-germanized-de_DE.mo +0 -0
  2. i18n/languages/woocommerce-germanized-de_DE.po +180 -97
  3. i18n/languages/woocommerce-germanized-de_DE_formal.mo +0 -0
  4. i18n/languages/woocommerce-germanized-de_DE_formal.po +179 -96
  5. includes/abstracts/abstract-wc-gzd-product.php +1 -0
  6. includes/admin/class-wc-gzd-admin-welcome.php +15 -0
  7. includes/admin/class-wc-gzd-admin.php +72 -10
  8. includes/admin/views/html-page-status-germanized.php +12 -6
  9. includes/class-wc-gzd-customer-helper.php +25 -16
  10. includes/class-wc-gzd-emails.php +19 -0
  11. includes/class-wc-gzd-install.php +2 -1
  12. includes/class-wc-gzd-wpml-helper.php +1 -1
  13. includes/gateways/direct-debit/assets/js/direct-debit.js +3 -0
  14. includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit-encryption-helper.php +60 -0
  15. includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php +127 -15
  16. includes/gateways/direct-debit/libraries/php-encryption/Core.php +434 -0
  17. includes/gateways/direct-debit/libraries/php-encryption/Crypto.php +372 -0
  18. includes/gateways/direct-debit/libraries/php-encryption/DerivedKeys.php +37 -0
  19. includes/gateways/direct-debit/libraries/php-encryption/Encoding.php +212 -0
  20. includes/gateways/direct-debit/libraries/php-encryption/Exception/BadFormatException.php +7 -0
  21. includes/gateways/direct-debit/libraries/php-encryption/Exception/CryptoException.php +7 -0
  22. includes/gateways/direct-debit/libraries/php-encryption/Exception/EnvironmentIsBrokenException.php +7 -0
  23. includes/gateways/direct-debit/libraries/php-encryption/Exception/IOException.php +7 -0
  24. includes/gateways/direct-debit/libraries/php-encryption/Exception/WrongKeyOrModifiedCiphertextException.php +7 -0
  25. includes/gateways/direct-debit/libraries/php-encryption/File.php +746 -0
  26. includes/gateways/direct-debit/libraries/php-encryption/Key.php +97 -0
  27. includes/gateways/direct-debit/libraries/php-encryption/KeyOrPassword.php +119 -0
  28. includes/gateways/direct-debit/libraries/php-encryption/KeyProtectedByPassword.php +112 -0
  29. includes/gateways/direct-debit/libraries/php-encryption/LICENSE +21 -0
  30. includes/gateways/direct-debit/libraries/php-encryption/RuntimeTests.php +237 -0
  31. includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/LICENSE +0 -0
  32. includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/SepaXmlCreator.php +0 -0
  33. includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/pain.001.002.03.xsd +0 -0
  34. includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/pain.008.002.02.xsd +0 -0
  35. includes/gateways/direct-debit/views/html-encryption-notice.php +24 -0
  36. includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php +12 -2
  37. includes/trusted-shops/class-wc-gzd-trusted-shops-schedule.php +6 -4
  38. includes/updates/woocommerce-gzd-update-1.6.3.php +10 -0
  39. includes/wc-gzd-cart-functions.php +77 -4
  40. readme.txt +9 -1
  41. templates/trusted-shops/product-sticker-tpl.php +1 -1
  42. templates/trusted-shops/product-widget-tpl.php +2 -2
  43. woocommerce-germanized.php +7 -3
i18n/languages/woocommerce-germanized-de_DE.mo CHANGED
Binary file
i18n/languages/woocommerce-germanized-de_DE.po CHANGED
@@ -2,8 +2,8 @@ msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WooCommerce Germanized v1.5.1\n"
4
  "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2016-04-28 15:29+0100\n"
6
- "PO-Revision-Date: 2016-04-28 15:30+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "Language: de_DE\n"
@@ -90,8 +90,8 @@ msgstr "l"
90
 
91
  # @ woocommerce-germanized
92
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:159
93
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:196
94
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:734
95
  msgid "incl. VAT"
96
  msgstr "inkl. MwSt."
97
 
@@ -102,8 +102,8 @@ msgstr "exkl. MwSt."
102
 
103
  # @ woocommerce-germanized
104
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:161
105
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:196
106
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:734
107
  #, php-format
108
  msgid "incl. %s%% VAT"
109
  msgstr "inkl. %s%% MwSt."
@@ -198,36 +198,36 @@ msgid "Go to WooCommerce Germanized Settings"
198
  msgstr "zu den WooCommerce Germanized Einstellungen"
199
 
200
  # @ woocommerce-germanized
201
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:88
202
  msgid "WooCommerce Status"
203
  msgstr "WooCommerce Status"
204
 
205
  # @ woocommerce-germanized
206
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:88
207
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status.php:16
208
  msgid "System Status"
209
  msgstr "Systemstatus"
210
 
211
  # @ woocommerce-germanized
212
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:145
213
  msgid "Optional Email Content"
214
  msgstr "Optionaler E-Mail Inhalt"
215
 
216
  # @ woocommerce-germanized
217
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:154
218
  msgid "Add content which will be replacing default page content within emails."
219
  msgstr ""
220
  "Fülle dieses Feld aus um einen abweichenden E-Mail Anhangstext für diese "
221
  "Seite zu bestimmen."
222
 
223
  # @ woocommerce-germanized
224
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:163
225
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/meta-boxes/class-wc-gzd-meta-box-product-data-variable.php:114
226
  msgid "Optional Mini Description"
227
  msgstr "Warenkorb Kurzbeschreibung"
228
 
229
  # @ woocommerce-germanized
230
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:180
231
  msgid ""
232
  "This content will be shown as short product description within checkout and "
233
  "emails."
@@ -236,7 +236,7 @@ msgstr ""
236
  "Produkt Kurzbeschreibung angezeigt."
237
 
238
  # @ woocommerce-germanized
239
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:237
240
  msgid "Complaints Procedure"
241
  msgstr "Beschwerdeverfahren"
242
 
@@ -917,7 +917,7 @@ msgstr "Kunden"
917
 
918
  # @ woocommerce-germanized
919
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:417
920
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:514
921
  msgid "Checkbox"
922
  msgstr "Checkbox"
923
 
@@ -1711,7 +1711,7 @@ msgstr ""
1711
 
1712
  # @ woocommerce-germanized
1713
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:955
1714
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:244
1715
  msgid ""
1716
  "To retrieve direct access to digital content you have to agree to the loss "
1717
  "of your right of withdrawal."
@@ -2227,12 +2227,7 @@ msgid "Settings Tour"
2227
  msgstr "Tour durch Einstellungen"
2228
 
2229
  # @ woocommerce-germanized
2230
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:169
2231
- msgid "Reenable Tour"
2232
- msgstr "Tour aktivieren"
2233
-
2234
- # @ woocommerce-germanized
2235
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:170
2236
  msgid ""
2237
  "This will delete every option which prevents the Germanized settings tour "
2238
  "from starting."
@@ -2241,12 +2236,55 @@ msgstr ""
2241
  "angezeigt wird."
2242
 
2243
  # @ woocommerce-germanized
2244
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2245
  msgid "Templates"
2246
  msgstr "Templates"
2247
 
2248
  # @ woocommerce-germanized
2249
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:226
2250
  #, php-format
2251
  msgid ""
2252
  "<code>%s</code> version <strong style=\"color:red\">%s</strong> is out of "
@@ -2256,13 +2294,13 @@ msgstr ""
2256
  "veraltet. Die Hauptversion ist %s"
2257
 
2258
  # @ woocommerce-germanized
2259
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:238
2260
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:247
2261
  msgid "Overrides"
2262
  msgstr "Überschreibt"
2263
 
2264
  # @ woocommerce-germanized
2265
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:258
2266
  msgid "Learn how to update outdated templates"
2267
  msgstr "Erfahre, wie du veraltete Templates aktualisierst"
2268
 
@@ -2482,7 +2520,7 @@ msgid "eKomi Options"
2482
  msgstr "eKomi"
2483
 
2484
  # @ woocommerce-germanized
2485
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/class-wc-gzd-emails.php:248
2486
  msgctxt "revocation-form"
2487
  msgid "Forward your Revocation online"
2488
  msgstr "Deinen Widerruf online erklären"
@@ -2964,7 +3002,7 @@ msgstr "Bitte bewerte deine Bestellung bei {site_title} vom {order_date}"
2964
 
2965
  # @ woocommerce-germanized
2966
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:26
2967
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:439
2968
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:27
2969
  msgid "Direct Debit"
2970
  msgstr "Lastschrift"
@@ -2983,7 +3021,7 @@ msgid "SEPA XML Bulk Export"
2983
  msgstr "SEPA XML Export"
2984
 
2985
  # @ woocommerce-germanized
2986
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:48
2987
  msgid ""
2988
  "[company_info]\n"
2989
  "debtee identification number: [company_identification_number]\n"
@@ -3051,149 +3089,149 @@ msgstr ""
3051
  "Bitte beachte: Die First für die Vorabinformation der SEPA-Lastschrift wird "
3052
  "auf einen Tag verkürzt. "
3053
 
3054
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:116
3055
  msgid "SEPA XML Export"
3056
  msgstr "SEPA XML Export"
3057
 
3058
  # @ woocommerce-germanized
3059
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:210
3060
  #, php-format
3061
  msgid "Order %s"
3062
  msgstr "Bestellung %s"
3063
 
3064
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:235
3065
  msgid "Will be notified separately"
3066
  msgstr "Wird separat mitgeteilt"
3067
 
3068
  # @ woocommerce-germanized
3069
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:254
3070
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:273
3071
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:465
3072
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:548
3073
  msgid "Account Holder"
3074
  msgstr "Kontoinhaber"
3075
 
3076
  # @ woocommerce-germanized
3077
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:255
3078
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:280
3079
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:473
3080
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:552
3081
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:646
3082
  msgid "IBAN"
3083
  msgstr "IBAN"
3084
 
3085
  # @ woocommerce-germanized
3086
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:256
3087
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:286
3088
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:556
3089
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:647
3090
  msgid "BIC/SWIFT"
3091
  msgstr "BIC/SWIFT"
3092
 
3093
  # @ woocommerce-germanized
3094
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:292
3095
  msgid "Mandate Reference ID"
3096
  msgstr "Mandat-Referenznummer"
3097
 
3098
  # @ woocommerce-germanized
3099
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:430
3100
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:79
3101
  msgid "Enable/Disable"
3102
  msgstr "Aktivieren/Deaktivieren"
3103
 
3104
  # @ woocommerce-germanized
3105
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:432
3106
  msgid "Enable Direct Debit Payment"
3107
  msgstr "Bezahlung per Lastschrift aktivieren"
3108
 
3109
  # @ woocommerce-germanized
3110
  # @ woocommerce
3111
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:436
3112
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:85
3113
  msgctxt "gateway"
3114
  msgid "Title"
3115
  msgstr "Bezeichnung"
3116
 
3117
  # @ woocommerce-germanized
3118
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:438
3119
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:87
3120
  msgid "This controls the title which the user sees during checkout."
3121
  msgstr ""
3122
  "Beschreibungstext, den Benutzer bei der Auswahl dieser Zahlungsart sehen."
3123
 
3124
  # @ woocommerce-germanized
3125
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:443
3126
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:92
3127
  msgid "Description"
3128
  msgstr "Beschreibung"
3129
 
3130
  # @ woocommerce-germanized
3131
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:445
3132
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:94
3133
  msgid "Payment method description that the customer will see on your checkout."
3134
  msgstr "Beschreibung der Zahlungsart, die Kunden auf deiner Website sehen."
3135
 
3136
  # @ woocommerce-germanized
3137
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:446
3138
  msgid "The order amount will be debited directly from your bank account."
3139
  msgstr ""
3140
  "Der Gesamtbestellbetrag wird per SEPA-Lastschrift direkt von deinem Konto "
3141
  "abgebucht."
3142
 
3143
  # @ woocommerce-germanized
3144
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:450
3145
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:99
3146
  msgid "Instructions"
3147
  msgstr "Anweisungen"
3148
 
3149
  # @ woocommerce-germanized
3150
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:452
3151
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:101
3152
  msgid "Instructions that will be added to the thank you page and emails."
3153
  msgstr "Anweisung, die zur „Danke“-Seite und zu E-Mails hinzugefügt werden."
3154
 
3155
  # @ woocommerce-germanized
3156
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:457
3157
  msgid "Debtee"
3158
  msgstr "Gläubiger Informationen"
3159
 
3160
  # @ woocommerce-germanized
3161
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:459
3162
  msgid "Insert your company information."
3163
  msgstr "Füge hier die Informationen zu deinem Unternehmen ein."
3164
 
3165
  # @ woocommerce-germanized
3166
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:461
3167
  msgid "Company Inc, John Doe Street, New York"
3168
  msgstr "Musterfirma GmbH, Musterstraße 12, 12203 Musterstadt"
3169
 
3170
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:467
3171
  msgid "Insert the bank account holder name."
3172
  msgstr "Füge hier den Namen des Kontoinhabers ein."
3173
 
3174
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:469
3175
  msgid "Company Inc"
3176
  msgstr "Muster GmbH"
3177
 
3178
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:475
3179
  msgid "Insert the bank account IBAN."
3180
  msgstr "Füge hier den IBAN deines Kontos ein."
3181
 
3182
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:480
3183
  msgid "BIC"
3184
  msgstr "BIC"
3185
 
3186
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:482
3187
  msgid "Insert the bank account BIC."
3188
  msgstr "Füge hier den BIC deines Kontos ein."
3189
 
3190
  # @ woocommerce-germanized
3191
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:487
3192
  msgid "Debtee identification number"
3193
  msgstr "Identifikationsnummer"
3194
 
3195
  # @ woocommerce-germanized
3196
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:489
3197
  #, php-format
3198
  msgid ""
3199
  "Insert your debtee indentification number. More information can be found <a "
@@ -3203,16 +3241,16 @@ msgstr ""
3203
  "Weitere Informationen zu dieser Nummer erhältst du <a href=\"%s\">hier</a>."
3204
 
3205
  # @ woocommerce-germanized
3206
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:493
3207
  msgid "Generate Mandate ID"
3208
  msgstr "Mandat-Referenz generieren"
3209
 
3210
  # @ woocommerce-germanized
3211
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:495
3212
  msgid "Automatically generate Mandate ID."
3213
  msgstr "Mandat-Referenznummer automatisch generieren."
3214
 
3215
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:496
3216
  msgid ""
3217
  "Automatically generate Mandate ID after order completion (based on Order ID)."
3218
  msgstr ""
@@ -3220,11 +3258,11 @@ msgstr ""
3220
  "basierend auf der Bestellnummer."
3221
 
3222
  # @ woocommerce-germanized
3223
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:500
3224
  msgid "Mandate ID Format"
3225
  msgstr "Mandat-Referenz Format"
3226
 
3227
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:502
3228
  msgid ""
3229
  "You may extend the Mandate ID format by adding a prefix and/or suffix. Use "
3230
  "{id} as placeholder to insert the automatically generated ID."
@@ -3233,12 +3271,12 @@ msgstr ""
3233
  "{id} als Platzhalter um die automatisch generierte Referenznummer einzufügen."
3234
 
3235
  # @ woocommerce-germanized
3236
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:506
3237
  msgid "Mandate Text"
3238
  msgstr "Lastschriftmandat"
3239
 
3240
  # @ woocommerce-germanized
3241
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:508
3242
  msgid ""
3243
  "This text will be populated with live order/checkout data. Will be used as "
3244
  "preview direct debit mandate and as email template text."
@@ -3249,23 +3287,23 @@ msgstr ""
3249
  "Verfügung gestellt."
3250
 
3251
  # @ woocommerce-germanized
3252
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:515
3253
  msgid "Enable \"agree to SEPA mandate\" checkbox"
3254
  msgstr "Aktiviere die Checkbox zur Bestätigung des Lastschriftmandates."
3255
 
3256
  # @ woocommerce-germanized
3257
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:517
3258
  msgid "Enable a checkbox linking to a SEPA direct debit mandate preview."
3259
  msgstr ""
3260
  "Aktiviere eine Checkbox, die zu einer Vorschau des Lastschrift-Mandats führt."
3261
 
3262
  # @ woocommerce-germanized
3263
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:521
3264
  msgid "Checkbox label"
3265
  msgstr "Checkbox Text"
3266
 
3267
  # @ woocommerce-germanized
3268
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:523
3269
  msgid ""
3270
  "Customize the checkbox label. Use {link}link name{/link} to insert the "
3271
  "preview link."
@@ -3274,20 +3312,20 @@ msgstr ""
3274
  "auf die Vorschau zu verlinken."
3275
 
3276
  # @ woocommerce-germanized
3277
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:524
3278
  msgid "I hereby agree to the {link}direct debit mandate{/link}."
3279
  msgstr "Hiermit erteile ich das {link}SEPA Lastschriftmandat{/link}."
3280
 
3281
  # @ woocommerce-germanized
3282
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:528
3283
  msgid "Mask IBAN"
3284
  msgstr "IBAN maskieren"
3285
 
3286
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:529
3287
  msgid "Mask the IBAN within emails."
3288
  msgstr "IBAN in E-Mails maskieren."
3289
 
3290
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:531
3291
  msgid ""
3292
  "This will lead to masked IBANs within emails (replaced by *). All but last 4 "
3293
  "digits will be masked."
@@ -3295,41 +3333,86 @@ msgstr ""
3295
  "Der IBAN wird in E-Mails (abgesehen von den letzten 4 Stellen) mit * "
3296
  "maskiert."
3297
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3298
  # @ woocommerce-germanized
3299
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:584
3300
  msgid "Please accept the direct debit mandate."
3301
  msgstr "Bitte erteile das SEPA Lastschriftmandat."
3302
 
3303
  # @ woocommerce-germanized
3304
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:601
3305
  msgid "Please insert your SEPA account data."
3306
  msgstr "Bitte füge deine SEPA Kontoinformationen ein."
3307
 
3308
  # @ woocommerce-germanized
3309
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:611
3310
  msgid "Your IBAN seems to be invalid."
3311
  msgstr "Dein IBAN scheint nicht gültig zu sein."
3312
 
3313
  # @ woocommerce-germanized
3314
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:613
3315
  msgid "Your IBAN's country code doesn’t match with your billing country."
3316
  msgstr "Der Ländercode des IBANs stimmt nicht mit dem Rechnungsland überein."
3317
 
3318
  # @ woocommerce-germanized
3319
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:617
3320
  msgid "Your BIC seems to be invalid."
3321
  msgstr "Dein BIC/SWIFT scheint nicht gültig zu sein."
3322
 
3323
  # @ woocommerce-germanized
3324
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:648
3325
  msgid "is invalid"
3326
  msgstr "ist ungültig"
3327
 
3328
  # @ woocommerce-germanized
3329
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:686
3330
  msgid "Processing direct debit"
3331
  msgstr "Lastschriftverfahren vorbereiten"
3332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3333
  # @ woocommerce-germanized
3334
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:33
3335
  msgid "Start Date"
@@ -3355,7 +3438,7 @@ msgstr ""
3355
  # @ woocommerce-germanized
3356
  # @ woocommerce
3357
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:50
3358
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:510
3359
  msgid "Settings"
3360
  msgstr "Einstellungen"
3361
 
@@ -3822,43 +3905,43 @@ msgstr ""
3822
  "a> oder von <a href=\"%s\" target=\"_blank\">Produktbewertungen</a>."
3823
 
3824
  # @ woocommerce-germanized
3825
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:499
3826
  msgctxt "trusted-shops"
3827
  msgid "Review Collector"
3828
  msgstr "Review Collector"
3829
 
3830
  # @ woocommerce-germanized
3831
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:504
3832
  msgctxt "trusted-shops"
3833
  msgid "Export customer data"
3834
  msgstr "Bestellungen exportieren"
3835
 
3836
  # @ woocommerce-germanized
3837
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:508
3838
  msgctxt "trusted-shops"
3839
  msgid "30 days"
3840
  msgstr "30 Tage"
3841
 
3842
  # @ woocommerce-germanized
3843
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:509
3844
  msgctxt "trusted-shops"
3845
  msgid "60 days"
3846
  msgstr "60 Tage"
3847
 
3848
  # @ woocommerce-germanized
3849
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:510
3850
  msgctxt "trusted-shops"
3851
  msgid "90 days"
3852
  msgstr "90 Tage"
3853
 
3854
  # @ woocommerce-germanized
3855
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:512
3856
  msgctxt "trusted-shops"
3857
  msgid "Start export"
3858
  msgstr "Export starten"
3859
 
3860
  # @ woocommerce-germanized
3861
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:513
3862
  #, php-format
3863
  msgctxt "trusted-shops"
3864
  msgid ""
@@ -3958,7 +4041,7 @@ msgid "Trusted Shops Rich Snippets"
3958
  msgstr "Trusted Shops Rich Snippets"
3959
 
3960
  # @ woocommerce-germanized
3961
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:237
3962
  msgid ""
3963
  "I want immediate access to the digital content and I acknowledge that "
3964
  "thereby I lose my right to cancel once the service has begun."
@@ -4096,7 +4179,7 @@ msgstr "Dein Password wurde automatisch generiert: <strong>%s</strong>"
4096
  #, php-format
4097
  msgid "If you haven't created an account on %s please ignore this email."
4098
  msgstr ""
4099
- "Wenn du bei %s kein Benutzerkonto eröffnet haben, ignoriere diese E-Mail "
4100
  "bitte."
4101
 
4102
  # @ woocommerce-germanized
2
  msgstr ""
3
  "Project-Id-Version: WooCommerce Germanized v1.5.1\n"
4
  "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2016-05-18 09:50+0100\n"
6
+ "PO-Revision-Date: 2016-05-18 09:54+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "Language: de_DE\n"
90
 
91
  # @ woocommerce-germanized
92
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:159
93
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:269
94
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:738
95
  msgid "incl. VAT"
96
  msgstr "inkl. MwSt."
97
 
102
 
103
  # @ woocommerce-germanized
104
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:161
105
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:269
106
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:738
107
  #, php-format
108
  msgid "incl. %s%% VAT"
109
  msgstr "inkl. %s%% MwSt."
198
  msgstr "zu den WooCommerce Germanized Einstellungen"
199
 
200
  # @ woocommerce-germanized
201
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:90
202
  msgid "WooCommerce Status"
203
  msgstr "WooCommerce Status"
204
 
205
  # @ woocommerce-germanized
206
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:90
207
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status.php:16
208
  msgid "System Status"
209
  msgstr "Systemstatus"
210
 
211
  # @ woocommerce-germanized
212
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:147
213
  msgid "Optional Email Content"
214
  msgstr "Optionaler E-Mail Inhalt"
215
 
216
  # @ woocommerce-germanized
217
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:156
218
  msgid "Add content which will be replacing default page content within emails."
219
  msgstr ""
220
  "Fülle dieses Feld aus um einen abweichenden E-Mail Anhangstext für diese "
221
  "Seite zu bestimmen."
222
 
223
  # @ woocommerce-germanized
224
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:165
225
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/meta-boxes/class-wc-gzd-meta-box-product-data-variable.php:114
226
  msgid "Optional Mini Description"
227
  msgstr "Warenkorb Kurzbeschreibung"
228
 
229
  # @ woocommerce-germanized
230
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:182
231
  msgid ""
232
  "This content will be shown as short product description within checkout and "
233
  "emails."
236
  "Produkt Kurzbeschreibung angezeigt."
237
 
238
  # @ woocommerce-germanized
239
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:299
240
  msgid "Complaints Procedure"
241
  msgstr "Beschwerdeverfahren"
242
 
917
 
918
  # @ woocommerce-germanized
919
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:417
920
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:551
921
  msgid "Checkbox"
922
  msgstr "Checkbox"
923
 
1711
 
1712
  # @ woocommerce-germanized
1713
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:955
1714
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:317
1715
  msgid ""
1716
  "To retrieve direct access to digital content you have to agree to the loss "
1717
  "of your right of withdrawal."
2227
  msgstr "Tour durch Einstellungen"
2228
 
2229
  # @ woocommerce-germanized
2230
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:167
 
 
 
 
 
2231
  msgid ""
2232
  "This will delete every option which prevents the Germanized settings tour "
2233
  "from starting."
2236
  "angezeigt wird."
2237
 
2238
  # @ woocommerce-germanized
2239
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:168
2240
+ msgid "Reenable Tour"
2241
+ msgstr "Tour aktivieren"
2242
+
2243
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:171
2244
+ msgid "German Formal"
2245
+ msgstr "Deutsch (Sie)"
2246
+
2247
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:172
2248
+ msgid ""
2249
+ "This option will install and activate German formal as your WordPress and "
2250
+ "WooCommerce language."
2251
+ msgstr ""
2252
+ "Diese Option installiert und aktiviert die formelle Anrede für deine "
2253
+ "WordPress Installation. Anschließend wirst du zur Aktualisierung deiner "
2254
+ "Sprachdateien weitergeleitet, damit du auch WooCommerce mit der formellen "
2255
+ "Anrede erhältst."
2256
+
2257
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:173
2258
+ msgid "Install de_DE_formal"
2259
+ msgstr "de_DE_formal installieren"
2260
+
2261
+ # @ woocommerce-germanized
2262
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:176
2263
+ msgid "Text Options"
2264
+ msgstr "Text-Optionen"
2265
+
2266
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:177
2267
+ msgid ""
2268
+ "This option removes custom Germanized text options (e.g. Pay-Button-Text) "
2269
+ "and installs default options. You may use this options to reinstall text "
2270
+ "options e.g. after a language switch."
2271
+ msgstr ""
2272
+ "Diese Option entfernt alle Germanized Text-Optionen (z.B. rechtlicher "
2273
+ "Hinweistext) und installiert anschließend die Standard-Formulierungen. Du "
2274
+ "kannst diese Option z.B. nach einem Sprachwechsel nutzen (z.B. nach einem "
2275
+ "Wechsel auf Deutsch (Sie))."
2276
+
2277
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:178
2278
+ msgid "Delete text options"
2279
+ msgstr "Text-Optionen löschen"
2280
+
2281
+ # @ woocommerce-germanized
2282
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:187
2283
  msgid "Templates"
2284
  msgstr "Templates"
2285
 
2286
  # @ woocommerce-germanized
2287
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:232
2288
  #, php-format
2289
  msgid ""
2290
  "<code>%s</code> version <strong style=\"color:red\">%s</strong> is out of "
2294
  "veraltet. Die Hauptversion ist %s"
2295
 
2296
  # @ woocommerce-germanized
2297
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:244
2298
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:253
2299
  msgid "Overrides"
2300
  msgstr "Überschreibt"
2301
 
2302
  # @ woocommerce-germanized
2303
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:264
2304
  msgid "Learn how to update outdated templates"
2305
  msgstr "Erfahre, wie du veraltete Templates aktualisierst"
2306
 
2520
  msgstr "eKomi"
2521
 
2522
  # @ woocommerce-germanized
2523
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/class-wc-gzd-emails.php:267
2524
  msgctxt "revocation-form"
2525
  msgid "Forward your Revocation online"
2526
  msgstr "Deinen Widerruf online erklären"
3002
 
3003
  # @ woocommerce-germanized
3004
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:26
3005
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:476
3006
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:27
3007
  msgid "Direct Debit"
3008
  msgstr "Lastschrift"
3021
  msgstr "SEPA XML Export"
3022
 
3023
  # @ woocommerce-germanized
3024
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:59
3025
  msgid ""
3026
  "[company_info]\n"
3027
  "debtee identification number: [company_identification_number]\n"
3089
  "Bitte beachte: Die First für die Vorabinformation der SEPA-Lastschrift wird "
3090
  "auf einen Tag verkürzt. "
3091
 
3092
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:140
3093
  msgid "SEPA XML Export"
3094
  msgstr "SEPA XML Export"
3095
 
3096
  # @ woocommerce-germanized
3097
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:234
3098
  #, php-format
3099
  msgid "Order %s"
3100
  msgstr "Bestellung %s"
3101
 
3102
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:259
3103
  msgid "Will be notified separately"
3104
  msgstr "Wird separat mitgeteilt"
3105
 
3106
  # @ woocommerce-germanized
3107
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:278
3108
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:297
3109
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:502
3110
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:624
3111
  msgid "Account Holder"
3112
  msgstr "Kontoinhaber"
3113
 
3114
  # @ woocommerce-germanized
3115
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:279
3116
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:304
3117
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:510
3118
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:628
3119
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:722
3120
  msgid "IBAN"
3121
  msgstr "IBAN"
3122
 
3123
  # @ woocommerce-germanized
3124
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:280
3125
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:311
3126
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:632
3127
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:723
3128
  msgid "BIC/SWIFT"
3129
  msgstr "BIC/SWIFT"
3130
 
3131
  # @ woocommerce-germanized
3132
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:318
3133
  msgid "Mandate Reference ID"
3134
  msgstr "Mandat-Referenznummer"
3135
 
3136
  # @ woocommerce-germanized
3137
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:467
3138
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:79
3139
  msgid "Enable/Disable"
3140
  msgstr "Aktivieren/Deaktivieren"
3141
 
3142
  # @ woocommerce-germanized
3143
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:469
3144
  msgid "Enable Direct Debit Payment"
3145
  msgstr "Bezahlung per Lastschrift aktivieren"
3146
 
3147
  # @ woocommerce-germanized
3148
  # @ woocommerce
3149
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:473
3150
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:85
3151
  msgctxt "gateway"
3152
  msgid "Title"
3153
  msgstr "Bezeichnung"
3154
 
3155
  # @ woocommerce-germanized
3156
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:475
3157
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:87
3158
  msgid "This controls the title which the user sees during checkout."
3159
  msgstr ""
3160
  "Beschreibungstext, den Benutzer bei der Auswahl dieser Zahlungsart sehen."
3161
 
3162
  # @ woocommerce-germanized
3163
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:480
3164
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:92
3165
  msgid "Description"
3166
  msgstr "Beschreibung"
3167
 
3168
  # @ woocommerce-germanized
3169
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:482
3170
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:94
3171
  msgid "Payment method description that the customer will see on your checkout."
3172
  msgstr "Beschreibung der Zahlungsart, die Kunden auf deiner Website sehen."
3173
 
3174
  # @ woocommerce-germanized
3175
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:483
3176
  msgid "The order amount will be debited directly from your bank account."
3177
  msgstr ""
3178
  "Der Gesamtbestellbetrag wird per SEPA-Lastschrift direkt von deinem Konto "
3179
  "abgebucht."
3180
 
3181
  # @ woocommerce-germanized
3182
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:487
3183
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:99
3184
  msgid "Instructions"
3185
  msgstr "Anweisungen"
3186
 
3187
  # @ woocommerce-germanized
3188
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:489
3189
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:101
3190
  msgid "Instructions that will be added to the thank you page and emails."
3191
  msgstr "Anweisung, die zur „Danke“-Seite und zu E-Mails hinzugefügt werden."
3192
 
3193
  # @ woocommerce-germanized
3194
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:494
3195
  msgid "Debtee"
3196
  msgstr "Gläubiger Informationen"
3197
 
3198
  # @ woocommerce-germanized
3199
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:496
3200
  msgid "Insert your company information."
3201
  msgstr "Füge hier die Informationen zu deinem Unternehmen ein."
3202
 
3203
  # @ woocommerce-germanized
3204
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:498
3205
  msgid "Company Inc, John Doe Street, New York"
3206
  msgstr "Musterfirma GmbH, Musterstraße 12, 12203 Musterstadt"
3207
 
3208
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:504
3209
  msgid "Insert the bank account holder name."
3210
  msgstr "Füge hier den Namen des Kontoinhabers ein."
3211
 
3212
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:506
3213
  msgid "Company Inc"
3214
  msgstr "Muster GmbH"
3215
 
3216
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:512
3217
  msgid "Insert the bank account IBAN."
3218
  msgstr "Füge hier den IBAN deines Kontos ein."
3219
 
3220
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:517
3221
  msgid "BIC"
3222
  msgstr "BIC"
3223
 
3224
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:519
3225
  msgid "Insert the bank account BIC."
3226
  msgstr "Füge hier den BIC deines Kontos ein."
3227
 
3228
  # @ woocommerce-germanized
3229
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:524
3230
  msgid "Debtee identification number"
3231
  msgstr "Identifikationsnummer"
3232
 
3233
  # @ woocommerce-germanized
3234
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:526
3235
  #, php-format
3236
  msgid ""
3237
  "Insert your debtee indentification number. More information can be found <a "
3241
  "Weitere Informationen zu dieser Nummer erhältst du <a href=\"%s\">hier</a>."
3242
 
3243
  # @ woocommerce-germanized
3244
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:530
3245
  msgid "Generate Mandate ID"
3246
  msgstr "Mandat-Referenz generieren"
3247
 
3248
  # @ woocommerce-germanized
3249
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:532
3250
  msgid "Automatically generate Mandate ID."
3251
  msgstr "Mandat-Referenznummer automatisch generieren."
3252
 
3253
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:533
3254
  msgid ""
3255
  "Automatically generate Mandate ID after order completion (based on Order ID)."
3256
  msgstr ""
3258
  "basierend auf der Bestellnummer."
3259
 
3260
  # @ woocommerce-germanized
3261
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:537
3262
  msgid "Mandate ID Format"
3263
  msgstr "Mandat-Referenz Format"
3264
 
3265
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:539
3266
  msgid ""
3267
  "You may extend the Mandate ID format by adding a prefix and/or suffix. Use "
3268
  "{id} as placeholder to insert the automatically generated ID."
3271
  "{id} als Platzhalter um die automatisch generierte Referenznummer einzufügen."
3272
 
3273
  # @ woocommerce-germanized
3274
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:543
3275
  msgid "Mandate Text"
3276
  msgstr "Lastschriftmandat"
3277
 
3278
  # @ woocommerce-germanized
3279
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:545
3280
  msgid ""
3281
  "This text will be populated with live order/checkout data. Will be used as "
3282
  "preview direct debit mandate and as email template text."
3287
  "Verfügung gestellt."
3288
 
3289
  # @ woocommerce-germanized
3290
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:552
3291
  msgid "Enable \"agree to SEPA mandate\" checkbox"
3292
  msgstr "Aktiviere die Checkbox zur Bestätigung des Lastschriftmandates."
3293
 
3294
  # @ woocommerce-germanized
3295
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:554
3296
  msgid "Enable a checkbox linking to a SEPA direct debit mandate preview."
3297
  msgstr ""
3298
  "Aktiviere eine Checkbox, die zu einer Vorschau des Lastschrift-Mandats führt."
3299
 
3300
  # @ woocommerce-germanized
3301
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:558
3302
  msgid "Checkbox label"
3303
  msgstr "Checkbox Text"
3304
 
3305
  # @ woocommerce-germanized
3306
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:560
3307
  msgid ""
3308
  "Customize the checkbox label. Use {link}link name{/link} to insert the "
3309
  "preview link."
3312
  "auf die Vorschau zu verlinken."
3313
 
3314
  # @ woocommerce-germanized
3315
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:561
3316
  msgid "I hereby agree to the {link}direct debit mandate{/link}."
3317
  msgstr "Hiermit erteile ich das {link}SEPA Lastschriftmandat{/link}."
3318
 
3319
  # @ woocommerce-germanized
3320
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:565
3321
  msgid "Mask IBAN"
3322
  msgstr "IBAN maskieren"
3323
 
3324
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:566
3325
  msgid "Mask the IBAN within emails."
3326
  msgstr "IBAN in E-Mails maskieren."
3327
 
3328
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:568
3329
  msgid ""
3330
  "This will lead to masked IBANs within emails (replaced by *). All but last 4 "
3331
  "digits will be masked."
3333
  "Der IBAN wird in E-Mails (abgesehen von den letzten 4 Stellen) mit * "
3334
  "maskiert."
3335
 
3336
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:577
3337
+ msgid "Remember"
3338
+ msgstr "Bankdaten merken\t"
3339
+
3340
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:578
3341
+ msgid "Remember account data for returning customers."
3342
+ msgstr "Bankverbindung für registrierte Kunden speichern."
3343
+
3344
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:580
3345
+ msgid "Save account data as user meta if user has/creates a customer account."
3346
+ msgstr ""
3347
+ "Speichert die Bankverbindung für registrierte Kunden in der user_meta "
3348
+ "Tabelle und füllt bei erneuter Bestellung die Daten des Bestellformulares "
3349
+ "eigenständig aus."
3350
+
3351
  # @ woocommerce-germanized
3352
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:660
3353
  msgid "Please accept the direct debit mandate."
3354
  msgstr "Bitte erteile das SEPA Lastschriftmandat."
3355
 
3356
  # @ woocommerce-germanized
3357
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:677
3358
  msgid "Please insert your SEPA account data."
3359
  msgstr "Bitte füge deine SEPA Kontoinformationen ein."
3360
 
3361
  # @ woocommerce-germanized
3362
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:687
3363
  msgid "Your IBAN seems to be invalid."
3364
  msgstr "Dein IBAN scheint nicht gültig zu sein."
3365
 
3366
  # @ woocommerce-germanized
3367
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:689
3368
  msgid "Your IBAN's country code doesn’t match with your billing country."
3369
  msgstr "Der Ländercode des IBANs stimmt nicht mit dem Rechnungsland überein."
3370
 
3371
  # @ woocommerce-germanized
3372
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:693
3373
  msgid "Your BIC seems to be invalid."
3374
  msgstr "Dein BIC/SWIFT scheint nicht gültig zu sein."
3375
 
3376
  # @ woocommerce-germanized
3377
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:724
3378
  msgid "is invalid"
3379
  msgstr "ist ungültig"
3380
 
3381
  # @ woocommerce-germanized
3382
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:762
3383
  msgid "Processing direct debit"
3384
  msgstr "Lastschriftverfahren vorbereiten"
3385
 
3386
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:14
3387
+ #, php-format
3388
+ msgid ""
3389
+ "Please upgrade your PHP Version to at least 5.4 and make sure that you have "
3390
+ "<a href=\"%s\" target=\"_blank\">openssl</a> enabled to support account data "
3391
+ "encryption."
3392
+ msgstr ""
3393
+ "Bitte upgrade deine PHP Version mind. auf 5.4 und stelle sicher, dass du <a "
3394
+ "href=\"%s\" target=\"_blank\">openssl</a> aktiviert hast um eine "
3395
+ "Verschlüsselung der sensiblen Daten (IBAN, BIC) gewährleisten zu können."
3396
+
3397
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:18
3398
+ #, php-format
3399
+ msgid ""
3400
+ "Please insert the following code in your <a href=\"%s\" target=\"_blank\">wp-"
3401
+ "config.php</a> to enable encryption. You may of course choose your own key:"
3402
+ msgstr ""
3403
+ "Bitte füge den folgenden Code in deiner <a href=\"%s\" target=\"_blank\">wp-"
3404
+ "config.php</a> Datei hinzu um Verschlüsselung zu unterstützen. Du kannst "
3405
+ "natürlich einen eigenen Key vergeben:"
3406
+
3407
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:20
3408
+ #, php-format
3409
+ msgid ""
3410
+ "Your customers’ account data (IBAN, BIC) will from then on be saved <a href="
3411
+ "\"%s\" target=\"_blank\">encrypted</a> within your database."
3412
+ msgstr ""
3413
+ "Die Bankverbindung deiner Kunden (IBAN, BIC) wird anschließend <a href=\"%s"
3414
+ "\" target=\"_blank\">verschlüsselt</a> in deiner Datenbank gespeichert."
3415
+
3416
  # @ woocommerce-germanized
3417
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:33
3418
  msgid "Start Date"
3438
  # @ woocommerce-germanized
3439
  # @ woocommerce
3440
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:50
3441
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:514
3442
  msgid "Settings"
3443
  msgstr "Einstellungen"
3444
 
3905
  "a> oder von <a href=\"%s\" target=\"_blank\">Produktbewertungen</a>."
3906
 
3907
  # @ woocommerce-germanized
3908
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:500
3909
  msgctxt "trusted-shops"
3910
  msgid "Review Collector"
3911
  msgstr "Review Collector"
3912
 
3913
  # @ woocommerce-germanized
3914
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:505
3915
  msgctxt "trusted-shops"
3916
  msgid "Export customer data"
3917
  msgstr "Bestellungen exportieren"
3918
 
3919
  # @ woocommerce-germanized
3920
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:509
3921
  msgctxt "trusted-shops"
3922
  msgid "30 days"
3923
  msgstr "30 Tage"
3924
 
3925
  # @ woocommerce-germanized
3926
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:510
3927
  msgctxt "trusted-shops"
3928
  msgid "60 days"
3929
  msgstr "60 Tage"
3930
 
3931
  # @ woocommerce-germanized
3932
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:511
3933
  msgctxt "trusted-shops"
3934
  msgid "90 days"
3935
  msgstr "90 Tage"
3936
 
3937
  # @ woocommerce-germanized
3938
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:513
3939
  msgctxt "trusted-shops"
3940
  msgid "Start export"
3941
  msgstr "Export starten"
3942
 
3943
  # @ woocommerce-germanized
3944
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:514
3945
  #, php-format
3946
  msgctxt "trusted-shops"
3947
  msgid ""
4041
  msgstr "Trusted Shops Rich Snippets"
4042
 
4043
  # @ woocommerce-germanized
4044
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:310
4045
  msgid ""
4046
  "I want immediate access to the digital content and I acknowledge that "
4047
  "thereby I lose my right to cancel once the service has begun."
4179
  #, php-format
4180
  msgid "If you haven't created an account on %s please ignore this email."
4181
  msgstr ""
4182
+ "Wenn du bei %s kein Benutzerkonto eröffnet hast, ignoriere diese E-Mail "
4183
  "bitte."
4184
 
4185
  # @ woocommerce-germanized
i18n/languages/woocommerce-germanized-de_DE_formal.mo CHANGED
Binary file
i18n/languages/woocommerce-germanized-de_DE_formal.po CHANGED
@@ -2,8 +2,8 @@ msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WooCommerce Germanized v1.5.1\n"
4
  "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2016-04-28 15:30+0100\n"
6
- "PO-Revision-Date: 2016-04-28 15:31+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "Language: de_DE\n"
@@ -90,8 +90,8 @@ msgstr "l"
90
 
91
  # @ woocommerce-germanized
92
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:159
93
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:196
94
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:734
95
  msgid "incl. VAT"
96
  msgstr "inkl. MwSt."
97
 
@@ -102,8 +102,8 @@ msgstr "exkl. MwSt."
102
 
103
  # @ woocommerce-germanized
104
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:161
105
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:196
106
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:734
107
  #, php-format
108
  msgid "incl. %s%% VAT"
109
  msgstr "inkl. %s%% MwSt."
@@ -198,36 +198,36 @@ msgid "Go to WooCommerce Germanized Settings"
198
  msgstr "zu den WooCommerce Germanized Einstellungen"
199
 
200
  # @ woocommerce-germanized
201
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:88
202
  msgid "WooCommerce Status"
203
  msgstr "WooCommerce Status"
204
 
205
  # @ woocommerce-germanized
206
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:88
207
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status.php:16
208
  msgid "System Status"
209
  msgstr "Systemstatus"
210
 
211
  # @ woocommerce-germanized
212
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:145
213
  msgid "Optional Email Content"
214
  msgstr "Optionaler E-Mail Inhalt"
215
 
216
  # @ woocommerce-germanized
217
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:154
218
  msgid "Add content which will be replacing default page content within emails."
219
  msgstr ""
220
  "Fülle dieses Feld aus um einen abweichenden E-Mail Anhangstext für diese "
221
  "Seite zu bestimmen."
222
 
223
  # @ woocommerce-germanized
224
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:163
225
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/meta-boxes/class-wc-gzd-meta-box-product-data-variable.php:114
226
  msgid "Optional Mini Description"
227
  msgstr "Warenkorb Kurzbeschreibung"
228
 
229
  # @ woocommerce-germanized
230
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:180
231
  msgid ""
232
  "This content will be shown as short product description within checkout and "
233
  "emails."
@@ -236,7 +236,7 @@ msgstr ""
236
  "Produkt Kurzbeschreibung angezeigt."
237
 
238
  # @ woocommerce-germanized
239
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:237
240
  msgid "Complaints Procedure"
241
  msgstr "Beschwerdeverfahren"
242
 
@@ -917,7 +917,7 @@ msgstr "Kunden"
917
 
918
  # @ woocommerce-germanized
919
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:417
920
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:514
921
  msgid "Checkbox"
922
  msgstr "Checkbox"
923
 
@@ -1711,7 +1711,7 @@ msgstr ""
1711
 
1712
  # @ woocommerce-germanized
1713
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:955
1714
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:244
1715
  msgid ""
1716
  "To retrieve direct access to digital content you have to agree to the loss "
1717
  "of your right of withdrawal."
@@ -2227,12 +2227,7 @@ msgid "Settings Tour"
2227
  msgstr "Tour durch Einstellungen"
2228
 
2229
  # @ woocommerce-germanized
2230
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:169
2231
- msgid "Reenable Tour"
2232
- msgstr "Tour aktivieren"
2233
-
2234
- # @ woocommerce-germanized
2235
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:170
2236
  msgid ""
2237
  "This will delete every option which prevents the Germanized settings tour "
2238
  "from starting."
@@ -2241,12 +2236,55 @@ msgstr ""
2241
  "angezeigt wird."
2242
 
2243
  # @ woocommerce-germanized
2244
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2245
  msgid "Templates"
2246
  msgstr "Templates"
2247
 
2248
  # @ woocommerce-germanized
2249
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:226
2250
  #, php-format
2251
  msgid ""
2252
  "<code>%s</code> version <strong style=\"color:red\">%s</strong> is out of "
@@ -2256,13 +2294,13 @@ msgstr ""
2256
  "veraltet. Die Hauptversion ist %s"
2257
 
2258
  # @ woocommerce-germanized
2259
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:238
2260
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:247
2261
  msgid "Overrides"
2262
  msgstr "Überschreibt"
2263
 
2264
  # @ woocommerce-germanized
2265
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:258
2266
  msgid "Learn how to update outdated templates"
2267
  msgstr "Erfahre, wie du veraltete Templates aktualisierst"
2268
 
@@ -2484,7 +2522,7 @@ msgid "eKomi Options"
2484
  msgstr "eKomi"
2485
 
2486
  # @ woocommerce-germanized
2487
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/class-wc-gzd-emails.php:248
2488
  msgctxt "revocation-form"
2489
  msgid "Forward your Revocation online"
2490
  msgstr "Widerruf online erklären"
@@ -2966,7 +3004,7 @@ msgstr "Bitte bewerten Sie Ihre Bestellung bei {site_title} vom {order_date}"
2966
 
2967
  # @ woocommerce-germanized
2968
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:26
2969
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:439
2970
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:27
2971
  msgid "Direct Debit"
2972
  msgstr "Lastschrift"
@@ -2985,7 +3023,7 @@ msgid "SEPA XML Bulk Export"
2985
  msgstr "SEPA XML Export"
2986
 
2987
  # @ woocommerce-germanized
2988
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:48
2989
  msgid ""
2990
  "[company_info]\n"
2991
  "debtee identification number: [company_identification_number]\n"
@@ -3053,149 +3091,149 @@ msgstr ""
3053
  "Bitte beachten Sie: Die Frist für die Vorabinformation der SEPA-Lastschrift "
3054
  "wird auf einen Tag verkürzt. "
3055
 
3056
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:116
3057
  msgid "SEPA XML Export"
3058
  msgstr "SEPA XML Export"
3059
 
3060
  # @ woocommerce-germanized
3061
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:210
3062
  #, php-format
3063
  msgid "Order %s"
3064
  msgstr "Bestellung %s"
3065
 
3066
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:235
3067
  msgid "Will be notified separately"
3068
  msgstr "Wird separat mitgeteilt"
3069
 
3070
  # @ woocommerce-germanized
3071
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:254
3072
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:273
3073
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:465
3074
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:548
3075
  msgid "Account Holder"
3076
  msgstr "Kontoinhaber"
3077
 
3078
  # @ woocommerce-germanized
3079
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:255
3080
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:280
3081
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:473
3082
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:552
3083
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:646
3084
  msgid "IBAN"
3085
  msgstr "IBAN"
3086
 
3087
  # @ woocommerce-germanized
3088
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:256
3089
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:286
3090
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:556
3091
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:647
3092
  msgid "BIC/SWIFT"
3093
  msgstr "BIC/SWIFT"
3094
 
3095
  # @ woocommerce-germanized
3096
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:292
3097
  msgid "Mandate Reference ID"
3098
  msgstr "Mandat-Referenznummer"
3099
 
3100
  # @ woocommerce-germanized
3101
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:430
3102
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:79
3103
  msgid "Enable/Disable"
3104
  msgstr "Aktivieren/Deaktivieren"
3105
 
3106
  # @ woocommerce-germanized
3107
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:432
3108
  msgid "Enable Direct Debit Payment"
3109
  msgstr "Bezahlung per Lastschrift aktivieren"
3110
 
3111
  # @ woocommerce-germanized
3112
  # @ woocommerce
3113
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:436
3114
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:85
3115
  msgctxt "gateway"
3116
  msgid "Title"
3117
  msgstr "Bezeichnung"
3118
 
3119
  # @ woocommerce-germanized
3120
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:438
3121
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:87
3122
  msgid "This controls the title which the user sees during checkout."
3123
  msgstr ""
3124
  "Beschreibungstext, den Benutzer bei der Auswahl dieser Zahlungsart sehen."
3125
 
3126
  # @ woocommerce-germanized
3127
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:443
3128
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:92
3129
  msgid "Description"
3130
  msgstr "Beschreibung"
3131
 
3132
  # @ woocommerce-germanized
3133
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:445
3134
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:94
3135
  msgid "Payment method description that the customer will see on your checkout."
3136
  msgstr "Beschreibung der Zahlungsart, die Kunden auf deiner Website sehen."
3137
 
3138
  # @ woocommerce-germanized
3139
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:446
3140
  msgid "The order amount will be debited directly from your bank account."
3141
  msgstr ""
3142
  "Der Gesamtbestellbetrag wird per SEPA-Lastschrift direkt von Ihrem Konto "
3143
  "abgebucht."
3144
 
3145
  # @ woocommerce-germanized
3146
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:450
3147
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:99
3148
  msgid "Instructions"
3149
  msgstr "Anweisungen"
3150
 
3151
  # @ woocommerce-germanized
3152
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:452
3153
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:101
3154
  msgid "Instructions that will be added to the thank you page and emails."
3155
  msgstr "Anweisung, die zur „Danke“-Seite und zu E-Mails hinzugefügt werden."
3156
 
3157
  # @ woocommerce-germanized
3158
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:457
3159
  msgid "Debtee"
3160
  msgstr "Gläubiger Informationen"
3161
 
3162
  # @ woocommerce-germanized
3163
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:459
3164
  msgid "Insert your company information."
3165
  msgstr "Füge hier die Informationen zu deinem Unternehmen ein."
3166
 
3167
  # @ woocommerce-germanized
3168
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:461
3169
  msgid "Company Inc, John Doe Street, New York"
3170
  msgstr "Musterfirma GmbH, Musterstraße 12, 12203 Musterstadt"
3171
 
3172
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:467
3173
  msgid "Insert the bank account holder name."
3174
  msgstr "Füge hier den Namen des Kontoinhabers ein."
3175
 
3176
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:469
3177
  msgid "Company Inc"
3178
  msgstr "Muster GmbH"
3179
 
3180
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:475
3181
  msgid "Insert the bank account IBAN."
3182
  msgstr "Füge hier den IBAN deines Kontos ein."
3183
 
3184
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:480
3185
  msgid "BIC"
3186
  msgstr "BIC"
3187
 
3188
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:482
3189
  msgid "Insert the bank account BIC."
3190
  msgstr "Füge hier den BIC deines Kontos ein."
3191
 
3192
  # @ woocommerce-germanized
3193
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:487
3194
  msgid "Debtee identification number"
3195
  msgstr "Identifikationsnummer"
3196
 
3197
  # @ woocommerce-germanized
3198
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:489
3199
  #, php-format
3200
  msgid ""
3201
  "Insert your debtee indentification number. More information can be found <a "
@@ -3205,16 +3243,16 @@ msgstr ""
3205
  "Weitere Informationen zu dieser Nummer erhältst du <a href=\"%s\">hier</a>."
3206
 
3207
  # @ woocommerce-germanized
3208
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:493
3209
  msgid "Generate Mandate ID"
3210
  msgstr "Mandat-Referenz generieren"
3211
 
3212
  # @ woocommerce-germanized
3213
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:495
3214
  msgid "Automatically generate Mandate ID."
3215
  msgstr "Mandat-Referenznummer automatisch generieren."
3216
 
3217
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:496
3218
  msgid ""
3219
  "Automatically generate Mandate ID after order completion (based on Order ID)."
3220
  msgstr ""
@@ -3222,11 +3260,11 @@ msgstr ""
3222
  "basierend auf der Bestellnummer."
3223
 
3224
  # @ woocommerce-germanized
3225
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:500
3226
  msgid "Mandate ID Format"
3227
  msgstr "Mandat-Referenz Format"
3228
 
3229
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:502
3230
  msgid ""
3231
  "You may extend the Mandate ID format by adding a prefix and/or suffix. Use "
3232
  "{id} as placeholder to insert the automatically generated ID."
@@ -3235,12 +3273,12 @@ msgstr ""
3235
  "{id} als Platzhalter um die automatisch generierte Referenznummer einzufügen."
3236
 
3237
  # @ woocommerce-germanized
3238
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:506
3239
  msgid "Mandate Text"
3240
  msgstr "Lastschriftmandat"
3241
 
3242
  # @ woocommerce-germanized
3243
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:508
3244
  msgid ""
3245
  "This text will be populated with live order/checkout data. Will be used as "
3246
  "preview direct debit mandate and as email template text."
@@ -3251,23 +3289,23 @@ msgstr ""
3251
  "Verfügung gestellt."
3252
 
3253
  # @ woocommerce-germanized
3254
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:515
3255
  msgid "Enable \"agree to SEPA mandate\" checkbox"
3256
  msgstr "Aktiviere die Checkbox zur Bestätigung des Lastschriftmandates."
3257
 
3258
  # @ woocommerce-germanized
3259
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:517
3260
  msgid "Enable a checkbox linking to a SEPA direct debit mandate preview."
3261
  msgstr ""
3262
  "Aktiviere eine Checkbox, die zu einer Vorschau des Lastschrift-Mandats führt."
3263
 
3264
  # @ woocommerce-germanized
3265
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:521
3266
  msgid "Checkbox label"
3267
  msgstr "Checkbox Text"
3268
 
3269
  # @ woocommerce-germanized
3270
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:523
3271
  msgid ""
3272
  "Customize the checkbox label. Use {link}link name{/link} to insert the "
3273
  "preview link."
@@ -3276,20 +3314,20 @@ msgstr ""
3276
  "auf die Vorschau zu verlinken."
3277
 
3278
  # @ woocommerce-germanized
3279
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:524
3280
  msgid "I hereby agree to the {link}direct debit mandate{/link}."
3281
  msgstr "Hiermit erteile ich das {link}SEPA Lastschriftmandat{/link}."
3282
 
3283
  # @ woocommerce-germanized
3284
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:528
3285
  msgid "Mask IBAN"
3286
  msgstr "IBAN maskieren"
3287
 
3288
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:529
3289
  msgid "Mask the IBAN within emails."
3290
  msgstr "IBAN in E-Mails maskieren."
3291
 
3292
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:531
3293
  msgid ""
3294
  "This will lead to masked IBANs within emails (replaced by *). All but last 4 "
3295
  "digits will be masked."
@@ -3297,41 +3335,86 @@ msgstr ""
3297
  "Der IBAN wird in E-Mails (abgesehen von den letzten 4 Stellen) mit * "
3298
  "maskiert."
3299
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3300
  # @ woocommerce-germanized
3301
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:584
3302
  msgid "Please accept the direct debit mandate."
3303
  msgstr "Bitte erteilen Sie das SEPA Lastschriftmandat."
3304
 
3305
  # @ woocommerce-germanized
3306
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:601
3307
  msgid "Please insert your SEPA account data."
3308
  msgstr "Bitte fügen Sie Ihre SEPA Kontoinformationen ein."
3309
 
3310
  # @ woocommerce-germanized
3311
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:611
3312
  msgid "Your IBAN seems to be invalid."
3313
  msgstr "Ihr IBAN scheint nicht gültig zu sein."
3314
 
3315
  # @ woocommerce-germanized
3316
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:613
3317
  msgid "Your IBAN's country code doesn’t match with your billing country."
3318
  msgstr "Der Ländercode des IBANs stimmt nicht mit dem Rechnungsland überein."
3319
 
3320
  # @ woocommerce-germanized
3321
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:617
3322
  msgid "Your BIC seems to be invalid."
3323
  msgstr "Ihr BIC/SWIFT scheint nicht gültig zu sein."
3324
 
3325
  # @ woocommerce-germanized
3326
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:648
3327
  msgid "is invalid"
3328
  msgstr "ist ungültig"
3329
 
3330
  # @ woocommerce-germanized
3331
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:686
3332
  msgid "Processing direct debit"
3333
  msgstr "Lastschriftverfahren vorbereiten"
3334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3335
  # @ woocommerce-germanized
3336
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:33
3337
  msgid "Start Date"
@@ -3357,7 +3440,7 @@ msgstr ""
3357
  # @ woocommerce-germanized
3358
  # @ woocommerce
3359
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:50
3360
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:510
3361
  msgid "Settings"
3362
  msgstr "Einstellungen"
3363
 
@@ -3825,43 +3908,43 @@ msgstr ""
3825
  "a> oder von <a href=\"%s\" target=\"_blank\">Produktbewertungen</a>."
3826
 
3827
  # @ woocommerce-germanized
3828
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:499
3829
  msgctxt "trusted-shops"
3830
  msgid "Review Collector"
3831
  msgstr "Review Collector"
3832
 
3833
  # @ woocommerce-germanized
3834
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:504
3835
  msgctxt "trusted-shops"
3836
  msgid "Export customer data"
3837
  msgstr "Bestellungen exportieren"
3838
 
3839
  # @ woocommerce-germanized
3840
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:508
3841
  msgctxt "trusted-shops"
3842
  msgid "30 days"
3843
  msgstr "30 Tage"
3844
 
3845
  # @ woocommerce-germanized
3846
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:509
3847
  msgctxt "trusted-shops"
3848
  msgid "60 days"
3849
  msgstr "60 Tage"
3850
 
3851
  # @ woocommerce-germanized
3852
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:510
3853
  msgctxt "trusted-shops"
3854
  msgid "90 days"
3855
  msgstr "90 Tage"
3856
 
3857
  # @ woocommerce-germanized
3858
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:512
3859
  msgctxt "trusted-shops"
3860
  msgid "Start export"
3861
  msgstr "Export starten"
3862
 
3863
  # @ woocommerce-germanized
3864
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:513
3865
  #, php-format
3866
  msgctxt "trusted-shops"
3867
  msgid ""
@@ -3961,7 +4044,7 @@ msgid "Trusted Shops Rich Snippets"
3961
  msgstr "Trusted Shops Rich Snippets"
3962
 
3963
  # @ woocommerce-germanized
3964
- #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:237
3965
  msgid ""
3966
  "I want immediate access to the digital content and I acknowledge that "
3967
  "thereby I lose my right to cancel once the service has begun."
2
  msgstr ""
3
  "Project-Id-Version: WooCommerce Germanized v1.5.1\n"
4
  "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2016-05-18 09:54+0100\n"
6
+ "PO-Revision-Date: 2016-05-18 09:55+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "Language: de_DE\n"
90
 
91
  # @ woocommerce-germanized
92
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:159
93
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:269
94
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:738
95
  msgid "incl. VAT"
96
  msgstr "inkl. MwSt."
97
 
102
 
103
  # @ woocommerce-germanized
104
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/abstracts/abstract-wc-gzd-product.php:161
105
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:269
106
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:738
107
  #, php-format
108
  msgid "incl. %s%% VAT"
109
  msgstr "inkl. %s%% MwSt."
198
  msgstr "zu den WooCommerce Germanized Einstellungen"
199
 
200
  # @ woocommerce-germanized
201
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:90
202
  msgid "WooCommerce Status"
203
  msgstr "WooCommerce Status"
204
 
205
  # @ woocommerce-germanized
206
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:90
207
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status.php:16
208
  msgid "System Status"
209
  msgstr "Systemstatus"
210
 
211
  # @ woocommerce-germanized
212
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:147
213
  msgid "Optional Email Content"
214
  msgstr "Optionaler E-Mail Inhalt"
215
 
216
  # @ woocommerce-germanized
217
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:156
218
  msgid "Add content which will be replacing default page content within emails."
219
  msgstr ""
220
  "Fülle dieses Feld aus um einen abweichenden E-Mail Anhangstext für diese "
221
  "Seite zu bestimmen."
222
 
223
  # @ woocommerce-germanized
224
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:165
225
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/meta-boxes/class-wc-gzd-meta-box-product-data-variable.php:114
226
  msgid "Optional Mini Description"
227
  msgstr "Warenkorb Kurzbeschreibung"
228
 
229
  # @ woocommerce-germanized
230
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:182
231
  msgid ""
232
  "This content will be shown as short product description within checkout and "
233
  "emails."
236
  "Produkt Kurzbeschreibung angezeigt."
237
 
238
  # @ woocommerce-germanized
239
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/class-wc-gzd-admin.php:299
240
  msgid "Complaints Procedure"
241
  msgstr "Beschwerdeverfahren"
242
 
917
 
918
  # @ woocommerce-germanized
919
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:417
920
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:551
921
  msgid "Checkbox"
922
  msgstr "Checkbox"
923
 
1711
 
1712
  # @ woocommerce-germanized
1713
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/settings/class-wc-gzd-settings-germanized.php:955
1714
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:317
1715
  msgid ""
1716
  "To retrieve direct access to digital content you have to agree to the loss "
1717
  "of your right of withdrawal."
2227
  msgstr "Tour durch Einstellungen"
2228
 
2229
  # @ woocommerce-germanized
2230
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:167
 
 
 
 
 
2231
  msgid ""
2232
  "This will delete every option which prevents the Germanized settings tour "
2233
  "from starting."
2236
  "angezeigt wird."
2237
 
2238
  # @ woocommerce-germanized
2239
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:168
2240
+ msgid "Reenable Tour"
2241
+ msgstr "Tour aktivieren"
2242
+
2243
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:171
2244
+ msgid "German Formal"
2245
+ msgstr "Deutsch (Sie)"
2246
+
2247
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:172
2248
+ msgid ""
2249
+ "This option will install and activate German formal as your WordPress and "
2250
+ "WooCommerce language."
2251
+ msgstr ""
2252
+ "Diese Option installiert und aktiviert die formelle Anrede für deine "
2253
+ "WordPress Installation. Anschließend wirst du zur Aktualisierung deiner "
2254
+ "Sprachdateien weitergeleitet, damit du auch WooCommerce mit der formellen "
2255
+ "Anrede erhältst."
2256
+
2257
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:173
2258
+ msgid "Install de_DE_formal"
2259
+ msgstr "de_DE_formal installieren"
2260
+
2261
+ # @ woocommerce-germanized
2262
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:176
2263
+ msgid "Text Options"
2264
+ msgstr "Text-Optionen"
2265
+
2266
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:177
2267
+ msgid ""
2268
+ "This option removes custom Germanized text options (e.g. Pay-Button-Text) "
2269
+ "and installs default options. You may use this options to reinstall text "
2270
+ "options e.g. after a language switch."
2271
+ msgstr ""
2272
+ "Diese Option entfernt alle Germanized Text-Optionen (z.B. rechtlicher "
2273
+ "Hinweistext) und installiert anschließend die Standard-Formulierungen. Du "
2274
+ "kannst diese Option z.B. nach einem Sprachwechsel nutzen (z.B. nach einem "
2275
+ "Wechsel auf Deutsch (Sie))."
2276
+
2277
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:178
2278
+ msgid "Delete text options"
2279
+ msgstr "Text-Optionen löschen"
2280
+
2281
+ # @ woocommerce-germanized
2282
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:187
2283
  msgid "Templates"
2284
  msgstr "Templates"
2285
 
2286
  # @ woocommerce-germanized
2287
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:232
2288
  #, php-format
2289
  msgid ""
2290
  "<code>%s</code> version <strong style=\"color:red\">%s</strong> is out of "
2294
  "veraltet. Die Hauptversion ist %s"
2295
 
2296
  # @ woocommerce-germanized
2297
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:244
2298
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:253
2299
  msgid "Overrides"
2300
  msgstr "Überschreibt"
2301
 
2302
  # @ woocommerce-germanized
2303
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/admin/views/html-page-status-germanized.php:264
2304
  msgid "Learn how to update outdated templates"
2305
  msgstr "Erfahre, wie du veraltete Templates aktualisierst"
2306
 
2522
  msgstr "eKomi"
2523
 
2524
  # @ woocommerce-germanized
2525
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/class-wc-gzd-emails.php:267
2526
  msgctxt "revocation-form"
2527
  msgid "Forward your Revocation online"
2528
  msgstr "Widerruf online erklären"
3004
 
3005
  # @ woocommerce-germanized
3006
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:26
3007
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:476
3008
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:27
3009
  msgid "Direct Debit"
3010
  msgstr "Lastschrift"
3023
  msgstr "SEPA XML Export"
3024
 
3025
  # @ woocommerce-germanized
3026
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:59
3027
  msgid ""
3028
  "[company_info]\n"
3029
  "debtee identification number: [company_identification_number]\n"
3091
  "Bitte beachten Sie: Die Frist für die Vorabinformation der SEPA-Lastschrift "
3092
  "wird auf einen Tag verkürzt. "
3093
 
3094
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:140
3095
  msgid "SEPA XML Export"
3096
  msgstr "SEPA XML Export"
3097
 
3098
  # @ woocommerce-germanized
3099
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:234
3100
  #, php-format
3101
  msgid "Order %s"
3102
  msgstr "Bestellung %s"
3103
 
3104
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:259
3105
  msgid "Will be notified separately"
3106
  msgstr "Wird separat mitgeteilt"
3107
 
3108
  # @ woocommerce-germanized
3109
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:278
3110
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:297
3111
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:502
3112
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:624
3113
  msgid "Account Holder"
3114
  msgstr "Kontoinhaber"
3115
 
3116
  # @ woocommerce-germanized
3117
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:279
3118
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:304
3119
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:510
3120
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:628
3121
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:722
3122
  msgid "IBAN"
3123
  msgstr "IBAN"
3124
 
3125
  # @ woocommerce-germanized
3126
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:280
3127
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:311
3128
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:632
3129
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:723
3130
  msgid "BIC/SWIFT"
3131
  msgstr "BIC/SWIFT"
3132
 
3133
  # @ woocommerce-germanized
3134
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:318
3135
  msgid "Mandate Reference ID"
3136
  msgstr "Mandat-Referenznummer"
3137
 
3138
  # @ woocommerce-germanized
3139
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:467
3140
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:79
3141
  msgid "Enable/Disable"
3142
  msgstr "Aktivieren/Deaktivieren"
3143
 
3144
  # @ woocommerce-germanized
3145
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:469
3146
  msgid "Enable Direct Debit Payment"
3147
  msgstr "Bezahlung per Lastschrift aktivieren"
3148
 
3149
  # @ woocommerce-germanized
3150
  # @ woocommerce
3151
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:473
3152
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:85
3153
  msgctxt "gateway"
3154
  msgid "Title"
3155
  msgstr "Bezeichnung"
3156
 
3157
  # @ woocommerce-germanized
3158
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:475
3159
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:87
3160
  msgid "This controls the title which the user sees during checkout."
3161
  msgstr ""
3162
  "Beschreibungstext, den Benutzer bei der Auswahl dieser Zahlungsart sehen."
3163
 
3164
  # @ woocommerce-germanized
3165
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:480
3166
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:92
3167
  msgid "Description"
3168
  msgstr "Beschreibung"
3169
 
3170
  # @ woocommerce-germanized
3171
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:482
3172
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:94
3173
  msgid "Payment method description that the customer will see on your checkout."
3174
  msgstr "Beschreibung der Zahlungsart, die Kunden auf deiner Website sehen."
3175
 
3176
  # @ woocommerce-germanized
3177
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:483
3178
  msgid "The order amount will be debited directly from your bank account."
3179
  msgstr ""
3180
  "Der Gesamtbestellbetrag wird per SEPA-Lastschrift direkt von Ihrem Konto "
3181
  "abgebucht."
3182
 
3183
  # @ woocommerce-germanized
3184
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:487
3185
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:99
3186
  msgid "Instructions"
3187
  msgstr "Anweisungen"
3188
 
3189
  # @ woocommerce-germanized
3190
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:489
3191
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:101
3192
  msgid "Instructions that will be added to the thank you page and emails."
3193
  msgstr "Anweisung, die zur „Danke“-Seite und zu E-Mails hinzugefügt werden."
3194
 
3195
  # @ woocommerce-germanized
3196
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:494
3197
  msgid "Debtee"
3198
  msgstr "Gläubiger Informationen"
3199
 
3200
  # @ woocommerce-germanized
3201
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:496
3202
  msgid "Insert your company information."
3203
  msgstr "Füge hier die Informationen zu deinem Unternehmen ein."
3204
 
3205
  # @ woocommerce-germanized
3206
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:498
3207
  msgid "Company Inc, John Doe Street, New York"
3208
  msgstr "Musterfirma GmbH, Musterstraße 12, 12203 Musterstadt"
3209
 
3210
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:504
3211
  msgid "Insert the bank account holder name."
3212
  msgstr "Füge hier den Namen des Kontoinhabers ein."
3213
 
3214
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:506
3215
  msgid "Company Inc"
3216
  msgstr "Muster GmbH"
3217
 
3218
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:512
3219
  msgid "Insert the bank account IBAN."
3220
  msgstr "Füge hier den IBAN deines Kontos ein."
3221
 
3222
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:517
3223
  msgid "BIC"
3224
  msgstr "BIC"
3225
 
3226
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:519
3227
  msgid "Insert the bank account BIC."
3228
  msgstr "Füge hier den BIC deines Kontos ein."
3229
 
3230
  # @ woocommerce-germanized
3231
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:524
3232
  msgid "Debtee identification number"
3233
  msgstr "Identifikationsnummer"
3234
 
3235
  # @ woocommerce-germanized
3236
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:526
3237
  #, php-format
3238
  msgid ""
3239
  "Insert your debtee indentification number. More information can be found <a "
3243
  "Weitere Informationen zu dieser Nummer erhältst du <a href=\"%s\">hier</a>."
3244
 
3245
  # @ woocommerce-germanized
3246
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:530
3247
  msgid "Generate Mandate ID"
3248
  msgstr "Mandat-Referenz generieren"
3249
 
3250
  # @ woocommerce-germanized
3251
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:532
3252
  msgid "Automatically generate Mandate ID."
3253
  msgstr "Mandat-Referenznummer automatisch generieren."
3254
 
3255
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:533
3256
  msgid ""
3257
  "Automatically generate Mandate ID after order completion (based on Order ID)."
3258
  msgstr ""
3260
  "basierend auf der Bestellnummer."
3261
 
3262
  # @ woocommerce-germanized
3263
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:537
3264
  msgid "Mandate ID Format"
3265
  msgstr "Mandat-Referenz Format"
3266
 
3267
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:539
3268
  msgid ""
3269
  "You may extend the Mandate ID format by adding a prefix and/or suffix. Use "
3270
  "{id} as placeholder to insert the automatically generated ID."
3273
  "{id} als Platzhalter um die automatisch generierte Referenznummer einzufügen."
3274
 
3275
  # @ woocommerce-germanized
3276
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:543
3277
  msgid "Mandate Text"
3278
  msgstr "Lastschriftmandat"
3279
 
3280
  # @ woocommerce-germanized
3281
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:545
3282
  msgid ""
3283
  "This text will be populated with live order/checkout data. Will be used as "
3284
  "preview direct debit mandate and as email template text."
3289
  "Verfügung gestellt."
3290
 
3291
  # @ woocommerce-germanized
3292
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:552
3293
  msgid "Enable \"agree to SEPA mandate\" checkbox"
3294
  msgstr "Aktiviere die Checkbox zur Bestätigung des Lastschriftmandates."
3295
 
3296
  # @ woocommerce-germanized
3297
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:554
3298
  msgid "Enable a checkbox linking to a SEPA direct debit mandate preview."
3299
  msgstr ""
3300
  "Aktiviere eine Checkbox, die zu einer Vorschau des Lastschrift-Mandats führt."
3301
 
3302
  # @ woocommerce-germanized
3303
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:558
3304
  msgid "Checkbox label"
3305
  msgstr "Checkbox Text"
3306
 
3307
  # @ woocommerce-germanized
3308
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:560
3309
  msgid ""
3310
  "Customize the checkbox label. Use {link}link name{/link} to insert the "
3311
  "preview link."
3314
  "auf die Vorschau zu verlinken."
3315
 
3316
  # @ woocommerce-germanized
3317
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:561
3318
  msgid "I hereby agree to the {link}direct debit mandate{/link}."
3319
  msgstr "Hiermit erteile ich das {link}SEPA Lastschriftmandat{/link}."
3320
 
3321
  # @ woocommerce-germanized
3322
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:565
3323
  msgid "Mask IBAN"
3324
  msgstr "IBAN maskieren"
3325
 
3326
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:566
3327
  msgid "Mask the IBAN within emails."
3328
  msgstr "IBAN in E-Mails maskieren."
3329
 
3330
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:568
3331
  msgid ""
3332
  "This will lead to masked IBANs within emails (replaced by *). All but last 4 "
3333
  "digits will be masked."
3335
  "Der IBAN wird in E-Mails (abgesehen von den letzten 4 Stellen) mit * "
3336
  "maskiert."
3337
 
3338
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:577
3339
+ msgid "Remember"
3340
+ msgstr "Bankdaten merken\t"
3341
+
3342
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:578
3343
+ msgid "Remember account data for returning customers."
3344
+ msgstr "Bankverbindung für registrierte Kunden speichern."
3345
+
3346
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:580
3347
+ msgid "Save account data as user meta if user has/creates a customer account."
3348
+ msgstr ""
3349
+ "Speichert die Bankverbindung für registrierte Kunden in der user_meta "
3350
+ "Tabelle und füllt bei erneuter Bestellung die Daten des Bestellformulares "
3351
+ "eigenständig aus."
3352
+
3353
  # @ woocommerce-germanized
3354
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:660
3355
  msgid "Please accept the direct debit mandate."
3356
  msgstr "Bitte erteilen Sie das SEPA Lastschriftmandat."
3357
 
3358
  # @ woocommerce-germanized
3359
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:677
3360
  msgid "Please insert your SEPA account data."
3361
  msgstr "Bitte fügen Sie Ihre SEPA Kontoinformationen ein."
3362
 
3363
  # @ woocommerce-germanized
3364
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:687
3365
  msgid "Your IBAN seems to be invalid."
3366
  msgstr "Ihr IBAN scheint nicht gültig zu sein."
3367
 
3368
  # @ woocommerce-germanized
3369
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:689
3370
  msgid "Your IBAN's country code doesn’t match with your billing country."
3371
  msgstr "Der Ländercode des IBANs stimmt nicht mit dem Rechnungsland überein."
3372
 
3373
  # @ woocommerce-germanized
3374
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:693
3375
  msgid "Your BIC seems to be invalid."
3376
  msgstr "Ihr BIC/SWIFT scheint nicht gültig zu sein."
3377
 
3378
  # @ woocommerce-germanized
3379
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:724
3380
  msgid "is invalid"
3381
  msgstr "ist ungültig"
3382
 
3383
  # @ woocommerce-germanized
3384
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php:762
3385
  msgid "Processing direct debit"
3386
  msgstr "Lastschriftverfahren vorbereiten"
3387
 
3388
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:14
3389
+ #, php-format
3390
+ msgid ""
3391
+ "Please upgrade your PHP Version to at least 5.4 and make sure that you have "
3392
+ "<a href=\"%s\" target=\"_blank\">openssl</a> enabled to support account data "
3393
+ "encryption."
3394
+ msgstr ""
3395
+ "Bitte upgrade deine PHP Version mind. auf 5.4 und stelle sicher, dass du <a "
3396
+ "href=\"%s\" target=\"_blank\">openssl</a> aktiviert hast um eine "
3397
+ "Verschlüsselung der sensiblen Daten (IBAN, BIC) gewährleisten zu können."
3398
+
3399
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:18
3400
+ #, php-format
3401
+ msgid ""
3402
+ "Please insert the following code in your <a href=\"%s\" target=\"_blank\">wp-"
3403
+ "config.php</a> to enable encryption. You may of course choose your own key:"
3404
+ msgstr ""
3405
+ "Bitte füge den folgenden Code in deiner <a href=\"%s\" target=\"_blank\">wp-"
3406
+ "config.php</a> Datei hinzu um Verschlüsselung zu unterstützen. Du kannst "
3407
+ "natürlich einen eigenen Key vergeben:"
3408
+
3409
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-encryption-notice.php:20
3410
+ #, php-format
3411
+ msgid ""
3412
+ "Your customers’ account data (IBAN, BIC) will from then on be saved <a href="
3413
+ "\"%s\" target=\"_blank\">encrypted</a> within your database."
3414
+ msgstr ""
3415
+ "Die Bankverbindung deiner Kunden (IBAN, BIC) wird anschließend <a href=\"%s"
3416
+ "\" target=\"_blank\">verschlüsselt</a> in deiner Datenbank gespeichert."
3417
+
3418
  # @ woocommerce-germanized
3419
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/direct-debit/views/html-export.php:33
3420
  msgid "Start Date"
3440
  # @ woocommerce-germanized
3441
  # @ woocommerce
3442
  #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/gateways/invoice/class-wc-gzd-gateway-invoice.php:50
3443
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/woocommerce-germanized.php:514
3444
  msgid "Settings"
3445
  msgstr "Einstellungen"
3446
 
3908
  "a> oder von <a href=\"%s\" target=\"_blank\">Produktbewertungen</a>."
3909
 
3910
  # @ woocommerce-germanized
3911
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:500
3912
  msgctxt "trusted-shops"
3913
  msgid "Review Collector"
3914
  msgstr "Review Collector"
3915
 
3916
  # @ woocommerce-germanized
3917
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:505
3918
  msgctxt "trusted-shops"
3919
  msgid "Export customer data"
3920
  msgstr "Bestellungen exportieren"
3921
 
3922
  # @ woocommerce-germanized
3923
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:509
3924
  msgctxt "trusted-shops"
3925
  msgid "30 days"
3926
  msgstr "30 Tage"
3927
 
3928
  # @ woocommerce-germanized
3929
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:510
3930
  msgctxt "trusted-shops"
3931
  msgid "60 days"
3932
  msgstr "60 Tage"
3933
 
3934
  # @ woocommerce-germanized
3935
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:511
3936
  msgctxt "trusted-shops"
3937
  msgid "90 days"
3938
  msgstr "90 Tage"
3939
 
3940
  # @ woocommerce-germanized
3941
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:513
3942
  msgctxt "trusted-shops"
3943
  msgid "Start export"
3944
  msgstr "Export starten"
3945
 
3946
  # @ woocommerce-germanized
3947
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php:514
3948
  #, php-format
3949
  msgctxt "trusted-shops"
3950
  msgid ""
4044
  msgstr "Trusted Shops Rich Snippets"
4045
 
4046
  # @ woocommerce-germanized
4047
+ #: /Users/dennis/Documents/localhost/vendidero/wp-content/plugins/woocommerce-germanized/includes/wc-gzd-cart-functions.php:310
4048
  msgid ""
4049
  "I want immediate access to the digital content and I acknowledge that "
4050
  "thereby I lose my right to cancel once the service has begun."
includes/abstracts/abstract-wc-gzd-product.php CHANGED
@@ -296,6 +296,7 @@ class WC_GZD_Product {
296
  $display_price = $this->get_unit_price();
297
  $display_regular_price = $this->get_unit_price( 1, $this->get_unit_regular_price() );
298
  $display_sale_price = $this->get_unit_price( 1, $this->get_unit_sale_price() );
 
299
  $price_html = ( ( $this->is_on_unit_sale() && $show_sale ) ? $this->get_price_html_from_to( $display_regular_price, $display_sale_price, false ) : wc_price( $display_price ) );
300
  $html = '';
301
  $text = get_option( 'woocommerce_gzd_unit_price_text' );
296
  $display_price = $this->get_unit_price();
297
  $display_regular_price = $this->get_unit_price( 1, $this->get_unit_regular_price() );
298
  $display_sale_price = $this->get_unit_price( 1, $this->get_unit_sale_price() );
299
+
300
  $price_html = ( ( $this->is_on_unit_sale() && $show_sale ) ? $this->get_price_html_from_to( $display_regular_price, $display_sale_price, false ) : wc_price( $display_price ) );
301
  $html = '';
302
  $text = get_option( 'woocommerce_gzd_unit_price_text' );
includes/admin/class-wc-gzd-admin-welcome.php CHANGED
@@ -123,6 +123,21 @@ class WC_GZD_Admin_Welcome {
123
  <a href="https://vendidero.de/woocommerce-germanized#buy" target="_blank" class="button button-primary">Upgrade zur Pro Version</a>
124
  </p>
125
  <div class="changelog new-feature">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  <h3>Bessere Grundpreise für variable Produkte</h3>
127
  <p>Mit Version 1.6 führen wir eine bessere Behandlung von Grundpreisen für variable Produkte ein. Optional können nun analog zu den Von-Bis-Preisen für variable Produkte auch die Grundpreise in gleicher Form angezeigt werden.</p>
128
  <p>Weiterhin muss von nun an die Einheit nur noch für das variable Produkt und nicht mehr für alle Varianten einzeln ausgewählt werden. Ähnlich verhält es sich mit den Produkt- und Grundpreiseinheiten. Diese können für das variable Produkt hinterlegt und optional
123
  <a href="https://vendidero.de/woocommerce-germanized#buy" target="_blank" class="button button-primary">Upgrade zur Pro Version</a>
124
  </p>
125
  <div class="changelog new-feature">
126
+
127
+ <?php $gateways = WC()->payment_gateways->payment_gateways(); ?>
128
+
129
+ <?php if ( isset( $gateways[ 'direct-debit' ] ) && $gateways[ 'direct-debit' ]->enabled === 'yes' ) : ?>
130
+
131
+ <div style="background: #FFF; padding: 0.1em 1em; border-left: 5px solid red; display: block; margin-top: 1em;">
132
+
133
+ <h3>Verschlüsselung sensibler Zahlungsdaten für Lastschrift</h3>
134
+ <p>Mit der neuesten Version führen wir optional die Verschlüsselung von sensiblen Zahlungsdaten deiner Kunden ein (IBAN, BIC).
135
+ Nachdem du die Verschlüsselung konfiguriert hast, kannst du auch optional die Zahlungsdaten für Folgebestellungen speichern.</p>
136
+ <p><a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=wc-settings&tab=checkout&section=wc_gzd_gateway_direct_debit' ); ?>">Konfiguration der Verschlüsselung</a></p>
137
+ </div>
138
+
139
+ <?php endif; ?>
140
+
141
  <h3>Bessere Grundpreise für variable Produkte</h3>
142
  <p>Mit Version 1.6 führen wir eine bessere Behandlung von Grundpreisen für variable Produkte ein. Optional können nun analog zu den Von-Bis-Preisen für variable Produkte auch die Grundpreise in gleicher Form angezeigt werden.</p>
143
  <p>Weiterhin muss von nun an die Einheit nur noch für das variable Produkt und nicht mehr für alle Varianten einzeln ausgewählt werden. Ähnlich verhält es sich mit den Produkt- und Grundpreiseinheiten. Diese können für das variable Produkt hinterlegt und optional
includes/admin/class-wc-gzd-admin.php CHANGED
@@ -45,6 +45,8 @@ class WC_GZD_Admin {
45
  add_action( 'admin_menu', array( $this, 'remove_status_page_hooks' ), 0 );
46
  add_action( 'admin_menu', array( $this, 'set_status_page' ), 1 );
47
  add_action( 'admin_init', array( $this, 'check_tour_hide' ) );
 
 
48
  add_action( 'admin_init', array( $this, 'check_complaints_shortcode_append' ) );
49
  add_filter( 'woocommerce_addons_section_data', array( $this, 'set_addon' ), 10, 2 );
50
  }
@@ -157,7 +159,7 @@ class WC_GZD_Admin {
157
 
158
  public function add_product_mini_desc() {
159
  global $post;
160
- if ( isset( $post ) ) {
161
  $product = wc_get_product( $post );
162
  if ( ! $product->is_type( 'variable' ) )
163
  add_meta_box( 'wc-gzd-product-mini-desc', __( 'Optional Mini Description', 'woocommerce-germanized' ), array( $this, 'init_product_mini_desc' ), 'product', 'advanced', 'high' );
@@ -190,13 +192,18 @@ class WC_GZD_Admin {
190
  }
191
 
192
  public function check_tour_hide() {
 
193
  if ( isset( $_GET[ 'tour' ] ) && isset( $_GET[ 'hide' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-tour-hide' ) ) {
 
194
  if ( ! empty( $_GET[ 'tour' ] ) )
195
  update_option( 'woocommerce_gzd_hide_tour_' . sanitize_text_field( $_GET[ 'tour' ] ), true );
196
  else
197
  update_option( 'woocommerce_gzd_hide_tour', true );
 
198
  wp_safe_redirect( remove_query_arg( array( 'hide', 'tour', '_wpnonce' ) ) );
 
199
  } else if ( isset( $_GET[ 'tour' ] ) && isset( $_GET[ 'enable' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-tour-enable' ) ) {
 
200
  $setting_sections = array_merge( array(
201
  'general' => '',
202
  'display' => '',
@@ -210,25 +217,80 @@ class WC_GZD_Admin {
210
  }
211
  }
212
 
213
- public function is_complaints_shortcode_inserted() {
214
- $imprint = wc_get_page_id( 'imprint' );
215
- if ( $imprint != -1 ) {
216
- $post = get_post( $imprint );
217
- return ( strpos( $post->post_content, '[gzd_complaints]' ) !== false ? true : false );
218
- }
219
- return false;
220
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
- public function check_complaints_shortcode_append() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  if ( isset( $_GET[ 'complaints' ] ) && 'add' === $_GET[ 'complaints' ] && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'append-complaints-shortcode' ) ) {
 
224
  if ( wc_get_page_id( 'imprint' ) != 1 ) {
 
225
  $page_id = wc_get_page_id( 'imprint' );
226
  $this->insert_complaints_shortcode( $page_id );
227
  wp_safe_redirect( admin_url( 'post.php?post=' . $page_id . '&action=edit' ) );
 
228
  }
229
  }
230
  }
231
 
 
 
 
 
 
 
 
 
 
232
  public function insert_complaints_shortcode( $page_id ) {
233
  $page = get_post( $page_id );
234
  wp_update_post(
45
  add_action( 'admin_menu', array( $this, 'remove_status_page_hooks' ), 0 );
46
  add_action( 'admin_menu', array( $this, 'set_status_page' ), 1 );
47
  add_action( 'admin_init', array( $this, 'check_tour_hide' ) );
48
+ add_action( 'admin_init', array( $this, 'check_language_install' ) );
49
+ add_action( 'admin_init', array( $this, 'check_text_options_deletion' ) );
50
  add_action( 'admin_init', array( $this, 'check_complaints_shortcode_append' ) );
51
  add_filter( 'woocommerce_addons_section_data', array( $this, 'set_addon' ), 10, 2 );
52
  }
159
 
160
  public function add_product_mini_desc() {
161
  global $post;
162
+ if ( isset( $post ) && $post->post_type === 'product' ) {
163
  $product = wc_get_product( $post );
164
  if ( ! $product->is_type( 'variable' ) )
165
  add_meta_box( 'wc-gzd-product-mini-desc', __( 'Optional Mini Description', 'woocommerce-germanized' ), array( $this, 'init_product_mini_desc' ), 'product', 'advanced', 'high' );
192
  }
193
 
194
  public function check_tour_hide() {
195
+
196
  if ( isset( $_GET[ 'tour' ] ) && isset( $_GET[ 'hide' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-tour-hide' ) ) {
197
+
198
  if ( ! empty( $_GET[ 'tour' ] ) )
199
  update_option( 'woocommerce_gzd_hide_tour_' . sanitize_text_field( $_GET[ 'tour' ] ), true );
200
  else
201
  update_option( 'woocommerce_gzd_hide_tour', true );
202
+
203
  wp_safe_redirect( remove_query_arg( array( 'hide', 'tour', '_wpnonce' ) ) );
204
+
205
  } else if ( isset( $_GET[ 'tour' ] ) && isset( $_GET[ 'enable' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-tour-enable' ) ) {
206
+
207
  $setting_sections = array_merge( array(
208
  'general' => '',
209
  'display' => '',
217
  }
218
  }
219
 
220
+ public function check_language_install() {
221
+
222
+ if ( isset( $_GET[ 'install-language' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-install-language' ) ) {
223
+
224
+ require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
225
+ $language = sanitize_text_field( $_GET[ 'install-language' ] );
226
+
227
+ // Download language pack if possible
228
+ if ( wp_can_install_language_pack() )
229
+ $loaded_language = wp_download_language_pack( $language );
230
+
231
+ update_option( 'WPLANG', $language );
232
+ load_default_textdomain( $loaded_language );
233
+
234
+ // Redirect to check for updates
235
+ wp_safe_redirect( admin_url( 'update-core.php?force-check=1' ) );
236
+
237
+ }
238
+
239
+ }
240
+
241
+ public function check_text_options_deletion() {
242
 
243
+ if ( isset( $_GET[ 'delete-text-options' ] ) && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'wc-gzd-delete-text-options' ) ) {
244
+
245
+ global $wpdb;
246
+
247
+ $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name LIKE %s", 'woocommerce_gzd_%_text' ) );
248
+
249
+ $options = array(
250
+ 'woocommerce_gzd_checkout_legal_text_digital',
251
+ 'woocommerce_gzd_checkout_legal_text_digital_error',
252
+ 'woocommerce_gzd_order_confirmation_legal_digital_notice',
253
+ 'woocommerce_gzd_checkout_legal_text_error',
254
+ );
255
+
256
+ foreach ( $options as $option_name ) {
257
+ delete_option( $option_name );
258
+ }
259
+
260
+ // Reinstall options
261
+ WC_GZD_Install::create_options();
262
+
263
+ do_action( 'woocommerce_gzd_deleted_text_options' );
264
+
265
+ // Redirect to check for updates
266
+ wp_safe_redirect( admin_url( 'admin.php?page=wc-settings&tab=germanized' ) );
267
+
268
+ }
269
+
270
+ }
271
+
272
+ public function check_complaints_shortcode_append() {
273
  if ( isset( $_GET[ 'complaints' ] ) && 'add' === $_GET[ 'complaints' ] && isset( $_GET[ '_wpnonce' ] ) && check_admin_referer( 'append-complaints-shortcode' ) ) {
274
+
275
  if ( wc_get_page_id( 'imprint' ) != 1 ) {
276
+
277
  $page_id = wc_get_page_id( 'imprint' );
278
  $this->insert_complaints_shortcode( $page_id );
279
  wp_safe_redirect( admin_url( 'post.php?post=' . $page_id . '&action=edit' ) );
280
+
281
  }
282
  }
283
  }
284
 
285
+ public function is_complaints_shortcode_inserted() {
286
+ $imprint = wc_get_page_id( 'imprint' );
287
+ if ( $imprint != -1 ) {
288
+ $post = get_post( $imprint );
289
+ return ( strpos( $post->post_content, '[gzd_complaints]' ) !== false ? true : false );
290
+ }
291
+ return false;
292
+ }
293
+
294
  public function insert_complaints_shortcode( $page_id ) {
295
  $page = get_post( $page_id );
296
  wp_update_post(
includes/admin/views/html-page-status-germanized.php CHANGED
@@ -164,12 +164,18 @@ if ( ! defined( 'ABSPATH' ) )
164
  <tbody class="tools">
165
  <tr>
166
  <td><?php _e( 'Settings Tour', 'woocommerce-germanized' ); ?></td>
167
- <td>
168
- <p>
169
- <a href="<?php echo wp_nonce_url( add_query_arg( array( 'tour' => '', 'enable' => true ) ), 'wc-gzd-tour-enable' ); ?>" class="button button-secondary"><?php _e( 'Reenable Tour', 'woocommerce-germanized' ); ?></a>
170
- <span class="description"><?php _e( 'This will delete every option which prevents the Germanized settings tour from starting.', 'woocommerce-germanized' ); ?></span>
171
- </p>
172
- </td>
 
 
 
 
 
 
173
  </tr>
174
  <?php do_action( 'woocommerce_gzd_status_after_tools' ); ?>
175
  </tbody>
164
  <tbody class="tools">
165
  <tr>
166
  <td><?php _e( 'Settings Tour', 'woocommerce-germanized' ); ?></td>
167
+ <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr( __( 'This will delete every option which prevents the Germanized settings tour from starting.', 'woocommerce-germanized' ) ) . '">[?]</a>'; ?></td>
168
+ <td><a href="<?php echo wp_nonce_url( add_query_arg( array( 'tour' => '', 'enable' => true ) ), 'wc-gzd-tour-enable' ); ?>" class="button button-secondary"><?php _e( 'Reenable Tour', 'woocommerce-germanized' ); ?></a></td>
169
+ </tr>
170
+ <tr>
171
+ <td><?php _e( 'German Formal', 'woocommerce-germanized' ); ?></td>
172
+ <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr( __( 'This option will install and activate German formal as your WordPress and WooCommerce language.', 'woocommerce-germanized' ) ) . '">[?]</a>'; ?></td>
173
+ <td><a href="<?php echo wp_nonce_url( add_query_arg( array( 'install-language' => 'de_DE_formal' ) ), 'wc-gzd-install-language' ); ?>" class="button button-secondary"><?php _e( 'Install de_DE_formal', 'woocommerce-germanized' ); ?></a></td>
174
+ </tr>
175
+ <tr>
176
+ <td><?php _e( 'Text Options', 'woocommerce-germanized' ); ?></td>
177
+ <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr( __( 'This option removes custom Germanized text options (e.g. Pay-Button-Text) and installs default options. You may use this options to reinstall text options e.g. after a language switch.', 'woocommerce-germanized' ) ) . '">[?]</a>'; ?></td>
178
+ <td><a href="<?php echo wp_nonce_url( add_query_arg( array( 'delete-text-options' => true ) ), 'wc-gzd-delete-text-options' ); ?>" class="button button-secondary"><?php _e( 'Delete text options', 'woocommerce-germanized' ); ?></a></td>
179
  </tr>
180
  <?php do_action( 'woocommerce_gzd_status_after_tools' ); ?>
181
  </tbody>
includes/class-wc-gzd-customer-helper.php CHANGED
@@ -35,27 +35,36 @@ class WC_GZD_Customer_Helper {
35
  // Send customer account notification
36
  add_action( 'woocommerce_email', array( $this, 'email_hooks' ), 0, 1 );
37
 
38
- if ( $this->is_double_opt_in_login_enabled() ) {
39
- // Disable login for unactivated users
40
- add_filter( 'wp_authenticate_user', array( $this, 'login_restriction' ) , 10, 2 );
41
- // Disable auto login after registration
42
- add_filter( 'woocommerce_registration_auth_new_customer', array( $this, 'disable_registration_auto_login' ), 10, 2 );
43
  // Check for customer activation
44
  add_action( 'template_redirect', array( $this, 'customer_account_activation_check' ) );
45
  // Cronjob to delete unactivated users
46
  add_action( 'woocommerce_gzd_customer_cleanup', array( $this, 'account_cleanup' ) );
47
- // Redirect customers that are not logged in to customer account page
48
- add_action( 'template_redirect', array( $this, 'disable_checkout' ), 10 );
49
- // Show notices on customer account page
50
- add_action( 'template_redirect', array( $this, 'show_disabled_checkout_notice' ), 20 );
51
- // Redirect customers to checkout after login
52
- add_filter( 'woocommerce_login_redirect', array( $this, 'login_redirect' ), 10, 2 );
53
- // Disable customer signup if customer has forced guest checkout
54
- add_action( 'woocommerce_checkout_init', array( $this, 'disable_signup' ), 10, 1 );
 
 
 
 
 
 
 
 
55
  }
56
 
57
  }
58
 
 
 
 
 
59
  public function is_double_opt_in_login_enabled() {
60
  return get_option( 'woocommerce_gzd_customer_activation_login_disabled' ) === 'yes';
61
  }
@@ -162,16 +171,16 @@ class WC_GZD_Customer_Helper {
162
  public function customer_account_activation_check() {
163
 
164
  if ( is_account_page() ) {
165
-
166
  if ( isset( $_GET[ 'activate' ] ) ) {
167
 
168
  $activation_code = sanitize_text_field( $_GET[ 'activate' ] );
169
 
170
  if ( ! empty( $activation_code ) ) {
171
-
172
  if ( $this->customer_account_activate( $activation_code, true ) ) {
173
 
174
- wc_add_notice( __( 'Thank you. You have successfully activated your account.', 'woocommerce-germanized' ) );
175
  return;
176
  }
177
 
35
  // Send customer account notification
36
  add_action( 'woocommerce_email', array( $this, 'email_hooks' ), 0, 1 );
37
 
38
+ if ( $this->is_double_opt_in_enabled() ) {
39
+
 
 
 
40
  // Check for customer activation
41
  add_action( 'template_redirect', array( $this, 'customer_account_activation_check' ) );
42
  // Cronjob to delete unactivated users
43
  add_action( 'woocommerce_gzd_customer_cleanup', array( $this, 'account_cleanup' ) );
44
+
45
+ if ( $this->is_double_opt_in_login_enabled() ) {
46
+ // Disable login for unactivated users
47
+ add_filter( 'wp_authenticate_user', array( $this, 'login_restriction' ) , 10, 2 );
48
+ // Disable auto login after registration
49
+ add_filter( 'woocommerce_registration_auth_new_customer', array( $this, 'disable_registration_auto_login' ), 10, 2 );
50
+ // Redirect customers that are not logged in to customer account page
51
+ add_action( 'template_redirect', array( $this, 'disable_checkout' ), 10 );
52
+ // Show notices on customer account page
53
+ add_action( 'template_redirect', array( $this, 'show_disabled_checkout_notice' ), 20 );
54
+ // Redirect customers to checkout after login
55
+ add_filter( 'woocommerce_login_redirect', array( $this, 'login_redirect' ), 10, 2 );
56
+ // Disable customer signup if customer has forced guest checkout
57
+ add_action( 'woocommerce_checkout_init', array( $this, 'disable_signup' ), 10, 1 );
58
+ }
59
+
60
  }
61
 
62
  }
63
 
64
+ public function is_double_opt_in_enabled() {
65
+ return get_option( 'woocommerce_gzd_customer_activation' ) === 'yes';
66
+ }
67
+
68
  public function is_double_opt_in_login_enabled() {
69
  return get_option( 'woocommerce_gzd_customer_activation_login_disabled' ) === 'yes';
70
  }
171
  public function customer_account_activation_check() {
172
 
173
  if ( is_account_page() ) {
174
+
175
  if ( isset( $_GET[ 'activate' ] ) ) {
176
 
177
  $activation_code = sanitize_text_field( $_GET[ 'activate' ] );
178
 
179
  if ( ! empty( $activation_code ) ) {
180
+
181
  if ( $this->customer_account_activate( $activation_code, true ) ) {
182
 
183
+ wc_add_notice( __( 'Thank you. You have successfully activated your account.', 'woocommerce-germanized' ), 'notice' );
184
  return;
185
  }
186
 
includes/class-wc-gzd-emails.php CHANGED
@@ -55,7 +55,10 @@ class WC_GZD_Emails {
55
  add_action( 'woocommerce_germanized_email_footer_' . $mail->id, array( $this, 'hook_mail_footer' ), 10, 1 );
56
  }
57
 
 
58
  add_filter( 'woocommerce_order_item_product', array( $this, 'set_order_email_filters' ), 0, 1 );
 
 
59
 
60
  // Pay now button
61
  add_action( 'woocommerce_email_before_order_table', array( $this, 'email_pay_now_button' ), 0, 1 );
@@ -134,9 +137,25 @@ class WC_GZD_Emails {
134
  add_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_delivery_time', wc_gzd_get_hook_priority( 'email_product_delivery_time' ), 2 );
135
  add_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_item_desc', wc_gzd_get_hook_priority( 'email_product_item_desc' ), 2 );
136
  add_filter( 'woocommerce_order_formatted_line_subtotal', 'wc_gzd_cart_product_unit_price', wc_gzd_get_hook_priority( 'email_product_unit_price' ), 2 );
 
137
  return $product;
138
  }
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  /**
141
  * Add email styles
142
  *
55
  add_action( 'woocommerce_germanized_email_footer_' . $mail->id, array( $this, 'hook_mail_footer' ), 10, 1 );
56
  }
57
 
58
+ // Set email filters
59
  add_filter( 'woocommerce_order_item_product', array( $this, 'set_order_email_filters' ), 0, 1 );
60
+ // Remove them after total has been displayed
61
+ add_action( 'woocommerce_email_after_order_table', array( $this, 'remove_order_email_filters' ), 10, 1 );
62
 
63
  // Pay now button
64
  add_action( 'woocommerce_email_before_order_table', array( $this, 'email_pay_now_button' ), 0, 1 );
137
  add_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_delivery_time', wc_gzd_get_hook_priority( 'email_product_delivery_time' ), 2 );
138
  add_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_item_desc', wc_gzd_get_hook_priority( 'email_product_item_desc' ), 2 );
139
  add_filter( 'woocommerce_order_formatted_line_subtotal', 'wc_gzd_cart_product_unit_price', wc_gzd_get_hook_priority( 'email_product_unit_price' ), 2 );
140
+
141
  return $product;
142
  }
143
 
144
+ public function remove_order_email_filters() {
145
+
146
+ $current = $this->get_current_email_object();
147
+
148
+ if ( ! $current || empty( $current ) )
149
+ return;
150
+
151
+ // Add order item name actions
152
+ remove_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_units', wc_gzd_get_hook_priority( 'email_product_units' ) );
153
+ remove_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_delivery_time', wc_gzd_get_hook_priority( 'email_product_delivery_time' ) );
154
+ remove_action( 'woocommerce_order_item_name', 'wc_gzd_cart_product_item_desc', wc_gzd_get_hook_priority( 'email_product_item_desc' ) );
155
+ remove_filter( 'woocommerce_order_formatted_line_subtotal', 'wc_gzd_cart_product_unit_price', wc_gzd_get_hook_priority( 'email_product_unit_price' ) );
156
+
157
+ }
158
+
159
  /**
160
  * Add email styles
161
  *
includes/class-wc-gzd-install.php CHANGED
@@ -19,7 +19,8 @@ class WC_GZD_Install {
19
  '1.4.2' => 'updates/woocommerce-gzd-update-1.4.2.php',
20
  '1.4.6' => 'updates/woocommerce-gzd-update-1.4.6.php',
21
  '1.5.0' => 'updates/woocommerce-gzd-update-1.5.0.php',
22
- '1.6.0' => 'updates/woocommerce-gzd-update-1.6.0.php'
 
23
  );
24
 
25
  /**
19
  '1.4.2' => 'updates/woocommerce-gzd-update-1.4.2.php',
20
  '1.4.6' => 'updates/woocommerce-gzd-update-1.4.6.php',
21
  '1.5.0' => 'updates/woocommerce-gzd-update-1.5.0.php',
22
+ '1.6.0' => 'updates/woocommerce-gzd-update-1.6.0.php',
23
+ '1.6.3' => 'updates/woocommerce-gzd-update-1.6.3.php'
24
  );
25
 
26
  /**
includes/class-wc-gzd-wpml-helper.php CHANGED
@@ -45,7 +45,7 @@ class WC_GZD_WPML_Helper {
45
 
46
  public function send_order_admin_confirmation( $order_id ) {
47
  global $woocommerce_wpml;
48
- if ( isset( $woocommerce_wpml ) ) {
49
  // Instantiate mailer to make sure that new order email is known
50
  $mailer = WC()->mailer();
51
  $woocommerce_wpml->emails->admin_email( $order_id );
45
 
46
  public function send_order_admin_confirmation( $order_id ) {
47
  global $woocommerce_wpml;
48
+ if ( isset( $woocommerce_wpml ) && isset( $woocommerce_wpml->emails ) && is_object( $woocommerce_wpml->emails ) ) {
49
  // Instantiate mailer to make sure that new order email is known
50
  $mailer = WC()->mailer();
51
  $woocommerce_wpml->emails->admin_email( $order_id );
includes/gateways/direct-debit/assets/js/direct-debit.js CHANGED
@@ -33,6 +33,9 @@
33
  }
34
  });
35
 
 
 
 
36
  $( 'form.checkout, form#order_review' ).on( 'blur input change', 'input, select', function() {
37
 
38
  // Hide by default
33
  }
34
  });
35
 
36
+ // Hide checkbox
37
+ $( '.direct-debit-checkbox' ).hide();
38
+
39
  $( 'form.checkout, form#order_review' ).on( 'blur input change', 'input, select', function() {
40
 
41
  // Hide by default
includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit-encryption-helper.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use \Defuse\Crypto;
4
+
5
+ if ( ! defined( 'ABSPATH' ) ) {
6
+ exit; // Exit if accessed directly
7
+ }
8
+
9
+ class WC_GZD_Gateway_Direct_Debit_Encryption_Helper {
10
+
11
+ protected static $_instance = null;
12
+
13
+ public static function instance() {
14
+ if ( is_null( self::$_instance ) )
15
+ self::$_instance = new self();
16
+ return self::$_instance;
17
+ }
18
+
19
+ private function __construct() {
20
+
21
+ }
22
+
23
+ public function get_random_key() {
24
+ $key = Crypto\Key::createNewRandomKey();
25
+ return $key->saveToAsciiSafeString();
26
+ }
27
+
28
+ public function is_configured() {
29
+ return ( $this->get_key() ? true : false );
30
+ }
31
+
32
+ public function encrypt( $string ) {
33
+ if ( empty( $string ) )
34
+ return $string;
35
+
36
+ return Crypto\Crypto::encrypt( $string, $this->get_key() );
37
+ }
38
+
39
+ public function decrypt( $string ) {
40
+ if ( empty( $string ) )
41
+ return $string;
42
+
43
+ $secret_data = $string;
44
+
45
+ try {
46
+ $secret_data = Crypto\Crypto::decrypt( $string, $this->get_key() );
47
+ } catch (Crypto\Exception\WrongKeyOrModifiedCiphertextException $ex) {
48
+
49
+ }
50
+
51
+ return $secret_data;
52
+ }
53
+
54
+ private function get_key() {
55
+ if ( defined( 'WC_GZD_DIRECT_DEBIT_KEY' ) )
56
+ return Crypto\Key::loadFromAsciiSafeString( WC_GZD_DIRECT_DEBIT_KEY );
57
+ return false;
58
+ }
59
+
60
+ }
includes/gateways/direct-debit/class-wc-gzd-gateway-direct-debit.php CHANGED
@@ -44,6 +44,7 @@ class WC_GZD_Gateway_Direct_Debit extends WC_Payment_Gateway {
44
  $this->company_account_iban = $this->get_option( 'company_account_iban' );
45
  $this->company_account_bic = $this->get_option( 'company_account_bic' );
46
  $this->checkbox_label = $this->get_option( 'checkbox_label' );
 
47
  $this->mask = $this->get_option( 'mask', 'yes' );
48
  $this->mandate_text = $this->get_option( 'mandate_text', __( '[company_info]
49
  debtee identification number: [company_identification_number]
@@ -76,6 +77,21 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
76
  'products',
77
  );
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  // Actions
80
  add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
81
  add_action( 'woocommerce_thankyou_direct-debit', array( $this, 'thankyou_page' ) );
@@ -91,6 +107,9 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
91
  // Order Meta
92
  add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'set_order_meta' ), 10, 2 );
93
 
 
 
 
94
  // Customer Emails
95
  add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
96
  add_action( 'woocommerce_germanized_order_confirmation_sent', array( $this, 'send_mail' ) );
@@ -108,6 +127,11 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
108
 
109
  }
110
 
 
 
 
 
 
111
  public function order_actions( $actions, $order ) {
112
 
113
  if ( $order->payment_method === $this->id ) {
@@ -190,7 +214,7 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
190
 
191
  if ( $order_query->have_posts() ) {
192
 
193
- include_once( 'sepa-xml-creator/SepaXmlCreator.php' );
194
  $creator = new SepaXmlCreator();
195
 
196
  $creator->setAccountValues( $this->company_account_holder, $this->company_account_iban, $this->company_account_bic );
@@ -203,9 +227,9 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
203
 
204
  $book = new SepaBuchung();
205
  $book->setBetrag( $order->get_total() );
206
- $book->setBic( $order->direct_debit_bic );
207
  $book->setName( $order->direct_debit_holder );
208
- $book->setIban( $order->direct_debit_iban );
209
  $book->setName( $order->direct_debit_holder );
210
  $book->setVerwendungszweck( apply_filters( 'woocommerce_germanized_direct_debit_purpose', sprintf( __( 'Order %s', 'woocommerce-germanized' ), $order->get_order_number() ) ), $order );
211
  $book->setMandat( $this->get_mandate_id( $order->id ), date_i18n( "Y-m-d", strtotime( $order->order_date ) ), false );
@@ -252,8 +276,8 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
252
 
253
  $sepa_fields = array(
254
  __( 'Account Holder', 'woocommerce-germanized' ) => $order->direct_debit_holder,
255
- __( 'IBAN', 'woocommerce-germanized' ) => $this->mask( $order->direct_debit_iban ),
256
- __( 'BIC/SWIFT', 'woocommerce-germanized' ) => $order->direct_debit_bic,
257
  );
258
 
259
  wc_get_template( 'emails/email-sepa-data.php', array( 'fields' => $sepa_fields ) );
@@ -279,18 +303,20 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
279
  $fields[ 'direct_debit_iban' ] = array(
280
  'label' => __( 'IBAN', 'woocommerce-germanized' ),
281
  'id' => '_direct_debit_iban',
 
282
  'show' => true,
283
  );
284
 
285
  $fields[ 'direct_debit_bic' ] = array(
286
  'label' => __( 'BIC/SWIFT', 'woocommerce-germanized' ),
287
  'id' => '_direct_debit_bic',
 
288
  'show' => true,
289
  );
290
 
291
- $fields[ 'direct_debit_reference' ] = array(
292
  'label' => __( 'Mandate Reference ID', 'woocommerce-germanized' ),
293
- 'id' => '_direct_debit_reference',
294
  'show' => true,
295
  );
296
 
@@ -316,9 +342,20 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
316
  if ( ! $order->payment_method == $this->id )
317
  return;
318
 
319
- update_post_meta( $order->id, '_direct_debit_holder', ( isset( $_POST[ 'direct_debit_account_holder' ] ) ? wc_clean( $_POST[ 'direct_debit_account_holder' ] ) : '' ) );
320
- update_post_meta( $order->id, '_direct_debit_iban', ( isset( $_POST[ 'direct_debit_account_iban' ] ) ? wc_clean( $_POST[ 'direct_debit_account_iban' ] ) : '' ) );
321
- update_post_meta( $order->id, '_direct_debit_bic', ( isset( $_POST[ 'direct_debit_account_bic' ] ) ? wc_clean( $_POST[ 'direct_debit_account_bic' ] ) : '' ) );
 
 
 
 
 
 
 
 
 
 
 
322
 
323
  }
324
 
@@ -357,8 +394,8 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
357
 
358
  $params = array(
359
  'account_holder' => $order->direct_debit_holder,
360
- 'account_iban' => $this->mask( $order->direct_debit_iban ),
361
- 'account_swift' => $order->direct_debit_bic,
362
  'street' => $order->billing_address_1,
363
  'postcode' => $order->billing_postcode,
364
  'city' => $order->billing_city,
@@ -531,7 +568,44 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
531
  'description' => __( 'This will lead to masked IBANs within emails (replaced by *). All but last 4 digits will be masked.', 'woocommerce-germanized' ),
532
  'default' => 'yes',
533
  ),
 
534
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
535
  }
536
 
537
  /**
@@ -542,19 +616,21 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
542
  if ( $description = $this->get_description() ) {
543
  echo wpautop( wptexturize( $description ) );
544
  }
 
 
545
 
546
  $fields = array(
547
  'account-holder' => '<p class="form-row form-row-wide">
548
  <label for="' . esc_attr( $this->id ) . '-account-holder">' . __( 'Account Holder', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
549
- <input id="' . esc_attr( $this->id ) . '-account-holder" class="input-text wc-gzd-' . $this->id . '-account-holder" type="text" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_holder' . '" />
550
  </p>',
551
  'account-iban' => '<p class="form-row form-row-wide">
552
  <label for="' . esc_attr( $this->id ) . '-account-iban">' . __( 'IBAN', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
553
- <input id="' . esc_attr( $this->id ) . '-account-iban" class="input-text wc-gzd-' . $this->id . '-account-iban" type="text" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_iban' . '" />
554
  </p>',
555
  'account-bic' => '<p class="form-row form-row-wide">
556
  <label for="' . esc_attr( $this->id ) . '-account-bic">' . __( 'BIC/SWIFT', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
557
- <input id="' . esc_attr( $this->id ) . '-account-bic" class="input-text wc-gzd-' . $this->id . '-account-bic" type="text" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_bic' . '" />
558
  </p>',
559
  );
560
 
@@ -697,4 +773,40 @@ Please notice: Period for pre-information of the SEPA direct debit is shortened
697
  'redirect' => $this->get_return_url( $order )
698
  );
699
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
700
  }
44
  $this->company_account_iban = $this->get_option( 'company_account_iban' );
45
  $this->company_account_bic = $this->get_option( 'company_account_bic' );
46
  $this->checkbox_label = $this->get_option( 'checkbox_label' );
47
+ $this->remember = $this->get_option( 'remember', 'no' );
48
  $this->mask = $this->get_option( 'mask', 'yes' );
49
  $this->mandate_text = $this->get_option( 'mandate_text', __( '[company_info]
50
  debtee identification number: [company_identification_number]
77
  'products',
78
  );
79
 
80
+ if ( $this->get_option( 'enabled' ) === 'yes' && ! $this->supports_encryption() ) {
81
+
82
+ ob_start();
83
+ include_once( 'views/html-encryption-notice.php' );
84
+ $notice = ob_get_clean();
85
+
86
+ $this->method_description .= $notice;
87
+
88
+ }
89
+
90
+ // Force disabling remember account data if encryption is not supported
91
+ if ( ! $this->supports_encryption() ) {
92
+ $this->remember = 'no';
93
+ }
94
+
95
  // Actions
96
  add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
97
  add_action( 'woocommerce_thankyou_direct-debit', array( $this, 'thankyou_page' ) );
107
  // Order Meta
108
  add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'set_order_meta' ), 10, 2 );
109
 
110
+ // Customer Meta
111
+ add_action( 'woocommerce_checkout_update_user_meta', array( $this, 'set_customer_meta' ), 10, 2 );
112
+
113
  // Customer Emails
114
  add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
115
  add_action( 'woocommerce_germanized_order_confirmation_sent', array( $this, 'send_mail' ) );
127
 
128
  }
129
 
130
+ public function test_encryption() {
131
+ echo $this->maybe_decrypt( $this->maybe_encrypt( "Das ist ein Test!" ) );
132
+ exit();
133
+ }
134
+
135
  public function order_actions( $actions, $order ) {
136
 
137
  if ( $order->payment_method === $this->id ) {
214
 
215
  if ( $order_query->have_posts() ) {
216
 
217
+ include_once( 'libraries/sepa-xml-creator/SepaXmlCreator.php' );
218
  $creator = new SepaXmlCreator();
219
 
220
  $creator->setAccountValues( $this->company_account_holder, $this->company_account_iban, $this->company_account_bic );
227
 
228
  $book = new SepaBuchung();
229
  $book->setBetrag( $order->get_total() );
230
+ $book->setBic( $this->maybe_decrypt( $order->direct_debit_bic ) );
231
  $book->setName( $order->direct_debit_holder );
232
+ $book->setIban( $this->maybe_decrypt( $order->direct_debit_iban ) );
233
  $book->setName( $order->direct_debit_holder );
234
  $book->setVerwendungszweck( apply_filters( 'woocommerce_germanized_direct_debit_purpose', sprintf( __( 'Order %s', 'woocommerce-germanized' ), $order->get_order_number() ) ), $order );
235
  $book->setMandat( $this->get_mandate_id( $order->id ), date_i18n( "Y-m-d", strtotime( $order->order_date ) ), false );
276
 
277
  $sepa_fields = array(
278
  __( 'Account Holder', 'woocommerce-germanized' ) => $order->direct_debit_holder,
279
+ __( 'IBAN', 'woocommerce-germanized' ) => $this->mask( $this->maybe_decrypt( $order->direct_debit_iban ) ),
280
+ __( 'BIC/SWIFT', 'woocommerce-germanized' ) => $this->maybe_decrypt( $order->direct_debit_bic ),
281
  );
282
 
283
  wc_get_template( 'emails/email-sepa-data.php', array( 'fields' => $sepa_fields ) );
303
  $fields[ 'direct_debit_iban' ] = array(
304
  'label' => __( 'IBAN', 'woocommerce-germanized' ),
305
  'id' => '_direct_debit_iban',
306
+ 'value' => $this->maybe_decrypt( get_post_meta( $order->id, '_direct_debit_iban', true ) ),
307
  'show' => true,
308
  );
309
 
310
  $fields[ 'direct_debit_bic' ] = array(
311
  'label' => __( 'BIC/SWIFT', 'woocommerce-germanized' ),
312
  'id' => '_direct_debit_bic',
313
+ 'value' => $this->maybe_decrypt( get_post_meta( $order->id, '_direct_debit_bic', true ) ),
314
  'show' => true,
315
  );
316
 
317
+ $fields[ 'direct_debit_mandate_id' ] = array(
318
  'label' => __( 'Mandate Reference ID', 'woocommerce-germanized' ),
319
+ 'id' => '_direct_debit_mandate_id',
320
  'show' => true,
321
  );
322
 
342
  if ( ! $order->payment_method == $this->id )
343
  return;
344
 
345
+ $holder = ( isset( $_POST[ 'direct_debit_account_holder' ] ) ? wc_clean( $_POST[ 'direct_debit_account_holder' ] ) : '' );
346
+ $iban = ( isset( $_POST[ 'direct_debit_account_iban' ] ) ? $this->maybe_encrypt( wc_clean( $_POST[ 'direct_debit_account_iban' ] ) ) : '' );
347
+ $bic = ( isset( $_POST[ 'direct_debit_account_bic' ] ) ? $this->maybe_encrypt( wc_clean( $_POST[ 'direct_debit_account_bic' ] ) ) : '' );
348
+
349
+ update_post_meta( $order->id, '_direct_debit_holder', $holder );
350
+ update_post_meta( $order->id, '_direct_debit_iban', $iban );
351
+ update_post_meta( $order->id, '_direct_debit_bic', $bic );
352
+
353
+ if ( ! $this->supports_encryption() || $this->remember === 'no' || ! $order->customer_user )
354
+ return;
355
+
356
+ update_user_meta( $order->customer_user, 'direct_debit_holder', $holder );
357
+ update_user_meta( $order->customer_user, 'direct_debit_iban', $iban );
358
+ update_user_meta( $order->customer_user, 'direct_debit_bic', $bic );
359
 
360
  }
361
 
394
 
395
  $params = array(
396
  'account_holder' => $order->direct_debit_holder,
397
+ 'account_iban' => $this->mask( $this->maybe_decrypt( $order->direct_debit_iban ) ),
398
+ 'account_swift' => $this->maybe_decrypt( $order->direct_debit_bic ),
399
  'street' => $order->billing_address_1,
400
  'postcode' => $order->billing_postcode,
401
  'city' => $order->billing_city,
568
  'description' => __( 'This will lead to masked IBANs within emails (replaced by *). All but last 4 digits will be masked.', 'woocommerce-germanized' ),
569
  'default' => 'yes',
570
  ),
571
+
572
  );
573
+
574
+ if ( $this->supports_encryption() ) {
575
+
576
+ $this->form_fields = array_merge( $this->form_fields, array( 'remember' => array(
577
+ 'title' => __( 'Remember', 'woocommerce-germanized' ),
578
+ 'label' => __( 'Remember account data for returning customers.', 'woocommerce-germanized' ),
579
+ 'type' => 'checkbox',
580
+ 'description' => __( 'Save account data as user meta if user has/creates a customer account.', 'woocommerce-germanized' ),
581
+ 'default' => 'no',
582
+ ) ) );
583
+
584
+ }
585
+
586
+ }
587
+
588
+ public function get_user_account_data( $user_id = '' ) {
589
+
590
+ if ( empty( $user_id ) )
591
+ $user_id = get_current_user_id();
592
+
593
+ $data = array(
594
+ 'holder' => '',
595
+ 'iban' => '',
596
+ 'bic' => '',
597
+ );
598
+
599
+ if ( $this->remember !== 'yes' )
600
+ return $data;
601
+
602
+ $data = array(
603
+ 'holder' => $this->maybe_decrypt( get_user_meta( $user_id, 'direct_debit_holder', true ) ),
604
+ 'iban' => $this->maybe_decrypt( get_user_meta( $user_id, 'direct_debit_iban', true ) ),
605
+ 'bic' => $this->maybe_decrypt( get_user_meta( $user_id, 'direct_debit_bic', true ) ),
606
+ );
607
+
608
+ return $data;
609
  }
610
 
611
  /**
616
  if ( $description = $this->get_description() ) {
617
  echo wpautop( wptexturize( $description ) );
618
  }
619
+
620
+ $account_data = $this->get_user_account_data();
621
 
622
  $fields = array(
623
  'account-holder' => '<p class="form-row form-row-wide">
624
  <label for="' . esc_attr( $this->id ) . '-account-holder">' . __( 'Account Holder', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
625
+ <input id="' . esc_attr( $this->id ) . '-account-holder" class="input-text wc-gzd-' . $this->id . '-account-holder" value="' . esc_attr( $account_data[ 'holder' ] ) . '" type="text" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_holder' . '" />
626
  </p>',
627
  'account-iban' => '<p class="form-row form-row-wide">
628
  <label for="' . esc_attr( $this->id ) . '-account-iban">' . __( 'IBAN', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
629
+ <input id="' . esc_attr( $this->id ) . '-account-iban" class="input-text wc-gzd-' . $this->id . '-account-iban" type="text" value="' . esc_attr( $account_data[ 'iban' ] ) . '" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_iban' . '" />
630
  </p>',
631
  'account-bic' => '<p class="form-row form-row-wide">
632
  <label for="' . esc_attr( $this->id ) . '-account-bic">' . __( 'BIC/SWIFT', 'woocommerce-germanized' ) . ' <span class="required">*</span></label>
633
+ <input id="' . esc_attr( $this->id ) . '-account-bic" class="input-text wc-gzd-' . $this->id . '-account-bic" type="text" value="' . esc_attr( $account_data[ 'bic' ] ) . '" autocomplete="off" placeholder="" name="' . str_replace( '-', '_', $this->id ) . '_account_bic' . '" />
634
  </p>',
635
  );
636
 
773
  'redirect' => $this->get_return_url( $order )
774
  );
775
  }
776
+
777
+ public function maybe_encrypt( $string ) {
778
+ if ( $this->supports_encryption() ) {
779
+ return WC_GZD_Gateway_Direct_Debit_Encryption_Helper::instance()->encrypt( $string );
780
+ }
781
+ return $string;
782
+ }
783
+
784
+ public function maybe_decrypt( $string ) {
785
+ if ( $this->supports_encryption() ) {
786
+ $decrypted = WC_GZD_Gateway_Direct_Debit_Encryption_Helper::instance()->decrypt( $string );
787
+
788
+ // Maxlength of IBAN is 30 - seems like we have an encrypted string (cannot be decrypted, maybe key changed)
789
+ if ( strlen( $decrypted ) > 40 )
790
+ return "";
791
+
792
+ return $decrypted;
793
+ }
794
+
795
+ return $string;
796
+ }
797
+
798
+ public function supports_encryption() {
799
+ if ( version_compare( phpversion(), '5.4', '<' ) )
800
+ return false;
801
+ if ( ! extension_loaded( 'openssl' ) )
802
+ return false;
803
+
804
+ require_once( 'class-wc-gzd-gateway-direct-debit-encryption-helper.php' );
805
+
806
+ if ( ! WC_GZD_Gateway_Direct_Debit_Encryption_Helper::instance()->is_configured() )
807
+ return false;
808
+
809
+ return true;
810
+ }
811
+
812
  }
includes/gateways/direct-debit/libraries/php-encryption/Core.php ADDED
@@ -0,0 +1,434 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class Core
8
+ {
9
+ const HEADER_VERSION_SIZE = 4;
10
+ const MINIMUM_CIPHERTEXT_SIZE = 84;
11
+
12
+ const CURRENT_VERSION = "\xDE\xF5\x02\x00";
13
+
14
+ const CIPHER_METHOD = 'aes-256-ctr';
15
+ const BLOCK_BYTE_SIZE = 16;
16
+ const KEY_BYTE_SIZE = 32;
17
+ const SALT_BYTE_SIZE = 32;
18
+ const MAC_BYTE_SIZE = 32;
19
+ const HASH_FUNCTION_NAME = 'sha256';
20
+ const ENCRYPTION_INFO_STRING = 'DefusePHP|V2|KeyForEncryption';
21
+ const AUTHENTICATION_INFO_STRING = 'DefusePHP|V2|KeyForAuthentication';
22
+ const BUFFER_BYTE_SIZE = 1048576;
23
+
24
+ const LEGACY_CIPHER_METHOD = 'aes-128-cbc';
25
+ const LEGACY_BLOCK_BYTE_SIZE = 16;
26
+ const LEGACY_KEY_BYTE_SIZE = 16;
27
+ const LEGACY_HASH_FUNCTION_NAME = 'sha256';
28
+ const LEGACY_MAC_BYTE_SIZE = 32;
29
+ const LEGACY_ENCRYPTION_INFO_STRING = 'DefusePHP|KeyForEncryption';
30
+ const LEGACY_AUTHENTICATION_INFO_STRING = 'DefusePHP|KeyForAuthentication';
31
+
32
+ /*
33
+ * V2.0 Format: VERSION (4 bytes) || SALT (32 bytes) || IV (16 bytes) ||
34
+ * CIPHERTEXT (varies) || HMAC (32 bytes)
35
+ *
36
+ * V1.0 Format: HMAC (32 bytes) || IV (16 bytes) || CIPHERTEXT (varies).
37
+ */
38
+
39
+ /**
40
+ * Adds an integer to a block-sized counter.
41
+ *
42
+ * @param string $ctr
43
+ * @param int $inc
44
+ *
45
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
46
+ *
47
+ * @return string
48
+ */
49
+ public static function incrementCounter($ctr, $inc)
50
+ {
51
+ if (Core::ourStrlen($ctr) !== Core::BLOCK_BYTE_SIZE) {
52
+ throw new Ex\EnvironmentIsBrokenException(
53
+ 'Trying to increment a nonce of the wrong size.'
54
+ );
55
+ }
56
+
57
+ if (! \is_int($inc)) {
58
+ throw new Ex\EnvironmentIsBrokenException(
59
+ 'Trying to increment nonce by a non-integer.'
60
+ );
61
+ }
62
+
63
+ if ($inc < 0) {
64
+ throw new Ex\EnvironmentIsBrokenException(
65
+ 'Trying to increment nonce by a negative amount.'
66
+ );
67
+ }
68
+
69
+ if ($inc > PHP_INT_MAX - 255) {
70
+ throw new Ex\EnvironmentIsBrokenException(
71
+ 'Integer overflow may occur.'
72
+ );
73
+ }
74
+
75
+ /*
76
+ * We start at the rightmost byte (big-endian)
77
+ * So, too, does OpenSSL: http://stackoverflow.com/a/3146214/2224584
78
+ */
79
+ for ($i = Core::BLOCK_BYTE_SIZE - 1; $i >= 0; --$i) {
80
+ $sum = \ord($ctr[$i]) + $inc;
81
+
82
+ /* Detect integer overflow and fail. */
83
+ if (! \is_int($sum)) {
84
+ throw new Ex\EnvironmentIsBrokenException(
85
+ 'Integer overflow in CTR mode nonce increment.'
86
+ );
87
+ }
88
+
89
+ $ctr[$i] = \pack('C', $sum & 0xFF);
90
+ $inc = $sum >> 8;
91
+ }
92
+ return $ctr;
93
+ }
94
+
95
+ /**
96
+ * Returns a random byte string of the specified length.
97
+ *
98
+ * @param int $octets
99
+ *
100
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
101
+ *
102
+ * @return string
103
+ */
104
+ public static function secureRandom($octets)
105
+ {
106
+ self::ensureFunctionExists('random_bytes');
107
+ try {
108
+ return \random_bytes($octets);
109
+ } catch (Exception $ex) {
110
+ throw new Ex\EnvironmentIsBrokenException(
111
+ 'Your system does not have a secure random number generator.'
112
+ );
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Computes the HKDF key derivation function specified in
118
+ * http://tools.ietf.org/html/rfc5869.
119
+ *
120
+ * @param string $hash Hash Function
121
+ * @param string $ikm Initial Keying Material
122
+ * @param int $length How many bytes?
123
+ * @param string $info What sort of key are we deriving?
124
+ * @param string $salt
125
+ *
126
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
127
+ *
128
+ * @return string
129
+ */
130
+ public static function HKDF($hash, $ikm, $length, $info = '', $salt = null)
131
+ {
132
+ $digest_length = Core::ourStrlen(\hash_hmac($hash, '', '', true));
133
+
134
+ // Sanity-check the desired output length.
135
+ if (empty($length) || ! \is_int($length) ||
136
+ $length < 0 || $length > 255 * $digest_length) {
137
+ throw new Ex\EnvironmentIsBrokenException(
138
+ 'Bad output length requested of HKDF.'
139
+ );
140
+ }
141
+
142
+ // "if [salt] not provided, is set to a string of HashLen zeroes."
143
+ if (\is_null($salt)) {
144
+ $salt = \str_repeat("\x00", $digest_length);
145
+ }
146
+
147
+ // HKDF-Extract:
148
+ // PRK = HMAC-Hash(salt, IKM)
149
+ // The salt is the HMAC key.
150
+ $prk = \hash_hmac($hash, $ikm, $salt, true);
151
+
152
+ // HKDF-Expand:
153
+
154
+ // This check is useless, but it serves as a reminder to the spec.
155
+ if (Core::ourStrlen($prk) < $digest_length) {
156
+ throw new Ex\EnvironmentIsBrokenException();
157
+ }
158
+
159
+ // T(0) = ''
160
+ $t = '';
161
+ $last_block = '';
162
+ for ($block_index = 1; Core::ourStrlen($t) < $length; ++$block_index) {
163
+ // T(i) = HMAC-Hash(PRK, T(i-1) | info | 0x??)
164
+ $last_block = \hash_hmac(
165
+ $hash,
166
+ $last_block . $info . \chr($block_index),
167
+ $prk,
168
+ true
169
+ );
170
+ // T = T(1) | T(2) | T(3) | ... | T(N)
171
+ $t .= $last_block;
172
+ }
173
+
174
+ // ORM = first L octets of T
175
+ $orm = Core::ourSubstr($t, 0, $length);
176
+ if ($orm === false) {
177
+ throw new Ex\EnvironmentIsBrokenException();
178
+ }
179
+ return $orm;
180
+ }
181
+
182
+ /**
183
+ * Checks if two equal-length strings are the same without leaking
184
+ * information through side channels.
185
+ *
186
+ * @param string $expected
187
+ * @param string $given
188
+ *
189
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
190
+ *
191
+ * @return bool
192
+ */
193
+ public static function hashEquals($expected, $given)
194
+ {
195
+ static $native = null;
196
+ if ($native === null) {
197
+ $native = \function_exists('hash_equals');
198
+ }
199
+ if ($native) {
200
+ return \hash_equals($expected, $given);
201
+ }
202
+
203
+ // We can't just compare the strings with '==', since it would make
204
+ // timing attacks possible. We could use the XOR-OR constant-time
205
+ // comparison algorithm, but that may not be a reliable defense in an
206
+ // interpreted language. So we use the approach of HMACing both strings
207
+ // with a random key and comparing the HMACs.
208
+
209
+ // We're not attempting to make variable-length string comparison
210
+ // secure, as that's very difficult. Make sure the strings are the same
211
+ // length.
212
+ if (Core::ourStrlen($expected) !== Core::ourStrlen($given)) {
213
+ throw new Ex\EnvironmentIsBrokenException();
214
+ }
215
+
216
+ $blind = Core::secureRandom(32);
217
+ $message_compare = \hash_hmac(Core::HASH_FUNCTION_NAME, $given, $blind);
218
+ $correct_compare = \hash_hmac(Core::HASH_FUNCTION_NAME, $expected, $blind);
219
+ return $correct_compare === $message_compare;
220
+ }
221
+ /**
222
+ * Throws an exception if the constant doesn't exist.
223
+ *
224
+ * @param string $name
225
+ *
226
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
227
+ */
228
+ public static function ensureConstantExists($name)
229
+ {
230
+ if (! \defined($name)) {
231
+ throw new Ex\EnvironmentIsBrokenException();
232
+ }
233
+ }
234
+
235
+ /**
236
+ * Throws an exception if the function doesn't exist.
237
+ *
238
+ * @param string $name
239
+ *
240
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
241
+ */
242
+ public static function ensureFunctionExists($name)
243
+ {
244
+ if (! \function_exists($name)) {
245
+ throw new Ex\EnvironmentIsBrokenException();
246
+ }
247
+ }
248
+
249
+ /*
250
+ * We need these strlen() and substr() functions because when
251
+ * 'mbstring.func_overload' is set in php.ini, the standard strlen() and
252
+ * substr() are replaced by mb_strlen() and mb_substr().
253
+ */
254
+
255
+ /**
256
+ * Computes the length of a string in bytes.
257
+ *
258
+ * @param string $str
259
+ *
260
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
261
+ *
262
+ * @return int
263
+ */
264
+ public static function ourStrlen($str)
265
+ {
266
+ static $exists = null;
267
+ if ($exists === null) {
268
+ $exists = \function_exists('mb_strlen');
269
+ }
270
+ if ($exists) {
271
+ $length = \mb_strlen($str, '8bit');
272
+ if ($length === false) {
273
+ throw new Ex\EnvironmentIsBrokenException();
274
+ }
275
+ return $length;
276
+ } else {
277
+ return \strlen($str);
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Behaves roughly like the function substr() in PHP 7 does.
283
+ *
284
+ * @param string $str
285
+ * @param int $start
286
+ * @param int $length
287
+ *
288
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
289
+ *
290
+ * @return string
291
+ */
292
+ public static function ourSubstr($str, $start, $length = null)
293
+ {
294
+ static $exists = null;
295
+ if ($exists === null) {
296
+ $exists = \function_exists('mb_substr');
297
+ }
298
+
299
+ if ($exists) {
300
+ // mb_substr($str, 0, NULL, '8bit') returns an empty string on PHP
301
+ // 5.3, so we have to find the length ourselves.
302
+ if (! isset($length)) {
303
+ if ($start >= 0) {
304
+ $length = Core::ourStrlen($str) - $start;
305
+ } else {
306
+ $length = -$start;
307
+ }
308
+ }
309
+
310
+ // This is required to make mb_substr behavior identical to substr.
311
+ // Without this, mb_substr() would return false, contra to what the
312
+ // PHP documentation says (it doesn't say it can return false.)
313
+ if ($start === Core::ourStrlen($str) && $length === 0) {
314
+ return '';
315
+ }
316
+
317
+ if ($start > Core::ourStrlen($str)) {
318
+ return false;
319
+ }
320
+
321
+ $substr = \mb_substr($str, $start, $length, '8bit');
322
+ if (Core::ourStrlen($substr) !== $length) {
323
+ throw new EnvironmentIsBrokenException(
324
+ 'Your version of PHP has bug #66797. Its implementation of
325
+ mb_substr() is incorrect. See the details here:
326
+ https://bugs.php.net/bug.php?id=66797'
327
+ );
328
+ }
329
+ return $substr;
330
+ }
331
+
332
+ // Unlike mb_substr(), substr() doesn't accept NULL for length
333
+ if (isset($length)) {
334
+ return \substr($str, $start, $length);
335
+ } else {
336
+ return \substr($str, $start);
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Computes the PBKDF2 password-based key derivation function.
342
+ *
343
+ * The PBKDF2 function is defined in RFC 2898. Test vectors can be found in
344
+ * RFC 6070. This implementation of PBKDF2 was originally created by Taylor
345
+ * Hornby, with improvements from http://www.variations-of-shadow.com/.
346
+ *
347
+ * @param string $algorithm The hash algorithm to use. Recommended: SHA256
348
+ * @param string $password The password.
349
+ * @param string $salt A salt that is unique to the password.
350
+ * @param int $count Iteration count. Higher is better, but slower. Recommended: At least 1000.
351
+ * @param int $key_length The length of the derived key in bytes.
352
+ * @param bool $raw_output If true, the key is returned in raw binary format. Hex encoded otherwise.
353
+ *
354
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
355
+ *
356
+ * @return string A $key_length-byte key derived from the password and salt.
357
+ */
358
+ public static function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
359
+ {
360
+ // Type checks:
361
+ if (! \is_string($algorithm)) {
362
+ throw new \InvalidArgumentException(
363
+ 'pbkdf2(): algorithm must be a string'
364
+ );
365
+ }
366
+ if (! \is_string($password)) {
367
+ throw new \InvalidArgumentException(
368
+ 'pbkdf2(): password must be a string'
369
+ );
370
+ }
371
+ if (! \is_string($salt)) {
372
+ throw new \InvalidArgumentException(
373
+ 'pbkdf2(): salt must be a string'
374
+ );
375
+ }
376
+ // Coerce strings to integers with no information loss or overflow
377
+ $count += 0;
378
+ $key_length += 0;
379
+
380
+ $algorithm = \strtolower($algorithm);
381
+ if (! \in_array($algorithm, \hash_algos(), true)) {
382
+ throw new Ex\EnvironmentIsBrokenException(
383
+ 'Invalid or unsupported hash algorithm.'
384
+ );
385
+ }
386
+
387
+ // Whitelist, or we could end up with people using CRC32.
388
+ $ok_algorithms = [
389
+ 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
390
+ 'ripemd160', 'ripemd256', 'ripemd320', 'whirlpool',
391
+ ];
392
+ if (! \in_array($algorithm, $ok_algorithms, true)) {
393
+ throw new Ex\EnvironmentIsBrokenException(
394
+ 'Algorithm is not a secure cryptographic hash function.'
395
+ );
396
+ }
397
+
398
+ if ($count <= 0 || $key_length <= 0) {
399
+ throw new Ex\EnvironmentIsBrokenException(
400
+ 'Invalid PBKDF2 parameters.'
401
+ );
402
+ }
403
+
404
+ if (\function_exists('hash_pbkdf2')) {
405
+ // The output length is in NIBBLES (4-bits) if $raw_output is false!
406
+ if (! $raw_output) {
407
+ $key_length = $key_length * 2;
408
+ }
409
+ return \hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output);
410
+ }
411
+
412
+ $hash_length = Core::ourStrlen(\hash($algorithm, '', true));
413
+ $block_count = \ceil($key_length / $hash_length);
414
+
415
+ $output = '';
416
+ for ($i = 1; $i <= $block_count; $i++) {
417
+ // $i encoded as 4 bytes, big endian.
418
+ $last = $salt . \pack('N', $i);
419
+ // first iteration
420
+ $last = $xorsum = \hash_hmac($algorithm, $last, $password, true);
421
+ // perform the other $count - 1 iterations
422
+ for ($j = 1; $j < $count; $j++) {
423
+ $xorsum ^= ($last = \hash_hmac($algorithm, $last, $password, true));
424
+ }
425
+ $output .= $xorsum;
426
+ }
427
+
428
+ if ($raw_output) {
429
+ return Core::ourSubstr($output, 0, $key_length);
430
+ } else {
431
+ return Encoding::binToHex(Core::ourSubstr($output, 0, $key_length));
432
+ }
433
+ }
434
+ }
includes/gateways/direct-debit/libraries/php-encryption/Crypto.php ADDED
@@ -0,0 +1,372 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ class Crypto
8
+ {
9
+ /**
10
+ * Encrypts a string with a Key.
11
+ *
12
+ * @param string $plaintext
13
+ * @param Key $key
14
+ * @param bool $raw_binary
15
+ *
16
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
17
+ *
18
+ * @return string
19
+ */
20
+ public static function encrypt($plaintext, Key $key, $raw_binary = false)
21
+ {
22
+ return self::encryptInternal(
23
+ $plaintext,
24
+ KeyOrPassword::createFromKey($key),
25
+ $raw_binary
26
+ );
27
+ }
28
+
29
+ /**
30
+ * Encrypts a string with a password, using a slow key derivation function
31
+ * to make password cracking more expensive.
32
+ *
33
+ * @param string $plaintext
34
+ * @param string $password
35
+ * @param bool $raw_binary
36
+ *
37
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
38
+ *
39
+ * @return string
40
+ */
41
+ public static function encryptWithPassword($plaintext, $password, $raw_binary = false)
42
+ {
43
+ return self::encryptInternal(
44
+ $plaintext,
45
+ KeyOrPassword::createFromPassword($password),
46
+ $raw_binary
47
+ );
48
+ }
49
+
50
+ /**
51
+ * Decrypts a ciphertext to a string with a Key.
52
+ *
53
+ * @param string $ciphertext
54
+ * @param Key $key
55
+ * @param bool $raw_binary
56
+ *
57
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
58
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
59
+ *
60
+ * @return string
61
+ */
62
+ public static function decrypt($ciphertext, Key $key, $raw_binary = false)
63
+ {
64
+ return self::decryptInternal(
65
+ $ciphertext,
66
+ KeyOrPassword::createFromKey($key),
67
+ $raw_binary
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Decrypts a ciphertext to a string with a password, using a slow key
73
+ * derivation function to make password cracking more expensive.
74
+ *
75
+ * @param string $ciphertext
76
+ * @param string $password
77
+ * @param bool $raw_binary
78
+ *
79
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
80
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
81
+ *
82
+ * @return string
83
+ */
84
+ public static function decryptWithPassword($ciphertext, $password, $raw_binary = false)
85
+ {
86
+ return self::decryptInternal(
87
+ $ciphertext,
88
+ KeyOrPassword::createFromPassword($password),
89
+ $raw_binary
90
+ );
91
+ }
92
+
93
+ /**
94
+ * Decrypts a legacy ciphertext produced by version 1 of this library.
95
+ *
96
+ * @param string $ciphertext
97
+ * @param string $key
98
+ *
99
+ * @throws Ex\EnvironmentIsBrokenException
100
+ * @throws Ex\WrongKeyOrModifiedCiphertextException
101
+ *
102
+ * @return string
103
+ */
104
+ public static function legacyDecrypt($ciphertext, $key)
105
+ {
106
+ RuntimeTests::runtimeTest();
107
+
108
+ // Extract the HMAC from the front of the ciphertext.
109
+ if (Core::ourStrlen($ciphertext) <= Core::LEGACY_MAC_BYTE_SIZE) {
110
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
111
+ 'Ciphertext is too short.'
112
+ );
113
+ }
114
+ $hmac = Core::ourSubstr($ciphertext, 0, Core::LEGACY_MAC_BYTE_SIZE);
115
+ if ($hmac === false) {
116
+ throw new Ex\EnvironmentIsBrokenException();
117
+ }
118
+ $ciphertext = Core::ourSubstr($ciphertext, Core::LEGACY_MAC_BYTE_SIZE);
119
+ if ($ciphertext === false) {
120
+ throw new Ex\EnvironmentIsBrokenException();
121
+ }
122
+
123
+ // Regenerate the same authentication sub-key.
124
+ $akey = Core::HKDF(
125
+ Core::LEGACY_HASH_FUNCTION_NAME,
126
+ $key,
127
+ Core::LEGACY_KEY_BYTE_SIZE,
128
+ Core::LEGACY_AUTHENTICATION_INFO_STRING,
129
+ null
130
+ );
131
+
132
+ if (self::verifyHMAC($hmac, $ciphertext, $akey)) {
133
+ // Regenerate the same encryption sub-key.
134
+ $ekey = Core::HKDF(
135
+ Core::LEGACY_HASH_FUNCTION_NAME,
136
+ $key,
137
+ Core::LEGACY_KEY_BYTE_SIZE,
138
+ Core::LEGACY_ENCRYPTION_INFO_STRING,
139
+ null
140
+ );
141
+
142
+ // Extract the IV from the ciphertext.
143
+ if (Core::ourStrlen($ciphertext) <= Core::LEGACY_BLOCK_BYTE_SIZE) {
144
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
145
+ 'Ciphertext is too short.'
146
+ );
147
+ }
148
+ $iv = Core::ourSubstr($ciphertext, 0, Core::LEGACY_BLOCK_BYTE_SIZE);
149
+ if ($iv === false) {
150
+ throw new Ex\EnvironmentIsBrokenException();
151
+ }
152
+ $ciphertext = Core::ourSubstr($ciphertext, Core::LEGACY_BLOCK_BYTE_SIZE);
153
+ if ($ciphertext === false) {
154
+ throw new Ex\EnvironmentIsBrokenException();
155
+ }
156
+
157
+ // Do the decryption.
158
+ $plaintext = self::plainDecrypt($ciphertext, $ekey, $iv, Core::LEGACY_CIPHER_METHOD);
159
+ return $plaintext;
160
+ } else {
161
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
162
+ 'Integrity check failed.'
163
+ );
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Encrypts a string with either a key or a password.
169
+ *
170
+ * @param string $plaintext
171
+ * @param KeyOrPassword $secret
172
+ * @param bool $raw_binary
173
+ *
174
+ * @return string
175
+ */
176
+ private static function encryptInternal($plaintext, KeyOrPassword $secret, $raw_binary)
177
+ {
178
+ RuntimeTests::runtimeTest();
179
+
180
+ $salt = Core::secureRandom(Core::SALT_BYTE_SIZE);
181
+ $keys = $secret->deriveKeys($salt);
182
+ $ekey = $keys->getEncryptionKey();
183
+ $akey = $keys->getAuthenticationKey();
184
+ $iv = Core::secureRandom(Core::BLOCK_BYTE_SIZE);
185
+
186
+ $ciphertext = Core::CURRENT_VERSION . $salt . $iv . self::plainEncrypt($plaintext, $ekey, $iv);
187
+ $auth = \hash_hmac(Core::HASH_FUNCTION_NAME, $ciphertext, $akey, true);
188
+ $ciphertext = $ciphertext . $auth;
189
+
190
+ if ($raw_binary) {
191
+ return $ciphertext;
192
+ }
193
+ return Encoding::binToHex($ciphertext);
194
+ }
195
+
196
+ /**
197
+ * Decrypts a ciphertext to a string with either a key or a password.
198
+ *
199
+ * @param string $ciphertext
200
+ * @param KeyOrPassword $secret
201
+ * @param bool $raw_binary
202
+ *
203
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
204
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
205
+ *
206
+ * @return string
207
+ */
208
+ private static function decryptInternal($ciphertext, KeyOrPassword $secret, $raw_binary)
209
+ {
210
+ RuntimeTests::runtimeTest();
211
+
212
+ if (! $raw_binary) {
213
+ try {
214
+ $ciphertext = Encoding::hexToBin($ciphertext);
215
+ } catch (Ex\BadFormatException $ex) {
216
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
217
+ 'Ciphertext has invalid hex encoding.'
218
+ );
219
+ }
220
+ }
221
+
222
+ if (Core::ourStrlen($ciphertext) < Core::MINIMUM_CIPHERTEXT_SIZE) {
223
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
224
+ 'Ciphertext is too short.'
225
+ );
226
+ }
227
+
228
+ // Get and check the version header.
229
+ $header = Core::ourSubstr($ciphertext, 0, Core::HEADER_VERSION_SIZE);
230
+ if ($header !== Core::CURRENT_VERSION) {
231
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
232
+ 'Bad version header.'
233
+ );
234
+ }
235
+
236
+ // Get the salt.
237
+ $salt = Core::ourSubstr(
238
+ $ciphertext,
239
+ Core::HEADER_VERSION_SIZE,
240
+ Core::SALT_BYTE_SIZE
241
+ );
242
+ if ($salt === false) {
243
+ throw new Ex\EnvironmentIsBrokenException();
244
+ }
245
+
246
+ // Get the IV.
247
+ $iv = Core::ourSubstr(
248
+ $ciphertext,
249
+ Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE,
250
+ Core::BLOCK_BYTE_SIZE
251
+ );
252
+ if ($iv === false) {
253
+ throw new Ex\EnvironmentIsBrokenException();
254
+ }
255
+
256
+ // Get the HMAC.
257
+ $hmac = Core::ourSubstr(
258
+ $ciphertext,
259
+ Core::ourStrlen($ciphertext) - Core::MAC_BYTE_SIZE,
260
+ Core::MAC_BYTE_SIZE
261
+ );
262
+ if ($hmac === false) {
263
+ throw new Ex\EnvironmentIsBrokenException();
264
+ }
265
+
266
+ // Get the actual encrypted ciphertext.
267
+ $encrypted = Core::ourSubstr(
268
+ $ciphertext,
269
+ Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE +
270
+ Core::BLOCK_BYTE_SIZE,
271
+ Core::ourStrlen($ciphertext) - Core::MAC_BYTE_SIZE - Core::SALT_BYTE_SIZE -
272
+ Core::BLOCK_BYTE_SIZE - Core::HEADER_VERSION_SIZE
273
+ );
274
+ if ($encrypted === false) {
275
+ throw new Ex\EnvironmentIsBrokenException();
276
+ }
277
+
278
+ // Derive the separate encryption and authentication keys from the key
279
+ // or password, whichever it is.
280
+ $keys = $secret->deriveKeys($salt);
281
+
282
+ if (self::verifyHMAC($hmac, $header . $salt . $iv . $encrypted, $keys->getAuthenticationKey())) {
283
+ $plaintext = self::plainDecrypt($encrypted, $keys->getEncryptionKey(), $iv, Core::CIPHER_METHOD);
284
+ return $plaintext;
285
+ } else {
286
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
287
+ 'Integrity check failed.'
288
+ );
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Raw unauthenticated encryption (insecure on its own).
294
+ *
295
+ * @param string $plaintext
296
+ * @param string $key
297
+ * @param string $iv
298
+ *
299
+ * @throws Ex\EnvironmentIsBrokenException
300
+ *
301
+ * @return string
302
+ */
303
+ protected static function plainEncrypt($plaintext, $key, $iv)
304
+ {
305
+ Core::ensureConstantExists('OPENSSL_RAW_DATA');
306
+ Core::ensureFunctionExists('openssl_encrypt');
307
+ $ciphertext = \openssl_encrypt(
308
+ $plaintext,
309
+ Core::CIPHER_METHOD,
310
+ $key,
311
+ OPENSSL_RAW_DATA,
312
+ $iv
313
+ );
314
+
315
+ if ($ciphertext === false) {
316
+ throw new Ex\EnvironmentIsBrokenException(
317
+ 'openssl_encrypt() failed.'
318
+ );
319
+ }
320
+
321
+ return $ciphertext;
322
+ }
323
+
324
+ /**
325
+ * Raw unauthenticated decryption (insecure on its own).
326
+ *
327
+ * @param string $ciphertext
328
+ * @param string $key
329
+ * @param string $iv
330
+ * @param string $cipherMethod
331
+ *
332
+ * @throws Ex\EnvironmentIsBrokenException
333
+ *
334
+ * @return string
335
+ */
336
+ protected static function plainDecrypt($ciphertext, $key, $iv, $cipherMethod)
337
+ {
338
+ Core::ensureConstantExists('OPENSSL_RAW_DATA');
339
+ Core::ensureFunctionExists('openssl_decrypt');
340
+ $plaintext = \openssl_decrypt(
341
+ $ciphertext,
342
+ $cipherMethod,
343
+ $key,
344
+ OPENSSL_RAW_DATA,
345
+ $iv
346
+ );
347
+ if ($plaintext === false) {
348
+ throw new Ex\EnvironmentIsBrokenException(
349
+ 'openssl_decrypt() failed.'
350
+ );
351
+ }
352
+
353
+ return $plaintext;
354
+ }
355
+
356
+ /**
357
+ * Verifies an HMAC without leaking information through side-channels.
358
+ *
359
+ * @param string $correct_hmac
360
+ * @param string $message
361
+ * @param string $key
362
+ *
363
+ * @throws Ex\EnvironmentIsBrokenException
364
+ *
365
+ * @return bool
366
+ */
367
+ protected static function verifyHMAC($correct_hmac, $message, $key)
368
+ {
369
+ $message_hmac = \hash_hmac(Core::HASH_FUNCTION_NAME, $message, $key, true);
370
+ return Core::hashEquals($correct_hmac, $message_hmac);
371
+ }
372
+ }
includes/gateways/direct-debit/libraries/php-encryption/DerivedKeys.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ final class DerivedKeys
6
+ {
7
+ private $akey = null;
8
+ private $ekey = null;
9
+
10
+ /**
11
+ * Returns the authentication key.
12
+ */
13
+ public function getAuthenticationKey()
14
+ {
15
+ return $this->akey;
16
+ }
17
+
18
+ /**
19
+ * Returns the encryption key.
20
+ */
21
+ public function getEncryptionKey()
22
+ {
23
+ return $this->ekey;
24
+ }
25
+
26
+ /**
27
+ * Constructor for DerivedKeys.
28
+ *
29
+ * @param string $akey
30
+ * @param string $ekey
31
+ */
32
+ public function __construct($akey, $ekey)
33
+ {
34
+ $this->akey = $akey;
35
+ $this->ekey = $ekey;
36
+ }
37
+ }
includes/gateways/direct-debit/libraries/php-encryption/Encoding.php ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class Encoding
8
+ {
9
+ const CHECKSUM_BYTE_SIZE = 32;
10
+ const CHECKSUM_HASH_ALGO = 'sha256';
11
+ const SERIALIZE_HEADER_BYTES = 4;
12
+
13
+ /**
14
+ * Converts a byte string to a hexadecimal string without leaking
15
+ * information through side channels.
16
+ *
17
+ * @param string $binary_string
18
+ *
19
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
20
+ *
21
+ * @return string
22
+ */
23
+ public static function binToHex($byte_string)
24
+ {
25
+ $hex = '';
26
+ $len = Core::ourStrlen($byte_string);
27
+ for ($i = 0; $i < $len; ++$i) {
28
+ $c = \ord($byte_string[$i]) & 0xf;
29
+ $b = \ord($byte_string[$i]) >> 4;
30
+ $hex .= \pack(
31
+ 'CC',
32
+ 87 + $b + ((($b - 10) >> 8) & ~38),
33
+ 87 + $c + ((($c - 10) >> 8) & ~38)
34
+ );
35
+ }
36
+ return $hex;
37
+ }
38
+
39
+ /**
40
+ * Converts a hexadecimal string into a byte string without leaking
41
+ * information through side channels.
42
+ *
43
+ * @param string $hex_string
44
+ *
45
+ * @throws Defuse\Crypto\Exception\BadFormatException
46
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
47
+ *
48
+ * @return string
49
+ */
50
+ public static function hexToBin($hex_string)
51
+ {
52
+ $hex_pos = 0;
53
+ $bin = '';
54
+ $hex_len = Core::ourStrlen($hex_string);
55
+ $state = 0;
56
+ $c_acc = 0;
57
+
58
+ while ($hex_pos < $hex_len) {
59
+ $c = \ord($hex_string[$hex_pos]);
60
+ $c_num = $c ^ 48;
61
+ $c_num0 = ($c_num - 10) >> 8;
62
+ $c_alpha = ($c & ~32) - 55;
63
+ $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
64
+ if (($c_num0 | $c_alpha0) === 0) {
65
+ throw new Ex\BadFormatException(
66
+ 'Encoding::hexToBin() input is not a hex string.'
67
+ );
68
+ }
69
+ $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
70
+ if ($state === 0) {
71
+ $c_acc = $c_val * 16;
72
+ } else {
73
+ $bin .= \pack('C', $c_acc | $c_val);
74
+ }
75
+ $state ^= 1;
76
+ ++$hex_pos;
77
+ }
78
+ return $bin;
79
+ }
80
+
81
+ /*
82
+ * SECURITY NOTE ON APPLYING CHECKSUMS TO SECRETS:
83
+ *
84
+ * The checksum introduces a potential security weakness. For example,
85
+ * suppose we apply a checksum to a key, and that an adversary has an
86
+ * exploit against the process containing the key, such that they can
87
+ * overwrite an arbitrary byte of memory and then cause the checksum to
88
+ * be verified and learn the result.
89
+ *
90
+ * In this scenario, the adversary can extract the key one byte at
91
+ * a time by overwriting it with their guess of its value and then
92
+ * asking if the checksum matches. If it does, their guess was right.
93
+ * This kind of attack may be more easy to implement and more reliable
94
+ * than a remote code execution attack.
95
+ *
96
+ * This attack also applies to authenticated encryption as a whole, in
97
+ * the situation where the adversary can overwrite a byte of the key
98
+ * and then cause a valid ciphertext to be decrypted, and then
99
+ * determine whether the MAC check passed or failed.
100
+ *
101
+ * By using the full SHA256 hash instead of truncating it, I'm ensuring
102
+ * that both ways of going about the attack are equivalently difficult.
103
+ * A shorter checksum of say 32 bits might be more useful to the
104
+ * adversary as an oracle in case their writes are coarser grained.
105
+ *
106
+ * Because the scenario assumes a serious vulnerability, we don't try
107
+ * to prevent attacks of this style.
108
+ */
109
+
110
+ /**
111
+ * INTERNAL USE ONLY: Applies a version header, applies a checksum, and
112
+ * then encodes a byte string into a range of printable ASCII characters.
113
+ *
114
+ * @param string $header
115
+ * @param string $bytes
116
+ *
117
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
118
+ *
119
+ * @return string
120
+ */
121
+ public static function saveBytesToChecksummedAsciiSafeString($header, $bytes)
122
+ {
123
+ // Headers must be a constant length to prevent one type's header from
124
+ // being a prefix of another type's header, leading to ambiguity.
125
+ if (Core::ourStrlen($header) !== self::SERIALIZE_HEADER_BYTES) {
126
+ throw new Ex\EnvironmentIsBrokenException(
127
+ 'Header must be ' . self::SERIALIZE_HEADER_BYTES . ' bytes.'
128
+ );
129
+ }
130
+
131
+ return Encoding::binToHex(
132
+ $header .
133
+ $bytes .
134
+ \hash(
135
+ self::CHECKSUM_HASH_ALGO,
136
+ $header . $bytes,
137
+ true
138
+ )
139
+ );
140
+ }
141
+
142
+ /**
143
+ * INTERNAL USE ONLY: Decodes, verifies the header and checksum, and returns
144
+ * the encoded byte string.
145
+ *
146
+ * @param string $expected_header
147
+ * @param string $string
148
+ *
149
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
150
+ * @throws \Defuse\Crypto\Exception\BadFormatException
151
+ *
152
+ * @return string
153
+ */
154
+ public static function loadBytesFromChecksummedAsciiSafeString($expected_header, $string)
155
+ {
156
+ // Headers must be a constant length to prevent one type's header from
157
+ // being a prefix of another type's header, leading to ambiguity.
158
+ if (Core::ourStrlen($expected_header) !== self::SERIALIZE_HEADER_BYTES) {
159
+ throw new Ex\EnvironmentIsBrokenException(
160
+ 'Header must be 4 bytes.'
161
+ );
162
+ }
163
+
164
+ $bytes = Encoding::hexToBin($string);
165
+
166
+ /* Make sure we have enough bytes to get the version header and checksum. */
167
+ if (Core::ourStrlen($bytes) < self::SERIALIZE_HEADER_BYTES + self::CHECKSUM_BYTE_SIZE) {
168
+ throw new Ex\BadFormatException(
169
+ 'Encoded data is shorter than expected.'
170
+ );
171
+ }
172
+
173
+ /* Grab the version header. */
174
+ $actual_header = Core::ourSubstr($bytes, 0, self::SERIALIZE_HEADER_BYTES);
175
+
176
+ if ($actual_header !== $expected_header) {
177
+ throw new Ex\BadFormatException(
178
+ 'Invalid header.'
179
+ );
180
+ }
181
+
182
+ /* Grab the bytes that are part of the checksum. */
183
+ $checked_bytes = Core::ourSubstr(
184
+ $bytes,
185
+ 0,
186
+ Core::ourStrlen($bytes) - self::CHECKSUM_BYTE_SIZE
187
+ );
188
+
189
+ /* Grab the included checksum. */
190
+ $checksum_a = Core::ourSubstr(
191
+ $bytes,
192
+ Core::ourStrlen($bytes) - self::CHECKSUM_BYTE_SIZE,
193
+ self::CHECKSUM_BYTE_SIZE
194
+ );
195
+
196
+ /* Re-compute the checksum. */
197
+ $checksum_b = \hash(self::CHECKSUM_HASH_ALGO, $checked_bytes, true);
198
+
199
+ /* Check if the checksum matches. */
200
+ if (! Core::hashEquals($checksum_a, $checksum_b)) {
201
+ throw new Ex\BadFormatException(
202
+ "Data is corrupted, the checksum doesn't match"
203
+ );
204
+ }
205
+
206
+ return Core::ourSubstr(
207
+ $bytes,
208
+ self::SERIALIZE_HEADER_BYTES,
209
+ Core::ourStrlen($bytes) - self::SERIALIZE_HEADER_BYTES - self::CHECKSUM_BYTE_SIZE
210
+ );
211
+ }
212
+ }
includes/gateways/direct-debit/libraries/php-encryption/Exception/BadFormatException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto\Exception;
4
+
5
+ class BadFormatException extends \Defuse\Crypto\Exception\CryptoException
6
+ {
7
+ }
includes/gateways/direct-debit/libraries/php-encryption/Exception/CryptoException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto\Exception;
4
+
5
+ class CryptoException extends \Exception
6
+ {
7
+ }
includes/gateways/direct-debit/libraries/php-encryption/Exception/EnvironmentIsBrokenException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto\Exception;
4
+
5
+ class EnvironmentIsBrokenException extends \Defuse\Crypto\Exception\CryptoException
6
+ {
7
+ }
includes/gateways/direct-debit/libraries/php-encryption/Exception/IOException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto\Exception;
4
+
5
+ class IOException extends \Defuse\Crypto\Exception\CryptoException
6
+ {
7
+ }
includes/gateways/direct-debit/libraries/php-encryption/Exception/WrongKeyOrModifiedCiphertextException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto\Exception;
4
+
5
+ class WrongKeyOrModifiedCiphertextException extends \Defuse\Crypto\Exception\CryptoException
6
+ {
7
+ }
includes/gateways/direct-debit/libraries/php-encryption/File.php ADDED
@@ -0,0 +1,746 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class File
8
+ {
9
+ /**
10
+ * Encrypts the input file, saving the ciphertext to the output file.
11
+ *
12
+ * @param string $inputFilename
13
+ * @param string $outputFilename
14
+ * @param Key $key
15
+ *
16
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
17
+ * @throws Defuse\Crypto\Exception\IOException
18
+ */
19
+ public static function encryptFile($inputFilename, $outputFilename, Key $key)
20
+ {
21
+ self::encryptFileInternal(
22
+ $inputFilename,
23
+ $outputFilename,
24
+ KeyOrPassword::createFromKey($key)
25
+ );
26
+ }
27
+
28
+ /**
29
+ * Encrypts a file with a password, using a slow key derivation function to
30
+ * make password cracking more expensive.
31
+ *
32
+ * @param string $inputFilename
33
+ * @param string $outputFilename
34
+ * @param string $password
35
+ *
36
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
37
+ * @throws Defuse\Crypto\Exception\IOException
38
+ */
39
+ public static function encryptFileWithPassword($inputFilename, $outputFilename, $password)
40
+ {
41
+ self::encryptFileInternal(
42
+ $inputFilename,
43
+ $outputFilename,
44
+ KeyOrPassword::createFromPassword($password)
45
+ );
46
+ }
47
+
48
+ /**
49
+ * Decrypts the input file, saving the plaintext to the output file.
50
+ *
51
+ * @param string $inputFilename
52
+ * @param string $outputFilename
53
+ * @param Key $key
54
+ *
55
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
56
+ * @throws Defuse\Crypto\Exception\IOException
57
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
58
+ */
59
+ public static function decryptFile($inputFilename, $outputFilename, Key $key)
60
+ {
61
+ self::decryptFileInternal(
62
+ $inputFilename,
63
+ $outputFilename,
64
+ KeyOrPassword::createFromKey($key)
65
+ );
66
+ }
67
+
68
+ /**
69
+ * Decrypts a file with a password, using a slow key derivation function to
70
+ * make password cracking more expensive.
71
+ *
72
+ * @param string $inputFilename
73
+ * @param string $outputFilename
74
+ * @param string $password
75
+ *
76
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
77
+ * @throws Defuse\Crypto\Exception\IOException
78
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
79
+ */
80
+ public static function decryptFileWithPassword($inputFilename, $outputFilename, $password)
81
+ {
82
+ self::decryptFileInternal(
83
+ $inputFilename,
84
+ $outputFilename,
85
+ KeyOrPassword::createFromPassword($password)
86
+ );
87
+ }
88
+
89
+ /**
90
+ * Takes two resource handles and encrypts the contents of the first,
91
+ * writing the ciphertext into the second.
92
+ *
93
+ * @param resource $inputHandle
94
+ * @param resource $outputHandle
95
+ * @param Key $key
96
+ *
97
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
98
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
99
+ */
100
+ public static function encryptResource($inputHandle, $outputHandle, Key $key)
101
+ {
102
+ self::encryptResourceInternal(
103
+ $inputHandle,
104
+ $outputHandle,
105
+ KeyOrPassword::createFromKey($key)
106
+ );
107
+ }
108
+
109
+ /**
110
+ * Encrypts the contents of one resource handle into another with a
111
+ * password, using a slow key derivation function to make password cracking
112
+ * more expensive.
113
+ *
114
+ * @param resource $inputHandle
115
+ * @param resource $outputHandle
116
+ * @param string $password
117
+ *
118
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
119
+ * @throws Defuse\Crypto\Exception\IOException
120
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
121
+ */
122
+ public static function encryptResourceWithPassword($inputHandle, $outputHandle, $password)
123
+ {
124
+ self::encryptResourceInternal(
125
+ $inputHandle,
126
+ $outputHandle,
127
+ KeyOrPassword::createFromPassword($password)
128
+ );
129
+ }
130
+
131
+ /**
132
+ * Takes two resource handles and decrypts the contents of the first,
133
+ * writing the plaintext into the second.
134
+ *
135
+ * @param resource $inputHandle
136
+ * @param resource $outputHandle
137
+ * @param Key $key
138
+ *
139
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
140
+ * @throws Defuse\Crypto\Exception\IOException
141
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
142
+ */
143
+ public static function decryptResource($inputHandle, $outputHandle, Key $key)
144
+ {
145
+ self::decryptResourceInternal(
146
+ $inputHandle,
147
+ $outputHandle,
148
+ KeyOrPassword::createFromKey($key)
149
+ );
150
+ }
151
+
152
+ /**
153
+ * Decrypts the contents of one resource into another with a password, using
154
+ * a slow key derivation function to make password cracking more expensive.
155
+ *
156
+ * @param resource $inputHandle
157
+ * @param resource $outputHandle
158
+ * @param string $password
159
+ *
160
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
161
+ * @throws Defuse\Crypto\Exception\IOException
162
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
163
+ */
164
+ public static function decryptResourceWithPassword($inputHandle, $outputHandle, $password)
165
+ {
166
+ self::decryptResourceInternal(
167
+ $inputHandle,
168
+ $outputHandle,
169
+ KeyOrPassword::createFromPassword($password)
170
+ );
171
+ }
172
+
173
+ /**
174
+ * Encrypts a file with either a key or a password.
175
+ *
176
+ * @param string $inputFilename
177
+ * @param string $outputFilename
178
+ * @param KeyOrPassword $secret
179
+ *
180
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
181
+ * @throws Defuse\Crypto\Exception\IOException
182
+ */
183
+ private static function encryptFileInternal($inputFilename, $outputFilename, KeyOrPassword $secret)
184
+ {
185
+ /* Open the input file. */
186
+ $if = @\fopen($inputFilename, 'rb');
187
+ if ($if === false) {
188
+ throw new Ex\IOException(
189
+ 'Cannot open input file for encrypting: ' .
190
+ self::getLastErrorMessage()
191
+ );
192
+ }
193
+ /* This call can fail, but the only consequence is performance. */
194
+ \stream_set_read_buffer($if, 0);
195
+
196
+ /* Open the output file. */
197
+ $of = @\fopen($outputFilename, 'wb');
198
+ if ($of === false) {
199
+ \fclose($if);
200
+ throw new Ex\IOException(
201
+ 'Cannot open output file for encrypting: ' .
202
+ self::getLastErrorMessage()
203
+ );
204
+ }
205
+ /* This call can fail, but the only consequence is performance. */
206
+ \stream_set_write_buffer($of, 0);
207
+
208
+ /* Perform the encryption. */
209
+ try {
210
+ self::encryptResourceInternal($if, $of, $secret);
211
+ } catch (Ex\CryptoException $ex) {
212
+ \fclose($if);
213
+ \fclose($of);
214
+ throw $ex;
215
+ }
216
+
217
+ /* Close the input file. */
218
+ if (\fclose($if) === false) {
219
+ \fclose($of);
220
+ throw new Ex\IOException(
221
+ 'Cannot close input file after encrypting'
222
+ );
223
+ }
224
+
225
+ /* Close the output file. */
226
+ if (\fclose($of) === false) {
227
+ throw new Ex\IOException(
228
+ 'Cannot close output file after encrypting'
229
+ );
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Decrypts a file with either a key or a password.
235
+ *
236
+ * @param string $inputFilename
237
+ * @param string $outputFilename
238
+ * @param KeyOrPassword $secret
239
+ *
240
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
241
+ * @throws Defuse\Crypto\Exception\IOException
242
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
243
+ */
244
+ private static function decryptFileInternal($inputFilename, $outputFilename, KeyOrPassword $secret)
245
+ {
246
+ /* Open the input file. */
247
+ $if = @\fopen($inputFilename, 'rb');
248
+ if ($if === false) {
249
+ throw new Ex\IOException(
250
+ 'Cannot open input file for decrypting: ' .
251
+ self::getLastErrorMessage()
252
+ );
253
+ }
254
+ /* This call can fail, but the only consequence is performance. */
255
+ \stream_set_read_buffer($if, 0);
256
+
257
+ /* Open the output file. */
258
+ $of = @\fopen($outputFilename, 'wb');
259
+ if ($of === false) {
260
+ \fclose($if);
261
+ throw new Ex\IOException(
262
+ 'Cannot open output file for decrypting: ' .
263
+ self::getLastErrorMessage()
264
+ );
265
+ }
266
+ /* This call can fail, but the only consequence is performance. */
267
+ \stream_set_write_buffer($of, 0);
268
+
269
+ /* Perform the decryption. */
270
+ try {
271
+ self::decryptResourceInternal($if, $of, $secret);
272
+ } catch (Ex\CryptoException $ex) {
273
+ \fclose($if);
274
+ \fclose($of);
275
+ throw $ex;
276
+ }
277
+
278
+ /* Close the input file. */
279
+ if (\fclose($if) === false) {
280
+ \fclose($of);
281
+ throw new Ex\IOException(
282
+ 'Cannot close input file after decrypting'
283
+ );
284
+ }
285
+
286
+ /* Close the output file. */
287
+ if (\fclose($of) === false) {
288
+ throw new Ex\IOException(
289
+ 'Cannot close output file after decrypting'
290
+ );
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Encrypts a resource with either a key or a password.
296
+ *
297
+ * @param resource $inputHandle
298
+ * @param resource $outputHandle
299
+ * @param KeyOrPassword $secret
300
+ *
301
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
302
+ * @throws Defuse\Crypto\Exception\IOException
303
+ */
304
+ private static function encryptResourceInternal($inputHandle, $outputHandle, KeyOrPassword $secret)
305
+ {
306
+ if (! \is_resource($inputHandle)) {
307
+ throw new Ex\IOException(
308
+ 'Input handle must be a resource!'
309
+ );
310
+ }
311
+ if (! \is_resource($outputHandle)) {
312
+ throw new Ex\IOException(
313
+ 'Output handle must be a resource!'
314
+ );
315
+ }
316
+
317
+ $inputStat = \fstat($inputHandle);
318
+ $inputSize = $inputStat['size'];
319
+
320
+ $file_salt = Core::secureRandom(Core::SALT_BYTE_SIZE);
321
+ $keys = $secret->deriveKeys($file_salt);
322
+ $ekey = $keys->getEncryptionKey();
323
+ $akey = $keys->getAuthenticationKey();
324
+
325
+ $ivsize = Core::BLOCK_BYTE_SIZE;
326
+ $iv = Core::secureRandom($ivsize);
327
+
328
+ /* Initialize a streaming HMAC state. */
329
+ $hmac = \hash_init(Core::HASH_FUNCTION_NAME, HASH_HMAC, $akey);
330
+ if ($hmac === false) {
331
+ throw new Ex\EnvironmentIsBrokenException(
332
+ 'Cannot initialize a hash context'
333
+ );
334
+ }
335
+
336
+ /* Write the header, salt, and IV. */
337
+ self::writeBytes(
338
+ $outputHandle,
339
+ Core::CURRENT_VERSION . $file_salt . $iv,
340
+ Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + $ivsize
341
+ );
342
+
343
+ /* Add the header, salt, and IV to the HMAC. */
344
+ \hash_update($hmac, Core::CURRENT_VERSION);
345
+ \hash_update($hmac, $file_salt);
346
+ \hash_update($hmac, $iv);
347
+
348
+ /* $thisIv will be incremented after each call to the encryption. */
349
+ $thisIv = $iv;
350
+
351
+ /* How many blocks do we encrypt at a time? We increment by this value. */
352
+ $inc = Core::BUFFER_BYTE_SIZE / Core::BLOCK_BYTE_SIZE;
353
+
354
+ /* Loop until we reach the end of the input file. */
355
+ $at_file_end = false;
356
+ while (! (\feof($inputHandle) || $at_file_end)) {
357
+ /* Find out if we can read a full buffer, or only a partial one. */
358
+ $pos = \ftell($inputHandle);
359
+ if ($pos === false) {
360
+ throw new Ex\IOException(
361
+ 'Could not get current position in input file during encryption'
362
+ );
363
+ }
364
+ if ($pos + Core::BUFFER_BYTE_SIZE >= $inputSize) {
365
+ /* We're at the end of the file, so we need to break out of the loop. */
366
+ $at_file_end = true;
367
+ $read = self::readBytes(
368
+ $inputHandle,
369
+ $inputSize - $pos
370
+ );
371
+ } else {
372
+ $read = self::readBytes(
373
+ $inputHandle,
374
+ Core::BUFFER_BYTE_SIZE
375
+ );
376
+ }
377
+
378
+ /* Encrypt this buffer. */
379
+ $encrypted = \openssl_encrypt(
380
+ $read,
381
+ Core::CIPHER_METHOD,
382
+ $ekey,
383
+ OPENSSL_RAW_DATA,
384
+ $thisIv
385
+ );
386
+
387
+ if ($encrypted === false) {
388
+ throw new Ex\EnvironmentIsBrokenException(
389
+ 'OpenSSL encryption error'
390
+ );
391
+ }
392
+
393
+ /* Write this buffer's ciphertext. */
394
+ self::writeBytes($outputHandle, $encrypted, Core::ourStrlen($encrypted));
395
+ /* Add this buffer's ciphertext to the HMAC. */
396
+ \hash_update($hmac, $encrypted);
397
+
398
+ /* Increment the counter by the number of blocks in a buffer. */
399
+ $thisIv = Core::incrementCounter($thisIv, $inc);
400
+ /* WARNING: Usually, unless the file is a multiple of the buffer
401
+ * size, $thisIv will contain an incorrect value here on the last
402
+ * iteration of this loop. */
403
+ }
404
+
405
+ /* Get the HMAC and append it to the ciphertext. */
406
+ $final_mac = \hash_final($hmac, true);
407
+ self::writeBytes($outputHandle, $final_mac, CORE::MAC_BYTE_SIZE);
408
+ }
409
+
410
+ /**
411
+ * Decrypts a file-backed resource with either a key or a password.
412
+ *
413
+ * @param resource $inputHandle
414
+ * @param resource $outputHandle
415
+ * @param KeyOrPassword $secret
416
+ *
417
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
418
+ * @throws Defuse\Crypto\Exception\IOException
419
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
420
+ */
421
+ public static function decryptResourceInternal($inputHandle, $outputHandle, KeyOrPassword $secret)
422
+ {
423
+ if (! \is_resource($inputHandle)) {
424
+ throw new Ex\IOException(
425
+ 'Input handle must be a resource!'
426
+ );
427
+ }
428
+ if (! \is_resource($outputHandle)) {
429
+ throw new Ex\IOException(
430
+ 'Output handle must be a resource!'
431
+ );
432
+ }
433
+
434
+ /* Make sure the file is big enough for all the reads we need to do. */
435
+ $stat = \fstat($inputHandle);
436
+ if ($stat['size'] < Core::MINIMUM_CIPHERTEXT_SIZE) {
437
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
438
+ 'Input file is too small to have been created by this library.'
439
+ );
440
+ }
441
+
442
+ /* Check the version header. */
443
+ $header = self::readBytes($inputHandle, Core::HEADER_VERSION_SIZE);
444
+ if ($header !== Core::CURRENT_VERSION) {
445
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
446
+ 'Bad version header.'
447
+ );
448
+ }
449
+
450
+ /* Get the salt. */
451
+ $file_salt = self::readBytes($inputHandle, Core::SALT_BYTE_SIZE);
452
+
453
+ /* Get the IV. */
454
+ $ivsize = Core::BLOCK_BYTE_SIZE;
455
+ $iv = self::readBytes($inputHandle, $ivsize);
456
+
457
+ /* Derive the authentication and encryption keys. */
458
+ $keys = $secret->deriveKeys($file_salt);
459
+ $ekey = $keys->getEncryptionKey();
460
+ $akey = $keys->getAuthenticationKey();
461
+
462
+ /* We'll store the MAC of each buffer-sized chunk as we verify the
463
+ * actual MAC, so that we can check them again when decrypting. */
464
+ $macs = [];
465
+
466
+ /* $thisIv will be incremented after each call to the decryption. */
467
+ $thisIv = $iv;
468
+
469
+ /* How many blocks do we encrypt at a time? We increment by this value. */
470
+ $inc = Core::BUFFER_BYTE_SIZE / Core::BLOCK_BYTE_SIZE;
471
+
472
+ /* Get the HMAC. */
473
+ if (\fseek($inputHandle, (-1 * Core::MAC_BYTE_SIZE), SEEK_END) === false) {
474
+ throw new Ex\IOException(
475
+ 'Cannot seek to beginning of MAC within input file'
476
+ );
477
+ }
478
+
479
+ /* Get the position of the last byte in the actual ciphertext. */
480
+ $cipher_end = \ftell($inputHandle);
481
+ if ($cipher_end === false) {
482
+ throw new Ex\IOException(
483
+ 'Cannot read input file'
484
+ );
485
+ }
486
+ /* We have the position of the first byte of the HMAC. Go back by one. */
487
+ --$cipher_end;
488
+
489
+ /* Read the HMAC. */
490
+ $stored_mac = self::readBytes($inputHandle, Core::MAC_BYTE_SIZE);
491
+
492
+ /* Initialize a streaming HMAC state. */
493
+ $hmac = \hash_init(Core::HASH_FUNCTION_NAME, HASH_HMAC, $akey);
494
+ if ($hmac === false) {
495
+ throw new Ex\EnvironmentIsBrokenException(
496
+ 'Cannot initialize a hash context'
497
+ );
498
+ }
499
+
500
+ /* Reset file pointer to the beginning of the file after the header */
501
+ if (\fseek($inputHandle, Core::HEADER_VERSION_SIZE, SEEK_SET) === false) {
502
+ throw new Ex\IOException(
503
+ 'Cannot read seek within input file'
504
+ );
505
+ }
506
+
507
+ /* Seek to the start of the actual ciphertext. */
508
+ if (\fseek($inputHandle, Core::SALT_BYTE_SIZE + $ivsize, SEEK_CUR) === false) {
509
+ throw new Ex\IOException(
510
+ 'Cannot seek input file to beginning of ciphertext'
511
+ );
512
+ }
513
+
514
+ /* PASS #1: Calculating the HMAC. */
515
+
516
+ \hash_update($hmac, $header);
517
+ \hash_update($hmac, $file_salt);
518
+ \hash_update($hmac, $iv);
519
+ $hmac2 = \hash_copy($hmac);
520
+
521
+ $break = false;
522
+ while (! $break) {
523
+ $pos = \ftell($inputHandle);
524
+ if ($pos === false) {
525
+ throw new Ex\IOException(
526
+ 'Could not get current position in input file during decryption'
527
+ );
528
+ }
529
+
530
+ /* Read the next buffer-sized chunk (or less). */
531
+ if ($pos + Core::BUFFER_BYTE_SIZE >= $cipher_end) {
532
+ $break = true;
533
+ $read = self::readBytes(
534
+ $inputHandle,
535
+ $cipher_end - $pos + 1
536
+ );
537
+ } else {
538
+ $read = self::readBytes(
539
+ $inputHandle,
540
+ Core::BUFFER_BYTE_SIZE
541
+ );
542
+ }
543
+
544
+ /* Update the HMAC. */
545
+ \hash_update($hmac, $read);
546
+
547
+ /* Remember this buffer-sized chunk's HMAC. */
548
+ $chunk_mac = \hash_copy($hmac);
549
+ if ($chunk_mac === false) {
550
+ throw new Ex\EnvironmentIsBrokenException(
551
+ 'Cannot duplicate a hash context'
552
+ );
553
+ }
554
+ $macs []= \hash_final($chunk_mac);
555
+ }
556
+
557
+ /* Get the final HMAC, which should match the stored one. */
558
+ $final_mac = \hash_final($hmac, true);
559
+
560
+ /* Verify the HMAC. */
561
+ if (! Core::hashEquals($final_mac, $stored_mac)) {
562
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
563
+ 'Integrity check failed.'
564
+ );
565
+ }
566
+
567
+ /* PASS #2: Decrypt and write output. */
568
+
569
+ /* Rewind to the start of the actual ciphertext. */
570
+ if (\fseek($inputHandle, Core::SALT_BYTE_SIZE + $ivsize + Core::HEADER_VERSION_SIZE, SEEK_SET) === false) {
571
+ throw new Ex\IOException(
572
+ 'Could not move the input file pointer during decryption'
573
+ );
574
+ }
575
+
576
+ $at_file_end = false;
577
+ while (! $at_file_end) {
578
+ $pos = \ftell($inputHandle);
579
+ if ($pos === false) {
580
+ throw new Ex\IOException(
581
+ 'Could not get current position in input file during decryption'
582
+ );
583
+ }
584
+
585
+ /* Read the next buffer-sized chunk (or less). */
586
+ if ($pos + Core::BUFFER_BYTE_SIZE >= $cipher_end) {
587
+ $at_file_end = true;
588
+ $read = self::readBytes(
589
+ $inputHandle,
590
+ $cipher_end - $pos + 1
591
+ );
592
+ } else {
593
+ $read = self::readBytes(
594
+ $inputHandle,
595
+ Core::BUFFER_BYTE_SIZE
596
+ );
597
+ }
598
+
599
+ /* Recalculate the MAC (so far) and compare it with the one we
600
+ * remembered from pass #1 to ensure attackers didn't change the
601
+ * ciphertext after MAC verification. */
602
+ \hash_update($hmac2, $read);
603
+ $calc_mac = \hash_copy($hmac2);
604
+ if ($calc_mac === false) {
605
+ throw new Ex\EnvironmentIsBrokenException(
606
+ 'Cannot duplicate a hash context'
607
+ );
608
+ }
609
+ $calc = \hash_final($calc_mac);
610
+
611
+ if (empty($macs)) {
612
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
613
+ 'File was modified after MAC verification'
614
+ );
615
+ } elseif (! Core::hashEquals(\array_shift($macs), $calc)) {
616
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
617
+ 'File was modified after MAC verification'
618
+ );
619
+ }
620
+
621
+ /* Decrypt this buffer-sized chunk. */
622
+ $decrypted = \openssl_decrypt(
623
+ $read,
624
+ Core::CIPHER_METHOD,
625
+ $ekey,
626
+ OPENSSL_RAW_DATA,
627
+ $thisIv
628
+ );
629
+ if ($decrypted === false) {
630
+ throw new Ex\EnvironmentIsBrokenException(
631
+ 'OpenSSL decryption error'
632
+ );
633
+ }
634
+
635
+ /* Write the plaintext to the output file. */
636
+ self::writeBytes(
637
+ $outputHandle,
638
+ $decrypted,
639
+ Core::ourStrlen($decrypted)
640
+ );
641
+
642
+ /* Increment the IV by the amount of blocks in a buffer. */
643
+ $thisIv = Core::incrementCounter($thisIv, $inc);
644
+ /* WARNING: Usually, unless the file is a multiple of the buffer
645
+ * size, $thisIv will contain an incorrect value here on the last
646
+ * iteration of this loop. */
647
+ }
648
+ }
649
+
650
+ /**
651
+ * Read from a stream; prevent partial reads.
652
+ *
653
+ * @param resource $stream
654
+ * @param int $num_bytes
655
+ *
656
+ * @throws Defuse\Crypto\Exception\IOException
657
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
658
+ *
659
+ * @return string
660
+ */
661
+ public static function readBytes($stream, $num_bytes)
662
+ {
663
+ if ($num_bytes < 0) {
664
+ throw new Ex\EnvironmentIsBrokenException(
665
+ 'Tried to read less than 0 bytes'
666
+ );
667
+ } elseif ($num_bytes === 0) {
668
+ return '';
669
+ }
670
+ $buf = '';
671
+ $remaining = $num_bytes;
672
+ while ($remaining > 0 && ! \feof($stream)) {
673
+ $read = \fread($stream, $remaining);
674
+
675
+ if ($read === false) {
676
+ throw new Ex\IOException(
677
+ 'Could not read from the file'
678
+ );
679
+ }
680
+ $buf .= $read;
681
+ $remaining -= Core::ourStrlen($read);
682
+ }
683
+ if (Core::ourStrlen($buf) !== $num_bytes) {
684
+ throw new Ex\IOException(
685
+ 'Tried to read past the end of the file'
686
+ );
687
+ }
688
+ return $buf;
689
+ }
690
+
691
+ /**
692
+ * Write to a stream; prevents partial writes.
693
+ *
694
+ * @param resource $stream
695
+ * @param string $buf
696
+ * @param int $num_bytes
697
+ *
698
+ * @throws Defuse\Crypto\Exception\IOException
699
+ *
700
+ * @return string
701
+ */
702
+ public static function writeBytes($stream, $buf, $num_bytes = null)
703
+ {
704
+ $bufSize = Core::ourStrlen($buf);
705
+ if ($num_bytes === null) {
706
+ $num_bytes = $bufSize;
707
+ }
708
+ if ($num_bytes > $bufSize) {
709
+ throw new Ex\IOException(
710
+ 'Trying to write more bytes than the buffer contains.'
711
+ );
712
+ }
713
+ if ($num_bytes < 0) {
714
+ throw new Ex\IOException(
715
+ 'Tried to write less than 0 bytes'
716
+ );
717
+ }
718
+ $remaining = $num_bytes;
719
+ while ($remaining > 0) {
720
+ $written = \fwrite($stream, $buf, $remaining);
721
+ if ($written === false) {
722
+ throw new Ex\IOException(
723
+ 'Could not write to the file'
724
+ );
725
+ }
726
+ $buf = Core::ourSubstr($buf, $written, null);
727
+ $remaining -= $written;
728
+ }
729
+ return $num_bytes;
730
+ }
731
+
732
+ /**
733
+ * Returns the last PHP error's or warning's message string.
734
+ *
735
+ * @return string
736
+ */
737
+ private static function getLastErrorMessage()
738
+ {
739
+ $error = error_get_last();
740
+ if ($error === null) {
741
+ return '[no PHP error]';
742
+ } else {
743
+ return $error['message'];
744
+ }
745
+ }
746
+ }
includes/gateways/direct-debit/libraries/php-encryption/Key.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class Key
8
+ {
9
+ const KEY_CURRENT_VERSION = "\xDE\xF0\x00\x00";
10
+ const KEY_BYTE_SIZE = 32;
11
+
12
+ private $key_bytes = null;
13
+
14
+ /**
15
+ * Creates new random key.
16
+ *
17
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
18
+ *
19
+ * @return Defuse\Crypto\Key
20
+ */
21
+ public static function createNewRandomKey()
22
+ {
23
+ return new Key(Core::secureRandom(self::KEY_BYTE_SIZE));
24
+ }
25
+
26
+ /**
27
+ * Loads a Key from its encoded form.
28
+ *
29
+ * @param string $savedKeyString
30
+ *
31
+ * @throws \Defuse\Crypto\Exception\BadFormatException
32
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
33
+ *
34
+ * @return \Defuse\Crypto\Key
35
+ */
36
+ public static function loadFromAsciiSafeString($saved_key_string)
37
+ {
38
+ $key_bytes = Encoding::loadBytesFromChecksummedAsciiSafeString(self::KEY_CURRENT_VERSION, $saved_key_string);
39
+ return new Key($key_bytes);
40
+ }
41
+
42
+ /**
43
+ * Encodes the Key into a string of printable ASCII characters.
44
+ *
45
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
46
+ *
47
+ * @return string
48
+ */
49
+ public function saveToAsciiSafeString()
50
+ {
51
+ return Encoding::saveBytesToChecksummedAsciiSafeString(
52
+ self::KEY_CURRENT_VERSION,
53
+ $this->key_bytes
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Gets the raw bytes of the key.
59
+ *
60
+ * @return string
61
+ */
62
+ public function getRawBytes()
63
+ {
64
+ return $this->key_bytes;
65
+ }
66
+
67
+ /**
68
+ * Constructs a new Key object from a string of raw bytes.
69
+ *
70
+ * @param string $bytes
71
+ *
72
+ * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
73
+ */
74
+ private function __construct($bytes)
75
+ {
76
+ if (Core::ourStrlen($bytes) !== self::KEY_BYTE_SIZE) {
77
+ throw new Ex\EnvironmentIsBrokenException(
78
+ 'Bad key length.'
79
+ );
80
+ }
81
+ $this->key_bytes = $bytes;
82
+ }
83
+
84
+ /**
85
+ * INTERNAL USE ONLY: Constructs a Key object from a string of raw bytes.
86
+ *
87
+ * @param $bytes
88
+ *
89
+ * @return \Defuse\Crypto\Key
90
+ *
91
+ * @internal
92
+ */
93
+ public static function loadFromRawBytesForTestingPurposesOnlyInsecure($bytes)
94
+ {
95
+ return new Key($bytes);
96
+ }
97
+ }
includes/gateways/direct-debit/libraries/php-encryption/KeyOrPassword.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class KeyOrPassword
8
+ {
9
+ const PBKDF2_ITERATIONS = 100000;
10
+ const SECRET_TYPE_KEY = 1;
11
+ const SECRET_TYPE_PASSWORD = 2;
12
+
13
+ private $secret_type = null;
14
+ private $secret = null;
15
+
16
+ /**
17
+ * Initializes an instance of KeyOrPassword from a key.
18
+ *
19
+ * @param Key $key
20
+ *
21
+ * @return KeyOrPassword
22
+ */
23
+ public static function createFromKey(Key $key)
24
+ {
25
+ return new KeyOrPassword(self::SECRET_TYPE_KEY, $key);
26
+ }
27
+
28
+ /**
29
+ * Initializes an instance of KeyOrPassword from a password.
30
+ *
31
+ * @param string $password
32
+ *
33
+ * @return KeyOrPassword
34
+ */
35
+ public static function createFromPassword($password)
36
+ {
37
+ return new KeyOrPassword(self::SECRET_TYPE_PASSWORD, $password);
38
+ }
39
+
40
+ /**
41
+ * Derives authentication and encryption keys from the secret, using a slow
42
+ * key derivation function if the secret is a password.
43
+ *
44
+ * @param string $salt
45
+ *
46
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
47
+ *
48
+ * @return DerivedKeys
49
+ */
50
+ public function deriveKeys($salt)
51
+ {
52
+ if (Core::ourStrlen($salt) !== Core::SALT_BYTE_SIZE) {
53
+ throw new Ex\EnvironmentIsBrokenException('Bad salt.');
54
+ }
55
+
56
+ if ($this->secret_type === self::SECRET_TYPE_KEY) {
57
+ $akey = Core::HKDF(
58
+ Core::HASH_FUNCTION_NAME,
59
+ $this->secret->getRawBytes(),
60
+ Core::KEY_BYTE_SIZE,
61
+ Core::AUTHENTICATION_INFO_STRING,
62
+ $salt
63
+ );
64
+ $ekey = Core::HKDF(
65
+ Core::HASH_FUNCTION_NAME,
66
+ $this->secret->getRawBytes(),
67
+ Core::KEY_BYTE_SIZE,
68
+ Core::ENCRYPTION_INFO_STRING,
69
+ $salt
70
+ );
71
+ return new DerivedKeys($akey, $ekey);
72
+ } elseif ($this->secret_type === self::SECRET_TYPE_PASSWORD) {
73
+ /* Our PBKDF2 polyfill is vulnerable to a DoS attack documented in
74
+ * GitHub issue #230. The fix is to pre-hash the password to ensure
75
+ * it is short. We do the prehashing here instead of in pbkdf2() so
76
+ * that pbkdf2() still computes the function as defined by the
77
+ * standard. */
78
+ $prehash = \hash(Core::HASH_FUNCTION_NAME, $this->secret, true);
79
+ $prekey = Core::pbkdf2(
80
+ Core::HASH_FUNCTION_NAME,
81
+ $prehash,
82
+ $salt,
83
+ self::PBKDF2_ITERATIONS,
84
+ Core::KEY_BYTE_SIZE,
85
+ true
86
+ );
87
+ $akey = Core::HKDF(
88
+ Core::HASH_FUNCTION_NAME,
89
+ $prekey,
90
+ Core::KEY_BYTE_SIZE,
91
+ Core::AUTHENTICATION_INFO_STRING,
92
+ $salt
93
+ );
94
+ /* Note the cryptographic re-use of $salt here. */
95
+ $ekey = Core::HKDF(
96
+ Core::HASH_FUNCTION_NAME,
97
+ $prekey,
98
+ Core::KEY_BYTE_SIZE,
99
+ Core::ENCRYPTION_INFO_STRING,
100
+ $salt
101
+ );
102
+ return new DerivedKeys($akey, $ekey);
103
+ } else {
104
+ throw new Ex\EnvironmentIsBrokenException('Bad secret type.');
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Constructor for KeyOrPassword.
110
+ *
111
+ * @param int $secret_type
112
+ * @param mixed $secret (either a Key or a password string)
113
+ */
114
+ private function __construct($secret_type, $secret)
115
+ {
116
+ $this->secret_type = $secret_type;
117
+ $this->secret = $secret;
118
+ }
119
+ }
includes/gateways/direct-debit/libraries/php-encryption/KeyProtectedByPassword.php ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ final class KeyProtectedByPassword
8
+ {
9
+ const PASSWORD_KEY_CURRENT_VERSION = "\xDE\xF1\x00\x00";
10
+
11
+ private $encrypted_key = null;
12
+
13
+ /**
14
+ * Creates a random key protected by the provided password.
15
+ *
16
+ * @param string $password
17
+ *
18
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
19
+ *
20
+ * @return KeyProtectedByPassword
21
+ */
22
+ public static function createRandomPasswordProtectedKey($password)
23
+ {
24
+ $inner_key = Key::createNewRandomKey();
25
+ /* The password is hashed as a form of poor-man's domain separation
26
+ * between this use of encryptWithPassword() and other uses of
27
+ * encryptWithPassword() that the user may also be using as part of the
28
+ * same protocol. */
29
+ $encrypted_key = Crypto::encryptWithPassword(
30
+ $inner_key->saveToAsciiSafeString(),
31
+ \hash(Core::HASH_FUNCTION_NAME, $password, true),
32
+ true
33
+ );
34
+
35
+ return new KeyProtectedByPassword($encrypted_key);
36
+ }
37
+
38
+ /**
39
+ * Loads a KeyProtectedByPassword from its encoded form.
40
+ *
41
+ * @param string $saved_key_string
42
+ *
43
+ * @throws Defuse\Crypto\Exception\BadFormatException
44
+ *
45
+ * @return KeyProtectedByPassword
46
+ */
47
+ public static function loadFromAsciiSafeString($saved_key_string)
48
+ {
49
+ $encrypted_key = Encoding::loadBytesFromChecksummedAsciiSafeString(
50
+ self::PASSWORD_KEY_CURRENT_VERSION,
51
+ $saved_key_string
52
+ );
53
+ return new KeyProtectedByPassword($encrypted_key);
54
+ }
55
+
56
+ /**
57
+ * Encodes the KeyProtectedByPassword into a string of printable ASCII
58
+ * characters.
59
+ *
60
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
61
+ *
62
+ * @return string
63
+ */
64
+ public function saveToAsciiSafeString()
65
+ {
66
+ return Encoding::saveBytesToChecksummedAsciiSafeString(
67
+ self::PASSWORD_KEY_CURRENT_VERSION,
68
+ $this->encrypted_key
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Decrypts the protected key, returning an unprotected Key object that can
74
+ * be used for encryption and decryption.
75
+ *
76
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
77
+ * @throws Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException
78
+ *
79
+ * @return Key
80
+ */
81
+ public function unlockKey($password)
82
+ {
83
+ try {
84
+ $inner_key_encoded = Crypto::decryptWithPassword(
85
+ $this->encrypted_key,
86
+ \hash(Core::HASH_FUNCTION_NAME, $password, true),
87
+ true
88
+ );
89
+ return Key::loadFromAsciiSafeString($inner_key_encoded);
90
+ } catch (Ex\BadFormatException $ex) {
91
+ /* This should never happen unless an attacker replaced the
92
+ * encrypted key ciphertext with some other ciphertext that was
93
+ * encrypted with the same password. We transform the exception type
94
+ * here in order to make the API simpler, avoiding the need to
95
+ * document that this method might throw an Ex\BadFormatException. */
96
+ throw new Ex\WrongKeyOrModifiedCiphertextException(
97
+ "The decrypted key was found to be in an invalid format. " .
98
+ "This very likely indicates it was modified by an attacker."
99
+ );
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Constructor for KeyProtectedByPassword.
105
+ *
106
+ * @param string $encrypted_key
107
+ */
108
+ private function __construct($encrypted_key)
109
+ {
110
+ $this->encrypted_key = $encrypted_key;
111
+ }
112
+ }
includes/gateways/direct-debit/libraries/php-encryption/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Taylor Hornby <https://defuse.ca> and Paragon Initiative
4
+ Enterprises <https://paragonie.com>.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
7
+ this software and associated documentation files (the "Software"), to deal in
8
+ the Software without restriction, including without limitation the rights to
9
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10
+ the Software, and to permit persons to whom the Software is furnished to do so,
11
+ subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
includes/gateways/direct-debit/libraries/php-encryption/RuntimeTests.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Defuse\Crypto;
4
+
5
+ use Defuse\Crypto\Exception as Ex;
6
+
7
+ /*
8
+ * We're using static class inheritance to get access to protected methods
9
+ * inside Crypto. To make it easy to know where the method we're calling can be
10
+ * found, within this file, prefix calls with `Crypto::` or `RuntimeTests::`,
11
+ * and don't use `self::`.
12
+ */
13
+
14
+ class RuntimeTests extends Crypto
15
+ {
16
+ /**
17
+ * Runs the runtime tests.
18
+ *
19
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
20
+ */
21
+ public static function runtimeTest()
22
+ {
23
+ // 0: Tests haven't been run yet.
24
+ // 1: Tests have passed.
25
+ // 2: Tests are running right now.
26
+ // 3: Tests have failed.
27
+ static $test_state = 0;
28
+
29
+ if ($test_state === 1 || $test_state === 2) {
30
+ return;
31
+ }
32
+
33
+ if ($test_state === 3) {
34
+ /* If an intermittent problem caused a test to fail previously, we
35
+ * want that to be indicated to the user with every call to this
36
+ * library. This way, if the user first does something they really
37
+ * don't care about, and just ignores all exceptions, they won't get
38
+ * screwed when they then start to use the library for something
39
+ * they do care about. */
40
+ throw new Ex\EnvironmentIsBrokenException('Tests failed previously.');
41
+ }
42
+
43
+ try {
44
+ $test_state = 2;
45
+
46
+ Core::ensureFunctionExists('openssl_get_cipher_methods');
47
+ if (\in_array(Core::CIPHER_METHOD, \openssl_get_cipher_methods()) === false) {
48
+ throw new Ex\EnvironmentIsBrokenException('Cipher method not supported.');
49
+ }
50
+
51
+ RuntimeTests::AESTestVector();
52
+ RuntimeTests::HMACTestVector();
53
+ RuntimeTests::HKDFTestVector();
54
+
55
+ RuntimeTests::testEncryptDecrypt();
56
+ if (Core::ourStrlen(Key::createNewRandomKey()->getRawBytes()) != Core::KEY_BYTE_SIZE) {
57
+ throw new Ex\EnvironmentIsBrokenException();
58
+ }
59
+
60
+ if (Core::ENCRYPTION_INFO_STRING == Core::AUTHENTICATION_INFO_STRING) {
61
+ throw new Ex\EnvironmentIsBrokenException();
62
+ }
63
+ } catch (Ex\EnvironmentIsBrokenException $ex) {
64
+ // Do this, otherwise it will stay in the "tests are running" state.
65
+ $test_state = 3;
66
+ throw $ex;
67
+ }
68
+
69
+ // Change this to '0' make the tests always re-run (for benchmarking).
70
+ $test_state = 1;
71
+ }
72
+
73
+ /**
74
+ * High-level tests of Crypto operations.
75
+ *
76
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
77
+ */
78
+ private static function testEncryptDecrypt()
79
+ {
80
+ $key = Key::createNewRandomKey();
81
+ $data = "EnCrYpT EvErYThInG\x00\x00";
82
+
83
+ // Make sure encrypting then decrypting doesn't change the message.
84
+ $ciphertext = Crypto::encrypt($data, $key, true);
85
+ try {
86
+ $decrypted = Crypto::decrypt($ciphertext, $key, true);
87
+ } catch (Ex\WrongKeyOrModifiedCiphertextException $ex) {
88
+ // It's important to catch this and change it into a
89
+ // Ex\EnvironmentIsBrokenException, otherwise a test failure could trick
90
+ // the user into thinking it's just an invalid ciphertext!
91
+ throw new Ex\EnvironmentIsBrokenException();
92
+ }
93
+ if ($decrypted !== $data) {
94
+ throw new Ex\EnvironmentIsBrokenException();
95
+ }
96
+
97
+ // Modifying the ciphertext: Appending a string.
98
+ try {
99
+ Crypto::decrypt($ciphertext . 'a', $key, true);
100
+ throw new Ex\EnvironmentIsBrokenException();
101
+ } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
102
+ }
103
+
104
+ // Modifying the ciphertext: Changing an HMAC byte.
105
+ $indices_to_change = [
106
+ 0, // The header.
107
+ Core::HEADER_VERSION_SIZE + 1, // the salt
108
+ Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + 1, // the IV
109
+ Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + Core::BLOCK_BYTE_SIZE + 1, // the ciphertext
110
+ ];
111
+
112
+ foreach ($indices_to_change as $index) {
113
+ try {
114
+ $ciphertext[$index] = \chr((\ord($ciphertext[$index]) + 1) % 256);
115
+ Crypto::decrypt($ciphertext, $key, true);
116
+ throw new Ex\EnvironmentIsBrokenException();
117
+ } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
118
+ }
119
+ }
120
+
121
+ // Decrypting with the wrong key.
122
+ $key = Key::createNewRandomKey();
123
+ $data = 'abcdef';
124
+ $ciphertext = Crypto::encrypt($data, $key, true);
125
+ $wrong_key = Key::createNewRandomKey();
126
+ try {
127
+ Crypto::decrypt($ciphertext, $wrong_key, true);
128
+ throw new Ex\EnvironmentIsBrokenException();
129
+ } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
130
+ }
131
+
132
+ // Ciphertext too small.
133
+ $key = Key::createNewRandomKey();
134
+ $ciphertext = \str_repeat('A', Core::MINIMUM_CIPHERTEXT_SIZE - 1);
135
+ try {
136
+ Crypto::decrypt($ciphertext, $key, true);
137
+ throw new Ex\EnvironmentIsBrokenException();
138
+ } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Test HKDF against test vectors.
144
+ *
145
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
146
+ */
147
+ private static function HKDFTestVector()
148
+ {
149
+ // HKDF test vectors from RFC 5869
150
+
151
+ // Test Case 1
152
+ $ikm = \str_repeat("\x0b", 22);
153
+ $salt = Encoding::hexToBin('000102030405060708090a0b0c');
154
+ $info = Encoding::hexToBin('f0f1f2f3f4f5f6f7f8f9');
155
+ $length = 42;
156
+ $okm = Encoding::hexToBin(
157
+ '3cb25f25faacd57a90434f64d0362f2a' .
158
+ '2d2d0a90cf1a5a4c5db02d56ecc4c5bf' .
159
+ '34007208d5b887185865'
160
+ );
161
+ $computed_okm = Core::HKDF('sha256', $ikm, $length, $info, $salt);
162
+ if ($computed_okm !== $okm) {
163
+ throw new Ex\EnvironmentIsBrokenException();
164
+ }
165
+
166
+ // Test Case 7
167
+ $ikm = \str_repeat("\x0c", 22);
168
+ $length = 42;
169
+ $okm = Encoding::hexToBin(
170
+ '2c91117204d745f3500d636a62f64f0a' .
171
+ 'b3bae548aa53d423b0d1f27ebba6f5e5' .
172
+ '673a081d70cce7acfc48'
173
+ );
174
+ $computed_okm = Core::HKDF('sha1', $ikm, $length, '', null);
175
+ if ($computed_okm !== $okm) {
176
+ throw new Ex\EnvironmentIsBrokenException();
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Test HMAC against test vectors.
182
+ *
183
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
184
+ */
185
+ private static function HMACTestVector()
186
+ {
187
+ // HMAC test vector From RFC 4231 (Test Case 1)
188
+ $key = \str_repeat("\x0b", 20);
189
+ $data = 'Hi There';
190
+ $correct = 'b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7';
191
+ if (\hash_hmac(Core::HASH_FUNCTION_NAME, $data, $key) !== $correct) {
192
+ throw new Ex\EnvironmentIsBrokenException();
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Test AES against test vectors.
198
+ *
199
+ * @throws Defuse\Crypto\Exception\EnvironmentIsBrokenException
200
+ */
201
+ private static function AESTestVector()
202
+ {
203
+ // AES CTR mode test vector from NIST SP 800-38A
204
+ $key = Encoding::hexToBin(
205
+ '603deb1015ca71be2b73aef0857d7781' .
206
+ '1f352c073b6108d72d9810a30914dff4'
207
+ );
208
+ $iv = Encoding::hexToBin('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff');
209
+ $plaintext = Encoding::hexToBin(
210
+ '6bc1bee22e409f96e93d7e117393172a' .
211
+ 'ae2d8a571e03ac9c9eb76fac45af8e51' .
212
+ '30c81c46a35ce411e5fbc1191a0a52ef' .
213
+ 'f69f2445df4f9b17ad2b417be66c3710'
214
+ );
215
+ $ciphertext = Encoding::hexToBin(
216
+ '601ec313775789a5b7a7f504bbf3d228' .
217
+ 'f443e3ca4d62b59aca84e990cacaf5c5' .
218
+ '2b0930daa23de94ce87017ba2d84988d' .
219
+ 'dfc9c58db67aada613c2dd08457941a6'
220
+ );
221
+
222
+ $computed_ciphertext = Crypto::plainEncrypt($plaintext, $key, $iv);
223
+ if ($computed_ciphertext !== $ciphertext) {
224
+ echo \str_repeat("\n", 30);
225
+ echo \bin2hex($computed_ciphertext);
226
+ echo "\n---\n";
227
+ echo \bin2hex($ciphertext);
228
+ echo \str_repeat("\n", 30);
229
+ throw new Ex\EnvironmentIsBrokenException();
230
+ }
231
+
232
+ $computed_plaintext = Crypto::plainDecrypt($ciphertext, $key, $iv, Core::CIPHER_METHOD);
233
+ if ($computed_plaintext !== $plaintext) {
234
+ throw new Ex\EnvironmentIsBrokenException();
235
+ }
236
+ }
237
+ }
includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/LICENSE RENAMED
File without changes
includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/SepaXmlCreator.php RENAMED
File without changes
includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/pain.001.002.03.xsd RENAMED
File without changes
includes/gateways/direct-debit/{sepa-xml-creator → libraries/sepa-xml-creator}/pain.008.002.02.xsd RENAMED
File without changes
includes/gateways/direct-debit/views/html-encryption-notice.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin View: SEPA Encryption Notice
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) )
7
+ exit;
8
+ ?>
9
+
10
+ <div class="wc-gzd-direct-debit-encryption-notice notice error inline">
11
+
12
+ <?php if ( version_compare( phpversion(), '5.4', '<' ) || ! extension_loaded( 'openssl' ) ) : ?>
13
+
14
+ <p><?php printf( __( 'Please upgrade your PHP Version to at least 5.4 and make sure that you have <a href="%s" target="_blank">openssl</a> enabled to support account data encryption.', 'woocommerce-germanized' ), 'http://php.net/manual/de/book.openssl.php' ); ?></p>
15
+
16
+ <?php elseif ( ! WC_GZD_Gateway_Direct_Debit_Encryption_Helper::instance()->is_configured() ) : ?>
17
+
18
+ <p><?php printf( __( 'Please insert the following code in your <a href="%s" target="_blank">wp-config.php</a> to enable encryption. You may of course choose your own key:', 'woocommerce-germanized' ), 'https://codex.wordpress.org/Editing_wp-config.php' ); ?></p>
19
+ <pre style="overflow: scroll"><code>define( 'WC_GZD_DIRECT_DEBIT_KEY', '<?php echo WC_GZD_Gateway_Direct_Debit_Encryption_Helper::instance()->get_random_key(); ?>' );</code></pre>
20
+ <p><?php printf( __( 'Your customers’ account data (IBAN, BIC) will from then on be saved <a href="%s" target="_blank">encrypted</a> within your database.', 'woocommerce-germanized' ), 'https://github.com/defuse/php-encryption/blob/master/docs/Tutorial.md#scenario-1-keep-data-secret-from-the-database-administrator' ); ?>
21
+
22
+ <?php endif; ?>
23
+
24
+ </div>
includes/trusted-shops/class-wc-gzd-trusted-shops-admin.php CHANGED
@@ -201,6 +201,15 @@ class WC_GZD_Trusted_Shops_Admin {
201
  'default' => '#C0C0C0',
202
  ),
203
 
 
 
 
 
 
 
 
 
 
204
  array(
205
  'title' => _x( 'Product Sticker Code', 'trusted-shops', 'woocommerce-germanized' ),
206
  'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_code',
@@ -426,8 +435,9 @@ class WC_GZD_Trusted_Shops_Admin {
426
  if ( get_option( 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_enable_reviews' ) === 'yes' )
427
  update_option( 'woocommerce_enable_review_rating', 'no' );
428
 
429
- if ( get_option( '_woocommerce_' . $this->base->option_prefix . 'trusted_shops_update_reviews' ) )
430
  $this->base->get_dependency( 'schedule' )->update_review_widget();
 
431
 
432
  if ( get_option( '_woocommerce_' . $this->base->option_prefix . 'trusted_shops_update_snippets' ) )
433
  $this->base->get_dependency( 'schedule' )->update_reviews();
@@ -504,7 +514,7 @@ class WC_GZD_Trusted_Shops_Admin {
504
  <label for="woocommerce_gzd_trusted_shops_review_collector"><?php echo _x( 'Export customer data', 'trusted-shops', 'woocommerce-germanized' ); ?></label>
505
  </th>
506
  <td class="forminp forminp-select">
507
- <select name="woocommerce_<?php echo $this->base->option_prefix; ?>trusted_shops_review_collector" id="woocommerce_gzd_trusted_shops_review_collector" class="chosen_select">
508
  <option value="30"><?php echo _x( '30 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
509
  <option value="60"><?php echo _x( '60 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
510
  <option value="90"><?php echo _x( '90 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
201
  'default' => '#C0C0C0',
202
  ),
203
 
204
+ array(
205
+ 'title' => _x( 'Star Size', 'trusted-shops', 'woocommerce-germanized' ),
206
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_star_size',
207
+ 'type' => 'number',
208
+ 'default' => '15',
209
+ 'desc' => __( 'px', 'trusted-shops', 'woocommerce-germanized' ),
210
+ 'css' => 'max-width:60px;',
211
+ ),
212
+
213
  array(
214
  'title' => _x( 'Product Sticker Code', 'trusted-shops', 'woocommerce-germanized' ),
215
  'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_code',
435
  if ( get_option( 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_enable_reviews' ) === 'yes' )
436
  update_option( 'woocommerce_enable_review_rating', 'no' );
437
 
438
+ if ( get_option( '_woocommerce_' . $this->base->option_prefix . 'trusted_shops_update_reviews' ) ) {
439
  $this->base->get_dependency( 'schedule' )->update_review_widget();
440
+ }
441
 
442
  if ( get_option( '_woocommerce_' . $this->base->option_prefix . 'trusted_shops_update_snippets' ) )
443
  $this->base->get_dependency( 'schedule' )->update_reviews();
514
  <label for="woocommerce_gzd_trusted_shops_review_collector"><?php echo _x( 'Export customer data', 'trusted-shops', 'woocommerce-germanized' ); ?></label>
515
  </th>
516
  <td class="forminp forminp-select">
517
+ <select name="woocommerce_<?php echo $this->base->option_prefix; ?>trusted_shops_review_collector" id="woocommerce_<?php echo $this->base->option_prefix; ?>trusted_shops_review_collector" class="chosen_select">
518
  <option value="30"><?php echo _x( '30 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
519
  <option value="60"><?php echo _x( '60 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
520
  <option value="90"><?php echo _x( '90 days', 'trusted-shops', 'woocommerce-germanized' ); ?></option>
includes/trusted-shops/class-wc-gzd-trusted-shops-schedule.php CHANGED
@@ -94,12 +94,14 @@ class WC_GZD_Trusted_Shops_Schedule {
94
  'post_content' => '',
95
  'post_status' => 'publish',
96
  );
97
-
98
- if ( ! $this->base->get_review_widget_attachment() ) {
 
 
99
  $attachment_id = wp_insert_attachment( $attachment, $filepath );
100
- update_option( 'woocommerce' . $this->base->option_prefix . '_trusted_shops_review_widget_attachment', $attachment_id );
101
  } else {
102
- $attachment_id = $this->base->get_review_widget_attachment();
103
  update_attached_file( $attachment_id, $filepath );
104
  $attachment[ 'ID' ] = $attachment_id;
105
  wp_update_post( $attachment );
94
  'post_content' => '',
95
  'post_status' => 'publish',
96
  );
97
+
98
+ $existing_attachment_id = $this->base->get_review_widget_attachment();
99
+
100
+ if ( ! $existing_attachment_id || ! get_post( $existing_attachment_id ) ) {
101
  $attachment_id = wp_insert_attachment( $attachment, $filepath );
102
+ update_option( 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_widget_attachment', $attachment_id );
103
  } else {
104
+ $attachment_id = $existing_attachment_id;
105
  update_attached_file( $attachment_id, $filepath );
106
  $attachment[ 'ID' ] = $attachment_id;
107
  wp_update_post( $attachment );
includes/updates/woocommerce-gzd-update-1.6.3.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
+ // Reset Trusted Shops Code Options
8
+ update_option( 'woocommerce_gzd_trusted_shops_integration_mode', 'standard' );
9
+ update_option( 'woocommerce_gzd_trusted_shops_product_sticker_code', WC_germanized()->trusted_shops->get_product_sticker_code( false ) );
10
+ update_option( 'woocommerce_gzd_trusted_shops_product_widget_code', WC_germanized()->trusted_shops->get_product_widget_code( false ) );
includes/wc-gzd-cart-functions.php CHANGED
@@ -11,10 +11,14 @@
11
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
12
 
13
  function wc_gzd_get_tax_rate( $tax_rate_id ) {
 
14
  global $wpdb;
 
15
  $rate = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_id = %d LIMIT 1", $tax_rate_id ) );
 
16
  if ( ! empty( $rate ) )
17
  return $rate[0];
 
18
  return false;
19
  }
20
 
@@ -26,15 +30,32 @@ function wc_gzd_get_tax_rate( $tax_rate_id ) {
26
  * @return string
27
  */
28
  function wc_gzd_cart_product_item_desc( $title, $cart_item, $cart_item_key = '' ) {
 
29
  $product_desc = "";
 
30
  if ( isset( $cart_item[ 'data' ] ) ) {
 
31
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
 
32
  if ( wc_gzd_get_gzd_product( $product )->get_mini_desc() )
33
  $product_desc = wc_gzd_get_gzd_product( $product )->get_mini_desc();
34
- } else if ( isset( $cart_item[ 'item_desc' ] ) )
 
 
35
  $product_desc = $cart_item[ 'item_desc' ];
 
 
 
 
 
 
 
 
 
 
36
  if ( ! empty( $product_desc ) )
37
  $title .= '<div class="wc-gzd-item-desc item-desc">' . do_shortcode( $product_desc ) . '</div>';
 
38
  return $title;
39
  }
40
 
@@ -46,15 +67,32 @@ function wc_gzd_cart_product_item_desc( $title, $cart_item, $cart_item_key = ''
46
  * @return string
47
  */
48
  function wc_gzd_cart_product_delivery_time( $title, $cart_item, $cart_item_key = '' ) {
 
49
  $delivery_time = "";
 
50
  if ( isset( $cart_item[ 'data' ] ) ) {
 
51
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
 
52
  if ( wc_gzd_get_gzd_product( $product )->get_delivery_time_term() )
53
  $delivery_time = wc_gzd_get_gzd_product( $product )->get_delivery_time_html();
54
- } else if ( isset( $cart_item[ 'delivery_time' ] ) )
 
 
55
  $delivery_time = $cart_item[ 'delivery_time' ];
 
 
 
 
 
 
 
 
 
 
56
  if ( ! empty( $delivery_time ) )
57
  $title .= '<p class="delivery-time-info">' . $delivery_time . '</p>';
 
58
  return $title;
59
  }
60
 
@@ -66,15 +104,33 @@ function wc_gzd_cart_product_delivery_time( $title, $cart_item, $cart_item_key =
66
  * @return string
67
  */
68
  function wc_gzd_cart_product_unit_price( $price, $cart_item, $cart_item_key = '' ) {
 
69
  $unit_price = "";
 
70
  if ( isset( $cart_item[ 'data' ] ) ) {
 
71
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
 
72
  if ( wc_gzd_get_gzd_product( $product )->has_unit() )
73
  $unit_price = wc_gzd_get_gzd_product( $product )->get_unit_html( false );
74
- } else if ( isset( $cart_item[ 'unit_price' ] ) )
 
 
75
  $unit_price = $cart_item[ 'unit_price' ];
 
 
 
 
 
 
 
 
 
 
 
76
  if ( ! empty( $unit_price ) )
77
  $price .= ' <span class="unit-price unit-price-cart">' . $unit_price . '</span>';
 
78
  return $price;
79
  }
80
 
@@ -86,15 +142,32 @@ function wc_gzd_cart_product_unit_price( $price, $cart_item, $cart_item_key = ''
86
  * @return string
87
  */
88
  function wc_gzd_cart_product_units( $title, $cart_item, $cart_item_key = '' ) {
 
89
  $units = "";
 
90
  if ( isset( $cart_item[ 'data' ] ) ) {
 
91
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
 
92
  if ( wc_gzd_get_gzd_product( $product )->has_product_units() )
93
  $units = wc_gzd_get_gzd_product( $product )->get_product_units_html();
94
- } else if ( isset( $cart_item[ 'units' ] ) )
 
 
95
  $units = $cart_item[ 'units' ];
 
 
 
 
 
 
 
 
 
 
96
  if ( ! empty( $units ) )
97
  $title .= '<p class="units-info">' . $units . '</p>';
 
98
  return $title;
99
  }
100
 
11
  if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
12
 
13
  function wc_gzd_get_tax_rate( $tax_rate_id ) {
14
+
15
  global $wpdb;
16
+
17
  $rate = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_id = %d LIMIT 1", $tax_rate_id ) );
18
+
19
  if ( ! empty( $rate ) )
20
  return $rate[0];
21
+
22
  return false;
23
  }
24
 
30
  * @return string
31
  */
32
  function wc_gzd_cart_product_item_desc( $title, $cart_item, $cart_item_key = '' ) {
33
+
34
  $product_desc = "";
35
+
36
  if ( isset( $cart_item[ 'data' ] ) ) {
37
+
38
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
39
+
40
  if ( wc_gzd_get_gzd_product( $product )->get_mini_desc() )
41
  $product_desc = wc_gzd_get_gzd_product( $product )->get_mini_desc();
42
+
43
+ } else if ( isset( $cart_item[ 'item_desc' ] ) ) {
44
+
45
  $product_desc = $cart_item[ 'item_desc' ];
46
+
47
+ } else if ( isset( $cart_item[ 'product_id' ] ) ) {
48
+
49
+ $product = wc_get_product( ! empty( $cart_item[ 'variation_id' ] ) ? $cart_item[ 'variation_id' ] : $cart_item[ 'product_id' ] );
50
+
51
+ if ( $product && wc_gzd_get_gzd_product( $product )->get_mini_desc() )
52
+ $product_desc = wc_gzd_get_gzd_product( $product )->get_mini_desc();
53
+
54
+ }
55
+
56
  if ( ! empty( $product_desc ) )
57
  $title .= '<div class="wc-gzd-item-desc item-desc">' . do_shortcode( $product_desc ) . '</div>';
58
+
59
  return $title;
60
  }
61
 
67
  * @return string
68
  */
69
  function wc_gzd_cart_product_delivery_time( $title, $cart_item, $cart_item_key = '' ) {
70
+
71
  $delivery_time = "";
72
+
73
  if ( isset( $cart_item[ 'data' ] ) ) {
74
+
75
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
76
+
77
  if ( wc_gzd_get_gzd_product( $product )->get_delivery_time_term() )
78
  $delivery_time = wc_gzd_get_gzd_product( $product )->get_delivery_time_html();
79
+
80
+ } else if ( isset( $cart_item[ 'delivery_time' ] ) ) {
81
+
82
  $delivery_time = $cart_item[ 'delivery_time' ];
83
+
84
+ } else if ( isset( $cart_item[ 'product_id' ] ) ) {
85
+
86
+ $product = wc_get_product( ! empty( $cart_item[ 'variation_id' ] ) ? $cart_item[ 'variation_id' ] : $cart_item[ 'product_id' ] );
87
+
88
+ if ( $product && wc_gzd_get_gzd_product( $product )->get_delivery_time_term() )
89
+ $delivery_time = wc_gzd_get_gzd_product( $product )->get_delivery_time_html();
90
+
91
+ }
92
+
93
  if ( ! empty( $delivery_time ) )
94
  $title .= '<p class="delivery-time-info">' . $delivery_time . '</p>';
95
+
96
  return $title;
97
  }
98
 
104
  * @return string
105
  */
106
  function wc_gzd_cart_product_unit_price( $price, $cart_item, $cart_item_key = '' ) {
107
+
108
  $unit_price = "";
109
+
110
  if ( isset( $cart_item[ 'data' ] ) ) {
111
+
112
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
113
+
114
  if ( wc_gzd_get_gzd_product( $product )->has_unit() )
115
  $unit_price = wc_gzd_get_gzd_product( $product )->get_unit_html( false );
116
+
117
+ } else if ( isset( $cart_item[ 'unit_price' ] ) ) {
118
+
119
  $unit_price = $cart_item[ 'unit_price' ];
120
+
121
+
122
+ } else if ( isset( $cart_item[ 'product_id' ] ) ) {
123
+
124
+ $product = wc_get_product( ! empty( $cart_item[ 'variation_id' ] ) ? $cart_item[ 'variation_id' ] : $cart_item[ 'product_id' ] );
125
+
126
+ if ( $product && wc_gzd_get_gzd_product( $product )->has_unit() )
127
+ $unit_price = wc_gzd_get_gzd_product( $product )->get_unit_html( false );
128
+
129
+ }
130
+
131
  if ( ! empty( $unit_price ) )
132
  $price .= ' <span class="unit-price unit-price-cart">' . $unit_price . '</span>';
133
+
134
  return $price;
135
  }
136
 
142
  * @return string
143
  */
144
  function wc_gzd_cart_product_units( $title, $cart_item, $cart_item_key = '' ) {
145
+
146
  $units = "";
147
+
148
  if ( isset( $cart_item[ 'data' ] ) ) {
149
+
150
  $product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
151
+
152
  if ( wc_gzd_get_gzd_product( $product )->has_product_units() )
153
  $units = wc_gzd_get_gzd_product( $product )->get_product_units_html();
154
+
155
+ } else if ( isset( $cart_item[ 'units' ] ) ) {
156
+
157
  $units = $cart_item[ 'units' ];
158
+
159
+ } else if ( isset( $cart_item[ 'product_id' ] ) ) {
160
+
161
+ $product = wc_get_product( ! empty( $cart_item[ 'variation_id' ] ) ? $cart_item[ 'variation_id' ] : $cart_item[ 'product_id' ] );
162
+
163
+ if ( $product && wc_gzd_get_gzd_product( $product )->has_product_units() )
164
+ $units = wc_gzd_get_gzd_product( $product )->get_product_units_html();
165
+
166
+ }
167
+
168
  if ( ! empty( $units ) )
169
  $title .= '<p class="units-info">' . $units . '</p>';
170
+
171
  return $title;
172
  }
173
 
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: vendidero
3
  Tags: woocommerce, german market, german, germany, deutsch, deutschland, de, de_DE, shop, commerce, e-commerce, ecommerce, woothemes, sepa, invoice
4
  Requires at least: 3.8
5
  Tested up to: 4.5
6
- Stable tag: 1.6.2
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -157,6 +157,14 @@ Bug reports may be filed via our [GitHub repository](https://github.com/vendider
157
 
158
  == Changelog ==
159
 
 
 
 
 
 
 
 
 
160
  = 1.6.2 =
161
  * Fix - Trusted Shops PHP < 5.4 backwards compatibility
162
  * Fix - Prevent showing terms twice before AJAX call
3
  Tags: woocommerce, german market, german, germany, deutsch, deutschland, de, de_DE, shop, commerce, e-commerce, ecommerce, woothemes, sepa, invoice
4
  Requires at least: 3.8
5
  Tested up to: 4.5
6
+ Stable tag: 1.6.3
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
157
 
158
  == Changelog ==
159
 
160
+ = 1.6.3 =
161
+ * Feature - Encryption for Direct Debit Gateway data
162
+ * Feature - Install German Formal Language (see Systemstatus > Germanized > Tools)
163
+ * Feature - Tool to delete Germanized Text Options (will we replaced by defaults)
164
+ * Fix - Double-Opt-In even if checkout shouldn't be disabled
165
+ * Fix - Trusted Shops Template SKU Parameter
166
+ * Fix - Trusted Shops Product Sticker Star Size
167
+
168
  = 1.6.2 =
169
  * Fix - Trusted Shops PHP < 5.4 backwards compatibility
170
  * Fix - Prevent showing terms twice before AJAX call
templates/trusted-shops/product-sticker-tpl.php CHANGED
@@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  <script type="text/javascript">
12
  _tsProductReviewsConfig = {
13
  tsid: '{id}',
14
- sku: [{sku}],
15
  variant: 'productreviews',
16
  borderColor: '{border_color}',
17
  locale: '{locale}',
11
  <script type="text/javascript">
12
  _tsProductReviewsConfig = {
13
  tsid: '{id}',
14
+ sku: ['{sku}'],
15
  variant: 'productreviews',
16
  borderColor: '{border_color}',
17
  locale: '{locale}',
templates/trusted-shops/product-widget-tpl.php CHANGED
@@ -11,11 +11,11 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  var summaryBadge = new productStickerSummary();
12
  summaryBadge.showSummary({
13
  'tsId': '{id}',
14
- 'sku': [{sku}],
15
  'element': '{element}',
16
  'starColor' : '{star_color}',
17
  'starSize' : '{star_size}px',
18
  'fontSize' : '{font_size}px',
19
  'showRating' : 'true',
20
- 'scrollToReviews' : 'false',
21
  });</script>
11
  var summaryBadge = new productStickerSummary();
12
  summaryBadge.showSummary({
13
  'tsId': '{id}',
14
+ 'sku': ['{sku}'],
15
  'element': '{element}',
16
  'starColor' : '{star_color}',
17
  'starSize' : '{star_size}px',
18
  'fontSize' : '{font_size}px',
19
  'showRating' : 'true',
20
+ 'scrollToReviews' : 'false'
21
  });</script>
woocommerce-germanized.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: WooCommerce Germanized
4
  * Plugin URI: https://www.vendidero.de/woocommerce-germanized
5
  * Description: Extends WooCommerce to become a legally compliant store for the german market.
6
- * Version: 1.6.2
7
  * Author: Vendidero
8
  * Author URI: https://vendidero.de
9
  * Requires at least: 3.8
@@ -26,7 +26,7 @@ final class WooCommerce_Germanized {
26
  *
27
  * @var string
28
  */
29
- public $version = '1.6.2';
30
 
31
  /**
32
  * Single instance of WooCommerce Germanized Main Class
@@ -228,10 +228,14 @@ final class WooCommerce_Germanized {
228
 
229
  if ( strpos( $class, 'wc_gzd_admin' ) !== false )
230
  $path = $this->plugin_path() . '/includes/admin/';
231
- elseif ( strpos( $class, 'wc_gzd_gateway_' ) !== false )
232
  $path = $this->plugin_path() . '/includes/gateways/' . substr( str_replace( '_', '-', $class ), 15 ) . '/';
233
  else if ( strpos( $class, 'wc_gzd_trusted_shops' ) !== false )
234
  $path = $this->plugin_path() . '/includes/trusted-shops/';
 
 
 
 
235
 
236
  if ( $path && is_readable( $path . $file ) ) {
237
  include_once( $path . $file );
3
  * Plugin Name: WooCommerce Germanized
4
  * Plugin URI: https://www.vendidero.de/woocommerce-germanized
5
  * Description: Extends WooCommerce to become a legally compliant store for the german market.
6
+ * Version: 1.6.3
7
  * Author: Vendidero
8
  * Author URI: https://vendidero.de
9
  * Requires at least: 3.8
26
  *
27
  * @var string
28
  */
29
+ public $version = '1.6.3';
30
 
31
  /**
32
  * Single instance of WooCommerce Germanized Main Class
228
 
229
  if ( strpos( $class, 'wc_gzd_admin' ) !== false )
230
  $path = $this->plugin_path() . '/includes/admin/';
231
+ else if ( strpos( $class, 'wc_gzd_gateway_' ) !== false )
232
  $path = $this->plugin_path() . '/includes/gateways/' . substr( str_replace( '_', '-', $class ), 15 ) . '/';
233
  else if ( strpos( $class, 'wc_gzd_trusted_shops' ) !== false )
234
  $path = $this->plugin_path() . '/includes/trusted-shops/';
235
+ else if ( strpos( $class, 'defuse\crypto' ) !== false ) {
236
+ $path = $this->plugin_path() . '/includes/gateways/direct-debit/libraries/php-encryption/';
237
+ $file = str_replace( 'defuse/crypto/', '', str_replace( '\\', '/', $class ) ) . '.php';
238
+ }
239
 
240
  if ( $path && is_readable( $path . $file ) ) {
241
  include_once( $path . $file );