Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions html/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<!--[if gt IE 8]><!--> <html class="no-js" ng-app="mineos"> <!--<![endif]-->
<head>
<!-- START META SECTION -->
<base href="/" >
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title translate="WEBSITE_TITLE"></title>
Expand Down Expand Up @@ -102,7 +103,7 @@
<a ng-click="host_command('refresh_server_list')" class="text pointer"><span class="icon icone-globe"></span> {{ 'REFRESH_SERVER_LIST' | translate }}</a><br>
<a ng-click="host_command('refresh_profile_list', {redownload: true})" class="text pointer"><span class="icon icone-globe"></span> {{ 'REFRESH_PROFILE_LIST' | translate }}</a><br>
<a ng-click="modals.open_locales()" class="text pointer"><span class="icon icone-globe"></span> {{ 'CHANGE_LOCALE' | translate }}</a><br>
<a href="/logout" class="text"><span class="icon icone-off"></span> {{ 'LOGOFF' | translate }}</a>
<a href="logout" class="text"><span class="icon icone-off"></span> {{ 'LOGOFF' | translate }}</a>
</footer>
</div>
<!--/ END Dropdown Menu -->
Expand Down Expand Up @@ -1803,14 +1804,14 @@ <h4 translate="CHANGE_NICENESS"></h4>
<!--/ Javascript(Plugins) -->

