From 7ad4b6db67e7a6596f7ea2f6ff54b5a31e4d5df9 Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Mon, 18 May 2015 17:15:02 +0200 Subject: [PATCH] Module coders: introduce moddata_client_set_string() and moddata_client_get_string(). Will document later in ModData wiki page (which does not exist yet). --- include/modules.h | 2 ++ src/moddata.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/modules/certfp.c | 21 +++++---------------- 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/include/modules.h b/include/modules.h index 722acc878..d6a482e9d 100644 --- a/include/modules.h +++ b/include/modules.h @@ -648,6 +648,8 @@ extern void moddata_free_channel(aChannel *chptr); extern void moddata_free_member(Member *m); extern void moddata_free_membership(Membership *m); ModDataInfo *findmoddata_byname(char *name, ModDataType type); +extern int moddata_client_set_string(aClient *acptr, char *varname, char *value); +extern char *moddata_client_get_string(aClient *acptr, char *varname); /* Hook types */ #define HOOKTYPE_LOCAL_QUIT 1 diff --git a/src/moddata.c b/src/moddata.c index eacad0bf7..80649ac97 100644 --- a/src/moddata.c +++ b/src/moddata.c @@ -380,3 +380,46 @@ aClient *acptr; } } } + +/** Set ModData for client (via variable name, string value) */ +int moddata_client_set_string(aClient *acptr, char *varname, char *value) +{ + ModDataInfo *md; + + md = findmoddata_byname(varname, MODDATATYPE_CLIENT); + + if (!md) + return 0; + + if (value) + { + /* SET */ + md->unserialize(value, &moddata_client(acptr, md)); + } + else + { + /* UNSET */ + md->free(&moddata_client(acptr, md)); + memset(&moddata_client(acptr, md), 0, sizeof(ModData)); + } + + if (value) + sendto_server(NULL, 0, 0, ":%s MD %s %s %s :%s", + me.name, "client", acptr->name, md->name, value); /* set */ + else + sendto_server(NULL, 0, 0, ":%s MD %s %s %s", + me.name, "client", acptr->name, md->name); /* unset */ +} + +/** Get ModData for client (via variable name) */ +char *moddata_client_get_string(aClient *acptr, char *varname) +{ + ModDataInfo *md; + + md = findmoddata_byname(varname, MODDATATYPE_CLIENT); + + if (!md) + return NULL; + + return md->serialize(&moddata_client(acptr, md)); /* can be NULL */ +} diff --git a/src/modules/certfp.c b/src/modules/certfp.c index 0d0c20551..150fef1ab 100644 --- a/src/modules/certfp.c +++ b/src/modules/certfp.c @@ -98,35 +98,24 @@ char *get_fingerprint_for_client(aClient *cptr) return NULL; } -void certfp_broadcast(aClient *acptr, char *fp) -{ - /* Hmm.. we shouldn't have to do this ourselves.. */ - sendto_server(NULL, 0, 0, ":%s MD %s %s %s :%s", - me.name, "client", acptr->name, "certfp", fp); -} - int certfp_connect(aClient *acptr) { if (IsSecure(acptr)) { char *fp = get_fingerprint_for_client(acptr); - void *data = &moddata_client(acptr, certfp_md); + if (!fp) + return 0; /* wtf? */ + + moddata_client_set_string(acptr, "certfp", fp); /* set & broadcast */ sendnotice(acptr, "*** Your SSL fingerprint is %s", fp); - - /* Set & broadcast */ - certfp_unserialize(fp, data); - certfp_broadcast(acptr, fp); } return 0; } int certfp_whois(aClient *sptr, aClient *acptr) { - char *fp; - void *data = &moddata_client(acptr, certfp_md); /* never NULL */ - - fp = certfp_serialize(data); + char *fp = moddata_client_get_string(acptr, "certfp"); if (fp) sendto_one(sptr, WHOISCERTFP_STRING, me.name, sptr->name, acptr->name, fp);