diff --git a/models/user/email_address.go b/models/user/email_address.go index e310858f9..0ae283f77 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -126,6 +126,7 @@ type EmailAddress struct { UID int64 `xorm:"INDEX NOT NULL"` Email string `xorm:"UNIQUE NOT NULL"` LowerEmail string `xorm:"UNIQUE NOT NULL"` + UserName string `xorm:"-"` IsActivated bool IsPrimary bool `xorm:"DEFAULT(false) NOT NULL"` } @@ -190,6 +191,18 @@ func GetEmailAddressByID(uid, id int64) (*EmailAddress, error) { return email, nil } +// GetEmailAddressByID gets a user's email address by ID +func GetEmailAddressByEmail(ctx context.Context, email string) (*EmailAddress, error) { + // User ID is required for security reasons + em := &EmailAddress{LowerEmail: strings.ToLower(email)} + if has, err := db.GetEngine(db.DefaultContext).Get(em); err != nil { + return nil, err + } else if !has { + return nil, nil + } + return em, nil +} + // IsEmailActive check if email is activated with a different emailID func IsEmailActive(ctx context.Context, email string, excludeEmailID int64) (bool, error) { if len(email) == 0 { diff --git a/routers/api/v1/admin/email.go b/routers/api/v1/admin/email.go index cc4163418..6aabce570 100644 --- a/routers/api/v1/admin/email.go +++ b/routers/api/v1/admin/email.go @@ -38,7 +38,15 @@ func GetAllEmails(ctx *context.APIContext) { // GetEmail func GetEmail(ctx *context.APIContext) { - GetAllEmails(ctx) + email, err := user_model.GetEmailAddressByEmail(ctx, ctx.Params(":email")) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetEmailAddressByEmail", err) + return + } + + result := convert.ToEmail(ctx, email) + + ctx.JSON(http.StatusOK, &result) } // SearchEmail diff --git a/routers/api/v1/user/email.go b/routers/api/v1/user/email.go index fc74c8d14..37fee2d58 100644 --- a/routers/api/v1/user/email.go +++ b/routers/api/v1/user/email.go @@ -34,7 +34,7 @@ func ListEmails(ctx *context.APIContext) { } apiEmails := make([]*api.Email, len(emails)) for i := range emails { - apiEmails[i] = convert.ToEmail(emails[i]) + apiEmails[i] = convert.ToEmail(ctx, emails[i]) } ctx.JSON(http.StatusOK, &apiEmails) } @@ -93,7 +93,7 @@ func AddEmail(ctx *context.APIContext) { apiEmails := make([]*api.Email, len(emails)) for i := range emails { - apiEmails[i] = convert.ToEmail(emails[i]) + apiEmails[i] = convert.ToEmail(ctx, emails[i]) } ctx.JSON(http.StatusCreated, &apiEmails) } diff --git a/services/convert/convert.go b/services/convert/convert.go index bce0e7ba2..33ad1c4ab 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -30,11 +30,14 @@ import ( ) // ToEmail convert models.EmailAddress to api.Email -func ToEmail(email *user_model.EmailAddress) *api.Email { +func ToEmail(ctx context.Context, email *user_model.EmailAddress) *api.Email { + user, _ := user_model.GetUserByID(ctx, email.UID) return &api.Email{ Email: email.Email, Verified: email.IsActivated, Primary: email.IsPrimary, + UserID: email.UID, + UserName: user.Name, } }