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);
    }
}

Reply via email to