Search in sources :

Example 1 with SUser

use of jetbrains.buildServer.users.SUser in project teamcity-rest by JetBrains.

the class ChangeFinder method getPrefilteredItems.

@NotNull
@Override
public ItemHolder<SVcsModificationOrChangeDescriptor> getPrefilteredItems(@NotNull final Locator locator) {
    final String internalVersion = locator.getSingleDimensionValue(INTERNAL_VERSION);
    if (internalVersion != null) {
        return wrapModifications(((VcsModificationHistoryEx) myVcsModificationHistory).findModificationsByVersion(internalVersion));
    }
    ValueCondition displayVersionCondition = ParameterCondition.createValueCondition(locator.lookupSingleDimensionValue(VERSION));
    final String displayVersion = displayVersionCondition != null ? displayVersionCondition.getConstantValueIfSimpleEqualsCondition() : null;
    if (displayVersion != null) {
        locator.markUsed(Collections.singleton(VERSION));
        return wrapModifications(((VcsModificationHistoryEx) myVcsModificationHistory).findModificationsByDisplayVersion(displayVersion));
    }
    Boolean personal = locator.lookupSingleDimensionValueAsBoolean(PERSONAL);
    if (personal != null && personal) {
        if (locator.lookupSingleDimensionValue(BUILD) == null && locator.lookupSingleDimensionValue(USER) == null) {
            throw new BadRequestException("Filtering personal changes is supported only when '" + DIMENSION_ID + "', '" + USER + "' or '" + BUILD + "' dimensions are specified");
        }
    }
    final String buildLocator = locator.getSingleDimensionValue(BUILD);
    if (buildLocator != null) {
        BuildPromotion buildFromBuildFinder;
        try {
            buildFromBuildFinder = myBuildPromotionFinder.getItem(buildLocator);
        } catch (Exception e) {
            if (!TeamCityProperties.getBoolean("rest.request.changes.legacySingleBuildSearch")) {
                throw e;
            }
            // support for finished builds
            // todo: use buildPromotionFinder here (ensure it also supports finished builds)
            // THIS SHOULD NEVER HAPPEN
            buildFromBuildFinder = myBuildFinder.getBuildPromotion(null, buildLocator);
        }
        return wrapDescriptors(getBuildChangeDescriptors(buildFromBuildFinder, locator));
    }
    // pre-9.0 compatibility
    final Long promotionLocator = locator.getSingleDimensionValueAsLong(PROMOTION);
    if (promotionLocator != null) {
        // noinspection ConstantConditions
        return wrapDescriptors(getBuildChangeDescriptors(BuildFinder.getBuildPromotion(promotionLocator, myServiceLocator.findSingletonService(BuildPromotionManager.class)), locator));
    }
    final String parentChangeLocator = locator.getSingleDimensionValue(CHILD_CHANGE);
    if (parentChangeLocator != null) {
        final SVcsModification parentChange = getItem(parentChangeLocator).getSVcsModification();
        return wrapModifications(getChangesWhichHasChild(parentChange, locator.getSingleDimensionValueAsLong(DIMENSION_LOOKUP_LIMIT)));
    // todo: return iterator instead of processing lookup limit here
    }
    final String childChangeLocator = locator.getSingleDimensionValue(PARENT_CHANGE);
    if (childChangeLocator != null) {
        final SVcsModification parentChange = getItem(childChangeLocator).getSVcsModification();
        return wrapModifications(getChangesWhichHasParent(parentChange, locator.getSingleDimensionValueAsLong(DIMENSION_LOOKUP_LIMIT)));
    }
    final String graphLocator = locator.getSingleDimensionValue(DAG_TRAVERSE);
    if (graphLocator != null) {
        final GraphFinder<SVcsModification> graphFinder = new GraphFinder<SVcsModification>(locatorText -> getItems(locatorText).myEntries.stream().map(SVcsModificationOrChangeDescriptor::getSVcsModification).collect(Collectors.toList()), new ChangesGraphTraverser());
        graphFinder.setDefaultLookupLimit(1000L);
        return wrapModifications(graphFinder.getItems(graphLocator).myEntries);
    }
    final String userLocator = locator.getSingleDimensionValue(USER);
    if (userLocator != null) {
        final SUser user = myUserFinder.getItem(userLocator);
        return wrapModifications(myServiceLocator.getSingletonService(UserChangesFacade.class).getAllVcsModifications(user));
    }
    final String username = locator.getSingleDimensionValue(USERNAME);
    if (username != null) {
        return wrapModifications(myServiceLocator.getSingletonService(VcsModificationsStorage.class).findModificationsByUsername(username));
    }
    Long sinceChangeId = null;
    final String sinceChangeLocator = locator.getSingleDimensionValue(SINCE_CHANGE);
    if (sinceChangeLocator != null) {
        sinceChangeId = getChangeIdBySinceChangeLocator(sinceChangeLocator);
    }
    final String vcsRootInstanceLocator = locator.getSingleDimensionValue(VCS_ROOT_INSTANCE);
    if (vcsRootInstanceLocator != null) {
        final VcsRootInstance vcsRootInstance = myVcsRootInstanceFinder.getItem(vcsRootInstanceLocator);
        if (sinceChangeId != null) {
            // todo: use lookupLimit here or otherwise limit processing
            return wrapModifications(myVcsModificationHistory.getModificationsInRange(vcsRootInstance, sinceChangeId, null));
        } else {
            // todo: highly inefficient!
            return wrapModifications(myVcsModificationHistory.getAllModifications(vcsRootInstance));
        }
    }
    SBuildType buildType = null;
    // todo: support multiple buildTypes here
    final String buildTypeLocator = locator.getSingleDimensionValue(BUILD_TYPE);
    if (buildTypeLocator != null) {
        buildType = myBuildTypeFinder.getBuildType(null, buildTypeLocator, false);
    }
    Boolean pending = locator.getSingleDimensionValueAsBoolean(PENDING);
    if (pending != null) {
        if (pending) {
            Stream<SVcsModificationOrChangeDescriptor> changes = getPendingChanges(buildType, locator);
            return processor -> changes.allMatch(processor::processItem);
        } else {
            locator.markUnused(PENDING);
        }
    }
    if (buildType != null) {
        Stream<SVcsModificationOrChangeDescriptor> changes = getBranchChanges(buildType, SelectPrevBuildPolicy.SINCE_NULL_BUILD, locator);
        return processor -> changes.allMatch(processor::processItem);
    }
    if (locator.lookupSingleDimensionValue(BRANCH) != null) {
        throw new BadRequestException("Filtering changes by branch is only supported when buildType is specified.");
    }
    final String projectLocator = locator.getSingleDimensionValue(PROJECT);
    if (projectLocator != null) {
        return wrapModifications(getProjectChanges(myProjectFinder.getItem(projectLocator), sinceChangeId));
    }
    if (sinceChangeId != null) {
        // todo: use lookupLimit here or otherwise limit processing
        return wrapModifications(myVcsModificationHistory.getModificationsInRange(null, sinceChangeId, null));
    }
    // ItemHolder
    return wrapModifications(((VcsModificationHistoryEx) myVcsModificationHistory)::processModifications);
}
Also used : LocatorProcessException(jetbrains.buildServer.server.rest.errors.LocatorProcessException) WrappingItemHolder(jetbrains.buildServer.server.rest.data.util.WrappingItemHolder) java.util(java.util) SVcsModificationOrChangeDescriptor(jetbrains.buildServer.server.rest.data.change.SVcsModificationOrChangeDescriptor) LocatorName(jetbrains.buildServer.server.rest.swagger.constants.LocatorName) DuplicateChecker(jetbrains.buildServer.server.rest.data.util.DuplicateChecker) LocatorResource(jetbrains.buildServer.server.rest.swagger.annotations.LocatorResource) AuthorityHolder(jetbrains.buildServer.serverSide.auth.AuthorityHolder) UnwrappingFilter(jetbrains.buildServer.server.rest.data.util.UnwrappingFilter) Function(java.util.function.Function) BadRequestException(jetbrains.buildServer.server.rest.errors.BadRequestException) LocatorDimensionDataType(jetbrains.buildServer.server.rest.swagger.constants.LocatorDimensionDataType) BuildTypeDescriptor(jetbrains.buildServer.BuildTypeDescriptor) UserChangesFacade(jetbrains.buildServer.serverSide.userChanges.UserChangesFacade) KeyDuplicateChecker(jetbrains.buildServer.server.rest.data.util.KeyDuplicateChecker) StringUtil(jetbrains.buildServer.util.StringUtil) SecurityContext(jetbrains.buildServer.serverSide.auth.SecurityContext) CollectionsUtil(jetbrains.buildServer.util.CollectionsUtil) PagerData(jetbrains.buildServer.server.rest.model.PagerData) Constants(jetbrains.buildServer.server.rest.request.Constants) ServiceLocator(jetbrains.buildServer.ServiceLocator) jetbrains.buildServer.serverSide(jetbrains.buildServer.serverSide) RemoteBuildTypeIdUtil(jetbrains.buildServer.serverSide.impl.RemoteBuildTypeIdUtil) BFSVisitorAdapter(jetbrains.buildServer.util.graph.BFSVisitorAdapter) Predicate(java.util.function.Predicate) VcsModificationEx(jetbrains.buildServer.vcs.impl.VcsModificationEx) DAGIterator(jetbrains.buildServer.util.graph.DAGIterator) jetbrains.buildServer.vcs(jetbrains.buildServer.vcs) Collectors(java.util.stream.Collectors) RemoteBuildType(jetbrains.buildServer.serverSide.impl.RemoteBuildType) Nullable(org.jetbrains.annotations.Nullable) DAG(jetbrains.buildServer.util.graph.DAG) Stream(java.util.stream.Stream) LocatorDimension(jetbrains.buildServer.server.rest.swagger.annotations.LocatorDimension) NotFoundException(jetbrains.buildServer.server.rest.errors.NotFoundException) AuthUtil(jetbrains.buildServer.serverSide.auth.AuthUtil) NotNull(org.jetbrains.annotations.NotNull) SUser(jetbrains.buildServer.users.SUser) SUser(jetbrains.buildServer.users.SUser) SVcsModificationOrChangeDescriptor(jetbrains.buildServer.server.rest.data.change.SVcsModificationOrChangeDescriptor) LocatorProcessException(jetbrains.buildServer.server.rest.errors.LocatorProcessException) BadRequestException(jetbrains.buildServer.server.rest.errors.BadRequestException) NotFoundException(jetbrains.buildServer.server.rest.errors.NotFoundException) BadRequestException(jetbrains.buildServer.server.rest.errors.BadRequestException) NotNull(org.jetbrains.annotations.NotNull)

