Implement client resource binding.
This commit is contained in:
parent
23aeb1fd68
commit
ce72493a2f
|
|
@ -21,6 +21,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
log.Printf("Connection established for %s\n", x.JID)
|
||||||
x.Send(xmpp.Presence{})
|
x.Send(xmpp.Presence{})
|
||||||
|
|
||||||
select {}
|
select {}
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,16 @@ func NewClientXMPP(jid JID, password string, config *ClientConfig) (*XMPP, error
|
||||||
continue // Restart
|
continue // Restart
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bind resource.
|
||||||
|
if f.Bind != nil {
|
||||||
|
log.Println("Binding resource.")
|
||||||
|
boundJID, err := bindResource(stream, jid)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
jid = boundJID
|
||||||
|
}
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,6 +123,44 @@ func authenticatePlain(stream *Stream, user, password string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bindResource(stream *Stream, jid JID) (JID, error) {
|
||||||
|
if jid.Resource == "" {
|
||||||
|
return bindResourceServer(stream)
|
||||||
|
}
|
||||||
|
return bindResourceClient(stream, jid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func bindResourceClient(stream *Stream, jid JID) (JID, error) {
|
||||||
|
|
||||||
|
req := Iq{Id: "foo", Type: "set"}
|
||||||
|
req.PayloadEncode(bindIq{Resource: jid.Resource})
|
||||||
|
if err := stream.Send(req); err != nil {
|
||||||
|
return JID{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := Iq{}
|
||||||
|
err := stream.Decode(&resp)
|
||||||
|
if err != nil {
|
||||||
|
return JID{}, err
|
||||||
|
}
|
||||||
|
bindResp := bindIq{}
|
||||||
|
resp.PayloadDecode(&bindResp)
|
||||||
|
log.Printf("%#v\n", bindResp)
|
||||||
|
|
||||||
|
boundJID, err := ParseJID(bindResp.JID)
|
||||||
|
return boundJID, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func bindResourceServer(stream *Stream) (JID, error) {
|
||||||
|
panic("bindResourceServer not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
type bindIq struct {
|
||||||
|
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-bind bind"`
|
||||||
|
Resource string `xml:"resource,omitempty"`
|
||||||
|
JID string `xml:"jid,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
func stringSliceContains(l []string, m string) bool {
|
func stringSliceContains(l []string, m string) bool {
|
||||||
for _, i := range l {
|
for _, i := range l {
|
||||||
if i == m {
|
if i == m {
|
||||||
|
|
@ -126,6 +174,12 @@ type features struct {
|
||||||
XMLName xml.Name `xml:"http://etherx.jabber.org/streams features"`
|
XMLName xml.Name `xml:"http://etherx.jabber.org/streams features"`
|
||||||
StartTLS *tlsStartTLS `xml:"starttls"`
|
StartTLS *tlsStartTLS `xml:"starttls"`
|
||||||
Mechanisms *mechanisms `xml:"mechanisms"`
|
Mechanisms *mechanisms `xml:"mechanisms"`
|
||||||
|
Bind *bind `xml:"bind"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type bind struct {
|
||||||
|
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-bind bind"`
|
||||||
|
Required *required `xml:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type mechanisms struct {
|
type mechanisms struct {
|
||||||
|
|
@ -135,11 +189,10 @@ type mechanisms struct {
|
||||||
|
|
||||||
type tlsStartTLS struct {
|
type tlsStartTLS struct {
|
||||||
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-tls starttls"`
|
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-tls starttls"`
|
||||||
Required *tlsStartTLSRequired `xml:"required"`
|
Required *required `xml:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type tlsStartTLSRequired struct {
|
type required struct {}
|
||||||
}
|
|
||||||
|
|
||||||
type saslSuccess struct {
|
type saslSuccess struct {
|
||||||
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-sasl success"`
|
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-sasl success"`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue