mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-30 13:47:41 +00:00
Upgraded sshd to 0.9
We can't upgrade it to 1.0 or 1.1 because these need java.nio.file, which is standard java 7 but not present in Android.
This commit is contained in:
parent
db7e40fb35
commit
6ed3a18f53
@ -65,7 +65,7 @@ dependencies {
|
|||||||
compile 'com.android.support:appcompat-v7:23.2.0'
|
compile 'com.android.support:appcompat-v7:23.2.0'
|
||||||
compile 'com.android.support:design:23.2.0'
|
compile 'com.android.support:design:23.2.0'
|
||||||
|
|
||||||
compile 'org.apache.sshd:sshd-core:0.8.0'
|
compile 'org.apache.sshd:sshd-core:0.9.0' //1.+ requires java.nio.file, which doesn't exist in Android
|
||||||
//compile 'org.bouncycastle:bcprov-jdk15on:1.54'
|
//compile 'org.bouncycastle:bcprov-jdk15on:1.54'
|
||||||
|
|
||||||
compile 'com.madgag.spongycastle:pkix:1.54.0.0'
|
compile 'com.madgag.spongycastle:pkix:1.54.0.0'
|
||||||
|
@ -26,15 +26,16 @@ import android.util.Log;
|
|||||||
import org.apache.sshd.SshServer;
|
import org.apache.sshd.SshServer;
|
||||||
import org.apache.sshd.common.NamedFactory;
|
import org.apache.sshd.common.NamedFactory;
|
||||||
import org.apache.sshd.common.Session;
|
import org.apache.sshd.common.Session;
|
||||||
|
import org.apache.sshd.common.file.FileSystemFactory;
|
||||||
|
import org.apache.sshd.common.file.FileSystemView;
|
||||||
|
import org.apache.sshd.common.file.SshFile;
|
||||||
|
import org.apache.sshd.common.file.nativefs.NativeFileSystemView;
|
||||||
|
import org.apache.sshd.common.file.nativefs.NativeSshFile;
|
||||||
|
import org.apache.sshd.common.util.SecurityUtils;
|
||||||
import org.apache.sshd.server.Command;
|
import org.apache.sshd.server.Command;
|
||||||
import org.apache.sshd.server.FileSystemFactory;
|
|
||||||
import org.apache.sshd.server.FileSystemView;
|
|
||||||
import org.apache.sshd.server.PasswordAuthenticator;
|
import org.apache.sshd.server.PasswordAuthenticator;
|
||||||
import org.apache.sshd.server.PublickeyAuthenticator;
|
import org.apache.sshd.server.PublickeyAuthenticator;
|
||||||
import org.apache.sshd.server.SshFile;
|
|
||||||
import org.apache.sshd.server.command.ScpCommandFactory;
|
import org.apache.sshd.server.command.ScpCommandFactory;
|
||||||
import org.apache.sshd.server.filesystem.NativeFileSystemView;
|
|
||||||
import org.apache.sshd.server.filesystem.NativeSshFile;
|
|
||||||
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
|
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
|
||||||
import org.apache.sshd.server.session.ServerSession;
|
import org.apache.sshd.server.session.ServerSession;
|
||||||
import org.apache.sshd.server.sftp.SftpSubsystem;
|
import org.apache.sshd.server.sftp.SftpSubsystem;
|
||||||
@ -108,9 +109,7 @@ class SimpleSftpServer {
|
|||||||
passwordAuth.setUser(USER);
|
passwordAuth.setUser(USER);
|
||||||
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(ctx.getFilesDir() + "/sftpd.ser"));
|
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(ctx.getFilesDir() + "/sftpd.ser"));
|
||||||
|
|
||||||
//sshd.setFileSystemFactory(new NativeFileSystemFactory());
|
|
||||||
sshd.setFileSystemFactory(new SecureFileSystemFactory());
|
sshd.setFileSystemFactory(new SecureFileSystemFactory());
|
||||||
//sshd.setShellFactory(new ProcessShellFactory(new String[] { "/bin/sh", "-i", "-l" }));
|
|
||||||
sshd.setCommandFactory(new ScpCommandFactory());
|
sshd.setCommandFactory(new ScpCommandFactory());
|
||||||
sshd.setSubsystemFactories(Collections.singletonList((NamedFactory<Command>)new SftpSubsystem.Factory()));
|
sshd.setSubsystemFactories(Collections.singletonList((NamedFactory<Command>)new SftpSubsystem.Factory()));
|
||||||
|
|
||||||
@ -152,8 +151,8 @@ class SimpleSftpServer {
|
|||||||
try {
|
try {
|
||||||
started = false;
|
started = false;
|
||||||
sshd.stop();
|
sshd.stop();
|
||||||
} catch (InterruptedException e) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,55 +180,55 @@ class SimpleSftpServer {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class SecureFileSystemFactory implements FileSystemFactory {
|
class SecureFileSystemFactory implements FileSystemFactory {
|
||||||
|
|
||||||
public SecureFileSystemFactory() {}
|
public SecureFileSystemFactory() {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileSystemView createFileSystemView(final Session username) {
|
public FileSystemView createFileSystemView(final Session username) {
|
||||||
final String base = "/";
|
final String base = "/";
|
||||||
return new SecureFileSystemView(base, username.getUsername());
|
return new SecureFileSystemView(base, username.getUsername());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SecureFileSystemView extends NativeFileSystemView {
|
||||||
|
// the first and the last character will always be '/'
|
||||||
|
// It is always with respect to the root directory.
|
||||||
|
private String currDir = "/";
|
||||||
|
private String rootDir = "/";
|
||||||
|
private String userName;
|
||||||
|
//
|
||||||
|
public SecureFileSystemView(final String rootDir, final String userName) {
|
||||||
|
super(userName);
|
||||||
|
this.rootDir = NativeSshFile.normalizeSeparateChar(rootDir);
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
@Override
|
||||||
|
public SshFile getFile(final String file) {
|
||||||
|
return getFile(currDir, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
class SecureFileSystemView extends NativeFileSystemView {
|
@Override
|
||||||
// the first and the last character will always be '/'
|
public SshFile getFile(final SshFile baseDir, final String file) {
|
||||||
// It is always with respect to the root directory.
|
return getFile(baseDir.getAbsolutePath(), file);
|
||||||
private String currDir = "/";
|
|
||||||
private String rootDir = "/";
|
|
||||||
private String userName;
|
|
||||||
//
|
|
||||||
public SecureFileSystemView(final String rootDir, final String userName) {
|
|
||||||
super(userName);
|
|
||||||
this.rootDir = NativeSshFile.normalizeSeparateChar(rootDir);
|
|
||||||
this.userName = userName;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
@Override
|
|
||||||
public SshFile getFile(final String file) {
|
|
||||||
return getFile(currDir, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SshFile getFile(final SshFile baseDir, final String file) {
|
|
||||||
return getFile(baseDir.getAbsolutePath(), file);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
protected SshFile getFile(final String dir, final String file) {
|
|
||||||
// get actual file object
|
|
||||||
final boolean caseInsensitive = false;
|
|
||||||
String physicalName = NativeSshFile.getPhysicalName("/", dir, file, caseInsensitive);
|
|
||||||
File fileObj = new File(rootDir, physicalName); // chroot
|
|
||||||
|
|
||||||
// strip the root directory and return
|
|
||||||
String userFileName = physicalName.substring("/".length() - 1);
|
|
||||||
return new SecureSshFile(userFileName, fileObj, userName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class SecureSshFile extends NativeSshFile {
|
//
|
||||||
public SecureSshFile(final String fileName, final File file, final String userName) {
|
protected SshFile getFile(final String dir, final String file) {
|
||||||
super(fileName, file, userName);
|
// get actual file object
|
||||||
}
|
final boolean caseInsensitive = false;
|
||||||
|
String physicalName = NativeSshFile.getPhysicalName("/", dir, file, caseInsensitive);
|
||||||
|
File fileObj = new File(rootDir, physicalName); // chroot
|
||||||
|
|
||||||
|
// strip the root directory and return
|
||||||
|
String userFileName = physicalName.substring("/".length() - 1);
|
||||||
|
return new SecureSshFile(this, userFileName, fileObj, userName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SecureSshFile extends NativeSshFile {
|
||||||
|
public SecureSshFile(NativeFileSystemView view, String fileName, File file, String userName) {
|
||||||
|
super(view, fileName, file, userName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user