From 4c141bbc6e81913097e152bb6e59df2354949013 Mon Sep 17 00:00:00 2001
From: afonso <afonso@francof.net>
Date: Sat, 20 Apr 2024 00:55:16 +0100
Subject: [PATCH] [PD1] Logic all done?

---
 Projs/PD1/internal/client/client.go    |  51 +++++++++++--------------
 Projs/PD1/internal/server/datastore.go |  13 ++++---
 Projs/PD1/internal/server/server.go    |   1 +
 Projs/PD1/server.db                    | Bin 20480 -> 32768 bytes
 4 files changed, 31 insertions(+), 34 deletions(-)

diff --git a/Projs/PD1/internal/client/client.go b/Projs/PD1/internal/client/client.go
index 3f8487e..3afbda7 100644
--- a/Projs/PD1/internal/client/client.go
+++ b/Projs/PD1/internal/client/client.go
@@ -6,8 +6,9 @@ import (
 	"PD1/internal/utils/networking"
 	"crypto/x509"
 	"flag"
-	"fmt"
+	"log"
 	"sort"
+	"strconv"
 )
 
 func Run() {
@@ -76,40 +77,33 @@ func Run() {
 
 		showMessagesInfo(clientMessages)
 
-	//case "getall":
-	//	cl := networking.NewClient[protocol.Packet](&clientKeyStore)
-	//	defer cl.Connection.Conn.Close()
-
-	//	requestAllMsgPacket := protocol.NewRequestAllMsgPacket()
-	//	if !cl.Connection.Send(requestAllMsgPacket) {
-	//		return
-	//	}
-	//    serverMessagePackets,certificates := getManyMessages(cl)
-	//	var clientMessages []ClientMessage
-	//	for _, message := range serverMessagePackets {
-	//		senderCert, ok := certificates[message.FromUID]
-	//		if ok {
-	//			decryptedContentBytes := clientKeyStore.DecryptMessageContent(senderCert, message.Content)
-	//			content := UnmarshalContent(decryptedContentBytes)
-	//			clientMessage := newClientMessage(message.FromUID, message.ToUID, content, message.Timestamp)
-	//			clientMessages = append(clientMessages, clientMessage)
-	//		}
-	//	}
-	//	//Sort the messages
-	//	sort.Slice(clientMessages, func(i, j int) bool {
-	//		return clientMessages[i].Timestamp.After(clientMessages[j].Timestamp)
-	//	})
-
-	//	showMessages(clientMessages)
-
 	case "getmsg":
 		if flag.NArg() < 2 {
 			panic("Insufficient arguments for 'getmsg' command. Usage: getmsg <NUM>")
 		}
-		//num := flag.Arg(1)
+		numString := flag.Arg(1)
 		cl := networking.NewClient[protocol.Packet](&clientKeyStore)
 		defer cl.Connection.Conn.Close()
+        num,err :=strconv.Atoi(numString)
+        if err!=nil{
+            log.Panicln("NUM argument provided is not a number")
+        }
+        packet := protocol.NewRequestMsgPacket(num)
+        cl.Connection.Send(packet)
 
+        receivedMsgPacket,active := cl.Connection.Receive()
+        if !active{
+            return
+        }
+        serverMessagePacket := protocol.UnmarshalServerMessagePacket(receivedMsgPacket.Body)
+        senderCert := getUserCert(cl, serverMessagePacket.FromUID)
+        decryptedSubjectBytes := clientKeyStore.DecryptMessageContent(senderCert, serverMessagePacket.Subject)
+        decryptedBodyBytes := clientKeyStore.DecryptMessageContent(senderCert, serverMessagePacket.Body)
+        subject := Unmarshal(decryptedSubjectBytes)
+        body := Unmarshal(decryptedBodyBytes)
+        message := newClientMessage(serverMessagePacket.FromUID, serverMessagePacket.ToUID, subject, body, serverMessagePacket.Timestamp)
+        showMessage(message)
+            
 	case "help":
 		showHelp()
 
@@ -163,7 +157,6 @@ func getManyMessagesInfo(cl networking.Client[protocol.Packet]) ([]protocol.Serv
 	//Get senders' certificates
 	for senderUID := range senderSet {
 		senderCert := getUserCert(cl, senderUID)
-        fmt.Println("Got a User cert")
 		certificatesMap[senderUID] = senderCert
 	}
 	return serverMessageInfoPackets, certificatesMap
diff --git a/Projs/PD1/internal/server/datastore.go b/Projs/PD1/internal/server/datastore.go
index 75e54e9..9229077 100644
--- a/Projs/PD1/internal/server/datastore.go
+++ b/Projs/PD1/internal/server/datastore.go
@@ -63,7 +63,6 @@ func (ds DataStore) GetMessage(toUID string, position int) protocol.Packet {
         SELECT fromUID, toUID, subject, body, timestamp
         FROM messages
         WHERE toUID = ?
-        AND status = 0
         ORDER BY timestamp
         LIMIT 1 OFFSET ?
     `
@@ -81,10 +80,14 @@ func (ds DataStore) GetMessage(toUID string, position int) protocol.Packet {
 func (ds DataStore) MarkMessageInQueueAsRead(toUID string, position int) {
 	query := `
         UPDATE messages
-        SET status = 1
-        WHERE toUID = ? AND status = 0
-        ORDER BY timestamp
-        LIMIT 1 OFFSET ?
+            SET status = 1
+            WHERE (fromUID,toUID,timestamp) = (
+                SELECT fromUID,toUID,timestamp
+                FROM messages
+                WHERE toUID = ?
+                ORDER BY timestamp
+                LIMIT 1 OFFSET ?
+            )
     `
 
 	// Execute the SQL statement
diff --git a/Projs/PD1/internal/server/server.go b/Projs/PD1/internal/server/server.go
index ba22925..1f2863a 100644
--- a/Projs/PD1/internal/server/server.go
+++ b/Projs/PD1/internal/server/server.go
@@ -48,6 +48,7 @@ F:
 			if active := connection.Send(message); !active {
 				break F
 			}
+            dataStore.MarkMessageInQueueAsRead(UID, reqMsg.Num)
 		case protocol.SubmitMsgPkt:
 			submitMsg := protocol.UnmarshalSubmitMessagePacket(pac.Body)
 			if submitMsg.ToUID != UID && dataStore.userExists(submitMsg.ToUID) {
diff --git a/Projs/PD1/server.db b/Projs/PD1/server.db
index 649678698dfe3251187c804538aa52326f6c92f8..b5ed3b148273dff98bb8afe342732e7866c2a5a9 100644
GIT binary patch
delta 4612
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

delta 48
zcmZo@U}{*vI6<0~n}LCWb)tejBlpIH1^SBu1bDcBB8>c37=Vanv!KEW{>fMTbpRV*
B3_t(?