package server import ( "PD1/internal/protocol" "PD1/internal/utils/cryptoUtils" "log" "net/http" "strconv" "github.com/gin-gonic/gin" ) //func clientHandler(connection networking.Connection[protocol.Packet], dataStore DataStore) { // defer connection.Conn.Close() // // //Get certificate sent by user // clientCert := connection.GetPeerCertificate() // //Get the OID values // oidMap := cryptoUtils.ExtractAllOIDValues(clientCert) // //Check if certificate usage is MSG SERVICE // usage := oidMap["2.5.4.11"] // if usage == "" { // log.Fatalln("User certificate does not have the correct usage") // } // //Get the UID of this user // UID := oidMap["2.5.4.65"] // if UID == "" { // log.Fatalln("User certificate does not specify it's PSEUDONYM") // } // err := dataStore.storeUserCertIfNotExists(UID, *clientCert) // if err != nil { // log.Fatalln(err) // } //} func HandleGetUserCert(c *gin.Context, dataStore DataStore) { user := c.Param("user") userCertPacket, err := dataStore.GetUserCertificate(user) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) } else { c.JSON(http.StatusOK, userCertPacket) } } func HandleGetUnreadMsgsInfo(c *gin.Context, dataStore DataStore) { user := c.Param("user") var getUnreadMsgsInfo protocol.GetUnreadMsgsInfo if err := c.BindJSON(getUnreadMsgsInfo); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if getUnreadMsgsInfo.Page <= 0 || getUnreadMsgsInfo.PageSize <= 0 { c.JSON(http.StatusBadRequest, gin.H{"error": "Page and PageSize need to be >= 1"}) return } unreadMsgsInfo, err := dataStore.GetUnreadMsgsInfo(user, getUnreadMsgsInfo.Page, getUnreadMsgsInfo.PageSize) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, unreadMsgsInfo) } func HandleSendMessage(c *gin.Context, dataStore DataStore) { sender := c.Param("user") var message protocol.SendMsg if err := c.BindJSON(message); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if message.ToUID == sender { c.JSON(http.StatusBadRequest, gin.H{"error": "Message sender and receiver cannot be the same user"}) return } if !dataStore.userExists(message.ToUID) { c.JSON(http.StatusBadRequest, gin.H{"error": "Message receiver does not exist"}) return } err := dataStore.AddMessageToQueue(sender, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, nil) } func HandleGetMessage(c *gin.Context, dataStore DataStore) { user := c.Param("user") numStr := c.Param("num") num, err := strconv.Atoi(numStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } message, reportError := dataStore.GetMessage(user, num) if reportError != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) } dataStore.MarkMessageInQueueAsRead(user, num) c.JSON(http.StatusOK, message) } func Run() { //Open connection to DB dataStore, err := OpenDB() if err != nil { log.Fatalln(err) } defer dataStore.db.Close() //Read server keystore keystorePassphrase := readStdin("Insert keystore passphrase") serverKeyStore, err := cryptoUtils.LoadKeyStore("certs/server/server.p12", keystorePassphrase) if err != nil { log.Fatalln(err) } r := gin.Default() r.GET("/message/:user/:num", func(c *gin.Context) { HandleGetMessage(c, dataStore) }) r.GET("/queue/:user", func(c *gin.Context) { HandleGetUnreadMsgsInfo(c, dataStore) }) r.GET("/cert/:user", func(c *gin.Context) { HandleGetUserCert(c, dataStore) }) r.POST("/message/:user", func(c *gin.Context) { HandleSendMessage(c, dataStore) }) server := http.Server{ Addr: "0.0.0.0:8080", Handler: r, //TODO: Verify if it's the gateway TLSConfig: serverKeyStore.GetServerTLSConfig(), } err = server.ListenAndServeTLS("", "") if err!=nil { log.Fatal(err.Error()) } }