Example 2 with SUser

use of jetbrains.buildServer.users.SUser in project teamcity-rest by JetBrains.

the class ProjectFinder method getPrefilteredItems.

@NotNull
@Override
public ItemHolder<SProject> getPrefilteredItems(@NotNull final Locator locator) {
    // this should be the first one as the order returned here is important!
    final String selectedForUser = locator.getSingleDimensionValue(DIMENSION_SELECTED);
    if (selectedForUser != null) {
        Locator selectedByUserLocator = new Locator(selectedForUser, "user", "mode");
        String userLocator = selectedByUserLocator.getSingleDimensionValue("user");
        String modeLocator = selectedByUserLocator.getSingleDimensionValue("mode");
        if (userLocator == null && modeLocator == null) {
            // assume it's user locator - the only supported way before 2017.1
            userLocator = selectedForUser;
        } else {
            selectedByUserLocator.checkLocatorFullyProcessed();
        }
        final SUser user = myServiceLocator.getSingletonService(UserFinder.class).getItem(userLocator);
        return getItemHolder(getSelectedProjects(user, getSelectedByUserMode(modeLocator, SelectedByUserMode.SELECTED_AND_UNKNOWN)));
    }
    final SProject parentProject;
    try {
        parentProject = getParentProject(locator);
    } catch (AccessDeniedException e) {
        // workaround for https://youtrack.jetbrains.com/issue/TW-46290
        // note: finding affectedProject under system is a bad approach as that can be used to probe server data without due permissions, so support only some hardcoded cases here
        String affectedProjectDimension = locator.lookupSingleDimensionValue(DIMENSION_AFFECTED_PROJECT);
        if (getRootProject().getExternalId().equals(affectedProjectDimension) || getLocator(getRootProject()).equals(affectedProjectDimension)) {
            // it was a request with affectedProject==_Root, but user got access denied on finding, returning empty collection instead of 403/Forbidden
            return getItemHolder(Collections.emptyList());
        }
        // throw original error
        throw e;
    }
    final String name = locator.getSingleDimensionValue(DIMENSION_NAME);
    if (name != null) {
        if (parentProject != null) {
            return getItemHolder(findProjectsByName(parentProject, name, true));
        }
        String directParent = locator.getSingleDimensionValue(DIMENSION_PROJECT);
        if (directParent != null) {
            return getItemHolder(findProjectsByName(getItem(directParent), name, false));
        }
    }
    final String directParent = locator.getSingleDimensionValue(DIMENSION_PROJECT);
    if (directParent != null) {
        return getItemHolder(getItem(directParent).getOwnProjects());
    }
    if (parentProject != null) {
        return getItemHolder(parentProject.getProjects());
    }
    return getItemHolder(myProjectManager.getProjects());
}
Also used : ServiceLocator(jetbrains.buildServer.ServiceLocator) AccessDeniedException(jetbrains.buildServer.serverSide.auth.AccessDeniedException) SUser(jetbrains.buildServer.users.SUser) NotNull(org.jetbrains.annotations.NotNull)

