in s3-artifact-storage-server/src/main/java/jetbrains/buildServer/artifacts/s3/web/S3SettingsController.java [70:156]
protected void doPost(@NotNull final HttpServletRequest request,
@NotNull final HttpServletResponse response,
@NotNull final Element xmlResponse) {
final ActionErrors errors = new ActionErrors();
final String resource = request.getParameter("resource");
if (resource == null) {
errors.addError("resource", "Invalid request: resource parameter was not set");
} else {
final S3ClientResourceFetcher<?> handler = myHandlers.get(resource);
if (handler == null) {
errors.addError("resource", "Invalid request: unsupported resource " + resource);
} else {
try {
final SProject project = getProject(request);
final SUser user = SessionUser.getUser(request);
final boolean canEditProject = AuthUtil.hasPermissionToManageProject(user, project.getProjectId());
if (canEditProject && !project.isReadOnly()) {
final Map<String, String> properties = ParamUtil.putSslValues(myServerPaths, getProperties(request));
xmlResponse.addContent(IOGuard.allowNetworkCall(() -> handler.fetchAsElement(properties, project.getProjectId())));
} else {
final String settingsId = request.getParameter(ArtifactsConstants.EXTERNAL_ARTIFACTS_STORAGE_SETTINGS_ID_KEY);
final SProjectFeatureDescriptor storageFeature = project.findFeatureById(settingsId);
if (storageFeature != null) {
final Map<String, String> properties = storageFeature.getParameters();
xmlResponse.addContent(IOGuard.allowNetworkCall(() -> handler.fetchCurrentValueAsElement(properties, project.getProjectId())));
} else {
errors.addError(resource, "Failed to find storage with id: " + settingsId);
}
}
} catch (ConnectionCredentialsException e) {
LOG.warn("Failed to get content", e);
String errorMessage = getUiFriendlyErrorMessage(e);
switch (resource) {
case "buckets":
errors.addError(resource, "Failed to list buckets: " + errorMessage);
break;
case "distributions":
errors.addError(resource, "Failed to list distributions: " + errorMessage);
break;
case "publicKeys":
errors.addError(resource, "Failed to list public keys: " + errorMessage);
break;
case "bucketLocation":
errors.addError(resource, "Failed to get bucket location: " + errorMessage);
break;
case "validateCfKeys":
errors.addError(resource, "CloudFront keys validation failed: " + errorMessage);
break;
case "s3TransferAccelerationAvailability":
errors.addError(resource, "Failed to check S3 Transfer Acceleration availability: " + errorMessage);
break;
default:
errors.addError(PROJECT_ID_PARAM, "Failed to fetch resource: " + errorMessage);
}
} catch (InvalidSettingsException e) {
final String message = String.format(FAILED_TO_PROCESS_REQUEST_FORMAT, resource);
if (LOG.isDebugEnabled()) {
LOG.debug(message, e);
} else {
LOG.info(message + e.getMessage());
}
e.getInvalids().forEach(errors::addError);
} catch (IllegalArgumentException e) {
final String message = String.format(FAILED_TO_PROCESS_REQUEST_FORMAT, resource);
if (LOG.isDebugEnabled()) {
LOG.debug(message, e);
} else {
LOG.info(message + e.getMessage());
}
errors.addError(resource, message);
} catch (Throwable e) {
LOG.infoAndDebugDetails(e.getMessage(), e);
final String message = constructMessageForUI(e, resource);
errors.addError(resource, message);
}
}
}
if (errors.hasErrors()) {
errors.serialize(xmlResponse);
}
}