Merge pull request 'add get[Profile|Conversation]Attribute api' (#81) from getAttr into trunk

Reviewed-on: cwtch.im/libcwtch-go#81
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
This commit is contained in:
Dan Ballard 2022-04-05 00:48:54 +00:00
commit 3ad0bc904c
4 changed files with 73 additions and 4 deletions

View File

@ -21,6 +21,11 @@ Other version combinations untested and some definitely do not work.
# Using
## General Environment Variables
- `LOG_FILE` if defined will mean all go logging will go to a file instead of stdout
- `LOG_LEVEL` if set to `debug` will cause debug logging to be included in log output
## Linux Desktop:
- `LD_LIBRARY_PATH` set to point to `libCwtch.so`
@ -33,3 +38,7 @@ Other version combinations untested and some definitely do not work.
## Windows
- copy libCwtch.dll into the directory of the `.exe` using it
## MacOS
- copy libCwtch.dylib into the directory you are executing from

2
go.mod
View File

@ -3,7 +3,7 @@ module git.openprivacy.ca/cwtch.im/libcwtch-go
go 1.15
require (
cwtch.im/cwtch v0.16.3
cwtch.im/cwtch v0.16.4
git.openprivacy.ca/cwtch.im/server v1.4.2
git.openprivacy.ca/openprivacy/connectivity v1.8.1
git.openprivacy.ca/openprivacy/log v1.0.3

4
go.sum
View File

@ -11,8 +11,8 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cwtch.im/cwtch v0.14.9/go.mod h1:/fLuoYLY/7JHw6RojFojpd245CiOcU24QpWqzh9FRDI=
cwtch.im/cwtch v0.16.3 h1:8R1Cq8xeY3h+x0ZA4eqOgVfazfsJPwBNN/JP6lSAg60=
cwtch.im/cwtch v0.16.3/go.mod h1:lG9e5RUib+SbX2XsjWtHKJWz9geoIglSAq55LrCm8Io=
cwtch.im/cwtch v0.16.4 h1:ytzmQXPdllQdMf9qX5fEq38+eAL4MzsUTcmu6tPZt7c=
cwtch.im/cwtch v0.16.4/go.mod h1:lG9e5RUib+SbX2XsjWtHKJWz9geoIglSAq55LrCm8Io=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU=
filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=

62
lib.go
View File

@ -1018,7 +1018,7 @@ func SetProfileAttribute(profileOnion string, key string, value string) {
if profile != nil {
zone, key := attr.ParseZone(key)
// TODO We only allow public.profile.zone to be set for now.
// TODO We only allow public.profile.key to be set for now.
// All other scopes and zones need to be added explicitly or handled by Cwtch.
if zone == attr.ProfileZone && key == constants.Name {
profile.SetScopedZonedAttribute(attr.PublicScope, attr.ProfileZone, constants.Name, value)
@ -1028,6 +1028,39 @@ func SetProfileAttribute(profileOnion string, key string, value string) {
}
}
// Attribute is a struct to return the dual values of an attempt at a Get*Attribute API call, meant to be json searlialized
type Attribute struct {
Exists bool
Value string
}
//export c_GetProfileAttribute
func c_GetProfileAttribute(profile_ptr *C.char, profile_len C.int, key_ptr *C.char, key_len C.int) *C.char {
profileOnion := C.GoStringN(profile_ptr, profile_len)
key := C.GoStringN(key_ptr, key_len)
return C.CString(GetProfileAttribute(profileOnion, key))
}
// GetProfileAttribute provides a wrapper around profile.GetScopedZonedAttribute
// Key must have the format zone.key where Zone is defined in Cwtch. Unknown zones are not permitted.
// Currently forcing the Public Scope
// Returns json of Attribute
func GetProfileAttribute(profileOnion string, key string) string {
profile := application.GetPeer(profileOnion)
if profile != nil {
zone, key := attr.ParseZone(key)
res, exists := profile.GetScopedZonedAttribute(attr.PublicScope, zone, key)
attr := Attribute{exists, res}
json, _ := json.Marshal(attr)
return string(json)
}
empty := Attribute{false, ""}
json, _ := json.Marshal(empty)
return (string(json))
}
//export c_SetConversationAttribute
func c_SetConversationAttribute(profile_ptr *C.char, profile_len C.int, conversation_id C.int, key_ptr *C.char, key_len C.int, val_ptr *C.char, val_len C.int) {
profileOnion := C.GoStringN(profile_ptr, profile_len)
@ -1037,12 +1070,39 @@ func c_SetConversationAttribute(profile_ptr *C.char, profile_len C.int, conversa
}
// SetConversationAttribute provides a wrapper around profile.SetProfileAttribute
// key is of format Zone.Key, and the API forces the Local Scope
func SetConversationAttribute(profileOnion string, conversationID int, key string, value string) {
profile := application.GetPeer(profileOnion)
zone, key := attr.ParseZone(key)
profile.SetConversationAttribute(conversationID, attr.LocalScope.ConstructScopedZonedPath(zone.ConstructZonedPath(key)), value)
}
//export c_GetConversationAttribute
func c_GetConversationAttribute(profile_ptr *C.char, profile_len C.int, conversation_id C.int, key_ptr *C.char, key_len C.int) *C.char {
profileOnion := C.GoStringN(profile_ptr, profile_len)
key := C.GoStringN(key_ptr, key_len)
return C.CString(GetConversationAttribute(profileOnion, int(conversation_id), key))
}
// GetGonversationAttribute provides a wrapper around profile.GetGonversationAttribute
// key is of format Scope.Zone.Key
// Returns json of an Attribute
func GetConversationAttribute(profileOnion string, conversationID int, key string) string {
profile := application.GetPeer(profileOnion)
if profile != nil {
scope, zonekey := attr.ParseScope(key)
zone, key := attr.ParseZone(zonekey)
res, err := profile.GetConversationAttribute(conversationID, scope.ConstructScopedZonedPath(zone.ConstructZonedPath(key)))
attr := Attribute{err == nil, res}
json, _ := json.Marshal(attr)
return string(json)
}
empty := Attribute{false, ""}
json, _ := json.Marshal(empty)
return (string(json))
}
//export c_SetMessageAttribute
func c_SetMessageAttribute(profile_ptr *C.char, profile_len C.int, conversation_id C.int, channel_id C.int, message_id C.int, key_ptr *C.char, key_len C.int, val_ptr *C.char, val_len C.int) {
profileOnion := C.GoStringN(profile_ptr, profile_len)