From 9de4c533462b625f42830f3c677de53d66a58ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Membr=C3=A9?= Date: Tue, 16 Nov 2021 01:40:10 +0100 Subject: [PATCH] Fixes #20264: Allow to customize in which menu plugins are set --- .../main/scala/bootstrap/liftweb/Boot.scala | 54 +++++++++---------- .../bootstrap/liftweb/RudderConfig.scala | 1 - .../com/normation/plugins/PublicPlugin.scala | 18 +++++-- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala index 71a9ec7b108..1527a036020 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala @@ -356,28 +356,28 @@ class Boot extends Loggable { // All the following is related to the sitemap val nodeManagerMenu = - (Menu("NodeManagerHome", ++ Node management: NodeSeq) / + (Menu("10", ++ Node management: NodeSeq) / "secure" / "nodeManager" / "index" >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Node.Read) )).submenus ( - Menu("List Nodes", Nodes) / + Menu("10", Nodes) / "secure" / "nodeManager" / "nodes" >> LocGroup("nodeGroup") - , Menu("SearchNodes", Node search) / + , Menu("20", Node search) / "secure" / "nodeManager" / "searchNodes" >> LocGroup("nodeGroup") - , Menu("NodeDetails", Node details) / + , Menu("20", Node details) / "secure" / "nodeManager" / "node" >> LocGroup("nodeGroup") >> Hidden - , Menu("ManageNewNode", Pending nodes) / + , Menu("30", Pending nodes) / "secure" / "nodeManager" / "manageNewNode" >> LocGroup("nodeGroup") - , Menu("Groups", Groups) / + , Menu("40", Groups) / "secure" / "nodeManager" / "groups" >> LocGroup("groupGroup") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Group.Read ) ) @@ -386,47 +386,47 @@ class Boot extends Loggable { def policyMenu = { val name = "configuration" - (Menu(name+"ManagerHome", ++ {name.capitalize} policy: NodeSeq) / + (Menu("20", ++ {name.capitalize} policy: NodeSeq) / "secure" / (name+"Manager") / "index" >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Configuration.Read) )).submenus ( - Menu(name+"RuleManagement", Rules) / + Menu("10", Rules) / "secure" / (name+"Manager") / "ruleManagement" >> LocGroup(name+"Group") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Rule.Read ) ) - , Menu("Rule Details", Rule) / + , Menu("10", Rule) / "secure" / (name+"Manager") / "ruleManagement" / "rule" / * >> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "ruleManagement" :: Nil)} >> LocGroup (name+"Group") >> TestAccess( () => userIsAllowed("/secure/index", AuthorizationType.Rule.Read) ) >> Hidden - , Menu("Rule Category Details", Rule Category) / + , Menu("10", Rule Category) / "secure" / (name+"Manager") / "ruleManagement" / "ruleCategory" / * >> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "ruleManagement" :: Nil)} >> LocGroup (name+"Group") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Rule.Read ) ) >> Hidden - ,Menu(name+"DirectiveManagement", Directives) / + ,Menu("20", Directives) / "secure" / (name+"Manager") / "directiveManagement" >> LocGroup(name+"Group") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Directive.Read ) ) - , Menu("techniqueEditor", Techniques) / + , Menu("30", Techniques) / "secure" / (name+"Manager") / "techniqueEditor" >> LocGroup((name+"Manager")) >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Technique.Read)) - , Menu("Technique", Technique) / + , Menu("30", Technique) / "secure" / (name+"Manager") / "techniqueEditor" / "technique" / * >> TemplateBox {case _ => Templates("secure" :: (name+"Manager") :: "techniqueEditor" :: Nil)} >> LocGroup (name+"Group") >> TestAccess( () => userIsAllowed("/secure/index", AuthorizationType.Rule.Read) ) >> Hidden - , Menu(name+"ParameterManagement", Parameters) / + , Menu("40", Parameters) / "secure" / (name+"Manager") / "parameterManagement" >> LocGroup(name+"Group") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Parameter.Read ) ) @@ -434,43 +434,43 @@ class Boot extends Loggable { } def administrationMenu = - (Menu("AdministrationHome", ++ Administration: NodeSeq) / + (Menu("40", ++ Administration: NodeSeq) / "secure" / "administration" / "index" >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read, AuthorizationType.Technique.Read) )).submenus ( - Menu("Setup", Setup) / + Menu("10", Setup) / "secure" / "administration" / "setup" >> LocGroup("administrationGroup") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read ) ) - , Menu("policyServerManagement", Settings) / + , Menu("20", Settings) / "secure" / "administration" / "policyServerManagement" >> LocGroup("administrationGroup") >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) ) - , Menu("databaseManagement", Reports database) / + , Menu("30", Reports database) / "secure" / "administration" / "databaseManagement" >> LocGroup("administrationGroup") >> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",AuthorizationType.Administration.Read) ) - , Menu("TechniqueLibraryManagement", Techniques tree) / + , Menu("40", Techniques tree) / "secure" / "administration" / "techniqueLibraryManagement" >> LocGroup("administrationGroup") >> TestAccess( () => userIsAllowed("/secure/index",AuthorizationType.Technique.Read ) ) - , Menu("apiManagement", API accounts) / + , Menu("50", API accounts) / "secure" / "administration" / "apiManagement" >> LocGroup("administrationGroup") >> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",AuthorizationType.Administration.Write) ) ) def pluginsMenu = { - (Menu("PluginsHome", ++ Plugins ++ : NodeSeq) / + (Menu("50 - plugins", ++ Plugins ++ : NodeSeq) / "secure" / "plugins" / "index" >> LocGroup("pluginsGroup") >> TestAccess ( () => userIsAllowed("/secure/index", AuthorizationType.Administration.Read) )) submenus ( - Menu("pluginInformation", Plugin information) / + Menu("0", Plugin information) / "secure" / "plugins" / "pluginInformation" >> LocGroup("pluginsGroup") >> TestAccess ( () => userIsAllowed("/secure/index", AuthorizationType.Administration.Read) ) @@ -481,7 +481,7 @@ class Boot extends Loggable { // if we can't get the workflow property, default to false // (don't give rights if you don't know) def workflowEnabled = RudderConfig.configService.rudder_workflow_enabled().either.runNow.getOrElse(false) - (Menu("UtilitiesHome", ++ Utilities: NodeSeq) / + (Menu("30", ++ Utilities: NodeSeq) / "secure" / "utilities" / "index" >> TestAccess ( () => if ((workflowEnabled && (CurrentUser.checkRights(AuthorizationType.Validator.Read) || CurrentUser.checkRights(AuthorizationType.Deployer.Read))) || CurrentUser.checkRights(AuthorizationType.Administration.Read) || CurrentUser.checkRights(AuthorizationType.Technique.Read)) @@ -490,16 +490,16 @@ class Boot extends Loggable { Full(RedirectWithState("/secure/index", redirection)) )).submenus ( - Menu("archivesManagement", Archives) / + Menu("10", Archives) / "secure" / "utilities" / "archiveManagement" >> LocGroup("utilitiesGroup") >> TestAccess ( () => userIsAllowed("/secure/utilities/eventLogs",AuthorizationType.Administration.Write) ) - , Menu("eventLogViewer", Event logs) / + , Menu("20", Event logs) / "secure" / "utilities" / "eventLogs" >> LocGroup("utilitiesGroup") >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) ) - , Menu("healthCheckHome", Health check) / + , Menu("30", Health check) / "secure" / "utilities" / "healthcheck" >> LocGroup("utilitiesGroup") >> TestAccess ( () => userIsAllowed("/secure/index",AuthorizationType.Administration.Read) ) @@ -507,7 +507,7 @@ class Boot extends Loggable { } val rootMenu = List( - Menu("Dashboard", ++ Dashboard: NodeSeq) / "secure" / "index" + Menu("0", ++ Dashboard: NodeSeq) / "secure" / "index" , Menu("Login") / "index" >> Hidden , Menu("Templates") / "templates" / ** >> Hidden //allows access to html file use by js , nodeManagerMenu diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala index 4c5a50b7eb6..1ed17eba411 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/RudderConfig.scala @@ -184,7 +184,6 @@ import com.typesafe.config.ConfigException import com.typesafe.config.ConfigFactory import com.unboundid.ldap.sdk.DN import com.unboundid.ldap.sdk.RDN -import cron4s.expr.CronExpr import net.liftweb.common.Loggable import net.liftweb.common._ import org.apache.commons.io.FileUtils diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala index 9c05f88890c..8d0daba4803 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/plugins/PublicPlugin.scala @@ -121,14 +121,26 @@ trait DefaultPluginDef extends RudderPluginDef { * interaction with Rudder menu (at the risk of breaking it). */ def pluginMenuEntry: Option[Menu] = None + def pluginMenuParent: Option[Menu] = None override def updateSiteMap(menus:List[Menu]) : List[Menu] = { pluginMenuEntry match { case None => menus case Some(menu) => - menus.map { - case m@Menu(l, _* ) if(l.name == "PluginsHome") => - Menu(l , (m.kids.toSeq :+ menu):_* ) + val (parentName, updatedMenu) = pluginMenuParent match { + case None => ("90", menus) + case Some(parentMenu) => + val name = parentMenu.loc.name + val menu = if (menus.exists (_.loc.name == name )) { + menus + } else { + (parentMenu :: menus).sortBy(_.loc.name.toIntOption.getOrElse(Int.MaxValue)) + } + (name,menu) + } + updatedMenu.map { + case m@Menu(l, _* ) if(l.name == parentName) => + Menu(l , (m.kids :+ menu).sortBy(_.loc.name.toIntOption.getOrElse(Int.MaxValue)):_* ) case m => m } }