diff --git a/go.sum b/go.sum index 99ac0aa..859044d 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -cwtch.im/cwtch v0.18.0 h1:7Gz9FwoxMEFKvBzSnf/TLd7PkOgHsIq2IvFPHWAvBaU= cwtch.im/cwtch v0.18.0/go.mod h1:StheazFFY7PKqBbEyDVLhzWW6WOat41zV0ckC240c5Y= cwtch.im/cwtch v0.18.1 h1:Z5doy6bMLMZFyLRXOxiZ0CjyUGA3Y59mrN4Ps0/HAw8= cwtch.im/cwtch v0.18.1/go.mod h1:StheazFFY7PKqBbEyDVLhzWW6WOat41zV0ckC240c5Y= @@ -81,8 +80,6 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -98,20 +95,12 @@ golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9t golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20210220033013-bdb1ca9a1e08 h1:h+GZ3ubjuWaQjGe8owMGcmMVCqs0xYJtRG5y2bpHaqU= golang.org/x/mobile v0.0.0-20210220033013-bdb1ca9a1e08/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= -golang.org/x/mobile v0.0.0-20210901025245-1fde1d6c3ca1 h1:t3ZHqovedSY8DEAUmZA99fPJhUhOb176PLACYA1sJ8Y= -golang.org/x/mobile v0.0.0-20210901025245-1fde1d6c3ca1/go.mod h1:jFTmtFYCV0MFtXBU+J5V/+5AUeVS0ON/0WkE/KSrl6E= -golang.org/x/mobile v0.0.0-20220722155234-aaac322e2105 h1:3vUV5x5+3LfQbgk7paCM6INOaJG9xXQbn79xoNkwfIk= -golang.org/x/mobile v0.0.0-20220722155234-aaac322e2105/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -121,9 +110,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -146,11 +133,8 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -170,14 +154,10 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/lib.go b/lib.go index 2c692b2..fb6dd5a 100644 --- a/lib.go +++ b/lib.go @@ -13,16 +13,15 @@ import ( "encoding/json" "fmt" "git.openprivacy.ca/cwtch.im/libcwtch-go/features" - "io/ioutil" path "path/filepath" "runtime/pprof" - // Import SQL Cipher "os/user" "runtime" "strings" "unsafe" + // Import SQL Cipher _ "github.com/mutecomm/go-sqlcipher/v4" "cwtch.im/cwtch/app" @@ -84,11 +83,12 @@ func c_StartCwtch(dir_c *C.char, len C.int, tor_c *C.char, torLen C.int) C.int { } // StartCwtch starts cwtch in the library and initlaizes all data structures -// GetAppbusEvents is always safe to use -// the rest of functions are unsafe until the CwtchStarted event has been received indicating StartCwtch has completed -// returns: -// message: CwtchStarted when start up is complete and app is safe to use -// CwtchStartError message when start up fails (includes event.Error data field) +// +// GetAppbusEvents is always safe to use +// the rest of functions are unsafe until the CwtchStarted event has been received indicating StartCwtch has completed +// returns: +// message: CwtchStarted when start up is complete and app is safe to use +// CwtchStartError message when start up fails (includes event.Error data field) func StartCwtch(appDir string, torPath string) int { if logfile := os.Getenv("LOG_FILE"); logfile != "" { filelog, err := log.NewFile(log.LevelInfo, logfile) @@ -272,7 +272,7 @@ func buildACN(settings utils.GlobalSettings, torPath string, appDir string) conn } } - if dataDir, err = ioutil.TempDir(torDir, "data-dir-"); err != nil { + if dataDir, err = os.MkdirTemp(torDir, "data-dir-"); err != nil { eventHandler.Push(event.NewEventList(utils.CwtchStartError, event.Error, fmt.Sprintf("Error connecting to Tor: %v", err))) return &connectivity.ErrorACN{} } @@ -362,8 +362,9 @@ func publishLoadedServers() { } } -//export c_SendAppEvent // A generic method for Rebroadcasting App Events from a UI +// +//export c_SendAppEvent func c_SendAppEvent(json_ptr *C.char, json_len C.int) { eventJson := C.GoStringN(json_ptr, json_len) SendAppEvent(eventJson) @@ -458,8 +459,9 @@ func SendAppEvent(eventJson string) { } } -//export c_SendProfileEvent // A generic method for Rebroadcasting Profile Events from a UI +// +//export c_SendProfileEvent func c_SendProfileEvent(onion_ptr *C.char, onion_len C.int, json_ptr *C.char, json_len C.int) { onion := C.GoStringN(onion_ptr, onion_len) eventJson := C.GoStringN(json_ptr, json_len) @@ -496,8 +498,9 @@ func SendProfileEvent(onion string, eventJson string) { } } -//export c_GetAppBusEvent // the pointer returned from this function **must** be freed using c_Free +// +//export c_GetAppBusEvent func c_GetAppBusEvent() *C.char { return C.CString(GetAppBusEvent()) } @@ -576,8 +579,9 @@ func UnblockContact(profileOnion string, conversationID int) { } } -//export c_GetMessage // the pointer returned from this function **must** be Freed by c_Free +// +//export c_GetMessage func c_GetMessage(profile_ptr *C.char, profile_len C.int, conversation_id C.int, message_index C.int) *C.char { profile := C.GoStringN(profile_ptr, profile_len) return C.CString(GetMessage(profile, int(conversation_id), int(message_index))) @@ -624,8 +628,9 @@ func GetMessage(profileOnion string, conversationID int, messageIndex int) strin return string(bytes) } -//export c_GetMessageByID // the pointer returned from this function **must** be Freed by c_Free +// +//export c_GetMessageByID func c_GetMessageByID(profile_ptr *C.char, profile_len C.int, conversation_id C.int, message_index C.int) *C.char { profile := C.GoStringN(profile_ptr, profile_len) return C.CString(GetMessageByID(profile, int(conversation_id), int(message_index))) @@ -662,8 +667,9 @@ func GetMessageByID(profileOnion string, conversationID int, messageID int) stri return string(bytes) } -//export c_GetMessagesByContentHash // the pointer returned from this function **must** be freed by calling c_Free +// +//export c_GetMessagesByContentHash func c_GetMessagesByContentHash(profile_ptr *C.char, profile_len C.int, conversation_id C.int, contenthash_ptr *C.char, contenthash_len C.int) *C.char { profile := C.GoStringN(profile_ptr, profile_len) contentHash := C.GoStringN(contenthash_ptr, contenthash_len) @@ -702,8 +708,9 @@ func GetMessagesByContentHash(profileOnion string, handle int, contentHash strin return string(bytes) } -//export c_GetSharedFiles // the pointer returned from this function **must** be Freed by c_Free +// +//export c_GetSharedFiles func c_GetSharedFiles(profile_ptr *C.char, profile_len C.int, conversation_id C.int) *C.char { profile := C.GoStringN(profile_ptr, profile_len) return C.CString(GetSharedFiles(profile, int(conversation_id))) @@ -765,8 +772,9 @@ func StopSharing(profileOnion string, filekey string) { } } -//export c_GetMessages // the pointer returned from this function **must** be Freed by c_Free +// +//export c_GetMessages func c_GetMessages(profile_ptr *C.char, profile_len C.int, conversation_id C.int, message_index C.int, count C.int) *C.char { profile := C.GoStringN(profile_ptr, profile_len) return C.CString(GetMessages(profile, int(conversation_id), int(message_index), int(count))) @@ -809,8 +817,9 @@ func GetMessages(profileOnion string, conversationID int, messageIndex int, coun return string(bytes) } -//export c_FreePointer // Dangerous function. Should only be used as documented in `MEMORY.md` +// +//export c_FreePointer func c_FreePointer(ptr *C.char) { C.free(unsafe.Pointer(ptr)) } diff --git a/utils/eventHandler.go b/utils/eventHandler.go index 12fcb99..9a7ba6d 100644 --- a/utils/eventHandler.go +++ b/utils/eventHandler.go @@ -585,6 +585,25 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string { } } } + case event.TokenManagerInfo: + conversations, err := profile.FetchConversations() + if err == nil { + var associatedGroups []int + for _, ci := range conversations { + groupServer, groupServerExists := ci.Attributes[attr.LocalScope.ConstructScopedZonedPath(attr.LegacyGroupZone.ConstructZonedPath(constants.GroupServer)).ToString()] + if groupServerExists { + gci, err := profile.FetchConversationInfo(groupServer) + if err == nil { + tokenOnion, onionExists := gci.Attributes[attr.PublicScope.ConstructScopedZonedPath(attr.ServerKeyZone.ConstructZonedPath(string(model.KeyTypeTokenOnion))).ToString()] + if onionExists && tokenOnion == ev.Event.Data[event.ServerTokenOnion] { + associatedGroups = append(associatedGroups, ci.ID) + } + } + } + } + associatedGroupsJson, _ := json.Marshal(associatedGroups) + ev.Event.Data[event.Data] = string(associatedGroupsJson) + } } } @@ -625,6 +644,7 @@ func (eh *EventHandler) startHandlingPeer(onion string) { eventBus.Subscribe(event.ManifestSaved, q) eventBus.Subscribe(event.FileDownloadProgressUpdate, q) eventBus.Subscribe(event.FileDownloaded, q) + eventBus.Subscribe(event.TokenManagerInfo, q) go eh.forwardProfileMessages(onion, q) @@ -644,8 +664,9 @@ func (eh *EventHandler) forwardProfileMessages(onion string, q event.Queue) { } // Push pushes an event onto the app event bus -// It is also a way for libCwtch-go to publish an event for consumption by a UI before a Cwtch app has been initialized -// use: to signal an error before a cwtch app could be created +// +// It is also a way for libCwtch-go to publish an event for consumption by a UI before a Cwtch app has been initialized +// use: to signal an error before a cwtch app could be created func (eh *EventHandler) Push(newEvent event.Event) { eh.appBusQueue.Publish(newEvent) } diff --git a/utils/settings.go b/utils/settings.go index 88406fd..e725e2a 100644 --- a/utils/settings.go +++ b/utils/settings.go @@ -9,7 +9,6 @@ import ( "cwtch.im/cwtch/storage/v1" "encoding/json" - "io/ioutil" "os" "git.openprivacy.ca/openprivacy/log" @@ -89,7 +88,7 @@ func InitGlobalSettingsFile(directory string, password string) error { lock.Lock() defer lock.Unlock() var key [32]byte - salt, err := ioutil.ReadFile(path.Join(directory, saltFile)) + salt, err := os.ReadFile(path.Join(directory, saltFile)) if err != nil { log.Infof("Could not find salt file: %v (creating a new settings file)", err) var newSalt [128]byte @@ -99,7 +98,7 @@ func InitGlobalSettingsFile(directory string, password string) error { return err } os.Mkdir(directory, 0700) - err := ioutil.WriteFile(path.Join(directory, saltFile), newSalt[:], 0600) + err := os.WriteFile(path.Join(directory, saltFile), newSalt[:], 0600) if err != nil { log.Errorf("Could not write salt file: %v", err) return err