Hash the username in kiosk mode

So that the first part of $SSH_CLIENT can be passed as username.
weechat-hashes
C. McEnroe 2021-05-27 11:45:47 -04:00
parent 5e7c31b637
commit 6d5bcf72c1
3 changed files with 17 additions and 4 deletions

View File

@ -1,4 +1,4 @@
.Dd March 17, 2021 .Dd May 27, 2021
.Dt CATGIRL 1 .Dt CATGIRL 1
.Os .Os
. .
@ -148,6 +148,8 @@ Disable the
.Ic /query , .Ic /query ,
.Ic /quote .Ic /quote
commands. commands.
Replace the username
with a hash of its original value.
. .
.It Fl N Ar util , Cm notify = Ar util .It Fl N Ar util , Cm notify = Ar util
Send notifications using a utility. Send notifications using a utility.

8
chat.c
View File

@ -28,6 +28,7 @@
#include <err.h> #include <err.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <inttypes.h>
#include <limits.h> #include <limits.h>
#include <locale.h> #include <locale.h>
#include <poll.h> #include <poll.h>
@ -268,6 +269,13 @@ int main(int argc, char *argv[]) {
if (!user) user = nick; if (!user) user = nick;
if (!real) real = 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: // Modes defined in RFC 1459:
set(&network.chanTypes, "#&"); set(&network.chanTypes, "#&");
set(&network.prefixes, "@+"); set(&network.prefixes, "@+");

9
chat.h
View File

@ -138,8 +138,7 @@ static inline uint idFor(const char *name) {
extern uint32_t hashInit; extern uint32_t hashInit;
extern uint32_t hashBound; extern uint32_t hashBound;
static inline enum Color hash(const char *str) { static inline uint32_t _hash(const char *str) {
if (hashBound < Blue) return Default;
if (*str == '~') str++; if (*str == '~') str++;
uint32_t hash = hashInit; uint32_t hash = hashInit;
for (; *str; ++str) { for (; *str; ++str) {
@ -147,7 +146,11 @@ static inline enum Color hash(const char *str) {
hash ^= *str; hash ^= *str;
hash *= 0x27220A95; 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 { extern struct Network {