diff options
| author | xengineering <me@xengineering.eu> | 2023-06-05 18:11:49 +0200 | 
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2023-06-05 18:11:49 +0200 | 
| commit | feb6a5a38ba15d0cf4bd88283093174991e66eaa (patch) | |
| tree | d07f8908c90c873bfc7675d13ef02e7e6037ee2d | |
| parent | 89d44601930f4a9452fd40c2262652b1a847a8cf (diff) | |
| download | limox-feb6a5a38ba15d0cf4bd88283093174991e66eaa.tar limox-feb6a5a38ba15d0cf4bd88283093174991e66eaa.tar.zst limox-feb6a5a38ba15d0cf4bd88283093174991e66eaa.zip | |
Re-implement initial stream start/end
| -rw-r--r-- | xmpp/session.go | 40 | ||||
| -rw-r--r-- | xmpp/stream.go | 9 | 
2 files changed, 49 insertions, 0 deletions
| diff --git a/xmpp/session.go b/xmpp/session.go index db9a079..234c2e6 100644 --- a/xmpp/session.go +++ b/xmpp/session.go @@ -4,6 +4,7 @@ import (  	"crypto/tls"  	"crypto/x509"  	"log" +	"encoding/xml"  )  type SessionConnect struct{} @@ -15,6 +16,7 @@ type session struct {  	in, out   chan any  	transport *tls.Conn  	ed        encoderDecoder +	streams   []stream  }  func StartSession(out chan any, jid string, pwd string) chan any { @@ -23,6 +25,7 @@ func StartSession(out chan any, jid string, pwd string) chan any {  	s.jid = jid  	s.in = make(chan any)  	s.out = out +	s.streams = make([]stream, 0)  	go s.run() @@ -38,6 +41,9 @@ func (s *session) run() {  	s.ed = newEncoderDecoder(s) +	s.openStream() +	defer s.closeStreams() +  	s.out <- SessionConnect{}  	for { @@ -68,3 +74,37 @@ func (s *session) startTransport() error {  	return nil  } + +func (s *session) openStream() { +	stream := stream{} +	stream.session = s + +	start := xml.StartElement{ +		xml.Name{"jabber:client", "stream:stream"}, +		[]xml.Attr{ +			xml.Attr{xml.Name{"", "from"}, s.jid}, +			xml.Attr{xml.Name{"", "to"}, domainpart(s.jid)}, +			xml.Attr{xml.Name{"", "version"}, "1.0"}, +			xml.Attr{xml.Name{"", "xml:lang"}, "en"}, +			xml.Attr{xml.Name{"", "xmlns:stream"}, "http://etherx.jabber.org/streams"}, +		}, +	} + +	stream.end = start.End() + +	err := s.ed.encodeToken(start) +	if err != nil { +		log.Println("Could not encode stream start!") +	} + +	s.streams = append(s.streams, stream) +} + +func (s *session) closeStreams() { +	for { +		limit := len(s.streams) +		if limit <= 0 { break } +		s.streams[limit - 1].terminate() +		s.streams = s.streams[:limit - 1] +	} +} diff --git a/xmpp/stream.go b/xmpp/stream.go index 803071a..d0680aa 100644 --- a/xmpp/stream.go +++ b/xmpp/stream.go @@ -5,6 +5,15 @@ import (  	"log"  ) +type stream struct { +	session *session +	end     xml.EndElement +} + +func (s *stream) terminate() { +	s.session.ed.encodeToken(s.end) +} +  func sendStreamStart(enc *encoder, jid string) xml.EndElement {  	start := xml.StartElement{  		xml.Name{"jabber:client", "stream:stream"}, | 
