Skip to content
Snippets Groups Projects
Commit 6a1ff206 authored by Stephan Bosch's avatar Stephan Bosch
Browse files

Implemented dynamic sieve_get_capabilities() for proper MANAGESIEVE support.

parent 020fe587
No related branches found
No related tags found
No related merge requests found
#include "lib.h"
#include "str.h"
#include "mempool.h"
#include "hash.h"
#include "array.h"
......@@ -216,7 +217,54 @@ int sieve_extension_get_id(const struct sieve_extension *extension)
return ereg->id;
}
static void sieve_extensions_deinit_registry()
static bool _list_extension(const struct sieve_extension *ext)
{
if ( *ext->name == '@' ) return FALSE;
if ( ext->validator_load == NULL && ext->generator_load == NULL &&
ext->binary_load == NULL && ext->interpreter_load == NULL &&
ext->load == NULL &&
ext->operations.count == 0 && ext->operands.count == 0 ) {
return FALSE;
}
return TRUE;
}
const char *sieve_extensions_get_string(void)
{
unsigned int i = 0, ext_count = array_count(&extensions);
string_t *extstr = t_str_new(256);
if ( ext_count > 0 ) {
const struct sieve_extension * const *ext =
array_idx(&extensions, i);
while ( !_list_extension(*ext) ) {
if ( i < ext_count )
ext = array_idx(&extensions, i);
else
break;
i++;
}
str_append(extstr, (*ext)->name);
while ( i < ext_count ) {
ext = array_idx(&extensions, i);
if ( _list_extension(*ext) ) {
str_append_c(extstr, ' ');
str_append(extstr, (*ext)->name);
}
i++;
}
}
return str_c(extstr);
}
static void sieve_extensions_deinit_registry(void)
{
struct hash_iterate_context *itx =
hash_iterate_init(extension_index);
......
......@@ -38,7 +38,7 @@ struct sieve_extension {
ext->field->count;
/* Opcodes and operands */
#define SIEVE_EXT_DEFINE_NO_OPERATIONS SIEVE_EXT_DEFINE_NO_OBJECTS
#define SIEVE_EXT_DEFINE_OPERATION(OP) SIEVE_EXT_DEFINE_OBJECT(OP)
#define SIEVE_EXT_DEFINE_OPERATIONS(OPS) SIEVE_EXT_DEFINE_OBJECTS(OPS)
......@@ -57,7 +57,7 @@ const struct sieve_extension *sieve_extension_acquire(const char *extension);
/* Extensions state */
bool sieve_extensions_init(const char *sieve_plugins ATTR_UNUSED);
bool sieve_extensions_init(const char *sieve_plugins ATTR_UNUSED);
const int *sieve_extensions_get_preloaded_ext_ids(void);
void sieve_extensions_deinit(void);
......@@ -65,8 +65,10 @@ void sieve_extensions_deinit(void);
int sieve_extension_register(const struct sieve_extension *extension);
int sieve_extensions_get_count(void);
const struct sieve_extension *sieve_extension_get_by_id(unsigned int ext_id);
int sieve_extension_get_by_name(const char *name, const struct sieve_extension **ext);
int sieve_extension_get_id(const struct sieve_extension *extension);
const struct sieve_extension *sieve_extension_get_by_id(unsigned int ext_id);
int sieve_extension_get_by_name(const char *name, const struct sieve_extension **ext);
int sieve_extension_get_id(const struct sieve_extension *extension);
const char *sieve_extensions_get_string(void);
#endif /* __SIEVE_EXTENSIONS_H */
......@@ -225,5 +225,5 @@ void sieve_close(struct sieve_binary **sbin)
const char *sieve_get_capabilities(void)
{
return "fileinto reject envelope encoded-character";
return sieve_extensions_get_string();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.