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.

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