keypair err mgt + shorturl random improve
This commit is contained in:
@@ -24,7 +24,10 @@ func InvitationAnswer(cc *meowlib.ContactCard, nickname string, myNickname strin
|
||||
}
|
||||
|
||||
// build my contact card for that friend
|
||||
peer := client.GetConfig().GetIdentity().AnswerInvitation(mynick, nickname, serverUids, cc)
|
||||
peer, err := client.GetConfig().GetIdentity().AnswerInvitation(mynick, nickname, serverUids, cc)
|
||||
if err != nil {
|
||||
return nil, "InvitationAnswer: AnswerInvitation", err
|
||||
}
|
||||
|
||||
//peerstr, err := json.Marshal(peer)
|
||||
//fmt.Println("InvitationAnswer: " + string(peerstr))
|
||||
@@ -71,7 +74,10 @@ func InvitationAnswerFile(invitationFile string, nickname string, myNickname str
|
||||
mynick = client.GetConfig().GetIdentity().Nickname
|
||||
}
|
||||
|
||||
response := identity.AnswerInvitation(mynick, nickname, serverUids, cc)
|
||||
response, err := identity.AnswerInvitation(mynick, nickname, serverUids, cc)
|
||||
if err != nil {
|
||||
return "InvitationAnswerFile : AnswerInvitation", err
|
||||
}
|
||||
fmt.Fprintln(os.Stdout, "Invitation sent by "+received)
|
||||
if format == "qr" {
|
||||
filename = c.StoragePath + string(os.PathSeparator) + mynick + "-" + nickname + ".png"
|
||||
|
||||
@@ -64,7 +64,10 @@ func InvitationGetMessage(invitationUrl string, serverPublicKey string, invitati
|
||||
meowurl := strings.Split(invitationUrl, "?")
|
||||
|
||||
shortcode := meowurl[1]
|
||||
srv := client.CreateServerFromMeowUrl(meowurl[0])
|
||||
srv, err := client.CreateServerFromMeowUrl(meowurl[0])
|
||||
if err != nil {
|
||||
return nil, "InvitationGetMessage: CreateServerFromMeowUrl", err
|
||||
}
|
||||
// check if already in msg servers
|
||||
dbsrv, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(srv.Url)
|
||||
if err != nil {
|
||||
@@ -73,7 +76,11 @@ func InvitationGetMessage(invitationUrl string, serverPublicKey string, invitati
|
||||
if dbsrv == nil {
|
||||
// create a server object with url & pubkey
|
||||
srv.PublicKey = serverPublicKey
|
||||
srv.UserKp = meowlib.NewKeyPair()
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, "InvitationGetMessage: NewKeyPair", err
|
||||
}
|
||||
srv.UserKp = k
|
||||
// save it
|
||||
err = client.GetConfig().GetIdentity().MessageServers.StoreServer(srv)
|
||||
if err != nil {
|
||||
|
||||
@@ -16,36 +16,37 @@ import (
|
||||
const maxHiddenCount = 30
|
||||
|
||||
type Identity struct {
|
||||
Nickname string `json:"nickname,omitempty"`
|
||||
DefaultAvatar string `json:"default_avatar,omitempty"`
|
||||
Avatars []Avatar `json:"avatars,omitempty"`
|
||||
RootKp meowlib.KeyPair `json:"id_kp,omitempty"`
|
||||
Status string `json:"status,omitempty"`
|
||||
Peers PeerStorage `json:"peers,omitempty"`
|
||||
HiddenPeers [][]byte `json:"hidden_peers,omitempty"`
|
||||
Personae PeerList `json:"faces,omitempty"`
|
||||
Device meowlib.KeyPair `json:"device,omitempty"`
|
||||
KnownServers ServerList `json:"known_servers,omitempty"`
|
||||
MessageServers ServerStorage `json:"message_servers,omitempty"`
|
||||
DefaultDbPassword string `json:"default_db_password,omitempty"`
|
||||
DbPasswordStore bool `json:"db_password_store,omitempty"`
|
||||
OwnedDevices PeerList `json:"owned_devices,omitempty"`
|
||||
StaticMtkServerPaths []ServerList `json:"static_mtk_server_paths,omitempty"`
|
||||
DynamicMtkServeRules []string `json:"dynamic_mtk_serve_rules,omitempty"`
|
||||
InvitationTimeout int `json:"invitation_timeout,omitempty"`
|
||||
Uuid string `json:"uuid,omitempty"`
|
||||
Nickname string `json:"nickname,omitempty"`
|
||||
DefaultAvatar string `json:"default_avatar,omitempty"`
|
||||
Avatars []Avatar `json:"avatars,omitempty"`
|
||||
RootKp *meowlib.KeyPair `json:"id_kp,omitempty"`
|
||||
Status string `json:"status,omitempty"`
|
||||
Peers PeerStorage `json:"peers,omitempty"`
|
||||
HiddenPeers [][]byte `json:"hidden_peers,omitempty"`
|
||||
Personae PeerList `json:"faces,omitempty"`
|
||||
Device *meowlib.KeyPair `json:"device,omitempty"`
|
||||
KnownServers ServerList `json:"known_servers,omitempty"`
|
||||
MessageServers ServerStorage `json:"message_servers,omitempty"`
|
||||
DefaultDbPassword string `json:"default_db_password,omitempty"`
|
||||
DbPasswordStore bool `json:"db_password_store,omitempty"`
|
||||
OwnedDevices PeerList `json:"owned_devices,omitempty"`
|
||||
StaticMtkServerPaths []ServerList `json:"static_mtk_server_paths,omitempty"`
|
||||
DynamicMtkServeRules []string `json:"dynamic_mtk_serve_rules,omitempty"`
|
||||
InvitationTimeout int `json:"invitation_timeout,omitempty"`
|
||||
Uuid string `json:"uuid,omitempty"`
|
||||
unlockedHiddenPeers PeerList
|
||||
}
|
||||
|
||||
func CreateIdentity(nickname string) (*Identity, error) {
|
||||
var id Identity
|
||||
var err error
|
||||
id.Nickname = nickname
|
||||
id.Uuid = uuid.New().String()
|
||||
id.RootKp = meowlib.NewKeyPair()
|
||||
id.RootKp, err = meowlib.NewKeyPair()
|
||||
GetConfig().me = &id
|
||||
id.MessageServers = ServerStorage{DbFile: uuid.NewString()}
|
||||
id.generateRandomHiddenStuff()
|
||||
err := id.CreateFolder()
|
||||
err = id.CreateFolder()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -71,10 +72,20 @@ func (id *Identity) WipeFolder() error {
|
||||
// Creates an invitation for a peer, returns the newly created peer including infos to provide a ContactCard
|
||||
func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerUids []string, InvitationMessage string) (*Peer, error) {
|
||||
var peer Peer
|
||||
var err error
|
||||
peer.Uid = uuid.New().String()
|
||||
peer.MyIdentity = meowlib.NewKeyPair()
|
||||
peer.MyEncryptionKp = meowlib.NewKeyPair()
|
||||
peer.MyLookupKp = meowlib.NewKeyPair()
|
||||
peer.MyIdentity, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
peer.MyEncryptionKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
peer.MyLookupKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
peer.Name = ContactName
|
||||
peer.InvitationId = uuid.New().String() // todo as param to identify then update url
|
||||
/* if id.MessageServers.Servers == nil {
|
||||
@@ -116,13 +127,24 @@ func (id *Identity) CheckInvitation(ReceivedContact *meowlib.ContactCard) (isAns
|
||||
}
|
||||
|
||||
// Answers an invitation, returns the newly created peer including infos to provide a ContactCard
|
||||
func (id *Identity) AnswerInvitation(MyName string, ContactName string, MessageServerIdxs []string, ReceivedContact *meowlib.ContactCard) *Peer {
|
||||
func (id *Identity) AnswerInvitation(MyName string, ContactName string, MessageServerIdxs []string, ReceivedContact *meowlib.ContactCard) (*Peer, error) {
|
||||
var peer Peer
|
||||
var err error
|
||||
var newsrv *Server
|
||||
//var myContactCard meowlib.ContactCard
|
||||
peer.Uid = uuid.New().String()
|
||||
peer.MyIdentity = meowlib.NewKeyPair()
|
||||
peer.MyEncryptionKp = meowlib.NewKeyPair()
|
||||
peer.MyLookupKp = meowlib.NewKeyPair()
|
||||
peer.MyIdentity, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
peer.MyEncryptionKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
peer.MyLookupKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if ContactName != "" {
|
||||
peer.Name = ContactName
|
||||
} else {
|
||||
@@ -135,7 +157,8 @@ func (id *Identity) AnswerInvitation(MyName string, ContactName string, MessageS
|
||||
peer.InvitationMessage = ReceivedContact.InvitationMessage
|
||||
for srv := range ReceivedContact.PullServers {
|
||||
peer.ContactPullServers = append(peer.ContactPullServers, ReceivedContact.PullServers[srv].GetUid())
|
||||
id.MessageServers.StoreServerIfNotExists(CreateServerFromUid(ReceivedContact.PullServers[srv].GetUid()))
|
||||
newsrv, err = CreateServerFromUid(ReceivedContact.PullServers[srv].GetUid())
|
||||
id.MessageServers.StoreServerIfNotExists(newsrv)
|
||||
}
|
||||
/* for _, i := range MessageServerIdxs {
|
||||
srv := id.MessageServers.Servers[i].GetServerCard()
|
||||
@@ -150,11 +173,13 @@ func (id *Identity) AnswerInvitation(MyName string, ContactName string, MessageS
|
||||
peer.InvitationId = ReceivedContact.InvitationId
|
||||
id.Peers.StorePeer(&peer)
|
||||
|
||||
return &peer
|
||||
return &peer, nil
|
||||
}
|
||||
|
||||
// Finalizes an invitation, returns nil if successful
|
||||
func (id *Identity) FinalizeInvitation(ReceivedContact *meowlib.ContactCard) error {
|
||||
var err error
|
||||
var newsrv *Server
|
||||
/*for i, p := range id.Peers {
|
||||
if p.InvitationId == ReceivedContact.InvitationId {
|
||||
//id.Peers[i].Name = ReceivedContact.Name
|
||||
@@ -171,7 +196,11 @@ func (id *Identity) FinalizeInvitation(ReceivedContact *meowlib.ContactCard) err
|
||||
}
|
||||
return errors.New("no matching contact found for invitationId " + ReceivedContact.InvitationId)*/
|
||||
for srv := range ReceivedContact.PullServers {
|
||||
id.MessageServers.StoreServerIfNotExists(CreateServerFromUid(ReceivedContact.PullServers[srv].GetUid()))
|
||||
newsrv, err = CreateServerFromUid(ReceivedContact.PullServers[srv].GetUid())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
id.MessageServers.StoreServerIfNotExists(newsrv)
|
||||
}
|
||||
return id.Peers.FinalizeInvitation(ReceivedContact)
|
||||
}
|
||||
@@ -251,16 +280,26 @@ func (id *Identity) HidePeer(peerIdx int, password string) error {
|
||||
return nil
|
||||
}*/
|
||||
|
||||
func (id *Identity) generateRandomHiddenStuff() {
|
||||
func (id *Identity) generateRandomHiddenStuff() error {
|
||||
var err error
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
count := r.Intn(maxHiddenCount) + 1
|
||||
for i := 1; i < count; i++ {
|
||||
var p Peer
|
||||
p.Uid = uuid.New().String()
|
||||
p.Name = randomLenString(4, 20)
|
||||
p.MyEncryptionKp = meowlib.NewKeyPair()
|
||||
p.MyIdentity = meowlib.NewKeyPair()
|
||||
p.MyLookupKp = meowlib.NewKeyPair()
|
||||
p.MyEncryptionKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p.MyIdentity, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p.MyLookupKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p.Name = randomLenString(4, 20)
|
||||
p.ContactPublicKey = p.MyLookupKp.Public
|
||||
p.ContactEncryption = p.MyIdentity.Public
|
||||
@@ -271,17 +310,18 @@ func (id *Identity) generateRandomHiddenStuff() {
|
||||
//id.HidePeer(0, randomLenString(8, 14))
|
||||
// TODO Add random conversations
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type BackgroundJob struct {
|
||||
RootPublic string `json:"root_public,omitempty"`
|
||||
Device meowlib.KeyPair `json:"device,omitempty"`
|
||||
Jobs []RequestsJob `json:"jobs,omitempty"`
|
||||
RootPublic string `json:"root_public,omitempty"`
|
||||
Device *meowlib.KeyPair `json:"device,omitempty"`
|
||||
Jobs []RequestsJob `json:"jobs,omitempty"`
|
||||
}
|
||||
|
||||
type RequestsJob struct {
|
||||
Server *Server `json:"server,omitempty"`
|
||||
LookupKeys []meowlib.KeyPair `json:"lookup_keys,omitempty"`
|
||||
Server *Server `json:"server,omitempty"`
|
||||
LookupKeys []*meowlib.KeyPair `json:"lookup_keys,omitempty"`
|
||||
}
|
||||
|
||||
func (id *Identity) GetRequestJobs() []RequestsJob {
|
||||
|
||||
@@ -19,7 +19,7 @@ func exists(filename string) bool {
|
||||
}
|
||||
}
|
||||
|
||||
func createId() *Identity {
|
||||
func createId(t *testing.T) *Identity {
|
||||
config := GetConfig()
|
||||
config.IdentityFile = "test.id"
|
||||
config.memoryPassword = "generalPassword"
|
||||
@@ -37,13 +37,34 @@ func createId() *Identity {
|
||||
var p Peer
|
||||
p.Uid = uuid.New().String()
|
||||
p.Name = "testName_" + strconv.Itoa(i)
|
||||
p.MyEncryptionKp = meowlib.NewKeyPair()
|
||||
p.MyIdentity = meowlib.NewKeyPair()
|
||||
p.MyLookupKp = meowlib.NewKeyPair()
|
||||
p.MyEncryptionKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.MyIdentity, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.MyLookupKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.Name = "foo_" + strconv.Itoa(i)
|
||||
p.ContactPublicKey = meowlib.NewKeyPair().Public
|
||||
p.ContactEncryption = meowlib.NewKeyPair().Public
|
||||
p.ContactLookupKey = meowlib.NewKeyPair().Public
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.ContactPublicKey = k.Public
|
||||
k, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.ContactEncryption = k.Public
|
||||
k, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
p.ContactLookupKey = k.Public
|
||||
p.MyPullServers = []string{"server1", "server2"}
|
||||
//p.Contact.AddUrls([]string{"http:/127.0.0.1/meow", "tcp://localhost:1234"}) //todo add servers
|
||||
id.Peers.StorePeer(&p)
|
||||
@@ -98,7 +119,7 @@ func TestHidePeer(t *testing.T) {
|
||||
// test GetRequestJobs
|
||||
func TestGetRequestJobs(t *testing.T) {
|
||||
// Create a mock Identity object
|
||||
id := createId()
|
||||
id := createId(t)
|
||||
id.MessageServers = ServerStorage{
|
||||
DbFile: "test.db",
|
||||
}
|
||||
@@ -106,7 +127,10 @@ func TestGetRequestJobs(t *testing.T) {
|
||||
GetConfig().SetIdentity(id)
|
||||
for i := 1; i < 10; i++ {
|
||||
// initialize a Server with name "server+i"
|
||||
srv := CreateServerFromUrl("server" + strconv.Itoa(i))
|
||||
srv, err := CreateServerFromUrl("server" + strconv.Itoa(i))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
id.MessageServers.StoreServer(srv)
|
||||
}
|
||||
// Call GetRequestJobs
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
func ProcessForOutput(usermessage *meowlib.UserMessage, peer *Peer, servers *ServerList, trackingLookupKey string) ([]byte, error) {
|
||||
lastIdx := len(servers.Servers) - 1
|
||||
// LAST SERVER : Message delivery as usual
|
||||
srv := &servers.Servers[lastIdx]
|
||||
srv := servers.Servers[lastIdx]
|
||||
// Prepare cyphered + packed user message
|
||||
packedMsg, err := peer.ProcessOutboundUserMessage(usermessage)
|
||||
if err != nil {
|
||||
@@ -23,7 +23,7 @@ func ProcessForOutput(usermessage *meowlib.UserMessage, peer *Peer, servers *Ser
|
||||
lastuuid := uuid.NewString()
|
||||
// ALL PREVIOUS SERVERS
|
||||
for i := lastIdx - 1; i >= 0; i-- {
|
||||
srv = &servers.Servers[i]
|
||||
srv = servers.Servers[i]
|
||||
var toServerMessage meowlib.ToServerMessage
|
||||
toServerMessage.MatriochkaMessage.Data = lastmsg
|
||||
toServerMessage.MatriochkaMessage.Next.Url = servers.Servers[i+1].Url
|
||||
|
||||
@@ -30,7 +30,11 @@ func StoreMessage(peer *Peer, usermessage *meowlib.UserMessage, filenames []stri
|
||||
}
|
||||
file.Close()
|
||||
peer.DbIds = append(peer.DbIds, dbid)
|
||||
sqliteDatabase, _ := sql.Open("sqlite3", filepath.Join(cfg.StoragePath, identity.Uuid, dbid+GetConfig().DbSuffix)) // Open the created SQLite File
|
||||
sqliteDatabase, err := sql.Open("sqlite3", filepath.Join(cfg.StoragePath, identity.Uuid, dbid+GetConfig().DbSuffix))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer sqliteDatabase.Close()
|
||||
err = createMessageTable(sqliteDatabase)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
func TestStoreMessage(t *testing.T) {
|
||||
id := createId()
|
||||
id := createId(t)
|
||||
var um meowlib.UserMessage
|
||||
um.Data = []byte("blabla")
|
||||
peers, err := id.Peers.GetPeers()
|
||||
@@ -45,7 +45,7 @@ func TestStoreMessage(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestManyStoreMessage(t *testing.T) {
|
||||
id := createId()
|
||||
id := createId(t)
|
||||
peers, err := id.Peers.GetPeers()
|
||||
// test with zero messages
|
||||
messages, err := GetMessagesHistory(peers[0], 0, 0, 10, GetConfig().memoryPassword)
|
||||
|
||||
@@ -23,10 +23,10 @@ type Peer struct {
|
||||
MyAvatar string `json:"my_avatar,omitempty"`
|
||||
// Conversation []InternalMessage `json:"conversation,omitempty"`
|
||||
// My own keys for that peer
|
||||
MyIdentity meowlib.KeyPair `json:"my_identity,omitempty"`
|
||||
MyEncryptionKp meowlib.KeyPair `json:"my_encryption_kp,omitempty"`
|
||||
MyLookupKp meowlib.KeyPair `json:"my_lookup_kp,omitempty"`
|
||||
MyPullServers []string `json:"my_pull_servers,omitempty"`
|
||||
MyIdentity *meowlib.KeyPair `json:"my_identity,omitempty"`
|
||||
MyEncryptionKp *meowlib.KeyPair `json:"my_encryption_kp,omitempty"`
|
||||
MyLookupKp *meowlib.KeyPair `json:"my_lookup_kp,omitempty"`
|
||||
MyPullServers []string `json:"my_pull_servers,omitempty"`
|
||||
// Peer keys and infos
|
||||
//Contact meowlib.ContactCard `json:"contact,omitempty"` // todo : remove
|
||||
ContactPublicKey string `json:"contact_public_key,omitempty"`
|
||||
|
||||
@@ -20,7 +20,7 @@ func TestOpen(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStorePeer(t *testing.T) {
|
||||
id := createId()
|
||||
id := createId(t)
|
||||
GetConfig().SetMemPass("test")
|
||||
GetConfig().SetIdentity(id)
|
||||
ps := &PeerStorage{
|
||||
|
||||
@@ -18,38 +18,46 @@ import (
|
||||
// - Server remote management if ManagerKp is available for that server
|
||||
type Server struct {
|
||||
//ServerCard meowlib.ServerCard `json:"server_data,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
PublicKey string `json:"public_key,omitempty"`
|
||||
Url string `json:"url,omitempty"`
|
||||
Login string `json:"login,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
Presence bool `json:"presence,omitempty"`
|
||||
LastCheck time.Time `json:"last_check,omitempty"`
|
||||
Uptime time.Duration `json:"uptime,omitempty"`
|
||||
UserKp meowlib.KeyPair `json:"user_kp,omitempty"`
|
||||
ManagerKp meowlib.KeyPair `json:"manager_kp,omitempty"`
|
||||
Country string `json:"country,omitempty"`
|
||||
AllowedDelay int `json:"allowed_delay,omitempty"`
|
||||
Backup bool `json:"backup,omitempty"`
|
||||
WebRTC bool `json:"webrtc,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
PublicKey string `json:"public_key,omitempty"`
|
||||
Url string `json:"url,omitempty"`
|
||||
Login string `json:"login,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
Presence bool `json:"presence,omitempty"`
|
||||
LastCheck time.Time `json:"last_check,omitempty"`
|
||||
Uptime time.Duration `json:"uptime,omitempty"`
|
||||
UserKp *meowlib.KeyPair `json:"user_kp,omitempty"`
|
||||
ManagerKp *meowlib.KeyPair `json:"manager_kp,omitempty"`
|
||||
Country string `json:"country,omitempty"`
|
||||
AllowedDelay int `json:"allowed_delay,omitempty"`
|
||||
Backup bool `json:"backup,omitempty"`
|
||||
WebRTC bool `json:"webrtc,omitempty"`
|
||||
}
|
||||
|
||||
// CreateServerFromUrl creates a server from a basic url, ex : https://my.meowserver.example:8443/meow/
|
||||
func CreateServerFromUrl(url string) *Server {
|
||||
func CreateServerFromUrl(url string) (*Server, error) {
|
||||
var is Server
|
||||
var err error
|
||||
is.Name = url
|
||||
is.Url = url
|
||||
is.UserKp = meowlib.NewKeyPair()
|
||||
return &is
|
||||
is.UserKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &is, nil
|
||||
}
|
||||
|
||||
// CreateServerFromUid creates a server from a uid string, ex : mylogin:mypassword@https://my.meowserver.example:8443/meow/
|
||||
func CreateServerFromUid(uid string) *Server {
|
||||
func CreateServerFromUid(uid string) (*Server, error) {
|
||||
var is Server
|
||||
var err error
|
||||
uidTable := strings.Split(uid, "@") //! Weak test, use regexp
|
||||
is.Name = uid
|
||||
is.UserKp = meowlib.NewKeyPair()
|
||||
is.UserKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(uidTable) == 2 {
|
||||
loginpw := strings.Split(uidTable[0], ":")
|
||||
is.Url = uidTable[1]
|
||||
@@ -58,17 +66,17 @@ func CreateServerFromUid(uid string) *Server {
|
||||
} else {
|
||||
is.Url = uidTable[0]
|
||||
}
|
||||
return &is
|
||||
return &is, nil
|
||||
}
|
||||
|
||||
// CreateServerFromMeowUrl creates a server from a meow url, ex : meow://mylogin:mypassword@https://my.meowserver.example:8443/meow/
|
||||
func CreateServerFromMeowUrl(meowurl string) *Server {
|
||||
func CreateServerFromMeowUrl(meowurl string) (*Server, error) {
|
||||
uid := strings.Replace(meowurl[7:], "//", "://", 1)
|
||||
return CreateServerFromUid(uid)
|
||||
}
|
||||
|
||||
// CreateServerFromInvitationLink creates a server from a meow url, ex : meow://mylogin:mypassword@https://my.meowserver.example:8443/meow?invitationCode
|
||||
func CreateServerFromInvitationLink(meowurl string) *Server {
|
||||
func CreateServerFromInvitationLink(meowurl string) (*Server, error) {
|
||||
// remove the invitation code, last token after a /
|
||||
meowurlTable := strings.Split(meowurl, "?")
|
||||
// join all elements with / except the last one
|
||||
@@ -103,16 +111,20 @@ func (sc *Server) GetMeowUrl() string {
|
||||
}
|
||||
|
||||
// Create a server from a server card
|
||||
func CreateServerFromServerCard(server *meowlib.ServerCard) *Server {
|
||||
func CreateServerFromServerCard(server *meowlib.ServerCard) (*Server, error) {
|
||||
var is Server
|
||||
var err error
|
||||
is.Name = server.Name
|
||||
is.PublicKey = server.PublicKey
|
||||
is.Description = server.Description
|
||||
is.Url = server.Url
|
||||
is.Login = server.Login
|
||||
is.Password = server.Password
|
||||
is.UserKp = meowlib.NewKeyPair()
|
||||
return &is
|
||||
is.UserKp, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &is, nil
|
||||
}
|
||||
|
||||
// AsymEncryptMessage prepares a message to send to a specific internal server
|
||||
|
||||
@@ -8,13 +8,13 @@ import "errors"
|
||||
// - Owned servers lists
|
||||
// - Matriochka paths
|
||||
type ServerList struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
Servers []Server `json:"servers,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Servers []*Server `json:"servers,omitempty"`
|
||||
}
|
||||
|
||||
// FilterByIdxs returns a filtered server list filtered according to an index list
|
||||
func (sl *ServerList) FilterByIdxs(MessageServerIdxs []int) (filtered *ServerList, err error) {
|
||||
filtered.Servers = []Server{}
|
||||
filtered.Servers = []*Server{}
|
||||
for _, i := range MessageServerIdxs {
|
||||
if i > len(sl.Servers)-1 {
|
||||
return nil, errors.New("requested server out of range of defined message servers")
|
||||
@@ -31,22 +31,27 @@ func (sl *ServerList) GetServerByIdx(idx int) (server *Server, err error) {
|
||||
if idx > len(sl.Servers)-1 {
|
||||
return nil, errors.New("requested server out of range of defined message servers")
|
||||
}
|
||||
return &sl.Servers[idx], nil
|
||||
return sl.Servers[idx], nil
|
||||
}
|
||||
|
||||
// GetServerByPubkey returns a server from it's public key
|
||||
func (sl *ServerList) GetServerByPubkey(pubkey string) (filtered *Server) {
|
||||
for _, srv := range sl.Servers {
|
||||
if srv.PublicKey == pubkey {
|
||||
return &srv
|
||||
return srv
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddUrls is a simple utility functon used mainly as a shortcut for testing purposes
|
||||
func (sl *ServerList) AddUrls(urls []string) {
|
||||
func (sl *ServerList) AddUrls(urls []string) error {
|
||||
for _, url := range urls {
|
||||
sl.Servers = append(sl.Servers, *CreateServerFromUrl(url))
|
||||
srvnew, err := CreateServerFromUrl(url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sl.Servers = append(sl.Servers, srvnew)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -9,10 +9,14 @@ import (
|
||||
)
|
||||
|
||||
func TestGetUid(t *testing.T) {
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
srv := Server{
|
||||
Name: "test",
|
||||
Url: "http://127.0.0.1:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
uid := srv.GetUid()
|
||||
if uid != "http://127.0.0.1:8080" {
|
||||
@@ -21,14 +25,18 @@ func TestGetUid(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStoreServer(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
srv := Server{
|
||||
Name: "test",
|
||||
Url: "http://127.0.0.1",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
err := ss.StoreServer(&srv)
|
||||
err = ss.StoreServer(&srv)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -49,15 +57,19 @@ func TestStoreServer(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLoadServersFromUids(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
GetConfig().SetMemPass("test")
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
srv := Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
err := ss.StoreServer(&srv)
|
||||
err = ss.StoreServer(&srv)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -77,14 +89,18 @@ func TestLoadServersFromUids(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLoadServerCardsFromUids(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
srv := Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
err := ss.StoreServer(&srv)
|
||||
err = ss.StoreServer(&srv)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -104,13 +120,16 @@ func TestLoadServerCardsFromUids(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestServerExists(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
server := &Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
|
||||
// Check if server exists before storing it
|
||||
@@ -142,13 +161,16 @@ func TestServerExists(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStoreServerIfNotExists(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
server := &Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
|
||||
// Check if server exists before storing it
|
||||
@@ -181,26 +203,32 @@ func TestStoreServerIfNotExists(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStoreServerIfNotExists_ServerExists(t *testing.T) {
|
||||
createId()
|
||||
createId(t)
|
||||
ss := ServerStorage{DbFile: "test.db"}
|
||||
|
||||
k, err := meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
server := &Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
|
||||
// Store the server
|
||||
err := ss.StoreServer(server)
|
||||
err = ss.StoreServer(server)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to store server: %v", err)
|
||||
}
|
||||
|
||||
k, err = meowlib.NewKeyPair()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Store the server again with a different public key
|
||||
newServer := &Server{
|
||||
Name: "test",
|
||||
Url: "http://localhost:8080",
|
||||
PublicKey: meowlib.NewKeyPair().Public,
|
||||
PublicKey: k.Public,
|
||||
}
|
||||
|
||||
err = ss.StoreServerIfNotExists(newServer)
|
||||
|
||||
Reference in New Issue
Block a user