diff --git a/.gitignore b/.gitignore index 34e5572..fb3dc3d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .swp main dsn +*.pem +api_key.pem diff --git a/controllers/blog.go b/controllers/blog.go index e2905e2..6e8f56e 100644 --- a/controllers/blog.go +++ b/controllers/blog.go @@ -18,19 +18,26 @@ along with this program. If not, see .Rawley Fow */ import ( - "github.com/gin-gonic/gin" + "io/ioutil" + "log" "net/http" + + "github.com/gin-gonic/gin" "gitlab.com/rawleyifowler/site-rework/models" "gitlab.com/rawleyifowler/site-rework/utils" "gorm.io/driver/mysql" "gorm.io/gorm" ) -var db *gorm.DB +var ( + db *gorm.DB + apiKey string +) func RegisterBlogGroup(r *gin.RouterGroup) { // Load dsn and initialize database dsn := utils.LoadDSN("dsn") + apiKey = utils.LoadApiKey("api_key.pem") var err error db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { @@ -39,6 +46,7 @@ func RegisterBlogGroup(r *gin.RouterGroup) { utils.PerformMigrations(db) r.GET("/", RenderBlogPage) r.GET("/post/:url", RenderIndividualBlogPost) + r.POST("/post", CreateBlogPost) } func RenderBlogPage(c *gin.Context) { @@ -49,6 +57,24 @@ func RenderIndividualBlogPost(c *gin.Context) { c.HTML(http.StatusOK, "blog_post.tmpl", GetBlogPostById(c.Param("url"))) } +func CreateBlogPost(c *gin.Context) { + reqKey, err := c.Request.Cookie("APK") + if err != nil { + c.Status(406) + return + } + if reqKey.Value != apiKey { + c.Status(403) + return + } + data, err := ioutil.ReadAll(c.Request.Body) + if err != nil { + c.Status(406) + return + } + log.Println(data) +} + func GetAllBlogPosts() *[]models.BlogPost { var posts []models.BlogPost db.Find(&posts) @@ -57,6 +83,6 @@ func GetAllBlogPosts() *[]models.BlogPost { func GetBlogPostById(id string) *models.BlogPost { var post models.BlogPost - db.Where(&models.BlogPost{ Url: id }).First(&post) + db.Where(&models.BlogPost{Url: id}).First(&post) return &post } diff --git a/utils/api_key.go b/utils/api_key.go new file mode 100644 index 0000000..34b827e --- /dev/null +++ b/utils/api_key.go @@ -0,0 +1,35 @@ +package utils + +/* +Copyright (C) 2022 Rawley Fowler + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see .Rawley Fowler, 2022 +*/ +import ( + "bufio" + "os" +) + +func LoadApiKey(path string) string { + file, err := os.Open(path) + defer file.Close() + if err != nil { + panic("Could not find file: " + path) + } + reader := bufio.NewScanner(file) + if reader.Scan() { + return reader.Text() + } + panic(path + " is empty...") +} diff --git a/utils/dsn.go b/utils/dsn.go index a3cebeb..4771f4f 100644 --- a/utils/dsn.go +++ b/utils/dsn.go @@ -1,4 +1,5 @@ package utils + /* Copyright (C) 2022 Rawley Fowler @@ -16,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see .Rawley Fowler, 2022 */ import ( - "os" "bufio" + "os" ) // Loads the dsn via OS file system and then returns the value as a string @@ -27,7 +28,7 @@ func LoadDSN(dsnPath string) string { panic("Could not find DSN for database...") } defer file.Close() - reader := bufio.NewScanner(file) + reader := bufio.NewScanner(file) // The dsn should be the first line of the file if reader.Scan() { return reader.Text()