Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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
}
Ejemplo n.º 4
0
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
}
Ejemplo n.º 5
0
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)
}