[TASK] add jid
This commit is contained in:
parent
4b002015b6
commit
54f67245d6
|
@ -1,19 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"dev.sum7.eu/genofire/yaja/model/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
configPath string
|
|
||||||
)
|
|
||||||
|
|
||||||
func loadConfig() *config.Config {
|
|
||||||
config, err := config.ReadConfigFile(configPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("unable to load config file:", err)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
15
cmd/serve.go
15
cmd/serve.go
|
@ -5,18 +5,27 @@ import (
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"dev.sum7.eu/genofire/yaja/model/config"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var configPath string
|
||||||
|
|
||||||
// serveCmd represents the serve command
|
// serveCmd represents the serve command
|
||||||
var serveCmd = &cobra.Command{
|
var serveCmd = &cobra.Command{
|
||||||
Use: "serve",
|
Use: "serve",
|
||||||
Short: "Runs the yaja server",
|
Short: "Runs the yaja server",
|
||||||
Example: "yaja serve -config /etc/yaja.toml",
|
Example: "yaja serve -c /etc/yaja.conf",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
loadConfig()
|
_, err := config.ReadConfigFile(configPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("unable to load config file:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infoln("yaja started ")
|
||||||
|
|
||||||
// Wait for INT/TERM
|
// Wait for INT/TERM
|
||||||
sigs := make(chan os.Signal, 1)
|
sigs := make(chan os.Signal, 1)
|
||||||
|
@ -29,5 +38,5 @@ var serveCmd = &cobra.Command{
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RootCmd.AddCommand(serveCmd)
|
RootCmd.AddCommand(serveCmd)
|
||||||
serveCmd.Flags().StringVarP(&configPath, "config", "c", "config.toml", "Path to configuration file")
|
serveCmd.Flags().StringVarP(&configPath, "config", "c", "yaja.conf", "Path to configuration file")
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Function to test the configuration of the microservice
|
|
||||||
func TestReadConfig(t *testing.T) {
|
func TestReadConfig(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,19 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
|
import "dev.sum7.eu/genofire/yaja/model"
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
TLSDir string `toml:"tlsdir"`
|
TLSDir string `toml:"tlsdir"`
|
||||||
|
PortClient int `toml:"port_client"`
|
||||||
|
PortServer int `toml:"port_server"`
|
||||||
|
|
||||||
|
Domain []*Domain `toml:"domain"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Domain struct {
|
||||||
|
FQDN string `toml:"fqdn"`
|
||||||
|
Admins []*model.JID `toml:"admins"`
|
||||||
|
TLSDisable bool `toml:"tls_disable"`
|
||||||
|
TLSPrivate string `toml:"tls_private"`
|
||||||
|
TLSPublic string `toml:"tls_public"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
var jidRegex *regexp.Regexp
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
jidRegex = regexp.MustCompile(`^(?:([^@/<>'\" ]+)@)?([^@/<>'\"]+)(?:/([^<>'\" ][^<>'\"]*))?$`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JID struct
|
||||||
|
type JID struct {
|
||||||
|
Local string
|
||||||
|
Domain string
|
||||||
|
Resource string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewJID get JID from string
|
||||||
|
func NewJID(jidString string) *JID {
|
||||||
|
jidSplitTmp := jidRegex.FindAllStringSubmatch(jidString, -1)
|
||||||
|
if len(jidSplitTmp) != 1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
jidSplit := jidSplitTmp[0]
|
||||||
|
|
||||||
|
return &JID{
|
||||||
|
Local: jidSplit[1],
|
||||||
|
Domain: jidSplit[2],
|
||||||
|
Resource: jidSplit[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bare get the "bare" jid
|
||||||
|
func (jid *JID) Bare() string {
|
||||||
|
if jid.Local != "" {
|
||||||
|
return jid.Local + "@" + jid.Domain
|
||||||
|
}
|
||||||
|
return jid.Domain
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full get the "full" jid as string
|
||||||
|
func (jid *JID) Full() string {
|
||||||
|
if jid.Resource != "" {
|
||||||
|
return jid.Bare() + "/" + jid.Resource
|
||||||
|
}
|
||||||
|
return jid.Bare()
|
||||||
|
}
|
||||||
|
|
||||||
|
//MarshalJSON to bytearray
|
||||||
|
func (jid JID) MarshalJSON() ([]byte, error) {
|
||||||
|
return []byte(jid.Full()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON from bytearray
|
||||||
|
func (jid *JID) UnmarshalJSON(data []byte) (err error) {
|
||||||
|
newJID := NewJID(string(data))
|
||||||
|
if newJID == nil {
|
||||||
|
return errors.New("not a valid jid")
|
||||||
|
}
|
||||||
|
jid.Local = newJID.Local
|
||||||
|
jid.Domain = newJID.Domain
|
||||||
|
jid.Resource = newJID.Resource
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,159 @@
|
||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Test Values for NewJID from RFC7622
|
||||||
|
// https://tools.ietf.org/html/rfc7622
|
||||||
|
func TestNewJID(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
checkList := map[string]*JID{
|
||||||
|
"juliet@example.com": &JID{
|
||||||
|
Local: "juliet",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"juliet@example.com/foo": &JID{
|
||||||
|
Local: "juliet",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
"juliet@example.com/foo bar": &JID{
|
||||||
|
Local: "juliet",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo bar",
|
||||||
|
},
|
||||||
|
"juliet@example.com/foo@bar": &JID{
|
||||||
|
Local: "juliet",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo@bar",
|
||||||
|
},
|
||||||
|
"foo\\20bar@example.com": &JID{
|
||||||
|
Local: "foo\\20bar",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"fussball@example.com": &JID{
|
||||||
|
Local: "fussball",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"fußball@example.com": &JID{
|
||||||
|
Local: "fußball",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"π@example.com": &JID{
|
||||||
|
Local: "π",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"Σ@example.com/foo": &JID{
|
||||||
|
Local: "Σ",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
"σ@example.com/foo": &JID{
|
||||||
|
Local: "σ",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
"ς@example.com/foo": &JID{
|
||||||
|
Local: "ς",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
"king@example.com/♚": &JID{
|
||||||
|
Local: "king",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "♚",
|
||||||
|
},
|
||||||
|
"example.com": &JID{
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"example.com/foobar": &JID{
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foobar",
|
||||||
|
},
|
||||||
|
"a.example.com/b@example.net": &JID{
|
||||||
|
Domain: "a.example.com",
|
||||||
|
Resource: "b@example.net",
|
||||||
|
},
|
||||||
|
"\"juliet\"@example.com": nil,
|
||||||
|
"foo bar@example.com": nil,
|
||||||
|
"juliet@example.com/ foo": nil,
|
||||||
|
"@example.com/": nil,
|
||||||
|
// "henryⅣ@example.com": nil, -- ignore for easier implementation
|
||||||
|
// "♚@example.com": nil,
|
||||||
|
"juliet@": nil,
|
||||||
|
"/foobar": nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
for jidString, jidValid := range checkList {
|
||||||
|
jid := NewJID(jidString)
|
||||||
|
|
||||||
|
if jidValid != nil {
|
||||||
|
assert.NotNil(jid, "this should be a valid JID:"+jidString)
|
||||||
|
if jid == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(jidValid.Local, jid.Local, "the local part was not right detectet:"+jidString)
|
||||||
|
assert.Equal(jidValid.Domain, jid.Domain, "the domain part was not right detectet:"+jidString)
|
||||||
|
assert.Equal(jidValid.Resource, jid.Resource, "the resource part was not right detectet:"+jidString)
|
||||||
|
assert.Equal(jidValid.Full(), jidString, "the function full of jid did not work")
|
||||||
|
} else {
|
||||||
|
assert.Nil(jid, "this should not be a valid JID:"+jidString)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJIDBare(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
checkList := map[string]*JID{
|
||||||
|
"aaa@example.com": &JID{
|
||||||
|
Local: "aaa",
|
||||||
|
Domain: "example.com",
|
||||||
|
},
|
||||||
|
"aab@example.com": &JID{
|
||||||
|
Local: "aab",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
"example.com": &JID{
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "foo",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for jidValid, jid := range checkList {
|
||||||
|
jidBase := jid.Bare()
|
||||||
|
assert.Equal(jidValid, jidBase)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJSONMarshal(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
jid := &JID{}
|
||||||
|
err := jid.UnmarshalJSON([]byte("juliet@example.com/foo"))
|
||||||
|
|
||||||
|
assert.NoError(err)
|
||||||
|
assert.Equal(jid.Local, "juliet")
|
||||||
|
assert.Equal(jid.Domain, "example.com")
|
||||||
|
assert.Equal(jid.Resource, "foo")
|
||||||
|
|
||||||
|
err = jid.UnmarshalJSON([]byte("juliet@example.com/ foo"))
|
||||||
|
|
||||||
|
assert.Error(err)
|
||||||
|
|
||||||
|
jid = &JID{
|
||||||
|
Local: "romeo",
|
||||||
|
Domain: "example.com",
|
||||||
|
Resource: "bar",
|
||||||
|
}
|
||||||
|
jidString, err := jid.MarshalJSON()
|
||||||
|
assert.NoError(err)
|
||||||
|
assert.Equal("romeo@example.com/bar", string(jidString))
|
||||||
|
}
|
Reference in New Issue