static void zlib_mail_user_created(struct mail_user *user) { struct mail_user_vfuncs *v = user->vlast; struct zlib_user *zuser; const char *name; zuser = p_new(user->pool, struct zlib_user, 1); zuser->module_ctx.super = *v; user->vlast = &zuser->module_ctx.super; v->deinit = zlib_mail_user_deinit; name = mail_user_plugin_getenv(user, "zlib_save"); if (name != NULL && *name != '\0') { zuser->save_handler = compression_lookup_handler(name); if (zuser->save_handler == NULL) i_error("zlib_save: Unknown handler: %s", name); else if (zuser->save_handler->create_ostream == NULL) { i_error("zlib_save: Support not compiled in for handler: %s", name); zuser->save_handler = NULL; } } name = mail_user_plugin_getenv(user, "zlib_save_level"); if (name != NULL) { if (str_to_uint(name, &zuser->save_level) < 0 || zuser->save_level < 1 || zuser->save_level > 9) { i_error("zlib_save_level: Level must be between 1..9"); zuser->save_level = 0; } } if (zuser->save_level == 0) zuser->save_level = ZLIB_PLUGIN_DEFAULT_LEVEL; MODULE_CONTEXT_SET(user, zlib_user_module, zuser); }
static void imap_zlib_client_created(struct client **clientp) { struct client *client = *clientp; struct zlib_client *zclient; if (mail_user_is_plugin_loaded(client->user, imap_zlib_module) && compression_lookup_handler("deflate") != NULL) { zclient = p_new(client->pool, struct zlib_client, 1); MODULE_CONTEXT_SET(client, imap_zlib_imap_module, zclient); str_append(client->capability_string, " COMPRESS=DEFLATE"); }
static int fs_compress_init(struct fs *_fs, const char *args, const struct fs_settings *set) { struct compress_fs *fs = (struct compress_fs *)_fs; const char *p, *compression_name, *level_str, *error; const char *parent_name, *parent_args; /* get compression handler name */ p = strchr(args, ':'); if (p == NULL) { fs_set_error(_fs, "Compression method not given as parameter"); return -1; } compression_name = t_strdup_until(args, p++); args = p; /* get compression level */ p = strchr(args, ':'); if (p == NULL || p[1] == '\0') { fs_set_error(_fs, "Parent filesystem not given as parameter"); return -1; } level_str = t_strdup_until(args, p++); if (str_to_uint(level_str, &fs->compress_level) < 0 || fs->compress_level < 1 || fs->compress_level > 9) { fs_set_error(_fs, "Invalid compression level parameter '%s'", level_str); return -1; } args = p; fs->handler = compression_lookup_handler(compression_name); if (fs->handler == NULL) { fs_set_error(_fs, "Compression method '%s' not support", compression_name); return -1; } parent_args = strchr(args, ':'); if (parent_args == NULL) { parent_name = args; parent_args = ""; } else { parent_name = t_strdup_until(args, parent_args); parent_args++; } if (fs_init(parent_name, parent_args, set, &_fs->parent, &error) < 0) { fs_set_error(_fs, "%s: %s", parent_name, error); return -1; } return 0; }
static bool cmd_compress(struct client_command_context *cmd) { struct client *client = cmd->client; struct zlib_client *zclient = IMAP_ZLIB_IMAP_CONTEXT(client); const struct compression_handler *handler; const struct imap_arg *args; struct istream *old_input; struct ostream *old_output; const char *mechanism, *value; unsigned int level; /* <mechanism> */ if (!client_read_args(cmd, 0, 0, &args)) return FALSE; if (!imap_arg_get_atom(args, &mechanism) || !IMAP_ARG_IS_EOL(&args[1])) { client_send_command_error(cmd, "Invalid arguments."); return TRUE; } if (zclient->handler != NULL) { client_send_tagline(cmd, t_strdup_printf( "NO [COMPRESSIONACTIVE] COMPRESSION=%s already enabled.", t_str_ucase(zclient->handler->name))); return TRUE; } if (client->tls_compression) { client_send_tagline(cmd, "NO [COMPRESSIONACTIVE] TLS compression already enabled."); return TRUE; } handler = compression_lookup_handler(t_str_lcase(mechanism)); if (handler == NULL || handler->create_istream == NULL) { client_send_tagline(cmd, "NO Unknown compression mechanism."); return TRUE; } imap_zlib_client_skip_line(client); client_send_tagline(cmd, "OK Begin compression."); value = mail_user_plugin_getenv(client->user, "imap_zlib_compress_level"); if (value == NULL || str_to_uint(value, &level) < 0 || level <= 0 || level > 9) level = IMAP_COMPRESS_DEFAULT_LEVEL; old_input = client->input; old_output = client->output; client->input = handler->create_istream(old_input, FALSE); client->output = handler->create_ostream(old_output, level); /* preserve output offset so that the bytes out counter in logout message doesn't get reset here */ client->output->offset = old_output->offset; i_stream_unref(&old_input); o_stream_unref(&old_output); client_update_imap_parser_streams(client); zclient->handler = handler; return TRUE; }