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.

321 lines
7.3 KiB

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