added end point for posting blog posts, added cookie based authentication via api key

This commit is contained in:
rawleyIfowler
2022-02-22 09:22:40 -06:00
parent 714a12d374
commit 724f7b0034
4 changed files with 69 additions and 5 deletions

2
.gitignore vendored
View File

@@ -2,3 +2,5 @@
.swp
main
dsn
*.pem
api_key.pem

View File

@@ -18,19 +18,26 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.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
}

35
utils/api_key.go Normal file
View File

@@ -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 <https://www.gnu.org/licenses/>.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...")
}

View File

@@ -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 <https://www.gnu.org/licenses/>.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()