zendesk - Version 1.2.0

Version Notes

Switch to new Single Sign On approach using JWT and update the way user tickets are requests from the Zendesk search API

Download this release

Release Info

Developer Jason Smale
Extension zendesk
Version 1.2.0
Comparing to
See all releases


Code changes from version 1.1.5 to 1.2.0

app/code/community/Zendesk/Zendesk/Helper/JWT.php ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Retrieved 2013-04-29 - commit 82113fd351cea127ded3d07e40eb46865db9e8f2
4
+ // https://github.com/firebase/php-jwt
5
+
6
+ /**
7
+ * JSON Web Token implementation, based on this spec:
8
+ * http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
9
+ *
10
+ * PHP version 5
11
+ *
12
+ * @category Authentication
13
+ * @package Authentication_JWT
14
+ * @author Neuman Vong <neuman@twilio.com>
15
+ * @author Anant Narayanan <anant@php.net>
16
+ * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
17
+ * @link https://github.com/firebase/php-jwt
18
+ */
19
+ /**
20
+ * JSON Web Token implementation, based on this spec:
21
+ * http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
22
+ *
23
+ * @category Authentication
24
+ * @package Authentication_JWT
25
+ * @author Neuman Vong <neuman@twilio.com>
26
+ * @author Anant Narayanan <anant@php.net>
27
+ * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
28
+ * @link https://github.com/firebase/php-jwt
29
+ */
30
+ class JWT
31
+ {
32
+ /**
33
+ * Decodes a JWT string into a PHP object.
34
+ *
35
+ * @param string $jwt The JWT
36
+ * @param string|null $key The secret key
37
+ * @param bool $verify Don't skip verification process
38
+ *
39
+ * @return object The JWT's payload as a PHP object
40
+ * @throws UnexpectedValueException Provided JWT was invalid
41
+ * @throws DomainException Algorithm was not provided
42
+ *
43
+ * @uses jsonDecode
44
+ * @uses urlsafeB64Decode
45
+ */
46
+ public static function decode($jwt, $key = null, $verify = true)
47
+ {
48
+ $tks = explode('.', $jwt);
49
+ if (count($tks) != 3) {
50
+ throw new UnexpectedValueException('Wrong number of segments');
51
+ }
52
+ list($headb64, $bodyb64, $cryptob64) = $tks;
53
+ if (null === ($header = JWT::jsonDecode(JWT::urlsafeB64Decode($headb64)))) {
54
+ throw new UnexpectedValueException('Invalid segment encoding');
55
+ }
56
+ if (null === $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64))) {
57
+ throw new UnexpectedValueException('Invalid segment encoding');
58
+ }
59
+ $sig = JWT::urlsafeB64Decode($cryptob64);
60
+ if ($verify) {
61
+ if (empty($header->alg)) {
62
+ throw new DomainException('Empty algorithm');
63
+ }
64
+ if ($sig != JWT::sign("$headb64.$bodyb64", $key, $header->alg)) {
65
+ throw new UnexpectedValueException('Signature verification failed');
66
+ }
67
+ }
68
+ return $payload;
69
+ }
70
+
71
+ /**
72
+ * Converts and signs a PHP object or array into a JWT string.
73
+ *
74
+ * @param object|array $payload PHP object or array
75
+ * @param string $key The secret key
76
+ * @param string $algo The signing algorithm. Supported
77
+ * algorithms are 'HS256', 'HS384' and 'HS512'
78
+ *
79
+ * @return string A signed JWT
80
+ * @uses jsonEncode
81
+ * @uses urlsafeB64Encode
82
+ */
83
+ public static function encode($payload, $key, $algo = 'HS256')
84
+ {
85
+ $header = array('typ' => 'JWT', 'alg' => $algo);
86
+
87
+ $segments = array();
88
+ $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($header));
89
+ $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($payload));
90
+ $signing_input = implode('.', $segments);
91
+
92
+ $signature = JWT::sign($signing_input, $key, $algo);
93
+ $segments[] = JWT::urlsafeB64Encode($signature);
94
+
95
+ return implode('.', $segments);
96
+ }
97
+
98
+ /**
99
+ * Sign a string with a given key and algorithm.
100
+ *
101
+ * @param string $msg The message to sign
102
+ * @param string $key The secret key
103
+ * @param string $method The signing algorithm. Supported
104
+ * algorithms are 'HS256', 'HS384' and 'HS512'
105
+ *
106
+ * @return string An encrypted message
107
+ * @throws DomainException Unsupported algorithm was specified
108
+ */
109
+ public static function sign($msg, $key, $method = 'HS256')
110
+ {
111
+ $methods = array(
112
+ 'HS256' => 'sha256',
113
+ 'HS384' => 'sha384',
114
+ 'HS512' => 'sha512',
115
+ );
116
+ if (empty($methods[$method])) {
117
+ throw new DomainException('Algorithm not supported');
118
+ }
119
+ return hash_hmac($methods[$method], $msg, $key, true);
120
+ }
121
+
122
+ /**
123
+ * Decode a JSON string into a PHP object.
124
+ *
125
+ * @param string $input JSON string
126
+ *
127
+ * @return object Object representation of JSON string
128
+ * @throws DomainException Provided string was invalid JSON
129
+ */
130
+ public static function jsonDecode($input)
131
+ {
132
+ $obj = json_decode($input);
133
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
134
+ JWT::_handleJsonError($errno);
135
+ } else if ($obj === null && $input !== 'null') {
136
+ throw new DomainException('Null result with non-null input');
137
+ }
138
+ return $obj;
139
+ }
140
+
141
+ /**
142
+ * Encode a PHP object into a JSON string.
143
+ *
144
+ * @param object|array $input A PHP object or array
145
+ *
146
+ * @return string JSON representation of the PHP object or array
147
+ * @throws DomainException Provided object could not be encoded to valid JSON
148
+ */
149
+ public static function jsonEncode($input)
150
+ {
151
+ $json = json_encode($input);
152
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
153
+ JWT::_handleJsonError($errno);
154
+ } else if ($json === 'null' && $input !== null) {
155
+ throw new DomainException('Null result with non-null input');
156
+ }
157
+ return $json;
158
+ }
159
+
160
+ /**
161
+ * Decode a string with URL-safe Base64.
162
+ *
163
+ * @param string $input A Base64 encoded string
164
+ *
165
+ * @return string A decoded string
166
+ */
167
+ public static function urlsafeB64Decode($input)
168
+ {
169
+ $remainder = strlen($input) % 4;
170
+ if ($remainder) {
171
+ $padlen = 4 - $remainder;
172
+ $input .= str_repeat('=', $padlen);
173
+ }
174
+ return base64_decode(strtr($input, '-_', '+/'));
175
+ }
176
+
177
+ /**
178
+ * Encode a string with URL-safe Base64.
179
+ *
180
+ * @param string $input The string you want encoded
181
+ *
182
+ * @return string The base64 encode of what you passed in
183
+ */
184
+ public static function urlsafeB64Encode($input)
185
+ {
186
+ return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
187
+ }
188
+
189
+ /**
190
+ * Helper method to create a JSON error.
191
+ *
192
+ * @param int $errno An error number from json_last_error()
193
+ *
194
+ * @return void
195
+ */
196
+ private static function _handleJsonError($errno)
197
+ {
198
+ $messages = array(
199
+ JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
200
+ JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
201
+ JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON'
202
+ );
203
+ throw new DomainException(
204
+ isset($messages[$errno])
205
+ ? $messages[$errno]
206
+ : 'Unknown JSON error: ' . $errno
207
+ );
208
+ }
209
+
210
+ }
211
+
app/code/community/Zendesk/Zendesk/Model/Api/Tickets.php CHANGED
@@ -138,7 +138,7 @@ class Zendesk_Zendesk_Model_Api_Tickets extends Zendesk_Zendesk_Model_Api_Abstra
138
 
