Skip to content

Commit f4ebf08

Browse files
authored
Merge pull request #11627 from 2403905/issues/OCISDEV-237-main
feat: [OCISDEV-237] the sse support added for the public links
2 parents 5af2b8c + 6c3df32 commit f4ebf08

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Enhancement: The sse support added for the public links
2+
3+
The sse support added for the public links
4+
5+
https://github.com/owncloud/ocis/pull/11623

services/clientlog/pkg/service/service.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ import (
1313
group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1"
1414
user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
1515
rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
16+
link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1"
1617
provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
1718
"go.opentelemetry.io/otel/trace"
1819

1920
"github.com/owncloud/reva/v2/pkg/events"
21+
"github.com/owncloud/reva/v2/pkg/publicshare"
2022
"github.com/owncloud/reva/v2/pkg/rgrpc/todo/pool"
2123
"github.com/owncloud/reva/v2/pkg/storagespace"
2224
"github.com/owncloud/reva/v2/pkg/utils"
@@ -132,6 +134,8 @@ func (cl *ClientlogService) processEvent(event events.Event) {
132134
users, data, err = processShareEvent(ctx, ref, gwc, event.InitiatorID, uid, gid)
133135
}
134136

137+
tokens := make([]string, 0)
138+
135139
switch e := event.Event.(type) {
136140
default:
137141
err = errors.New("unhandled event")
@@ -141,26 +145,34 @@ func (cl *ClientlogService) processEvent(event events.Event) {
141145
return
142146
}
143147
fileEv("postprocessing-finished", e.FileRef)
148+
tokens, _ = listPublicShareTokens(ctx, gwc, e.FileRef, cl.log)
144149
case events.ItemTrashed:
145150
evType = "item-trashed"
146151
users, data, err = processItemTrashedEvent(ctx, e.Ref, gwc, event.InitiatorID, e.ID)
152+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
147153
case events.ItemRestored:
148154
fileEv("item-restored", e.Ref)
155+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
149156
case events.ContainerCreated:
150157
fileEv("folder-created", e.Ref)
158+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
151159
case events.ItemMoved:
152160
// we send a dedicated event in case the item was only renamed
153161
if isRename(e.OldReference, e.Ref) {
154162
fileEv("item-renamed", e.Ref)
155163
} else {
156164
fileEv("item-moved", e.Ref)
157165
}
166+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
158167
case events.FileLocked:
159168
fileEv("file-locked", e.Ref)
169+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
160170
case events.FileUnlocked:
161171
fileEv("file-unlocked", e.Ref)
172+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
162173
case events.FileTouched:
163174
fileEv("file-touched", e.Ref)
175+
tokens, _ = listPublicShareTokens(ctx, gwc, e.Ref, cl.log)
164176
case events.SpaceShared:
165177
r, _ := storagespace.ParseReference(e.ID.GetOpaqueId())
166178
shareEv("space-member-added", &r, e.GranteeUserID, e.GranteeGroupID)
@@ -192,6 +204,9 @@ func (cl *ClientlogService) processEvent(event events.Event) {
192204
}
193205

194206
// II) instruct sse service to send the information
207+
if len(tokens) > 0 {
208+
users = append(users, tokens...)
209+
}
195210
if err := cl.sendSSE(users, evType, data); err != nil {
196211
cl.log.Error().Err(err).Interface("userIDs", users).Str("eventid", event.ID).Msg("failed to store event for user")
197212
return
@@ -320,3 +335,41 @@ func backchannelLogoutEvent(e events.BackchannelLogout) (string, []string, Backc
320335
Timestamp: e.Timestamp.String(),
321336
}
322337
}
338+
339+
func listPublicShareTokens(ctx context.Context, gwc gateway.GatewayAPIClient, ref *provider.Reference, log log.Logger) ([]string, error) {
340+
tokens := make([]string, 0)
341+
info, err := utils.GetResource(ctx, ref, gwc)
342+
if err != nil {
343+
log.Error().Err(err).Str("event", "listPublicShareTokens").Msg("error getting ResourceInfo")
344+
return tokens, err
345+
}
346+
347+
if utils.IsSpaceRoot(info) {
348+
return tokens, nil
349+
}
350+
351+
req := link.ListPublicSharesRequest{
352+
Filters: []*link.ListPublicSharesRequest_Filter{publicshare.ResourceIDFilter(info.GetId())},
353+
}
354+
355+
res, err := gwc.ListPublicShares(ctx, &req)
356+
if err != nil {
357+
log.Error().Err(err).Str("event", "listPublicShareTokens").Msg("error getting ListPublicShares")
358+
return tokens, err
359+
}
360+
361+
if res.GetStatus().GetCode() != rpc.Code_CODE_OK {
362+
log.Error().Str("event", "listPublicShareTokens").Msg("error getting ListPublicShares " + res.GetStatus().GetCode().String())
363+
return tokens, fmt.Errorf("error getting ListPublicShares %s", res.GetStatus().GetCode().String())
364+
}
365+
for _, s := range res.GetShare() {
366+
tokens = append(tokens, s.GetToken())
367+
}
368+
369+
t, err := listPublicShareTokens(ctx, gwc, &provider.Reference{ResourceId: info.GetParentId()}, log)
370+
if err != nil {
371+
log.Error().Err(err).Str("event", "listPublicShareTokens").Msg("error getting parent listPublicShareTokens")
372+
return tokens, err
373+
}
374+
return append(tokens, t...), nil
375+
}

services/sse/pkg/service/service.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import (
44
"net/http"
55
"time"
66

7+
userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
8+
79
"github.com/go-chi/chi/v5"
810
"github.com/r3labs/sse/v2"
911

1012
revactx "github.com/owncloud/reva/v2/pkg/ctx"
1113
"github.com/owncloud/reva/v2/pkg/events"
14+
"github.com/owncloud/reva/v2/pkg/utils"
1215

1316
"github.com/owncloud/ocis/v2/ocis-pkg/log"
1417
"github.com/owncloud/ocis/v2/services/sse/pkg/config"
@@ -73,6 +76,17 @@ func (s SSE) HandleSSE(w http.ResponseWriter, r *http.Request) {
7376
}
7477

7578
uid := u.GetId().GetOpaqueId()
79+
80+
if len(utils.ReadPlainFromOpaque(u.Opaque, "public-share-role")) > 0 {
81+
var impersonator userpb.User
82+
if err := utils.ReadJSONFromOpaque(u.Opaque, "impersonating-user", &impersonator); err != nil {
83+
s.l.Error().Msg("sse: public share token not found")
84+
w.WriteHeader(http.StatusInternalServerError)
85+
return
86+
}
87+
uid = impersonator.GetId().GetOpaqueId()
88+
}
89+
7690
if uid == "" {
7791
s.l.Error().Msg("sse: user in context is broken")
7892
w.WriteHeader(http.StatusInternalServerError)

0 commit comments

Comments
 (0)