204 lines
4.1 KiB
Plaintext
204 lines
4.1 KiB
Plaintext
package util
|
|
|
|
import (
|
|
//"database/sql"
|
|
"fmt"
|
|
//_ "github.com/mattn/go-sqlite3"
|
|
//"encoding/json"
|
|
"github.com/boltdb/bolt"
|
|
"io"
|
|
"io/ioutil"
|
|
//"log"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
var output_channel chan string
|
|
|
|
type WebUser struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
func StartServer(ch chan string) {
|
|
output_channel = ch
|
|
_, err := os.Stat("mapcrafter/index.html")
|
|
if err == nil {
|
|
// Looks like mapcrafter is present
|
|
output_channel <- "* Mapcrafter Directory is Present, routing to /map\n"
|
|
fs := http.FileServer(http.Dir("mapcrafter"))
|
|
http.Handle("/", fs)
|
|
}
|
|
http.HandleFunc("/admin/", serveMcMan)
|
|
http.ListenAndServe(":8080", nil)
|
|
}
|
|
|
|
func serveMcMan(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, htmlHeader("mc_man - Minecraft Manager"))
|
|
|
|
the_path := r.URL.Path
|
|
output_channel <- the_path + "\n"
|
|
|
|
the_path = strings.TrimPrefix(strings.ToLower(the_path), "/admin")
|
|
output_channel <- the_path + "\n"
|
|
|
|
fmt.Fprintf(w, the_path)
|
|
if strings.HasPrefix(the_path, "/login") {
|
|
fmt.Fprintf(w, loginScreen())
|
|
} else if strings.HasPrefix(the_path, "/dologin") {
|
|
fmt.Fprintf(w, doLogin(w, r))
|
|
} else if strings.HasPrefix(the_path, "/api/") {
|
|
fmt.Fprintf(w, serveAPI(w, r))
|
|
}
|
|
|
|
fmt.Fprintf(w, htmlFooter())
|
|
}
|
|
|
|
func loginScreen() string {
|
|
return `
|
|
<form action="/doLogin" method="POST">
|
|
<input type="text" name="username">
|
|
<input type="password" name="password">
|
|
<input type="submit">
|
|
</form>
|
|
`
|
|
}
|
|
|
|
func doLogin(w http.ResponseWriter, r *http.Request) string {
|
|
ret := "Do Login<br />"
|
|
ret = ret + r.FormValue("username")
|
|
ret = ret + r.FormValue("password")
|
|
|
|
return ret
|
|
}
|
|
|
|
func serveAPI(w http.ResponseWriter, r *http.Request) {
|
|
_, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
|
|
//body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := r.Body.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
|
// What are we doing with this request?
|
|
output_channel <- fmt.Sprint("HTTP Request: (", r.Method, ") ", r.URL, "\n")
|
|
the_path := r.URL.Path
|
|
output_string := ""
|
|
if strings.HasPrefix(the_path, "/api") {
|
|
the_path = strings.TrimPrefix(the_path, "/api")
|
|
if strings.HasPrefix(the_path, "/v1") {
|
|
the_path = strings.TrimPrefix(the_path, "/v1")
|
|
if strings.HasPrefix(the_path, "/whitelist") {
|
|
output_string = handleWhitelist(r)
|
|
} else if strings.HasPrefix(the_path, "/ops") {
|
|
output_string = handleOps(r)
|
|
}
|
|
}
|
|
}
|
|
fmt.Fprintf(w, output_string)
|
|
}
|
|
|
|
/* JSON Functions */
|
|
func handleOps(r *http.Request) string {
|
|
if r.Method == "GET" {
|
|
return getOps()
|
|
} else if r.Method == "POST" {
|
|
// Add posted user to Ops
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func handleWhitelist(r *http.Request) string {
|
|
if r.Method == "GET" {
|
|
return getWhitelist()
|
|
} else if r.Method == "POST" {
|
|
// Add posted user to whitelist
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func getOps() string {
|
|
ret := "["
|
|
num_users := 0
|
|
for _, op_user := range GetConfig().Ops {
|
|
if num_users > 0 {
|
|
ret += ","
|
|
}
|
|
ret += fmt.Sprint("\"", op_user, "\"")
|
|
}
|
|
ret += "]"
|
|
return ret
|
|
|
|
}
|
|
|
|
func getWhitelist() string {
|
|
ret := "["
|
|
num_users := 0
|
|
for _, wl_user := range GetConfig().Whitelist {
|
|
if num_users > 0 {
|
|
ret += ","
|
|
}
|
|
ret += fmt.Sprint("\"", wl_user, "\"")
|
|
}
|
|
ret += "]"
|
|
return ret
|
|
}
|
|
|
|
func setupDatabase() bool {
|
|
/*
|
|
db, err := bolt.Open("mc_man.db", 0600, nil)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
err = db.Update(func(tx *bolt.Tx) error {
|
|
return nil
|
|
})
|
|
*/
|
|
/*
|
|
var err error
|
|
web_database, err = sql.Open("sqlite3", "mc_man.db")
|
|
defer web_database.Close()
|
|
|
|
if err == nil {
|
|
// Error opening the DB, can't log in
|
|
return false
|
|
}
|
|
rows, err := db.Query("SELECT name FROM sqlite_master WHERE type='table' AND name='users';")
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
err := rows.Scan
|
|
}
|
|
// rows, err := db.Query("SELECT * FROM USERS")
|
|
return true
|
|
*/
|
|
return true
|
|
}
|
|
|
|
/* HTML Functions */
|
|
func htmlHeader(title string) string {
|
|
head := `
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>`
|
|
head += title
|
|
head += `
|
|
</title>
|
|
</head>
|
|
<body>
|
|
`
|
|
return head
|
|
}
|
|
|
|
func htmlFooter() string {
|
|
return `
|
|
</body>
|
|
</html>
|
|
`
|
|
}
|