X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fimap%2Fimap_acl.c;h=0cd272860dfd887c4cff122d3421360cd7517c02;hb=2b80e75820618944e1c75b9c01aeeefc8b6b0c81;hp=c54340a497b5f18ec69daec59305c16ab86e48b2;hpb=939ba3f9a9da345cc3bf48e646ef5787074ac05d;p=citadel.git diff --git a/citadel/modules/imap/imap_acl.c b/citadel/modules/imap/imap_acl.c index c54340a49..0cd272860 100644 --- a/citadel/modules/imap/imap_acl.c +++ b/citadel/modules/imap/imap_acl.c @@ -1,11 +1,24 @@ /* - * $Id$ - * * Functions which implement RFC2086 (and maybe RFC4314) (IMAP ACL extension) * + * + * Copyright (c) 2007-2011 by the citadel.org team + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - #include "sysdep.h" #include #include @@ -38,9 +51,7 @@ #include "citserver.h" #include "support.h" #include "config.h" -#include "room_ops.h" #include "user_ops.h" -#include "policy.h" #include "database.h" #include "msgbase.h" #include "internet_addressing.h" @@ -49,15 +60,15 @@ #include "imap_fetch.h" #include "imap_misc.h" #include "genstamp.h" - +#include "ctdl_module.h" /* * Implements the SETACL command. */ -void imap_setacl(int num_parms, char *parms[]) { +void imap_setacl(int num_parms, ConstStr *Params) { - cprintf("%s BAD not yet implemented FIXME\r\n", parms[0]); + IReply("BAD not yet implemented FIXME"); return; } @@ -65,9 +76,9 @@ void imap_setacl(int num_parms, char *parms[]) { /* * Implements the DELETEACL command. */ -void imap_deleteacl(int num_parms, char *parms[]) { +void imap_deleteacl(int num_parms, ConstStr *Params) { - cprintf("%s BAD not yet implemented FIXME\r\n", parms[0]); + IReply("BAD not yet implemented FIXME"); return; } @@ -76,9 +87,9 @@ void imap_deleteacl(int num_parms, char *parms[]) { * Given the bits returned by CtdlRoomAccess(), populate a string buffer * with IMAP ACL format flags. This code is common to GETACL and MYRIGHTS. */ -void imap_acl_flags(char *rights, int ra) +void imap_acl_flags(StrBuf *rights, int ra) { - strcpy(rights, ""); + FlushStrBuf(rights); /* l - lookup (mailbox is visible to LIST/LSUB commands) * r - read (SELECT the mailbox, perform STATUS et al) @@ -86,10 +97,10 @@ void imap_acl_flags(char *rights, int ra) */ if ( (ra & UA_KNOWN) /* known rooms */ || ((ra & UA_GOTOALLOWED) && (ra & UA_ZAPPED)) /* zapped rooms */ - ) { - strcat(rights, "l"); - strcat(rights, "r"); - strcat(rights, "s"); + ) { + StrBufAppendBufPlain(rights, HKEY("l"), 0); + StrBufAppendBufPlain(rights, HKEY("r"), 0); + StrBufAppendBufPlain(rights, HKEY("s"), 0); /* Only output the remaining flags if the room is known */ @@ -99,14 +110,14 @@ void imap_acl_flags(char *rights, int ra) /* p - post (send mail to submission address for mailbox - not enforced) */ /* c - create (CREATE new sub-mailboxes) */ if (ra & UA_POSTALLOWED) { - strcat(rights, "i"); - strcat(rights, "p"); - strcat(rights, "c"); + StrBufAppendBufPlain(rights, HKEY("i"), 0); + StrBufAppendBufPlain(rights, HKEY("p"), 0); + StrBufAppendBufPlain(rights, HKEY("c"), 0); } /* d - delete messages (STORE DELETED flag, perform EXPUNGE) */ if (ra & UA_DELETEALLOWED) { - strcat(rights, "d"); + StrBufAppendBufPlain(rights, HKEY("d"), 0); } /* a - administer (perform SETACL/DELETEACL/GETACL/LISTRIGHTS) */ @@ -118,8 +129,9 @@ void imap_acl_flags(char *rights, int ra) * commands are not yet implemented, omitting the flag should * theoretically prevent compliant clients from attempting to * perform them. + * + * StrBufAppendBufPlain(rights, HKEY("a"), 0); */ - /* strcat(rights, "a"); * commented out */ } } } @@ -128,7 +140,7 @@ void imap_acl_flags(char *rights, int ra) /* * Implements the GETACL command. */ -void imap_getacl(int num_parms, char *parms[]) { +void imap_getacl(int num_parms, ConstStr *Params) { char roomname[ROOMNAMELEN]; char savedroom[ROOMNAMELEN]; int msgs, new; @@ -136,41 +148,41 @@ void imap_getacl(int num_parms, char *parms[]) { struct ctdluser temp; struct cdbdata *cdbus; int ra; - char rights[32]; + StrBuf *rights; if (num_parms != 3) { - cprintf("%s BAD usage error\r\n", parms[0]); + IReply("BAD usage error"); return; } /* * Search for the specified room or folder */ - ret = imap_grabroom(roomname, parms[2], 0); + ret = imap_grabroom(roomname, Params[2].Key, 1); if (ret != 0) { - cprintf("%s NO Invalid mailbox name or access denied\r\n", - parms[0]); + IReply("NO Invalid mailbox name or access denied"); return; } /* - * usergoto() formally takes us to the desired room. (If another + * CtdlUserGoto() formally takes us to the desired room. (If another * folder is selected, save its name so we can return there!!!!!) */ if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - usergoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new); - cprintf("* ACL"); - cprintf(" "); - imap_strout(parms[2]); + IAPuts("* ACL "); + IPutCParamStr(2); /* * Traverse the userlist */ + rights = NewStrBuf(); cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) + { memset(&temp, 0, sizeof temp); memcpy(&temp, cdbus->ptr, sizeof temp); cdb_free(cdbus); @@ -178,51 +190,51 @@ void imap_getacl(int num_parms, char *parms[]) { CtdlRoomAccess(&CC->room, &temp, &ra, NULL); if (!IsEmptyStr(temp.fullname)) { imap_acl_flags(rights, ra); - if (!IsEmptyStr(rights)) { - cprintf(" "); - imap_strout(temp.fullname); - cprintf(" %s", rights); + if (StrLength(rights) > 0) { + IAPuts(" "); + IPutStr(temp.fullname, strlen(temp.fullname)); + IAPuts(" "); + iaputs(SKEY( rights)); } } } - - cprintf("\r\n"); + FreeStrBuf(&rights); + IAPuts("\r\n"); /* * If another folder is selected, go back to that room so we can resume * our happy day without violent explosions. */ if (IMAP->selected) { - usergoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new); } - cprintf("%s OK GETACL completed\r\n", parms[0]); + IReply("OK GETACL completed"); } /* * Implements the LISTRIGHTS command. */ -void imap_listrights(int num_parms, char *parms[]) { +void imap_listrights(int num_parms, ConstStr *Params) { char roomname[ROOMNAMELEN]; char savedroom[ROOMNAMELEN]; int msgs, new; int ret; - struct recptypes *valid; + recptypes *valid; struct ctdluser temp; if (num_parms != 4) { - cprintf("%s BAD usage error\r\n", parms[0]); + IReply("BAD usage error"); return; } /* * Search for the specified room/folder */ - ret = imap_grabroom(roomname, parms[2], 0); + ret = imap_grabroom(roomname, Params[2].Key, 1); if (ret != 0) { - cprintf("%s NO Invalid mailbox name or access denied\r\n", - parms[0]); + IReply("NO Invalid mailbox name or access denied"); return; } @@ -230,50 +242,47 @@ void imap_listrights(int num_parms, char *parms[]) { * Search for the specified user */ ret = (-1); - valid = validate_recipients(parms[3], NULL, 0); + valid = validate_recipients(Params[3].Key, NULL, 0); if (valid != NULL) { if (valid->num_local == 1) { - ret = getuser(&temp, valid->recp_local); + ret = CtdlGetUser(&temp, valid->recp_local); } free_recipients(valid); } if (ret != 0) { - cprintf("%s NO Invalid user name or access denied\r\n", - parms[0]); + IReply("NO Invalid user name or access denied"); return; } /* - * usergoto() formally takes us to the desired room. (If another + * CtdlUserGoto() formally takes us to the desired room. (If another * folder is selected, save its name so we can return there!!!!!) */ if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - usergoto(roomname, 0, 0, &msgs, &new); - + CtdlUserGoto(roomname, 0, 0, &msgs, &new); /* * Now output the list of rights */ - cprintf("* LISTRIGHTS "); - imap_strout(parms[2]); - cprintf(" "); - imap_strout(parms[3]); - cprintf(" "); - imap_strout(""); /* FIXME ... do something here */ - cprintf("\r\n"); - + IAPuts("* LISTRIGHTS "); + IPutCParamStr(2); + IAPuts(" "); + IPutCParamStr(3); + IAPuts(" "); + IPutStr(HKEY("")); /* FIXME ... do something here */ + IAPuts("\r\n"); /* * If another folder is selected, go back to that room so we can resume * our happy day without violent explosions. */ if (IMAP->selected) { - usergoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new); } - cprintf("%s OK LISTRIGHTS completed\r\n", parms[0]); + IReply("OK LISTRIGHTS completed"); return; } @@ -281,51 +290,53 @@ void imap_listrights(int num_parms, char *parms[]) { /* * Implements the MYRIGHTS command. */ -void imap_myrights(int num_parms, char *parms[]) { +void imap_myrights(int num_parms, ConstStr *Params) { char roomname[ROOMNAMELEN]; char savedroom[ROOMNAMELEN]; int msgs, new; int ret; int ra; - char rights[32]; + StrBuf *rights; if (num_parms != 3) { - cprintf("%s BAD usage error\r\n", parms[0]); + IReply("BAD usage error"); return; } - ret = imap_grabroom(roomname, parms[2], 0); + ret = imap_grabroom(roomname, Params[2].Key, 1); if (ret != 0) { - cprintf("%s NO Invalid mailbox name or access denied\r\n", - parms[0]); + IReply("NO Invalid mailbox name or access denied"); return; } /* - * usergoto() formally takes us to the desired room. (If another + * CtdlUserGoto() formally takes us to the desired room. (If another * folder is selected, save its name so we can return there!!!!!) */ if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - usergoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new); CtdlRoomAccess(&CC->room, &CC->user, &ra, NULL); + rights = NewStrBuf(); imap_acl_flags(rights, ra); - cprintf("* MYRIGHTS "); - imap_strout(parms[2]); - cprintf(" %s\r\n", rights); + IAPuts("* MYRIGHTS "); + IPutCParamStr(2); + IAPuts(" "); + IPutStr(SKEY(rights)); + IAPuts("\r\n"); + + FreeStrBuf(&rights); /* * If a different folder was previously selected, return there now. */ if ( (IMAP->selected) && (strcasecmp(roomname, savedroom)) ) { - usergoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new); } - cprintf("%s OK MYRIGHTS completed\r\n", parms[0]); + IReply("OK MYRIGHTS completed"); return; } - -