From b24fd5efe6a0029b5e26763066b7b305308b2ef2 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sun, 16 Apr 2017 20:55:07 +0200 Subject: weechat: Hide password in login in connection buffer --- weechat/tomsg.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/weechat/tomsg.c b/weechat/tomsg.c index 439322b..2103406 100644 --- a/weechat/tomsg.c +++ b/weechat/tomsg.c @@ -400,6 +400,51 @@ static int conn_input_cb(const void *conn_vp,void *_d,struct t_gui_buffer *buffe return WEECHAT_RC_OK; } +static bool password_hide_modifier__found; + +static void password_hide_modifier_hmapper(void *data,struct t_hashtable *ht,const void *key,const void *value){ + (void)ht; (void)key; + const struct conndata *conn=(const struct conndata*)value; + if(conn->buffer==(struct t_gui_buffer*)data){ + password_hide_modifier__found=true; + } +} + +static char* password_hide_modifier(const void *_p,void *_d,const char *modifier,const char *bufstr,const char *str){ + (void)_p; (void)_d; (void)modifier; + struct t_gui_buffer *buffer=(struct t_gui_buffer*)strtoll(bufstr,NULL,16); + if(buffer==NULL){ + fprintf(debugf,"password_hide_modifier: bufstr is NULL: '%s'\n",bufstr); + return NULL; + } + password_hide_modifier__found=false; + weechat_hashtable_map(conntable,password_hide_modifier_hmapper,buffer); + if(!password_hide_modifier__found)return NULL; + + bool cursor_in_login=false; + for(int i=0,j=0;i<6;i++,j++){ + if(str[j]==0x19){ + j+=3; + cursor_in_login=true; + } + if(str[j]!="login "[i]){ + return NULL; + } + } + + const char *p=strchr(str+6+3*cursor_in_login,' '); + if(p==NULL)return NULL; + char *newstr=malloc(p-str+8); + assert(newstr); + memcpy(newstr,str,p-str); + if(memchr(newstr,0x19,p-str)!=NULL){ + memcpy(newstr+(p-str)," ***",5); // count includes '\0' + } else { + memcpy(newstr+(p-str)," ***\x19" "b#",8); // count includes '\0' + } + return newstr; +} + static int conn_close_cb(const void *conn_vp,void *_d,struct t_gui_buffer *buffer){ (void)_d; (void)buffer; struct conndata *conn=(struct conndata*)conn_vp; @@ -509,6 +554,8 @@ int weechat_plugin_init(struct t_weechat_plugin *plugin,int argc,char **argv){ NULL, cmd_tomsg_cb,NULL,NULL); + weechat_hook_modifier("input_text_display_with_cursor",password_hide_modifier,NULL,NULL); + net_set_push_callback(push_net_callback); net_set_history_callback(history_push_net_callback); -- cgit v1.2.3-54-g00ecf