diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt index e9c17396f9..9a512b8d68 100644 --- a/Documentation/rest-api-config.txt +++ b/Documentation/rest-api-config.txt @@ -181,7 +181,7 @@ CapabilityInfo ~~~~~~~~~~~~~~ The `CapabilityInfo` entity contains information about a capability. -[options="header",width="50%",cols="1,5"] +[options="header",width="50%",cols="1,6"] |================================= |Field Name |Description |`kind` |`gerritcodereview#capability` @@ -195,7 +195,7 @@ TopMenuEntryInfo The `TopMenuEntryInfo` entity contains information about a top menu entry. -[options="header",width="50%",cols="1,5"] +[options="header",width="50%",cols="1,6"] |================================= |Field Name |Description |`name` |Name of the top menu entry. @@ -208,13 +208,14 @@ TopMenuItemInfo The `TopMenuItemInfo` entity contains information about a menu item in a top menu entry. -[options="header",width="50%",cols="1,5"] -|================================= -|Field Name |Description -|`url` |The URL of the menu item link. -|`name` |The name of the menu item. -|`target` |Target attribute of the menu item link. -|================================= +[options="header",width="50%",cols="1,^1,5"] +|======================== +|Field Name ||Description +|`url` ||The URL of the menu item link. +|`name` ||The name of the menu item. +|`target` ||Target attribute of the menu item link. +|`id` |optional|The `id` attribute of the menu item link. +|======================== GERRIT ------ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java index 7389519fc1..e5a1f7e28d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java @@ -38,15 +38,21 @@ public interface TopMenu { public final String url; public final String name; public final String target; + public final String id; public MenuItem(String name, String url) { this(name, url, "_blank"); } public MenuItem(String name, String url, String target) { + this(name, url, target, null); + } + + public MenuItem(String name, String url, String target, String id) { this.url = url; this.name = name; this.target = target; + this.id = id; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index e73670f18d..568a15c26f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -978,6 +978,9 @@ public class Gerrit implements EntryPoint { private static void addExtensionLink(final LinkMenuBar m, final TopMenuItem item) { final Anchor atag = anchor(item.getName(), item.getUrl()); atag.setTarget(item.getTarget()); + if (item.getId() != null) { + atag.getElement().setAttribute("id", item.getId()); + } m.add(atag); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java index 7906fd0511..22bb981095 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java @@ -20,6 +20,7 @@ public class TopMenuItem extends JavaScriptObject { public final native String getName() /*-{ return this.name; }-*/; public final native String getUrl() /*-{ return this.url; }-*/; public final native String getTarget() /*-{ return this.target; }-*/; + public final native String getId() /*-{ return this.id; }-*/; protected TopMenuItem() { } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java index 53abc4c2c5..b2972d9d8d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java @@ -81,6 +81,8 @@ class HttpPluginServlet extends HttpServlet private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(HttpPluginServlet.class); + private static final String PLUGINS_PREFIX = "/plugins/"; + private static final String AUTHORIZED_PREFIX = "/a" + PLUGINS_PREFIX; private final MimeUtilFileTypeRegistry mimeUtil; private final Provider webUrl; @@ -91,6 +93,7 @@ class HttpPluginServlet extends HttpServlet private List pending = Lists.newArrayList(); private String base; + private String authorizedBase; private final ConcurrentMap plugins = Maps.newConcurrentMap(); @@ -129,7 +132,8 @@ class HttpPluginServlet extends HttpServlet super.init(config); String path = config.getServletContext().getContextPath(); - base = Strings.nullToEmpty(path) + "/plugins/"; + base = Strings.nullToEmpty(path) + PLUGINS_PREFIX; + authorizedBase = Strings.nullToEmpty(path) + AUTHORIZED_PREFIX; for (Plugin plugin : pending) { install(plugin); } @@ -213,7 +217,8 @@ class HttpPluginServlet extends HttpServlet return; } - WrappedRequest wr = new WrappedRequest(req, base + name); + WrappedRequest wr = new WrappedRequest(req, + (isAuthorizedCall(req) ? authorizedBase : base) + name); FilterChain chain = new FilterChain() { @Override public void doFilter(ServletRequest req, ServletResponse res) @@ -228,6 +233,11 @@ class HttpPluginServlet extends HttpServlet } } + private boolean isAuthorizedCall(HttpServletRequest req) { + return !Strings.isNullOrEmpty(req.getServletPath()) + && req.getServletPath().startsWith(AUTHORIZED_PREFIX); + } + private static boolean isApiCall(HttpServletRequest req, List parts) { String method = req.getMethod(); int cnt = parts.size();