2024-08-27 11:55:01 +02:00
package main
import (
"html/template"
"log"
"net/http"
"os"
"strings"
)
var logger * log . Logger
var appTemplate * template . Template = template . New ( "app" )
2024-08-27 14:48:46 +02:00
var db Database
2024-08-27 11:55:01 +02:00
type TemplateData struct {
TOC [ ] string
Entry string
Title string
EntryTitle string
}
func loadTemplate ( ) {
data , err := os . ReadFile ( TemplateFile )
2024-08-27 14:48:46 +02:00
if err != nil { logger . Panicln ( err ) }
2024-08-27 11:55:01 +02:00
appTemplate . Parse ( string ( data ) )
}
func handleApplication ( w http . ResponseWriter , req * http . Request ) {
var entry string
var err error
entryName := strings . Trim ( req . URL . Path , "/" )
if entryName != "" {
if strings . Contains ( entryName , "/" ) || strings . Contains ( entryName , "." ) {
// path traversal
logger . Println ( "Possible path traversal attempt from" , req . RemoteAddr , "to" , entryName )
w . WriteHeader ( http . StatusForbidden )
return
}
// load entry
2024-08-27 15:27:43 +02:00
entry = db . Entries [ entryName ]
2024-08-27 11:55:01 +02:00
}
2024-08-27 14:48:46 +02:00
err = appTemplate . ExecuteTemplate (
w , "app" ,
2024-08-27 15:27:43 +02:00
TemplateData { TOC : db . Keys , Entry : entry , Title : MainTitle , EntryTitle : entryName } )
2024-08-27 11:55:01 +02:00
if err != nil { logger . Println ( err ) }
}
func main ( ) {
// get logger
logger = log . Default ( )
// load template
loadTemplate ( )
2024-08-27 14:48:46 +02:00
// build db
db = BuildDB ( EntriesDirectory )
2024-08-27 11:55:01 +02:00
// handle static files
staticHandler := http . StripPrefix ( "/static/" , http . FileServer ( http . Dir ( StaticDirectory ) ) )
http . Handle ( "/static/" , staticHandler )
// handle application
http . HandleFunc ( "/" , handleApplication )
// start server
logger . Println ( "Starting server on" , ServerListen )
err := http . ListenAndServe ( ServerListen , nil )
2024-08-27 14:48:46 +02:00
if err != nil { logger . Panicln ( err ) }
2024-08-27 11:55:01 +02:00
}