X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fuseredit.c;h=e1fb110ff4e2b3ca774c71339e01cf73a85da005;hp=a6041d7e6c58bd93266835578f56015023e5500e;hb=48a75931f41b5d4d04c6d39d9677bd9e4b611c00;hpb=2f8ba8d58350ea377595b951fb7d20a5618ea0ef diff --git a/webcit/useredit.c b/webcit/useredit.c index a6041d7e6..e1fb110ff 100644 --- a/webcit/useredit.c +++ b/webcit/useredit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996-2012 by the citadel.org team + * Copyright (c) 1996-2020 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. @@ -40,6 +40,10 @@ typedef struct _UserListEntry { unsigned int Flags; int DaysTillPurge; int HasBio; + + StrBuf *PrimaryEmail; + StrBuf *OtherEmails; + } UserListEntry; @@ -53,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, '|'); @@ -72,6 +78,8 @@ void DeleteUserListEntry(void *vUserList) if (!ul) return; FreeStrBuf(&ul->UserName); FreeStrBuf(&ul->Passvoid); + FreeStrBuf(&ul->PrimaryEmail); + FreeStrBuf(&ul->OtherEmails); free(ul); } @@ -86,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, '|'); @@ -279,7 +289,7 @@ HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP) StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, NULL) == 1) { Hash = NewHash(1, Flathash); - + Done = 0; while (!Done) { len = StrBuf_ServGetln(Buf); if ((len <0) || @@ -298,16 +308,15 @@ HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP) serv_puts("LBIO 1"); StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 1) + 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; + 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) @@ -340,6 +349,18 @@ void tmplput_USERLIST_Password(StrBuf *Target, WCTemplputParams *TP) 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(CTX_USERLIST); @@ -361,18 +382,22 @@ void tmplput_USERLIST_UID(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%d", ul->UID, 0); } + void tmplput_USERLIST_LastLogonNo(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); StrBufAppendPrintf(Target,"%ld", ul->LastLogonT, 0); } + + void tmplput_USERLIST_LastLogonStr(StrBuf *Target, WCTemplputParams *TP) { 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(CTX_USERLIST); @@ -380,6 +405,7 @@ void tmplput_USERLIST_nLogons(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%d", ul->nLogons, 0); } + void tmplput_USERLIST_nPosts(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -387,6 +413,7 @@ void tmplput_USERLIST_nPosts(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%d", ul->nPosts, 0); } + void tmplput_USERLIST_Flags(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -394,6 +421,7 @@ void tmplput_USERLIST_Flags(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%d", ul->Flags, 0); } + void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -401,6 +429,7 @@ void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%d", ul->DaysTillPurge, 0); } + int ConditionalUser(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -414,12 +443,14 @@ int ConditionalUser(StrBuf *Target, WCTemplputParams *TP) return 0; } + int ConditionalFlagINetEmail(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); return (ul->Flags & US_INTERNET) != 0; } + int ConditionalUserAccess(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -434,6 +465,8 @@ int ConditionalUserAccess(StrBuf *Target, WCTemplputParams *TP) == ul->AccessLevel; } + + int ConditionalHaveBIO(StrBuf *Target, WCTemplputParams *TP) { UserListEntry *ul = (UserListEntry*) CTX(CTX_USERLIST); @@ -443,6 +476,13 @@ int ConditionalHaveBIO(StrBuf *Target, WCTemplputParams *TP) 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; @@ -451,6 +491,9 @@ void tmplput_USER_BIO(StrBuf *Target, WCTemplputParams *TP) long len; GetTemplateTokenString(Target, TP, 0, &who, &len); + if (len == 0) { + who = ChrPtr(WC->wc_fullname); + } Buf = NewStrBuf(); serv_printf("RBIO %s", who); @@ -472,29 +515,11 @@ void tmplput_USER_BIO(StrBuf *Target, WCTemplputParams *TP) FreeStrBuf(&Buf); } + int Conditional_USER_HAS_PIC(StrBuf *Target, WCTemplputParams *TP) { - StrBuf *Buf; - const char *who; - long len; - int r = 0; - - GetTemplateTokenString(Target, TP, 2, &who, &len); - - Buf = NewStrBuf(); - serv_printf("OIMG _userpic_|%s", who); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) { - r = 1; - } - else { - r = 0; - } - serv_puts("CLOS"); - StrBuf_ServGetln(Buf); - GetServerStatus(Buf, NULL); - FreeStrBuf(&Buf); - return(r); + // ajc 2016apr10 this needs to be re-evaluated with the new protocol + return(0); } @@ -527,7 +552,7 @@ TRYAGAIN: Stat.lowest_found = (-1); Stat.highest_found = (-1); /* Search for the user's vCard */ - if (load_msg_ptrs("MSGS ALL||||1", NULL, &Stat, NULL) > 0) { + if (load_msg_ptrs("MSGS ALL||||1", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0) > 0) { at = GetNewHashPos(WCC->summ, 0); while (GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) { Msg = (message_summary*) vMsg; @@ -576,7 +601,7 @@ TRYAGAIN: serv_puts("000"); } else - syslog(1, "Error while creating user vcard: %s\n", ChrPtr(Buf)); + syslog(LOG_WARNING, "Error while creating user vcard: %s\n", ChrPtr(Buf)); goto TRYAGAIN; } FreeStrBuf(&Buf); @@ -637,7 +662,7 @@ void display_edit_address_book_entry(const char *username, long usernum) { } /* - * burge a user + * purge a user * username the name of the user to remove */ void delete_user(char *username) { @@ -658,6 +683,7 @@ void display_edituser(const char *supplied_username, int is_new) { UserListEntry* UL; StrBuf *Buf; char username[256]; + int i = 0; if (supplied_username != NULL) { safestrncpy(username, supplied_username, sizeof username); @@ -684,6 +710,24 @@ 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; @@ -731,6 +775,7 @@ void edituser(void) { } } + /* Send the new account parameters */ serv_printf("ASUP %s|%s|%d|%s|%s|%s|%s|%s|%s|", username, bstr("password"), @@ -744,6 +789,36 @@ void edituser(void) { ); StrBuf_ServGetln(Buf); 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 */ + striplt(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); } @@ -760,10 +835,9 @@ void edituser(void) { } - /* - * 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) { long FullState; @@ -793,6 +867,29 @@ void create_user(void) { } +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); } @@ -802,6 +899,7 @@ void _display_edituser(void) { display_edituser(NULL, 0); } + void InitModule_USEREDIT (void) @@ -811,6 +909,7 @@ InitModule_USEREDIT 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); @@ -821,22 +920,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); RegisterNamespace("USER:BIO", 1, 2, tmplput_USER_BIO, NULL, CTX_NONE); - 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); + 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"),