Skip to content

Commit 7490f32

Browse files
committed
user: Proxied
1 parent 926fad6 commit 7490f32

File tree

17 files changed

+162
-73
lines changed

17 files changed

+162
-73
lines changed

user/result.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type Result struct {
2121
User *User `json:"user"`
2222
// Statement we found at User.URL.
2323
Statement string `json:"statement,omitempty"`
24+
// Proxied if result was through a proxy.
25+
Proxied bool `json:"proxied,omitempty"`
2426
// VerifiedAt is when the status was last OK.
2527
VerifiedAt int64 `json:"vts,omitempty"`
2628
}

user/services/echo.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ func (s *echo) Request(ctx context.Context, client http.Client, usr *user.User)
4949
return user.StatusOK, []byte(msg), nil
5050
}
5151

52-
func (s *echo) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
53-
return user.FindVerify(usr, []byte(b), false)
52+
func (s *echo) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
53+
status, statement, err := user.FindVerify(usr, b, false)
54+
if err != nil {
55+
return status, nil, err
56+
}
57+
return status, &Verified{Statement: statement}, nil
5458
}

user/services/github.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,25 @@ func (s *github) Request(ctx context.Context, client http.Client, usr *user.User
3333
return Request(ctx, client, apiURL, headers)
3434
}
3535

36-
func (s *github) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
36+
func (s *github) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
3737
var gist gist
3838
if err := json.Unmarshal(b, &gist); err != nil {
39-
return user.StatusContentInvalid, "", err
39+
return user.StatusContentInvalid, nil, err
4040
}
41-
42-
if gist.Owner.Login != usr.Name {
43-
return user.StatusContentInvalid, "", errors.Errorf("invalid gist owner login %s", gist.Owner.Login)
41+
gistUserName := validate.Github.NormalizeName(gist.Owner.Login)
42+
if gistUserName != usr.Name {
43+
return user.StatusContentInvalid, nil, errors.Errorf("invalid gist owner login %s", gist.Owner.Login)
4444
}
4545

4646
for _, f := range gist.Files {
47-
return user.FindVerify(usr, []byte(f.Content), false)
47+
status, statement, err := user.FindVerify(usr, []byte(f.Content), false)
48+
if err != nil {
49+
return status, nil, err
50+
}
51+
return status, &Verified{Statement: statement}, nil
4852
}
4953

50-
return user.StatusContentInvalid, "", errors.Errorf("no gist files")
54+
return user.StatusContentInvalid, nil, errors.Errorf("no gist files")
5155
}
5256

