[PD1] small changes
This commit is contained in:
parent
568b6e6739
commit
2cafc3163c
10 changed files with 160 additions and 71 deletions
|
@ -88,8 +88,10 @@ func (ds DataStore) GetMessage(toUID string, position int) protocol.Packet {
|
|||
// Execute the query
|
||||
row := ds.db.QueryRow(query, toUID, position)
|
||||
err := row.Scan(&serverMessage.FromUID, &serverMessage.ToUID, &serverMessage.Subject, &serverMessage.Body, &serverMessage.Timestamp)
|
||||
if err != nil {
|
||||
log.Printf("Error getting the message in position %v from UID %v: %v", position, toUID, err)
|
||||
if err == sql.ErrNoRows {
|
||||
log.Printf("No message with NUM %v for UID %v\n", position, toUID)
|
||||
errorMessage := fmt.Sprintf("No message with NUM %v", position)
|
||||
return protocol.NewReportErrorPacket(errorMessage)
|
||||
}
|
||||
|
||||
return protocol.NewAnswerGetMsgPacket(serverMessage.FromUID, serverMessage.ToUID, serverMessage.Subject, serverMessage.Body, serverMessage.Timestamp, true)
|
||||
|
@ -119,8 +121,9 @@ func (ds DataStore) GetUnreadMsgsInfo(toUID string, page int, pageSize int) prot
|
|||
// Retrieve the total count of unread messages
|
||||
var totalCount int
|
||||
err := ds.db.QueryRow("SELECT COUNT(*) FROM messages WHERE toUID = ? AND status = 0", toUID).Scan(&totalCount)
|
||||
if err != nil {
|
||||
log.Printf("Error getting total count of unread messages for UID %v: %v", toUID, err)
|
||||
if err == sql.ErrNoRows {
|
||||
log.Printf("No unread messages for UID %v: %v", toUID, err)
|
||||
return protocol.NewAnswerGetUnreadMsgsInfoPacket(0, 0, []protocol.MsgInfo{})
|
||||
}
|
||||
|
||||
// Query to retrieve all messages from the user's queue
|
||||
|
@ -143,7 +146,7 @@ func (ds DataStore) GetUnreadMsgsInfo(toUID string, page int, pageSize int) prot
|
|||
// Execute the query
|
||||
rows, err := ds.db.Query(query, toUID, pageSize, (page-1)*pageSize)
|
||||
if err != nil {
|
||||
log.Printf("Error getting all messages for UID %v: %v", toUID, err)
|
||||
log.Printf("Error getting unread messages for UID %v: %v", toUID, err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
|
@ -161,6 +164,7 @@ func (ds DataStore) GetUnreadMsgsInfo(toUID string, page int, pageSize int) prot
|
|||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
log.Printf("Error when getting messages for UID %v: %v", toUID, err)
|
||||
return protocol.NewReportErrorPacket(err.Error())
|
||||
}
|
||||
|
||||
numberOfPages := (totalCount + pageSize - 1) / pageSize
|
||||
|
@ -168,7 +172,7 @@ func (ds DataStore) GetUnreadMsgsInfo(toUID string, page int, pageSize int) prot
|
|||
return protocol.NewAnswerGetUnreadMsgsInfoPacket(currentPage, numberOfPages, messageInfoPackets)
|
||||
}
|
||||
|
||||
func (ds DataStore) AddMessageToQueue(fromUID string, message protocol.SendMsg) {
|
||||
func (ds DataStore) AddMessageToQueue(fromUID string, message protocol.SendMsg) protocol.Packet {
|
||||
query := `
|
||||
INSERT INTO messages (fromUID, toUID, subject, body, timestamp, status)
|
||||
VALUES (?, ?, ?, ?, ?, 0)
|
||||
|
@ -179,7 +183,9 @@ func (ds DataStore) AddMessageToQueue(fromUID string, message protocol.SendMsg)
|
|||
_, err := ds.db.Exec(query, fromUID, message.ToUID, message.Subject, message.Body, currentTime)
|
||||
if err != nil {
|
||||
log.Printf("Error adding message to UID %v: %v", fromUID, err)
|
||||
return protocol.NewReportErrorPacket(err.Error())
|
||||
}
|
||||
return protocol.NewAnswerSendMsgPacket()
|
||||
}
|
||||
|
||||
func (ds DataStore) GetUserCertificate(uid string) protocol.Packet {
|
||||
|
@ -193,12 +199,10 @@ func (ds DataStore) GetUserCertificate(uid string) protocol.Packet {
|
|||
var userCertBytes []byte
|
||||
err := ds.db.QueryRow(query, uid).Scan(&userCertBytes)
|
||||
if err == sql.ErrNoRows {
|
||||
log.Panicf("No certificate for UID %v found in the database", uid)
|
||||
errorMessage := fmt.Sprintf("No certificate for UID %v found in the database", uid)
|
||||
log.Println(errorMessage)
|
||||
return protocol.NewReportErrorPacket(errorMessage)
|
||||
}
|
||||
//userCert,err := x509.ParseCertificate(userCertBytes)
|
||||
//if err!=nil {
|
||||
// log.Panicf("Error parsing certificate for UID %v",uid)
|
||||
//}
|
||||
return protocol.NewAnswerGetUserCertPacket(uid, userCertBytes)
|
||||
}
|
||||
|
||||
|
@ -224,7 +228,6 @@ func (ds DataStore) userExists(uid string) bool {
|
|||
func (ds DataStore) storeUserCertIfNotExists(uid string, cert x509.Certificate) {
|
||||
// Check if the user already exists
|
||||
if ds.userExists(uid) {
|
||||
log.Printf("User certificate for UID %s already exists.\n", uid)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -6,10 +6,9 @@ import (
|
|||
"os"
|
||||
)
|
||||
|
||||
func AskServerPassword() string {
|
||||
fmt.Println("Enter key store password")
|
||||
func readStdin(message string) string {
|
||||
fmt.Println(message)
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
scanner.Scan()
|
||||
// FIX: make sure this doesnt die
|
||||
return scanner.Text()
|
||||
}
|
||||
|
|
|
@ -4,12 +4,10 @@ import (
|
|||
"PD1/internal/protocol"
|
||||
"PD1/internal/utils/cryptoUtils"
|
||||
"PD1/internal/utils/networking"
|
||||
"log"
|
||||
)
|
||||
|
||||
//TODO: CREATE SERVER SIDE CHECKS FOR EVERYTHING
|
||||
//TODO: LOGGING SYSTEM
|
||||
//TODO: TELL THE USER THAT THE MESSAGE HAS BEEN RECEIVED BY THE SERVER
|
||||
//TODO: ERROR PACKET TO SEND BACK TO USER
|
||||
|
||||
func clientHandler(connection networking.Connection[protocol.Packet], dataStore DataStore) {
|
||||
defer connection.Conn.Close()
|
||||
|
@ -18,10 +16,16 @@ func clientHandler(connection networking.Connection[protocol.Packet], dataStore
|
|||
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.Println("User certificate does not have the correct usage")
|
||||
return
|
||||
}
|
||||
//Get the UID of this user
|
||||
UID := oidMap["2.5.4.65"]
|
||||
if UID == "" {
|
||||
panic("User certificate does not specify it's PSEUDONYM")
|
||||
log.Println("User certificate does not specify it's PSEUDONYM")
|
||||
}
|
||||
dataStore.storeUserCertIfNotExists(UID, *clientCert)
|
||||
F:
|
||||
|
@ -34,31 +38,47 @@ F:
|
|||
case protocol.FlagGetUserCert:
|
||||
reqUserCert := protocol.UnmarshalGetUserCert(pac.Body)
|
||||
userCertPacket := dataStore.GetUserCertificate(reqUserCert.UID)
|
||||
if active := connection.Send(userCertPacket); !active {
|
||||
if !connection.Send(userCertPacket) {
|
||||
break F
|
||||
}
|
||||
case protocol.FlagGetUnreadMsgsInfo:
|
||||
getUnreadMsgsInfo := protocol.UnmarshalGetUnreadMsgsInfo(pac.Body)
|
||||
messages := dataStore.GetUnreadMsgsInfo(UID,getUnreadMsgsInfo.Page,getUnreadMsgsInfo.PageSize)
|
||||
var messages protocol.Packet
|
||||
if getUnreadMsgsInfo.Page <= 0 || getUnreadMsgsInfo.PageSize <= 0 {
|
||||
messages = protocol.NewReportErrorPacket("Page and PageSize need to be >= 1")
|
||||
} else {
|
||||
messages = dataStore.GetUnreadMsgsInfo(UID, getUnreadMsgsInfo.Page, getUnreadMsgsInfo.PageSize)
|
||||
}
|
||||
if !connection.Send(messages) {
|
||||
break F
|
||||
}
|
||||
case protocol.FlagGetMsg:
|
||||
reqMsg := protocol.UnmarshalGetMsg(pac.Body)
|
||||
message := dataStore.GetMessage(UID, reqMsg.Num)
|
||||
if active := connection.Send(message); !active {
|
||||
var message protocol.Packet
|
||||
if reqMsg.Num <= 0 {
|
||||
message = protocol.NewReportErrorPacket("Message NUM needs to be >= 1")
|
||||
} else {
|
||||
message = dataStore.GetMessage(UID, reqMsg.Num)
|
||||
}
|
||||
if !connection.Send(message) {
|
||||
break F
|
||||
}
|
||||
dataStore.MarkMessageInQueueAsRead(UID, reqMsg.Num)
|
||||
case protocol.FlagSendMsg:
|
||||
submitMsg := protocol.UnmarshalSendMsg(pac.Body)
|
||||
if submitMsg.ToUID != UID && dataStore.userExists(submitMsg.ToUID) {
|
||||
dataStore.AddMessageToQueue(UID, submitMsg)
|
||||
var answerSendMsgPacket protocol.Packet
|
||||
if submitMsg.ToUID == UID {
|
||||
answerSendMsgPacket = protocol.NewReportErrorPacket("Cannot message yourself")
|
||||
} else if !dataStore.userExists(submitMsg.ToUID) {
|
||||
answerSendMsgPacket = protocol.NewReportErrorPacket("Message receiver does not exist in database")
|
||||
} else {
|
||||
answerSendMsgPacket = dataStore.AddMessageToQueue(UID, submitMsg)
|
||||
}
|
||||
if !connection.Send(answerSendMsgPacket) {
|
||||
break F
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func Run(port int) {
|
||||
|
@ -69,7 +89,7 @@ func Run(port int) {
|
|||
//FIX: Get the server's keystore path instead of hardcoding it
|
||||
|
||||
//Read server keystore
|
||||
password := AskServerPassword()
|
||||
password := readStdin("Insert keystore passphrase")
|
||||
serverKeyStore := cryptoUtils.LoadKeyStore("certs/server/server.p12", password)
|
||||
|
||||
//Create server listener
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue