From 07f4dbb6ca918978ae6da4c2b05bd2a04fc77897 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Tue, 16 Mar 2004 21:09:38 +0000 Subject: [PATCH] * Eliminate EVT_OUTPUTMSG server extensions (don't need them anymore) * Add EVT_NEWUSER server extensions * EVT_NEWUSER and EVT_PURGEUSER server extensions now specify a struct ctdluser * instead of a username and usernum * serv_vcard.c: automatically create and submit a skeleton vCard when a new user is created. --- citadel/ChangeLog | 9 +++++++++ citadel/msgbase.c | 3 --- citadel/serv_extensions.c | 8 ++++---- citadel/serv_extensions.h | 6 +++--- citadel/serv_test.c | 8 -------- citadel/serv_vcard.c | 36 ++++++++++++++++++++++++++++++++++-- citadel/server.h | 4 ++-- citadel/user_ops.c | 7 +++++-- citadel/vcard.c | 15 +++++++++++++-- citadel/vcard.h | 1 + 10 files changed, 71 insertions(+), 26 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 5333bfd05..ad34bf854 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,12 @@ $Log$ + Revision 614.84 2004/03/16 21:09:37 ajc + * Eliminate EVT_OUTPUTMSG server extensions (don't need them anymore) + * Add EVT_NEWUSER server extensions + * EVT_NEWUSER and EVT_PURGEUSER server extensions now specify a + struct ctdluser * instead of a username and usernum + * serv_vcard.c: automatically create and submit a skeleton vCard when + a new user is created. + Revision 614.83 2004/03/16 19:05:50 error * Further changes to stress.c, Makefile.in to build it, .cvsignore (but it's still broken) @@ -5538,3 +5546,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 507ef25c3..75146cfd0 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -1186,7 +1186,6 @@ int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage, strcpy(display_name, ""); if (TheMessage->cm_fields['A']) { strcpy(buf, TheMessage->cm_fields['A']); - PerformUserHooks(buf, (-1L), EVT_OUTPUTMSG); if (TheMessage->cm_anon_type == MES_ANONONLY) { strcpy(display_name, "****"); } @@ -1316,8 +1315,6 @@ int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage, } cprintf(">%s", nl); - PerformUserHooks(luser, (-1L), EVT_OUTPUTMSG); - if (!is_room_aide() && (TheMessage->cm_anon_type == MES_ANONONLY)) { cprintf("From: x@x.org (----)%s", nl); } diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index 7415203db..78b60ea22 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -238,7 +238,7 @@ void CtdlUnregisterSessionHook(void (*fcn_ptr) (void), int EventType) } -void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType) +void CtdlRegisterUserHook(void (*fcn_ptr) (struct ctdluser *), int EventType) { struct UserFunctionHook *newfcn; @@ -255,7 +255,7 @@ void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType) } -void CtdlUnregisterUserHook(void (*fcn_ptr) (char *, long), int EventType) +void CtdlUnregisterUserHook(void (*fcn_ptr) (struct ctdluser *), int EventType) { struct UserFunctionHook *cur, *p; @@ -522,13 +522,13 @@ void PerformLogHooks(int loglevel, char *logmsg) } } -void PerformUserHooks(char *username, long usernum, int EventType) +void PerformUserHooks(struct ctdluser *usbuf, int EventType) { struct UserFunctionHook *fcn; for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) { if (fcn->eventtype == EventType) { - (*fcn->h_function_pointer) (username, usernum); + (*fcn->h_function_pointer) (usbuf); } } } diff --git a/citadel/serv_extensions.h b/citadel/serv_extensions.h index 71713bf1d..6b645ca5a 100644 --- a/citadel/serv_extensions.h +++ b/citadel/serv_extensions.h @@ -46,9 +46,9 @@ void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType); void CtdlUnregisterSessionHook(void (*fcn_ptr)(void), int EventType); void PerformSessionHooks(int EventType); -void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType); -void CtdlUnregisterUserHook(void (*fcn_ptr)(char*, long), int EventType); -void PerformUserHooks(char *username, long usernum, int EventType); +void CtdlRegisterUserHook(void (*fcn_ptr)(struct ctdluser *), int EventType); +void CtdlUnregisterUserHook(void (*fcn_ptr)(struct ctdluser *), int EventType); +void PerformUserHooks(struct ctdluser *usbuf, int EventType); void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order); void CtdlUnregisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order); diff --git a/citadel/serv_test.c b/citadel/serv_test.c index 3e05b9065..afee1effa 100644 --- a/citadel/serv_test.c +++ b/citadel/serv_test.c @@ -65,13 +65,6 @@ void LoginTest(void) { lprintf(CTDL_DEBUG, "--- Hello, %s ---\n", CC->curr_user); } - -void Ygorl(char *username, long usernum) { - if (!strcasecmp(username, "Unsuspecting User")) { - strcpy(username, "Flaming Asshole"); - } - } - void LogTest(char *buf) { fprintf(stderr,"%c[1m%s%c[0m", 27, buf, 27); fflush(stderr); @@ -85,7 +78,6 @@ char *serv_test_init(void) CtdlRegisterSessionHook(SessionStartTest, EVT_START); CtdlRegisterSessionHook(SessionStopTest, EVT_STOP); CtdlRegisterSessionHook(LoginTest, EVT_LOGIN); - CtdlRegisterUserHook(Ygorl, EVT_OUTPUTMSG); CtdlRegisterLogHook(LogTest, 1); return "$Id$"; } diff --git a/citadel/serv_vcard.c b/citadel/serv_vcard.c index 800dfcabb..3db7f3d02 100644 --- a/citadel/serv_vcard.c +++ b/citadel/serv_vcard.c @@ -633,12 +633,43 @@ void cmd_greg(char *argbuf) } +/* + * When a user is being created, create his/her vCard. + */ +void vcard_newuser(struct ctdluser *usbuf) { + char buf[SIZ]; + char vname[SIZ]; + struct vCard *v; + int i; + int vnum; + + /* Try to intelligently convert the screen name to a + * fully expanded vCard name based on the number of + * words in the name + */ + vnum = num_tokens(usbuf->fullname, ' '); + strcpy(vname, usbuf->fullname); /* FIXME */ + + /* Create and save the vCard */ + v = vcard_new(); + if (v == NULL) return; + sprintf(buf, "%s@%s", usbuf->fullname, config.c_fqdn); + for (i=0; icm_magic = CTDLMESSAGE_MAGIC; msg->cm_anon_type = MES_NORMAL; msg->cm_format_type = 0; - msg->cm_fields['A'] = strdoop(username); + msg->cm_fields['A'] = strdoop(usbuf->fullname); msg->cm_fields['O'] = strdoop(ADDRESS_BOOK_ROOM); msg->cm_fields['N'] = strdoop(NODENAME); msg->cm_fields['M'] = strdoop("Purge this vCard\n"); @@ -835,6 +866,7 @@ char *serv_vcard_init(void) CtdlRegisterProtoHook(cmd_igab, "IGAB", "Initialize Global Address Book"); CtdlRegisterProtoHook(cmd_qdir, "QDIR", "Query Directory"); + CtdlRegisterUserHook(vcard_newuser, EVT_NEWUSER); CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER); CtdlRegisterNetprocHook(vcard_extract_from_network); diff --git a/citadel/server.h b/citadel/server.h index a3073b5d6..c72f849f1 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -321,13 +321,13 @@ extern struct SessionFunctionHook *SessionHookTable; */ struct UserFunctionHook { struct UserFunctionHook *next; - void (*h_function_pointer) (char *username, long usernum); + void (*h_function_pointer) (struct ctdluser *usbuf); int eventtype; }; extern struct UserFunctionHook *UserHookTable; #define EVT_PURGEUSER 100 /* Deleting a user */ -#define EVT_OUTPUTMSG 101 /* Outputting a message */ +#define EVT_NEWUSER 102 /* Creating a user */ /* * MessageFunctionHook extensions are used for hooks which implement handlers diff --git a/citadel/user_ops.c b/citadel/user_ops.c index b43c7bb2a..92f51c2b0 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -744,7 +744,7 @@ int purge_user(char pname[]) lprintf(CTDL_NOTICE, "Deleting user <%s>\n", pname); /* Perform any purge functions registered by server extensions */ - PerformUserHooks(usbuf.fullname, usbuf.usernum, EVT_PURGEUSER); + PerformUserHooks(&usbuf, EVT_PURGEUSER); /* delete any existing user/room relationships */ cdb_delete(CDB_VISIT, &usbuf.usernum, sizeof(long)); @@ -840,8 +840,11 @@ int create_user(char *newusername, int become_user) lputroom(&qrbuf); } + /* Perform any create functions registered by server extensions */ + PerformUserHooks(&usbuf, EVT_NEWUSER); + /* Everything below this line can be bypassed if administratively - creating a user, instead of doing self-service account creation + * creating a user, instead of doing self-service account creation */ if (become_user) { diff --git a/citadel/vcard.c b/citadel/vcard.c index 1898516da..bf46fd9e9 100644 --- a/citadel/vcard.c +++ b/citadel/vcard.c @@ -53,6 +53,19 @@ struct vCard *vcard_new() { } +/* + * Add a property to a vCard + */ +void vcard_add_prop(struct vCard *v, char *propname, char *propvalue) { + ++v->numprops; + v->prop = reallok(v->prop, + (v->numprops * sizeof(char *) * 2) ); + v->prop[v->numprops-1].name = strdoop(propname); + v->prop[v->numprops-1].value = strdoop(propvalue); +} + + + /* * Constructor (supply serialized vCard) */ @@ -163,8 +176,6 @@ char *vcard_get_prop(struct vCard *v, char *propname, } - - /* * Destructor */ diff --git a/citadel/vcard.h b/citadel/vcard.h index aae58eb3c..3a1d06b72 100644 --- a/citadel/vcard.h +++ b/citadel/vcard.h @@ -25,6 +25,7 @@ struct vCard { struct vCard *vcard_new(void); +void vcard_add_prop(struct vCard *v, char *propname, char *propvalue); struct vCard *vcard_load(char *); void vcard_free(struct vCard *); void vcard_set_prop(struct vCard *v, char *name, char *value, int append); -- 2.30.2