patchman/server/api/endpoint/register.go

70 lines
1.8 KiB
Go
Raw Normal View History

package endpoint
import (
"git.jmbit.de/jmb/patchman/server/database"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"golang.org/x/crypto/bcrypt"
"log"
"net/http"
"time"
)
type Registration struct {
hostname string
token string
secret string
}
func Register(c *gin.Context) {
var requestData Registration
var usedToken database.RegistrationToken
now := time.Now()
if err := c.ShouldBindJSON(&requestData); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// Validate registration token
hashedToken, err := bcrypt.GenerateFromPassword([]byte(requestData.token), bcrypt.DefaultCost)
usedToken.Hash = string(hashedToken)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
log.Printf("Could not hash token: %v", err)
return
}
result := database.DB.First(&usedToken)
if result.Error != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": result.Error})
log.Printf("Could not validate token hash: %v", result.Error)
return
}
// create Endpoint struct
hashedSecret, err := bcrypt.GenerateFromPassword([]byte(requestData.secret), bcrypt.DefaultCost)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
log.Printf("Could not secret token: %v", err)
return
}
newEndpoint := database.Endpoint{
ID: uuid.New(),
Name: requestData.hostname,
LastConnection: &now,
RegisteredDate: &now,
SecretHash: string(hashedSecret),
Enabled: false,
}
// Store Endpoint to Database
database.DB.Create(&newEndpoint)
result = database.DB.First(&usedToken)
if result.Error != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
log.Printf("Could not create register Endpoint: %v", err)
return
}
c.JSON(http.StatusOK, gin.H{"uuid": newEndpoint.ID})
}