func (t tokenService) ParseAccessToken(token string) (interfaces.Token, types.Error) { splits := strings.Split(token, "..") if len(splits) != 2 { return nil, types.DefaultUnknownTokenError } userIdStr, err := base64.RawURLEncoding.DecodeString(splits[0]) if err != nil { return nil, types.DefaultUnknownTokenError } userId, err := ct.ParseUserId(string(userIdStr)) if err != nil { return nil, types.DefaultUnknownTokenError } return tokenInfo{userId}, nil }
func (m *UserPowerLevelMap) UnmarshalJSON(bytes []byte) error { userMap := map[string]int{} err := json.Unmarshal(bytes, userMap) if err != nil { return err } for userId := range userMap { _, err := ct.ParseUserId(userId) if err != nil { return err } } *m = userMap return nil }
func (p urlParams) user(paramPosition int, users interfaces.UserService) (ct.UserId, types.Error) { user, err := ct.ParseUserId(p.params[paramPosition].Value) if err != nil { return ct.UserId{}, types.BadParamError(err.Error()) } if users != nil { exists, err := users.UserExists(user, user) if err != nil { return ct.UserId{}, err } if !exists { return ct.UserId{}, types.NotFoundError("user '" + user.String() + "' doesn't exist") } } return user, nil }
func extraUserForEvent(event types.Event) *ct.UserId { if event.GetEventType() == types.EventTypeMembership { membership := event.GetContent().(*types.MembershipEventContent).Membership isInvited := membership == types.MembershipInvited isKnocking := membership == types.MembershipKnocking isBanned := membership == types.MembershipBanned if isInvited || isKnocking || isBanned { state, ok := event.(*types.State) if !ok { log.Println("membership event was not a state event:", event) return nil } user, err := ct.ParseUserId(state.StateKey) if err != nil { log.Println("failed to parse user id state key:", state.StateKey) return nil } return &user } } return nil }
func (s roomService) SetState( room ct.RoomId, caller ct.UserId, content types.TypedContent, stateKey string, ) (*types.State, types.Error) { userIdStateKey, parseErr := ct.ParseUserId(stateKey) isUserIdStateKey := parseErr == nil eventType := content.GetEventType() switch eventType { case types.EventTypeName: if stateKey != "" { return nil, types.ForbiddenError("state key must be empty for state " + eventType) } case types.EventTypeTopic: if stateKey != "" { return nil, types.ForbiddenError("state key must be empty for state " + eventType) } case types.EventTypeJoinRules: if stateKey != "" { return nil, types.ForbiddenError("state key must be empty for state " + eventType) } case types.EventTypePowerLevels: if stateKey != "" { return nil, types.ForbiddenError("state key must be empty for state " + eventType) } case types.EventTypeCreate: return nil, types.ForbiddenError("cannot set state " + eventType) case types.EventTypeAliases: return nil, types.ForbiddenError("cannot set state " + eventType) case types.EventTypeMembership: membership, ok := content.(*types.MembershipEventContent) if !ok || membership == nil { panic("expected membership event content, got " + reflect.TypeOf(content).String()) } if !isUserIdStateKey { return nil, types.ForbiddenError("state key must be a user id for state " + eventType) } state, err := s.doMembershipChange(room, caller, userIdStateKey, membership) if err != nil { return nil, err } return state, nil } if isUserIdStateKey && userIdStateKey != caller { return nil, types.ForbiddenError("cannot set the state of another user") } existing, err := s.rooms.RoomState(room, eventType, stateKey) if err != nil { return nil, err } if existing != nil { err := s.testPowerLevel(room, caller, func(pl *types.PowerLevelsEventContent) int { return pl.CreateState }) if err != nil { return nil, err } } err = s.testPowerLevel(room, caller, func(pl *types.PowerLevelsEventContent) int { if eventLevel, ok := pl.Events[eventType]; ok { return eventLevel } return pl.EventDefault }) if err != nil { return nil, err } return s.setState(room, caller, content, stateKey) }