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.

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