Skip to content

Commit 402df1d

Browse files
authored
Prevent a user with a different email from accepting the team invite (#24491)
## Changes - Fixes the case where a logged in user can accept an email invitation even if their email address does not match the address in the invitation
1 parent dbb3736 commit 402df1d

File tree

3 files changed

+26
-11
lines changed

3 files changed

+26
-11
lines changed

options/locale/locale_en-US.ini

+1
Original file line numberDiff line numberDiff line change
@@ -2559,6 +2559,7 @@ teams.all_repositories_admin_permission_desc = This team grants <strong>Admin</s
25592559
teams.invite.title = You've been invited to join team <strong>%s</strong> in organization <strong>%s</strong>.
25602560
teams.invite.by = Invited by %s
25612561
teams.invite.description = Please click the button below to join the team.
2562+
teams.invite.email_mismatch = Your email address does not match this invite.
25622563
25632564
[admin]
25642565
dashboard = Dashboard

routers/web/org/teams.go

+8
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ func TeamInvite(ctx *context.Context) {
552552
ctx.Data["Organization"] = org
553553
ctx.Data["Team"] = team
554554
ctx.Data["Inviter"] = inviter
555+
ctx.Data["EmailMismatch"] = ctx.Doer.Email != invite.Email
555556

556557
ctx.HTML(http.StatusOK, tplTeamInvite)
557558
}
@@ -568,6 +569,13 @@ func TeamInvitePost(ctx *context.Context) {
568569
return
569570
}
570571

572+
// check that the Doer is the invitee
573+
if ctx.Doer.Email != invite.Email {
574+
log.Info("invite %d does not apply to the current user %d", invite.ID, ctx.Doer.ID)
575+
ctx.NotFound("ErrTeamInviteNotFound", err)
576+
return
577+
}
578+
571579
if err := models.AddTeamMember(team, ctx.Doer.ID); err != nil {
572580
ctx.ServerError("AddTeamMember", err)
573581
return

templates/org/team/invite.tmpl

+17-11
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,23 @@
66
<div class="image">
77
{{avatar $.Context .Organization 140}}
88
</div>
9-
<div class="content">
10-
<div class="header">{{.locale.Tr "org.teams.invite.title" .Team.Name .Organization.Name | Str2html}}</div>
11-
<div class="meta">{{.locale.Tr "org.teams.invite.by" .Inviter.Name}}</div>
12-
<div class="description">{{.locale.Tr "org.teams.invite.description"}}</div>
13-
</div>
14-
<div class="extra content">
15-
<form class="ui form" action="" method="post">
16-
{{.CsrfTokenHtml}}
17-
<button class="fluid ui green button">{{.locale.Tr "org.teams.join"}}</button>
18-
</form>
19-
</div>
9+
{{if .EmailMismatch}}
10+
<div class="content">
11+
<div class="header">{{.locale.Tr "org.teams.invite.email_mismatch"}}</div>
12+
</div>
13+
{{else}}
14+
<div class="content">
15+
<div class="header">{{.locale.Tr "org.teams.invite.title" .Team.Name .Organization.Name | Str2html}}</div>
16+
<div class="meta">{{.locale.Tr "org.teams.invite.by" .Inviter.Name}}</div>
17+
<div class="description">{{.locale.Tr "org.teams.invite.description"}}</div>
18+
</div>
19+
<div class="extra content">
20+
<form class="ui form" action="" method="post">
21+
{{.CsrfTokenHtml}}
22+
<button class="fluid ui green button">{{.locale.Tr "org.teams.join"}}</button>
23+
</form>
24+
</div>
25+
{{end}}
2026
</div>
2127
</div>
2228
</div>

0 commit comments

Comments
 (0)