# Try to link with gmime24
IF(NOT GMIME2_FOUND)
- pkg_check_modules(GMIME2 REQUIRED gmime-2.4)
- SET(GMIME24 "yes")
+ pkg_check_modules(GMIME24 REQUIRED gmime-2.4)
+ SET(GMIME24 "yes")
+ # Gmime2
+ FOREACH(arg ${GMIME24_CFLAGS})
+ SET(GMIME_CFLAGS "${GMIME_CFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME24_CFLAGS})
+
+ IF(ENABLE_STATIC MATCHES "ON")
+ FOREACH(arg ${GMIME24_STATIC_LDFLAGS})
+ SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME24_LDFLAGS})
+ ELSE(ENABLE_STATIC MATCHES "ON")
+ FOREACH(arg ${GMIME24_LDFLAGS})
+ SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME24_LDFLAGS})
+ ENDIF(ENABLE_STATIC MATCHES "ON")
+ INCLUDE_DIRECTORIES(${GMIME24_INCLUDE_DIRS})
+ LINK_DIRECTORIES(${GMIME24_LIBRARY_DIRS})
+ELSE(NOT GMIME2_FOUND)
+ # Gmime2
+ FOREACH(arg ${GMIME2_CFLAGS})
+ SET(GMIME_CFLAGS "${GMIME_CFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME2_CFLAGS})
+
+ IF(ENABLE_STATIC MATCHES "ON")
+ FOREACH(arg ${GMIME2_STATIC_LDFLAGS})
+ SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME2_LDFLAGS})
+ ELSE(ENABLE_STATIC MATCHES "ON")
+ FOREACH(arg ${GMIME2_LDFLAGS})
+ SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
+ ENDFOREACH(arg ${GMIME2_LDFLAGS})
+ ENDIF(ENABLE_STATIC MATCHES "ON")
+ INCLUDE_DIRECTORIES(${GMIME2_INCLUDE_DIRS})
+ LINK_DIRECTORIES(${GMIME2_LIBRARY_DIRS})
ENDIF(NOT GMIME2_FOUND)
-IF(NOT GLIB2_FOUND OR NOT GMIME2_FOUND)
+
+IF(NOT GLIB2_FOUND OR (NOT GMIME2_FOUND AND NOT GMIME24_FOUND))
MESSAGE(FATAL_ERROR "Error: gmime2 and glib2 are required for rspamd")
-ENDIF(NOT GLIB2_FOUND OR NOT GMIME2_FOUND)
+ENDIF(NOT GLIB2_FOUND OR (NOT GMIME2_FOUND AND NOT GMIME24_FOUND))
# Make from ; separated list normal space separated list
# Glib2
SET(GLIB_LDFLAGS "${GLIB_LDFLAGS} ${arg}")
ENDFOREACH(arg ${GLIB2_LDFLAGS})
ENDIF(ENABLE_STATIC MATCHES "ON")
-# Gmime2
-FOREACH(arg ${GMIME2_CFLAGS})
- SET(GMIME_CFLAGS "${GMIME_CFLAGS} ${arg}")
-ENDFOREACH(arg ${GMIME2_CFLAGS})
-
-IF(ENABLE_STATIC MATCHES "ON")
- FOREACH(arg ${GMIME2_STATIC_LDFLAGS})
- SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
- ENDFOREACH(arg ${GMIME2_LDFLAGS})
-ELSE(ENABLE_STATIC MATCHES "ON")
- FOREACH(arg ${GMIME2_LDFLAGS})
- SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
- ENDFOREACH(arg ${GMIME2_LDFLAGS})
-ENDIF(ENABLE_STATIC MATCHES "ON")
INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
-INCLUDE_DIRECTORIES(${GMIME2_INCLUDE_DIRS})
LINK_DIRECTORIES(${GLIB2_LIBRARY_DIRS})
-LINK_DIRECTORIES(${GMIME2_LIBRARY_DIRS})
SET(CMAKE_REQUIRED_LIBRARIES m)
SET(CMAKE_REQUIRED_INCLUDES sys/mman.h stdlib.h stdio.h unistd.h time.h sched.h)
TARGET_LINK_LIBRARIES(rspamd event)
TARGET_LINK_LIBRARIES(rspamd rspamd_json)
TARGET_LINK_LIBRARIES(rspamd ${GLIB2_LIBRARIES})
-TARGET_LINK_LIBRARIES(rspamd ${GMIME2_LIBRARIES})
+IF(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(rspamd ${GMIME2_LIBRARIES})
+ELSE(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(rspamd ${GMIME24_LIBRARIES})
+ENDIF(GMIME2_FOUND)
IF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(rspamd ${PCRE_LIBRARIES})
ENDIF(ENABLE_STATIC MATCHES "ON")
ENDIF(LIBUTIL_LIBRARY)
TARGET_LINK_LIBRARIES(test/rspamd-test event)
TARGET_LINK_LIBRARIES(test/rspamd-test ${GLIB2_LIBRARIES})
-TARGET_LINK_LIBRARIES(test/rspamd-test ${GMIME2_LIBRARIES})
+IF(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(test/rspamd-test ${GMIME2_LIBRARIES})
+ELSE(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(test/rspamd-test ${GMIME24_LIBRARIES})
+ENDIF(GMIME2_FOUND)
IF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(test/rspamd-test ${PCRE_LIBRARIES})
ENDIF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(utils/url-extracter util)
ENDIF(LIBUTIL_LIBRARY)
TARGET_LINK_LIBRARIES(utils/url-extracter ${GLIB2_LIBRARIES})
-TARGET_LINK_LIBRARIES(utils/url-extracter ${GMIME2_LIBRARIES})
+IF(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(utils/url-extracter ${GMIME2_LIBRARIES})
+ELSE(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(utils/url-extracter ${GMIME24_LIBRARIES})
+ENDIF(GMIME2_FOUND)
IF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(utils/url-extracter ${PCRE_LIBRARIES})
ENDIF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(utils/expression-parser util)
ENDIF(LIBUTIL_LIBRARY)
TARGET_LINK_LIBRARIES(utils/expression-parser ${GLIB2_LIBRARIES})
-TARGET_LINK_LIBRARIES(utils/expression-parser ${GMIME2_LIBRARIES})
+IF(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(utils/expression-parser ${GMIME2_LIBRARIES})
+ELSE(GMIME2_FOUND)
+ TARGET_LINK_LIBRARIES(utils/expression-parser ${GMIME24_LIBRARIES})
+ENDIF(GMIME2_FOUND)
IF(ENABLE_STATIC MATCHES "ON")
TARGET_LINK_LIBRARIES(utils/expression-parser ${PCRE_LIBRARIES})
ENDIF(ENABLE_STATIC MATCHES "ON")
part = g_mime_message_get_mime_part (task->message);
if (part) {
ct = g_mime_object_get_content_type (part);
+#ifndef GMIME24
g_object_unref (part);
+#endif
if ((param_data = g_mime_content_type_get_parameter ((GMimeContentType *)ct, param_name)) == NULL) {
return FALSE;
part = g_mime_message_get_mime_part (task->message);
if (part) {
ct = g_mime_object_get_content_type (part);
+#ifndef GMIME24
g_object_unref (part);
+#endif
debug_task ("checking %s param", param_name);
return TRUE;
}
-/* In gmime24 this function is opaque, so define it here to avoid errors when compiling with gmime24 */
-typedef struct {
- char *type;
- char *subtype;
-
- GMimeParam *params;
- GHashTable *param_hash;
-} localContentType;
-
gboolean
rspamd_content_type_is_subtype (struct worker_task *task, GList * args, void *unused)
{
struct rspamd_regexp *re;
struct expression_argument *arg;
GMimeObject *part;
- const localContentType *ct;
+ GMimeContentType *ct;
int r;
if (args == NULL) {
param_pattern = arg->data;
part = g_mime_message_get_mime_part (task->message);
if (part) {
- ct = (const localContentType *)g_mime_object_get_content_type (part);
+ ct = g_mime_object_get_content_type (part);
+#ifndef GMIME24
g_object_unref (part);
+#endif
- if (ct == NULL) {
+ if (ct == NULL ) {
return FALSE;
}
}
else {
/* Just do strcasecmp */
- if (g_ascii_strcasecmp (ct->subtype, param_pattern) == 0) {
+ if (ct->subtype && g_ascii_strcasecmp (ct->subtype, param_pattern) == 0) {
return TRUE;
}
}
char *param_pattern;
struct rspamd_regexp *re;
GMimeObject *part;
- const localContentType *ct;
+ GMimeContentType *ct;
struct expression_argument *arg;
int r;
part = g_mime_message_get_mime_part (task->message);
if (part) {
- ct = (const localContentType *)g_mime_object_get_content_type (part);
+ ct = g_mime_object_get_content_type (part);
+#ifndef GMIME24
g_object_unref (part);
+#endif
if (ct == NULL) {
return FALSE;
}
else {
/* Just do strcasecmp */
- if (g_ascii_strcasecmp (ct->type, param_pattern) == 0) {
+ if (ct->type && g_ascii_strcasecmp (ct->type, param_pattern) == 0) {
return TRUE;
}
}
addr = internet_address_list_get_address ((InternetAddressList *)cur, i);
current.addr = (char *)internet_address_get_name (addr);
if (previous.addr != NULL) {
- if (g_ascii_strcasecmp (current.addr, previous.addr) < 0) {
+ if (current.addr && g_ascii_strcasecmp (current.addr, previous.addr) < 0) {
res = FALSE;
break;
}
addr = internet_address_list_get_address (cur);
current.addr = internet_address_get_addr (addr);
if (previous.addr != NULL) {
- if (g_ascii_strcasecmp (current.addr, previous.addr) < 0) {
+ if (current_addr && g_ascii_strcasecmp (current.addr, previous.addr) < 0) {
res = FALSE;
break;
}
}
static inline gboolean
-compare_subtype (struct worker_task *task, const localContentType * ct, char *subtype)
+compare_subtype (struct worker_task *task, GMimeContentType * ct, char *subtype)
{
struct rspamd_regexp *re;
int r;
}
else {
/* Just do strcasecmp */
- if (g_ascii_strcasecmp (ct->subtype, subtype) == 0) {
+ if (ct->subtype && g_ascii_strcasecmp (ct->subtype, subtype) == 0) {
return TRUE;
}
}
struct rspamd_regexp *re;
struct mime_part *part;
GList *cur;
- const localContentType *ct;
+ GMimeContentType *ct;
int r;
cur = g_list_first (task->parts);
while (cur) {
part = cur->data;
- ct = (localContentType *) part->type;
+ ct = part->type;
if (ct == NULL) {
cur = g_list_next (cur);
continue;
re_cache_add (param_type, re, task->cfg->cfg_pool);
}
if ((r = task_cache_check (task, re)) == -1) {
- if (g_regex_match (re->regexp, ct->type, 0, NULL) == TRUE) {
+ if (ct->type && g_regex_match (re->regexp, ct->type, 0, NULL) == TRUE) {
if (param_subtype) {
if (compare_subtype (task, ct, param_subtype)) {
if (compare_len (part, min_len, max_len)) {
}
else {
/* Just do strcasecmp */
- if (g_ascii_strcasecmp (ct->type, param_type) == 0) {
+ if (ct->type && g_ascii_strcasecmp (ct->type, param_type) == 0) {
if (param_subtype) {
if (compare_subtype (task, ct, param_subtype)) {
if (compare_len (part, min_len, max_len)) {
debug_task ("got encoding in part: %d and compare with %d", (int)part_enc, (int)enc_req);
+#ifndef GMIME24
g_object_unref (part);
+#endif
return part_enc == enc_req;
}
+#ifndef GMIME24
g_object_unref (part);
+#endif
}
return FALSE;
}
else if (GMIME_IS_MULTIPART (part)) {
/* multipart/mixed, multipart/alternative, multipart/related, multipart/signed, multipart/encrypted, etc... */
-
+#ifndef GMIME24
+ debug_task ("detected multipart part");
/* we'll get to finding out if this is a signed/encrypted multipart later... */
if (task->parser_recursion++ < RECURSION_LIMIT) {
g_mime_multipart_foreach ((GMimeMultipart *) part, mime_foreach_callback, task);
msg_err ("endless recursion detected: %d", task->parser_recursion);
return;
}
+#endif
+ /* XXX: do nothing with multiparts in gmime 2.4 */
}
else if (GMIME_IS_PART (part)) {
/* a normal leaf part, could be text/plain or image/jpeg etc */
#endif
}
wrapper = g_mime_part_get_content_object (GMIME_PART (part));
+#ifdef GMIME24
+ if (wrapper != NULL && GMIME_IS_DATA_WRAPPER (wrapper)) {
+#else
if (wrapper != NULL) {
+#endif
part_stream = g_mime_stream_mem_new ();
if (g_mime_data_wrapper_write_to_stream (wrapper, part_stream) != -1) {
g_mime_stream_mem_set_owner (GMIME_STREAM_MEM (part_stream), FALSE);
if (task->is_mime) {
- debug_task ("construct mime parser from string length %ld", (long int)task->msg->len);
+ debug_task ("construct mime parser from string length %d", (int)task->msg->len);
/* create a new parser object to parse the stream */
parser = g_mime_parser_new_with_stream (stream);
g_object_unref (stream);
GMimeHeaderIter *iter;
const char *name;
- if (g_mime_header_list_get_iter (ls, iter)) {
+ if (ls == NULL) {
+ *ret = NULL;
+ return;
+ }
+
+ iter = g_mime_header_iter_new ();
+ if (g_mime_header_list_get_iter (ls, iter) && g_mime_header_iter_first (iter)) {
while (g_mime_header_iter_is_valid (iter)) {
name = g_mime_header_iter_get_name (iter);
if (!g_strncasecmp (field, name, strlen (name))) {
}
}
}
+ g_mime_header_iter_free (iter);
}
#endif
#endif
{
struct multipart_cb_data *data = user_data;
+#ifndef GMIME24
struct raw_header *h;
+#endif
GList *l = NULL;
- if (data->try_search && GMIME_IS_PART (part)) {
+ if (data->try_search && part != NULL && GMIME_IS_PART (part)) {
#ifdef GMIME24
GMimeHeaderList *ls;
- ls = GMIME_OBJECT (part)->headers;
+ ls = g_mime_object_get_header_list (GMIME_OBJECT (part));
header_iterate (data->pool, ls, &l, data->field);
#else
h = part->headers->headers;
gret = cb.ret;
}
}
+#ifndef GMIME24
g_object_unref (part);
+#endif
}
}
/* Try to iterate with mime part headers */
part = g_mime_message_get_mime_part (message);
if (part) {
- ls = part->headers;
+ ls = g_mime_object_get_header_list (GMIME_OBJECT (part));
header_iterate (pool, ls, &gret, field);
if (gret == NULL && GMIME_IS_MULTIPART (part)) {
g_mime_multipart_foreach (GMIME_MULTIPART (part), multipart_iterate, &cb);
gret = cb.ret;
}
}
+#ifndef GMIME24
g_object_unref (part);
+#endif
}
}
"To", NULL, local_message_get_recipients_to, NULL, NULL, local_message_add_recipients_from_string_to, FUNC_IA}, {
"Cc", NULL, local_message_get_recipients_cc, NULL, NULL, local_message_add_recipients_from_string_cc, FUNC_IA}, {
"Bcc", NULL, local_message_get_recipients_bcc, NULL, NULL, local_message_add_recipients_from_string_bcc, FUNC_IA}, {
- "Date", g_mime_message_get_date_as_string, NULL, NULL, local_mime_message_set_date_from_string, NULL, FUNC_CHARFREEPTR},
+ "Date", (GetFunc)g_mime_message_get_date_as_string, NULL, NULL, local_mime_message_set_date_from_string, NULL, FUNC_CHARFREEPTR},
#endif
{
"Subject", g_mime_message_get_subject, NULL, NULL, g_mime_message_set_subject, NULL, FUNC_CHARPTR}, {
NULL, NULL, NULL, local_message_get_header, NULL, g_mime_message_add_header, FUNC_LIST}
#else
{
- NULL, NULL, NULL, local_message_get_header, NULL, g_mime_object_append_header, FUNC_LIST}
+ NULL, NULL, NULL, local_message_get_header, NULL, (SetListFunc)g_mime_object_append_header, FUNC_LIST}
#endif
};
}
#else
i = internet_address_list_length (ia);
- while (i > 0) {
+ while (--i >= 0) {
ia_string = internet_address_to_string (internet_address_list_get_address (ia, i), FALSE);
if (pool != NULL) {
memory_pool_add_destructor (pool, (pool_destruct_func) g_free, ia_string);
}
gret = g_list_prepend (gret, ia_string);
- --i;
}
#endif
break;
bzero (ip_buf, sizeof (ip_buf));
bzero (mask_buf, sizeof (mask_buf));
pos = begin;
+ p = ip_buf;
while (*pos) {
switch (state) {