diff --git a/include/detect.h b/include/detect.h index c9b9f2b..08a0def 100644 --- a/include/detect.h +++ b/include/detect.h @@ -23,6 +23,7 @@ #include "attach.h" bool detect_pgp(struct email_t* mail); +bool detect_dkim(struct email_t* mail); char* detect_start_of_body(char* message); char* detect_end_of_body(char* message); #endif /* DETECT_H */ diff --git a/include/tools.h b/include/tools.h index 3483fe9..48f7362 100644 --- a/include/tools.h +++ b/include/tools.h @@ -23,4 +23,5 @@ const char* insert_string(char * destination, const char* source, size_t dest_orig_len, size_t offset); + #endif /* TOOLS_H */ diff --git a/src/attach.c b/src/attach.c index 4feedde..2ca2b5a 100644 --- a/src/attach.c +++ b/src/attach.c @@ -83,17 +83,16 @@ char* attach_files(char* message, size_t len){ struct email_t email = mail_from_text(message,len); - printf("Received message header: [%.*s]\n", email.header_len, - email.message); - printf("Received message body: [%.*s]\n", - email.message_length-email.body_offset, - email.message + email.body_offset); - /* Check if mails are signed/encrypted, and abort if nescessary */ if(abort_on_pgp && detect_pgp(&email)){ printf("PGP detected, aborting..."); return email.message; } + /* Check if mails are signed/encrypted, and abort if nescessary */ + if(abort_on_dkim && detect_dkim(&email)){ + printf("DKIM signature detected, aborting..."); + return email.message; + } return email.message; } diff --git a/src/detect.c b/src/detect.c index e32322a..bcf96cc 100644 --- a/src/detect.c +++ b/src/detect.c @@ -29,6 +29,11 @@ char* pgp_signatures[] = "-----BEGIN PGP MESSAGE-----" }; +char* dkim_signatures[] = +{ + "DKIM-Signature:" +}; + bool detect_pgp(struct email_t* mail){ size_t points = 0; @@ -45,6 +50,23 @@ bool detect_pgp(struct email_t* mail){ return points >= 2; } +bool detect_dkim(struct email_t* mail){ + + size_t points = 0; + + for(size_t i = 0; i < (sizeof(dkim_signatures)/sizeof(char*));i++){ + if(strcasestr(mail->message, dkim_signatures[i]) != NULL + && strcasestr(mail->message, dkim_signatures[i]) + <= (mail->message+mail->header_len)){ + points++; + } + + } + + + return points >= 1; +} + /* If body hasn't started yet, it returns NULL, if it has started, it returns * the pointer to the beginning of the newline. */ diff --git a/src/main.c b/src/main.c index d51c9de..99bdd72 100644 --- a/src/main.c +++ b/src/main.c @@ -63,8 +63,10 @@ int main(int argc, char* argv[]){ printf("Incoming port: %u outgoing port: %u on loopback interface\n", listen_port, forward_port); + printf("Ignoring PGP signed/encrypted messages: %s\n", abort_on_pgp ? "true":false); + printf("Ignoring DKIM signed messages: %s\n", abort_on_dkim ? "true" : "false");