package Seeder import ( "encoding/base64" "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database" "git.tovijaeschke.xyz/tovi/Envelope/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 ( messageThread Models.ConversationDetail name string nameCiphertext []byte twoUserCiphertext []byte err error ) name = "Test Conversation" nameCiphertext, err = key.aesEncrypt([]byte(name)) if err != nil { panic(err) } twoUserCiphertext, err = key.aesEncrypt([]byte("false")) if err != nil { panic(err) } messageThread = Models.ConversationDetail{ Name: base64.StdEncoding.EncodeToString(nameCiphertext), TwoUser: base64.StdEncoding.EncodeToString(twoUserCiphertext), } err = Database.CreateConversationDetail(&messageThread) return messageThread, 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 <= 20; i++ { err = seedMessage( primaryUser, secondaryUser, primaryUserAssociationKey.String(), secondaryUserAssociationKey.String(), i, ) if err != nil { panic(err) } } }