main.go 2.35 KB
package middleware

import (
	"fmt"
	"io/ioutil"
	"net/http"

	web "git.to-net.rs/marko.tikvic/webutility"
)

func Headers(h http.HandlerFunc) http.HandlerFunc {
	return SetAccessControlHeaders(IgnoreOptionsRequests(ParseForm(h)))
}

func AuthUser(roles string, h http.HandlerFunc) http.HandlerFunc {
	return SetAccessControlHeaders(IgnoreOptionsRequests(ParseForm(Auth(roles, h))))
}

func AuthUserAndLog(roles string, h http.HandlerFunc) http.HandlerFunc {
	return SetAccessControlHeaders(IgnoreOptionsRequests(ParseForm(LogHTTP(Auth(roles, h)))))
}

func LogTraffic(h http.HandlerFunc) http.HandlerFunc {
	return SetAccessControlHeaders(IgnoreOptionsRequests(ParseForm(LogHTTP(h))))
}

func TrafficLogsHandler(w http.ResponseWriter, req *http.Request) {
	switch req.Method {
	case "GET":
		files, err := ioutil.ReadDir(httpLogger.GetOutDir() + "/")
		if err != nil {
			web.InternalServerError(w, req, err.Error())
			return
		}

		web.SetContentType(w, "text/html; charset=utf-8")
		web.SetResponseStatus(w, http.StatusOK)

		web.WriteResponse(w, []byte("<body style='background-color: black; color: white'>"))
		inputForm := `
		<div>
	  	  <form action="/api/v1/logs" method="POST" target="_blank">
		    Username:<br>
		    <input type="text" name="username"><br>
		    Password:<br>
		    <input type="password" name="password"><br>
		    Log:<br>
		    <input type="text" name="logfile"><br>
		    <input type="submit" value="View">
		  </form>
		</div>`
		web.WriteResponse(w, []byte(inputForm))

		web.WriteResponse(w, []byte("<table>"))
		web.WriteResponse(w, []byte("<tr><th>Name</th><th>Size</th></tr>"))
		for i := range files {
			name := files[i].Name()
			size := files[i].Size()
			div := fmt.Sprintf(`<tr><td>%s</td><td style="text-align:right">%dB</td></tr>`, name, size)
			web.WriteResponse(w, []byte(div))
		}
		web.WriteResponse(w, []byte("</table></body>"))

	case "POST":
		web.SetContentType(w, "text/html; charset=utf-8")

		logfile := req.FormValue("logfile")
		content, err := web.ReadFileContent(httpLogger.GetOutDir() + "/" + logfile)
		if err != nil {
			web.InternalServerError(w, req, err.Error())
			return
		}
		web.SetResponseStatus(w, http.StatusOK)
		web.WriteResponse(w, []byte("<body style='background-color: black; color: white'>"))
		web.WriteResponse(w, []byte("<pre>"))
		web.WriteResponse(w, content)
		web.WriteResponse(w, []byte("</pre></body>"))
		return
	}
}