user_delete.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package user
  2. import (
  3. "encoding/base64"
  4. "github.com/ente-io/museum/ente"
  5. enteJWT "github.com/ente-io/museum/ente/jwt"
  6. "github.com/ente-io/museum/pkg/utils/auth"
  7. "github.com/ente-io/museum/pkg/utils/crypto"
  8. "github.com/ente-io/stacktrace"
  9. "github.com/gin-contrib/requestid"
  10. "github.com/gin-gonic/gin"
  11. "github.com/sirupsen/logrus"
  12. )
  13. func (c *UserController) GetDeleteChallengeToken(ctx *gin.Context) (*ente.DeleteChallengeResponse, error) {
  14. userID := auth.GetUserID(ctx.Request.Header)
  15. user, err := c.UserRepo.Get(userID)
  16. if err != nil {
  17. return nil, stacktrace.Propagate(err, "")
  18. }
  19. keyAttributes, err := c.UserRepo.GetKeyAttributes(userID)
  20. if err != nil {
  21. return nil, stacktrace.Propagate(err, "")
  22. }
  23. logger := logrus.WithFields(logrus.Fields{
  24. "user_id": userID,
  25. "user_email": user.Email,
  26. "req_id": requestid.Get(ctx),
  27. "req_ctx": "request_self_delete",
  28. })
  29. logger.Info("User initiated self-delete")
  30. subscription, err := c.BillingController.GetSubscription(ctx, userID)
  31. if err != nil {
  32. return nil, stacktrace.Propagate(err, "")
  33. }
  34. /* todo: add check to see if there's pending abuse report or if user's master password
  35. was changed in last X days.
  36. */
  37. shouldNotifyDiscord := subscription.ProductID != ente.FreePlanProductID
  38. if shouldNotifyDiscord {
  39. go c.DiscordController.NotifyAccountDelete(user.ID, string(subscription.PaymentProvider), subscription.ProductID)
  40. }
  41. token, err := c.GetJWTToken(userID, enteJWT.DELETE_ACCOUNT)
  42. if err != nil {
  43. return nil, stacktrace.Propagate(err, "")
  44. }
  45. encryptedToken, err := crypto.GetEncryptedToken(base64.StdEncoding.EncodeToString([]byte(token)), keyAttributes.PublicKey)
  46. if err != nil {
  47. return nil, stacktrace.Propagate(err, "")
  48. }
  49. return &ente.DeleteChallengeResponse{
  50. EncryptedChallenge: &encryptedToken,
  51. AllowDelete: true,
  52. }, nil
  53. }
  54. func (c *UserController) SelfDeleteAccount(ctx *gin.Context, req ente.DeleteAccountRequest) (*ente.DeleteAccountResponse, error) {
  55. userID := auth.GetUserID(ctx.Request.Header)
  56. tokenUserID, err := c.ValidateJWTToken(req.Challenge, enteJWT.DELETE_ACCOUNT)
  57. if err != nil {
  58. return nil, stacktrace.Propagate(err, "failed to validate jwt token")
  59. }
  60. if tokenUserID != userID {
  61. return nil, stacktrace.Propagate(ente.ErrPermissionDenied, "jwtToken belongs to different user")
  62. }
  63. user, err := c.UserRepo.Get(userID)
  64. if err != nil {
  65. return nil, stacktrace.Propagate(err, "")
  66. }
  67. _, err = c.BillingController.GetSubscription(ctx, userID)
  68. if err != nil {
  69. return nil, stacktrace.Propagate(err, "")
  70. }
  71. logger := logrus.WithFields(logrus.Fields{
  72. "user_id": userID,
  73. "user_email": user.Email,
  74. "req_id": requestid.Get(ctx),
  75. "req_ctx": "self_account_deletion",
  76. })
  77. resp, err := c.HandleAccountDeletion(ctx, userID, logger)
  78. if err != nil {
  79. return nil, stacktrace.Propagate(err, "")
  80. }
  81. // Update reason, ignore failure in updating reason
  82. updateErr := c.UserRepo.UpdateDeleteFeedback(userID, req.GetReasonAttr())
  83. if updateErr != nil {
  84. logger.WithError(updateErr).Error("failed to update delete feedback")
  85. }
  86. return resp, nil
  87. }