2023-10-22 17:46:46 +02:00
|
|
|
package endpoint
|
|
|
|
|
2023-10-26 17:26:09 +02:00
|
|
|
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"
|
|
|
|
)
|
2023-10-22 17:46:46 +02:00
|
|
|
|
|
|
|
type Registration struct {
|
2023-10-26 17:26:09 +02:00
|
|
|
hostname string
|
|
|
|
token string
|
|
|
|
secret string
|
2023-10-22 17:46:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func Register(c *gin.Context) {
|
|
|
|
var requestData Registration
|
2023-10-26 17:26:09 +02:00
|
|
|
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
|
|
|
|
}
|
2023-10-22 17:46:46 +02:00
|
|
|
|
2023-10-26 17:26:09 +02:00
|
|
|
// 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
|
2023-10-22 17:46:46 +02:00
|
|
|
}
|
2023-10-26 17:26:09 +02:00
|
|
|
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})
|
|
|
|
|
2023-10-22 17:46:46 +02:00
|
|
|
}
|