diff --git a/apps/wolfsshd/configuration.c b/apps/wolfsshd/configuration.c index 88244f01..6d39866e 100644 --- a/apps/wolfsshd/configuration.c +++ b/apps/wolfsshd/configuration.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -478,7 +479,7 @@ static int HandleInclude(WOLFSSHD_CONFIG *conf, const char *value) (defined(__APPLE__) && defined(__MACH__)) int ret; struct dirent *dir; - DIR *d; + WDIR d; char *path; char *filepath = (char*)WMALLOC(PATH_MAX, NULL, 0); @@ -504,26 +505,25 @@ static int HandleInclude(WOLFSSHD_CONFIG *conf, const char *value) prefixLen = (int)(ptr - value); } - d = opendir(path); - if (d) { + if (!WOPENDIR(NULL, conf->heap, &d, path)) { word32 fileCount = 0, i, j; char** fileNames = NULL; /* Count up the number of files */ - while ((dir = readdir(d)) != NULL) { + while ((dir = WREADDIR(&d)) != NULL) { /* Skip sub-directories */ if (dir->d_type != DT_DIR) { fileCount++; } } - rewinddir(d); + WREWINDDIR(&d); if (fileCount > 0) { fileNames = (char**)WMALLOC(fileCount * sizeof(char*), NULL, 0); } i = 0; - while ((dir = readdir(d)) != NULL && i < fileCount) { + while ((dir = WREADDIR(&d)) != NULL && i < fileCount) { /* Skip sub-directories */ if (dir->d_type != DT_DIR) { /* Insert in string order */ @@ -557,7 +557,7 @@ static int HandleInclude(WOLFSSHD_CONFIG *conf, const char *value) if (WSTRNCMP(fileNames[i] + WSTRLEN(fileNames[i]) - WSTRLEN(postfix), postfix, WSTRLEN(postfix)) == 0) { - snprintf(filepath, PATH_MAX, "%s/%s", path, + WSNPRINTF(filepath, PATH_MAX, "%s/%s", path, fileNames[i]); } else { @@ -566,19 +566,19 @@ static int HandleInclude(WOLFSSHD_CONFIG *conf, const char *value) } } else { - snprintf(filepath, PATH_MAX, "%s/%s", path, + WSNPRINTF(filepath, PATH_MAX, "%s/%s", path, fileNames[i]); } ret = wolfSSHD_ConfigLoad(conf, filepath); if (ret != WS_SUCCESS) { - closedir(d); + WCLOSEDIR(&d); WFREE(fileNames, NULL, 0); WFREE(filepath, NULL, 0); return ret; } } WFREE(fileNames, NULL, 0); - closedir(d); + WCLOSEDIR(&d); } else { /* Bad directory */ @@ -759,7 +759,7 @@ int wolfSSHD_ConfigLoad(WOLFSSHD_CONFIG* conf, const char* filename) f = XFOPEN(filename, "rb"); if (f == XBADFILE) { - wolfSSH_Log(WS_LOG_ERROR, "Unable to open SSHD config file %s\n", + wolfSSH_Log(WS_LOG_ERROR, "Unable to open SSHD config file %s", filename); return BAD_FUNC_ARG; } diff --git a/apps/wolfsshd/include.am b/apps/wolfsshd/include.am index cc20dee1..9342a24e 100644 --- a/apps/wolfsshd/include.am +++ b/apps/wolfsshd/include.am @@ -15,7 +15,7 @@ apps_wolfsshd_test_test_configuration_SOURCES = apps/wolfsshd/test/test_configur apps/wolfsshd/auth.c apps_wolfsshd_test_test_configuration_LDADD = src/libwolfssh.la apps_wolfsshd_test_test_configuration_DEPENDENCIES = src/libwolfssh.la -apps_wolfsshd_test_test_configuration_CPPFLAGS = -DWOLFSSH_SSHD -DWOLFSSHD_UNIT_TEST -Iapps/wolfsshd/ +apps_wolfsshd_test_test_configuration_CPPFLAGS = $(AM_CPPFLAGS) -DWOLFSSH_SSHD -DWOLFSSHD_UNIT_TEST -Iapps/wolfsshd/ DISTCLEANFILES+= apps/wolfsshd/.libs/wolfsshd \ apps/wolfsshd/test/.libs/test_configuration diff --git a/apps/wolfsshd/test/test_configuration.c b/apps/wolfsshd/test/test_configuration.c index 4b1fe5b7..a17429e2 100644 --- a/apps/wolfsshd/test/test_configuration.c +++ b/apps/wolfsshd/test/test_configuration.c @@ -26,6 +26,76 @@ void Log(const char *const fmt, ...) va_end(vlist); } +static void CleanupWildcardTest(void) +{ + WDIR dir; + struct dirent* d; + char filepath[MAX_PATH*2]; /* d_name is max_path long */ + + if (!WOPENDIR(NULL, NULL, &dir, "./sshd_config.d/")) { + while ((d = WREADDIR(&dir)) != NULL) { + if (d->d_type != DT_DIR) { + WSNPRINTF(filepath, sizeof filepath, "%s%s", + "./sshd_config.d/", d->d_name); + WREMOVE(0, filepath); + } + } + WCLOSEDIR(&dir); + WRMDIR(0, "./sshd_config.d/"); + } +} + +static int SetupWildcardTest(void) +{ + WFILE* f; + const byte fileIds[] = { 0, 1, 50, 59, 99 }; + word32 fileIdsSz = (word32)(sizeof(fileIds) / sizeof(byte)); + word32 i; + int ret; + char filepath[MAX_PATH]; + + ret = WMKDIR(0, "./sshd_config.d/", 0755); + + if (ret == 0) { + for (i = 0; i < fileIdsSz; i++) { + if (fileIds[i] != 0) { + WSNPRINTF(filepath, sizeof filepath, "%s%02u-test.conf", + "./sshd_config.d/", fileIds[i]); + } + else { + WSNPRINTF(filepath, sizeof filepath, "%stest.bad", + "./sshd_config.d/"); + } + + WFOPEN(&f, filepath, "w"); + if (f) { + word32 sz, wr; + char contents[20]; + WSNPRINTF(contents, sizeof contents, "LoginGraceTime %02u", + fileIds[i]); + sz = (word32)WSTRLEN(contents); + wr = (word32)WFWRITE(contents, sizeof(char), sz, f); + WFCLOSE(f); + if (sz != wr) { + Log("Couldn't write the contents of file %s\n", filepath); + ret = -1; + break; + } + } + else { + Log("Couldn't create the file %s\n", filepath); + ret = -1; + break; + } + } + } + else { + Log("Couldn't make the test config directory\n"); + } + + return ret; +} + typedef int (*TEST_FUNC)(void); typedef struct { const char *name; @@ -110,6 +180,13 @@ static int test_ParseConfigLine(void) {"Password auth no", "PasswordAuthentication no", 0}, {"Password auth yes", "PasswordAuthentication yes", 0}, {"Password auth invalid", "PasswordAuthentication wolfsshd", 1}, + + /* Include files tests. */ + {"Include file bad", "Include sshd_config.d/test.bad", 1}, + {"Include file exists", "Include sshd_config.d/01-test.conf", 0}, + {"Include file DNE", "Include sshd_config.d/test-dne.conf", 1}, + {"Include wildcard exists", "Include sshd_config.d/*.conf", 0}, + {"Include wildcard NDE", "Include sshd_config.d/*.dne", 0}, }; const int numVectors = (int)(sizeof(vectors) / sizeof(*vectors)); @@ -153,6 +230,12 @@ int main(int argc, char** argv) (void)argc; (void)argv; + CleanupWildcardTest(); + ret = SetupWildcardTest(); + if (ret != 0) { + return 1; + } + for (i = 0; i < TEST_CASE_CNT; ++i) { ret = RunTest(&testCases[i]); if (ret != WS_SUCCESS) { @@ -160,5 +243,7 @@ int main(int argc, char** argv) } } + CleanupWildcardTest(); + return ret; } diff --git a/wolfssh/port.h b/wolfssh/port.h index 4645599a..4a48db2d 100644 --- a/wolfssh/port.h +++ b/wolfssh/port.h @@ -1217,8 +1217,9 @@ extern "C" { /* returns 0 on success */ #define WOPENDIR(fs,h,c,d) ((*(c) = opendir((d))) == NULL) - #define WCLOSEDIR(d) closedir(*(d)) - #define WREADDIR(d) readdir(*(d)) + #define WCLOSEDIR(d) closedir(*(d)) + #define WREADDIR(d) readdir(*(d)) + #define WREWINDDIR(d) rewinddir(*(d)) #endif /* NO_WOLFSSH_DIR */ #endif #endif /* WOLFSSH_SFTP or WOLFSSH_SCP */