This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch MSCRIPTING-7 in repository https://gitbox.apache.org/repos/asf/maven-scripting-plugin.git
commit c9e9ff965ea1fc062cfb9893b860a5453855e33c Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Fri Aug 6 10:11:02 2021 +0200 binding the session and servers helper in binding context --- .../apache/maven/plugins/scripting/EvalMojo.java | 13 ++ .../maven/plugins/scripting/binding/Servers.java | 63 ++++++++ .../markdown/configure-the-script-engine.md.vm | 6 +- .../plugins/scripting/binding/ServersTest.java | 170 +++++++++++++++++++++ 4 files changed, 251 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/plugins/scripting/EvalMojo.java b/src/main/java/org/apache/maven/plugins/scripting/EvalMojo.java index 4a6dbbc..9356a10 100644 --- a/src/main/java/org/apache/maven/plugins/scripting/EvalMojo.java +++ b/src/main/java/org/apache/maven/plugins/scripting/EvalMojo.java @@ -25,12 +25,16 @@ import javax.script.Bindings; import javax.script.ScriptException; import javax.script.SimpleBindings; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.scripting.binding.Servers; import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.crypto.SettingsDecrypter; /** * Evaluate the specified script or scriptFile @@ -60,10 +64,17 @@ public class EvalMojo @Parameter private File scriptFile; + @Component + private SettingsDecrypter settingsDecrypter; + // script variables @Parameter( defaultValue = "${project}", readonly = true ) private MavenProject project; + // script variables + @Parameter( defaultValue = "${session}", readonly = true ) + private MavenSession session; + @Override public void execute() throws MojoExecutionException, MojoFailureException @@ -73,8 +84,10 @@ public class EvalMojo AbstractScriptEvaluator execute = constructExecute(); Bindings bindings = new SimpleBindings(); + bindings.put( "session", session ); bindings.put( "project", project ); bindings.put( "log", getLog() ); + bindings.put( "servers", new Servers( session, settingsDecrypter ) ); Object result = execute.eval( bindings ); diff --git a/src/main/java/org/apache/maven/plugins/scripting/binding/Servers.java b/src/main/java/org/apache/maven/plugins/scripting/binding/Servers.java new file mode 100644 index 0000000..0b3f0e7 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/scripting/binding/Servers.java @@ -0,0 +1,63 @@ +package org.apache.maven.plugins.scripting.binding; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.execution.MavenSession; +import org.apache.maven.settings.Server; +import org.apache.maven.settings.building.SettingsProblem; +import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest; +import org.apache.maven.settings.crypto.SettingsDecrypter; +import org.apache.maven.settings.crypto.SettingsDecryptionResult; + +import static java.util.stream.Collectors.joining; + +/** + * Binding which enables to work with servers (from settings.xml) and in particular decipher them transparently. + */ +public class Servers +{ + private final MavenSession session; + private final SettingsDecrypter settingsDecrypter; + + public Servers( MavenSession session, SettingsDecrypter settingsDecrypter ) + { + this.session = session; + this.settingsDecrypter = settingsDecrypter; + } + + public Server find( String id ) + { + final Server server = session.getSettings().getServer( id ); + if ( server == null ) + { + return null; + } + final SettingsDecryptionResult result = settingsDecrypter.decrypt( + new DefaultSettingsDecryptionRequest( server ) ); + if ( !result.getProblems().isEmpty() ) + { + throw new IllegalStateException( result.getProblems().stream() + .map( SettingsProblem::toString ) + .collect( joining( "\n" ) ) ); + } + final Server decrypted = result.getServer(); + return decrypted == null ? server : decrypted; + } +} diff --git a/src/site/markdown/configure-the-script-engine.md.vm b/src/site/markdown/configure-the-script-engine.md.vm index 1e6f322..66eac0a 100644 --- a/src/site/markdown/configure-the-script-engine.md.vm +++ b/src/site/markdown/configure-the-script-engine.md.vm @@ -47,4 +47,8 @@ The plugin isn't bundled with any script engine, instead it should be added as d </dependency> </dependencies> </plugin> -``` \ No newline at end of file +``` + +The binding context is provided with `log` (maven mojo logger), `project` (maven project), `session` (maven session) and `servers` which enables to find a decrypted (if needed) server from your settings.xml. + +To use `servers`, you simply call `servers.find(<server_id>)` and it returns null or a `Server` instance which means you can call `server.getPassword()` to access the clear password. diff --git a/src/test/java/org/apache/maven/plugins/scripting/binding/ServersTest.java b/src/test/java/org/apache/maven/plugins/scripting/binding/ServersTest.java new file mode 100644 index 0000000..f5a131f --- /dev/null +++ b/src/test/java/org/apache/maven/plugins/scripting/binding/ServersTest.java @@ -0,0 +1,170 @@ +package org.apache.maven.plugins.scripting.binding; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.execution.DefaultMavenExecutionRequest; +import org.apache.maven.execution.DefaultMavenExecutionResult; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.settings.Proxy; +import org.apache.maven.settings.Server; +import org.apache.maven.settings.building.SettingsProblem; +import org.apache.maven.settings.crypto.DefaultSettingsDecrypter; +import org.apache.maven.settings.crypto.SettingsDecryptionRequest; +import org.apache.maven.settings.crypto.SettingsDecryptionResult; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.junit.Test; +import org.sonatype.aether.util.DefaultRepositorySystemSession; + +import java.util.List; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +// sanity check, decrypter impl is mocked for simplicity +public class ServersTest { + @Test + public void missing() throws PlexusContainerException + { + assertNull( new Servers( + newSession( emptyList() ), + new DefaultSettingsDecrypter() + ).find("test") ); + } + + @Test + public void clear() throws PlexusContainerException + { + final Server server = new Server(); + server.setId( "test" ); + server.setUsername( "clear" ); + server.setPassword( "12345" ); + assertEquals( "12345", new Servers( + newSession( singletonList(server) ), + new DefaultSettingsDecrypter() + { + @Override + public SettingsDecryptionResult decrypt( SettingsDecryptionRequest request ) + { + return new SettingsDecryptionResult() + { + @Override + public Server getServer() + { + return null; + } + + @Override + public List<SettingsProblem> getProblems() + { + return emptyList(); + } + + @Override + public List<Server> getServers() + { + throw new UnsupportedOperationException(); + } + + @Override + public Proxy getProxy() + { + throw new UnsupportedOperationException(); + } + + @Override + public List<Proxy> getProxies() + { + throw new UnsupportedOperationException(); + } + }; + } + } + ).find("test").getPassword() ); + } + + @Test + public void ciphered() throws PlexusContainerException + { + final Server server = new Server(); + server.setId( "test" ); + server.setUsername( "not-clear" ); + server.setPassword( "ciphered" ); + assertEquals( "12345", new Servers( + newSession( singletonList(server) ), + new DefaultSettingsDecrypter() + { + @Override + public SettingsDecryptionResult decrypt( SettingsDecryptionRequest request ) + { + return new SettingsDecryptionResult() + { + @Override + public Server getServer() + { + final Server result = new Server(); + result.setId( server.getId() ); + result.setUsername( server.getUsername() ); + result.setPassword( "12345" ); + return result; + } + + @Override + public List<SettingsProblem> getProblems() + { + return emptyList(); + } + + @Override + public List<Server> getServers() + { + throw new UnsupportedOperationException(); + } + + @Override + public Proxy getProxy() + { + throw new UnsupportedOperationException(); + } + + @Override + public List<Proxy> getProxies() + { + throw new UnsupportedOperationException(); + } + }; + } + } + ).find("test").getPassword() ); + } + + private MavenSession newSession( final List<Server> servers ) throws PlexusContainerException + { + final DefaultMavenExecutionRequest request = new DefaultMavenExecutionRequest(); + request.setServers( servers ); + return new MavenSession( + new DefaultPlexusContainer(), + new DefaultRepositorySystemSession(), + request, + new DefaultMavenExecutionResult() ); + } +}