aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'FICS/settings.cpp')
-rw-r--r--FICS/settings.cpp74
1 files changed, 74 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)
{