$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)
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
+
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, "****");
}
}
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);
}
}
-void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
+void CtdlRegisterUserHook(void (*fcn_ptr) (struct ctdluser *), int EventType)
{
struct UserFunctionHook *newfcn;
}
-void CtdlUnregisterUserHook(void (*fcn_ptr) (char *, long), int EventType)
+void CtdlUnregisterUserHook(void (*fcn_ptr) (struct ctdluser *), int EventType)
{
struct UserFunctionHook *cur, *p;
}
}
-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);
}
}
}
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);
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);
CtdlRegisterSessionHook(SessionStartTest, EVT_START);
CtdlRegisterSessionHook(SessionStopTest, EVT_STOP);
CtdlRegisterSessionHook(LoginTest, EVT_LOGIN);
- CtdlRegisterUserHook(Ygorl, EVT_OUTPUTMSG);
CtdlRegisterLogHook(LogTest, 1);
return "$Id$";
}
}
+/*
+ * 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];
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");
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);
*/
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
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));
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) {
}
+/*
+ * 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)
*/
}
-
-
/*
* Destructor
*/
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);