|
|
- package Seeder
-
- import (
- "encoding/base64"
- "fmt"
-
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Util"
- "github.com/gofrs/uuid"
- )
-
- func seedMessage(
- primaryUser Models.User,
- primaryUserThreadKey, secondaryUserThreadKey string,
- thread Models.ConversationDetail,
- i int,
- ) error {
- var (
- message Models.Message
- messageData Models.MessageData
- key aesKey
- plaintext string
- dataCiphertext []byte
- senderIdCiphertext []byte
- err error
- )
-
- key, err = generateAesKey()
- if err != nil {
- panic(err)
- }
-
- plaintext = "Test Message"
-
- dataCiphertext, err = key.aesEncrypt([]byte(plaintext))
- if err != nil {
- panic(err)
- }
-
- senderIdCiphertext, err = key.aesEncrypt(primaryUser.ID.Bytes())
- if err != nil {
- panic(err)
- }
-
- messageData = Models.MessageData{
- Data: base64.StdEncoding.EncodeToString(dataCiphertext),
- SenderID: base64.StdEncoding.EncodeToString(senderIdCiphertext),
- }
-
- message = Models.Message{
- MessageData: messageData,
- SymmetricKey: base64.StdEncoding.EncodeToString(
- encryptWithPublicKey(key.Key, decodedPublicKey),
- ),
- MessageThreadKey: primaryUserThreadKey,
- }
-
- err = Database.CreateMessage(&message)
- if err != nil {
- return err
- }
-
- // The symmetric key would be encrypted with secondary users public key in production
- // But due to using the same pub/priv key pair for all users, we will just duplicate it
- message = Models.Message{
- MessageDataID: message.MessageDataID,
- SymmetricKey: base64.StdEncoding.EncodeToString(
- encryptWithPublicKey(key.Key, decodedPublicKey),
- ),
- MessageThreadKey: secondaryUserThreadKey,
- }
-
- err = Database.CreateMessage(&message)
- if err != nil {
- return err
- }
-
- return err
- }
-
- 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,
- messageThreadKey string,
- key aesKey,
- ) (Models.UserConversation, error) {
- var (
- messageThreadUser Models.UserConversation
- threadIdCiphertext []byte
- keyCiphertext []byte
- adminCiphertext []byte
- err error
- )
-
- threadIdCiphertext, err = key.aesEncrypt([]byte(threadID.String()))
- if err != nil {
- return messageThreadUser, err
- }
-
- keyCiphertext, err = key.aesEncrypt([]byte(messageThreadKey))
- 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),
- MessageThreadKey: base64.StdEncoding.EncodeToString(keyCiphertext),
- 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
- primaryUserThreadKey string
- secondaryUser Models.User
- secondaryUserThreadKey string
-
- userJson string
-
- thread Models.ConversationDetail
- i int
- err error
- )
-
- key, err = generateAesKey()
- messageThread, err = seedConversationDetail(key)
- primaryUserThreadKey = Util.RandomString(32)
- secondaryUserThreadKey = Util.RandomString(32)
-
- primaryUser, err = Database.GetUserByUsername("testUser")
- if err != nil {
- panic(err)
- }
-
- _, err = seedUserConversation(
- primaryUser,
- messageThread.ID,
- primaryUserThreadKey,
- key,
- )
-
- secondaryUser, err = Database.GetUserByUsername("testUser2")
- if err != nil {
- panic(err)
- }
-
- _, err = seedUserConversation(
- secondaryUser,
- messageThread.ID,
- secondaryUserThreadKey,
- key,
- )
-
- userJson = fmt.Sprintf(
- `
- [
- {
- "id": "%s",
- "username": "%s",
- "admin": "true"
- },
- {
- "id": "%s",
- "username": "%s",
- "admin": "true"
- }
- ]
- `,
- primaryUser.ID.String(),
- primaryUser.Username,
- secondaryUser.ID.String(),
- secondaryUser.Username,
- )
-
- messageThread, err = seedUpdateUserConversation(
- userJson,
- key,
- messageThread,
- )
-
- for i = 0; i <= 20; i++ {
- err = seedMessage(
- primaryUser,
- primaryUserThreadKey,
- secondaryUserThreadKey,
- thread,
- i,
- )
- if err != nil {
- panic(err)
- }
- }
- }
|