From 575e4e2fc94194466c3591ca10e53802af4765a3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Thu, 14 May 2009 20:00:17 +0000 Subject: [PATCH] * add defines for our errorcodes * create citadel<->http return code mapper * add more DAV ed stuff --- webcit/context_loop.c | 12 +++- webcit/messages.c | 134 ++++++++++++++++++++++++++++++++++++++++++ webcit/webcit.h | 39 ++++++++++++ 3 files changed, 184 insertions(+), 1 deletion(-) diff --git a/webcit/context_loop.c b/webcit/context_loop.c index 30b33cd72..90038a7c8 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -556,7 +556,9 @@ const char *ReqStrs[eNONE] = { "PROPFIND", "PUT", "DELETE", - "HEAD" + "HEAD", + "MOVE", + "COPY" }; void @@ -594,6 +596,14 @@ ServerStartModule_CONTEXT v = malloc(sizeof(long)); *v = eHEAD; Put(HttpReqTypes, HKEY("HEAD"), v, NULL); + + v = malloc(sizeof(long)); + *v = eMOVE; + Put(HttpReqTypes, HKEY("MOVE"), v, NULL); + + v = malloc(sizeof(long)); + *v = eCOPY; + Put(HttpReqTypes, HKEY("COPY"), v, NULL); } void diff --git a/webcit/messages.c b/webcit/messages.c index 6b683a1e6..f6db79704 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -277,9 +277,142 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co +void +HttpStatus(long CitadelStatus) +{ + long httpstatus = 502; + long MajorStat = MAJORCODE(CitadelStatus); + long MinorStat = MINORCODE(CitadelStatus); + + switch (MAJORCODE(CitadelStatus)) + { + case LISTING_FOLLOWS: + case CIT_OK: + httpstatus = 201; + break; + case ERROR: + switch (MINORCODE(CitadelStatus)) + { + case INTERNAL_ERROR: + httpstatus = 403; + break; + + case TOO_BIG: + case ILLEGAL_VALUE: + case HIGHER_ACCESS_REQUIRED: + case MAX_SESSIONS_EXCEEDED: + case RESOURCE_BUSY: + case RESOURCE_NOT_OPEN: + case NOT_HERE: + case INVALID_FLOOR_OPERATION: + case FILE_NOT_FOUND: + case ROOM_NOT_FOUND: + httpstatus = 409; + break; + + case MESSAGE_NOT_FOUND: + case ALREADY_EXISTS: + httpstatus = 403; + break; + + case NO_SUCH_SYSTEM: + httpstatus = 502; + break; + + default: + case CMD_NOT_SUPPORTED: + case PASSWORD_REQUIRED: + case ALREADY_LOGGED_IN: + case USERNAME_REQUIRED: + case NOT_LOGGED_IN: + case SERVER_SHUTTING_DOWN: + case NO_SUCH_USER: + case ASYNC_GEXP: + httpstatus = 502; + break; + } + break; + default: + case BINARY_FOLLOWS: + case SEND_BINARY: + case START_CHAT_MODE: + case ASYNC_MSG: + case MORE_DATA: + case SEND_LISTING: + httpstatus = 502; /* aeh... whut? */ + break; + } + + +} + +/* + * Unadorned HTML output of an individual message, suitable + * for placing in a hidden iframe, for printing, or whatever + * + * msgnum_as_string == Message number, as a string instead of as a long int + */ +void handle_one_message(void) +{ + long CitStatus; + int CopyMessage = 0; + const StrBuf *Destination; + void *vLine; + const StrBuf *Mime; + long msgnum = 0L; + wcsession *WCC = WC; + const StrBuf *Tmpl; + StrBuf *CmdBuf = NULL; + msgnum = StrTol(WCC->UrlFragment3); + gotoroom(WCC->UrlFragment2); + switch (WCC->eReqType) + { + case eGET: + case ePOST: + Tmpl = sbstr("template"); + if (StrLength(Tmpl) > 0) + read_message(WCC->WBuf, SKEY(Tmpl), msgnum, NULL, &Mime); + else + read_message(WCC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime); + http_transmit_thing(ChrPtr(Mime), 0); + break; + case eDELETE: + CmdBuf = NewStrBuf (); + if (WCC->wc_is_trash) { /** Delete from Trash is a real delete */ + serv_printf("DELE %ld", msgnum); + } + else { /** Otherwise move it to Trash */ + serv_printf("MOVE %ld|_TRASH_|0", msgnum); + } + StrBuf_ServGetln(CmdBuf); + FlushStrBuf(WCC->ImportantMsg); + StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4); + GetServerStatus(CmdBuf, &CitStatus); + HttpStatus(CitStatus); + break; + case eCOPY: + CopyMessage = 1; + case eMOVE: + if (GetHash(WCC->headers, HKEY("DESTINATION"), &vLine) && + (vLine!=NULL)) { + Destination = (StrBuf*) vLine; + serv_printf("MOVE %ld|%s|%d", msgnum, ChrPtr(Destination), CopyMessage); + StrBuf_ServGetln(CmdBuf); + FlushStrBuf(WCC->ImportantMsg); + StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4); + GetServerStatus(CmdBuf, &CitStatus); + HttpStatus(CitStatus); + } + else + HttpStatus(500); + break; + default: + break; + } +} /* * Unadorned HTML output of an individual message, suitable * for placing in a hidden iframe, for printing, or whatever @@ -1783,6 +1916,7 @@ InitModule_MSG WebcitAddUrlHandler(HKEY("delete_msg"), delete_msg, 0); WebcitAddUrlHandler(HKEY("confirm_move_msg"), confirm_move_msg, 0); WebcitAddUrlHandler(HKEY("msg"), embed_message, NEED_URL); + WebcitAddUrlHandler(HKEY("message"), handle_one_message, NEED_URL|XHTTP_COMMANDS); WebcitAddUrlHandler(HKEY("printmsg"), print_message, NEED_URL); WebcitAddUrlHandler(HKEY("mobilemsg"), mobile_message_view, NEED_URL); WebcitAddUrlHandler(HKEY("msgheaders"), display_headers, NEED_URL); diff --git a/webcit/webcit.h b/webcit/webcit.h index 77e858ce4..2d204cd6b 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -195,6 +195,42 @@ US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ US_FLOORS | US_COLOR | US_PROMPTCTL ) + +#define MAJORCODE(a) (((int)(a / 100) ) * 100) + +#define LISTING_FOLLOWS 100 +#define CIT_OK 200 +#define MORE_DATA 300 +#define SEND_LISTING 400 +#define ERROR 500 +#define BINARY_FOLLOWS 600 +#define SEND_BINARY 700 +#define START_CHAT_MODE 800 +#define ASYNC_MSG 900 + +#define MINORCODE(a) (a % 100) +#define ASYNC_GEXP 02 +#define INTERNAL_ERROR 10 +#define TOO_BIG 11 +#define ILLEGAL_VALUE 12 +#define NOT_LOGGED_IN 20 +#define CMD_NOT_SUPPORTED 30 +#define SERVER_SHUTTING_DOWN 31 +#define PASSWORD_REQUIRED 40 +#define ALREADY_LOGGED_IN 41 +#define USERNAME_REQUIRED 42 +#define HIGHER_ACCESS_REQUIRED 50 +#define MAX_SESSIONS_EXCEEDED 51 +#define RESOURCE_BUSY 52 +#define RESOURCE_NOT_OPEN 53 +#define NOT_HERE 60 +#define INVALID_FLOOR_OPERATION 61 +#define NO_SUCH_USER 70 +#define FILE_NOT_FOUND 71 +#define ROOM_NOT_FOUND 72 +#define NO_SUCH_SYSTEM 73 +#define ALREADY_EXISTS 74 +#define MESSAGE_NOT_FOUND 75 /* * NLI is the string that shows up in a who's online listing for sessions * that are active, but for which no user has yet authenticated. @@ -336,6 +372,8 @@ enum { ePUT, eDELETE, eHEAD, + eMOVE, + eCOPY, eNONE }; const char *ReqStrs[eNONE]; @@ -807,6 +845,7 @@ void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc #define AJAX (1<<0) #define ANONYMOUS (1<<1) #define NEED_URL (1<<2) +#define XHTTP_COMMANDS (1<<3) /* These should be empty, but we have them for testing */ -- 2.39.2