%include implicit { const string URL_DIR_PREFIX = "/services/URLdirectory:"; const int REDIRECT_CODE = 302; // should be 303 const int REDIRECT_TYPE = "Moved Temporarily"; // should be See Other }; class Local . HTTPlistSMTPmailboxes { oid urlDirectory; oid mailboxDir; string pageName; int lastRetrievalTime; int defaultTimeout; } inherits from HTTPreplacedText; HTTPlistSMTPmailboxes:create(string serverName) { int rc; assoc substVars; string pageTemplate; pageName = "/SMTPmailbox/listMailboxes"; urlDirectory = lookupLocalService(URL_DIR_PREFIX + serverName); mailboxDir = lookupLocalService("MailboxDirectory"); pageTemplate = ""; // nothing yet call "HTTPreplacedText:initialize"(urlDirectory, pageTemplate, "text/plain", substVars, pageName); rc = send "registerObject"(pageName, thisObject, 1) to urlDirectory; } HTTPlistSMTPmailboxes:delete() {} HTTPlistSMTPmailboxes:_makeList() { array list; set elements; string s; int i; list = send "listMailboxes" to mailboxDir; list = sortArray(list, 0); for(i=0;indexExists(list, i) != 0;i += 1) { elements += "\r\n"; } s = makeAsString(elements); return (s); } HTTPlistSMTPmailboxes:checkIfStillValid() { return (1); } HTTPlistSMTPmailboxes:getFileData() { int t; any d, result; t = getLocalRelativeTime(); if ((t - lastRetrievalTime) > defaultTimeout) { d = call "_makeList"(); call "setFileData"(d, defaultTimeout); lastRetrievalTime = t; } result = call "HTTPcachedObject:getFileData"(); return (result); } HTTPlistSMTPmailboxes:getRequest(array requestData, assoc options, string replyMethod, oid replyDest) { any d; int t; t = getLocalRelativeTime(); if ((t - lastRetrievalTime) > defaultTimeout) { d = call "_makeList"(); call "setFileData"(d, defaultTimeout); lastRetrievalTime = t; } call "HTTPcachedObject:getRequest"(arrayToSet(argv)); } class Local . HTTPadminSMTPmailboxes { oid urlDirectory; oid mailboxDir; string pageName; int lastRetrievalTime; int defaultTimeout; } inherits from HTTPreplacedText; HTTPadminSMTPmailboxes:create(string serverName) { int rc; assoc substVars; string pageTemplate; pageName = "/SMTPmailbox/adminMailbox"; urlDirectory = lookupLocalService(URL_DIR_PREFIX + serverName); mailboxDir = lookupLocalService("MailboxDirectory"); pageTemplate = ""; // nothing yet call "HTTPreplacedText:initialize"(urlDirectory, pageTemplate, "text/html", substVars, pageName); rc = send "registerObject"(pageName, thisObject, 1) to urlDirectory; } HTTPadminSMTPmailboxes:delete() {} HTTPadminSMTPmailboxes:checkIfStillValid() { return (1); } HTTPadminSMTPmailboxes:getRequest(array requestData, assoc options, string replyMethod, oid replyDest) { string body; body = makeAsString("", requestData[0], " is not permitted against ", requestData[1], ""); send "returnError"(405, "Method Not Allowed", body) to replyDest; } HTTPadminSMTPmailboxes:headRequest(array requestData, assoc options, string replyMethod, oid replyDest) alias for getRequest; HTTPadminSMTPmailboxes:postRequest(array requestData, assoc options, string replyMethod, oid replyDest) { assoc formInfo, acl; int returnCode, rc; string returnMess; string op, text, hdr, body; any userName; oid mailbox; formInfo = parseHTTPformData(options["ENTITY_CONTENT"], assoc); op = formInfo["operation"]; userName = formInfo["mailboxName"]; mailbox = send "lookupMailbox"(userName) to mailboxDir; returnCode = 200; // assume OK returnMess = "OK"; if ((op == "changePassword") || (op == "deleteMailbox")) { if (mailbox == nil) { returnCode = 404; returnMess = "Not Found"; body = makeAsString("No such user ", safeURI(userName), "\r\n"); } else { rc = send "authenticate"(formInfo["currentPassword"]) to mailbox; if (rc == 0) { // failed returnCode = 403; returnMess = "Forbidden"; body = "Password was not valid\r\n"; } else { if (op == "deleteMailbox") { send "deleteYourself" to mailbox; body = "Mailbox deleted.\r\n"; } else { // must be changePassword if (formInfo["newPassword"] == formInfo["verifyPassword"]) { rc = send "changePassword"(formInfo["newPassword"], formInfo["currentPassword"]) to mailbox; body = makeAsString("Password for ", userName, " changed.\r\n"); } else { returnCode = 409; returnMess = "Conflict"; body = "New password did not match\r\n"; } } } } } else if (op == "createMailbox") { if (mailbox != nil) { returnCode = 409; returnMess = "Conflict"; body = makeAsString("Mailbox already exists for user ", safeURI(userName), ".\r\n"); } else { if (formInfo["newPassword"] != formInfo["verifyPassword"]) { returnCode = 409; returnMess = "Conflict"; body = "New password did not match\r\n"; } else { acl = makeDefaultACL(); mailbox = send "createObject"("SMTPmailbox", acl, userName, formInfo["fullName"], formInfo["newPassword"]) to ObjectCreator; body = "Mailbox created.\r\n"; } } } else { returnCode = 400; returnMess = "Bad Request"; body = "unrecognized operation\r\n"; } hdr = makeAsString("Content-type: text/plain\r\nContent-length: ", length(body), "\r\n\r\n"); send (replyMethod)(returnCode, returnMess, hdr, body) to replyDest; }