5357
func (s *github) headers() []http.Header {

user/services/github_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,25 @@ kC5EFOwCedvHFpc AQVqULHjcSpeCfZ EIOaQ2IP.
3232
END MESSAGE.`
3333
require.Equal(t, expected, result.Statement)
3434
}
35+
36+
func TestGithubKeysPubUser(t *testing.T) {
37+
// user.SetLogger(user.NewLogger(user.DebugLevel))
38+
// services.SetLogger(user.NewLogger(user.DebugLevel))
39+
40+
kid := keys.ID("kex1ncfla8g5ez6vfq3trj9vpsdswqlv9fcqdks6x86nt0j7yljk3d8supvfj7")
41+
urs := "https://gist.github.com/keys-pub-user/63965d96e6586ee7e3ec3530e4331982"
42+
43+
client := http.NewClient()
44+
45+
usr, err := user.New(kid, "github", "keys-pub-user", urs, 1)
46+
require.NoError(t, err)
47+
result := services.Verify(context.TODO(), services.Github, client, usr)
48+
require.Equal(t, user.StatusOK, result.Status)
49+
expected := `BEGIN MESSAGE.
50+
tFOTGkqFiM1YL3P lG4V0DzFi95jz1A VaOn0e5KzZ5wzFq D2LanZPiN928o3M
51+
jPUOV3KlEcDr0iV Y6R2GYtcP2WTCKq 6Xr2MZHgg6oMjst MtVs8AxBTgCn0ed
52+
yNy78Ob23NoqDTi HLaHzAYYHCLYA3H hpW04H2qOcy9wUT TbzbvuqS4jIXVCm
53+
WgBpeqxaDOC8tGL 2rHKnD6KhZrBw8d tSPCc8sSTVh227E D.
54+
END MESSAGE.`
55+
require.Equal(t, expected, result.Statement)
56+
}

user/services/https.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func (s *https) Request(ctx context.Context, client http.Client, usr *user.User)
2020
return Request(ctx, client, usr.URL, nil)
2121
}
2222

23-
func (s *https) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
24-
return user.FindVerify(usr, []byte(b), false)
23+
func (s *https) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
24+
status, statement, err := user.FindVerify(usr, b, false)
25+
if err != nil {
26+
return status, nil, err
27+
}
28+
return status, &Verified{Statement: statement}, nil
2529
}

user/services/keyspub.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,31 @@ import (
1111
"github.com/pkg/errors"
1212
)
1313

14-
type kpUser struct{}
14+
type keyspub struct{}
1515

1616
// KeysPub uses keys.pub user cache instead of the service directly.
17-
var KeysPub = &kpUser{}
17+
var KeysPub = &keyspub{}
1818

19-
func (s *kpUser) Request(ctx context.Context, client http.Client, usr *user.User) (user.Status, []byte, error) {
19+
func (s *keyspub) Request(ctx context.Context, client http.Client, usr *user.User) (user.Status, []byte, error) {
2020
url := fmt.Sprintf("https://keys.pub/user/%s@%s", usr.Name, usr.Service)
2121
return Request(ctx, client, url, nil)
2222
}
2323

24-
func (s *kpUser) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
25-
msg, err := s.checkContent(usr, b)
24+
func (s *keyspub) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
25+
userStatus, err := s.checkContent(usr, b)
2626
if err != nil {
27-
return user.StatusContentInvalid, "", err
27+
return user.StatusContentInvalid, nil, err
2828
}
29-
return user.FindVerify(usr, msg, false)
29+
status, statement, err := user.FindVerify(usr, []byte(userStatus.Statement), false)
30+
if err != nil {
31+
return status, nil, err
32+
}
33+
34+
verified := &Verified{Statement: statement, Timestamp: userStatus.VerifiedAt, Proxied: true}
35+
return status, verified, nil
3036
}
3137

32-
func (s *kpUser) checkContent(usr *user.User, b []byte) ([]byte, error) {
38+
func (s *keyspub) checkContent(usr *user.User, b []byte) (*userStatus, error) {
3339
var status struct {
3440
User userStatus `json:"user"`
3541
}
@@ -61,7 +67,7 @@ func (s *kpUser) checkContent(usr *user.User, b []byte) ([]byte, error) {
6167
return nil, errors.Errorf("invalid user url")
6268
}
6369

64-
return []byte(us.Statement), nil
70+
return &us, nil
6571
}
6672

6773
type userStatus struct {

user/services/proxy.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ func (s *proxy) Request(ctx context.Context, client http.Client, usr *user.User)
2828
return Request(ctx, client, url, nil)
2929
}
3030

31-
func (s *proxy) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
32-
return user.FindVerify(usr, b, false)
31+
func (s *proxy) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
32+
status, statement, err := user.FindVerify(usr, b, false)
33+
if err != nil {
34+
return status, nil, err
35+
}
36+
return status, &Verified{Statement: statement, Proxied: true}, nil
3337
}

user/services/reddit.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,16 @@ func (s *reddit) checkContent(name string, b []byte) ([]byte, error) {
6060
return []byte(selftext), nil
6161
}
6262

63-
func (s *reddit) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error) {
63+
func (s *reddit) Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error) {
6464
msg, err := s.checkContent(usr.Name, b)
6565
if err != nil {
66-
return user.StatusContentInvalid, "", err
66+
return user.StatusContentInvalid, nil, err
6767
}
68-
return user.FindVerify(usr, msg, false)
68+
status, statement, err := user.FindVerify(usr, msg, false)
69+
if err != nil {
70+
return status, nil, err
71+
}
72+
return status, &Verified{Statement: statement}, nil
6973
}
7074

7175
func (s *reddit) headers(urs string) ([]http.Header, error) {

user/services/request.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
// Request resource.
1212
func Request(ctx context.Context, client http.Client, urs string, headers []http.Header) (user.Status, []byte, error) {
13+
logger.Infof("Requesting %s", urs)
1314
req, err := http.NewRequest("GET", urs, nil)
1415
if err != nil {
1516
return user.StatusFailure, nil, err

user/services/service.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import (
99
"github.com/pkg/errors"
1010
)
1111

12-
// Response from service request.
13-
type Response struct {
14-
Status user.Status
12+
// Verified results.
13+
type Verified struct {
1514
Statement string
15+
Timestamp int64
16+
Proxied bool
1617
}
1718

1819
// Service describes a user service.
@@ -21,7 +22,7 @@ type Service interface {
2122
Request(ctx context.Context, client http.Client, usr *user.User) (user.Status, []byte, error)
2223

2324
// Verify content.
24-
Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, string, error)
25+
Verify(ctx context.Context, b []byte, usr *user.User) (user.Status, *Verified, error)
2526
}
2627

2728
var services = map[string]Service{

0 commit comments

Comments
 (0)