index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. const fs = require('fs');
  2. const https = require('https');
  3. const express = require('express');
  4. const app = express();
  5. const options = {
  6. key: fs.readFileSync("ssl/private.key"),
  7. cert: fs.readFileSync("ssl/certificate.crt"),
  8. ca: [ fs.readFileSync('ssl/ca_bundle.crt') ]
  9. };
  10. const server = https.createServer(options, app);
  11. const io = require('socket.io')(server);
  12. const PORT = 443;
  13. const admins = {
  14. 'André': 'passwort'
  15. }
  16. var users = [];
  17. var bannedIps = [];
  18. fs.readFile("config/ban.json", "utf8", (err, data) => {
  19. if (!err) {
  20. bannedIps = JSON.parse(data);
  21. }
  22. })
  23. app.use(express.static(__dirname + '/www'));
  24. app.use('/node_modules', express.static(__dirname + '/node_modules'));
  25. io.on('connection', (socket) => {
  26. const ip = socket.handshake.address;
  27. log('- New user joined the server:', ip);
  28. for (const bannedItem of bannedIps) {
  29. if (bannedItem.ip == ip) {
  30. log('- User blacklisted, kicking:', ip)
  31. socket.emit('serverKick');
  32. socket.disconnect();
  33. break;
  34. }
  35. }
  36. socket.emit('serverHandshake');
  37. const user = { ip: ip, socket: socket };
  38. users.push(user);
  39. socket.on('login', (username, password) => {
  40. if (!username) {
  41. socket.emit('usernameInvalid');
  42. return;
  43. }
  44. for (let user of users) {
  45. if (user.name == username) {
  46. socket.emit('usernameTaken');
  47. return;
  48. }
  49. }
  50. if (admins && admins[username]) {
  51. if (!password) {
  52. log('- Attempted login as admin without password.', username, '(' + ip + ')');
  53. socket.emit('passwordRequired');
  54. return;
  55. } else if (admins[username] != password) {
  56. log('- Attempted login as admin with wrong password.', username, '(' + ip + ')');
  57. socket.emit('passwordWrong');
  58. return;
  59. }
  60. log('- Admin "' + username + '" login successful');
  61. user.admin = true;
  62. socket.on('requestKick', (userToBeKicked) => {
  63. log('- Admin "' + username + '" requested kick of User "' + userToBeKicked.name + '"');
  64. kickUser(userToBeKicked);
  65. });
  66. socket.on('requestLiftBan', (ip) => {
  67. log('- Admin "' + username + '" requested to lift ban for ip "' + ip + '"');
  68. liftBan(ip);
  69. });
  70. }
  71. log('- New user logged in:', username, '(' + ip + ')');
  72. user.name = username;
  73. socket.emit('serverLogin', getCleanUser(user));
  74. io.emit('userJoined', username);
  75. updateUsers();
  76. updateBanned();
  77. socket.on('disconnect', () => {
  78. log('- User joined the server:', ip);
  79. users = users.filter((listUser) => listUser !== user);
  80. io.emit('userLeft', username);
  81. updateUsers();
  82. });
  83. socket.on('message', (msg) => {
  84. if (msg) {
  85. log(user.name + ':', msg, '(' + user.ip + ')');
  86. io.emit('message', msg, getCleanUser(user), Date.now());
  87. }
  88. });
  89. });
  90. });
  91. function updateUsers() {
  92. io.emit('usersUpdated', users.filter((user) => user.name != null).map(getCleanUser));
  93. }
  94. function getCleanUser(user) {
  95. return {
  96. name: user.name,
  97. admin: user.admin
  98. }
  99. }
  100. function kickUser(user) {
  101. let ip;
  102. for (const exUser of users) {
  103. if (exUser.name == user.name) {
  104. ip = exUser.ip;
  105. break;
  106. }
  107. }
  108. bannedIps.push({ ip: ip, user: user });
  109. updateBanned();
  110. for (const exUser of users) {
  111. if (exUser.ip == ip) {
  112. exUser.socket.emit('serverKick');
  113. exUser.socket.disconnect();
  114. }
  115. }
  116. }
  117. function liftBan(ip) {
  118. bannedIps = bannedIps.filter((listItem) => listItem.ip != ip);
  119. updateBanned();
  120. }
  121. function updateBanned() {
  122. fs.writeFile('config/ban.json', JSON.stringify(bannedIps), (e) => {});
  123. io.emit('bannedUpdated', bannedIps);
  124. }
  125. function log(...inputs) {
  126. var output = '[' + new Date().toISOString().substr(0, 19).replace('T', ', ') + '] ';
  127. for (const i of inputs) {
  128. output += i + ' ';
  129. }
  130. console.log(output);
  131. fs.appendFile('log.txt', '' + output + '\n', (e) => {});
  132. }
  133. server.listen(PORT, () => {
  134. log('- Server up and running at port ' + PORT);
  135. });