diff options
Diffstat (limited to 'FICS')
| -rw-r--r-- | FICS/settings.cpp | 74 | ||||
| -rw-r--r-- | FICS/settings.h | 4 |
2 files changed, 78 insertions, 0 deletions
diff --git a/FICS/settings.cpp b/FICS/settings.cpp index 2541759..fac35bb 100644 --- a/FICS/settings.cpp +++ b/FICS/settings.cpp @@ -94,6 +94,80 @@ install_setting(const char *name, const char *value) return ENOENT; } +bool +is_valid_hostname(const char *p_str, err_reason_t *p_reason) +{ + const char legal_index[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-."; + const size_t HOST_MIN = 3; + const size_t HOST_MAX = 253; + size_t len = 0; + + if (p_str == nullptr || strcmp(p_str, "") == 0) { + strlcpy(p_reason->data, "no input", sizeof p_reason->data); + return false; + } else if ((len = strlen(p_str)) < HOST_MIN) { + snprintf(p_reason->data, sizeof p_reason->data, "hostname too " + "short (%zu): min=%zu", len, HOST_MIN); + return false; + } else if (len > HOST_MAX) { + snprintf(p_reason->data, sizeof p_reason->data, "hostname too " + "long (%zu): max=%zu", len, HOST_MAX); + return false; + } else if (strstr(p_str, "..")) { + strlcpy(p_reason->data, "dot followed by dot", + sizeof p_reason->data); + return false; + } + + for (const char *cp = p_str; *cp != '\0'; cp++) { + if (strchr(legal_index, *cp) == nullptr) { + snprintf(p_reason->data, sizeof p_reason->data, + "invalid chars found: first was '%c'", *cp); + return false; + } + } + + return true; +} + +bool +is_valid_username(const char *p_str, err_reason_t *p_reason) +{ + const char legal_index[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789_-"; + const size_t USER_MIN = 2; + const size_t USER_MAX = 30; + size_t len = 0; + + if (p_str == nullptr || strcmp(p_str, "") == 0) { + strlcpy(p_reason->data, "no input", sizeof p_reason->data); + return false; + } else if ((len = strlen(p_str)) < USER_MIN) { + snprintf(p_reason->data, sizeof p_reason->data, "username too " + "short (%zu): min=%zu", len, USER_MIN); + return false; + } else if (len > USER_MAX) { + snprintf(p_reason->data, sizeof p_reason->data, "username too " + "long (%zu): max=%zu", len, USER_MAX); + return false; + } + + for (const char *cp = p_str; *cp != '\0'; cp++) { + if (strchr(legal_index, *cp) == nullptr) { + snprintf(p_reason->data, sizeof p_reason->data, + "invalid chars found: first was '%c'", *cp); + return false; + } + } + + return true; +} + const char * settings_get(const char *set_name) { diff --git a/FICS/settings.h b/FICS/settings.h index 9dcf7dc..bfc8cf3 100644 --- a/FICS/settings.h +++ b/FICS/settings.h @@ -3,6 +3,8 @@ #include "common.h" +#include <stdbool.h> + typedef struct { char data[400]; } err_reason_t; @@ -11,6 +13,8 @@ __FICS_BEGIN_DECLS void settings_init(void); void settings_deinit(void); +bool is_valid_hostname(const char *, err_reason_t *); +bool is_valid_username(const char *, err_reason_t *); const char *settings_get(const char *set_name); void settings_read_conf(const char *path); __FICS_END_DECLS |
