Version Notes
- 1.0.0: version stable
Download this release
Release Info
Developer | diglin |
Extension | Diglin_Github |
Version | 1.0.0 |
Comparing to | |
See all releases |
Version 1.0.0
- app/code/community/Diglin/Github/Block/Account/Existing.php +25 -0
- app/code/community/Diglin/Github/Block/Account/Register.php +30 -0
- app/code/community/Diglin/Github/Block/Adminhtml/Grid.php +25 -0
- app/code/community/Diglin/Github/Helper/Data.php +133 -0
- app/code/community/Diglin/Github/Model/Adapter/Oauth2.php +47 -0
- app/code/community/Diglin/Github/Model/Confirmation.php +32 -0
- app/code/community/Diglin/Github/Model/Log.php +24 -0
- app/code/community/Diglin/Github/Model/Observer.php +28 -0
- app/code/community/Diglin/Github/Model/Resource/Confirmation.php +28 -0
- app/code/community/Diglin/Github/Model/Resource/Confirmation/Collection.php +25 -0
- app/code/community/Diglin/Github/Model/Resource/Setup.php +19 -0
- app/code/community/Diglin/Github/Model/System/Config/Backend/Oauth.php +30 -0
- app/code/community/Diglin/Github/controllers/AccountController.php +392 -0
- app/code/community/Diglin/Github/etc/adminhtml.xml +25 -0
- app/code/community/Diglin/Github/etc/config.xml +126 -0
- app/code/community/Diglin/Github/etc/system.xml +71 -0
- app/code/community/Diglin/Github/sql/github_setup/install-1.0.0.0.php +88 -0
- app/design/frontend/base/default/layout/github.xml +112 -0
- app/design/frontend/base/default/template/github/customer/button.phtml +21 -0
- app/design/frontend/base/default/template/github/customer/create.phtml +84 -0
- app/design/frontend/base/default/template/github/customer/existing.phtml +53 -0
- app/design/frontend/base/default/template/github/customer/fields.phtml +27 -0
- app/design/frontend/base/default/template/github/customer/info.phtml +37 -0
- app/design/frontend/base/default/template/github/customer/login.phtml +30 -0
- app/etc/modules/Diglin_Github.xml +8 -0
- app/locale/en_US/template/email/github/existing_customer_link_confirmation.html +35 -0
- lib/Oauth2/Client.php +513 -0
- lib/Oauth2/GrantType/AuthorizationCode.php +41 -0
- lib/Oauth2/GrantType/ClientCredentials.php +25 -0
- lib/Oauth2/GrantType/IGrantType.php +15 -0
- lib/Oauth2/GrantType/Password.php +41 -0
- lib/Oauth2/GrantType/RefreshToken.php +34 -0
- lib/Oauth2/Test.php +38 -0
- package.xml +46 -0
app/code/community/Diglin/Github/Block/Account/Existing.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Block_Account_Existing extends Mage_Customer_Block_Form_Register
|
19 |
+
{
|
20 |
+
|
21 |
+
public function getPostActionUrl()
|
22 |
+
{
|
23 |
+
return $this->getUrl('github/account/existing');
|
24 |
+
}
|
25 |
+
}
|
app/code/community/Diglin/Github/Block/Account/Register.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Block_Account_Register extends Mage_Customer_Block_Form_Register
|
19 |
+
{
|
20 |
+
|
21 |
+
public function getPostActionUrl()
|
22 |
+
{
|
23 |
+
return $this->getUrl('github/account/createpost');
|
24 |
+
}
|
25 |
+
|
26 |
+
public function getBackUrl()
|
27 |
+
{
|
28 |
+
return $this->getUrl('customer/account/index');
|
29 |
+
}
|
30 |
+
}
|
app/code/community/Diglin/Github/Block/Adminhtml/Grid.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* @category Diglin
|
6 |
+
* @package Diglin_Github
|
7 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
8 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
9 |
+
*/
|
10 |
+
class Diglin_Github_Block_Adminhtml_Grid extends Mage_Adminhtml_Block_Customer_Grid
|
11 |
+
{
|
12 |
+
|
13 |
+
protected function _prepareColumns()
|
14 |
+
{
|
15 |
+
if (Mage::getStoreConfigFlag('github/config/grid')) {
|
16 |
+
// Set a new column username after the column name
|
17 |
+
$this->addColumnAfter('github_login', array(
|
18 |
+
'header' => Mage::helper('github')->__('Github'),
|
19 |
+
'index' => 'github_login'
|
20 |
+
),
|
21 |
+
'name');
|
22 |
+
}
|
23 |
+
return parent::_prepareColumns();
|
24 |
+
}
|
25 |
+
}
|
app/code/community/Diglin/Github/Helper/Data.php
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Helper_Data extends Mage_Core_Helper_Abstract
|
19 |
+
{
|
20 |
+
public function getSession()
|
21 |
+
{
|
22 |
+
return Mage::getSingleton('customer/session');
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
*
|
27 |
+
* @param string $token
|
28 |
+
* @return string
|
29 |
+
*/
|
30 |
+
public function setAccessToken ($token)
|
31 |
+
{
|
32 |
+
return $this->getSession()->setData('github_access_token', $token);
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
*
|
37 |
+
* @return string
|
38 |
+
*/
|
39 |
+
public function getAccessToken ()
|
40 |
+
{
|
41 |
+
return $this->getSession()->getData('github_access_token');
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* The parameter data should be similar to
|
46 |
+
* <pre>
|
47 |
+
* array(29) {
|
48 |
+
* ["blog"] => string(21) "http://www.diglin.com"
|
49 |
+
* ["location"] => string(11) "Switzerland"
|
50 |
+
* ["type"] => string(4) "User"
|
51 |
+
* ["subscriptions_url"] => string(49) "https://api.github.com/users/diglin/subscriptions"
|
52 |
+
* ["url"] => string(35) "https://api.github.com/users/diglin"
|
53 |
+
* ["repos_url"] => string(41) "https://api.github.com/users/diglin/repos"
|
54 |
+
* ["gravatar_id"] => string(32) "5cfc92dca620b0aa0bbc2f12d9b5bfc7"
|
55 |
+
* ["avatar_url"] => string(158) "https://secure.gravatar.com/avatar/5cfc92dca620b0aa0bbc2f12d9b5bfc7?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"
|
56 |
+
* ["email"] => NULL
|
57 |
+
* ["received_events_url"] => string(51) "https://api.github.com/users/diglin/received_events"
|
58 |
+
* ["html_url"] => string(25) "https://github.com/diglin"
|
59 |
+
* ["company"] => NULL
|
60 |
+
* ["events_url"] => string(52) "https://api.github.com/users/diglin/events{/privacy}"
|
61 |
+
* ["organizations_url"] => string(40) "https://api.github.com/users/diglin/orgs"
|
62 |
+
* ["login"] => string(6) "diglin"
|
63 |
+
* ["public_gists"] => int(0)
|
64 |
+
* ["updated_at"] => string(20) "2013-01-22T20:03:38Z"
|
65 |
+
* ["gists_url"] => string(51) "https://api.github.com/users/diglin/gists{/gist_id}"
|
66 |
+
* ["hireable"] => bool(false)
|
67 |
+
* ["public_repos"] => int(7)
|
68 |
+
* ["followers"] => int(2)
|
69 |
+
* ["following"] => int(6)
|
70 |
+
* ["name"] => string(13) "Sylvain Rayé"
|
71 |
+
* ["starred_url"] => string(58) "https://api.github.com/users/diglin/starred{/owner}{/repo}"
|
72 |
+
* ["bio"] => NULL
|
73 |
+
* ["followers_url"] => string(45) "https://api.github.com/users/diglin/followers"
|
74 |
+
* ["id"] => int(1337461)
|
75 |
+
* ["created_at"] => string(20) "2012-01-17T16:48:53Z"
|
76 |
+
* ["following_url"] => string(45) "https://api.github.com/users/diglin/following"
|
77 |
+
* }
|
78 |
+
* </pre>
|
79 |
+
*
|
80 |
+
* @param array $data
|
81 |
+
* @return Varien_Object
|
82 |
+
*/
|
83 |
+
public function setUserData ($data)
|
84 |
+
{
|
85 |
+
return $this->getSession()->setData('github_data', $data);
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* @see $this->setUserData() to see the data format returned
|
90 |
+
*
|
91 |
+
* @return array
|
92 |
+
*/
|
93 |
+
public function getUserData ()
|
94 |
+
{
|
95 |
+
return new Varien_Object($this->getSession()->getData('github_data'));
|
96 |
+
}
|
97 |
+
|
98 |
+
public function getCustomer($githubId)
|
99 |
+
{
|
100 |
+
/* @var $resource Mage_Customer_Model_Resource_Customer_Collection */
|
101 |
+
$resource = Mage::getResourceModel('customer/customer_collection');
|
102 |
+
|
103 |
+
return $resource->addAttributeToFilter('github_id', $githubId)
|
104 |
+
->load()
|
105 |
+
->getFirstItem();
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Send corresponding email template
|
110 |
+
*
|
111 |
+
* @param string $emailTemplate configuration path of email template
|
112 |
+
* @param string $emailSender configuration path of email identity
|
113 |
+
* @param array $templateParams
|
114 |
+
* @param int|null $storeId
|
115 |
+
* @return Mage_Customer_Model_Customer
|
116 |
+
*/
|
117 |
+
public function sendEmailTemplate($template, $sender, $templateParams = array(), $customer, $storeId = null)
|
118 |
+
{
|
119 |
+
/** @var $mailer Mage_Core_Model_Email_Template_Mailer */
|
120 |
+
$mailer = Mage::getModel('core/email_template_mailer');
|
121 |
+
$emailInfo = Mage::getModel('core/email_info');
|
122 |
+
$emailInfo->addTo($customer->getEmail(), $customer->getName());
|
123 |
+
$mailer->addEmailInfo($emailInfo);
|
124 |
+
|
125 |
+
// Set all required params and send emails
|
126 |
+
$mailer->setSender(Mage::getStoreConfig($sender, $storeId));
|
127 |
+
$mailer->setStoreId($storeId);
|
128 |
+
$mailer->setTemplateId(Mage::getStoreConfig($template, $storeId));
|
129 |
+
$mailer->setTemplateParams($templateParams);
|
130 |
+
$mailer->send();
|
131 |
+
return $this;
|
132 |
+
}
|
133 |
+
}
|
app/code/community/Diglin/Github/Model/Adapter/Oauth2.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
// Light Oauth2 Library located to /lib/Oauth2 of Magento installation
|
20 |
+
require_once 'Oauth2/Client.php';
|
21 |
+
require_once 'Oauth2/GrantType/IGrantType.php';
|
22 |
+
require_once 'Oauth2/GrantType/AuthorizationCode.php';
|
23 |
+
|
24 |
+
class Diglin_Github_Model_Adapter_Oauth2 extends OAuth2\Client
|
25 |
+
{
|
26 |
+
const AUTHORIZATION_ENDPOINT = 'https://github.com/login/oauth/authorize';
|
27 |
+
const TOKEN_ENDPOINT = 'https://github.com/login/oauth/access_token';
|
28 |
+
const USER_PROFILE = 'https://api.github.com/user';
|
29 |
+
|
30 |
+
public function __construct ($clientId = null, $clientSecret = null, $clientAuth = self::AUTH_TYPE_URI, $certificateFile = null)
|
31 |
+
{
|
32 |
+
if (empty($clientId)) {
|
33 |
+
$clientId = Mage::getStoreConfig('github/config/client_id');
|
34 |
+
}
|
35 |
+
|
36 |
+
if (empty($clientSecret)) {
|
37 |
+
$clientSecret = Mage::helper('core')->decrypt(Mage::getStoreConfig('github/config/client_secret'));
|
38 |
+
}
|
39 |
+
|
40 |
+
return parent::__construct($clientId, $clientSecret, $clientAuth, $certificateFile);
|
41 |
+
}
|
42 |
+
|
43 |
+
public function getRedirectUri ()
|
44 |
+
{
|
45 |
+
return Mage::getUrl('github/account/login');
|
46 |
+
}
|
47 |
+
}
|
app/code/community/Diglin/Github/Model/Confirmation.php
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Model_Confirmation extends Mage_Core_Model_Abstract
|
19 |
+
{
|
20 |
+
protected function _construct()
|
21 |
+
{
|
22 |
+
$this->_init('github/confirmation');
|
23 |
+
}
|
24 |
+
|
25 |
+
protected function _beforeSave()
|
26 |
+
{
|
27 |
+
if (!$this->getId() || $this->isObjectNew()) {
|
28 |
+
$this->setCreatedAt(now());
|
29 |
+
}
|
30 |
+
return parent::_beforeSave();
|
31 |
+
}
|
32 |
+
}
|
app/code/community/Diglin/Github/Model/Log.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Model_Log
|
19 |
+
{
|
20 |
+
public static function log($message, $level = null, $forceLog = false)
|
21 |
+
{
|
22 |
+
Mage::log($message, $level, 'github.log', $forceLog);
|
23 |
+
}
|
24 |
+
}
|
app/code/community/Diglin/Github/Model/Observer.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* @category Diglin
|
6 |
+
* @package Diglin_Github
|
7 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
8 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
9 |
+
*/
|
10 |
+
class Diglin_Github_Model_Observer extends Mage_Customer_Model_Observer
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* Add on the fly the username attribute to the customer collection
|
14 |
+
*
|
15 |
+
* Event: eav_collection_abstract_load_before
|
16 |
+
*
|
17 |
+
* @param Varien_Event_Observer $observer
|
18 |
+
*/
|
19 |
+
public function addAttributeToCollection ($observer)
|
20 |
+
{
|
21 |
+
/* @var $collection Mage_Eav_Model_Entity_Collection_Abstract */
|
22 |
+
$collection = $observer->getEvent()->getCollection();
|
23 |
+
if ($collection->getEntity()->getType() == 'customer') {
|
24 |
+
$collection->addAttributeToSelect('github_login');
|
25 |
+
}
|
26 |
+
|
27 |
+
}
|
28 |
+
}
|
app/code/community/Diglin/Github/Model/Resource/Confirmation.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Model_Resource_Confirmation extends Mage_Core_Model_Resource_Db_Abstract
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Initialize resource model
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
protected function _construct()
|
25 |
+
{
|
26 |
+
$this->_init('github/confirmation', 'confirm_id');
|
27 |
+
}
|
28 |
+
}
|
app/code/community/Diglin/Github/Model/Resource/Confirmation/Collection.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Model_Resource_Confirmation_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
|
19 |
+
{
|
20 |
+
protected function _construct()
|
21 |
+
{
|
22 |
+
$this->_init('github/confirmation');
|
23 |
+
$this->_map['fields']['confirm_id'] = 'main_table.confirm_id';
|
24 |
+
}
|
25 |
+
}
|
app/code/community/Diglin/Github/Model/Resource/Setup.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
class Diglin_Github_Model_Resource_Setup extends Mage_Eav_Model_Entity_Setup {}
|
app/code/community/Diglin/Github/Model/System/Config/Backend/Oauth.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
class Diglin_Github_Model_System_Config_Backend_Oauth extends Mage_Core_Model_Config_Data
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Cache tags to clean
|
22 |
+
*
|
23 |
+
* @var array
|
24 |
+
*/
|
25 |
+
protected $_cacheTags = array(
|
26 |
+
Mage_Core_Model_Store::CACHE_TAG,
|
27 |
+
Mage_Cms_Model_Block::CACHE_TAG,
|
28 |
+
Mage_Core_Model_Config::CACHE_TAG
|
29 |
+
);
|
30 |
+
}
|
app/code/community/Diglin/Github/controllers/AccountController.php
ADDED
@@ -0,0 +1,392 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
require_once 'Mage/Customer/controllers/AccountController.php';
|
20 |
+
|
21 |
+
class Diglin_Github_AccountController extends Mage_Customer_AccountController
|
22 |
+
{
|
23 |
+
const XML_PATH_GITHUB_EXISTING_CUSTOMER_LINK_EMAIL_TEMPLATE = 'github/link_account/email_template';
|
24 |
+
const XML_PATH_GITHUB_EXISTING_CUSTOMER_LINK_EMAIL_ENTITY = 'github/link_account/email_identity';
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Action list where need check enabled cookie
|
28 |
+
*
|
29 |
+
* @var array
|
30 |
+
*/
|
31 |
+
protected $_cookieCheckActions = array('createpost');
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Action predispatch
|
35 |
+
*
|
36 |
+
* Check customer authentication for some actions
|
37 |
+
*/
|
38 |
+
public function preDispatch()
|
39 |
+
{
|
40 |
+
parent::preDispatch();
|
41 |
+
|
42 |
+
// The parent may block the dispatch
|
43 |
+
$this->setFlag('', 'no-dispatch', false);
|
44 |
+
|
45 |
+
if (!$this->getRequest()->isDispatched()) {
|
46 |
+
return;
|
47 |
+
}
|
48 |
+
|
49 |
+
$action = $this->getRequest()->getActionName();
|
50 |
+
$openActions = array(
|
51 |
+
'create',
|
52 |
+
'login',
|
53 |
+
'existing',
|
54 |
+
'confirmation'
|
55 |
+
);
|
56 |
+
$pattern = '/^(' . implode('|', $openActions) . ')/i';
|
57 |
+
|
58 |
+
if (!preg_match($pattern, $action)) {
|
59 |
+
if (!$this->_getSession()->authenticate($this)) {
|
60 |
+
$this->setFlag('', 'no-dispatch', true);
|
61 |
+
}
|
62 |
+
} else {
|
63 |
+
$this->_getSession()->setNoReferer(true);
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Retrieve customer session model object
|
69 |
+
*
|
70 |
+
* @return Mage_Customer_Model_Session
|
71 |
+
*/
|
72 |
+
protected function _getSession ()
|
73 |
+
{
|
74 |
+
return Mage::getSingleton('customer/session');
|
75 |
+
}
|
76 |
+
|
77 |
+
public function indexAction()
|
78 |
+
{
|
79 |
+
$this->_forward('login');
|
80 |
+
}
|
81 |
+
|
82 |
+
public function loginAction ()
|
83 |
+
{
|
84 |
+
/* @var $helper Diglin_Github_Helper_Data */
|
85 |
+
$helper = Mage::helper('github');
|
86 |
+
$code = $this->getRequest()->getParam('code');
|
87 |
+
$returnedState = $this->getRequest()->getParam('state');
|
88 |
+
|
89 |
+
// Optional by the Github API, we use it to prevent man-in-the-middle attack
|
90 |
+
$state = $this->_getSession()->getData('state');
|
91 |
+
if (empty($state)) {
|
92 |
+
$state = Mage::helper('core')->getRandomString(20);
|
93 |
+
$this->_getSession()->setData('state', $state);
|
94 |
+
}
|
95 |
+
|
96 |
+
/* @var $oauth Diglin_Github_Model_Adapter_Oauth2 */
|
97 |
+
$oauth = Mage::getModel('github/adapter_oauth2');
|
98 |
+
|
99 |
+
// - Get code access from Github after user login and acceptation on Github
|
100 |
+
// - Scope value can be changed if we want to add features in future
|
101 |
+
// (possible values with separated comma: user, user:email, user:follow, public_repo, repo, repo:status, delete_repo, notifications, gist)
|
102 |
+
|
103 |
+
// 1) First, login the user via Github
|
104 |
+
if (empty($code)) {
|
105 |
+
$authentificationUrl = $oauth->getAuthenticationUrl($oauth::AUTHORIZATION_ENDPOINT, $oauth->getRedirectUri(), array(
|
106 |
+
'state' => $state,
|
107 |
+
'scope' => 'user:email'
|
108 |
+
));
|
109 |
+
$this->_redirectUrl($authentificationUrl);
|
110 |
+
return;
|
111 |
+
}
|
112 |
+
|
113 |
+
// Check Man-In-The-Middle attack
|
114 |
+
if ($returnedState != $state) {
|
115 |
+
$this->_getSession()->addError($this->__('Sorry, we cannot accept this authentification. A problem occur during the communication with Github. Please, contact us.'));
|
116 |
+
Diglin_Github_Model_Log::log($this->__('Possible Hacker Attack during Github Autorization Process. Code: %s - State Returned: %s - State generated: %s', $code, $returnedState, $state), Zend_Log::ERR);
|
117 |
+
$this->_redirect('customer/account/login', array('_secure' => true));
|
118 |
+
return;
|
119 |
+
}
|
120 |
+
|
121 |
+
$params = array(
|
122 |
+
'code' => $code,
|
123 |
+
'redirect_uri' => $oauth->getRedirectUri(),// mandatory even if not used
|
124 |
+
'state' => $state
|
125 |
+
);
|
126 |
+
|
127 |
+
// 2) Get Github Access Token to allow further API call
|
128 |
+
$response = $oauth->getAccessToken($oauth::TOKEN_ENDPOINT, 'authorization_code', $params);
|
129 |
+
parse_str($response['result'], $info);
|
130 |
+
|
131 |
+
if ($response['code'] != 200 || isset($info['error'])) {
|
132 |
+
$this->_getSession()->addError($this->__('A Problem occured while trying to get Github Authorization.'));
|
133 |
+
Diglin_Github_Model_Log::log('Github Authorization problem ' . print_r($response, true) . print_r($params, true));
|
134 |
+
$this->_redirect('customer/account/login', array('_secure' => true));
|
135 |
+
return;
|
136 |
+
}
|
137 |
+
|
138 |
+
$token = '';
|
139 |
+
if (!empty($info['access_token'])) {
|
140 |
+
$helper->setAccessToken($info['access_token']);
|
141 |
+
$token = $info['access_token'];
|
142 |
+
} else if ($helper->getAccessToken()) {
|
143 |
+
$token = $helper->getAccessToken();
|
144 |
+
}
|
145 |
+
|
146 |
+
// 3) Get user data, save it in session to use it later
|
147 |
+
$oauth->setAccessToken($token);
|
148 |
+
$response = $oauth->fetch($oauth::USER_PROFILE, array(), $oauth::HTTP_METHOD_GET, array('User-Agent' => $_SERVER["HTTP_USER_AGENT"]));// USER AGENT Required by Github
|
149 |
+
|
150 |
+
if (empty($response['result']['id'])) {
|
151 |
+
$this->_getSession()->addError($this->__("You don't seem to be logged in Github. Please, login again."));
|
152 |
+
Diglin_Github_Model_Log::log('Github Login problem ' . print_r($response, true));
|
153 |
+
$this->_redirect('customer/account/login', array('_secure' => true));
|
154 |
+
return;
|
155 |
+
} else {
|
156 |
+
$githubId = $response['result']['id'];
|
157 |
+
}
|
158 |
+
|
159 |
+
//Diglin_Github_Model_Log::log('Github Login Debug ' . print_r($response, true));
|
160 |
+
|
161 |
+
// Save github user data in session
|
162 |
+
$helper->setUserData($response['result']);
|
163 |
+
|
164 |
+
$customer = $helper->getCustomer($githubId);
|
165 |
+
if ($customer->getId()) {
|
166 |
+
$this->_getSession()->setCustomerAsLoggedIn($customer);
|
167 |
+
$this->_loginPostRedirect();
|
168 |
+
} else {
|
169 |
+
$this->_redirect('github/account/create', array('_secure' => true));
|
170 |
+
}
|
171 |
+
}
|
172 |
+
|
173 |
+
public function createAction ()
|
174 |
+
{
|
175 |
+
$session = $this->_getSession();
|
176 |
+
if ($session->isLoggedIn()) {
|
177 |
+
$this->_redirect('customer/account/index');
|
178 |
+
return;
|
179 |
+
}
|
180 |
+
|
181 |
+
/* @var $helper Diglin_Github_Helper_Data */
|
182 |
+
$helper = Mage::helper('github');
|
183 |
+
|
184 |
+
$token = $helper->getAccessToken();
|
185 |
+
$githubData = $helper->getUserData('github_data');
|
186 |
+
|
187 |
+
if (empty($token) || empty($githubData)) {
|
188 |
+
$session->addNotice($this->__('Please, login in Github before to try to register.'));
|
189 |
+
$this->_redirect('customer/account/login', array('_secure' => true));
|
190 |
+
return;
|
191 |
+
}
|
192 |
+
|
193 |
+
$email = '';
|
194 |
+
$firstname= '';
|
195 |
+
$lastname = '';
|
196 |
+
|
197 |
+
if ($githubData->getName()) {
|
198 |
+
$name = explode(' ', $githubData->getName(), 2);
|
199 |
+
// We have no clue of the order of the lastname or firstname, so hazard...
|
200 |
+
$firstname = $name[0];
|
201 |
+
$lastname = $name[1];
|
202 |
+
}
|
203 |
+
|
204 |
+
if ($githubData->getEmail()) {
|
205 |
+
$email = $githubData->getEmail();
|
206 |
+
}
|
207 |
+
|
208 |
+
$post = $this->getRequest()->getPost();
|
209 |
+
$post = array_merge($post, array(
|
210 |
+
'github_id' => $githubData['id'],
|
211 |
+
'github_login' => $githubData['login'],
|
212 |
+
'lastname' => $lastname,
|
213 |
+
'firstname' => $firstname,
|
214 |
+
'email' => $email
|
215 |
+
));
|
216 |
+
|
217 |
+
$session->setCustomerFormData($post);
|
218 |
+
|
219 |
+
$this->loadLayout();
|
220 |
+
$this->_initLayoutMessages('customer/session');
|
221 |
+
$this->renderLayout();
|
222 |
+
}
|
223 |
+
|
224 |
+
public function createPostAction ()
|
225 |
+
{
|
226 |
+
$session = $this->_getSession();
|
227 |
+
if ($session->isLoggedIn()) {
|
228 |
+
$this->_redirect('customer/account/index');
|
229 |
+
return;
|
230 |
+
}
|
231 |
+
$session->setEscapeMessages(true); // prevent XSS injection in user input
|
232 |
+
|
233 |
+
/* @var $helper Diglin_Github_Helper_Data */
|
234 |
+
$helper = Mage::helper('github');
|
235 |
+
|
236 |
+
$data = $this->getRequest()->getParams();
|
237 |
+
|
238 |
+
if ($data) {
|
239 |
+
$githubData = $helper->getUserData();
|
240 |
+
|
241 |
+
if ($data['github_id'] != $githubData->getId()) {
|
242 |
+
$session->addError($this->__('Your Github information has not been found.'));
|
243 |
+
$this->_redirect('customer/account/login', array('_secure' => true));
|
244 |
+
return;
|
245 |
+
}
|
246 |
+
|
247 |
+
// We use information provided by Github API instead of the form in case of form data modification
|
248 |
+
$data ['github_id'] = $githubData->getId();
|
249 |
+
$data ['github_login'] = $githubData->getLogin();
|
250 |
+
|
251 |
+
$customer = Mage::getModel('customer/customer');
|
252 |
+
|
253 |
+
// We generate a password to prevent customer validation error
|
254 |
+
$password = $customer->generatePassword();
|
255 |
+
$customer->setPassword($password)
|
256 |
+
->setConfirmation($password);
|
257 |
+
|
258 |
+
$customer->addData($data);
|
259 |
+
|
260 |
+
try {
|
261 |
+
$customer->save();
|
262 |
+
|
263 |
+
Mage::dispatchEvent('customer_register_success',
|
264 |
+
array('account_controller' => $this, 'customer' => $customer)
|
265 |
+
);
|
266 |
+
|
267 |
+
if ($customer->getId()) {
|
268 |
+
$session->setCustomerAsLoggedIn($customer);
|
269 |
+
$this->_getSession()->addSuccess(
|
270 |
+
$this->__('Thank you for registering with %s.', Mage::app()->getStore()->getFrontendName())
|
271 |
+
);
|
272 |
+
|
273 |
+
$successUrl = Mage::getUrl('customer/account/index', array('_secure'=>true));
|
274 |
+
$this->_loginPostRedirect();
|
275 |
+
return;
|
276 |
+
}
|
277 |
+
|
278 |
+
} catch (Mage_Core_Exception $e) {
|
279 |
+
$session->setCustomerFormData($this->getRequest()->getPost());
|
280 |
+
if ($e->getCode() === Mage_Customer_Model_Customer::EXCEPTION_EMAIL_EXISTS) {
|
281 |
+
$url = Mage::getUrl('customer/account/forgotpassword');
|
282 |
+
$message = $this->__('There is already an account with this email address. If you are sure that it is your email address, <a href="%s">click here</a> to get your password and access your account.', $url);
|
283 |
+
$session->setEscapeMessages(false);
|
284 |
+
} else {
|
285 |
+
$message = $e->getMessage();
|
286 |
+
}
|
287 |
+
$session->addError($message);
|
288 |
+
} catch (Exception $e) {
|
289 |
+
$session->setCustomerFormData($this->getRequest()->getPost())
|
290 |
+
->addException($e, $this->__('Cannot save the customer.'));
|
291 |
+
}
|
292 |
+
}
|
293 |
+
|
294 |
+
$this->_redirectError(Mage::getUrl('*/*/create', array('_secure' => true)));
|
295 |
+
}
|
296 |
+
|
297 |
+
public function existingAction()
|
298 |
+
{
|
299 |
+
$customerEmail = $this->getRequest()->getParam('email');
|
300 |
+
$githubId = (int) $this->getRequest()->getParam('github_id');
|
301 |
+
$githubLogin = $this->getRequest()->getParam('github_login');
|
302 |
+
$helper = Mage::helper('github');
|
303 |
+
|
304 |
+
if (!Zend_Validate::is($customerEmail, 'EmailAddress')) {
|
305 |
+
$this->_getSession()->addError($this->__('Email Address is not valid!'));
|
306 |
+
$this->_redirect('*/*/create');
|
307 |
+
return;
|
308 |
+
}
|
309 |
+
|
310 |
+
$customer = Mage::getModel('customer/customer')
|
311 |
+
->setWebsiteId(Mage::app()->getWebsite()->getId())
|
312 |
+
->loadByEmail($customerEmail);
|
313 |
+
|
314 |
+
if ($customer->getId() && !$customer->getGithubLogin()) {
|
315 |
+
|
316 |
+
/* @var $confirmation Diglin_Github_Model_Confirmation */
|
317 |
+
$confirmation = Mage::getModel('github/confirmation');
|
318 |
+
|
319 |
+
$confirmation->load($customer->getId(), 'customer_id');
|
320 |
+
|
321 |
+
if ($confirmation->getId()) {
|
322 |
+
$confirmation->delete();
|
323 |
+
$confirmation->unsetData();
|
324 |
+
}
|
325 |
+
|
326 |
+
try {
|
327 |
+
$confirmation
|
328 |
+
->setKey(md5(uniqid()))
|
329 |
+
->setGithubLogin($githubLogin)
|
330 |
+
->setGithubId($githubId)
|
331 |
+
->setCustomerId($customer->getId())
|
332 |
+
->save();
|
333 |
+
|
334 |
+
$params = array(
|
335 |
+
'github_confirmation' => $confirmation,
|
336 |
+
'customer' => $customer,
|
337 |
+
'back_url' => $this->_getSession()->getBeforeAuthUrl(),
|
338 |
+
);
|
339 |
+
|
340 |
+
$helper->sendEmailTemplate(self::XML_PATH_GITHUB_EXISTING_CUSTOMER_LINK_EMAIL_TEMPLATE, self::XML_PATH_GITHUB_EXISTING_CUSTOMER_LINK_EMAIL_ENTITY, $params, $customer);
|
341 |
+
$this->_getSession()->addSuccess($this->__('An email to confirm that this account belongs to you has been sent to your email address.'));
|
342 |
+
$this->_getSession()->addSuccess($this->__('Please, click on the link into the email to confirm the link between your Githug account and your shop\'s account'));
|
343 |
+
} catch (Exception $e) {
|
344 |
+
$this->_getSession()->addError($this->__('A problem occured while trying to send you the confirmation email. Please, contact us.'));
|
345 |
+
Mage::logException($e);
|
346 |
+
$this->_redirect('*/*/create');
|
347 |
+
return;
|
348 |
+
}
|
349 |
+
} else {
|
350 |
+
$this->_getSession()->addNotice($this->__('We are sorry, we didn\'t find your account in our database or your account is already linked to a Github account.'));
|
351 |
+
$this->_redirect('*/*/create');
|
352 |
+
return;
|
353 |
+
}
|
354 |
+
|
355 |
+
$this->_redirect('customer/account/login');
|
356 |
+
}
|
357 |
+
|
358 |
+
public function confirmationAction()
|
359 |
+
{
|
360 |
+
$confirmationKey = substr($this->getRequest()->getParam('key'), 0, 255);
|
361 |
+
//$backUrl = $this->getRequest()->getParam('back_url');
|
362 |
+
$customerId = (int)$this->getRequest()->getParam('id');
|
363 |
+
|
364 |
+
$customer = Mage::getModel('customer/customer')->load($customerId);
|
365 |
+
$confirmation = Mage::getModel('github/confirmation')->load($confirmationKey, 'key');
|
366 |
+
|
367 |
+
if ($customer->getId() && !$customer->getGithubLogin() && $confirmation->getId()) {
|
368 |
+
try {
|
369 |
+
$customer->setGithubId($confirmation->getGithubId())
|
370 |
+
->setGithubLogin($confirmation->getGithubLogin())
|
371 |
+
->save();
|
372 |
+
|
373 |
+
$confirmation->delete();
|
374 |
+
|
375 |
+
$this->_getSession()->setCustomerAsLoggedIn($customer);
|
376 |
+
|
377 |
+
$this->_getSession()->addSuccess($this->__('Congratulations! You are member of our private club :-)'));
|
378 |
+
} catch (Exception $e) {
|
379 |
+
$this->_getSession()->addError($this->__('A problem occured while trying to save your information.'));
|
380 |
+
Mage::logException($e);
|
381 |
+
$this->_redirect('customer/account/login');
|
382 |
+
return;
|
383 |
+
}
|
384 |
+
} else {
|
385 |
+
$this->_getSession()->addError($this->__('Sorry, information sent are invalid! Try again to login with your Github account and to recreate the linkage.'));
|
386 |
+
$this->_redirect('customer/account/login');
|
387 |
+
return;
|
388 |
+
}
|
389 |
+
|
390 |
+
$this->_redirect('customer/account/index');
|
391 |
+
}
|
392 |
+
}
|
app/code/community/Diglin/Github/etc/adminhtml.xml
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<acl>
|
4 |
+
<resources>
|
5 |
+
<all>
|
6 |
+
<title>Allow Everything</title>
|
7 |
+
</all>
|
8 |
+
<admin>
|
9 |
+
<children>
|
10 |
+
<system>
|
11 |
+
<children>
|
12 |
+
<config>
|
13 |
+
<children>
|
14 |
+
<github translate="title">
|
15 |
+
<title>Diglin - Github Configuration</title>
|
16 |
+
</github>
|
17 |
+
</children>
|
18 |
+
</config>
|
19 |
+
</children>
|
20 |
+
</system>
|
21 |
+
</children>
|
22 |
+
</admin>
|
23 |
+
</resources>
|
24 |
+
</acl>
|
25 |
+
</config>
|
app/code/community/Diglin/Github/etc/config.xml
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Diglin_Github>
|
5 |
+
<version>1.1.0</version>
|
6 |
+
</Diglin_Github>
|
7 |
+
</modules>
|
8 |
+
|
9 |
+
<default>
|
10 |
+
<github>
|
11 |
+
<config>
|
12 |
+
<enabled>0</enabled>
|
13 |
+
</config>
|
14 |
+
<link_account>
|
15 |
+
<email_identity>general</email_identity>
|
16 |
+
<email_template>github_existing_customer_link_email_template</email_template>
|
17 |
+
</link_account>
|
18 |
+
</github>
|
19 |
+
</default>
|
20 |
+
|
21 |
+
|
22 |
+
<global>
|
23 |
+
<fieldsets>
|
24 |
+
<customer_account>
|
25 |
+
<github_login>
|
26 |
+
<create>1</create>
|
27 |
+
<update>1</update>
|
28 |
+
</github_login>
|
29 |
+
</customer_account>
|
30 |
+
</fieldsets>
|
31 |
+
|
32 |
+
<blocks>
|
33 |
+
<github>
|
34 |
+
<class>Diglin_Github_Block</class>
|
35 |
+
</github>
|
36 |
+
<adminhtml>
|
37 |
+
<rewrite>
|
38 |
+
<customer_grid>Diglin_Github_Block_Adminhtml_Grid</customer_grid>
|
39 |
+
</rewrite>
|
40 |
+
</adminhtml>
|
41 |
+
</blocks>
|
42 |
+
|
43 |
+
<helpers>
|
44 |
+
<github>
|
45 |
+
<class>Diglin_Github_Helper</class>
|
46 |
+
</github>
|
47 |
+
</helpers>
|
48 |
+
|
49 |
+
<models>
|
50 |
+
<github>
|
51 |
+
<class>Diglin_Github_Model</class>
|
52 |
+
<resourceModel>github_resource</resourceModel>
|
53 |
+
</github>
|
54 |
+
<github_resource>
|
55 |
+
<class>Diglin_Github_Model_Resource</class>
|
56 |
+
<entities>
|
57 |
+
<confirmation>
|
58 |
+
<table>github_confirmation</table>
|
59 |
+
</confirmation>
|
60 |
+
</entities>
|
61 |
+
</github_resource>
|
62 |
+
</models>
|
63 |
+
|
64 |
+
<resources>
|
65 |
+
<github_setup>
|
66 |
+
<setup>
|
67 |
+
<module>Diglin_Github</module>
|
68 |
+
<class>Diglin_Github_Model_Resource_Setup</class>
|
69 |
+
</setup>
|
70 |
+
</github_setup>
|
71 |
+
</resources>
|
72 |
+
|
73 |
+
<template>
|
74 |
+
<email>
|
75 |
+
<github_existing_customer_link_email_template translate="label" module="github">
|
76 |
+
<label>Github Link Account Confirmation</label>
|
77 |
+
<file>github/existing_customer_link_confirmation.html</file>
|
78 |
+
<type>html</type>
|
79 |
+
</github_existing_customer_link_email_template>
|
80 |
+
</email>
|
81 |
+
</template>
|
82 |
+
</global>
|
83 |
+
|
84 |
+
<frontend>
|
85 |
+
<layout>
|
86 |
+
<updates>
|
87 |
+
<github>
|
88 |
+
<file>github.xml</file>
|
89 |
+
</github>
|
90 |
+
</updates>
|
91 |
+
</layout>
|
92 |
+
|
93 |
+
<routers>
|
94 |
+
<github>
|
95 |
+
<use>standard</use>
|
96 |
+
<args>
|
97 |
+
<module>Diglin_Github</module>
|
98 |
+
<frontName>github</frontName>
|
99 |
+
</args>
|
100 |
+
</github>
|
101 |
+
</routers>
|
102 |
+
|
103 |
+
<translate>
|
104 |
+
<modules>
|
105 |
+
<github>
|
106 |
+
<files>
|
107 |
+
<default>Diglin_Github.csv</default>
|
108 |
+
</files>
|
109 |
+
</github>
|
110 |
+
</modules>
|
111 |
+
</translate>
|
112 |
+
</frontend>
|
113 |
+
|
114 |
+
<adminhtml>
|
115 |
+
<events>
|
116 |
+
<eav_collection_abstract_load_before>
|
117 |
+
<observers>
|
118 |
+
<github_load_collection>
|
119 |
+
<class>github/observer</class>
|
120 |
+
<method>addAttributeToCollection</method>
|
121 |
+
</github_load_collection>
|
122 |
+
</observers>
|
123 |
+
</eav_collection_abstract_load_before>
|
124 |
+
</events>
|
125 |
+
</adminhtml>
|
126 |
+
</config>
|
app/code/community/Diglin/Github/etc/system.xml
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<tabs>
|
4 |
+
<diglin>
|
5 |
+
<label>Diglin</label>
|
6 |
+
<sort_order>400</sort_order>
|
7 |
+
</diglin>
|
8 |
+
</tabs>
|
9 |
+
|
10 |
+
<sections>
|
11 |
+
<github module="github">
|
12 |
+
<label>Github</label>
|
13 |
+
<tab>diglin</tab>
|
14 |
+
<frontend_type>text</frontend_type>
|
15 |
+
<sort_order>110</sort_order>
|
16 |
+
<show_in_default>1</show_in_default>
|
17 |
+
<show_in_website>1</show_in_website>
|
18 |
+
<show_in_store>1</show_in_store>
|
19 |
+
<groups>
|
20 |
+
<config>
|
21 |
+
<label>Global Configuration</label>
|
22 |
+
<frontend_type>text</frontend_type>
|
23 |
+
<sort_order>10</sort_order>
|
24 |
+
<show_in_default>1</show_in_default>
|
25 |
+
<show_in_website>1</show_in_website>
|
26 |
+
<show_in_store>1</show_in_store>
|
27 |
+
<comment><![CDATA[First, register your application on <a href="https://github.com/settings/applications/new" target="_blank" title="Got to Github Website">Github</a>. Provde during the application creation, as callback url, the url of your Magento Shop.]]></comment>
|
28 |
+
<fields>
|
29 |
+
<enabled>
|
30 |
+
<label>Oauth Authentification</label>
|
31 |
+
<frontend_type>select</frontend_type>
|
32 |
+
<source_model>adminhtml/system_config_source_enabledisable</source_model>
|
33 |
+
<backend_model>github/system_config_backend_oauth</backend_model>
|
34 |
+
<sort_order>10</sort_order>
|
35 |
+
<show_in_default>1</show_in_default>
|
36 |
+
<show_in_website>1</show_in_website>
|
37 |
+
<show_in_store>1</show_in_store>
|
38 |
+
</enabled>
|
39 |
+
<client_id>
|
40 |
+
<label>Client ID</label>
|
41 |
+
<frontend_type>text</frontend_type>
|
42 |
+
<sort_order>20</sort_order>
|
43 |
+
<show_in_default>1</show_in_default>
|
44 |
+
<show_in_website>1</show_in_website>
|
45 |
+
<show_in_store>1</show_in_store>
|
46 |
+
<comment><![CDATA[Client ID that you can get from your Github account after to have registered your application]]></comment>
|
47 |
+
</client_id>
|
48 |
+
<client_secret>
|
49 |
+
<label>Client Secret</label>
|
50 |
+
<frontend_type>obscure</frontend_type>
|
51 |
+
<backend_model>adminhtml/system_config_backend_encrypted</backend_model>
|
52 |
+
<sort_order>30</sort_order>
|
53 |
+
<show_in_default>1</show_in_default>
|
54 |
+
<show_in_website>1</show_in_website>
|
55 |
+
<show_in_store>1</show_in_store>
|
56 |
+
<comment><![CDATA[Client Secret that you can get from your Github account after to have registered your application]]></comment>
|
57 |
+
</client_secret>
|
58 |
+
<grid>
|
59 |
+
<label><![CDATA[Display Github Username in "Manage Customers" Grid]]></label>
|
60 |
+
<frontend_type>select</frontend_type>
|
61 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
62 |
+
<sort_order>40</sort_order>
|
63 |
+
<show_in_default>1</show_in_default>
|
64 |
+
<comment><![CDATA[Do you want to display the field 'Github Username' in the Manage Customer Grid?]]></comment>
|
65 |
+
</grid>
|
66 |
+
</fields>
|
67 |
+
</config>
|
68 |
+
</groups>
|
69 |
+
</github>
|
70 |
+
</sections>
|
71 |
+
</config>
|
app/code/community/Diglin/Github/sql/github_setup/install-1.0.0.0.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
/* @var $installer Diglin_Github_Model_Resource_Setup */
|
20 |
+
$installer = $this;
|
21 |
+
$installer->startSetup();
|
22 |
+
|
23 |
+
//$entityTypeId = $installer->getEntityType('customer')->getEntityTypeId();
|
24 |
+
$installer->addAttribute('customer', 'github_id', array(
|
25 |
+
'type' => 'int',
|
26 |
+
'input' => 'text',
|
27 |
+
'label' => 'Github ID',
|
28 |
+
'required' => false,
|
29 |
+
'user_defined' => false,
|
30 |
+
'default' => '',
|
31 |
+
'unique' => true,
|
32 |
+
'note' => 'Github ID provided by Github API after first login. Please, don\'t change it or delete it if you want to delete the login',
|
33 |
+
'visible' => false,
|
34 |
+
));
|
35 |
+
|
36 |
+
$installer->addAttribute('customer', 'github_login', array(
|
37 |
+
'type' => 'varchar',
|
38 |
+
'input' => 'text',
|
39 |
+
'label' => 'Github Login',
|
40 |
+
'required' => false,
|
41 |
+
'user_defined' => false,
|
42 |
+
'default' => '',
|
43 |
+
'unique' => true,
|
44 |
+
'note' => 'Github Login provided by Github API after first login',
|
45 |
+
'visible' => true
|
46 |
+
));
|
47 |
+
|
48 |
+
Mage::getSingleton('eav/config')
|
49 |
+
->getAttribute('customer', 'github_login')
|
50 |
+
->setData('used_in_forms', array('adminhtml_customer','customer_account_edit', 'customer_account_create'))
|
51 |
+
->save();
|
52 |
+
|
53 |
+
Mage::getSingleton('eav/config')
|
54 |
+
->getAttribute('customer', 'github_id')
|
55 |
+
->setData('used_in_forms', array('adminhtml_customer'))
|
56 |
+
->save();
|
57 |
+
|
58 |
+
$table = $installer->getConnection()
|
59 |
+
->newTable($installer->getTable('github/confirmation'))
|
60 |
+
->addColumn('confirm_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
|
61 |
+
'identity' => true,
|
62 |
+
'nullable' => false,
|
63 |
+
'primary' => true,
|
64 |
+
), 'Confirmation ID')
|
65 |
+
->addColumn('customer_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
|
66 |
+
'nullable' => false,
|
67 |
+
'unsigned' => true,
|
68 |
+
), 'Customer Id')
|
69 |
+
->addColumn('github_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
|
70 |
+
'nullable' => false,
|
71 |
+
'unsigned' => true,
|
72 |
+
), 'Github Id')
|
73 |
+
->addColumn('github_login', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
|
74 |
+
'nullable' => false,
|
75 |
+
), 'Github Username')
|
76 |
+
->addColumn('key', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
|
77 |
+
'nullable' => false,
|
78 |
+
), 'Github Confirmation Key')
|
79 |
+
->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
|
80 |
+
), 'Confirmation Creation Time')
|
81 |
+
->addForeignKey($installer->getFkName('github/confirmation', 'customer_id', 'customer/entity', 'entity_id'),
|
82 |
+
'customer_id', $installer->getTable('customer/entity'), 'entity_id',
|
83 |
+
Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
|
84 |
+
->setComment('Github Confirmation Table');
|
85 |
+
|
86 |
+
$installer->getConnection()->createTable($table);
|
87 |
+
|
88 |
+
$installer->endSetup();
|
app/design/frontend/base/default/layout/github.xml
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Diglin
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* that is bundled with this package in the file LICENSE.txt.
|
10 |
+
* It is also available through the world-wide-web at this URL:
|
11 |
+
* http://opensource.org/licenses/osl-3.0.php
|
12 |
+
*
|
13 |
+
*
|
14 |
+
* @category Diglin
|
15 |
+
* @package Diglin_Github
|
16 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
17 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
18 |
+
*/
|
19 |
+
-->
|
20 |
+
<layout>
|
21 |
+
<github_account_create>
|
22 |
+
<label>Github Customer Account Registration Form</label>
|
23 |
+
<remove name="right" />
|
24 |
+
<remove name="left" />
|
25 |
+
|
26 |
+
<reference name="root">
|
27 |
+
<action method="setTemplate">
|
28 |
+
<template>page/1column.phtml</template>
|
29 |
+
</action>
|
30 |
+
</reference>
|
31 |
+
|
32 |
+
<reference name="content">
|
33 |
+
<block type="github/account_register" name="github_account_register" as="github.account.register" template="github/customer/create.phtml">
|
34 |
+
<block type="page/html_wrapper" name="customer.form.register.fields.before" as="form_fields_before" translate="label">
|
35 |
+
<label>Form Fields Before</label>
|
36 |
+
</block>
|
37 |
+
<block type="page/html_wrapper" name="customer.form.register.fields.after" as="form_fields_after" translate="label">
|
38 |
+
<label>Form Fields After</label>
|
39 |
+
<block type="github/account_existing" name="github_existing_user" as="github.existing.user" template="github/customer/existing.phtml" />
|
40 |
+
</block>
|
41 |
+
</block>
|
42 |
+
</reference>
|
43 |
+
</github_account_create>
|
44 |
+
|
45 |
+
<customer_account_login>
|
46 |
+
<reference name="form.additional.info"><!-- Solution works for login with or w/o persistent module @see the login.phtml -->
|
47 |
+
<block type="core/template" name="login_github_button" as="login.github.button">
|
48 |
+
<block type="core/template" name="github_button" as="github.button" template="github/customer/button.phtml">
|
49 |
+
<action method="setClassAlign"><class>a-left</class></action>
|
50 |
+
</block>
|
51 |
+
<action method="setTemplate" ifconfig="github/config/enabled">
|
52 |
+
<template>github/customer/login.phtml</template>
|
53 |
+
</action>
|
54 |
+
</block>
|
55 |
+
</reference>
|
56 |
+
</customer_account_login>
|
57 |
+
|
58 |
+
<customer_account_create>
|
59 |
+
<reference name="form.additional.info">
|
60 |
+
<block type="core/template" name="register_github_information" as="register.github.information">
|
61 |
+
<action method="setTemplate" ifconfig="github/config/enabled">
|
62 |
+
<template>github/customer/fields.phtml</template>
|
63 |
+
</action>
|
64 |
+
</block>
|
65 |
+
</reference>
|
66 |
+
</customer_account_create>
|
67 |
+
|
68 |
+
<customer_account_index>
|
69 |
+
<reference name="customer_account_dashboard">
|
70 |
+
<block type="core/template" name="github_information" as="info1">
|
71 |
+
<action method="setTemplate" ifconfig="github/config/enabled">
|
72 |
+
<template>github/customer/info.phtml</template>
|
73 |
+
</action>
|
74 |
+
</block>
|
75 |
+
</reference>
|
76 |
+
</customer_account_index>
|
77 |
+
|
78 |
+
<checkout_onepage_index>
|
79 |
+
<reference name="checkout.onepage.login.before">
|
80 |
+
<block type="core/template" name="login_github_button" as="login.github.button">
|
81 |
+
<block type="core/template" name="github_button" as="github.button" template="github/customer/button.phtml">
|
82 |
+
<action method="setClassAlign"><class>a-left</class></action>
|
83 |
+
</block>
|
84 |
+
<action method="setTemplate" ifconfig="github/config/enabled">
|
85 |
+
<template>github/customer/login.phtml</template>
|
86 |
+
</action>
|
87 |
+
<action method="setHeader"><header>3</header></action>
|
88 |
+
</block>
|
89 |
+
</reference>
|
90 |
+
|
91 |
+
<!-- FIX ME The solution below works but you have to care about the captcha - dependency!!! -->
|
92 |
+
<!-- I tried to put the block login_github_button into the reference checkout.onepage.login > reference form.additional.info -->
|
93 |
+
<!-- but it put it into checkout.onepage.billing cause of how the layout generates blocks. The block form.additional.info is generated twice in the handle checkout_onepage_index -->
|
94 |
+
<!-- <reference name="checkout.onepage.login"> -->
|
95 |
+
<!-- <block type="core/text_list" name="form.additional.info"> -->
|
96 |
+
<!-- <block type="captcha/captcha" name="captcha"> -->
|
97 |
+
<!-- <reference name="head"> -->
|
98 |
+
<!-- <action method="addJs"><file>mage/captcha.js</file></action> -->
|
99 |
+
<!-- </reference> -->
|
100 |
+
<!-- <action method="setFormId"><formId>user_login</formId></action> -->
|
101 |
+
<!-- <action method="setImgWidth"><width>230</width></action> -->
|
102 |
+
<!-- <action method="setImgHeight"><width>50</width></action> -->
|
103 |
+
<!-- </block> -->
|
104 |
+
<!-- <block type="core/template" name="login_github_button" as="login.github.button"> -->
|
105 |
+
<!-- <action method="setTemplate" ifconfig="github/config/enabled"> -->
|
106 |
+
<!-- <template>github/customer/login.phtml</template> -->
|
107 |
+
<!-- </action> -->
|
108 |
+
<!-- </block> -->
|
109 |
+
<!-- </block> -->
|
110 |
+
<!-- </reference> -->
|
111 |
+
</checkout_onepage_index>
|
112 |
+
</layout>
|
app/design/frontend/base/default/template/github/customer/button.phtml
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
?>
|
19 |
+
<div <?php echo ($this->getClassAlign())? 'class="' . $this->getClassAlign() . '"' : ''; ?>>
|
20 |
+
<a href="<?php echo $this->getUrl('github/account/login'); ?>"><img src="<?php echo $this->getSkinUrl('images/github/LoginWithGithub.png'); ?>" alt="<?php echo $this->__('Login via Github');?>" title="<?php echo $this->__('Login via Github');?>" /></a>
|
21 |
+
</div>
|
app/design/frontend/base/default/template/github/customer/create.phtml
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
/* @var $this Diglin_Github_Block_Account_Register */
|
20 |
+
?>
|
21 |
+
<div class="account-create">
|
22 |
+
<div class="page-title"><h1><?php echo $this->__('Create an account thanks to your Github account') ?></h1></div>
|
23 |
+
<?php echo $this->getChildHtml('form_fields_before')?>
|
24 |
+
<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
|
25 |
+
<?php /* Extensions placeholder */ ?>
|
26 |
+
<?php echo $this->getChildHtml('customer.form.register.extra')?>
|
27 |
+
<form action="<?php echo $this->getPostActionUrl() ?>" method="post" id="form-validate" name="github_customer_create">
|
28 |
+
<div class="fieldset">
|
29 |
+
<input type="hidden" name="github_id" id="github_id" value="<?php echo $this->escapeHtml($this->getFormData()->getGithubId()); ?>" />
|
30 |
+
<h2 class="legend"><?php echo $this->__('Personal Information') ?></h2>
|
31 |
+
<div class="content">
|
32 |
+
<p><?php echo $this->__('We need some information to help us to communicate with you. Please, fill in the required fields to create your account on our website.');?><br/>
|
33 |
+
<?php echo $this->__('We filled for you some information based on your public Github profile. No password necessary.');?></p>
|
34 |
+
</div>
|
35 |
+
|
36 |
+
<ul class="right">
|
37 |
+
<li>
|
38 |
+
<img src="<?php echo $this->getSkinUrl('images/github/octocat.png')?>" alt="<?php echo $this->__('Github Octocat');?>" title="<?php echo $this->__('Github Octocat');?>" style="width:250px;"/>
|
39 |
+
</li>
|
40 |
+
</ul>
|
41 |
+
|
42 |
+
<ul class="form-list left">
|
43 |
+
<li class="fields">
|
44 |
+
<label for="github_login"><?php echo $this->__('Github Username') ?></label>
|
45 |
+
<div class="input-box">
|
46 |
+
<input type="text" name="github_login" id="github_login" value="<?php echo $this->escapeHtml($this->getFormData()->getGithubLogin()) ?>" title="<?php echo $this->__('Github Username') ?>" disabled />
|
47 |
+
</div>
|
48 |
+
</li>
|
49 |
+
<li class="fields">
|
50 |
+
<?php echo $this->getLayout()->createBlock('customer/widget_name')->setObject($this->getFormData())->setForceUseCustomerAttributes(true)->toHtml() ?>
|
51 |
+
</li>
|
52 |
+
<li class="fields">
|
53 |
+
<label for="email_address" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
|
54 |
+
<div class="input-box">
|
55 |
+
<input type="text" name="email" id="email_address" value="<?php echo $this->escapeHtml($this->getFormData()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="input-text validate-email required-entry" />
|
56 |
+
</div>
|
57 |
+
</li>
|
58 |
+
<?php if ($this->isNewsletterEnabled()): ?>
|
59 |
+
<li class="control">
|
60 |
+
<div class="input-box">
|
61 |
+
<input type="checkbox" name="is_subscribed" title="<?php echo $this->__('Sign Up for Newsletter') ?>" value="1" id="is_subscribed"<?php if($this->getFormData()->getIsSubscribed()): ?> checked="checked"<?php endif; ?> class="checkbox" />
|
62 |
+
</div>
|
63 |
+
<label for="is_subscribed"><?php echo $this->__('Sign Up for Newsletter') ?></label>
|
64 |
+
<?php /* Extensions placeholder */ ?>
|
65 |
+
<?php echo $this->getChildHtml('customer.form.register.newsletter')?>
|
66 |
+
</li>
|
67 |
+
<?php endif ?>
|
68 |
+
</ul>
|
69 |
+
<div class="clearer"></div>
|
70 |
+
</div>
|
71 |
+
|
72 |
+
<div class="buttons-set">
|
73 |
+
<p class="required"><?php echo $this->__('* Required Fields') ?></p>
|
74 |
+
<?php if (!$this->getChild('form_fields_after')): ?><p class="back-link"><a href="<?php echo $this->escapeUrl($this->getBackUrl()) ?>" class="back-link"><small>« </small><?php echo $this->__('Back') ?></a></p><?php endif; ?>
|
75 |
+
<button type="submit" title="<?php echo $this->__('Submit') ?>" class="button"><span><span><?php echo $this->__('Submit') ?></span></span></button>
|
76 |
+
</div>
|
77 |
+
</form>
|
78 |
+
<script type="text/javascript">
|
79 |
+
//<![CDATA[
|
80 |
+
var dataForm = new VarienForm('form-validate', true);
|
81 |
+
//]]>
|
82 |
+
</script>
|
83 |
+
<?php echo $this->getChildHtml('form_fields_after')?>
|
84 |
+
</div>
|
app/design/frontend/base/default/template/github/customer/existing.phtml
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_
|
15 |
+
* @copyright Copyright (c) 2011-2012 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
/* @var $this Mage_Core_Block_Template */
|
20 |
+
$grandParent = $this->getParentBlock()->getParentBlock();
|
21 |
+
?>
|
22 |
+
<form action="<?php echo $this->getUrl('*/*/existing') ?>" method="post" id="form-existing-customer" name="github_existing_customer">
|
23 |
+
<div class="fieldset">
|
24 |
+
<input type="hidden" name="github_id" id="github_id" value="<?php echo $this->escapeHtml($grandParent->getFormData()->getGithubId()); ?>" />
|
25 |
+
<input type="hidden" name="github_login" id="github_login" value="<?php echo $this->escapeHtml($grandParent->getFormData()->getGithubLogin()) ?>" />
|
26 |
+
<h2 class="legend"><?php echo $this->__('Existing Customer') ?></h2>
|
27 |
+
<div class="content">
|
28 |
+
<p><?php echo $this->__('You already have an account but want to link your github account to your shop\'s account?');?><br/>
|
29 |
+
<?php echo $this->__('Just fill in the email address field, you will receive a confirmation email with a link to proove your ownership.');?></p>
|
30 |
+
</div>
|
31 |
+
|
32 |
+
<ul class="form-list left">
|
33 |
+
<li class="fields">
|
34 |
+
<label for="email_address" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
|
35 |
+
<div class="input-box">
|
36 |
+
<input type="text" name="email" id="email_address" value="<?php echo $this->escapeHtml($grandParent->getFormData()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="input-text validate-email required-entry" />
|
37 |
+
</div>
|
38 |
+
</li>
|
39 |
+
</ul>
|
40 |
+
<div class="clearer"></div>
|
41 |
+
</div>
|
42 |
+
|
43 |
+
<div class="buttons-set">
|
44 |
+
<p class="required"><?php echo $this->__('* Required Fields') ?></p>
|
45 |
+
<p class="back-link"><a href="<?php echo $this->escapeUrl($this->getBackUrl()) ?>" class="back-link"><small>« </small><?php echo $this->__('Back') ?></a></p>
|
46 |
+
<button type="submit" title="<?php echo $this->__('Submit') ?>" class="button"><span><span><?php echo $this->__('Submit') ?></span></span></button>
|
47 |
+
</div>
|
48 |
+
<script type="text/javascript">
|
49 |
+
//<![CDATA[
|
50 |
+
var dataForm = new VarienForm('form-existing-customer', true);
|
51 |
+
//]]>
|
52 |
+
</script>
|
53 |
+
</form>
|
app/design/frontend/base/default/template/github/customer/fields.phtml
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
?>
|
19 |
+
<li class="fields">
|
20 |
+
<div class="field">
|
21 |
+
<label for="github_login" class="required"><em>*</em><?php echo $this->__('Github Username') ?></label>
|
22 |
+
<div class="input-box">
|
23 |
+
<input type="text" name="github_login" id="github_login" title="<?php echo $this->__('Github Username') ?>" class="input-text required-entry" />
|
24 |
+
<p><?php echo $this->__("You can also <a href='%s'>login</a> with your Github account. You won't need to provide any password for our website and some information will be pre-filled for you.", $this->getUrl('github/account/login'));?></p>
|
25 |
+
</div>
|
26 |
+
</div>
|
27 |
+
</li>
|
app/design/frontend/base/default/template/github/customer/info.phtml
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
?>
|
19 |
+
<div class="box-account box-info">
|
20 |
+
<div class="box-head">
|
21 |
+
<h2><?php echo $this->__('Additional Information') ?></h2>
|
22 |
+
</div>
|
23 |
+
<div class="col2-set">
|
24 |
+
<div class="col-1">
|
25 |
+
<div class="box">
|
26 |
+
<div class="box-title">
|
27 |
+
<h3><?php echo $this->__('Github Information') ?></h3>
|
28 |
+
</div>
|
29 |
+
<div class="box-content">
|
30 |
+
<p>
|
31 |
+
<?php echo $this->__('Username: ') . $this->htmlEscape(Mage::getSingleton('customer/session')->getCustomer()->getGithubLogin()) ?>
|
32 |
+
</p>
|
33 |
+
</div>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
</div>
|
app/design/frontend/base/default/template/github/customer/login.phtml
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Diglin
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
*
|
12 |
+
*
|
13 |
+
* @category Diglin
|
14 |
+
* @package Diglin_Github
|
15 |
+
* @copyright Copyright (c) 2011-2013 Diglin (http://www.diglin.com)
|
16 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
17 |
+
*/
|
18 |
+
|
19 |
+
/* @var $this Mage_Core_Block_Template */
|
20 |
+
|
21 |
+
$header = $this->getHeader();
|
22 |
+
|
23 |
+
if (empty($header)) {
|
24 |
+
$header = '2';
|
25 |
+
}
|
26 |
+
?>
|
27 |
+
<div class="github-login">
|
28 |
+
<?php echo sprintf('<h%s>', $header) . $this->__('Login with your Github account.') . sprintf('</h%s>', $header) ; ?>
|
29 |
+
<?php echo $this->getChildHtml('github.button'); ?>
|
30 |
+
</div>
|
app/etc/modules/Diglin_Github.xml
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<config>
|
2 |
+
<modules>
|
3 |
+
<Diglin_Github>
|
4 |
+
<active>true</active>
|
5 |
+
<codePool>community</codePool>
|
6 |
+
</Diglin_Github>
|
7 |
+
</modules>
|
8 |
+
</config>
|
app/locale/en_US/template/email/github/existing_customer_link_confirmation.html
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!--@subject Existing Customer - Account Github link confirmation for {{var customer.name}} @-->
|
2 |
+
<!--@styles
|
3 |
+
body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; }
|
4 |
+
@-->
|
5 |
+
|
6 |
+
<body style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
|
7 |
+
<div style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
|
8 |
+
<table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%">
|
9 |
+
<tr>
|
10 |
+
<td align="center" valign="top" style="padding:20px 0 20px 0">
|
11 |
+
<!-- [ header starts here] -->
|
12 |
+
<table bgcolor="FFFFFF" cellspacing="0" cellpadding="10" border="0" width="650" style="border:1px solid #E0E0E0;">
|
13 |
+
<tr>
|
14 |
+
<td valign="top">
|
15 |
+
<a href="{{store url=""}}"><img src="{{var logo_url}}" alt="{{var logo_alt}}" style="margin-bottom:10px;" border="0"/></a>
|
16 |
+
</td>
|
17 |
+
</tr>
|
18 |
+
<!-- [ middle starts here] -->
|
19 |
+
<tr>
|
20 |
+
<td valign="top">
|
21 |
+
<h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;">Dear {{htmlescape var=$customer.name}},</h1>
|
22 |
+
<p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">To confirm that's this account belongs to you and to link it to your Github Account {{htmlescape var=$github_confirmation.github_login}}, please, use <a href="{{store url="github/account/confirmation/" _query_id=$customer.id _query_key=$github_confirmation.key _query_back_url=$back_url}}" style="color:#1E7EC8;">this confirmation link</a>. This link is valid only once.</p>
|
23 |
+
<p style="border:1px solid #E0E0E0; font-size:12px; line-height:16px; margin:0 0 16px 0; padding:13px 18px; background:#f9f9f9;">
|
24 |
+
<p style="font-size:12px; line-height:16px; margin:0;">If you have any questions about your account or any other matter, please feel free to contact us at <a href="mailto:{{config path='trans_email/ident_support/email'}}" style="color:#1E7EC8;">{{config path='trans_email/ident_support/email'}}</a> or by phone at {{config path='general/store_information/phone'}}.</p>
|
25 |
+
</td>
|
26 |
+
</tr>
|
27 |
+
<tr>
|
28 |
+
<td bgcolor="#EAEAEA" align="center" style="background:#EAEAEA; text-align:center;"><center><p style="font-size:12px; margin:0;">Thank you again, <strong>{{var store.getFrontendName()}}</strong></p></center></td>
|
29 |
+
</tr>
|
30 |
+
</table>
|
31 |
+
</td>
|
32 |
+
</tr>
|
33 |
+
</table>
|
34 |
+
</div>
|
35 |
+
</body>
|
lib/Oauth2/Client.php
ADDED
@@ -0,0 +1,513 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Note : Code is released under the GNU LGPL
|
4 |
+
*
|
5 |
+
* Please do not change the header of this file
|
6 |
+
*
|
7 |
+
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU
|
8 |
+
* Lesser General Public License as published by the Free Software Foundation; either version 2 of
|
9 |
+
* the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
12 |
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
13 |
+
*
|
14 |
+
* See the GNU Lesser General Public License for more details.
|
15 |
+
*/
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Light PHP wrapper for the OAuth 2.0 protocol.
|
19 |
+
*
|
20 |
+
* This client is based on the OAuth2 specification draft v2.15
|
21 |
+
* http://tools.ietf.org/html/draft-ietf-oauth-v2-15
|
22 |
+
*
|
23 |
+
* @author Pierrick Charron <pierrick@webstart.fr>
|
24 |
+
* @author Anis Berejeb <anis.berejeb@gmail.com>
|
25 |
+
* @version 1.2-dev
|
26 |
+
*/
|
27 |
+
namespace OAuth2;
|
28 |
+
|
29 |
+
class Client
|
30 |
+
{
|
31 |
+
/**
|
32 |
+
* Different AUTH method
|
33 |
+
*/
|
34 |
+
const AUTH_TYPE_URI = 0;
|
35 |
+
const AUTH_TYPE_AUTHORIZATION_BASIC = 1;
|
36 |
+
const AUTH_TYPE_FORM = 2;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Different Access token type
|
40 |
+
*/
|
41 |
+
const ACCESS_TOKEN_URI = 0;
|
42 |
+
const ACCESS_TOKEN_BEARER = 1;
|
43 |
+
const ACCESS_TOKEN_OAUTH = 2;
|
44 |
+
const ACCESS_TOKEN_MAC = 3;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Different Grant types
|
48 |
+
*/
|
49 |
+
const GRANT_TYPE_AUTH_CODE = 'authorization_code';
|
50 |
+
const GRANT_TYPE_PASSWORD = 'password';
|
51 |
+
const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials';
|
52 |
+
const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token';
|
53 |
+
|
54 |
+
/**
|
55 |
+
* HTTP Methods
|
56 |
+
*/
|
57 |
+
const HTTP_METHOD_GET = 'GET';
|
58 |
+
const HTTP_METHOD_POST = 'POST';
|
59 |
+
const HTTP_METHOD_PUT = 'PUT';
|
60 |
+
const HTTP_METHOD_DELETE = 'DELETE';
|
61 |
+
const HTTP_METHOD_HEAD = 'HEAD';
|
62 |
+
|
63 |
+
/**
|
64 |
+
* HTTP Form content types
|
65 |
+
*/
|
66 |
+
const HTTP_FORM_CONTENT_TYPE_APPLICATION = 0;
|
67 |
+
const HTTP_FORM_CONTENT_TYPE_MULTIPART = 1;
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Client ID
|
71 |
+
*
|
72 |
+
* @var string
|
73 |
+
*/
|
74 |
+
protected $client_id = null;
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Client Secret
|
78 |
+
*
|
79 |
+
* @var string
|
80 |
+
*/
|
81 |
+
protected $client_secret = null;
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Client Authentication method
|
85 |
+
*
|
86 |
+
* @var int
|
87 |
+
*/
|
88 |
+
protected $client_auth = self::AUTH_TYPE_URI;
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Access Token
|
92 |
+
*
|
93 |
+
* @var string
|
94 |
+
*/
|
95 |
+
protected $access_token = null;
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Access Token Type
|
99 |
+
*
|
100 |
+
* @var int
|
101 |
+
*/
|
102 |
+
protected $access_token_type = self::ACCESS_TOKEN_URI;
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Access Token Secret
|
106 |
+
*
|
107 |
+
* @var string
|
108 |
+
*/
|
109 |
+
protected $access_token_secret = null;
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Access Token crypt algorithm
|
113 |
+
*
|
114 |
+
* @var string
|
115 |
+
*/
|
116 |
+
protected $access_token_algorithm = null;
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Access Token Parameter name
|
120 |
+
*
|
121 |
+
* @var string
|
122 |
+
*/
|
123 |
+
protected $access_token_param_name = 'access_token';
|
124 |
+
|
125 |
+
/**
|
126 |
+
* The path to the certificate file to use for https connections
|
127 |
+
*
|
128 |
+
* @var string Defaults to .
|
129 |
+
*/
|
130 |
+
protected $certificate_file = null;
|
131 |
+
|
132 |
+
/**
|
133 |
+
* cURL options
|
134 |
+
*
|
135 |
+
* @var array
|
136 |
+
*/
|
137 |
+
protected $curl_options = array();
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Construct
|
141 |
+
*
|
142 |
+
* @param string $client_id Client ID
|
143 |
+
* @param string $client_secret Client Secret
|
144 |
+
* @param int $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM)
|
145 |
+
* @param string $certificate_file Indicates if we want to use a certificate file to trust the server. Optional, defaults to null.
|
146 |
+
* @return void
|
147 |
+
*/
|
148 |
+
public function __construct($client_id, $client_secret, $client_auth = self::AUTH_TYPE_URI, $certificate_file = null)
|
149 |
+
{
|
150 |
+
if (!extension_loaded('curl')) {
|
151 |
+
throw new Exception('The PHP exention curl must be installed to use this library.', Exception::CURL_NOT_FOUND);
|
152 |
+
}
|
153 |
+
|
154 |
+
$this->client_id = $client_id;
|
155 |
+
$this->client_secret = $client_secret;
|
156 |
+
$this->client_auth = $client_auth;
|
157 |
+
$this->certificate_file = $certificate_file;
|
158 |
+
if (!empty($this->certificate_file) && !is_file($this->certificate_file)) {
|
159 |
+
throw new InvalidArgumentException('The certificate file was not found', InvalidArgumentException::CERTIFICATE_NOT_FOUND);
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Get the client Id
|
165 |
+
*
|
166 |
+
* @return string Client ID
|
167 |
+
*/
|
168 |
+
public function getClientId()
|
169 |
+
{
|
170 |
+
return $this->client_id;
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Get the client Secret
|
175 |
+
*
|
176 |
+
* @return string Client Secret
|
177 |
+
*/
|
178 |
+
public function getClientSecret()
|
179 |
+
{
|
180 |
+
return $this->client_secret;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* getAuthenticationUrl
|
185 |
+
*
|
186 |
+
* @param string $auth_endpoint Url of the authentication endpoint
|
187 |
+
* @param string $redirect_uri Redirection URI
|
188 |
+
* @param array $extra_parameters Array of extra parameters like scope or state (Ex: array('scope' => null, 'state' => ''))
|
189 |
+
* @return string URL used for authentication
|
190 |
+
*/
|
191 |
+
public function getAuthenticationUrl($auth_endpoint, $redirect_uri, array $extra_parameters = array())
|
192 |
+
{
|
193 |
+
$parameters = array_merge(array(
|
194 |
+
'response_type' => 'code',
|
195 |
+
'client_id' => $this->client_id,
|
196 |
+
'redirect_uri' => $redirect_uri
|
197 |
+
), $extra_parameters);
|
198 |
+
return $auth_endpoint . '?' . http_build_query($parameters, null, '&');
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* getAccessToken
|
203 |
+
*
|
204 |
+
* @param string $token_endpoint Url of the token endpoint
|
205 |
+
* @param int $grant_type Grant Type ('authorization_code', 'password', 'client_credentials', 'refresh_token', or a custom code (@see GrantType Classes)
|
206 |
+
* @param array $parameters Array sent to the server (depend on which grant type you're using)
|
207 |
+
* @return array Array of parameters required by the grant_type (CF SPEC)
|
208 |
+
*/
|
209 |
+
public function getAccessToken($token_endpoint, $grant_type, array $parameters)
|
210 |
+
{
|
211 |
+
if (!$grant_type) {
|
212 |
+
throw new InvalidArgumentException('The grant_type is mandatory.', InvalidArgumentException::INVALID_GRANT_TYPE);
|
213 |
+
}
|
214 |
+
$grantTypeClassName = $this->convertToCamelCase($grant_type);
|
215 |
+
$grantTypeClass = __NAMESPACE__ . '\\GrantType\\' . $grantTypeClassName;
|
216 |
+
if (!class_exists($grantTypeClass)) {
|
217 |
+
throw new InvalidArgumentException('Unknown grant type \'' . $grant_type . '\'', InvalidArgumentException::INVALID_GRANT_TYPE);
|
218 |
+
}
|
219 |
+
$grantTypeObject = new $grantTypeClass();
|
220 |
+
$grantTypeObject->validateParameters($parameters);
|
221 |
+
if (!defined($grantTypeClass . '::GRANT_TYPE')) {
|
222 |
+
throw new Exception('Unknown constant GRANT_TYPE for class ' . $grantTypeClassName, Exception::GRANT_TYPE_ERROR);
|
223 |
+
}
|
224 |
+
$parameters['grant_type'] = $grantTypeClass::GRANT_TYPE;
|
225 |
+
$http_headers = array();
|
226 |
+
switch ($this->client_auth) {
|
227 |
+
case self::AUTH_TYPE_URI:
|
228 |
+
case self::AUTH_TYPE_FORM:
|
229 |
+
$parameters['client_id'] = $this->client_id;
|
230 |
+
$parameters['client_secret'] = $this->client_secret;
|
231 |
+
break;
|
232 |
+
case self::AUTH_TYPE_AUTHORIZATION_BASIC:
|
233 |
+
$parameters['client_id'] = $this->client_id;
|
234 |
+
$http_headers['Authorization'] = 'Basic ' . base64_encode($this->client_id . ':' . $this->client_secret);
|
235 |
+
break;
|
236 |
+
default:
|
237 |
+
throw new Exception('Unknown client auth type.', Exception::INVALID_CLIENT_AUTHENTICATION_TYPE);
|
238 |
+
break;
|
239 |
+
}
|
240 |
+
|
241 |
+
return $this->executeRequest($token_endpoint, $parameters, self::HTTP_METHOD_POST, $http_headers, self::HTTP_FORM_CONTENT_TYPE_APPLICATION);
|
242 |
+
}
|
243 |
+
|
244 |
+
/**
|
245 |
+
* setToken
|
246 |
+
*
|
247 |
+
* @param string $token Set the access token
|
248 |
+
* @return void
|
249 |
+
*/
|
250 |
+
public function setAccessToken($token)
|
251 |
+
{
|
252 |
+
$this->access_token = $token;
|
253 |
+
}
|
254 |
+
|
255 |
+
/**
|
256 |
+
* Set the client authentication type
|
257 |
+
*
|
258 |
+
* @param string $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM)
|
259 |
+
* @return void
|
260 |
+
*/
|
261 |
+
public function setClientAuthType($client_auth)
|
262 |
+
{
|
263 |
+
$this->client_auth = $client_auth;
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Set an option for the curl transfer
|
268 |
+
*
|
269 |
+
* @param int $option The CURLOPT_XXX option to set
|
270 |
+
* @param mixed $value The value to be set on option
|
271 |
+
* @return void
|
272 |
+
*/
|
273 |
+
public function setCurlOption($option, $value)
|
274 |
+
{
|
275 |
+
$this->curl_options[$option] = $value;
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* Set multiple options for a cURL transfer
|
280 |
+
*
|
281 |
+
* @param array $options An array specifying which options to set and their values
|
282 |
+
* @return void
|
283 |
+
*/
|
284 |
+
public function setCurlOptions($options)
|
285 |
+
{
|
286 |
+
$this->curl_options = array_merge($this->curl_options, $options);
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* Set the access token type
|
291 |
+
*
|
292 |
+
* @param int $type Access token type (ACCESS_TOKEN_BEARER, ACCESS_TOKEN_MAC, ACCESS_TOKEN_URI)
|
293 |
+
* @param string $secret The secret key used to encrypt the MAC header
|
294 |
+
* @param string $algorithm Algorithm used to encrypt the signature
|
295 |
+
* @return void
|
296 |
+
*/
|
297 |
+
public function setAccessTokenType($type, $secret = null, $algorithm = null)
|
298 |
+
{
|
299 |
+
$this->access_token_type = $type;
|
300 |
+
$this->access_token_secret = $secret;
|
301 |
+
$this->access_token_algorithm = $algorithm;
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Fetch a protected ressource
|
306 |
+
*
|
307 |
+
* @param string $protected_ressource_url Protected resource URL
|
308 |
+
* @param array $parameters Array of parameters
|
309 |
+
* @param string $http_method HTTP Method to use (POST, PUT, GET, HEAD, DELETE)
|
310 |
+
* @param array $http_headers HTTP headers
|
311 |
+
* @param int $form_content_type HTTP form content type to use
|
312 |
+
* @return array
|
313 |
+
*/
|
314 |
+
public function fetch($protected_resource_url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = array(), $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART)
|
315 |
+
{
|
316 |
+
if ($this->access_token) {
|
317 |
+
switch ($this->access_token_type) {
|
318 |
+
case self::ACCESS_TOKEN_URI:
|
319 |
+
if (is_array($parameters)) {
|
320 |
+
$parameters[$this->access_token_param_name] = $this->access_token;
|
321 |
+
} else {
|
322 |
+
throw new InvalidArgumentException(
|
323 |
+
'You need to give parameters as array if you want to give the token within the URI.',
|
324 |
+
InvalidArgumentException::REQUIRE_PARAMS_AS_ARRAY
|
325 |
+
);
|
326 |
+
}
|
327 |
+
break;
|
328 |
+
case self::ACCESS_TOKEN_BEARER:
|
329 |
+
$http_headers['Authorization'] = 'Bearer ' . $this->access_token;
|
330 |
+
break;
|
331 |
+
case self::ACCESS_TOKEN_OAUTH:
|
332 |
+
$http_headers['Authorization'] = 'OAuth ' . $this->access_token;
|
333 |
+
break;
|
334 |
+
case self::ACCESS_TOKEN_MAC:
|
335 |
+
$http_headers['Authorization'] = 'MAC ' . $this->generateMACSignature($protected_resource_url, $parameters, $http_method);
|
336 |
+
break;
|
337 |
+
default:
|
338 |
+
throw new Exception('Unknown access token type.', Exception::INVALID_ACCESS_TOKEN_TYPE);
|
339 |
+
break;
|
340 |
+
}
|
341 |
+
}
|
342 |
+
return $this->executeRequest($protected_resource_url, $parameters, $http_method, $http_headers, $form_content_type);
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Generate the MAC signature
|
347 |
+
*
|
348 |
+
* @param string $url Called URL
|
349 |
+
* @param array $parameters Parameters
|
350 |
+
* @param string $http_method Http Method
|
351 |
+
* @return string
|
352 |
+
*/
|
353 |
+
private function generateMACSignature($url, $parameters, $http_method)
|
354 |
+
{
|
355 |
+
$timestamp = time();
|
356 |
+
$nonce = uniqid();
|
357 |
+
$parsed_url = parse_url($url);
|
358 |
+
if (!isset($parsed_url['port']))
|
359 |
+
{
|
360 |
+
$parsed_url['port'] = ($parsed_url['scheme'] == 'https') ? 443 : 80;
|
361 |
+
}
|
362 |
+
if ($http_method == self::HTTP_METHOD_GET) {
|
363 |
+
if (is_array($parameters)) {
|
364 |
+
$parsed_url['path'] .= '?' . http_build_query($parameters, null, '&');
|
365 |
+
} elseif ($parameters) {
|
366 |
+
$parsed_url['path'] .= '?' . $parameters;
|
367 |
+
}
|
368 |
+
}
|
369 |
+
|
370 |
+
$signature = base64_encode(hash_hmac($this->access_token_algorithm,
|
371 |
+
$timestamp . "\n"
|
372 |
+
. $nonce . "\n"
|
373 |
+
. $http_method . "\n"
|
374 |
+
. $parsed_url['path'] . "\n"
|
375 |
+
. $parsed_url['host'] . "\n"
|
376 |
+
. $parsed_url['port'] . "\n\n"
|
377 |
+
, $this->access_token_secret, true));
|
378 |
+
|
379 |
+
return 'id="' . $this->access_token . '", ts="' . $timestamp . '", nonce="' . $nonce . '", mac="' . $signature . '"';
|
380 |
+
}
|
381 |
+
|
382 |
+
/**
|
383 |
+
* Execute a request (with curl)
|
384 |
+
*
|
385 |
+
* @param string $url URL
|
386 |
+
* @param mixed $parameters Array of parameters
|
387 |
+
* @param string $http_method HTTP Method
|
388 |
+
* @param array $http_headers HTTP Headers
|
389 |
+
* @param int $form_content_type HTTP form content type to use
|
390 |
+
* @return array
|
391 |
+
*/
|
392 |
+
private function executeRequest($url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = null, $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART)
|
393 |
+
{
|
394 |
+
$curl_options = array(
|
395 |
+
CURLOPT_RETURNTRANSFER => true,
|
396 |
+
CURLOPT_SSL_VERIFYPEER => true,
|
397 |
+
CURLOPT_CUSTOMREQUEST => $http_method
|
398 |
+
);
|
399 |
+
|
400 |
+
switch($http_method) {
|
401 |
+
case self::HTTP_METHOD_POST:
|
402 |
+
$curl_options[CURLOPT_POST] = true;
|
403 |
+
/* No break */
|
404 |
+
case self::HTTP_METHOD_PUT:
|
405 |
+
|
406 |
+
/**
|
407 |
+
* Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data,
|
408 |
+
* while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded.
|
409 |
+
* http://php.net/manual/en/function.curl-setopt.php
|
410 |
+
*/
|
411 |
+
if(is_array($parameters) && self::HTTP_FORM_CONTENT_TYPE_APPLICATION === $form_content_type) {
|
412 |
+
$parameters = http_build_query($parameters, null, '&');
|
413 |
+
}
|
414 |
+
$curl_options[CURLOPT_POSTFIELDS] = $parameters;
|
415 |
+
break;
|
416 |
+
case self::HTTP_METHOD_HEAD:
|
417 |
+
$curl_options[CURLOPT_NOBODY] = true;
|
418 |
+
/* No break */
|
419 |
+
case self::HTTP_METHOD_DELETE:
|
420 |
+
case self::HTTP_METHOD_GET:
|
421 |
+
if (is_array($parameters)) {
|
422 |
+
$url .= '?' . http_build_query($parameters, null, '&');
|
423 |
+
} elseif ($parameters) {
|
424 |
+
$url .= '?' . $parameters;
|
425 |
+
}
|
426 |
+
break;
|
427 |
+
default:
|
428 |
+
break;
|
429 |
+
}
|
430 |
+
|
431 |
+
$curl_options[CURLOPT_URL] = $url;
|
432 |
+
|
433 |
+
if (is_array($http_headers)) {
|
434 |
+
$header = array();
|
435 |
+
foreach($http_headers as $key => $parsed_urlvalue) {
|
436 |
+
$header[] = "$key: $parsed_urlvalue";
|
437 |
+
}
|
438 |
+
$curl_options[CURLOPT_HTTPHEADER] = $header;
|
439 |
+
}
|
440 |
+
|
441 |
+
$ch = curl_init();
|
442 |
+
curl_setopt_array($ch, $curl_options);
|
443 |
+
// https handling
|
444 |
+
if (!empty($this->certificate_file)) {
|
445 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
446 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
447 |
+
curl_setopt($ch, CURLOPT_CAINFO, $this->certificate_file);
|
448 |
+
} else {
|
449 |
+
// bypass ssl verification
|
450 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
451 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
452 |
+
}
|
453 |
+
if (!empty($this->curl_options)) {
|
454 |
+
curl_setopt_array($ch, $this->curl_options);
|
455 |
+
}
|
456 |
+
$result = curl_exec($ch);
|
457 |
+
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
458 |
+
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
|
459 |
+
if ($curl_error = curl_error($ch)) {
|
460 |
+
throw new Exception($curl_error, Exception::CURL_ERROR);
|
461 |
+
} else {
|
462 |
+
$json_decode = json_decode($result, true);
|
463 |
+
}
|
464 |
+
curl_close($ch);
|
465 |
+
|
466 |
+
return array(
|
467 |
+
'result' => (null === $json_decode) ? $result : $json_decode,
|
468 |
+
'code' => $http_code,
|
469 |
+
'content_type' => $content_type
|
470 |
+
);
|
471 |
+
}
|
472 |
+
|
473 |
+
/**
|
474 |
+
* Set the name of the parameter that carry the access token
|
475 |
+
*
|
476 |
+
* @param string $name Token parameter name
|
477 |
+
* @return void
|
478 |
+
*/
|
479 |
+
public function setAccessTokenParamName($name)
|
480 |
+
{
|
481 |
+
$this->access_token_param_name = $name;
|
482 |
+
}
|
483 |
+
|
484 |
+
/**
|
485 |
+
* Converts the class name to camel case
|
486 |
+
*
|
487 |
+
* @param mixed $grant_type the grant type
|
488 |
+
* @return string
|
489 |
+
*/
|
490 |
+
private function convertToCamelCase($grant_type)
|
491 |
+
{
|
492 |
+
$parts = explode('_', $grant_type);
|
493 |
+
array_walk($parts, function(&$item) { $item = ucfirst($item);});
|
494 |
+
return implode('', $parts);
|
495 |
+
}
|
496 |
+
}
|
497 |
+
|
498 |
+
class Exception extends \Exception
|
499 |
+
{
|
500 |
+
const CURL_NOT_FOUND = 0x01;
|
501 |
+
const CURL_ERROR = 0x02;
|
502 |
+
const GRANT_TYPE_ERROR = 0x03;
|
503 |
+
const INVALID_CLIENT_AUTHENTICATION_TYPE = 0x04;
|
504 |
+
const INVALID_ACCESS_TOKEN_TYPE = 0x05;
|
505 |
+
}
|
506 |
+
|
507 |
+
class InvalidArgumentException extends \InvalidArgumentException
|
508 |
+
{
|
509 |
+
const INVALID_GRANT_TYPE = 0x01;
|
510 |
+
const CERTIFICATE_NOT_FOUND = 0x02;
|
511 |
+
const REQUIRE_PARAMS_AS_ARRAY = 0x03;
|
512 |
+
const MISSING_PARAMETER = 0x04;
|
513 |
+
}
|
lib/Oauth2/GrantType/AuthorizationCode.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace OAuth2\GrantType;
|
3 |
+
|
4 |
+
use OAuth2\InvalidArgumentException;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Authorization code Grant Type Validator
|
8 |
+
*/
|
9 |
+
class AuthorizationCode implements IGrantType
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Defines the Grant Type
|
13 |
+
*
|
14 |
+
* @var string Defaults to 'authorization_code'.
|
15 |
+
*/
|
16 |
+
const GRANT_TYPE = 'authorization_code';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Adds a specific Handling of the parameters
|
20 |
+
*
|
21 |
+
* @return array of Specific parameters to be sent.
|
22 |
+
* @param mixed $parameters the parameters array (passed by reference)
|
23 |
+
*/
|
24 |
+
public function validateParameters(&$parameters)
|
25 |
+
{
|
26 |
+
if (!isset($parameters['code']))
|
27 |
+
{
|
28 |
+
throw new InvalidArgumentException(
|
29 |
+
'The \'code\' parameter must be defined for the Authorization Code grant type',
|
30 |
+
InvalidArgumentException::MISSING_PARAMETER
|
31 |
+
);
|
32 |
+
}
|
33 |
+
elseif (!isset($parameters['redirect_uri']))
|
34 |
+
{
|
35 |
+
throw new InvalidArgumentException(
|
36 |
+
'The \'redirect_uri\' parameter must be defined for the Authorization Code grant type',
|
37 |
+
InvalidArgumentException::MISSING_PARAMETER
|
38 |
+
);
|
39 |
+
}
|
40 |
+
}
|
41 |
+
}
|
lib/Oauth2/GrantType/ClientCredentials.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace OAuth2\GrantType;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Client Credentials Parameters
|
6 |
+
*/
|
7 |
+
class ClientCredentials implements IGrantType
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* Defines the Grant Type
|
11 |
+
*
|
12 |
+
* @var string Defaults to 'client_credentials'.
|
13 |
+
*/
|
14 |
+
const GRANT_TYPE = 'client_credentials';
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Adds a specific Handling of the parameters
|
18 |
+
*
|
19 |
+
* @return array of Specific parameters to be sent.
|
20 |
+
* @param mixed $parameters the parameters array (passed by reference)
|
21 |
+
*/
|
22 |
+
public function validateParameters(&$parameters)
|
23 |
+
{
|
24 |
+
}
|
25 |
+
}
|
lib/Oauth2/GrantType/IGrantType.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace OAuth2\GrantType;
|
3 |
+
/**
|
4 |
+
* Specific GrantType Interface
|
5 |
+
*/
|
6 |
+
interface IGrantType
|
7 |
+
{
|
8 |
+
/**
|
9 |
+
* Adds a specific Handling of the parameters
|
10 |
+
*
|
11 |
+
* @return array of Specific parameters to be sent.
|
12 |
+
* @param mixed $parameters the parameters array (passed by reference)
|
13 |
+
*/
|
14 |
+
public function validateParameters(&$parameters);
|
15 |
+
}
|
lib/Oauth2/GrantType/Password.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace OAuth2\GrantType;
|
3 |
+
|
4 |
+
use OAuth2\InvalidArgumentException;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Password Parameters
|
8 |
+
*/
|
9 |
+
class Password implements IGrantType
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Defines the Grant Type
|
13 |
+
*
|
14 |
+
* @var string Defaults to 'password'.
|
15 |
+
*/
|
16 |
+
const GRANT_TYPE = 'password';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Adds a specific Handling of the parameters
|
20 |
+
*
|
21 |
+
* @return array of Specific parameters to be sent.
|
22 |
+
* @param mixed $parameters the parameters array (passed by reference)
|
23 |
+
*/
|
24 |
+
public function validateParameters(&$parameters)
|
25 |
+
{
|
26 |
+
if (!isset($parameters['username']))
|
27 |
+
{
|
28 |
+
throw new InvalidArgumentException(
|
29 |
+
'The \'username\' parameter must be defined for the Password grant type',
|
30 |
+
InvalidArgumentException::MISSING_PARAMETER
|
31 |
+
);
|
32 |
+
}
|
33 |
+
elseif (!isset($parameters['password']))
|
34 |
+
{
|
35 |
+
throw new InvalidArgumentException(
|
36 |
+
'The \'password\' parameter must be defined for the Password grant type',
|
37 |
+
InvalidArgumentException::MISSING_PARAMETER
|
38 |
+
);
|
39 |
+
}
|
40 |
+
}
|
41 |
+
}
|
lib/Oauth2/GrantType/RefreshToken.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace OAuth2\GrantType;
|
3 |
+
|
4 |
+
use OAuth2\InvalidArgumentException;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Refresh Token Parameters
|
8 |
+
*/
|
9 |
+
class RefreshToken implements IGrantType
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Defines the Grant Type
|
13 |
+
*
|
14 |
+
* @var string Defaults to 'refresh_token'.
|
15 |
+
*/
|
16 |
+
const GRANT_TYPE = 'refresh_token';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Adds a specific Handling of the parameters
|
20 |
+
*
|
21 |
+
* @return array of Specific parameters to be sent.
|
22 |
+
* @param mixed $parameters the parameters array (passed by reference)
|
23 |
+
*/
|
24 |
+
public function validateParameters(&$parameters)
|
25 |
+
{
|
26 |
+
if (!isset($parameters['refresh_token']))
|
27 |
+
{
|
28 |
+
throw new InvalidArgumentException(
|
29 |
+
'The \'refresh_token\' parameter must be defined for the refresh token grant type',
|
30 |
+
InvalidArgumentException::MISSING_PARAMETER
|
31 |
+
);
|
32 |
+
}
|
33 |
+
}
|
34 |
+
}
|
lib/Oauth2/Test.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once '../../app/Mage.php';
|
4 |
+
require('client.php');
|
5 |
+
require('GrantType/IGrantType.php');
|
6 |
+
require('GrantType/AuthorizationCode.php');
|
7 |
+
|
8 |
+
const CLIENT_ID = '';
|
9 |
+
const CLIENT_SECRET = '';
|
10 |
+
|
11 |
+
const REDIRECT_URI = 'http://dev.magento.local/lib/Oauth2/Test.php';
|
12 |
+
const AUTHORIZATION_ENDPOINT = 'https://github.com/login/oauth/authorize';
|
13 |
+
const TOKEN_ENDPOINT = 'https://github.com/login/oauth/access_token';
|
14 |
+
|
15 |
+
$state = Mage::helper('core')->getRandomString(20);
|
16 |
+
|
17 |
+
$client = new OAuth2\Client(CLIENT_ID, CLIENT_SECRET);
|
18 |
+
if (!isset($_GET['code']))
|
19 |
+
{
|
20 |
+
$auth_url = $client->getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI, array('state' => $state, 'scope' => 'user'));
|
21 |
+
header('Location: ' . $auth_url);
|
22 |
+
die('Redirect');
|
23 |
+
} else if (isset($_GET['access_token'])) {
|
24 |
+
$client->setAccessToken($_GET['access_token']);
|
25 |
+
$response = $client->fetch('https://api.github.com/user/emails');
|
26 |
+
Zend_Debug::dump($response);
|
27 |
+
Zend_Debug::dump($response['result']);
|
28 |
+
} else
|
29 |
+
{
|
30 |
+
$params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI, 'state' => $state, 'scope' => 'user');
|
31 |
+
$response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params);
|
32 |
+
parse_str($response['result'], $info);
|
33 |
+
echo $info['access_token'];
|
34 |
+
$client->setAccessToken($info['access_token']);
|
35 |
+
$response = $client->fetch('https://api.github.com/user');
|
36 |
+
Zend_Debug::dump($response);
|
37 |
+
Zend_Debug::dump($response['result']);
|
38 |
+
}
|
package.xml
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Diglin_Github</name>
|
4 |
+
<version>1.0.0</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license uri="http://www.opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>Autorize your customers/users to login & register into Magento via their Github account</summary>
|
10 |
+
<description><p>Do not hesitate to fork this project, share your changes or if you have an issue, visit the <a href="https://github.com/diglin/Diglin_Github">GitHub</a> repository</p>
|
11 |
+
<p>I don't receive any notification if you post a review. So contact me directly instead if you have any issue. Thanks.</p>
|
12 |
+
<h2>Diglin Github</h2>
|
13 |
+
<p>Autorize your customers/users to login and register into your Magento installatio via their Github account</p>
|
14 |
+
<ul>
|
15 |
+
<li>Users will be redirected to Github to login into their account and redirected again after success on your shop<br />
|
16 |
+
</li>
|
17 |
+
<li>Allow non existing customer to create the account on your shop thanks to the Github information<br />
|
18 |
+
</li>
|
19 |
+
<li>Existing customers/users can also link their Github account to your shop account, they just need to try to login via Github and they will be redirected to the create/link account page<br />
|
20 |
+
</li>
|
21 |
+
<li>Notification for existing customer to confirm that they want to link their Github account with the one of the shop</li>
|
22 |
+
<li>Configure to display the github login information into Customer Management Grid</li>
|
23 |
+
</ul>
|
24 |
+
<h2>Documentation</h2>
|
25 |
+
<ul>
|
26 |
+
<li>login into your backend</li>
|
27 |
+
<li>Go to System &gt; Configuration &gt; Diglin &gt; Github</li>
|
28 |
+
<li>Just follow the instruction provided on the configuration page</li>
|
29 |
+
</ul>
|
30 |
+
<p>If you have a 404 Error page while accessing the configuration page, do logout/login from your backend and try again to get access. Otherwise, go to System &gt; Permissions &gt; Role, check the role of your user account and see if the configuration option for Github is marked then save again your role.</p>
|
31 |
+
<p>A live version is used on the <a href="http://www.mage-hackathon.de" target="_blank">Mage Hackathon Website</a></p>
|
32 |
+
<h2>Donation</h2>
|
33 |
+
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y66QHLU5VX5BC">Invite me for a drink</a> (thank you for your donation):</p>
|
34 |
+
<h2>Author</h2>
|
35 |
+
<p>* Sylvain Rayé<br />
|
36 |
+
* <a href="http://www.sylvainraye.com/">http://www.sylvainraye.com/</a><br />
|
37 |
+
* <a href="https://twitter.com/sylvainraye">@sylvainraye</a><br />
|
38 |
+
* Follow me on <a href="https://github.com/diglin">github</a>!</p></description>
|
39 |
+
<notes>- 1.0.0: version stable</notes>
|
40 |
+
<authors><author><name>diglin</name><user>diglin</user><email>sly@diglin.com</email></author></authors>
|
41 |
+
<date>2013-05-24</date>
|
42 |
+
<time>22:45:03</time>
|
43 |
+
<contents><target name="mageetc"><dir name="modules"><file name="Diglin_Github.xml" hash="03213e38a45f3b82df138a63cbe05144"/></dir></target><target name="magecommunity"><dir name="Diglin"><dir name="Github"><dir name="Block"><dir name="Account"><file name="Existing.php" hash="59922b44f9a013a8f70040dd4fd31920"/><file name="Register.php" hash="450651a6a8983836f0764f5edf7a7e41"/></dir><dir name="Adminhtml"><file name="Grid.php" hash="5af33bd265c4eb3c6ccbad9e25961b23"/></dir></dir><dir name="Helper"><file name="Data.php" hash="b7b1e0c40e25892b3b18dcbacf7e1103"/></dir><dir name="Model"><dir name="Adapter"><file name="Oauth2.php" hash="7f48d51779f931364c3aed644a648849"/></dir><file name="Confirmation.php" hash="17917247ea2fca7d9e04d63f5e541733"/><file name="Log.php" hash="292b654e87611c1a9492855134ce8664"/><file name="Observer.php" hash="6ee8ba378a6802afafba9404e75e5005"/><dir name="Resource"><dir name="Confirmation"><file name="Collection.php" hash="e550bab950edf15661f4bced1c1c0d10"/></dir><file name="Confirmation.php" hash="dc87839e7f775a39ff3dacf5d59cdeca"/><file name="Setup.php" hash="56ebd5ed91084919ae4aef07530bd417"/></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Oauth.php" hash="dd910383b477401259c0a4e631928459"/></dir></dir></dir></dir><dir name="controllers"><file name="AccountController.php" hash="2060a745afb564be86e3b9a18a62cef9"/></dir><dir name="etc"><file name="adminhtml.xml" hash="92d705b3a147401074da3be4ce30f345"/><file name="config.xml" hash="a34bb160358906d4b8747d35f1d490ed"/><file name="system.xml" hash="e2072b6be59c741a56769ef3b436ddca"/></dir><dir name="sql"><dir name="github_setup"><file name="install-1.0.0.0.php" hash="a566a0b317b87348e8e38dad93868c4c"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="github.xml" hash="578c5d0bc1fbf68e18369affed8b5dcb"/></dir><dir name="template"><dir name="github"><dir><dir name="customer"><file name="button.phtml" hash="e4aae5f9ecd5aafa3ef3cd2c698b9777"/><file name="create.phtml" hash="9836940d5111842227b4e5bf6951f9bf"/><file name="existing.phtml" hash="1a12ea0b135deeb08e40884bda7ff7cb"/><file name="fields.phtml" hash="e4520d7bb0505bbe29e9b5e13047aca9"/><file name="info.phtml" hash="bed607e849a2bff3a260b469792a95a2"/><file name="login.phtml" hash="316d52fe1546fd73f7a39e7e1d47f761"/></dir></dir></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="Oauth2"><file name="Client.php" hash="eaccb047e274c9c3a43ccaf20517803a"/><dir name="GrantType"><file name="AuthorizationCode.php" hash="a1ff324a733fc33dbf938153c4c1667c"/><file name="ClientCredentials.php" hash="21b30fbb06d4b67263499d687316ae8b"/><file name="IGrantType.php" hash="ee03d4c5bc20f518716fc2c616b4d38d"/><file name="Password.php" hash="2e938e60c4af8bad71b5c4f0f1a40969"/><file name="RefreshToken.php" hash="a773f48348ad7aa510955099ba18d3ad"/></dir><file name="Test.php" hash="d3185c037658594e6f79efd08af76a81"/></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><dir name="github"><file name="existing_customer_link_confirmation.html" hash="49f9ecee20ae25aac2dec7ecf8b03522"/></dir></dir></dir></dir></target></contents>
|
44 |
+
<compatible/>
|
45 |
+
<dependencies><required><php><min>5.2.9</min><max>6.0.0</max></php></required></dependencies>
|
46 |
+
</package>
|