James Moger
2014-09-07 11a1739389e9bafa0b89de910105967508b56dbf
Enforce relaxed XSS filtering on markup documents
6 files modified
43 ■■■■■ changed files
src/main/java/com/gitblit/wicket/MarkupProcessor.java 30 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/WicketUtils.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/BlobPage.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/DocPage.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/DocsPage.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/SummaryPage.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/MarkupProcessor.java
@@ -60,6 +60,7 @@
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.XssFilter;
import com.gitblit.wicket.pages.DocPage;
import com.google.common.base.Joiner;
@@ -80,11 +81,9 @@
    private final IStoredSettings settings;
    public MarkupProcessor(IStoredSettings settings) {
        this.settings = settings;
    }
    private final XssFilter xssFilter;
    public List<String> getMarkupExtensions() {
    public static List<String> getMarkupExtensions(IStoredSettings settings) {
        List<String> list = new ArrayList<String>();
        list.addAll(settings.getStrings(Keys.web.confluenceExtensions));
        list.addAll(settings.getStrings(Keys.web.markdownExtensions));
@@ -95,8 +94,17 @@
        return list;
    }
    public MarkupProcessor(IStoredSettings settings, XssFilter xssFilter) {
        this.settings = settings;
        this.xssFilter = xssFilter;
    }
    public List<String> getMarkupExtensions() {
        return getMarkupExtensions(settings);
    }
    public List<String> getAllExtensions() {
        List<String> list = getMarkupExtensions();
        List<String> list = getMarkupExtensions(settings);
        list.add("txt");
        list.add("TXT");
        return list;
@@ -295,7 +303,11 @@
        MarkupParser parser = new MarkupParser(lang);
        parser.setBuilder(builder);
        parser.parse(doc.markup);
        doc.html = writer.toString();
        final String content = writer.toString();
        final String safeContent = xssFilter.relaxed(content);
        doc.html = safeContent;
    }
    /**
@@ -345,7 +357,11 @@
                return new Rendering(url, name);
            }
        };
        doc.html = MarkdownUtils.transformMarkdown(doc.markup, renderer);
        final String content = MarkdownUtils.transformMarkdown(doc.markup, renderer);
        final String safeContent = xssFilter.relaxed(content);
        doc.html = safeContent;
    }
    private String getWicketUrl(Class<? extends Page> pageClass, final String repositoryName, final String commitId, final String document) {
src/main/java/com/gitblit/wicket/WicketUtils.java
@@ -42,6 +42,7 @@
import com.gitblit.Constants;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.FederationPullStatus;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.models.FederationModel;
import com.gitblit.models.Metric;
@@ -186,9 +187,9 @@
            return newImage(wicketId, "file_settings_16x16.png");
        }
        MarkupProcessor processor = new MarkupProcessor(GitBlitWebApp.get().settings());
        String ext = StringUtils.getFileExtension(filename).toLowerCase();
        if (processor.getMarkupExtensions().contains(ext)) {
        IStoredSettings settings = GitBlitWebApp.get().settings();
        if (MarkupProcessor.getMarkupExtensions(settings).contains(ext)) {
            return newImage(wicketId, "file_world_16x16.png");
        }
        return newImage(wicketId, "file_16x16.png");
src/main/java/com/gitblit/wicket/pages/BlobPage.java
@@ -79,7 +79,7 @@
            }
            // see if we should redirect to the doc page
            MarkupProcessor processor = new MarkupProcessor(app().settings());
            MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
            for (String ext : processor.getMarkupExtensions()) {
                if (ext.equals(extension)) {
                    setResponsePage(DocPage.class, params);
src/main/java/com/gitblit/wicket/pages/DocPage.java
@@ -43,7 +43,7 @@
        super(params);
        final String path = WicketUtils.getPath(params).replace("%2f", "/").replace("%2F", "/");
        MarkupProcessor processor = new MarkupProcessor(app().settings());
        MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
        Repository r = getRepository();
        RevCommit commit = JGitUtils.getCommit(r, objectId);
src/main/java/com/gitblit/wicket/pages/DocsPage.java
@@ -49,7 +49,7 @@
    public DocsPage(PageParameters params) {
        super(params);
        MarkupProcessor processor = new MarkupProcessor(app().settings());
        MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
        Repository r = getRepository();
        RevCommit head = JGitUtils.getCommit(r, null);
src/main/java/com/gitblit/wicket/pages/SummaryPage.java
@@ -138,7 +138,7 @@
            MarkupDocument markupDoc = null;
            RevCommit head = JGitUtils.getCommit(r, null);
            if (head != null) {
                MarkupProcessor processor = new MarkupProcessor(app().settings());
                MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
                markupDoc = processor.getReadme(r, repositoryName, getBestCommitId(head));
            }
            if (markupDoc == null || markupDoc.markup == null) {