func (as *authStore) UserChangePassword(r *pb.AuthUserChangePasswordRequest) (*pb.AuthUserChangePasswordResponse, error) { // TODO(mitake): measure the cost of bcrypt.GenerateFromPassword() // If the cost is too high, we should move the encryption to outside of the raft hashed, err := bcrypt.GenerateFromPassword([]byte(r.Password), bcrypt.DefaultCost) if err != nil { plog.Errorf("failed to hash password: %s", err) return nil, err } tx := as.be.BatchTx() tx.Lock() defer tx.Unlock() _, vs := tx.UnsafeRange(authUsersBucketName, []byte(r.Name), nil, 0) if len(vs) != 1 { return &pb.AuthUserChangePasswordResponse{}, ErrUserNotFound } updatedUser := authpb.User{ Name: []byte(r.Name), Password: hashed, } marshaledUser, merr := updatedUser.Marshal() if merr != nil { plog.Errorf("failed to marshal a new user data: %s", merr) return nil, merr } tx.UnsafePut(authUsersBucketName, []byte(r.Name), marshaledUser) plog.Noticef("changed a password of a user: %s", r.Name) return &pb.AuthUserChangePasswordResponse{}, nil }
func (as *authStore) UserAdd(r *pb.AuthUserAddRequest) (*pb.AuthUserAddResponse, error) { plog.Noticef("adding a new user: %s", r.Name) hashed, err := bcrypt.GenerateFromPassword([]byte(r.Password), bcrypt.DefaultCost) if err != nil { plog.Errorf("failed to hash password: %s", err) return nil, err } tx := as.be.BatchTx() tx.Lock() defer tx.Unlock() _, vs := tx.UnsafeRange(authUsersBucketName, []byte(r.Name), nil, 0) if len(vs) != 0 { return &pb.AuthUserAddResponse{}, ErrUserAlreadyExist } newUser := authpb.User{ Name: []byte(r.Name), Password: hashed, } marshaledUser, merr := newUser.Marshal() if merr != nil { plog.Errorf("failed to marshal a new user data: %s", merr) return nil, merr } tx.UnsafePut(authUsersBucketName, []byte(r.Name), marshaledUser) plog.Noticef("added a new user: %s", r.Name) return &pb.AuthUserAddResponse{}, nil }
func putUser(tx backend.BatchTx, user *authpb.User) { b, err := user.Marshal() if err != nil { plog.Panicf("failed to marshal user struct (name: %s): %s", user.Name, err) } tx.UnsafePut(authUsersBucketName, user.Name, b) }