From: Art Cancro Date: Mon, 8 Jan 2024 15:19:58 +0000 (-0500) Subject: START_CHAT_MODE is renamed to SEND_THEN_RECV X-Git-Tag: v997~22 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=78fa9b2cf0e33f7a48a60cfe5745eeca496d5992 START_CHAT_MODE is renamed to SEND_THEN_RECV This protocol mode began almost 30 years ago when we handled real time chat by holding a session open and moving data back and forth until told to stop. We don't do that anymore, but there are several places where a command requires sending long data in both directions. SEND_THEN_RECV is a better name for this. --- diff --git a/citadel/server/ipcdef.h b/citadel/server/ipcdef.h index 6f6e9e1fa..45043e661 100644 --- a/citadel/server/ipcdef.h +++ b/citadel/server/ipcdef.h @@ -5,7 +5,7 @@ #define ERROR 500 #define BINARY_FOLLOWS 600 #define SEND_BINARY 700 -#define START_CHAT_MODE 800 +#define SEND_THEN_RECV 800 #define INTERNAL_ERROR 10 #define TOO_BIG 11 diff --git a/citadel/server/modules/calendar/serv_calendar.c b/citadel/server/modules/calendar/serv_calendar.c index 5e169c1b6..6b05678a0 100644 --- a/citadel/server/modules/calendar/serv_calendar.c +++ b/citadel/server/modules/calendar/serv_calendar.c @@ -1711,74 +1711,6 @@ void ical_putics(void) { } -// All Citadel calendar commands from the client come through here. -void cmd_ical(char *argbuf) { - char subcmd[64]; - long msgnum; - char partnum[256]; - char action[256]; - char who[256]; - - extract_token(subcmd, argbuf, 0, '|', sizeof subcmd); - - // Allow "test" and "freebusy" subcommands without logging in. - - if (!strcasecmp(subcmd, "test")) { - cprintf("%d This server supports calendaring\n", CIT_OK); - return; - } - - if (!strcasecmp(subcmd, "freebusy")) { - extract_token(who, argbuf, 1, '|', sizeof who); - ical_freebusy(who); - return; - } - - if (!strcasecmp(subcmd, "sgi")) { - CIT_ICAL->server_generated_invitations = (extract_int(argbuf, 1) ? 1 : 0) ; - cprintf("%d %d\n", CIT_OK, CIT_ICAL->server_generated_invitations); - return; - } - - if (CtdlAccessCheck(ac_logged_in)) return; - - if (!strcasecmp(subcmd, "respond")) { - msgnum = extract_long(argbuf, 1); - extract_token(partnum, argbuf, 2, '|', sizeof partnum); - extract_token(action, argbuf, 3, '|', sizeof action); - ical_respond(msgnum, partnum, action); - return; - } - - if (!strcasecmp(subcmd, "handle_rsvp")) { - msgnum = extract_long(argbuf, 1); - extract_token(partnum, argbuf, 2, '|', sizeof partnum); - extract_token(action, argbuf, 3, '|', sizeof action); - ical_handle_rsvp(msgnum, partnum, action); - return; - } - - if (!strcasecmp(subcmd, "conflicts")) { - msgnum = extract_long(argbuf, 1); - extract_token(partnum, argbuf, 2, '|', sizeof partnum); - ical_conflicts(msgnum, partnum); - return; - } - - if (!strcasecmp(subcmd, "getics")) { - ical_getics(); - return; - } - - if (!strcasecmp(subcmd, "putics")) { - ical_putics(); - return; - } - - cprintf("%d Invalid subcommand\n", ERROR + CMD_NOT_SUPPORTED); -} - - // We don't know if the calendar room exists so we just create it at login void ical_CtdlCreateRoom(void) { struct ctdlroom qr; @@ -2394,6 +2326,88 @@ void ical_fixed_output(char *ptr, int len) { } +// This is an experimental implementation of CALDAV REPORT operations (RFC 4791 section 7) +// fundamentally handled in the Citadel Server. A web implementation should be able to just +// change the encapsulation to HTTP with the data format unchanged. +void ical_report(void) { + cprintf("%d Hi from Citadel\n", CIT_OK); +} + + +// All Citadel calendar commands from the client come through here. +void cmd_ical(char *argbuf) { + char subcmd[64]; + long msgnum; + char partnum[256]; + char action[256]; + char who[256]; + + extract_token(subcmd, argbuf, 0, '|', sizeof subcmd); + + // Allow "test" and "freebusy" and "sgi" subcommands without logging in. + + if (!strcasecmp(subcmd, "test")) { + cprintf("%d This server supports calendaring\n", CIT_OK); + return; + } + + if (!strcasecmp(subcmd, "freebusy")) { + extract_token(who, argbuf, 1, '|', sizeof who); + ical_freebusy(who); + return; + } + + if (!strcasecmp(subcmd, "sgi")) { + CIT_ICAL->server_generated_invitations = (extract_int(argbuf, 1) ? 1 : 0) ; + cprintf("%d %d\n", CIT_OK, CIT_ICAL->server_generated_invitations); + return; + } + + // All other commands require a user to be logged in. + if (CtdlAccessCheck(ac_logged_in)) return; + + if (!strcasecmp(subcmd, "report")) { + ical_report(); + return; + } + + if (!strcasecmp(subcmd, "respond")) { + msgnum = extract_long(argbuf, 1); + extract_token(partnum, argbuf, 2, '|', sizeof partnum); + extract_token(action, argbuf, 3, '|', sizeof action); + ical_respond(msgnum, partnum, action); + return; + } + + if (!strcasecmp(subcmd, "handle_rsvp")) { + msgnum = extract_long(argbuf, 1); + extract_token(partnum, argbuf, 2, '|', sizeof partnum); + extract_token(action, argbuf, 3, '|', sizeof action); + ical_handle_rsvp(msgnum, partnum, action); + return; + } + + if (!strcasecmp(subcmd, "conflicts")) { + msgnum = extract_long(argbuf, 1); + extract_token(partnum, argbuf, 2, '|', sizeof partnum); + ical_conflicts(msgnum, partnum); + return; + } + + if (!strcasecmp(subcmd, "getics")) { + ical_getics(); + return; + } + + if (!strcasecmp(subcmd, "putics")) { + ical_putics(); + return; + } + + cprintf("%d Invalid subcommand\n", ERROR + CMD_NOT_SUPPORTED); +} + + // Initialization function, called from modules_init.c char *ctdl_module_init_calendar(void) { if (!threading) { diff --git a/citadel/server/modules/ctdlproto/serv_messages.c b/citadel/server/modules/ctdlproto/serv_messages.c index 7e18c0bc9..9a85f263b 100644 --- a/citadel/server/modules/ctdlproto/serv_messages.c +++ b/citadel/server/modules/ctdlproto/serv_messages.c @@ -26,7 +26,7 @@ void simple_listing(long msgnum, void *userdata) { // Back end for the MSGS command: output header summary. void headers_listing(long msgnum, void *userdata) { struct CtdlMessage *msg; - int output_mode = *(int *)userdata; + int output_mode = *(int *)userdata; msg = CtdlFetchMessage(msgnum, 0); if (msg == NULL) { @@ -149,7 +149,7 @@ void cmd_msgs(char *cmdbuf) { int cm_ref = 0; int with_template = 0; struct CtdlMessage *template = NULL; - msg_filter filt; + msg_filter filt; char search_string[1024]; ForEachMsgCallback CallBack; @@ -205,7 +205,7 @@ void cmd_msgs(char *cmdbuf) { if (with_template == 1) { memset(buf, 0, 5); unbuffer_output(); - cprintf("%d Send template then receive message list\n", START_CHAT_MODE); + cprintf("%d Send template then receive message list\n", SEND_THEN_RECV); template = (struct CtdlMessage *) malloc(sizeof(struct CtdlMessage)); memset(template, 0, sizeof(struct CtdlMessage)); template->cm_magic = CTDLMESSAGE_MAGIC; @@ -228,8 +228,7 @@ void cmd_msgs(char *cmdbuf) { else if (with_template == 2) { long i = 0; memset(buf, 0, 5); - cprintf("%d Send list of headers\n", - START_CHAT_MODE); + cprintf("%d Send list of headers\n", SEND_THEN_RECV); filt.Filter = NewHash(1, lFlathash); filt.buffer = NewStrBufPlain(NULL, 1024); while(client_getln(buf, sizeof buf) >= 0 && strcmp(buf,"000")) { @@ -249,22 +248,24 @@ void cmd_msgs(char *cmdbuf) { if (with_template < 2) { CtdlForEachMessage(mode, - ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), - ( (mode == MSGS_SEARCH) ? search_string : NULL ), - NULL, - template, - CallBack, - &output_mode); + ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), + ( (mode == MSGS_SEARCH) ? search_string : NULL ), + NULL, + template, + CallBack, + &output_mode + ); if (template != NULL) CM_Free(template); } else { CtdlForEachMessage(mode, - ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), - ( (mode == MSGS_SEARCH) ? search_string : NULL ), - NULL, - NULL, - CallBack, - &filt); + ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), + ( (mode == MSGS_SEARCH) ? search_string : NULL ), + NULL, + NULL, + CallBack, + &filt + ); DeleteHashPos(&filt.p); DeleteHash(&filt.Filter); FreeStrBuf(&filt.buffer); @@ -420,9 +421,9 @@ void cmd_ent0(char *entargs) { if (IsEmptyStr(newusername)) { strcpy(newusername, CC->user.fullname); } - if ( (CC->user.axlevel < AxAideU) - && (strcasecmp(newusername, CC->user.fullname)) - && (strcasecmp(newusername, CC->cs_inet_fn)) + if ( (CC->user.axlevel < AxAideU) + && (strcasecmp(newusername, CC->user.fullname)) + && (strcasecmp(newusername, CC->cs_inet_fn)) ) { cprintf("%d You don't have permission to author messages as '%s'.\n", ERROR + HIGHER_ACCESS_REQUIRED, @@ -527,10 +528,11 @@ void cmd_ent0(char *entargs) { return; } - if ((RESTRICT_INTERNET == 1) - && (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0) - && ((CC->user.flags & US_INTERNET) == 0) - && (!CC->internal_pgm)) { + if ( (RESTRICT_INTERNET == 1) + && (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0) + && ((CC->user.flags & US_INTERNET) == 0) + && (!CC->internal_pgm) + ) { cprintf("%d You don't have access to Internet mail.\n", ERROR + HIGHER_ACCESS_REQUIRED); free_recipients(valid_to); free_recipients(valid_cc); @@ -582,17 +584,19 @@ void cmd_ent0(char *entargs) { // Read in the message from the client. if (do_confirm) { - cprintf("%d send message\n", START_CHAT_MODE); + cprintf("%d send message\n", SEND_THEN_RECV); } else { cprintf("%d send message\n", SEND_LISTING); } - msg = CtdlMakeMessage(&CC->user, recp, cc, - CC->room.QRname, anonymous, format_type, - newusername, newuseremail, subject, - ((!IsEmptyStr(supplied_euid)) ? supplied_euid : NULL), - NULL, references); + msg = CtdlMakeMessage( + &CC->user, recp, cc, + CC->room.QRname, anonymous, format_type, + newusername, newuseremail, subject, + ((!IsEmptyStr(supplied_euid)) ? supplied_euid : NULL), + NULL, references + ); // Put together one big recipients struct containing to/cc/bcc all in one. This is for the envelope. char *all_recps = malloc(SIZ * 3); @@ -747,8 +751,11 @@ void cmd_move(char *args) { if (CC->user.usernum == CC->room.QRroomaide) permit = 1; // Permit move/copy from personal rooms - if ((CC->room.QRflags & QR_MAILBOX) - && (qtemp.QRflags & QR_MAILBOX)) permit = 1; + if ( (CC->room.QRflags & QR_MAILBOX) + && (qtemp.QRflags & QR_MAILBOX) + ) { + permit = 1; + } // Permit only copy from public to personal room if ( (is_copy) @@ -762,11 +769,16 @@ void cmd_move(char *args) { if (CC->room.QRflags2 & QR2_COLLABDEL) permit = 1; // Users allowed to post into the target room may move into it too. - if ((CC->room.QRflags & QR_MAILBOX) && - (qtemp.QRflags & UA_POSTALLOWED)) permit = 1; + if ( (CC->room.QRflags & QR_MAILBOX) + && (qtemp.QRflags & UA_POSTALLOWED) + ) { + permit = 1; + } // User must have access to target room - if (!(ra & UA_KNOWN)) permit = 0; + if (!(ra & UA_KNOWN)) { + permit = 0; + } if (!permit) { cprintf("%d Higher access required.\n", ERROR + HIGHER_ACCESS_REQUIRED); diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index e2767345a..fd19bfaa1 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -692,7 +692,7 @@ extern "C" { #define ERROR 500 #define BINARY_FOLLOWS 600 #define SEND_BINARY 700 -#define START_CHAT_MODE 800 +#define SEND_THEN_RECV 800 #define INTERNAL_ERROR 10 #define TOO_BIG 11 diff --git a/textclient/citadel_ipc.c b/textclient/citadel_ipc.c index d5899c247..1a5164d7f 100644 --- a/textclient/citadel_ipc.c +++ b/textclient/citadel_ipc.c @@ -2667,7 +2667,7 @@ int CtdlIPCGenericCommand(CtdlIPC * ipc, ret = -ret; } /* else who knows? DANGER WILL ROBINSON */ break; - case 8: /* START_CHAT_MODE */ + case 8: /* SEND_THEN_RECV */ if (!strncasecmp(command, "CHAT", 4)) { /* Don't call chatmode with generic! */ CtdlIPC_putline(ipc, "/quit"); diff --git a/webcit/messages.c b/webcit/messages.c index 69f3c5a83..f8da6aa73 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -305,7 +305,7 @@ long HttpStatus(long CitadelStatus) { default: case BINARY_FOLLOWS: case SEND_BINARY: - case START_CHAT_MODE: + case SEND_THEN_RECV: case ASYNC_MSG: case MORE_DATA: case SEND_LISTING: diff --git a/webcit/webcit.h b/webcit/webcit.h index 5a56e0996..296398701 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -155,7 +155,7 @@ extern char *ssl_cipher_list; #define ERROR 500 #define BINARY_FOLLOWS 600 #define SEND_BINARY 700 -#define START_CHAT_MODE 800 +#define SEND_THEN_RECV 800 #define ASYNC_MSG 900 #define MINORCODE(a) (a % 100)