mirror of
https://github.com/dani/vroom.git
synced 2024-06-23 18:19:12 +02:00
parent
867df625e8
commit
cfb6fddac2
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1,3 @@
|
|||
signalmaster/node_modules/
|
||||
signalmaster/dev_config.json
|
||||
conf/vroom.conf
|
||||
conf/settings.ini
|
||||
|
|
66
conf/settings.ini.dist
Normal file
66
conf/settings.ini.dist
Normal file
|
@ -0,0 +1,66 @@
|
|||
[database]
|
||||
; Database access settings
|
||||
;dsn = 'DBI:mysql:database=devroom;host=localhost'
|
||||
;user = 'vroom'
|
||||
;password = 'password'
|
||||
|
||||
[signaling]
|
||||
; URI sent to clients where they can find the signaling server
|
||||
;uri = 'https://vroom.exmple.com'
|
||||
|
||||
[turn]
|
||||
; The stun server sent to client. You can set it to your own stun server
|
||||
;stun_server = 'stun.l.google.com:19302'
|
||||
; The turn server sent to cliet, you should set it to your own server
|
||||
;turn_server = ''
|
||||
; the realm used for turn accounts. You shouldn't have to change it
|
||||
;turn_realm = 'vroom'
|
||||
|
||||
[email]
|
||||
; Address set in the From field of email sent by VROOM
|
||||
;from = 'no-reply@example.com'
|
||||
; Recipient of the feedback messages
|
||||
;contact = 'admin@example.com'
|
||||
; Path to a sendmail compatible binary used to send emails
|
||||
;sendmail = '/sbin/sendmail'
|
||||
|
||||
[interface]
|
||||
; You can customize the "powered by" at the bottom
|
||||
;powered_by = '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>'
|
||||
; Template to use. Must be a directory under the templates dir
|
||||
;template = 'default'
|
||||
; ID of the chrome extension which will be proposed when sharing screen on Chrome
|
||||
;chrome_extension_id = 'ecicdpoejfllflombfanbhfpgcimjddn'
|
||||
|
||||
[cookie]
|
||||
; Secret passphrase used to sign cookies. You must set this
|
||||
;secret = '1zEewX24ZD%2RvtF%e'
|
||||
; Cookie name, You shouldn't have to change this
|
||||
;name = 'vroom'
|
||||
|
||||
[rooms]
|
||||
; After this amount of time in minutes, rooms without any activity will be purged
|
||||
;inactivity_timeout = '3600'
|
||||
; You can also purge reserved rooms
|
||||
;reserved_inactivity_imeout = '5184000'
|
||||
; A comma separated list of room names you don't want to be reservable
|
||||
;common_names = 'test,test1,test123,0,1,2,3,4,5,6,7,8,9,123,1234,12345,a,aa,abc,azerty,qwerty,vroom,foo,bar,baz'
|
||||
|
||||
[log]
|
||||
; Verbosity of the web interface. Can be debug, info, warn, error or fatal
|
||||
;level = 'warn'
|
||||
|
||||
[etherpad]
|
||||
; If you want to enabled etherpad-lite integratio, you must set
|
||||
; the uri of your instance, and the API key
|
||||
;uri = 'https://pad.example.com'
|
||||
;api_key = 'be0f90cfc412b03c13e956e77d7944352c06a44e5d94da44ebfa79fb63d7e998'
|
||||
; If you run vroom and etherpad-llite on different subdomains, you have to set the common part here
|
||||
; For exmple, if you use vroom.domain.tld and pad.domain.tld, set domain.tld here
|
||||
;base_domain = 'example.com'
|
||||
|
||||
[daemon]
|
||||
; IP the hypnotoad daemon will listen on. You can use * to bind on every IP/Interface
|
||||
;listen_ip = '127.0.0.1'
|
||||
; Port used by the hypnotoad daemon
|
||||
;listen_port = '8090'
|
|
@ -1,24 +1,24 @@
|
|||
{
|
||||
|
||||
# Database
|
||||
dbi => 'DBI:mysql:database=vroom;host=localhost',
|
||||
dbUser => 'vroom',
|
||||
dbPassword => 'vroom',
|
||||
dbi => 'DBI:mysql:database=devroom;host=localhost',
|
||||
dbUser => 'devroom',
|
||||
dbPassword => 'prout',
|
||||
|
||||
# Media & signaling
|
||||
signalingServer => 'https://signal.example.com',
|
||||
stunServer => 'stun.example.com:3478',
|
||||
turnServer => 'turn.example.com',
|
||||
realm => 'example.com',
|
||||
signalingServer => 'https://dev.vroom.im',
|
||||
stunServer => 'vroom.im:3478',
|
||||
turnServer => 'vroom.im',
|
||||
realm => 'vroom.im',
|
||||
|
||||
# Web & contact
|
||||
emailFrom => 'vroom@example.com',
|
||||
feedbackRecipient => 'admin@example.com',
|
||||
emailFrom => 'no-reply@vroom.im',
|
||||
oeedbackRecipient => 'dani@fws.fr',
|
||||
poweredBy => '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>',
|
||||
# Templates to use for web pages
|
||||
template => 'default',
|
||||
# Used to sign cookies
|
||||
secret => 'ChangeMe!',
|
||||
secret => 'NtPZDUEqNX68QlQGH5ohqb1ymmqEGJ3xyvLo4Fz3pDqEX/Dxutmp',
|
||||
|
||||
# App
|
||||
# Rooms without any activity for that long (in seconds) will be destroyed
|
||||
|
@ -42,11 +42,11 @@ chromeExtensionId => 'ecicdpoejfllflombfanbhfpgcimjddn',
|
|||
|
||||
# For etherpad integration, set the etherpad base url
|
||||
# and API Key
|
||||
#etherpadUri => '',
|
||||
#etherpadApiKey => '',
|
||||
etherpadUri => 'https://vroom.im/etherpad/',
|
||||
etherpadApiKey => 'be0c00cfce12b00c13e956e77d7244352c06a44e5d94ca44ebfa79fb63d7e995',
|
||||
# You can also set the base domain common to both vroom and etherpad
|
||||
# For example, if you use vroom.example.com and pad.example.com, the base domain is example.com
|
||||
#etherpadBaseDomain => '',
|
||||
etherpadBaseDomain => 'vroom.im',
|
||||
|
||||
# Various
|
||||
sendmail => '/sbin/sendmail'
|
|
@ -5,7 +5,7 @@
|
|||
<p class="text-muted pull-left"><%=l 'VROOM_IS_FREE_SOFTWARE' %></p>
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
<p class="text-muted pull-right brand"><%=l 'POWERED_BY' %> <%== $config->{poweredBy} %></p>
|
||||
<p class="text-muted pull-right brand"><%=l 'POWERED_BY' %> <%= $config->{'interface.powered_by'} %></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -700,7 +700,7 @@
|
|||
<%=l 'VROOM_CHROME_EXTENSION' %>
|
||||
</p>
|
||||
<p>
|
||||
<a class="btn btn-default btn-lg" href="https://chrome.google.com/webstore/detail/<%= $config->{chromeExtensionId} %>" target="_blank">
|
||||
<a class="btn btn-default btn-lg" href="https://chrome.google.com/webstore/detail/<%= $config->{'interface.chrome_extension_id'} %>" target="_blank">
|
||||
<span class="glyphicon glyphicon-download-alt">
|
||||
</span>
|
||||
</a>
|
||||
|
@ -869,7 +869,7 @@
|
|||
setTimeout(function(){
|
||||
etherpad = {
|
||||
enabled: <%= $etherpad %>,
|
||||
uri: "<%= $config->{etherpadUri} %>",
|
||||
uri: "<%= $config->{'etherpad.uri'} %>",
|
||||
group: "<%= $etherpadGroup %>"
|
||||
};
|
||||
<% if ($video eq 'false'){ %>
|
||||
|
@ -882,11 +882,11 @@
|
|||
};
|
||||
<% } %>
|
||||
webrtc = new SimpleWebRTC({
|
||||
url: "<%= $config->{signalingServer} %>",
|
||||
url: "<%= $config->{'signaling.uri'} %>",
|
||||
peerConnectionConfig: {
|
||||
iceServers: [
|
||||
{"url":"stun:<%= $config->{stunServer} %>"},
|
||||
<%== ($config->{turnServer} && $config->{turnServer} ne '') ? "{\"url\":\"turn:$config->{turnServer}\", \"username\":\"$room\", \"credential\":\"$turnPassword\"}":'' %>
|
||||
{"url":"stun:<%= $config->{'turn.stun_server'} %>"},
|
||||
<%== ($config->{'turn.turn_server'} && $config->{'turn.turn_server'} ne '') ? "{\"url\":\"turn:$config->{'turn.turn_server'}\", \"username\":\"$room\", \"credential\":\"$turnPassword\"}":'' %>
|
||||
]
|
||||
},
|
||||
localVideoEl: 'webRTCVideoLocal',
|
||||
|
|
|
@ -15,12 +15,12 @@
|
|||
<%=l 'SET_OWNER_PASS' %>
|
||||
<ul>
|
||||
<li>
|
||||
<%= sprintf($self->l('A_STANDARD_ROOM_EXPIRES_AFTER_d'), int($config->{inactivityTimeout}/3600)) %>
|
||||
<%= sprintf($self->l('A_STANDARD_ROOM_EXPIRES_AFTER_d'), int($config->{'rooms.inactivity_timeout'}/3600)) %>
|
||||
</li>
|
||||
<li>
|
||||
<%=l 'A_RESERVED_ROOM' %>
|
||||
<% if ($config->{reservedInactivityTimeout} > 0){ %>
|
||||
<%= sprintf($self->l('EXPIRE_AFTER_d'), int($config->{reservedInactivityTimeout}/(3600*24))) %>
|
||||
<% if ($config->{'reserved_inactivity_timeout'} > 0){ %>
|
||||
<%= sprintf($self->l('EXPIRE_AFTER_d'), int($config->{'reserved_inactivity_timeout'}/(3600*24))) %>
|
||||
<% } else{ %>
|
||||
<%=l 'WILL_NEVER_EXPIRE' %>
|
||||
<% } %>
|
||||
|
|
99
vroom.pl
99
vroom.pl
|
@ -15,6 +15,7 @@ use File::stat;
|
|||
use File::Basename;
|
||||
use Etherpad::API;
|
||||
use Session::Token;
|
||||
use Config::Simple;
|
||||
|
||||
# List The different components we rely on.
|
||||
# Used to generate thanks on the about template
|
||||
|
@ -105,30 +106,37 @@ our $musics = {
|
|||
|
||||
app->log->level('info');
|
||||
# Read conf file, and set default values
|
||||
our $config = plugin Config => {
|
||||
file => 'conf/vroom.conf',
|
||||
default => {
|
||||
dbi => 'DBI:mysql:database=vroom;host=localhost',
|
||||
dbUser => 'vroom',
|
||||
dbPassword => 'vroom',
|
||||
signalingServer => 'https://vroom.example.com/',
|
||||
stunServer => 'stun.l.google.com:19302',
|
||||
realm => 'vroom',
|
||||
emailFrom => 'vroom@example.com',
|
||||
feedbackRecipient => 'admin@example.com',
|
||||
poweredBy => '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>',
|
||||
template => 'default',
|
||||
inactivityTimeout => 3600,
|
||||
reservedInactivityTimeout => 5184000,
|
||||
commonRoomNames => [ qw() ],
|
||||
logLevel => 'info',
|
||||
chromeExtensionId => 'ecicdpoejfllflombfanbhfpgcimjddn',
|
||||
etherpadUri => '',
|
||||
etherpadApiKey => '',
|
||||
etherpadBaseDomain => '',
|
||||
sendmail => '/sbin/sendmail'
|
||||
}
|
||||
};
|
||||
my $cfg = new Config::Simple();
|
||||
$cfg->read('conf/settings.ini');
|
||||
our $config = $cfg->vars();
|
||||
|
||||
$config->{'database.dsn'} ||= 'DBI:mysql:database=vroom;host=localhost';
|
||||
$config->{'database.user'} ||= 'vroom';
|
||||
$config->{'database.password'} ||= 'vroom';
|
||||
$config->{'signaling.uri'} ||= 'https://vroom.example.com/';
|
||||
$config->{'turn.stun_server'} ||= 'stun.l.google.com:19302';
|
||||
$config->{'turn.turn_server'} ||= '';
|
||||
$config->{'turn.realm'} ||= 'vroom';
|
||||
$config->{'email.from '} ||= 'vroom@example.com';
|
||||
$config->{'email.contact'} ||= 'admin@example.com';
|
||||
$config->{'email.sendmail'} ||= '/sbin/sendmail';
|
||||
$config->{'interface.powered_by'} ||= '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>';
|
||||
$config->{'interface.template'} ||= 'default';
|
||||
$config->{'interface.chrome_extension_id'} ||= 'ecicdpoejfllflombfanbhfpgcimjddn';
|
||||
$config->{'cookie.secret'} ||= 'secret';
|
||||
$config->{'cookie.name'} ||= 'vroom';
|
||||
$config->{'rooms.inactivity_timeout'} ||= 3600;
|
||||
$config->{'rooms.reserved_inactivity_timeout'} ||= 5184000;
|
||||
$config->{'rooms.common_names'} ||= '';
|
||||
$config->{'log.level'} ||= 'info';
|
||||
$config->{'etherpad.uri'} ||= '';
|
||||
$config->{'etherpad.api_key'} ||= '';
|
||||
$config->{'etherpad.base_domain'} ||= '';
|
||||
$config->{'daemon.listen_ip'} ||= '127.0.0.1';
|
||||
$config->{'daemon.listen_port'} ||= '8090';
|
||||
|
||||
# Set log level
|
||||
app->log->level($config->{'log.level'});
|
||||
|
||||
our @js_locales = qw(
|
||||
ERROR_MAIL_INVALID
|
||||
|
@ -190,15 +198,13 @@ our @js_locales = qw(
|
|||
|
||||
# Create etherpad api client if required
|
||||
our $ec = undef;
|
||||
if ($config->{etherpadUri} =~ m/https?:\/\/.*/ && $config->{etherpadApiKey} ne ''){
|
||||
if ($config->{'etherpad.uri'} =~ m/https?:\/\/.*/ && $config->{'etherpad.api_key'} ne ''){
|
||||
$ec = Etherpad::API->new({
|
||||
url => $config->{etherpadUri},
|
||||
apikey => $config->{etherpadApiKey}
|
||||
url => $config->{'etherpad.uri'},
|
||||
apikey => $config->{'etherpad.api_key'}
|
||||
});
|
||||
}
|
||||
|
||||
app->log->level($config->{logLevel});
|
||||
|
||||
# Load I18N, and declare supported languages
|
||||
plugin I18N => {
|
||||
namespace => 'Vroom::I18N',
|
||||
|
@ -207,15 +213,15 @@ plugin I18N => {
|
|||
|
||||
# Connect to the database
|
||||
plugin database => {
|
||||
dsn => $config->{dbi},
|
||||
username => $config->{dbUser},
|
||||
password => $config->{dbPassword},
|
||||
dsn => $config->{'database.dsn'},
|
||||
username => $config->{'database.user'},
|
||||
password => $config->{'database.password'},
|
||||
options => { mysql_enable_utf8 => 1 }
|
||||
};
|
||||
|
||||
# Load mail plugin with its default values
|
||||
plugin mail => {
|
||||
from => $config->{emailFrom},
|
||||
from => $config->{'email.from'},
|
||||
type => 'text/html',
|
||||
};
|
||||
|
||||
|
@ -256,7 +262,7 @@ helper create_room => sub {
|
|||
} || return undef;
|
||||
# Gen a random token. Will be used as a turnPassword
|
||||
my $tp = $self->get_random(256);
|
||||
$sth->execute($name,time(),time(),$owner,$tp,$config->{realm}) || return undef;
|
||||
$sth->execute($name,time(),time(),$owner,$tp,$config->{'turn.realm'}) || return undef;
|
||||
$self->app->log->info("Room $name created by " . $self->session('name'));
|
||||
# Etherpad integration ?
|
||||
if ($ec){
|
||||
|
@ -427,7 +433,7 @@ helper delete_participants => sub {
|
|||
helper delete_rooms => sub {
|
||||
my $self = shift;
|
||||
$self->app->log->debug('Removing unused rooms');
|
||||
my $timeout = time()-$config->{inactivityTimeout};
|
||||
my $timeout = time()-$config->{'rooms.inactivity_timeout'};
|
||||
my $sth = eval {
|
||||
$self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NULL;")
|
||||
} || return undef;
|
||||
|
@ -437,8 +443,8 @@ helper delete_rooms => sub {
|
|||
push @toDeleteName, $room;
|
||||
}
|
||||
my @toDeleteId = ();
|
||||
if ($config->{reservedInactivityTimeout} > 0){
|
||||
$timeout = time()-$config->{reservedInactivityTimeout};
|
||||
if ($config->{'rooms.reserved_inactivity_timeout'} > 0){
|
||||
$timeout = time()-$config->{'rooms.reserved_inactivity_timeout'};
|
||||
$sth = eval {
|
||||
$self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NOT NULL;")
|
||||
} || return undef;
|
||||
|
@ -844,9 +850,8 @@ helper create_etherpad_session => sub {
|
|||
my $etherpadSession = $ec->create_session($data->{etherpad_group}, $id, time + 86400);
|
||||
$self->session($room)->{etherpadSessionId} = $etherpadSession;
|
||||
my $etherpadCookieParam = {};
|
||||
if ($config->{etherpadBaseDomain} && $config->{etherpadBaseDomain} ne ''){
|
||||
$etherpadCookieParam->{domain} = $config->{etherpadBaseDomain};
|
||||
$self->app->log->debug("Creating an etherpad SesionID cookie for domaine " . $config->{etherpadBaseDomain});
|
||||
if ($config->{'etherpad.base_domain'} && $config->{'etherpad.base_domain'} ne ''){
|
||||
$etherpadCookieParam->{domain} = $config->{'etherpad.base_domain'};
|
||||
}
|
||||
$self->cookie(sessionID => $etherpadSession, $etherpadCookieParam);
|
||||
};
|
||||
|
@ -905,7 +910,7 @@ post '/feedback' => sub {
|
|||
my $email = $self->param('email') || '';
|
||||
my $comment = $self->param('comment');
|
||||
my $sent = $self->mail(
|
||||
to => $config->{feedbackRecipient},
|
||||
to => $config->{'email.contact'},
|
||||
subject => $self->l("FEEDBACK_FROM_VROOM"),
|
||||
data => $self->render_mail('feedback',
|
||||
email => $email,
|
||||
|
@ -1309,7 +1314,7 @@ post '/*action' => [action => [qw/action admin\/action/]] => sub {
|
|||
if ($prefix eq 'admin' || $self->session($room)->{role} eq 'owner'){
|
||||
if ($type eq 'owner'){
|
||||
# Forbid a few common room names to be reserved
|
||||
if (grep { $room eq $_ } @{$config->{commonRoomNames}}){
|
||||
if (grep { $room eq $_ } (split /[,;]/, $config->{'rooms.common_names'})){
|
||||
$msg = $self->l('ERROR_COMMON_ROOM_NAME');
|
||||
}
|
||||
elsif ($self->set_owner_pass($room,$pass)){
|
||||
|
@ -1577,22 +1582,24 @@ post '/*action' => [action => [qw/action admin\/action/]] => sub {
|
|||
};
|
||||
|
||||
# use the templates defined in the config
|
||||
push @{app->renderer->paths}, 'templates/'.$config->{template};
|
||||
push @{app->renderer->paths}, 'templates/'.$config->{'interface.template'};
|
||||
# Set the secret used to sign cookies
|
||||
app->secret($config->{secret});
|
||||
app->secret($config->{'cookie.secret'});
|
||||
app->sessions->secure(1);
|
||||
app->sessions->cookie_name('vroom');
|
||||
app->sessions->cookie_name($config->{'cookie.name'});
|
||||
app->hook(before_dispatch => sub {
|
||||
my $self = shift;
|
||||
# Switch to the desired language
|
||||
if ($self->session('language')){
|
||||
$self->languages($self->session('language'));
|
||||
}
|
||||
# Stash the configuration hashref
|
||||
$self->stash(config => $config);
|
||||
});
|
||||
# Are we running in hypnotoad ?
|
||||
app->config(
|
||||
hypnotoad => {
|
||||
listen => ['http://127.0.0.1:8090'],
|
||||
listen => ['http://' . $config->{'daemon.listen_ip'} . ':' . $config->{'daemon.listen_port'}],
|
||||
pid_file => '/tmp/vroom.pid',
|
||||
proxy => 1
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user