File: cmd_create.c

package info (click to toggle)
prayer 1.3.4-dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,416 kB
  • sloc: ansic: 43,089; makefile: 812; sh: 451; perl: 166
file content (113 lines) | stat: -rw-r--r-- 3,987 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* $Cambridge: hermes/src/prayer/cmd/cmd_create.c,v 1.5 2009/08/28 12:06:28 dpc22 Exp $ */
/************************************************
 *    Prayer - a Webmail Interface              *
 ************************************************/

/* Copyright (c) University of Cambridge 2000 - 2008 */
/* See the file NOTICE for conditions of use and distribution. */

#include "prayer_session.h"

void cmd_create(struct session *session)
{
    struct config *config = session->config;
    struct prefs  *prefs  = session->options->prefs;
    struct request *request = session->request;
    char *mailbox, *type, *parent;
    char *path, *ml_path;

    if (request->argc < 2) {
        session_redirect(session, request, "error");
        return;
    }

    request_decode_form(request);

    mailbox = utf8_to_imaputf7(request->pool,
                               assoc_lookup(request->form, "name"));

    if (!mailbox) {
        session_redirect(session, request, "error");
        return;
    }

    type   = assoc_lookup(request->form, "type");
    if (!type)
        type = "mailbox";

    if ((parent = assoc_lookup(request->form, "parent")))
        string_canon_decode(parent);

    if (parent && parent[0])
        mailbox = pool_strcat3(request->pool, parent,
                               session->hiersep, mailbox);
    else if ((prefs->maildir && prefs->maildir[0])) {
        /* No parent and we have maildir so add that to the start of mailbox */
        mailbox = pool_strcat3(request->pool, prefs->maildir,
                               session->hiersep, mailbox);
    }

    if (!string_filename_valid(mailbox)) {
        session_alert(session, "Name contained illegal characters");
        /* Redirect back to previous command */
        session_redirect(session, request, request->argv[1]);
        return;
    }

    path = mailbox;

    if (type && !strcmp(type, "directory"))
        ml_path = pool_strcat(request->pool, path, session->hiersep);
    else
        ml_path = path;

    ml_clear_error();
    ml_have_close();
    if (!ml_create(session, session->stream,
                   session_mailbox(session, request->pool, ml_path))) {
        if (ml_have_close()) {
            session_redirect(session, request, "restart");
            return;
        }
    }

    if (type && !strcmp(type, "directory")) {
        if (ml_have_error()) {
            session_alert(session,
                          "Failed to create directory: %s - %s",
                          utf8_from_imaputf7(request->pool, path),
                          ml_errmsg());
            session_log(session,
                        "[cmd_create] Failed to create directory: %s",
                        path);
        } else {
            session_message(session, "Created directory: %s",
                            utf8_from_imaputf7(request->pool, path));
            session_log(session,
                        "[cmd_create] Created directory: %s", path);
            if (config->dualuse)
                folderlist_add(session->folderlist, path, NIL, NIL);
            else
                folderlist_add(session->folderlist, path, T, NIL);
        }
    } else if (ml_have_error()) {
        session_alert(session,
                      "Failed to create mailbox: %s - %s",
                      utf8_from_imaputf7(request->pool, path), ml_errmsg());
        session_log(session,
                    "[cmd_create] Failed to create mailbox: %s",
                    path);
    } else {
        session_message(session, "Created mailbox: %s",
                        utf8_from_imaputf7(request->pool, path));
        session_log(session, "[cmd_create] Created mailbox: %s",
                    path);
        if (config->dualuse)
            folderlist_add(session->folderlist, path, NIL, NIL);
        else
            folderlist_add(session->folderlist, path, NIL, T);
    }

    /* Redirect back to previous command */
    session_redirect(session, request, request->argv[1]);
}