aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/settings.cpp
diff options
context:
space:
mode:
authorMarkus Uhlin <markus@nifty-networks.net>2025-11-08 09:34:22 +0100
committerMarkus Uhlin <markus@nifty-networks.net>2025-11-08 09:34:22 +0100
commit06ac0a81c073f635ce5b4b15d3db827458895b0b (patch)
treef0d21800c9b67551872066de8e98964441e354fc /FICS/settings.cpp
parent0b81036ba5d4561ed8d0334f103228dce23a6f62 (diff)
Added new functions
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)
{