<!-- Javascript (Application) -->
<script src="/socket.io/socket.io.js"></script>
<script src="/moment/min/moment.min.js"></script>
<script src="/angular/angular.min.js"></script>
<script src="/angular-translate/angular-translate.min.js"></script>
<script src="/angular-translate/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
<script src="/angular-moment/angular-moment.min.js"></script>
<script src="/angular-moment-duration-format/moment-duration-format.js"></script>
<script src="/angular-sanitize/angular-sanitize.min.js"></script>
<script src="socket.io/socket.io.js"></script>
<script src="moment/min/moment.min.js"></script>
<script src="angular/angular.min.js"></script>
<script src="angular-translate/angular-translate.min.js"></script>
<script src="angular-translate/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
<script src="angular-moment/angular-moment.min.js"></script>
<script src="angular-moment-duration-format/moment-duration-format.js"></script>
<script src="angular-sanitize/angular-sanitize.min.js"></script>
<script src="js/scriptin.js"></script>
<script src="js/plugins.js"></script>
<script src="js/application.js"></script>
Expand Down
10 changes: 6 additions & 4 deletions html/js/scriptin.js
Original file line number Diff line number Diff line change
Expand Up @@ -1049,6 +1049,8 @@ app.factory('ServerService', ['socket', '$filter', function(socket, $filter) {
app.factory('socket', function ($rootScope) {
//http://briantford.com/blog/angular-socket-io
var sockets = {};

const urlBase = document.querySelector("head base").getAttribute("href");

var port = window.location.port || null;
if (port === null) {
Expand All @@ -1067,9 +1069,9 @@ app.factory('socket', function ($rootScope) {
on: function (server_name, eventName, callback) {
if (!(server_name in sockets)) {
if (server_name == '/')
sockets[server_name] = io(connect_string, {secure: true});
sockets[server_name] = io(connect_string, {secure: true, path: urlBase + "socket.io"});
else
sockets[server_name] = io(connect_string + server_name, {secure: true});
sockets[server_name] = io(connect_string + server_name, {secure: true, path: urlBase + "socket.io"});
}

sockets[server_name].on(eventName, function () {
Expand All @@ -1082,9 +1084,9 @@ app.factory('socket', function ($rootScope) {
emit: function (server_name, eventName, data, callback) {
if (!(server_name in sockets)) {
if (server_name == '/')
sockets[server_name] = io(connect_string, {secure: true});
sockets[server_name] = io(connect_string, {secure: true, path: urlBase + "socket.io"});
else
sockets[server_name] = io(connect_string + server_name, {secure: true});
sockets[server_name] = io(connect_string + server_name, {secure: true, path: urlBase + "socket.io"});
}

sockets[server_name].emit(eventName, data, function () {
Expand Down
17 changes: 9 additions & 8 deletions html/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
<!-- START META SECTION -->
<base href="/" >
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>MineOS Web User Interface</title>
Expand Down Expand Up @@ -56,7 +57,7 @@
<div class="row-fluid">
<!-- START Login Widget Form -->
<p>&nbsp;</p>
<form class="widget stacked teal widget-login" name="login" method="post" action="/auth">
<form class="widget stacked teal widget-login" name="login" method="post" action="auth">
<section class="body">
<div class="body-inner">
<!-- START Logo -->
Expand Down Expand Up @@ -151,13 +152,13 @@ <h5 align="center">Welcome to MineOS!</h5>
<!--/ Javascript(Plugins) -->

<!-- Javascript (Application) -->
<script src="/socket.io/socket.io.js"></script>
<script src="/moment/min/moment.min.js"></script>
<script src="/angular/angular.min.js"></script>
<script src="/angular-translate/angular-translate.min.js"></script>
<script src="/angular-translate/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
<script src="/angular-moment/angular-moment.min.js"></script>
<script src="/angular-moment-duration-format/moment-duration-format.js"></script>
<script src="socket.io/socket.io.js"></script>
<script src="moment/min/moment.min.js"></script>
<script src="angular/angular.min.js"></script>
<script src="angular-translate/angular-translate.min.js"></script>
<script src="angular-translate/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
<script src="angular-moment/angular-moment.min.js"></script>
<script src="angular-moment-duration-format/moment-duration-format.js"></script>
<script src="js/scriptin.js"></script>
<script src="js/plugins.js"></script>
<script src="js/application.js"></script>
Expand Down
1 change: 1 addition & 0 deletions mineos.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use_https = true
socket_host = '0.0.0.0'
socket_port = 8443
base_directory = '/var/games/minecraft'
overwrite_web_root = ''

ssl_private_key = '/etc/ssl/certs/mineos.key'
ssl_certificate = '/etc/ssl/certs/mineos.crt'
Expand Down
134 changes: 88 additions & 46 deletions webui.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var sessionStore = new expressSession.MemoryStore();
var app = express();
var http = require('http').Server(app);

var response_options = {root: __dirname};
// Config

var opt = getopt.create([
['c' , 'config_file=CONFIG_PATH' , 'defaults to $PWD/custom.conf, then /etc/mineos.conf'],
Expand All @@ -31,6 +31,39 @@ var opt = getopt.create([

var config_file = (opt.options || {}).config_file;

var config_locs = ['custom.conf',
'/etc/mineos.conf',
'/usr/local/etc/mineos.conf']

var mineos_config = {};
if (typeof config_file !== 'undefined') {
console.info('using command-line provided configuration identified as', config_file);
mineos_config = read_ini(config_file);
} else {
for (var loc in config_locs) {
try {
fs.statSync(config_locs[loc]);
console.info('first mineos configuration identified as', config_locs[loc]);
mineos_config = read_ini(config_locs[loc])
break;
} catch (e) { }
}
}

var overwrite_web_root = '';

if ('overwrite_web_root' in mineos_config && mineos_config['overwrite_web_root'] !== '') {
overwrite_web_root = mineos_config['overwrite_web_root'];

if (!overwrite_web_root.startsWith('/'))
overwrite_web_root = '/' + overwrite_web_root;

if (overwrite_web_root.endsWith('/'))
overwrite_web_root = overwrite_web_root.substring(0, overwrite_web_root.length - 1);

console.info('using overwrite_web_root: ', overwrite_web_root);
}

// Authorization
var localAuth = function (username, password) {
var Q = require('q');
Expand Down Expand Up @@ -124,7 +157,7 @@ app.use(expressSession({
app.use(passport.initialize());
app.use(passport.session());

var io = require('socket.io')(http)
var io = require('socket.io')(http, {path: overwrite_web_root + '/socket.io'})
io.use(passportSocketIO.authorize({
cookieParser: cookieParser, // the same middleware you registrer in express
key: 'express.sid', // the name of the cookie where express/connect stores its session_id
Expand All @@ -147,25 +180,6 @@ mineos.dependencies(function(err, binaries) {
console.error('MineOS is missing dependencies:', err);
console.log(binaries);
process.exit(1);
}

var config_locs = ['custom.conf',
'/etc/mineos.conf',
'/usr/local/etc/mineos.conf']

var mineos_config = {};
if (typeof config_file !== 'undefined') {
console.info('using command-line provided configuration identified as', config_file);
mineos_config = read_ini(config_file);
} else {
for (var loc in config_locs) {
try {
fs.statSync(config_locs[loc]);
console.info('first mineos configuration identified as', config_locs[loc]);
mineos_config = read_ini(config_locs[loc])
break;
} catch (e) {}
}
}

var base_directory = '/var/games/minecraft';
Expand All @@ -190,26 +204,51 @@ mineos.dependencies(function(err, binaries) {
}

var be = new server.backend(base_directory, io, mineos_config);
var indexRouter = express.Router();

// Middleware to apply overwrite_web_root to all redirect method
indexRouter.use((req, res, next) => {
const redirector = res.redirect;
res.redirect = function (url) {
url = overwrite_web_root + url
redirector.call(this, url)
};
next();
});

app.get('/', function(req, res){
res.redirect('/admin/index.html');
});
/**
* Patch the given html file to include subdirectory
* @param {String} path
* @returns {String}
*/
const getFileWithBaseUrl = (path) => {
let indexHTML = fs.readFileSync(__dirname + path).toString();
return indexHTML.replace(/\<base href.*?\>/, `<base href="${overwrite_web_root}/">`);
}

app.get('/admin/index.html', ensureAuthenticated, function(req, res){
res.sendFile('/html/index.html', response_options);
});
indexRouter.get('/', function(req, res){
res.redirect('/admin/index.html');
});

app.get('/login', function(req, res){
res.sendFile('/html/login.html');
});
indexRouter.get('/admin/index.html', ensureAuthenticated, function(req, res){
res.send(getFileWithBaseUrl('/html/index.html'));
});

indexRouter.get('/admin/login.html', function(req, res){
res.send(getFileWithBaseUrl('/html/login.html'));
});

indexRouter.get('/login', function(req, res){
res.redirect('/admin/login.html');
});

app.post('/auth', passport.authenticate('local-signin', {
successRedirect: '/admin/index.html',
failureRedirect: '/admin/login.html'
})
);
indexRouter.post('/auth', passport.authenticate('local-signin', {
successRedirect: '/admin/index.html',
failureRedirect: '/admin/login.html'
})
);

app.all('/api/:server_name/:command', ensureAuthenticated, function(req, res) {
indexRouter.all('/api/:server_name/:command', ensureAuthenticated, function(req, res) {
var target_server = req.params.server_name;
var user = req.user.username;
var instance = be.servers[target_server];
Expand All @@ -225,7 +264,7 @@ mineos.dependencies(function(err, binaries) {
res.end();
});

app.post('/admin/command', ensureAuthenticated, function(req, res) {
indexRouter.post('/admin/command', ensureAuthenticated, function(req, res) {
var target_server = req.body.server_name;
var instance = be.servers[target_server];
var user = req.user.username;
Expand All @@ -238,19 +277,22 @@ mineos.dependencies(function(err, binaries) {
res.end();
});

app.get('/logout', function(req, res){
indexRouter.get('/logout', function(req, res){
req.logout();
res.redirect('/admin/login.html');
});

app.use('/socket.io', express.static(__dirname + '/node_modules/socket.io'));
app.use('/angular', express.static(__dirname + '/node_modules/angular'));
app.use('/angular-translate', express.static(__dirname + '/node_modules/angular-translate/dist'));
app.use('/moment', express.static(__dirname + '/node_modules/moment'));
app.use('/angular-moment', express.static(__dirname + '/node_modules/angular-moment'));
app.use('/angular-moment-duration-format', express.static(__dirname + '/node_modules/moment-duration-format/lib'));
app.use('/angular-sanitize', express.static(__dirname + '/node_modules/angular-sanitize'));
app.use('/admin', express.static(__dirname + '/html'));
indexRouter.use('/socket.io', express.static(__dirname + '/node_modules/socket.io'));
indexRouter.use('/angular', express.static(__dirname + '/node_modules/angular'));
indexRouter.use('/angular-translate', express.static(__dirname + '/node_modules/angular-translate/dist'));
indexRouter.use('/moment', express.static(__dirname + '/node_modules/moment'));
indexRouter.use('/angular-moment', express.static(__dirname + '/node_modules/angular-moment'));
indexRouter.use('/angular-moment-duration-format', express.static(__dirname + '/node_modules/moment-duration-format/lib'));
indexRouter.use('/angular-sanitize', express.static(__dirname + '/node_modules/angular-sanitize'));
indexRouter.use('/admin', express.static(__dirname + '/html'));
indexRouter.use(express.static(__dirname + '/html'));

app.use(overwrite_web_root, indexRouter);

process.on('SIGINT', function() {
console.log("Caught interrupt signal; closing webui....");
Expand Down