From 7286459ff280f9a1b011354b3ef96c5c9118ff46 Mon Sep 17 00:00:00 2001 From: magdev Date: Tue, 27 Jan 2026 19:23:42 +0100 Subject: [PATCH] Version 1.3.1 - Switch to SecureLicenseClient with signature verification - Upgraded from LicenseClient to SecureLicenseClient with HMAC-SHA256 response signature verification - Added Server Secret configuration field for secure communication - Added rate limit exception handling with retry time display - Added signature verification error handling - Added URL validation error handling (SSRF protection) - Updated all translation files with new strings - Compiled .mo files for all 7 language variants Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 40 ++++++++ composer.json | 4 +- includes/class-wc-tpp-settings.php | 88 +++++++++++++++--- languages/wc-tier-package-prices-de_CH.mo | Bin 8529 -> 9257 bytes languages/wc-tier-package-prices-de_CH.po | 29 +++++- .../wc-tier-package-prices-de_CH_informal.mo | Bin 8500 -> 9214 bytes .../wc-tier-package-prices-de_CH_informal.po | 29 +++++- languages/wc-tier-package-prices-de_DE.mo | Bin 8497 -> 9225 bytes languages/wc-tier-package-prices-de_DE.po | 29 +++++- .../wc-tier-package-prices-de_DE_informal.mo | Bin 8467 -> 9181 bytes .../wc-tier-package-prices-de_DE_informal.po | 29 +++++- languages/wc-tier-package-prices-en_US.mo | Bin 8219 -> 8865 bytes languages/wc-tier-package-prices-en_US.po | 29 +++++- languages/wc-tier-package-prices-fr_CH.mo | Bin 9110 -> 9820 bytes languages/wc-tier-package-prices-fr_CH.po | 29 +++++- languages/wc-tier-package-prices-it_CH.mo | Bin 8808 -> 9522 bytes languages/wc-tier-package-prices-it_CH.po | 29 +++++- languages/wc-tier-package-prices.pot | 29 +++++- wc-tier-and-package-prices.php | 4 +- 19 files changed, 317 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da31509..1e359e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,46 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.1] - 2026-01-27 + +### Changed + +- **Switched to SecureLicenseClient**: Upgraded from basic `LicenseClient` to `SecureLicenseClient` with HMAC-SHA256 response signature verification for enhanced security against tampering and replay attacks + +- **Added Server Secret Configuration**: New "Server Secret" field in License settings for secure communication with the license server + +### Added + +- **Rate Limit Handling**: Added proper handling of `RateLimitExceededException` with user-friendly messages showing retry wait time +- **Signature Verification Error Handling**: Added dedicated handling for `SignatureException` when response signatures fail verification +- **URL Validation Error Handling**: Added handling for `InvalidArgumentException` from SSRF protection in the license client + +### Security + +- Response signatures are now verified using HMAC-SHA256 with license-specific derived keys (RFC 5869 HKDF) +- The license client now validates server URLs to prevent SSRF attacks (blocks private IP ranges) +- HTTP connections require HTTPS unless explicitly allowed for localhost testing + +### Technical Details + +**License Client Upgrade**: + +- Changed from `LicenseClient` to `SecureLicenseClient` +- Added `serverSecret` parameter for signature verification +- Library updated from `v0.1.0` to `dev-main` with new security features + +**New Exception Handling**: + +- `RateLimitExceededException` - shows retry time to user +- `SignatureException` - indicates server secret mismatch +- `InvalidArgumentException` - invalid/blocked URL detected + +**New Settings Field**: + +- `wc_tpp_license_server_secret` (password type) for the shared secret + +--- + ## [1.3.0] - 2026-01-25 ### Breaking Changes diff --git a/composer.json b/composer.json index ea78249..9f10730 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "magdev/wc-tier-package-prices", "description": "WooCommerce plugin for tier pricing and package prices with Twig templates", - "version": "1.3.0", + "version": "1.3.1", "type": "wordpress-plugin", "license": "GPL-2.0-or-later", "authors": [ @@ -19,7 +19,7 @@ "require": { "php": ">=8.3", "twig/twig": "^3.0", - "magdev/wc-licensed-product-client": "^0.1" + "magdev/wc-licensed-product-client": "dev-main" }, "autoload": { "classmap": [ diff --git a/includes/class-wc-tpp-settings.php b/includes/class-wc-tpp-settings.php index c962cf8..6783ab4 100755 --- a/includes/class-wc-tpp-settings.php +++ b/includes/class-wc-tpp-settings.php @@ -154,6 +154,16 @@ if (!class_exists('WC_TPP_Settings')) { 'desc_tip' => true, ), + array( + 'title' => __('Server Secret', 'wc-tier-package-prices'), + 'desc' => __('The shared secret for secure communication with the license server.', 'wc-tier-package-prices'), + 'id' => 'wc_tpp_license_server_secret', + 'type' => 'password', + 'default' => '', + 'css' => 'min-width:400px;', + 'desc_tip' => true, + ), + array( 'title' => __('License Status', 'wc-tier-package-prices'), 'type' => 'wc_tpp_license_status', @@ -188,13 +198,14 @@ if (!class_exists('WC_TPP_Settings')) { $license_key = sanitize_text_field(wp_unslash($_POST['license_key'] ?? '')); $server_url = esc_url_raw(wp_unslash($_POST['server_url'] ?? '')); + $server_secret = sanitize_text_field(wp_unslash($_POST['server_secret'] ?? '')); - if (empty($license_key) || empty($server_url)) { - wp_send_json_error(array('message' => __('License key and server URL are required.', 'wc-tier-package-prices'))); + if (empty($license_key) || empty($server_url) || empty($server_secret)) { + wp_send_json_error(array('message' => __('License key, server URL, and server secret are required.', 'wc-tier-package-prices'))); } try { - $client = $this->get_license_client($server_url); + $client = $this->get_license_client($server_url, $server_secret); $domain = $this->get_current_domain(); $result = $client->validate($license_key, $domain); @@ -212,16 +223,37 @@ if (!class_exists('WC_TPP_Settings')) { 'status' => $this->get_cached_license_status(), )); + } catch (\Magdev\WcLicensedProductClient\Exception\RateLimitExceededException $e) { + wp_send_json_error(array( + 'message' => sprintf( + /* translators: %d: Number of seconds to wait */ + __('Rate limit exceeded. Please try again in %d seconds.', 'wc-tier-package-prices'), + $e->retryAfter ?? 60 + ), + 'code' => 'rate_limit_exceeded', + 'retry_after' => $e->retryAfter, + )); + } catch (\Magdev\WcLicensedProductClient\Security\SignatureException $e) { + delete_transient('wc_tpp_license_status'); + wp_send_json_error(array( + 'message' => __('Response signature verification failed. Please check your server secret.', 'wc-tier-package-prices'), + 'code' => 'signature_error', + )); } catch (\Magdev\WcLicensedProductClient\Exception\LicenseException $e) { delete_transient('wc_tpp_license_status'); wp_send_json_error(array( 'message' => $e->getMessage(), 'code' => $e->errorCode ?? 'unknown', )); + } catch (\InvalidArgumentException $e) { + wp_send_json_error(array( + 'message' => $e->getMessage(), + 'code' => 'invalid_url', + )); } catch (\Exception $e) { delete_transient('wc_tpp_license_status'); wp_send_json_error(array( - 'message' => $e->getMessage(), + 'message' => __('An unexpected error occurred. Please try again.', 'wc-tier-package-prices'), 'code' => 'exception', )); } @@ -239,13 +271,14 @@ if (!class_exists('WC_TPP_Settings')) { $license_key = sanitize_text_field(wp_unslash($_POST['license_key'] ?? '')); $server_url = esc_url_raw(wp_unslash($_POST['server_url'] ?? '')); + $server_secret = sanitize_text_field(wp_unslash($_POST['server_secret'] ?? '')); - if (empty($license_key) || empty($server_url)) { - wp_send_json_error(array('message' => __('License key and server URL are required.', 'wc-tier-package-prices'))); + if (empty($license_key) || empty($server_url) || empty($server_secret)) { + wp_send_json_error(array('message' => __('License key, server URL, and server secret are required.', 'wc-tier-package-prices'))); } try { - $client = $this->get_license_client($server_url); + $client = $this->get_license_client($server_url, $server_secret); $domain = $this->get_current_domain(); $result = $client->activate($license_key, $domain); @@ -269,14 +302,34 @@ if (!class_exists('WC_TPP_Settings')) { wp_send_json_error(array('message' => $result->message)); + } catch (\Magdev\WcLicensedProductClient\Exception\RateLimitExceededException $e) { + wp_send_json_error(array( + 'message' => sprintf( + /* translators: %d: Number of seconds to wait */ + __('Rate limit exceeded. Please try again in %d seconds.', 'wc-tier-package-prices'), + $e->retryAfter ?? 60 + ), + 'code' => 'rate_limit_exceeded', + 'retry_after' => $e->retryAfter, + )); + } catch (\Magdev\WcLicensedProductClient\Security\SignatureException $e) { + wp_send_json_error(array( + 'message' => __('Response signature verification failed. Please check your server secret.', 'wc-tier-package-prices'), + 'code' => 'signature_error', + )); } catch (\Magdev\WcLicensedProductClient\Exception\LicenseException $e) { wp_send_json_error(array( 'message' => $e->getMessage(), 'code' => $e->errorCode ?? 'unknown', )); - } catch (\Exception $e) { + } catch (\InvalidArgumentException $e) { wp_send_json_error(array( 'message' => $e->getMessage(), + 'code' => 'invalid_url', + )); + } catch (\Exception $e) { + wp_send_json_error(array( + 'message' => __('An unexpected error occurred. Please try again.', 'wc-tier-package-prices'), 'code' => 'exception', )); } @@ -285,14 +338,18 @@ if (!class_exists('WC_TPP_Settings')) { /** * Get license client instance * - * @param string $server_url License server URL. + * Uses SecureLicenseClient for HMAC signature verification. + * + * @param string $server_url License server URL. + * @param string $server_secret Shared secret for signature verification. * @return \Magdev\WcLicensedProductClient\LicenseClientInterface */ - private function get_license_client(string $server_url): \Magdev\WcLicensedProductClient\LicenseClientInterface { + private function get_license_client(string $server_url, string $server_secret): \Magdev\WcLicensedProductClient\LicenseClientInterface { $httpClient = \Symfony\Component\HttpClient\HttpClient::create(); - return new \Magdev\WcLicensedProductClient\LicenseClient( + return new \Magdev\WcLicensedProductClient\SecureLicenseClient( httpClient: $httpClient, baseUrl: $server_url, + serverSecret: $server_secret, ); } @@ -402,6 +459,7 @@ if (!class_exists('WC_TPP_Settings')) { return { license_key: $('#wc_tpp_license_key').val(), server_url: $('#wc_tpp_license_server_url').val(), + server_secret: $('#wc_tpp_license_server_secret').val(), nonce: '' }; } @@ -420,8 +478,8 @@ if (!class_exists('WC_TPP_Settings')) { $validateBtn.on('click', function() { var data = getLicenseData(); - if (!data.license_key || !data.server_url) { - alert(''); + if (!data.license_key || !data.server_url || !data.server_secret) { + alert(''); return; } @@ -443,8 +501,8 @@ if (!class_exists('WC_TPP_Settings')) { $activateBtn.on('click', function() { var data = getLicenseData(); - if (!data.license_key || !data.server_url) { - alert(''); + if (!data.license_key || !data.server_url || !data.server_secret) { + alert(''); return; } diff --git a/languages/wc-tier-package-prices-de_CH.mo b/languages/wc-tier-package-prices-de_CH.mo index 977eefd6463fc966285dfa880f165378cb0b6a5a..289760614f8d94bc9a6bb9dbce8173a5b52b90eb 100644 GIT binary patch delta 2768 zcmZwHYiv|S6u|N6Qfw6{wbb%xu~VQt+lBHdt;nMfXt98l0)jQdx;xvww!Pcjy(>^+ z7KtVV6+bMBF$N48MT7WZ)j(3BNsVHH2@?526dws1jmCsD8e>5J=k8rX0+XKo&D_U4 z&dlxC&F{9Su9W1ztSH??1u+s(Duw4q^FujTpj0t_i6wX$$KW4Wi2vZd7@#o;OHuCE zVhkJ6;BlOfg?DHBX~4-cR0oxEZWvsK&)`8ki=Ehhk5YB`8t%mNC=;q>l>2Z6HsEF~ z!xwP^zJ;^#G-~`2>oG7kJHbXzmb#h>i%^{?9dGx2(s!?a{{<}K{$U)CZz6rF3`%A` z@x6%h+*Pc^5tIy-j>}GTCdxQFFes@Wpu#iin1ACWmeM|plCq1)p9;{c3|x%T)+hr9 zaTPY9?Am_hPaWWgtg9oq7~jCV@Df(xx0q_Da)ZkK*hcS?vM6#%y@WE*Q5?jR7{ysk zKa7V^I=+VT{w$Um!Zp}}Cs4NNca-}9W-AM=Ldig|g#DKltn_be@^9=w#!>_LA@0M+ zaS0o{84shZ>{pbPT=UzdrAl!;)KugZH5=u*Whg6eMVUYcex9e)wo>xXG8$r*SFmdX$cBYSR3tUWP*U?Y%HCvrKl8oh`!mXOf1|80pMM&XscG1X^(d*|i;M9P%Jaj%7f>eh z9dg!EYJ`f+cq+Zg=QIyx50|2J+>G0BE6VBq0A-6l^4nkFL$tp_S@9(HsUD}HoSE&& z5b89}!b>O%yza^V7x9t4%7sdFP>S@^Nyt{T5V_)=F&Z+yS0rVti6%l$<_4mb$d%1h%EfC zuS`&iq?p91M~GF#MnbZ*lGsAXgk_uL&`Iea_}`H7J`YLT0z%Tcf{?O|Aagg1tW3%% zVy#!pu3EmH`GjPshUg}w$eEEMTTn+Vmxf>3FzD4;|6Knf=fNxTd9f4T9yVq#sdkh@ zx6W@b@!f>AL<6A-Db<7=G&wVc1Yfl3BAN-=zBz=HdGeF4E*PI)P>|oWoratW+0aJ` z`A7qV9C<11saojOvLC!uw-Rzf*ANe8k_9b!!6sWLZL@p8gk2NS#&P0~j)%iZ$1#zh z-q>eC38P(Sj}G;OEIadY;lHCQYjnamPZ>vV*|e@khwMnMoiJg?xam*F-dNaYg^kUt zw?3J>)@%0M>9wolsuqP@qx-CW%hhIg*qF$jCZR1`SId~;xE)CZ)A>cUtpjmyFssK7 zxk<-pW@kmMaLBddwvL9ZzFRs9$4t0a?};a!-0b{$*A#V+@z&Mltt0bn(T%+37;A`y z$c7Ba>U5M0QI%1`@&5j#of~GC<;Jwj^SO0q*B;F5D?T~8dNs2q)6TAt;~JObtue7a zuoA8gC8IsYmDE*KOwZJm_2gI8=q@kEwd9!hBDrRpi5aWkwi4;%Q~qm-SVph228}(K z9ZR0B(Gg?ku7+cM!$XOL>GS%Cgc7&+bGdxR`sOM#hb!g=HncMD9@B3uI}z$P`sQ679UgMDBq3q3tL#Wec1L=% a8!zW5V)}E*@DdtS=?fFfGT+?)bl`ujuE2@_ delta 2114 zcmYk-TWl0n9LMpqZPzWO?b@Z4s@rx7RjANbC}1yOZHvmKAe7Q*f`+x7b{p4LcPmJv zZWY1AC(Ho)B8e|bA2g9A1f$|Z1uvK&1~ELS)kKN6CwWk7s^8!2*@Tn%&*#i#XU_Sb zb7rSDT8*v7UmFjRw_CgfPIc~rv>_Rq^WTzKT+T%m07azmb_%3R+ zuA&<72a;6tFW!JbPS#>ER%0WoL0d3Qm_6(!@Bj{>-ZlWkxC+mseyHZhpawMr&!f)2 zigd=DLN+taP7SFpP(`|i|X;iEDauI9>=?IKk^gvewqrK`HEdV{)V?> z1#3hvSc?p!IfyI>bJ%(e^?>8ZJIqH&r_48~jQozu$e&2oSw>mQtc$GaW-7XIJ*tP> zQ7Ib3mAD_tra6VH@H5o?bJqFfR}HB|O{ykTgC9h#k|EU4B~j0P7PsOn$fQl187dl^ zpR*^-U#OnW;TkODtE3N82fHP>3)Q0+@ijbxNo=I`yYLNc!#Sjlrj_v>!9G+&&tM&X zjU`(D|4>oO3R$$uKos?YHdIeGqk8-h9>*cvjbSJIWqShE!^@}){D6G)Oc66!9f_ba z7)52I2{lCRSemBNMJ0eLdQcCcNz_5)iYBKf()Fd&9&Eym#69*{Xfi5$D$0UN0ig`4 zkX(P_r+cZaBQ_Hoh_%EvLPMgW%&6Q)Xo4*wl#M1rGrFBnX(b$DHE{=_%&FuP>-}1` z*DI+v63WmrjeozrxWmeDnmcVhM>mxQdr)uHP^oD4lR!VkEjmHDm(UR2uLFuEuF4i- zIiV%UC{kF=nhaWUtQ7y_!wU3g=-sICTk1U-THsBF3Uble$61Y}%1%PlioZ?&BMkl* zVudP{+p_q7X{vS+ZJD#7?m(tx-rxCQCpJ3hq}=2lH|gx`?eVsi%q@9zY&`BHMh4u` zlzZJZ|JK~;$J~A1WNEE;xpbMgDcqlVCp;VQ@+0M$K;&pJ^Zml%0`E{&uxN+>*f6qiU;JK diff --git a/languages/wc-tier-package-prices-de_CH.po b/languages/wc-tier-package-prices-de_CH.po index 4a0b7b5..a61bc70 100644 --- a/languages/wc-tier-package-prices-de_CH.po +++ b/languages/wc-tier-package-prices-de_CH.po @@ -359,12 +359,33 @@ msgid "Permission denied." msgstr "Zugriff verweigert." #: includes/class-wc-tpp-settings.php -msgid "License key and server URL are required." -msgstr "Lizenzschlüssel und Server-URL sind erforderlich." +msgid "Server Secret" +msgstr "Server-Geheimnis" #: includes/class-wc-tpp-settings.php -msgid "Please enter both license server URL and license key." -msgstr "Bitte geben Sie sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein." +msgid "The shared secret for secure communication with the license server." +msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "License key, server URL, and server secret are required." +msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich." + +#: includes/class-wc-tpp-settings.php +#. translators: %d: Number of seconds to wait +msgid "Rate limit exceeded. Please try again in %d seconds." +msgstr "Anfragelimit überschritten. Bitte versuchen Sie es in %d Sekunden erneut." + +#: includes/class-wc-tpp-settings.php +msgid "Response signature verification failed. Please check your server secret." +msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfen Sie Ihr Server-Geheimnis." + +#: includes/class-wc-tpp-settings.php +msgid "An unexpected error occurred. Please try again." +msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut." + +#: includes/class-wc-tpp-settings.php +msgid "Please enter license server URL, license key, and server secret." +msgstr "Bitte geben Sie die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein." #: includes/class-wc-tpp-settings.php msgid "Validation failed." diff --git a/languages/wc-tier-package-prices-de_CH_informal.mo b/languages/wc-tier-package-prices-de_CH_informal.mo index aa35d06e86b71f4ee813afc868cbcb44c4086d0b..64b6c143c74ffcde5abcfbced02a4309e718d594 100644 GIT binary patch delta 2782 zcmZwHd2Ccg9KiAEQf#?O!E#6oOo39Ab~#Ep;zCT+2qJ%&2$5v*AeNvuCX!%GNchJPgCQ7<8Vw;asA>HE-o9;6ne?}xdFRaU zH}iU~vA?C~`_YBR6m17lLEH%`)q|G@^F#Z(NU2i1gro609EQJQG2X>d7~)_&mZ4m) z#RM)wgC}to77xk2XCXc$L$%T==Yqi{_#D217jOfv9;(zFd=sC-%P147Wt1_v3>V@i z9E*qWK|F;s@Ke2VtWW0k?p|TOViB3luXBUR0)LnGAM;#9?oW?SaFQAm{3i78yyj2D+MLE_e z1BY=1HlVE9^T?linIEdI-oSZy0w2JuSc%uLXEmLEI+L)4w@b-l$SHLgWuSMk8&6{l ztC@ZTUqgBEZItJ$Nz=krxDww-S)yN1u7{YdBwC45f$(V7Uou!8T-X>~*oBOxy6_wx zz@1pn!fwK&D4G3)lF9AhxU5VmwuhRCJfdcx+_wZJ^CpxDwBok~N^LEp{!C8IVCTpt zT#RzO1$n1R;5gimlEG1w%4E^QFEN1&xTz6OAg9y~oQQv-JU5RL^cYQksJ(rFk7?ZH@{T~MQ zqDJrjb?Us%#K)|opf}}vODg1Q6ym^?RsA_?dE3}%)6#!$1p#yHb0N-izWR9jR|r{ zSX4s>Bs(3WLUd)6NV2mt?c|5qV|xkhaeqF~T<+oQfzpo#S2Z(hD(&vET+etEZomywo^s633*yaOPI|((Qe3^Kh5j*BeVaaUCU}2FKfzbiGut6gozlal`vN7;)hB z{-FMIhNmb^knKQv;Y>rtL}GF2f3IY_D`tk)Hj!K0bnNI-bIUVckb+yzbWix#i asWrDq?YX@mTPtch|5dec_SB>!p??4b^~W#( delta 2098 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 YX6a=oMNQAY3KUKcl$Q(+lqW-f0|ait%K!iX delta 2088 zcmYk-ZEO@p9LMpw_O554*OSurr1W8{6pFP)C=bVzwFSjutI(E9NR0Mu4^Ay@XaPZu zTTRfw8%$QBZ!i%P3@mZTVRm}(s6BoM_23V11)f69 zRup4JCDaXF5oeyHvzp$0VtZ=l-W zLk45cBAfY&ojN#S+q1U)FVsLnq~#2j%_0BKQu&UC9$d_?)brO-J$~CBpG2nFoJKbD zxo!U*HNr_$2d?3GfDE8gf1Y%*$jmtEIEz{%(-^}@8Tr=;>KKkPu@MKc8`JnDYH>BN ztHL(a^}Vx3#b$*X~wO(S;4D5ynv| zO5iel5y_@GhRg9Y)b-b`f1)~a2eqim$+tS(f_h6jQB$`ab>Dt`0{0_})-_*H(cFBK zYcP|jk^X{9@doO{G@sofjH5=>iyrRA0SwXmXK)zT;ANywW)}0+k9DYy9>xXuAx8B6 ze@#U_n?PmYSJVRvc!@QV7;40I_z^Bc&FvL@4&zR)!|$V}@Hq0(GnY^UnLuT53YC#R zP*e0T7Q0k}EOi#GUzDm2qM2y%TXH)sPA#OnORGKDjP1mu_E9!=LMiZGDCfR2uDpQmmq>Qqk%sfqshPYM?wuXbLy!fTD$~(n&l- z=oPFX_?YJw!$PXO8UDvduj5n1BZTI!-rF6X>y3tkGtt^Zt7cMV8=+;z-=_Z&2Hn(O zx~kV{N7aKJCr8CVhr4D$b#kJm*;s$SXG?Doh|rG(*+|#FAt>$yw<9+*-mm`#7XY$OFRAER7K1?RONWLs@8dLRVOkxtLNoqdTI~l F{SW=h+{FL@ diff --git a/languages/wc-tier-package-prices-de_DE_informal.po b/languages/wc-tier-package-prices-de_DE_informal.po index a446d13..5b46e58 100644 --- a/languages/wc-tier-package-prices-de_DE_informal.po +++ b/languages/wc-tier-package-prices-de_DE_informal.po @@ -359,12 +359,33 @@ msgid "Permission denied." msgstr "Zugriff verweigert." #: includes/class-wc-tpp-settings.php -msgid "License key and server URL are required." -msgstr "Lizenzschlüssel und Server-URL sind erforderlich." +msgid "Server Secret" +msgstr "Server-Geheimnis" #: includes/class-wc-tpp-settings.php -msgid "Please enter both license server URL and license key." -msgstr "Bitte gib sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein." +msgid "The shared secret for secure communication with the license server." +msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "License key, server URL, and server secret are required." +msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich." + +#: includes/class-wc-tpp-settings.php +#. translators: %d: Number of seconds to wait +msgid "Rate limit exceeded. Please try again in %d seconds." +msgstr "Anfragelimit überschritten. Bitte versuche es in %d Sekunden erneut." + +#: includes/class-wc-tpp-settings.php +msgid "Response signature verification failed. Please check your server secret." +msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfe dein Server-Geheimnis." + +#: includes/class-wc-tpp-settings.php +msgid "An unexpected error occurred. Please try again." +msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut." + +#: includes/class-wc-tpp-settings.php +msgid "Please enter license server URL, license key, and server secret." +msgstr "Bitte gib die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein." #: includes/class-wc-tpp-settings.php msgid "Validation failed." diff --git a/languages/wc-tier-package-prices-en_US.mo b/languages/wc-tier-package-prices-en_US.mo index f75db7c9c66ca956cbc2fc2d118264bfe1ed0ff4..4628058f6df881bc44600c724def7f428a408d56 100644 GIT binary patch literal 8865 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 u<4be>LvsB?lEdEmhvfQ)w~VGZ^{+ delta 2109 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 T*jgTz*~r-pnPB>5U6AuHW5vO< delta 2127 zcmYk-ZA@EL9LMofO6}$fb&NWM&0YkBfrHHfGUtYaxksiQu$lNmt#BQUq>R!MFvc?H zLo$t7()kb*eWgZxN?3JqFZ2z=r)eh1oLl0yj33NFGaT#CoA0#DlW z-{T1^PDZ!tH=jkpIt!?jp>wJ{H1H)rcME-9Q?f#r->V>5OlACuxs51zE+Bd72uE3r62{%h$(S&lNX1)soPd=Af{ zcI$q2SPdS;MtmK+a1KvkWVtc-;%VH44LtQ(97CRE{M8Zjsw%! zj2BTiiZD&eXyV8VVTP>}$g|BM>&wXNWTuff&U}Sh&^Jid&CjUR|B0GVfQxyA$yUr2@njTl93;$5gs z+lQL){dPQ#D$ya0dA@mujt|xJgKk25p@UdxDuJ?eW!r2AJ5i~>!;Zz>M4KH`a<7qY zFOwQjMX%i19y%KdZMN;i?S#^&+Nr6QYFi0qfyH{SS~Ds;8wj=aghOc0G!WXfYJOsi z*DJiLx6p4QlmW7p_5Shbe6PM}s@WQ^_y1QH-PLxu%1YV2rp-r1yb`t-4w*YqCD~@j zE!N$r+TTjBEoh{^7H%R`d(};~x{KIEXhYWLMuN+7lfmMJ*xbj_C4|~uLhnlvVgF@% ze<{{7R=cr)_b*M|PU5!wY_Q9hZ(sbEKkUSl1J0MX-02^hnQ{i)!gKrGCKF2~#=S4+Ks@DSl8N-p dl-ZMsC)4WXwny7@XQQe7J7lz diff --git a/languages/wc-tier-package-prices-fr_CH.po b/languages/wc-tier-package-prices-fr_CH.po index 8b4b308..42dd529 100644 --- a/languages/wc-tier-package-prices-fr_CH.po +++ b/languages/wc-tier-package-prices-fr_CH.po @@ -359,12 +359,33 @@ msgid "Permission denied." msgstr "Accès refusé." #: includes/class-wc-tpp-settings.php -msgid "License key and server URL are required." -msgstr "La clé de licence et l'URL du serveur sont requises." +msgid "Server Secret" +msgstr "Secret serveur" #: includes/class-wc-tpp-settings.php -msgid "Please enter both license server URL and license key." -msgstr "Veuillez entrer l'URL du serveur de licence et la clé de licence." +msgid "The shared secret for secure communication with the license server." +msgstr "Le secret partagé pour la communication sécurisée avec le serveur de licence." + +#: includes/class-wc-tpp-settings.php +msgid "License key, server URL, and server secret are required." +msgstr "La clé de licence, l'URL du serveur et le secret serveur sont requis." + +#: includes/class-wc-tpp-settings.php +#. translators: %d: Number of seconds to wait +msgid "Rate limit exceeded. Please try again in %d seconds." +msgstr "Limite de requêtes dépassée. Veuillez réessayer dans %d secondes." + +#: includes/class-wc-tpp-settings.php +msgid "Response signature verification failed. Please check your server secret." +msgstr "La vérification de la signature a échoué. Veuillez vérifier votre secret serveur." + +#: includes/class-wc-tpp-settings.php +msgid "An unexpected error occurred. Please try again." +msgstr "Une erreur inattendue s'est produite. Veuillez réessayer." + +#: includes/class-wc-tpp-settings.php +msgid "Please enter license server URL, license key, and server secret." +msgstr "Veuillez entrer l'URL du serveur de licence, la clé de licence et le secret serveur." #: includes/class-wc-tpp-settings.php msgid "Validation failed." diff --git a/languages/wc-tier-package-prices-it_CH.mo b/languages/wc-tier-package-prices-it_CH.mo index 45b2b6fb50082d0aa399a52090dfee95c9a2cb30..d9981a81dbc6c26b52243829d0898693847704e9 100644 GIT binary patch delta 2811 zcmZwITWl0n7{KwcGVRyDWu-)0r&Q@9z zi^ibw8dHpc2X7E15ixNInivGb14xKbj4@tf21CN?~1NQnP$W|r2-Nx%J_IWu!E z-#G)nwtTp9;HR>}R~4m;C?~Fjlp4TuMf_0C6f0GVpJN$*k7MvMj>dm*0*1J_1H&ly z>o9?hXyV&A6Gz|d_tSuP%24f8CUL{Wh4>^shsSXZw%wxCY}}9A@Epp7>KNrVT!am{ z4kzM^cq<;nY4|Z}ynypDG}fPBqbEyUMukPFH7Ff-2JQ%aJh=Y?mT-SBj>iK?pDKrv znG=EMQJ%Yq6?g?DL*a4$M5m&RvlSzf>NFLeQEvn{4r7?><0vURkNl|+y~@C)DAyWg z;0QKhGs><#h5V^!`627-HLS-s@h1EREAdAhXrpqC%H6n}-X&#mq)EMuGSKVTkB2di zHB3K>FQIfigz|n3%QUbRm*OFmE&2oHeu&x1LMu@+5GiB-Wd)0a8*76bTamF;8js>` z+=BDi*mbxUWo5sitYj#-4u_TEc&N$9D{30ba|=;c-hwiLc0666)TS``mz8Qx4sB{C z%8M<58&MAD4y?gFD9<0kUObLZVEye%Ex;Vgp8tu{v4l@TY`|vRj_=?>+=%T1d;?3U z9Kb&O1^H9k?(*%&MO^Pi`cz*B?UyjZbrG|ZEvv^B_$bN>-wiy9l7Y`qw&E;GKR+W$ zQv-ifk<&kxk6%_6M#;bwWZTqyl)Y*T+B;FsL=t6B`%yaHhpX`elz!A?|8pLX@_u{Z zW@PcI2k(>be-9NI=+oeVF9R>2oPi-+hapCjJ=}=${1)V&2$jYr>_=J1CpZ;P;b#0D zWlNUxGaI{6R=yAA{Hgb;?5E)*X0b~v<>FVk5?eW8EK0qC4jw^iudMPjki>hrejX)r zAEB)HEXqWG2-+_P?P`jDe*%8N_^OIZH~xh(;2_sV>Jml4gx!^A^G3z09f1?-nsI5J)-Lh3;=<-mF66@Z}8{LML${ibhbyP*I&X`WG>FD)qSJi4G70X{|%&23!gD1yco0GJnW{Ouw zKACUZY4+XdwTt5_=Nhi5lU9%AYI9fAG-EfKgtk(;TE>jpsaPg5SXffmlD56UtnQTI zW*t*AJ1cHQ4cD?$I&N6W5gkPnW^||Sv$IZqcEP-BOS;B*>+0~9*=c*^oC|L2oM`D&g znSO)!4INEbMz5)dTlL63M)W=SOnG(FD%l6`X~*JCGs8tDn>HQe#uMe37{eQ5MF!t1 zpVhS?*a+#I8N@B8#|Y|!zqg7-l{kq`WO18 B%a{NF delta 2085 zcmYk-TTC2P9LMqha&e1Xwk*`zf-n>+v=tCr5L-)%DA!)Q|C;=Z&(HC?`J8GE3njxtu5uN6qHrIL7g5%*TT`4-aE8PT|#f++F_x z`)U7*N%Xl{zkeGS;TbH`tA3`khK@)c5688*9Y4h;TzsY3z1WQ!$ZNO&Kg3p?#;dT9 zQI%i~)?q7pn7|f%969VA=Lw8zs$WylgJ+z-IcLKg%nAz3inv~iF|0-|*-F%m);oRF zeMzjuQPj#jhZ@i!)O)_f20V)eTIyI~=0Z7^(yqrw+=v`D%tu6s@Zn63lS9L=Nrv|(Sm7D!| z3%-S#S!8j>BGd|%A!D-|)Pq)|cE68&an^^L&=6|okD@l?0VE4H>H1S?D(n+GiOS_P z>cPL`O_;|zg)4*lOnuY?_B&rjCSynNMm&vrQG`Dxy064pgUWp~wqpm9x|BUdB^(*@ z$=f7q2Cw3^cnp<-@30AHQ8TT-#_UCG!-w#D97Ug5bm1xFR*UoFVQfTAa1vMG#~9c5 ze}RfdYF=g_#i%8#M)kKiJMjzJyKoQIvP18}XHY3Qk9zQ*$jq#2Nv6LJwW3X^P27q4 zTz!o3e%nPQf-1V9n^;M#C+3P$pyj)~w7G_6tG%+pwZ-j3i))j~u;g&oW>+Cg;cBFO zDr<>bi7mv<#5O`HQPEPXY$o_>jIo9rvJo|_HH3=xibpgP%L(l%m26^DSj()+4b&S5 zrI^)9h5vYT{SKWd%Gvc{?f;WDOucLBGgKknVbShq#lw`fX1c5cmAX#XUgg}1*Ad#N zWSvsYCj{DPd}(1GwVQ7v))Cr}b-{ztl3*g5GZ$?;=*=fodI&y#%OaFj6&@OHRn?d3 zMA@Dp{OhnfeInW(Nw?*z57TgKdSEYVUhswBH*X=uHldBrm%b z-a6NPe{wvSD5?s+Em{$D#dfA&kIhDc?09K95}(RVUtIW2&O9&a4c79^^iSo>BiSPZ wi6FnCe394NPk#ai5@Shk_dw=NdlNxV#nRxtipHR`vM>EnWg;s*xa4Hkf0u#Sxc~qF diff --git a/languages/wc-tier-package-prices-it_CH.po b/languages/wc-tier-package-prices-it_CH.po index 37b3b71..a9d9d83 100644 --- a/languages/wc-tier-package-prices-it_CH.po +++ b/languages/wc-tier-package-prices-it_CH.po @@ -359,12 +359,33 @@ msgid "Permission denied." msgstr "Accesso negato." #: includes/class-wc-tpp-settings.php -msgid "License key and server URL are required." -msgstr "La chiave di licenza e l'URL del server sono obbligatori." +msgid "Server Secret" +msgstr "Segreto del server" #: includes/class-wc-tpp-settings.php -msgid "Please enter both license server URL and license key." -msgstr "Inserisci sia l'URL del server di licenza che la chiave di licenza." +msgid "The shared secret for secure communication with the license server." +msgstr "Il segreto condiviso per la comunicazione sicura con il server di licenza." + +#: includes/class-wc-tpp-settings.php +msgid "License key, server URL, and server secret are required." +msgstr "La chiave di licenza, l'URL del server e il segreto del server sono obbligatori." + +#: includes/class-wc-tpp-settings.php +#. translators: %d: Number of seconds to wait +msgid "Rate limit exceeded. Please try again in %d seconds." +msgstr "Limite di richieste superato. Per favore riprova tra %d secondi." + +#: includes/class-wc-tpp-settings.php +msgid "Response signature verification failed. Please check your server secret." +msgstr "Verifica della firma della risposta fallita. Per favore controlla il tuo segreto del server." + +#: includes/class-wc-tpp-settings.php +msgid "An unexpected error occurred. Please try again." +msgstr "Si è verificato un errore imprevisto. Per favore riprova." + +#: includes/class-wc-tpp-settings.php +msgid "Please enter license server URL, license key, and server secret." +msgstr "Inserisci l'URL del server di licenza, la chiave di licenza e il segreto del server." #: includes/class-wc-tpp-settings.php msgid "Validation failed." diff --git a/languages/wc-tier-package-prices.pot b/languages/wc-tier-package-prices.pot index e095067..7896ff5 100644 --- a/languages/wc-tier-package-prices.pot +++ b/languages/wc-tier-package-prices.pot @@ -2,9 +2,9 @@ # This file is distributed under the GPL v2 or later. msgid "" msgstr "" -"Project-Id-Version: WooCommerce Tier and Package Prices 1.2.7\n" +"Project-Id-Version: WooCommerce Tier and Package Prices 1.3.1\n" "Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n" -"POT-Creation-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-01-27 00:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -332,11 +332,32 @@ msgid "Permission denied." msgstr "" #: includes/class-wc-tpp-settings.php -msgid "License key and server URL are required." +msgid "Server Secret" msgstr "" #: includes/class-wc-tpp-settings.php -msgid "Please enter both license server URL and license key." +msgid "The shared secret for secure communication with the license server." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "License key, server URL, and server secret are required." +msgstr "" + +#: includes/class-wc-tpp-settings.php +#. translators: %d: Number of seconds to wait +msgid "Rate limit exceeded. Please try again in %d seconds." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Response signature verification failed. Please check your server secret." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "An unexpected error occurred. Please try again." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Please enter license server URL, license key, and server secret." msgstr "" #: includes/class-wc-tpp-settings.php diff --git a/wc-tier-and-package-prices.php b/wc-tier-and-package-prices.php index 0e54e80..72e275e 100755 --- a/wc-tier-and-package-prices.php +++ b/wc-tier-and-package-prices.php @@ -4,7 +4,7 @@ * Plugin Name: WooCommerce Tier and Package Prices * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices * Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices - * Version: 1.3.0 + * Version: 1.3.1 * Author: Marco Graetsch * Author URI: https://src.bundespruefstelle.ch/magdev * Text Domain: wc-tier-package-prices @@ -46,7 +46,7 @@ if (!function_exists('wc_tpp_php_version_notice')) { // Define plugin constants if (!defined('WC_TPP_VERSION')) { - define('WC_TPP_VERSION', '1.3.0'); + define('WC_TPP_VERSION', '1.3.1'); } if (!defined('WC_TPP_PLUGIN_DIR')) { define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));