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.

322 lines
7.3 KiB

  1. package Seeder
  2. import (
  3. "encoding/base64"
  4. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  5. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
  6. "github.com/gofrs/uuid"
  7. )
  8. func seedMessage(
  9. primaryUser, secondaryUser Models.User,
  10. primaryUserAssociationKey, secondaryUserAssociationKey string,
  11. i int,
  12. ) error {
  13. var (
  14. message Models.Message
  15. messageData Models.MessageData
  16. key, userKey AesKey
  17. keyCiphertext []byte
  18. plaintext string
  19. dataCiphertext []byte
  20. senderIDCiphertext []byte
  21. err error
  22. )
  23. plaintext = "Test Message"
  24. userKey, err = GenerateAesKey()
  25. if err != nil {
  26. panic(err)
  27. }
  28. key, err = GenerateAesKey()
  29. if err != nil {
  30. panic(err)
  31. }
  32. dataCiphertext, err = key.AesEncrypt([]byte(plaintext))
  33. if err != nil {
  34. panic(err)
  35. }
  36. senderIDCiphertext, err = key.AesEncrypt([]byte(primaryUser.ID.String()))
  37. if err != nil {
  38. panic(err)
  39. }
  40. if i%2 == 0 {
  41. senderIDCiphertext, err = key.AesEncrypt([]byte(secondaryUser.ID.String()))
  42. if err != nil {
  43. panic(err)
  44. }
  45. }
  46. keyCiphertext, err = userKey.AesEncrypt(
  47. []byte(base64.StdEncoding.EncodeToString(key.Key)),
  48. )
  49. if err != nil {
  50. panic(err)
  51. }
  52. messageData = Models.MessageData{
  53. Data: base64.StdEncoding.EncodeToString(dataCiphertext),
  54. SenderID: base64.StdEncoding.EncodeToString(senderIDCiphertext),
  55. SymmetricKey: base64.StdEncoding.EncodeToString(keyCiphertext),
  56. }
  57. message = Models.Message{
  58. MessageData: messageData,
  59. SymmetricKey: base64.StdEncoding.EncodeToString(
  60. EncryptWithPublicKey(userKey.Key, decodedPublicKey),
  61. ),
  62. AssociationKey: primaryUserAssociationKey,
  63. }
  64. err = Database.CreateMessage(&message)
  65. if err != nil {
  66. return err
  67. }
  68. message = Models.Message{
  69. MessageData: messageData,
  70. SymmetricKey: base64.StdEncoding.EncodeToString(
  71. EncryptWithPublicKey(userKey.Key, decodedPublicKey),
  72. ),
  73. AssociationKey: secondaryUserAssociationKey,
  74. }
  75. return Database.CreateMessage(&message)
  76. }
  77. func seedConversationDetail(key AesKey) (Models.ConversationDetail, error) {
  78. var (
  79. conversationDetail Models.ConversationDetail
  80. name string
  81. nameCiphertext []byte
  82. falseCiphertext []byte
  83. trueCiphertext []byte
  84. err error
  85. )
  86. name = "Test Conversation"
  87. nameCiphertext, err = key.AesEncrypt([]byte(name))
  88. if err != nil {
  89. panic(err)
  90. }
  91. falseCiphertext, err = key.AesEncrypt([]byte("false"))
  92. if err != nil {
  93. panic(err)
  94. }
  95. trueCiphertext, err = key.AesEncrypt([]byte("true"))
  96. if err != nil {
  97. panic(err)
  98. }
  99. conversationDetail = Models.ConversationDetail{
  100. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  101. TwoUser: base64.StdEncoding.EncodeToString(falseCiphertext),
  102. AdminAddMembers: base64.StdEncoding.EncodeToString(trueCiphertext),
  103. AdminEditInfo: base64.StdEncoding.EncodeToString(trueCiphertext),
  104. AdminSendMessages: base64.StdEncoding.EncodeToString(falseCiphertext),
  105. }
  106. err = Database.CreateConversationDetail(&conversationDetail)
  107. return conversationDetail, err
  108. }
  109. func seedUserConversation(
  110. user Models.User,
  111. threadID uuid.UUID,
  112. key AesKey,
  113. ) (Models.UserConversation, error) {
  114. var (
  115. messageThreadUser Models.UserConversation
  116. conversationDetailIDCiphertext []byte
  117. adminCiphertext []byte
  118. err error
  119. )
  120. conversationDetailIDCiphertext, err = key.AesEncrypt([]byte(threadID.String()))
  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(conversationDetailIDCiphertext),
  131. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  132. SymmetricKey: base64.StdEncoding.EncodeToString(
  133. EncryptWithPublicKey(key.Key, decodedPublicKey),
  134. ),
  135. }
  136. err = Database.CreateUserConversation(&messageThreadUser)
  137. return messageThreadUser, err
  138. }
  139. func seedConversationDetailUser(
  140. user Models.User,
  141. conversationDetail Models.ConversationDetail,
  142. associationKey uuid.UUID,
  143. admin bool,
  144. key AesKey,
  145. ) (Models.ConversationDetailUser, error) {
  146. var (
  147. conversationDetailUser Models.ConversationDetailUser
  148. userIDCiphertext []byte
  149. usernameCiphertext []byte
  150. adminCiphertext []byte
  151. associationKeyCiphertext []byte
  152. publicKeyCiphertext []byte
  153. adminString = "false"
  154. err error
  155. )
  156. if admin {
  157. adminString = "true"
  158. }
  159. userIDCiphertext, err = key.AesEncrypt([]byte(user.ID.String()))
  160. if err != nil {
  161. return conversationDetailUser, err
  162. }
  163. usernameCiphertext, err = key.AesEncrypt([]byte(user.Username))
  164. if err != nil {
  165. return conversationDetailUser, err
  166. }
  167. adminCiphertext, err = key.AesEncrypt([]byte(adminString))
  168. if err != nil {
  169. return conversationDetailUser, err
  170. }
  171. associationKeyCiphertext, err = key.AesEncrypt([]byte(associationKey.String()))
  172. if err != nil {
  173. return conversationDetailUser, err
  174. }
  175. publicKeyCiphertext, err = key.AesEncrypt([]byte(user.AsymmetricPublicKey))
  176. if err != nil {
  177. return conversationDetailUser, err
  178. }
  179. conversationDetailUser = Models.ConversationDetailUser{
  180. ConversationDetailID: conversationDetail.ID,
  181. UserID: base64.StdEncoding.EncodeToString(userIDCiphertext),
  182. Username: base64.StdEncoding.EncodeToString(usernameCiphertext),
  183. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  184. AssociationKey: base64.StdEncoding.EncodeToString(associationKeyCiphertext),
  185. PublicKey: base64.StdEncoding.EncodeToString(publicKeyCiphertext),
  186. }
  187. err = Database.CreateConversationDetailUser(&conversationDetailUser)
  188. return conversationDetailUser, err
  189. }
  190. // SeedMessages seeds messages & conversations for testing
  191. func SeedMessages() {
  192. var (
  193. conversationDetail Models.ConversationDetail
  194. key AesKey
  195. primaryUser Models.User
  196. primaryUserAssociationKey uuid.UUID
  197. secondaryUser Models.User
  198. secondaryUserAssociationKey uuid.UUID
  199. i int
  200. err error
  201. )
  202. key, err = GenerateAesKey()
  203. if err != nil {
  204. panic(err)
  205. }
  206. conversationDetail, err = seedConversationDetail(key)
  207. primaryUserAssociationKey, err = uuid.NewV4()
  208. if err != nil {
  209. panic(err)
  210. }
  211. secondaryUserAssociationKey, err = uuid.NewV4()
  212. if err != nil {
  213. panic(err)
  214. }
  215. primaryUser, err = Database.GetUserByUsername("testUser")
  216. if err != nil {
  217. panic(err)
  218. }
  219. _, err = seedUserConversation(
  220. primaryUser,
  221. conversationDetail.ID,
  222. key,
  223. )
  224. if err != nil {
  225. panic(err)
  226. }
  227. secondaryUser, err = Database.GetUserByUsername("ATestUser2")
  228. if err != nil {
  229. panic(err)
  230. }
  231. _, err = seedUserConversation(
  232. secondaryUser,
  233. conversationDetail.ID,
  234. key,
  235. )
  236. if err != nil {
  237. panic(err)
  238. }
  239. _, err = seedConversationDetailUser(
  240. primaryUser,
  241. conversationDetail,
  242. primaryUserAssociationKey,
  243. true,
  244. key,
  245. )
  246. if err != nil {
  247. panic(err)
  248. }
  249. _, err = seedConversationDetailUser(
  250. secondaryUser,
  251. conversationDetail,
  252. secondaryUserAssociationKey,
  253. false,
  254. key,
  255. )
  256. if err != nil {
  257. panic(err)
  258. }
  259. for i = 0; i <= 100; i++ {
  260. err = seedMessage(
  261. primaryUser,
  262. secondaryUser,
  263. primaryUserAssociationKey.String(),
  264. secondaryUserAssociationKey.String(),
  265. i,
  266. )
  267. if err != nil {
  268. panic(err)
  269. }
  270. }
  271. }