in rest-api/src/jetbrains/buildServer/server/rest/request/BuildRequest.java [1675:1732]
private static BuildIconStatus create(final BeanContext beanContext, final Value<BuildPromotion> buildPromotionRetriever) {
BuildIconStatus[] result = new BuildIconStatus[1];
try {
final SecurityContextEx securityContext = beanContext.getSingletonService(SecurityContextEx.class);
final AuthorityHolder currentUserAuthorityHolder = securityContext.getAuthorityHolder();
try {
securityContext.runAsSystem(() -> {
BuildPromotion buildPromotion = buildPromotionRetriever.get();
if (!hasPermissionsToViewStatus(buildPromotion, currentUserAuthorityHolder, beanContext)) {
LOG.info("No permissions to access requested build. Either authenticate as user with appropriate permissions, or ensure 'guest' user has appropriate permissions " +
"or enable external status widget for the build configuration.");
result[0] = PERMISSION;
return;
}
final SBuild build = buildPromotion.getAssociatedBuild();
//todo: support queued builds
if (build == null) {
result[0] = NOT_FOUND;
return;
}
if (!build.isFinished()) {
result[0] = RUNNING; //todo: support running/failing and may be running/last failed
return;
}
if (build.getCanceledInfo() != null) {
result[0] = CANCELED;
return;
}
if (build.getStatusDescriptor().isSuccessful()) {
result[0] = SUCCESSFUL;
return;
}
if (build.isInternalError()) {
result[0] = ERROR;
return;
}
result[0] = FAILED;
});
return result[0];
} catch (NotFoundException e) {
if (TeamCityProperties.getBoolean("rest.buildRequest.statusIcon.enableNotFoundResponsesWithoutPermissions") ||
hasPermissionsToViewStatusGlobally(securityContext, beanContext)) {
LOG.debug("Cannot find build for status icon under system, returning 'not_found': " + e.getMessage());
return NOT_FOUND;
} else {
//should return the same error as when no permissions in order not to expose build existence
LOG.debug("Cannot find build for status icon under system, returning 'permission': " + e.getMessage());
return PERMISSION;
}
} catch (Throwable throwable) {
LOG.info("Error while retrieving build under system, returning 'internal_error'': " + throwable.toString(), throwable);
return INTERNAL_ERROR; //todo: use separate icon for errors (most importantly, wrong request)
}
} catch (AccessDeniedException e) {
LOG.warn("Unexpected access denied error encountered while retrieving build, returning 'permission': " + e.toString());
return PERMISSION;
}
}