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.

182 lines
4.7 KiB

  1. package Messages_test
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "net/http"
  7. "testing"
  8. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  9. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database/Seeder"
  10. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Tests"
  11. )
  12. func createConversation(key Seeder.AesKey) (Database.ConversationDetail, Database.UserConversation, Database.ConversationDetailUser, error) {
  13. var (
  14. cd Database.ConversationDetail
  15. uc Database.UserConversation
  16. cdu Database.ConversationDetailUser
  17. )
  18. u, err := Database.GetUserByUsername("test")
  19. nameCiphertext, err := key.AesEncrypt([]byte("Test conversation"))
  20. if err != nil {
  21. return cd, uc, cdu, err
  22. }
  23. twoUserCiphertext, err := key.AesEncrypt([]byte("false"))
  24. if err != nil {
  25. return cd, uc, cdu, err
  26. }
  27. cd = Database.ConversationDetail{
  28. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  29. TwoUser: base64.StdEncoding.EncodeToString(twoUserCiphertext),
  30. }
  31. err = (&cd).CreateConversationDetail()
  32. if err != nil {
  33. return cd, uc, cdu, err
  34. }
  35. conversationDetailIDCiphertext, err := key.AesEncrypt([]byte(cd.ID.String()))
  36. if err != nil {
  37. return cd, uc, cdu, err
  38. }
  39. adminCiphertext, err := key.AesEncrypt([]byte("true"))
  40. if err != nil {
  41. return cd, uc, cdu, err
  42. }
  43. pubKey := Seeder.GetPubKey()
  44. uc = Database.UserConversation{
  45. UserID: u.ID,
  46. ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
  47. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  48. SymmetricKey: base64.StdEncoding.EncodeToString(
  49. Seeder.EncryptWithPublicKey(key.Key, pubKey),
  50. ),
  51. }
  52. err = (&uc).CreateUserConversation()
  53. if err != nil {
  54. return cd, uc, cdu, err
  55. }
  56. userIDCiphertext, err := key.AesEncrypt([]byte(u.ID.String()))
  57. if err != nil {
  58. return cd, uc, cdu, err
  59. }
  60. usernameCiphertext, err := key.AesEncrypt([]byte(u.Username))
  61. if err != nil {
  62. return cd, uc, cdu, err
  63. }
  64. adminCiphertext, err = key.AesEncrypt([]byte("true"))
  65. if err != nil {
  66. return cd, uc, cdu, err
  67. }
  68. associationKeyCiphertext, err := key.AesEncrypt([]byte("association"))
  69. if err != nil {
  70. return cd, uc, cdu, err
  71. }
  72. publicKeyCiphertext, err := key.AesEncrypt([]byte(u.AsymmetricPublicKey))
  73. if err != nil {
  74. return cd, uc, cdu, err
  75. }
  76. cdu = Database.ConversationDetailUser{
  77. ConversationDetailID: cd.ID,
  78. UserID: base64.StdEncoding.EncodeToString(userIDCiphertext),
  79. Username: base64.StdEncoding.EncodeToString(usernameCiphertext),
  80. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  81. AssociationKey: base64.StdEncoding.EncodeToString(associationKeyCiphertext),
  82. PublicKey: base64.StdEncoding.EncodeToString(publicKeyCiphertext),
  83. }
  84. err = (&cdu).CreateConversationDetailUser()
  85. return cd, uc, cdu, err
  86. }
  87. func Test_UpdateConversation(t *testing.T) {
  88. client, ts, err := Tests.InitTestEnv()
  89. if err != nil {
  90. t.Errorf("Expected nil, recieved %s", err.Error())
  91. return
  92. }
  93. // u, err := Database.GetUserByUsername("test")
  94. key, err := Seeder.GenerateAesKey()
  95. if err != nil {
  96. t.Errorf("Expected nil, recieved %s", err.Error())
  97. return
  98. }
  99. cd, uc, cdu, err := createConversation(key)
  100. nameCiphertext, err := key.AesEncrypt([]byte("Not test conversation"))
  101. if err != nil {
  102. t.Errorf("Expected nil, recieved %s", err.Error())
  103. }
  104. d := struct {
  105. ID string `json:"id"`
  106. Name string `json:"name"`
  107. Users []Database.ConversationDetailUser
  108. UserConversations []Database.UserConversation
  109. }{
  110. ID: cd.ID.String(),
  111. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  112. Users: []Database.ConversationDetailUser{
  113. cdu,
  114. },
  115. UserConversations: []Database.UserConversation{
  116. uc,
  117. },
  118. }
  119. jsonStr, _ := json.Marshal(d)
  120. req, _ := http.NewRequest("PUT", ts.URL+"/api/v1/auth/conversations", bytes.NewBuffer(jsonStr))
  121. req.Header.Set("Content-Type", "application/json")
  122. resp, err := client.Do(req)
  123. if err != nil {
  124. t.Errorf("Expected nil, recieved %s", err.Error())
  125. return
  126. }
  127. if resp.StatusCode != http.StatusNoContent {
  128. t.Errorf("Expected %d, recieved %d", http.StatusNoContent, resp.StatusCode)
  129. }
  130. var ncd Database.ConversationDetail
  131. err = Database.DB.First(&ncd, "id = ?", cd.ID.String()).Error
  132. if err != nil {
  133. t.Errorf("Expected nil, recieved %s", err.Error())
  134. return
  135. }
  136. decodedName, err := base64.StdEncoding.DecodeString(ncd.Name)
  137. if err != nil {
  138. t.Errorf("Expected nil, recieved %s", err.Error())
  139. return
  140. }
  141. decrypedName, err := key.AesDecrypt(decodedName)
  142. if err != nil {
  143. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  144. return
  145. }
  146. if string(decrypedName) != "Not test conversation" {
  147. t.Errorf("Expected %s, recieved %s", "Not test converation", string(decrypedName))
  148. }
  149. }