api.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. function pingServer($hostname, $port) {
  3. $sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));
  4. if (!$sock)
  5. return false;
  6. if (!@socket_connect($sock, $hostname, $port)) {
  7. error_log("Failed to connect to ${hostname}:${port}");
  8. return false;
  9. }
  10. socket_close($sock);
  11. return true;
  12. }
  13. if (isset($_GET["command"])) {
  14. switch ($_GET["command"]) {
  15. case "version":
  16. $fic = substr(file_get_contents("./.git/HEAD"), 5);
  17. if ($fic === FALSE) {
  18. header("HTTP/1.1 500 Server error");
  19. break;
  20. }
  21. $fic = file_get_contents("./.git/".trim($fic));
  22. if ($fic === FALSE) {
  23. header("HTTP/1.1 500 Server error");
  24. break;
  25. }
  26. echo json_encode(trim($fic));
  27. break;
  28. case "servers":
  29. require_once("./inc/servers.php");
  30. echo json_encode(getServers());
  31. break;
  32. case "channels":
  33. require_once("./inc/channels.php");
  34. echo json_encode(getChannels());
  35. break;
  36. case "ping":
  37. require_once("./.htconfig.php");
  38. require_once("inc/servers.php");
  39. if (!isset($_GET["key"]) || $_GET["key"] !== API_KEY) {
  40. $state = getServersState();
  41. if (!$state) {
  42. header("HTTP/1.0 500 Internal Server Error");
  43. die;
  44. }
  45. echo json_encode($state);
  46. die;
  47. }
  48. // Clean uploaded files
  49. $dirname = getcwd() ."/uploads/";
  50. $dir = opendir($dirname);
  51. $now = time();
  52. if ($dir !== FALSE) {
  53. while ($entry = readdir($dir)) {
  54. if (is_dir($dirname.$entry))
  55. continue;
  56. $stats = stat($dirname.$entry);
  57. if ($stats === FALSE) {
  58. error_log("Cannot stat uploaded file " .$dirname.$entry);
  59. continue;
  60. }
  61. if (($now -$stats["mtime"]) / 60 > 5)
  62. unlink($dirname.$entry);
  63. }
  64. closedir($dir);
  65. } else {
  66. error_log("Cannot open upload dir for cleaning");
  67. }
  68. // Ping servers
  69. $result = [];
  70. foreach (getServers() as $i => $attrs) {
  71. $success = false;
  72. foreach ($attrs["ports"] as $port => $unused) {
  73. if (pingServer($i, $port)) {
  74. $success = true;
  75. break;
  76. }
  77. }
  78. $result[$i] = $success;
  79. }
  80. $result = array(
  81. "result" => $result,
  82. "date" => time()
  83. );
  84. writeServersState($result);
  85. break;
  86. case "file":
  87. require_once(".htconfig.php");
  88. if (!isset($_GET["from"]) || strlen($_GET["from"]) == 0 || !isset($_FILES["file"])) {
  89. header("HTTP/1.0 400 Bad Request");
  90. die("Bad Request");
  91. }
  92. $extensionLocal = strrpos($_FILES["file"]["name"], '.');
  93. $extension = strtolower(substr($_FILES["file"]["name"], $extensionLocal === FALSE ? 0 : $extensionLocal));
  94. if (strpos($_FILES["file"]["type"], "image/") !== 0 || !in_array($extension, array(
  95. ".png", ".jpg", ".jpeg", ".ico"))) {
  96. header("HTTP/1.0 400 Bad Request");
  97. die("Unrecognized file type");
  98. }
  99. if ($_FILES["file"]["size"] > MAX_ALLOWED_UPLOAD_SIZE) {
  100. header("HTTP/1.0 400 Bad Request");
  101. die("File is too large (max " .MAX_ALLOWED_UPLOAD_SIZE ."o, got " .$_FILES["file"]["size"] .')');
  102. }
  103. $filename = md5($_GET["from"].time()) .$extension;
  104. if (move_uploaded_file($_FILES["file"]["tmp_name"], getcwd()."/uploads/".$filename) === FALSE) {
  105. header("HTTP/1.0 500 Internal Server Error");
  106. die("Internal Server Error");
  107. }
  108. // Log info
  109. error_log($_GET["from"] ." uploaded file " .$filename ." " .print_r($_FILES["file"], true) ." from " .$_SERVER["REMOTE_ADDR"]);
  110. echo "/uploads/" .$filename;
  111. break;
  112. }
  113. }
  114. ?>