func (self *Permissions) AuthorizeDeleteQuery(user common.User, db string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) { return false, common.NewAuthorizationError("Insufficient permission to write to %s", db) } return true, "" }
func (self *CoordinatorImpl) ListDbUsers(requester common.User, db string) ([]common.User, error) { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return nil, common.NewAuthorizationError("Insufficient permissions") } return self.clusterConfiguration.GetDbUsers(db), nil }
func (self *CoordinatorImpl) ListContinuousQueries(user common.User, db string) ([]*protocol.Series, error) { if !user.IsClusterAdmin() && !user.IsDbAdmin(db) { return nil, common.NewAuthorizationError("Insufficient permissions to list continuous queries") } queries := self.clusterConfiguration.GetContinuousQueries(db) points := []*protocol.Point{} for _, query := range queries { queryId := int64(query.Id) queryString := query.Query timestamp := time.Now().Unix() sequenceNumber := uint64(1) points = append(points, &protocol.Point{ Values: []*protocol.FieldValue{ &protocol.FieldValue{Int64Value: &queryId}, &protocol.FieldValue{StringValue: &queryString}, }, Timestamp: ×tamp, SequenceNumber: &sequenceNumber, }) } seriesName := "continuous queries" series := []*protocol.Series{&protocol.Series{ Name: &seriesName, Fields: []string{"id", "query"}, Points: points, }} return series, nil }
func (self *CoordinatorImpl) CreateDbUser(requester common.User, db, username, password string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } if username == "" { return fmt.Errorf("Username cannot be empty") } if !isValidName(username) { return fmt.Errorf("%s isn't a valid username", username) } hash, err := cluster.HashPassword(password) if err != nil { return err } self.CreateDatabase(requester, db, uint8(1)) // ignore the error since the db may exist if self.clusterConfiguration.GetDbUser(db, username) != nil { return fmt.Errorf("User %s already exists", username) } matchers := []*cluster.Matcher{&cluster.Matcher{true, ".*"}} log.Debug("(raft:%s) Creating user %s:%s", self.raftServer.(*RaftServer).raftServer.Name(), db, username) return self.raftServer.SaveDbUser(&cluster.DbUser{cluster.CommonUser{ Name: username, Hash: string(hash), CacheKey: db + "%" + username, }, db, matchers, matchers, false}) }
func (self *Permissions) AuthorizeDropSeries(user common.User, db string, seriesName string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) && !user.HasWriteAccess(seriesName) { return false, common.NewAuthorizationError("Insufficient permissions to drop series") } return true, "" }
func (self *CoordinatorImpl) ChangeDbUserPermissions(requester common.User, db, username, readPermissions, writePermissions string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } return self.raftServer.ChangeDbUserPermissions(db, username, readPermissions, writePermissions) }
func (self *Permissions) AuthorizeListContinuousQueries(user common.User, db string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) { return false, common.NewAuthorizationError("Insufficient permissions to list continuous queries") } return true, "" }
func (self *Permissions) AuthorizeGrantDbUserAdmin(user common.User, db string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) { return false, common.NewAuthorizationError("Insufficient permissions to grant db user admin privileges on %s", db) } return true, "" }
func (self *Permissions) AuthorizeChangeDbUserPermissions(user common.User, db string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) { return false, common.NewAuthorizationError("Insufficient permissions to change db user permissions on %s", db) } return true, "" }
func (self *Permissions) AuthorizeChangeDbUserPassword(user common.User, db string, targetUsername string) (ok bool, err common.AuthorizationError) { if !user.IsDbAdmin(db) && !(user.GetDb() == db && user.GetName() == targetUsername) { return false, common.NewAuthorizationError("Insufficient permissions to change db user password for %s on %s", targetUsername, db) } return true, "" }
func (self *CoordinatorImpl) DeleteContinuousQuery(user common.User, db string, id uint32) error { if !user.IsClusterAdmin() && !user.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions to delete continuous query") } err := self.raftServer.DeleteContinuousQuery(db, id) if err != nil { return err } return nil }
func (self *CoordinatorImpl) ChangeDbUserPassword(requester common.User, db, username, password string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) && !(requester.GetDb() == db && requester.GetName() == username) { return common.NewAuthorizationError("Insufficient permissions") } hash, err := cluster.HashPassword(password) if err != nil { return err } return self.raftServer.ChangeDbUserPassword(db, username, hash) }
func (self *CoordinatorImpl) DeleteDbUser(requester common.User, db, username string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } user := self.clusterConfiguration.GetDbUser(db, username) if user == nil { return fmt.Errorf("User %s doesn't exist", username) } user.CommonUser.IsUserDeleted = true return self.raftServer.SaveDbUser(user) }
func (self *CoordinatorImpl) GetDbUser(requester common.User, db string, username string) (common.User, error) { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return nil, common.NewAuthorizationError("Insufficient permissions") } dbUser := self.clusterConfiguration.GetDbUser(db, username) if dbUser == nil { return nil, fmt.Errorf("Invalid username %s", username) } return dbUser, nil }
func (self *CoordinatorImpl) SetDbAdmin(requester common.User, db, username string, isAdmin bool) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } user := self.clusterConfiguration.GetDbUser(db, username) if user == nil { return fmt.Errorf("Invalid username %s", username) } user.IsAdmin = isAdmin self.raftServer.SaveDbUser(user) return nil }
func (self *CoordinatorImpl) ChangeDbUserPassword(requester common.User, db, username, password string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) && !(requester.GetDb() == db && requester.GetName() == username) { return fmt.Errorf("Insufficient permissions") } dbUsers := self.clusterConfiguration.dbUsers[db] if dbUsers == nil || dbUsers[username] == nil { return fmt.Errorf("Invalid username %s", username) } dbUsers[username].changePassword(password) return self.raftServer.SaveDbUser(dbUsers[username]) }
func (self *CoordinatorImpl) DeleteDbUser(requester common.User, db, username string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return fmt.Errorf("Insufficient permissions") } dbUsers := self.clusterConfiguration.dbUsers[db] if dbUsers == nil || dbUsers[username] == nil { return fmt.Errorf("User %s doesn't exists", username) } user := dbUsers[username] user.CommonUser.IsUserDeleted = true return self.raftServer.SaveDbUser(user) }
func (self *CoordinatorImpl) SetDbAdmin(requester common.User, db, username string, isAdmin bool) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return fmt.Errorf("Insufficient permissions") } dbUsers := self.clusterConfiguration.dbUsers[db] if dbUsers == nil || dbUsers[username] == nil { return fmt.Errorf("Invalid username %s", username) } user := dbUsers[username] user.IsAdmin = isAdmin self.raftServer.SaveDbUser(user) return nil }
func (self *CoordinatorImpl) CreateDbUser(requester common.User, db, username string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } if username == "" { return fmt.Errorf("Username cannot be empty") } self.CreateDatabase(requester, db, uint8(1)) // ignore the error since the db may exist dbUsers := self.clusterConfiguration.dbUsers[db] if dbUsers != nil && dbUsers[username] != nil { return fmt.Errorf("User %s already exists", username) } matchers := []*Matcher{&Matcher{true, ".*"}} return self.raftServer.SaveDbUser(&dbUser{CommonUser{Name: username}, db, matchers, matchers, false}) }
func (self *CoordinatorImpl) DropSeries(user common.User, db, series string) error { if !user.IsClusterAdmin() && !user.IsDbAdmin(db) && !user.HasWriteAccess(series) { return common.NewAuthorizationError("Insufficient permission to drop series") } if self.clusterConfiguration.IsSingleServer() { return self.datastore.DropSeries(db, series) } servers, _ := self.clusterConfiguration.GetServersToMakeQueryTo(&db) for _, server := range servers { if err := self.handleDropSeries(server.server, db, series); err != nil { return err } } return nil }
func (self *CoordinatorImpl) DeleteSeriesData(user common.User, db string, query *parser.DeleteQuery, localOnly bool) error { if !user.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permission to write to %s", db) } if self.clusterConfiguration.IsSingleServer() || localOnly { return self.deleteSeriesDataLocally(user, db, query) } servers, _ := self.clusterConfiguration.GetServersToMakeQueryTo(&db) for _, server := range servers { if err := self.handleSeriesDelete(user, server.server, db, query); err != nil { return err } } return nil }
func (self *CoordinatorImpl) CreateDbUser(requester common.User, db, username, password string, permissions ...string) error { if !requester.IsClusterAdmin() && !requester.IsDbAdmin(db) { return common.NewAuthorizationError("Insufficient permissions") } if username == "" { return fmt.Errorf("Username cannot be empty") } if !isValidName(username) { return fmt.Errorf("%s isn't a valid username", username) } hash, err := cluster.HashPassword(password) if err != nil { return err } if !self.clusterConfiguration.DatabaseExists(db) { return fmt.Errorf("No such database %s", db) } if self.clusterConfiguration.GetDbUser(db, username) != nil { return fmt.Errorf("User %s already exists", username) } readMatcher := []*cluster.Matcher{&cluster.Matcher{true, ".*"}} writeMatcher := []*cluster.Matcher{&cluster.Matcher{true, ".*"}} switch len(permissions) { case 0: case 2: readMatcher[0].Name = permissions[0] writeMatcher[0].Name = permissions[1] } log.Debug("(raft:%s) Creating user %s:%s", self.raftServer.(*RaftServer).raftServer.Name(), db, username) return self.raftServer.SaveDbUser(&cluster.DbUser{cluster.CommonUser{ Name: username, Hash: string(hash), CacheKey: db + "%" + username, }, db, readMatcher, writeMatcher, false}) }