Clean up some older TODOs
the build was successful
Details
the build was successful
Details
This commit is contained in:
parent
f6888b47f1
commit
b3ba23992e
|
@ -70,7 +70,7 @@ func main() {
|
||||||
timeout := 1 * time.Second
|
timeout := 1 * time.Second
|
||||||
timeElapsed := 0 * time.Second
|
timeElapsed := 0 * time.Second
|
||||||
for {
|
for {
|
||||||
err := botPeer.SendMessageToGroup(groupID, timeout.String())
|
_, err := botPeer.SendMessageToGroupTracked(groupID, timeout.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Sent to group on server %v failed at interval %v of total %v with: %v\n", serverAddr, timeout, timeElapsed, err)
|
fmt.Printf("Sent to group on server %v failed at interval %v of total %v with: %v\n", serverAddr, timeout, timeElapsed, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
@ -103,7 +103,6 @@ func (t *Timeline) Less(i, j int) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort sorts the timeline in a canonical order.
|
// Sort sorts the timeline in a canonical order.
|
||||||
// TODO: There is almost definitely a more efficient way of doing things that involve not calling this method on every timeline load.
|
|
||||||
func (t *Timeline) Sort() {
|
func (t *Timeline) Sort() {
|
||||||
t.lock.Lock()
|
t.lock.Lock()
|
||||||
defer t.lock.Unlock()
|
defer t.lock.Unlock()
|
||||||
|
|
|
@ -111,10 +111,15 @@ func GenerateNewProfile(name string) *Profile {
|
||||||
func (p *Profile) AddContact(onion string, profile *PublicProfile) {
|
func (p *Profile) AddContact(onion string, profile *PublicProfile) {
|
||||||
p.lock.Lock()
|
p.lock.Lock()
|
||||||
profile.init()
|
profile.init()
|
||||||
// TODO: More Robust V3 Onion Handling
|
// We expect callers to verify addresses before we get to this point, so if this isn't a
|
||||||
decodedPub, _ := base32.StdEncoding.DecodeString(strings.ToUpper(onion[:56]))
|
// valid address this is a noop.
|
||||||
profile.Ed25519PublicKey = ed25519.PublicKey(decodedPub[:32])
|
if tor.IsValidHostname(onion) {
|
||||||
p.Contacts[onion] = profile
|
decodedPub, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion[:56]))
|
||||||
|
if err == nil {
|
||||||
|
profile.Ed25519PublicKey = ed25519.PublicKey(decodedPub[:32])
|
||||||
|
p.Contacts[onion] = profile
|
||||||
|
}
|
||||||
|
}
|
||||||
p.lock.Unlock()
|
p.lock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,6 @@ type CwtchPeer interface {
|
||||||
|
|
||||||
AddServer(string) error
|
AddServer(string) error
|
||||||
JoinServer(string) error
|
JoinServer(string) error
|
||||||
SendMessageToGroup(string, string) error
|
|
||||||
SendMessageToGroupTracked(string, string) (string, error)
|
SendMessageToGroupTracked(string, string) (string, error)
|
||||||
|
|
||||||
GetName() string
|
GetName() string
|
||||||
|
@ -393,14 +392,7 @@ func (cp *cwtchPeer) JoinServer(onion string) error {
|
||||||
return errors.New("no keys found for server connection")
|
return errors.New("no keys found for server connection")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMessageToGroup attempts to sent the given message to the given group id.
|
// SendMessageToGroupTracked attempts to sent the given message to the given group id.
|
||||||
// TODO: Deprecate in favour of SendMessageToGroupTracked
|
|
||||||
func (cp *cwtchPeer) SendMessageToGroup(groupid string, message string) error {
|
|
||||||
_, err := cp.SendMessageToGroupTracked(groupid, message)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendMessageToGroup attempts to sent the given message to the given group id.
|
|
||||||
// It returns the signature of the message which can be used to identify it in any UX layer.
|
// It returns the signature of the message which can be used to identify it in any UX layer.
|
||||||
func (cp *cwtchPeer) SendMessageToGroupTracked(groupid string, message string) (string, error) {
|
func (cp *cwtchPeer) SendMessageToGroupTracked(groupid string, message string) (string, error) {
|
||||||
cp.mutex.Lock()
|
cp.mutex.Lock()
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
package peer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO: Rewrite these tests (and others) using the news event bus interface.
|
|
||||||
func TestCwtchPeerGenerate(t *testing.T) {
|
|
||||||
/**
|
|
||||||
alice := NewCwtchPeer("alice")
|
|
||||||
|
|
||||||
groupID, _, _ := alice.StartGroup("test.server")
|
|
||||||
exportedGroup, _ := alice.ExportGroup(groupID)
|
|
||||||
t.Logf("Exported Group: %v from %v", exportedGroup, alice.GetProfile().Onion)
|
|
||||||
|
|
||||||
importedGroupID, err := alice.ImportGroup(exportedGroup)
|
|
||||||
group := alice.GetGroup(importedGroupID)
|
|
||||||
t.Logf("Imported Group: %v, err := %v %v", group, err, importedGroupID)
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTrustPeer(t *testing.T) {
|
|
||||||
/**
|
|
||||||
groupName := "2c3kmoobnyghj2zw6pwv7d57yzld753auo3ugauezzpvfak3ahc4bdyd"
|
|
||||||
alice := NewCwtchPeer("alice")
|
|
||||||
aem := new(event.Manager)
|
|
||||||
aem.Initialize()
|
|
||||||
alice.Init(connectivity.LocalProvider(),aem)
|
|
||||||
defer alice.Shutdown()
|
|
||||||
bob := NewCwtchPeer("bob")
|
|
||||||
bem := new(event.Manager)
|
|
||||||
bem.Initialize()
|
|
||||||
bob.Init(connectivity.LocalProvider(), bem)
|
|
||||||
defer bob.Shutdown()
|
|
||||||
|
|
||||||
bobOnion := bob.GetProfile().Onion
|
|
||||||
aliceOnion := alice.GetProfile().Onion
|
|
||||||
|
|
||||||
groupID, _, err := alice.StartGroup(groupName)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
groupAlice := alice.GetGroup(groupID)
|
|
||||||
if groupAlice.GroupID != groupID {
|
|
||||||
t.Errorf("Alice should be part of group %v, got %v instead", groupID, groupAlice)
|
|
||||||
}
|
|
||||||
|
|
||||||
exportedGroup, err := alice.ExportGroup(groupID)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = alice.InviteOnionToGroup(bobOnion, groupID)
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("onion invitation should fail since alice does no trust bob")
|
|
||||||
}
|
|
||||||
|
|
||||||
err = alice.TrustPeer(bobOnion)
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("trust peer should fail since alice does not know about bob")
|
|
||||||
}
|
|
||||||
|
|
||||||
// bob adds alice contact by importing serialized group created by alice
|
|
||||||
_, err = bob.ImportGroup(exportedGroup)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
err = bob.TrustPeer(aliceOnion)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("bob must be able to trust alice, got %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = bob.InviteOnionToGroup(aliceOnion, groupID)
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("bob trusts alice but peer connection is not ready yet. should not be able to invite her to group, instead got: %v", err)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
|
@ -67,7 +67,6 @@ func main() {
|
||||||
server := new(cwtchserver.Server)
|
server := new(cwtchserver.Server)
|
||||||
log.Infoln("starting cwtch server...")
|
log.Infoln("starting cwtch server...")
|
||||||
|
|
||||||
// TODO load params from .cwtch/server.conf or command line flag
|
|
||||||
// TODO: respond to HUP so t.Close is gracefully called
|
// TODO: respond to HUP so t.Close is gracefully called
|
||||||
server.Setup(serverConfig)
|
server.Setup(serverConfig)
|
||||||
|
|
||||||
|
|
|
@ -18,16 +18,16 @@ const (
|
||||||
|
|
||||||
// Monitors is a package of metrics for a Cwtch Server including message count, CPU, Mem, and conns
|
// Monitors is a package of metrics for a Cwtch Server including message count, CPU, Mem, and conns
|
||||||
type Monitors struct {
|
type Monitors struct {
|
||||||
MessageCounter Counter
|
MessageCounter Counter
|
||||||
TotalMessageCounter Counter
|
TotalMessageCounter Counter
|
||||||
Messages MonitorHistory
|
Messages MonitorHistory
|
||||||
CPU MonitorHistory
|
CPU MonitorHistory
|
||||||
Memory MonitorHistory
|
Memory MonitorHistory
|
||||||
ClientConns MonitorHistory
|
ClientConns MonitorHistory
|
||||||
starttime time.Time
|
starttime time.Time
|
||||||
breakChannel chan bool
|
breakChannel chan bool
|
||||||
log bool
|
log bool
|
||||||
configDir string
|
configDir string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start initializes a Monitors's monitors
|
// Start initializes a Monitors's monitors
|
||||||
|
@ -40,7 +40,12 @@ func (mp *Monitors) Start(ts tapir.Service, configDir string, log bool) {
|
||||||
|
|
||||||
// Maintain a count of total messages
|
// Maintain a count of total messages
|
||||||
mp.TotalMessageCounter = NewCounter()
|
mp.TotalMessageCounter = NewCounter()
|
||||||
mp.Messages = NewMonitorHistory(Count, Cumulative, func() (c float64) { c = float64(mp.MessageCounter.Count()); mp.TotalMessageCounter.Add(int(c)); mp.MessageCounter.Reset(); return })
|
mp.Messages = NewMonitorHistory(Count, Cumulative, func() (c float64) {
|
||||||
|
c = float64(mp.MessageCounter.Count())
|
||||||
|
mp.TotalMessageCounter.Add(int(c))
|
||||||
|
mp.MessageCounter.Reset()
|
||||||
|
return
|
||||||
|
})
|
||||||
|
|
||||||
var pidUsageLock sync.Mutex
|
var pidUsageLock sync.Mutex
|
||||||
mp.CPU = NewMonitorHistory(Percent, Average, func() float64 {
|
mp.CPU = NewMonitorHistory(Percent, Average, func() float64 {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"git.openprivacy.ca/openprivacy/connectivity/tor"
|
"git.openprivacy.ca/openprivacy/connectivity/tor"
|
||||||
"git.openprivacy.ca/openprivacy/log"
|
"git.openprivacy.ca/openprivacy/log"
|
||||||
"path"
|
"path"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server encapsulates a complete, compliant Cwtch server.
|
// Server encapsulates a complete, compliant Cwtch server.
|
||||||
|
@ -31,6 +32,7 @@ type Server struct {
|
||||||
onionServiceStopped bool
|
onionServiceStopped bool
|
||||||
running bool
|
running bool
|
||||||
existingMessageCount int
|
existingMessageCount int
|
||||||
|
lock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup initialized a server from a given configuration
|
// Setup initialized a server from a given configuration
|
||||||
|
@ -84,7 +86,10 @@ func (s *Server) Run(acn connectivity.ACN) error {
|
||||||
s.service.Listen(NewTokenBoardServer(ms, s.tokenServer))
|
s.service.Listen(NewTokenBoardServer(ms, s.tokenServer))
|
||||||
s.onionServiceStopped = true
|
s.onionServiceStopped = true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
s.lock.Lock()
|
||||||
s.running = true
|
s.running = true
|
||||||
|
s.lock.Unlock()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +106,8 @@ func (s *Server) KeyBundle() *model.KeyBundle {
|
||||||
|
|
||||||
// CheckStatus returns true if the server is running and/or an error if any part of the server needs to be restarted.
|
// CheckStatus returns true if the server is running and/or an error if any part of the server needs to be restarted.
|
||||||
func (s *Server) CheckStatus() (bool, error) {
|
func (s *Server) CheckStatus() (bool, error) {
|
||||||
|
s.lock.RLock()
|
||||||
|
defer s.lock.RUnlock()
|
||||||
if s.onionServiceStopped == true || s.tokenServiceStopped == true {
|
if s.onionServiceStopped == true || s.tokenServiceStopped == true {
|
||||||
return s.running, fmt.Errorf("one of more server components are down: onion:%v token service: %v", s.onionServiceStopped, s.tokenServiceStopped)
|
return s.running, fmt.Errorf("one of more server components are down: onion:%v token service: %v", s.onionServiceStopped, s.tokenServiceStopped)
|
||||||
}
|
}
|
||||||
|
@ -110,10 +116,13 @@ func (s *Server) CheckStatus() (bool, error) {
|
||||||
|
|
||||||
// Shutdown kills the app closing all connections and freeing all goroutines
|
// Shutdown kills the app closing all connections and freeing all goroutines
|
||||||
func (s *Server) Shutdown() {
|
func (s *Server) Shutdown() {
|
||||||
|
s.lock.Lock()
|
||||||
|
defer s.lock.Unlock()
|
||||||
s.service.Shutdown()
|
s.service.Shutdown()
|
||||||
s.tokenTapirService.Shutdown()
|
s.tokenTapirService.Shutdown()
|
||||||
s.metricsPack.Stop()
|
s.metricsPack.Stop()
|
||||||
s.running = false
|
s.running = true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Statistics is an encapsulation of information about the server that an operator might want to know at a glance.
|
// Statistics is an encapsulation of information about the server that an operator might want to know at a glance.
|
||||||
|
|
|
@ -319,25 +319,25 @@ func TestCwtchPeerIntegration(t *testing.T) {
|
||||||
fmt.Println("Starting conversation in group...")
|
fmt.Println("Starting conversation in group...")
|
||||||
// Conversation
|
// Conversation
|
||||||
fmt.Printf("%v> %v\n", aliceName, aliceLines[0])
|
fmt.Printf("%v> %v\n", aliceName, aliceLines[0])
|
||||||
err = alice.SendMessageToGroup(groupID, aliceLines[0])
|
_, err = alice.SendMessageToGroupTracked(groupID, aliceLines[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Alice failed to send a message to the group: %v", err)
|
t.Fatalf("Alice failed to send a message to the group: %v", err)
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
fmt.Printf("%v> %v\n", bobName, bobLines[0])
|
fmt.Printf("%v> %v\n", bobName, bobLines[0])
|
||||||
err = bob.SendMessageToGroup(groupID, bobLines[0])
|
_, err = bob.SendMessageToGroupTracked(groupID, bobLines[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Bob failed to send a message to the group: %v", err)
|
t.Fatalf("Bob failed to send a message to the group: %v", err)
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
fmt.Printf("%v> %v\n", aliceName, aliceLines[1])
|
fmt.Printf("%v> %v\n", aliceName, aliceLines[1])
|
||||||
alice.SendMessageToGroup(groupID, aliceLines[1])
|
alice.SendMessageToGroupTracked(groupID, aliceLines[1])
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
fmt.Printf("%v> %v\n", bobName, bobLines[1])
|
fmt.Printf("%v> %v\n", bobName, bobLines[1])
|
||||||
bob.SendMessageToGroup(groupID, bobLines[1])
|
bob.SendMessageToGroupTracked(groupID, bobLines[1])
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
fmt.Println("Alice inviting Carol to group...")
|
fmt.Println("Alice inviting Carol to group...")
|
||||||
|
@ -367,12 +367,12 @@ func TestCwtchPeerIntegration(t *testing.T) {
|
||||||
numGoRotinesPostCarolConnect := runtime.NumGoroutine()
|
numGoRotinesPostCarolConnect := runtime.NumGoroutine()
|
||||||
|
|
||||||
fmt.Printf("%v> %v", bobName, bobLines[2])
|
fmt.Printf("%v> %v", bobName, bobLines[2])
|
||||||
bob.SendMessageToGroup(groupID, bobLines[2])
|
bob.SendMessageToGroupTracked(groupID, bobLines[2])
|
||||||
// Bob should have enough tokens so we don't need to account for
|
// Bob should have enough tokens so we don't need to account for
|
||||||
// token acquisition here...
|
// token acquisition here...
|
||||||
|
|
||||||
fmt.Printf("%v> %v", carolName, carolLines[0])
|
fmt.Printf("%v> %v", carolName, carolLines[0])
|
||||||
carol.SendMessageToGroup(groupID, carolLines[0])
|
carol.SendMessageToGroupTracked(groupID, carolLines[0])
|
||||||
time.Sleep(time.Second * 30) // we need to account for spam-based token acquisition, but everything should
|
time.Sleep(time.Second * 30) // we need to account for spam-based token acquisition, but everything should
|
||||||
// be warmed-up and delays should be pretty small.
|
// be warmed-up and delays should be pretty small.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue