Skip to content

Commit ed5720a

Browse files
authored
Fix openid setting check (go-gitea#36346)
1 parent e95c30e commit ed5720a

5 files changed

Lines changed: 87 additions & 8 deletions

File tree

models/user/openid.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,13 @@ func DeleteUserOpenID(ctx context.Context, openid *UserOpenID) (err error) {
102102
}
103103

104104
// ToggleUserOpenIDVisibility toggles visibility of an openid address of given user.
105-
func ToggleUserOpenIDVisibility(ctx context.Context, id int64) (err error) {
106-
_, err = db.GetEngine(ctx).Exec("update `user_open_id` set `show` = not `show` where `id` = ?", id)
107-
return err
105+
func ToggleUserOpenIDVisibility(ctx context.Context, id int64, user *User) error {
106+
affected, err := db.GetEngine(ctx).Exec("update `user_open_id` set `show` = not `show` where `id` = ? AND uid = ?", id, user.ID)
107+
if err != nil {
108+
return err
109+
}
110+
if n, _ := affected.RowsAffected(); n != 1 {
111+
return util.NewNotExistErrorf("OpenID is unknown")
112+
}
113+
return nil
108114
}

models/user/openid_test.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"code.gitea.io/gitea/models/unittest"
1010
user_model "code.gitea.io/gitea/models/user"
11+
"code.gitea.io/gitea/modules/util"
1112

1213
"github.com/stretchr/testify/assert"
1314
"github.com/stretchr/testify/require"
@@ -33,20 +34,22 @@ func TestGetUserOpenIDs(t *testing.T) {
3334

3435
func TestToggleUserOpenIDVisibility(t *testing.T) {
3536
assert.NoError(t, unittest.PrepareTestDatabase())
37+
user, err := user_model.GetUserByID(t.Context(), int64(2))
38+
require.NoError(t, err)
3639
oids, err := user_model.GetUserOpenIDs(t.Context(), int64(2))
3740
require.NoError(t, err)
3841
require.Len(t, oids, 1)
3942
assert.True(t, oids[0].Show)
4043

41-
err = user_model.ToggleUserOpenIDVisibility(t.Context(), oids[0].ID)
44+
err = user_model.ToggleUserOpenIDVisibility(t.Context(), oids[0].ID, user)
4245
require.NoError(t, err)
4346

4447
oids, err = user_model.GetUserOpenIDs(t.Context(), int64(2))
4548
require.NoError(t, err)
4649
require.Len(t, oids, 1)
4750

4851
assert.False(t, oids[0].Show)
49-
err = user_model.ToggleUserOpenIDVisibility(t.Context(), oids[0].ID)
52+
err = user_model.ToggleUserOpenIDVisibility(t.Context(), oids[0].ID, user)
5053
require.NoError(t, err)
5154

5255
oids, err = user_model.GetUserOpenIDs(t.Context(), int64(2))
@@ -55,3 +58,13 @@ func TestToggleUserOpenIDVisibility(t *testing.T) {
5558
assert.True(t, oids[0].Show)
5659
}
5760
}
61+
62+
func TestToggleUserOpenIDVisibilityRequiresOwnership(t *testing.T) {
63+
assert.NoError(t, unittest.PrepareTestDatabase())
64+
unauthorizedUser, err := user_model.GetUserByID(t.Context(), int64(2))
65+
require.NoError(t, err)
66+
67+
err = user_model.ToggleUserOpenIDVisibility(t.Context(), int64(1), unauthorizedUser)
68+
require.Error(t, err)
69+
assert.ErrorIs(t, err, util.ErrNotExist)
70+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package security
5+
6+
import (
7+
"testing"
8+
9+
"code.gitea.io/gitea/models/unittest"
10+
)
11+
12+
func TestMain(m *testing.M) {
13+
unittest.MainTest(m)
14+
}

routers/web/user/setting/security/openid.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
package security
55

66
import (
7+
"errors"
78
"net/http"
89

910
user_model "code.gitea.io/gitea/models/user"
1011
"code.gitea.io/gitea/modules/auth/openid"
1112
"code.gitea.io/gitea/modules/log"
1213
"code.gitea.io/gitea/modules/setting"
14+
"code.gitea.io/gitea/modules/util"
1315
"code.gitea.io/gitea/modules/web"
1416
"code.gitea.io/gitea/services/context"
1517
"code.gitea.io/gitea/services/forms"
@@ -116,7 +118,11 @@ func DeleteOpenID(ctx *context.Context) {
116118
}
117119

118120
if err := user_model.DeleteUserOpenID(ctx, &user_model.UserOpenID{ID: ctx.FormInt64("id"), UID: ctx.Doer.ID}); err != nil {
119-
ctx.ServerError("DeleteUserOpenID", err)
121+
if errors.Is(err, util.ErrNotExist) {
122+
ctx.HTTPError(http.StatusNotFound)
123+
} else {
124+
ctx.ServerError("DeleteUserOpenID", err)
125+
}
120126
return
121127
}
122128
log.Trace("OpenID address deleted: %s", ctx.Doer.Name)
@@ -132,8 +138,12 @@ func ToggleOpenIDVisibility(ctx *context.Context) {
132138
return
133139
}
134140

135-
if err := user_model.ToggleUserOpenIDVisibility(ctx, ctx.FormInt64("id")); err != nil {
136-
ctx.ServerError("ToggleUserOpenIDVisibility", err)
141+
if err := user_model.ToggleUserOpenIDVisibility(ctx, ctx.FormInt64("id"), ctx.Doer); err != nil {
142+
if errors.Is(err, util.ErrNotExist) {
143+
ctx.HTTPError(http.StatusNotFound)
144+
} else {
145+
ctx.ServerError("ToggleUserOpenIDVisibility", err)
146+
}
137147
return
138148
}
139149

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package security
5+
6+
import (
7+
"net/http"
8+
"testing"
9+
10+
"code.gitea.io/gitea/models/unittest"
11+
"code.gitea.io/gitea/services/contexttest"
12+
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestDeleteOpenIDReturnsNotFoundForOtherUsersAddress(t *testing.T) {
17+
unittest.PrepareTestEnv(t)
18+
ctx, _ := contexttest.MockContext(t, "POST /user/settings/security")
19+
contexttest.LoadUser(t, ctx, 2)
20+
ctx.SetFormString("id", "1")
21+
22+
DeleteOpenID(ctx)
23+
24+
assert.Equal(t, http.StatusNotFound, ctx.Resp.WrittenStatus())
25+
}
26+
27+
func TestToggleOpenIDVisibilityReturnsNotFoundForOtherUsersAddress(t *testing.T) {
28+
unittest.PrepareTestEnv(t)
29+
ctx, _ := contexttest.MockContext(t, "POST /user/settings/security")
30+
contexttest.LoadUser(t, ctx, 2)
31+
ctx.SetFormString("id", "1")
32+
33+
ToggleOpenIDVisibility(ctx)
34+
35+
assert.Equal(t, http.StatusNotFound, ctx.Resp.WrittenStatus())
36+
}

0 commit comments

Comments
 (0)