Maintain key <-> room <-> role associations in the room_keys table

master
Daniel Berteaud 10 years ago
parent ab24ac57bd
commit 40b97cb7b9
  1. 67
      vroom.pl

@ -845,6 +845,43 @@ helper create_etherpad_session => sub {
return 1; return 1;
}; };
# Get an API key by id
helper get_key_by_token => sub {
my $self = shift;
my ($token) = @_;
if (!$token || $token eq ''){
return 0;
}
my $sth = eval {
$self->db->prepare('SELECT *
FROM `api_keys`
WHERE `token`=?
LIMIT 1');
};
$sth->execute($token);
return $sth->fetchall_hashref('token')->{$token};
};
# Associate an API key to a room, and set the corresponding role
helper associate_key_to_room => sub {
my $self = shift;
my (%data) = @_;
my $data = \%data;
my $room = $self->get_room_by_name($data->{room});
my $key = $self->get_key_by_token($data->{key});
if (!$room || !$key){
return 0;
}
my $sth = eval {
$self->db->prepare('INSERT INTO `room_keys`
(`room_id`,`key_id`,`role`)
VALUES (?,?,?)
ON DUPLICATE KEY UPDATE `role`=?');
};
$sth->execute($room->{id},$key->{id},$data->{role},$data->{role});
return 1;
};
# Route / to the index page # Route / to the index page
get '/' => sub { get '/' => sub {
my $self = shift; my $self = shift;
@ -1002,6 +1039,11 @@ post '/create' => sub {
$json->{status} = 'success'; $json->{status} = 'success';
$json->{err} = ''; $json->{err} = '';
$self->session($name => {role => 'owner'}); $self->session($name => {role => 'owner'});
$self->associate_key_to_room(
room => $name,
key => $self->session('key'),
role => 'owner'
);
return $self->render(json => $json); return $self->render(json => $json);
}; };
@ -1042,11 +1084,21 @@ any [qw(GET POST)] => '/password/(:room)' => sub {
# First check if we got the owner password, and if so, mark this user as owner # First check if we got the owner password, and if so, mark this user as owner
if ($data->{owner_password} && Crypt::SaltedHash->validate($data->{owner_password}, $pass)){ if ($data->{owner_password} && Crypt::SaltedHash->validate($data->{owner_password}, $pass)){
$self->session($room => {role => 'owner'}); $self->session($room => {role => 'owner'});
$self->associate_key_to_room(
room => $room,
key => $self->session('key'),
role => 'owner'
);
return $self->redirect_to($self->get_url('/') . $room); return $self->redirect_to($self->get_url('/') . $room);
} }
# Then, check if it's the join password # Then, check if it's the join password
elsif ($data->{join_password} && Crypt::SaltedHash->validate($data->{join_password}, $pass)){ elsif ($data->{join_password} && Crypt::SaltedHash->validate($data->{join_password}, $pass)){
$self->session($room => {role => 'participant'}); $self->session($room => {role => 'participant'});
$self->associate_key_to_room(
room => $room,
key => $self->session('key'),
role => 'participant'
);
return $self->redirect_to($self->get_url('/') . $room); return $self->redirect_to($self->get_url('/') . $room);
} }
# Else, it's a wrong password, display an error page # Else, it's a wrong password, display an error page
@ -1113,6 +1165,11 @@ get '/:room' => sub {
# Set this peer as a simple participant if he has no role yet (shouldn't happen) # Set this peer as a simple participant if he has no role yet (shouldn't happen)
if (!$self->session($room) || !$self->session($room)->{role}){ if (!$self->session($room) || !$self->session($room)->{role}){
$self->session($room => {role => 'participant'}); $self->session($room => {role => 'participant'});
$self->associate_key_to_room(
room => $room,
key => $self->session('key'),
role => 'participant'
);
} }
# Create etherpad session if needed # Create etherpad session if needed
if ($ec && !$self->session($room)->{etherpadSession}){ if ($ec && !$self->session($room)->{etherpadSession}){
@ -1388,6 +1445,11 @@ post '/*jsapi' => { jsapi => [qw(jsapi admin/jsapi)] } => sub {
# Auth succeed ? lets promote him to owner of the room # Auth succeed ? lets promote him to owner of the room
if ($data->{owner_password} && Crypt::SaltedHash->validate($data->{owner_password}, $pass)){ if ($data->{owner_password} && Crypt::SaltedHash->validate($data->{owner_password}, $pass)){
$self->session($room, {role => 'owner'}); $self->session($room, {role => 'owner'});
$self->associate_key_to_room(
room => $room,
key => $self->session('key'),
role => 'owner'
);
$msg = $self->l('AUTH_SUCCESS'); $msg = $self->l('AUTH_SUCCESS');
$status = 'success'; $status = 'success';
} }
@ -1414,6 +1476,11 @@ post '/*jsapi' => { jsapi => [qw(jsapi admin/jsapi)] } => sub {
if ($self->session($room)->{role} ne 'owner' && if ($self->session($room)->{role} ne 'owner' &&
$self->get_peer_role({room => $room, peer_id => $id}) eq 'owner'){ $self->get_peer_role({room => $room, peer_id => $id}) eq 'owner'){
$self->session($room)->{role} = 'owner'; $self->session($room)->{role} = 'owner';
$self->associate_key_to_room(
room => $room,
key => $self->session('key'),
role => 'owner'
);
} }
my $res = $self->set_peer_role({ my $res = $self->set_peer_role({
room => $room, room => $room,

Loading…
Cancel
Save