Browse Source

Merge pull request #5049 from heyitsanthony/fix-grant-roles-existing

etcdctl: don't crash on duplicate role in user grant
Anthony Romano 9 years ago
parent
commit
095a755e4d
2 changed files with 9 additions and 14 deletions
  1. 6 0
      e2e/ctl_v2_test.go
  2. 3 14
      etcdctl/ctlv2/command/user_commands.go

+ 6 - 0
e2e/ctl_v2_test.go

@@ -181,6 +181,12 @@ func testCtlV2GetRoleUser(t *testing.T, cfg *etcdProcessClusterConfig) {
 	if err := etcdctlUserGet(epc, "username"); err != nil {
 	if err := etcdctlUserGet(epc, "username"); err != nil {
 		t.Fatalf("failed to get user (%v)", err)
 		t.Fatalf("failed to get user (%v)", err)
 	}
 	}
+	// ensure double grant gives an error; was crashing in 2.3.1
+	regrantArgs := etcdctlPrefixArgs(epc)
+	regrantArgs = append(regrantArgs, "user", "grant", "--roles", "foo", "username")
+	if err := spawnWithExpect(regrantArgs, "duplicate"); err != nil {
+		t.Fatalf("missing duplicate error on double grant role (%v)", err)
+	}
 }
 }
 
 
 func TestCtlV2UserList(t *testing.T) {
 func TestCtlV2UserList(t *testing.T) {

+ 3 - 14
etcdctl/ctlv2/command/user_commands.go

@@ -17,8 +17,6 @@ package command
 import (
 import (
 	"fmt"
 	"fmt"
 	"os"
 	"os"
-	"reflect"
-	"sort"
 	"strings"
 	"strings"
 
 
 	"github.com/bgentry/speakeasy"
 	"github.com/bgentry/speakeasy"
@@ -195,21 +193,12 @@ func userGrantRevoke(c *cli.Context, grant bool) {
 		os.Exit(1)
 		os.Exit(1)
 	}
 	}
 
 
-	var newUser *client.User
 	if grant {
 	if grant {
-		newUser, err = api.GrantUser(ctx, user, roles)
+		_, err = api.GrantUser(ctx, user, roles)
 	} else {
 	} else {
-		newUser, err = api.RevokeUser(ctx, user, roles)
-	}
-	sort.Strings(newUser.Roles)
-	sort.Strings(currentUser.Roles)
-	if reflect.DeepEqual(newUser.Roles, currentUser.Roles) {
-		if grant {
-			fmt.Printf("User unchanged; roles already granted")
-		} else {
-			fmt.Printf("User unchanged; roles already revoked")
-		}
+		_, err = api.RevokeUser(ctx, user, roles)
 	}
 	}
+
 	if err != nil {
 	if err != nil {
 		fmt.Fprintln(os.Stderr, err.Error())
 		fmt.Fprintln(os.Stderr, err.Error())
 		os.Exit(1)
 		os.Exit(1)