Switch conf parser to Config::Simple

Fix #84
master
Daniel Berteaud 10 years ago
parent 867df625e8
commit cfb6fddac2
  1. 2
      .gitignore
  2. 66
      conf/settings.ini.dist
  3. 26
      conf/vroom.conf
  4. 2
      templates/default/footer.html.ep
  5. 10
      templates/default/join.html.ep
  6. 6
      templates/default/owner_password_modal.html.ep
  7. 99
      vroom.pl

2
.gitignore vendored

@ -1,3 +1,3 @@
signalmaster/node_modules/ signalmaster/node_modules/
signalmaster/dev_config.json signalmaster/dev_config.json
conf/vroom.conf conf/settings.ini

@ -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 # Database
dbi => 'DBI:mysql:database=vroom;host=localhost', dbi => 'DBI:mysql:database=devroom;host=localhost',
dbUser => 'vroom', dbUser => 'devroom',
dbPassword => 'vroom', dbPassword => 'prout',
# Media & signaling # Media & signaling
signalingServer => 'https://signal.example.com', signalingServer => 'https://dev.vroom.im',
stunServer => 'stun.example.com:3478', stunServer => 'vroom.im:3478',
turnServer => 'turn.example.com', turnServer => 'vroom.im',
realm => 'example.com', realm => 'vroom.im',
# Web & contact # Web & contact
emailFrom => 'vroom@example.com', emailFrom => 'no-reply@vroom.im',
feedbackRecipient => 'admin@example.com', oeedbackRecipient => 'dani@fws.fr',
poweredBy => '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>', poweredBy => '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>',
# Templates to use for web pages # Templates to use for web pages
template => 'default', template => 'default',
# Used to sign cookies # Used to sign cookies
secret => 'ChangeMe!', secret => 'NtPZDUEqNX68QlQGH5ohqb1ymmqEGJ3xyvLo4Fz3pDqEX/Dxutmp',
# App # App
# Rooms without any activity for that long (in seconds) will be destroyed # 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 # For etherpad integration, set the etherpad base url
# and API Key # and API Key
#etherpadUri => '', etherpadUri => 'https://vroom.im/etherpad/',
#etherpadApiKey => '', etherpadApiKey => 'be0c00cfce12b00c13e956e77d7244352c06a44e5d94ca44ebfa79fb63d7e995',
# You can also set the base domain common to both vroom and etherpad # 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 # For example, if you use vroom.example.com and pad.example.com, the base domain is example.com
#etherpadBaseDomain => '', etherpadBaseDomain => 'vroom.im',
# Various # Various
sendmail => '/sbin/sendmail' sendmail => '/sbin/sendmail'

@ -5,7 +5,7 @@
<p class="text-muted pull-left"><%=l 'VROOM_IS_FREE_SOFTWARE' %></p> <p class="text-muted pull-left"><%=l 'VROOM_IS_FREE_SOFTWARE' %></p>
</div> </div>
<div class="col-xs-6"> <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> </div>
</div> </div>

