// API function to update blog settings func patchApiBlogHandler(w http.ResponseWriter, r *http.Request, _ map[string]string) { userName := authentication.GetUserName(r) if userName != "" { userId, err := getUserId(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } decoder := json.NewDecoder(r.Body) var json JsonBlog err = decoder.Decode(&json) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Make sure postPerPage is over 0 if json.PostsPerPage < 1 { json.PostsPerPage = 1 } // Remove blog url in front of navigation urls for index, _ := range json.NavigationItems { if strings.HasPrefix(json.NavigationItems[index].Url, json.Url) { json.NavigationItems[index].Url = strings.Replace(json.NavigationItems[index].Url, json.Url, "", 1) // If we removed the blog url, there should be a / in front of the url if !strings.HasPrefix(json.NavigationItems[index].Url, "/") { json.NavigationItems[index].Url = "/" + json.NavigationItems[index].Url } } } // Retrieve old blog settings for comparison blog, err := database.RetrieveBlog() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } tempBlog := structure.Blog{Url: []byte(configuration.Config.Url), Title: []byte(json.Title), Description: []byte(json.Description), Logo: []byte(json.Logo), Cover: []byte(json.Cover), AssetPath: []byte("/assets/"), PostCount: blog.PostCount, PostsPerPage: json.PostsPerPage, ActiveTheme: json.ActiveTheme, NavigationItems: json.NavigationItems} err = methods.UpdateBlog(&tempBlog, userId) // Check if active theme setting has been changed, if so, generate templates from new theme if tempBlog.ActiveTheme != blog.ActiveTheme { err = templates.Generate() if err != nil { // If there's an error while generating the new templates, the whole program must be stopped. log.Fatal("Fatal error: Template data couldn't be generated from theme files: " + err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } } if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write([]byte("Blog settings updated!")) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }
func main() { // Setup var err error // GOMAXPROCS - Maybe not needed runtime.GOMAXPROCS(runtime.NumCPU()) // Write log to file if the log flag was provided if flags.Log != "" { logFile, err := os.OpenFile(flags.Log, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatal("Error: Couldn't open log file: " + err.Error()) } defer logFile.Close() log.SetOutput(logFile) } // Configuration is read from config.json by loading the configuration package // Database err = database.Initialize() if err != nil { log.Fatal("Error: Couldn't initialize database:", err) return } // Global blog data err = methods.GenerateBlog() if err != nil { log.Fatal("Error: Couldn't generate blog data:", err) return } // Templates err = templates.Generate() if err != nil { log.Fatal("Error: Couldn't compile templates:", err) return } // Plugins err = plugins.Load() if err == nil { // Close LuaPool at the end defer plugins.LuaPool.Shutdown() log.Println("Plugins loaded.") } // HTTP(S) Server httpPort := configuration.Config.HttpHostAndPort httpsPort := configuration.Config.HttpsHostAndPort // Check if HTTP/HTTPS flags were provided if flags.HttpPort != "" { components := strings.SplitAfterN(httpPort, ":", 2) httpPort = components[0] + flags.HttpPort } if flags.HttpsPort != "" { components := strings.SplitAfterN(httpsPort, ":", 2) httpsPort = components[0] + flags.HttpsPort } // Determine the kind of https support (as set in the config.json) switch configuration.Config.HttpsUsage { case "AdminOnly": checkHttpsCertificates() httpRouter := httptreemux.New() httpsRouter := httptreemux.New() // Blog and pages as http server.InitializeBlog(httpRouter) server.InitializePages(httpRouter) // Blog and pages as https server.InitializeBlog(httpsRouter) server.InitializePages(httpsRouter) // Admin as https and http redirect // Add redirection to http router httpRouter.GET("/admin/", httpsRedirect) httpRouter.GET("/admin/*path", httpsRedirect) // Add routes to https router server.InitializeAdmin(httpsRouter) // Start https server log.Println("Starting https server on port " + httpsPort + "...") go func() { err := http.ListenAndServeTLS(httpsPort, filenames.HttpsCertFilename, filenames.HttpsKeyFilename, httpsRouter) if err != nil { log.Fatal("Error: Couldn't start the HTTPS server:", err) } }() // Start http server log.Println("Starting http server on port " + httpPort + "...") err := http.ListenAndServe(httpPort, httpRouter) if err != nil { log.Fatal("Error: Couldn't start the HTTP server:", err) } case "All": checkHttpsCertificates() httpsRouter := httptreemux.New() httpRouter := httptreemux.New() // Blog and pages as https server.InitializeBlog(httpsRouter) server.InitializePages(httpsRouter) // Admin as https server.InitializeAdmin(httpsRouter) // Add redirection to http router httpRouter.GET("/", httpsRedirect) httpRouter.GET("/*path", httpsRedirect) // Start https server log.Println("Starting https server on port " + httpsPort + "...") go func() { err := http.ListenAndServeTLS(httpsPort, filenames.HttpsCertFilename, filenames.HttpsKeyFilename, httpsRouter) if err != nil { log.Fatal("Error: Couldn't start the HTTPS server:", err) } }() // Start http server log.Println("Starting http server on port " + httpPort + "...") err := http.ListenAndServe(httpPort, httpRouter) if err != nil { log.Fatal("Error: Couldn't start the HTTP server:", err) } default: // This is configuration.HttpsUsage == "None" httpRouter := httptreemux.New() // Blog and pages as http server.InitializeBlog(httpRouter) server.InitializePages(httpRouter) // Admin as http server.InitializeAdmin(httpRouter) // Start http server log.Println("Starting server without HTTPS support. Please enable HTTPS in " + filenames.ConfigFilename + " to improve security.") log.Println("Starting http server on port " + httpPort + "...") err := http.ListenAndServe(httpPort, httpRouter) if err != nil { log.Fatal("Error: Couldn't start the HTTP server:", err) } } }