139
  $response = $this->_call('search.json',
140
  array(
141
- 'query' => 'type:ticket ' . $customerEmail,
142
  'sort_order' => 'desc',
143
  'sort_by' => 'updated_at',
144
  )
138
 
139
  $response = $this->_call('search.json',
140
  array(
141
+ 'query' => 'requester:' . $customerEmail . ' type:ticket',
142
  'sort_order' => 'desc',
143
  'sort_by' => 'updated_at',
144
  )
app/code/community/Zendesk/Zendesk/controllers/Adminhtml/ZendeskController.php CHANGED
@@ -15,6 +15,8 @@
15
  * limitations under the License.
16
  */
17
 
 
 
18
  class Zendesk_Zendesk_Adminhtml_ZendeskController extends Mage_Adminhtml_Controller_Action
19
  {
20
  protected $_publicActions = array('redirect', 'authenticate');
@@ -75,16 +77,29 @@ class Zendesk_Zendesk_Adminhtml_ZendeskController extends Mage_Adminhtml_Control
75
  $this->_redirect(Mage::getSingleton('admin/session')->getUser()->getStartupPageUrl());
76
  }
77
 
 
 
 
78
  $user = Mage::getSingleton('admin/session')->getUser();
79
  $name = $user->getName();
80
  $email = $user->getEmail();
81
  $externalId = $user->getId();
82
 
83
- $timestamp = $this->getRequest()->getParam('timestamp', time());
84
- $message = $name.$email.$externalId.$token.$timestamp;
85
- $hash = md5($message);
 
 
 
 
 
 
 
 
 
 
86
 
87
- $url = "http://".$domain."/access/remote/?name=".$name."&email=".$email."&external_id=".$externalId."&timestamp=".$timestamp."&hash=".$hash;
88
 
89
  $this->_redirectUrl($url);
90
  }
15
  * limitations under the License.
16
  */
17
 
18
+ require_once( Mage::getModuleDir('base'). 'community/Zendesk/Zendesk/Helper/JWT.php');
19
+
20
  class Zendesk_Zendesk_Adminhtml_ZendeskController extends Mage_Adminhtml_Controller_Action
21
  {
22
  protected $_publicActions = array('redirect', 'authenticate');
77
  $this->_redirect(Mage::getSingleton('admin/session')->getUser()->getStartupPageUrl());
78
  }
79
 
80
+ $now = time();
81
+ $jti = md5($now . rand());
82
+
83
  $user = Mage::getSingleton('admin/session')->getUser();
84
  $name = $user->getName();
85
  $email = $user->getEmail();
86
  $externalId = $user->getId();
87
 
88
+ $payload = array(
89
+ "iat" => $now,
90
+ "jti" => $jti,
91
+ "name" => $name,
92
+ "email" => $email,
93
+ "external_id" => $externalId
94
+ );
95
+
96
+ Mage::log(var_export($payload, true), null, 'zendesk.log');
97
+
98
+ $jwt = JWT::encode($payload, $token);
99
+
100
+ $url = "http://".$domain."/access/jwt?jwt=" . $jwt;
101
 
102
+ Mage::log(var_export($url, true), null, 'zendesk.log');
103
 
104
  $this->_redirectUrl($url);
105
  }
