diff --git a/auth/store.go b/auth/store.go index 01c6c9905..a98ec5d6a 100644 --- a/auth/store.go +++ b/auth/store.go @@ -51,6 +51,7 @@ var ( ErrPermissionDenied = errors.New("auth: permission denied") ErrRoleNotGranted = errors.New("auth: role is not granted to the user") ErrPermissionNotGranted = errors.New("auth: permission is not granted to the role") + ErrAuthNotEnabled = errors.New("auth: authentication is not enabled") ) const ( @@ -187,6 +188,10 @@ func (as *authStore) AuthDisable() { } func (as *authStore) Authenticate(ctx context.Context, username, password string) (*pb.AuthenticateResponse, error) { + if !as.isAuthEnabled() { + return nil, ErrAuthNotEnabled + } + // TODO(mitake): after adding jwt support, branching based on values of ctx is required index := ctx.Value("index").(uint64) simpleToken := ctx.Value("simpleToken").(string) diff --git a/auth/store_test.go b/auth/store_test.go index 37a4440f7..ccf05a1de 100644 --- a/auth/store_test.go +++ b/auth/store_test.go @@ -45,6 +45,25 @@ func TestUserAdd(t *testing.T) { } } +func enableAuthAndCreateRoot(as *authStore) error { + _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "root", Password: "root"}) + if err != nil { + return err + } + + _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "root"}) + if err != nil { + return err + } + + _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "root", Role: "root"}) + if err != nil { + return err + } + + return as.AuthEnable() +} + func TestAuthenticate(t *testing.T) { b, tPath := backend.NewDefaultTmpBackend() defer func() { @@ -53,9 +72,13 @@ func TestAuthenticate(t *testing.T) { }() as := NewAuthStore(b) + err := enableAuthAndCreateRoot(as) + if err != nil { + t.Fatal(err) + } ua := &pb.AuthUserAddRequest{Name: "foo", Password: "bar"} - _, err := as.UserAdd(ua) + _, err = as.UserAdd(ua) if err != nil { t.Fatal(err) } @@ -96,9 +119,13 @@ func TestUserDelete(t *testing.T) { }() as := NewAuthStore(b) + err := enableAuthAndCreateRoot(as) + if err != nil { + t.Fatal(err) + } ua := &pb.AuthUserAddRequest{Name: "foo"} - _, err := as.UserAdd(ua) + _, err = as.UserAdd(ua) if err != nil { t.Fatal(err) } @@ -128,8 +155,12 @@ func TestUserChangePassword(t *testing.T) { }() as := NewAuthStore(b) + err := enableAuthAndCreateRoot(as) + if err != nil { + t.Fatal(err) + } - _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"}) + _, err = as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"}) if err != nil { t.Fatal(err) } @@ -169,9 +200,13 @@ func TestRoleAdd(t *testing.T) { }() as := NewAuthStore(b) + err := enableAuthAndCreateRoot(as) + if err != nil { + t.Fatal(err) + } // adds a new role - _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"}) + _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"}) if err != nil { t.Fatal(err) } @@ -185,8 +220,12 @@ func TestUserGrant(t *testing.T) { }() as := NewAuthStore(b) + err := enableAuthAndCreateRoot(as) + if err != nil { + t.Fatal(err) + } - _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"}) + _, err = as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"}) if err != nil { t.Fatal(err) } diff --git a/etcdserver/api/v3rpc/rpctypes/error.go b/etcdserver/api/v3rpc/rpctypes/error.go index 55e05e7dc..ec5464cbb 100644 --- a/etcdserver/api/v3rpc/rpctypes/error.go +++ b/etcdserver/api/v3rpc/rpctypes/error.go @@ -48,6 +48,7 @@ var ( ErrGRPCPermissionDenied = grpc.Errorf(codes.FailedPrecondition, "etcdserver: permission denied") ErrGRPCRoleNotGranted = grpc.Errorf(codes.FailedPrecondition, "etcdserver: role is not granted to the user") ErrGRPCPermissionNotGranted = grpc.Errorf(codes.FailedPrecondition, "etcdserver: permission is not granted to the role") + ErrGRPCAuthNotEnabled = grpc.Errorf(codes.FailedPrecondition, "etcdserver: authentication is not enabled") ErrGRPCNoLeader = grpc.Errorf(codes.Unavailable, "etcdserver: no leader") ErrGRPCNotCapable = grpc.Errorf(codes.Unavailable, "etcdserver: not capable") @@ -80,6 +81,7 @@ var ( grpc.ErrorDesc(ErrGRPCPermissionDenied): ErrGRPCPermissionDenied, grpc.ErrorDesc(ErrGRPCRoleNotGranted): ErrGRPCRoleNotGranted, grpc.ErrorDesc(ErrGRPCPermissionNotGranted): ErrGRPCPermissionNotGranted, + grpc.ErrorDesc(ErrGRPCAuthNotEnabled): ErrGRPCAuthNotEnabled, grpc.ErrorDesc(ErrGRPCNoLeader): ErrGRPCNoLeader, grpc.ErrorDesc(ErrGRPCNotCapable): ErrGRPCNotCapable, @@ -113,6 +115,7 @@ var ( ErrPermissionDenied = Error(ErrGRPCPermissionDenied) ErrRoleNotGranted = Error(ErrGRPCRoleNotGranted) ErrPermissionNotGranted = Error(ErrGRPCPermissionNotGranted) + ErrAuthNotEnabled = Error(ErrGRPCAuthNotEnabled) ErrNoLeader = Error(ErrGRPCNoLeader) ErrNotCapable = Error(ErrGRPCNotCapable) diff --git a/etcdserver/api/v3rpc/util.go b/etcdserver/api/v3rpc/util.go index 997e57892..8b44c11e3 100644 --- a/etcdserver/api/v3rpc/util.go +++ b/etcdserver/api/v3rpc/util.go @@ -58,6 +58,8 @@ func togRPCError(err error) error { return rpctypes.ErrGRPCRoleNotGranted case auth.ErrPermissionNotGranted: return rpctypes.ErrGRPCPermissionNotGranted + case auth.ErrAuthNotEnabled: + return rpctypes.ErrGRPCAuthNotEnabled default: return grpc.Errorf(codes.Internal, err.Error()) }