Skip to content

Commit 9182a35

Browse files
strkbkcsoft
authored andcommitted
Show user OpenID URIs in their profile (#1314)
1 parent e158689 commit 9182a35

File tree

11 files changed

+180
-0
lines changed

11 files changed

+180
-0
lines changed

cmd/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ func runWeb(ctx *cli.Context) error {
248248
m.Combo("").Get(user.SettingsOpenID).
249249
Post(bindIgnErr(auth.AddOpenIDForm{}), user.SettingsOpenIDPost)
250250
m.Post("/delete", user.DeleteOpenID)
251+
m.Post("/toggle_visibility", user.ToggleOpenIDVisibility)
251252
})
252253
}
253254

models/fixtures/user_open_id.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-
2+
id: 1
3+
uid: 1
4+
uri: https://user1.domain1.tld/
5+
show: false
6+
7+
-
8+
id: 2
9+
uid: 1
10+
uri: http://user1.domain2.tld/
11+
show: true
12+
13+
-
14+
id: 3
15+
uid: 2
16+
uri: https://domain1.tld/user2/
17+
show: true

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ var migrations = []Migration{
9898
NewMigration("add user openid table", addUserOpenID),
9999
// v24 -> v25
100100
NewMigration("change the key_id and primary_key_id type", changeGPGKeysColumns),
101+
// v25 -> v26
102+
NewMigration("add show field in user openid table", addUserOpenIDShow),
101103
}
102104

103105
// Migrate database to current version

models/migrations/v25.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2017 Gitea. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"fmt"
9+
10+
"github.com/go-xorm/xorm"
11+
)
12+
13+
func addUserOpenIDShow(x *xorm.Engine) error {
14+
if err := x.Sync2(new(UserOpenID)); err != nil {
15+
return fmt.Errorf("Sync2: %v", err)
16+
}
17+
return nil
18+
}

models/user_openid.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ type UserOpenID struct {
2121
ID int64 `xorm:"pk autoincr"`
2222
UID int64 `xorm:"INDEX NOT NULL"`
2323
URI string `xorm:"UNIQUE NOT NULL"`
24+
Show bool `xorm:"DEFAULT false"`
2425
}
2526

