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.

283 lines
5.8 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. "github.com/gofrs/uuid"
  8. )
  9. func seedMessage(
  10. primaryUser, secondaryUser Models.User,
  11. primaryUserAssociationKey, secondaryUserAssociationKey string,
  12. i int,
  13. ) error {
  14. var (
  15. message Models.Message
  16. messageData Models.MessageData
  17. key, userKey aesKey
  18. keyCiphertext []byte
  19. plaintext string
  20. dataCiphertext []byte
  21. senderIdCiphertext []byte
  22. err error
  23. )
  24. plaintext = "Test Message"
  25. userKey, err = generateAesKey()
  26. if err != nil {
  27. panic(err)
  28. }
  29. key, err = generateAesKey()
  30. if err != nil {
  31. panic(err)
  32. }
  33. dataCiphertext, err = key.aesEncrypt([]byte(plaintext))
  34. if err != nil {
  35. panic(err)
  36. }
  37. senderIdCiphertext, err = key.aesEncrypt([]byte(primaryUser.ID.String()))
  38. if err != nil {
  39. panic(err)
  40. }
  41. if i%2 == 0 {
  42. senderIdCiphertext, err = key.aesEncrypt([]byte(secondaryUser.ID.String()))
  43. if err != nil {
  44. panic(err)
  45. }
  46. }
  47. keyCiphertext, err = userKey.aesEncrypt(
  48. []byte(base64.StdEncoding.EncodeToString(key.Key)),
  49. )
  50. if err != nil {
  51. panic(err)
  52. }
  53. messageData = Models.MessageData{
  54. Data: base64.StdEncoding.EncodeToString(dataCiphertext),
  55. SenderID: base64.StdEncoding.EncodeToString(senderIdCiphertext),
  56. SymmetricKey: base64.StdEncoding.EncodeToString(keyCiphertext),
  57. }
  58. message = Models.Message{
  59. MessageData: messageData,
  60. SymmetricKey: base64.StdEncoding.EncodeToString(
  61. encryptWithPublicKey(userKey.Key, decodedPublicKey),
  62. ),
  63. AssociationKey: primaryUserAssociationKey,
  64. }
  65. err = Database.CreateMessage(&message)
  66. if err != nil {
  67. return err
  68. }
  69. message = Models.Message{
  70. MessageData: messageData,
  71. SymmetricKey: base64.StdEncoding.EncodeToString(
  72. encryptWithPublicKey(userKey.Key, decodedPublicKey),
  73. ),
  74. AssociationKey: secondaryUserAssociationKey,
  75. }
  76. return Database.CreateMessage(&message)
  77. }
  78. func seedConversationDetail(key aesKey) (Models.ConversationDetail, error) {
  79. var (
  80. messageThread Models.ConversationDetail
  81. name string
  82. nameCiphertext []byte
  83. err error
  84. )
  85. name = "Test Conversation"
  86. nameCiphertext, err = key.aesEncrypt([]byte(name))
  87. if err != nil {
  88. panic(err)
  89. }
  90. messageThread = Models.ConversationDetail{
  91. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  92. }
  93. err = Database.CreateConversationDetail(&messageThread)
  94. return messageThread, err
  95. }
  96. func seedUpdateUserConversation(
  97. userJson string,
  98. key aesKey,
  99. messageThread Models.ConversationDetail,
  100. ) (Models.ConversationDetail, error) {
  101. var (
  102. usersCiphertext []byte
  103. err error
  104. )
  105. usersCiphertext, err = key.aesEncrypt([]byte(userJson))
  106. if err != nil {
  107. return messageThread, err
  108. }
  109. messageThread.Users = base64.StdEncoding.EncodeToString(usersCiphertext)
  110. err = Database.UpdateConversationDetail(&messageThread)
  111. return messageThread, err
  112. }
  113. func seedUserConversation(
  114. user Models.User,
  115. threadID uuid.UUID,
  116. key aesKey,
  117. ) (Models.UserConversation, error) {
  118. var (
  119. messageThreadUser Models.UserConversation
  120. threadIdCiphertext []byte
  121. adminCiphertext []byte
  122. err error
  123. )
  124. threadIdCiphertext, err = key.aesEncrypt([]byte(threadID.String()))
  125. if err != nil {
  126. return messageThreadUser, err
  127. }
  128. adminCiphertext, err = key.aesEncrypt([]byte("true"))
  129. if err != nil {
  130. return messageThreadUser, err
  131. }
  132. messageThreadUser = Models.UserConversation{
  133. UserID: user.ID,
  134. ConversationDetailID: base64.StdEncoding.EncodeToString(threadIdCiphertext),
  135. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  136. SymmetricKey: base64.StdEncoding.EncodeToString(
  137. encryptWithPublicKey(key.Key, decodedPublicKey),
  138. ),
  139. }
  140. err = Database.CreateUserConversation(&messageThreadUser)
  141. return messageThreadUser, err
  142. }
  143. func SeedMessages() {
  144. var (
  145. messageThread Models.ConversationDetail
  146. key aesKey
  147. primaryUser Models.User
  148. primaryUserAssociationKey uuid.UUID
  149. secondaryUser Models.User
  150. secondaryUserAssociationKey uuid.UUID
  151. userJson string
  152. id1, id2 uuid.UUID
  153. i int
  154. err error
  155. )
  156. key, err = generateAesKey()
  157. if err != nil {
  158. panic(err)
  159. }
  160. messageThread, err = seedConversationDetail(key)
  161. primaryUserAssociationKey, err = uuid.NewV4()
  162. if err != nil {
  163. panic(err)
  164. }
  165. secondaryUserAssociationKey, err = uuid.NewV4()
  166. if err != nil {
  167. panic(err)
  168. }
  169. primaryUser, err = Database.GetUserByUsername("testUser")
  170. if err != nil {
  171. panic(err)
  172. }
  173. _, err = seedUserConversation(
  174. primaryUser,
  175. messageThread.ID,
  176. key,
  177. )
  178. if err != nil {
  179. panic(err)
  180. }
  181. secondaryUser, err = Database.GetUserByUsername("ATestUser2")
  182. if err != nil {
  183. panic(err)
  184. }
  185. _, err = seedUserConversation(
  186. secondaryUser,
  187. messageThread.ID,
  188. key,
  189. )
  190. id1, err = uuid.NewV4()
  191. if err != nil {
  192. panic(err)
  193. }
  194. id2, err = uuid.NewV4()
  195. if err != nil {
  196. panic(err)
  197. }
  198. userJson = fmt.Sprintf(
  199. `
  200. [
  201. {
  202. "id": "%s",
  203. "user_id": "%s",
  204. "username": "%s",
  205. "admin": "true",
  206. "association_key": "%s"
  207. },
  208. {
  209. "id": "%s",
  210. "user_id": "%s",
  211. "username": "%s",
  212. "admin": "false",
  213. "association_key": "%s"
  214. }
  215. ]
  216. `,
  217. id1.String(),
  218. primaryUser.ID.String(),
  219. primaryUser.Username,
  220. primaryUserAssociationKey.String(),
  221. id2.String(),
  222. secondaryUser.ID.String(),
  223. secondaryUser.Username,
  224. secondaryUserAssociationKey.String(),
  225. )
  226. messageThread, err = seedUpdateUserConversation(
  227. userJson,
  228. key,
  229. messageThread,
  230. )
  231. for i = 0; i <= 20; i++ {
  232. err = seedMessage(
  233. primaryUser,
  234. secondaryUser,
  235. primaryUserAssociationKey.String(),
  236. secondaryUserAssociationKey.String(),
  237. i,
  238. )
  239. if err != nil {
  240. panic(err)
  241. }
  242. }
  243. }