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}) }