diff options
author | C. McEnroe | 2021-05-27 11:45:47 -0400 |
---|---|---|
committer | C. McEnroe | 2021-05-27 11:45:47 -0400 |
commit | 6d5bcf72c10f7b648c7c605c3cd7ff6dcf9b7b17 (patch) | |
tree | cced605fee89298f0f148f64d924c029295fc5e7 | |
parent | 5e7c31b637fc7ed82e4f4c81ccd8ca4fe852972f (diff) |
Hash the username in kiosk mode
So that the first part of $SSH_CLIENT can be passed as username.
-rw-r--r-- | catgirl.1 | 4 | ||||
-rw-r--r-- | chat.c | 8 | ||||
-rw-r--r-- | chat.h | 9 |
3 files changed, 17 insertions, 4 deletions
diff --git a/catgirl.1 b/catgirl.1 index 2ba5377..fd9e696 100644 --- a/catgirl.1 +++ b/catgirl.1 @@ -1,4 +1,4 @@ -.Dd March 17, 2021 +.Dd May 27, 2021 .Dt CATGIRL 1 .Os . @@ -148,6 +148,8 @@ Disable the .Ic /query , .Ic /quote commands. +Replace the username +with a hash of its original value. . .It Fl N Ar util , Cm notify = Ar util Send notifications using a utility. diff --git a/chat.c b/chat.c index 7335520..23ad335 100644 --- a/chat.c +++ b/chat.c @@ -28,6 +28,7 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <inttypes.h> #include <limits.h> #include <locale.h> #include <poll.h> @@ -268,6 +269,13 @@ int main(int argc, char *argv[]) { if (!user) user = nick; if (!real) real = nick; + if (self.kiosk) { + char *hash; + int n = asprintf(&hash, "%8" PRIx32, _hash(user)); + if (n < 0) err(EX_OSERR, "asprintf"); + user = hash; + } + // Modes defined in RFC 1459: set(&network.chanTypes, "#&"); set(&network.prefixes, "@+"); diff --git a/chat.h b/chat.h index fadbc30..44ec9b8 100644 --- a/chat.h +++ b/chat.h @@ -138,8 +138,7 @@ static inline uint idFor(const char *name) { extern uint32_t hashInit; extern uint32_t hashBound; -static inline enum Color hash(const char *str) { - if (hashBound < Blue) return Default; +static inline uint32_t _hash(const char *str) { if (*str == '~') str++; uint32_t hash = hashInit; for (; *str; ++str) { @@ -147,7 +146,11 @@ static inline enum Color hash(const char *str) { hash ^= *str; hash *= 0x27220A95; } - return Blue + hash % (hashBound + 1 - Blue); + return hash; +} +static inline enum Color hash(const char *str) { + if (hashBound < Blue) return Default; + return Blue + _hash(str) % (hashBound + 1 - Blue); } extern struct Network { |