#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
}
-// 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;
}
+// 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) {
// 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) {
int cm_ref = 0;
int with_template = 0;
struct CtdlMessage *template = NULL;
- msg_filter filt;
+ msg_filter filt;
char search_string[1024];
ForEachMsgCallback CallBack;
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;
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")) {
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);
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,
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);
// 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);
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)
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);
#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
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");
default:
case BINARY_FOLLOWS:
case SEND_BINARY:
- case START_CHAT_MODE:
+ case SEND_THEN_RECV:
case ASYNC_MSG:
case MORE_DATA:
case SEND_LISTING:
#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)