cwtchbot/bot.go

118 lines
3.4 KiB
Go
Raw Permalink Normal View History

2019-10-28 02:09:02 +00:00
package bot
import (
2020-11-09 21:45:13 +00:00
"crypto/rand"
2019-10-28 02:09:02 +00:00
"cwtch.im/cwtch/app"
"cwtch.im/cwtch/event"
"cwtch.im/cwtch/model/constants"
2019-10-28 02:09:02 +00:00
"cwtch.im/cwtch/peer"
"cwtch.im/cwtch/protocol/connections"
"cwtch.im/cwtch/settings"
2020-11-09 21:45:13 +00:00
"encoding/base64"
"encoding/json"
2020-11-09 21:45:13 +00:00
"git.openprivacy.ca/openprivacy/connectivity"
"git.openprivacy.ca/openprivacy/connectivity/tor"
"git.openprivacy.ca/openprivacy/log"
2023-02-07 21:42:08 +00:00
mrand "math/rand"
2020-11-09 21:45:13 +00:00
"os"
2019-10-28 02:09:02 +00:00
"path"
2020-11-09 21:45:13 +00:00
"path/filepath"
2019-10-28 02:09:02 +00:00
"time"
)
type CwtchBot struct {
dir string
Peer peer.CwtchPeer
Queue event.Queue
acn connectivity.ACN
peername string
engineHooks connections.EngineHooks
2019-10-28 02:09:02 +00:00
}
func NewCwtchBot(userdir string, peername string) *CwtchBot {
cb := new(CwtchBot)
cb.dir = userdir
cb.peername = peername
cb.engineHooks = connections.DefaultEngineHooks{}
2019-10-28 02:09:02 +00:00
return cb
}
func (cb *CwtchBot) HookEngine(hooks connections.EngineHooks) {
cb.engineHooks = hooks
}
type MessageWrapper struct {
2023-02-07 21:42:08 +00:00
Overlay int `json:"o"`
Data string `json:"d"`
}
2023-02-07 21:42:08 +00:00
func (cb *CwtchBot) PackMessage(overlay int, message string) []byte {
mw := new(MessageWrapper)
mw.Overlay = overlay
mw.Data = message
2023-02-07 21:42:08 +00:00
data, _ := json.Marshal(mw)
return data
}
2023-02-07 21:42:08 +00:00
func (cb *CwtchBot) UnpackMessage(message string) MessageWrapper {
mw := new(MessageWrapper)
json.Unmarshal([]byte(message), mw)
return *mw
}
2019-10-28 02:09:02 +00:00
func (cb *CwtchBot) Launch() {
2020-11-09 21:45:13 +00:00
mrand.Seed(int64(time.Now().Nanosecond()))
port := mrand.Intn(1000) + 9600
controlPort := port + 1
// generate a random password (actually random, stored in memory, for the control port)
key := make([]byte, 64)
_, err := rand.Read(key)
if err != nil {
panic(err)
}
log.Infof("making directory %v", cb.dir)
2023-02-07 21:42:08 +00:00
os.MkdirAll(path.Join(cb.dir, "/.tor", "tor"), 0700)
2020-11-09 21:45:13 +00:00
tor.NewTorrc().WithSocksPort(port).WithOnionTrafficOnly().WithControlPort(controlPort).WithHashedPassword(base64.StdEncoding.EncodeToString(key)).Build(filepath.Join(cb.dir, ".tor", "tor", "torrc"))
2023-02-07 21:42:08 +00:00
cb.acn, err = tor.NewTorACNWithAuth(path.Join(cb.dir, "/.tor"), "", path.Join(cb.dir, "/.tor", "data"), controlPort, tor.HashedPasswordAuthenticator{base64.StdEncoding.EncodeToString(key)})
2019-10-28 02:09:02 +00:00
if err != nil {
log.Errorf("\nError connecting to Tor: %v\n", err)
}
cb.acn.WaitTillBootstrapped()
settingsFile, _ := settings.InitGlobalSettingsFile(cb.dir, "")
gSettings := settingsFile.ReadGlobalSettings()
gSettings.ExperimentsEnabled = true
gSettings.DownloadPath = "./"
gSettings.Experiments[constants.FileSharingExperiment] = true
gSettings.Experiments[constants.ImagePreviewsExperiment] = true
settingsFile.WriteGlobalSettings(gSettings)
app := app.NewApp(cb.acn, cb.dir, settingsFile)
app.InstallEngineHooks(cb.engineHooks)
2019-10-28 02:09:02 +00:00
app.LoadProfiles("")
2023-02-07 21:42:08 +00:00
if len(app.ListProfiles()) == 0 {
app.CreateProfile(cb.peername, "", true)
2019-10-28 02:09:02 +00:00
}
2023-02-07 21:42:08 +00:00
peers := app.ListProfiles()
2023-02-07 21:42:08 +00:00
for _, onion := range peers {
2019-10-28 02:09:02 +00:00
cb.Peer = app.GetPeer(onion)
cb.Queue = event.NewQueue()
eb := app.GetEventBus(onion)
eb.Subscribe(event.NewMessageFromPeer, cb.Queue)
eb.Subscribe(event.PeerAcknowledgement, cb.Queue)
eb.Subscribe(event.NewMessageFromGroup, cb.Queue)
eb.Subscribe(event.NewGroupInvite, cb.Queue)
eb.Subscribe(event.SendMessageToGroupError, cb.Queue)
eb.Subscribe(event.SendMessageToPeerError, cb.Queue)
eb.Subscribe(event.ServerStateChange, cb.Queue)
eb.Subscribe(event.PeerStateChange, cb.Queue)
2023-02-07 21:42:08 +00:00
eb.Subscribe(event.NewGetValMessageFromPeer, cb.Queue)
eb.Subscribe(event.ContactCreated, cb.Queue)
2019-10-28 02:09:02 +00:00
}
2023-02-07 21:42:08 +00:00
app.ActivateEngines(true, true, true)
2019-10-28 02:09:02 +00:00
}