package Seeder
|
|
|
|
import (
|
|
"encoding/base64"
|
|
|
|
"git.tovijaeschke.xyz/tovi/Capsule/Backend/Database"
|
|
"git.tovijaeschke.xyz/tovi/Capsule/Backend/Models"
|
|
|
|
"github.com/gofrs/uuid"
|
|
)
|
|
|
|
func seedMessage(
|
|
primaryUser, secondaryUser Models.User,
|
|
primaryUserAssociationKey, secondaryUserAssociationKey string,
|
|
i int,
|
|
) error {
|
|
var (
|
|
message Models.Message
|
|
messageData Models.MessageData
|
|
key, userKey AesKey
|
|
keyCiphertext []byte
|
|
plaintext string
|
|
dataCiphertext []byte
|
|
senderIDCiphertext []byte
|
|
err error
|
|
)
|
|
|
|
plaintext = "Test Message"
|
|
|
|
userKey, err = GenerateAesKey()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
key, err = GenerateAesKey()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
dataCiphertext, err = key.AesEncrypt([]byte(plaintext))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
senderIDCiphertext, err = key.AesEncrypt([]byte(primaryUser.ID.String()))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if i%2 == 0 {
|
|
senderIDCiphertext, err = key.AesEncrypt([]byte(secondaryUser.ID.String()))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
keyCiphertext, err = userKey.AesEncrypt(
|
|
[]byte(base64.StdEncoding.EncodeToString(key.Key)),
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
messageData = Models.MessageData{
|
|
Data: base64.StdEncoding.EncodeToString(dataCiphertext),
|
|
SenderID: base64.StdEncoding.EncodeToString(senderIDCiphertext),
|
|
SymmetricKey: base64.StdEncoding.EncodeToString(keyCiphertext),
|
|
}
|
|
|
|
message = Models.Message{
|
|
MessageData: messageData,
|
|
SymmetricKey: base64.StdEncoding.EncodeToString(
|
|
EncryptWithPublicKey(userKey.Key, decodedPublicKey),
|
|
),
|
|
AssociationKey: primaryUserAssociationKey,
|
|
}
|
|
|
|
err = Database.CreateMessage(&message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
message = Models.Message{
|
|
MessageData: messageData,
|
|
SymmetricKey: base64.StdEncoding.EncodeToString(
|
|
EncryptWithPublicKey(userKey.Key, decodedPublicKey),
|
|
),
|
|
AssociationKey: secondaryUserAssociationKey,
|
|
}
|
|
|
|
return Database.CreateMessage(&message)
|
|
}
|
|
|
|
func seedConversationDetail(key AesKey) (Models.ConversationDetail, error) {
|
|
var (
|
|
conversationDetail Models.ConversationDetail
|
|
name string
|
|
nameCiphertext []byte
|
|
falseCiphertext []byte
|
|
trueCiphertext []byte
|
|
err error
|
|
)
|
|
|
|
name = "Test Conversation"
|
|
|
|
nameCiphertext, err = key.AesEncrypt([]byte(name))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
falseCiphertext, err = key.AesEncrypt([]byte("false"))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
trueCiphertext, err = key.AesEncrypt([]byte("true"))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
conversationDetail = Models.ConversationDetail{
|
|
Name: base64.StdEncoding.EncodeToString(nameCiphertext),
|
|
TwoUser: base64.StdEncoding.EncodeToString(falseCiphertext),
|
|
AdminAddMembers: base64.StdEncoding.EncodeToString(trueCiphertext),
|
|
AdminEditInfo: base64.StdEncoding.EncodeToString(trueCiphertext),
|
|
AdminSendMessages: base64.StdEncoding.EncodeToString(falseCiphertext),
|
|
}
|
|
|
|
err = Database.CreateConversationDetail(&conversationDetail)
|
|
return conversationDetail, err
|
|
}
|
|
|
|
func seedUserConversation(
|
|
user Models.User,
|
|
threadID uuid.UUID,
|
|
key AesKey,
|
|
) (Models.UserConversation, error) {
|
|
var (
|
|
messageThreadUser Models.UserConversation
|
|
conversationDetailIDCiphertext []byte
|
|
adminCiphertext []byte
|
|
err error
|
|
)
|
|
|
|
conversationDetailIDCiphertext, err = key.AesEncrypt([]byte(threadID.String()))
|
|
if err != nil {
|
|
return messageThreadUser, err
|
|
}
|
|
|
|
adminCiphertext, err = key.AesEncrypt([]byte("true"))
|
|
if err != nil {
|
|
return messageThreadUser, err
|
|
}
|
|
|
|
messageThreadUser = Models.UserConversation{
|
|
UserID: user.ID,
|
|
ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
|
|
Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
|
|
SymmetricKey: base64.StdEncoding.EncodeToString(
|
|
EncryptWithPublicKey(key.Key, decodedPublicKey),
|
|
),
|
|
}
|
|
|
|
err = Database.CreateUserConversation(&messageThreadUser)
|
|
return messageThreadUser, err
|
|
}
|
|
|
|
func seedConversationDetailUser(
|
|
user Models.User,
|
|
conversationDetail Models.ConversationDetail,
|
|
associationKey uuid.UUID,
|
|
admin bool,
|
|
key AesKey,
|
|
) (Models.ConversationDetailUser, error) {
|
|
var (
|
|
conversationDetailUser Models.ConversationDetailUser
|
|
|
|
userIDCiphertext []byte
|
|
usernameCiphertext []byte
|
|
adminCiphertext []byte
|
|
associationKeyCiphertext []byte
|
|
publicKeyCiphertext []byte
|
|
|
|
adminString = "false"
|
|
|
|
err error
|
|
)
|
|
|
|
if admin {
|
|
adminString = "true"
|
|
}
|
|
|
|
userIDCiphertext, err = key.AesEncrypt([]byte(user.ID.String()))
|
|
if err != nil {
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
usernameCiphertext, err = key.AesEncrypt([]byte(user.Username))
|
|
if err != nil {
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
adminCiphertext, err = key.AesEncrypt([]byte(adminString))
|
|
if err != nil {
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
associationKeyCiphertext, err = key.AesEncrypt([]byte(associationKey.String()))
|
|
if err != nil {
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
publicKeyCiphertext, err = key.AesEncrypt([]byte(user.AsymmetricPublicKey))
|
|
if err != nil {
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
conversationDetailUser = Models.ConversationDetailUser{
|
|
ConversationDetailID: conversationDetail.ID,
|
|
UserID: base64.StdEncoding.EncodeToString(userIDCiphertext),
|
|
Username: base64.StdEncoding.EncodeToString(usernameCiphertext),
|
|
Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
|
|
AssociationKey: base64.StdEncoding.EncodeToString(associationKeyCiphertext),
|
|
PublicKey: base64.StdEncoding.EncodeToString(publicKeyCiphertext),
|
|
}
|
|
|
|
err = Database.CreateConversationDetailUser(&conversationDetailUser)
|
|
|
|
return conversationDetailUser, err
|
|
}
|
|
|
|
// SeedMessages seeds messages & conversations for testing
|
|
func SeedMessages() {
|
|
var (
|
|
conversationDetail Models.ConversationDetail
|
|
key AesKey
|
|
primaryUser Models.User
|
|
primaryUserAssociationKey uuid.UUID
|
|
secondaryUser Models.User
|
|
secondaryUserAssociationKey uuid.UUID
|
|
i int
|
|
err error
|
|
)
|
|
|
|
key, err = GenerateAesKey()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
conversationDetail, err = seedConversationDetail(key)
|
|
|
|
primaryUserAssociationKey, err = uuid.NewV4()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
secondaryUserAssociationKey, err = uuid.NewV4()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
primaryUser, err = Database.GetUserByUsername("testUser")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
_, err = seedUserConversation(
|
|
primaryUser,
|
|
conversationDetail.ID,
|
|
key,
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
secondaryUser, err = Database.GetUserByUsername("ATestUser2")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
_, err = seedUserConversation(
|
|
secondaryUser,
|
|
conversationDetail.ID,
|
|
key,
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
_, err = seedConversationDetailUser(
|
|
primaryUser,
|
|
conversationDetail,
|
|
primaryUserAssociationKey,
|
|
true,
|
|
key,
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
_, err = seedConversationDetailUser(
|
|
secondaryUser,
|
|
conversationDetail,
|
|
secondaryUserAssociationKey,
|
|
false,
|
|
key,
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
for i = 0; i <= 100; i++ {
|
|
err = seedMessage(
|
|
primaryUser,
|
|
secondaryUser,
|
|
primaryUserAssociationKey.String(),
|
|
secondaryUserAssociationKey.String(),
|
|
i,
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|