Merge changes Ic502b820,I43630932 * changes: Throw GitilesRequestFailureException Introduce GitilesRequestFailureException and DefaultErrorHandlingFilter
diff --git a/WORKSPACE b/WORKSPACE index f4726a7..5255a9a 100644 --- a/WORKSPACE +++ b/WORKSPACE
@@ -16,7 +16,7 @@ load("//tools:bazlets.bzl", "load_bazlets") load_bazlets( - commit = "bd5e7bafb2bd72a4f84e06f07490b41d2921a65b", + commit = "2c9d995f712f6531e45756f80431b460c6183f8d", # local_path = "/home/<user>/projects/bazlets", ) @@ -117,8 +117,8 @@ maven_jar( name = "truth", - artifact = "com.google.truth:truth:0.43", - sha1 = "0cb9105957368f68d5fd771045bfa27d4a534836", + artifact = "com.google.truth:truth:0.44", + sha1 = "11eff954c0c14da7d43276d7b3bcf71463105368", ) # Indirect dependency of truth @@ -136,8 +136,8 @@ maven_jar( name = "html-types", - artifact = "com.google.common.html.types:types:1.0.4", - sha1 = "2adf4c8bfccc0ff7346f9186ac5aa57d829ad065", + artifact = "com.google.common.html.types:types:1.0.8", + sha1 = "9e9cf7bc4b2a60efeb5f5581fe46d17c068e0777", ) maven_jar(
diff --git a/java/com/google/gitiles/ReadmeHelper.java b/java/com/google/gitiles/ReadmeHelper.java index 911c4ef..a01c7f0 100644 --- a/java/com/google/gitiles/ReadmeHelper.java +++ b/java/com/google/gitiles/ReadmeHelper.java
@@ -14,10 +14,10 @@ package com.google.gitiles; +import com.google.common.html.types.SafeHtml; import com.google.gitiles.doc.GitilesMarkdown; import com.google.gitiles.doc.MarkdownConfig; import com.google.gitiles.doc.MarkdownToHtml; -import com.google.template.soy.data.SanitizedContent; import java.io.IOException; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; @@ -87,7 +87,7 @@ return readmePath; } - SanitizedContent render() { + SafeHtml render() { try { byte[] raw = reader.open(readmeId, Constants.OBJ_BLOB).getCachedBytes(config.inputLimit); return MarkdownToHtml.builder()
diff --git a/java/com/google/gitiles/RepositoryIndexServlet.java b/java/com/google/gitiles/RepositoryIndexServlet.java index 334f6fe..d057512 100644 --- a/java/com/google/gitiles/RepositoryIndexServlet.java +++ b/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -20,11 +20,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import com.google.common.html.types.SafeHtml; import com.google.gitiles.DateFormatter.Format; import com.google.gitiles.GitilesRequestFailureException.FailureReason; import com.google.gitiles.doc.MarkdownConfig; import com.google.gson.reflect.TypeToken; -import com.google.template.soy.data.SanitizedContent; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; @@ -172,7 +172,7 @@ req.getRequestURI()); readme.scanTree(rootTree); if (readme.isPresent()) { - SanitizedContent html = readme.render(); + SafeHtml html = readme.render(); if (html != null) { return ImmutableMap.<String, Object>of("readmeHtml", html); }
diff --git a/java/com/google/gitiles/VisibilityCache.java b/java/com/google/gitiles/VisibilityCache.java index 75b5e9f..fbb3a45 100644 --- a/java/com/google/gitiles/VisibilityCache.java +++ b/java/com/google/gitiles/VisibilityCache.java
@@ -37,6 +37,7 @@ import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.RefDatabase; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevSort; @@ -135,10 +136,11 @@ return false; } + RefDatabase refDb = repo.getRefDatabase(); + // If any reference directly points at the requested object, permit display. Common for displays // of pending patch sets in Gerrit Code Review, or bookmarks to the commit a tag points at. - Collection<Ref> all = repo.getRefDatabase().getRefs(); - for (Ref ref : all) { + for (Ref ref : repo.getRefDatabase().getRefs()) { ref = repo.getRefDatabase().peel(ref); if (id.equals(ref.getObjectId()) || id.equals(ref.getPeeledObjectId())) { return true; @@ -149,9 +151,9 @@ // tend to be much further back in history and just clutter up the priority queue in the common // case. return isReachableFrom(walk, commit, knownReachable) - || isReachableFromRefs(walk, commit, all.stream().filter(r -> refStartsWith(r, R_HEADS))) - || isReachableFromRefs(walk, commit, all.stream().filter(r -> refStartsWith(r, R_TAGS))) - || isReachableFromRefs(walk, commit, all.stream().filter(r -> otherRefs(r))); + || isReachableFromRefs(walk, commit, refDb.getRefsByPrefix(R_HEADS).stream()) + || isReachableFromRefs(walk, commit, refDb.getRefsByPrefix(R_TAGS).stream()) + || isReachableFromRefs(walk, commit, refDb.getRefs().stream().filter(r -> otherRefs(r))); } private static boolean refStartsWith(Ref ref, String prefix) {
diff --git a/java/com/google/gitiles/doc/MarkdownToHtml.java b/java/com/google/gitiles/doc/MarkdownToHtml.java index 64758b2..e45503d 100644 --- a/java/com/google/gitiles/doc/MarkdownToHtml.java +++ b/java/com/google/gitiles/doc/MarkdownToHtml.java
@@ -19,11 +19,11 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Strings; +import com.google.common.html.types.SafeHtml; import com.google.gitiles.GitilesView; import com.google.gitiles.ThreadSafePrettifyParser; import com.google.gitiles.doc.html.HtmlBuilder; import com.google.gitiles.doc.html.SoyHtmlBuilder; -import com.google.template.soy.data.SanitizedContent; import java.util.List; import javax.annotation.Nullable; import org.commonmark.ext.gfm.strikethrough.Strikethrough; @@ -168,7 +168,7 @@ } /** Render the document AST to sanitized HTML. */ - public SanitizedContent toSoyHtml(Node node) { + public SafeHtml toSoyHtml(Node node) { if (node != null) { SoyHtmlBuilder out = new SoyHtmlBuilder(); renderToHtml(out, node);
diff --git a/java/com/google/gitiles/doc/html/SoyHtmlBuilder.java b/java/com/google/gitiles/doc/html/SoyHtmlBuilder.java index 23e6ee6..a130ce4 100644 --- a/java/com/google/gitiles/doc/html/SoyHtmlBuilder.java +++ b/java/com/google/gitiles/doc/html/SoyHtmlBuilder.java
@@ -14,9 +14,8 @@ package com.google.gitiles.doc.html; -import com.google.template.soy.data.SanitizedContent; -import com.google.template.soy.data.SanitizedContent.ContentKind; -import com.google.template.soy.data.UnsafeSanitizedContentOrdainer; +import com.google.common.html.types.LegacyConversions; +import com.google.common.html.types.SafeHtml; /** Builds a document fragment using a restricted subset of HTML. */ public final class SoyHtmlBuilder extends HtmlBuilder { @@ -32,8 +31,8 @@ } /** Bless the current content as HTML. */ - public SanitizedContent toSoy() { + public SafeHtml toSoy() { finish(); - return UnsafeSanitizedContentOrdainer.ordainAsSafe(buf.toString(), ContentKind.HTML); + return LegacyConversions.riskilyAssumeSafeHtml(buf.toString()); } }
diff --git a/javatests/com/google/gitiles/VisibilityCacheTest.java b/javatests/com/google/gitiles/VisibilityCacheTest.java new file mode 100644 index 0000000..e2e3248 --- /dev/null +++ b/javatests/com/google/gitiles/VisibilityCacheTest.java
@@ -0,0 +1,167 @@ +/* + * Copyright (C) 2019, Google LLC. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ package com.google.gitiles; + +import static com.google.common.truth.Truth.assertThat; + +import java.io.IOException; +import java.util.Map; +import java.util.Set; +import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; +import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; +import org.eclipse.jgit.junit.TestRepository; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; +import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class VisibilityCacheTest { + + private InMemoryRepository repo; + private GitilesAccess access = new FakeGitilesAccess(); + + private RevCommit baseCommit; + private RevCommit commit1; + private RevCommit commit2; + private RevCommit commitA; + private RevCommit commitB; + private RevCommit commitC; + + private VisibilityCache visibilityCache; + private RevWalk walk; + + @Before + public void setUp() throws Exception { + /** + * master (branch not visible) + * + * <p>commitC | commit2 commitB | | commit1 commitA <--- refs/tags/v0.1 \ / \ / baseCommit + */ + repo = new InMemoryRepository(new DfsRepositoryDescription()); + TestRepository<InMemoryRepository> git = new TestRepository<>(repo); + baseCommit = git.commit().message("baseCommit").create(); + commit1 = git.commit().parent(baseCommit).message("commit1").create(); + commit2 = git.commit().parent(commit1).message("commit2").create(); + + commitA = git.commit().parent(baseCommit).message("commitA").create(); + commitB = git.commit().parent(commitA).message("commitB").create(); + commitC = git.commit().parent(commitB).message("commitC").create(); + + git.update("master", commit2); + git.update("refs/tags/v0.1", commitA); + + visibilityCache = new VisibilityCache(true); + walk = new RevWalk(repo); + walk.setRetainBody(false); + } + + @After + public void tearDown() { + repo.close(); + } + + @Test + public void isTip() throws IOException { + ObjectId[] known = new ObjectId[0]; + assertThat(visibilityCache.isVisible(repo, walk, access, commit2.getId(), known)).isTrue(); + } + + @Test + public void reachableFromHeads() throws Exception { + ObjectId[] known = new ObjectId[0]; + assertThat(visibilityCache.isVisible(repo, walk, access, commit1.getId(), known)).isTrue(); + } + + @Test + public void reachableFromTags() throws Exception { + ObjectId[] known = new ObjectId[0]; + assertThat(visibilityCache.isVisible(repo, walk, access, commitA.getId(), known)).isTrue(); + } + + @Test + public void unreachableFromAnyTip() throws Exception { + ObjectId[] known = new ObjectId[0]; + assertThat(visibilityCache.isVisible(repo, walk, access, commitB.getId(), known)).isFalse(); + } + + @Test + public void reachableFromAnotherId() throws Exception { + ObjectId[] known = new ObjectId[] {commitC.getId()}; + assertThat(visibilityCache.isVisible(repo, walk, access, commitB.getId(), known)).isTrue(); + } + + private static class FakeGitilesAccess implements GitilesAccess { + @Override + public Map<String, RepositoryDescription> listRepositories(String prefix, Set<String> branches) + throws ServiceNotEnabledException, ServiceNotAuthorizedException, IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Object getUserKey() { + return "Test"; + } + + @Override + public String getRepositoryName() { + return "VisibilityCache-Test"; + } + + @Override + public RepositoryDescription getRepositoryDescription() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Config getConfig() throws IOException { + throw new UnsupportedOperationException(); + } + } +}
diff --git a/version.bzl b/version.bzl index bfaafb4..f0d771c 100644 --- a/version.bzl +++ b/version.bzl
@@ -4,4 +4,4 @@ # we currently have no stable releases, we use the "build number" scheme # described at: # https://www.mojohaus.org/versions-maven-plugin/version-rules.html -GITILES_VERSION = "0.2-7" +GITILES_VERSION = "0.2-8"