package Seeder import ( "encoding/base64" "fmt" "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 err error ) name = "Test Conversation" nameCiphertext, err = key.aesEncrypt([]byte(name)) if err != nil { panic(err) } messageThread = Models.ConversationDetail{ Name: base64.StdEncoding.EncodeToString(nameCiphertext), } err = Database.CreateConversationDetail(&messageThread) return messageThread, err } func seedUpdateUserConversation( userJson string, key aesKey, messageThread Models.ConversationDetail, ) (Models.ConversationDetail, error) { var ( usersCiphertext []byte err error ) usersCiphertext, err = key.aesEncrypt([]byte(userJson)) if err != nil { return messageThread, err } messageThread.Users = base64.StdEncoding.EncodeToString(usersCiphertext) err = Database.UpdateConversationDetail(&messageThread) return messageThread, err } func seedUserConversation( user Models.User, threadID uuid.UUID, key aesKey, ) (Models.UserConversation, error) { var ( messageThreadUser Models.UserConversation threadIdCiphertext []byte adminCiphertext []byte err error ) threadIdCiphertext, 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(threadIdCiphertext), Admin: base64.StdEncoding.EncodeToString(adminCiphertext), SymmetricKey: base64.StdEncoding.EncodeToString( encryptWithPublicKey(key.Key, decodedPublicKey), ), } err = Database.CreateUserConversation(&messageThreadUser) return messageThreadUser, err } func SeedMessages() { var ( messageThread Models.ConversationDetail key aesKey primaryUser Models.User primaryUserAssociationKey uuid.UUID secondaryUser Models.User secondaryUserAssociationKey uuid.UUID userJson string id1, id2 uuid.UUID i int err error ) key, err = generateAesKey() if err != nil { panic(err) } messageThread, 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, messageThread.ID, key, ) if err != nil { panic(err) } secondaryUser, err = Database.GetUserByUsername("ATestUser2") if err != nil { panic(err) } _, err = seedUserConversation( secondaryUser, messageThread.ID, key, ) id1, err = uuid.NewV4() if err != nil { panic(err) } id2, err = uuid.NewV4() if err != nil { panic(err) } userJson = fmt.Sprintf( ` [ { "id": "%s", "user_id": "%s", "username": "%s", "admin": "true", "association_key": "%s" }, { "id": "%s", "user_id": "%s", "username": "%s", "admin": "false", "association_key": "%s" } ] `, id1.String(), primaryUser.ID.String(), primaryUser.Username, primaryUserAssociationKey.String(), id2.String(), secondaryUser.ID.String(), secondaryUser.Username, secondaryUserAssociationKey.String(), ) messageThread, err = seedUpdateUserConversation( userJson, key, messageThread, ) for i = 0; i <= 20; i++ { err = seedMessage( primaryUser, secondaryUser, primaryUserAssociationKey.String(), secondaryUserAssociationKey.String(), i, ) if err != nil { panic(err) } } }