telemetry_db.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?php
  2. require_once 'idObfuscation.php';
  3. define('TELEMETRY_SETTINGS_FILE', 'telemetry_settings.php');
  4. /**
  5. * @return PDO|false
  6. */
  7. function getPdo($returnErrorMessage = false)
  8. {
  9. if (
  10. !file_exists(TELEMETRY_SETTINGS_FILE)
  11. || !is_readable(TELEMETRY_SETTINGS_FILE)
  12. ) {
  13. if($returnErrorMessage){
  14. return 'missing TELEMETRY_SETTINGS_FILE';
  15. }
  16. return false;
  17. }
  18. require TELEMETRY_SETTINGS_FILE;
  19. if (!isset($db_type)) {
  20. if($returnErrorMessage){
  21. return "db_type not set in '" . TELEMETRY_SETTINGS_FILE . "'";
  22. }
  23. return false;
  24. }
  25. $pdoOptions = [
  26. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  27. ];
  28. try {
  29. if ('mssql' === $db_type) {
  30. if (!isset(
  31. $MsSql_server,
  32. $MsSql_databasename,
  33. $MsSql_WindowsAuthentication
  34. )) {
  35. if($returnErrorMessage){
  36. return "Required MSSQL database settings missing in '" . TELEMETRY_SETTINGS_FILE . "'";
  37. }
  38. return false;
  39. }
  40. if (!$MsSql_WindowsAuthentication and
  41. !isset(
  42. $MsSql_username,
  43. $MsSql_password,
  44. )
  45. ) {
  46. if($returnErrorMessage){
  47. return "Required MSSQL database settings missing in '" . TELEMETRY_SETTINGS_FILE . "'";
  48. }
  49. return false;
  50. }
  51. $dsn = 'sqlsrv:'
  52. .'server='.$MsSql_server
  53. .';Database='.$MsSql_databasename;
  54. if($MsSql_TrustServerCertificate === true){
  55. $dsn = $dsn . ';TrustServerCertificate=1';
  56. }
  57. if($MsSql_TrustServerCertificate === false){
  58. $dsn = $dsn . ';TrustServerCertificate=0';
  59. }
  60. if($MsSql_WindowsAuthentication){
  61. return new PDO($dsn, "", "", $pdoOptions);
  62. } else {
  63. return new PDO($dsn, $MySql_username, $MySql_password, $pdoOptions);
  64. }
  65. }
  66. if ('mysql' === $db_type) {
  67. if (!isset(
  68. $MySql_hostname,
  69. $MySql_port,
  70. $MySql_databasename,
  71. $MySql_username,
  72. $MySql_password
  73. )) {
  74. if($returnErrorMessage){
  75. return "Required mysql database settings missing in '" . TELEMETRY_SETTINGS_FILE . "'";
  76. }
  77. return false;
  78. }
  79. $dsn = 'mysql:'
  80. .'host='.$MySql_hostname
  81. .';port='.$MySql_port
  82. .';dbname='.$MySql_databasename;
  83. return new PDO($dsn, $MySql_username, $MySql_password, $pdoOptions);
  84. }
  85. if ('sqlite' === $db_type) {
  86. if (!isset($Sqlite_db_file)) {
  87. if($returnErrorMessage){
  88. return "Required sqlite database settings missing in '" . TELEMETRY_SETTINGS_FILE . "'";
  89. }
  90. return false;
  91. }
  92. $pdo = new PDO('sqlite:'.$Sqlite_db_file, null, null, $pdoOptions);
  93. $pdo->exec('
  94. CREATE TABLE IF NOT EXISTS `speedtest_users` (
  95. `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  96. `ispinfo` text,
  97. `extra` text,
  98. `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  99. `ip` text NOT NULL,
  100. `ua` text NOT NULL,
  101. `lang` text NOT NULL,
  102. `dl` text,
  103. `ul` text,
  104. `ping` text,
  105. `jitter` text,
  106. `log` longtext
  107. );
  108. ');
  109. return $pdo;
  110. }
  111. if ('postgresql' === $db_type) {
  112. if (!isset(
  113. $PostgreSql_hostname,
  114. $PostgreSql_databasename,
  115. $PostgreSql_username,
  116. $PostgreSql_password
  117. )) {
  118. if($returnErrorMessage){
  119. return "Required postgresql database settings missing in '" . TELEMETRY_SETTINGS_FILE . "'";
  120. }
  121. return false;
  122. }
  123. $dsn = 'pgsql:'
  124. .'host='.$PostgreSql_hostname
  125. .';dbname='.$PostgreSql_databasename;
  126. return new PDO($dsn, $PostgreSql_username, $PostgreSql_password, $pdoOptions);
  127. }
  128. } catch (Exception $e) {
  129. if($returnErrorMessage){
  130. return $e->getMessage();
  131. }
  132. return false;
  133. }
  134. if($returnErrorMessage){
  135. return "db_type '" . $db_type . "' not supported";
  136. }
  137. return false;
  138. }
  139. /**
  140. * @return bool
  141. */
  142. function isObfuscationEnabled()
  143. {
  144. require TELEMETRY_SETTINGS_FILE;
  145. return
  146. isset($enable_id_obfuscation)
  147. && true === $enable_id_obfuscation;
  148. }
  149. /**
  150. * @return string|false returns the id of the inserted column or false on error if returnErrorMessage is false or a error message if returnErrorMessage is true
  151. */
  152. function insertSpeedtestUser($ip, $ispinfo, $extra, $ua, $lang, $dl, $ul, $ping, $jitter, $log, $returnExceptionOnError = false)
  153. {
  154. $pdo = getPdo();
  155. if (!($pdo instanceof PDO)) {
  156. if($returnExceptionOnError){
  157. return new Exception("Failed to get database connection object");
  158. }
  159. return false;
  160. }
  161. try {
  162. $stmt = $pdo->prepare(
  163. 'INSERT INTO speedtest_users
  164. (ip,ispinfo,extra,ua,lang,dl,ul,ping,jitter,log)
  165. VALUES (?,?,?,?,?,?,?,?,?,?)'
  166. );
  167. $stmt->execute([
  168. $ip, $ispinfo, $extra, $ua, $lang, $dl, $ul, $ping, $jitter, $log
  169. ]);
  170. $id = $pdo->lastInsertId();
  171. } catch (Exception $e) {
  172. if($returnExceptionOnError){
  173. return $e;
  174. }
  175. return false;
  176. }
  177. if (isObfuscationEnabled()) {
  178. return obfuscateId($id);
  179. }
  180. return $id;
  181. }
  182. /**
  183. * @param int|string $id
  184. *
  185. * @return array|null|false|exception returns the speedtest data as array, null
  186. * if no data is found for the given id or
  187. * false or an exception if there was an error (based on returnExceptionOnError)
  188. *
  189. * @throws RuntimeException
  190. */
  191. function getSpeedtestUserById($id,$returnExceptionOnError = false)
  192. {
  193. $pdo = getPdo();
  194. if (!($pdo instanceof PDO)) {
  195. if($returnExceptionOnError){
  196. return new Exception("Failed to get database connection object");
  197. }
  198. return false;
  199. }
  200. if (isObfuscationEnabled()) {
  201. $id = deobfuscateId($id);
  202. }
  203. try {
  204. $stmt = $pdo->prepare(
  205. 'SELECT
  206. id, timestamp, ip, ispinfo, ua, lang, dl, ul, ping, jitter, log, extra
  207. FROM speedtest_users
  208. WHERE id = :id'
  209. );
  210. $stmt->bindValue(':id', $id, PDO::PARAM_INT);
  211. $stmt->execute();
  212. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  213. } catch (Exception $e) {
  214. if($returnExceptionOnError){
  215. return $e;
  216. }
  217. return false;
  218. }
  219. if (!is_array($row)) {
  220. return null;
  221. }
  222. $row['id_formatted'] = $row['id'];
  223. if (isObfuscationEnabled()) {
  224. $row['id_formatted'] = obfuscateId($row['id']).' (deobfuscated: '.$row['id'].')';
  225. }
  226. return $row;
  227. }
  228. /**
  229. * @return array|false
  230. */
  231. function getLatestSpeedtestUsers()
  232. {
  233. $pdo = getPdo();
  234. if (!($pdo instanceof PDO)) {
  235. return false;
  236. }
  237. require TELEMETRY_SETTINGS_FILE;
  238. try {
  239. $sql = 'SELECT ';
  240. if('mssql' === $db_type) {$sql .= ' TOP(100) ';}
  241. $sql .= ' id, timestamp, ip, ispinfo, ua, lang, dl, ul, ping, jitter, log, extra
  242. FROM speedtest_users
  243. ORDER BY timestamp DESC ';
  244. if('mssql' !== $db_type) {$sql .= ' LIMIT 100 ';}
  245. $stmt = $pdo->query($sql);
  246. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  247. foreach ($rows as $i => $row) {
  248. $rows[$i]['id_formatted'] = $row['id'];
  249. if (isObfuscationEnabled()) {
  250. $rows[$i]['id_formatted'] = obfuscateId($row['id']).' (deobfuscated: '.$row['id'].')';
  251. }
  252. }
  253. } catch (Exception $e) {
  254. return false;
  255. }
  256. return $rows;
  257. }