v.0.0.4.4 Добавлено шифрование сообщения
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
ca1771d761
commit
fe9f706e1b
84
server.go
84
server.go
@ -276,7 +276,7 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
|
||||
var chat proto.Chat
|
||||
var createdAt, updatedAt time.Time
|
||||
var lastMessageID sql.NullInt32
|
||||
var lastMessageContent sql.NullString
|
||||
var lastMessageContent, lastMessageEncryptedKey, lastMessageNonce []byte
|
||||
var lastMessageStatus sql.NullString
|
||||
var lastMessageCreatedAt sql.NullTime
|
||||
|
||||
@ -287,17 +287,18 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
|
||||
|
||||
s.logger.Printf("Querying chat between users %d and %d", user1, user2)
|
||||
err := s.db.QueryRow(ctx, `
|
||||
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
|
||||
m.id, m.content, m.status, m.created_at
|
||||
FROM chats c
|
||||
LEFT JOIN messages m ON m.id = (
|
||||
SELECT id FROM messages WHERE chat_id = c.id
|
||||
ORDER BY created_at DESC LIMIT 1
|
||||
)
|
||||
WHERE c.user1_id = $1 AND c.user2_id = $2
|
||||
`, user1, user2).Scan(
|
||||
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
|
||||
m.id, m.content, m.encrypted_key, m.nonce, m.status, m.created_at
|
||||
FROM chats c
|
||||
LEFT JOIN messages m ON m.id = (
|
||||
SELECT id FROM messages WHERE chat_id = c.id
|
||||
ORDER BY created_at DESC LIMIT 1
|
||||
)
|
||||
WHERE c.user1_id = $1 AND c.user2_id = $2
|
||||
`, user1, user2).Scan(
|
||||
&chat.Id, &chat.User1Id, &chat.User2Id, &createdAt, &updatedAt,
|
||||
&lastMessageID, &lastMessageContent, &lastMessageStatus, &lastMessageCreatedAt,
|
||||
&lastMessageID, &lastMessageContent, &lastMessageEncryptedKey,
|
||||
&lastMessageNonce, &lastMessageStatus, &lastMessageCreatedAt,
|
||||
)
|
||||
if err != nil {
|
||||
s.logger.Printf("Failed to get chat: %v", err)
|
||||
@ -308,14 +309,28 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
|
||||
chat.UpdatedAt = timestamppb.New(updatedAt)
|
||||
|
||||
if lastMessageID.Valid {
|
||||
// Расшифровываем последнее сообщение
|
||||
var decryptedContent string
|
||||
if len(lastMessageContent) > 0 && len(lastMessageEncryptedKey) > 0 && len(lastMessageNonce) > 0 {
|
||||
decrypted, err := s.crypto.DecryptMessage(lastMessageContent, lastMessageEncryptedKey, lastMessageNonce)
|
||||
if err != nil {
|
||||
s.logger.Printf("Failed to decrypt last message %d: %v", lastMessageID.Int32, err)
|
||||
decryptedContent = "[encrypted message]"
|
||||
} else {
|
||||
decryptedContent = decrypted
|
||||
}
|
||||
} else {
|
||||
decryptedContent = "[no message]"
|
||||
}
|
||||
|
||||
chat.LastMessage = &proto.Message{
|
||||
Id: lastMessageID.Int32,
|
||||
ChatId: chat.Id,
|
||||
Content: lastMessageContent.String,
|
||||
Content: decryptedContent,
|
||||
Status: lastMessageStatus.String,
|
||||
CreatedAt: timestamppb.New(lastMessageCreatedAt.Time),
|
||||
}
|
||||
s.logger.Printf("Found last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
|
||||
s.logger.Printf("Found and decrypted last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
|
||||
}
|
||||
|
||||
resp := &proto.ChatResponse{Chat: &chat}
|
||||
@ -390,16 +405,16 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
|
||||
|
||||
s.logger.Printf("Querying chats for user_id=%d", req.UserId)
|
||||
rows, err := s.db.Query(ctx, `
|
||||
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
|
||||
m.id, m.content, m.status, m.created_at
|
||||
FROM chats c
|
||||
LEFT JOIN messages m ON m.id = (
|
||||
SELECT id FROM messages WHERE chat_id = c.id
|
||||
ORDER BY created_at DESC LIMIT 1
|
||||
)
|
||||
WHERE c.user1_id = $1 OR c.user2_id = $1
|
||||
ORDER BY c.updated_at DESC
|
||||
`, req.UserId)
|
||||
SELECT c.id, c.user1_id, c.user2_id, c.created_at, c.updated_at,
|
||||
m.id, m.content, m.encrypted_key, m.nonce, m.status, m.created_at
|
||||
FROM chats c
|
||||
LEFT JOIN messages m ON m.id = (
|
||||
SELECT id FROM messages WHERE chat_id = c.id
|
||||
ORDER BY created_at DESC LIMIT 1
|
||||
)
|
||||
WHERE c.user1_id = $1 OR c.user2_id = $1
|
||||
ORDER BY c.updated_at DESC
|
||||
`, req.UserId)
|
||||
if err != nil {
|
||||
s.logger.Printf("Failed to query user chats: %v", err)
|
||||
return nil, err
|
||||
@ -411,13 +426,14 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
|
||||
var chat proto.Chat
|
||||
var createdAt, updatedAt time.Time
|
||||
var lastMessageID sql.NullInt32
|
||||
var lastMessageContent sql.NullString
|
||||
var lastMessageContent, lastMessageEncryptedKey, lastMessageNonce []byte
|
||||
var lastMessageStatus sql.NullString
|
||||
var lastMessageCreatedAt sql.NullTime
|
||||
|
||||
err := rows.Scan(
|
||||
&chat.Id, &chat.User1Id, &chat.User2Id, &createdAt, &updatedAt,
|
||||
&lastMessageID, &lastMessageContent, &lastMessageStatus, &lastMessageCreatedAt,
|
||||
&lastMessageID, &lastMessageContent, &lastMessageEncryptedKey,
|
||||
&lastMessageNonce, &lastMessageStatus, &lastMessageCreatedAt,
|
||||
)
|
||||
if err != nil {
|
||||
s.logger.Printf("Failed to scan chat row: %v", err)
|
||||
@ -428,14 +444,28 @@ func (s *server) GetUserChats(ctx context.Context, req *proto.GetUserChatsReques
|
||||
chat.UpdatedAt = timestamppb.New(updatedAt)
|
||||
|
||||
if lastMessageID.Valid {
|
||||
// Расшифровываем последнее сообщение
|
||||
var decryptedContent string
|
||||
if len(lastMessageContent) > 0 && len(lastMessageEncryptedKey) > 0 && len(lastMessageNonce) > 0 {
|
||||
decrypted, err := s.crypto.DecryptMessage(lastMessageContent, lastMessageEncryptedKey, lastMessageNonce)
|
||||
if err != nil {
|
||||
s.logger.Printf("Failed to decrypt last message %d: %v", lastMessageID.Int32, err)
|
||||
decryptedContent = "[encrypted message]"
|
||||
} else {
|
||||
decryptedContent = decrypted
|
||||
}
|
||||
} else {
|
||||
decryptedContent = "[no message]"
|
||||
}
|
||||
|
||||
chat.LastMessage = &proto.Message{
|
||||
Id: lastMessageID.Int32,
|
||||
ChatId: chat.Id,
|
||||
Content: lastMessageContent.String,
|
||||
Content: decryptedContent,
|
||||
Status: lastMessageStatus.String,
|
||||
CreatedAt: timestamppb.New(lastMessageCreatedAt.Time),
|
||||
}
|
||||
s.logger.Printf("Found last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
|
||||
s.logger.Printf("Found and decrypted last message for chat %d: message_id=%d", chat.Id, lastMessageID.Int32)
|
||||
}
|
||||
|
||||
chats = append(chats, &chat)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user