package main import ( "flag" "log" "net" "net/http" "os" "time" "forgejo.gwairfelin.com/max/gonotes/internal/conf" "forgejo.gwairfelin.com/max/gonotes/internal/middleware" "forgejo.gwairfelin.com/max/gonotes/internal/notes" "forgejo.gwairfelin.com/max/gonotes/internal/notes/views" "golang.org/x/oauth2" ) func main() { var confFile string flag.StringVar(&confFile, "c", "/etc/gonotes/conf.toml", "Specify path to config file.") flag.Parse() conf.LoadConfig(confFile) oauth := &oauth2.Config{ ClientID: conf.Conf.OIDC.ClientID, ClientSecret: conf.Conf.OIDC.ClientSecret, Endpoint: oauth2.Endpoint{AuthURL: conf.Conf.OIDC.AuthURL, TokenURL: conf.Conf.OIDC.TokenURL}, RedirectURL: conf.Conf.OIDC.RedirectURL, } sessions := middleware.NewSessionStore(oauth, "/auth") err := notes.Init() if err != nil { log.Fatal(err) } log.SetOutput(os.Stdout) router := http.NewServeMux() notesRouter := views.GetRoutes("/notes") sessionRouter := sessions.Routes.GetRouter() cacheExpiration, err := time.ParseDuration("24h") if err != nil { log.Fatal(err) } etag := middleware.NewETag("static", cacheExpiration) router.Handle("/", middleware.LoggingMiddleware(http.RedirectHandler("/notes/", http.StatusFound))) router.Handle( "/notes/", sessions.AsMiddleware( middleware.LoggingMiddleware( middleware.RejectAnonMiddleware( "/auth/login/", http.StripPrefix( "/notes", notesRouter, ), ), ), ), ) router.Handle("/auth/", sessions.AsMiddleware(middleware.LoggingMiddleware(http.StripPrefix("/auth", sessionRouter)))) router.Handle( "/static/", middleware.LoggingMiddleware( middleware.StaticEtagMiddleware( *etag, http.FileServer(http.FS(conf.Static)), ), ), ) listener, err := net.Listen(conf.Conf.Protocol, conf.Conf.Address) if err != nil { log.Fatal(err) } log.Fatal(http.Serve(listener, router)) }