PageRenderTime 57ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

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

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