Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
5.3 KiB

  1. package Seeder
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  6. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
  7. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Util"
  8. "github.com/gofrs/uuid"
  9. )
  10. func seedMessage(
  11. primaryUser Models.User,
  12. primaryUserThreadKey, secondaryUserThreadKey string,
  13. thread Models.ConversationDetail,
  14. i int,
  15. ) error {
  16. var (
  17. message Models.Message
  18. messageData Models.MessageData
  19. key aesKey
  20. plaintext string
  21. dataCiphertext []byte
  22. senderIdCiphertext []byte
  23. err error
  24. )
  25. key, err = generateAesKey()
  26. if err != nil {
  27. panic(err)
  28. }
  29. plaintext = "Test Message"
  30. dataCiphertext, err = key.aesEncrypt([]byte(plaintext))
  31. if err != nil {
  32. panic(err)
  33. }
  34. senderIdCiphertext, err = key.aesEncrypt(primaryUser.ID.Bytes())
  35. if err != nil {
  36. panic(err)
  37. }
  38. messageData = Models.MessageData{
  39. Data: base64.StdEncoding.EncodeToString(dataCiphertext),
  40. SenderID: base64.StdEncoding.EncodeToString(senderIdCiphertext),
  41. }
  42. message = Models.Message{
  43. MessageData: messageData,
  44. SymmetricKey: base64.StdEncoding.EncodeToString(
  45. encryptWithPublicKey(key.Key, decodedPublicKey),
  46. ),
  47. MessageThreadKey: primaryUserThreadKey,
  48. }
  49. err = Database.CreateMessage(&message)
  50. if err != nil {
  51. return err
  52. }
  53. // The symmetric key would be encrypted with secondary users public key in production
  54. // But due to using the same pub/priv key pair for all users, we will just duplicate it
  55. message = Models.Message{
  56. MessageDataID: message.MessageDataID,
  57. SymmetricKey: base64.StdEncoding.EncodeToString(
  58. encryptWithPublicKey(key.Key, decodedPublicKey),
  59. ),
  60. MessageThreadKey: secondaryUserThreadKey,
  61. }
  62. err = Database.CreateMessage(&message)
  63. if err != nil {
  64. return err
  65. }
  66. return err
  67. }
  68. func seedConversationDetail(key aesKey) (Models.ConversationDetail, error) {
  69. var (
  70. messageThread Models.ConversationDetail
  71. name string
  72. nameCiphertext []byte
  73. err error
  74. )
  75. name = "Test Conversation"
  76. nameCiphertext, err = key.aesEncrypt([]byte(name))
  77. if err != nil {
  78. panic(err)
  79. }
  80. messageThread = Models.ConversationDetail{
  81. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  82. }
  83. err = Database.CreateConversationDetail(&messageThread)
  84. return messageThread, err
  85. }
  86. func seedUpdateUserConversation(
  87. userJson string,
  88. key aesKey,
  89. messageThread Models.ConversationDetail,
  90. ) (Models.ConversationDetail, error) {
  91. var (
  92. usersCiphertext []byte
  93. err error
  94. )
  95. usersCiphertext, err = key.aesEncrypt([]byte(userJson))
  96. if err != nil {
  97. return messageThread, err
  98. }
  99. messageThread.Users = base64.StdEncoding.EncodeToString(usersCiphertext)
  100. err = Database.UpdateConversationDetail(&messageThread)
  101. return messageThread, err
  102. }
  103. func seedUserConversation(
  104. user Models.User,
  105. threadID uuid.UUID,
  106. messageThreadKey string,
  107. key aesKey,
  108. ) (Models.UserConversation, error) {
  109. var (
  110. messageThreadUser Models.UserConversation
  111. threadIdCiphertext []byte
  112. keyCiphertext []byte
  113. adminCiphertext []byte
  114. err error
  115. )
  116. threadIdCiphertext, err = key.aesEncrypt([]byte(threadID.String()))
  117. if err != nil {
  118. return messageThreadUser, err
  119. }
  120. keyCiphertext, err = key.aesEncrypt([]byte(messageThreadKey))
  121. if err != nil {
  122. return messageThreadUser, err
  123. }
  124. adminCiphertext, err = key.aesEncrypt([]byte("true"))
  125. if err != nil {
  126. return messageThreadUser, err
  127. }
  128. messageThreadUser = Models.UserConversation{
  129. UserID: user.ID,
  130. ConversationDetailID: base64.StdEncoding.EncodeToString(threadIdCiphertext),
  131. MessageThreadKey: base64.StdEncoding.EncodeToString(keyCiphertext),
  132. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  133. SymmetricKey: base64.StdEncoding.EncodeToString(
  134. encryptWithPublicKey(key.Key, decodedPublicKey),
  135. ),
  136. }
  137. err = Database.CreateUserConversation(&messageThreadUser)
  138. return messageThreadUser, err
  139. }
  140. func SeedMessages() {
  141. var (
  142. messageThread Models.ConversationDetail
  143. key aesKey
  144. primaryUser Models.User
  145. primaryUserThreadKey string
  146. secondaryUser Models.User
  147. secondaryUserThreadKey string
  148. userJson string
  149. thread Models.ConversationDetail
  150. i int
  151. err error
  152. )
  153. key, err = generateAesKey()
  154. messageThread, err = seedConversationDetail(key)
  155. primaryUserThreadKey = Util.RandomString(32)
  156. secondaryUserThreadKey = Util.RandomString(32)
  157. primaryUser, err = Database.GetUserByUsername("testUser")
  158. if err != nil {
  159. panic(err)
  160. }
  161. _, err = seedUserConversation(
  162. primaryUser,
  163. messageThread.ID,
  164. primaryUserThreadKey,
  165. key,
  166. )
  167. secondaryUser, err = Database.GetUserByUsername("testUser2")
  168. if err != nil {
  169. panic(err)
  170. }
  171. _, err = seedUserConversation(
  172. secondaryUser,
  173. messageThread.ID,
  174. secondaryUserThreadKey,
  175. key,
  176. )
  177. userJson = fmt.Sprintf(
  178. `
  179. [
  180. {
  181. "id": "%s",
  182. "username": "%s",
  183. "admin": "true"
  184. },
  185. {
  186. "id": "%s",
  187. "username": "%s",
  188. "admin": "true"
  189. }
  190. ]
  191. `,
  192. primaryUser.ID.String(),
  193. primaryUser.Username,
  194. secondaryUser.ID.String(),
  195. secondaryUser.Username,
  196. )
  197. messageThread, err = seedUpdateUserConversation(
  198. userJson,
  199. key,
  200. messageThread,
  201. )
  202. for i = 0; i <= 20; i++ {
  203. err = seedMessage(
  204. primaryUser,
  205. primaryUserThreadKey,
  206. secondaryUserThreadKey,
  207. thread,
  208. i,
  209. )
  210. if err != nil {
  211. panic(err)
  212. }
  213. }
  214. }