diff options
| author | xengineering <me@xengineering.eu> | 2023-07-06 21:45:31 +0200 | 
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2023-07-06 21:45:31 +0200 | 
| commit | 16d5f079cc51bffe9f07b356f3a42d5a09a45317 (patch) | |
| tree | b370e7c5b220351b9c42f8f19fa30672d8310724 /xmpp | |
| parent | d614346ae08e5384e1dca7306ba64fbdc9931d2e (diff) | |
| parent | 007f413e457ff0b733447acba61b11d6813dd41c (diff) | |
| download | limox-16d5f079cc51bffe9f07b356f3a42d5a09a45317.tar limox-16d5f079cc51bffe9f07b356f3a42d5a09a45317.tar.zst limox-16d5f079cc51bffe9f07b356f3a42d5a09a45317.zip | |
Merge branch 'roster-backend'
Getting the roster (contact list) is crucial to provide a MVP LimoX
since the chats should be grouped by contacts.
For the MVP it is only relevant to get the roster on connect. Everything
else can be done later.
Diffstat (limited to 'xmpp')
| -rw-r--r-- | xmpp/iq.go | 81 | ||||
| -rw-r--r-- | xmpp/jid.go | 50 | ||||
| -rw-r--r-- | xmpp/routing.go | 6 | 
3 files changed, 84 insertions, 53 deletions
| diff --git a/xmpp/iq.go b/xmpp/iq.go new file mode 100644 index 0000000..1cb7fd5 --- /dev/null +++ b/xmpp/iq.go @@ -0,0 +1,81 @@ +package xmpp + +import ( +	"encoding/xml" +	"fmt" +	"log" +	"math/rand" +) + +type iqRx struct { +	XMLName xml.Name `xml:"jabber:client iq"` +	Type    string   `xml:"type,attr"` +	Id      string   `xml:"id,attr"` +	Bind    struct { +		Jid string `xml:"jid"` +	} `xml:"urn:ietf:params:xml:ns:xmpp-bind bind"` +	Query []RosterItem `xml:"jabber:iq:roster query>item"` +} + +type RosterItem struct { +	Jid          string `xml:"jid,attr"` +	Subscription string `xml:"subscription,attr"` +	Name         string `xml:"name,attr"` +} + +func (i iqRx) handle(s *session) { +	if i.Bind.Jid != "" { +		s.jid = i.Bind.Jid +		s.sendPresence() +		s.sendRosterGet() +		return +	} + +	if len(i.Query) > 0 { +		log.Println("Got roster:") +		for _, v := range i.Query { +			log.Printf("- %s\n", v.Jid) +		} +	} +} + +type bindSet struct { +	XMLName xml.Name `xml:"jabber:client iq"` +	Type    string   `xml:"type,attr,omitempty"` +	Id      string   `xml:"id,attr,omitempty"` +	Bind    struct { +		Resource string `xml:"resource,omitempty"` +	} `xml:"urn:ietf:params:xml:ns:xmpp-bind bind,omitempty"` +} + +func (s *session) sendBind() { +	s.resourceReq = fmt.Sprintf("%016x", rand.Uint64()) + +	req := bindSet{} +	req.Id = s.resourceReq +	req.Type = "set" +	req.Bind.Resource = "limox-" + fmt.Sprintf("%08x", rand.Uint32()) + +	err := s.tx.Encode(req) +	if err != nil { +		log.Println("Could not encode ressource binding!") +	} +} + +type rosterGet struct { +	XMLName xml.Name `xml:"jabber:client iq"` +	Type    string   `xml:"type,attr,omitempty"` +	Id      string   `xml:"id,attr,omitempty"` +	Query   string   `xml:"jabber:iq:roster query"` +} + +func (s *session) sendRosterGet() { +	req := rosterGet{} +	req.Id = fmt.Sprintf("%016x", rand.Uint64()) +	req.Type = "get" + +	err := s.tx.Encode(req) +	if err != nil { +		log.Println("Could not encode ressource binding!") +	} +} diff --git a/xmpp/jid.go b/xmpp/jid.go index 9580ad5..90c1509 100644 --- a/xmpp/jid.go +++ b/xmpp/jid.go @@ -1,12 +1,5 @@  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 { @@ -40,46 +33,3 @@ func username(jid string) string {  	return ""  } - -type bindRequest struct { -	Bind struct { -		Xmlns    string `xml:"xmlns,attr"` -		Resource struct { -			Content string `xml:",chardata"` -		} `xml:"resource"` -	} `xml:"bind"` -} - -func (s *session) sendBind() { - -	s.resourceReq = fmt.Sprintf("%016x", rand.Uint64()) - -	start := xml.StartElement{ -		xml.Name{"jabber:client", "iq"}, -		[]xml.Attr{ -			xml.Attr{xml.Name{"", "id"}, s.resourceReq}, -			xml.Attr{xml.Name{"", "type"}, "set"}, -		}, -	} - -	inner := bindRequest{} -	inner.Bind.Xmlns = "urn:ietf:params:xml:ns:xmpp-bind" -	inner.Bind.Resource.Content = "limox-" + fmt.Sprintf("%08x", rand.Uint32()) - -	err := s.tx.EncodeElement(inner, start) -	if err != nil { -		log.Println("Could not encode ressource binding!") -	} -} - -type iqResponse struct { -	Jid string `xml:"urn:ietf:params:xml:ns:xmpp-bind bind>jid"` -} - -func handleIqResponse(s *session, i iqResponse) { -	if i.Jid != "" { -		s.jid = i.Jid -		s.sendPresence() -		return -	} -} diff --git a/xmpp/routing.go b/xmpp/routing.go index 2f2347a..4058dfb 100644 --- a/xmpp/routing.go +++ b/xmpp/routing.go @@ -12,7 +12,7 @@ func route(s *xml.StartElement, d *xml.Decoder, c chan<- any) {  	case xml.Name{`urn:ietf:params:xml:ns:xmpp-sasl`, `success`}:  		parse(saslSuccess{}, s, d, c)  	case xml.Name{`jabber:client`, `iq`}: -		parse(iqResponse{}, s, d, c) +		parse(iqRx{}, s, d, c)  	case xml.Name{`jabber:client`, `message`}:  		parse(message{}, s, d, c)  	default: @@ -35,8 +35,8 @@ func handle(s *session, element any) {  		handleStreamFeatures(s, t)  	case saslSuccess:  		handleSaslSuccess(s) -	case iqResponse: -		handleIqResponse(s, t) +	case iqRx: +		t.handle(s)  	case message:  		handleMessage(s, t)  	default: | 
