diff --git a/artifact/project.xml b/artifact/project.xml
index fd3ad2d2..c91c1c1a 100644
--- a/artifact/project.xml
+++ b/artifact/project.xml
@@ -59,7 +59,7 @@
jsch
jsch
- 0.0.9
+ 0.1.5
jar
diff --git a/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java b/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
index 38a49676..76878fc7 100644
--- a/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
+++ b/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
@@ -74,7 +74,7 @@ import org.apache.maven.util.MD5Sum;
* Default implemenataion of Artifact Deployer interface
*
* @author Michal Maczka
- * @version $Id: DefaultArtifactDeployer.java,v 1.7 2003/06/24 16:20:51 michal Exp $
+ * @version $Id: DefaultArtifactDeployer.java,v 1.8 2003/06/24 22:22:55 michal Exp $
*/
public class DefaultArtifactDeployer implements ArtifactDeployer
{
@@ -214,7 +214,7 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
{
destFile.mkdirs();
}
- destFile = new File(file, getRepositoryFile(type, project, version));
+ destFile = new File(destFile, getRepositoryFile(type, project, version));
System.out.println(
"Copying: from '" + file + "' to: '" + destFile + "'");
FileUtils.copyFile(file, destFile);
diff --git a/artifact/src/main/org/apache/maven/artifact/deployer/MavenDeployRequest.java b/artifact/src/main/org/apache/maven/artifact/deployer/MavenDeployRequest.java
index 4ba6db1b..c0c19ecd 100644
--- a/artifact/src/main/org/apache/maven/artifact/deployer/MavenDeployRequest.java
+++ b/artifact/src/main/org/apache/maven/artifact/deployer/MavenDeployRequest.java
@@ -64,7 +64,7 @@ import org.apache.maven.project.Project;
* The Bean which serves as Proxy for Jelly scripts To Artifact Deployement API
*
* @author Michal Maczka
- * @version $Id: MavenDeployRequest.java,v 1.4 2003/06/20 15:24:52 michal Exp $
+ * @version $Id: MavenDeployRequest.java,v 1.5 2003/06/24 22:22:55 michal Exp $
*/
public class MavenDeployRequest extends DeployRequest
{
@@ -95,8 +95,7 @@ public class MavenDeployRequest extends DeployRequest
String username =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".username");
-
- System.out.println(repository + " username:" + username);
+
String password =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".password");
@@ -141,7 +140,7 @@ public class MavenDeployRequest extends DeployRequest
setUser(username);
setPass(password);
setPassphrase(passphrase);
- setPrivateKey(url.trim());
+ setPrivateKey(privateKey);
setGroup(remoteGroup);
setUrl(url.trim());
diff --git a/artifact/src/main/org/apache/maven/deploy/DeployRequest.java b/artifact/src/main/org/apache/maven/deploy/DeployRequest.java
index d2f159dd..97230b01 100644
--- a/artifact/src/main/org/apache/maven/deploy/DeployRequest.java
+++ b/artifact/src/main/org/apache/maven/deploy/DeployRequest.java
@@ -59,11 +59,11 @@ package org.apache.maven.deploy;
/**
*
* @author Michal Maczka
- * @version $Id: DeployRequest.java,v 1.2 2003/06/19 22:02:37 michal Exp $
+ * @version $Id: DeployRequest.java,v 1.3 2003/06/24 22:22:55 michal Exp $
*/
public class DeployRequest
{
-
+
public final static int UNKNOWN_PORT = -1;
diff --git a/artifact/src/main/org/apache/maven/deploy/DeployTool.java b/artifact/src/main/org/apache/maven/deploy/DeployTool.java
index bc2d21dd..76759da8 100644
--- a/artifact/src/main/org/apache/maven/deploy/DeployTool.java
+++ b/artifact/src/main/org/apache/maven/deploy/DeployTool.java
@@ -60,14 +60,14 @@ import org.apache.maven.deploy.deployers.Deployer;
import org.apache.maven.deploy.deployers.FileDeployer;
import org.apache.maven.deploy.deployers.FtpDeployer;
import org.apache.maven.deploy.deployers.HttpDeployer;
-import org.apache.maven.deploy.deployers.SshDeployer;
+import org.apache.maven.deploy.deployers.SFtpDeployer;
import org.apache.maven.deploy.exceptions.DeployException;
import org.apache.maven.deploy.exceptions.UnsupportedProtocolDeployException;
/**
*
* @author Michal Maczka
- * @version $Id: DeployTool.java,v 1.2 2003/06/19 22:02:37 michal Exp $
+ * @version $Id: DeployTool.java,v 1.3 2003/06/24 22:22:55 michal Exp $
*/
public class DeployTool
{
@@ -75,7 +75,6 @@ public class DeployTool
public void performUpload(DeployRequest request) throws DeployException
{
-
String url = request.getUrl();
Deployer deployer = null;
@@ -85,23 +84,22 @@ public class DeployTool
"No URL provided for repsoitory: "
+ request.getRepositoryAlias());
}
- if (url.startsWith("http://"))
+ if (url.startsWith(HttpDeployer.PROTOCOL))
{
deployer = new HttpDeployer();
}
-
- if (url.startsWith("file://"))
+ if (url.startsWith(FileDeployer.PROTOCOL))
{
deployer = new FileDeployer();
}
- if (url.startsWith("ssh://"))
- {
- deployer = new SshDeployer();
- }
- if (url.startsWith("ftp://"))
+ if (url.startsWith(FtpDeployer.PROTOCOL))
{
deployer = new FtpDeployer();
}
+ if (url.startsWith(SFtpDeployer.PROTOCOL))
+ {
+ deployer = new SFtpDeployer();
+ }
if (deployer == null)
{
throw new UnsupportedProtocolDeployException(url);
diff --git a/artifact/src/main/org/apache/maven/deploy/deployers/FileDeployer.java b/artifact/src/main/org/apache/maven/deploy/deployers/FileDeployer.java
index 374b338f..24fcf6f6 100644
--- a/artifact/src/main/org/apache/maven/deploy/deployers/FileDeployer.java
+++ b/artifact/src/main/org/apache/maven/deploy/deployers/FileDeployer.java
@@ -66,11 +66,13 @@ import org.apache.maven.deploy.exceptions.DeployException;
/**
*
* @author Michal Maczka
- * @version $Id: FileDeployer.java,v 1.3 2003/06/20 15:24:52 michal Exp $
+ * @version $Id: FileDeployer.java,v 1.4 2003/06/24 22:22:54 michal Exp $
*/
public class FileDeployer implements Deployer
{
+ public final static String PROTOCOL = "file://";
+
/**
* @see org.apache.maven.fetch.fetchers.Fetcher#fetchUrl(java.lang.String, java.io.OutputStream)
*/
diff --git a/artifact/src/main/org/apache/maven/deploy/deployers/FtpDeployer.java b/artifact/src/main/org/apache/maven/deploy/deployers/FtpDeployer.java
index 0fa6d534..8b8ebf61 100644
--- a/artifact/src/main/org/apache/maven/deploy/deployers/FtpDeployer.java
+++ b/artifact/src/main/org/apache/maven/deploy/deployers/FtpDeployer.java
@@ -75,15 +75,20 @@ import org.apache.maven.deploy.exceptions.DeployException;
/**
* An FTP deployer based on the FTPClient in the Commons Net package.
*
+ * Proxy server for FTPClient is not supported:
+ * {@link http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18039}
+ *
* @author Jason van Zyl
- *
- * @version $Id: FtpDeployer.java,v 1.2 2003/06/19 22:02:36 michal Exp $
- *
- * @todo account for username and password.
+ * @author Michal Maczka
+ * @version $Id: FtpDeployer.java,v 1.3 2003/06/24 22:22:54 michal Exp $
+ *
+ *
*/
public class FtpDeployer extends AbstractDeployer
{
-
+
+ public final static String PROTOCOL = "ftp://";
+
/**
* Description of the Method
*/
@@ -140,8 +145,7 @@ public class FtpDeployer extends AbstractDeployer
}
__main : try
- {
- System.out.println("username: '" + username +"' password: '"+ password+"'");
+ {
if (ftp.login(username.trim(), password.trim()) == false)
{
ftp.logout();
diff --git a/artifact/src/main/org/apache/maven/deploy/deployers/HttpDeployer.java b/artifact/src/main/org/apache/maven/deploy/deployers/HttpDeployer.java
index 0520fbd0..19222274 100644
--- a/artifact/src/main/org/apache/maven/deploy/deployers/HttpDeployer.java
+++ b/artifact/src/main/org/apache/maven/deploy/deployers/HttpDeployer.java
@@ -76,7 +76,7 @@ import org.apache.maven.deploy.exceptions.DeployException;
* An HTTP deployer based the Commons HttpClient library.
*
* @author Jason van Zyl
- * @version $Id: HttpDeployer.java,v 1.1 2003/06/17 22:05:59 michal Exp $
+ * @version $Id: HttpDeployer.java,v 1.2 2003/06/24 22:22:54 michal Exp $
*
* @todo still have to account for differing setups for people deploying to
* their own sites and to the central repository.
@@ -87,6 +87,7 @@ import org.apache.maven.deploy.exceptions.DeployException;
public class HttpDeployer extends AbstractDeployer
{
+ public final static String PROTOCOL = "http://";
/**
* Description of the Method
*/
diff --git a/artifact/src/main/org/apache/maven/deploy/deployers/SshDeployer.java b/artifact/src/main/org/apache/maven/deploy/deployers/SFtpDeployer.java
similarity index 50%
rename from artifact/src/main/org/apache/maven/deploy/deployers/SshDeployer.java
rename to artifact/src/main/org/apache/maven/deploy/deployers/SFtpDeployer.java
index 298a51ac..9616dce5 100644
--- a/artifact/src/main/org/apache/maven/deploy/deployers/SshDeployer.java
+++ b/artifact/src/main/org/apache/maven/deploy/deployers/SFtpDeployer.java
@@ -56,18 +56,20 @@ package org.apache.maven.deploy.deployers;
* ====================================================================
*/
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.UserInfo;
-import com.jcraft.jsch.ChannelExec;
-import com.jcraft.jsch.Session;
-import com.jcraft.jsch.Channel;
-
import java.io.File;
-import java.io.FileInputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
+import org.apache.commons.lang.StringUtils;
import org.apache.maven.deploy.DeployRequest;
+import org.apache.maven.deploy.exceptions.DeployException;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Proxy;
+import com.jcraft.jsch.ProxyHTTP;
+import com.jcraft.jsch.ProxySOCKS5;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.SftpATTRS;
+import com.jcraft.jsch.UserInfo;
/**
* An ssh2 deployer that uses the JSch library and the JCE. We will first try to
@@ -76,115 +78,144 @@ import org.apache.maven.deploy.DeployRequest;
* assuming the standard port of 22.
*
* @author Jason van Zyl
- * @version $Id: SshDeployer.java,v 1.1 2003/06/17 22:05:59 michal Exp $
+ * @version $Id: SFtpDeployer.java,v 1.1 2003/06/24 22:22:54 michal Exp $
* @todo still have to account for differing setups for people deploying to
* their own sites and to the central repository.
*/
-public class SshDeployer extends AbstractDeployer
+public class SFtpDeployer extends AbstractDeployer
{
- public final static int DEFAULT_SSH_PORT = 22;
+ public final static String PROTOCOL = "sftp://";
+
+ public final static String SFTP_CHANNEL = "sftp";
+ public final static int DEFAULT_SSH_PORT = 22;
+ public final static int SOCKS5_PROXY_PORT = 1080;
+ public final static int S_IFDIR = 0x4000;
+
/**
* @see Deployer#project
+ *
+ * @todo better way of guessing what king of proxy server is used
*/
- public void deploy(DeployRequest request)
+ public void deploy(DeployRequest request) throws DeployException
{
+ Integer groupId = null;
+ try
+ {
+ if (request.getGroup() != null)
+ {
+ groupId = Integer.getInteger(request.getGroup());
+ }
+ }
+ catch (NumberFormatException e)
+ {
+ throw new DeployException("For sftp protocol remote group should be an integer");
+ }
try
{
JSch jsch = new JSch();
-
+
int port = request.getPort();
if (port == DeployRequest.UNKNOWN_PORT)
{
- port = DEFAULT_SSH_PORT;
+ port = DEFAULT_SSH_PORT;
+ }
+ String host = request.getHost();
+ Session session = jsch.getSession(request.getUser(), host, port);
+
+ String proxyHost = request.getProxyHost();
+
+ if (proxyHost != null)
+ {
+ Proxy proxy = null;
+ int proxyPort = request.getProxyPort();
+ //if port == 1080 we will use SOCKS5 Proxy
+ // otherwise will use HTTP Proxy
+
+ if (proxyPort == SOCKS5_PROXY_PORT)
+ {
+ proxy = new ProxySOCKS5(proxyHost);
+ ((ProxySOCKS5) proxy).setUserPasswd(
+ request.getProxyUser(),
+ request.getProxyPass());
+ }
+ else
+ {
+ proxy = new ProxyHTTP(proxyHost, proxyPort);
+ ((ProxyHTTP) proxy).setUserPasswd(
+ request.getProxyUser(),
+ request.getProxyPass());
+ }
+ proxy.connect(session, host, port);
+
}
- Session session =
- jsch.getSession(request.getHost(), port);
- //22
// Look for the private key and use it if available.
- File privateKey = new File(request.getPrivateKey());
-
- if (privateKey.exists())
+ if (request.getPrivateKey() != null)
{
- session.setIdentity(privateKey.getPath());
- }
+ File privateKey = new File(request.getPrivateKey());
+ if (privateKey.exists())
+ {
+ System.out.println("Using private key: " + privateKey);
+ jsch.addIdentity(
+ privateKey.getAbsolutePath(),
+ request.getPassphrase());
+ }
+ }
// username and password will be given via UserInfo interface.
UserInfo ui = new MavenUserInfo(request);
session.setUserInfo(ui);
session.connect();
- String inputFile = request.getInputFile();
- // exec 'scp -t remoteArtifactPath' remotely
- String command =
- "scp -t "
- + request.getOutputDir()
- + "/"
- + request.getOutputFile();
- Channel channel = session.openChannel("exec");
- ((ChannelExec) channel).setCommand(command);
-
- // plug I/O streams for remote scp
- PipedOutputStream out = new PipedOutputStream();
- channel.setInputStream(new PipedInputStream(out));
- PipedInputStream in = new PipedInputStream();
- channel.setOutputStream(new PipedOutputStream(in));
-
+ ChannelSftp channel =
+ (ChannelSftp) session.openChannel(SFTP_CHANNEL);
channel.connect();
-
- byte[] tmp = new byte[1];
-
- // wait for '\0'
- do
+ // iterate over all directories in the path. try to create
+ // directory
+ String[] dirs = StringUtils.split(request.getOutputDir(), "/");
+ for (int i = 0; i < dirs.length; i++)
{
- in.read(tmp, 0, 1);
- }
- while (tmp[0] != 0);
-
- // send "C0644 filesize filename", where filename should not include '/'
- int filesize = (int) (new File( inputFile )).length();
- command = "C0644 " + filesize + " " + inputFile;
- command += "\n";
- out.write(command.getBytes());
- out.flush();
-
- // wait for '\0'
- do
- {
- in.read(tmp, 0, 1);
- }
- while (tmp[0] != 0);
-
- // send a content of localArtifactPath
- FileInputStream fis = new FileInputStream(inputFile);
- byte[] buf = new byte[1024];
- while (true)
- {
- int len = fis.read(buf, 0, buf.length);
- if (len <= 0)
+ System.out.println("processing: " + dirs[i]);
+ try
{
- break;
+ SftpATTRS attrs = channel.stat(dirs[i]);
+ if ((attrs.getPermissions() & S_IFDIR) != 0)
+ {
+ // file exists and is dierctory
+ channel.cd(dirs[i]);
+ }
+ else
+ {
+ throw new DeployException(
+ "Remote path:"
+ + request.getOutputDir()
+ + "is not correct");
+ }
}
- out.write(buf, 0, len);
- out.flush();
+ catch (Exception e)
+ {
+ // file does not exists
+ channel.mkdir(dirs[i]);
+ channel.cd(dirs[i]);
+ }
+
}
- // send '\0'
- buf[0] = 0;
- out.write(buf, 0, 1);
- out.flush();
+ channel.put(request.getInputFile(), request.getOutputFile());
- // wait for '\0'
- do
+ if (groupId != null)
{
- in.read(tmp, 0, 1);
+ channel.chgrp(groupId.intValue(), request.getOutputFile());
}
- while (tmp[0] != 0);
+
}
catch (Exception e)
{
- System.out.println(e);
+ e.printStackTrace();
+ throw new DeployException(
+ "Cannot deploy. Reason: " + e.getMessage(),
+ e);
}
}
@@ -194,68 +225,60 @@ public class SshDeployer extends AbstractDeployer
*/
public class MavenUserInfo implements UserInfo
{
-
+
DeployRequest request;
-
+
MavenUserInfo(DeployRequest request)
{
- this.request = request;
+ this.request = request;
}
- /**
- * Gets the name attribute of the MavenUserInfo object
- */
- public String getName()
+ public String getPassphrase()
{
- return request.getUser();
+ return request.getPassphrase();
}
- /**
- * Gets the password attribute of the MavenUserInfo object
+ /* (non-Javadoc)
+ * @see com.jcraft.jsch.UserInfo#getPassword()
*/
public String getPassword()
{
return request.getPass();
}
- /**
- * Gets the passphrase attribute of the MavenUserInfo object
+ /* (non-Javadoc)
+ * @see com.jcraft.jsch.UserInfo#promptPassphrase(java.lang.String)
*/
- public String getPassphrase(String message)
+ public boolean promptPassphrase(String arg0)
{
- return request.getPassphrase();
+ return true;
}
- /**
- * Required to satisfy UserInfo interface. Not used currently.
+ /* (non-Javadoc)
+ * @see com.jcraft.jsch.UserInfo#promptPassword(java.lang.String)
*/
- public boolean promptNameAndPassphrase(String message)
+ public boolean promptPassword(String arg0)
{
return true;
}
/**
- * Required to satisfy UserInfo interface. Not used currently.
+ * @see com.jcraft.jsch.UserInfo#promptYesNo(java.lang.String)
*/
- public boolean promptNameAndPassword(String message)
+ public boolean promptYesNo(String arg0)
{
return true;
}
- /**
- * Required to satisfy UserInfo interface. Not used currently.
+ /* (non-Javadoc)
+ * @see com.jcraft.jsch.UserInfo#showMessage(java.lang.String)
*/
- public boolean retry()
+ public void showMessage(String message)
{
- return true;
+ System.out.println(message);
+
}
- /**
- * Required to satisfy UserInfo interface. Not used currently.
- */
- public boolean prompt(String message)
- {
- return true;
- }
}
+
}