Merge pull request 'add get[Profile|Conversation]Attribute api' (#81) from getAttr into trunk
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
Reviewed-on: #81 Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
This commit is contained in:
commit
3ad0bc904c
|
@ -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
2
go.mod
|
@ -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
4
go.sum
|
@ -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
62
lib.go
|
@ -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)
|
||||
|
|
Reference in New Issue