@@ -24,8 +24,10 @@ import (
24
24
"html/template"
25
25
"mime"
26
26
"net/http"
27
+ "strings"
27
28
28
29
gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
30
+ userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
29
31
invitepb "github.com/cs3org/go-cs3apis/cs3/ocm/invite/v1beta1"
30
32
ocmprovider "github.com/cs3org/go-cs3apis/cs3/ocm/provider/v1beta1"
31
33
rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
@@ -36,13 +38,16 @@ import (
36
38
"github.com/cs3org/reva/pkg/smtpclient"
37
39
)
38
40
41
+ const defaultInviteLink = "{{.MeshDirectoryURL}}?token={{.Token}}&providerDomain={{.User.Id.Idp}}"
42
+
39
43
type tokenHandler struct {
40
44
gatewayClient gateway.GatewayAPIClient
41
45
smtpCredentials * smtpclient.SMTPCredentials
42
46
meshDirectoryURL string
43
47
44
- tplSubj * template.Template
45
- tplBody * template.Template
48
+ tplSubj * template.Template
49
+ tplBody * template.Template
50
+ tplInviteLink * template.Template
46
51
}
47
52
48
53
func (h * tokenHandler ) init (c * config ) error {
@@ -65,7 +70,21 @@ func (h *tokenHandler) init(c *config) error {
65
70
if err := h .initBodyTemplate (c .BodyTemplatePath ); err != nil {
66
71
return err
67
72
}
68
- return nil
73
+
74
+ return h .initInviteLinkTemplate (c .InviteLinkTemplate )
75
+ }
76
+
77
+ type token struct {
78
+ Token string `json:"token"`
79
+ Description string `json:"description,omitempty"`
80
+ Expiration uint64 `json:"expiration,omitempty"`
81
+ InviteLink string `json:"invite_link"`
82
+ }
83
+
84
+ type inviteLinkParams struct {
85
+ User * userpb.User
86
+ Token string
87
+ MeshDirectoryURL string
69
88
}
70
89
71
90
// Generate generates an invitation token and if a recipient is specified,
@@ -83,10 +102,11 @@ func (h *tokenHandler) Generate(w http.ResponseWriter, r *http.Request) {
83
102
return
84
103
}
85
104
105
+ user := ctxpkg .ContextMustGetUser (ctx )
86
106
recipient := query .Get ("recipient" )
87
107
if recipient != "" && h .smtpCredentials != nil {
88
108
templObj := & emailParams {
89
- User : ctxpkg . ContextMustGetUser ( ctx ) ,
109
+ User : user ,
90
110
Token : token .InviteToken .Token ,
91
111
MeshDirectoryURL : h .meshDirectoryURL ,
92
112
}
@@ -96,7 +116,13 @@ func (h *tokenHandler) Generate(w http.ResponseWriter, r *http.Request) {
96
116
}
97
117
}
98
118
99
- if err := json .NewEncoder (w ).Encode (token .InviteToken ); err != nil {
119
+ tknRes , err := h .prepareGenerateTokenResponse (user , token .InviteToken )
120
+ if err != nil {
121
+ reqres .WriteError (w , r , reqres .APIErrorServerError , "error generating response" , err )
122
+ return
123
+ }
124
+
125
+ if err := json .NewEncoder (w ).Encode (tknRes ); err != nil {
100
126
reqres .WriteError (w , r , reqres .APIErrorServerError , "error marshalling token data" , err )
101
127
return
102
128
}
@@ -105,6 +131,36 @@ func (h *tokenHandler) Generate(w http.ResponseWriter, r *http.Request) {
105
131
w .WriteHeader (http .StatusOK )
106
132
}
107
133
134
+ func (h * tokenHandler ) generateInviteLink (user * userpb.User , token * invitepb.InviteToken ) (string , error ) {
135
+ var inviteLink strings.Builder
136
+ if err := h .tplInviteLink .Execute (& inviteLink , inviteLinkParams {
137
+ User : user ,
138
+ Token : token .Token ,
139
+ MeshDirectoryURL : h .meshDirectoryURL ,
140
+ }); err != nil {
141
+ return "" , err
142
+ }
143
+
144
+ return inviteLink .String (), nil
145
+ }
146
+
147
+ func (h * tokenHandler ) prepareGenerateTokenResponse (user * userpb.User , tkn * invitepb.InviteToken ) (* token , error ) {
148
+ inviteLink , err := h .generateInviteLink (user , tkn )
149
+ if err != nil {
150
+ return nil , err
151
+ }
152
+ res := & token {
153
+ Token : tkn .Token ,
154
+ Description : tkn .Description ,
155
+ InviteLink : inviteLink ,
156
+ }
157
+ if tkn .Expiration != nil {
158
+ res .Expiration = tkn .Expiration .Seconds
159
+ }
160
+
161
+ return res , nil
162
+ }
163
+
108
164
type acceptInviteRequest struct {
109
165
Token string `json:"token"`
110
166
ProviderDomain string `json:"providerDomain"`
@@ -221,7 +277,26 @@ func (h *tokenHandler) ListInvite(w http.ResponseWriter, r *http.Request) {
221
277
return
222
278
}
223
279
224
- if err := json .NewEncoder (w ).Encode (res .InviteTokens ); err != nil {
280
+ tokens := make ([]* token , 0 , len (res .InviteTokens ))
281
+ user := ctxpkg .ContextMustGetUser (ctx )
282
+ for _ , tkn := range res .InviteTokens {
283
+ inviteURL , err := h .generateInviteLink (user , tkn )
284
+ if err != nil {
285
+ reqres .WriteError (w , r , reqres .APIErrorServerError , "error generating invite URL from OCM token" , err )
286
+ return
287
+ }
288
+ t := & token {
289
+ Token : tkn .Token ,
290
+ Description : tkn .Description ,
291
+ InviteLink : inviteURL ,
292
+ }
293
+ if tkn .Expiration != nil {
294
+ t .Expiration = tkn .Expiration .Seconds
295
+ }
296
+ tokens = append (tokens , t )
297
+ }
298
+
299
+ if err := json .NewEncoder (w ).Encode (tokens ); err != nil {
225
300
reqres .WriteError (w , r , reqres .APIErrorServerError , "error marshalling token data" , err )
226
301
return
227
302
}
0 commit comments