2627
// GetUserOpenIDs returns all openid addresses that belongs to given user.
2728
func GetUserOpenIDs(uid int64) ([]*UserOpenID, error) {
2829
openids := make([]*UserOpenID, 0, 5)
2930
if err := x.
3031
Where("uid=?", uid).
32+
Asc("id").
3133
Find(&openids); err != nil {
3234
return nil, err
3335
}
@@ -89,6 +91,12 @@ func DeleteUserOpenID(openid *UserOpenID) (err error) {
8991
return nil
9092
}
9193

94+
// ToggleUserOpenIDVisibility toggles visibility of an openid address of given user.
95+
func ToggleUserOpenIDVisibility(id int64) (err error) {
96+
_, err = x.Exec("update user_open_id set show = not show where id = ?", id)
97+
return err
98+
}
99+
92100
// GetUserByOpenID returns the user object by given OpenID if exists.
93101
func GetUserByOpenID(uri string) (*User, error) {
94102
if len(uri) == 0 {

models/user_openid_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package models
6+
7+
import (
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestGetUserOpenIDs(t *testing.T) {
14+
assert.NoError(t, PrepareTestDatabase())
15+
16+
oids, err := GetUserOpenIDs(int64(1))
17+
if assert.NoError(t, err) {
18+
assert.Len(t, oids, 2)
19+
assert.Equal(t, oids[0].URI, "https://user1.domain1.tld/")
20+
assert.False(t, oids[0].Show)
21+
assert.Equal(t, oids[1].URI, "http://user1.domain2.tld/")
22+
assert.True(t, oids[1].Show)
23+
}
24+
25+
oids, err = GetUserOpenIDs(int64(2))
26+
if assert.NoError(t, err) {
27+
assert.Len(t, oids, 1)
28+
assert.Equal(t, oids[0].URI, "https://domain1.tld/user2/")
29+
assert.True(t, oids[0].Show)
30+
}
31+
}
32+
33+
func TestGetUserByOpenID(t *testing.T) {
34+
assert.NoError(t, PrepareTestDatabase())
35+
36+
user, err := GetUserByOpenID("https://unknown")
37+
if assert.Error(t, err) {
38+
assert.True(t, IsErrUserNotExist(err))
39+
}
40+
41+
user, err = GetUserByOpenID("https://user1.domain1.tld")
42+
if assert.NoError(t, err) {
43+
assert.Equal(t, user.ID, int64(1))
44+
}
45+
46+
user, err = GetUserByOpenID("https://domain1.tld/user2/")
47+
if assert.NoError(t, err) {
48+
assert.Equal(t, user.ID, int64(2))
49+
}
50+
}
51+
52+
func TestToggleUserOpenIDVisibility(t *testing.T) {
53+
assert.NoError(t, PrepareTestDatabase())
54+
oids, err := GetUserOpenIDs(int64(2))
55+
if ! assert.NoError(t, err) {
56+
return
57+
}
58+
assert.Len(t, oids, 1)
59+
assert.True(t, oids[0].Show)
60+
61+
err = ToggleUserOpenIDVisibility(oids[0].ID)
62+
if ! assert.NoError(t, err) {
63+
return
64+
}
65+
66+
oids, err = GetUserOpenIDs(int64(2))
67+
if assert.NoError(t, err) {
68+
assert.Len(t, oids, 1)
69+
assert.False(t, oids[0].Show)
70+
}
71+
err = ToggleUserOpenIDVisibility(oids[0].ID)
72+
if ! assert.NoError(t, err) {
73+
return
74+
}
75+
76+
oids, err = GetUserOpenIDs(int64(2))
77+
if ! assert.NoError(t, err) {
78+
return
79+
}
80+
assert.Len(t, oids, 1)
81+
assert.True(t, oids[0].Show)
82+
}

options/locale/locale_en-US.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ last_used = Last used on
365365
no_activity = No recent activity
366366
key_state_desc = This key is used in last 7 days
367367
token_state_desc = This token is used in last 7 days
368+
show_openid = Show on profile
369+
hide_openid = Hide from profile
368370

369371
manage_social = Manage Associated Social Accounts
370372
social_desc = This is a list of associated social accounts. For security reasons, please make sure you recognize all of these entries, as they can be used to log in to your account.

routers/user/profile.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,17 @@ func Profile(ctx *context.Context) {
7575
return
7676
}
7777

78+
// Show OpenID URIs
79+
openIDs, err := models.GetUserOpenIDs(ctxUser.ID)
80+
if err != nil {
81+
ctx.Handle(500, "GetUserOpenIDs", err)
82+
return
83+
}
84+
7885
ctx.Data["Title"] = ctxUser.DisplayName()
7986
ctx.Data["PageIsUserProfile"] = true
8087
ctx.Data["Owner"] = ctxUser
88+
ctx.Data["OpenIDs"] = openIDs
8189
showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID)
8290

8391
orgs, err := models.GetOrgsByUserID(ctxUser.ID, showPrivate)

routers/user/setting_openid.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ func SettingsOpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
4545
ctx.Data["PageIsSettingsOpenID"] = true
4646

4747
if ctx.HasError() {
48+
openid, err := models.GetUserOpenIDs(ctx.User.ID)
49+
if err != nil {
50+
ctx.Handle(500, "GetUserOpenIDs", err)
51+
return
52+
}
53+
ctx.Data["OpenIDs"] = openid
4854
ctx.HTML(200, tplSettingsOpenID)
4955
return
5056
}
@@ -140,3 +146,13 @@ func DeleteOpenID(ctx *context.Context) {
140146
})
141147
}
142148

149+
// ToggleOpenIDVisibility response for toggle visibility of user's openid
150+
func ToggleOpenIDVisibility(ctx *context.Context) {
151+
if err := models.ToggleUserOpenIDVisibility(ctx.QueryInt64("id")); err != nil {
152+
ctx.Handle(500, "ToggleUserOpenIDVisibility", err)
153+
return
154+
}
155+
156+
ctx.Redirect(setting.AppSubURL + "/user/settings/openid")
157+
}
158+

templates/user/profile.tmpl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
<a target="_blank" rel="noopener" href="{{.Owner.Website}}">{{.Owner.Website}}</a>
3535
</li>
3636
{{end}}
37+
{{range .OpenIDs}}
38+
{{if .Show}}
39+
<li>
40+
<i class="fa fa-openid"></i>
41+
<a target="_blank" rel="noopener" href="{{.URI}}">{{.URI}}</a>
42+
</li>
43+
{{end}}
44+
{{end}}
3745
<li><i class="octicon octicon-clock"></i> {{.i18n.Tr "user.join_on"}} {{DateFmtShort .Owner.Created}}</li>
3846
<li>
3947
<i class="octicon octicon-person"></i>

templates/user/settings/openid.tmpl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,24 @@
2020
{{$.i18n.Tr "settings.delete_key"}}
2121
</button>
2222
</div>
23+
<div class="ui right">
24+
<form action="{{$.Link}}/toggle_visibility" method="post">
25+
{{$.CsrfTokenHtml}}
26+
<input name="id" type="hidden" value="{{.ID}}">
27+
{{if .Show}}
28+
<button class="ui tiny button">
29+
<i class="icon fa-eye"></i>
30+
{{$.i18n.Tr "settings.hide_openid"}}
31+
</button>
32+
{{else}}
33+
<button class="ui tiny button">
34+
<i class="icon fa-eye-slash"></i>
35+
{{$.i18n.Tr "settings.show_openid"}}
36+
</button>
37+
{{end}}
38+
</button>
39+
</form>
40+
</div>
2341
</div>
2442
</div>
2543
{{end}}

0 commit comments

Comments
 (0)