You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rm...@apache.org on 2021/08/06 08:11:12 UTC
[maven-scripting-plugin] 01/01: binding the session and servers
helper in binding context
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 <rm...@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() );
+ }
+}