Example 3 with SUser

use of jetbrains.buildServer.users.SUser in project teamcity-rest by JetBrains.

the class TagFinder method getFilter.

@NotNull
@Override
public ItemFilter<TagData> getFilter(@NotNull final Locator locator) {
    if (locator.isSingleValue()) {
        final String singleValue = locator.getSingleValue();
        final MultiCheckerFilter<TagData> result = new MultiCheckerFilter<TagData>();
        result.add(new FilterConditionChecker<TagData>() {

            public boolean isIncluded(@NotNull final TagData item) {
                // the code should correspond to TagFinder.isIncluded method
                return item.isPublic() && item.getLabel().equals(singleValue);
            }
        });
        return result;
    }
    final MultiCheckerFilter<TagData> result = new MultiCheckerFilter<TagData>();
    final String nameDimension = locator.getSingleDimensionValue(NAME);
    if (nameDimension != null) {
        result.add(new FilterConditionChecker<TagData>() {

            public boolean isIncluded(@NotNull final TagData item) {
                // conditions are supported via "condition" dimension
                return nameDimension.equalsIgnoreCase(item.getLabel());
            }
        });
    }
    final Boolean privateDimension = locator.getSingleDimensionValueAsBoolean(PRIVATE);
    if (privateDimension != null) {
        result.add(new FilterConditionChecker<TagData>() {

            public boolean isIncluded(@NotNull final TagData item) {
                return FilterUtil.isIncludedByBooleanFilter(privateDimension, item.getOwner() != null);
            }
        });
    }
    final String ownerLocator = locator.getSingleDimensionValue(OWNER);
    if (ownerLocator != null) {
        final SUser user = myUserFinder.getItem(ownerLocator);
        result.add(new FilterConditionChecker<TagData>() {

            public boolean isIncluded(@NotNull final TagData item) {
                final SUser owner = item.getOwner();
                if (privateDimension == null && owner == null) {
                    // locator "private:any,owner:<user>" should return all public and private of the user (the defaults)
                    return true;
                }
                return user.equals(owner);
            }
        });
    }
    final String condition = locator.getSingleDimensionValue(CONDITION);
    if (condition != null) {
        final ValueCondition parameterCondition = ParameterCondition.createValueCondition(condition);
        result.add(new FilterConditionChecker<TagData>() {

            public boolean isIncluded(@NotNull final TagData item) {
                return parameterCondition.matches(item.getLabel());
            }
        });
    }
    return result;
}
Also used : SUser(jetbrains.buildServer.users.SUser) TagData(jetbrains.buildServer.serverSide.TagData) NotNull(org.jetbrains.annotations.NotNull)

