telemetry_db.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. require_once 'idObfuscation.php';
  3. define('TELEMETRY_SETTINGS_FILE', 'telemetry_settings.php');
  4. /**
  5. * @return PDO|false
  6. */
  7. function getPdo()
  8. {
  9. if (
  10. !file_exists(TELEMETRY_SETTINGS_FILE)
  11. || !is_readable(TELEMETRY_SETTINGS_FILE)
  12. ) {
  13. return false;
  14. }
  15. require TELEMETRY_SETTINGS_FILE;
  16. if (!isset($db_type)) {
  17. return false;
  18. }
  19. $pdoOptions = [
  20. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  21. ];
  22. try {
  23. if ('mysql' === $db_type) {
  24. if (!isset(
  25. $MySql_hostname,
  26. $MySql_port,
  27. $MySql_databasename,
  28. $MySql_username,
  29. $MySql_password
  30. )) {
  31. return false;
  32. }
  33. $dsn = 'mysql:'
  34. .'host='.$MySql_hostname
  35. .';port='.$MySql_port
  36. .';dbname='.$MySql_databasename;
  37. return new PDO($dsn, $MySql_username, $MySql_password, $pdoOptions);
  38. }
  39. if ('sqlite' === $db_type) {
  40. if (!isset($Sqlite_db_file)) {
  41. return false;
  42. }
  43. $pdo = new PDO('sqlite:'.$Sqlite_db_file, null, null, $pdoOptions);
  44. $pdo->exec('
  45. CREATE TABLE IF NOT EXISTS `speedtest_users` (
  46. `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  47. `ispinfo` text,
  48. `extra` text,
  49. `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  50. `ip` text NOT NULL,
  51. `ua` text NOT NULL,
  52. `lang` text NOT NULL,
  53. `dl` text,
  54. `ul` text,
  55. `ping` text,
  56. `jitter` text,
  57. `log` longtext
  58. );
  59. ');
  60. return $pdo;
  61. }
  62. if ('postgresql' === $db_type) {
  63. if (!isset(
  64. $PostgreSql_hostname,
  65. $PostgreSql_databasename,
  66. $PostgreSql_username,
  67. $PostgreSql_password
  68. )) {
  69. return false;
  70. }
  71. $dsn = 'pgsql:'
  72. .'host='.$PostgreSql_hostname
  73. .';dbname='.$PostgreSql_databasename;
  74. return new PDO($dsn, $PostgreSql_username, $PostgreSql_password, $pdoOptions);
  75. }
  76. } catch (Exception $e) {
  77. return false;
  78. }
  79. return false;
  80. }
  81. /**
  82. * @return bool
  83. */
  84. function isObfuscationEnabled()
  85. {
  86. require TELEMETRY_SETTINGS_FILE;
  87. return
  88. isset($enable_id_obfuscation)
  89. && true === $enable_id_obfuscation;
  90. }
  91. /**
  92. * @return string|false returns the id of the inserted column or false on error
  93. */
  94. function insertSpeedtestUser($ip, $ispinfo, $extra, $ua, $lang, $dl, $ul, $ping, $jitter, $log)
  95. {
  96. $pdo = getPdo();
  97. if (!($pdo instanceof PDO)) {
  98. return false;
  99. }
  100. try {
  101. $stmt = $pdo->prepare(
  102. 'INSERT INTO speedtest_users
  103. (ip,ispinfo,extra,ua,lang,dl,ul,ping,jitter,log)
  104. VALUES (?,?,?,?,?,?,?,?,?,?)'
  105. );
  106. $stmt->execute([
  107. $ip, $ispinfo, $extra, $ua, $lang, $dl, $ul, $ping, $jitter, $log
  108. ]);
  109. $id = $pdo->lastInsertId();
  110. } catch (Exception $e) {
  111. return false;
  112. }
  113. if (isObfuscationEnabled()) {
  114. return obfuscateId($id);
  115. }
  116. return $id;
  117. }
  118. /**
  119. * @param int|string $id
  120. *
  121. * @return array|null|false returns the speedtest data as array, null
  122. * if no data is found for the given id or
  123. * false if there was an error
  124. *
  125. * @throws RuntimeException
  126. */
  127. function getSpeedtestUserById($id)
  128. {
  129. $pdo = getPdo();
  130. if (!($pdo instanceof PDO)) {
  131. return false;
  132. }
  133. if (isObfuscationEnabled()) {
  134. $id = deobfuscateId($id);
  135. }
  136. try {
  137. $stmt = $pdo->prepare(
  138. 'SELECT
  139. id, timestamp, ip, ispinfo, ua, lang, dl, ul, ping, jitter, log, extra
  140. FROM speedtest_users
  141. WHERE id = :id'
  142. );
  143. $stmt->bindValue(':id', $id, PDO::PARAM_INT);
  144. $stmt->execute();
  145. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  146. } catch (Exception $e) {
  147. return false;
  148. }
  149. if (!is_array($row)) {
  150. return null;
  151. }
  152. $row['id_formatted'] = $row['id'];
  153. if (isObfuscationEnabled()) {
  154. $row['id_formatted'] = obfuscateId($row['id']).' (deobfuscated: '.$row['id'].')';
  155. }
  156. return $row;
  157. }
  158. /**
  159. * @return array|false
  160. */
  161. function getLatestSpeedtestUsers()
  162. {
  163. $pdo = getPdo();
  164. if (!($pdo instanceof PDO)) {
  165. return false;
  166. }
  167. try {
  168. $stmt = $pdo->query(
  169. 'SELECT
  170. id, timestamp, ip, ispinfo, ua, lang, dl, ul, ping, jitter, log, extra
  171. FROM speedtest_users
  172. ORDER BY timestamp DESC
  173. LIMIT 100'
  174. );
  175. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  176. foreach ($rows as $i => $row) {
  177. $rows[$i]['id_formatted'] = $row['id'];
  178. if (isObfuscationEnabled()) {
  179. $rows[$i]['id_formatted'] = obfuscateId($row['id']).' (deobfuscated: '.$row['id'].')';
  180. }
  181. }
  182. } catch (Exception $e) {
  183. return false;
  184. }
  185. return $rows;
  186. }