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.

313 lines
7.0 KiB

  1. package Seeder
  2. import (
  3. "encoding/base64"
  4. "git.tovijaeschke.xyz/tovi/Capsule/Backend/Database"
  5. "git.tovijaeschke.xyz/tovi/Capsule/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. messageThread Models.ConversationDetail
  80. name string
  81. nameCiphertext []byte
  82. twoUserCiphertext []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. twoUserCiphertext, err = key.AesEncrypt([]byte("false"))
  91. if err != nil {
  92. panic(err)
  93. }
  94. messageThread = Models.ConversationDetail{
  95. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  96. TwoUser: base64.StdEncoding.EncodeToString(twoUserCiphertext),
  97. }
  98. err = Database.CreateConversationDetail(&messageThread)
  99. return messageThread, err
  100. }
  101. func seedUserConversation(
  102. user Models.User,
  103. threadID uuid.UUID,
  104. key aesKey,
  105. ) (Models.UserConversation, error) {
  106. var (
  107. messageThreadUser Models.UserConversation
  108. conversationDetailIDCiphertext []byte
  109. adminCiphertext []byte
  110. err error
  111. )
  112. conversationDetailIDCiphertext, err = key.AesEncrypt([]byte(threadID.String()))
  113. if err != nil {
  114. return messageThreadUser, err
  115. }
  116. adminCiphertext, err = key.AesEncrypt([]byte("true"))
  117. if err != nil {
  118. return messageThreadUser, err
  119. }
  120. messageThreadUser = Models.UserConversation{
  121. UserID: user.ID,
  122. ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
  123. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  124. SymmetricKey: base64.StdEncoding.EncodeToString(
  125. EncryptWithPublicKey(key.Key, decodedPublicKey),
  126. ),
  127. }
  128. err = Database.CreateUserConversation(&messageThreadUser)
  129. return messageThreadUser, err
  130. }
  131. func seedConversationDetailUser(
  132. user Models.User,
  133. conversationDetail Models.ConversationDetail,
  134. associationKey uuid.UUID,
  135. admin bool,
  136. key aesKey,
  137. ) (Models.ConversationDetailUser, error) {
  138. var (
  139. conversationDetailUser Models.ConversationDetailUser
  140. userIDCiphertext []byte
  141. usernameCiphertext []byte
  142. adminCiphertext []byte
  143. associationKeyCiphertext []byte
  144. publicKeyCiphertext []byte
  145. adminString = "false"
  146. err error
  147. )
  148. if admin {
  149. adminString = "true"
  150. }
  151. userIDCiphertext, err = key.AesEncrypt([]byte(user.ID.String()))
  152. if err != nil {
  153. return conversationDetailUser, err
  154. }
  155. usernameCiphertext, err = key.AesEncrypt([]byte(user.Username))
  156. if err != nil {
  157. return conversationDetailUser, err
  158. }
  159. adminCiphertext, err = key.AesEncrypt([]byte(adminString))
  160. if err != nil {
  161. return conversationDetailUser, err
  162. }
  163. associationKeyCiphertext, err = key.AesEncrypt([]byte(associationKey.String()))
  164. if err != nil {
  165. return conversationDetailUser, err
  166. }
  167. publicKeyCiphertext, err = key.AesEncrypt([]byte(user.AsymmetricPublicKey))
  168. if err != nil {
  169. return conversationDetailUser, err
  170. }
  171. conversationDetailUser = Models.ConversationDetailUser{
  172. ConversationDetailID: conversationDetail.ID,
  173. UserID: base64.StdEncoding.EncodeToString(userIDCiphertext),
  174. Username: base64.StdEncoding.EncodeToString(usernameCiphertext),
  175. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  176. AssociationKey: base64.StdEncoding.EncodeToString(associationKeyCiphertext),
  177. PublicKey: base64.StdEncoding.EncodeToString(publicKeyCiphertext),
  178. }
  179. err = Database.CreateConversationDetailUser(&conversationDetailUser)
  180. return conversationDetailUser, err
  181. }
  182. // SeedMessages seeds messages & conversations for testing
  183. func SeedMessages() {
  184. var (
  185. conversationDetail Models.ConversationDetail
  186. key aesKey
  187. primaryUser Models.User
  188. primaryUserAssociationKey uuid.UUID
  189. secondaryUser Models.User
  190. secondaryUserAssociationKey uuid.UUID
  191. i int
  192. err error
  193. )
  194. key, err = GenerateAesKey()
  195. if err != nil {
  196. panic(err)
  197. }
  198. conversationDetail, err = seedConversationDetail(key)
  199. primaryUserAssociationKey, err = uuid.NewV4()
  200. if err != nil {
  201. panic(err)
  202. }
  203. secondaryUserAssociationKey, err = uuid.NewV4()
  204. if err != nil {
  205. panic(err)
  206. }
  207. primaryUser, err = Database.GetUserByUsername("testUser")
  208. if err != nil {
  209. panic(err)
  210. }
  211. _, err = seedUserConversation(
  212. primaryUser,
  213. conversationDetail.ID,
  214. key,
  215. )
  216. if err != nil {
  217. panic(err)
  218. }
  219. secondaryUser, err = Database.GetUserByUsername("ATestUser2")
  220. if err != nil {
  221. panic(err)
  222. }
  223. _, err = seedUserConversation(
  224. secondaryUser,
  225. conversationDetail.ID,
  226. key,
  227. )
  228. if err != nil {
  229. panic(err)
  230. }
  231. _, err = seedConversationDetailUser(
  232. primaryUser,
  233. conversationDetail,
  234. primaryUserAssociationKey,
  235. true,
  236. key,
  237. )
  238. if err != nil {
  239. panic(err)
  240. }
  241. _, err = seedConversationDetailUser(
  242. secondaryUser,
  243. conversationDetail,
  244. secondaryUserAssociationKey,
  245. false,
  246. key,
  247. )
  248. if err != nil {
  249. panic(err)
  250. }
  251. for i = 0; i <= 100; i++ {
  252. err = seedMessage(
  253. primaryUser,
  254. secondaryUser,
  255. primaryUserAssociationKey.String(),
  256. secondaryUserAssociationKey.String(),
  257. i,
  258. )
  259. if err != nil {
  260. panic(err)
  261. }
  262. }
  263. }