go-xmpp/jid.go

64 lines
1.2 KiB
Go
Raw Normal View History

package xmpp // import "gosrc.io/xmpp"
import (
"errors"
"strings"
"unicode"
)
type Jid struct {
username string
domain string
resource string
}
func NewJid(sjid string) (*Jid, error) {
s1 := strings.SplitN(sjid, "@", 2)
if len(s1) != 2 {
return nil, errors.New("invalid JID, missing domain: " + sjid)
}
jid := new(Jid)
jid.username = s1[0]
if !isUsernameValid(jid.username) {
return jid, errors.New("invalid domain: " + jid.username)
}
s2 := strings.SplitN(s1[1], "/", 2)
jid.domain = s2[0]
if !isDomainValid(jid.domain) {
return jid, errors.New("invalid domain: " + jid.domain)
}
if len(s2) == 2 {
jid.resource = s2[1]
}
return jid, nil
}
func isUsernameValid(username string) bool {
invalidRunes := []rune{'@', '/', '\'', '"', ':', '<', '>'}
return strings.IndexFunc(username, isInvalid(invalidRunes)) < 0
}
func isDomainValid(domain string) bool {
invalidRunes := []rune{'@', '/'}
return strings.IndexFunc(domain, isInvalid(invalidRunes)) < 0
}
func isInvalid(invalidRunes []rune) func(c rune) bool {
isInvalid := func(c rune) bool {
if unicode.IsSpace(c) {
return true
}
for _, r := range invalidRunes {
if c == r {
return true
}
}
return false
}
return isInvalid
}