@ -700,7 +700,7 @@
<%=l 'VROOM_CHROME_EXTENSION' %> <%=l 'VROOM_CHROME_EXTENSION' %>
</p> </p>
<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 class="glyphicon glyphicon-download-alt">
</span> </span>
</a> </a>
@ -869,7 +869,7 @@
setTimeout(function(){ setTimeout(function(){
etherpad = { etherpad = {
enabled: <%= $etherpad %>, enabled: <%= $etherpad %>,
uri: "<%= $config->{etherpadUri} %>", uri: "<%= $config->{'etherpad.uri'} %>",
group: "<%= $etherpadGroup %>" group: "<%= $etherpadGroup %>"
}; };
<% if ($video eq 'false'){ %> <% if ($video eq 'false'){ %>
@ -882,11 +882,11 @@
}; };
<% } %> <% } %>
webrtc = new SimpleWebRTC({ webrtc = new SimpleWebRTC({
url: "<%= $config->{signalingServer} %>", url: "<%= $config->{'signaling.uri'} %>",
peerConnectionConfig: { peerConnectionConfig: {
iceServers: [ iceServers: [
{"url":"stun:<%= $config->{stunServer} %>"}, {"url":"stun:<%= $config->{'turn.stun_server'} %>"},
<%== ($config->{turnServer} && $config->{turnServer} ne '') ? "{\"url\":\"turn:$config->{turnServer}\", \"username\":\"$room\", \"credential\":\"$turnPassword\"}":'' %> <%== ($config->{'turn.turn_server'} && $config->{'turn.turn_server'} ne '') ? "{\"url\":\"turn:$config->{'turn.turn_server'}\", \"username\":\"$room\", \"credential\":\"$turnPassword\"}":'' %>
] ]
}, },
localVideoEl: 'webRTCVideoLocal', localVideoEl: 'webRTCVideoLocal',

@ -15,12 +15,12 @@
<%=l 'SET_OWNER_PASS' %> <%=l 'SET_OWNER_PASS' %>
<ul> <ul>
<li> <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>
<li> <li>
<%=l 'A_RESERVED_ROOM' %> <%=l 'A_RESERVED_ROOM' %>
<% if ($config->{reservedInactivityTimeout} > 0){ %> <% if ($config->{'reserved_inactivity_timeout'} > 0){ %>
<%= sprintf($self->l('EXPIRE_AFTER_d'), int($config->{reservedInactivityTimeout}/(3600*24))) %> <%= sprintf($self->l('EXPIRE_AFTER_d'), int($config->{'reserved_inactivity_timeout'}/(3600*24))) %>
<% } else{ %> <% } else{ %>
<%=l 'WILL_NEVER_EXPIRE' %> <%=l 'WILL_NEVER_EXPIRE' %>
<% } %> <% } %>

@ -15,6 +15,7 @@ use File::stat;
use File::Basename; use File::Basename;
use Etherpad::API; use Etherpad::API;
use Session::Token; use Session::Token;
use Config::Simple;
# List The different components we rely on. # List The different components we rely on.
# Used to generate thanks on the about template # Used to generate thanks on the about template
@ -105,30 +106,37 @@ our $musics = {
app->log->level('info'); app->log->level('info');
# Read conf file, and set default values # Read conf file, and set default values
our $config = plugin Config => { my $cfg = new Config::Simple();
file => 'conf/vroom.conf', $cfg->read('conf/settings.ini');
default => { our $config = $cfg->vars();
dbi => 'DBI:mysql:database=vroom;host=localhost',
dbUser => 'vroom', $config->{'database.dsn'} ||= 'DBI:mysql:database=vroom;host=localhost';
dbPassword => 'vroom', $config->{'database.user'} ||= 'vroom';
signalingServer => 'https://vroom.example.com/', $config->{'database.password'} ||= 'vroom';
stunServer => 'stun.l.google.com:19302', $config->{'signaling.uri'} ||= 'https://vroom.example.com/';
realm => 'vroom', $config->{'turn.stun_server'} ||= 'stun.l.google.com:19302';
emailFrom => 'vroom@example.com', $config->{'turn.turn_server'} ||= '';
feedbackRecipient => 'admin@example.com', $config->{'turn.realm'} ||= 'vroom';
poweredBy => '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>', $config->{'email.from '} ||= 'vroom@example.com';
template => 'default', $config->{'email.contact'} ||= 'admin@example.com';
inactivityTimeout => 3600, $config->{'email.sendmail'} ||= '/sbin/sendmail';
reservedInactivityTimeout => 5184000, $config->{'interface.powered_by'} ||= '<a href="http://www.firewall-services.com" target="_blank">Firewall Services</a>';
commonRoomNames => [ qw() ], $config->{'interface.template'} ||= 'default';
logLevel => 'info', $config->{'interface.chrome_extension_id'} ||= 'ecicdpoejfllflombfanbhfpgcimjddn';
chromeExtensionId => 'ecicdpoejfllflombfanbhfpgcimjddn', $config->{'cookie.secret'} ||= 'secret';
etherpadUri => '', $config->{'cookie.name'} ||= 'vroom';
etherpadApiKey => '', $config->{'rooms.inactivity_timeout'} ||= 3600;
etherpadBaseDomain => '', $config->{'rooms.reserved_inactivity_timeout'} ||= 5184000;
sendmail => '/sbin/sendmail' $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( our @js_locales = qw(
ERROR_MAIL_INVALID ERROR_MAIL_INVALID
@ -190,15 +198,13 @@ our @js_locales = qw(
# Create etherpad api client if required # Create etherpad api client if required
our $ec = undef; 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({ $ec = Etherpad::API->new({
url => $config->{etherpadUri}, url => $config->{'etherpad.uri'},
apikey => $config->{etherpadApiKey} apikey => $config->{'etherpad.api_key'}
}); });
} }
app->log->level($config->{logLevel});
# Load I18N, and declare supported languages # Load I18N, and declare supported languages
plugin I18N => { plugin I18N => {
namespace => 'Vroom::I18N', namespace => 'Vroom::I18N',
@ -207,15 +213,15 @@ plugin I18N => {
# Connect to the database # Connect to the database
plugin database => { plugin database => {
dsn => $config->{dbi}, dsn => $config->{'database.dsn'},
username => $config->{dbUser}, username => $config->{'database.user'},
password => $config->{dbPassword}, password => $config->{'database.password'},
options => { mysql_enable_utf8 => 1 } options => { mysql_enable_utf8 => 1 }
}; };
# Load mail plugin with its default values # Load mail plugin with its default values
plugin mail => { plugin mail => {
from => $config->{emailFrom}, from => $config->{'email.from'},
type => 'text/html', type => 'text/html',
}; };
@ -256,7 +262,7 @@ helper create_room => sub {
} || return undef; } || return undef;
# Gen a random token. Will be used as a turnPassword # Gen a random token. Will be used as a turnPassword
my $tp = $self->get_random(256); 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')); $self->app->log->info("Room $name created by " . $self->session('name'));
# Etherpad integration ? # Etherpad integration ?
if ($ec){ if ($ec){
@ -427,7 +433,7 @@ helper delete_participants => sub {
helper delete_rooms => sub { helper delete_rooms => sub {
my $self = shift; my $self = shift;
$self->app->log->debug('Removing unused rooms'); $self->app->log->debug('Removing unused rooms');
my $timeout = time()-$config->{inactivityTimeout}; my $timeout = time()-$config->{'rooms.inactivity_timeout'};
my $sth = eval { my $sth = eval {
$self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NULL;") $self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NULL;")
} || return undef; } || return undef;
@ -437,8 +443,8 @@ helper delete_rooms => sub {
push @toDeleteName, $room; push @toDeleteName, $room;
} }
my @toDeleteId = (); my @toDeleteId = ();
if ($config->{reservedInactivityTimeout} > 0){ if ($config->{'rooms.reserved_inactivity_timeout'} > 0){
$timeout = time()-$config->{reservedInactivityTimeout}; $timeout = time()-$config->{'rooms.reserved_inactivity_timeout'};
$sth = eval { $sth = eval {
$self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NOT NULL;") $self->db->prepare("SELECT `name` FROM `rooms` WHERE `activity_timestamp` < $timeout AND `persistent`='0' AND `owner_password` IS NOT NULL;")
} || return undef; } || return undef;
@ -844,9 +850,8 @@ helper create_etherpad_session => sub {
my $etherpadSession = $ec->create_session($data->{etherpad_group}, $id, time + 86400); my $etherpadSession = $ec->create_session($data->{etherpad_group}, $id, time + 86400);
$self->session($room)->{etherpadSessionId} = $etherpadSession; $self->session($room)->{etherpadSessionId} = $etherpadSession;
my $etherpadCookieParam = {}; my $etherpadCookieParam = {};
if ($config->{etherpadBaseDomain} && $config->{etherpadBaseDomain} ne ''){ if ($config->{'etherpad.base_domain'} && $config->{'etherpad.base_domain'} ne ''){
$etherpadCookieParam->{domain} = $config->{etherpadBaseDomain}; $etherpadCookieParam->{domain} = $config->{'etherpad.base_domain'};
$self->app->log->debug("Creating an etherpad SesionID cookie for domaine " . $config->{etherpadBaseDomain});
} }
$self->cookie(sessionID => $etherpadSession, $etherpadCookieParam); $self->cookie(sessionID => $etherpadSession, $etherpadCookieParam);
}; };
@ -905,7 +910,7 @@ post '/feedback' => sub {
my $email = $self->param('email') || ''; my $email = $self->param('email') || '';
my $comment = $self->param('comment'); my $comment = $self->param('comment');
my $sent = $self->mail( my $sent = $self->mail(
to => $config->{feedbackRecipient}, to => $config->{'email.contact'},
subject => $self->l("FEEDBACK_FROM_VROOM"), subject => $self->l("FEEDBACK_FROM_VROOM"),
data => $self->render_mail('feedback', data => $self->render_mail('feedback',
email => $email, 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 ($prefix eq 'admin' || $self->session($room)->{role} eq 'owner'){
if ($type eq 'owner'){ if ($type eq 'owner'){
# Forbid a few common room names to be reserved # 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'); $msg = $self->l('ERROR_COMMON_ROOM_NAME');
} }
elsif ($self->set_owner_pass($room,$pass)){ 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 # 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 # Set the secret used to sign cookies
app->secret($config->{secret}); app->secret($config->{'cookie.secret'});
app->sessions->secure(1); app->sessions->secure(1);
app->sessions->cookie_name('vroom'); app->sessions->cookie_name($config->{'cookie.name'});
app->hook(before_dispatch => sub { app->hook(before_dispatch => sub {
my $self = shift; my $self = shift;
# Switch to the desired language # Switch to the desired language
if ($self->session('language')){ if ($self->session('language')){
$self->languages($self->session('language')); $self->languages($self->session('language'));
} }
# Stash the configuration hashref
$self->stash(config => $config);
}); });
# Are we running in hypnotoad ? # Are we running in hypnotoad ?
app->config( app->config(
hypnotoad => { hypnotoad => {
listen => ['http://127.0.0.1:8090'], listen => ['http://' . $config->{'daemon.listen_ip'} . ':' . $config->{'daemon.listen_port'}],
pid_file => '/tmp/vroom.pid', pid_file => '/tmp/vroom.pid',
proxy => 1 proxy => 1
} }

Loading…
Cancel
Save