3 * IMAP server for the Citadel/UX system
4 * Copyright (C) 2000 by Art Cancro and others.
5 * This code is released under the terms of the GNU General Public License.
7 * Current status of standards conformance:
9 * *** ABSOLUTELY NOTHING WORKS ***
21 #include <sys/types.h>
29 #include "sysdep_decls.h"
30 #include "citserver.h"
33 #include "dynloader.h"
40 #include "internet_addressing.h"
41 #include "serv_imap.h"
48 * This cleanup function blows away the temporary memory and files used by
51 void imap_cleanup_function(void) {
53 /* Don't do this stuff if this is not a IMAP session! */
54 if (CC->h_command_function != imap_command_loop) return;
56 lprintf(9, "Performing IMAP cleanup hook\n");
59 lprintf(9, "Finished IMAP cleanup hook\n");
65 * Here's where our IMAP session begins its happy day.
67 void imap_greeting(void) {
69 strcpy(CC->cs_clientname, "IMAP session");
71 CtdlAllocUserData(SYM_IMAP, sizeof(struct citimap));
73 cprintf("* OK %s Citadel/UX IMAP4rev1 server ready\r\n",
79 * implements the LOGIN command (ordinary username/password login)
81 void imap_login(char *tag, char *cmd, char *parms) {
85 extract_token(username, parms, 0, ' ');
86 extract_token(password, parms, 1, ' ');
88 if (CtdlLoginExistingUser(username) == login_ok) {
89 if (CtdlTryPassword(password) == pass_ok) {
90 cprintf("%s OK login successful\r\n", tag);
95 cprintf("%s BAD Login incorrect\r\n", tag);
100 * implements the CAPABILITY command
102 void imap_capability(char *tag, char *cmd, char *parms) {
103 cprintf("* CAPABILITY IMAP4 IMAP4REV1 AUTH=LOGIN\r\n");
104 cprintf("%s OK CAPABILITY completed\r\n", tag);
111 * Main command loop for IMAP sessions.
113 void imap_command_loop(void) {
119 memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
120 if (client_gets(cmdbuf) < 1) {
121 lprintf(3, "IMAP socket is broken. Ending session.\r\n");
126 lprintf(5, "citserver[%3d]: %s\r\n", CC->cs_pid, cmdbuf);
127 while (strlen(cmdbuf) < 5) strcat(cmdbuf, " ");
130 /* strip off l/t whitespace and CRLF */
131 if (cmdbuf[strlen(cmdbuf)-1]=='\n') cmdbuf[strlen(cmdbuf)-1]=0;
132 if (cmdbuf[strlen(cmdbuf)-1]=='\r') cmdbuf[strlen(cmdbuf)-1]=0;
136 extract_token(tag, cmdbuf, 0, ' ');
137 extract_token(cmd, cmdbuf, 1, ' ');
138 remove_token(cmdbuf, 0, ' ');
139 remove_token(cmdbuf, 0, ' ');
140 lprintf(9, "tag=<%s> cmd=<%s> parms=<%s>\n", tag, cmd, cmdbuf);
142 if (!strcasecmp(cmd, "NOOP")) {
143 cprintf("%s OK This command successfully did nothing.\r\n",
147 else if (!strcasecmp(cmd, "LOGOUT")) {
148 cprintf("* BYE %s logging out\r\n", config.c_fqdn);
149 cprintf("%s OK thank you for using Citadel IMAP\r\n", tag);
154 else if (!strcasecmp(cmd, "LOGIN")) {
155 imap_login(tag, cmd, cmdbuf);
158 else if (!strcasecmp(cmd, "CAPABILITY")) {
159 imap_capability(tag, cmd, cmdbuf);
162 else if (!CC->logged_in) {
163 cprintf("%s BAD Not logged in.\r\n", tag);
166 /* FIXME ... implement commands requiring login here */
169 cprintf("%s BAD command unrecognized\r\n", tag);
176 char *Dynamic_Module_Init(void)
178 SYM_IMAP = CtdlGetDynamicSymbol();
179 CtdlRegisterServiceHook(143, /* FIXME put in config setup */
183 CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);