Add v6 support, clean some v6 strings. Use net.IP instead of string for ip

This commit is contained in:
Dolf Schimmel (Freeaqingme)
2015-08-30 18:28:12 +02:00
parent 58aa384948
commit 8e2bf6712b

35
spf2.go
View File

@@ -4,12 +4,17 @@ package libspf2
#cgo LDFLAGS: -L/usr/local/lib -L/usr/lib -lspf2 #cgo LDFLAGS: -L/usr/local/lib -L/usr/lib -lspf2
#cgo CFLAGS: -g -O2 -Wno-error -I/usr/include -I/usr/local/include #cgo CFLAGS: -g -O2 -Wno-error -I/usr/include -I/usr/local/include
#include <stdio.h> #include <stdlib.h>
#include <netdb.h> #include <netdb.h>
#include <spf2/spf.h> #include <spf2/spf.h>
*/ */
import "C" import "C"
import "errors"
import (
"errors"
"net"
"unsafe"
)
const ( const (
SPFResultINVALID = Result(C.SPF_RESULT_INVALID) // (invalid) SPFResultINVALID = Result(C.SPF_RESULT_INVALID) // (invalid)
@@ -23,7 +28,7 @@ const (
) )
type Client interface { type Client interface {
Query(host, ip string) (Result, error) Query(host string, ip net.IP) (Result, error)
Close() Close()
} }
@@ -38,7 +43,7 @@ func NewClient() Client {
return client return client
} }
func (s *clientImpl) Query(host, ip string) (Result, error) { func (s *clientImpl) Query(host string, ip net.IP) (Result, error) {
if s.s == nil { if s.s == nil {
return SPFResultINVALID, errors.New("client already closed") return SPFResultINVALID, errors.New("client already closed")
} }
@@ -47,7 +52,7 @@ func (s *clientImpl) Query(host, ip string) (Result, error) {
if err := req.setEnvFrom(host); err != nil { if err := req.setEnvFrom(host); err != nil {
return SPFResultINVALID, err return SPFResultINVALID, err
} }
if err := req.setIPv4Addr(ip); err != nil { if err := req.setIpAddr(ip); err != nil {
return SPFResultINVALID, err return SPFResultINVALID, err
} }
resp, err := req.query() resp, err := req.query()
@@ -77,20 +82,28 @@ func newRequest(s *clientImpl) *request {
return r return r
} }
// SetIPv4Addr sets the sender IPv4 // SetIPAddr sets the IP address of the client (sending) MTA
func (r *request) setIPv4Addr(addr string) error { func (r *request) setIpAddr(ip net.IP) error {
var stat C.SPF_errcode_t var stat C.SPF_errcode_t
stat = C.SPF_request_set_ipv4_str(r.r, C.CString(addr)) cstring := C.CString(ip.String())
defer C.free(unsafe.Pointer(cstring))
if ip.To4() != nil {
stat = C.SPF_request_set_ipv4_str(r.r, cstring)
} else {
stat = C.SPF_request_set_ipv6_str(r.r, cstring)
}
if stat != C.SPF_E_SUCCESS { if stat != C.SPF_E_SUCCESS {
return &spfError{stat} return &spfError{stat}
} }
return nil return nil
} }
// SetEnvFrom sets the sender host // SetEnvFrom sets the envelope from email address from the SMTP MAIL FROM: command
func (r *request) setEnvFrom(fromHost string) error { func (r *request) setEnvFrom(from string) error {
var stat C.int var stat C.int
stat = C.SPF_request_set_env_from(r.r, C.CString(fromHost)) cstring := C.CString(from)
defer C.free(unsafe.Pointer(cstring))
stat = C.SPF_request_set_env_from(r.r, cstring)
if stat != C.int(C.SPF_E_SUCCESS) { if stat != C.int(C.SPF_E_SUCCESS) {
return &spfError{C.SPF_errcode_t(stat)} return &spfError{C.SPF_errcode_t(stat)}
} }