forked from cwtch.im/cwtch
Merge branch 'export' of cwtch.im/cwtch into master
This commit is contained in:
commit
46c6f48086
|
@ -325,6 +325,18 @@ func main() {
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Error reading timeline from group, usage: %s\n", usages["timeline"])
|
fmt.Printf("Error reading timeline from group, usage: %s\n", usages["timeline"])
|
||||||
}
|
}
|
||||||
|
case "export-group":
|
||||||
|
if len(commands) == 2 {
|
||||||
|
group := app.Peer.Profile.GetGroupByGroupID(commands[1])
|
||||||
|
if group == nil {
|
||||||
|
fmt.Printf("Error: group does not exist\n")
|
||||||
|
} else {
|
||||||
|
invite, _ := app.Peer.ExportGroup(commands[1])
|
||||||
|
fmt.Printf("Invite: %v\n", invite)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Error reading timeline from group, usage: %s\n", usages["timeline"])
|
||||||
|
}
|
||||||
case "save":
|
case "save":
|
||||||
app.Peer.Save(profilefile)
|
app.Peer.Save(profilefile)
|
||||||
case "help":
|
case "help":
|
||||||
|
|
|
@ -6,13 +6,17 @@ import (
|
||||||
"cwtch.im/cwtch/peer/connections"
|
"cwtch.im/cwtch/peer/connections"
|
||||||
"cwtch.im/cwtch/peer/peer"
|
"cwtch.im/cwtch/peer/peer"
|
||||||
"cwtch.im/cwtch/protocol"
|
"cwtch.im/cwtch/protocol"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/s-rah/go-ricochet/application"
|
"github.com/s-rah/go-ricochet/application"
|
||||||
"github.com/s-rah/go-ricochet/channels"
|
"github.com/s-rah/go-ricochet/channels"
|
||||||
"github.com/s-rah/go-ricochet/connection"
|
"github.com/s-rah/go-ricochet/connection"
|
||||||
|
"golang.org/x/crypto/ed25519"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -75,6 +79,43 @@ func LoadCwtchPeer(profilefile string) (*CwtchPeer, error) {
|
||||||
return cp, err
|
return cp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ImportGroup intializes a group from an imported source rather than a peer invite
|
||||||
|
func (cp *CwtchPeer) ImportGroup(exportedInvite string) (groupID string, err error) {
|
||||||
|
if strings.HasPrefix(exportedInvite, "torv2") {
|
||||||
|
data, err := base64.StdEncoding.DecodeString(exportedInvite[21+44:])
|
||||||
|
if err == nil {
|
||||||
|
cpp := &protocol.CwtchPeerPacket{}
|
||||||
|
err := proto.Unmarshal(data, cpp)
|
||||||
|
if err == nil {
|
||||||
|
pk, err := base64.StdEncoding.DecodeString(exportedInvite[21 : 21+44])
|
||||||
|
if err == nil {
|
||||||
|
edpk := ed25519.PublicKey(pk)
|
||||||
|
onion := exportedInvite[5:21]
|
||||||
|
cp.Profile.AddContact(onion, &model.PublicProfile{"", edpk, true, false, onion})
|
||||||
|
cp.Profile.ProcessInvite(cpp.GetGroupChatInvite(), onion)
|
||||||
|
return cpp.GroupChatInvite.GetGroupName(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = errors.New("unsupported exported group type")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportGroup serializes a group invite so it can be given offline
|
||||||
|
func (cp *CwtchPeer) ExportGroup(groupID string) (string, error) {
|
||||||
|
group := cp.Profile.GetGroupByGroupID(groupID)
|
||||||
|
if group != nil {
|
||||||
|
invite, err := group.Invite()
|
||||||
|
if err == nil {
|
||||||
|
exportedInvite := "torv2" + cp.Profile.Onion + base64.StdEncoding.EncodeToString(cp.Profile.Ed25519PublicKey) + base64.StdEncoding.EncodeToString(invite)
|
||||||
|
return exportedInvite, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", errors.New("group id could not be found")
|
||||||
|
}
|
||||||
|
|
||||||
// PeerWithOnion is the entry point for CwtchPeer relationships
|
// PeerWithOnion is the entry point for CwtchPeer relationships
|
||||||
func (cp *CwtchPeer) PeerWithOnion(onion string) {
|
func (cp *CwtchPeer) PeerWithOnion(onion string) {
|
||||||
cp.connectionsManager.ManagePeerConnection(onion, cp.Profile)
|
cp.connectionsManager.ManagePeerConnection(onion, cp.Profile)
|
||||||
|
|
|
@ -14,4 +14,12 @@ func TestCwtchPeerGenerate(t *testing.T) {
|
||||||
t.Errorf("something went wrong saving and loading profiles %v %v", err, aliceLoaded)
|
t.Errorf("something went wrong saving and loading profiles %v %v", err, aliceLoaded)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
groupID, _, _ := aliceLoaded.Profile.StartGroup("test.server")
|
||||||
|
exportedGroup, _ := aliceLoaded.ExportGroup(groupID)
|
||||||
|
t.Logf("Exported Group: %v from %v", exportedGroup, aliceLoaded.Profile.Onion)
|
||||||
|
|
||||||
|
importedGroupID, err := alice.ImportGroup(exportedGroup)
|
||||||
|
group := alice.Profile.GetGroupByGroupID(importedGroupID)
|
||||||
|
t.Logf("Imported Group: %v, err := %v %v", group, err, importedGroupID)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue