X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwho.c;h=11c68d86c99602c3c8dddf456e01d0e55e3a3925;hb=HEAD;hp=5b011690d1d73f80f078322b9b0758574a180009;hpb=5b9736dec3d511d35fb4a86ff913afcf9d7a811c;p=citadel.git diff --git a/webcit/who.c b/webcit/who.c index 5b011690d..dee492caf 100644 --- a/webcit/who.c +++ b/webcit/who.c @@ -1,18 +1,19 @@ -/* - * $Id$ - */ #include "webcit.h" +CtxType CTX_WHO = CTX_NONE; + typedef struct UserStateStruct { StrBuf *UserName; StrBuf *Room; StrBuf *Host; + StrBuf *UserAgent; StrBuf *RealRoom; StrBuf *RealHost; long LastActive; int Session; int Idle; + int IdleSince; int SessionCount; } UserStateStruct; @@ -24,6 +25,7 @@ void DestroyUserStruct(void *vUser) FreeStrBuf(&User->Host); FreeStrBuf(&User->RealRoom); FreeStrBuf(&User->RealHost); + FreeStrBuf(&User->UserAgent); free(User); } @@ -39,465 +41,266 @@ int CompareUserStruct(const void *VUser1, const void *VUser2) } -int GetWholistSection(HashList *List, time_t now) +int GetWholistSection(HashList *List, time_t now, StrBuf *Buf, const char *FilterName, long FNLen) { - StrBuf *Buf, *XBuf; - struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ UserStateStruct *User, *OldUser; void *VOldUser; size_t BufLen; - char buf[SIZ]; + const char *Pos; serv_puts("RWHO"); - serv_getln(buf, sizeof buf); - if (buf[0] == '1') { - Buf = NewStrBuf(); - XBuf = NewStrBuf(); - while (BufLen = StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) { + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 1) { + while (BufLen = StrBuf_ServGetln(Buf), + ((BufLen >= 0) && + ((BufLen != 3) || strcmp(ChrPtr(Buf), "000")))) + { if (BufLen <= 0) continue; + Pos = NULL; User = (UserStateStruct*) malloc(sizeof(UserStateStruct)); - User->Session = StrBufExtract_int(Buf, 0, '|'); + User->Session = StrBufExtractNext_int(Buf, &Pos, '|'); + + User->UserName = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->UserName, Buf, &Pos, '|'); + + User->Room = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->Room, Buf, &Pos, '|'); - StrBufExtract_token(XBuf, Buf, 1, '|'); - User->UserName = NewStrBufDup(XBuf); + User->Host = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->Host, Buf, &Pos, '|'); - StrBufExtract_token(XBuf, Buf, 2, '|'); - User->Room = NewStrBufDup(XBuf); + User->UserAgent = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->UserAgent, Buf, &Pos, '|'); - StrBufExtract_token(XBuf, Buf, 3, '|'); - User->Host = NewStrBufDup(XBuf); + User->LastActive = StrBufExtractNext_long(Buf, &Pos, '|'); + StrBufSkip_NTokenS(Buf, &Pos, '|', 3); - StrBufExtract_token(XBuf, Buf, 9, '|'); - User->RealRoom = NewStrBufDup(XBuf); + User->RealRoom = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->RealRoom, Buf, &Pos, '|'); - StrBufExtract_token(XBuf, Buf, 10, '|'); - User->RealHost = NewStrBufDup(XBuf); + User->RealHost = NewStrBufPlain(NULL, BufLen); + StrBufExtract_NextToken(User->RealHost, Buf, &Pos, '|'); - User->LastActive = StrBufExtract_long(Buf, 5, '|'); User->Idle = (now - User->LastActive) > 900L; + User->IdleSince = (now - User->LastActive) / 60; User->SessionCount = 1; - if (GetHash(List, - ChrPtr(User->UserName), - StrLength(User->UserName), - &VOldUser)) { - OldUser = VOldUser; - OldUser->SessionCount++; - if (!User->Idle) { - if (User->Session == WCC->ctdl_pid) - OldUser->Session = User->Session; - - OldUser->Idle = User->Idle; - OldUser->LastActive = User->LastActive; + if (FilterName == NULL) { + if (GetHash(List, + SKEY(User->UserName), + &VOldUser)) { + OldUser = VOldUser; + OldUser->SessionCount++; + if (!User->Idle) { + if (User->Session == WC->ctdl_pid) + OldUser->Session = User->Session; + + OldUser->Idle = User->Idle; + OldUser->LastActive = User->LastActive; + } + DestroyUserStruct(User); + } + else + Put(List, + SKEY(User->UserName), + User, DestroyUserStruct); + } + else { + if (strcmp(FilterName, ChrPtr(User->UserName)) == 0) + { + Put(List, + SKEY(User->UserName), + User, DestroyUserStruct); + } + else + { + DestroyUserStruct(User); } - DestroyUserStruct(User); } - else - Put(List, - ChrPtr(User->UserName), - StrLength(User->UserName), - User, DestroyUserStruct); } - SortByPayload(List, CompareUserStruct); - - FreeStrBuf(&XBuf); - FreeStrBuf(&Buf); + if (FilterName == NULL) + SortByPayload(List, CompareUserStruct); return 1; } - else + else { return 0; + } } /* - * Display inner div of Wholist - * / -void who_inner_div(void) { - UserStateStruct *User; - void *VUser; + * end session + */ +void terminate_session(void) +{ char buf[SIZ]; - struct wcsession *WCC = WC; - HashList *List; - HashPos *it; - const char *UserName; - long len; - time_t now; - int bg = 0; - wprintf("" - "\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n", _("User name")); - wprintf("", _("Room")); - wprintf("\n\n", _("From host")); - serv_puts("TIME"); + serv_printf("TERM %s", bstr("which_session")); serv_getln(buf, sizeof buf); + url_do_template(); +} - if (buf[0] == '2') { - now = extract_long(&buf[4], 0); - } - else { - now = time(NULL); - } - List = NewHash(1, NULL); +void _terminate_session(void) { + slrp_highest(); + terminate_session(); +} + +HashList *GetWholistHash(StrBuf *Target, WCTemplputParams *TP) - if (GetWholistSection(List, now)) { - it = GetNewHashPos(); - while (GetNextHashPos(List, it, &len, &UserName, &VUser)) { - User = VUser; - bg = 1 - bg; - wprintf("", - (bg ? "even" : "odd") - ); +{ + const char *ch = NULL; + int HashUniq = 1; + long len; + StrBuf *FilterNameStr = NULL; + StrBuf *Buf; + HashList *List; + time_t now; + Buf = NewStrBuf(); - wprintf(""); - - / * (link to page this user) * / - wprintf(""); - - / * (idle flag) * / - wprintf("\n\n\t\n\t\n"); - } - DeleteHashPos(&it); + serv_puts("TIME"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 2) { + const char *pos = ChrPtr(Buf) + 4; + now = StrBufExtractNext_long(Buf, &pos, '|'); + } + else { + now = time(NULL); } - wprintf("
%s%s%s
"); - if ((WCC->is_aide) && - (User->Session != WCC->ctdl_pid)) { - wprintf(" Session); - wprintf("\" onClick=\"return ConfirmKill();\">%s", _("(kill)")); - } - if (User->Session == WCC->ctdl_pid) { - wprintf(" %s", _("(edit)")); - } - wprintf("UserName); - wprintf("\">" - " "); - wprintf(""); - if (User->Idle) { - wprintf(" " - "", - _("idle since"), - (now - User->LastActive) / 60, - _("Minutes") - ); - - } - else { - wprintf(" " - ""); - } - wprintf(""); - - / * username (link to user bio/photo page) * / - wprintf("UserName); - wprintf("\">"); - StrEscPuts(User->UserName); - if (User->SessionCount > 1) - wprintf(" [%d] ", User->SessionCount); - wprintf(""); - - / * room * / - wprintf(""); - StrEscPuts(User->Room); - if (StrLength(User->RealRoom) > 0) { - wprintf("
"); - StrEscPuts(User->RealRoom); - wprintf(""); - } - wprintf("
"); - - / * hostname * / - StrEscPuts(User->Host); - if (StrLength(User->RealHost) > 0) { - wprintf("
"); - StrEscPuts(User->RealHost); - wprintf(""); - } - wprintf("
"); - DeleteHash(&List); + if (HaveTemplateTokenString(NULL, TP, 2, &ch, &len)) + { + FilterNameStr = NewStrBuf(); + GetTemplateTokenString(FilterNameStr, TP, 2, &ch, &len); + HashUniq = 0; + } + + List = NewHash(HashUniq, NULL); + GetWholistSection(List, now, Buf, ch, len); + FreeStrBuf(&Buf); + FreeStrBuf(&FilterNameStr); + return List; } -*/ -#if 0 -/* - * Display a list of users currently logged in to the system - * / -void who(void) +void DeleteWholistHash(HashList **KillMe) { - char title[256]; - - output_headers(1, 1, 2, 0, 0, 0); - - wprintf("\n", _("Do you really want to kill this session?") - ); -#endif - - wprintf("
\n"); - wprintf("
"); - wprintf(""); - wprintf("

"); - snprintf(title, sizeof title, _("Users currently on %s"), serv_info.serv_humannode); - escputs(title); - wprintf("

"); - wprintf(""); - wprintf("
"); - - wprintf("
\n"); - wprintf("
"); - wprintf("
"); - snprintf(title, sizeof title, _("Users currently on %s"), serv_info.serv_humannode); - escputs(title); - wprintf("
"); - wprintf("
"); - wprintf("
"); - who_inner_div(); - wprintf("
"); - - wprintf("
"); - wprintf(_("Click on a name to read user info. Click on %s " - "to send an instant message to that user."), - "\"(p)\"" - ); - wprintf("
\n"); - - / * - * JavaScript to make the ajax refresh happen: - * See http://www.sergiopereira.com/articles/prototype.js.html for info on Ajax.PeriodicalUpdater - * It wants: 1. The div being updated - * 2. The URL of the update source - * 3. Other flags (such as the HTTP method and the refresh frequency) - * / - wprintf( - " \n" - ); - wDumpContent(1); + DeleteHash(KillMe); } -*/ -#endif -/* - * end session - */ -void terminate_session(void) +void tmplput_who_username(StrBuf *Target, WCTemplputParams *TP) { - char buf[SIZ]; - - serv_printf("TERM %s", bstr("which_session")); - serv_getln(buf, sizeof buf); - ///who(); - url_do_template(); + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->UserName, 0); } +void tmplput_who_UserAgent(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->UserAgent, 0); +} -/* - * Change your session info (fake roomname and hostname) - */ -void edit_me(void) +void tmplput_who_room(StrBuf *Target, WCTemplputParams *TP) { - char buf[SIZ]; + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->Room, 0); +} - if (havebstr("change_room_name_button")) { - serv_printf("RCHG %s", bstr("fake_roomname")); - serv_getln(buf, sizeof buf); - http_redirect("who"); - } else if (havebstr("change_host_name_button")) { - serv_printf("HCHG %s", bstr("fake_hostname")); - serv_getln(buf, sizeof buf); - http_redirect("who"); - } else if (havebstr("change_user_name_button")) { - serv_printf("UCHG %s", bstr("fake_username")); - serv_getln(buf, sizeof buf); - http_redirect("who"); - } else if (havebstr("cancel_button")) { - http_redirect("who"); - } else { - output_headers(1, 1, 0, 0, 0, 0); - - wprintf("
\n"); - wprintf("
"); - wprintf(""); - wprintf(_("Edit your session display")); - wprintf("
\n"); - wprintf("
\n
\n"); - - wprintf(_("This screen allows you to change the way your " - "session appears in the 'Who is online' listing. " - "To turn off any 'fake' name you've previously " - "set, simply click the appropriate 'change' button " - "without typing anything in the corresponding box. ")); - wprintf("
\n"); - - wprintf("
\n"); - wprintf("\n", WC->nonce); - - wprintf("\n"); - - wprintf("\n\n\n\n"); - - wprintf("\n\n\n"); - - if (WC->is_aide) { - wprintf("\n\n\n"); - } - wprintf("
"); - wprintf(_("Room name:")); - wprintf(""); - wprintf("\n"); - wprintf(""); - wprintf("", - _("Change room name")); - wprintf("
"); - wprintf(_("Host name:")); - wprintf(""); - wprintf("\n"); - wprintf(""); - wprintf("", - _("Change host name")); - wprintf("
"); - wprintf(_("User name:")); - wprintf(""); - wprintf("\n"); - wprintf(""); - wprintf("", - _("Change user name")); - wprintf("
"); - wprintf("", - _("Cancel")); - wprintf("
\n"); - wprintf("
\n"); - wDumpContent(1); - } +void tmplput_who_host(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->Host, 0); } -/* - * Wholist section - * / -void wholist_section(void) { - UserStateStruct *User; - void *VUser; - HashList *List; - HashPos *it; - const char *UserName; - long len; - char buf[SIZ]; - time_t now; +void tmplput_who_realroom(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->RealRoom, 0); +} +int conditional_who_realroom(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + return StrLength(User->RealRoom) > 0; +} - serv_puts("TIME"); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - now = extract_long(&buf[4], 0); - } - else { - now = time(NULL); - } +void tmplput_who_realhost(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendTemplate(Target, TP, User->RealHost, 0); +} +int conditional_who_realhost(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + return StrLength(User->RealHost) > 0; +} - List = NewHash(1, NULL); - - if (GetWholistSection(List, now)) { - SortByPayload(List, CompareUserStruct); - it = GetNewHashPos(); - while (GetNextHashPos(List, it, &len, &UserName, &VUser)) { - User = VUser; - if (strcmp(ChrPtr(User->UserName), NLI)) { - wprintf("
  • Idle) { - wprintf("inactiveuser"); - } - else { - wprintf("activeuser"); - } - wprintf("\">UserName); - wprintf("\">"); - StrEscPuts(User->UserName); - wprintf("
  • "); - } - } - DeleteHashPos(&it); - } - DeleteHash(&List); +void tmplput_who_lastactive(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendPrintf(Target, "%d", User->LastActive); } -*/ -void _terminate_session(void) { - slrp_highest(); - terminate_session(); +void tmplput_who_idlesince(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendPrintf(Target, "%d", User->IdleSince); } -HashList *GetWholistHash(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType) +void tmplput_who_session(StrBuf *Target, WCTemplputParams *TP) { - HashList *List; - char buf[SIZ]; - time_t now; + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendPrintf(Target, "%d", User->Session); +} - serv_puts("TIME"); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - now = extract_long(&buf[4], 0); - } - else { - now = time(NULL); - } +int conditional_who_idle(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + return User->Idle; +} - List = NewHash(1, NULL); - GetWholistSection(List, now); - return List; +int conditional_who_nsessions(StrBuf *Target, WCTemplputParams *TP) +{ + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + return User->SessionCount; } -void WholistSubst(StrBuf *TemplBuffer, void *vContext, WCTemplateToken *Token) +void tmplput_who_nsessions(StrBuf *Target, WCTemplputParams *TP) { - UserStateStruct *User = (UserStateStruct*) vContext; - - SVPutBuf("WHO:NAME", User->UserName, 1); - SVPutBuf("WHO:ROOM", User->Room, 1); - SVPutBuf("WHO:HOST", User->Host, 1); - SVPutBuf("WHO:REALROOM", User->RealRoom, 1); - SVPutBuf("WHO:REALHOST", User->RealHost, 1); - svputlong("WHO:LASTACTIVE", User->LastActive); - ///svputlong("WHO:IDLESINCE",(now - User->LastActive) / 60);//// todo - svputlong("WHO:SESSION", User->Session); - svputlong("WHO:IDLE", User->Idle); - svputlong("WHO:NSESSIONS", User->SessionCount); - svputlong("WHO:ISME", (User->Session == WC->ctdl_pid)); + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + StrBufAppendPrintf(Target, "%d", User->SessionCount); } -void DeleteWholistHash(HashList **KillMe) +int conditional_who_isme(StrBuf *Target, WCTemplputParams *TP) { - DeleteHash(KillMe); + UserStateStruct *User = (UserStateStruct*) CTX(CTX_WHO); + return (User->Session == WC->ctdl_pid); } void InitModule_WHO (void) { -/// WebcitAddUrlHandler(HKEY("who"), who, 0); -// WebcitAddUrlHandler(HKEY("who_inner_html"), who_inner_div, AJAX); -// WebcitAddUrlHandler(HKEY("wholist_section"), wholist_section, AJAX); - WebcitAddUrlHandler(HKEY("terminate_session"), _terminate_session, 0); - WebcitAddUrlHandler(HKEY("edit_me"), edit_me, 0); - - RegisterIterator("WHOLIST", 0, NULL, GetWholistHash, WholistSubst, DeleteWholistHash, CTX_WHO); + RegisterCTX(CTX_WHO); + + WebcitAddUrlHandler(HKEY("terminate_session"), "", 0, _terminate_session, 0); + + RegisterIterator("WHOLIST", 1, NULL, GetWholistHash, NULL, DeleteWholistHash, CTX_WHO, CTX_NONE, IT_NOFLAG); + + RegisterNamespace("WHO:NAME", 0, 1, tmplput_who_username, NULL, CTX_WHO); + RegisterNamespace("WHO:USERAGENT", 0, 1, tmplput_who_UserAgent, NULL, CTX_WHO); + RegisterNamespace("WHO:ROOM", 0, 1, tmplput_who_room, NULL, CTX_WHO); + RegisterNamespace("WHO:HOST", 0, 1, tmplput_who_host, NULL, CTX_WHO); + RegisterNamespace("WHO:REALROOM", 0, 1, tmplput_who_realroom, NULL, CTX_WHO); + RegisterNamespace("WHO:REALHOST", 0, 1, tmplput_who_realhost, NULL, CTX_WHO); + RegisterNamespace("WHO:LASTACTIVE", 0, 1, tmplput_who_lastactive, NULL, CTX_WHO); + RegisterNamespace("WHO:IDLESINCE", 0, 1, tmplput_who_idlesince, NULL, CTX_WHO); + RegisterNamespace("WHO:SESSION", 0, 1, tmplput_who_session, NULL, CTX_WHO); + RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, NULL, CTX_WHO); + RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, NULL, CTX_WHO); + + RegisterConditional("WHO:IDLE", 1, conditional_who_idle, CTX_WHO); + RegisterConditional("WHO:NSESSIONS", 1, conditional_who_nsessions, CTX_WHO); + RegisterConditional("WHO:ISME", 1, conditional_who_isme, CTX_WHO); + RegisterConditional("WHO:REALROOM", 1, conditional_who_realroom, CTX_WHO); + RegisterConditional("WHO:REALHOST", 1, conditional_who_realhost, CTX_WHO); }