Skip to content

Commit

Permalink
User: Hide echo from search (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
gabriel authored Aug 24, 2020
1 parent 35fcd54 commit e123846
Show file tree
Hide file tree
Showing 10 changed files with 172 additions and 73 deletions.
13 changes: 7 additions & 6 deletions user/echo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestResultEcho(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

usr, err := user.NewForSigning(sk.ID(), "echo", "alice")
require.NoError(t, err)
Expand Down Expand Up @@ -72,10 +72,11 @@ func TestResultEcho(t *testing.T) {
require.Equal(t, 1, len(kids))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), kids[0])

// TODO: When we flip indexUser to indexSearch, uncomment this...
// res, err := users.Search(context.TODO(), &user.SearchRequest{Query: "alice@echo"})
// require.NoError(t, err)
// require.Equal(t, 0, len(res))
// Echo is hidden from search
res, err := users.Search(context.TODO(), &user.SearchRequest{Query: "alice@echo"})
require.NoError(t, err)
require.Equal(t, 0, len(res))
// require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), res[0].KID)
}

func TestRequestVerifyEcho(t *testing.T) {
Expand All @@ -85,7 +86,7 @@ func TestRequestVerifyEcho(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

usrSign, err := user.NewForSigning(sk.ID(), "echo", "alice")
require.NoError(t, err)
Expand Down
11 changes: 8 additions & 3 deletions user/github_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func TestResultGithub(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

req.SetResponse("https://gist.github.com/alice/70281cc427850c272a8574af4d8564d9", testdata(t, "testdata/github/70281cc427850c272a8574af4d8564d9"))

Expand Down Expand Up @@ -68,6 +68,11 @@ func TestResultGithub(t *testing.T) {
require.NoError(t, err)
require.Equal(t, 1, len(kids))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), kids[0])

res, err := users.Search(context.TODO(), &user.SearchRequest{Query: "alice"})
require.NoError(t, err)
require.Equal(t, 1, len(res))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), res[0].KID)
}

func TestResultGithubWrongName(t *testing.T) {
Expand All @@ -77,7 +82,7 @@ func TestResultGithubWrongName(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

usr, err := user.NewForSigning(sk.ID(), "github", "alice2")
require.NoError(t, err)
Expand Down Expand Up @@ -111,7 +116,7 @@ func TestResultGithubWrongService(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
sc := keys.NewSigchain(sk.ID())

muser := &user.User{KID: sk.ID(), Service: "github2", Name: "gabriel"}
Expand Down
37 changes: 37 additions & 0 deletions user/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package user

import (
"github.com/keys-pub/keys/request"
"github.com/keys-pub/keys/tsutil"
)

// UsersOptions are options for Users.
type UsersOptions struct {
Req request.Requestor
Clock tsutil.Clock
}

// UsersOption ...
type UsersOption func(*UsersOptions)

func newUserOptions(opts ...UsersOption) UsersOptions {
var options UsersOptions
for _, o := range opts {
o(&options)
}
return options
}

// Requestor to use.
func Requestor(req request.Requestor) UsersOption {
return func(o *UsersOptions) {
o.Req = req
}
}

// Clock to use.
func Clock(clock tsutil.Clock) UsersOption {
return func(o *UsersOptions) {
o.Clock = clock
}
}
24 changes: 23 additions & 1 deletion user/reddit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func TestResultReddit(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

usr, err := user.NewForSigning(sk.ID(), "reddit", "charlie")
require.NoError(t, err)
Expand Down Expand Up @@ -51,4 +51,26 @@ func TestResultReddit(t *testing.T) {
require.Equal(t, "charlie", result.User.Name)
require.Equal(t, int64(1234567890003), result.VerifiedAt)
require.Equal(t, int64(1234567890003), result.Timestamp)

result, err = users.Get(context.TODO(), sk.ID())
require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, "reddit", result.User.Service)
require.Equal(t, "charlie", result.User.Name)

result, err = users.User(context.TODO(), "charlie@reddit")
require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, "reddit", result.User.Service)
require.Equal(t, "charlie", result.User.Name)

kids, err := users.KIDs(context.TODO())
require.NoError(t, err)
require.Equal(t, 1, len(kids))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), kids[0])

res, err := users.Search(context.TODO(), &user.SearchRequest{Query: "charlie"})
require.NoError(t, err)
require.Equal(t, 1, len(res))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), res[0].KID)
}
45 changes: 45 additions & 0 deletions user/result.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package user

import (
"fmt"
"time"

"github.com/keys-pub/keys"
"github.com/keys-pub/keys/tsutil"
)

// Result describes the status of a User.
// TODO: Make Err/Status more explicit, it can be confusing.
type Result struct {
Err string `json:"err,omitempty"`
Status Status `json:"status"`
// Timestamp is the when the status was last updated.
Timestamp int64 `json:"ts"`
User *User `json:"user"`
// VerifiedAt is when the status was last OK.
VerifiedAt int64 `json:"vts"`
}

type keyDocument struct {
KID keys.ID `json:"kid"`
Result *Result `json:"result,omitempty"`
}

