imap-zlib-plugin.c revision 8552b0cad8ffe9ccb8270577ba28b8010c89af11
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainenconst char *imap_zlib_plugin_version = DOVECOT_VERSION;
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainenstatic void (*next_hook_client_created)(struct client **client);
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(imap_zlib_imap_module,
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainenstatic void client_skip_line(struct client *client)
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainen const unsigned char *data;
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen data = i_stream_get_data(client->input, &data_size);
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainen else if (data[0] == '\r' && data_size > 1 && data[1] == '\n')
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainenstatic void client_update_imap_parser_streams(struct client *client)
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen for (cmd = client->command_queue; cmd != NULL; cmd = cmd->next) {
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstatic bool cmd_compress(struct client_command_context *cmd)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct zlib_client *zclient = IMAP_ZLIB_IMAP_CONTEXT(client);
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen unsigned int level;
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen /* <mechanism> */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen client_send_command_error(cmd, "Invalid arguments.");
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen "NO [COMPRESSIONACTIVE] COMPRESSION=%s already enabled.",
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen "NO [COMPRESSIONACTIVE] TLS compression already enabled.");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen handler = zlib_find_zlib_handler(t_str_lcase(mechanism));
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (handler == NULL || handler->create_istream == NULL) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen client_send_tagline(cmd, "NO Unknown compression mechanism.");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen client_send_tagline(cmd, "OK Begin compression.");
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen "imap_zlib_compress_level");
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (value == NULL || str_to_uint(value, &level) < 0 ||
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen client->input = handler->create_istream(old_input, FALSE);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen client->output = handler->create_ostream(old_output, level);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenstatic void imap_zlib_client_created(struct client **clientp)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (mail_user_is_plugin_loaded(client->user, imap_zlib_module) &&
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen zclient = p_new(client->pool, struct zlib_client, 1);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen MODULE_CONTEXT_SET(client, imap_zlib_imap_module, zclient);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen str_append(client->capability_string, " COMPRESS=DEFLATE");
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainenvoid imap_zlib_plugin_init(struct module *module)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen command_register("COMPRESS", cmd_compress, 0);
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen next_hook_client_created = hook_client_created;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen hook_client_created = imap_zlib_client_created;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen hook_client_created = next_hook_client_created;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainenconst char *imap_zlib_plugin_dependencies[] = { "zlib", NULL };
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenconst char imap_zlib_plugin_binary_dependency[] = "imap";