changeset 191:4007b9ac7cde

Handle usernames with whitespace by converting whitespaces to chr 255 in userhashes and internal buffers, and then back to 32 when outputting to screen/UI or sending to network.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Nov 2010 20:07:05 +0200
parents df284de8b118
children a2e9bbd8ca18
files nnchat.c
diffstat 1 files changed, 38 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/nnchat.c	Tue Nov 16 19:34:43 2010 +0200
+++ b/nnchat.c	Tue Nov 16 20:07:05 2010 +0200
@@ -168,6 +168,24 @@
     }
 }
 
+char *encodeUsername(char *str)
+{
+    unsigned char *c = (unsigned char *) str;
+    if (str == NULL) return NULL;
+    for (; *c ; c++) 
+        if (*c == ' ') *c = 255;
+    return str;
+}
+
+char *decodeUsername(char *str)
+{
+    unsigned char *c = (unsigned char *) str;
+    if (str == NULL) return NULL;
+    for (; *c ; c++) 
+        if (*c == 255) *c = ' ';
+    return str;
+}
+
 void updateStatus(BOOL insertMode)
 {
     char tmpStr[128];
@@ -209,9 +227,12 @@
 
 void printEditBuf(const char *str, nn_editbuf_t *buf)
 {
+    char *tmp;
     if (statusWin == NULL || buf == NULL) return;
 
     buf->data[buf->len] = 0;
+    tmp = decodeUsername(th_strdup(buf->data));
+    
     werase(editWin);
     
     wattrset(editWin, A_BOLD);
@@ -220,18 +241,19 @@
     wattrset(editWin, A_NORMAL);
     
     if (buf->pos < buf->len) {
-        waddnstr(editWin, buf->data, buf->pos);
+        waddnstr(editWin, tmp, buf->pos);
         wattrset(editWin, A_REVERSE);
-        waddch(editWin, buf->data[buf->pos]);
+        waddch(editWin, tmp[buf->pos]);
         wattrset(editWin, A_NORMAL);
-        waddnstr(editWin, buf->data + buf->pos + 1, buf->len - buf->pos - 1);
+        waddnstr(editWin, tmp + buf->pos + 1, buf->len - buf->pos - 1);
     } else {
-        waddnstr(editWin, buf->data, buf->len);
+        waddnstr(editWin, tmp, buf->len);
         wattrset(editWin, A_REVERSE);
         waddch(editWin, ' ');
         wattrset(editWin, A_NORMAL);
     }
     wrefresh(editWin);
+    th_free(tmp);
 }
 
 int printWin(WINDOW *win, const char *fmt)
@@ -254,7 +276,7 @@
                 }
                 if (*s != '˝') return -1;
                 s++;
-            
+
                 if (val < 9) {
                     col = A_DIM | COLOR_PAIR(val);
                 } else if (val < 30) {
@@ -262,6 +284,9 @@
                 }
             }
         } else {
+            if ((unsigned char) *s == 255)
+                waddch(win, ((unsigned char) ' ') | col);
+            else
             if (*s != '\r')
                 waddch(win, ((unsigned char) *s) | col);
             s++;
@@ -287,7 +312,10 @@
                 s++;
             }
         } else {
-            fputc((unsigned char) *s, outFile);
+            if ((unsigned char) *s == 255)
+                fputc(' ', outFile);
+            else
+                fputc((unsigned char) *s, outFile);
             s++;
         }
     }
@@ -358,7 +386,6 @@
     va_end(ap2);
 }
 
-
 int handleUser(nn_conn_t *conn, const char *str)
 {
     const char *msg = "</USER><MESSAGE>", *p = str;
@@ -466,7 +493,7 @@
     p = nn_dbldecode_str(str);
     if (!p) return -1;
 
-    nn_userhash_insert(nnUsers, p);
+    nn_userhash_insert(nnUsers, encodeUsername(p));
 
     printMsg("! ˝3˝%s˝0˝ ˝2˝ADDED.˝0˝\n", p);
     th_free(p);
@@ -486,7 +513,7 @@
     p = nn_dbldecode_str(str);
     if (!p) return -1;
 
-    nn_userhash_delete(nnUsers, p);
+    nn_userhash_delete(nnUsers, encodeUsername(p));
 
     printMsg("! ˝3˝%s˝0˝ ˝1˝DELETED.˝0˝\n", p);
     th_free(p);
@@ -574,6 +601,7 @@
     buf[bufLen--] = 0;
     while (bufLen > 0 && (buf[bufLen] == '\n' || buf[bufLen] == '\r' || th_isspace(buf[bufLen])))
         buf[bufLen--] = 0;
+    decodeUsername(buf);
     
     /* Check for special user commands */
     if (*buf == 0) {
@@ -687,7 +715,7 @@
     }
     
     /* Send double-encoded */
-    tmpStr = nn_dblencode_str(buf);
+    tmpStr = nn_dblencode_str(decodeUsername(buf));
     if (tmpStr == 0) return -2;
     result = nn_conn_send_msg(conn, optUserName2, "%s", tmpStr);
     th_free(tmpStr);