I am using mina sshd version 0.2.0. I created a simple main, and sftp command factory and command and tried to connect to my daemon with my OS X command line sftp client, and a few other graphical clients and it all ends the same way. With a NPE in the ChannelSession.doWriteData line 260. After debugging through the code the SFTP commands come in with a subsystem type, when that happens the shellIn and shellOut streams in ChannelSession remain null hence the NPE. I have included the stack trace as well as my classes to demonstrate the issue.
2009-11-11 08:50:45,710 [NioProcessor-2] WARN org.apache.sshd.server.session.ServerSession - Exception caught java.lang.NullPointerException at org.apache.sshd.server.channel.ChannelSession.doWriteData(ChannelSession.java:260) at org.apache.sshd.common.channel.AbstractChannel.handleData(AbstractChannel.java:116) at org.apache.sshd.common.session.AbstractSession.channelData(AbstractSession.java:863) at org.apache.sshd.server.session.ServerSession.handleMessage(ServerSession.java:195) at org.apache.sshd.common.session.AbstractSession.decode(AbstractSession.java:490) at org.apache.sshd.common.session.AbstractSession.messageReceived(AbstractSession.java:214) at org.apache.sshd.common.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:58) at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:721) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:801) at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:425) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:603) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:563) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:552) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:56) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:891) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:637) ==================================================== import org.apache.sshd.SshServer; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.util.BogusPasswordAuthenticator; import org.apache.sshd.util.EchoShellFactory; public class Sftpd { public static void main(String[] args) throws IOException { SshServer sshd = SshServer.setUpDefaultServer(); sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser")); sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator()); sshd.setShellFactory(new EchoShellFactory()); // sshd.setShellFactory(new ProcessShellFactory(new String[] { "/bin/sh", "-i", "-l" })); sshd.setPort(2222); sshd.setCommandFactory(new SftpCommandFactory()); sshd.start(); } } ====================================================== import org.apache.sshd.server.CommandFactory; import org.apache.sshd.server.command.UnknownCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SftpCommandFactory implements CommandFactory { private final Logger log = LoggerFactory.getLogger(SftpCommandFactory.class); public Command createCommand(String command) { log.info("SFtP: "+command); String[] args = command.split(" "); if (args.length > 0 && "sftp".equals(args[0])) return new SftpCommand(args); return new UnknownCommand(command); } } ============================================================== import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.sshd.server.CommandFactory; import org.apache.sshd.server.CommandFactory.ExitCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SftpCommand implements CommandFactory.Command, Runnable { private final Logger log = LoggerFactory.getLogger(SftpCommand.class); private OutputStream err; private ExitCallback callBack; private InputStream in; private OutputStream out; private IOException error; public SftpCommand(String[] args) { log.info("sftp args: "+args); } public void setErrorStream(OutputStream err) { } public void setExitCallback(ExitCallback callback) { } public void setInputStream(InputStream in) { } public void setOutputStream(OutputStream out) { } public void start() throws IOException { if (error != null) { throw error; } new Thread(this).start(); } public void run() { callBack.onExit(0); } }