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:
parent
3097b3855b
commit
f610462beb
11 changed files with 759 additions and 661 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
13
go.mod
|
@ -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
52
go.sum
|
@ -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
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue