* Eliminate EVT_OUTPUTMSG server extensions (don't need them anymore)
authorArt Cancro <ajc@citadel.org>
Tue, 16 Mar 2004 21:09:38 +0000 (21:09 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 16 Mar 2004 21:09:38 +0000 (21:09 +0000)
* 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
citadel/msgbase.c
citadel/serv_extensions.c
citadel/serv_extensions.h
citadel/serv_test.c
citadel/serv_vcard.c
citadel/server.h
citadel/user_ops.c
citadel/vcard.c
citadel/vcard.h

index 5333bfd056e17b4b27721e927d028b3faed24e1c..ad34bf8543cb33e9fa82e0904ef83943196c70b2 100644 (file)
@@ -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 <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
+
index 507ef25c3ba42cd6dc48707c5ffa3596ed038824..75146cfd0e66421c1e0f8f476f1025b36272bfb6 100644 (file)
@@ -1186,7 +1186,6 @@ int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage,
                strcpy(display_name, "<unknown>");
                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);
                }
index 7415203dbdb0317f6f2c3ae74859aa94522d6990..78b60ea22d7b763a71ea25b97c7525aad931d195 100644 (file)
@@ -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);
                }
        }
 }
index 71713bf1d401f60078b90855054f9afd12339678..6b645ca5a816dce3d519aaa45ed5fbe73e39dae2 100644 (file)
@@ -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);
index 3e05b906594df4057ae6ac6cfe9766c919b0f81a..afee1effa00bd1f08e60da3c362cf2a674545539 100644 (file)
@@ -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$";
 }
index 800dfcabb9b21e0858431ab0906a47a4640554d4..3db7f3d028f00a892ee9e4c5ea58a80bdc1bed5d 100644 (file)
@@ -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; i<strlen(buf); ++i) {
+               if (buf[i] == ' ') buf[i] = '_';
+       }
+       vcard_add_prop(v, "n", vname);
+       vcard_add_prop(v, "email;internet", buf);
+       vcard_write_user(usbuf, v);
+       vcard_free(v);
+}
+
+
 /*
  * When a user is being deleted, we have to remove his/her vCard.
  * This is accomplished by issuing a message with 'CANCEL' in the S (special)
  * field, and the same Extended ID as the existing card.
  */
-void vcard_purge(char *username, long usernum) {
+void vcard_purge(struct ctdluser *usbuf) {
        struct CtdlMessage *msg;
        char buf[SIZ];
 
@@ -649,7 +680,7 @@ void vcard_purge(char *username, long usernum) {
         msg->cm_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);
 
index a3073b5d618f01c6b27130ab3c61df4f84029779..c72f849f1f593b6311e4344ff9ad3fbfae3f5759 100644 (file)
@@ -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
index b43c7bb2af46a9b7833f49e645b3c90e54834ec3..92f51c2b0aafbbcdaa925f5c07014d790d9158d4 100644 (file)
@@ -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) {
index 1898516da0b34d0873b1ed9fdeb1dab258f148bb..bf46fd9e929fe71cd19a5ecd9c66f5030d3de42f 100644 (file)
@@ -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
  */
index aae58eb3c2b2e9cd5009cff1a03faf29cd1fbb0d..3a1d06b72d52464121048741dca91bfb6586135b 100644 (file)
@@ -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);