[TEST] review threema main component

This commit is contained in:
Martin/Geno 2019-06-01 15:21:49 +02:00
parent 32a646012c
commit bd87c4ac86
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A
4 changed files with 148 additions and 26 deletions

View File

@ -21,9 +21,9 @@ type Account struct {
readedMSG map[uint64]string
}
func (t *Threema) getAccount(jid *models.JID) *Account {
func (t *Threema) getAccount(jid *models.JID) (*Account, error) {
if a, ok := t.accountJID[jid.String()]; ok {
return a
return a, nil
}
account := models.AccountThreema{}
@ -36,28 +36,27 @@ func (t *Threema) getAccount(jid *models.JID) *Account {
var lsk [32]byte
copy(lsk[:], account.LSK[:])
tid, err := o3.NewThreemaID(string(account.TID), lsk, o3.AddressBook{})
// TODO error handling
if err != nil {
return nil
return nil, err
}
tid.Nick = o3.NewPubNick("xmpp:" + jid.String())
a := &Account{AccountThreema: account}
a.XMPP = *jid
a.Session = o3.NewSessionContext(tid)
a.send, a.recieve, err = a.Session.Run()
if err != nil {
return nil, err
}
a.XMPP = *jid
a.deliveredMSG = make(map[uint64]string)
a.readedMSG = make(map[uint64]string)
// TODO error handling
if err != nil {
return nil
}
go a.reciever(t.out)
t.accountJID[jid.String()] = a
return a
return a, nil
}
func (a *Account) reciever(out chan<- xmpp.Packet) {

View File

@ -22,8 +22,8 @@ func (t *Threema) Bot(from *models.JID, request string) string {
case "generate":
// test if account already exists
account := t.getAccount(from)
if account != nil {
account, err := t.getAccount(from)
if err == nil {
return fmt.Sprintf("you already has the threema account with id: %s", string(account.TID))
}
@ -48,7 +48,7 @@ func (t *Threema) Bot(from *models.JID, request string) string {
database.Write.Create(&a)
// fetch account and connect
account = t.getAccount(from)
account, err = t.getAccount(from)
tid := string(account.TID)
if tid != "" {
logger.WithField("threema", tid).Info("generate")

View File

@ -29,15 +29,23 @@ func (t *Threema) Connect() (chan xmpp.Packet, error) {
var jids []*models.JID
database.Read.Find(&jids)
for _, jid := range jids {
a := t.getAccount(jid)
log.WithFields(map[string]interface{}{
"jid": jid.String(),
"threema": string(a.TID),
}).Info("connected")
logger := log.WithField("jid", jid.String())
a, err := t.getAccount(jid)
if err != nil {
logger.Warnf("unable to connect%s", err)
continue
}
logger = logger.WithField("threema", string(a.TID))
logger.Info("connected")
}
return t.out, nil
}
func (t *Threema) Send(packet xmpp.Packet) {
if p := t.send(packet); p != nil {
t.out <- p
}
}
func (t *Threema) send(packet xmpp.Packet) xmpp.Packet {
switch p := packet.(type) {
case xmpp.Message:
from := models.ParseJID(p.PacketAttrs.From)
@ -46,27 +54,26 @@ func (t *Threema) Send(packet xmpp.Packet) {
if to.IsDomain() {
msg := xmpp.NewMessage("chat", "", from.String(), "", "en")
msg.Body = t.Bot(from, p.Body)
t.out <- msg
return
return msg
}
account := t.getAccount(from)
if account == nil {
account, err := t.getAccount(from)
if err != nil {
msg := xmpp.NewMessage("chat", "", from.String(), "", "en")
msg.Body = "It was not possible to send, becouse we have no account for you.\nPlease generate one, by sending `generate` to this gateway"
t.out <- msg
return
return msg
}
threemaID := strings.ToUpper(to.Local)
if err := account.Send(threemaID, p); err != nil {
msg := xmpp.NewMessage("chat", "", from.String(), "", "en")
msg.Body = err.Error()
t.out <- msg
return msg
}
default:
log.Warnf("unkown package%v", p)
}
return nil
}
func init() {

View File

@ -1 +1,117 @@
package threema
import (
"testing"
"github.com/stretchr/testify/assert"
"gosrc.io/xmpp"
"dev.sum7.eu/genofire/golang-lib/database"
"dev.sum7.eu/genofire/thrempp/models"
)
func TestThreema(t *testing.T) {
assert := assert.New(t)
c, err := NewThreema(map[string]interface{}{})
assert.NoError(err)
assert.NotNil(c)
database.Open(database.Config{
Type: "sqlite3",
Connection: "file::memory:?mode=memory",
})
defer database.Close()
jid := models.JID{
Local: "a",
Domain: "example.org",
}
database.Write.Create(&jid)
database.Write.Create(&models.AccountThreema{
TID: []byte("12345678"),
LSK: []byte("b"),
XMPPID: jid.ID,
})
//broken
jid = models.JID{
Local: "b",
Domain: "example.org",
}
database.Write.Create(&jid)
database.Write.Create(&models.AccountThreema{
TID: []byte("123"),
LSK: []byte("b"),
XMPPID: jid.ID,
})
ch, err := c.Connect()
assert.NoError(err)
assert.NotNil(ch)
}
func TestSend(t *testing.T) {
assert := assert.New(t)
// test channel
out := make(chan xmpp.Packet)
tr := Threema{
out: out,
accountJID: make(map[string]*Account),
}
go func() {
tr.Send(xmpp.Message{
PacketAttrs: xmpp.PacketAttrs{From: "a@example.org"},
})
}()
p := <-out
assert.NotNil(p)
// no account. generate one
msg := p.(xmpp.Message)
assert.Contains(msg.Body, "generate")
// test no answer
p = tr.send(xmpp.IQ{})
assert.Nil(p)
// chat with bot
p = tr.send(xmpp.Message{
PacketAttrs: xmpp.PacketAttrs{To: "example.org"},
})
assert.NotNil(p)
msg = p.(xmpp.Message)
assert.Equal("command not supported", msg.Body)
// chat with delivier error
database.Open(database.Config{
Type: "sqlite3",
Connection: "file::memory:?mode=memory",
})
defer database.Close()
jid := models.JID{
Local: "a",
Domain: "example.org",
}
database.Write.Create(&jid)
database.Write.Create(&models.AccountThreema{
TID: []byte("12345678"),
LSK: []byte("b"),
XMPPID: jid.ID,
})
/* TODO manipulate account to no sendpipe
_, err := tr.getAccount(&jid)
assert.NoError(err)
p = tr.send(xmpp.Message{
PacketAttrs: xmpp.PacketAttrs{
From: "a@example.org",
To: "12345678@threema.example.org",
},
})
assert.NotNil(p)
msg = p.(xmpp.Message)
assert.Equal("command not supported", msg.Body)
*/
}