1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-07 21:37:04 +09:00

GO-4400 WIP new invite without approve logic

This commit is contained in:
Mikhail Rakhmanov 2025-05-13 15:36:40 +02:00
parent 3097b3855b
commit f610462beb
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
11 changed files with 759 additions and 661 deletions

View file

@ -399,47 +399,75 @@ func (a *aclService) Join(ctx context.Context, spaceId, networkId string, invite
if err != nil {
return convertedOrInternalError("get invite payload", err)
}
if invitePayload.InviteType == model.InvitePayload_JoinAsGuest {
switch invitePayload.InviteType {
case model.InvitePayload_JoinAsGuest:
guestKey, err := crypto.UnmarshalEd25519PrivateKeyProto(invitePayload.GuestKey)
if err != nil {
return convertedOrInternalError("unmarshal invite key", err)
}
return a.joinAsGuest(ctx, invitePayload.SpaceId, guestKey)
}
inviteKey, err := crypto.UnmarshalEd25519PrivateKeyProto(invitePayload.AclKey)
if err != nil {
return convertedOrInternalError("unmarshal invite key", err)
}
aclHeadId, err := a.joiningClient.RequestJoin(ctx, spaceId, list.RequestJoinPayload{
InviteKey: inviteKey,
Metadata: a.spaceService.AccountMetadataPayload(),
})
if err != nil {
if errors.Is(err, coordinatorproto.ErrSpaceIsDeleted) {
return space.ErrSpaceDeleted
case model.InvitePayload_JoinAsMember:
inviteKey, err := crypto.UnmarshalEd25519PrivateKeyProto(invitePayload.AclKey)
if err != nil {
return convertedOrInternalError("unmarshal invite key", err)
}
if errors.Is(err, list.ErrInsufficientPermissions) {
err = a.joiningClient.CancelRemoveSelf(ctx, spaceId)
if err != nil {
return convertedOrAclRequestError(err)
aclHeadId, err := a.joiningClient.RequestJoin(ctx, spaceId, list.RequestJoinPayload{
InviteKey: inviteKey,
Metadata: a.spaceService.AccountMetadataPayload(),
})
if err != nil {
if errors.Is(err, coordinatorproto.ErrSpaceIsDeleted) {
return space.ErrSpaceDeleted
}
err = a.spaceService.CancelLeave(ctx, spaceId)
if err != nil {
return convertedOrInternalError("cancel leave", err)
if errors.Is(err, list.ErrInsufficientPermissions) {
err = a.joiningClient.CancelRemoveSelf(ctx, spaceId)
if err != nil {
return convertedOrAclRequestError(err)
}
err = a.spaceService.CancelLeave(ctx, spaceId)
if err != nil {
return convertedOrInternalError("cancel leave", err)
}
}
return convertedOrAclRequestError(err)
}
err = a.spaceService.Join(ctx, spaceId, aclHeadId)
if err != nil {
return convertedOrInternalError("join space", err)
}
err = a.spaceService.TechSpace().SpaceViewSetData(ctx, spaceId,
domain.NewDetails().
SetString(bundle.RelationKeyName, invitePayload.SpaceName).
SetString(bundle.RelationKeyIconImage, invitePayload.SpaceIconCid))
if err != nil {
return convertedOrInternalError("set space data", err)
}
case model.InvitePayload_JoinAsMemberWithoutApprove:
inviteKey, err := crypto.UnmarshalEd25519PrivateKeyProto(invitePayload.AclKey)
if err != nil {
return convertedOrInternalError("unmarshal invite key", err)
}
aclHeadId, err := a.joiningClient.InviteJoin(ctx, spaceId, list.InviteJoinPayload{
InviteKey: inviteKey,
Metadata: a.spaceService.AccountMetadataPayload(),
})
if err != nil {
if errors.Is(err, coordinatorproto.ErrSpaceIsDeleted) {
return space.ErrSpaceDeleted
}
return convertedOrAclRequestError(err)
}
err = a.spaceService.InviteJoin(ctx, spaceId, aclHeadId)
if err != nil {
return convertedOrInternalError("join space", err)
}
err = a.spaceService.TechSpace().SpaceViewSetData(ctx, spaceId,
domain.NewDetails().
SetString(bundle.RelationKeyName, invitePayload.SpaceName).
SetString(bundle.RelationKeyIconImage, invitePayload.SpaceIconCid))
if err != nil {
return convertedOrInternalError("set space data", err)
}
return convertedOrAclRequestError(err)
}
err = a.spaceService.Join(ctx, spaceId, aclHeadId)
if err != nil {
return convertedOrInternalError("join space", err)
}
err = a.spaceService.TechSpace().SpaceViewSetData(ctx, spaceId,
domain.NewDetails().
SetString(bundle.RelationKeyName, invitePayload.SpaceName).
SetString(bundle.RelationKeyIconImage, invitePayload.SpaceIconCid))
if err != nil {
return convertedOrInternalError("set space data", err)
}
return nil
}
@ -473,7 +501,7 @@ func (a *aclService) ViewInvite(ctx context.Context, inviteCid cid.Cid, inviteFi
if err != nil {
return domain.InviteView{}, convertedOrAclRequestError(err)
}
lst, err := list.BuildAclListWithIdentity(a.accountService.Keys(), store, recordverifier.NewValidateFull())
lst, err := list.BuildAclListWithIdentity(a.accountService.Keys(), store, recordverifier.New())
if err != nil {
return domain.InviteView{}, convertedOrAclRequestError(err)
}

View file

@ -11,10 +11,30 @@ import (
"github.com/anyproto/any-sync/commonspace/object/acl/recordverifier"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
"github.com/anyproto/any-sync/consensus/consensusproto"
"github.com/anyproto/any-sync/util/crypto"
"golang.org/x/exp/slices"
)
type recordVerifier struct {
}
func (r recordVerifier) Init(a *app.App) (err error) {
return nil
}
func (r recordVerifier) Name() (name string) {
return recordverifier.CName
}
func (r recordVerifier) VerifyAcceptor(rec *consensusproto.RawRecord) (err error) {
return nil
}
func (r recordVerifier) ShouldValidate() bool {
return false
}
type DataConverter interface {
Unmarshall(dataType string, decrypted []byte) (any, error)
Marshall(model any) (data []byte, dataType string, err error)
@ -35,7 +55,7 @@ func prepareExport(ctx context.Context, readable objecttree.ReadableObjectTree,
if err != nil {
return nil, err
}
newAcl, err := list.BuildAclListWithIdentity(keys, listStorage, recordverifier.NewValidateFull())
newAcl, err := list.BuildAclListWithIdentity(keys, listStorage, recordVerifier{})
if err != nil {
return nil, err
}

View file

@ -10,7 +10,6 @@ import (
"github.com/anyproto/any-sync/commonspace/headsync/headstorage"
"github.com/anyproto/any-sync/commonspace/object/accountdata"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/object/acl/recordverifier"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/anytype-heart/util/ziputil"
@ -81,7 +80,7 @@ func ImportStorage(ctx context.Context, path string) (res ImportResult, err erro
if err != nil {
return
}
acl, err := list.BuildAclListWithIdentity(randomKeys, listStorage, recordverifier.NewValidateFull())
acl, err := list.BuildAclListWithIdentity(randomKeys, listStorage, recordVerifier{})
if err != nil {
return
}

View file

@ -32686,6 +32686,7 @@ Look https://github.com/golang/protobuf/issues/1135 for more information.
| ---- | ------ | ----------- |
| JoinAsMember | 0 | aclKey contains the key to sign the ACL record |
| JoinAsGuest | 1 | guestKey contains the privateKey of the guest user |
| JoinAsMemberWithoutApprove | 2 | aclKey contains the key to sign the ACL record and decrypt the read key |

13
go.mod
View file

@ -7,8 +7,8 @@ require (
github.com/PuerkitoBio/goquery v1.10.2
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-store v0.1.13
github.com/anyproto/any-sync v0.7.6-0.20250512130421-216a06119435
github.com/anyproto/any-store v0.2.0
github.com/anyproto/any-sync v0.7.6-0.20250513132905-854823d81e74
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a
github.com/anyproto/anytype-push-server/pushclient v0.0.0-20250402124745-6451298047f7
github.com/anyproto/go-chash v0.1.0
@ -94,8 +94,6 @@ require (
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
github.com/stretchr/testify v1.10.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag/v2 v2.0.0-rc4
github.com/uber/jaeger-client-go v2.30.0+incompatible
github.com/valyala/fastjson v1.6.4
@ -107,7 +105,7 @@ require (
go.uber.org/mock v0.5.2
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
golang.org/x/image v0.27.0
golang.org/x/mobile v0.0.0-20250218173827-cd096645fcd3
golang.org/x/net v0.40.0
@ -261,7 +259,6 @@ require (
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/sv-tools/openapi v0.2.1 // indirect
github.com/swaggo/swag v1.16.4 // indirect
github.com/tetratelabs/wazero v1.8.1 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
@ -292,9 +289,9 @@ require (
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
lukechampine.com/blake3 v1.4.0 // indirect
modernc.org/libc v1.62.1 // indirect
modernc.org/libc v1.65.0 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.9.1 // indirect
modernc.org/memory v1.10.0 // indirect
modernc.org/sqlite v1.37.0 // indirect
nhooyr.io/websocket v1.8.7 // indirect
)

52
go.sum
View file

@ -78,20 +78,12 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/anyproto/any-store v0.1.13 h1:1wmm0qQIRShaycBLKwcgkQbRKy3WrNPAShTE5fwzfCY=
github.com/anyproto/any-store v0.1.13/go.mod h1:2M0Xf4rmijoKGd+nqqeKG8I1yIokCLEIxrAXEoHjXn4=
github.com/anyproto/any-sync v0.6.15 h1:fxZHjiMcZJzJqzBprBNTYmm0MV8Y7NgIGPfLxlsgnWk=
github.com/anyproto/any-sync v0.6.15/go.mod h1:TSKgCoTV40Bt8AfCh3RxPUUAfYGrhc8Mzh8/AiVlvX4=
github.com/anyproto/any-sync v0.7.2 h1:S1UPzW0iYTLwsMAZ3rN/EJwthTGuadsvXdnGYNiC6cA=
github.com/anyproto/any-sync v0.7.2/go.mod h1:TSKgCoTV40Bt8AfCh3RxPUUAfYGrhc8Mzh8/AiVlvX4=
github.com/anyproto/any-sync v0.7.4 h1:pEkPn1fxJGvSGlsnAOy0lWVaqRgymyddmNy7T9toUQk=
github.com/anyproto/any-sync v0.7.4/go.mod h1:TSKgCoTV40Bt8AfCh3RxPUUAfYGrhc8Mzh8/AiVlvX4=
github.com/anyproto/any-sync v0.7.5 h1:VHayuacVpa2eRu5ubxCwrL3l0f/OSN7p45L8TxnaJEw=
github.com/anyproto/any-sync v0.7.5/go.mod h1:02tMeQ6s/tneWLhoyzvy/ocGswICtvI48kdwTU8hQf8=
github.com/anyproto/any-sync v0.7.6-0.20250512115929-ae90afb97d1c h1:eBuoWi/lgqxRLEh26ksWzSx3CTU1RdrWptLZWBPTRhA=
github.com/anyproto/any-sync v0.7.6-0.20250512115929-ae90afb97d1c/go.mod h1:02tMeQ6s/tneWLhoyzvy/ocGswICtvI48kdwTU8hQf8=
github.com/anyproto/any-sync v0.7.6-0.20250512130421-216a06119435 h1:pABYN1hf08R/GgUQMhzsyDjEVcvtx2zsqgYmpyZZNT4=
github.com/anyproto/any-sync v0.7.6-0.20250512130421-216a06119435/go.mod h1:02tMeQ6s/tneWLhoyzvy/ocGswICtvI48kdwTU8hQf8=
github.com/anyproto/any-store v0.2.0 h1:M8Eb0dxuEk62lIGZ3k1nADlaPQzmo6ilWLCCcY9WX10=
github.com/anyproto/any-store v0.2.0/go.mod h1:N59OGYe/uXRNpr6ytfbBpbC+1viDgSbsVNXevOMxJAM=
github.com/anyproto/any-sync v0.7.6-0.20250512200224-c2de5ecb12c0 h1:ZS9++jR+3NCP5MK/aBy/McoyLiwsBzA7jwMDI15+b9o=
github.com/anyproto/any-sync v0.7.6-0.20250512200224-c2de5ecb12c0/go.mod h1:G6i3PT6pN6lcC5rim5Ed7ppUPuQgU5PyHgiqskrggL0=
github.com/anyproto/any-sync v0.7.6-0.20250513132905-854823d81e74 h1:Io1SWrvvWjnXjtJsNvRcfvv52U6H7DAHLHcpkm8Vo7A=
github.com/anyproto/any-sync v0.7.6-0.20250513132905-854823d81e74/go.mod h1:G6i3PT6pN6lcC5rim5Ed7ppUPuQgU5PyHgiqskrggL0=
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a h1:ZZM+0OUCQMWSLSflpkf0ZMVo3V76qEDDIXPpQOClNs0=
github.com/anyproto/anytype-publish-server/publishclient v0.0.0-20250131145601-de288583ff2a/go.mod h1:4fkueCZcGniSMXkrwESO8zzERrh/L7WHimRNWecfGM0=
github.com/anyproto/anytype-push-server/pushclient v0.0.0-20250402124745-6451298047f7 h1:oKkEnxnN1jeB1Ty20CTMH3w4WkCrV8dOQy1Myetg7XA=
@ -322,8 +314,6 @@ github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+E
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
@ -1062,12 +1052,6 @@ github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/sv-tools/openapi v0.2.1 h1:ES1tMQMJFGibWndMagvdoo34T1Vllxr1Nlm5wz6b1aA=
github.com/sv-tools/openapi v0.2.1/go.mod h1:k5VuZamTw1HuiS9p2Wl5YIDWzYnHG6/FgPOSFXLAhGg=
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
github.com/swaggo/swag/v2 v2.0.0-rc4 h1:SZ8cK68gcV6cslwrJMIOqPkJELRwq4gmjvk77MrvHvY=
github.com/swaggo/swag/v2 v2.0.0-rc4/go.mod h1:Ow7Y8gF16BTCDn8YxZbyKn8FkMLRUHekv1kROJZpbvE=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
@ -1220,8 +1204,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
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=
@ -1697,20 +1681,20 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic=
modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU=
modernc.org/ccgo/v4 v4.25.1/go.mod h1:njjuAYiPflywOOrm3B7kCB444ONP5pAVr8PIEoE0uDw=
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
modernc.org/cc/v4 v4.26.0 h1:QMYvbVduUGH0rrO+5mqF/PSPPRZNpRtg2CLELy7vUpA=
modernc.org/cc/v4 v4.26.0/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.26.0 h1:gVzXaDzGeBYJ2uXTOpR8FR7OlksDOe9jxnjhIKCsiTc=
modernc.org/ccgo/v4 v4.26.0/go.mod h1:Sem8f7TFUtVXkG2fiaChQtyyfkqhJBg/zjEJBkmuAVY=
modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8=
modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s=
modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo=
modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y=
modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=
modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4=
modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=

File diff suppressed because it is too large Load diff

View file

@ -1207,6 +1207,7 @@ message InvitePayload {
enum InviteType {
JoinAsMember = 0; // aclKey contains the key to sign the ACL record
JoinAsGuest = 1; // guestKey contains the privateKey of the guest user
JoinAsMemberWithoutApprove = 2; // aclKey contains the key to sign the ACL record and decrypt the read key
}
}

View file

@ -49,6 +49,48 @@ func (s *service) Join(ctx context.Context, id, aclHeadId string) error {
return nil
}
func (s *service) InviteJoin(ctx context.Context, id, aclHeadId string) error {
s.mu.Lock()
waiter, exists := s.waiting[id]
if exists {
s.mu.Unlock()
<-waiter.wait
if waiter.err != nil {
return waiter.err
}
s.mu.Lock()
ctrl := s.spaceControllers[id]
s.mu.Unlock()
if ctrl.Mode() != mode.ModeLoading {
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAclHeadId(aclHeadId).SetAccountStatus(spaceinfo.AccountStatusActive)
return ctrl.SetPersistentInfo(ctx, info)
}
return nil
}
wait := make(chan struct{})
s.waiting[id] = controllerWaiter{
wait: wait,
}
s.mu.Unlock()
ctrl, err := s.factory.CreateActiveSpace(ctx, id, aclHeadId)
if err != nil {
s.mu.Lock()
close(wait)
s.waiting[id] = controllerWaiter{
wait: wait,
err: err,
}
s.mu.Unlock()
return err
}
s.mu.Lock()
close(wait)
s.spaceControllers[ctrl.SpaceId()] = ctrl
s.mu.Unlock()
return nil
}
func (s *service) CancelLeave(ctx context.Context, id string) error {
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAccountStatus(spaceinfo.AccountStatusActive)

View file

@ -61,6 +61,7 @@ type Service interface {
Create(ctx context.Context) (space clientspace.Space, err error)
Join(ctx context.Context, id, aclHeadId string) error
InviteJoin(ctx context.Context, id, aclHeadId string) error
CancelLeave(ctx context.Context, id string) (err error)
Get(ctx context.Context, id string) (space clientspace.Space, err error)
Wait(ctx context.Context, spaceId string) (sp clientspace.Space, err error)

View file

@ -32,6 +32,7 @@ type SpaceFactory interface {
NewShareableSpace(ctx context.Context, id string, info spaceinfo.SpacePersistentInfo) (spacecontroller.SpaceController, error)
CreateStreamableSpace(ctx context.Context, privKey crypto.PrivKey, id string, metadata []byte) (spacecontroller.SpaceController, error)
NewStreamableSpace(ctx context.Context, id string, info spaceinfo.SpacePersistentInfo, metadata []byte) (spacecontroller.SpaceController, error)
CreateActiveSpace(ctx context.Context, id, aclHeadId string) (sp spacecontroller.SpaceController, err error)
CreateMarketplaceSpace(ctx context.Context) (sp spacecontroller.SpaceController, err error)
CreateAndSetTechSpace(ctx context.Context) (*clientspace.TechSpace, error)
LoadAndSetTechSpace(ctx context.Context) (*clientspace.TechSpace, error)
@ -208,6 +209,26 @@ func (s *spaceFactory) CreateInvitingSpace(ctx context.Context, id, aclHeadId st
return ctrl, err
}
func (s *spaceFactory) CreateActiveSpace(ctx context.Context, id, aclHeadId string) (sp spacecontroller.SpaceController, err error) {
exists, err := s.techSpace.SpaceViewExists(ctx, id)
if err != nil {
return
}
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAclHeadId(aclHeadId).SetAccountStatus(spaceinfo.AccountStatusActive)
if !exists {
if err := s.techSpace.SpaceViewCreate(ctx, id, true, info); err != nil {
return nil, err
}
}
ctrl, err := shareablespace.NewSpaceController(id, info, s.app)
if err != nil {
return nil, err
}
err = ctrl.Start(ctx)
return ctrl, err
}
func (s *spaceFactory) CreateShareableSpace(ctx context.Context, id string) (sp spacecontroller.SpaceController, err error) {
coreSpace, err := s.spaceCore.Get(ctx, id)
if err != nil {