Skip to content

Commit

Permalink
Merge pull request #7260 from mitake/auth-state
Browse files Browse the repository at this point in the history
auth: correct initialization in NewAuthStore()
  • Loading branch information
xiang90 authored Feb 9, 2017
2 parents 9b72c8b + 9976d86 commit c4fc8c0
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 14 deletions.
46 changes: 32 additions & 14 deletions auth/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,17 @@ type authStore struct {
indexWaiter func(uint64) <-chan struct{}
}

func newDeleterFunc(as *authStore) func(string) {
return func(t string) {
as.simpleTokensMu.Lock()
defer as.simpleTokensMu.Unlock()
if username, ok := as.simpleTokens[t]; ok {
plog.Infof("deleting token %s for user %s", t, username)
delete(as.simpleTokens, t)
}
}
}

func (as *authStore) AuthEnable() error {
as.enabledMu.Lock()
defer as.enabledMu.Unlock()
Expand Down Expand Up @@ -210,15 +221,7 @@ func (as *authStore) AuthEnable() error {

as.enabled = true

tokenDeleteFunc := func(t string) {
as.simpleTokensMu.Lock()
defer as.simpleTokensMu.Unlock()
if username, ok := as.simpleTokens[t]; ok {
plog.Infof("deleting token %s for user %s", t, username)
delete(as.simpleTokens, t)
}
}
as.simpleTokenKeeper = NewSimpleTokenTTLKeeper(tokenDeleteFunc)
as.simpleTokenKeeper = NewSimpleTokenTTLKeeper(newDeleterFunc(as))

as.rangePermCache = make(map[string]*unifiedRangePermissions)

Expand Down Expand Up @@ -892,11 +895,25 @@ func NewAuthStore(be backend.Backend, indexWaiter func(uint64) <-chan struct{})
tx.UnsafeCreateBucket(authUsersBucketName)
tx.UnsafeCreateBucket(authRolesBucketName)

enabled := false
_, vs := tx.UnsafeRange(authBucketName, enableFlagKey, nil, 0)
if len(vs) == 1 {
if bytes.Equal(vs[0], authEnabled) {
enabled = true
}
}

as := &authStore{
be: be,
simpleTokens: make(map[string]string),
revision: 0,
indexWaiter: indexWaiter,
be: be,
simpleTokens: make(map[string]string),
revision: getRevision(tx),
indexWaiter: indexWaiter,
enabled: enabled,
rangePermCache: make(map[string]*unifiedRangePermissions),
}

if enabled {
as.simpleTokenKeeper = NewSimpleTokenTTLKeeper(newDeleterFunc(as))
}

as.commitRevision(tx)
Expand Down Expand Up @@ -926,7 +943,8 @@ func (as *authStore) commitRevision(tx backend.BatchTx) {
func getRevision(tx backend.BatchTx) uint64 {
_, vs := tx.UnsafeRange(authBucketName, []byte(revisionKey), nil, 0)
if len(vs) != 1 {
plog.Panicf("failed to get the key of auth store revision")
// this can happen in the initialization phase
return 0
}

return binary.BigEndian.Uint64(vs[0])
Expand Down
38 changes: 38 additions & 0 deletions auth/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,44 @@ func TestIsAdminPermitted(t *testing.T) {
}
}

func TestRecoverFromSnapshot(t *testing.T) {
as, _ := setupAuthStore(t)

ua := &pb.AuthUserAddRequest{Name: "foo"}
_, err := as.UserAdd(ua) // add an existing user
if err == nil {
t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
}
if err != ErrUserAlreadyExist {
t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
}

ua = &pb.AuthUserAddRequest{Name: ""}
_, err = as.UserAdd(ua) // add a user with empty name
if err != ErrUserEmpty {
t.Fatal(err)
}

as.Close()

as2 := NewAuthStore(as.be, dummyIndexWaiter)
defer func(a *authStore) {
a.Close()
}(as2)

if !as2.isAuthEnabled() {
t.Fatal("recovering authStore from existing backend failed")
}

ul, err := as.UserList(&pb.AuthUserListRequest{})
if err != nil {
t.Fatal(err)
}
if !contains(ul.Users, "root") {
t.Errorf("expected %v in %v", "root", ul.Users)
}
}

func contains(array []string, str string) bool {
for _, s := range array {
if s == str {
Expand Down

0 comments on commit c4fc8c0

Please sign in to comment.