From 9efa856065494eb48e6e69ed0966187e43355d91 Mon Sep 17 00:00:00 2001 From: Greg Alexander Date: Wed, 16 May 2018 16:23:12 -0400 Subject: [PATCH] add option to set environment variables --- NOTES | 1 - dropbear/dbutil.c | 46 +++++++++++++++++++ jni/config.h | 1 + jni/interface.c | 5 +- res/xml/preferences.xml | 5 ++ src/org/galexander/sshd/Prefs.java | 3 ++ .../galexander/sshd/SimpleSSHDService.java | 5 +- 7 files changed, 61 insertions(+), 5 deletions(-) diff --git a/NOTES b/NOTES index daa8c09..fa1c1d6 100644 --- a/NOTES +++ b/NOTES @@ -530,7 +530,6 @@ environment...just one name=value per line. XXX - document su change -XXX - add environment variable option (one name=value per line, just passed into setenv()) XXX - document environment variables diff --git a/dropbear/dbutil.c b/dropbear/dbutil.c index 6e57613..13c9c7b 100644 --- a/dropbear/dbutil.c +++ b/dropbear/dbutil.c @@ -570,6 +570,50 @@ int spawn_command(void(*exec_fn)(void *user_data), void *exec_data, } } + +static void +install_environment(void) +{ + char *s = conf_env; + if (!s) { + return; + } + while (*s) { + char *name, *val; + int name_len, val_len; + + name = s; + while (*s && (*s != '=') && (*s != '\r') && (*s != '\n')) { + s++; + } + name_len = s-name; + if (*s == '=') { + s++; + val = s; + while (*s && (*s != '\r') && (*s != '\n')) { + s++; + } + val_len = s-val; + } else { + val = ""; + val_len = 0; + } + while ((*s == '\r') || (*s == '\n')) { + s++; + } + if (name_len) { + char *n = m_malloc(name_len+1); + char *v = m_malloc(val_len+1); + memcpy(n, name, name_len); + memcpy(v, val, val_len); + n[name_len] = 0; + v[val_len] = 0; + setenv(n, v, /*overwrite=*/1); /* might fail *shrug* */ + } + } +} + + /* Runs a command with "sh -c". Will close FDs (except stdin/stdout/stderr) and * re-enabled SIGPIPE. If cmd is NULL, will run a login shell. */ @@ -626,6 +670,8 @@ void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell) { m_close(i); } + install_environment(); + execv(usershell, argv); } diff --git a/jni/config.h b/jni/config.h index 6746888..1e0ce2d 100644 --- a/jni/config.h +++ b/jni/config.h @@ -41,6 +41,7 @@ extern const char *conf_shell; extern const char *conf_home; const char *conf_path_file(const char *fn); extern int conf_rsyncbuffer; +extern const char *conf_env; #endif /* __CONFIG_H__ */ diff --git a/jni/interface.c b/jni/interface.c index b8cdc5a..8d1ee19 100644 --- a/jni/interface.c +++ b/jni/interface.c @@ -9,7 +9,7 @@ #include #include -const char *conf_path = "", *conf_shell = "", *conf_home = ""; +const char *conf_path = "", *conf_shell = "", *conf_home = "", *conf_env = ""; int conf_rsyncbuffer = 0; /* NB - this will leak memory like crazy if called often.... */ @@ -116,7 +116,7 @@ JNIEXPORT jint JNICALL Java_org_galexander_sshd_SimpleSSHDService_start_1sshd(JNIEnv *env_, jclass cl, jint port, jobject jpath, jobject jshell, jobject jhome, jobject jextra, - jint rsyncbuffer) + jint rsyncbuffer, jobject jenv) { pid_t pid; const char *extra; @@ -129,6 +129,7 @@ Java_org_galexander_sshd_SimpleSSHDService_start_1sshd(JNIEnv *env_, conf_home = from_java_string(jhome); extra = from_java_string(jextra); conf_rsyncbuffer = rsyncbuffer; + conf_env = from_java_string(jenv); pid = fork(); if (pid == 0) { diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 2c14afa..6d1d760 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -44,4 +44,9 @@ android:title="Extra Commandline" android:summary="Commandline options for dropbear server" android:defaultValue="" /> + diff --git a/src/org/galexander/sshd/Prefs.java b/src/org/galexander/sshd/Prefs.java index 7b0f425..7d8260f 100644 --- a/src/org/galexander/sshd/Prefs.java +++ b/src/org/galexander/sshd/Prefs.java @@ -46,6 +46,9 @@ public class Prefs { public static String get_extra() { return pref.getString("extra", ""); } + public static String get_env() { + return pref.getString("env", ""); + } public static SharedPreferences.Editor edit() { return pref.edit(); diff --git a/src/org/galexander/sshd/SimpleSSHDService.java b/src/org/galexander/sshd/SimpleSSHDService.java index d7a33bc..e048bad 100644 --- a/src/org/galexander/sshd/SimpleSSHDService.java +++ b/src/org/galexander/sshd/SimpleSSHDService.java @@ -129,7 +129,8 @@ public class SimpleSSHDService extends Service { final int pid = start_sshd(Prefs.get_port(), Prefs.get_path(), Prefs.get_shell(), Prefs.get_home(), Prefs.get_extra(), - (Prefs.get_rsyncbuffer() ? 1 : 0)); + (Prefs.get_rsyncbuffer() ? 1 : 0), + Prefs.get_env()); long now = System.currentTimeMillis(); if (pid != 0) { @@ -178,7 +179,7 @@ public class SimpleSSHDService extends Service { private static native int start_sshd(int port, String path, String shell, String home, String extra, - int rsyncbuffer); + int rsyncbuffer, String env); private static native void kill(int pid); private static native int waitpid(int pid); static {