app/code/community/Zendesk/Zendesk/etc/config.xml CHANGED
@@ -19,7 +19,7 @@
19
  <config>
20
  <modules>
21
  <Zendesk_Zendesk>
22
- <version>1.1.5</version>
23
  </Zendesk_Zendesk>
24
  </modules>
25
  <zendesk>
19
  <config>
20
  <modules>
21
  <Zendesk_Zendesk>
22
+ <version>1.2.0</version>
23
  </Zendesk_Zendesk>
24
  </modules>
25
  <zendesk>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>zendesk</name>
4
- <version>1.1.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0.html">Apache Software License v2</license>
7
  <channel>community</channel>
@@ -17,11 +17,11 @@ This extension makes Zendesk work seamlessly with Magento to enable stores to de
17
  - Display relevant support tickets on order &amp; customer dashboards&lt;br /&gt;&#xD;
18
  - Create support tickets from Contact Us requests&lt;br /&gt;&#xD;
19
  - Easily add a feedback tab to your site</description>
20
- <notes>Bug fix to reduce the amounts of system logs</notes>
21
  <authors><author><name>Jason Smale</name><user>zendesk</user><email>jsmale@zendesk.com</email></author><author><name>Fontis</name><user>fontis</user><email>magento@fontis.com.au</email></author></authors>
