diff --git a/server/plugin.go b/server/plugin.go index a0ece18a..fed6d376 100644 --- a/server/plugin.go +++ b/server/plugin.go @@ -112,8 +112,10 @@ type EnrichMeetingJwtRequest struct { // Claims extents cristalhq/jwt standard claims to add jitsi-web-token specific fields type Claims struct { jwt.StandardClaims - Context Context `json:"context"` - Room string `json:"room,omitempty"` + Context Context `json:"context"` + Room string `json:"room,omitempty"` + Moderator bool `json:"moderator,omitempty"` // only the user started the meeting is moderator + CreatorID string `json:"creator_id,omitempty"` // store id of user who start the meeting } func verifyJwt(secret string, jwtToken string) (*Claims, error) { @@ -200,6 +202,7 @@ func (p *Plugin) updateJwtUserInfo(jwtToken string, user *model.User) (string, e } claims.Context = newContext + claims.Moderator = sanitizedUser.Id == claims.CreatorID return signClaims(secret, claims) } @@ -280,6 +283,8 @@ func (p *Plugin) startMeeting(user *model.User, channel *model.Channel, meetingI claims.ExpiresAt = jwt.NewNumericDate(meetingLinkValidUntil) claims.Subject = jURL.Hostname() claims.Room = meetingID + claims.Moderator = false + claims.CreatorID = user.Id var err2 error jwtToken, err2 = signClaims(p.getConfiguration().JitsiAppSecret, &claims) diff --git a/server/plugin_test.go b/server/plugin_test.go index 7e8019de..610021de 100644 --- a/server/plugin_test.go +++ b/server/plugin_test.go @@ -39,6 +39,7 @@ func TestSignClaims(t *testing.T) { claims.ExpiresAt = jwt.NewNumericDate(time.Time{}) claims.Subject = "test" claims.Room = "test" + claims.Moderator = true token, err := signClaims("test-secret", &claims) require.Nil(t, err) diff --git a/webapp/src/components/root_portal.tsx b/webapp/src/components/root_portal.tsx index 9618dbaa..aff13ac3 100644 --- a/webapp/src/components/root_portal.tsx +++ b/webapp/src/components/root_portal.tsx @@ -12,6 +12,14 @@ type Props = { children: React.ReactNode, } +export class InjectionProvider extends React.Component { + public render(): JSX.Element { + const stores = {...this.props}; + delete stores.children; + return React.createElement(Provider as any, stores, this.props.children); + } +} + export default class RootPortal { el: HTMLElement; store: any; @@ -38,11 +46,11 @@ export default class RootPortal { const rootPortal = document.getElementById('root-portal'); if (rootPortal) { ReactDOM.render(( - + - + ), this.el); } }