Merge pull request #251 from influxdb/fix-246-add-details-to-user-index
Fix #246. Add user details to index endpoint.pull/227/merge
commit
a975d94c1f
|
@ -848,14 +848,14 @@ func (self *HttpServer) listDbUsers(w libhttp.ResponseWriter, r *libhttp.Request
|
|||
db := r.URL.Query().Get(":db")
|
||||
|
||||
self.tryAsDbUserAndClusterAdmin(w, r, func(u common.User) (int, interface{}) {
|
||||
names, err := self.userManager.ListDbUsers(u, db)
|
||||
dbUsers, err := self.userManager.ListDbUsers(u, db)
|
||||
if err != nil {
|
||||
return errorToStatusCode(err), err.Error()
|
||||
}
|
||||
|
||||
users := make([]*User, 0, len(names))
|
||||
for _, name := range names {
|
||||
users = append(users, &User{name})
|
||||
users := make([]*UserDetail, 0, len(dbUsers))
|
||||
for _, dbUser := range dbUsers {
|
||||
users = append(users, &UserDetail{dbUser.GetName(), dbUser.IsDbAdmin(db)})
|
||||
}
|
||||
return libhttp.StatusOK, users
|
||||
})
|
||||
|
@ -871,8 +871,7 @@ func (self *HttpServer) showDbUser(w libhttp.ResponseWriter, r *libhttp.Request)
|
|||
return errorToStatusCode(err), err.Error()
|
||||
}
|
||||
|
||||
userDetail := &UserDetail{username, user.IsDbAdmin(db)}
|
||||
fmt.Println(userDetail)
|
||||
userDetail := &UserDetail{user.GetName(), user.IsDbAdmin(db)}
|
||||
|
||||
return libhttp.StatusOK, userDetail
|
||||
})
|
||||
|
|
|
@ -178,9 +178,10 @@ func (self *ApiSuite) SetUpSuite(c *C) {
|
|||
},
|
||||
},
|
||||
}
|
||||
|
||||
self.manager = &MockUserManager{
|
||||
clusterAdmins: []string{"root"},
|
||||
dbUsers: map[string][]string{"db1": []string{"db_user1"}},
|
||||
dbUsers: map[string]map[string]MockDbUser{"db1": map[string]MockDbUser{"db_user1": {Name: "db_user1", IsAdmin: false}}},
|
||||
}
|
||||
self.engine = &MockEngine{}
|
||||
dir := c.MkDir()
|
||||
|
@ -738,10 +739,11 @@ func (self *ApiSuite) TestDbUsersIndex(c *C) {
|
|||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
c.Assert(err, IsNil)
|
||||
users := []*User{}
|
||||
users := []*UserDetail{}
|
||||
err = json.Unmarshal(body, &users)
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(users, DeepEquals, []*User{&User{"db_user1"}})
|
||||
c.Assert(users, HasLen, 1)
|
||||
c.Assert(users[0], DeepEquals, &UserDetail{"db_user1", false})
|
||||
}
|
||||
|
||||
func (self *ApiSuite) TestDbUserShow(c *C) {
|
||||
|
|
|
@ -12,18 +12,41 @@ type Operation struct {
|
|||
isAdmin bool
|
||||
}
|
||||
|
||||
type MockUser struct {
|
||||
common.User
|
||||
type MockDbUser struct {
|
||||
Name string
|
||||
IsAdmin bool
|
||||
}
|
||||
|
||||
func (self MockUser) IsDbAdmin(_ string) bool {
|
||||
func (self MockDbUser) GetName() string {
|
||||
return self.Name
|
||||
}
|
||||
|
||||
func (self MockDbUser) IsDeleted() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (self MockDbUser) IsClusterAdmin() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (self MockDbUser) IsDbAdmin(_ string) bool {
|
||||
return self.IsAdmin
|
||||
}
|
||||
|
||||
func (self MockDbUser) GetDb() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (self MockDbUser) HasWriteAccess(_ string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (self MockDbUser) HasReadAccess(_ string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type MockUserManager struct {
|
||||
dbUsers map[string][]string
|
||||
dbUsers map[string]map[string]MockDbUser
|
||||
clusterAdmins []string
|
||||
ops []*Operation
|
||||
}
|
||||
|
@ -99,10 +122,21 @@ func (self *MockUserManager) ListClusterAdmins(requester common.User) ([]string,
|
|||
return self.clusterAdmins, nil
|
||||
}
|
||||
|
||||
func (self *MockUserManager) ListDbUsers(requester common.User, db string) ([]string, error) {
|
||||
return self.dbUsers[db], nil
|
||||
func (self *MockUserManager) ListDbUsers(requester common.User, db string) ([]common.User, error) {
|
||||
dbUsers := self.dbUsers[db]
|
||||
users := make([]common.User, 0, len(dbUsers))
|
||||
for _, user := range dbUsers {
|
||||
users = append(users, user)
|
||||
}
|
||||
|
||||
return users, nil
|
||||
}
|
||||
|
||||
func (self *MockUserManager) GetDbUser(requester common.User, db, username string) (common.User, error) {
|
||||
return MockUser{Name: username, IsAdmin: false}, nil
|
||||
dbUsers := self.dbUsers[db]
|
||||
if dbUser, ok := dbUsers[username]; ok {
|
||||
return MockDbUser{Name: dbUser.GetName(), IsAdmin: dbUser.IsDbAdmin(db)}, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("'%s' is not a valid username for database '%s'", username, db)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -420,15 +420,17 @@ func (self *ClusterConfiguration) GetContinuousQueries(db string) []*ContinuousQ
|
|||
return self.continuousQueries[db]
|
||||
}
|
||||
|
||||
func (self *ClusterConfiguration) GetDbUsers(db string) (names []string) {
|
||||
func (self *ClusterConfiguration) GetDbUsers(db string) []*dbUser {
|
||||
self.usersLock.RLock()
|
||||
defer self.usersLock.RUnlock()
|
||||
|
||||
dbUsers := self.dbUsers[db]
|
||||
users := make([]*dbUser, 0, len(dbUsers))
|
||||
for name, _ := range dbUsers {
|
||||
names = append(names, name)
|
||||
fmt.Println(name)
|
||||
users = append(users, dbUsers[name])
|
||||
}
|
||||
return
|
||||
return users
|
||||
}
|
||||
|
||||
func (self *ClusterConfiguration) GetDbUser(db, username string) *dbUser {
|
||||
|
|
|
@ -1225,7 +1225,7 @@ func (self *CoordinatorImpl) DeleteDbUser(requester common.User, db, username st
|
|||
return self.raftServer.SaveDbUser(user)
|
||||
}
|
||||
|
||||
func (self *CoordinatorImpl) ListDbUsers(requester common.User, db string) ([]string, error) {
|
||||
func (self *CoordinatorImpl) ListDbUsers(requester common.User, db string) ([]*dbUser, error) {
|
||||
if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) {
|
||||
return nil, common.NewAuthorizationError("Insufficient permissions")
|
||||
}
|
||||
|
@ -1233,7 +1233,7 @@ func (self *CoordinatorImpl) ListDbUsers(requester common.User, db string) ([]st
|
|||
return self.clusterConfiguration.GetDbUsers(db), nil
|
||||
}
|
||||
|
||||
func (self *CoordinatorImpl) GetDbUser(requester common.User, db string, username string) (common.User, error) {
|
||||
func (self *CoordinatorImpl) GetDbUser(requester common.User, db string, username string) (*dbUser, error) {
|
||||
if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) {
|
||||
return nil, common.NewAuthorizationError("Insufficient permissions")
|
||||
}
|
||||
|
|
|
@ -387,7 +387,9 @@ func (self *CoordinatorSuite) TestAdminOperations(c *C) {
|
|||
// can list db users
|
||||
dbUsers, err := coordinator.ListDbUsers(root, "db1")
|
||||
c.Assert(err, IsNil)
|
||||
c.Assert(dbUsers, DeepEquals, []string{"db_user"})
|
||||
c.Assert(dbUsers, HasLen, 1)
|
||||
c.Assert(dbUsers[0].GetName(), Equals, "db_user")
|
||||
c.Assert(dbUsers[0].IsDbAdmin("db1"), Equals, true)
|
||||
|
||||
// can delete cluster admins and db users
|
||||
c.Assert(coordinator.DeleteDbUser(root, "db1", "db_user"), IsNil)
|
||||
|
@ -487,11 +489,10 @@ func (self *CoordinatorSuite) TestDbAdminOperations(c *C) {
|
|||
// can get db users
|
||||
admins, err := coordinator.ListDbUsers(dbUser, "db1")
|
||||
c.Assert(err, IsNil)
|
||||
adminsSet := map[string]bool{}
|
||||
for _, admin := range admins {
|
||||
adminsSet[admin] = true
|
||||
}
|
||||
c.Assert(adminsSet, DeepEquals, map[string]bool{"db_user": true, "db_user2": true})
|
||||
c.Assert(admins[0].GetName(), Equals, "db_user")
|
||||
c.Assert(admins[0].IsDbAdmin("db1"), Equals, true)
|
||||
c.Assert(admins[1].GetName(), Equals, "db_user2")
|
||||
c.Assert(admins[1].IsDbAdmin("db1"), Equals, true)
|
||||
|
||||
// cannot create db users for a different db
|
||||
c.Assert(coordinator.CreateDbUser(dbUser, "db2", "db_user"), NotNil)
|
||||
|
|
|
@ -55,7 +55,7 @@ type UserManager interface {
|
|||
// Change db user's password. It's an error if requester isn't a cluster admin or db admin
|
||||
ChangeDbUserPassword(requester common.User, db, username, password string) error
|
||||
// list cluster admins. only a cluster admin or the db admin can list the db users
|
||||
ListDbUsers(requester common.User, db string) ([]string, error)
|
||||
ListDbUsers(requester common.User, db string) ([]common.User, error)
|
||||
GetDbUser(requester common.User, db, username string) (common.User, error)
|
||||
// make user a db admin for 'db'. It's an error if the requester
|
||||
// isn't a db admin or cluster admin or if user isn't a db user
|
||||
|
|
Loading…
Reference in New Issue