22
- <date>2013-03-15</date>
23
- <time>03:43:26</time>
24
- <contents><target name="mageetc"><dir name="modules"><file name="Zendesk_Zendesk.xml" hash="a630cf18c788dafb70d4c156a33eaa07"/></dir></target><target name="magecommunity"><dir name="Zendesk"><dir name="Zendesk"><dir name="Block"><dir name="Adminhtml"><dir name="Config"><dir name="Buttons"><file name="Generate.php" hash="7fa35e3e71b4bfb94f2dceddb19e86a0"/><file name="Signup.php" hash="f0d9ec9bc9a99f8643f1c2e6ac9989f2"/></dir><file name="Link.php" hash="779827427e11db311b6e1de9d42818f2"/></dir><dir name="Create"><dir name="Edit"><file name="Form.php" hash="fce297c645bb4bcc5433f317500aff96"/></dir><file name="Edit.php" hash="43aaf990ffaf4fd2ef0f65bbbbc19935"/></dir><dir name="Dashboard"><file name="Grids.php" hash="5b733e8b0f1e9c555619ff37f909bc00"/><dir name="Tab"><file name="View.php" hash="7d98b1f871626a4e783a9dd82bb4ea24"/></dir></dir><file name="Dashboard.php" hash="cd58a68d5a8cb2f3814426598ef016c3"/><file name="Menu.php" hash="c6000d5c571de25414f67dc8f49d97a0"/><dir name="Order"><dir name="View"><file name="Tickets.php" hash="a83a2ad42801ddbddad2d761779a597b"/></dir><file name="View.php" hash="db944df25b671288ad9e04d699653a19"/></dir></dir><file name="Supporttab.php" hash="4c5cbb2a18827045a3d0989ccb878733"/></dir><dir name="Helper"><file name="Data.php" hash="c1c7d21a04a472202d7e7639aa7837e5"/></dir><file name="LICENSE.txt" hash="d9922043f61f536de5d4d7af831e7f73"/><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="02c9893a6d4452988ea68629b2d64558"/><file name="Requesters.php" hash="24eeb10f3eb80c15915af3fd50506e38"/><file name="Tickets.php" hash="14e55044b0855b6159fff9daf222c6dd"/><file name="Users.php" hash="1ecfe4c536bb45ccc6046dbb3743712b"/><file name="Views.php" hash="3cf9eedc651389599a4fe5e5ecfbeebe"/></dir><file name="Observer.php" hash="a745f0ebef9f5a3f203914b55a7854b8"/><dir name="Source"><file name="Views.php" hash="1c7527338bf40082016a62e45fe44622"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="ZendeskController.php" hash="b3fec169806d0e9d452880b52ddf0ee1"/></dir><file name="ApiController.php" hash="65fdebea6b94b44344300308376722d2"/><file name="IndexController.php" hash="a9c590f951f294d3641c29bd98b6834c"/></dir><dir name="etc"><file name="config.xml" hash="a200fa48c471dcf661335118c3423e7e"/><file name="system.xml" hash="6e3e922965b5d713a1a1ef100401f28e"/></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="Zendesk_Zendesk.csv" hash="7ca6957ec2ab86d7cad0da6d3db451d8"/></dir><dir name="de_DE"><file name="Zendesk_Zendesk.csv" hash="763c45870e912c2510cd5202cd844ee5"/></dir><dir name="es_ES"><file name="Zendesk_Zendesk.csv" hash="0602d8b70510f15784e1cca16cc2c41c"/></dir><dir name="fr_FR"><file name="Zendesk_Zendesk.csv" hash="f292cb30c7103dee6d47f808f82b3b6d"/></dir><dir name="it_IT"><file name="Zendesk_Zendesk.csv" hash="1dca15b2c95ac058a442fe764afb359c"/></dir><dir name="ja_JP"><file name="Zendesk_Zendesk.csv" hash="71de6c4043003e0cfc0ac8f03fb71a31"/></dir><dir name="ko_KR"><file name="Zendesk_Zendesk.csv" hash="f1ab32c6d8eb2e4486a7dbfb8d1e1abc"/></dir><dir name="nl_NL"><file name="Zendesk_Zendesk.csv" hash="bdda5f5ab107984487cbba1e1cb47c15"/></dir><dir name="pt_BR"><file name="Zendesk_Zendesk.csv" hash="8a1458f0e498706c7541851a9a32ed3c"/></dir><dir name="ru_RU"><file name="Zendesk_Zendesk.csv" hash="871fcc5befc62df4e93c3c36ca8dcc87"/></dir><dir name="zh_TW"><file name="Zendesk_Zendesk.csv" hash="486ee9e2eea24301299f73d9e745dc00"/></dir><dir name="zh_CN"><file name="Zendesk_Zendesk.csv" hash="414730c8365bd652b2a7934f948de9b2"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="zendesk.xml" hash="d11620289479769a35c98b0676153906"/></dir><dir name="template"><dir name="zendesk"><file name="autocomplete.phtml" hash="01f42e0bbe3337c058ebc0a8832ddca9"/><dir name="config"><file name="button-generate.phtml" hash="21a25898c1fdea93d31b02ae91c1dd6f"/><file name="button-signup.phtml" hash="8871a0aa0bad7f85a7419853db8e0ce4"/><file name="link.phtml" hash="ce55d65900113183e770b2905a31b0eb"/></dir><dir name="customer"><file name="tickets.phtml" hash="e417ed76cee982be652dfe858822a26a"/></dir><dir name="dashboard"><file name="empty.phtml" hash="d0c30af25f17ff45215d210b48063a46"/><file name="index.phtml" hash="ac71050399d3789d2d4217472bc726cf"/><dir name="tabs"><file name="view.phtml" hash="7dd3ea0c5540e78f6f1415c02b4fdcaa"/></dir></dir><file name="left-menu.phtml" hash="3147dca7821863ae6da3f7b650739780"/><dir name="order"><file name="tickets.phtml" hash="c12ae3af7d9591af53f7c6f910a9a438"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="zendesk.xml" hash="5aefda9b293f1a8c9384c9c98a4c70b2"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="zendesk"><file name="button.png" hash="58e62edb7f4be46e3b29c0bb774c7ad7"/><file name="icon.png" hash="b5bfce535c987d1e9e604823ac4b3943"/><file name="zendesk-tab.png" hash="0f322d15c392528c212d6491732bc133"/><file name="zendesk.css" hash="454aaabc787598a2ee2db5dd48f8ed96"/></dir></dir></dir></dir></target></contents>
25
  <compatible/>
