From 9846dbd190343aff332e56097d682fab5afaefa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz> Date: Sun, 27 Dec 2020 21:14:25 +0100 Subject: [PATCH] Manipulace s jitsi tokenem --- lib/CF/Controller/Users.pm | 30 +++++++++++++++++++++++++++++- lib/CF/Controller/Websockets.pm | 20 ++++++++++++++++---- lib/CF/Schema/Result/User.pm | 1 + openapi.yaml | 26 +++++++++++++++++++++++++- sql/5/up.sql | 1 + 5 files changed, 72 insertions(+), 6 deletions(-) diff --git a/lib/CF/Controller/Users.pm b/lib/CF/Controller/Users.pm index 6d6ba2c..96bb7e0 100644 --- a/lib/CF/Controller/Users.pm +++ b/lib/CF/Controller/Users.pm @@ -7,7 +7,23 @@ no warnings qw{ experimental::signatures }; sub me ($c){ my $user = $c->_get( $c->user->{id} ) // return; - $c->render(openapi => $c->spec_filter($user->formatted, 'User')); + + my $formatted = $user->formatted; + + if ( + ( $user->jitsi_allowed || $user->roles =~ /chairman/ ) + && $c->cfg->{jitsi_base_url} + && $c->cfg->{jitsi_room} + ) { + $formatted->{jitsi_url} = join ('', + $c->cfg->{jitsi_base_url}, + $c->cfg->{jitsi_room}, + '?jwt=', + $c->jitsi_token($c->cfg->{jitsi_room}), + ); + } + + $c->render(openapi => $c->spec_filter($formatted, 'User')); } sub ban ($c){ @@ -45,6 +61,18 @@ sub unban ($c){ $c->render(status => 204, text => ''); } +sub jitsi ($c){ + $c->openapi->valid_input or return; + my $args = $c->req->json; + my $user = $c->_get( $c->stash->{id} ) // return; + my $guard = $c->schema->txn_scope_guard; + + $user->update({ jitsi_allowed => $args->{allowed} }); + + $guard->commit; + $c->render(status => 204, text => ''); +} + sub _get ($c, $id ) { my $user; diff --git a/lib/CF/Controller/Websockets.pm b/lib/CF/Controller/Websockets.pm index 28ad69a..8647e9d 100644 --- a/lib/CF/Controller/Websockets.pm +++ b/lib/CF/Controller/Websockets.pm @@ -24,19 +24,22 @@ sub main { $c->on(json => sub( $c, $message ) { if ( $message->{event} eq 'KEEPALIVE' ) { - my $user_id; + my $user; if ($message->{payload} =~ /^(\d+)$/) { # TODO: check signtaure - $user_id = $1; + + $user = $c->schema->resultset('User')->find( + { id => $1 } + ); } $c->schema->resultset('Socket')->update_or_create({ id => $c->req->headers->header('Sec-WebSocket-Key'), ip => $ip, keepalive => \'now()', - user_id => $user_id, - }, { key => $user_id ? 'user':'primary'} ); + user_id => $user ? $user->id : undef, + }, { key => $user ? 'user':'primary'} ); my $all = $c->schema->resultset('Socket_view')->count( { is_alive => 't', } @@ -49,6 +52,15 @@ sub main { all => $all, members => $members, }}}); + + if ( $user ) { + my $jitsi = $user->jitsi_allowed || $user->roles =~ /chairman/; + + $c->send({json => { event => 'user_status', payload => { + jitsi_allowed => $jitsi ? \1:\0, +# is_banned => $user->banned_until ? 1:0, + }}}); + } } }); diff --git a/lib/CF/Schema/Result/User.pm b/lib/CF/Schema/Result/User.pm index 07c925c..0f81aa6 100644 --- a/lib/CF/Schema/Result/User.pm +++ b/lib/CF/Schema/Result/User.pm @@ -28,6 +28,7 @@ __PACKAGE__->add_columns( main_group_name keepalive banned_until + jitsi_allowed ), ); diff --git a/openapi.yaml b/openapi.yaml index 79731d4..84bd655 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -116,6 +116,8 @@ components: type: string secret: type: string + jitsi_url: + type: string is_banned: type: boolean Announcement: @@ -462,7 +464,7 @@ paths: enum: [0, 1, 2, 3, 4] content: type: string - isr_archived: + is_archived: type: boolean responses: 204: @@ -564,3 +566,25 @@ paths: responses: 204: description: User banned + + /users/{id}/jitsi: + patch: + security: + - Bearer: ['chairman'] + x-mojo-to: users#jitsi + tags: + - users + summary: Set jitsi access + operationId: jitsi + requestBody: + content: + application/json: + schema: + type: object + properties: + allowed: + type: boolean + responses: + 204: + description: Status changed + diff --git a/sql/5/up.sql b/sql/5/up.sql index e221e78..bb43942 100644 --- a/sql/5/up.sql +++ b/sql/5/up.sql @@ -1,4 +1,5 @@ alter table "users" add "roles" text; +alter table "users" add "jitsi_allowed" bool not null default false; create table "sockets" ( "id" varchar(64), -- GitLab