50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
'use strict'
|
|
|
|
/**
|
|
* Flying Squid plugin: refuse non-loopback Minecraft TCP bind (ADR-0005).
|
|
*/
|
|
|
|
const { isLoopbackAddress } = require('../lib/bind-guard')
|
|
|
|
module.exports.server = function (serv, settings) {
|
|
// Force options even if caller misconfigured
|
|
if (settings) {
|
|
settings.host = '127.0.0.1'
|
|
}
|
|
|
|
const check = () => {
|
|
try {
|
|
const socketServer = serv._server && serv._server.socketServer
|
|
if (!socketServer || typeof socketServer.address !== 'function') return
|
|
const addr = socketServer.address()
|
|
if (!addr || typeof addr === 'string') return
|
|
if (!isLoopbackAddress(addr.address)) {
|
|
const msg = `fj-bind-guard: non-loopback listen ${addr.address}:${addr.port} — shutting down`
|
|
serv.err(msg)
|
|
try {
|
|
serv._server.close()
|
|
} catch {
|
|
// ignore
|
|
}
|
|
throw new Error(msg)
|
|
} else {
|
|
serv.info(`fj-bind-guard: OK loopback ${addr.address}:${addr.port}`)
|
|
}
|
|
} catch (err) {
|
|
if (err && err.message && err.message.includes('fj-bind-guard')) throw err
|
|
// address may not be ready yet
|
|
}
|
|
}
|
|
|
|
serv.on('listening', check)
|
|
// Also check shortly after plugins ready
|
|
if (serv.pluginsReady) {
|
|
setTimeout(check, 50)
|
|
} else {
|
|
serv.once('pluginsReady', () => setTimeout(check, 50))
|
|
}
|
|
}
|
|
|
|
module.exports.player = function () {}
|
|
module.exports.entity = function () {}
|