26
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
27
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>zendesk</name>
4
+ <version>1.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0.html">Apache Software License v2</license>
7
  <channel>community</channel>
17
  - Display relevant support tickets on order &amp; customer dashboards&lt;br /&gt;&#xD;
18
  - Create support tickets from Contact Us requests&lt;br /&gt;&#xD;
19
  - Easily add a feedback tab to your site</description>
20
+ <notes>Switch to new Single Sign On approach using JWT and update the way user tickets are requests from the Zendesk search API</notes>
21
  <authors><author><name>Jason Smale</name><user>zendesk</user><email>jsmale@zendesk.com</email></author><author><name>Fontis</name><user>fontis</user><email>magento@fontis.com.au</email></author></authors>
22
+ <date>2013-05-01</date>
23
+ <time>08:21:19</time>
24
+ <contents><target name="mageetc"><dir name="modules"><file name="Zendesk_Zendesk.xml" hash="a630cf18c788dafb70d4c156a33eaa07"/></dir></target><target name="magecommunity"><dir name="Zendesk"><dir name="Zendesk"><dir name="Block"><dir name="Adminhtml"><dir name="Config"><dir name="Buttons"><file name="Generate.php" hash="7fa35e3e71b4bfb94f2dceddb19e86a0"/><file name="Signup.php" hash="f0d9ec9bc9a99f8643f1c2e6ac9989f2"/></dir><file name="Link.php" hash="779827427e11db311b6e1de9d42818f2"/></dir><dir name="Create"><dir name="Edit"><file name="Form.php" hash="fce297c645bb4bcc5433f317500aff96"/></dir><file name="Edit.php" hash="43aaf990ffaf4fd2ef0f65bbbbc19935"/></dir><dir name="Dashboard"><file name="Grids.php" hash="5b733e8b0f1e9c555619ff37f909bc00"/><dir name="Tab"><file name="View.php" hash="7d98b1f871626a4e783a9dd82bb4ea24"/></dir></dir><file name="Dashboard.php" hash="cd58a68d5a8cb2f3814426598ef016c3"/><file name="Menu.php" hash="c6000d5c571de25414f67dc8f49d97a0"/><dir name="Order"><dir name="View"><file name="Tickets.php" hash="a83a2ad42801ddbddad2d761779a597b"/></dir><file name="View.php" hash="db944df25b671288ad9e04d699653a19"/></dir></dir><file name="Supporttab.php" hash="4c5cbb2a18827045a3d0989ccb878733"/></dir><dir name="Helper"><file name="Data.php" hash="c1c7d21a04a472202d7e7639aa7837e5"/><file name="JWT.php" hash="6610b92191eccedb8edcf993730c3dc0"/></dir><file name="LICENSE.txt" hash="d9922043f61f536de5d4d7af831e7f73"/><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="02c9893a6d4452988ea68629b2d64558"/><file name="Requesters.php" hash="24eeb10f3eb80c15915af3fd50506e38"/><file name="Tickets.php" hash="f878859ca5bcac3e2abe7d307ce4fd20"/><file name="Users.php" hash="1ecfe4c536bb45ccc6046dbb3743712b"/><file name="Views.php" hash="3cf9eedc651389599a4fe5e5ecfbeebe"/></dir><file name="Observer.php" hash="a745f0ebef9f5a3f203914b55a7854b8"/><dir name="Source"><file name="Views.php" hash="1c7527338bf40082016a62e45fe44622"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="ZendeskController.php" hash="b3a86f28be08ee9a21adce03bbee759f"/></dir><file name="ApiController.php" hash="65fdebea6b94b44344300308376722d2"/><file name="IndexController.php" hash="a9c590f951f294d3641c29bd98b6834c"/></dir><dir name="etc"><file name="config.xml" hash="c5b610f7ba5c126b318601b8eeddff6b"/><file name="system.xml" hash="6e3e922965b5d713a1a1ef100401f28e"/></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="Zendesk_Zendesk.csv" hash="7ca6957ec2ab86d7cad0da6d3db451d8"/></dir><dir name="de_DE"><file name="Zendesk_Zendesk.csv" hash="763c45870e912c2510cd5202cd844ee5"/></dir><dir name="es_ES"><file name="Zendesk_Zendesk.csv" hash="0602d8b70510f15784e1cca16cc2c41c"/></dir><dir name="fr_FR"><file name="Zendesk_Zendesk.csv" hash="f292cb30c7103dee6d47f808f82b3b6d"/></dir><dir name="it_IT"><file name="Zendesk_Zendesk.csv" hash="1dca15b2c95ac058a442fe764afb359c"/></dir><dir name="ja_JP"><file name="Zendesk_Zendesk.csv" hash="71de6c4043003e0cfc0ac8f03fb71a31"/></dir><dir name="ko_KR"><file name="Zendesk_Zendesk.csv" hash="f1ab32c6d8eb2e4486a7dbfb8d1e1abc"/></dir><dir name="nl_NL"><file name="Zendesk_Zendesk.csv" hash="bdda5f5ab107984487cbba1e1cb47c15"/></dir><dir name="pt_BR"><file name="Zendesk_Zendesk.csv" hash="8a1458f0e498706c7541851a9a32ed3c"/></dir><dir name="ru_RU"><file name="Zendesk_Zendesk.csv" hash="871fcc5befc62df4e93c3c36ca8dcc87"/></dir><dir name="zh_TW"><file name="Zendesk_Zendesk.csv" hash="486ee9e2eea24301299f73d9e745dc00"/></dir><dir name="zh_CN"><file name="Zendesk_Zendesk.csv" hash="414730c8365bd652b2a7934f948de9b2"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="zendesk.xml" hash="d11620289479769a35c98b0676153906"/></dir><dir name="template"><dir name="zendesk"><file name="autocomplete.phtml" hash="01f42e0bbe3337c058ebc0a8832ddca9"/><dir name="config"><file name="button-generate.phtml" hash="21a25898c1fdea93d31b02ae91c1dd6f"/><file name="button-signup.phtml" hash="8871a0aa0bad7f85a7419853db8e0ce4"/><file name="link.phtml" hash="ce55d65900113183e770b2905a31b0eb"/></dir><dir name="customer"><file name="tickets.phtml" hash="e417ed76cee982be652dfe858822a26a"/></dir><dir name="dashboard"><file name="empty.phtml" hash="d0c30af25f17ff45215d210b48063a46"/><file name="index.phtml" hash="ac71050399d3789d2d4217472bc726cf"/><dir name="tabs"><file name="view.phtml" hash="7dd3ea0c5540e78f6f1415c02b4fdcaa"/></dir></dir><file name="left-menu.phtml" hash="3147dca7821863ae6da3f7b650739780"/><dir name="order"><file name="tickets.phtml" hash="c12ae3af7d9591af53f7c6f910a9a438"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="zendesk.xml" hash="5aefda9b293f1a8c9384c9c98a4c70b2"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="zendesk"><file name="button.png" hash="58e62edb7f4be46e3b29c0bb774c7ad7"/><file name="icon.png" hash="b5bfce535c987d1e9e604823ac4b3943"/><file name="zendesk-tab.png" hash="0f322d15c392528c212d6491732bc133"/><file name="zendesk.css" hash="454aaabc787598a2ee2db5dd48f8ed96"/></dir></dir></dir></dir></target></contents>
25
  <compatible/>
26
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
27
  </package>