File: cmd_init.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 (144 lines) | stat: -rw-r--r-- 5,065 bytes parent folder | download | duplicates (5)
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
134
135
136
137
138
139
140
141
142
143
144
/* $Cambridge: hermes/src/prayer/cmd/cmd_init.c,v 1.9 2011/01/11 15:18:03 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_init(struct session *session)
{
    struct config *config = session->config;
    struct request *request = session->request;
    struct options *options = session->options;
    MAILSTREAM *stream = session->stream;
    struct msgmap *zm = session->zm;
    struct prefs *prefs;
    char *body;
    unsigned long size;
    char *ua;
    char *hostname;
    char *name;
    char *pname;

    /* Record sucessful user login */
    if (!(ua = assoc_lookup(request->hdrs, "user-agent")))
        ua = "Unknown";

    if (config->log_name_nets &&
        ipaddr_compare_list(session->ipaddr, config->log_name_nets))
        hostname = ipaddr_name(session->ipaddr);
    else
        hostname = ipaddr_text(session->ipaddr);

    session_log(session, ("[cmd_init] User login "
                          "[Client: %s] [IMAP server: %s] [User agent: %s]"),
                hostname, session->imapd_server, ua);

    /* Bit of a hack, but simplest way to reduce limit */
    if (strstr(ua, " Crazy Browser ") &&
        (config->recips_max_session > 0)) {
        config->recips_max_session = 15;
        session_log(session, "Probable spammer: recips per session limited");
    }

    if (config->sending_block_dir && session->username) {
        struct stat sbuf;
        char *path  = pool_strcat3(request->pool,
                                   config->sending_block_dir, "/",
                                   session->username);

        if (stat(path, &sbuf) == 0) {
            session->sending_block = T;

            session_message(session,
                            "Outgoing email disabled (compromised account?)");
            session_log(session,
                        "Outgoing email disabled (compromised account?)");
        }
    }

    /* Read in and parse user preferences file */

    pname = session_mailbox_prefs(session, request->pool);
    stream = ml_open(session, stream, pname, OP_READONLY);

    if (stream && (stream->nmsgs >= 1)
        && (body = ml_fetch_body(session, stream, 1, "1", &size, 0))) {
        if (!options_parse(options, body, session)) {
            session_alert(session,
                          "Invalid or obsolete preferences file");
            session_log(session,
                        "[cmd_init] Invalid or obsolete preferences file");
            options->save = T;
        }
    } else {
        session_message(session,
                        "No saved user preferences: using defaults");
        session_log(session,
                    "[cmd_init] No saved user preferences: using defaults");
    }

    prefs = options->prefs;

    /* Make session adopt user preferences */
    session_use_prefs(session, prefs, T);

    /* Check if user has blocked Raven logins */
    if (config->raven_enable && !prefs->allow_raven_login &&
        (strlen(session->password) > 256)) {
        struct template_vals *tvals = session->template_vals;
        struct buffer *b = request->write_buffer;

        session->want_disconnect = T;

        template_vals_string(tvals, "url_prefix", session->url_prefix);
        template_vals_string(tvals, "username", session->username);
        template_expand("raven_blocked", tvals, b);
        response_html(request, 200);
        return;
    }

    name = session_mailbox(session, request->pool, "inbox");
    /* Open inbox, reusing initial stream */
    session->stream = session->inbox_stream = stream
        =  ml_open(session, stream, name, 0);

    if (!stream) {
        /* Should be impossible */
        session_alert(session, "Couldn't open inbox folder");
        session_log(session, "[cmd_init] Couldn't open inbox folder");
        session_redirect(session, request, "restart");
        return;
    }

    string_strdup(&session->foldername, "INBOX");
    session->inbox_last_ping_time = time(NIL);

    /* Set up initial msgmap */
    msgmap_associate(zm, session, stream);
    msgmap_update(zm);

    /* Set current and last_displayed message to last or first in zoommap
     * (cmd_welcome may override with this last unread message) */
    if (zm->nmsgs > 0) {
        if (zm->sort_reverse)
            session->current = msgmap_value(zm, 1);
        else
            session->current = msgmap_value(zm, zm->nmsgs);
    } else
        session->current = 0;

    session->last_displayed = session->current;

    /* Define sane last_cmd: don't want to end up back here! */
    session_record_last_cmd(session, "list");

    if (session->user_agent->use_cookie)
        session_make_session_cookie_redirect(session, request,
                                             "check_cookie");
    else
        session_redirect(session, request, "welcome");
}