From 6f8219d9913add443c715e36c4d60cff3bc5f9c2 Mon Sep 17 00:00:00 2001 From: afonso Date: Fri, 31 May 2024 19:23:41 +0100 Subject: [PATCH] [PD2] Code almost all done. Need to add logout and change help message Co-authored-by: tsousa111 --- Projs/PD2/gateway.db | Bin 12288 -> 12288 bytes Projs/PD2/internal/client/client.go | 105 ++++++++++-------------- Projs/PD2/internal/client/interface.go | 50 ++--------- Projs/PD2/internal/gateway/forwarder.go | 34 ++++---- Projs/PD2/internal/gateway/gateway.go | 78 +++++++++--------- Projs/PD2/internal/gateway/jwt.go | 4 +- Projs/PD2/internal/protocol/protocol.go | 38 --------- Projs/PD2/internal/server/datastore.go | 8 +- Projs/PD2/internal/server/server.go | 16 ++-- Projs/PD2/server.db | Bin 36864 -> 36864 bytes Projs/PD2/token/CL1 | 1 + Projs/PD2/token/CL2 | 1 + 12 files changed, 123 insertions(+), 212 deletions(-) create mode 100644 Projs/PD2/token/CL1 create mode 100644 Projs/PD2/token/CL2 diff --git a/Projs/PD2/gateway.db b/Projs/PD2/gateway.db index f8bf8c6ba1ebf208b22cee10ed7f69eaeda1bd44..473f9ff58377ddb4f759119dfcb02c8993907180 100644 GIT binary patch delta 204 zcmZojXh@hK&B!`Y#+i|IW5N=C4krFG2L9drWt#;BviR$rnOKAyS)6^0RE!c;3=LE& z3iT2rEK4)|qf)}l4J-??eX_H{Q!|nx%`ytZ(?W|~s{9H(BMk%7!;Orxy;8E>%yT{b zof#p97(xv(HwlmQ4l^joDNi=ZaPjjj&NB@!@DI)|sR#%*bF#3EDlEzP&BzV+aOPrQU|{0^$iV-T|0B?GPx<-TnS~jFPGe$Y7Up#JF$4g$yE-WV delta 43 qcmZojXh@hK&B!=W#+i|EW5N=CCI*4cf(j4#CpJj2aWMb^oC^R0K?_m< diff --git a/Projs/PD2/internal/client/client.go b/Projs/PD2/internal/client/client.go index 9592665..1667889 100644 --- a/Projs/PD2/internal/client/client.go +++ b/Projs/PD2/internal/client/client.go @@ -52,7 +52,7 @@ func Run() { printError(err.Error()) os.Exit(1) } - token := string(tokenFile) + token = string(tokenFile) if token == "" { printError("MSG SERVICE: token read error") os.Exit(1) @@ -119,13 +119,7 @@ func Run() { showMessage(msg) case "register": // call register - if flag.NArg() > 2 { - printError("MSG SERVICE: command error!") - showHelp() - os.Exit(1) - } - userId := flag.Arg(1) - if userId == "" { + if flag.NArg() != 1 { printError("MSG SERVICE: command error!") showHelp() os.Exit(1) @@ -143,12 +137,12 @@ func Run() { os.Exit(1) } - err := registerUser(userId, password, clientKeyStore) + err := registerUser(myUID, password, clientKeyStore) if err != nil { printError(err.Error()) os.Exit(1) } - // TODO: print register successful + printInfo("Registered successfully") case "login": if flag.NArg() != 1 { printError("MSG SERVICE: command error!") @@ -173,14 +167,13 @@ func Run() { os.Exit(1) } defer tokenFile.Close() - // TODO: Maybe encrypt token _, err = tokenFile.WriteString(token) if err != nil { printError(err.Error()) os.Exit(1) } + printInfo("Login was successful") - // TODO: print logged in case "help": showHelp() @@ -209,7 +202,7 @@ func registerUser(userId string, password string, clientKeyStore cryptoUtils.Key if err != nil { return err } - parsedURL.JoinPath("register") + parsedURL = parsedURL.JoinPath("register") req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewBuffer(jsonData)) if err != nil { @@ -229,8 +222,8 @@ func registerUser(userId string, password string, clientKeyStore cryptoUtils.Key } if resp.StatusCode != http.StatusOK { - var reportError protocol.ReportError - if err := json.Unmarshal(responseBody, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(responseBody, reportError); err != nil { return err } return errors.New(reportError.ErrorMessage) @@ -252,7 +245,7 @@ func login(userId string, password string, clientKeyStore cryptoUtils.KeyStore) if err != nil { return "", err } - parsedURL.JoinPath("login") + parsedURL = parsedURL.JoinPath("login") req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewBuffer(jsonData)) if err != nil { @@ -272,8 +265,8 @@ func login(userId string, password string, clientKeyStore cryptoUtils.KeyStore) } if resp.StatusCode != http.StatusOK { - var reportError protocol.ReportError - if err := json.Unmarshal(responseBody, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(responseBody, reportError); err != nil { return "", err } return "", errors.New(reportError.ErrorMessage) @@ -319,7 +312,7 @@ func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, r if err != nil { return fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("message") + parsedURL = parsedURL.JoinPath("message") sendMsgPacket := protocol.NewSendMsg(recieverUID, subject, body) @@ -328,12 +321,11 @@ func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, r return fmt.Errorf("error marshaling JSON: %v", err) } - //TODO: ADD THE HEADER WITH THE TOKEN req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewBuffer(jsonData)) if err != nil { return fmt.Errorf("error creating request: %v", err) } - req.Header.Add("Token",token) + req.Header.Set("Token", token) resp, err := client.Do(req) if err != nil { @@ -348,8 +340,8 @@ func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, r } if resp.StatusCode != http.StatusOK { - var reportError protocol.ReportError - if err := json.Unmarshal(responseBody, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(responseBody, reportError); err != nil { return err } return errors.New(reportError.ErrorMessage) @@ -366,21 +358,14 @@ func getMsgCommand(clientKeyStore cryptoUtils.KeyStore, num int, token string) ( if err != nil { return ClientMessage{}, fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("message") + parsedURL = parsedURL.JoinPath("message") + parsedURL = parsedURL.JoinPath(fmt.Sprint(num)) - newGetMsg := protocol.NewGetMsg(num) - - jsonData, err := json.Marshal(newGetMsg) - if err != nil { - return ClientMessage{}, fmt.Errorf("error marshaling JSON: %v", err) - } - - //TODO: ADD THE HEADER WITH THE TOKEN - req, err := http.NewRequest("GET", parsedURL.String(), bytes.NewBuffer(jsonData)) + req, err := http.NewRequest("GET", parsedURL.String(), nil) if err != nil { return ClientMessage{}, fmt.Errorf("error creating request: %v", err) } - req.Header.Add("Token",token) + req.Header.Set("Token", token) resp, err := client.Do(req) if err != nil { @@ -396,15 +381,15 @@ func getMsgCommand(clientKeyStore cryptoUtils.KeyStore, num int, token string) ( } if resp.StatusCode != http.StatusOK { - var reportError protocol.ReportError - if err := json.Unmarshal(body, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(body, reportError); err != nil { return ClientMessage{}, err } return ClientMessage{}, errors.New(reportError.ErrorMessage) } - var answerGetMsg protocol.AnswerGetMsg - if err := json.Unmarshal(body, &answerGetMsg); err != nil { + answerGetMsg := new(protocol.AnswerGetMsg) + if err := json.Unmarshal(body, answerGetMsg); err != nil { return ClientMessage{}, err } @@ -448,15 +433,14 @@ func getUserCert(keyStore cryptoUtils.KeyStore, uid string, token string) (*x509 if err != nil { return nil, fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("cert") - parsedURL.JoinPath(uid) + parsedURL = parsedURL.JoinPath("cert") + parsedURL = parsedURL.JoinPath(uid) - //TODO: ADD THE HEADER WITH THE TOKEN req, err := http.NewRequest("GET", parsedURL.String(), nil) if err != nil { return nil, fmt.Errorf("error creating request: %v", err) } - req.Header.Add("Token",token) + req.Header.Set("Token", token) resp, err := client.Do(req) if err != nil { @@ -471,8 +455,8 @@ func getUserCert(keyStore cryptoUtils.KeyStore, uid string, token string) (*x509 } if resp.StatusCode == http.StatusOK { - var answerGetUserCert protocol.AnswerGetUserCert - if err := json.Unmarshal(body, &answerGetUserCert); err != nil { + answerGetUserCert := new(protocol.AnswerGetUserCert) + if err := json.Unmarshal(body, answerGetUserCert); err != nil { return nil, err } @@ -485,8 +469,8 @@ func getUserCert(keyStore cryptoUtils.KeyStore, uid string, token string) (*x509 } return userCert, nil } else { - var reportError protocol.ReportError - if err := json.Unmarshal(body, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(body, reportError); err != nil { return nil, err } return nil, errors.New(reportError.ErrorMessage) @@ -502,21 +486,18 @@ func getUnreadMessagesInfo(keyStore cryptoUtils.KeyStore, page int, pageSize int if err != nil { return protocol.AnswerGetUnreadMsgsInfo{}, nil, fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("queue") + parsedURL = parsedURL.JoinPath("queue") - getUnreadMessagesInfo := protocol.NewGetUnreadMsgsInfo(page, pageSize) + query := parsedURL.Query() + query.Set("page", fmt.Sprint(page)) + query.Set("pagesize", fmt.Sprint(pageSize)) + parsedURL.RawQuery = query.Encode() - jsonData, err := json.Marshal(getUnreadMessagesInfo) - if err != nil { - return protocol.AnswerGetUnreadMsgsInfo{}, nil, fmt.Errorf("error marshaling JSON: %v", err) - } - - //TODO: ADD THE HEADER WITH THE TOKEN - req, err := http.NewRequest("GET", parsedURL.String(), bytes.NewBuffer(jsonData)) + req, err := http.NewRequest("GET", parsedURL.String(), nil) if err != nil { return protocol.AnswerGetUnreadMsgsInfo{}, nil, fmt.Errorf("error creating request: %v", err) } - req.Header.Add("Token",token) + req.Header.Set("Token", token) resp, err := client.Do(req) if err != nil { @@ -531,12 +512,12 @@ func getUnreadMessagesInfo(keyStore cryptoUtils.KeyStore, page int, pageSize int } if resp.StatusCode == http.StatusOK { - //Create Set of needed certificates - var answerGetUnreadMsgsInfo protocol.AnswerGetUnreadMsgsInfo - if err := json.Unmarshal(body, &answerGetUnreadMsgsInfo); err != nil { + answerGetUnreadMsgsInfo := new(protocol.AnswerGetUnreadMsgsInfo) + if err := json.Unmarshal(body, answerGetUnreadMsgsInfo); err != nil { return protocol.AnswerGetUnreadMsgsInfo{}, nil, err } + //Create Set of needed certificates senderSet := map[string]bool{} for _, messageInfo := range answerGetUnreadMsgsInfo.MessagesInfo { senderSet[messageInfo.FromUID] = true @@ -550,10 +531,10 @@ func getUnreadMessagesInfo(keyStore cryptoUtils.KeyStore, page int, pageSize int certificatesMap[senderUID] = senderCert } } - return answerGetUnreadMsgsInfo, certificatesMap, nil + return *answerGetUnreadMsgsInfo, certificatesMap, nil } else { - var reportError protocol.ReportError - if err := json.Unmarshal(body, &reportError); err != nil { + reportError := new(protocol.ReportError) + if err := json.Unmarshal(body, reportError); err != nil { return protocol.AnswerGetUnreadMsgsInfo{}, nil, err } return protocol.AnswerGetUnreadMsgsInfo{}, nil, errors.New(reportError.ErrorMessage) diff --git a/Projs/PD2/internal/client/interface.go b/Projs/PD2/internal/client/interface.go index e891746..5f3b4f8 100644 --- a/Projs/PD2/internal/client/interface.go +++ b/Projs/PD2/internal/client/interface.go @@ -4,7 +4,6 @@ import ( "bufio" "fmt" "os" - "strings" ) func readStdin(message string) string { @@ -14,6 +13,10 @@ func readStdin(message string) string { return scanner.Text() } +func printInfo(info string){ + fmt.Println(info) +} + func printError(err string) { fmt.Fprintln(os.Stderr, err) } @@ -27,10 +30,10 @@ func showHelp() { fmt.Println("help: Imprime instruções de uso do programa.") } -func showMessagesInfo(page int, numPages int, messages []ClientMessageInfo) int { +func showMessagesInfo(page int, numPages int, messages []ClientMessageInfo) { if messages == nil { fmt.Println("No unread messages in the queue") - return 0 + return } for _, message := range messages { if message.decryptError != nil { @@ -41,47 +44,6 @@ func showMessagesInfo(page int, numPages int, messages []ClientMessageInfo) int } } fmt.Printf("Page %v/%v\n", page, numPages) - return messagesInfoPageNavigation(page, numPages) -} - -func messagesInfoPageNavigation(page int, numPages int) int { - var action string - - switch page { - case 1: - if page == numPages { - return 0 - } else { - action = readStdin("Actions: quit/next") - } - case numPages: - action = readStdin("Actions: prev/quit") - default: - action = readStdin("prev/quit/next") - } - - switch strings.ToLower(action) { - case "prev": - if page == 1 { - fmt.Println("Unavailable action: Already in first page") - messagesInfoPageNavigation(page, numPages) - } else { - return -1 - } - case "quit": - return 0 - case "next": - if page == numPages { - fmt.Println("Unavailable action: Already in last page") - messagesInfoPageNavigation(page, numPages) - } else { - return 1 - } - default: - fmt.Println("Unknown action") - messagesInfoPageNavigation(page, numPages) - } - return 0 } func showMessage(message ClientMessage) { diff --git a/Projs/PD2/internal/gateway/forwarder.go b/Projs/PD2/internal/gateway/forwarder.go index 65ff2fe..17e10f6 100644 --- a/Projs/PD2/internal/gateway/forwarder.go +++ b/Projs/PD2/internal/gateway/forwarder.go @@ -26,8 +26,8 @@ func forwardStoreUserCert(tlsConfig *tls.Config,uid string,storeUserCertificate if err != nil { return 0,nil,fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("certs") - parsedURL.JoinPath(uid) + parsedURL = parsedURL.JoinPath("certs") + parsedURL = parsedURL.JoinPath(uid) jsonData, err := json.Marshal(storeUserCertificate) if err != nil { @@ -54,7 +54,7 @@ func forwardStoreUserCert(tlsConfig *tls.Config,uid string,storeUserCertificate return resp.StatusCode,body,nil } -func forwardGetMessage(tlsConfig *tls.Config,uid string,getMsg protocol.GetMsg) (int,[]byte,error) { +func forwardGetMessage(tlsConfig *tls.Config,uid string,num string) (int,[]byte,error) { client := getHTTPClient(tlsConfig) // Parse the base URL @@ -62,9 +62,9 @@ func forwardGetMessage(tlsConfig *tls.Config,uid string,getMsg protocol.GetMsg) if err != nil { return 0,nil,fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("message") - parsedURL.JoinPath(uid) - parsedURL.JoinPath(fmt.Sprint(getMsg.Num)) + parsedURL = parsedURL.JoinPath("message") + parsedURL = parsedURL.JoinPath(uid) + parsedURL = parsedURL.JoinPath(num) req, err := http.NewRequest("GET", parsedURL.String(), nil) @@ -87,7 +87,7 @@ func forwardGetMessage(tlsConfig *tls.Config,uid string,getMsg protocol.GetMsg) return resp.StatusCode,body,nil } -func forwardGetUnreadMsgsInfo(tlsConfig *tls.Config,uid string,getUnreadMsgsInfo protocol.GetUnreadMsgsInfo) (int,[]byte,error) { +func forwardGetUnreadMsgsInfo(tlsConfig *tls.Config,uid string,page string,pagesize string) (int,[]byte,error) { client := getHTTPClient(tlsConfig) // Parse the base URL @@ -95,12 +95,12 @@ func forwardGetUnreadMsgsInfo(tlsConfig *tls.Config,uid string,getUnreadMsgsInfo if err != nil { return 0,nil,fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("queue") - parsedURL.JoinPath(uid) + parsedURL = parsedURL.JoinPath("queue") + parsedURL = parsedURL.JoinPath(uid) query := parsedURL.Query() - query.Set("page", fmt.Sprint(getUnreadMsgsInfo.Page)) - query.Set("pagesize", fmt.Sprint(getUnreadMsgsInfo.PageSize)) + query.Set("page", page) + query.Set("pagesize", pagesize) parsedURL.RawQuery = query.Encode() req, err := http.NewRequest("GET", parsedURL.String(), nil) @@ -119,11 +119,11 @@ func forwardGetUnreadMsgsInfo(tlsConfig *tls.Config,uid string,getUnreadMsgsInfo if err != nil { return 0,nil,fmt.Errorf("error reading response body: %v", err) } - + return resp.StatusCode,body,nil } -func forwardGetUserCert(tlsConfig *tls.Config,getUserCert protocol.GetUserCert) (int,[]byte,error) { +func forwardGetUserCert(tlsConfig *tls.Config,uid string) (int,[]byte,error) { client := getHTTPClient(tlsConfig) // Parse the base URL @@ -131,8 +131,8 @@ func forwardGetUserCert(tlsConfig *tls.Config,getUserCert protocol.GetUserCert) if err != nil { return 0,nil,fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("cert") - parsedURL.JoinPath(getUserCert.UID) + parsedURL = parsedURL.JoinPath("cert") + parsedURL = parsedURL.JoinPath(uid) req, err := http.NewRequest("GET", parsedURL.String(), nil) if err != nil { @@ -162,8 +162,8 @@ func forwardSendMessage(tlsConfig *tls.Config,uid string,sendMsg protocol.SendMs if err != nil { return 0,nil,fmt.Errorf("error parsing URL: %v", err) } - parsedURL.JoinPath("message") - parsedURL.JoinPath(uid) + parsedURL = parsedURL.JoinPath("message") + parsedURL = parsedURL.JoinPath(uid) jsonData, err := json.Marshal(sendMsg) if err != nil { diff --git a/Projs/PD2/internal/gateway/gateway.go b/Projs/PD2/internal/gateway/gateway.go index 1076469..5149329 100644 --- a/Projs/PD2/internal/gateway/gateway.go +++ b/Projs/PD2/internal/gateway/gateway.go @@ -11,13 +11,6 @@ import ( ) func HandleGetMessage(c *gin.Context, keyStore cryptoUtils.KeyStore) { - var getMsg protocol.GetMsg - err := c.Bind(getMsg) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is not a GetMsg"}) - return - } - uid, exists := c.Get("uid") if !exists { c.JSON(http.StatusBadRequest, gin.H{"error": "User does not exist"}) @@ -26,20 +19,22 @@ func HandleGetMessage(c *gin.Context, keyStore cryptoUtils.KeyStore) { uidString := uid.(string) - statusCode, body, err := forwardGetMessage(keyStore.GetGatewayOutgoingTLSConfig(), uidString, getMsg) + num := c.Param("num") + if num == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "User does not exist"}) + return + } + + statusCode, body, err := forwardGetMessage(keyStore.GetGatewayOutgoingTLSConfig(), uidString, num) if err != nil { log.Println(err.Error()) } else { - c.JSON(statusCode, body) + c.Data(statusCode, "application/json", body) } } func HandleGetUnreadMsgsInfo(c *gin.Context, keyStore cryptoUtils.KeyStore) { - var getUnreadMsgsInfo protocol.GetUnreadMsgsInfo - err := c.Bind(getUnreadMsgsInfo) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is not a GetUnreadMsgsInfo"}) - return - } + page := c.Query("page") + pagesize := c.Query("pagesize") uid, exists := c.Get("uid") if !exists { @@ -49,32 +44,32 @@ func HandleGetUnreadMsgsInfo(c *gin.Context, keyStore cryptoUtils.KeyStore) { uidString := uid.(string) - statusCode, body, err := forwardGetUnreadMsgsInfo(keyStore.GetGatewayOutgoingTLSConfig(), uidString, getUnreadMsgsInfo) + statusCode, body, err := forwardGetUnreadMsgsInfo(keyStore.GetGatewayOutgoingTLSConfig(), uidString, page, pagesize) if err != nil { log.Println(err.Error()) } else { - c.JSON(statusCode, body) + c.Data(statusCode, "application/json", body) } } -func HandleGetUserCert(c *gin.Context,keyStore cryptoUtils.KeyStore) { - var getUserCert protocol.GetUserCert - err := c.Bind(getUserCert) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is not a GetUserCert"}) +func HandleGetUserCert(c *gin.Context, keyStore cryptoUtils.KeyStore) { + + certificateOwnerUID := c.Param("user") + if certificateOwnerUID == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "User does not exist"}) return } - statusCode, body, err := forwardGetUserCert(keyStore.GetGatewayOutgoingTLSConfig(), getUserCert) + statusCode, body, err := forwardGetUserCert(keyStore.GetGatewayOutgoingTLSConfig(), certificateOwnerUID) if err != nil { log.Println(err.Error()) } else { - c.JSON(statusCode, body) + c.Data(statusCode, "application/json", body) } } func HandleSendMessage(c *gin.Context, keyStore cryptoUtils.KeyStore) { - var sendMsg protocol.SendMsg - err := c.Bind(sendMsg) + sendMsg := new(protocol.SendMsg) + err := c.BindJSON(sendMsg) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is not a SendMsg"}) return @@ -88,17 +83,17 @@ func HandleSendMessage(c *gin.Context, keyStore cryptoUtils.KeyStore) { uidString := uid.(string) - statusCode, body, err := forwardSendMessage(keyStore.GetGatewayOutgoingTLSConfig(), uidString, sendMsg) + statusCode, body, err := forwardSendMessage(keyStore.GetGatewayOutgoingTLSConfig(), uidString, *sendMsg) if err != nil { log.Println(err.Error()) } else { - c.JSON(statusCode, body) + c.Data(statusCode, "application/json", body) } } func HandleRegister(c *gin.Context, dataStore DataStore, keyStore cryptoUtils.KeyStore) { - var postRegister protocol.PostRegister - err := c.Bind(postRegister) + postRegister := new(protocol.PostRegister) + err := c.BindJSON(postRegister) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is not a PostRegister"}) return @@ -118,12 +113,14 @@ func HandleRegister(c *gin.Context, dataStore DataStore, keyStore cryptoUtils.Ke hashedPassword, err := HashPassword(postRegister.Password) if err != nil { - log.Fatalln("Could not hash the password") + c.JSON(http.StatusInternalServerError, gin.H{"error": "Could not hash password"}) + return } err = dataStore.InsertUser(postRegister.UID, hashedPassword) if err != nil { - log.Fatalln("Could not insert user into DB") + c.JSON(http.StatusInternalServerError, gin.H{"error": "Could not insert user into DB"}) + return } storeUserCertificate := protocol.NewStoreUserCert(userCert.Raw) @@ -131,14 +128,14 @@ func HandleRegister(c *gin.Context, dataStore DataStore, keyStore cryptoUtils.Ke if err != nil { log.Println(err.Error()) } else { - c.JSON(statusCode, body) + c.Data(statusCode, "application/json", body) } } func HandleLogin(c *gin.Context, dataStore DataStore, keyStore cryptoUtils.KeyStore) { - var postLogin protocol.PostLogin - err := c.Bind(postLogin) + postLogin := new(protocol.PostLogin) + err := c.BindJSON(postLogin) if err != nil { c.AbortWithStatus(http.StatusBadRequest) } @@ -157,22 +154,25 @@ func HandleLogin(c *gin.Context, dataStore DataStore, keyStore cryptoUtils.KeySt if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to create token"}) + return } //Send token to user c.JSON(http.StatusOK, gin.H{"token": jwToken}) } func AuthMiddleware(c *gin.Context) { - tokenList := c.Request.Header["Token"] - if tokenList == nil { + token := c.GetHeader("Token") + if token == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "No authentication token provided"}) + c.Abort() + return } - // We only care about the first entry - token := tokenList[0] uid, err := ValidateJWT(token) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Token is invalid or has expired"}) + c.Abort() + return } c.Set("uid", uid) c.Next() diff --git a/Projs/PD2/internal/gateway/jwt.go b/Projs/PD2/internal/gateway/jwt.go index f3bba7e..9c386eb 100644 --- a/Projs/PD2/internal/gateway/jwt.go +++ b/Projs/PD2/internal/gateway/jwt.go @@ -52,11 +52,11 @@ func ValidateJWT(tokenString string) (string, error) { return "", errors.New("invalid token") } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { - if time.Now().Unix() > claims["exp"].(int64) { + if float64(time.Now().Unix()) > claims["exp"].(float64) { return "", errors.New("JWT token has expired") } return claims["sub"].(string),nil } else { - return "",errors.New("Failed to get jwt claims") + return "",errors.New("failed to get jwt claims") } } diff --git a/Projs/PD2/internal/protocol/protocol.go b/Projs/PD2/internal/protocol/protocol.go index 12c42fd..c40add0 100644 --- a/Projs/PD2/internal/protocol/protocol.go +++ b/Projs/PD2/internal/protocol/protocol.go @@ -4,21 +4,7 @@ import ( "time" ) -type Body interface{} - type ( - GetUserCert struct { - UID string `json:"uid"` - } - - GetUnreadMsgsInfo struct { - Page int `json:"page"` - PageSize int `json:"pageSize"` - } - - GetMsg struct { - Num int `json:"num"` - } SendMsg struct { ToUID string `json:"to_uid"` @@ -72,24 +58,6 @@ type ( } ) -func NewGetUserCert(UID string) GetUserCert { - return GetUserCert{ - UID: UID, - } -} - -func NewGetUnreadMsgsInfo(page int, pageSize int) GetUnreadMsgsInfo { - return GetUnreadMsgsInfo{ - Page: page, - PageSize: pageSize} -} - -func NewGetMsg(num int) GetMsg { - return GetMsg{ - Num: num, - } -} - func NewSendMsg(toUID string, subject []byte, body []byte) SendMsg { return SendMsg{ ToUID: toUID, @@ -146,9 +114,3 @@ func NewAnswerGetMsg(fromUID, toUID string, subject []byte, body []byte, timesta Timestamp: timestamp, } } - -func NewReportError(errorMessage string) ReportError { - return ReportError{ - ErrorMessage: errorMessage, - } -} diff --git a/Projs/PD2/internal/server/datastore.go b/Projs/PD2/internal/server/datastore.go index 6743456..bb38cd1 100644 --- a/Projs/PD2/internal/server/datastore.go +++ b/Projs/PD2/internal/server/datastore.go @@ -80,7 +80,7 @@ func (ds DataStore) CreateTables() error { func (ds DataStore) GetMessage(toUID string, position int) (*protocol.AnswerGetMsg, error) { - var serverMessage protocol.AnswerGetMsg + serverMessage := new(protocol.AnswerGetMsg) query := ` SELECT fromUID, toUID, subject, body, timestamp FROM messages @@ -189,7 +189,7 @@ func (ds DataStore) AddMessageToQueue(fromUID string, message protocol.SendMsg) return nil } -func (ds DataStore) GetUserCertificate(uid string) (protocol.AnswerGetUserCert,error) { +func (ds DataStore) GetUserCertificate(uid string) (protocol.AnswerGetUserCert, error) { query := ` SELECT userCert FROM users @@ -202,9 +202,9 @@ func (ds DataStore) GetUserCertificate(uid string) (protocol.AnswerGetUserCert,e if err == sql.ErrNoRows { errorMessage := fmt.Sprintf("No certificate for UID %v found in the database", uid) log.Println(errorMessage) - return protocol.AnswerGetUserCert{},errors.New(errorMessage) + return protocol.AnswerGetUserCert{}, errors.New(errorMessage) } - return protocol.NewAnswerGetUserCert(uid, userCertBytes),nil + return protocol.NewAnswerGetUserCert(uid, userCertBytes), nil } func (ds DataStore) userExists(uid string) bool { diff --git a/Projs/PD2/internal/server/server.go b/Projs/PD2/internal/server/server.go index 0e58620..8134732 100644 --- a/Projs/PD2/internal/server/server.go +++ b/Projs/PD2/internal/server/server.go @@ -23,8 +23,8 @@ func HandleGetUserCert(c *gin.Context, dataStore DataStore) { func HandleStoreUserCert(c *gin.Context, dataStore DataStore) { user := c.Param("user") - var storeUserCert protocol.StoreUserCert - if err := c.Bind(storeUserCert); err != nil { + storeUserCert := new(protocol.StoreUserCert) + if err := c.BindJSON(storeUserCert); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -54,6 +54,7 @@ func HandleGetUnreadMsgsInfo(c *gin.Context, dataStore DataStore) { page, err = strconv.Atoi(pageStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Page is not a number"}) + return } } else { page = 1 @@ -63,6 +64,7 @@ func HandleGetUnreadMsgsInfo(c *gin.Context, dataStore DataStore) { pagesize, err = strconv.Atoi(pagesizeStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Pagesize is not a number"}) + return } } else { pagesize = 5 @@ -83,7 +85,7 @@ func HandleGetUnreadMsgsInfo(c *gin.Context, dataStore DataStore) { func HandleSendMessage(c *gin.Context, dataStore DataStore) { sender := c.Param("user") - var message protocol.SendMsg + message := new(protocol.SendMsg) if err := c.BindJSON(message); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return @@ -97,7 +99,7 @@ func HandleSendMessage(c *gin.Context, dataStore DataStore) { c.JSON(http.StatusBadRequest, gin.H{"error": "Message receiver does not exist"}) return } - err := dataStore.AddMessageToQueue(sender, message) + err := dataStore.AddMessageToQueue(sender, *message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return @@ -111,11 +113,13 @@ func HandleGetMessage(c *gin.Context, dataStore DataStore) { num, err := strconv.Atoi(numStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return } - message, reportError := dataStore.GetMessage(user, num) - if reportError != nil { + message, err := dataStore.GetMessage(user, num) + if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) + return } dataStore.MarkMessageInQueueAsRead(user, num) c.JSON(http.StatusOK, message) diff --git a/Projs/PD2/server.db b/Projs/PD2/server.db index c995c32148bb474d21cd8ceaa51687e88df7c3e6..e6015e8f09920c0876fee8b8d8ae957dd40033e0 100644 GIT binary patch delta 2400 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 CB4h&q diff --git a/Projs/PD2/token/CL1 b/Projs/PD2/token/CL1 new file mode 100644 index 0000000..5be24f3 --- /dev/null +++ b/Projs/PD2/token/CL1 @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTcyNTkwNzksInN1YiI6IkNMMSJ9.kxN_3WtKNy0Smu-dKF7kCFKIYPPbSad-LyEFlXuuGAI \ No newline at end of file diff --git a/Projs/PD2/token/CL2 b/Projs/PD2/token/CL2 new file mode 100644 index 0000000..4d1322b --- /dev/null +++ b/Projs/PD2/token/CL2 @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTcyNjEzOTQsInN1YiI6IkNMMiJ9.lE-zUVbwLBwCLPh8z78-pp5lnu_UwR2j_ARWTManfs8 \ No newline at end of file