This commit is contained in:
BuckarooBanzay 2021-05-06 20:10:02 +02:00
parent 96fa1cff84
commit 50c9aa699d
12 changed files with 105 additions and 173 deletions

View File

@ -1,20 +0,0 @@
name: jshint
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: apt
run: sudo apt-get install -y nodejs npm
- name: npm install
run: npm i
- name: npm test
run: npm test

View File

@ -1,25 +1,12 @@
# Stage 1 testing
FROM node:15.2.1-alpine
COPY .jshintrc /data/
COPY package.json /data/
COPY package-lock.json /data/
COPY src /data/src
RUN cd /data && npm i && npm test
# Stage 2 package
FROM node:15.2.1-alpine
COPY .jshintrc /data/
COPY package.json /data/
COPY package-lock.json /data/
COPY src /data/src
RUN cd /data && npm i --only=production
WORKDIR /data
FROM golang:1.16.3 as stage1
COPY . /data
RUN cd /data && \
go vet && \
go test ./... && \
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
FROM alpine:3.13.4
COPY --from=stage1 /data/auth_proxy /
EXPOSE 8080
CMD ["node", "src/index.js"]
CMD ["/auth_proxy"]

BIN
auth_proxy Executable file

Binary file not shown.

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module auth_proxy
go 1.16

92
main.go Normal file
View File

@ -0,0 +1,92 @@
package main
import (
"encoding/json"
"log"
"net/http"
"time"
)
var logger = log.Default()
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/minetest/channel", MinetestEndpoint)
mux.HandleFunc("/api/login", LoginEndpoint)
logger.Printf("Listening on port %d", 8080)
err := http.ListenAndServe(":8080", mux)
if err != nil {
panic(err)
}
}
var toMt = make(chan json.RawMessage)
var fromMt = make(chan json.RawMessage)
func SendError(w http.ResponseWriter, msg string) {
logger.Printf("Error: %s", msg)
w.WriteHeader(500)
w.Write([]byte(msg))
}
func MinetestEndpoint(w http.ResponseWriter, req *http.Request) {
logger.Printf("Got mod-request from %s, method: %s", req.Host, req.Method)
if req.Method == http.MethodGet {
select {
case msg := <-toMt:
logger.Printf("Relaying message to mod")
err := json.NewEncoder(w).Encode(msg)
if err != nil {
SendError(w, err.Error())
return
}
case <-time.After(30 * time.Second):
// timed out without data
w.WriteHeader(204)
}
} else if req.Method == http.MethodPost {
msg := json.RawMessage{}
err := json.NewDecoder(req.Body).Decode(&msg)
if err != nil {
SendError(w, err.Error())
return
}
logger.Printf("Received message from mod: %s", string(msg))
select {
case fromMt <- msg:
default:
SendError(w, "no receiver available")
}
}
}
func LoginEndpoint(w http.ResponseWriter, req *http.Request) {
logger.Printf("Got request from %s", req.Host)
msg := json.RawMessage{}
err := json.NewDecoder(req.Body).Decode(&msg)
if err != nil {
SendError(w, err.Error())
return
}
select {
case toMt <- msg:
case <-time.After(5 * time.Second):
SendError(w, "timed out sending")
return
}
select {
case msg = <-fromMt:
w.WriteHeader(200)
err = json.NewEncoder(w).Encode(msg)
if err != nil {
SendError(w, err.Error())
}
case <-time.After(5 * time.Second):
SendError(w, "timed out receiving")
}
}

View File

@ -2,7 +2,6 @@
Authorization proxy app for minetest
=================
![](https://github.com/minetest-auth-proxy/auth_proxy_app/workflows/jshint/badge.svg)
![](https://github.com/minetest-auth-proxy/auth_proxy_app/workflows/docker/badge.svg)
@ -53,4 +52,4 @@ Or just:
A `Dockerfile` is included for container usage.
Otherwise just `npm install && npm start`
Otherwise just `go run .` (needs a working go installation)

View File

@ -1,53 +0,0 @@
const app = require("../app");
const events = require("../events");
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
const debug = false;
var tx_queue = [];
events.on("channel-send", function(data){
tx_queue.push(data);
});
// web -> mod
app.get('/api/minetest/channel', function(req, res){
function trySend(){
if (tx_queue.length > 0){
var obj = tx_queue.shift();
if (debug)
console.log("[tx]", obj);
res.json(obj);
return true;
}
return false;
}
const start = Date.now();
function loop(){
if (trySend())
return;
if ((Date.now() - start) < 10000){
setTimeout(loop, 200);
} else {
res.json(null);
}
}
loop();
});
// mod -> web
app.post('/api/minetest/channel', jsonParser, function(req, res){
if (debug)
console.log("[rx]", req.body);
events.emit("channel-recv", req.body);
res.end();
});

View File

@ -1,29 +0,0 @@
const app = require("../app");
const doLogin = require("../promise/login");
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
app.post('/api/login', jsonParser, function(req, res){
if (!req.body.username || !req.body.password){
res.status(500).end();
return;
}
doLogin(req.body.username, req.body.password)
.then(result => {
res.json({
success: result.success,
message: result.message,
});
})
.catch(() => {
res.status(500).end();
});
});

View File

@ -1,7 +0,0 @@
const express = require('express');
const app = express();
app.use(express.static('public'));
app.disable('etag');
module.exports = app;

View File

@ -1,5 +0,0 @@
const EventEmitter = require('events');
module.exports = new EventEmitter();

View File

@ -1,6 +0,0 @@
const app = require("./app");
require("./api/channel");
require("./api/login");
app.listen(8080, () => console.log('Listening on http://127.0.0.1:8080'));

View File

@ -1,29 +0,0 @@
const events = require("../events");
module.exports = (username, password) => new Promise(function(resolve, reject){
events.emit("channel-send", {
type: "auth",
data: {
name: username,
password: password
}
});
function handleEvent(result){
if (result.type == "auth" && result.data && result.data.name == username){
events.removeListener("channel-recv", handleEvent);
clearTimeout(handle);
resolve(result.data);
}
}
events.on("channel-recv", handleEvent);
var handle = setTimeout(function(){
events.removeListener("channel-recv", handleEvent);
reject("mod-comm timeout");
}, 1000);
});