PageRenderTime 36ms CodeModel.GetById 9ms RepoModel.GetById 1ms app.codeStats 0ms

/phpmyadmin/libraries/plugins/auth/swekey/swekey.auth.lib.php

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