1 /* spmfilter - mail filtering framework
2  * Copyright (C) 2009-2012 Axel Steiner and SpaceNet AG
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 3 of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include <assert.h>
19 #include <cmime.h>
20 
21 #include "smf_email_address.h"
22 #include "smf_core.h"
23 
24 #define THIS_MODULE "email_address"
25 
smf_email_address_new(void)26 SMFEmailAddress_T *smf_email_address_new(void) {
27     CMimeAddress_T *ea = cmime_address_new();
28 
29     return (SMFEmailAddress_T *)ea;
30 }
31 
smf_email_address_free(SMFEmailAddress_T * ea)32 void smf_email_address_free(SMFEmailAddress_T *ea) {
33     assert(ea);
34     cmime_address_free((CMimeAddress_T *)ea);
35 }
36 
smf_email_address_parse_string(const char * addr)37 SMFEmailAddress_T *smf_email_address_parse_string(const char *addr) {
38     CMimeAddress_T *a = NULL;
39 
40     assert(addr);
41 
42     a = cmime_address_parse_string(addr);
43     return (SMFEmailAddress_T *)a;
44 }
45 
smf_email_address_to_string(SMFEmailAddress_T * ea)46 char *smf_email_address_to_string(SMFEmailAddress_T *ea) {
47     assert(ea);
48     return (char *)cmime_address_to_string((CMimeAddress_T *)ea);
49 }
50 
smf_email_address_set_type(SMFEmailAddress_T * ea,SMFEmailAddressType_T t)51 void smf_email_address_set_type(SMFEmailAddress_T *ea, SMFEmailAddressType_T t) {
52     assert(ea);
53     cmime_address_set_type((CMimeAddress_T *)ea,(CMimeAddressType_T )t);
54 }
55 
smf_email_address_get_type(SMFEmailAddress_T * ea)56 SMFEmailAddressType_T smf_email_address_get_type(SMFEmailAddress_T *ea) {
57     assert(ea);
58 
59     return (SMFEmailAddressType_T)cmime_address_get_type((CMimeAddress_T *)ea);
60 }
61 
smf_email_address_set_name(SMFEmailAddress_T * ea,const char * name)62 void smf_email_address_set_name(SMFEmailAddress_T *ea, const char *name) {
63     assert(ea);
64     assert(name);
65 
66     cmime_address_set_name((CMimeAddress_T *)ea,name);
67 }
68 
smf_email_address_get_name(SMFEmailAddress_T * ea)69 char *smf_email_address_get_name(SMFEmailAddress_T *ea) {
70     assert(ea);
71 
72     return (char *)cmime_address_get_name((CMimeAddress_T *)ea);
73 }
74 
smf_email_address_set_email(SMFEmailAddress_T * ea,const char * email)75 void smf_email_address_set_email(SMFEmailAddress_T *ea, const char *email) {
76     assert(ea);
77     assert(email);
78 
79     cmime_address_set_email((CMimeAddress_T *)ea,email);
80 }
81 
smf_email_address_get_email(SMFEmailAddress_T * ea)82 char *smf_email_address_get_email(SMFEmailAddress_T *ea) {
83     assert(ea);
84 
85     return (char *)cmime_address_get_email((CMimeAddress_T *)ea);
86 }
87 
smf_email_address_is_empty(SMFEmailAddress_T * ea)88 int smf_email_address_is_empty(SMFEmailAddress_T *ea) {
89     char *p;
90 
91     assert(ea != NULL);
92 
93     p = strchr(ea->email, '<');
94     if (p != NULL)
95         p++;
96     else
97         p = ea->email;
98 
99     while (*p != '>' && *p != '\0') {
100         if (!isspace(*p))
101             return 0;
102         p++;
103     }
104 
105     return 1;
106 }
107 
smf_email_address_get_simplified(SMFEmailAddress_T * ea)108 SMFEmailAddress_T *smf_email_address_get_simplified(SMFEmailAddress_T *ea) {
109     SMFEmailAddress_T *result;
110     char *email;
111 
112     assert(ea != NULL);
113     assert(ea->email != NULL);
114 
115     result = smf_email_address_parse_string(ea->email);
116     email = smf_email_address_get_email(result);
117 
118     if (*email == '<') { /* angle-addr format */
119         char *end;
120 
121         email = strdup(email + 1);
122         if ((end = strchr(email, '>')) != NULL)
123             *end = '\0';
124     } else {
125         email = strdup(email);
126     }
127 
128     smf_core_strstrip(email);
129     smf_email_address_set_email(result, email);
130     free(email);
131 
132     return result;
133 }
134 
135