diff --git a/core/src/main/java/hudson/model/ManageJenkinsAction.java b/core/src/main/java/hudson/model/ManageJenkinsAction.java index 605801c42e1d..186406fcd02a 100644 --- a/core/src/main/java/hudson/model/ManageJenkinsAction.java +++ b/core/src/main/java/hudson/model/ManageJenkinsAction.java @@ -25,8 +25,18 @@ package hudson.model; import hudson.Extension; +import hudson.Util; +import java.io.IOException; import jenkins.model.Jenkins; +import jenkins.model.ModelObjectWithContextMenu; +import org.apache.commons.jelly.JellyException; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerFallback; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; /** * Adds the "Manage Jenkins" link to the top page. @@ -34,7 +44,7 @@ * @author Kohsuke Kawaguchi */ @Extension(ordinal = 100) @Symbol("manageJenkins") -public class ManageJenkinsAction implements RootAction { +public class ManageJenkinsAction implements RootAction, StaplerFallback, ModelObjectWithContextMenu { @Override public String getIconFileName() { if (Jenkins.get().hasAnyPermission(Jenkins.MANAGE, Jenkins.SYSTEM_READ)) @@ -52,4 +62,29 @@ public String getDisplayName() { public String getUrlName() { return "/manage"; } + + @Override + public Object getStaplerFallback() { + return Jenkins.get(); + } + + @Override + public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws JellyException, IOException { + return new ContextMenu().from(this, request, response, "index"); + } + + /** + * Workaround to ensuring that links in context menus resolve correctly in the submenu of the top-level 'Dashboard' + * menu. + */ + @Restricted(NoExternalUse.class) + public void addContextMenuItem(ContextMenu menu, String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation) { + if (Stapler.getCurrentRequest().findAncestorObject(this.getClass()) != null || !Util.isSafeToRedirectTo(url)) { + // Default behavior if the URL is absolute or scheme-relative, or the current object is an ancestor (i.e. would resolve correctly) + menu.add(url, icon, iconXml, text, post, requiresConfirmation); + return; + } + // If neither is the case, rewrite the relative URL to point to inside the /manage/ URL space + menu.add("manage/" + url, icon, iconXml, text, post, requiresConfirmation); + } } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index bbbcf7fe25a7..56dd8789ac37 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -115,6 +115,7 @@ import hudson.model.ListView; import hudson.model.LoadBalancer; import hudson.model.LoadStatistics; +import hudson.model.ManageJenkinsAction; import hudson.model.ManagementLink; import hudson.model.Messages; import hudson.model.ModifiableViewGroup; @@ -4415,7 +4416,7 @@ public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse respons for (MenuItem i : menu.items) { if (i.url.equals(request.getContextPath() + "/manage")) { // add "Manage Jenkins" subitems - i.subMenu = new ContextMenu().from(this, request, response, "manage"); + i.subMenu = new ContextMenu().from(ExtensionList.lookupSingleton(ManageJenkinsAction.class), request, response, "index"); } } return menu; diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy index 4e9eca335bda..555a7bb42623 100644 --- a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy +++ b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy @@ -30,7 +30,7 @@ l.side_panel { l.task(icon:"icon-up icon-md", href:rootURL+'/', title:_("Back to Dashboard")) l.task(icon:"symbol-settings", href:"${rootURL}/manage", title:_("Manage Jenkins")) if (!app.updateCenter.jobs.isEmpty()) { - l.task(icon: "symbol-download", href:"${rootURL}/updateCenter/", title:_("Update Center")) + l.task(icon: "symbol-download", href:"../updateCenter/", title:_("Update Center")) } } } diff --git a/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly b/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly index c2687fa0dfb9..60ba4707e239 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly @@ -34,7 +34,7 @@ THE SOFTWARE. - diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly b/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly similarity index 93% rename from core/src/main/resources/jenkins/model/Jenkins/manage.jelly rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly index 15032f5c0147..bc20d3e6c4a9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly +++ b/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly @@ -31,7 +31,7 @@ THE SOFTWARE. - + @@ -39,10 +39,10 @@ THE SOFTWARE. - + - +

${category.key.label}

${taskTags!=null and attrs.contextMenu!='false' ? taskTags.addHeader(category.key.label) : null} @@ -55,7 +55,7 @@ THE SOFTWARE. - ${taskTags!=null and attrs.contextMenu!='false' ? taskTags.add(m.urlName, iconSrc, iconXml, m.displayName, m.requiresPOST, m.requiresConfirmation) : null} + ${taskTags!=null and attrs.contextMenu!='false' ? it.addContextMenuItem(taskTags, m.urlName, iconSrc, iconXml, m.displayName, m.requiresPOST, m.requiresConfirmation) : null} diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_bg.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_bg.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_bg.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_bg.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ca.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_ca.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_ca.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_ca.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_cs.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_cs.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_cs.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_cs.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_da.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_da.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_da.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_da.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_de.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_de.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_de.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_de.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_el.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_el.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_el.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_el.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_es.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_es.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_es.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_es.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_es_AR.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_es_AR.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_es_AR.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_es_AR.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_et.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_et.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_et.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_et.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_fi.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_fi.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_fi.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_fi.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_fr.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_fr.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_fr.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_fr.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_he.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_he.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_he.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_he.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_hu.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_hu.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_hu.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_hu.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_it.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_it.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_it.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_it.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_ja.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_ja.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ko.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_ko.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_ko.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_ko.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_lt.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_lt.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_lt.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_lt.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_lv.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_lv.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_lv.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_lv.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_nb_NO.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_nb_NO.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_nb_NO.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_nb_NO.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_nl.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_nl.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_nl.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_nl.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_pl.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_pl.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_pl.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_pt_BR.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_pt_BR.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_pt_BR.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_pt_BR.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_pt_PT.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_pt_PT.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_pt_PT.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_pt_PT.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ro.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_ro.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_ro.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_ro.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ru.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_ru.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_ru.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_ru.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_sk.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_sk.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_sk.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_sk.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_sl.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_sl.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_sl.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_sl.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_sr.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_sr.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_sr.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_sv_SE.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_sv_SE.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_sv_SE.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_sv_SE.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_tr.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_tr.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_uk.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_uk.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_uk.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_uk.properties diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_zh_TW.properties b/core/src/main/resources/hudson/model/ManageJenkinsAction/index_zh_TW.properties similarity index 100% rename from core/src/main/resources/jenkins/model/Jenkins/manage_zh_TW.properties rename to core/src/main/resources/hudson/model/ManageJenkinsAction/index_zh_TW.properties diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly index a3e3c7b87893..ec0931b33e3f 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly @@ -32,7 +32,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy index 581985664851..341138d2462b 100644 --- a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy +++ b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy @@ -13,7 +13,7 @@ l.layout(norefresh:true, permission:app.SYSTEM_READ, title:my.displayName) { l.side_panel { l.tasks { l.task(icon:"icon-up icon-md", href:rootURL+'/', title:_("Back to Dashboard")) - l.task(icon:"symbol-settings", href:"${rootURL}/computer/", title:_("Manage Nodes")) + l.task(icon:"symbol-settings", href: "../computer/", title:_("Manage Nodes")) } } l.app_bar(title: my.displayName) diff --git a/core/src/main/resources/jenkins/model/Jenkins/load-statistics.jelly b/core/src/main/resources/jenkins/model/Jenkins/load-statistics.jelly index b5f8b441d8ec..3dd1770c5d6a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/load-statistics.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/load-statistics.jelly @@ -26,9 +26,10 @@ THE SOFTWARE. + - \ No newline at end of file + diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly index f9ab9b258cd8..9a5a0be063bc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly @@ -29,6 +29,7 @@ THE SOFTWARE. +
diff --git a/core/src/main/resources/lib/hudson/scriptConsole.jelly b/core/src/main/resources/lib/hudson/scriptConsole.jelly index 3dce29a7e476..e0f936b15f29 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole.jelly +++ b/core/src/main/resources/lib/hudson/scriptConsole.jelly @@ -30,6 +30,7 @@ THE SOFTWARE. +

${%Script Console}

diff --git a/test/src/test/java/jenkins/bugs/Jenkins64991Test.java b/test/src/test/java/jenkins/bugs/Jenkins64991Test.java index e9e010842bc1..b1615b76b078 100644 --- a/test/src/test/java/jenkins/bugs/Jenkins64991Test.java +++ b/test/src/test/java/jenkins/bugs/Jenkins64991Test.java @@ -86,7 +86,7 @@ public void test403Redirect() throws Exception { final Page redirectedPage = HtmlFormUtil.submit(loginPage.getFormByName("login")); assertTrue(redirectedPage.isHtmlPage()); - assertEquals(j.getURL() + "manage", redirectedPage.getUrl().toExternalForm()); + assertEquals(j.getURL() + "manage/", redirectedPage.getUrl().toExternalForm()); assertThat(redirectedPage.getWebResponse().getContentAsString(), containsStringIgnoringCase(Messages.GlobalSecurityConfiguration_DisplayName())); }