public Mono<UpdateMeetingResult> authAndUpdateMeeting(
            @NotNull Long requesterId,
            @NotNull Long meetingId,
            @Nullable String name,
            @Nullable String intro,
            @Nullable String password) {
        try {
            Validator.notNull(requesterId, "requesterId");
            Validator.notNull(meetingId, "meetingId");
            Validator.inOptionalLengthRange(name, "name", nameMinLength, nameMaxLength);
            Validator.inOptionalLengthRange(intro, "intro", introMinLength, introMaxLength);
            if (password != null) {
                validatePassword(password);
            }
        } catch (Exception e) {
            return Mono.error(e);
        }
        if (name == null && intro == null && password == null) {
            return Mono.just(UpdateMeetingResult.FAILED);
        }
        return meetingRepository.findById(meetingId)
                .flatMap(meeting -> {
                    // TODO: support configuring the logic of authorization.
                    if (password != null) {
                        if (requesterId.equals(meeting.getCreatorId())) {
                            return meetingRepository.updateMeeting(meetingId, name, intro, password)
                                    .map(updateResult -> updateResult.getModifiedCount() > 0
                                            ? new UpdateMeetingResult(true, meeting)
                                            : UpdateMeetingResult.FAILED);
                        }
                        return isAllowedToViewMeetingInfo(requesterId, meeting)
                                .flatMap(allowed -> allowed
                                        ? EXCEPTION_NOT_CREATOR_TO_UPDATE_MEETING_PASSWORD
                                        : EXCEPTION_UPDATE_INFO_OF_NONEXISTENT_MEETING);
                    }
                    return isAllowedToViewMeetingInfo(requesterId, meeting)
                            .flatMap(allowed -> allowed
                                    ? meetingRepository.updateMeeting(meetingId, name, intro, null)
                                            .map(updateResult -> updateResult.getModifiedCount() > 0
                                                    ? new UpdateMeetingResult(true, meeting)
                                                    : UpdateMeetingResult.FAILED)
                                    : EXCEPTION_UPDATE_INFO_OF_NONEXISTENT_MEETING);
                });
    }
Use {@link SecureRandom} because users usually input meeting IDs to join meetings, so we
should make sure they are unpredictable.
turms-service/src/main/java/im/turms/service/domain/conference/service/ConferenceService.java