diff --git a/ReCaptchaAdminUi/composer.json b/ReCaptchaAdminUi/composer.json index 602ce4b0..9aa52229 100644 --- a/ReCaptchaAdminUi/composer.json +++ b/ReCaptchaAdminUi/composer.json @@ -1,15 +1,16 @@ { "name": "magento/module-re-captcha-admin-ui", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-config": "*", - "magento/module-re-captcha-ui": "*", + "magento/module-re-captcha-ui": "1.1.*", "magento/module-store": "*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -19,3 +20,4 @@ } } } + diff --git a/ReCaptchaCheckout/composer.json b/ReCaptchaCheckout/composer.json index c2d67de0..fa74bab7 100644 --- a/ReCaptchaCheckout/composer.json +++ b/ReCaptchaCheckout/composer.json @@ -1,19 +1,20 @@ { "name": "magento/module-re-captcha-checkout", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-checkout": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-admin-ui": "*", - "magento/module-re-captcha-frontend-ui": "*", - "magento/module-re-captcha-webapi-api": "*", - "magento/module-re-captcha-webapi-ui": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-admin-ui": "1.1.*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-re-captcha-webapi-ui": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -23,3 +24,4 @@ } } } + diff --git a/ReCaptchaCheckoutSalesRule/composer.json b/ReCaptchaCheckoutSalesRule/composer.json index fba933ad..7a7ac4d4 100644 --- a/ReCaptchaCheckoutSalesRule/composer.json +++ b/ReCaptchaCheckoutSalesRule/composer.json @@ -1,20 +1,21 @@ { "name": "magento/module-re-captcha-checkout-sales-rule", "description": "Google ReCaptcha integration for Magento2 coupons", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.0", "require": { "php": "~7.4.0||~8.0.0||~8.1.0", "magento/framework": "*", "magento/module-checkout": "*", "magento/module-sales-rule": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-admin-ui": "*", - "magento/module-re-captcha-frontend-ui": "*", - "magento/module-re-captcha-webapi-api": "*", - "magento/module-re-captcha-webapi-ui": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-admin-ui": "1.1.*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-re-captcha-webapi-ui": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -22,5 +23,6 @@ "psr-4": { "Magento\\ReCaptchaCheckoutSalesRule\\": "" } - } + } } + diff --git a/ReCaptchaContact/composer.json b/ReCaptchaContact/composer.json index 5146c8df..2fe43461 100644 --- a/ReCaptchaContact/composer.json +++ b/ReCaptchaContact/composer.json @@ -1,13 +1,14 @@ { "name": "magento/module-re-captcha-contact", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*" + "magento/module-re-captcha-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -17,3 +18,4 @@ } } } + diff --git a/ReCaptchaCustomer/composer.json b/ReCaptchaCustomer/composer.json index cdbed567..fb6dfce3 100644 --- a/ReCaptchaCustomer/composer.json +++ b/ReCaptchaCustomer/composer.json @@ -1,16 +1,17 @@ { "name": "magento/module-re-captcha-customer", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-customer": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -20,3 +21,4 @@ } } } + diff --git a/ReCaptchaFrontendUi/composer.json b/ReCaptchaFrontendUi/composer.json index 42e28501..aed23c9b 100644 --- a/ReCaptchaFrontendUi/composer.json +++ b/ReCaptchaFrontendUi/composer.json @@ -1,14 +1,15 @@ { "name": "magento/module-re-captcha-frontend-ui", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-store": "*", - "magento/module-re-captcha-ui": "*" + "magento/module-re-captcha-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -18,3 +19,4 @@ } } } + diff --git a/ReCaptchaMigration/composer.json b/ReCaptchaMigration/composer.json index 6d823f30..9de0f73e 100644 --- a/ReCaptchaMigration/composer.json +++ b/ReCaptchaMigration/composer.json @@ -1,13 +1,14 @@ { "name": "magento/module-re-captcha-migration", "description": "Google reCAPTCHA config migration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-config": "*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -17,3 +18,4 @@ } } } + diff --git a/ReCaptchaNewsletter/composer.json b/ReCaptchaNewsletter/composer.json index 3507d1da..1b11813d 100644 --- a/ReCaptchaNewsletter/composer.json +++ b/ReCaptchaNewsletter/composer.json @@ -1,15 +1,16 @@ { "name": "magento/module-re-captcha-newsletter", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -19,3 +20,4 @@ } } } + diff --git a/ReCaptchaPaypal/composer.json b/ReCaptchaPaypal/composer.json index 983a5922..c9f8a438 100644 --- a/ReCaptchaPaypal/composer.json +++ b/ReCaptchaPaypal/composer.json @@ -1,16 +1,17 @@ { "name": "magento/module-re-captcha-paypal", "description": "Google reCaptcha integration for Magento2 PayPal PayflowPro payment form", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", "magento/module-checkout": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -20,3 +21,4 @@ } } } + diff --git a/ReCaptchaReview/composer.json b/ReCaptchaReview/composer.json index c4f0b517..6eadfd9d 100644 --- a/ReCaptchaReview/composer.json +++ b/ReCaptchaReview/composer.json @@ -1,15 +1,16 @@ { "name": "magento/module-re-captcha-review", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -19,3 +20,4 @@ } } } + diff --git a/ReCaptchaSendFriend/composer.json b/ReCaptchaSendFriend/composer.json index 1d5ac164..e7bb3704 100644 --- a/ReCaptchaSendFriend/composer.json +++ b/ReCaptchaSendFriend/composer.json @@ -1,15 +1,16 @@ { "name": "magento/module-re-captcha-send-friend", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -19,3 +20,4 @@ } } } + diff --git a/ReCaptchaStorePickup/composer.json b/ReCaptchaStorePickup/composer.json index 686dbfe1..476184be 100644 --- a/ReCaptchaStorePickup/composer.json +++ b/ReCaptchaStorePickup/composer.json @@ -1,17 +1,18 @@ { "name": "magento/module-re-captcha-store-pickup", "description": "Google reCaptcha integration for Magento2 Inventory Store Pickup shipping form", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.0.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-checkout": "*", - "magento/module-re-captcha-ui": "*" + "magento/module-re-captcha-ui": "1.1.*" }, "suggest": { "magento/module-inventory-in-store-pickup-frontend": "*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -21,3 +22,4 @@ } } } + diff --git a/ReCaptchaUi/composer.json b/ReCaptchaUi/composer.json index ef7438b6..1e387f69 100644 --- a/ReCaptchaUi/composer.json +++ b/ReCaptchaUi/composer.json @@ -1,19 +1,14 @@ { "name": "magento/module-re-captcha-ui", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-validation-api": "1.1.*" }, - "authors": [ - { - "name": "Riccardo Tempesta", - "email": "riccardo.tempesta@magespecialist.it" - } - ], - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -21,5 +16,12 @@ "psr-4": { "Magento\\ReCaptchaUi\\": "" } - } + }, + "authors": [ + { + "email": "riccardo.tempesta@magespecialist.it", + "name": "Riccardo Tempesta" + } + ] } + diff --git a/ReCaptchaUser/composer.json b/ReCaptchaUser/composer.json index b2e0cc08..64eb66f7 100644 --- a/ReCaptchaUser/composer.json +++ b/ReCaptchaUser/composer.json @@ -1,14 +1,15 @@ { "name": "magento/module-re-captcha-user", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -18,3 +19,4 @@ } } } + diff --git a/ReCaptchaValidation/composer.json b/ReCaptchaValidation/composer.json index b1542885..fba02aa9 100644 --- a/ReCaptchaValidation/composer.json +++ b/ReCaptchaValidation/composer.json @@ -1,14 +1,15 @@ { "name": "magento/module-re-captcha-validation", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-validation-api": "*", + "magento/module-re-captcha-validation-api": "1.1.*", "google/recaptcha": "^1.2" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -18,3 +19,4 @@ } } } + diff --git a/ReCaptchaValidationApi/composer.json b/ReCaptchaValidationApi/composer.json index 2a6cc9aa..2066011c 100644 --- a/ReCaptchaValidationApi/composer.json +++ b/ReCaptchaValidationApi/composer.json @@ -1,12 +1,13 @@ { "name": "magento/module-re-captcha-validation-api", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -16,3 +17,4 @@ } } } + diff --git a/ReCaptchaVersion2Checkbox/composer.json b/ReCaptchaVersion2Checkbox/composer.json index d856134d..594c1e4f 100644 --- a/ReCaptchaVersion2Checkbox/composer.json +++ b/ReCaptchaVersion2Checkbox/composer.json @@ -1,19 +1,20 @@ { "name": "magento/module-re-captcha-version-2-checkbox", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "2.0.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-store": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*" }, "suggest": { "magento/module-config": "*", - "magento/module-re-captcha-admin-ui": "*" + "magento/module-re-captcha-admin-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -23,3 +24,4 @@ } } } + diff --git a/ReCaptchaVersion2Invisible/composer.json b/ReCaptchaVersion2Invisible/composer.json index cae5a5e8..1a111a1e 100644 --- a/ReCaptchaVersion2Invisible/composer.json +++ b/ReCaptchaVersion2Invisible/composer.json @@ -1,19 +1,20 @@ { "name": "magento/module-re-captcha-version-2-invisible", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "2.0.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-store": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*" }, "suggest": { "magento/module-config": "*", - "magento/module-re-captcha-admin-ui": "*" + "magento/module-re-captcha-admin-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -23,3 +24,4 @@ } } } + diff --git a/ReCaptchaVersion3Invisible/composer.json b/ReCaptchaVersion3Invisible/composer.json index f03262d4..fa5d61e0 100644 --- a/ReCaptchaVersion3Invisible/composer.json +++ b/ReCaptchaVersion3Invisible/composer.json @@ -1,19 +1,20 @@ { "name": "magento/module-re-captcha-version-3-invisible", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "2.0.2", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-store": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*" }, "suggest": { "magento/module-config": "*", - "magento/module-re-captcha-admin-ui": "*" + "magento/module-re-captcha-admin-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -23,3 +24,4 @@ } } } + diff --git a/ReCaptchaWebapiApi/composer.json b/ReCaptchaWebapiApi/composer.json index d2d3ae10..ebb63ec0 100644 --- a/ReCaptchaWebapiApi/composer.json +++ b/ReCaptchaWebapiApi/composer.json @@ -1,13 +1,14 @@ { "name": "magento/module-re-captcha-webapi-api", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.0.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-validation-api": "*" + "magento/module-re-captcha-validation-api": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -17,3 +18,4 @@ } } } + diff --git a/ReCaptchaWebapiGraphQl/composer.json b/ReCaptchaWebapiGraphQl/composer.json index e857046e..4e36f312 100644 --- a/ReCaptchaWebapiGraphQl/composer.json +++ b/ReCaptchaWebapiGraphQl/composer.json @@ -1,15 +1,16 @@ { "name": "magento/module-re-captcha-webapi-graph-ql", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.0.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-authorization": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*" + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -19,3 +20,4 @@ } } } + diff --git a/ReCaptchaWebapiRest/composer.json b/ReCaptchaWebapiRest/composer.json index cf15d4c6..5a9d03b1 100644 --- a/ReCaptchaWebapiRest/composer.json +++ b/ReCaptchaWebapiRest/composer.json @@ -1,16 +1,17 @@ { "name": "magento/module-re-captcha-webapi-rest", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.0.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-authorization": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-webapi-api": "*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", "magento/module-webapi": "*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -20,3 +21,4 @@ } } } + diff --git a/ReCaptchaWebapiUi/composer.json b/ReCaptchaWebapiUi/composer.json index c17bbba6..8f07e510 100644 --- a/ReCaptchaWebapiUi/composer.json +++ b/ReCaptchaWebapiUi/composer.json @@ -1,13 +1,14 @@ { "name": "magento/module-re-captcha-webapi-ui", "description": "Google reCAPTCHA integration for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.0.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", - "magento/module-re-captcha-frontend-ui": "*" + "magento/module-re-captcha-frontend-ui": "1.1.*" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -17,3 +18,4 @@ } } } + diff --git a/Securitytxt/composer.json b/Securitytxt/composer.json index 8f00f67f..f8295139 100644 --- a/Securitytxt/composer.json +++ b/Securitytxt/composer.json @@ -2,22 +2,17 @@ "name": "magento/module-securitytxt", "description": "Security.txt file for Magento 2 websites", "type": "magento2-module", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "version": "1.1.1", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", "magento/module-config": "*", "magento/module-store": "*" }, - "authors": [ - { - "name": "Kalpesh Mehta", - "email": "k@lpe.sh" - } - ], - "license": [ - "OSL-3.0", - "AFL-3.0" - ], "autoload": { "files": [ "registration.php" @@ -25,5 +20,12 @@ "psr-4": { "Magento\\Securitytxt\\": "" } - } + }, + "authors": [ + { + "email": "k@lpe.sh", + "name": "Kalpesh Mehta" + } + ] } + diff --git a/TwoFactorAuth/Controller/Adminhtml/Authy/Authpost.php b/TwoFactorAuth/Controller/Adminhtml/Authy/Authpost.php old mode 100644 new mode 100755 index 1fd18f93..0a1d5674 --- a/TwoFactorAuth/Controller/Adminhtml/Authy/Authpost.php +++ b/TwoFactorAuth/Controller/Adminhtml/Authy/Authpost.php @@ -19,9 +19,13 @@ use Magento\TwoFactorAuth\Controller\Adminhtml\AbstractAction; use Magento\TwoFactorAuth\Model\Provider\Engine\Authy; use Magento\User\Model\User; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\User\Model\ResourceModel\User as UserResource; +use Magento\Framework\App\ObjectManager; /** * @SuppressWarnings(PHPMD.CamelCaseMethodName) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Authpost extends AbstractAction implements HttpPostActionInterface { @@ -60,6 +64,26 @@ class Authpost extends AbstractAction implements HttpPostActionInterface */ private $alert; + /** + * Config path for the 2FA Attempts + */ + private const XML_PATH_2FA_RETRY_ATTEMPTS = 'twofactorauth/general/twofactorauth_retry'; + + /** + * Config path for the 2FA Attempts + */ + private const XML_PATH_2FA_LOCK_EXPIRE = 'twofactorauth/general/auth_lock_expire'; + + /** + * @var ScopeConfigInterface + */ + private $scopeConfig; + + /** + * @var UserResource + */ + private $userResource; + /** * @param Action\Context $context * @param Session $session @@ -69,6 +93,9 @@ class Authpost extends AbstractAction implements HttpPostActionInterface * @param TfaInterface $tfa * @param AlertInterface $alert * @param DataObjectFactory $dataObjectFactory + * @param UserResource|null $userResource + * @param ScopeConfigInterface|null $scopeConfig + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( Action\Context $context, @@ -78,7 +105,9 @@ public function __construct( TfaSessionInterface $tfaSession, TfaInterface $tfa, AlertInterface $alert, - DataObjectFactory $dataObjectFactory + DataObjectFactory $dataObjectFactory, + ?UserResource $userResource = null, + ?ScopeConfigInterface $scopeConfig = null ) { parent::__construct($context); $this->tfa = $tfa; @@ -88,6 +117,8 @@ public function __construct( $this->authy = $authy; $this->dataObjectFactory = $dataObjectFactory; $this->alert = $alert; + $this->scopeConfig = $scopeConfig ?? ObjectManager::getInstance()->get(ScopeConfigInterface::class); + $this->userResource = $userResource ?? ObjectManager::getInstance()->get(UserResource::class); } /** @@ -109,6 +140,13 @@ public function execute() $result = $this->jsonFactory->create(); try { + if (!$this->allowApiRetries()) { //locked the user + $lockThreshold = $this->scopeConfig->getValue(self::XML_PATH_2FA_LOCK_EXPIRE); + if ($this->userResource->lock((int)$user->getId(), 0, $lockThreshold)) { + $result->setData(['success' => false, 'message' => "Your account is temporarily disabled."]); + return $result; + } + } $this->authy->verify($user, $this->dataObjectFactory->create([ 'data' => $this->getRequest()->getParams(), ])); @@ -141,4 +179,18 @@ protected function _isAllowed() $this->tfa->getProviderIsAllowed((int) $user->getId(), Authy::CODE) && $this->tfa->getProvider(Authy::CODE)->isActive((int) $user->getId()); } + + /** + * Check if retry attempt above threshold value + * + * @return bool + */ + private function allowApiRetries() : bool + { + $maxRetries = $this->scopeConfig->getValue(self::XML_PATH_2FA_RETRY_ATTEMPTS); + $verifyAttempts = $this->session->getOtpAttempt(); + $verifyAttempts = $verifyAttempts === null ? 1 : $verifyAttempts+1; + $this->session->setOtpAttempt($verifyAttempts); + return $maxRetries >= $verifyAttempts; + } } diff --git a/TwoFactorAuth/Controller/Adminhtml/Google/Authpost.php b/TwoFactorAuth/Controller/Adminhtml/Google/Authpost.php old mode 100644 new mode 100755 index f0437f1d..14a70134 --- a/TwoFactorAuth/Controller/Adminhtml/Google/Authpost.php +++ b/TwoFactorAuth/Controller/Adminhtml/Google/Authpost.php @@ -19,6 +19,9 @@ use Magento\TwoFactorAuth\Controller\Adminhtml\AbstractAction; use Magento\TwoFactorAuth\Model\Provider\Engine\Google; use Magento\User\Model\User; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\User\Model\ResourceModel\User as UserResource; +use Magento\Framework\App\ObjectManager; /** * Google authenticator post controller @@ -61,6 +64,26 @@ class Authpost extends AbstractAction implements HttpPostActionInterface */ private $alert; + /** + * Config path for the 2FA Attempts + */ + private const XML_PATH_2FA_RETRY_ATTEMPTS = 'twofactorauth/general/twofactorauth_retry'; + + /** + * Config path for the 2FA Attempts + */ + private const XML_PATH_2FA_LOCK_EXPIRE = 'twofactorauth/general/auth_lock_expire'; + + /** + * @var ScopeConfigInterface + */ + private $scopeConfig; + + /** + * @var UserResource + */ + private $userResource; + /** * @param Action\Context $context * @param Session $session @@ -70,6 +93,9 @@ class Authpost extends AbstractAction implements HttpPostActionInterface * @param TfaInterface $tfa * @param AlertInterface $alert * @param DataObjectFactory $dataObjectFactory + * @param UserResource|null $userResource + * @param ScopeConfigInterface|null $scopeConfig + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( Action\Context $context, @@ -79,7 +105,9 @@ public function __construct( TfaSessionInterface $tfaSession, TfaInterface $tfa, AlertInterface $alert, - DataObjectFactory $dataObjectFactory + DataObjectFactory $dataObjectFactory, + ?UserResource $userResource = null, + ?ScopeConfigInterface $scopeConfig = null ) { parent::__construct($context); $this->tfa = $tfa; @@ -89,6 +117,8 @@ public function __construct( $this->tfaSession = $tfaSession; $this->dataObjectFactory = $dataObjectFactory; $this->alert = $alert; + $this->scopeConfig = $scopeConfig ?? ObjectManager::getInstance()->get(ScopeConfigInterface::class); + $this->userResource = $userResource ?? ObjectManager::getInstance()->get(UserResource::class); } /** @@ -103,6 +133,14 @@ public function execute() /** @var \Magento\Framework\DataObject $request */ $request = $this->dataObjectFactory->create(['data' => $this->getRequest()->getParams()]); + if (!$this->allowApiRetries()) { //locked the user + $lockThreshold = $this->scopeConfig->getValue(self::XML_PATH_2FA_LOCK_EXPIRE); + if ($this->userResource->lock((int)$user->getId(), 0, $lockThreshold)) { + $response->setData(['success' => false, 'message' => "Your account is temporarily disabled."]); + return $response; + } + } + if ($this->google->verify($user, $request)) { $this->tfaSession->grantAccess(); $response->setData(['success' => true]); @@ -133,4 +171,18 @@ protected function _isAllowed() && $this->tfa->getProviderIsAllowed((int)$user->getId(), Google::CODE) && $this->tfa->getProvider(Google::CODE)->isActive((int)$user->getId()); } + + /** + * Check if retry attempt above threshold value + * + * @return bool + */ + private function allowApiRetries() : bool + { + $maxRetries = $this->scopeConfig->getValue(self::XML_PATH_2FA_RETRY_ATTEMPTS); + $verifyAttempts = $this->session->getOtpAttempt(); + $verifyAttempts = $verifyAttempts === null ? 1 : $verifyAttempts+1; + $this->session->setOtpAttempt($verifyAttempts); + return $maxRetries >= $verifyAttempts; + } } diff --git a/TwoFactorAuth/Controller/Adminhtml/Tfa/Reset.php b/TwoFactorAuth/Controller/Adminhtml/Tfa/Reset.php index 6f2d3a9d..be0d1c33 100644 --- a/TwoFactorAuth/Controller/Adminhtml/Tfa/Reset.php +++ b/TwoFactorAuth/Controller/Adminhtml/Tfa/Reset.php @@ -10,11 +10,13 @@ use Magento\Backend\App\Action\Context; use Magento\Framework\App\Action\HttpGetActionInterface; use Magento\Framework\App\Action\HttpPostActionInterface; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Exception\LocalizedException; use Magento\User\Model\UserFactory; use Magento\User\Model\ResourceModel\User as UserResourceModel; use Magento\TwoFactorAuth\Api\TfaInterface; use Magento\TwoFactorAuth\Controller\Adminhtml\AbstractAction; +use Magento\Backend\Model\View\Result\Redirect; /** * Reset 2FA configuration controller @@ -38,22 +40,30 @@ class Reset extends AbstractAction implements HttpGetActionInterface, HttpPostAc */ private $tfa; + /** + * @var Redirect + */ + private $redirect; + /** * @param Context $context * @param UserResourceModel $userResourceModel * @param TfaInterface $tfa * @param UserFactory $userFactory + * @param Redirect $redirect */ public function __construct( Context $context, UserResourceModel $userResourceModel, TfaInterface $tfa, - UserFactory $userFactory + UserFactory $userFactory, + Redirect $redirect = null ) { parent::__construct($context); $this->userResourceModel = $userResourceModel; $this->userInterfaceFactory = $userFactory; $this->tfa = $tfa; + $this->redirect = $redirect ?: ObjectManager::getInstance()->get(Redirect::class); } /** @@ -81,7 +91,7 @@ public function execute() $provider->resetConfiguration((int) $user->getId()); $this->messageManager->addSuccessMessage(__('Configuration has been reset for this user')); - return $this->_redirect('adminhtml/user/edit', ['user_id' => $userId]); + return $this->resultRedirectFactory->create()->setPath('adminhtml/user/edit', ['user_id' => $userId]); } /** @@ -89,6 +99,7 @@ public function execute() */ protected function _isAllowed() { - return parent::_isAllowed() && $this->_authorization->isAllowed('Magento_TwoFactorAuth::tfa'); + return parent::_isAllowed() && $this->_authorization->isAllowed('Magento_TwoFactorAuth::tfa') + && $this->_authorization->isAllowed('Magento_User::acl_users'); } } diff --git a/TwoFactorAuth/composer.json b/TwoFactorAuth/composer.json index 78d1ab57..0b6dcc88 100644 --- a/TwoFactorAuth/composer.json +++ b/TwoFactorAuth/composer.json @@ -1,6 +1,9 @@ { "name": "magento/module-two-factor-auth", "description": "Two Factor Authentication module for Magento2", + "type": "magento2-module", + "license": "OSL-3.0", + "version": "1.1.3-p11", "require": { "php": "~7.4.0||~8.1.0", "magento/framework": "*", @@ -17,8 +20,6 @@ "endroid/qr-code": "^4.3.5", "2tvenom/cborencode": "^1.0" }, - "type": "magento2-module", - "license": "OSL-3.0", "autoload": { "files": [ "registration.php" @@ -28,3 +29,4 @@ } } } + diff --git a/TwoFactorAuth/etc/adminhtml/system.xml b/TwoFactorAuth/etc/adminhtml/system.xml old mode 100644 new mode 100755 index 7086746b..9daf06c6 --- a/TwoFactorAuth/etc/adminhtml/system.xml +++ b/TwoFactorAuth/etc/adminhtml/system.xml @@ -35,6 +35,16 @@ This can be used to override the default email configuration link that is sent when using the Magento Web API's to authenticate. Use the placeholder :tfat to indicate where the token should be injected + + + Security configurations for TwoFactorAuth page. + + + + TwoFactorAuth Configuration. + diff --git a/TwoFactorAuth/etc/config.xml b/TwoFactorAuth/etc/config.xml index 515a4ae9..dffc3669 100644 --- a/TwoFactorAuth/etc/config.xml +++ b/TwoFactorAuth/etc/config.xml @@ -11,6 +11,8 @@ + 10 + 300 Login request to your Magento Admin diff --git a/TwoFactorAuth/i18n/en_US.csv b/TwoFactorAuth/i18n/en_US.csv new file mode 100755 index 00000000..667ec371 --- /dev/null +++ b/TwoFactorAuth/i18n/en_US.csv @@ -0,0 +1,5 @@ +"Configuration for TwoFactorAuth retry attempts","Configuration for TwoFactorAuth retry attempts" +"Configuration for TwoFactorAuth lock expire time","Configuration for TwoFactorAuth lock expire time" +"TwoFactorAuth Configuration","TwoFactorAuth Configuration" +"Security configurations for TwoFactorAuth page","Security configurations for TwoFactorAuth page" +"Your account is temporarily disabled.","Your account is temporarily disabled." diff --git a/_metapackage/composer.json b/_metapackage/composer.json index 23d52829..ea633186 100644 --- a/_metapackage/composer.json +++ b/_metapackage/composer.json @@ -2,32 +2,34 @@ "name": "magento/security-package", "description": "Magento Security Package", "type": "metapackage", + "version": "1.1.3-p11", "require": { - "magento/module-re-captcha-admin-ui": "*", - "magento/module-re-captcha-checkout": "*", - "magento/module-re-captcha-contact": "*", - "magento/module-re-captcha-customer": "*", - "magento/module-re-captcha-frontend-ui": "*", - "magento/module-re-captcha-migration": "*", - "magento/module-re-captcha-newsletter": "*", - "magento/module-re-captcha-paypal": "*", - "magento/module-re-captcha-review": "*", - "magento/module-re-captcha-send-friend": "*", - "magento/module-re-captcha-store-pickup": "*", - "magento/module-re-captcha-ui": "*", - "magento/module-re-captcha-user": "*", - "magento/module-re-captcha-validation": "*", - "magento/module-re-captcha-validation-api": "*", - "magento/module-re-captcha-version-2-checkbox": "*", - "magento/module-re-captcha-version-2-invisible": "*", - "magento/module-re-captcha-version-3-invisible": "*", - "magento/module-re-captcha-webapi-api": "*", - "magento/module-re-captcha-webapi-rest": "*", - "magento/module-re-captcha-webapi-graph-ql": "*", - "magento/module-re-captcha-webapi-ui": "*", - "magento/module-securitytxt": "*", - "magento/module-two-factor-auth": "*", + "magento/module-re-captcha-admin-ui": "1.1.2", + "magento/module-re-captcha-checkout": "1.1.2", + "magento/module-re-captcha-contact": "1.1.1", + "magento/module-re-captcha-customer": "1.1.2", + "magento/module-re-captcha-frontend-ui": "1.1.2", + "magento/module-re-captcha-migration": "1.1.2", + "magento/module-re-captcha-newsletter": "1.1.2", + "magento/module-re-captcha-paypal": "1.1.2", + "magento/module-re-captcha-review": "1.1.2", + "magento/module-re-captcha-send-friend": "1.1.2", + "magento/module-re-captcha-store-pickup": "1.0.1", + "magento/module-re-captcha-ui": "1.1.2", + "magento/module-re-captcha-user": "1.1.2", + "magento/module-re-captcha-validation": "1.1.1", + "magento/module-re-captcha-validation-api": "1.1.1", + "magento/module-re-captcha-version-2-checkbox": "2.0.2", + "magento/module-re-captcha-version-2-invisible": "2.0.2", + "magento/module-re-captcha-version-3-invisible": "2.0.2", + "magento/module-re-captcha-webapi-api": "1.0.1", + "magento/module-re-captcha-webapi-rest": "1.0.1", + "magento/module-re-captcha-webapi-graph-ql": "1.0.1", + "magento/module-re-captcha-webapi-ui": "1.0.1", + "magento/module-securitytxt": "1.1.1", + "magento/module-two-factor-auth": "1.1.3-p11", "google/recaptcha": "^1.2", - "magento/module-re-captcha-checkout-sales-rule": "*" + "magento/module-re-captcha-checkout-sales-rule": "1.1.0" } } +