server/src/jetbrains/buildServer/staticUIExtensions/web/StaticPageContentController.java (66 lines of code) (raw):
package jetbrains.buildServer.staticUIExtensions.web;
import com.intellij.openapi.diagnostic.Logger;
import jetbrains.buildServer.controllers.AuthorizationInterceptor;
import jetbrains.buildServer.controllers.HttpDownloadProcessor;
import jetbrains.buildServer.staticUIExtensions.Configuration;
import jetbrains.buildServer.util.FileUtil;
import jetbrains.buildServer.web.openapi.WebControllerManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
public class StaticPageContentController extends StaticResourcesController {
private static final Logger LOG = Logger.getInstance(StaticPageContentController.class.getName());
private static final String PUBLIC_STATIC_CONTENT_PAGES_PATH = "/app/static_content/";
private static final String FOLDER_NAME = "pages";
public StaticPageContentController(@NotNull final AuthorizationInterceptor auth,
@NotNull final WebControllerManager web,
@NotNull final Configuration config,
@NotNull final HttpDownloadProcessor httpDownloadProcessor) {
super(httpDownloadProcessor);
final File container = FileUtil.getCanonicalFile(new File(config.getIncludeFilesBase(), FOLDER_NAME));
if (!container.exists()) {
try {
if (!container.mkdirs() && !container.exists()) {
LOG.error("Cannot create pages directory: " + container.getAbsolutePath());
} else {
LOG.debug("Created empty pages directory: " + container.getAbsolutePath());
}
} catch (Exception e) {
LOG.error("Cannot create pages directory: " + container.getAbsolutePath(), e);
}
} else if (!container.isDirectory()) {
LOG.warn("Pages directory is not a directory: " + container.getAbsolutePath());
}
setProvider(new StaticResourcesController.ResourceProvider() {
@Nullable
public Resource getResourceForPath(@NotNull String path) {
path = path.replace(PUBLIC_STATIC_CONTENT_PAGES_PATH, "");
if (!container.isDirectory() || !container.exists()) {
return null;
}
final File file = FileUtil.getCanonicalFile(new File(container, path));
if (!FileUtil.isAncestor(container, file, true)) {
// Trying to access something not under container
return null;
}
return new FileSystemResource(file);
}
});
final String path = PUBLIC_STATIC_CONTENT_PAGES_PATH + "**";
web.registerController(path, this);
auth.addPathNotRequiringAuth(path);
}
@Nullable
@Override
protected ModelAndView doHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception {
Resource resource = getResourceToProcess(request, response);
if (resource == null){
return null;
}
return myHttpDownloadProcessor.processFileDownload(resource.getFile(), false, request, response, null);
}
}