Example 4 with SUser

use of jetbrains.buildServer.users.SUser in project teamcity-rest by JetBrains.

the class TestOccurrenceFinder method getPersonalBuildsFilter.

/**
 * Filters out personal builds by default.
 */
@NotNull
private Filter<STestRun> getPersonalBuildsFilter(@NotNull final Locator locator) {
    final boolean includePersonal = locator.getSingleDimensionValueAsStrictBoolean(INCLUDE_PERSONAL, false);
    if (!includePersonal) {
        locator.markUsed(INCLUDE_ALL_PERSONAL);
        return testRun -> !testRun.getBuild().isPersonal();
    }
    boolean includeAllPersonalPreference = false;
    SUser currentUser = (SUser) mySecurityContext.getAuthorityHolder().getAssociatedUser();
    if (currentUser != null) {
        String showAllPersonalBuildsPreferense = currentUser.getPropertyValue(StandardProperties.SHOW_ALL_PERSONAL_BUILDS);
        if (StringUtil.isTrue(showAllPersonalBuildsPreferense)) {
            includeAllPersonalPreference = true;
        }
    }
    boolean includeAllPersonal = locator.getSingleDimensionValueAsStrictBoolean(INCLUDE_ALL_PERSONAL, includeAllPersonalPreference);
    if (includeAllPersonal) {
        return testRun -> true;
    }
    if (currentUser == null) {
        return testRun -> !testRun.getBuild().isPersonal();
    }
    // noinspection ConstantConditions
    return testRun -> !testRun.getBuild().isPersonal() || currentUser.getId() == testRun.getBuild().getOwner().getId();
}
Also used : LocatorProcessException(jetbrains.buildServer.server.rest.errors.LocatorProcessException) Filter(jetbrains.buildServer.util.filters.Filter) Fields(jetbrains.buildServer.server.rest.model.Fields) java.util(java.util) LocatorName(jetbrains.buildServer.server.rest.swagger.constants.LocatorName) TestHistory(jetbrains.buildServer.serverSide.tests.TestHistory) DuplicateChecker(jetbrains.buildServer.server.rest.data.util.DuplicateChecker) LocatorResource(jetbrains.buildServer.server.rest.swagger.annotations.LocatorResource) ComparatorDuplicateChecker(jetbrains.buildServer.server.rest.data.util.ComparatorDuplicateChecker) ALL_TESTS_NO_DETAILS(jetbrains.buildServer.serverSide.BuildStatisticsOptions.ALL_TESTS_NO_DETAILS) Status(jetbrains.buildServer.messages.Status) jetbrains.buildServer.server.rest.data(jetbrains.buildServer.server.rest.data) TestOccurrence(jetbrains.buildServer.server.rest.model.problem.TestOccurrence) TestScopeFilter(jetbrains.buildServer.server.rest.data.problem.scope.TestScopeFilter) BadRequestException(jetbrains.buildServer.server.rest.errors.BadRequestException) LocatorDimensionDataType(jetbrains.buildServer.server.rest.swagger.constants.LocatorDimensionDataType) HttpServletRequest(javax.servlet.http.HttpServletRequest) TestNameResponsibilityEntry(jetbrains.buildServer.responsibility.TestNameResponsibilityEntry) TestScopeFilterProducer(jetbrains.buildServer.server.rest.data.problem.scope.TestScopeFilterProducer) StringUtil(jetbrains.buildServer.util.StringUtil) SecurityContext(jetbrains.buildServer.serverSide.auth.SecurityContext) FieldInclusionChecker(jetbrains.buildServer.server.rest.util.fieldInclusion.FieldInclusionChecker) CurrentMuteInfo(jetbrains.buildServer.serverSide.mute.CurrentMuteInfo) PagerData(jetbrains.buildServer.server.rest.model.PagerData) Constants(jetbrains.buildServer.server.rest.request.Constants) StandardProperties(jetbrains.buildServer.users.StandardProperties) jetbrains.buildServer.serverSide(jetbrains.buildServer.serverSide) ExceptionUtil(jetbrains.buildServer.util.ExceptionUtil) ComparisonChain(com.google.common.collect.ComparisonChain) Collectors(java.util.stream.Collectors) AggregatingItemHolder(jetbrains.buildServer.server.rest.data.util.AggregatingItemHolder) NamedThreadFactory(jetbrains.buildServer.util.NamedThreadFactory) Nullable(org.jetbrains.annotations.Nullable) ResponsibilityEntry(jetbrains.buildServer.responsibility.ResponsibilityEntry) LocatorDimension(jetbrains.buildServer.server.rest.swagger.annotations.LocatorDimension) Util(jetbrains.buildServer.server.rest.model.Util) BuildRequest(jetbrains.buildServer.server.rest.request.BuildRequest) NotFoundException(jetbrains.buildServer.server.rest.errors.NotFoundException) TestName(jetbrains.buildServer.tests.TestName) NotNull(org.jetbrains.annotations.NotNull) SUser(jetbrains.buildServer.users.SUser) SUser(jetbrains.buildServer.users.SUser) NotNull(org.jetbrains.annotations.NotNull)

