File: cmd_redirect.c

package info (click to toggle)
prayer 1.3.5-dfsg1-8
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,596 kB
  • sloc: ansic: 43,163; makefile: 817; sh: 445; perl: 166
file content (133 lines) | stat: -rw-r--r-- 4,382 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* $Cambridge: hermes/src/prayer/cmd/cmd_redirect.c,v 1.5 2009/04/03 16:39:07 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"

static void generate_form(struct session *session,
                          BOOL redirect_enabled,
                          char *redirect_address,
                          BOOL redirect_copy)
{
    struct template_vals *tvals = session->template_vals;
    struct request *request = session->request;
    struct buffer *b = request->write_buffer;

    if (redirect_enabled)
        template_vals_ulong(tvals, "use_redirect", 1);

    if (redirect_address)
        template_vals_string(tvals, "redirect_addr", redirect_address);

    if (redirect_copy)
        template_vals_ulong(tvals, "redirect_copy", 1);

    session_seed_template(session, tvals);
    template_expand("redirect", tvals, b);
    response_html(request, 200);        /* Success */
}

static void generate_error(struct session *session)
{
    struct template_vals *tvals = session->template_vals;
    struct account *account = session->account;
    struct request *request = session->request;
    char *msg = account_fetch_message(account);
    struct buffer *b = request->write_buffer;

    if (!(msg && msg[0]))
        msg = "Unable to check mail processing status";

    template_vals_string(tvals, "msg", msg);
    session_seed_template(session, tvals);
    template_expand("redirect_fail", tvals, b);
    response_html(request, 200);
}

void cmd_redirect(struct session *session)
{
    struct request *request = session->request;
    struct assoc *h = NIL;
    struct account *account = session->account;
    char *s;
    BOOL rc = T;
    ADDRESS *addr = NIL;
    BOOL redirect_enabled;
    char *redirect_address = "";
    BOOL redirect_copy;

    if (request->method != POST) {
        if (!account_mail_check(account, request->pool))
            generate_error(session);
        else
            generate_form(session,
                          account->redirect_enabled,
                          account->redirect_address,
                          account->redirect_copy);
        return;
    }

    request_decode_form(request);
    h = request->form;

    if (!assoc_lookup(h, "sub_apply")) {
        session_redirect(session, request, "manage");
        return;
    }

    /* Store state in temporary variables until validated */
    redirect_enabled = (assoc_lookup(h, "use_redirect")) ? T : NIL;
    redirect_copy    = (assoc_lookup(h, "save_copy"))    ? T : NIL;

    s = assoc_lookup(h, "redirect_addr");
    redirect_address = (s) ? s : "";

    if (redirect_enabled) {
        addr = addr_parse(request->pool, redirect_address, "");

        if (!addr) {
            session_message(session, "Redirection Address invalid: %s",
                            ml_errmsg());
            rc = NIL;
        } else {
            if ((addr->next) || (addr->personal && addr->personal[0]) ||
                (!(addr->host && addr->host[0]))) {
                session_message(session,
                                ("Redirection Address must be "
                                 "single, simple "
                                 "and fully qualified email address"));
                rc = NIL;
            }
            mail_free_address(&addr);
        }

        if (rc == NIL) {
            generate_form(session,
                          redirect_enabled,
                          redirect_address,
                          redirect_copy);
            return;
        }
    }

    /* Commit and update */
    account->redirect_enabled = redirect_enabled;
    account->redirect_copy    = redirect_copy;
    string_strdup(&account->redirect_address, redirect_address);

    if (account_mail_update(account, request->pool)) {
        session_message(session, "Updated redirection");
    } else {
        char *msg = account_fetch_message(account);
        
        session_message(session, "Unable to update redirection: %s", msg);
        session_log(session,
                    "[cmd_redirect] Unable to update redirection: %s", msg);
    }

    session_redirect(session, request, "manage");
}