// NewUser tracks a new authenticated user and saves its details in the state func NewUser(st *state.State, username, macaroon string, discharges []string) (*UserState, error) { var authStateData AuthState err := st.Get("auth", &authStateData) if err == state.ErrNoState { authStateData = AuthState{} } else if err != nil { return nil, err } sort.Strings(discharges) authStateData.LastID++ authenticatedUser := UserState{ ID: authStateData.LastID, Username: username, Macaroon: macaroon, Discharges: discharges, StoreMacaroon: macaroon, StoreDischarges: discharges, } authStateData.Users = append(authStateData.Users, authenticatedUser) st.Set("auth", authStateData) return &authenticatedUser, nil }
func newRunnerManager(s *state.State) *runnerManager { rm := &runnerManager{ runner: state.NewTaskRunner(s), } rm.runner.AddHandler("runMgr1", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.Set("runMgr1Mark", 1) return nil }, nil) rm.runner.AddHandler("runMgr2", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.Set("runMgr2Mark", 1) return nil }, nil) rm.runner.AddHandler("runMgrEnsureBefore", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.EnsureBefore(20 * time.Millisecond) return nil }, nil) return rm }
// Set sets the SnapState of the given snap, overwriting any earlier state. func Set(s *state.State, name string, snapst *SnapState) { var snaps map[string]*json.RawMessage err := s.Get("snaps", &snaps) if err != nil && err != state.ErrNoState { panic("internal error: cannot unmarshal snaps state: " + err.Error()) } if snaps == nil { snaps = make(map[string]*json.RawMessage) } if snapst == nil || (len(snapst.Sequence) == 0 && snapst.Candidate == nil) { delete(snaps, name) } else { data, err := json.Marshal(snapst) if err != nil { panic("internal error: cannot marshal snap state: " + err.Error()) } raw := json.RawMessage(data) snaps[name] = &raw } s.Set("snaps", snaps) }
// RemoveUser removes a user from the state given its ID func RemoveUser(st *state.State, userID int) error { var authStateData AuthState err := st.Get("auth", &authStateData) if err != nil { return err } for i := range authStateData.Users { if authStateData.Users[i].ID == userID { // delete without preserving order n := len(authStateData.Users) - 1 authStateData.Users[i] = authStateData.Users[n] authStateData.Users[n] = UserState{} authStateData.Users = authStateData.Users[:n] st.Set("auth", authStateData) return nil } } return fmt.Errorf("invalid user") }
func setConns(st *state.State, conns map[string]connState) { st.Set("conns", conns) }