Example 5 with SUser

use of jetbrains.buildServer.users.SUser in project teamcity-rest by JetBrains.

the class BuildTest method testBuildOnAgentTriggering.

@Test
public void testBuildOnAgentTriggering() {
    myFixture.addService(new AgentRestrictorFactoryImpl());
    final MockBuildAgent agent2 = myFixture.createEnabledAgent("agent2", "Ant");
    final Build build = new Build();
    final BuildType buildType = new BuildType();
    buildType.setId(myBuildType.getExternalId());
    build.setBuildType(buildType);
    final Agent submittedAgent = new Agent();
    submittedAgent.id = agent2.getId();
    build.setAgent(submittedAgent);
    final SUser triggeringUser = getOrCreateUser("user");
    final SQueuedBuild queuedBuild = build.triggerBuild(triggeringUser, myFixture, new HashMap<Long, Long>());
    assertEquals(Integer.valueOf(agent2.getId()), queuedBuild.getBuildAgentId());
}
Also used : Agent(jetbrains.buildServer.server.rest.model.agent.Agent) Build(jetbrains.buildServer.server.rest.model.build.Build) SUser(jetbrains.buildServer.users.SUser) Test(org.testng.annotations.Test) BaseFinderTest(jetbrains.buildServer.server.rest.data.BaseFinderTest)

