mirror of
https://github.com/syssecfsu/witty.git
synced 2025-01-26 03:54:19 +01:00
94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package web
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
|
|
"github.com/dchest/uniuri"
|
|
"github.com/gin-gonic/contrib/sessions"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/syssecfsu/witty/term_conn"
|
|
)
|
|
|
|
var host *string = nil
|
|
var cmdToExec []string
|
|
var noAuth bool
|
|
|
|
// simple function to check origin
|
|
func checkOrigin(r *http.Request) bool {
|
|
org := r.Header.Get("Origin")
|
|
h, err := url.Parse(org)
|
|
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if (host == nil) || (*host != h.Host) {
|
|
log.Println("Failed origin check of ", org)
|
|
}
|
|
|
|
return (host != nil) && (*host == h.Host)
|
|
}
|
|
|
|
func StartWeb(fp *os.File, cmd []string, naked bool) {
|
|
cmdToExec = cmd
|
|
noAuth = naked
|
|
|
|
if fp != nil {
|
|
gin.DefaultWriter = fp
|
|
}
|
|
|
|
rt := gin.Default()
|
|
|
|
// We randomly generate a key for now, should use a fixed key
|
|
// so login can survive server reboot
|
|
store := sessions.NewCookieStore([]byte(uniuri.NewLen(32)))
|
|
rt.Use(sessions.Sessions("witty-session", store))
|
|
|
|
rt.SetTrustedProxies(nil)
|
|
rt.LoadHTMLGlob("./assets/template/*")
|
|
// handle static files
|
|
rt.Static("/assets", "./assets")
|
|
rt.Static("/records", "./records")
|
|
rt.GET("/favicon.ico", favIcon)
|
|
|
|
rt.GET("/login", loginPage)
|
|
rt.POST("/login", login)
|
|
|
|
g1 := rt.Group("/")
|
|
|
|
if !naked {
|
|
g1.Use(AuthRequired)
|
|
}
|
|
|
|
// Fill in the index page
|
|
g1.GET("/", indexPage)
|
|
g1.GET("/logout", logout)
|
|
|
|
// to update the tabs of current interactive and saved sessions
|
|
g1.GET("/update/:active", updateIndex)
|
|
|
|
// create a new interactive session
|
|
g1.GET("/new", newInteractive)
|
|
g1.GET("/ws_new/:id", newTermConn)
|
|
|
|
// create a viewer of an interactive session
|
|
g1.GET("/view/:id", viewPage)
|
|
g1.GET("/ws_view/:id", newViewWS)
|
|
|
|
// start/stop recording the session
|
|
g1.GET("/record/:id", startRecord)
|
|
g1.GET("/stop/:id", stopRecord)
|
|
|
|
// create a viewer of an interactive session
|
|
g1.GET("/replay/:id", replayPage)
|
|
|
|
// delete a recording
|
|
g1.GET("/delete/:fname", delRec)
|
|
|
|
term_conn.Init(checkOrigin)
|
|
rt.RunTLS(":8080", "./tls/cert.pem", "./tls/private-key.pem")
|
|
}
|