commands-util.c revision a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Copyright (C) 2002-2003 Timo Sirainen */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Maximum length for mailbox name, including it's path. This isn't fully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exact since the user can create folder hierarchy with small names, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rename them to larger names. Mail storages should set more strict limits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to them, mbox/maildir currently allow paths only up to PATH_MAX. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclient_find_storage(struct client_command_context *cmd, const char **mailbox)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ns = namespace_find(cmd->client->namespaces, mailbox);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool client_verify_mailbox_name(struct client_command_context *cmd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *mailbox,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *p;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* make sure it even looks valid */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync client_send_tagline(cmd, "NO Empty mailbox name.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* make sure two hierarchy separators aren't next to each others */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync client_send_tagline(cmd, "NO Invalid mailbox name.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync client_send_tagline(cmd, "NO Mailbox name too long.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* check what our storage thinks of it */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mailbox_list_get_mailbox_name_status(list, mailbox,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "NO [TRYCREATE] Mailbox doesn't exist: ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str_sanitize(mailbox, MAILBOX_MAX_NAME_LEN), NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "NO Invalid mailbox name: ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str_sanitize(mailbox, MAILBOX_MAX_NAME_LEN), NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "NO Mailbox parent doesn't allow inferior mailboxes.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool client_verify_open_mailbox(struct client_command_context *cmd)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync client_send_tagline(cmd, "BAD No mailbox selected.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid client_send_storage_error(struct client_command_context *cmd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* we can't do forced CLOSE, so have to disconnect */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Mailbox is in inconsistent state, please relogin.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error = mail_storage_get_last_error(storage, &syntax, &temporary_error);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t_strconcat(syntax ? "BAD " : "NO ", error, NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid client_send_untagged_storage_error(struct client *client,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* we can't do forced CLOSE, so have to disconnect */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Mailbox is in inconsistent state, please relogin.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error = mail_storage_get_last_error(storage, &syntax, &temporary_error);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t_strconcat(syntax ? "* BAD " : "* NO ", error, NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic bool is_valid_keyword(struct client_command_context *cmd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *keyword)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *const *names;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned int i, count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if it already exists, skip validity checks */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (array_is_created(&cmd->client->keywords.keywords)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync names = array_get(&cmd->client->keywords.keywords, &count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < count; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Maximum length is %u characters",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool client_parse_mail_flags(struct client_command_context *cmd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *const **keywords_r)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *const *keywords;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Flags list contains non-atoms.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* system flag */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "BAD Invalid system flag ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* keyword - first make sure it's not a duplicate */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size /= sizeof(const char *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < size; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (i == size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *keywords_r = buffer->used == sizeof(atom) ? NULL :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic const char *get_keywords_string(const ARRAY_TYPE(keywords) *keywords)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *const *names;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned int i, count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < count; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define SYSTEM_FLAGS "\\Answered \\Flagged \\Deleted \\Seen \\Draft"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid client_send_mailbox_flags(struct client *client, struct mailbox *box,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t_strconcat("* FLAGS ("SYSTEM_FLAGS, str, ")", NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync client_send_line(client, "* OK [PERMANENTFLAGS ()] "
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Read-only mailbox.");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t_strconcat("* OK [PERMANENTFLAGS ("SYSTEM_FLAGS, str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool client_save_keywords(struct mailbox_keywords *dest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* first check if anything changes */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync old_names = array_get(&dest->keywords, &old_count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < count; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p_array_init(&dest->keywords, dest->pool, array_count(keywords));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < count; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbool mailbox_equals(struct mailbox *box1, struct mail_storage *storage2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *name2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct mail_storage *storage1 = mailbox_get_storage(box1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *name1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid msgset_generator_init(struct msgset_generator_context *ctx, string_t *str)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid msgset_generator_next(struct msgset_generator_context *ctx, uint32_t uid)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid msgset_generator_finish(struct msgset_generator_context *ctx)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str_printfa(ctx->str, "%u:%u", ctx->first_uid, ctx->last_uid);