From d25624a8ad4c9c850e4e50652ba8a2bd7ed0784c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 27 Aug 2015 13:59:58 +0200 Subject: [PATCH] feat(signup): began work on new / alternate signup flow that includes email verification, #2353 --- pkg/api/dtos/user.go | 4 +++ pkg/api/org_invite.go | 4 +-- pkg/api/signup.go | 36 +++++++++++++-------- pkg/events/events.go | 8 +++++ pkg/metrics/metrics.go | 17 +++++----- pkg/models/temp_user.go | 1 + pkg/services/notifications/notifications.go | 2 +- pkg/setting/setting.go | 9 +++--- public/app/partials/login.html | 2 -- public/app/partials/signup_invited.html | 2 +- public/css/less/login.less | 6 ++-- 11 files changed, 57 insertions(+), 34 deletions(-) diff --git a/pkg/api/dtos/user.go b/pkg/api/dtos/user.go index 9b407535429e..14aa1ded2a23 100644 --- a/pkg/api/dtos/user.go +++ b/pkg/api/dtos/user.go @@ -1,5 +1,9 @@ package dtos +type SignUpForm struct { + Email string `json:"email" binding:"Required"` +} + type AdminCreateUserForm struct { Email string `json:"email"` Login string `json:"login"` diff --git a/pkg/api/org_invite.go b/pkg/api/org_invite.go index e4e0de126e98..d9e43a37a975 100644 --- a/pkg/api/org_invite.go +++ b/pkg/api/org_invite.go @@ -171,7 +171,7 @@ func CompleteInvite(c *middleware.Context, completeInvite dtos.CompleteInviteFor user := cmd.Result - bus.Publish(&events.UserSignedUp{ + bus.Publish(&events.SignUpCompleted{ Id: user.Id, Name: user.Name, Email: user.Email, @@ -199,7 +199,7 @@ func CompleteInvite(c *middleware.Context, completeInvite dtos.CompleteInviteFor loginUserWithUser(&user, c) - metrics.M_Api_User_SignUp.Inc(1) + metrics.M_Api_User_SignUpCompleted.Inc(1) metrics.M_Api_User_SignUpInvite.Inc(1) return ApiSuccess("User created and logged in") diff --git a/pkg/api/signup.go b/pkg/api/signup.go index 77305caba70b..78eac32d786b 100644 --- a/pkg/api/signup.go +++ b/pkg/api/signup.go @@ -1,38 +1,48 @@ package api import ( + "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/events" "github.com/grafana/grafana/pkg/metrics" "github.com/grafana/grafana/pkg/middleware" m "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util" ) // POST /api/user/signup -func SignUp(c *middleware.Context, cmd m.CreateUserCommand) Response { +func SignUp(c *middleware.Context, form dtos.SignUpForm) Response { if !setting.AllowUserSignUp { return ApiError(401, "User signup is disabled", nil) } - cmd.Login = cmd.Email + existing := m.GetUserByLoginQuery{LoginOrEmail: form.Email} + if err := bus.Dispatch(&existing); err == nil { + return ApiError(401, "User with same email address already exists", nil) + } + + cmd := m.CreateTempUserCommand{} + cmd.OrgId = -1 + cmd.Email = form.Email + cmd.Status = m.TmpUserSignUpStarted + cmd.InvitedByUserId = c.UserId + cmd.Code = util.GetRandomString(10) + cmd.RemoteAddr = c.Req.RemoteAddr if err := bus.Dispatch(&cmd); err != nil { - return ApiError(500, "failed to create user", err) + return ApiError(500, "Failed to create signup", err) } - user := cmd.Result - - bus.Publish(&events.UserSignedUp{ - Id: user.Id, - Name: user.Name, - Email: user.Email, - Login: user.Login, - }) + // user := cmd.Resu - loginUserWithUser(&user, c) + bus.Publish(&events.UserSignedUp{Email: form.Email}) - metrics.M_Api_User_SignUp.Inc(1) + // + // loginUserWithUser(&user, c) + // + // + metrics.M_Api_User_SignUpStarted.Inc(1) return ApiSuccess("User created and logged in") } diff --git a/pkg/events/events.go b/pkg/events/events.go index 5e82578b4748..38a4c2e9848b 100644 --- a/pkg/events/events.go +++ b/pkg/events/events.go @@ -78,6 +78,14 @@ type UserSignedUp struct { Email string `json:"email"` } +type SignUpCompleted struct { + Timestamp time.Time `json:"timestamp"` + Id int64 `json:"id"` + Name string `json:"name"` + Login string `json:"login"` + Email string `json:"email"` +} + type UserUpdated struct { Timestamp time.Time `json:"timestamp"` Id int64 `json:"id"` diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 0850cbebc06d..8e10b2428b49 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -13,14 +13,15 @@ var ( M_Api_Status_500 = NewComboCounterRef("api.status.500") M_Api_Status_404 = NewComboCounterRef("api.status.404") - M_Api_User_SignUp = NewComboCounterRef("api.user.signup") - M_Api_User_SignUpInvite = NewComboCounterRef("api.user.signup_invite") - M_Api_Dashboard_Get = NewComboCounterRef("api.dashboard.get") - M_Api_Dashboard_Post = NewComboCounterRef("api.dashboard.post") - M_Api_Admin_User_Create = NewComboCounterRef("api.admin.user_create") - M_Api_Login_Post = NewComboCounterRef("api.login.post") - M_Api_Login_OAuth = NewComboCounterRef("api.login.oauth") - M_Api_Org_Create = NewComboCounterRef("api.org.create") + M_Api_User_SignUpStarted = NewComboCounterRef("api.user.signup_started") + M_Api_User_SignUpCompleted = NewComboCounterRef("api.user.signup_completed") + M_Api_User_SignUpInvite = NewComboCounterRef("api.user.signup_invite") + M_Api_Dashboard_Get = NewComboCounterRef("api.dashboard.get") + M_Api_Dashboard_Post = NewComboCounterRef("api.dashboard.post") + M_Api_Admin_User_Create = NewComboCounterRef("api.admin.user_create") + M_Api_Login_Post = NewComboCounterRef("api.login.post") + M_Api_Login_OAuth = NewComboCounterRef("api.login.oauth") + M_Api_Org_Create = NewComboCounterRef("api.org.create") M_Api_Dashboard_Snapshot_Create = NewComboCounterRef("api.dashboard_snapshot.create") M_Api_Dashboard_Snapshot_External = NewComboCounterRef("api.dashboard_snapshot.external") diff --git a/pkg/models/temp_user.go b/pkg/models/temp_user.go index 6aeb67cda9b0..508553b09b85 100644 --- a/pkg/models/temp_user.go +++ b/pkg/models/temp_user.go @@ -13,6 +13,7 @@ var ( type TempUserStatus string const ( + TmpUserSignUpStarted TempUserStatus = "SignUpStarted" TmpUserInvitePending TempUserStatus = "InvitePending" TmpUserCompleted TempUserStatus = "Completed" TmpUserEmailPending TempUserStatus = "EmailPending" diff --git a/pkg/services/notifications/notifications.go b/pkg/services/notifications/notifications.go index 401cd812d5ea..6725616c2edb 100644 --- a/pkg/services/notifications/notifications.go +++ b/pkg/services/notifications/notifications.go @@ -131,7 +131,7 @@ func userSignedUpHandler(evt *events.UserSignedUp) error { To: []string{evt.Email}, Template: tmplWelcomeOnSignUp, Data: map[string]interface{}{ - "Name": evt.Login, + "Email": evt.Email, }, }) } diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 43bc8f6247de..ae69e65192ad 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -75,10 +75,11 @@ var ( EmailCodeValidMinutes int // User settings - AllowUserSignUp bool - AllowUserOrgCreate bool - AutoAssignOrg bool - AutoAssignOrgRole string + AllowUserSignUp bool + AllowUserOrgCreate bool + AutoAssignOrg bool + AutoAssignOrgRole string + RequireEmailValidation bool // Http auth AdminUser string diff --git a/public/app/partials/login.html b/public/app/partials/login.html index f311c929b662..a5894866d5a2 100644 --- a/public/app/partials/login.html +++ b/public/app/partials/login.html @@ -1,6 +1,4 @@
-