/phpMyAdmin/libraries/auth/swekey/swekey.auth.lib.php

https://bitbucket.org/izubizarreta/https-bitbucket.org-bityvip · PHP · 274 lines · 215 code · 39 blank · 20 comment · 68 complexity · 5c0a4df96ed7a284a952f2c96c61c041 MD5 · raw file

  1. <?php
  2. /**
  3. * @package Swekey
  4. */
  5. /**
  6. * Checks Swekey authentication.
  7. */
  8. function Swekey_auth_check()
  9. {
  10. global $cfg;
  11. $confFile = $cfg['Server']['auth_swekey_config'];
  12. if (! isset($_SESSION['SWEKEY'])) {
  13. $_SESSION['SWEKEY'] = array();
  14. }
  15. $_SESSION['SWEKEY']['ENABLED'] = (! empty($confFile) && file_exists($confFile));
  16. // Load the swekey.conf file the first time
  17. if ($_SESSION['SWEKEY']['ENABLED'] && empty($_SESSION['SWEKEY']['CONF_LOADED'])) {
  18. $_SESSION['SWEKEY']['CONF_LOADED'] = true;
  19. $_SESSION['SWEKEY']['VALID_SWEKEYS'] = array();
  20. $valid_swekeys = explode("\n", @file_get_contents($confFile));
  21. foreach ($valid_swekeys as $line) {
  22. if (preg_match("/^[0-9A-F]{32}:.+$/", $line) != false) {
  23. $items = explode(":", $line);
  24. if (count($items) == 2)
  25. $_SESSION['SWEKEY']['VALID_SWEKEYS'][$items[0]] = trim($items[1]);
  26. } elseif (preg_match("/^[A-Z_]+=.*$/", $line) != false) {
  27. $items = explode("=", $line);
  28. $_SESSION['SWEKEY']['CONF_'.trim($items[0])] = trim($items[1]);
  29. }
  30. }
  31. // Set default values for settings
  32. if (! isset($_SESSION['SWEKEY']['CONF_SERVER_CHECK']))
  33. $_SESSION['SWEKEY']['CONF_SERVER_CHECK'] = "";
  34. if (! isset($_SESSION['SWEKEY']['CONF_SERVER_RNDTOKEN']))
  35. $_SESSION['SWEKEY']['CONF_SERVER_RNDTOKEN'] = "";
  36. if (! isset($_SESSION['SWEKEY']['CONF_SERVER_STATUS']))
  37. $_SESSION['SWEKEY']['CONF_SERVER_STATUS'] = "";
  38. if (! isset($_SESSION['SWEKEY']['CONF_CA_FILE']))
  39. $_SESSION['SWEKEY']['CONF_CA_FILE'] = "";
  40. if (! isset($_SESSION['SWEKEY']['CONF_ENABLE_TOKEN_CACHE']))
  41. $_SESSION['SWEKEY']['CONF_ENABLE_TOKEN_CACHE'] = true;
  42. if (! isset($_SESSION['SWEKEY']['CONF_DEBUG']))
  43. $_SESSION['SWEKEY']['CONF_DEBUG'] = false;
  44. }
  45. // check if a web key has been authenticated
  46. if ($_SESSION['SWEKEY']['ENABLED']) {
  47. if (empty($_SESSION['SWEKEY']['AUTHENTICATED_SWEKEY']))
  48. return false;
  49. }
  50. return true;
  51. }
  52. /**
  53. * Handle Swekey authentication error.
  54. */
  55. function Swekey_auth_error()
  56. {
  57. if (! isset($_SESSION['SWEKEY']))
  58. return null;
  59. if (! $_SESSION['SWEKEY']['ENABLED'])
  60. return null;
  61. include_once './libraries/auth/swekey/authentication.inc.php';
  62. ?>
  63. <script>
  64. function Swekey_GetValidKey()
  65. {
  66. var valids = "<?php
  67. foreach ($_SESSION['SWEKEY']['VALID_SWEKEYS'] as $key => $value)
  68. echo $key.',';
  69. ?>";
  70. var connected_keys = Swekey_ListKeyIds().split(",");
  71. for (i in connected_keys)
  72. if (connected_keys[i] != null && connected_keys[i].length == 32)
  73. if (valids.indexOf(connected_keys[i]) >= 0)
  74. return connected_keys[i];
  75. if (connected_keys.length > 0)
  76. if (connected_keys[0].length == 32)
  77. return "unknown_key_" + connected_keys[0];
  78. return "none";
  79. }
  80. var key = Swekey_GetValidKey();
  81. function timedCheck()
  82. {
  83. if (key != Swekey_GetValidKey())
  84. {
  85. window.location.search = "?swekey_reset";
  86. }
  87. else
  88. setTimeout("timedCheck()",1000);
  89. }
  90. setTimeout("timedCheck()",1000);
  91. </script>
  92. <?php
  93. if (! empty($_SESSION['SWEKEY']['AUTHENTICATED_SWEKEY']))
  94. return null;
  95. if (count($_SESSION['SWEKEY']['VALID_SWEKEYS']) == 0)
  96. return sprintf(__('File %s does not contain any key id'), $GLOBALS['cfg']['Server']['auth_swekey_config']);
  97. include_once "./libraries/auth/swekey/swekey.php";
  98. Swekey_SetCheckServer($_SESSION['SWEKEY']['CONF_SERVER_CHECK']);
  99. Swekey_SetRndTokenServer($_SESSION['SWEKEY']['CONF_SERVER_RNDTOKEN']);
  100. Swekey_SetStatusServer($_SESSION['SWEKEY']['CONF_SERVER_STATUS']);
  101. Swekey_EnableTokenCache($_SESSION['SWEKEY']['CONF_ENABLE_TOKEN_CACHE']);
  102. $caFile = $_SESSION['SWEKEY']['CONF_CA_FILE'];
  103. if (empty($caFile)) {
  104. $caFile = __FILE__;
  105. $pos = strrpos($caFile, '/');
  106. if ($pos === false)
  107. $pos = strrpos($caFile, '\\'); // windows
  108. $caFile = substr($caFile, 0, $pos + 1).'musbe-ca.crt';
  109. // echo "\n<!-- $caFile -->\n";
  110. // if (file_exists($caFile))
  111. // echo "<!-- exists -->\n";
  112. }
  113. if (file_exists($caFile)) {
  114. Swekey_SetCAFile($caFile);
  115. } elseif (! empty($caFile) && (substr($_SESSION['SWEKEY']['CONF_SERVER_CHECK'], 0, 8) == "https://")) {
  116. return "Internal Error: CA File $caFile not found";
  117. }
  118. $result = null;
  119. $swekey_id = $_GET['swekey_id'];
  120. $swekey_otp = $_GET['swekey_otp'];
  121. if (isset($swekey_id)) {
  122. unset($_SESSION['SWEKEY']['AUTHENTICATED_SWEKEY']);
  123. if (! isset($_SESSION['SWEKEY']['RND_TOKEN'])) {
  124. unset($swekey_id);
  125. } else {
  126. if (strlen($swekey_id) == 32) {
  127. $res = Swekey_CheckOtp($swekey_id, $_SESSION['SWEKEY']['RND_TOKEN'], $swekey_otp);
  128. unset($_SESSION['SWEKEY']['RND_TOKEN']);
  129. if (! $res) {
  130. $result = __('Hardware authentication failed') . ' (' . Swekey_GetLastError() . ')';
  131. } else {
  132. $_SESSION['SWEKEY']['AUTHENTICATED_SWEKEY'] = $swekey_id;
  133. $_SESSION['SWEKEY']['FORCE_USER'] = $_SESSION['SWEKEY']['VALID_SWEKEYS'][$swekey_id];
  134. return null;
  135. }
  136. } else {
  137. $result = __('No valid authentication key plugged');
  138. if ($_SESSION['SWEKEY']['CONF_DEBUG']) {
  139. $result .= "<br>" . htmlspecialchars($swekey_id);
  140. }
  141. unset($_SESSION['SWEKEY']['CONF_LOADED']); // reload the conf file
  142. }
  143. }
  144. } else {
  145. unset($_SESSION['SWEKEY']);
  146. }
  147. $_SESSION['SWEKEY']['RND_TOKEN'] = Swekey_GetFastRndToken();
  148. if (strlen($_SESSION['SWEKEY']['RND_TOKEN']) != 64) {
  149. $result = __('Hardware authentication failed') . ' (' . Swekey_GetLastError() . ')';
  150. unset($_SESSION['SWEKEY']['CONF_LOADED']); // reload the conf file
  151. }
  152. if (! isset($swekey_id)) {
  153. ?>
  154. <script>
  155. if (key.length != 32) {
  156. window.location.search="?swekey_id=" + key + "&token=<?php echo $_SESSION[' PMA_token ']; ?>";
  157. } else {
  158. var url = "" + window.location;
  159. if (url.indexOf("?") > 0)
  160. url = url.substr(0, url.indexOf("?"));
  161. Swekey_SetUnplugUrl(key, "pma_login", url + "?session_to_unset=<?php echo session_id();?>&token=<?php echo $_SESSION[' PMA_token ']; ?>");
  162. var otp = Swekey_GetOtp(key, <?php echo '"'.$_SESSION['SWEKEY']['RND_TOKEN'].'"';?>);
  163. window.location.search="?swekey_id=" + key + "&swekey_otp=" + otp + "&token=<?php echo $_SESSION[' PMA_token ']; ?>";
  164. }
  165. </script>
  166. <?php
  167. return __('Authenticating...');
  168. }
  169. return $result;
  170. }
  171. /**
  172. * Perform login using Swekey.
  173. */
  174. function Swekey_login($input_name, $input_go)
  175. {
  176. $swekeyErr = Swekey_auth_error();
  177. if ($swekeyErr != null) {
  178. PMA_Message::error($swekeyErr)->display();
  179. if ($GLOBALS['error_handler']->hasDisplayErrors()) {
  180. echo '<div>';
  181. $GLOBALS['error_handler']->dispErrors();
  182. echo '</div>';
  183. }
  184. }
  185. if (isset($_SESSION['SWEKEY']) && $_SESSION['SWEKEY']['ENABLED']) {
  186. echo '<script type="text/javascript">';
  187. if (empty($_SESSION['SWEKEY']['FORCE_USER'])) {
  188. echo 'var user = null;';
  189. } else {
  190. echo 'var user = "'.$_SESSION['SWEKEY']['FORCE_USER'].'";';
  191. }
  192. ?>
  193. function open_swekey_site()
  194. {
  195. window.open("<?php echo PMA_linkURL('http://phpmyadmin.net/auth_key'); ?>");
  196. }
  197. var input_username = document.getElementById("<?php echo $input_name; ?>");
  198. var input_go = document.getElementById("<?php echo $input_go; ?>");
  199. var swekey_status = document.createElement('img');
  200. swekey_status.setAttribute('onclick', 'open_swekey_site()');
  201. swekey_status.setAttribute('style', 'width:8px; height:16px; border:0px; vspace:0px; hspace:0px; frameborder:no');
  202. if (user == null)
  203. {
  204. swekey_status.setAttribute('src', 'http://artwork.swekey.com/unplugged-8x16.png');
  205. //swekey_status.setAttribute('title', 'No swekey plugged');
  206. input_go.disabled = true;
  207. }
  208. else
  209. {
  210. swekey_status.setAttribute('src', 'http://artwork.swekey.com/plugged-8x16.png');
  211. //swekey_status.setAttribute('title', 'swekey plugged');
  212. input_username.value = user;
  213. }
  214. input_username.readOnly = true;
  215. if (input_username.nextSibling == null)
  216. input_username.parentNode.appendChild(swekey_status);
  217. else
  218. input_username.parentNode.insertBefore(swekey_status, input_username.nextSibling);
  219. <?php
  220. echo '</script>';
  221. }
  222. }
  223. if (!empty($_GET['session_to_unset'])) {
  224. session_write_close();
  225. session_id($_GET['session_to_unset']);
  226. session_start();
  227. $_SESSION = array();
  228. session_write_close();
  229. session_destroy();
  230. exit;
  231. }
  232. if (isset($_GET['swekey_reset'])) {
  233. unset($_SESSION['SWEKEY']);
  234. }
  235. ?>