X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fuseredit.c;h=a6b4d4b44df152eb836e8acc4d06ee6a04e4cb2a;hb=HEAD;hp=09d10898743c82e5840e893d558252b5662868aa;hpb=6ec73d6906542ea2f8cca2e62f7625ee2e17ae03;p=citadel.git diff --git a/webcit/useredit.c b/webcit/useredit.c index 09d108987..ce94a343d 100644 --- a/webcit/useredit.c +++ b/webcit/useredit.c @@ -1,11 +1,19 @@ /* - * $Id$ + * Copyright (c) 1996-2021 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #include "webcit.h" -#include "webserver.h" +CtxType CTX_USERLIST = CTX_NONE; /* * show a list of available users to edit them * message the header message??? @@ -14,7 +22,7 @@ void select_user_to_edit(const char *preselect) { output_headers(1, 0, 0, 0, 1, 0); - do_template("edituser_select", NULL); + do_template("aide_edituser_select"); end_burst(); } @@ -31,6 +39,11 @@ typedef struct _UserListEntry { /* Just available for Single users to view: */ unsigned int Flags; int DaysTillPurge; + int HasBio; + + StrBuf *PrimaryEmail; + StrBuf *OtherEmails; + } UserListEntry; @@ -44,6 +57,8 @@ UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser, const char *Pos) ul = (UserListEntry*) malloc(sizeof(UserListEntry)); ul->UserName = NewStrBuf(); ul->Passvoid = NewStrBuf(); + ul->PrimaryEmail = NewStrBuf(); + ul->OtherEmails = NewStrBuf(); StrBufExtract_NextToken(ul->UserName, SerializedUser, &Pos, '|'); StrBufExtract_NextToken(ul->Passvoid, SerializedUser, &Pos, '|'); @@ -63,6 +78,8 @@ void DeleteUserListEntry(void *vUserList) if (!ul) return; FreeStrBuf(&ul->UserName); FreeStrBuf(&ul->Passvoid); + FreeStrBuf(&ul->PrimaryEmail); + FreeStrBuf(&ul->OtherEmails); free(ul); } @@ -77,6 +94,8 @@ UserListEntry* NewUserListEntry(StrBuf *SerializedUserList) ul = (UserListEntry*) malloc(sizeof(UserListEntry)); ul->UserName = NewStrBuf(); ul->Passvoid = NewStrBuf(); + ul->PrimaryEmail = NewStrBuf(); + ul->OtherEmails = NewStrBuf(); StrBufExtract_NextToken(ul->UserName, SerializedUserList, &Pos, '|'); ul->AccessLevel = StrBufExtractNext_int( SerializedUserList, &Pos, '|'); @@ -86,6 +105,7 @@ UserListEntry* NewUserListEntry(StrBuf *SerializedUserList) ul->nPosts = StrBufExtractNext_int( SerializedUserList, &Pos, '|'); StrBufExtract_NextToken(ul->Passvoid, SerializedUserList, &Pos, '|'); ul->Flags = 0; + ul->HasBio = 0; ul->DaysTillPurge = -1; return ul; } @@ -255,12 +275,12 @@ HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP) { int Done = 0; CompareFunc SortIt; - HashList *Hash; + HashList *Hash = NULL; StrBuf *Buf; UserListEntry* ul; - char nnn[64]; - int nUsed; int len; + int UID; + void *vData; WCTemplputParams SubTP; memset(&SubTP, 0, sizeof(WCTemplputParams)); @@ -268,21 +288,42 @@ HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP) Buf = NewStrBuf(); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, NULL) == 1) { - Hash = NewHash(1, NULL); - + Hash = NewHash(1, Flathash); + Done = 0; while (!Done) { len = StrBuf_ServGetln(Buf); - if ((len == 3) && - (strcmp(ChrPtr(Buf), "000")==0)) { + if ((len <0) || + ((len == 3) && + !strcmp(ChrPtr(Buf), "000"))) + { Done = 1; break; } ul = NewUserListEntry(Buf); if (ul == NULL) continue; - nUsed = GetCount(Hash); - nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1); - Put(Hash, nnn, nUsed, ul, DeleteUserListEntry); + + Put(Hash, IKEY(ul->UID), ul, DeleteUserListEntry); + } + + serv_puts("LBIO 1"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 1) { + Done = 0; + while (!Done) { + len = StrBuf_ServGetln(Buf); + if ((len <0) || ((len == 3) && !strcmp(ChrPtr(Buf), "000"))) + { + Done = 1; + break; + } + } + UID = atoi(ChrPtr(Buf)); + if (GetHash(Hash, IKEY(UID), &vData) && vData != 0) + { + ul = (UserListEntry*)vData; + ul->HasBio = 1; + } } SubTP.Filter.ContextType = CTX_USERLIST; SortIt = RetrieveSort(&SubTP, HKEY("USER"), HKEY("user:uid"), 0); @@ -290,89 +331,108 @@ HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP) SortByPayload(Hash, SortIt); else SortByPayload(Hash, CompareUID); - return Hash; } FreeStrBuf(&Buf); - return NULL; + return Hash; } void tmplput_USERLIST_UserName(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendTemplate(Target, TP, ul->UserName, 0); } void tmplput_USERLIST_Password(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendTemplate(Target, TP, ul->Passvoid, 0); } +void tmplput_USERLIST_PrimaryEmail(StrBuf *Target, WCTemplputParams *TP) +{ + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); + StrBufAppendTemplate(Target, TP, ul->PrimaryEmail, 0); +} + +void tmplput_USERLIST_OtherEmails(StrBuf *Target, WCTemplputParams *TP) +{ + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); + StrBufAppendTemplate(Target, TP, ul->OtherEmails, 0); +} + void tmplput_USERLIST_AccessLevelNo(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->AccessLevel, 0); } void tmplput_USERLIST_AccessLevelStr(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendBufPlain(Target, _(axdefs[ul->AccessLevel]), -1, 0); } void tmplput_USERLIST_UID(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->UID, 0); } + void tmplput_USERLIST_LastLogonNo(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target,"%ld", ul->LastLogonT, 0); } + + void tmplput_USERLIST_LastLogonStr(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrEscAppend(Target, NULL, asctime(localtime(&ul->LastLogonT)), 0, 0); } + void tmplput_USERLIST_nLogons(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->nLogons, 0); } + void tmplput_USERLIST_nPosts(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->nPosts, 0); } + void tmplput_USERLIST_Flags(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->Flags, 0); } + void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target, "%d", ul->DaysTillPurge, 0); } + int ConditionalUser(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); if (havebstr("usernum")) { return ibstr("usernum") == ul->UID; } @@ -383,29 +443,92 @@ int ConditionalUser(StrBuf *Target, WCTemplputParams *TP) return 0; } + int ConditionalFlagINetEmail(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); return (ul->Flags & US_INTERNET) != 0; } + int ConditionalUserAccess(StrBuf *Target, WCTemplputParams *TP) { - UserListEntry *ul = (UserListEntry*) CTX; + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); + + if (ul == NULL) + return 0; + + return GetTemplateTokenNumber(Target, + TP, + 3, + AxNewU) + == + ul->AccessLevel; +} - if (TP->Tokens->Params[3]->Type == TYPE_LONG) - return (TP->Tokens->Params[3]->lvalue == ul->AccessLevel); - else + +int ConditionalHaveBIO(StrBuf *Target, WCTemplputParams *TP) +{ + UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); + + if (ul == NULL) return 0; + return ul->HasBio; +} + + +int ConditionalSuppressEmailFields(StrBuf *Target, WCTemplputParams *TP) +{ + return 0; // FIXME this makes all email fields display } + +void tmplput_USER_BIO(StrBuf *Target, WCTemplputParams *TP) +{ + int Done = 0; + StrBuf *Buf; + const char *who; + long len; + + GetTemplateTokenString(Target, TP, 0, &who, &len); + if (len == 0) { + who = ChrPtr(WC->wc_fullname); + } + + Buf = NewStrBuf(); + serv_printf("RBIO %s", who); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 1) { + StrBuf *BioBuf = NewStrBufPlain(NULL, SIZ); + while (!Done && StrBuf_ServGetln(Buf)>=0) { + if ( (StrLength(Buf)==3) && + !strcmp(ChrPtr(Buf), "000")) + Done = 1; + else { + StrBufAppendBuf(BioBuf, Buf, 0); + StrBufAppendBufPlain(BioBuf, HKEY("\n"), 0); + } + } + StrBufAppendTemplate(Target, TP, BioBuf, 1); + FreeStrBuf(&BioBuf); + } + FreeStrBuf(&Buf); +} + + +int Conditional_USER_HAS_PIC(StrBuf *Target, WCTemplputParams *TP) +{ + // ajc 2016apr10 this needs to be re-evaluated with the new protocol + return(0); +} + + /* * Locate the message number of a user's vCard in the current room * Returns the message id of his vcard */ long locate_user_vcard_in_this_room(message_summary **VCMsg, wc_mime_attachment **VCAtt) { - wcsession *WCC = WC; HashPos *at; HashPos *att; const char *HashKey; @@ -413,7 +536,6 @@ long locate_user_vcard_in_this_room(message_summary **VCMsg, wc_mime_attachment void *vMsg; message_summary *Msg; wc_mime_attachment *Att; - int Done; StrBuf *Buf; long vcard_msgnum = (-1L); int already_tried_creating_one = 0; @@ -428,11 +550,10 @@ TRYAGAIN: Stat.maxload = 10000; Stat.lowest_found = (-1); Stat.highest_found = (-1); - Done = 0; /* Search for the user's vCard */ - if (load_msg_ptrs("MSGS ALL||||1", &Stat) > 0) { - at = GetNewHashPos(WCC->summ, 0); - while (GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) { + if (load_msg_ptrs("MSGS ALL||||1", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0) > 0) { + at = GetNewHashPos(WC->summ, 0); + while (GetNextHashPos(WC->summ, at, &HKLen, &HashKey, &vMsg)) { Msg = (message_summary*) vMsg; Msg->MsgBody = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment)); memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment)); @@ -442,7 +563,8 @@ TRYAGAIN: if (Msg->AllAttach != NULL) { att = GetNewHashPos(Msg->AllAttach, 0); - while (GetNextHashPos(Msg->AllAttach, att, &HKLen, &HashKey, &vMsg)) { + while (GetNextHashPos(Msg->AllAttach, att, &HKLen, &HashKey, &vMsg) && + (vcard_msgnum == -1)) { Att = (wc_mime_attachment*) vMsg; if ( (strcasecmp(ChrPtr(Att->ContentType), "text/x-vcard") == 0) @@ -450,9 +572,9 @@ TRYAGAIN: ) { *VCAtt = Att; *VCMsg = Msg; + vcard_msgnum = Msg->msgnum; if (Att->Data == NULL) { MimeLoadData(Att); - vcard_msgnum = Msg->msgnum; } } } @@ -466,16 +588,19 @@ TRYAGAIN: /* If there's no vcard, create one */ if ((*VCMsg == NULL) && (already_tried_creating_one == 0)) { + FlushStrBuf(Buf); already_tried_creating_one = 1; serv_puts("ENT0 1|||4"); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 4) { + if (GetServerStatus(Buf, NULL) == 4) { serv_puts("Content-type: text/x-vcard"); serv_puts(""); serv_puts("begin:vcard"); serv_puts("end:vcard"); serv_puts("000"); } + else + syslog(LOG_WARNING, "Error while creating user vcard: %s\n", ChrPtr(Buf)); goto TRYAGAIN; } FreeStrBuf(&Buf); @@ -491,7 +616,6 @@ TRYAGAIN: * usernum the citadel-uid of the user */ void display_edit_address_book_entry(const char *username, long usernum) { - wcsession *WCC = WC; message_summary *VCMsg = NULL; wc_mime_attachment *VCAtt = NULL; StrBuf *roomname; @@ -510,9 +634,7 @@ void display_edit_address_book_entry(const char *username, long usernum) { GetServerStatus(Buf, NULL); serv_printf("GOTO %s||1", ChrPtr(roomname)); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) { - FlushStrBuf(WCC->ImportantMsg); - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); + if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) { select_user_to_edit(username); FreeStrBuf(&Buf); FreeStrBuf(&roomname); @@ -524,9 +646,7 @@ void display_edit_address_book_entry(const char *username, long usernum) { locate_user_vcard_in_this_room(&VCMsg, &VCAtt); if (VCMsg == NULL) { - StrBufPlain(WCC->ImportantMsg, - _("An error occurred while trying to create or edit this address book entry."), - 0); + AppendImportantMessage(_("An error occurred while trying to create or edit this address book entry."), -1); select_user_to_edit(username); FreeStrBuf(&roomname); return; @@ -540,13 +660,29 @@ void display_edit_address_book_entry(const char *username, long usernum) { FreeStrBuf(&roomname); } +/* + * purge a user + * username the name of the user to remove + */ +void delete_user(char *username) { + StrBuf *Buf; + + Buf = NewStrBuf(); + serv_printf("ASUP %s|0|0|0|0|0|", username); + StrBuf_ServGetln(Buf); + GetServerStatusMsg(Buf, NULL, 1, 2); + + select_user_to_edit( bstr("username")); + FreeStrBuf(&Buf); +} + void display_edituser(const char *supplied_username, int is_new) { const char *Pos; - wcsession *WCC = WC; UserListEntry* UL; StrBuf *Buf; char username[256]; + int i = 0; if (supplied_username != NULL) { safestrncpy(username, supplied_username, sizeof username); @@ -558,9 +694,7 @@ void display_edituser(const char *supplied_username, int is_new) { Buf = NewStrBuf(); serv_printf("AGUP %s", username); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) { - FlushStrBuf(WCC->ImportantMsg); - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); + if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) { select_user_to_edit(username); FreeStrBuf(&Buf); return; @@ -575,12 +709,30 @@ void display_edituser(const char *supplied_username, int is_new) { delete_user(username); } else if (UL != NULL) { + + serv_printf("AGEA %s", username); + StrBuf_ServGetln(Buf); + if (GetServerStatusMsg(Buf, NULL, 1, 2) == 1) { + while(StrBuf_ServGetln(Buf) , strcmp(ChrPtr(Buf), "000")) { + if (i == 0) { + StrBufAppendPrintf(UL->PrimaryEmail, "%s", ChrPtr(Buf)); + } + if (i > 1) { + StrBufAppendPrintf(UL->OtherEmails, ","); + } + if (i > 0) { + StrBufAppendPrintf(UL->OtherEmails, "%s", ChrPtr(Buf)); + } + ++i; + } + } + WCTemplputParams SubTP; memset(&SubTP, 0, sizeof(WCTemplputParams)); SubTP.Filter.ContextType = CTX_USERLIST; SubTP.Context = UL; output_headers(1, 0, 0, 0, 1, 0); - DoTemplate(HKEY("userlist_detailview"), NULL, &SubTP); + DoTemplate(HKEY("aide_edituser_detailview"), NULL, &SubTP); end_burst(); } DeleteUserListEntry(UL); @@ -593,7 +745,6 @@ void display_edituser(const char *supplied_username, int is_new) { * do the backend operation of the user edit on the server */ void edituser(void) { - wcsession *WCC = WC; int is_new = 0; unsigned int flags = 0; const char *username; @@ -602,7 +753,7 @@ void edituser(void) { username = bstr("username"); if (!havebstr("ok_button")) { - StrBufPlain(WCC->ImportantMsg, _("Changes were not saved."), -1); + AppendImportantMessage(_("Changes were not saved."), -1); } else { StrBuf *Buf = NewStrBuf(); @@ -618,15 +769,12 @@ void edituser(void) { if ((havebstr("newname")) && (strcasecmp(bstr("username"), bstr("newname")))) { serv_printf("RENU %s|%s", bstr("username"), bstr("newname")); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 2) { - FlushStrBuf(WCC->ImportantMsg); - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); - } - else { + if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) { username = bstr("newname"); } } + /* Send the new account parameters */ serv_printf("ASUP %s|%s|%d|%s|%s|%s|%s|%s|%s|", username, bstr("password"), @@ -639,9 +787,37 @@ void edituser(void) { bstr("purgedays") ); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 2) { - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); + GetServerStatusMsg(Buf, NULL, 1, 2); + + /* Send the new email addresses. First make up a delimited list... */ + char all_the_emails[512]; + snprintf(all_the_emails, sizeof all_the_emails, "%s,%s", bstr("primaryemail"), bstr("otheremails")); + + /* Replace any commas, semicolons, or spaces with newlines */ + char *pos; + for (pos=all_the_emails; *pos!=0; ++pos) { + if ((*pos == ',') || (*pos == ';') || (*pos == ' ')) *pos = '\n' ; + } + + /* Remove any naughty inappropriate whitespace */ + string_trim(all_the_emails); + while (pos = strstr(all_the_emails, "\n,"), (pos != NULL)) { + strcpy(pos, pos+1); + } + while (pos = strstr(all_the_emails, ",\n"), (pos != NULL)) { + strcpy(pos+1, pos+2); + } + while (pos = strstr(all_the_emails, "\n\n"), (pos != NULL)) { + strcpy(pos+1, pos+2); + } + + /* Now send it to the server. */ + serv_printf("ASEA %s", username); + StrBuf_ServGetln(Buf); + if (GetServerStatusMsg(Buf, NULL, 1, 2) == 4) { + serv_printf("%s\n000", all_the_emails); } + FreeStrBuf(&Buf); } @@ -657,32 +833,12 @@ void edituser(void) { } } -/* - * burge a user - * username the name of the user to remove - */ -void delete_user(char *username) { - wcsession *WCC = WC; - StrBuf *Buf; - - Buf = NewStrBuf(); - serv_printf("ASUP %s|0|0|0|0|0|", username); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); - - select_user_to_edit( bstr("username")); - FreeStrBuf(&Buf); -} - - /* - * create a new user - * take the web environment username and create it on the citadel server + * create a new user + * (take the web environment username and create it on the citadel server) */ void create_user(void) { - wcsession *WCC = WC; long FullState; StrBuf *Buf; const char *username; @@ -692,25 +848,47 @@ void create_user(void) { serv_printf("CREU %s", username); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, &FullState) == 2) { - sprintf(WC->ImportantMessage, _("A new user has been created.")); + AppendImportantMessage(_("A new user has been created."), -1); display_edituser(username, 1); } else if (FullState == 570) { - StrBufPlain(WCC->ImportantMsg, - _("You are attempting to create a new user from within Citadel " - "while running in host based authentication mode. In this mode, " - "you must create new users on the host system, not within Citadel."), - 0); + AppendImportantMessage(_("You are attempting to create a new user from within Citadel " + "while running in host based authentication mode. In this mode, " + "you must create new users on the host system, not within Citadel."), + -1); select_user_to_edit(NULL); } else { - StrBufAppendBuf(WCC->ImportantMsg, Buf, 4); + AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4); select_user_to_edit(NULL); } FreeStrBuf(&Buf); } +void display_userpic(void) { + off_t bytes; + StrBuf *Buf = NewStrBuf(); + const char *username = bstr("user"); + serv_printf("DLUI %s", username); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 6) { + StrBufCutLeft(Buf, 4); + bytes = StrBufExtract_long(Buf, 0, '|'); + StrBuf *content_type = NewStrBuf(); + StrBufExtract_token(content_type, Buf, 3, '|'); + WC->WBuf = NewStrBuf(); + StrBuf_ServGetBLOBBuffered(WC->WBuf, bytes); + http_transmit_thing(ChrPtr(content_type), 0); + FreeStrBuf(&content_type); + } + else { + output_error_pic("", ""); + } + FreeStrBuf(&Buf); +} + + void _select_user_to_edit(void) { select_user_to_edit(NULL); } @@ -725,10 +903,12 @@ void InitModule_USEREDIT (void) { + RegisterCTX(CTX_USERLIST); WebcitAddUrlHandler(HKEY("select_user_to_edit"), "", 0, _select_user_to_edit, 0); WebcitAddUrlHandler(HKEY("display_edituser"), "", 0, _display_edituser, 0); WebcitAddUrlHandler(HKEY("edituser"), "", 0, edituser, 0); WebcitAddUrlHandler(HKEY("create_user"), "", 0, create_user, 0); + WebcitAddUrlHandler(HKEY("userpic"), "", 0, display_userpic, 0); RegisterNamespace("USERLIST:USERNAME", 0, 1, tmplput_USERLIST_UserName, NULL, CTX_USERLIST); RegisterNamespace("USERLIST:PASSWD", 0, 1, tmplput_USERLIST_Password, NULL, CTX_USERLIST); @@ -739,17 +919,20 @@ InitModule_USEREDIT RegisterNamespace("USERLIST:LASTLOGON:NO", 0, 0, tmplput_USERLIST_LastLogonNo, NULL, CTX_USERLIST); RegisterNamespace("USERLIST:NLOGONS", 0, 0, tmplput_USERLIST_nLogons, NULL, CTX_USERLIST); RegisterNamespace("USERLIST:NPOSTS", 0, 0, tmplput_USERLIST_nPosts, NULL, CTX_USERLIST); - + RegisterNamespace("USERLIST:PRIMARYEMAIL", 0, 1, tmplput_USERLIST_PrimaryEmail, NULL, CTX_USERLIST); + RegisterNamespace("USERLIST:OTHEREMAILS", 0, 1, tmplput_USERLIST_OtherEmails, NULL, CTX_USERLIST); RegisterNamespace("USERLIST:FLAGS", 0, 0, tmplput_USERLIST_Flags, NULL, CTX_USERLIST); RegisterNamespace("USERLIST:DAYSTILLPURGE", 0, 0, tmplput_USERLIST_DaysTillPurge, NULL, CTX_USERLIST); - RegisterConditional(HKEY("COND:USERNAME"), 0, ConditionalUser, CTX_USERLIST); - RegisterConditional(HKEY("COND:USERACCESS"), 0, ConditionalUserAccess, CTX_USERLIST); - RegisterConditional(HKEY("COND:USERLIST:FLAG:USE_INTERNET"), 0, ConditionalFlagINetEmail, CTX_USERLIST); + RegisterNamespace("USER:BIO", 1, 2, tmplput_USER_BIO, NULL, CTX_NONE); - RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE); - + RegisterConditional("COND:USERNAME", 0, ConditionalUser, CTX_USERLIST); + RegisterConditional("COND:USERACCESS", 0, ConditionalUserAccess, CTX_USERLIST); + RegisterConditional("COND:USERLIST:FLAG:USE_INTERNET", 0, ConditionalFlagINetEmail, CTX_USERLIST); + RegisterConditional("COND:USERLIST:HAVEBIO", 0, ConditionalHaveBIO, CTX_USERLIST); + RegisterConditional("COND:USER:PIC", 1, Conditional_USER_HAS_PIC, CTX_NONE); + RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE); RegisterSortFunc(HKEY("user:name"), HKEY("userlist"), @@ -792,4 +975,12 @@ InitModule_USEREDIT GroupchangenPosts, CTX_USERLIST); + REGISTERTokenParamDefine(AxDeleted); + REGISTERTokenParamDefine(AxNewU); + REGISTERTokenParamDefine(AxProbU); + REGISTERTokenParamDefine(AxLocU); + REGISTERTokenParamDefine(AxNetU); + REGISTERTokenParamDefine(AxPrefU); + REGISTERTokenParamDefine(AxAideU); } +