Version Notes
bug fixes
Download this release
Release Info
Developer | miniOrange inc. |
Extension | miniOrange_2factor |
Version | 1.0.5 |
Comparing to | |
See all releases |
Code changes from version 1.0.4 to 1.0.5
- app/code/community/miniOrange/2factor/Block/mo2fConfig.php +5 -7
- app/code/community/miniOrange/2factor/Controllers/Adminhtml/IndexController.php +16 -18
- app/code/community/miniOrange/2factor/Helper/Data.php +19 -4
- app/code/community/miniOrange/2factor/Helper/mo2fUtility.php +4 -4
- app/code/community/miniOrange/2factor/Model/Observer.php +9 -7
- app/code/community/miniOrange/2factor/etc/config.xml +2 -46
- app/code/community/miniOrange/2factor/sql/MiniOrange_2factor_setup/mysql4-install-0.0.1.php +0 -1
- app/design/adminhtml/default/default/template/miniorange_2factor/mo2fConfig.phtml +3 -3
- package.xml +14 -56
app/code/community/miniOrange/2factor/Block/mo2fConfig.php
CHANGED
@@ -87,17 +87,15 @@ class MiniOrange_2factor_Block_mo2fConfig extends Mage_Core_Block_Template{
|
|
87 |
}
|
88 |
|
89 |
public function getConfig($config,$id=""){
|
90 |
-
$
|
91 |
-
if(
|
92 |
-
return $customer->getConfig($config,$id);
|
93 |
-
}
|
94 |
-
else if( !Mage::getSingleton('customer/session')->isLoggedIn() ) {
|
95 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
96 |
$id = $admin->getUserId();
|
97 |
-
return $
|
98 |
}
|
99 |
else{
|
100 |
-
|
|
|
101 |
}
|
102 |
}
|
103 |
|
87 |
}
|
88 |
|
89 |
public function getConfig($config,$id=""){
|
90 |
+
$user = Mage::helper('MiniOrange_2factor');
|
91 |
+
if( !Mage::getSingleton('customer/session')->isLoggedIn() ) {
|
|
|
|
|
|
|
92 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
93 |
$id = $admin->getUserId();
|
94 |
+
return $user->getConfig($config,$id);
|
95 |
}
|
96 |
else{
|
97 |
+
$id = Mage::getSingleton('customer/session')->getCustomer()->getId();
|
98 |
+
return $user->getConfig($config,$id);
|
99 |
}
|
100 |
}
|
101 |
|
app/code/community/miniOrange/2factor/Controllers/Adminhtml/IndexController.php
CHANGED
@@ -2,8 +2,7 @@
|
|
2 |
|
3 |
class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
|
4 |
{
|
5 |
-
|
6 |
-
private $defaultApiKey = "AJG97LGpOVVwFUuuPSij5IH6Kvlu6qEj";
|
7 |
|
8 |
public function indexAction(){
|
9 |
$this->loadLayout();
|
@@ -36,7 +35,7 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
36 |
$id = $admin->getUserId();
|
37 |
$content = json_decode($customer->check_customer($email), true);
|
38 |
if( strcasecmp( $content['status'], 'CUSTOMER_NOT_FOUND') == 0 ){
|
39 |
-
$content = json_decode($customer->send_otp_token($email,'EMAIL',$
|
40 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
41 |
Mage::getSingleton('admin/session')->setMytextid($content['txId']);
|
42 |
Mage::getSingleton('admin/session')->setOTPsent(1);
|
@@ -45,7 +44,6 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
45 |
$this->saveConfig('miniorange_2factor_email',$email,$id);
|
46 |
$this->saveConfig('miniorange_2factor_pass',$password,$id);
|
47 |
$this->saveConfig('miniorange_2factor_phone',$phone,$id);
|
48 |
-
$this->saveConfig('miniorange_2factor_admin_registered',$id,$id);
|
49 |
$this->displayMessage('OTP has been sent to your Email. Please check your mail and enter the otp below.',"SUCCESS");
|
50 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
51 |
}
|
@@ -68,7 +66,8 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
68 |
$storeConfig = new Mage_Core_Model_Config();
|
69 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
70 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
71 |
-
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
|
|
72 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
73 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
74 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
@@ -104,11 +103,11 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
104 |
$phone = Mage::getSingleton('core/session')->getaddPhone();
|
105 |
if(strcmp($otp,"")!=0){
|
106 |
$transactionId = Mage::getSingleton('admin/session')->getMytextid();
|
107 |
-
$content = json_decode($customer->validate_otp_token( 'EMAIL', null, $transactionId , $otp , $
|
108 |
-
|
109 |
if(strcasecmp($content['status'], 'SUCCESS') == 0) { //OTP validated and generate QRCode
|
110 |
$adminregistered = $helper->getConfig('mainAdmin',$id);
|
111 |
-
if($adminregistered
|
|
|
112 |
$this->mo2f_create_customer();
|
113 |
}
|
114 |
else{
|
@@ -165,7 +164,8 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
165 |
$storeConfig = new Mage_Core_Model_Config();
|
166 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
167 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
168 |
-
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
|
|
169 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
170 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
171 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
@@ -203,9 +203,7 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
203 |
if($helper->is_curl_installed()){
|
204 |
$email = $params['additional_email'];
|
205 |
$phone = $params['additional_phone'];
|
206 |
-
$
|
207 |
-
$id = $admin->getUserId();
|
208 |
-
$content = json_decode($customer->send_otp_token($email,'EMAIL',$this->defaultCustomerKey,$this->defaultApiKey), true);
|
209 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
210 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
211 |
$id = $admin->getUserId();
|
@@ -345,12 +343,11 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
345 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
346 |
$id = $admin->getUserId();
|
347 |
$email = $helper->getConfig('email',$id);
|
348 |
-
$content = json_decode($customer->send_otp_token($email,'EMAIL',$
|
349 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
350 |
Mage::getSingleton('admin/session')->setMytextid($content['txId']);
|
351 |
$this->saveConfig('miniorange_2factor_show_otp',1,$id);
|
352 |
$this->saveConfig('miniorange_2factor_login',0,$id);
|
353 |
-
$this->saveConfig('miniorange_2factor_admin_registered',$id,$id);
|
354 |
$this->displayMessage('OTP has been sent to your Email. Please check your mail and enter the otp below.',"SUCCESS");
|
355 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
356 |
}
|
@@ -377,7 +374,6 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
377 |
$id = $admin->getUserId();
|
378 |
$this->saveConfig('miniorange_2factor_show_otp',null,$id);
|
379 |
$this->saveConfig('miniorange_2factor_login',null,$id);
|
380 |
-
$this->saveConfig('miniorange_2factor_admin_registered',null,$id);
|
381 |
$this->saveConfig('miniorange_2factor_email',"",$id);
|
382 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
383 |
$this->saveConfig('miniorange_2factor_phone',"",$id);
|
@@ -432,7 +428,8 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
432 |
$storeConfig = new Mage_Core_Model_Config();
|
433 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
434 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
435 |
-
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
|
|
436 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
437 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
438 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
@@ -452,7 +449,8 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
452 |
$storeConfig = new Mage_Core_Model_Config();
|
453 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
454 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
455 |
-
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
|
|
456 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
457 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
458 |
$this->saveConfig('miniorange_2factor_login',0,$id);
|
@@ -492,7 +490,7 @@ class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Contro
|
|
492 |
private function forgotPass($email){
|
493 |
$customer = Mage::helper('MiniOrange_2factor/mo2fUtility');
|
494 |
$params = $this->getRequest()->getParams();
|
495 |
-
$content = json_decode($customer->forgot_password($email,$
|
496 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
497 |
$this->displayMessage('Your new password has been generated and sent to '.$email.'.',"SUCCESS");
|
498 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
2 |
|
3 |
class MiniOrange_2factor_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
|
4 |
{
|
5 |
+
|
|
|
6 |
|
7 |
public function indexAction(){
|
8 |
$this->loadLayout();
|
35 |
$id = $admin->getUserId();
|
36 |
$content = json_decode($customer->check_customer($email), true);
|
37 |
if( strcasecmp( $content['status'], 'CUSTOMER_NOT_FOUND') == 0 ){
|
38 |
+
$content = json_decode($customer->send_otp_token($email,'EMAIL',$helper->getdefaultCustomerKey(),$helper->getdefaultApiKey()), true); //send otp for verification
|
39 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
40 |
Mage::getSingleton('admin/session')->setMytextid($content['txId']);
|
41 |
Mage::getSingleton('admin/session')->setOTPsent(1);
|
44 |
$this->saveConfig('miniorange_2factor_email',$email,$id);
|
45 |
$this->saveConfig('miniorange_2factor_pass',$password,$id);
|
46 |
$this->saveConfig('miniorange_2factor_phone',$phone,$id);
|
|
|
47 |
$this->displayMessage('OTP has been sent to your Email. Please check your mail and enter the otp below.',"SUCCESS");
|
48 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
49 |
}
|
66 |
$storeConfig = new Mage_Core_Model_Config();
|
67 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
68 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
69 |
+
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
70 |
+
$storeConfig ->saveConfig('miniOrange/2factor/mainAdmin',$id, 'default', 0);
|
71 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
72 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
73 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
103 |
$phone = Mage::getSingleton('core/session')->getaddPhone();
|
104 |
if(strcmp($otp,"")!=0){
|
105 |
$transactionId = Mage::getSingleton('admin/session')->getMytextid();
|
106 |
+
$content = json_decode($customer->validate_otp_token( 'EMAIL', null, $transactionId , $otp , $helper->getdefaultCustomerKey(), $helper->getdefaultApiKey()),true);
|
|
|
107 |
if(strcasecmp($content['status'], 'SUCCESS') == 0) { //OTP validated and generate QRCode
|
108 |
$adminregistered = $helper->getConfig('mainAdmin',$id);
|
109 |
+
if($adminregistered==null){
|
110 |
+
Mage();
|
111 |
$this->mo2f_create_customer();
|
112 |
}
|
113 |
else{
|
164 |
$storeConfig = new Mage_Core_Model_Config();
|
165 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
166 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
167 |
+
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
168 |
+
$storeConfig ->saveConfig('miniOrange/2factor/mainAdmin',$id, 'default', 0);
|
169 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
170 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
171 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
203 |
if($helper->is_curl_installed()){
|
204 |
$email = $params['additional_email'];
|
205 |
$phone = $params['additional_phone'];
|
206 |
+
$content = json_decode($customer->send_otp_token($email,'EMAIL',$helper->getdefaultCustomerKey(),$helper->getdefaultApiKey()), true);
|
|
|
|
|
207 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
208 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
209 |
$id = $admin->getUserId();
|
343 |
$admin = Mage::getSingleton('admin/session')->getUser();
|
344 |
$id = $admin->getUserId();
|
345 |
$email = $helper->getConfig('email',$id);
|
346 |
+
$content = json_decode($customer->send_otp_token($email,'EMAIL',$helper->getdefaultCustomerKey(),$helper->getdefaultApiKey()), true); //send otp for verification
|
347 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
348 |
Mage::getSingleton('admin/session')->setMytextid($content['txId']);
|
349 |
$this->saveConfig('miniorange_2factor_show_otp',1,$id);
|
350 |
$this->saveConfig('miniorange_2factor_login',0,$id);
|
|
|
351 |
$this->displayMessage('OTP has been sent to your Email. Please check your mail and enter the otp below.',"SUCCESS");
|
352 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
353 |
}
|
374 |
$id = $admin->getUserId();
|
375 |
$this->saveConfig('miniorange_2factor_show_otp',null,$id);
|
376 |
$this->saveConfig('miniorange_2factor_login',null,$id);
|
|
|
377 |
$this->saveConfig('miniorange_2factor_email',"",$id);
|
378 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
379 |
$this->saveConfig('miniorange_2factor_phone',"",$id);
|
428 |
$storeConfig = new Mage_Core_Model_Config();
|
429 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
430 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
431 |
+
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
432 |
+
$storeConfig ->saveConfig('miniOrange/2factor/mainAdmin',$id, 'default', 0);
|
433 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
434 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
435 |
$this->saveConfig('miniorange_2factor_show_configure',1,$id);
|
449 |
$storeConfig = new Mage_Core_Model_Config();
|
450 |
$storeConfig ->saveConfig('miniOrange/2factor/customerKey',$customerKey['id'], 'default', 0);
|
451 |
$storeConfig ->saveConfig('miniOrange/2factor/apiKey',$customerKey['apiKey'], 'default', 0);
|
452 |
+
$storeConfig ->saveConfig('miniOrange/2factor/2factorToken',$customerKey['token'], 'default', 0);
|
453 |
+
$storeConfig ->saveConfig('miniOrange/2factor/mainAdmin',$id, 'default', 0);
|
454 |
$this->saveConfig('miniorange_2factor_pass',"",$id);
|
455 |
$this->saveConfig('miniorange_2factor_show_otp',0,$id);
|
456 |
$this->saveConfig('miniorange_2factor_login',0,$id);
|
490 |
private function forgotPass($email){
|
491 |
$customer = Mage::helper('MiniOrange_2factor/mo2fUtility');
|
492 |
$params = $this->getRequest()->getParams();
|
493 |
+
$content = json_decode($customer->forgot_password($email,$helper->getdefaultCustomerKey(),$helper->getdefaultApiKey()), true);
|
494 |
if(strcasecmp($content['status'], 'SUCCESS') == 0){
|
495 |
$this->displayMessage('Your new password has been generated and sent to '.$email.'.',"SUCCESS");
|
496 |
$this->redirect("miniorange_2factor/adminhtml_index/index");
|
app/code/community/miniOrange/2factor/Helper/Data.php
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
<?php
|
2 |
class MiniOrange_2factor_Helper_Data extends Mage_Core_Helper_Abstract
|
3 |
{
|
4 |
-
|
|
|
|
|
5 |
|
6 |
function adminExists($username){
|
7 |
$adminuser = Mage::getModel('admin/user');
|
@@ -18,6 +20,16 @@ class MiniOrange_2factor_Helper_Data extends Mage_Core_Helper_Abstract
|
|
18 |
return $this->hostname;
|
19 |
}
|
20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
function getAdmin($username){
|
22 |
$adminuser = Mage::getModel('admin/user');
|
23 |
$adminuser->loadByUsername($username);
|
@@ -69,7 +81,7 @@ class MiniOrange_2factor_Helper_Data extends Mage_Core_Helper_Abstract
|
|
69 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_login');
|
70 |
break;
|
71 |
case 'mainAdmin':
|
72 |
-
$result = Mage::
|
73 |
break;
|
74 |
case 'downloaded':
|
75 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_downloaded_app');
|
@@ -77,12 +89,15 @@ class MiniOrange_2factor_Helper_Data extends Mage_Core_Helper_Abstract
|
|
77 |
case 'phone':
|
78 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_phone');
|
79 |
break;
|
80 |
-
case '
|
81 |
$result = Mage::getModel('customer/customer')->load($id)->getData('miniorange_phone');
|
82 |
break;
|
83 |
-
case '
|
84 |
$result = Mage::getModel('customer/customer')->load($id)->getData('miniorange_mobileconfigured');
|
85 |
break;
|
|
|
|
|
|
|
86 |
default:
|
87 |
return;
|
88 |
break;
|
1 |
<?php
|
2 |
class MiniOrange_2factor_Helper_Data extends Mage_Core_Helper_Abstract
|
3 |
{
|
4 |
+
private $hostname = "https://auth.miniorange.com";
|
5 |
+
private $defaultCustomerKey = "16352";
|
6 |
+
private $defaultApiKey = "AJG97LGpOVVwFUuuPSij5IH6Kvlu6qEj";
|
7 |
|
8 |
function adminExists($username){
|
9 |
$adminuser = Mage::getModel('admin/user');
|
20 |
return $this->hostname;
|
21 |
}
|
22 |
|
23 |
+
function getdefaultCustomerKey(){
|
24 |
+
return $this->defaultCustomerKey;
|
25 |
+
}
|
26 |
+
|
27 |
+
|
28 |
+
function getdefaultApiKey(){
|
29 |
+
return $this->defaultApiKey;
|
30 |
+
}
|
31 |
+
|
32 |
+
|
33 |
function getAdmin($username){
|
34 |
$adminuser = Mage::getModel('admin/user');
|
35 |
$adminuser->loadByUsername($username);
|
81 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_login');
|
82 |
break;
|
83 |
case 'mainAdmin':
|
84 |
+
$result = $result = Mage::getStoreConfig('miniOrange/2factor/mainAdmin');
|
85 |
break;
|
86 |
case 'downloaded':
|
87 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_downloaded_app');
|
89 |
case 'phone':
|
90 |
$result = Mage::getModel('admin/user')->load($id)->getData('miniorange_2factor_phone');
|
91 |
break;
|
92 |
+
case 'customer_phone':
|
93 |
$result = Mage::getModel('customer/customer')->load($id)->getData('miniorange_phone');
|
94 |
break;
|
95 |
+
case 'customer_mobile_configured':
|
96 |
$result = Mage::getModel('customer/customer')->load($id)->getData('miniorange_mobileconfigured');
|
97 |
break;
|
98 |
+
case 'miniorange_email':
|
99 |
+
$result = Mage::getModel('customer/customer')->load($id)->getData('miniorange_email');
|
100 |
+
break;
|
101 |
default:
|
102 |
return;
|
103 |
break;
|
app/code/community/miniOrange/2factor/Helper/mo2fUtility.php
CHANGED
@@ -23,10 +23,10 @@ Contains Request Calls to Customer service.
|
|
23 |
**/
|
24 |
class MiniOrange_2factor_Helper_mo2fUtility extends Mage_Core_Helper_Abstract{
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
|
31 |
function check_customer($email){
|
32 |
$url = $this->hostname . '/moas/rest/customer/check-if-exists';
|
23 |
**/
|
24 |
class MiniOrange_2factor_Helper_mo2fUtility extends Mage_Core_Helper_Abstract{
|
25 |
|
26 |
+
private $email;
|
27 |
+
private $phone;
|
28 |
+
private $hostname = "https://auth.miniorange.com";
|
29 |
+
private $pluginName = 'Magento 2 Factor Authentication Plugin';
|
30 |
|
31 |
function check_customer($email){
|
32 |
$url = $this->hostname . '/moas/rest/customer/check-if-exists';
|
app/code/community/miniOrange/2factor/Model/Observer.php
CHANGED
@@ -184,12 +184,15 @@ class MiniOrange_2factor_Model_Observer
|
|
184 |
Mage::dispatchEvent('admin_session_user_login_success',array('user'=>$user));
|
185 |
}
|
186 |
|
187 |
-
|
188 |
-
//-----------------//
|
189 |
-
public function customerLogin(Varien_Event_Observer $observer){
|
190 |
$request = Mage::app()->getRequest();
|
191 |
$session = Mage::getSingleton('customer/session');
|
192 |
-
$session->
|
|
|
|
|
|
|
|
|
|
|
193 |
}
|
194 |
|
195 |
|
@@ -199,14 +202,13 @@ class MiniOrange_2factor_Model_Observer
|
|
199 |
throw Mage::exception('Mage_Core','Authentication Failed! Please try again!',2);
|
200 |
}
|
201 |
|
202 |
-
|
203 |
$redirectUrl = Mage::getModel('core/url')->getUrl('twofactorauth/Index/validationPage');
|
204 |
$session = Mage::getSingleton('customer/session');
|
205 |
$session->setOriginalAfterAuthUrl($session->getAfterAuthUrl());
|
206 |
-
$session->
|
207 |
}
|
208 |
else{
|
209 |
-
Mage::helper('MiniOrange_2factor')->displayMessage('Admin has Enabled Two Factor Authentication for your account. Please configure your account below.','NOTICE');
|
210 |
return $this;
|
211 |
}
|
212 |
|
184 |
Mage::dispatchEvent('admin_session_user_login_success',array('user'=>$user));
|
185 |
}
|
186 |
|
187 |
+
public function customerLogin(Varien_Event_Observer $observer){
|
|
|
|
|
188 |
$request = Mage::app()->getRequest();
|
189 |
$session = Mage::getSingleton('customer/session');
|
190 |
+
$customer = $session->getCustomer();
|
191 |
+
$id = $customer->getId();
|
192 |
+
if (Mage::helper('MiniOrange_2factor')->getConfig('isCustomerEnabled') && !Mage::helper('MiniOrange_2factor')->getConfig('customer_mobile_configured',$id)) {
|
193 |
+
Mage::helper('MiniOrange_2factor')->displayMessage('Admin has Enabled Two Factor Authentication for your account. Please configure your account below.','NOTICE');
|
194 |
+
$session->setAfterAuthUrl(Mage::getUrl('twofactorauth/Index/configureTwoFactorPage'));
|
195 |
+
}
|
196 |
}
|
197 |
|
198 |
|
202 |
throw Mage::exception('Mage_Core','Authentication Failed! Please try again!',2);
|
203 |
}
|
204 |
|
205 |
+
if (Mage::helper('MiniOrange_2factor')->getConfig('isCustomerEnabled')) {
|
206 |
$redirectUrl = Mage::getModel('core/url')->getUrl('twofactorauth/Index/validationPage');
|
207 |
$session = Mage::getSingleton('customer/session');
|
208 |
$session->setOriginalAfterAuthUrl($session->getAfterAuthUrl());
|
209 |
+
$session->setBeforeAuthUrl($redirectUrl);
|
210 |
}
|
211 |
else{
|
|
|
212 |
return $this;
|
213 |
}
|
214 |
|
app/code/community/miniOrange/2factor/etc/config.xml
CHANGED
@@ -7,28 +7,10 @@
|
|
7 |
<!-- This must exactly match the namespace and module's folder names, with directory separators replaced by underscores -->
|
8 |
<MiniOrange_2factor>
|
9 |
<!-- The version of our module -->
|
10 |
-
<version>1.0.
|
11 |
</MiniOrange_2factor>
|
12 |
</modules>
|
13 |
-
|
14 |
-
<frontend>
|
15 |
-
<routers>
|
16 |
-
<MiniOrange_2factor_customer>
|
17 |
-
<use>standard</use>
|
18 |
-
<args>
|
19 |
-
<module>MiniOrange_2factor_Customer</module>
|
20 |
-
<frontName>twofactorauth</frontName>
|
21 |
-
</args>
|
22 |
-
</MiniOrange_2factor_customer>
|
23 |
-
</routers>
|
24 |
-
<layout>
|
25 |
-
<updates>
|
26 |
-
<miniOrange_2factor_layout>
|
27 |
-
<file>miniorange_2factor_layout.xml</file>
|
28 |
-
</miniOrange_2factor_layout>
|
29 |
-
</updates>
|
30 |
-
</layout>
|
31 |
-
</frontend>
|
32 |
<!-- we are making changes to the backend -->
|
33 |
<admin>
|
34 |
<routers>
|
@@ -113,32 +95,6 @@
|
|
113 |
</observers>
|
114 |
</controller_action_layout_generate_blocks_before>
|
115 |
-->
|
116 |
-
<customer_login>
|
117 |
-
<observers>
|
118 |
-
<miniorange_login>
|
119 |
-
<class>MiniOrange_2factor/observer</class>
|
120 |
-
<method>customerLogin</method>
|
121 |
-
</miniorange_login>
|
122 |
-
</observers>
|
123 |
-
</customer_login>
|
124 |
-
<customer_customer_authenticated>
|
125 |
-
<observers>
|
126 |
-
<miniorange_login_authenticated>
|
127 |
-
<type>singleton</type>
|
128 |
-
<class>MiniOrange_2factor/observer</class>
|
129 |
-
<method>customerAuthenticateAfter</method>
|
130 |
-
</miniorange_login_authenticated>
|
131 |
-
</observers>
|
132 |
-
</customer_customer_authenticated>
|
133 |
-
<miniOrange_validation_event>
|
134 |
-
<observers>
|
135 |
-
<validation>
|
136 |
-
<type>singleton</type>
|
137 |
-
<class>MiniOrange_2factor/observer</class>
|
138 |
-
<method>validationHandler</method>
|
139 |
-
</validation>
|
140 |
-
</observers>
|
141 |
-
</miniOrange_validation_event>
|
142 |
</events>
|
143 |
<!-- Defining our resources -->
|
144 |
<resources>
|
7 |
<!-- This must exactly match the namespace and module's folder names, with directory separators replaced by underscores -->
|
8 |
<MiniOrange_2factor>
|
9 |
<!-- The version of our module -->
|
10 |
+
<version>1.0.5</version>
|
11 |
</MiniOrange_2factor>
|
12 |
</modules>
|
13 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
<!-- we are making changes to the backend -->
|
15 |
<admin>
|
16 |
<routers>
|
95 |
</observers>
|
96 |
</controller_action_layout_generate_blocks_before>
|
97 |
-->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
</events>
|
99 |
<!-- Defining our resources -->
|
100 |
<resources>
|
app/code/community/miniOrange/2factor/sql/MiniOrange_2factor_setup/mysql4-install-0.0.1.php
CHANGED
@@ -14,7 +14,6 @@ $installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorang
|
|
14 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_show_configure', 'int null');
|
15 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_validated', 'int null');
|
16 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_login', 'int null');
|
17 |
-
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_admin_registered', 'int null');
|
18 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_downloaded_app', 'int null');
|
19 |
|
20 |
|
14 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_show_configure', 'int null');
|
15 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_validated', 'int null');
|
16 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_login', 'int null');
|
|
|
17 |
$installer->getConnection()->addColumn($this->getTable('admin/user'), 'miniorange_2factor_downloaded_app', 'int null');
|
18 |
|
19 |
|
app/design/adminhtml/default/default/template/miniorange_2factor/mo2fConfig.phtml
CHANGED
@@ -149,7 +149,7 @@
|
|
149 |
</tr>
|
150 |
<tr>
|
151 |
<td><b><font color="#FF0000">*</font>Phone number:</b></td>
|
152 |
-
<td><input class="" type="text" name="
|
153 |
</tr>
|
154 |
</table>
|
155 |
<br>
|
@@ -261,8 +261,8 @@
|
|
261 |
<div style="margin-left:4%;"><b>Note:</b> This option is checked by default. It will enable 2-Factor only for admins, other users can still login with their password.<p>[ <a id="preview4" href="#slider2">Click Here</a> for a preview. ]</p></div>
|
262 |
<br>
|
263 |
<!--<input type="checkbox" id="mo2f_customer_activation" name="customer_activation" value="1" <?php echo $this->isCustomerEnabled(); ?> /><b>Enable 2-Factor for Customers.</b>
|
264 |
-
<div style="margin-left:4%;"><b>Note:</b> This will enable 2-Factor for your customers.</div
|
265 |
-
<br
|
266 |
<div class="button-align"><input type="submit" name="submit" value="Save Settings" class="button button-primary button-large" /></div>
|
267 |
</form>
|
268 |
</div>
|
149 |
</tr>
|
150 |
<tr>
|
151 |
<td><b><font color="#FF0000">*</font>Phone number:</b></td>
|
152 |
+
<td><input class="" type="text" name="additional_phone" id="additional_phone" required title="Phone with country code eg. +1xxxxxxxxxx" placeholder="Phone with country code eg. +1xxxxxxxxxx" value="" pattern="[\+]?[0-9]{1,4}\s?[0-9]{10}"/><span class="required">*We will call only if you need support.</span></td>
|
153 |
</tr>
|
154 |
</table>
|
155 |
<br>
|
261 |
<div style="margin-left:4%;"><b>Note:</b> This option is checked by default. It will enable 2-Factor only for admins, other users can still login with their password.<p>[ <a id="preview4" href="#slider2">Click Here</a> for a preview. ]</p></div>
|
262 |
<br>
|
263 |
<!--<input type="checkbox" id="mo2f_customer_activation" name="customer_activation" value="1" <?php echo $this->isCustomerEnabled(); ?> /><b>Enable 2-Factor for Customers.</b>
|
264 |
+
<div style="margin-left:4%;"><b>Note:</b> This will enable 2-Factor for your customers.</div>-->
|
265 |
+
<br>
|
266 |
<div class="button-align"><input type="submit" name="submit" value="Save Settings" class="button button-primary button-large" /></div>
|
267 |
</form>
|
268 |
</div>
|
package.xml
CHANGED
@@ -1,72 +1,30 @@
|
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>miniOrange_2factor</name>
|
4 |
-
<version>1.0.
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License (GPL)</license>
|
7 |
<channel>community</channel>
|
8 |
<extends/>
|
9 |
-
<summary>
|
10 |
-
<description>Two-
|
11 |

|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
So every time you login into your Web site there is a chance that someone is sniffing or logging the password, which can later be used to login to your store. Clearly passwords are not enough for protecting your store. 
|
20 |
-

|
21 |
-
Use Two-Factor Authentication
|
22 |
-

|
23 |
-
The most practical way to strengthen authentication is to require a second factor after the username/password stage. Since a password is something that you know, ensuring that the you can thwart attackers that steal or gain access to your password.
|
24 |
-
miniOrange Two-Factor Authentication Overview
|
25 |
-

|
26 |
-
miniOrange Two-Factor Authentication provides a highly secure & easy to setup Two-Factor Authentication for your Magento store. Rather than relying on a password alone, which can be phished or guessed, miniOrange Two Factor authentication adds a second layer of security to your Magento store. You can protect your store by using miniOrange Two Factor authentication, which combines something you know or something you have (smartphone) to reliably confirm your identity.
|
27 |
-

|
28 |
-
Features/Benefits
|
29 |
-

|
30 |
-
Secure login into your Magento backend
|
31 |
-
With miniOrange Two-Factor Authentication you can can:
|
32 |
-

|
33 |
-
Securely login using our miniOrange Authenticator app
|
34 |
-
Both iPhone and Android phones are supported.
|
35 |
-
If your phone is lost or stolen or discharged, it offers an alternate login method.
|
36 |
-
If your phone is offline, you can use a one time passcode (soft token) generated by app to login.
|
37 |
-
The code generated are time based and keep changin every 30 seconds so even if someone knows your password, they will not be able to login to your backend.
|
38 |
-
Choose 15+ different authentication methods
|
39 |
-
* One time passcodes (OTP) over SMS 
|
40 |
-
* OTP over Email 
|
41 |
-
* OTP over SMS and Email 
|
42 |
-
* Out of Band SMS 
|
43 |
-
* Out of Band Email 
|
44 |
-
* Soft Token 
|
45 |
-
* Push Notification 
|
46 |
-
* USB based Hardware token (yubico) 
|
47 |
-
* Security Questions 
|
48 |
-
* Mobile Authentication 
|
49 |
-
* Voice Authentication (Biometrics) 
|
50 |
-
* Phone Verification 
|
51 |
-
* Device Identification 
|
52 |
-
* Location 
|
53 |
-
* Time of Access 
|
54 |
-
* User Behavior
|
55 |
-

|
56 |
-
Feature phone, landline are also supported. You need to contact info@miniorange.com to enable it. Trusted Device, Location, Time of access and user behavior is also supported. You need to enable this by contacting info@miniorange.com
|
57 |
-

|
58 |
-
For a complete list of authentication methods please visit http://miniorange.com/strong_auth . If you want to have any other 2-factor for your Magento site, Contact us.</p>
|
59 |
-
You can choose from any of the above authentication methods to augment your password based authentication. miniOrange authentication service works with all phone types, from landlines to smart-phone platforms.
|
60 |

|
61 |
Contact Us
|
62 |

|
63 |
For support please email us at info@miniorange.com or call us at +1 978 658 9387</description>
|
64 |
-
<notes
|
65 |
-
Bug fixes</notes>
|
66 |
<authors><author><name>miniOrange inc.</name><user>miniOrange</user><email>info@miniorange.com</email></author></authors>
|
67 |
-
<date>2015-08-
|
68 |
-
<time>12:
|
69 |
-
<contents><target name="magecommunity"><dir name="miniOrange"><dir name="2factor"><dir name="Block"><file name="mo2fConfig.php" hash="
|
70 |
<compatible/>
|
71 |
<dependencies><required><php><min>5.3.10</min><max>5.6.11</max></php><extension><name>curl</name><min>7.40.0</min><max>7.44.0</max></extension></required></dependencies>
|
72 |
</package>
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>miniOrange_2factor</name>
|
4 |
+
<version>1.0.5</version>
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License (GPL)</license>
|
7 |
<channel>community</channel>
|
8 |
<extends/>
|
9 |
+
<summary>This plugin enablesTwo Factor Authentication for admins for your Magento backend.</summary>
|
10 |
+
<description>With miniOrange Two factor authentication product is a professionally developed product that can increase the safety of your magento admin login by adding a strong two-factor authentification to it. First the admin downloads the miniOrange authenticator app onto his phone and keeps it handy. In the next step (secure key exchange), the admin is shown a unique encrypted QR code on the screen and asked to scan it with the miniOrange authenticator app. The admin scans the encrypted QR code on the screen with the app. This is actually a secure and unique key exchange that happens between the admin and the miniOrange authentication server. From this point onwards, only the authentication server and the admins phone can generate the same one time passcode because they are the only ones that have the secret key associated with this admin.
|
11 |

|
12 |
+
After the secure key exchange step, the login is splitted into two steps.
|
13 |
+
The first is the standard form where you must insert your magento login userid and password.
|
14 |
+
In the second step you are shown an encrypted QR code on the screen that you can scan succesfully ONLY with your own phone. The QR code scan will be validated by an authentification server. Thus, a user can only access the magento backend if username, password and the QR code match.
|
15 |
+
If the phone does not have internet connectivity - Admins can simply swipe the screen on their app and a unique one time passcode will appear which will remain valid for one minute. By entering this number, they can login.
|
16 |
+
If the phone is lost or stolen - Admins can use the alternate two factor method where they can deliver a one time passcode to their email and use that to login.
|
17 |
+
If the admins do not have smart phones and hence can not use apps, then they can use OTP over SMS as their second factor.If the admins only have a landline, they can use phone verification where they will get a call which will say a unique one time passcode and they can use it to login. For ease of use, the miniOrange two factor authentication product also has the ability to remember the device that the admin is logging in from so that it wont ask for the second factor again and again if the admin prefers the system to remember his device.
|
18 |
+
About the miniOrange two factor authentication method, it is a unique method providing a strong two-factor authentication, combining something you know (a PIN or password) with a physical device generating encrypted one time passwords (which is your phone). It protects your online identity from malware and hackers on a high security level. Features: - Superior security - Easy to use.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |

|
20 |
Contact Us
|
21 |

|
22 |
For support please email us at info@miniorange.com or call us at +1 978 658 9387</description>
|
23 |
+
<notes>bug fixes</notes>
|
|
|
24 |
<authors><author><name>miniOrange inc.</name><user>miniOrange</user><email>info@miniorange.com</email></author></authors>
|
25 |
+
<date>2015-08-27</date>
|
26 |
+
<time>12:36:59</time>
|
27 |
+
<contents><target name="magecommunity"><dir name="miniOrange"><dir name="2factor"><dir name="Block"><file name="mo2fConfig.php" hash="f346c34cfde56cb966956e318ec5ba8c"/></dir><dir name="Controllers"><dir name="Adminhtml"><file name="IndexController.php" hash="91fb470c3971fcece6de35dd52b05309"/><dir name="Login"><file name="miniOrangeController.php" hash="78d1f305733dc764a87229ea4646a479"/></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="3a2351470af49914b3a233d0a28a850f"/><file name="mo2fUtility.php" hash="e4a203051b31feeec976d0a25ed277a6"/></dir><dir name="Model"><file name="Observer.php" hash="65fb169508d5043da2ae98386d0f588a"/><file name="Words.php" hash="ee26cc8582d5bbad5632a6e02129f815"/></dir><dir name="etc"><file name="adminhtml.xml" hash="955f9f87d1a5df39eea9fd69379af0ee"/><file name="config.xml" hash="bc19c00e0481dbc2d31ae3a653ddb5ff"/></dir><dir name="sql"><dir name="MiniOrange_2factor_setup"><file name="mysql4-install-0.0.1.php" hash="e91ca384273d63ae47efe68c4830c85f"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="miniorange_2factor_admin.xml" hash="49671205b07f54681d1f93fec9ee4d67"/></dir><dir name="template"><dir name="miniorange_2factor"><file name="login.phtml" hash="36f8b7177bafaf4e916b1d9e5f382e50"/><file name="mo2fConfig.phtml" hash="c081fca498b12e919b67ea879209285d"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="miniorange_2factor.xml" hash="609cb91239fb4a89f64ae28d4b5b5398"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><dir name="MiniOrange_2factor"><file name="appstore.png" hash="1ac5eb0f971fd8cbeac4d3e4449cd9f0"/><file name="arrow.png" hash="47bdba61de621d8ca74c16f6dd5b6565"/><file name="authenticate.png" hash="052bcae5504f3a9c61365ecf8ab0c4e7"/><file name="authvalidate.png" hash="a01eaf3a0002b3e7115813fd4e4efe1a"/><file name="cachesetting.png" hash="15942adf97c0d48abdf2c583c94eb4f5"/><file name="clickconfiguremobile.png" hash="3ee49ca9596e3ad507d66aca43466ea3"/><file name="clickconfiguremobile2.png" hash="fc0ff15007ea57e3ceef75235056dc88"/><file name="configurefirsttime.png" hash="c6982bcd3f70080d893e3da11d2a77d8"/><file name="configuremobile.png" hash="013d6599af7a31fb53a895d877ab1ffe"/><file name="forgot-phone.png" hash="64cfe82547e4db88d025346477025cfe"/><file name="forgotphone.png" hash="4272645ec478f1479fc3dc56df5dd89b"/><file name="loggedin.png" hash="70cc5cad9c475ef9420aa3d70bc43102"/><file name="login1.png" hash="c0dce259d0e2e84957ba77c6e2e78abb"/><file name="login2.png" hash="99e2c32c2fd5f9c9acf6a8002e1d44ac"/><file name="login3.png" hash="305c7bbdb97da888970b7225641757f0"/><file name="loginsettings.png" hash="811b9792a0e47f7e483d01a7ded0ccd0"/><file name="mail.png" hash="751f9588f2e2aac3ec47a6b0ebb2fa4d"/><file name="miniorange_logo.png" hash="b1cd21c2deeb5f199fb55de487bf950b"/><file name="mobileconfigurebutton.png" hash="747a6057cd50099e1cb3b5041320bd85"/><file name="mobilescan.png" hash="dec68c53b12944a45140d909af803fdd"/><file name="mobilesuccess.png" hash="d977fd41088cf0677f33e77de13da56c"/><file name="otp.png" hash="74dc1d7644af2013d256852d26bc920b"/><file name="phone-offline.png" hash="81b25f8125b13fd4d96c23a6fa84574e"/><file name="playStore.png" hash="fbca6f8b28d05c3bcd833965289a20c2"/><file name="processing.png" hash="56b1a14bd1558354250a7a232a4d16e7"/><file name="register.png" hash="37be41049f1d79215322a8cf908bf7b3"/><file name="right.png" hash="2321d72c95ee1fd5708199f56f213136"/><file name="savecache.png" hash="cf686304f47b080ec98930be8bb0f869"/><file name="scanqr.png" hash="dc4c1d070d9b336c790cd2d1d5315ee6"/><file name="sendingotp.png" hash="28c93249e717916d0f3c974b1cd2af7d"/><file name="settings.png" hash="a3e0382615d3f19f5a0dab4d4accbf2d"/><file name="softokenmobile.png" hash="624d589cdfa031df456e25a2ff034e63"/><file name="softtoken.png" hash="804bd9b0a3a600e6f349a6aa4ea00899"/><file name="sync.png" hash="8fffca24e6184fc3f9af8e20feac430b"/><file name="wrong.png" hash="6bd49538f79c4722610c5535f38213af"/></dir></dir></dir></dir></dir></target></contents>
|
28 |
<compatible/>
|
29 |
<dependencies><required><php><min>5.3.10</min><max>5.6.11</max></php><extension><name>curl</name><min>7.40.0</min><max>7.44.0</max></extension></required></dependencies>
|
30 |
</package>
|