aboutsummaryrefslogtreecommitdiffstats
path: root/FICS
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
parent0b81036ba5d4561ed8d0334f103228dce23a6f62 (diff)
Added new functions
Diffstat (limited to 'FICS')
-rw-r--r--FICS/settings.cpp74
-rw-r--r--FICS/settings.h4
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