parse_spf_ip4 (struct spf_record *rec, struct spf_addr *addr)
{
/* ip4:addr[/mask] */
+ const gchar *semicolon, *slash;
+ gsize len;
+ gchar ipbuf[INET_ADDRSTRLEN + 1];
+ guint32 mask;
CHECK_REC (rec);
- return parse_spf_ipmask (addr->spf_string, addr, rec);
+
+ semicolon = strchr (addr->spf_string, ':');
+
+ if (semicolon == NULL) {
+ return FALSE;
+ }
+
+ semicolon ++;
+ slash = strchr (semicolon, '/');
+
+ if (slash) {
+ len = slash - semicolon;
+ }
+ else {
+ len = strlen (semicolon);
+ }
+
+ rspamd_strlcpy (ipbuf, semicolon, MIN (len, sizeof (ipbuf)));
+
+ if (inet_pton (AF_INET, ipbuf, addr->addr4) != 1) {
+ return FALSE;
+ }
+
+ if (slash) {
+ mask = strtoul (slash + 1, NULL, 10);
+ if (mask > 32) {
+ return FALSE;
+ }
+ addr->m.dual.mask_v4 = mask;
+ }
+
+ addr->flags |= RSPAMD_SPF_FLAG_IPV4;
+
+ return TRUE;
}
static gboolean
parse_spf_ip6 (struct spf_record *rec, struct spf_addr *addr)
{
/* ip6:addr[/mask] */
+ const gchar *semicolon, *slash;
+ gsize len;
+ gchar ipbuf[INET6_ADDRSTRLEN + 1];
+ guint32 mask;
CHECK_REC (rec);
- return parse_spf_ipmask (addr->spf_string, addr, rec);
+
+ semicolon = strchr (addr->spf_string, ':');
+
+ if (semicolon == NULL) {
+ return FALSE;
+ }
+
+ semicolon ++;
+ slash = strchr (semicolon, '/');
+
+ if (slash) {
+ len = slash - semicolon;
+ }
+ else {
+ len = strlen (semicolon);
+ }
+
+ rspamd_strlcpy (ipbuf, semicolon, MIN (len, sizeof (ipbuf)));
+
+ if (inet_pton (AF_INET6, ipbuf, addr->addr4) != 1) {
+ return FALSE;
+ }
+
+ if (slash) {
+ mask = strtoul (slash + 1, NULL, 10);
+ if (mask > 128) {
+ return FALSE;
+ }
+ addr->m.dual.mask_v6 = mask;
+ }
+
+ addr->flags |= RSPAMD_SPF_FLAG_IPV6;
+
+ return TRUE;
}
} spf_action_t;
#define RSPAMD_SPF_FLAG_IPV6 (1 << 0)
-#define RSPAMD_SPF_FLAG_ANY (1 << 1)
-#define RSPAMD_SPF_FLAG_PARSED (1 << 2)
-#define RSPAMD_SPF_FLAG_VALID (1 << 3)
-#define RSPAMD_SPF_FLAG_REFRENCE (1 << 4)
+#define RSPAMD_SPF_FLAG_IPV4 (1 << 1)
+#define RSPAMD_SPF_FLAG_ANY (1 << 2)
+#define RSPAMD_SPF_FLAG_PARSED (1 << 3)
+#define RSPAMD_SPF_FLAG_VALID (1 << 4)
+#define RSPAMD_SPF_FLAG_REFRENCE (1 << 5)
struct spf_addr {
guchar addr6[sizeof (struct in6_addr)];