package xmpp import ( "encoding/xml" "fmt" "log" "math/rand" ) // domainpart extracts the domain name from a JID / XMPP address. See // https://datatracker.ietf.org/doc/html/rfc7622#section-3.2 for details. func domainpart(jid string) string { list := []rune(jid) for i, v := range list { if v == '/' { list = list[:i] break } } for i, v := range list { if v == '@' { list = list[i+1:] break } } return string(list) } func username(jid string) string { list := []rune(jid) for i, v := range list { if v == '@' { return string(list[:i]) } } return "" } func hasBind(e []xml.Token) bool { bind := xml.Name{`urn:ietf:params:xml:ns:xmpp-bind`, `bind`} for _, v := range e { switch s := v.(type) { case xml.StartElement: if s.Name == bind { return true } } } return false } func (s *session) sendBind() { s.resourceReq = fmt.Sprintf("%016x", rand.Uint64()) iqStart := xml.StartElement{ xml.Name{"jabber:client", "iq"}, []xml.Attr{ xml.Attr{xml.Name{"", "id"}, s.resourceReq}, xml.Attr{xml.Name{"", "type"}, "set"}, }, } iqEnd := iqStart.End() bindStart := xml.StartElement{ xml.Name{"urn:ietf:params:xml:ns:xmpp-bind", "bind"}, []xml.Attr{}, } bindEnd := bindStart.End() resourceStart := xml.StartElement{ xml.Name{"", "resource"}, []xml.Attr{}, } resourceEnd := resourceStart.End() name := xml.CharData("limox-" + fmt.Sprintf("%08x", rand.Uint32())) tokens := [...]xml.Token{ iqStart, bindStart, resourceStart, name, resourceEnd, bindEnd, iqEnd, } for _, v := range tokens { err := s.ed.encodeToken(v) if err != nil { log.Println("Could not encode ressource binding!") return } } }