func (r Result) String() string {
if r.Status == StatusOK {
return fmt.Sprintf("%s:%s(%d)", r.Status, r.User, r.VerifiedAt)
}
return fmt.Sprintf("%s:%s;err=%s", r.Status, r.User, r.Err)
}

// IsTimestampExpired returns true if result Timestamp is older than dt.
func (r Result) IsTimestampExpired(now time.Time, dt time.Duration) bool {
ts := tsutil.ConvertMillis(r.Timestamp)
return (ts.IsZero() || now.Sub(ts) > dt)
}

// IsVerifyExpired returns true if result VerifiedAt is older than dt.
func (r Result) IsVerifyExpired(now time.Time, dt time.Duration) bool {
ts := tsutil.ConvertMillis(r.VerifiedAt)
return (ts.IsZero() || now.Sub(ts) > dt)
}
3 changes: 1 addition & 2 deletions user/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ type SearchResult struct {

func (u *Users) searchUsers(ctx context.Context, query string, limit int) ([]*SearchResult, error) {
logger.Infof("Searching users %q", query)
// TODO: Change to indexSearch when that index is available
iter, err := u.ds.DocumentIterator(ctx, indexUser, docs.Prefix(query))
iter, err := u.ds.DocumentIterator(ctx, indexSearch, docs.Prefix(query))
if err != nil {
return nil, err
}
Expand Down
18 changes: 9 additions & 9 deletions user/search_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func TestSearchUsers(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
ctx := context.TODO()

results, err := users.Search(ctx, &user.SearchRequest{})
Expand Down Expand Up @@ -180,7 +180,7 @@ func TestFind(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
ctx := context.TODO()

alice := keys.NewEdX25519KeyFromSeed(testSeed(0x01))
Expand Down Expand Up @@ -219,7 +219,7 @@ func TestUsersEmpty(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

key := keys.NewEdX25519KeyFromSeed(testSeed(0x01))

Expand All @@ -242,7 +242,7 @@ func TestUserValidateName(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

key := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x20}, 32)))

Expand Down Expand Up @@ -271,7 +271,7 @@ func TestUserValidateUpdateInvalid(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

// Unvalidated user to sigchain
key := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x021}, 32)))
Expand Down Expand Up @@ -321,7 +321,7 @@ func TestReddit(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

key := keys.NewEdX25519KeyFromSeed(testSeed(0x01))
redditURL := "https://reddit.com/r/keyspubmsgs/comments/123/alice"
Expand Down Expand Up @@ -376,7 +376,7 @@ func TestSearchUsersRequestErrors(t *testing.T) {
scs.SetClock(clock)

req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
ctx := context.TODO()

results, err := users.Search(ctx, &user.SearchRequest{})
Expand Down Expand Up @@ -460,7 +460,7 @@ func TestExpired(t *testing.T) {

clock := tsutil.NewTestClock()
req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
ctx := context.TODO()

ids, err := users.Expired(ctx, time.Hour, time.Hour*24*60)
Expand Down Expand Up @@ -583,7 +583,7 @@ func TestSearch(t *testing.T) {
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
req := request.NewMockRequestor()
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))
ctx := context.TODO()

for i := 0; i < 10; i++ {
Expand Down
26 changes: 24 additions & 2 deletions user/twitter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func TestResultTwitter(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

// usr, err := user.NewForSigning(sk.ID(), "twitter", "bob")
// require.NoError(t, err)
Expand Down Expand Up @@ -104,6 +104,28 @@ func TestResultTwitter(t *testing.T) {
require.Equal(t, "bob", result.User.Name)
require.Equal(t, int64(1234567890004), result.VerifiedAt)
require.Equal(t, int64(1234567890005), result.Timestamp)

result, err = users.Get(context.TODO(), sk.ID())
require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, "twitter", result.User.Service)
require.Equal(t, "bob", result.User.Name)

result, err = users.User(context.TODO(), "bob@twitter")
require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, "twitter", result.User.Service)
require.Equal(t, "bob", result.User.Name)

kids, err := users.KIDs(context.TODO())
require.NoError(t, err)
require.Equal(t, 1, len(kids))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), kids[0])

res, err := users.Search(context.TODO(), &user.SearchRequest{Query: "bob"})
require.NoError(t, err)
require.Equal(t, 1, len(res))
require.Equal(t, keys.ID("kex132yw8ht5p8cetl2jmvknewjawt9xwzdlrk2pyxlnwjyqrdq0dawqqph077"), res[0].KID)
}

func TestResultTwitterInvalidStatement(t *testing.T) {
Expand All @@ -114,7 +136,7 @@ func TestResultTwitterInvalidStatement(t *testing.T) {
req := request.NewMockRequestor()
ds := docs.NewMem()
scs := keys.NewSigchains(ds)
users := user.NewUsers(ds, scs, req, clock)
users := user.NewUsers(ds, scs, user.Requestor(req), user.Clock(clock))

sc := keys.NewSigchain(sk.ID())
stu, err := user.New(sk.ID(), "twitter", "bob", "https://twitter.com/bob/status/1205589994380783616", sc.LastSeq()+1)
Expand Down
Loading

0 comments on commit e123846

Please sign in to comment.