From 0c8af1f7b6e7b3e27e0b9230abb4ecddc92d4bf2 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 23 Sep 2021 11:10:36 +0200 Subject: [PATCH 1/8] add collector --- .../maya/plugins/publish/collect_loaded_plugin.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py diff --git a/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py new file mode 100644 index 0000000000..2624bcfd6b --- /dev/null +++ b/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py @@ -0,0 +1,15 @@ +import pyblish.api +import avalon.api +from maya import cmds + + +class CollectLoadedPlugin(pyblish.api.ContextPlugin): + """Collect loaded plugins""" + + order = pyblish.api.CollectorOrder + label = "Loaded Plugins" + hosts = ["maya"] + + def process(self, context): + + context.data["loadedPlugins"] = cmds.pluginInfo(query=True, listPlugins=True) From d4827bcc7aecadbce4c8430cf379456e28f01afc Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 23 Sep 2021 11:10:47 +0200 Subject: [PATCH 2/8] add validator --- .../plugins/publish/validate_loaded_plugin.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py diff --git a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py new file mode 100644 index 0000000000..81f40abcc3 --- /dev/null +++ b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py @@ -0,0 +1,39 @@ +import pyblish.api +import maya.cmds as cmds +import openpype.api +from openpype import lib + + +class ValidateLoadedPlugin(pyblish.api.ContextPlugin): + """Ensure there are no unauthorized loaded plugins""" + + label = "Loaded Plugin" + order = pyblish.api.ValidatorOrder + host = ["maya"] + actions = [openpype.api.RepairContextAction] + + @classmethod + def get_invalid(cls, context): + + invalid = [] + + for plugin in context.data.get("loadedPlugins"): + if plugin not in cls.authorized_plugins: + invalid.append(plugin) + + return invalid + + def process(self, context): + + invalid = self.get_invalid(context) + if invalid: + raise RuntimeError( + "Found forbidden plugin name: {}".format(", ".join(invalid)) + ) + + @classmethod + def repair(cls, context): + """Unload forbidden plugins""" + + for plugin in cls.get_invalid(context): + cmds.unloadPlugin(plugin, force=True) From 9b712d5a62e4c526daf9c002acbfc81ed12b70fc Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 23 Sep 2021 11:11:02 +0200 Subject: [PATCH 3/8] add openpype settings --- .../defaults/project_settings/maya.json | 49 +++++++++++++++++++ .../schemas/schema_maya_publish.json | 21 ++++++++ 2 files changed, 70 insertions(+) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 3540c3eb29..b19d544fed 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -169,6 +169,55 @@ "enabled": false, "attributes": {} }, + "ValidateLoadedPlugin": { + "enabled": false, + "authorized_plugins": [ + "stereoCamera", + "svgFileTranslator", + "invertShape", + "mayaHIK", + "GamePipeline", + "curveWarp", + "tiffFloatReader", + "MASH", + "poseInterpolator", + "ATFPlugin", + "hairPhysicalShader", + "cacheEvaluator", + "ikSpringSolver", + "ik2Bsolver", + "xgenToolkit", + "AbcExport", + "retargeterNodes", + "gameFbxExporter", + "VectorRender", + "OpenEXRLoader", + "lookdevKit", + "Unfold3D", + "Type", + "mayaCharacterization", + "meshReorder", + "modelingToolkit", + "MayaMuscle", + "rotateHelper", + "dx11Shader", + "matrixNodes", + "AbcImport", + "autoLoader", + "deformerEvaluator", + "sceneAssembly", + "gpuCache", + "OneClick", + "shaderFXPlugin", + "objExport", + "renderSetup", + "GPUBuiltInDeformer", + "ArubaTessellator", + "quatNodes", + "fbxmaya", + "Turtle" + ] + }, "ValidateRenderSettings": { "arnold_render_attributes": [], "vray_render_attributes": [], diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json index 89cd30aed0..e2df6654f2 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json @@ -82,6 +82,27 @@ ] }, + { + "type": "dict", + "collapsible": true, + "key": "ValidateLoadedPlugin", + "label": "Validate Loaded Plugin", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "list", + "key": "authorized_plugins", + "label": "Authorized plugins", + "object_type": "text" + } + ] + }, + { "type": "dict", "collapsible": true, From 13ae6dac3197cc5d91d66c05063a244a91b11c05 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 23 Sep 2021 11:23:25 +0200 Subject: [PATCH 4/8] Fix unused import and line too long --- .../hosts/maya/plugins/publish/collect_loaded_plugin.py | 6 ++++-- .../hosts/maya/plugins/publish/validate_loaded_plugin.py | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py index 2624bcfd6b..7ee7021962 100644 --- a/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py +++ b/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py @@ -1,5 +1,4 @@ import pyblish.api -import avalon.api from maya import cmds @@ -12,4 +11,7 @@ class CollectLoadedPlugin(pyblish.api.ContextPlugin): def process(self, context): - context.data["loadedPlugins"] = cmds.pluginInfo(query=True, listPlugins=True) + context.data["loadedPlugins"] = cmds.pluginInfo( + query=True, + listPlugins=True, + ) diff --git a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py index 81f40abcc3..7798cbab4e 100644 --- a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py +++ b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py @@ -1,8 +1,6 @@ import pyblish.api import maya.cmds as cmds import openpype.api -from openpype import lib - class ValidateLoadedPlugin(pyblish.api.ContextPlugin): """Ensure there are no unauthorized loaded plugins""" From e729204cb81063283c1a296b11c5878272ee4d55 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 23 Sep 2021 11:24:50 +0200 Subject: [PATCH 5/8] fix syntax --- openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py index 7798cbab4e..01705e8b13 100644 --- a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py +++ b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py @@ -2,6 +2,7 @@ import pyblish.api import maya.cmds as cmds import openpype.api + class ValidateLoadedPlugin(pyblish.api.ContextPlugin): """Ensure there are no unauthorized loaded plugins""" From 5d59712e0d44b140dbdfd5fa91f6623aaab26283 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Tue, 28 Sep 2021 17:14:59 +0200 Subject: [PATCH 6/8] remove collector --- .../plugins/publish/collect_loaded_plugin.py | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py diff --git a/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py deleted file mode 100644 index 7ee7021962..0000000000 --- a/openpype/hosts/maya/plugins/publish/collect_loaded_plugin.py +++ /dev/null @@ -1,17 +0,0 @@ -import pyblish.api -from maya import cmds - - -class CollectLoadedPlugin(pyblish.api.ContextPlugin): - """Collect loaded plugins""" - - order = pyblish.api.CollectorOrder - label = "Loaded Plugins" - hosts = ["maya"] - - def process(self, context): - - context.data["loadedPlugins"] = cmds.pluginInfo( - query=True, - listPlugins=True, - ) From 536d6f000ecdb21fa4dfa9af8ac9c5f9fd0c6edd Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Tue, 28 Sep 2021 17:50:35 +0200 Subject: [PATCH 7/8] add option for whitelist native maya plugins --- .../plugins/publish/validate_loaded_plugin.py | 13 ++++- .../defaults/project_settings/maya.json | 48 +------------------ .../schemas/schema_maya_publish.json | 5 ++ 3 files changed, 18 insertions(+), 48 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py index 01705e8b13..444aeb24c1 100644 --- a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py +++ b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py @@ -1,6 +1,7 @@ import pyblish.api import maya.cmds as cmds import openpype.api +import os class ValidateLoadedPlugin(pyblish.api.ContextPlugin): @@ -15,9 +16,16 @@ class ValidateLoadedPlugin(pyblish.api.ContextPlugin): def get_invalid(cls, context): invalid = [] + loaded_plugin = cmds.pluginInfo(query=True, listPlugins=True) + # get variable from OpenPype settings + whitelist_native_plugins = cls.whitelist_native_plugins + authorized_plugins = cls.authorized_plugins or [] - for plugin in context.data.get("loadedPlugins"): - if plugin not in cls.authorized_plugins: + for plugin in loaded_plugin: + if not whitelist_native_plugins and os.getenv('MAYA_LOCATION') \ + in cmds.pluginInfo(plugin, query=True, path=True): + continue + if plugin not in authorized_plugins: invalid.append(plugin) return invalid @@ -35,4 +43,5 @@ class ValidateLoadedPlugin(pyblish.api.ContextPlugin): """Unload forbidden plugins""" for plugin in cls.get_invalid(context): + cmds.pluginInfo(plugin, edit=True, autoload=False) cmds.unloadPlugin(plugin, force=True) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index b19d544fed..56496e05d0 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -171,52 +171,8 @@ }, "ValidateLoadedPlugin": { "enabled": false, - "authorized_plugins": [ - "stereoCamera", - "svgFileTranslator", - "invertShape", - "mayaHIK", - "GamePipeline", - "curveWarp", - "tiffFloatReader", - "MASH", - "poseInterpolator", - "ATFPlugin", - "hairPhysicalShader", - "cacheEvaluator", - "ikSpringSolver", - "ik2Bsolver", - "xgenToolkit", - "AbcExport", - "retargeterNodes", - "gameFbxExporter", - "VectorRender", - "OpenEXRLoader", - "lookdevKit", - "Unfold3D", - "Type", - "mayaCharacterization", - "meshReorder", - "modelingToolkit", - "MayaMuscle", - "rotateHelper", - "dx11Shader", - "matrixNodes", - "AbcImport", - "autoLoader", - "deformerEvaluator", - "sceneAssembly", - "gpuCache", - "OneClick", - "shaderFXPlugin", - "objExport", - "renderSetup", - "GPUBuiltInDeformer", - "ArubaTessellator", - "quatNodes", - "fbxmaya", - "Turtle" - ] + "whitelist_native_plugins": false, + "authorized_plugins": [] }, "ValidateRenderSettings": { "arnold_render_attributes": [], diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json index e2df6654f2..8379f04556 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json @@ -94,6 +94,11 @@ "key": "enabled", "label": "Enabled" }, + { + "type": "boolean", + "key": "whitelist_native_plugins", + "label": "Whitelist Maya Native Plugins" + }, { "type": "list", "key": "authorized_plugins", From cd05b01f053f5c491452142e6d9bc9bab6d1f4e8 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Tue, 28 Sep 2021 17:54:56 +0200 Subject: [PATCH 8/8] flake8 E125 correction --- openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py index 444aeb24c1..9306d8ce15 100644 --- a/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py +++ b/openpype/hosts/maya/plugins/publish/validate_loaded_plugin.py @@ -23,7 +23,7 @@ class ValidateLoadedPlugin(pyblish.api.ContextPlugin): for plugin in loaded_plugin: if not whitelist_native_plugins and os.getenv('MAYA_LOCATION') \ - in cmds.pluginInfo(plugin, query=True, path=True): + in cmds.pluginInfo(plugin, query=True, path=True): continue if plugin not in authorized_plugins: invalid.append(plugin)