Aggregations

SUser (jetbrains.buildServer.users.SUser)125 Test (org.testng.annotations.Test)70 ApiOperation (io.swagger.annotations.ApiOperation)35 BaseFinderTest (jetbrains.buildServer.server.rest.data.BaseFinderTest)35 Build (jetbrains.buildServer.server.rest.model.build.Build)20 BadRequestException (jetbrains.buildServer.server.rest.errors.BadRequestException)18 NotNull (org.jetbrains.annotations.NotNull)18 NotFoundException (jetbrains.buildServer.server.rest.errors.NotFoundException)15 SecurityContextEx (jetbrains.buildServer.serverSide.SecurityContextEx)13 Fields (jetbrains.buildServer.server.rest.model.Fields)12 SUserGroup (jetbrains.buildServer.groups.SUserGroup)11 ProjectEx (jetbrains.buildServer.serverSide.impl.ProjectEx)10 ServiceLocator (jetbrains.buildServer.ServiceLocator)9 BuildTypeImpl (jetbrains.buildServer.serverSide.impl.BuildTypeImpl)9 Nullable (org.jetbrains.annotations.Nullable)9 LocatorProcessException (jetbrains.buildServer.server.rest.errors.LocatorProcessException)8 SecurityContextImpl (jetbrains.buildServer.serverSide.impl.auth.SecurityContextImpl)8 java.util (java.util)7 Collectors (java.util.stream.Collectors)7 jetbrains.buildServer.serverSide (jetbrains.buildServer.serverSide)7