2013-07-01 15:56:32 +02:00
|
|
|
|
app = Sammy('#main', function (sam) {
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
/**
|
|
|
|
|
* Sammy Configuration
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
// Plugins
|
2014-02-11 12:46:03 +01:00
|
|
|
|
sam.use('Handlebars', 'ms');
|
2013-07-01 15:56:32 +02:00
|
|
|
|
|
2014-02-18 23:26:11 +01:00
|
|
|
|
Handlebars.registerHelper('ucwords', function(str) {
|
|
|
|
|
return (str + '').replace(/^([a-z\u00E0-\u00FC])|\s+([a-z\u00E0-\u00FC])/g, function ($1) {
|
|
|
|
|
return $1.toUpperCase();
|
|
|
|
|
});
|
|
|
|
|
});
|
2014-02-14 20:14:09 +01:00
|
|
|
|
Handlebars.registerHelper('humanSize', function(bytes) {
|
|
|
|
|
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
|
|
|
if (bytes == 0) return 'n/a';
|
|
|
|
|
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
|
|
|
|
|
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[[i]];
|
|
|
|
|
});
|
2014-02-14 20:28:16 +01:00
|
|
|
|
Handlebars.registerHelper('humanTime', function(time) {
|
|
|
|
|
return Math.round(time) + 's';
|
|
|
|
|
});
|
2014-02-14 22:59:49 +01:00
|
|
|
|
Handlebars.registerHelper('bitRate', function(bytes, time) {
|
|
|
|
|
var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb'];
|
|
|
|
|
if (time == 0) return 'n/a';
|
|
|
|
|
var bps = bytes / time * 8;
|
|
|
|
|
var i = parseInt(Math.floor(Math.log(bps) / Math.log(1024)));
|
|
|
|
|
return Math.round(bps / Math.pow(1024, i), 2) + ' ' + sizes[[i]] + '/s';
|
|
|
|
|
});
|
2014-02-14 20:14:09 +01:00
|
|
|
|
|
2014-05-12 18:28:42 +02:00
|
|
|
|
Handlebars.registerHelper('t', function(y18n_key) {
|
|
|
|
|
var result = y18n.t(y18n_key, Array.prototype.slice.call(arguments, 1));
|
|
|
|
|
return new Handlebars.SafeString(result);
|
|
|
|
|
});
|
|
|
|
|
|
2014-02-14 20:14:09 +01:00
|
|
|
|
|
2013-12-15 17:14:42 +01:00
|
|
|
|
// Look for supported type of storage to use
|
|
|
|
|
var storageType;
|
|
|
|
|
if (Sammy.Store.isAvailable('session')) {
|
|
|
|
|
storageType = 'session';
|
|
|
|
|
} else if (Sammy.Store.isAvailable('cookie')) {
|
|
|
|
|
storageType = 'cookie';
|
|
|
|
|
} else {
|
|
|
|
|
storageType = 'memory';
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
// Initialize storage
|
2013-12-15 17:14:42 +01:00
|
|
|
|
var store = new Sammy.Store({name: 'storage', type: storageType});
|
2013-11-23 13:02:55 +01:00
|
|
|
|
var loaded = false;
|
2013-07-01 15:56:32 +02:00
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
/**
|
|
|
|
|
* Helpers
|
|
|
|
|
*
|
|
|
|
|
*/
|
2013-07-01 19:32:11 +02:00
|
|
|
|
sam.helpers({
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
2013-11-22 15:31:47 +01:00
|
|
|
|
// Serialize an object
|
|
|
|
|
serialize : function(obj) {
|
|
|
|
|
var str = [];
|
|
|
|
|
for(var p in obj)
|
|
|
|
|
if (obj.hasOwnProperty(p)) {
|
|
|
|
|
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
|
|
|
|
|
}
|
|
|
|
|
return str.join("&");
|
|
|
|
|
},
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
// Flash helper to diplay instant notifications
|
2013-07-01 19:32:11 +02:00
|
|
|
|
flash: function (level, message) {
|
|
|
|
|
flashs = store.get('flash');
|
2014-05-08 14:13:23 +02:00
|
|
|
|
if (!flashs) { flashs = {'info': [], 'fail': [], 'warning': [], 'success': [] } }
|
2013-07-01 19:32:11 +02:00
|
|
|
|
flashs[level].push(message);
|
|
|
|
|
store.set('flash', flashs);
|
2013-07-01 15:56:32 +02:00
|
|
|
|
|
2013-07-01 19:32:11 +02:00
|
|
|
|
html = '';
|
|
|
|
|
for(lvl in flashs) {
|
|
|
|
|
flashs[lvl].forEach( function(msg) {
|
2013-12-19 02:08:42 +01:00
|
|
|
|
if (lvl == 'fail') { alertClass = 'alert-danger'; }
|
|
|
|
|
else { alertClass = 'alert-'+ lvl; }
|
|
|
|
|
html += '<div class="alert '+ alertClass +'">'+ msg +'</div>';
|
2013-07-01 19:32:11 +02:00
|
|
|
|
});
|
|
|
|
|
}
|
2013-12-19 02:08:42 +01:00
|
|
|
|
$('#flash').html(html).fadeIn();
|
2013-07-01 19:32:11 +02:00
|
|
|
|
},
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
|
|
|
|
// API connection helper
|
2013-07-01 19:32:11 +02:00
|
|
|
|
api: function (uri, callback, method, data) {
|
2013-09-23 21:18:51 +02:00
|
|
|
|
c = this;
|
2013-07-01 19:32:11 +02:00
|
|
|
|
method = typeof method !== 'undefined' ? method : 'GET';
|
|
|
|
|
data = typeof data !== 'undefined' ? data : {};
|
2014-03-03 23:04:09 +01:00
|
|
|
|
if (window.navigator && window.navigator.language && (typeof data.locale === 'undefined')) {
|
|
|
|
|
data.locale = window.navigator.language;
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-21 19:31:32 +01:00
|
|
|
|
var args = data;
|
2013-07-01 19:32:11 +02:00
|
|
|
|
auth = "Basic "+ btoa(store.get('user') +':'+ atob(store.get('password')));
|
2013-10-31 20:37:43 +01:00
|
|
|
|
if (uri == '/postinstall') {
|
|
|
|
|
var installing = false;
|
|
|
|
|
|
2013-11-21 10:54:33 +01:00
|
|
|
|
setInterval(function () {
|
2013-10-31 20:37:43 +01:00
|
|
|
|
installing = true;
|
2014-04-21 12:58:34 +02:00
|
|
|
|
}, 1500);
|
2013-11-23 13:02:55 +01:00
|
|
|
|
|
2014-05-13 16:37:05 +02:00
|
|
|
|
$('#popup-title').text(y18n.t('installing'));
|
|
|
|
|
$('#popup-body').html('<p>'+y18n.t('installation_complete_wait', [data.domain])+'</p>');
|
|
|
|
|
$('#popup-body').append('<div class="loader-content"><img src="img/ajax-loader.gif"></div>');
|
2013-11-21 10:54:33 +01:00
|
|
|
|
$('#popup').modal('show');
|
2013-11-23 13:02:55 +01:00
|
|
|
|
} else {
|
|
|
|
|
loaded = false;
|
|
|
|
|
if ($('div.loader-content').length == 0) {
|
|
|
|
|
setInterval(function () {
|
|
|
|
|
if (!loaded && $('div.loader-content').length == 0) {
|
|
|
|
|
$('#main').append('<div class="loader-content"><img src="img/ajax-loader.gif"></div>');
|
|
|
|
|
}
|
|
|
|
|
}, 500);
|
|
|
|
|
}
|
2013-10-31 20:37:43 +01:00
|
|
|
|
}
|
2013-07-01 19:32:11 +02:00
|
|
|
|
jQuery.ajax({
|
|
|
|
|
url: store.get('url') + uri,
|
|
|
|
|
type: method,
|
|
|
|
|
crossdomain: true,
|
|
|
|
|
data: data,
|
2013-09-23 12:31:35 +02:00
|
|
|
|
traditional: true,
|
2013-07-01 19:32:11 +02:00
|
|
|
|
dataType: 'json',
|
|
|
|
|
beforeSend: function(req) {
|
|
|
|
|
req.setRequestHeader('Authorization', auth);
|
|
|
|
|
}
|
|
|
|
|
})
|
2013-09-23 21:18:51 +02:00
|
|
|
|
.success(function(data) {
|
|
|
|
|
data = typeof data !== 'undefined' ? data : {};
|
|
|
|
|
if (typeof data.win !== 'undefined') {
|
|
|
|
|
$.each(data.win, function(k, v) {
|
|
|
|
|
c.flash('success', v);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
callback(data);
|
2013-07-01 19:32:11 +02:00
|
|
|
|
})
|
2013-09-23 21:18:51 +02:00
|
|
|
|
.fail(function(xhr) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
if (xhr.status == 401) {
|
2014-04-21 12:58:34 +02:00
|
|
|
|
$('#popup').modal('hide');
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('wrong_password'));
|
2013-11-23 13:31:30 +01:00
|
|
|
|
} else if (typeof xhr.responseJSON !== 'undefined') {
|
2014-04-21 12:58:34 +02:00
|
|
|
|
$('#popup').modal('hide');
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.flash('fail', xhr.responseJSON.error);
|
|
|
|
|
} else {
|
2013-10-31 20:37:43 +01:00
|
|
|
|
if (uri == '/postinstall') {
|
|
|
|
|
if (installing) {
|
2013-11-21 19:31:32 +01:00
|
|
|
|
if (args.domain.match(/\.nohost\.me$/) || args.domain.match(/\.noho\.st$/)) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
$('#popup-title').text(y18n.t('installed'));
|
|
|
|
|
$('#popup-body p').text(y18n.t('installation_complete_dns'));
|
2013-11-23 13:02:55 +01:00
|
|
|
|
interval = 180000;
|
2013-11-21 19:31:32 +01:00
|
|
|
|
} else {
|
|
|
|
|
interval = 5000;
|
|
|
|
|
}
|
2013-11-21 14:56:46 +01:00
|
|
|
|
setInterval(function () {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
$('#popup-title').text(y18n.t('installation_complete'));
|
|
|
|
|
$('#popup-body').html(
|
|
|
|
|
'<p>'+ y18n.t('installation_complete_desc', ['https://'+ args.domain +'/yunohost/admin']) +'</p>'
|
|
|
|
|
+ '<br>'
|
|
|
|
|
+ '<p><small>'+ y18n.t('installation_complete_help_dns') +'</small></p>');
|
2013-11-21 19:31:32 +01:00
|
|
|
|
}, interval);
|
2013-11-21 10:54:33 +01:00
|
|
|
|
} else {
|
|
|
|
|
$('#popup').modal('hide');
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_occured'));
|
2013-10-31 20:37:43 +01:00
|
|
|
|
}
|
2013-11-21 19:31:32 +01:00
|
|
|
|
} else {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_server'));
|
2013-10-31 20:37:43 +01:00
|
|
|
|
}
|
2013-09-24 16:54:33 +02:00
|
|
|
|
}
|
2013-09-23 21:18:51 +02:00
|
|
|
|
store.clear('slide');
|
2013-09-24 22:54:48 +02:00
|
|
|
|
c.redirect(store.get('path-1'));
|
2013-07-01 19:32:11 +02:00
|
|
|
|
})
|
2013-09-23 21:18:51 +02:00
|
|
|
|
.done(function(data) {
|
2013-11-23 13:02:55 +01:00
|
|
|
|
loaded = true;
|
|
|
|
|
$('div.loader-content').remove();
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
2013-07-01 19:32:11 +02:00
|
|
|
|
},
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
|
|
|
|
// Render view (cross-browser)
|
2013-07-01 19:32:11 +02:00
|
|
|
|
view: function (view, data) {
|
2013-09-21 19:46:26 +02:00
|
|
|
|
rendered = this.render('views/'+ view +'.ms', data);
|
|
|
|
|
|
2013-09-25 21:49:12 +02:00
|
|
|
|
enableSlide = true; // Change to false to disable animation
|
|
|
|
|
|
2013-11-23 13:02:55 +01:00
|
|
|
|
loaded = true;
|
|
|
|
|
$('div.loader-content').remove();
|
|
|
|
|
|
2013-09-25 21:49:12 +02:00
|
|
|
|
if (enableSlide) {
|
|
|
|
|
function leSwap() {
|
|
|
|
|
rendered.swap(function() {
|
|
|
|
|
$('.slide').on('click', function() {
|
|
|
|
|
$(this).addClass('active');
|
|
|
|
|
if ($(this).hasClass('back')) {
|
|
|
|
|
store.set('slide', 'back');
|
|
|
|
|
} else {
|
|
|
|
|
store.set('slide', 'to');
|
|
|
|
|
}
|
|
|
|
|
});
|
2013-09-21 19:46:26 +02:00
|
|
|
|
});
|
2013-09-25 21:49:12 +02:00
|
|
|
|
}
|
2013-09-21 20:59:47 +02:00
|
|
|
|
|
2013-09-25 21:49:12 +02:00
|
|
|
|
blockSize = $('#slider').width();
|
|
|
|
|
|
|
|
|
|
// Slide back effect
|
|
|
|
|
if (store.get('slide') == 'back') {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
$('#slideBack').css('display', 'none');
|
|
|
|
|
$('#slider-container').removeClass('move').css('margin-left', '-'+ blockSize +'px');
|
|
|
|
|
$('#slideTo').show().html($('#main').html());
|
|
|
|
|
leSwap();
|
|
|
|
|
$('#slider-container').addClass('move').css('margin-left', '0px');
|
|
|
|
|
|
|
|
|
|
// Slide to effect
|
|
|
|
|
} else if (store.get('slide') == 'to') {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
$('#slideTo').css('display', 'none');
|
|
|
|
|
$('#slider-container').removeClass('move').css('margin-left', '-'+ blockSize +'px');
|
|
|
|
|
$('#slider-container').removeClass('move').css('margin-left', '0px');
|
|
|
|
|
$('#slideBack').show().html($('#main').html());
|
|
|
|
|
leSwap();
|
|
|
|
|
$('#slider-container').addClass('move').css('margin-left', '-'+ blockSize +'px');
|
2013-09-25 02:33:39 +02:00
|
|
|
|
|
2013-09-25 21:49:12 +02:00
|
|
|
|
} else {
|
|
|
|
|
leSwap();
|
|
|
|
|
}
|
2013-09-21 19:46:26 +02:00
|
|
|
|
} else {
|
2013-09-25 21:49:12 +02:00
|
|
|
|
rendered.swap();
|
2013-09-21 19:46:26 +02:00
|
|
|
|
}
|
2013-07-01 15:56:32 +02:00
|
|
|
|
}
|
2013-07-01 19:32:11 +02:00
|
|
|
|
});
|
2013-07-01 15:56:32 +02:00
|
|
|
|
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
/**
|
|
|
|
|
* Filters
|
|
|
|
|
*
|
|
|
|
|
*/
|
2014-02-21 15:24:54 +01:00
|
|
|
|
sam.before(/apps\/install\//, function (req){
|
2014-02-21 13:48:03 +01:00
|
|
|
|
// Preload domains list.
|
|
|
|
|
req.params.domains = [];
|
|
|
|
|
req.api('/domains', function(data) {
|
|
|
|
|
req.params.domains = data.Domains;
|
|
|
|
|
});
|
|
|
|
|
});
|
2014-02-21 15:24:54 +01:00
|
|
|
|
sam.before(/apps\/install\//, function (req){
|
2014-02-21 13:48:03 +01:00
|
|
|
|
// Preload users lists.
|
|
|
|
|
req.params.users = [];
|
|
|
|
|
req.api('/users', function(data) {
|
|
|
|
|
req.params.users = data.Users;
|
|
|
|
|
});
|
|
|
|
|
});
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
2014-02-21 13:48:03 +01:00
|
|
|
|
sam.before({except: {path: ['#/login', '#/postinstall']}}, function (req) {
|
2013-07-02 12:35:31 +02:00
|
|
|
|
// Store path for further redirections
|
2013-09-23 21:18:51 +02:00
|
|
|
|
store.set('path-1', store.get('path'));
|
2013-07-01 15:56:32 +02:00
|
|
|
|
store.set('path', req.path);
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
2013-09-21 12:10:54 +02:00
|
|
|
|
// Redirect to login page if no credentials stored
|
2013-12-19 02:02:32 +01:00
|
|
|
|
if (!store.get('connected')) {
|
2013-07-01 15:56:32 +02:00
|
|
|
|
req.redirect('#/login');
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
|
|
|
|
// Clear flash display
|
|
|
|
|
if (!store.get('flash')) {
|
2013-09-22 21:31:51 +02:00
|
|
|
|
$('#flash').fadeOut(function() { $('#flash').html(''); });
|
2013-07-02 12:35:31 +02:00
|
|
|
|
}
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
sam.after(function () {
|
|
|
|
|
|
|
|
|
|
// Clear flash notifications
|
|
|
|
|
store.clear('flash');
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Routes
|
|
|
|
|
*
|
|
|
|
|
* Note: var "c" is Sammy's route context
|
|
|
|
|
* @doc http://sammyjs.org/docs/api/#Sammy.EventContext
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
sam.get('#/', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.api('/users', function(data) {
|
2014-05-08 14:13:23 +02:00
|
|
|
|
// Warn admin if no users are created.
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (data.Users.length == 0) {
|
|
|
|
|
c.flash('warning', y18n.t('warning_first_user'));
|
2014-05-08 14:13:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.view('home');
|
2014-05-08 14:13:23 +02:00
|
|
|
|
});
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.get('#/login', function (c) {
|
2014-02-11 14:06:00 +01:00
|
|
|
|
$('.logout-button').hide();
|
2013-09-24 16:54:33 +02:00
|
|
|
|
store.set('path-1', '#/login');
|
2013-09-25 21:49:12 +02:00
|
|
|
|
|
|
|
|
|
// Check if te client is hosted on a yunohost node
|
|
|
|
|
domain = window.location.hostname
|
2013-09-30 18:47:38 +02:00
|
|
|
|
$.ajax({
|
2014-04-10 23:55:09 +02:00
|
|
|
|
url: 'https://'+ domain +'/yunohost/api/api',
|
2013-09-30 18:47:38 +02:00
|
|
|
|
timeout: 3000
|
|
|
|
|
})
|
|
|
|
|
.success(function() {
|
2014-04-10 23:55:09 +02:00
|
|
|
|
$.getJSON('https://'+ domain +'/yunohost/api/installed', function(data) {
|
2013-09-25 21:49:12 +02:00
|
|
|
|
if (!data.installed) {
|
2013-10-01 12:40:59 +02:00
|
|
|
|
c.redirect('#/postinstall');
|
2013-09-25 21:49:12 +02:00
|
|
|
|
} else {
|
|
|
|
|
c.view('login', { 'domain': domain });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
.fail(function() {
|
|
|
|
|
c.view('login');
|
|
|
|
|
});
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.post('#/login', function (c) {
|
2014-04-10 23:55:09 +02:00
|
|
|
|
store.set('url', 'https://'+ c.params['domain'] +'/yunohost/api');
|
2013-07-02 12:35:31 +02:00
|
|
|
|
store.set('user', 'admin');
|
2013-07-01 15:56:32 +02:00
|
|
|
|
store.set('password', btoa(c.params['password']));
|
2013-09-25 21:49:12 +02:00
|
|
|
|
c.api('/api', function(data) {
|
2013-12-19 02:18:08 +01:00
|
|
|
|
if (data.apiVersion) {
|
2013-09-25 21:49:12 +02:00
|
|
|
|
c.api('/users', function(data) {
|
|
|
|
|
store.set('connected', true);
|
2014-02-11 14:06:00 +01:00
|
|
|
|
$('.logout-button').fadeIn();
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('success', y18n.t('logged_in'));
|
2013-09-25 21:49:12 +02:00
|
|
|
|
if (store.get('path')) {
|
|
|
|
|
c.redirect(store.get('path'));
|
|
|
|
|
} else {
|
|
|
|
|
c.redirect('#/');
|
|
|
|
|
}
|
|
|
|
|
});
|
2013-07-01 15:56:32 +02:00
|
|
|
|
} else {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('non_compatible_api'));
|
2013-09-25 21:49:12 +02:00
|
|
|
|
c.redirect('#/login');
|
2013-07-01 15:56:32 +02:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
2013-07-02 12:35:31 +02:00
|
|
|
|
|
2013-09-24 17:38:38 +02:00
|
|
|
|
sam.get('#/logout', function (c) {
|
|
|
|
|
store.clear('url');
|
|
|
|
|
store.clear('user');
|
|
|
|
|
store.clear('password');
|
|
|
|
|
store.clear('connected');
|
|
|
|
|
store.set('path', '#/');
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('success', y18n.t('logged_out'));
|
2013-09-24 17:38:38 +02:00
|
|
|
|
c.redirect('#/login');
|
|
|
|
|
});
|
|
|
|
|
|
2013-10-01 12:40:59 +02:00
|
|
|
|
sam.get('#/postinstall', function(c) {
|
|
|
|
|
c.view('postinstall', {'DDomains': ['.nohost.me', '.noho.st']});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.post('#/postinstall', function (c) {
|
|
|
|
|
if (c.params['password'] == c.params['confirmation']) {
|
|
|
|
|
if (c.params['domain'] == '') {
|
|
|
|
|
if (c.params['ddomain'] == '') {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_select_domain'));
|
2013-10-01 12:40:59 +02:00
|
|
|
|
store.clear('slide');
|
2013-10-01 12:45:56 +02:00
|
|
|
|
c.redirect('#/postinstall');
|
|
|
|
|
} else {
|
|
|
|
|
params = { 'domain': c.params['ddomain'] + c.params['ddomain-ext'] }
|
2013-10-01 12:40:59 +02:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2013-10-01 12:45:56 +02:00
|
|
|
|
params = { 'domain': c.params['domain'] }
|
2013-10-01 12:40:59 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
params['password'] = c.params['password']
|
|
|
|
|
|
2014-04-10 23:55:09 +02:00
|
|
|
|
store.set('url', 'https://'+ window.location.hostname +'/yunohost/api');
|
2013-10-01 12:40:59 +02:00
|
|
|
|
store.set('user', 'admin');
|
|
|
|
|
store.set('password', btoa('yunohost'));
|
|
|
|
|
c.api('/postinstall', function(data) { // http://api.yunohost.org/#!/tools/tools_postinstall_post_0
|
|
|
|
|
c.redirect('#/');
|
|
|
|
|
}, 'POST', params);
|
|
|
|
|
} else {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('passwords_dont_match'));
|
2013-10-01 12:40:59 +02:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2013-09-24 16:54:33 +02:00
|
|
|
|
/**
|
|
|
|
|
* Users
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
2013-09-22 21:31:51 +02:00
|
|
|
|
sam.get('#/users', function (c) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.api('/users', function(data) { // http://api.yunohost.org/#!/user/user_list_get_3
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('user/user_list', data);
|
2013-09-22 21:31:51 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2013-09-23 13:31:57 +02:00
|
|
|
|
sam.get('#/users/create', function (c) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_list_get_2
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('user/user_create', data);
|
2013-09-23 13:31:57 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.post('#/users', function (c) {
|
|
|
|
|
if (c.params['password'] == c.params['confirmation']) {
|
2014-03-02 19:42:02 +01:00
|
|
|
|
if (c.params['password'].length < 4) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('password_too_short'));
|
2014-03-02 19:42:02 +01:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
c.params['mail'] = c.params['email'] + c.params['domain'];
|
|
|
|
|
c.api('/users', function(data) { // http://api.yunohost.org/#!/user/user_create_post_2
|
|
|
|
|
c.redirect('#/users');
|
|
|
|
|
}, 'POST', c.params.toHash());
|
|
|
|
|
}
|
2013-09-23 13:31:57 +02:00
|
|
|
|
} else {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('passwords_dont_match'));
|
2013-09-23 13:31:57 +02:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
//c.redirect('#/users/create');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
sam.get('#/users/:user', function (c) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_info_get_0
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('user/user_info', data);
|
2013-07-02 12:35:31 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
2013-09-23 00:40:14 +02:00
|
|
|
|
|
|
|
|
|
sam.get('#/users/:user/edit', function (c) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_info_get_0
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('user/user_edit', data);
|
2013-09-23 00:40:14 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
2013-09-23 12:31:35 +02:00
|
|
|
|
|
|
|
|
|
sam.put('#/users/:user', function (c) {
|
|
|
|
|
params = {}
|
|
|
|
|
$.each(c.params.toHash(), function(key, value) {
|
2014-05-07 17:25:57 +02:00
|
|
|
|
if (value !== '' && key !== 'user') { params[key] = value; }
|
2013-09-23 12:31:35 +02:00
|
|
|
|
});
|
2014-05-07 17:25:57 +02:00
|
|
|
|
|
2013-09-23 12:31:35 +02:00
|
|
|
|
if ($.isEmptyObject(params)) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_modify_something'));
|
2013-09-23 12:31:35 +02:00
|
|
|
|
store.clear('slide');
|
2014-05-07 17:25:57 +02:00
|
|
|
|
// c.redirect('#/users/'+ c.params['user'] + '/edit');
|
2013-09-23 12:31:35 +02:00
|
|
|
|
} else {
|
2014-05-07 17:25:57 +02:00
|
|
|
|
if (params['password']) {
|
|
|
|
|
if (params['password'] == params['confirmation']) {
|
|
|
|
|
if (params['password'].length < 4) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('password_too_short'));
|
2014-05-07 17:25:57 +02:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
params['change_password'] = params['password'];
|
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_update_put_1
|
|
|
|
|
c.redirect('#/users/'+ c.params['user']);
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('passwords_dont_match'));
|
2014-05-07 17:25:57 +02:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_update_put_1
|
|
|
|
|
c.redirect('#/users/'+ c.params['user']);
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
}
|
2013-09-23 12:31:35 +02:00
|
|
|
|
}
|
|
|
|
|
});
|
2013-09-23 13:31:57 +02:00
|
|
|
|
|
2013-09-23 12:43:11 +02:00
|
|
|
|
sam.get('#/users/:user/delete', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_delete', [c.params['user']]))) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_delete_delete_4
|
2013-09-23 12:43:11 +02:00
|
|
|
|
c.redirect('#/users');
|
|
|
|
|
}, 'DELETE');
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/users/'+ c.params['user']);
|
|
|
|
|
}
|
|
|
|
|
});
|
2013-09-24 16:54:33 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Domains
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
sam.get('#/domains', function (c) {
|
|
|
|
|
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_list_get_2
|
2014-03-03 20:20:48 +01:00
|
|
|
|
c.api('/domain/main', function(data2) {
|
|
|
|
|
domains = [];
|
|
|
|
|
$.each(data.Domains, function(k, domain) {
|
|
|
|
|
domains.push({
|
|
|
|
|
url: domain,
|
|
|
|
|
main: (domain == data2.current_main_domain) ? true : false
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Sort domains with main domain first
|
|
|
|
|
domains.sort(function(a, b){ return -2*(a.main) + 1; })
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('domain/domain_list', {domains: domains});
|
2014-03-03 20:20:48 +01:00
|
|
|
|
}, 'PUT')
|
2013-09-24 16:54:33 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.get('#/domains/add', function (c) {
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('domain/domain_add', {'DDomains': ['.nohost.me', '.noho.st']});
|
2013-09-24 16:54:33 +02:00
|
|
|
|
});
|
|
|
|
|
|
2014-03-03 19:59:42 +01:00
|
|
|
|
sam.post('#/domains/add', function (c) {
|
2013-09-24 16:54:33 +02:00
|
|
|
|
if (c.params['domain'] == '') {
|
|
|
|
|
if (c.params['ddomain'] == '') {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_select_domain'));
|
2013-09-24 16:54:33 +02:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains/add');
|
|
|
|
|
}
|
|
|
|
|
params = { 'domains': c.params['ddomain'] + c.params['ddomain-ext'] }
|
|
|
|
|
} else {
|
|
|
|
|
params = { 'domains': c.params['domain'] }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_add_post_1
|
|
|
|
|
c.redirect('#/domains');
|
|
|
|
|
}, 'POST', params);
|
|
|
|
|
});
|
2013-09-24 22:54:48 +02:00
|
|
|
|
|
2014-03-02 20:07:02 +01:00
|
|
|
|
sam.get('#/domains/:domain/delete', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_delete', [c.params['domain']]))) {
|
2014-03-02 20:07:02 +01:00
|
|
|
|
c.api('/domains/'+ c.params['domain'], function(data) { // http://api.yunohost.org/#!/domain/domain_remove_delete_3
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains');
|
|
|
|
|
}, 'DELETE');
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-03-03 20:20:48 +01:00
|
|
|
|
// Set default domain
|
|
|
|
|
sam.post('#/domains', function (c) {
|
|
|
|
|
if (c.params['domain'] == '') {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_select_domain'));
|
2014-03-03 20:20:48 +01:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains');
|
2014-05-13 16:37:05 +02:00
|
|
|
|
} else if (confirm(y18n.t('confirm_change_maindomain'))) {
|
2014-03-03 20:20:48 +01:00
|
|
|
|
|
|
|
|
|
params = {'new_domain': c.params['domain']}
|
|
|
|
|
c.api('/domain/main', function(data) { // http://api.yunohost.org/#!/tools/tools_maindomain_put_1
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains');
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
|
|
|
|
|
// Wait 15s and refresh the page
|
|
|
|
|
refreshDomain = window.setTimeout(function(){
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains')
|
|
|
|
|
}, 15000);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/domains');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-03-02 20:07:02 +01:00
|
|
|
|
|
2013-09-24 22:54:48 +02:00
|
|
|
|
/**
|
|
|
|
|
* Apps
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
sam.get('#/apps', function (c) {
|
2013-11-22 12:16:52 +01:00
|
|
|
|
c.api('/apps', function(data) { // http://api.yunohost.org/#!/app/app_list_get_8
|
2013-09-24 22:54:48 +02:00
|
|
|
|
// Keep only installed apps
|
|
|
|
|
data2 = { 'Apps': [], 'Installed': true }
|
|
|
|
|
$.each(data['Apps'], function(k, v) {
|
2013-11-22 12:16:52 +01:00
|
|
|
|
if (v['Installed']) data2['Apps'].push(v);
|
2013-09-24 22:54:48 +02:00
|
|
|
|
});
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('app/app_list', data2);
|
2013-09-24 22:54:48 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.get('#/apps/install', function (c) {
|
2013-11-22 12:16:52 +01:00
|
|
|
|
c.api('/apps', function(data) { // http://api.yunohost.org/#!/app/app_list_get_8
|
|
|
|
|
c.api('/apps?raw=true', function(dataraw) { // http://api.yunohost.org/#!/app/app_list_get_8
|
2013-09-24 22:54:48 +02:00
|
|
|
|
// Keep only uninstalled apps
|
|
|
|
|
data2 = { 'Apps': [] }
|
|
|
|
|
$.each(data['Apps'], function(k, v) {
|
2013-11-22 12:16:52 +01:00
|
|
|
|
if (dataraw[v['ID']].manifest.multi_instance) v['Installed'] = false;
|
2013-11-22 15:46:50 +01:00
|
|
|
|
if (!v['Installed'] && !v['ID'].match(/__[0-9]{1,5}$/)) data2['Apps'].push(v);
|
2013-09-24 22:54:48 +02:00
|
|
|
|
});
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('app/app_list', data2);
|
2013-09-24 22:54:48 +02:00
|
|
|
|
});
|
2013-11-22 12:16:52 +01:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2013-11-26 18:22:12 +01:00
|
|
|
|
sam.get('#/apps/refresh', function (c) {
|
|
|
|
|
c.api('/app/lists', function(data) { // http://api.yunohost.org/#!/app/app_fetchlist_put_5
|
|
|
|
|
c.redirect(store.get('path'));
|
|
|
|
|
}, 'PUT');
|
|
|
|
|
});
|
|
|
|
|
|
2013-11-22 12:16:52 +01:00
|
|
|
|
sam.get('#/apps/:app', function (c) {
|
2013-11-22 15:31:47 +01:00
|
|
|
|
c.api('/app/'+c.params['app']+'?raw=true', function(data) { // http://api.yunohost.org/#!/app/app_info_get_9
|
2014-05-09 11:53:57 +02:00
|
|
|
|
// Presentation
|
|
|
|
|
data.settings.allowed_users = data.settings.allowed_users.replace(',', ', ');
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('app/app_info', data);
|
2013-11-22 12:16:52 +01:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.get('#/apps/install/:app', function (c) {
|
|
|
|
|
c.api('/apps?raw=true', function(data) { // http://api.yunohost.org/#!/app/app_list_get_8
|
2014-02-21 13:48:03 +01:00
|
|
|
|
appData = data[c.params['app']];
|
|
|
|
|
|
|
|
|
|
$.each(appData.manifest.arguments.install, function(k, v) {
|
|
|
|
|
appData.manifest.arguments.install[k].allowedValues = [];
|
|
|
|
|
|
2014-02-21 15:49:13 +01:00
|
|
|
|
// Radio button
|
|
|
|
|
if (typeof appData.manifest.arguments.install[k].choices !== 'undefined') {
|
|
|
|
|
// Update choices values with key and checked data
|
|
|
|
|
$.each(appData.manifest.arguments.install[k].choices, function(ck, cv){
|
|
|
|
|
appData.manifest.arguments.install[k].choices[ck] = {
|
|
|
|
|
value: cv,
|
|
|
|
|
key: ck,
|
|
|
|
|
checked: (cv == appData.manifest.arguments.install[k].default) ? true : false,
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-21 13:48:03 +01:00
|
|
|
|
// Special case for domain input.
|
|
|
|
|
// Display a list of available domains
|
|
|
|
|
if (v.name == 'domain') {
|
|
|
|
|
$.each(c.params.domains, function(key, domain){
|
|
|
|
|
appData.manifest.arguments.install[k].allowedValues.push({
|
|
|
|
|
value: domain,
|
|
|
|
|
label: domain,
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
appData.manifest.arguments.install[k].help = "<a href='#/domains'>Manage domains</a>";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Special case for admin input.
|
|
|
|
|
// Display a list of available users
|
|
|
|
|
if (v.name == 'admin') {
|
|
|
|
|
$.each(c.params.users, function(key, user){
|
|
|
|
|
appData.manifest.arguments.install[k].allowedValues.push({
|
|
|
|
|
value: user.Username,
|
|
|
|
|
label: user.Fullname+' ('+user.Mail+')'
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
appData.manifest.arguments.install[k].help = "<a href='#/users'>Manage users</a>";
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('app/app_install', appData);
|
2013-11-22 12:16:52 +01:00
|
|
|
|
});
|
2013-09-24 22:54:48 +02:00
|
|
|
|
});
|
|
|
|
|
|
2013-11-22 15:31:47 +01:00
|
|
|
|
sam.post('#/apps', function(c) {
|
|
|
|
|
params = { 'label': c.params['label'], 'app': c.params['app'] }
|
|
|
|
|
delete c.params['label'];
|
|
|
|
|
delete c.params['app'];
|
|
|
|
|
params['args'] = c.serialize(c.params.toHash());
|
|
|
|
|
c.api('/app', function() { // http://api.yunohost.org/#!/app/app_install_post_2
|
|
|
|
|
c.redirect('#/apps');
|
|
|
|
|
}, 'POST', params);
|
|
|
|
|
});
|
|
|
|
|
|
2013-11-22 16:01:02 +01:00
|
|
|
|
sam.get('#/apps/:app/uninstall', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_uninstall', [c.params['app']]))) {
|
2014-03-03 13:13:24 +01:00
|
|
|
|
c.api('/app?app='+ c.params['app'], function() { // http://api.yunohost.org/#!/app/app_remove_delete_4
|
2013-11-22 16:01:02 +01:00
|
|
|
|
c.redirect('#/apps');
|
2013-11-22 17:56:51 +01:00
|
|
|
|
}, 'DELETE');
|
2013-11-22 16:01:02 +01:00
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']);
|
|
|
|
|
}
|
|
|
|
|
});
|
2014-01-29 18:32:22 +01:00
|
|
|
|
|
2014-03-02 19:30:46 +01:00
|
|
|
|
// Manage app access
|
|
|
|
|
sam.get('#/apps/:app/access', function (c) {
|
|
|
|
|
c.api('/app/'+c.params['app']+'?raw=true', function(data) { // http://api.yunohost.org/#!/app/app_info_get_9
|
|
|
|
|
c.api('/users', function(dataUsers) {
|
|
|
|
|
|
|
|
|
|
// allowed_users as array
|
|
|
|
|
if (typeof data.settings.allowed_users !== 'undefined') {
|
|
|
|
|
if (data.settings.allowed_users.length === 0) {
|
|
|
|
|
// Force empty array, means no user has access
|
|
|
|
|
data.settings.allowed_users = [];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
data.settings.allowed_users = data.settings.allowed_users.split(',');
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
data.settings.allowed_users = []; // Force array
|
|
|
|
|
// if 'allowed_users' is undefined, everyone has access
|
|
|
|
|
// that means that undefined is different from empty array
|
|
|
|
|
data.settings.allow_everyone = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Available users
|
|
|
|
|
data.users = [];
|
|
|
|
|
$.each(dataUsers.Users, function(key, user){
|
|
|
|
|
// Do not list allowed_users in select list
|
|
|
|
|
if ( data.settings.allowed_users.indexOf(user.Username) === -1 ) {
|
|
|
|
|
data.users.push({
|
|
|
|
|
value: user.Username,
|
|
|
|
|
label: user.Fullname+' ('+user.Mail+')'
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// Complete allowed_users data
|
|
|
|
|
data.settings.allowed_users[data.settings.allowed_users.indexOf(user.Username)] = {
|
|
|
|
|
username: user.Username,
|
|
|
|
|
fullname: user.Fullname,
|
|
|
|
|
mail: user.Mail,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('app/app_access', data);
|
2014-03-02 19:30:46 +01:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Remove all access
|
|
|
|
|
sam.get('#/apps/:app/access/remove', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_access_remove_all', [c.params['app']]))) {
|
2014-03-02 19:30:46 +01:00
|
|
|
|
params = {'apps': c.params['app'], 'users':[]}
|
|
|
|
|
c.api('/app/access?'+c.serialize(params), function(data) { // http://api.yunohost.org/#!/app/app_removeaccess_delete_12
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}, 'DELETE', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Remove access to a specific user
|
|
|
|
|
sam.get('#/apps/:app/access/remove/:user', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_access_remove_user', [c.params['app'], c.params['user']]))) {
|
2014-03-02 19:30:46 +01:00
|
|
|
|
params = {'apps': c.params['app'], 'users': c.params['user']}
|
|
|
|
|
c.api('/app/access?'+c.serialize(params), function(data) { // http://api.yunohost.org/#!/app/app_removeaccess_delete_12
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}, 'DELETE', params); // passing 'params' here is useless because jQuery doesn't handle ajax datas for DELETE requests. Passing parameters through uri.
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Grant all access
|
|
|
|
|
sam.get('#/apps/:app/access/add', function (c) {
|
2014-05-13 22:59:33 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_access_add', [c.params['app']]))) {
|
2014-03-02 19:30:46 +01:00
|
|
|
|
params = {'apps': c.params['app'], 'users': null}
|
|
|
|
|
c.api('/app/access', function() { // http://api.yunohost.org/#!/app/app_addaccess_put_13
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app'] +'/access');
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Grant access for a specific user
|
|
|
|
|
sam.post('#/apps/:app/access/add', function (c) {
|
|
|
|
|
params = {'users': c.params['user'], 'apps': c.params['app']}
|
|
|
|
|
c.api('/app/access', function() { // http://api.yunohost.org/#!/app/app_addaccess_put_13
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app'] +'/access');
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Clear access (reset)
|
|
|
|
|
sam.get('#/apps/:app/access/clear', function (c) {
|
2014-05-13 22:59:33 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_access_clear', [c.params['app']]))) {
|
2014-03-02 19:30:46 +01:00
|
|
|
|
params = {'apps': c.params['app']}
|
|
|
|
|
c.api('/app/access', function() { //
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app'] +'/access');
|
|
|
|
|
}, 'POST', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']+ '/access');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-05-09 11:53:57 +02:00
|
|
|
|
// Make app default
|
|
|
|
|
sam.get('#/apps/:app/default', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_app_default'))) {
|
2014-05-09 11:53:57 +02:00
|
|
|
|
params = {'app': c.params['app']}
|
|
|
|
|
c.api('/app/default', function() { //
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']);
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/apps/'+ c.params['app']);
|
|
|
|
|
}
|
|
|
|
|
});
|
2014-03-02 19:30:46 +01:00
|
|
|
|
|
2014-01-29 18:32:22 +01:00
|
|
|
|
/**
|
|
|
|
|
* Services
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// All services status
|
|
|
|
|
sam.get('#/services', function (c) {
|
|
|
|
|
c.api('/service/status', function(data) { // ?
|
|
|
|
|
data2 = { 'services': [] }
|
|
|
|
|
$.each(data, function(k, v) {
|
|
|
|
|
v.name = k;
|
|
|
|
|
v.is_loaded = (v.loaded=='enabled') ? true : false;
|
|
|
|
|
v.is_running = (v.status=='running') ? true : false;
|
|
|
|
|
data2.services.push(v);
|
|
|
|
|
});
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('service/service_list', data2);
|
2014-01-29 18:32:22 +01:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Status & actions for a service
|
|
|
|
|
sam.get('#/services/:service', function (c) {
|
|
|
|
|
params = { 'names': c.params['service'] }
|
|
|
|
|
c.api('/service/status', function(data) { // ?
|
|
|
|
|
data2 = { 'service': data }
|
|
|
|
|
data2.service.name = c.params['service'];
|
|
|
|
|
data2.service.is_loaded = (data.loaded=='enabled') ? true : false;
|
|
|
|
|
data2.service.is_running = (data.status=='running') ? true : false;
|
|
|
|
|
|
2014-05-07 19:13:43 +02:00
|
|
|
|
store.clear('slide');
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('service/service_info', data2);
|
2014-01-29 18:32:22 +01:00
|
|
|
|
}, 'GET', params);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Service log
|
|
|
|
|
sam.get('#/services/:service/log', function (c) {
|
|
|
|
|
params = { 'name': c.params['service'], 'number': 50 }
|
|
|
|
|
c.api('/service/log', function(data) { // ?
|
|
|
|
|
data2 = { 'logs': [], 'name': c.params['service'] }
|
|
|
|
|
$.each(data, function(k, v) {
|
2014-02-11 11:46:47 +01:00
|
|
|
|
data2.logs.push({filename: k, filecontent: v.join('\n')});
|
2014-01-29 18:32:22 +01:00
|
|
|
|
});
|
|
|
|
|
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('service/service_log', data2);
|
2014-01-29 18:32:22 +01:00
|
|
|
|
}, 'GET', params);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Enable/Disable & Start/Stop service
|
|
|
|
|
sam.get('#/services/:service/:action', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_service_action', [y18n.t(c.params['action']), c.params['service']]))) {
|
2014-01-29 18:32:22 +01:00
|
|
|
|
params = { 'names': c.params['service'] }
|
|
|
|
|
c.api('/service/'+ c.params['action'], function(data) {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/services/'+ c.params['service']);
|
|
|
|
|
}, 'GET', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/services/'+ c.params['service']);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
2014-02-14 19:55:22 +01:00
|
|
|
|
/**
|
|
|
|
|
* Monitor
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
sam.get('#/monitor', function (c) {
|
|
|
|
|
monitorData = {}
|
|
|
|
|
|
|
|
|
|
// Why this method ?
|
2014-02-14 20:36:01 +01:00
|
|
|
|
c.api('/service/status', function(data) { // ?
|
|
|
|
|
monitorData.status = true;
|
|
|
|
|
|
|
|
|
|
if (data.status == 'running') {
|
|
|
|
|
c.api('/monitor/system', function(data) {
|
|
|
|
|
monitorData.system = data;
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
2014-02-14 20:36:01 +01:00
|
|
|
|
c.api('/monitor/disk', function(data) {
|
|
|
|
|
monitorData.disk = data;
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
2014-02-14 20:36:01 +01:00
|
|
|
|
c.api('/monitor/network', function(data) {
|
|
|
|
|
monitorData.network = data;
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
2014-02-14 20:36:01 +01:00
|
|
|
|
// Remove useless interface
|
|
|
|
|
delete monitorData.network.usage.lo;
|
|
|
|
|
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('monitor/monitor', monitorData);
|
2014-02-14 20:36:01 +01:00
|
|
|
|
});
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
|
|
|
|
});
|
2014-02-14 20:36:01 +01:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
monitorData.status = false;
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('monitor/monitor', monitorData);
|
2014-02-14 20:36:01 +01:00
|
|
|
|
}
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-02-14 20:36:01 +01:00
|
|
|
|
}, 'GET', {names: 'glances'});
|
2014-02-14 19:55:22 +01:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
2014-02-20 12:36:16 +01:00
|
|
|
|
/**
|
|
|
|
|
* Tools
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
sam.get('#/tools', function (c) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.view('tools/tools_list');
|
2014-02-20 12:36:16 +01:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Update administration password
|
|
|
|
|
sam.get('#/tools/adminpw', function (c) {
|
2014-05-07 15:57:36 +02:00
|
|
|
|
c.view('tools/tools_adminpw');
|
2014-02-20 12:36:16 +01:00
|
|
|
|
});
|
|
|
|
|
sam.put('#/tools/adminpw', function (c) {
|
|
|
|
|
params = {}
|
|
|
|
|
$.each(c.params.toHash(), function(key, value) {
|
|
|
|
|
if (value !== '') { params[key] = value; }
|
|
|
|
|
});
|
|
|
|
|
if ($.isEmptyObject(params)) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_modify_something'));
|
2014-02-20 12:36:16 +01:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/tools/adminpw');
|
|
|
|
|
} else if (params['new_password'] !== params['confirm_new_password']) {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('passwords_dont_match'));
|
2014-02-20 12:36:16 +01:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/tools/adminpw');
|
|
|
|
|
} else {
|
|
|
|
|
// Remove useless variable
|
|
|
|
|
delete params['confirm_new_password'];
|
|
|
|
|
// Update password and redirect to the home
|
|
|
|
|
c.api('/adminpw', function(data) { // http://api.yunohost.org/#!/tools/tools_adminpw_put_3
|
2014-02-20 12:59:03 +01:00
|
|
|
|
store.set('password', btoa(params['new_password']));
|
2014-02-20 12:36:16 +01:00
|
|
|
|
c.redirect('#/');
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-05-07 18:46:58 +02:00
|
|
|
|
// System update & upgrade
|
|
|
|
|
sam.get('#/tools/update', function (c) {
|
|
|
|
|
c.api('/update', function(data) {
|
2014-05-09 23:54:45 +02:00
|
|
|
|
packagesLength = data.packages.length;
|
|
|
|
|
for(var i = 0; i < packagesLength; i++) {
|
|
|
|
|
data.packages[i].changelog = data.packages[i].changelog.replace(/\n/g, '<br />');
|
|
|
|
|
}
|
2014-05-07 18:46:58 +02:00
|
|
|
|
c.view('tools/tools_update', data);
|
|
|
|
|
}, 'PUT');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
sam.get('#/tools/upgrade/:type', function (c) {
|
|
|
|
|
if (c.params['type'] !== 'apps' && c.params['type'] !== 'packages') {
|
2014-05-13 16:37:05 +02:00
|
|
|
|
c.flash('fail', y18n.t('error_server'));
|
2014-05-07 18:46:58 +02:00
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/tools/update');
|
|
|
|
|
}
|
2014-05-13 16:37:05 +02:00
|
|
|
|
if (confirm(y18n.t('confirm_update_type', [y18n.t('system_'+c.params['type']).toLowerCase()]))) {
|
2014-05-07 18:46:58 +02:00
|
|
|
|
params = {
|
|
|
|
|
'ignore_packages': (c.params['type'] == 'packages') ? false : true,
|
|
|
|
|
'ignore_apps': (c.params['type'] == 'apps') ? false : true,
|
|
|
|
|
}
|
|
|
|
|
c.api('/upgrade', function(data) {
|
|
|
|
|
// 'log' is a reserved name, maybe in handlebars
|
|
|
|
|
data.logs = data.log;
|
|
|
|
|
c.view('tools/tools_upgrade', data);
|
|
|
|
|
}, 'PUT', params);
|
|
|
|
|
} else {
|
|
|
|
|
store.clear('slide');
|
|
|
|
|
c.redirect('#/tools/update');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-02-20 12:36:16 +01:00
|
|
|
|
|
2014-05-07 16:35:27 +02:00
|
|
|
|
/**
|
|
|
|
|
* Backup
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
sam.get('#/backup', function (c) {
|
|
|
|
|
c.view('backup/backup');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
2014-02-20 12:36:16 +01:00
|
|
|
|
|
|
|
|
|
|
2014-02-14 19:55:22 +01:00
|
|
|
|
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
|
/**
|
|
|
|
|
* Run the app
|
|
|
|
|
*
|
|
|
|
|
*/
|
2014-05-12 18:28:42 +02:00
|
|
|
|
|
2013-07-01 15:56:32 +02:00
|
|
|
|
$(document).ready(function () {
|
2014-05-12 18:28:42 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Translations
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// Default language
|
|
|
|
|
$.getJSON('locales/en.json', function(data){
|
|
|
|
|
y18n.translations['en'] = data;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// User language
|
|
|
|
|
if (window.navigator && window.navigator.language) {
|
|
|
|
|
y18n.locale = window.navigator.language;
|
|
|
|
|
$.getJSON('locales/'+ y18n.locale +'.json', function(data){
|
|
|
|
|
y18n.translations[y18n.locale] = data;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Application
|
|
|
|
|
*/
|
2013-07-01 15:56:32 +02:00
|
|
|
|
app.run('#/');
|
2013-09-25 21:49:12 +02:00
|
|
|
|
|
|
|
|
|
// Fixes for sliding effect
|
2013-09-25 11:34:40 +02:00
|
|
|
|
$('#slider-container').width(2*$('#slider').width() +'px');
|
2013-09-24 19:02:12 +02:00
|
|
|
|
$(window).resize(function() {
|
2013-09-25 12:01:01 +02:00
|
|
|
|
$('#slideBack').css('display', 'none');
|
|
|
|
|
$('#slideTo').css('display', 'none');
|
|
|
|
|
$('#slider-container').width(2*$('#slider').width() +'px').removeClass('move').css('margin-left', '0px');
|
2013-09-24 19:02:12 +02:00
|
|
|
|
});
|
2013-07-01 15:56:32 +02:00
|
|
|
|
});
|