Prettified som more files and fixed some logging of missing files so they are more similar in fashion

This commit is contained in:
Kasper Rynning-Tønnesen
2019-07-26 08:46:03 +02:00
parent 6369c55252
commit 6ed67ffee6
18 changed files with 5629 additions and 3697 deletions

View File

@@ -1,21 +1,20 @@
var cluster = require('cluster'), var cluster = require("cluster"),
net = require('net'), net = require("net"),
path = require('path'), path = require("path"),
//publicPath = path.join(__dirname, 'public'), //publicPath = path.join(__dirname, 'public'),
http = require('http'), http = require("http"),
port = 8080, port = 8080,
//farmhash = require('farmhash'), //farmhash = require('farmhash'),
uniqid = require('uniqid'), uniqid = require("uniqid"),
num_processes = require('os').cpus().length; num_processes = require("os").cpus().length;
publicPath = path.join(__dirname, 'public'); publicPath = path.join(__dirname, "public");
pathThumbnails = __dirname; pathThumbnails = __dirname;
try { try {
var redis = require("redis"); var redis = require("redis");
var client = redis.createClient({host: "localhost", port: 6379}); var client = redis.createClient({ host: "localhost", port: 6379 });
client.on("error", function (err) { client.on("error", function(err) {
console.log("Couldn't connect to redis-server, assuming non-clustered run"); console.log("Couldn't connect to redis-server, assuming non-clustered run");
num_processes = 1; num_processes = 1;
startSingle(false, false); startSingle(false, false);
@@ -25,7 +24,7 @@ try {
startClustered(true); startClustered(true);
client.quit(); client.quit();
}); });
} catch(e) { } catch (e) {
console.log("Couldn't connect to redis-server, assuming non-clustered run"); console.log("Couldn't connect to redis-server, assuming non-clustered run");
num_processes = 1; num_processes = 1;
startSingle(false, false); startSingle(false, false);
@@ -37,12 +36,12 @@ function startClustered(redis_enabled) {
var workers = []; var workers = [];
var spawn = function(i) { var spawn = function(i) {
workers[i] = cluster.fork(); workers[i] = cluster.fork();
workers[i].on('exit', function(code, signal) { workers[i].on("exit", function(code, signal) {
if(code == 1) { if (code == 1) {
process.exit(1); process.exit(1);
return; return;
} }
console.log('respawning worker', i); console.log("respawning worker", i);
spawn(i); spawn(i);
}); });
}; };
@@ -53,21 +52,24 @@ function startClustered(redis_enabled) {
var worker_index = function(ip, len) { var worker_index = function(ip, len) {
//console.log(ip); //console.log(ip);
var s = ''; var s = "";
if(ip == undefined) ip = uniqid.time(); if (ip == undefined) ip = uniqid.time();
for (var i = 0, _len = ip.length; i < _len; i++) { for (var i = 0, _len = ip.length; i < _len; i++) {
if(!isNaN(ip[i])) { if (!isNaN(ip[i])) {
s += ip[i]; s += ip[i];
} }
} }
return Number(s)%len; return Number(s) % len;
//eturn farmhash.fingerprint32(ip) % len; //eturn farmhash.fingerprint32(ip) % len;
}; };
var server = net.createServer({ pauseOnConnect: true }, function(connection, a) { var server = net
var worker = workers[worker_index(connection.remoteAddress, num_processes)]; .createServer({ pauseOnConnect: true }, function(connection, a) {
worker.send('sticky-session:connection', connection); var worker =
}).listen(port); workers[worker_index(connection.remoteAddress, num_processes)];
worker.send("sticky-session:connection", connection);
})
.listen(port);
} else { } else {
startSingle(true, redis_enabled); startSingle(true, redis_enabled);
} }
@@ -75,10 +77,13 @@ function startClustered(redis_enabled) {
function startSingle(clustered, redis_enabled) { function startSingle(clustered, redis_enabled) {
var server; var server;
var client = require('./apps/client.js'); var client = require("./apps/client.js");
try { try {
var cert_config = require(path.join(path.join(__dirname, 'config'), 'cert_config.js')); var cert_config = require(path.join(
var fs = require('fs'); path.join(__dirname, "config"),
"cert_config.js"
));
var fs = require("fs");
var privateKey = fs.readFileSync(cert_config.privateKey).toString(); var privateKey = fs.readFileSync(cert_config.privateKey).toString();
var certificate = fs.readFileSync(cert_config.certificate).toString(); var certificate = fs.readFileSync(cert_config.certificate).toString();
var ca = fs.readFileSync(cert_config.ca).toString(); var ca = fs.readFileSync(cert_config.ca).toString();
@@ -87,14 +92,14 @@ function startSingle(clustered, redis_enabled) {
cert: certificate, cert: certificate,
ca: ca ca: ca
}; };
var https = require('https'); var https = require("https");
server = https.Server(credentials, routingFunction); server = https.Server(credentials, routingFunction);
} catch(err){ } catch (err) {
console.log("Starting without https (probably on localhost)"); console.log("Starting without https (probably on localhost)");
server = http.createServer(routingFunction); server = http.createServer(routingFunction);
} }
if(clustered) { if (clustered) {
server.listen(onListen); server.listen(onListen);
} else { } else {
server.listen(port, onListen); server.listen(port, onListen);
@@ -102,21 +107,21 @@ function startSingle(clustered, redis_enabled) {
var socketIO = client.socketIO; var socketIO = client.socketIO;
if(redis_enabled) { if (redis_enabled) {
var redis = require('socket.io-redis'); var redis = require("socket.io-redis");
try { try {
socketIO.adapter(redis({ host: 'localhost', port: 6379 })); socketIO.adapter(redis({ host: "localhost", port: 6379 }));
} catch(e) { } catch (e) {
console.log("No redis-server to connect to.."); console.log("No redis-server to connect to..");
} }
} }
socketIO.listen(server); socketIO.listen(server);
process.on('message', function(message, connection) { process.on("message", function(message, connection) {
if (message !== 'sticky-session:connection') { if (message !== "sticky-session:connection") {
return; return;
} }
server.emit('connection', connection); server.emit("connection", connection);
connection.resume(); connection.resume();
}); });
} }
@@ -126,21 +131,25 @@ function onListen() {
} }
function routingFunction(req, res, next) { function routingFunction(req, res, next) {
var client = require('./apps/client.js'); var client = require("./apps/client.js");
var admin = require('./apps/admin.js'); var admin = require("./apps/admin.js");
try { try {
var url = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'] : req.headers.host.split(":")[0]; var url = req.headers["x-forwarded-host"]
var subdomain = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'].split(".") : req.headers.host.split(":")[0].split("."); ? req.headers["x-forwarded-host"]
: req.headers.host.split(":")[0];
var subdomain = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"].split(".")
: req.headers.host.split(":")[0].split(".");
if(subdomain.length > 1 && subdomain[0] == "admin") { if (subdomain.length > 1 && subdomain[0] == "admin") {
admin(req, res, next); admin(req, res, next);
} else { } else {
client(req, res, next); client(req, res, next);
} }
} catch(e) { } catch (e) {
console.log("Bad request for " + req.headers.host + req.url, e); console.log("Bad request for " + req.headers.host + req.url, e);
res.statusCode = 500; res.statusCode = 500;
res.write('Bad request'); //write a response to the client res.write("Bad request"); //write a response to the client
res.end(); //end the response res.end(); //end the response
} }
} }

View File

@@ -1,40 +1,39 @@
var express = require('express'); var express = require("express");
var app = express(); var app = express();
const path = require('path'); const path = require("path");
const publicPath = path.join(__dirname + "", '../public'); const publicPath = path.join(__dirname + "", "../public");
var exphbs = require('express-handlebars'); var exphbs = require("express-handlebars");
var hbs = exphbs.create({ var hbs = exphbs.create({
defaultLayout: publicPath + '/layouts/admin/main', defaultLayout: publicPath + "/layouts/admin/main",
layoutsDir: publicPath + '/layouts', layoutsDir: publicPath + "/layouts",
partialsDir: publicPath + '/partials' partialsDir: publicPath + "/partials"
}); });
var passport = require('passport'); var passport = require("passport");
var mpromise = require('mpromise'); var mpromise = require("mpromise");
var LocalStrategy = require('passport-local').Strategy; var LocalStrategy = require("passport-local").Strategy;
var mongoose = require('mongoose'); var mongoose = require("mongoose");
var mongo_db_cred = require(pathThumbnails + '/config/mongo_config.js'); var mongo_db_cred = require(pathThumbnails + "/config/mongo_config.js");
var mongojs = require('mongojs'); var mongojs = require("mongojs");
var db = mongojs(mongo_db_cred.config); var db = mongojs(mongo_db_cred.config);
var token_db = mongojs("tokens"); var token_db = mongojs("tokens");
var bodyParser = require('body-parser'); var bodyParser = require("body-parser");
var session = require('express-session'); var session = require("express-session");
var MongoStore = require('connect-mongo')(session); var MongoStore = require("connect-mongo")(session);
var api = require(pathThumbnails + '/routing/admin/api.js'); var api = require(pathThumbnails + "/routing/admin/api.js");
var compression = require('compression'); var compression = require("compression");
var User = require(pathThumbnails + '/models/user.js'); var User = require(pathThumbnails + "/models/user.js");
var url = 'mongodb://' + mongo_db_cred.host + '/' + mongo_db_cred.users; var url = "mongodb://" + mongo_db_cred.host + "/" + mongo_db_cred.users;
mongoose.connect(url); mongoose.connect(url);
app.engine("handlebars", hbs.engine);
app.set("view engine", "handlebars");
app.use(compression({ filter: shouldCompress }));
app.engine('handlebars', hbs.engine); function shouldCompress(req, res) {
app.set('view engine', 'handlebars'); if (req.headers["x-no-compression"]) {
app.use(compression({filter: shouldCompress}))
function shouldCompress (req, res) {
if (req.headers['x-no-compression']) {
// don't compress responses with this request header // don't compress responses with this request header
return false; return false;
} }
@@ -42,14 +41,15 @@ function shouldCompress (req, res) {
// fallback to standard filter function // fallback to standard filter function
return compression.filter(req, res); return compression.filter(req, res);
} }
app.set('trust proxy', '127.0.0.1'); app.set("trust proxy", "127.0.0.1");
var bodyParser = require('body-parser'); var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser"); var cookieParser = require("cookie-parser");
var referrerPolicy = require('referrer-policy'); var referrerPolicy = require("referrer-policy");
var helmet = require('helmet'); var helmet = require("helmet");
var featurePolicy = require('feature-policy'); var featurePolicy = require("feature-policy");
app.use(featurePolicy({ app.use(
featurePolicy({
features: { features: {
fullscreen: ["*"], fullscreen: ["*"],
//vibrate: ["'none'"], //vibrate: ["'none'"],
@@ -57,31 +57,38 @@ app.use(featurePolicy({
microphone: ["'none'"], microphone: ["'none'"],
camera: ["'none'"], camera: ["'none'"],
speaker: ["*"], speaker: ["*"],
syncXhr: ["'self'"], syncXhr: ["'self'"]
//notifications: ["'self'"] //notifications: ["'self'"]
} }
})); })
app.use(helmet({ );
frameguard: false, app.use(
})); helmet({
app.use(referrerPolicy({ policy: 'origin-when-cross-origin' })); frameguard: false
app.enable('view cache'); })
app.set('views', publicPath); );
app.use( bodyParser.json() ); // to support JSON-encoded bodies app.use(referrerPolicy({ policy: "origin-when-cross-origin" }));
app.use(bodyParser.urlencoded({ app.enable("view cache");
app.set("views", publicPath);
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(
bodyParser.urlencoded({
extended: true extended: true
})); })
app.use(session({ );
app.use(
session({
secret: mongo_db_cred.secret, secret: mongo_db_cred.secret,
resave: true, resave: true,
saveUninitialized: true, saveUninitialized: true,
store: new MongoStore({ store: new MongoStore({
url: url, url: url,
useNewUrlParser: true, useNewUrlParser: true,
collection: 'sessions', collection: "sessions",
ttl: mongo_db_cred.expire ttl: mongo_db_cred.expire
}) })
})); // session secret })
); // session secret
app.use(passport.initialize()); app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions app.use(passport.session()); // persistent login sessions
@@ -91,8 +98,6 @@ passport.serializeUser(function(user, done) {
done(null, user.id); done(null, user.id);
}); });
// used to deserialize the user // used to deserialize the user
passport.deserializeUser(function(id, done) { passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) { User.findById(id, function(err, user) {
@@ -100,33 +105,37 @@ passport.deserializeUser(function(id, done) {
}); });
}); });
passport.use('local-signup', new LocalStrategy({ passport.use(
"local-signup",
new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with username // by default, local strategy uses username and password, we will override with username
usernameField : 'username', usernameField: "username",
passwordField : 'password', passwordField: "password",
passReqToCallback : true // allows us to pass back the entire request to the callback passReqToCallback: true // allows us to pass back the entire request to the callback
}, },
function(req, username, password, done) { function(req, username, password, done) {
// asynchronous // asynchronous
// User.findOne wont fire unless data is sent back // User.findOne wont fire unless data is sent back
process.nextTick(function() { process.nextTick(function() {
// find a user whose username is the same as the forms username // find a user whose username is the same as the forms username
// we are checking to see if the user trying to login already exists // we are checking to see if the user trying to login already exists
var token = req.body.token; var token = req.body.token;
token_db.collection("tokens").find({token: token}, function(err, docs){ token_db
if(docs.length == 1){ .collection("tokens")
token_db.collection("tokens").remove({token: token}, function(err, docs){ .find({ token: token }, function(err, docs) {
User.findOne({ 'username' : username }, function(err, user) { if (docs.length == 1) {
token_db
.collection("tokens")
.remove({ token: token }, function(err, docs) {
User.findOne({ username: username }, function(err, user) {
// if there are any errors, return the error // if there are any errors, return the error
if (err) if (err) return done(err);
return done(err);
// check to see if theres already a user with that username // check to see if theres already a user with that username
if (user) { if (user) {
return done(null, false); return done(null, false);
} else { } else {
// if there is no user with that username // if there is no user with that username
// create the user // create the user
var newUser = new User(); var newUser = new User();
@@ -137,12 +146,10 @@ function(req, username, password, done) {
// save the user // save the user
newUser.save(function(err) { newUser.save(function(err) {
if (err) if (err) throw err;
throw err;
return done(null, newUser); return done(null, newUser);
}); });
} }
}); });
}); });
} else { } else {
@@ -150,103 +157,112 @@ function(req, username, password, done) {
} }
}); });
}); });
}
)
);
})); passport.use(
"local-login",
passport.use('local-login', new LocalStrategy({ new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with email // by default, local strategy uses username and password, we will override with email
usernameField : 'username', usernameField: "username",
passwordField : 'password', passwordField: "password",
passReqToCallback : true // allows us to pass back the entire request to the callback passReqToCallback: true // allows us to pass back the entire request to the callback
}, function(req, username, password, done) { // callback with email and password from our form },
function(req, username, password, done) {
// callback with email and password from our form
// find a user whose email is the same as the forms email // find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists // we are checking to see if the user trying to login already exists
User.findOne({ 'username' : username }, function(err, user) { User.findOne({ username: username }, function(err, user) {
// if there are any errors, return the error before anything else // if there are any errors, return the error before anything else
if (err) if (err) return done(err);
return done(err);
// if no user is found, return the message // if no user is found, return the message
if (!user) if (!user) return done(null, false); // req.flash is the way to set flashdata using connect-flash
return done(null, false); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong // if the user is found but the password is wrong
if (!user.validPassword(password)) if (!user.validPassword(password)) return done(null, false); // create the loginMessage and save it to session as flashdata
return done(null, false); // create the loginMessage and save it to session as flashdata
// all is well, return successful user // all is well, return successful user
return done(null, user); return done(null, user);
}); });
}
)
);
})); app.post(
"/signup",
passport.authenticate("local-signup", {
successRedirect: "/", // redirect to the secure profile section
failureRedirect: "/signup", // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
})
);
app.post('/signup', passport.authenticate('local-signup', { app.post(
successRedirect : '/', // redirect to the secure profile section "/login",
failureRedirect : '/signup', // redirect back to the signup page if there is an error passport.authenticate("local-login", {
failureFlash : true // allow flash messages successRedirect: "/", // redirect to the secure profile section
})); failureRedirect: "/login#failed", // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
})
);
app.post('/login', passport.authenticate('local-login', { app.use("/login", isLoggedInTryingToLogIn, function(req, res) {
successRedirect : '/', // redirect to the secure profile section
failureRedirect : '/login#failed', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
}));
app.use('/login', isLoggedInTryingToLogIn, function(req, res) {
var data = { var data = {
where_get: "not_authenticated" where_get: "not_authenticated"
}; };
res.render('layouts/admin/not_authenticated', data); res.render("layouts/admin/not_authenticated", data);
}); });
app.use('/signup', isLoggedInTryingToLogIn, function(req, res) { app.use("/signup", isLoggedInTryingToLogIn, function(req, res) {
var data = { var data = {
where_get: "not_authenticated" where_get: "not_authenticated"
}; };
res.render('layouts/admin/not_authenticated', data); res.render("layouts/admin/not_authenticated", data);
}); });
app.use('/', api); app.use("/", api);
app.use('/logout', function(req, res) { app.use("/logout", function(req, res) {
req.logout(); req.logout();
res.redirect('/login'); res.redirect("/login");
}); });
app.use('/assets/admin/authenticated', function(req, res, next) { app.use("/assets/admin/authenticated", function(req, res, next) {
if(!req.isAuthenticated()) { if (!req.isAuthenticated()) {
res.sendStatus(403); res.sendStatus(403);
return; return;
} }
return next(); return next();
}); });
app.use('/assets', express.static(publicPath + '/assets')); app.use("/assets", express.static(publicPath + "/assets"));
app.use('/', isLoggedIn, function(req, res) { app.use("/", isLoggedIn, function(req, res) {
var data = { var data = {
where_get: "authenticated", where_get: "authenticated",
year: new Date().getYear()+1900, year: new Date().getYear() + 1900
}; };
res.render('layouts/admin/authenticated', data); res.render("layouts/admin/authenticated", data);
}); });
function isLoggedInTryingToLogIn(req, res, next){ function isLoggedInTryingToLogIn(req, res, next) {
if(!req.isAuthenticated()){ if (!req.isAuthenticated()) {
return next(); return next();
} }
res.redirect("/"); res.redirect("/");
} }
function isLoggedIn(req, res, next) { function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) if (req.isAuthenticated()) return next();
return next(); res.redirect("/login");
res.redirect('/login');
} }
//app.listen(default_port); //app.listen(default_port);

View File

@@ -1,9 +1,12 @@
VERSION = require(pathThumbnails + '/VERSION.js'); VERSION = require(pathThumbnails + "/VERSION.js");
var secure = false; var secure = false;
var path = require('path'); var path = require("path");
try { try {
var cert_config = require(path.join(path.join(__dirname, '../config/'), 'cert_config.js')); var cert_config = require(path.join(
var fs = require('fs'); path.join(__dirname, "../config/"),
"cert_config.js"
));
var fs = require("fs");
var privateKey = fs.readFileSync(cert_config.privateKey).toString(); var privateKey = fs.readFileSync(cert_config.privateKey).toString();
var certificate = fs.readFileSync(cert_config.certificate).toString(); var certificate = fs.readFileSync(cert_config.certificate).toString();
var ca = fs.readFileSync(cert_config.ca).toString(); var ca = fs.readFileSync(cert_config.ca).toString();
@@ -13,40 +16,39 @@ try {
ca: ca ca: ca
}; };
secure = true; secure = true;
} catch(err){} } catch (err) {}
var add = ""; var add = "";
var express = require('express'); var express = require("express");
var app = express(); var app = express();
var compression = require('compression'); var compression = require("compression");
var exphbs = require('express-handlebars'); var exphbs = require("express-handlebars");
var cors = require('cors'); var cors = require("cors");
var Functions = require(pathThumbnails + '/handlers/functions.js'); var Functions = require(pathThumbnails + "/handlers/functions.js");
var hbs = exphbs.create({ var hbs = exphbs.create({
defaultLayout: publicPath + '/layouts/client/main', defaultLayout: publicPath + "/layouts/client/main",
layoutsDir: publicPath + '/layouts/client', layoutsDir: publicPath + "/layouts/client",
partialsDir: publicPath + '/partials', partialsDir: publicPath + "/partials",
helpers: { helpers: {
if_equal: function(a, b, opts) { if_equal: function(a, b, opts) {
if (a == b) { if (a == b) {
return opts.fn(this) return opts.fn(this);
} else { } else {
return opts.inverse(this) return opts.inverse(this);
} }
}, },
decodeString: function(s) { decodeString: function(s) {
if(s == undefined) return s; if (s == undefined) return s;
return Functions.decodeChannelName(s); return Functions.decodeChannelName(s);
} }
} }
}); });
var uniqid = require('uniqid'); var uniqid = require("uniqid");
app.use(compression({filter: shouldCompress})) app.use(compression({ filter: shouldCompress }));
function shouldCompress (req, res) { function shouldCompress(req, res) {
if (req.headers['x-no-compression']) { if (req.headers["x-no-compression"]) {
// don't compress responses with this request header // don't compress responses with this request header
return false; return false;
} }
@@ -55,18 +57,19 @@ function shouldCompress (req, res) {
return compression.filter(req, res); return compression.filter(req, res);
} }
app.engine('handlebars', hbs.engine); app.engine("handlebars", hbs.engine);
app.set('view engine', 'handlebars'); app.set("view engine", "handlebars");
app.enable('view cache'); app.enable("view cache");
app.set('views', publicPath); app.set("views", publicPath);
app.set('trust proxy', '127.0.0.1'); app.set("trust proxy", "127.0.0.1");
var bodyParser = require('body-parser'); var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser"); var cookieParser = require("cookie-parser");
var referrerPolicy = require('referrer-policy'); var referrerPolicy = require("referrer-policy");
var helmet = require('helmet'); var helmet = require("helmet");
var featurePolicy = require('feature-policy'); var featurePolicy = require("feature-policy");
app.use(featurePolicy({ app.use(
featurePolicy({
features: { features: {
fullscreen: ["*"], fullscreen: ["*"],
//vibrate: ["'none'"], //vibrate: ["'none'"],
@@ -74,112 +77,131 @@ app.use(featurePolicy({
microphone: ["'none'"], microphone: ["'none'"],
camera: ["'none'"], camera: ["'none'"],
speaker: ["*"], speaker: ["*"],
syncXhr: ["'self'"], syncXhr: ["'self'"]
//notifications: ["'self'"] //notifications: ["'self'"]
} }
})); })
app.use(helmet({ );
frameguard: false, app.use(
})); helmet({
app.use(referrerPolicy({ policy: 'origin-when-cross-origin' })); frameguard: false
app.use( bodyParser.json() ); // to support JSON-encoded bodies })
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies );
app.use(referrerPolicy({ policy: "origin-when-cross-origin" }));
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(
bodyParser.urlencoded({
// to support URL-encoded bodies
extended: true extended: true
})); })
);
app.use(cookieParser()); app.use(cookieParser());
//app.set('json spaces', 2); //app.set('json spaces', 2);
io = require('socket.io')({ io = require("socket.io")({
pingTimeout: 25000, pingTimeout: 25000
//path: '/zoff', //path: '/zoff',
//"origins": ("https://zoff.me:443*,https://zoff.me:8080*,zoff.me:8080*,https://remote.zoff.me:443*,https://remote.zoff.me:8080*,https://fb.zoff.me:443*,https://fb.zoff.me:8080*,https://admin.zoff.me:443*,https://admin.zoff.me:8080*, http://localhost:8080*")}); //"origins": ("https://zoff.me:443*,https://zoff.me:8080*,zoff.me:8080*,https://remote.zoff.me:443*,https://remote.zoff.me:8080*,https://fb.zoff.me:443*,https://fb.zoff.me:8080*,https://admin.zoff.me:443*,https://admin.zoff.me:8080*, http://localhost:8080*")});
}); });
var socketIO = require(pathThumbnails +'/handlers/io.js'); var socketIO = require(pathThumbnails + "/handlers/io.js");
socketIO(); socketIO();
app.socketIO = io; app.socketIO = io;
/* Globally needed "libraries" and files */ /* Globally needed "libraries" and files */
var router = require(pathThumbnails + '/routing/client/router.js'); var router = require(pathThumbnails + "/routing/client/router.js");
var api_file = require(pathThumbnails + '/routing/client/api.js'); var api_file = require(pathThumbnails + "/routing/client/api.js");
var api = api_file.router; var api = api_file.router;
api_file.sIO = app.socketIO; api_file.sIO = app.socketIO;
var ico_router = require(pathThumbnails + '/routing/client/icons_routing.js'); var ico_router = require(pathThumbnails + "/routing/client/icons_routing.js");
app.get('/robots.txt', function (req, res) { app.get("/robots.txt", function(req, res) {
res.type('text/plain'); res.type("text/plain");
res.send("User-agent: *\nAllow: /$\nDisallow: /"); res.send("User-agent: *\nAllow: /$\nDisallow: /");
}); });
app.use(function (req, res, next) { app.use(function(req, res, next) {
var cookie = req.cookies._uI; var cookie = req.cookies._uI;
var skipElements = ["/_embed", "/assets/manifest.json", "/apple-touch-icon.png"]; var skipElements = [
if(skipElements.indexOf(req.originalUrl) > -1) { "/_embed",
"/assets/manifest.json",
"/apple-touch-icon.png"
];
if (skipElements.indexOf(req.originalUrl) > -1) {
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next(); next();
} else { } else {
if(req.originalUrl.split("/").length > 3) { if (req.originalUrl.split("/").length > 3) {
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next(); next();
} else { } else {
if (cookie === undefined) { if (cookie === undefined) {
try { try {
//console.error((new Date), "originalUrl", req.originalUrl); //console.error((new Date), "originalUrl", req.originalUrl);
//console.error((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req.get('origin'), "couldn't fetch cookie for some reason, maybe no cookie exists?"); //console.error((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req.get('origin'), "couldn't fetch cookie for some reason, maybe no cookie exists?");
} catch (e) {
} catch(e) {
//console.error((new Date), "couldn't fetch origin"); //console.error((new Date), "couldn't fetch origin");
} }
var user_name = Functions.hash_pass(Functions.rndName(uniqid.time(), 15)); var user_name = Functions.hash_pass(
res.cookie('_uI', user_name, { Functions.rndName(uniqid.time(), 15)
);
res.cookie("_uI", user_name, {
maxAge: 365 * 10000 * 3600000, maxAge: 365 * 10000 * 3600000,
httpOnly: true, httpOnly: true,
secure: secure, secure: secure
//sameSite: true, //sameSite: true,
}); });
} else { } else {
//process.stderr.write((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req, "couldn't fetch cookie for some reason, maybe no cookie exists?"); //process.stderr.write((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req, "couldn't fetch cookie for some reason, maybe no cookie exists?");
res.cookie('_uI', cookie, { res.cookie("_uI", cookie, {
maxAge: 365 * 10000 * 3600000, maxAge: 365 * 10000 * 3600000,
httpOnly: true, httpOnly: true,
secure: secure, secure: secure
//sameSite: true, //sameSite: true,
}); });
} }
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next(); next();
} }
} }
}); });
app.use('/service-worker.js', function(req, res) { app.use("/service-worker.js", function(req, res) {
res.sendFile(publicPath + '/service-worker.js'); res.sendFile(publicPath + "/service-worker.js");
}); });
app.use('/', ico_router); app.use("/", ico_router);
app.use('/', api); app.use("/", api);
app.use('/', cors(), router); app.use("/", cors(), router);
app.use('/assets/js', function(req, res, next) { app.use("/assets/js", function(req, res, next) {
res.sendStatus(403); res.sendStatus(403);
return; return;
}); });
app.use('/assets/admin', function(req, res, next) { app.use("/assets/admin", function(req, res, next) {
res.sendStatus(403); res.sendStatus(403);
return; return;
}); });
app.use('/assets', express.static(publicPath + '/assets')); app.use("/assets", express.static(publicPath + "/assets"));
app.use(function (req, res, next) { app.use(function(req, res, next) {
res.status(404); res.status(404);
res.redirect("/404"); res.redirect("/404");
}) });
module.exports = app; module.exports = app;

View File

@@ -1,8 +1,8 @@
var api_key = { var api_key = {
"youtube": "xxxx", youtube: "xxxx",
"soundcloud": "xx", soundcloud: "xx" // This can be excluded if you don't have a soundcloud key
}; };
try { try {
module.exports = api_key; module.exports = api_key;
} catch(e) {} } catch (e) {}

View File

@@ -1,42 +1,45 @@
var toShowConfig = { var toShowConfig = {
"addsongs": true, addsongs: true,
"adminpass": 1, adminpass: 1,
"allvideos": 1, allvideos: 1,
"frontpage": 1, frontpage: 1,
"longsongs": 1, longsongs: 1,
"removeplay": 1, removeplay: 1,
"shuffle": 1, shuffle: 1,
"skip": 1, skip: 1,
"startTime": 1, startTime: 1,
"userpass": 1, userpass: 1,
"vote": 1, vote: 1,
"toggleChat": { $ifNull: [ "$toggleChat", true ] }, toggleChat: { $ifNull: ["$toggleChat", true] },
"strictSkip": { $ifNull: [ "$strictSkip", false ] }, strictSkip: { $ifNull: ["$strictSkip", false] },
"strictSkipNumber": { $ifNull: [ "$strictSkipNumber", 10 ] }, strictSkipNumber: { $ifNull: ["$strictSkipNumber", 10] },
"description": { $ifNull: [ "$description", "" ] }, description: { $ifNull: ["$description", ""] },
"thumbnail": { $ifNull: [ "$thumbnail", "" ] }, thumbnail: { $ifNull: ["$thumbnail", ""] },
"rules": { $ifNull: [ "$rules", "" ] }, rules: { $ifNull: ["$rules", ""] },
"_id": 0 _id: 0
}; };
var project_object = { var project_object = {
"_id": 0, _id: 0,
"id": 1, id: 1,
"added": 1, added: 1,
"now_playing": 1, now_playing: 1,
"title": 1, title: 1,
"votes": 1, votes: 1,
"start": 1, start: 1,
"duration": 1, duration: 1,
"end": 1, end: 1,
"type": 1, type: 1,
"source": { $ifNull: [ "$source", "youtube" ] }, source: { $ifNull: ["$source", "youtube"] },
"thumbnail": { thumbnail: {
$ifNull: [ "$thumbnail", { $ifNull: [
$concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] "$thumbnail",
} ] {
$concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]
}
]
}, },
"tags": { $ifNull: [ "$tags", [] ] }, tags: { $ifNull: ["$tags", []] }
}; };
var toShowChannel = { var toShowChannel = {
@@ -53,7 +56,7 @@ var toShowChannel = {
now_playing: 1, now_playing: 1,
type: 1, type: 1,
source: 1, source: 1,
thumbnail: 1, thumbnail: 1
}; };
module.exports.project_object = project_object; module.exports.project_object = project_object;

File diff suppressed because it is too large Load Diff

View File

@@ -1,39 +1,84 @@
var path = require('path'); var path = require("path");
try { try {
var mongo_config = require(path.join(path.join(__dirname, '../config/'), 'mongo_config.js')); var mongo_config = require(path.join(
} catch(e) { path.join(__dirname, "../config/"),
console.log("Error - missing file"); "mongo_config.js"
console.log("Seems you forgot to create the file mongo_config.js in /server/config/. Have a look at mongo_config.example.js."); ));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1); process.exit(1);
} }
var mongojs = require('mongojs'); var mongojs = require("mongojs");
var db = mongojs('mongodb://' + mongo_config.host + '/' + mongo_config.config); var db = mongojs("mongodb://" + mongo_config.host + "/" + mongo_config.config);
var connected_db = mongojs('mongodb://' + mongo_config.host + '/user_credentials'); var connected_db = mongojs(
"mongodb://" + mongo_config.host + "/user_credentials"
);
var ObjectId = mongojs.ObjectId; var ObjectId = mongojs.ObjectId;
db.collection("chat_logs").createIndex({ "createdAt": 1 }, { expireAfterSeconds: 600 }, function(){}); db.collection("chat_logs").createIndex(
db.collection("timeout_api").createIndex({ "createdAt": 1 }, { expireAfterSeconds: 120 }, function(){}); { createdAt: 1 },
db.collection("api_links").createIndex({ "createdAt": 1 }, { expireAfterSeconds: 86400 }, function(){}); { expireAfterSeconds: 600 },
db.on('connected', function(err) { function() {}
);
db.collection("timeout_api").createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 120 },
function() {}
);
db.collection("api_links").createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 86400 },
function() {}
);
db.on("connected", function(err) {
console.log("connected"); console.log("connected");
}); });
db.on('error',function(err) { db.on("error", function(err) {
console.log("\n" + new Date().toString() + "\n Database error: ", err); console.log("\n" + new Date().toString() + "\n Database error: ", err);
}); });
db.on("error", function(err) {
db.on('error',function(err) {
console.log("\n" + new Date().toString() + "\n Database error: ", err); console.log("\n" + new Date().toString() + "\n Database error: ", err);
}); });
/* Resetting usernames, and connected users */ /* Resetting usernames, and connected users */
db.collection("unique_ids").update({"_id": "unique_ids"}, {$set: {unique_ids: []}}, {multi: true, upsert: true}, function(err, docs){}); db.collection("unique_ids").update(
db.collection("user_names").remove({"guid": {$exists: true}}, {multi: true, upsert: true}, function(err, docs){}); { _id: "unique_ids" },
db.collection("user_names").update({"_id": "all_names"}, {$set: {names: []}}, {multi: true, upsert: true}, function(err, docs){}); { $set: { unique_ids: [] } },
db.collection("connected_users").update({users: {$exists: true}}, {$set: {users: []}}, {multi: true, upsert: true}, function(err, docs){}); { multi: true, upsert: true },
db.collection("connected_users").update({"_id": "total_users"}, {$set: {total_users: []}}, {multi: true, upsert: true}, function(err, docs) {}); function(err, docs) {}
db.collection("frontpage_lists").update({viewers: {$ne: 0}}, {$set: {"viewers": 0}}, {multi: true, upsert: true}, function(err, docs) {}); );
db.collection("user_names").remove(
{ guid: { $exists: true } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("user_names").update(
{ _id: "all_names" },
{ $set: { names: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("connected_users").update(
{ users: { $exists: true } },
{ $set: { users: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("connected_users").update(
{ _id: "total_users" },
{ $set: { total_users: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("frontpage_lists").update(
{ viewers: { $ne: 0 } },
{ $set: { viewers: 0 } },
{ multi: true, upsert: true },
function(err, docs) {}
);
module.exports = db; module.exports = db;

View File

@@ -1,103 +1,142 @@
var Functions = require(pathThumbnails + '/handlers/functions.js'); var Functions = require(pathThumbnails + "/handlers/functions.js");
var db = require(pathThumbnails + '/handlers/db.js'); var db = require(pathThumbnails + "/handlers/db.js");
function frontpage_lists(msg, socket) { function frontpage_lists(msg, socket) {
if(msg == undefined || !msg.hasOwnProperty('version') || msg.version != VERSION || msg.version == undefined) { if (
msg == undefined ||
!msg.hasOwnProperty("version") ||
msg.version != VERSION ||
msg.version == undefined
) {
var result = { var result = {
version: { version: {
expected: VERSION, expected: VERSION,
got: msg.hasOwnProperty("version") ? msg.version : undefined, got: msg.hasOwnProperty("version") ? msg.version : undefined
} }
}; };
socket.emit('update_required', result); socket.emit("update_required", result);
return; return;
} }
db.collection("frontpage_lists").find({frontpage:true}, function(err, docs){ db.collection("frontpage_lists").find({ frontpage: true }, function(
db.collection("connected_users").find({"_id": "total_users"}, function(err, tot){ err,
socket.compress(true).emit("playlists", {channels: docs, viewers: tot[0].total_users.length}); docs
) {
db.collection("connected_users").find({ _id: "total_users" }, function(
err,
tot
) {
socket
.compress(true)
.emit("playlists", {
channels: docs,
viewers: tot[0].total_users.length
});
}); });
}); });
} }
function get_frontpage_lists(callback) { function get_frontpage_lists(callback) {
var project_object = { var project_object = {
"_id": 1, _id: 1,
"count": 1, count: 1,
"frontpage": 1, frontpage: 1,
"id": 1, id: 1,
"title": 1, title: 1,
"viewers": 1, viewers: 1,
"accessed": 1, accessed: 1,
"pinned": { $ifNull: [ "$pinned", 0 ] }, pinned: { $ifNull: ["$pinned", 0] },
"description": { description: {
$ifNull: [ {$cond: { $ifNull: [
"if": { {
"$or": [ $cond: {
{ "$eq": [ "$description", ""] }, if: {
{ "$eq": [ "$description", null] }, $or: [
{ "$eq": [ "$description", undefined] } { $eq: ["$description", ""] },
{ $eq: ["$description", null] },
{ $eq: ["$description", undefined] }
] ]
}, },
then: "This list has no description", then: "This list has no description",
else: "$description" else: "$description"
}}, "This list has no description"] }
}, },
"thumbnail": { "This list has no description"
$ifNull: [ {$cond: { ]
"if": { },
"$or": [ thumbnail: {
{ "$eq": [ "$thumbnail", ""] }, $ifNull: [
{ "$eq": [ "$thumbnail", null] }, {
{ "$eq": [ "$thumbnail", undefined] } $cond: {
if: {
$or: [
{ $eq: ["$thumbnail", ""] },
{ $eq: ["$thumbnail", null] },
{ $eq: ["$thumbnail", undefined] }
] ]
}, },
then: { then: {
$concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] $concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]
}, },
else: "$thumbnail" else: "$thumbnail"
}}, { $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]}] }
},
{ $concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] }
]
} }
}; };
db.collection("frontpage_lists").aggregate([ db.collection("frontpage_lists").aggregate(
[
{ {
"$match": { $match: {
frontpage: true, frontpage: true,
count: {$gt: 3}, count: { $gt: 3 }
} }
}, },
{ {
"$project": project_object $project: project_object
}, },
{ {
"$sort" : { $sort: {
"pinned": -1, pinned: -1,
"viewers": -1, viewers: -1,
"accessed": -1, accessed: -1,
"count": -1, count: -1,
"title": 1 title: 1
} }
}, }
], callback); ],
callback
);
} }
function update_frontpage(coll, id, title, thumbnail, source, callback) { function update_frontpage(coll, id, title, thumbnail, source, callback) {
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
db.collection("frontpage_lists").find({_id: coll}, function(e, doc) { db.collection("frontpage_lists").find({ _id: coll }, function(e, doc) {
var updateObject = { var updateObject = {
id: id, id: id,
title: title, title: title,
accessed: Functions.get_time() accessed: Functions.get_time()
}; };
if(doc.length > 0 && ((doc[0].thumbnail != "" && doc[0].thumbnail != undefined && (doc[0].thumbnail.indexOf("https://i1.sndcdn.com") > -1 || doc[0].thumbnail.indexOf("https://w1.sndcdn.com") > -1 || doc[0].thumbnail.indexOf("https://img.youtube.com") > -1)) || (doc[0].thumbnail == "" || doc[0].thumbnail == undefined))) { if (
doc.length > 0 &&
((doc[0].thumbnail != "" &&
doc[0].thumbnail != undefined &&
(doc[0].thumbnail.indexOf("https://i1.sndcdn.com") > -1 ||
doc[0].thumbnail.indexOf("https://w1.sndcdn.com") > -1 ||
doc[0].thumbnail.indexOf("https://img.youtube.com") > -1)) ||
(doc[0].thumbnail == "" || doc[0].thumbnail == undefined))
) {
updateObject.thumbnail = thumbnail; updateObject.thumbnail = thumbnail;
if(thumbnail == undefined) updateObject.thumbnail = ""; if (thumbnail == undefined) updateObject.thumbnail = "";
} }
db.collection("frontpage_lists").update({_id: coll}, {$set: updateObject db.collection("frontpage_lists").update(
},{upsert: true}, function(err, returnDocs){ { _id: coll },
if(typeof(callback) == "function") callback(); { $set: updateObject },
}); { upsert: true },
function(err, returnDocs) {
if (typeof callback == "function") callback();
}
);
}); });
} }

View File

@@ -1,20 +1,26 @@
var path = require('path'); var path = require("path");
try { try {
var mongo_config = require(path.join(path.join(__dirname, '../config/'), 'mongo_config.js')); var mongo_config = require(path.join(
} catch(e) { path.join(__dirname, "../config/"),
console.log("Error - missing file"); "mongo_config.js"
console.log("Seems you forgot to create the file mongo_config.js in /server/config/. Have a look at mongo_config.example.js."); ));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1); process.exit(1);
} }
var mongojs = require('mongojs'); var mongojs = require("mongojs");
var connected_db = mongojs('mongodb://' + mongo_config.host + '/user_credentials'); var connected_db = mongojs(
var crypto = require('crypto'); "mongodb://" + mongo_config.host + "/user_credentials"
var db = require(pathThumbnails + '/handlers/db.js'); );
var uniqid = require('uniqid'); var crypto = require("crypto");
var Filter = require('bad-words'); var db = require(pathThumbnails + "/handlers/db.js");
var filter = new Filter({ placeHolder: 'x'}); var uniqid = require("uniqid");
var Filter = require("bad-words");
var filter = new Filter({ placeHolder: "x" });
var Chat = require(pathThumbnails + '/handlers/chat.js'); var Chat = require(pathThumbnails + "/handlers/chat.js");
function encodeChannelName(str) { function encodeChannelName(str) {
var _fn = encodeURIComponent; var _fn = encodeURIComponent;
@@ -36,34 +42,55 @@ function decodeChannelName(str) {
} }
function remove_unique_id(short_id) { function remove_unique_id(short_id) {
db.collection("unique_ids").update({"_id": "unique_ids"}, {$pull: {unique_ids: short_id}}, function(err, docs) {}); db.collection("unique_ids").update(
{ _id: "unique_ids" },
{ $pull: { unique_ids: short_id } },
function(err, docs) {}
);
} }
function remove_name_from_db(guid, channel) { function remove_name_from_db(guid, channel) {
// Use temporary, with caution. Can bottleneck in large quantity of users. // Use temporary, with caution. Can bottleneck in large quantity of users.
// //
// Find a way of indexing users in lists in a clever way, to avoid the search here // Find a way of indexing users in lists in a clever way, to avoid the search here
db.collection("connected_users").find({"_id": "total_users"}, function(err, all_users) { db.collection("connected_users").find({ _id: "total_users" }, function(
var hasOne = all_users[0].total_users.some(function(v){ return v.indexOf(guid)>=0 }); err,
if(!hasOne) { all_users
db.collection("user_names").find({"guid": guid}, function(err, user){ ) {
if(user.length == 1){ var hasOne = all_users[0].total_users.some(function(v) {
db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: user[0].name}}, function(err, updated) { return v.indexOf(guid) >= 0;
db.collection("user_names").remove({"guid": guid}, function(err, removed) { });
}); });
if (!hasOne) {
db.collection("user_names").find({ guid: guid }, function(err, user) {
if (user.length == 1) {
db.collection("user_names").update(
{ _id: "all_names" },
{ $pull: { names: user[0].name } },
function(err, updated) {
db.collection("user_names").remove({ guid: guid }, function(
err,
removed
) {});
}
);
} }
}); });
} else { } else {
if(channel == undefined || channel == "") return; if (channel == undefined || channel == "") return;
db.collection("user_names").update({"guid": guid}, {$pull: {channels: channel}}, function(err, docs) { db.collection("user_names").update(
{ guid: guid },
{ $pull: { channels: channel } },
function(err, docs) {
//console.log("Pulled user from current channel"); //console.log("Pulled user from current channel");
}); }
);
} }
}); });
} }
function isUrl(str) { function isUrl(str) {
var pattern = new RegExp("\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + var pattern = new RegExp(
"\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" +
"(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" +
"|mil|biz|info|mobi|name|aero|jobs|museum" + "|mil|biz|info|mobi|name|aero|jobs|museum" +
"|travel|[a-z]{2}))(:[\\d]{1,5})?" + "|travel|[a-z]{2}))(:[\\d]{1,5})?" +
@@ -72,8 +99,9 @@ function isUrl(str) {
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" +
"(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" +
"(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"); "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"
if(!pattern.test(str)) { );
if (!pattern.test(str)) {
return false; return false;
} else { } else {
return true; return true;
@@ -86,32 +114,39 @@ function getSession(socket) {
var cookie = require("cookie"); var cookie = require("cookie");
var parsedCookies = cookie.parse(socket.handshake.headers.cookie); var parsedCookies = cookie.parse(socket.handshake.headers.cookie);
return parsedCookies["_uI"];*/ return parsedCookies["_uI"];*/
if(socket.cookie_id == undefined) throw "Undefined error"; if (socket.cookie_id == undefined) throw "Undefined error";
return socket.cookie_id; return socket.cookie_id;
} catch(e) { } catch (e) {
// Returning "sessiong"-based on place of connection // Returning "sessiong"-based on place of connection
return hash_pass(socket.handshake.headers["user-agent"] + socket.handshake.address + socket.handshake.headers["accept-language"]); return hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
//return "empty"; //return "empty";
} }
} }
function remove_from_array(array, element){ function remove_from_array(array, element) {
if(contains(array, element)){ if (contains(array, element)) {
var index = array.indexOf(element); var index = array.indexOf(element);
if(index != -1) if (index != -1) array.splice(index, 1);
array.splice(index, 1);
} }
} }
function generate_channel_name(res) { function generate_channel_name(res) {
var trying_id = uniqid.time().toLowerCase(); var trying_id = uniqid.time().toLowerCase();
db.collection("frontpage_lists").find({frontpage: {$exists: true }, "_id": trying_id }, {"_id": 1}, function(err, docs){ db.collection("frontpage_lists").find(
if(docs.length == 0) { { frontpage: { $exists: true }, _id: trying_id },
{ _id: 1 },
function(err, docs) {
if (docs.length == 0) {
res.send(trying_id); res.send(trying_id);
return; return;
} }
generate_channel_name(res); generate_channel_name(res);
}); }
);
} }
function get_short_id(socket) { function get_short_id(socket) {
@@ -121,73 +156,151 @@ function get_short_id(socket) {
socket.emit("id", new_short_id); socket.emit("id", new_short_id);
} }
function check_inlist(coll, guid, socket, offline, callback, double_check) function check_inlist(coll, guid, socket, offline, callback, double_check) {
{ if (coll == undefined) {
if(coll == undefined) { if (typeof callback == "function") callback();
if(typeof(callback) == "function") callback();
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
if(!offline && coll != undefined){ if (!offline && coll != undefined) {
db.collection("connected_users").update({"_id": coll}, {$addToSet:{users: guid}}, {upsert: true}, function(err, updated) { db.collection("connected_users").update(
if(updated.nModified > 0 || updated.upserted != undefined) { { _id: coll },
db.collection("connected_users").find({"_id": coll}, function(err, new_doc) { { $addToSet: { users: guid } },
db.collection("frontpage_lists").update({"_id": coll}, {$set: {"viewers": new_doc[0].users.length}}, function(){ { upsert: true },
if(new_doc[0].users == undefined || new_doc[0].users.length == undefined) { function(err, updated) {
if (updated.nModified > 0 || updated.upserted != undefined) {
db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
db.collection("frontpage_lists").update(
{ _id: coll },
{ $set: { viewers: new_doc[0].users.length } },
function() {
if (
new_doc[0].users == undefined ||
new_doc[0].users.length == undefined
) {
io.to(coll).emit("viewers", 1); io.to(coll).emit("viewers", 1);
} else { } else {
io.to(coll).emit("viewers", new_doc[0].users.length); io.to(coll).emit("viewers", new_doc[0].users.length);
} }
Chat.namechange({initial: true, first:true, channel: coll}, guid, socket, false, function(enabled) { Chat.namechange(
db.collection("user_names").find({"guid": guid}, function(err, docs) { { initial: true, first: true, channel: coll },
if(docs.length == 1) { guid,
socket,
false,
function(enabled) {
db.collection("user_names").find({ guid: guid }, function(
err,
docs
) {
if (docs.length == 1) {
var icon = ""; var icon = "";
if(docs[0].icon != undefined) icon = docs[0].icon; if (docs[0].icon != undefined) icon = docs[0].icon;
db.collection("user_names").update({"guid": guid}, {$addToSet:{channels: coll}}, function(err, doc){}); db.collection("user_names").update(
if(enabled) { { guid: guid },
socket.broadcast.to(coll).emit('chat', {from: docs[0].name, icon: icon, msg: " joined"}); { $addToSet: { channels: coll } },
function(err, doc) {}
);
if (enabled) {
socket.broadcast.to(coll).emit("chat", {
from: docs[0].name,
icon: icon,
msg: " joined"
});
} }
} else if(docs.length == 0) { } else if (docs.length == 0) {
//console.log("User doesn't have a name for some reason."); //console.log("User doesn't have a name for some reason.");
//console.log("guid", guid); //console.log("guid", guid);
//console.log("channel", coll); //console.log("channel", coll);
//console.log("Trying to get a chat-name"); //console.log("Trying to get a chat-name");
Chat.get_name(guid, {announce: false, socket: socket, channel: coll}); Chat.get_name(guid, {
announce: false,
socket: socket,
channel: coll
});
} }
}); });
db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + coll}}, function(err, docs){ db.collection("connected_users").update(
if(callback != undefined && typeof(callback) == "function") callback(); { _id: "total_users" },
}); { $addToSet: { total_users: guid + coll } },
}); function(err, docs) {
}); if (
callback != undefined &&
typeof callback == "function"
)
callback();
}
);
}
);
}
);
}); });
} else { } else {
db.collection("connected_users").find({"_id": coll}, function(err, new_doc) { db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
io.to(coll).emit("viewers", new_doc[0].users.length); io.to(coll).emit("viewers", new_doc[0].users.length);
}); });
if(callback != undefined && typeof(callback) == "function") callback(); if (callback != undefined && typeof callback == "function")
callback();
} }
}); }
);
} else { } else {
if(offline) { if (offline) {
db.collection("connected_users").update({"_id": "offline_users"}, {$addToSet: {users: guid}}, function(err, docs){}); db.collection("connected_users").update(
{ _id: "offline_users" },
{ $addToSet: { users: guid } },
function(err, docs) {}
);
} else { } else {
db.collection("connected_users").update({"_id": coll}, {$addToSet: {users: guid}}, function(err, docs){}); db.collection("connected_users").update(
{ _id: coll },
{ $addToSet: { users: guid } },
function(err, docs) {}
);
} }
// //
if(coll != undefined && coll != "") { if (coll != undefined && coll != "") {
db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + coll}}, function(err, docs) {}); db.collection("connected_users").update(
{ _id: "total_users" },
{ $addToSet: { total_users: guid + coll } },
function(err, docs) {}
);
} }
if(callback != undefined && typeof(callback) == "function") callback(); if (callback != undefined && typeof callback == "function") callback();
} }
} }
function rndName(seed, len) { function rndName(seed, len) {
var vowels = ['a', 'e', 'i', 'o', 'u']; var vowels = ["a", "e", "i", "o", "u"];
consts = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'x', 'y']; consts = [
"b",
"c",
"d",
"f",
"g",
"h",
"j",
"k",
"l",
"m",
"n",
"p",
"r",
"s",
"t",
"v",
"w",
"x",
"y"
];
len = Math.floor(len); len = Math.floor(len);
word = ''; word = "";
is_vowel = false; is_vowel = false;
var arr; var arr;
try { try {
@@ -195,37 +308,36 @@ function rndName(seed, len) {
if (is_vowel) arr = vowels; if (is_vowel) arr = vowels;
else arr = consts; else arr = consts;
is_vowel = !is_vowel; is_vowel = !is_vowel;
word += arr[(seed[i%seed.length].charCodeAt()+i) % (arr.length-1)]; word += arr[(seed[i % seed.length].charCodeAt() + i) % (arr.length - 1)];
} }
} catch(e) { } catch (e) {
return rndName(uniqid.time().toLowerCase(), len); return rndName(uniqid.time().toLowerCase(), len);
} }
return word; return word;
} }
function removeEmojis (string) { function removeEmojis(string) {
//https://stackoverflow.com/a/41164278/4266467 //https://stackoverflow.com/a/41164278/4266467
var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g; var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
return string.replace(regex, ''); return string.replace(regex, "");
} }
function decrypt_string(pw){ function decrypt_string(pw) {
try { try {
return Buffer.from(pw, 'base64').toString('ascii') return Buffer.from(pw, "base64").toString("ascii");
} catch(e) { } catch (e) {
return ""; return "";
} }
} }
function get_time() function get_time() {
{
var d = new Date(); var d = new Date();
var time = Math.floor(d.getTime() / 1000); var time = Math.floor(d.getTime() / 1000);
return time; return time;
} }
function contains(a, obj) { function contains(a, obj) {
try{ try {
var i = a.length; var i = a.length;
while (i--) { while (i--) {
if (a[i] === obj) { if (a[i] === obj) {
@@ -233,44 +345,63 @@ function contains(a, obj) {
} }
} }
return false; return false;
}catch(e){ } catch (e) {
return false; return false;
} }
} }
function hash_pass(adminpass, hex) { function hash_pass(adminpass, hex) {
if(adminpass == undefined || adminpass == "") return ""; if (adminpass == undefined || adminpass == "") return "";
if(hex) return crypto.createHash('sha256').update(adminpass).digest('hex'); if (hex)
return crypto.createHash('sha256').update(adminpass).digest('base64'); return crypto
.createHash("sha256")
.update(adminpass)
.digest("hex");
return crypto
.createHash("sha256")
.update(adminpass)
.digest("base64");
} }
function setSessionAdminPass(id, adminpass, list, callback) { function setSessionAdminPass(id, adminpass, list, callback) {
try { try {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback(); callback();
return; return;
} }
connected_db.collection(id).update({_id: list}, {$set: {adminpass: hash_pass(decrypt_string(adminpass), true)}}, {upsert: true}, function(e, d){ connected_db
.collection(id)
.update(
{ _id: list },
{ $set: { adminpass: hash_pass(decrypt_string(adminpass), true) } },
{ upsert: true },
function(e, d) {
callback(); callback();
return; return;
});
} catch(e) {
} }
);
} catch (e) {}
} }
function setSessionChatPass(id, name, pass, callback) { function setSessionChatPass(id, name, pass, callback) {
try { try {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback(); callback();
return; return;
} }
connected_db.collection(id).update({_id: "_chat_"}, {$set: {password: pass, name: name}}, {upsert: true}, function(e) { connected_db
.collection(id)
.update(
{ _id: "_chat_" },
{ $set: { password: pass, name: name } },
{ upsert: true },
function(e) {
callback(); callback();
return; return;
}) }
} catch(e) { );
} catch (e) {
callback(); callback();
return; return;
} }
@@ -278,119 +409,141 @@ function setSessionChatPass(id, name, pass, callback) {
function getSessionChatPass(id, callback) { function getSessionChatPass(id, callback) {
try { try {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback("", "", false); callback("", "", false);
return; return;
} }
connected_db.collection(id).find({_id: "_chat_"}, function(e, d) { connected_db.collection(id).find({ _id: "_chat_" }, function(e, d) {
if(d.length > 0) { if (d.length > 0) {
var name = ""; var name = "";
var pass = ""; var pass = "";
if(d[0].name != undefined) name = d[0].name; if (d[0].name != undefined) name = d[0].name;
if(d[0].password != undefined) pass = d[0].password; if (d[0].password != undefined) pass = d[0].password;
callback(name, pass); callback(name, pass);
return; return;
} else { } else {
callback("", "", false); callback("", "", false);
return; return;
} }
}) });
} catch(e) { } catch (e) {
callback(); callback();
return; return;
} }
} }
function setChromecastHost(id, other_id, list, callback) { function setChromecastHost(id, other_id, list, callback) {
try { try {
if(id == "empty" || id == undefined || other_id == "empty" || other_id == undefined) { if (
id == "empty" ||
id == undefined ||
other_id == "empty" ||
other_id == undefined
) {
callback(); callback();
return; return;
} }
connected_db.collection(id).update({_id: list}, {"chromecast": true, id: other_id}, {upsert: true}, function(e, docs) { connected_db
.collection(id)
.update(
{ _id: list },
{ chromecast: true, id: other_id },
{ upsert: true },
function(e, docs) {
callback(true); callback(true);
return; return;
}); }
} catch(e) { );
} catch (e) {
callback(false); callback(false);
} }
} }
function setSessionUserPass(id, userpass, list, callback) { function setSessionUserPass(id, userpass, list, callback) {
try { try {
if(id == "empty" || id == undefined || userpass == undefined) { if (id == "empty" || id == undefined || userpass == undefined) {
callback(); callback();
return; return;
} }
connected_db.collection(id).update({_id: list}, {$set: {userpass: userpass}}, {upsert: true}, function(e, d){ connected_db
.collection(id)
.update(
{ _id: list },
{ $set: { userpass: userpass } },
{ upsert: true },
function(e, d) {
callback(); callback();
return; return;
}); }
} catch(e) { );
} catch (e) {
callback(); callback();
} }
} }
function getSessionAdminUser(id, list, callback) { function getSessionAdminUser(id, list, callback) {
try { try {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback("", "", false); callback("", "", false);
return; return;
} }
connected_db.collection(id).find({_id: list}, function(e, d) { connected_db.collection(id).find({ _id: list }, function(e, d) {
var userpass = ""; var userpass = "";
var adminpass = ""; var adminpass = "";
if(d.length > 0) { if (d.length > 0) {
if(d[0].hasOwnProperty("chromecast") && d[0].chromecast) { if (d[0].hasOwnProperty("chromecast") && d[0].chromecast) {
getSessionAdminUser(d[0].id, list, callback); getSessionAdminUser(d[0].id, list, callback);
} else { } else {
if(d[0].userpass != undefined) userpass = d[0].userpass; if (d[0].userpass != undefined) userpass = d[0].userpass;
if(d[0].adminpass != undefined) adminpass = d[0].adminpass; if (d[0].adminpass != undefined) adminpass = d[0].adminpass;
callback(userpass, adminpass, true); callback(userpass, adminpass, true);
} }
} else { } else {
callback(userpass, adminpass, true); callback(userpass, adminpass, true);
} }
}) });
} catch(e) { } catch (e) {
callback("", "", false); callback("", "", false);
} }
} }
function removeSessionChatPass(id, callback) { function removeSessionChatPass(id, callback) {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback(); callback();
return; return;
} }
connected_db.collection(id).remove({_id: "_chat_"}, function() { connected_db.collection(id).remove({ _id: "_chat_" }, function() {
callback(); callback();
return; return;
}); });
} }
function removeSessionAdminPass(id, channel, callback) { function removeSessionAdminPass(id, channel, callback) {
if(id == "empty" || id == undefined) { if (id == "empty" || id == undefined) {
callback(); callback();
return; return;
} }
connected_db.collection(id).update({_id: channel}, {$set: {"adminpass": ""}}, function() { connected_db
.collection(id)
.update({ _id: channel }, { $set: { adminpass: "" } }, function() {
callback(); callback();
return; return;
}); });
} }
function remove_from_chat_channel(coll, guid) { function remove_from_chat_channel(coll, guid) {
db.collection("user_names").update({"guid": guid}, {$pull: {channels: coll}}, function(err, docs) { db.collection("user_names").update(
}); { guid: guid },
{ $pull: { channels: coll } },
function(err, docs) {}
);
} }
function left_channel(coll, guid, short_id, in_list, socket, change, caller) { function left_channel(coll, guid, short_id, in_list, socket, change, caller) {
if(!coll) { if (!coll) {
if(!change) { if (!change) {
remove_name_from_db(guid, coll); remove_name_from_db(guid, coll);
} else { } else {
remove_from_chat_channel(coll, guid); remove_from_chat_channel(coll, guid);
@@ -398,67 +551,111 @@ function left_channel(coll, guid, short_id, in_list, socket, change, caller) {
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
db.collection("connected_users").update({"_id": coll}, {$pull: {users: guid}}, function(err, updated) { db.collection("connected_users").update(
if(updated.nModified > 0) { { _id: coll },
db.collection("connected_users").update({"_id": "total_users"}, {$pull: {total_users: guid + coll}}, function(err, updated){}); { $pull: { users: guid } },
db.collection("connected_users").find({"_id": coll}, function(err, new_doc){ function(err, updated) {
db.collection("frontpage_lists").update({"_id": coll, viewers: {$gt: 0}}, {$inc: {viewers: -1}}, function(err, doc) { if (updated.nModified > 0) {
db.collection("user_names").find({"guid": guid}, function(err, docs) { db.collection("connected_users").update(
if(docs.length == 1) { { _id: "total_users" },
{ $pull: { total_users: guid + coll } },
function(err, updated) {}
);
db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
db.collection("frontpage_lists").update(
{ _id: coll, viewers: { $gt: 0 } },
{ $inc: { viewers: -1 } },
function(err, doc) {
db.collection("user_names").find({ guid: guid }, function(
err,
docs
) {
if (docs.length == 1) {
var icon = ""; var icon = "";
if(docs[0].icon != undefined) icon = docs[0].icon; if (docs[0].icon != undefined) icon = docs[0].icon;
io.to(coll).emit('chat', {from: docs[0].name, icon: icon, msg: " left"}); io.to(coll).emit("chat", {
from: docs[0].name,
icon: icon,
msg: " left"
});
} }
}); });
io.to(coll).emit("viewers", new_doc[0].users.length); io.to(coll).emit("viewers", new_doc[0].users.length);
socket.leave(coll); socket.leave(coll);
if(!change) { if (!change) {
remove_name_from_db(guid, coll); remove_name_from_db(guid, coll);
} else { } else {
remove_from_chat_channel(coll, guid); remove_from_chat_channel(coll, guid);
} }
}
);
}); });
});
} else { } else {
db.collection("connected_users").update({"_id": "offline_users"}, {$pull: {users: guid}}, function(err, updated){ db.collection("connected_users").update(
{ _id: "offline_users" },
{ $pull: { users: guid } },
function(err, updated) {
//if(updated.nModified > 0) { //if(updated.nModified > 0) {
db.collection("connected_users").update({"_id": "total_users"}, {$pull: {total_users: guid + coll}}, function(err, updated){}); db.collection("connected_users").update(
if(!change) { { _id: "total_users" },
{ $pull: { total_users: guid + coll } },
function(err, updated) {}
);
if (!change) {
remove_name_from_db(guid, coll); remove_name_from_db(guid, coll);
} else { } else {
remove_from_chat_channel(coll, guid); remove_from_chat_channel(coll, guid);
} }
//} //}
});
} }
}); );
}
}
);
remove_unique_id(short_id); remove_unique_id(short_id);
} }
function checkTimeout(
function checkTimeout(type, timeout, channel, guid, conf_pass, this_pass, socket, callback, error_message, error_callback){ type,
if(conf_pass != "" && conf_pass == this_pass) { timeout,
channel,
guid,
conf_pass,
this_pass,
socket,
callback,
error_message,
error_callback
) {
if (conf_pass != "" && conf_pass == this_pass) {
callback(); callback();
return; return;
} }
db.collection("timeout_api").find({ db.collection("timeout_api").find(
{
type: type, type: type,
guid: guid, guid: guid
}, function(err, docs) { },
if(docs.length > 0) { function(err, docs) {
if (docs.length > 0) {
var date = new Date(docs[0].createdAt); var date = new Date(docs[0].createdAt);
date.setSeconds(date.getSeconds() + timeout); date.setSeconds(date.getSeconds() + timeout);
var now = new Date(); var now = new Date();
var retry_in = (date.getTime() - now.getTime()) / 1000; var retry_in = (date.getTime() - now.getTime()) / 1000;
if(retry_in > 0) { if (retry_in > 0) {
if(typeof(error_callback) == "function") { if (typeof error_callback == "function") {
error_callback(); error_callback();
} else if(error_message) { } else if (error_message) {
var sOrNot = Math.ceil(retry_in) > 1 || Math.ceil(retry_in) == 0 ? "s" : ""; var sOrNot =
socket.emit("toast", error_message + Math.ceil(retry_in) + " second" + sOrNot + "."); Math.ceil(retry_in) > 1 || Math.ceil(retry_in) == 0 ? "s" : "";
socket.emit(
"toast",
error_message + Math.ceil(retry_in) + " second" + sOrNot + "."
);
} else { } else {
socket.emit("toast", "wait_longer"); socket.emit("toast", "wait_longer");
} }
@@ -466,17 +663,23 @@ function checkTimeout(type, timeout, channel, guid, conf_pass, this_pass, socket
} }
} }
var now_date = new Date(); var now_date = new Date();
db.collection("timeout_api").update({type: type, guid: guid}, { db.collection("timeout_api").update(
{ type: type, guid: guid },
{
$set: { $set: {
"createdAt": now_date, createdAt: now_date,
type: type, type: type,
guid: guid, guid: guid
}
}, },
}, {upsert: true}, function(err, docs) { { upsert: true },
function(err, docs) {
callback(); callback();
return; return;
}); }
}); );
}
);
} }
module.exports.checkTimeout = checkTimeout; module.exports.checkTimeout = checkTimeout;

File diff suppressed because it is too large Load Diff

View File

@@ -1,81 +1,114 @@
var Functions = require(pathThumbnails + '/handlers/functions.js'); var Functions = require(pathThumbnails + "/handlers/functions.js");
var crypto = require('crypto'); var crypto = require("crypto");
var Filter = require('bad-words'); var Filter = require("bad-words");
var filter = new Filter({ placeHolder: 'x'}); var filter = new Filter({ placeHolder: "x" });
/*var filter = { /*var filter = {
clean: function(str) { clean: function(str) {
return str; return str;
} }
}*/ }*/
var projects = require(pathThumbnails + "/handlers/aggregates.js"); var projects = require(pathThumbnails + "/handlers/aggregates.js");
var db = require(pathThumbnails + '/handlers/db.js'); var db = require(pathThumbnails + "/handlers/db.js");
function password(inp, coll, guid, offline, socket) { function password(inp, coll, guid, offline, socket) {
var sessionId = Functions.getSession(socket); var sessionId = Functions.getSession(socket);
if(sessionId == "") sessionId = "empty"; if (sessionId == "") sessionId = "empty";
if(inp !== undefined && inp !== null && inp !== "") if (inp !== undefined && inp !== null && inp !== "") {
{ if (
if(!inp.hasOwnProperty("password") || !inp.hasOwnProperty("channel") || !inp.hasOwnProperty("password") ||
typeof(inp.password) != "string" || typeof(inp.channel) != "string") { !inp.hasOwnProperty("channel") ||
typeof inp.password != "string" ||
typeof inp.channel != "string"
) {
var result = { var result = {
channel: { channel: {
expected: "string", expected: "string",
got: inp.hasOwnProperty("channel") ? typeof(inp.channel) : undefined, got: inp.hasOwnProperty("channel") ? typeof inp.channel : undefined
}, },
password: { password: {
expected: "password", expected: "password",
got: inp.hasOwnProperty("password") ? typeof(inp.password) : undefined, got: inp.hasOwnProperty("password") ? typeof inp.password : undefined
}, }
}; };
socket.emit('update_required', result); socket.emit("update_required", result);
return; return;
} }
pw = inp.password; pw = inp.password;
try { try {
coll = inp.channel; coll = inp.channel;
if(coll.length == 0) return; if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase(); coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, ""); //coll = coll.replace(/_/g, "");
//coll = filter.clean(coll); //coll = filter.clean(coll);
} catch(e) { } catch (e) {
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
uncrypted = pw; uncrypted = pw;
pw = Functions.hash_pass(Functions.decrypt_string(pw), true); pw = Functions.hash_pass(Functions.decrypt_string(pw), true);
Functions.check_inlist(coll, guid, socket, offline, undefined, "place 8"); Functions.check_inlist(coll, guid, socket, offline, undefined, "place 8");
Functions.getSessionAdminUser(sessionId, coll, function(userpass, adminpass) { Functions.getSessionAdminUser(sessionId, coll, function(
userpass,
adminpass
) {
adminpass = Functions.hash_pass(adminpass); adminpass = Functions.hash_pass(adminpass);
db.collection(coll + "_settings").find(function(err, docs){ db.collection(coll + "_settings").find(function(err, docs) {
if(docs !== null && docs.length !== 0) if (docs !== null && docs.length !== 0) {
{ if (
if(docs[0].adminpass === "" || docs[0].adminpass == Functions.hash_pass(pw)) docs[0].adminpass === "" ||
{ docs[0].adminpass == Functions.hash_pass(pw)
Functions.setSessionAdminPass(sessionId, inp.password, coll, function() { ) {
db.collection(coll + "_settings").update({ id: "config" }, {$set:{adminpass:Functions.hash_pass(pw)}}, function(err, docs){ Functions.setSessionAdminPass(
if(adminpass != pw && adminpass != "") { sessionId,
inp.password,
coll,
function() {
db.collection(coll + "_settings").update(
{ id: "config" },
{ $set: { adminpass: Functions.hash_pass(pw) } },
function(err, docs) {
if (adminpass != pw && adminpass != "") {
socket.emit("toast", "changedpass"); socket.emit("toast", "changedpass");
} else { } else {
socket.emit("toast", "correctpass"); socket.emit("toast", "correctpass");
} }
socket.emit("pw", true); socket.emit("pw", true);
}); }
}); );
} else if(docs[0].adminpass === "" || docs[0].adminpass == adminpass) { }
Functions.setSessionAdminPass(sessionId, inp.password, coll, function() { );
db.collection(coll + "_settings").update({ id: "config" }, {$set:{adminpass:Functions.hash_pass(pw)}}, function(err, docs){ } else if (
if(adminpass != pw) { docs[0].adminpass === "" ||
docs[0].adminpass == adminpass
) {
Functions.setSessionAdminPass(
sessionId,
inp.password,
coll,
function() {
db.collection(coll + "_settings").update(
{ id: "config" },
{ $set: { adminpass: Functions.hash_pass(pw) } },
function(err, docs) {
if (adminpass != pw) {
socket.emit("toast", "changedpass"); socket.emit("toast", "changedpass");
} }
socket.emit("pw", true); socket.emit("pw", true);
}); }
}); );
}
);
} else { } else {
Functions.setSessionAdminPass(Functions.getSession(socket), "", coll, function() { Functions.setSessionAdminPass(
Functions.getSession(socket),
"",
coll,
function() {
socket.emit("toast", "wrongpass"); socket.emit("toast", "wrongpass");
socket.emit("pw", false); socket.emit("pw", false);
}); }
);
} }
} }
}); });
@@ -84,88 +117,119 @@ function password(inp, coll, guid, offline, socket) {
var result = { var result = {
inp: { inp: {
expected: "string", expected: "string",
got: typeof(inpt) got: typeof inpt
}, }
}; };
socket.emit('update_required', result); socket.emit("update_required", result);
} }
} }
function conf_function(params, coll, guid, offline, socket) { function conf_function(params, coll, guid, offline, socket) {
if(params !== undefined && params !== null && params !== "") if (params !== undefined && params !== null && params !== "") {
{ if (coll !== undefined) {
if(coll !== undefined) {
try { try {
coll = params.channel;//.replace(/ /g,''); coll = params.channel; //.replace(/ /g,'');
if(coll.length == 0) return; if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase(); coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, ""); //coll = coll.replace(/_/g, "");
//coll = filter.clean(coll); //coll = filter.clean(coll);
} catch(e) { } catch (e) {
return; return;
} }
} }
if(coll == "" || coll == undefined || coll == null) { if (coll == "" || coll == undefined || coll == null) {
socket.emit("update_required"); socket.emit("update_required");
return; return;
} }
Functions.check_inlist(coll, guid, socket, offline, undefined, "place 9"); Functions.check_inlist(coll, guid, socket, offline, undefined, "place 9");
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(userpass, adminpass, gotten) { Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
if(gotten) { userpass,
adminpass,
gotten
) {
if (gotten) {
params.adminpass = adminpass; params.adminpass = adminpass;
if(!params.userpass_changed) params.userpass = userpass; if (!params.userpass_changed) params.userpass = userpass;
} }
if(!params.hasOwnProperty('voting') || !params.hasOwnProperty('addsongs') || if (
!params.hasOwnProperty('longsongs') || !params.hasOwnProperty('frontpage') || !params.hasOwnProperty("voting") ||
!params.hasOwnProperty('allvideos') || !params.hasOwnProperty('removeplay') || !params.hasOwnProperty("addsongs") ||
!params.hasOwnProperty('adminpass') || !params.hasOwnProperty('skipping') || !params.hasOwnProperty("longsongs") ||
!params.hasOwnProperty('shuffling') || !params.hasOwnProperty('channel') || !params.hasOwnProperty("frontpage") ||
typeof(params.userpass) != "string" || typeof(params.adminpass) != "string" || !params.hasOwnProperty("allvideos") ||
typeof(params.voting) != "boolean" || typeof(params.addsongs) != "boolean" || !params.hasOwnProperty("removeplay") ||
typeof(params.longsongs) != "boolean" || typeof(params.frontpage) != "boolean" || !params.hasOwnProperty("adminpass") ||
typeof(params.allvideos) != "boolean" || typeof(params.removeplay) != "boolean" || !params.hasOwnProperty("skipping") ||
typeof(params.skipping) != "boolean" || typeof(params.shuffling) != "boolean" || !params.hasOwnProperty("shuffling") ||
typeof(params.userpass_changed) != "boolean") { !params.hasOwnProperty("channel") ||
typeof params.userpass != "string" ||
typeof params.adminpass != "string" ||
typeof params.voting != "boolean" ||
typeof params.addsongs != "boolean" ||
typeof params.longsongs != "boolean" ||
typeof params.frontpage != "boolean" ||
typeof params.allvideos != "boolean" ||
typeof params.removeplay != "boolean" ||
typeof params.skipping != "boolean" ||
typeof params.shuffling != "boolean" ||
typeof params.userpass_changed != "boolean"
) {
var result = { var result = {
adminpass: { adminpass: {
expected: "string", expected: "string",
got: params.hasOwnProperty("adminpass") ? typeof(params.adminpass) : undefined, got: params.hasOwnProperty("adminpass")
? typeof params.adminpass
: undefined
}, },
userpass: { userpass: {
expected: "string", expected: "string",
got: params.hasOwnProperty("userpass") ? typeof(params.userpass) : undefined, got: params.hasOwnProperty("userpass")
? typeof params.userpass
: undefined
}, },
vote: { vote: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("vote") ? typeof(params.vote) : undefined, got: params.hasOwnProperty("vote") ? typeof params.vote : undefined
}, },
addsongs: { addsongs: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("addsongs") ? typeof(params.addsongs) : undefined, got: params.hasOwnProperty("addsongs")
? typeof params.addsongs
: undefined
}, },
longsongs: { longsongs: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("longsongs") ? typeof(params.longsongs) : undefined, got: params.hasOwnProperty("longsongs")
? typeof params.longsongs
: undefined
}, },
frontpage: { frontpage: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("frontpage") ? typeof(params.frontpage) : undefined, got: params.hasOwnProperty("frontpage")
? typeof params.frontpage
: undefined
}, },
skipping: { skipping: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("skipping") ? typeof(params.skipping) : undefined, got: params.hasOwnProperty("skipping")
? typeof params.skipping
: undefined
}, },
shuffling: { shuffling: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("shuffling") ? typeof(params.shuffling) : undefined, got: params.hasOwnProperty("shuffling")
? typeof params.shuffling
: undefined
}, },
userpass_changed: { userpass_changed: {
expected: "boolean", expected: "boolean",
got: params.hasOwnProperty("userpass_changed") ? typeof(params.userpass_changed) : undefined, got: params.hasOwnProperty("userpass_changed")
? typeof params.userpass_changed
: undefined
} }
}; };
socket.emit("update_required", result); socket.emit("update_required", result);
@@ -183,85 +247,137 @@ function conf_function(params, coll, guid, offline, socket) {
var userpass = Functions.decrypt_string(params.userpass); var userpass = Functions.decrypt_string(params.userpass);
if((!params.userpass_changed && frontpage) || (params.userpass_changed && userpass == "")) { if (
(!params.userpass_changed && frontpage) ||
(params.userpass_changed && userpass == "")
) {
userpass = ""; userpass = "";
} else if(params.userpass_changed && userpass != "") { } else if (params.userpass_changed && userpass != "") {
frontpage = false; frontpage = false;
} }
var description = ""; var description = "";
var hash; var hash;
if(params.description) description = params.description; if (params.description) description = params.description;
if(adminpass !== "" && !gotten) { if (adminpass !== "" && !gotten) {
hash = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(adminpass), true)); hash = Functions.hash_pass(
} else if(adminpass !== "" && gotten) { Functions.hash_pass(Functions.decrypt_string(adminpass), true)
);
} else if (adminpass !== "" && gotten) {
hash = Functions.hash_pass(adminpass); hash = Functions.hash_pass(adminpass);
} else { } else {
hash = adminpass; hash = adminpass;
} }
if(userpass != "") { if (userpass != "") {
if(!params.userpass_changed && gotten) { if (!params.userpass_changed && gotten) {
} else { } else {
userpass = crypto.createHash('sha256').update(userpass).digest("base64"); userpass = crypto
.createHash("sha256")
.update(userpass)
.digest("base64");
} }
} }
db.collection(coll + "_settings").find({id: "config"}, function(err, docs){ db.collection(coll + "_settings").find({ id: "config" }, function(
if(docs !== null && docs.length !== 0 && (docs[0].adminpass === "" || docs[0].adminpass == hash)) { err,
docs
) {
if (
docs !== null &&
docs.length !== 0 &&
(docs[0].adminpass === "" || docs[0].adminpass == hash)
) {
var obj = { var obj = {
addsongs:addsongs, addsongs: addsongs,
allvideos:allvideos, allvideos: allvideos,
frontpage:frontpage, frontpage: frontpage,
skip:skipping, skip: skipping,
vote:voting, vote: voting,
removeplay:removeplay, removeplay: removeplay,
shuffle:shuffling, shuffle: shuffling,
longsongs:longsongs, longsongs: longsongs,
adminpass:hash, adminpass: hash,
desc: description, desc: description
}; };
if(params.hasOwnProperty("toggleChat") && docs[0].adminpass != "" && docs[0].adminpass != undefined && docs[0].adminpass == hash) { if (
params.hasOwnProperty("toggleChat") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
obj.toggleChat = params.toggleChat; obj.toggleChat = params.toggleChat;
} }
if(params.hasOwnProperty("strictSkip") && docs[0].adminpass != "" && docs[0].adminpass != undefined && docs[0].adminpass == hash) { if (
params.hasOwnProperty("strictSkip") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
obj.strictSkip = params.strictSkip; obj.strictSkip = params.strictSkip;
} }
if(params.hasOwnProperty("strictSkipNumber") && docs[0].adminpass != "" && docs[0].adminpass != undefined && docs[0].adminpass == hash) { if (
params.hasOwnProperty("strictSkipNumber") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
try { try {
obj.strictSkipNumber = parseInt(params.strictSkipNumber); obj.strictSkipNumber = parseInt(params.strictSkipNumber);
} catch(e) {} } catch (e) {}
} }
if(params.userpass_changed) { if (params.userpass_changed) {
obj["userpass"] = userpass; obj["userpass"] = userpass;
} else if (frontpage) { } else if (frontpage) {
obj["userpass"] = ""; obj["userpass"] = "";
} }
db.collection(coll + "_settings").update({ id: "config" }, { db.collection(coll + "_settings").update(
$set:obj { id: "config" },
}, function(err, docs){
Functions.setSessionUserPass(Functions.getSession(socket), obj["userpass"], coll, function() {
db.collection(coll + "_settings").aggregate([
{ {
"$match": { $set: obj
},
function(err, docs) {
Functions.setSessionUserPass(
Functions.getSession(socket),
obj["userpass"],
coll,
function() {
db.collection(coll + "_settings").aggregate(
[
{
$match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs){ ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
io.to(coll).emit("conf", docs); io.to(coll).emit("conf", docs);
socket.emit("toast", "savedsettings"); socket.emit("toast", "savedsettings");
db.collection("frontpage_lists").update({_id: coll}, {$set:{ db.collection("frontpage_lists").update(
frontpage:frontpage, accessed: Functions.get_time()} { _id: coll },
{
$set: {
frontpage: frontpage,
accessed: Functions.get_time()
}
}, },
{upsert:true}, function(err, docs){}); { upsert: true },
}); function(err, docs) {}
}); );
}); }
);
}
);
}
);
} else { } else {
socket.emit("toast", "wrongpass"); socket.emit("toast", "wrongpass");
} }
@@ -271,12 +387,11 @@ function conf_function(params, coll, guid, offline, socket) {
var result = { var result = {
params: { params: {
expected: "object", expected: "object",
got: typeof(params), got: typeof params
} }
};
socket.emit("update_required", result);
} }
socket.emit('update_required', result);
}
} }
module.exports.password = password; module.exports.password = password;

View File

@@ -1,10 +1,10 @@
var path = require('path'); var path = require("path");
function requested_change(type, string, channel) { function requested_change(type, string, channel) {
try { try {
//channel = channel.replace(/ /g,''); //channel = channel.replace(/ /g,'');
var nodemailer = require('nodemailer'); var nodemailer = require("nodemailer");
var mailconfig = require(path.join(__dirname, '../config/mailconfig.js')); var mailconfig = require(path.join(__dirname, "../config/mailconfig.js"));
let transporter = nodemailer.createTransport(mailconfig); let transporter = nodemailer.createTransport(mailconfig);
@@ -12,15 +12,22 @@ function requested_change(type, string, channel) {
if (error) { if (error) {
return; return;
} else { } else {
var message = "A " + type + " change was requested on <b>" + channel + "</b><br><br>New supposed value is: <br><br><b>" + string + "</b><br><br><br> \ var message =
"A " +
type +
" change was requested on <b>" +
channel +
"</b><br><br>New supposed value is: <br><br><b>" +
string +
"</b><br><br><br> \
Go to <a href='https://admin.zoff.me/'>https://admin.zoff.me/</a> to accept or decline the request."; Go to <a href='https://admin.zoff.me/'>https://admin.zoff.me/</a> to accept or decline the request.";
var msg = { var msg = {
from: mailconfig.from, from: mailconfig.from,
to: mailconfig.notify_mail, to: mailconfig.notify_mail,
subject: 'ZOFF: Requested new ' + type, subject: "ZOFF: Requested new " + type,
text: message, text: message,
html: message, html: message
} };
transporter.sendMail(msg, (error, info) => { transporter.sendMail(msg, (error, info) => {
if (error) { if (error) {
transporter.close(); transporter.close();
@@ -30,9 +37,11 @@ function requested_change(type, string, channel) {
}); });
} }
}); });
} catch(e) { } catch (e) {
console.log("Mail is not configured and wont work"); console.log("Mail is not configured and wont work");
console.log("Seems you forgot to create a mailconfig.js in /server/config/. Have a look at the mailconfig.example.js."); console.log(
"Seems you forgot to create a mailconfig.js in /server/config/. Have a look at the mailconfig.example.js."
);
} }
} }

View File

@@ -1,139 +1,180 @@
var path = require('path'); var path = require("path");
var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/; var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/;
try { try {
var keys = require(path.join(__dirname, '../config/api_key.js')); var keys = require(path.join(__dirname, "../config/api_key.js"));
var key = keys.youtube; var key = keys.youtube;
var soundcloudKey = keys.soundcloud; var soundcloudKey = keys.soundcloud;
} catch(e) { } catch (e) {
console.log("Error - missing file"); console.log(
console.log("Seems you forgot to create the file api_key.js in /server/config/. Have a look at api_key.example.js."); "(!) Missing file - /config/api_key.js Have a look at /config/api_key.example.js. The server won't run without this existing."
);
process.exit(1); process.exit(1);
} }
var request = require('request'); var request = require("request");
var db = require(pathThumbnails + '/handlers/db.js'); var db = require(pathThumbnails + "/handlers/db.js");
var countryCodes = ["US", "NO", "SE", "DK", "CA", "EU", "UK"]; var countryCodes = ["US", "NO", "SE", "DK", "CA", "EU", "UK"];
function check_if_error_or_blocked(id, channel, errored, callback) { function check_if_error_or_blocked(id, channel, errored, callback) {
if(!errored) { if (!errored) {
callback(false); callback(false);
return; return;
} }
db.collection(channel).find({id: id, now_playing: true}, function(err, song) { db.collection(channel).find({ id: id, now_playing: true }, function(
if(song.length == 0) { err,
song
) {
if (song.length == 0) {
callback(false); callback(false);
return; return;
} }
var song_info = song[0]; var song_info = song[0];
if(song_info.source != "soundcloud") { if (song_info.source != "soundcloud") {
request({ request(
{
type: "GET", type: "GET",
url: "https://www.googleapis.com/youtube/v3/videos?part=id,status,contentDetails&key="+key+"&id=" + song_info.id, url:
}, function(error, response, body) { "https://www.googleapis.com/youtube/v3/videos?part=id,status,contentDetails&key=" +
key +
"&id=" +
song_info.id
},
function(error, response, body) {
try { try {
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(resp.pageInfo.totalResults == 0) { if (resp.pageInfo.totalResults == 0) {
callback(true); callback(true);
return; return;
} else if(!resp.items[0].status.embeddable) { } else if (!resp.items[0].status.embeddable) {
callback(true); callback(true);
return; return;
} else if(resp.items[0].contentDetails.hasOwnProperty("licensedContent") && } else if (
resp.items[0].contentDetails.licensedContent) { resp.items[0].contentDetails.hasOwnProperty("licensedContent") &&
resp.items[0].contentDetails.licensedContent
) {
callback(true); callback(true);
return; return;
} else if(resp.items[0].contentDetails.hasOwnProperty("regionRestriction") && } else if (
resp.items[0].contentDetails.regionRestriction.hasOwnProperty("blocked") && resp.items[0].contentDetails.hasOwnProperty(
resp.items[0].contentDetails.regionRestriction.blocked.length > 0) { "regionRestriction"
var any = resp.items[0].contentDetails.blocked.some(function(element) { ) &&
resp.items[0].contentDetails.regionRestriction.hasOwnProperty(
"blocked"
) &&
resp.items[0].contentDetails.regionRestriction.blocked.length > 0
) {
var any = resp.items[0].contentDetails.blocked.some(function(
element
) {
return countryCodes.indexOf(element) > -1; return countryCodes.indexOf(element) > -1;
}); });
if(any) { if (any) {
callback(true); callback(true);
return; return;
} }
} }
callback(false); callback(false);
return; return;
} catch(e){ } catch (e) {
callback(true); callback(true);
return; return;
} }
}); }
);
} else { } else {
request({ request(
{
type: "GET", type: "GET",
url: "http://api.soundcloud.com/tracks/" + song_info.id + "?client_id=" + soundcloudKey, url:
}, function(error, response, body) { "http://api.soundcloud.com/tracks/" +
song_info.id +
"?client_id=" +
soundcloudKey
},
function(error, response, body) {
try { try {
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(resp.sharing != "public" || resp.embeddable_by != "all") { if (resp.sharing != "public" || resp.embeddable_by != "all") {
callback(true); callback(true);
return; return;
} }
callback(false); callback(false);
return; return;
} catch(e){ } catch (e) {
callback(true); callback(true);
return; return;
} }
}); }
);
} }
}); });
} }
function filterFunction(el) { function filterFunction(el) {
return el != null && return el != null && el != "" && el != undefined && el.trim() != "";
el != "" &&
el != undefined &&
el.trim() != ''
} }
function get_genres_soundcloud(song, channel) { function get_genres_soundcloud(song, channel) {
request("http://api.soundcloud.com/tracks/" + song.id + "?client_id=" + soundcloudKey, function(err, response, body) { request(
if(err) { "http://api.soundcloud.com/tracks/" +
song.id +
"?client_id=" +
soundcloudKey,
function(err, response, body) {
if (err) {
console.log("error start", err, song, "error end"); console.log("error start", err, song, "error end");
return; return;
} }
try { try {
var object = JSON.parse(body); var object = JSON.parse(body);
if(!object.hasOwnProperty("genre") || !object.hasOwnProperty("tag_list")) return; if (
!object.hasOwnProperty("genre") ||
!object.hasOwnProperty("tag_list")
)
return;
var genre = object.genre + ","; var genre = object.genre + ",";
genre = genre.toLowerCase().split(",").concat(object.tag_list.toLowerCase().split('"')); genre = genre
.toLowerCase()
.split(",")
.concat(object.tag_list.toLowerCase().split('"'));
genre = genre.filter(filterFunction); genre = genre.filter(filterFunction);
db.collection(channel).update({"id": song.id}, { db.collection(channel).update(
{ id: song.id },
{
$set: { $set: {
"tags": genre tags: genre
} }
}, function(e,d) { },
function(e, d) {}
}); );
} catch(e) { } catch (e) {
console.log("errored 2", e); console.log("errored 2", e);
} }
}); }
);
} }
function get_genres_list(list, channel) { function get_genres_list(list, channel) {
var youtube_array = ""; var youtube_array = "";
var i = 0; var i = 0;
try { try {
for(var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
if (!list[i].hasOwnProperty("id")) continue;
if(!list[i].hasOwnProperty("id")) continue; if (list[i].source == undefined || list[i].source == "youtube") {
if(list[i].source == undefined || list[i].source == "youtube") {
youtube_array += list[i].id + ","; youtube_array += list[i].id + ",";
} } else if (
else if(list[i].source != undefined && list[i].source == "soundcloud") { list[i].source != undefined &&
list[i].source == "soundcloud"
) {
get_genres_soundcloud(list[i], channel); get_genres_soundcloud(list[i], channel);
} }
} }
if(youtube_array.length > 0) { if (youtube_array.length > 0) {
if(youtube_array > 49) { if (youtube_array > 49) {
var subList = []; var subList = [];
for(var i = 0; i < youtube_array.length; i++) { for (var i = 0; i < youtube_array.length; i++) {
subList.push(youtube_array[i]); subList.push(youtube_array[i]);
if(subList.length > 49) { if (subList.length > 49) {
get_genres_youtube(subList.join(","), channel); get_genres_youtube(subList.join(","), channel);
subList = []; subList = [];
} }
@@ -144,306 +185,419 @@ function get_genres_list(list, channel) {
get_genres_youtube(youtube_array, channel); get_genres_youtube(youtube_array, channel);
} }
} }
} catch(e) { } catch (e) {
console.log("errored", e); console.log("errored", e);
return; return;
} }
} }
function start_soundcloud_get(arr, channel, callback) { function start_soundcloud_get(arr, channel, callback) {
get_genres_soundcloud_recursive(arr, channel, 0, callback); get_genres_soundcloud_recursive(arr, channel, 0, callback);
} }
function get_genres_soundcloud_recursive(arr, channel, i, callback) { function get_genres_soundcloud_recursive(arr, channel, i, callback) {
if(i >= arr.length) { if (i >= arr.length) {
if(typeof(callback) == "function") callback(); if (typeof callback == "function") callback();
return; return;
} }
var song = arr[i]; var song = arr[i];
request("http://api.soundcloud.com/tracks/" + song.id + "?client_id=" + soundcloudKey, function(err, response, body) { request(
if(err) { "http://api.soundcloud.com/tracks/" +
song.id +
"?client_id=" +
soundcloudKey,
function(err, response, body) {
if (err) {
console.log("error start", err, song, "error end"); console.log("error start", err, song, "error end");
get_genres_soundcloud_recursive(arr, channel, i + 1, callback); get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
return; return;
} }
try { try {
var object = JSON.parse(body); var object = JSON.parse(body);
if(!object.hasOwnProperty("genre") || !object.hasOwnProperty("tag_list")) { if (
!object.hasOwnProperty("genre") ||
!object.hasOwnProperty("tag_list")
) {
get_genres_soundcloud_recursive(arr, channel, i + 1, callback); get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
return; return;
} }
var genre = object.genre + ","; var genre = object.genre + ",";
genre = genre.toLowerCase().split(",").concat(object.tag_list.toLowerCase().split('"')); genre = genre
.toLowerCase()
.split(",")
.concat(object.tag_list.toLowerCase().split('"'));
genre = genre.filter(filterFunction); genre = genre.filter(filterFunction);
db.collection(channel).update({"id": song.id}, { db.collection(channel).update(
{ id: song.id },
{
$set: { $set: {
"tags": genre tags: genre
} }
}, function(e,d) { },
function(e, d) {
get_genres_soundcloud_recursive(arr, channel, i + 1, callback); get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
}); }
} catch(e) { );
} catch (e) {
console.log("errored 2", e); console.log("errored 2", e);
get_genres_soundcloud_recursive(arr, channel, i + 1, callback); get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
} }
}); }
);
} }
function get_genres_list_recursive(list, channel, callback) { function get_genres_list_recursive(list, channel, callback) {
var youtube_array = []; var youtube_array = [];
var soundcloud_array = []; var soundcloud_array = [];
for(var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
if(!list[i].hasOwnProperty("id")) continue; if (!list[i].hasOwnProperty("id")) continue;
if(list[i].source == undefined || list[i].source == "youtube") { if (list[i].source == undefined || list[i].source == "youtube") {
youtube_array.push(list[i]); youtube_array.push(list[i]);
} } else if (list[i].source != undefined && list[i].source == "soundcloud") {
else if(list[i].source != undefined && list[i].source == "soundcloud") {
soundcloud_array.push(list[i]); soundcloud_array.push(list[i]);
} }
} }
start_youtube_get(youtube_array, channel, function() { start_youtube_get(youtube_array, channel, function() {
start_soundcloud_get(soundcloud_array, channel, function() { start_soundcloud_get(soundcloud_array, channel, function() {
if(typeof(callback) == "function") callback(); if (typeof callback == "function") callback();
}) });
}) });
} }
function start_youtube_get(arr, channel, callback) { function start_youtube_get(arr, channel, callback) {
get_genres_youtube_recursive(arr, channel, 0, callback) get_genres_youtube_recursive(arr, channel, 0, callback);
} }
function get_genres_youtube_recursive(arr, channel, i, callback) { function get_genres_youtube_recursive(arr, channel, i, callback) {
if(i >= arr.length) { if (i >= arr.length) {
if(typeof(callback) == "function") callback(); if (typeof callback == "function") callback();
return; return;
} }
var ids = []; var ids = [];
for(var y = i; y < arr.length; y++) { for (var y = i; y < arr.length; y++) {
if(ids.length >= 48) { if (ids.length >= 48) {
break; break;
} }
ids.push(arr[y].id); ids.push(arr[y].id);
} }
request({ request(
{
type: "GET", type: "GET",
url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + ids.join(","), url:
}, function(error, response, body) { "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
if(error) { key +
"&id=" +
ids.join(",")
},
function(error, response, body) {
if (error) {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback); get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
return; return;
} }
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(!resp.hasOwnProperty("items")) { if (!resp.hasOwnProperty("items")) {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback); get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
return; return;
} }
if(resp.items.length > 0) { if (resp.items.length > 0) {
for(var z = 0; z < resp.items.length; z++) { for (var z = 0; z < resp.items.length; z++) {
if(!resp.items[z].hasOwnProperty("topicDetails")) continue; if (!resp.items[z].hasOwnProperty("topicDetails")) continue;
var genre = resp.items[z].topicDetails.topicCategories; var genre = resp.items[z].topicDetails.topicCategories;
genre = genre.join(","); genre = genre.join(",");
genre = genre.replace(new RegExp("https://en.wikipedia.org/wiki/", "g"), ""); genre = genre.replace(
genre = genre.replace(/_/g, " ").toLowerCase().split(","); new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction); genre = genre.filter(filterFunction);
//console.log(resp.items[i].id + " - ", genre); //console.log(resp.items[i].id + " - ", genre);
db.collection(channel).update({"id": resp.items[z].id}, { db.collection(channel).update(
{ id: resp.items[z].id },
{
$set: { $set: {
"tags": genre tags: genre
} }
}, function(e, d) { },
}); function(e, d) {}
);
} }
get_genres_youtube_recursive(arr, channel, i + ids.length, callback); get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
} else { } else {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback); get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
} }
}); }
);
} }
function get_genres_youtube(ids, channel) { function get_genres_youtube(ids, channel) {
request({ request(
{
type: "GET", type: "GET",
url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + ids, url:
}, function(error, response, body) { "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
if(error) { key +
"&id=" +
ids
},
function(error, response, body) {
if (error) {
return; return;
} }
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(!resp.hasOwnProperty("items")) { if (!resp.hasOwnProperty("items")) {
return; return;
} }
if(resp.items.length > 0) { if (resp.items.length > 0) {
for(var i = 0; i < resp.items.length; i++) { for (var i = 0; i < resp.items.length; i++) {
if(!resp.items[i].hasOwnProperty("topicDetails")) continue; if (!resp.items[i].hasOwnProperty("topicDetails")) continue;
var genre = resp.items[i].topicDetails.topicCategories; var genre = resp.items[i].topicDetails.topicCategories;
genre = genre.join(","); genre = genre.join(",");
genre = genre.replace(new RegExp("https://en.wikipedia.org/wiki/", "g"), ""); genre = genre.replace(
genre = genre.replace(/_/g, " ").toLowerCase().split(","); new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction); genre = genre.filter(filterFunction);
//console.log(resp.items[i].id + " - ", genre); //console.log(resp.items[i].id + " - ", genre);
db.collection(channel).update({"id": resp.items[i].id}, { db.collection(channel).update(
{ id: resp.items[i].id },
{
$set: { $set: {
"tags": genre tags: genre
} }
}, function(e, d) {}); },
function(e, d) {}
);
} }
} }
}); }
);
} }
function get_correct_info(song_generated, channel, broadcast, callback) { function get_correct_info(song_generated, channel, broadcast, callback) {
//channel = channel.replace(/ /g,''); //channel = channel.replace(/ /g,'');
request({ request(
{
type: "GET", type: "GET",
url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + song_generated.id, url:
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
}, function(error, response, body) { key +
"&id=" +
song_generated.id
},
function(error, response, body) {
try { try {
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(resp.items.length == 1) { if (resp.items.length == 1) {
var duration = parseInt(durationToSeconds(resp.items[0].contentDetails.duration)); var duration = parseInt(
durationToSeconds(resp.items[0].contentDetails.duration)
);
var title = resp.items[0].snippet.localized.title; var title = resp.items[0].snippet.localized.title;
var genre = resp.items[0].topicDetails.topicCategories; var genre = resp.items[0].topicDetails.topicCategories;
genre = genre.join(","); genre = genre.join(",");
genre = genre.replace(new RegExp("https://en.wikipedia.org/wiki/", "g"), ""); genre = genre.replace(
genre = genre.replace(/_/g, " ").toLowerCase().split(","); new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction); genre = genre.filter(filterFunction);
//console.log(genre + " - ", song_generated.id); //console.log(genre + " - ", song_generated.id);
if(title != song_generated.title || duration < parseInt(song_generated.duration)) { if (
if(title != song_generated.title) { title != song_generated.title ||
duration < parseInt(song_generated.duration)
) {
if (title != song_generated.title) {
song_generated.title = title; song_generated.title = title;
} }
if(duration < parseInt(song_generated.duration)) { if (duration < parseInt(song_generated.duration)) {
song_generated.duration = duration; song_generated.duration = duration;
song_generated.start = 0; song_generated.start = 0;
song_generated.end = duration; song_generated.end = duration;
} }
db.collection(channel).update({"id": song_generated.id}, { db.collection(channel).update(
{ id: song_generated.id },
{
$set: { $set: {
"duration": song_generated.duration, duration: song_generated.duration,
"start": song_generated.start, start: song_generated.start,
"end": song_generated.end, end: song_generated.end,
"title": song_generated.title, title: song_generated.title,
"tags": genre tags: genre
} }
}, function(err, docs) { },
if(broadcast && docs.nModified == 1) { function(err, docs) {
if (broadcast && docs.nModified == 1) {
song_generated.new_id = song_generated.id; song_generated.new_id = song_generated.id;
//if(song_generated.type == "video") //if(song_generated.type == "video")
if(typeof(callback) == "function") { if (typeof callback == "function") {
callback(song_generated, true); callback(song_generated, true);
} else { } else {
io.to(channel).emit("channel", {type: "changed_values", value: song_generated}); io.to(channel).emit("channel", {
} type: "changed_values",
} else { value: song_generated
if(typeof(callback) == "function") {
callback(song_generated, true);
}
}
}); });
}
} else { } else {
db.collection(channel).update({"id": song_generated.id}, { if (typeof callback == "function") {
callback(song_generated, true);
}
}
}
);
} else {
db.collection(channel).update(
{ id: song_generated.id },
{
$set: { $set: {
"tags": genre tags: genre
} }
}, function(e,d) { },
if(typeof(callback) == "function") { function(e, d) {
if (typeof callback == "function") {
callback(song_generated, true); callback(song_generated, true);
} }
}); }
);
} }
} else { } else {
findSimilar(song_generated, channel, broadcast, callback) findSimilar(song_generated, channel, broadcast, callback);
} }
} catch(e){ } catch (e) {
if(typeof(callback) == "function") { if (typeof callback == "function") {
callback({}, false); callback({}, false);
} }
} }
}); }
);
} }
function check_error_video(msg, channel) { function check_error_video(msg, channel) {
if(!msg.hasOwnProperty("id") || !msg.hasOwnProperty("title") || if (
typeof(msg.id) != "string" || typeof(msg.title) != "string") { !msg.hasOwnProperty("id") ||
!msg.hasOwnProperty("title") ||
typeof msg.id != "string" ||
typeof msg.title != "string"
) {
var result = { var result = {
id: { id: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("id") ? typeof(msg.id) : undefined, got: msg.hasOwnProperty("id") ? typeof msg.id : undefined
}, },
title: { title: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("title") ? typeof(msg.title) : undefined, got: msg.hasOwnProperty("title") ? typeof msg.title : undefined
}, }
}; };
return; return;
} }
if(msg.source == "soundcloud") return; if (msg.source == "soundcloud") return;
//channel = channel.replace(/ /g,''); //channel = channel.replace(/ /g,'');
request({ request(
{
type: "GET", type: "GET",
url: "https://www.googleapis.com/youtube/v3/videos?part=id&key="+key+"&id=" + msg.id, url:
"https://www.googleapis.com/youtube/v3/videos?part=id&key=" +
}, function(error, response, body) { key +
"&id=" +
msg.id
},
function(error, response, body) {
try { try {
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(resp.pageInfo.totalResults == 0) { if (resp.pageInfo.totalResults == 0) {
findSimilar(msg, channel, true, undefined); findSimilar(msg, channel, true, undefined);
} }
} catch(e){ } catch (e) {
console.log(msg.id, key, e, body); console.log(msg.id, key, e, body);
} }
}); }
);
} }
function findSimilar(msg, channel, broadcast, callback) { function findSimilar(msg, channel, broadcast, callback) {
//channel = channel.replace(/ /g,''); //channel = channel.replace(/ /g,'');
var yt_url = "https://www.googleapis.com/youtube/v3/search?key="+key+"&videoEmbeddable=true&part=id&type=video&order=viewCount&safeSearch=none&maxResults=5&q=" + encodeURIComponent(msg.title); var yt_url =
request({ "https://www.googleapis.com/youtube/v3/search?key=" +
key +
"&videoEmbeddable=true&part=id&type=video&order=viewCount&safeSearch=none&maxResults=5&q=" +
encodeURIComponent(msg.title);
request(
{
method: "GET", method: "GET",
url: yt_url, url: yt_url
}, function(error, response, body){ },
function(error, response, body) {
var resp = JSON.parse(body); var resp = JSON.parse(body);
if(resp.items.length > 0) { if (resp.items.length > 0) {
var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+key+"&id="; var vid_url =
for(var i = 0; i < resp.items.length; i++) { "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=" +
key +
"&id=";
for (var i = 0; i < resp.items.length; i++) {
vid_url += resp.items[i].id.videoId + ","; vid_url += resp.items[i].id.videoId + ",";
} }
request({ request(
{
type: "GET", type: "GET",
url: vid_url url: vid_url
}, function(error, response, body) { },
function(error, response, body) {
var resp = JSON.parse(body); var resp = JSON.parse(body);
var found = false; var found = false;
var element = {}; var element = {};
for(var i = 0; i < resp.items.length; i++) { for (var i = 0; i < resp.items.length; i++) {
if(similarity(resp.items[i].snippet.localized.title, msg.title) > 0.75) { if (
similarity(resp.items[i].snippet.localized.title, msg.title) >
0.75
) {
found = true; found = true;
element = { element = {
title: resp.items[i].snippet.localized.title, title: resp.items[i].snippet.localized.title,
duration: parseInt(durationToSeconds(resp.items[i].contentDetails.duration)), duration: parseInt(
durationToSeconds(resp.items[i].contentDetails.duration)
),
id: resp.items[i].id, id: resp.items[i].id,
start: 0, start: 0,
end: parseInt(durationToSeconds(resp.items[i].contentDetails.duration)), end: parseInt(
} durationToSeconds(resp.items[i].contentDetails.duration)
)
};
break; break;
} }
} }
if(found) { if (found) {
db.collection(channel).update({"id": msg.id}, { db.collection(channel).update(
{ id: msg.id },
{
$set: element $set: element
}, function(err, docs) { },
if(docs && docs.hasOwnProperty("nModified") && docs.nModified == 1 && broadcast) { function(err, docs) {
if (
docs &&
docs.hasOwnProperty("nModified") &&
docs.nModified == 1 &&
broadcast
) {
element.new_id = element.id; element.new_id = element.id;
element.id = msg.id; element.id = msg.id;
if(!callback) { if (!callback) {
io.to(channel).emit("channel", {type: "changed_values", value: element}); io.to(channel).emit("channel", {
type: "changed_values",
value: element
});
} }
} }
if(typeof(callback) == "function") { if (typeof callback == "function") {
msg.title = element.title; msg.title = element.title;
msg.id = element.id; msg.id = element.id;
msg.duration = element.duration; msg.duration = element.duration;
@@ -451,13 +605,16 @@ function findSimilar(msg, channel, broadcast, callback) {
msg.end = element.end; msg.end = element.end;
callback(msg, true); callback(msg, true);
} }
}); }
} else if(typeof(callback) == "function") { );
} else if (typeof callback == "function") {
callback({}, false); callback({}, false);
} }
});
} }
}); );
}
}
);
} }
function similarity(s1, s2) { function similarity(s1, s2) {
@@ -471,7 +628,9 @@ function similarity(s1, s2) {
if (longerLength == 0) { if (longerLength == 0) {
return 1.0; return 1.0;
} }
return (longerLength - editDistance(longer, shorter)) / parseFloat(longerLength); return (
(longerLength - editDistance(longer, shorter)) / parseFloat(longerLength)
);
} }
function editDistance(s1, s2) { function editDistance(s1, s2) {
@@ -482,31 +641,28 @@ function editDistance(s1, s2) {
for (var i = 0; i <= s1.length; i++) { for (var i = 0; i <= s1.length; i++) {
var lastValue = i; var lastValue = i;
for (var j = 0; j <= s2.length; j++) { for (var j = 0; j <= s2.length; j++) {
if (i == 0) if (i == 0) costs[j] = j;
costs[j] = j;
else { else {
if (j > 0) { if (j > 0) {
var newValue = costs[j - 1]; var newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1)) if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue), newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1;
costs[j]) + 1;
costs[j - 1] = lastValue; costs[j - 1] = lastValue;
lastValue = newValue; lastValue = newValue;
} }
} }
} }
if (i > 0) if (i > 0) costs[s2.length] = lastValue;
costs[s2.length] = lastValue;
} }
return costs[s2.length]; return costs[s2.length];
} }
function durationToSeconds(duration) { function durationToSeconds(duration) {
var matches = duration.match(time_regex); var matches = duration.match(time_regex);
hours= parseInt(matches[12])||0; hours = parseInt(matches[12]) || 0;
minutes= parseInt(matches[14])||0; minutes = parseInt(matches[14]) || 0;
seconds= parseInt(matches[16])||0; seconds = parseInt(matches[16]) || 0;
return hours*60*60+minutes*60+seconds; return hours * 60 * 60 + minutes * 60 + seconds;
} }
module.exports.check_if_error_or_blocked = check_if_error_or_blocked; module.exports.check_if_error_or_blocked = check_if_error_or_blocked;

View File

@@ -1,58 +1,97 @@
var Functions = require(pathThumbnails + '/handlers/functions.js'); var Functions = require(pathThumbnails + "/handlers/functions.js");
var Notifications = require(pathThumbnails + '/handlers/notifications.js'); var Notifications = require(pathThumbnails + "/handlers/notifications.js");
var crypto = require('crypto'); var crypto = require("crypto");
var db = require(pathThumbnails + '/handlers/db.js'); var db = require(pathThumbnails + "/handlers/db.js");
function thumbnail(msg, coll, guid, offline, socket) { function thumbnail(msg, coll, guid, offline, socket) {
if(msg.thumbnail != undefined && msg.channel && msg.channel != undefined && Functions.isUrl(msg.thumbnail)){ if (
if(typeof(msg.channel) != "string" || typeof(msg.thumbnail) != "string") msg.thumbnail != undefined &&
{ msg.channel &&
msg.channel != undefined &&
Functions.isUrl(msg.thumbnail)
) {
if (typeof msg.channel != "string" || typeof msg.thumbnail != "string") {
var result = { var result = {
channel: { channel: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("channel") ? typeof(msg.channel) : undefined, got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}, },
pass: { pass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("pass") ? typeof(msg.pass) : undefined, got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
}, },
thumbnail: { thumbnail: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("thumbnail") ? typeof(msg.thumbnail) : undefined, got: msg.hasOwnProperty("thumbnail")
? typeof msg.thumbnail
: undefined
}, },
adminpass: { adminpass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("adminpass") ? typeof(msg.adminpass) : undefined, got: msg.hasOwnProperty("adminpass")
}, ? typeof msg.adminpass
: undefined
}
}; };
socket.emit("update_required", result); socket.emit("update_required", result);
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(userpass, adminpass) { Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
if(userpass != "" || msg.pass == undefined) { userpass,
adminpass
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass; msg.pass = userpass;
} else if(msg.hasOwnProperty("pass")){ } else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64"); msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
} }
if(adminpass != "" || msg.adminpass == undefined) { if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass); msg.adminpass = Functions.hash_pass(adminpass);
} else { } else {
msg.adminpass = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(msg.adminpass),true)); msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
} }
if(msg.thumbnail != "") { if (msg.thumbnail != "") {
msg.thumbnail = msg.thumbnail.replace(/^https?\:\/\//i, ""); msg.thumbnail = msg.thumbnail.replace(/^https?\:\/\//i, "");
if(msg.thumbnail.substring(0,2) != "//") msg.thumbnail = "//" + msg.thumbnail; if (msg.thumbnail.substring(0, 2) != "//")
msg.thumbnail = "//" + msg.thumbnail;
} }
var channel = msg.channel.toLowerCase(); var channel = msg.channel.toLowerCase();
var hash = msg.adminpass; var hash = msg.adminpass;
db.collection(channel + "_settings").find({id: "config"}, function(err, docs){ db.collection(channel + "_settings").find({ id: "config" }, function(
if(docs.length > 0 && (docs[0].userpass == undefined || docs[0].userpass == "" || (msg.hasOwnProperty('pass') && docs[0].userpass == msg.pass))) { err,
if(docs !== null && docs.length !== 0 && docs[0].adminpass !== "" && docs[0].adminpass == hash){ docs
db.collection("suggested_thumbnails").update({channel: channel}, {$set:{thumbnail: msg.thumbnail}}, {upsert:true}, function(err, docs){ ) {
Notifications.requested_change("thumbnail", msg.thumbnail, channel); if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_thumbnails").update(
{ channel: channel },
{ $set: { thumbnail: msg.thumbnail } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change(
"thumbnail",
msg.thumbnail,
channel
);
socket.emit("toast", "suggested_thumbnail"); socket.emit("toast", "suggested_thumbnail");
}); }
);
} }
} else { } else {
socket.emit("auth_required"); socket.emit("auth_required");
@@ -65,50 +104,85 @@ function thumbnail(msg, coll, guid, offline, socket) {
} }
function description(msg, coll, guid, offline, socket) { function description(msg, coll, guid, offline, socket) {
if(msg.description && msg.channel && msg.description.length < 100){ if (msg.description && msg.channel && msg.description.length < 100) {
if(typeof(msg.channel) != "string" || typeof(msg.description) != "string") { if (typeof msg.channel != "string" || typeof msg.description != "string") {
var result = { var result = {
channel: { channel: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("channel") ? typeof(msg.channel) : undefined, got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}, },
pass: { pass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("pass") ? typeof(msg.pass) : undefined, got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
}, },
description: { description: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("description") ? typeof(msg.description) : undefined, got: msg.hasOwnProperty("description")
? typeof msg.description
: undefined
}, },
adminpass: { adminpass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("adminpass") ? typeof(msg.adminpass) : undefined, got: msg.hasOwnProperty("adminpass")
}, ? typeof msg.adminpass
: undefined
}
}; };
socket.emit("update_required", result); socket.emit("update_required", result);
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(userpass, adminpass, gotten) { Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
if(userpass != "" || msg.pass == undefined) { userpass,
adminpass,
gotten
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass; msg.pass = userpass;
} else if(msg.hasOwnProperty("pass")) { } else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64"); msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
} }
if(adminpass != "" || msg.adminpass == undefined) { if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass); msg.adminpass = Functions.hash_pass(adminpass);
} else { } else {
msg.adminpass = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)); msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
} }
var channel = msg.channel.toLowerCase(); var channel = msg.channel.toLowerCase();
var hash = msg.adminpass; var hash = msg.adminpass;
db.collection(channel + "_settings").find({id: "config"}, function(err, docs){ db.collection(channel + "_settings").find({ id: "config" }, function(
if(docs.length > 0 && (docs[0].userpass == undefined || docs[0].userpass == "" || (msg.hasOwnProperty('pass') && docs[0].userpass == msg.pass))) { err,
if(docs !== null && docs.length !== 0 && docs[0].adminpass !== "" && docs[0].adminpass == hash){ docs
db.collection("suggested_descriptions").update({channel: channel}, {$set:{description: msg.description}}, {upsert:true}, function(err, docs){ ) {
Notifications.requested_change("description", msg.description, channel); if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_descriptions").update(
{ channel: channel },
{ $set: { description: msg.description } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change(
"description",
msg.description,
channel
);
socket.emit("toast", "suggested_description"); socket.emit("toast", "suggested_description");
}); }
);
} }
} else { } else {
socket.emit("auth_required"); socket.emit("auth_required");
@@ -120,52 +194,80 @@ function description(msg, coll, guid, offline, socket) {
} }
} }
function rules(msg, coll, guid, offline, socket) { function rules(msg, coll, guid, offline, socket) {
if(msg.rules && msg.channel && msg.rules.length < 250){ if (msg.rules && msg.channel && msg.rules.length < 250) {
if(typeof(msg.channel) != "string" || typeof(msg.rules) != "string") { if (typeof msg.channel != "string" || typeof msg.rules != "string") {
var result = { var result = {
channel: { channel: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("channel") ? typeof(msg.channel) : undefined, got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}, },
pass: { pass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("pass") ? typeof(msg.pass) : undefined, got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
}, },
rules: { rules: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("rules") ? typeof(msg.rules) : undefined, got: msg.hasOwnProperty("rules") ? typeof msg.rules : undefined
}, },
adminpass: { adminpass: {
expected: "string", expected: "string",
got: msg.hasOwnProperty("adminpass") ? typeof(msg.adminpass) : undefined, got: msg.hasOwnProperty("adminpass")
}, ? typeof msg.adminpass
: undefined
}
}; };
socket.emit("update_required", result); socket.emit("update_required", result);
return; return;
} }
//coll = coll.replace(/ /g,''); //coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(userpass, adminpass, gotten) { Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
if(userpass != "" || msg.pass == undefined) { userpass,
adminpass,
gotten
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass; msg.pass = userpass;
} else if(msg.hasOwnProperty("pass")) { } else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64"); msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
} }
if(adminpass != "" || msg.adminpass == undefined) { if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass); msg.adminpass = Functions.hash_pass(adminpass);
} else { } else {
msg.adminpass = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)); msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
} }
var channel = msg.channel.toLowerCase(); var channel = msg.channel.toLowerCase();
var hash = msg.adminpass; var hash = msg.adminpass;
db.collection(channel + "_settings").find({id: "config"}, function(err, docs){ db.collection(channel + "_settings").find({ id: "config" }, function(
if(docs.length > 0 && (docs[0].userpass == undefined || docs[0].userpass == "" || (msg.hasOwnProperty('pass') && docs[0].userpass == msg.pass))) { err,
if(docs !== null && docs.length !== 0 && docs[0].adminpass !== "" && docs[0].adminpass == hash){ docs
db.collection("suggested_rules").update({channel: channel}, {$set:{rules: msg.rules}}, {upsert:true}, function(err, docs){ ) {
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_rules").update(
{ channel: channel },
{ $set: { rules: msg.rules } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change("rules", msg.rules, channel); Notifications.requested_change("rules", msg.rules, channel);
socket.emit("toast", "suggested_rules"); socket.emit("toast", "suggested_rules");
}); }
);
} }
} else { } else {
socket.emit("auth_required"); socket.emit("auth_required");
@@ -177,7 +279,6 @@ function rules(msg, coll, guid, offline, socket) {
} }
} }
module.exports.thumbnail = thumbnail; module.exports.thumbnail = thumbnail;
module.exports.description = description; module.exports.description = description;
module.exports.rules = rules; module.exports.rules = rules;

View File

@@ -1,23 +1,35 @@
var express = require('express'); var express = require("express");
var router = express.Router(); var router = express.Router();
var path = require('path'); var path = require("path");
var mongo_db_cred = require(path.join(__dirname, '../../config/mongo_config.js')); try {
var mongojs = require('mongojs'); var mongo_db_cred = require(path.join(
__dirname,
"../../config/mongo_config.js"
));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1);
}
var mongojs = require("mongojs");
var db = mongojs(mongo_db_cred.config); var db = mongojs(mongo_db_cred.config);
var token_db = mongojs("tokens"); var token_db = mongojs("tokens");
var uniqid = require('uniqid'); var uniqid = require("uniqid");
var crypto = require('crypto'); var crypto = require("crypto");
var ObjectId = mongojs.ObjectId; var ObjectId = mongojs.ObjectId;
var sIO = require(path.join(__dirname, '../../apps/client.js')).socketIO; var sIO = require(path.join(__dirname, "../../apps/client.js")).socketIO;
var projects = require(pathThumbnails + "/handlers/aggregates.js"); var projects = require(pathThumbnails + "/handlers/aggregates.js");
router.use(function(req, res, next) { router.use(function(req, res, next) {
next(); // make sure we go to the next routes and don't stop here next(); // make sure we go to the next routes and don't stop here
}); });
router.route('/api/lists').get(function(req, res){ router.route("/api/lists").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
db.collection("frontpage_lists").find().sort({count: -1},function(err, docs){ db.collection("frontpage_lists")
.find()
.sort({ count: -1 }, function(err, docs) {
res.json(docs); res.json(docs);
}); });
} else { } else {
@@ -25,9 +37,9 @@ router.route('/api/lists').get(function(req, res){
} }
}); });
router.route('/api/thumbnails').get(function(req, res){ router.route("/api/thumbnails").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
db.collection("suggested_thumbnails").find(function(err, docs){ db.collection("suggested_thumbnails").find(function(err, docs) {
res.json(docs); res.json(docs);
}); });
} else { } else {
@@ -35,9 +47,9 @@ router.route('/api/thumbnails').get(function(req, res){
} }
}); });
router.route('/api/descriptions').get(function(req, res){ router.route("/api/descriptions").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
db.collection("suggested_descriptions").find(function(err, docs){ db.collection("suggested_descriptions").find(function(err, docs) {
res.json(docs); res.json(docs);
}); });
} else { } else {
@@ -45,9 +57,9 @@ router.route('/api/descriptions').get(function(req, res){
} }
}); });
router.route('/api/rules').get(function(req, res){ router.route("/api/rules").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
db.collection("suggested_rules").find(function(err, docs){ db.collection("suggested_rules").find(function(err, docs) {
res.json(docs); res.json(docs);
}); });
} else { } else {
@@ -55,43 +67,69 @@ router.route('/api/rules').get(function(req, res){
} }
}); });
router.route('/api/approve_thumbnail').post(function(req, res){ router.route("/api/approve_thumbnail").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_thumbnails").find({channel: channel}, function(err, docs){ db.collection("suggested_thumbnails").find({ channel: channel }, function(
err,
docs
) {
var thumbnail = docs[0].thumbnail; var thumbnail = docs[0].thumbnail;
db.collection("frontpage_lists").update({_id: channel}, {$set:{thumbnail: thumbnail}}, {upsert: true}, function(err, docs){ db.collection("frontpage_lists").update(
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{thumbnail: thumbnail}}, {upsert: true}, function(err, docs){ { _id: channel },
db.collection("suggested_thumbnails").remove({channel: channel}, function(err, docs){ { $set: { thumbnail: thumbnail } },
db.collection(channel + "_settings").aggregate([ { upsert: true },
function(err, docs) {
db.collection(channel + "_settings").update(
{ views: { $exists: true } },
{ $set: { thumbnail: thumbnail } },
{ upsert: true },
function(err, docs) {
db.collection("suggested_thumbnails").remove(
{ channel: channel },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}); }
}); );
}
);
}
);
}); });
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/deny_thumbnail').post(function(req, res){ router.route("/api/deny_thumbnail").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_thumbnails").remove({channel: channel},function(err, docs){ db.collection("suggested_thumbnails").remove({ channel: channel }, function(
err,
docs
) {
res.send(true); res.send(true);
}); });
} else { } else {
@@ -99,42 +137,62 @@ router.route('/api/deny_thumbnail').post(function(req, res){
} }
}); });
router.route("/api/approve_rules").post(function(req, res) {
router.route('/api/approve_rules').post(function(req, res){ if (req.isAuthenticated()) {
if(req.isAuthenticated()){
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_rules").find({channel: channel}, function(err, docs){ db.collection("suggested_rules").find({ channel: channel }, function(
err,
docs
) {
var rules = docs[0].rules; var rules = docs[0].rules;
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{rules: rules}}, {upsert: true}, function(err, docs){ db.collection(channel + "_settings").update(
db.collection("suggested_rules").remove({channel: channel}, function(err, docs){ { views: { $exists: true } },
db.collection(channel + "_settings").aggregate([ { $set: { rules: rules } },
{ upsert: true },
function(err, docs) {
db.collection("suggested_rules").remove(
{ channel: channel },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}); }
);
}
);
}); });
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/deny_rules').post(function(req, res){ router.route("/api/deny_rules").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_rules").remove({channel: channel},function(err, docs){ db.collection("suggested_rules").remove({ channel: channel }, function(
err,
docs
) {
res.send(true); res.send(true);
}); });
} else { } else {
@@ -142,160 +200,235 @@ router.route('/api/deny_rules').post(function(req, res){
} }
}); });
router.route('/api/remove_rules').post(function(req, res){ router.route("/api/remove_rules").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{rules: ""}}, function(err, docs){ db.collection(channel + "_settings").update(
db.collection(channel + "_settings").aggregate([ { views: { $exists: true } },
{ $set: { rules: "" } },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (docs[0].hasOwnProperty("userpass") && docs[0].userpass != "")
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/approve_description').post(function(req, res){ router.route("/api/approve_description").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_descriptions").find({channel: channel}, function(err, docs){ db.collection("suggested_descriptions").find({ channel: channel }, function(
err,
docs
) {
var description = docs[0].description; var description = docs[0].description;
db.collection("frontpage_lists").update({_id: channel}, {$set:{description: description}}, {upsert: true}, function(err, docs){ db.collection("frontpage_lists").update(
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{description: description}}, function(err, docs){ { _id: channel },
db.collection("suggested_descriptions").remove({channel: channel}, function(err, docs){ { $set: { description: description } },
db.collection(channel + "_settings").aggregate([ { upsert: true },
function(err, docs) {
db.collection(channel + "_settings").update(
{ views: { $exists: true } },
{ $set: { description: description } },
function(err, docs) {
db.collection("suggested_descriptions").remove(
{ channel: channel },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}); }
}); );
}
);
}
);
}); });
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/deny_description').post(function(req, res){ router.route("/api/deny_description").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("suggested_descriptions").remove({channel: channel}, 1,function(err, docs){ db.collection("suggested_descriptions").remove(
{ channel: channel },
1,
function(err, docs) {
res.send(true); res.send(true);
}); }
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/remove_thumbnail').post(function(req, res){ router.route("/api/remove_thumbnail").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("frontpage_lists").update({_id: channel}, {$set:{thumbnail: ""}}, function(err, docs){ db.collection("frontpage_lists").update(
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{thumbnail: ""}}, function(err, docs){ { _id: channel },
db.collection(channel + "_settings").aggregate([ { $set: { thumbnail: "" } },
function(err, docs) {
db.collection(channel + "_settings").update(
{ views: { $exists: true } },
{ $set: { thumbnail: "" } },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}); }
);
}
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/remove_description').post(function(req, res){ router.route("/api/remove_description").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var channel = req.body.channel; var channel = req.body.channel;
db.collection("frontpage_lists").update({_id: channel}, {$set:{description: ""}}, function(err, docs){ db.collection("frontpage_lists").update(
db.collection(channel + "_settings").update({views:{$exists:true}}, {$set:{description: ""}}, function(err, docs){ { _id: channel },
db.collection(channel + "_settings").aggregate([ { $set: { description: "" } },
function(err, docs) {
db.collection(channel + "_settings").update(
{ views: { $exists: true } },
{ $set: { description: "" } },
function(err, docs) {
db.collection(channel + "_settings").aggregate(
[
{ {
"$match": { $match: {
id: "config" id: "config"
} }
}, },
{ {
"$project": projects.toShowConfig $project: projects.toShowConfig
}, }
], function(err, docs) { ],
if(docs[0].adminpass !== "") docs[0].adminpass = true; function(err, docs) {
if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false; else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs); sIO.to(channel).emit("conf", docs);
res.send(true); res.send(true);
}); }
}); );
}); }
);
}
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/names').get(function(req, res) { router.route("/api/names").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
db.collection("registered_users").find({_id: {$exists: true}}, {_id: 1, icon: 1}, function(err, docs) { db.collection("registered_users").find(
{ _id: { $exists: true } },
{ _id: 1, icon: 1 },
function(err, docs) {
res.json(docs); res.json(docs);
}) }
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/names').post(function(req, res) { router.route("/api/names").post(function(req, res) {
if(req.isAuthenticated()) { if (req.isAuthenticated()) {
var icon = req.body.icon; var icon = req.body.icon;
var name = req.body.name; var name = req.body.name;
db.collection("registered_users").update({_id: name}, {$set: {icon: icon}}, function(err, docs) { db.collection("registered_users").update(
if(err) res.send(false); { _id: name },
{ $set: { icon: icon } },
function(err, docs) {
if (err) res.send(false);
else res.send(true); else res.send(true);
}); }
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/names').delete(function(req, res) { router.route("/api/names").delete(function(req, res) {
if(req.isAuthenticated()) { if (req.isAuthenticated()) {
var name = req.body.name; var name = req.body.name;
db.collection("registered_users").remove({_id: name}, function(err, docs) { db.collection("registered_users").remove({ _id: name }, function(
if(err) res.send(false); err,
docs
) {
if (err) res.send(false);
else res.send(true); else res.send(true);
}); });
} else { } else {
@@ -303,26 +436,30 @@ router.route('/api/names').delete(function(req, res) {
} }
}); });
router.route('/api/token').get(function(req, res){ router.route("/api/token").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
token_db.collection("tokens").find(function(err, docs){ token_db.collection("tokens").find(function(err, docs) {
if(docs.length == 1){ if (docs.length == 1) {
res.json({token: docs[0].token}); res.json({ token: docs[0].token });
} else { } else {
var id = new Buffer(makeid()).toString('base64'); var id = new Buffer(makeid()).toString("base64");
token_db.collection("tokens").insert({token: id}, function(err, docs){ token_db
res.json({token: id}); .collection("tokens")
.insert({ token: id }, function(err, docs) {
res.json({ token: id });
}); });
} }
}) });
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/api_token').get(function(req, res) { router.route("/api/api_token").get(function(req, res) {
if(req.isAuthenticated()) { if (req.isAuthenticated()) {
token_db.collection("api_token").find({token: {$exists: true}}, function(err, all) { token_db
.collection("api_token")
.find({ token: { $exists: true } }, function(err, all) {
res.json(all); res.json(all);
}); });
} else { } else {
@@ -330,44 +467,56 @@ router.route('/api/api_token').get(function(req, res) {
} }
}); });
router.route('/api/api_token').delete(function(req, res){ router.route("/api/api_token").delete(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var id = req.body.id; var id = req.body.id;
token_db.collection("api_token").remove({_id: ObjectId(id)}, function(err, success) { token_db
if(err) { .collection("api_token")
.remove({ _id: ObjectId(id) }, function(err, success) {
if (err) {
res.send("failed"); res.send("failed");
return; return;
} }
res.send("success"); res.send("success");
}) });
} }
}); });
router.route('/api/api_token').put(function(req, res){ router.route("/api/api_token").put(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var id = req.body.id; var id = req.body.id;
var limit = req.body.limit; var limit = req.body.limit;
if(limit < 0) { if (limit < 0) {
res.sendStatus(500); res.sendStatus(500);
return; return;
} }
token_db.collection("api_token").update({_id: ObjectId(id)}, {$set: {limit: limit}}, function(err, success) { token_db
if(err) { .collection("api_token")
.update({ _id: ObjectId(id) }, { $set: { limit: limit } }, function(
err,
success
) {
if (err) {
res.sendStatus(500); res.sendStatus(500);
return; return;
} }
res.sendStatus(200); res.sendStatus(200);
}) });
} }
}); });
router.route('/api/api_token').post(function(req, res){ router.route("/api/api_token").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var name = req.body.name; var name = req.body.name;
var id = crypto.createHash('sha256').update(uniqid()).digest('base64'); var id = crypto
token_db.collection("api_token").insert({name: name, token: id, usage: 0}, function(err, docs){ .createHash("sha256")
token_db.collection("api_token").find({token: id}, function(err, d) { .update(uniqid())
res.json({token: id, _id: d[0]._id}); .digest("base64");
token_db
.collection("api_token")
.insert({ name: name, token: id, usage: 0 }, function(err, docs) {
token_db.collection("api_token").find({ token: id }, function(err, d) {
res.json({ token: id, _id: d[0]._id });
}); });
}); });
} else { } else {
@@ -375,14 +524,17 @@ router.route('/api/api_token').post(function(req, res){
} }
}); });
router.route('/api/delete').post(function(req, res){ router.route("/api/delete").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var list = req.body._id; var list = req.body._id;
db.collection(list).drop(function(err, docs){ db.collection(list).drop(function(err, docs) {
db.collection(list + "_settings").drop(function(err, docs){ db.collection(list + "_settings").drop(function(err, docs) {
db.collection("frontpage_lists").remove({_id: list}, function(err, docs){ db.collection("frontpage_lists").remove({ _id: list }, function(
err,
docs
) {
res.send(true); res.send(true);
}) });
}); });
}); });
} else { } else {
@@ -390,67 +542,84 @@ router.route('/api/delete').post(function(req, res){
} }
}); });
router.route('/api/remove_token').get(function(req, res){ router.route("/api/remove_token").get(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
token_db.collection("tokens").find(function(err, docs){ token_db.collection("tokens").find(function(err, docs) {
if(docs.length == 1){ if (docs.length == 1) {
token_db.collection("tokens").remove({token: docs[0].token}, function(err, docs){ token_db
.collection("tokens")
.remove({ token: docs[0].token }, function(err, docs) {
res.send(true); res.send(true);
}) });
} else { } else {
res.send(false); res.send(false);
} }
}) });
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/pinned').post(function(req, res){ router.route("/api/pinned").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var to_pin = req.body._id; var to_pin = req.body._id;
db.collection("frontpage_lists").update({pinned:1}, {$set:{pinned:0}}, function(err, resp){ db.collection("frontpage_lists").update(
db.collection("frontpage_lists").update({_id:to_pin}, {$set:{pinned:1}}, function(err, resp){ { pinned: 1 },
{ $set: { pinned: 0 } },
function(err, resp) {
db.collection("frontpage_lists").update(
{ _id: to_pin },
{ $set: { pinned: 1 } },
function(err, resp) {
res.send(true); res.send(true);
}); }
}); );
}
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/admin').post(function(req, res){ router.route("/api/admin").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var to_remove = req.body._id; var to_remove = req.body._id;
db.collection(to_remove + "_settings").update({views: {$exists: true}}, {$set:{adminpass: ""}}, function(err, docs){ db.collection(to_remove + "_settings").update(
{ views: { $exists: true } },
{ $set: { adminpass: "" } },
function(err, docs) {
res.send(true); res.send(true);
}); }
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
router.route('/api/userpass').post(function(req, res){ router.route("/api/userpass").post(function(req, res) {
if(req.isAuthenticated()){ if (req.isAuthenticated()) {
var to_remove = req.body._id; var to_remove = req.body._id;
db.collection(to_remove + "_settings").update({views: {$exists: true}}, {$set:{userpass: ""}}, function(err, docs){ db.collection(to_remove + "_settings").update(
{ views: { $exists: true } },
{ $set: { userpass: "" } },
function(err, docs) {
res.send(true); res.send(true);
}); }
);
} else { } else {
res.send(false); res.send(false);
} }
}); });
function makeid() function makeid() {
{
var text = ""; var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var possible =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < 20; i++ ) for (var i = 0; i < 20; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length)); text += possible.charAt(Math.floor(Math.random() * possible.length));
return text; return text;
} }
module.exports = router; module.exports = router;

View File

@@ -13,7 +13,7 @@ try {
} catch (e) { } catch (e) {
allowed_key = ["***"]; allowed_key = ["***"];
console.log( console.log(
"Allowed API-key for skipping songs from API has not been configured, so all keys are allowed by default (!). Have a look at config/allowed_api.example.js" "(!) Missing file - /config/allowed_api.js Have a look at /config/allowed_api.example.js."
); );
} }
var crypto = require("crypto"); var crypto = require("crypto");

View File

@@ -1,24 +1,33 @@
var express = require('express'); var express = require("express");
const path = require('path'); const path = require("path");
var router = express.Router(); var router = express.Router();
router.use(function(req, res, next) { router.use(function(req, res, next) {
next(); // make sure we go to the next routes and don't stop here next(); // make sure we go to the next routes and don't stop here
}); });
router.route('/favicon.ico').get(function(req, res, next) { router.route("/favicon.ico").get(function(req, res, next) {
res.sendFile(path.join(pathThumbnails, '/public/assets/images/favicon.ico')); res.sendFile(path.join(pathThumbnails, "/public/assets/images/favicon.ico"));
}); });
router.route('/browserconfig.xml').get(function(req, res, next) { router.route("/browserconfig.xml").get(function(req, res, next) {
res.sendFile(path.join(pathThumbnails, '/public/assets/images/browserconfig.xml')); res.sendFile(
path.join(pathThumbnails, "/public/assets/images/browserconfig.xml")
);
}); });
router.route('/apple-touch-icon.png').get(function(req, res, next) { router.route("/apple-touch-icon.png").get(function(req, res, next) {
res.sendFile(path.join(pathThumbnails, '/public/assets/images/apple-touch-icon.png')); res.sendFile(
path.join(pathThumbnails, "/public/assets/images/apple-touch-icon.png")
);
}); });
router.route('/apple-touch-icon-precomposed.png').get(function(req, res, next) { router.route("/apple-touch-icon-precomposed.png").get(function(req, res, next) {
res.sendFile(path.join(pathThumbnails, '/public/assets/images/apple-touch-icon-precomposed.png')); res.sendFile(
path.join(
pathThumbnails,
"/public/assets/images/apple-touch-icon-precomposed.png"
)
);
}); });
module.exports = router; module.exports = router;

View File

@@ -1,69 +1,76 @@
var express = require('express'); var express = require("express");
var router = express.Router(); var router = express.Router();
var path = require('path'); var path = require("path");
var year = new Date().getYear()+1900; var year = new Date().getYear() + 1900;
var path = require('path'); var path = require("path");
var analytics = "xx"; var analytics = "xx";
var google = {}; var google = {};
var adsense = "xx"; var adsense = "xx";
var adds = false; var adds = false;
var mongojs = require('mongojs'); var mongojs = require("mongojs");
var token_db = mongojs("tokens"); var token_db = mongojs("tokens");
var Functions = require(pathThumbnails + '/handlers/functions.js'); var Functions = require(pathThumbnails + "/handlers/functions.js");
var Frontpage = require(pathThumbnails + '/handlers/frontpage.js'); var Frontpage = require(pathThumbnails + "/handlers/frontpage.js");
var db = require(pathThumbnails + '/handlers/db.js'); var db = require(pathThumbnails + "/handlers/db.js");
//var db = require(pathThumbnails + '/handlers/db.js'); //var db = require(pathThumbnails + '/handlers/db.js');
try { try {
google = require(path.join(path.join(__dirname, '../../config/'), 'google.js')); google = require(path.join(
path.join(__dirname, "../../config/"),
"google.js"
));
analytics = google.analytics; analytics = google.analytics;
adsense = google.adsense; adsense = google.adsense;
} catch(e) { } catch (e) {
console.log("No analytics-id found"); console.log("No analytics-id found");
} }
try { try {
var Recaptcha = require('express-recaptcha'); var Recaptcha = require("express-recaptcha");
var recaptcha_config = require(path.join(path.join(__dirname, '../../config/'), 'recaptcha.js')); var recaptcha_config = require(path.join(
path.join(__dirname, "../../config/"),
"recaptcha.js"
));
var RECAPTCHA_SITE_KEY = recaptcha_config.site; var RECAPTCHA_SITE_KEY = recaptcha_config.site;
var RECAPTCHA_SECRET_KEY = recaptcha_config.key; var RECAPTCHA_SECRET_KEY = recaptcha_config.key;
var recaptcha = new Recaptcha(RECAPTCHA_SITE_KEY, RECAPTCHA_SECRET_KEY); var recaptcha = new Recaptcha(RECAPTCHA_SITE_KEY, RECAPTCHA_SECRET_KEY);
} catch(e) { } catch (e) {
console.log("Error - missing file"); console.log(
console.log("Seems you forgot to create the file recaptcha.js in /server/config/. Have a look at recaptcha.example.js."); "(!) Missing file - /config/recaptcha.js Have a look at /config/recaptcha.example.js."
);
var recaptcha = { var recaptcha = {
middleware: { middleware: {
render: (req, res, next) => { render: (req, res, next) => {
res.recaptcha = "" res.recaptcha = "";
next() next();
}
} }
} }
};
} }
router.use(recaptcha.middleware.render, function(req, res, next) { router.use(recaptcha.middleware.render, function(req, res, next) {
next(); // make sure we go to the next routes and don't stop here next(); // make sure we go to the next routes and don't stop here
}); });
router.route('/:channel_name').get(function(req, res, next){ router.route("/:channel_name").get(function(req, res, next) {
channel(req, res, next); channel(req, res, next);
}); });
router.route('/r/:base64data').get(function(req, res, next){ router.route("/r/:base64data").get(function(req, res, next) {
var channelToRedirect = Buffer.from(req.params.base64data, 'base64'); var channelToRedirect = Buffer.from(req.params.base64data, "base64");
res.redirect('/' + channelToRedirect); res.redirect("/" + channelToRedirect);
}); });
router.route('/').get(function(req, res, next){ router.route("/").get(function(req, res, next) {
root(req, res, next); root(req, res, next);
}); });
router.route('/').post(function(req, res, next){ router.route("/").post(function(req, res, next) {
root(req, res, next); root(req, res, next);
}); });
router.route('/api/embed').get(function(req, res, next) { router.route("/api/embed").get(function(req, res, next) {
var data = { var data = {
year: year, year: year,
type: "video", type: "video",
@@ -72,16 +79,16 @@ router.route('/api/embed').get(function(req, res, next) {
analytics: analytics, analytics: analytics,
stylesheet: "embed.css", stylesheet: "embed.css",
embed: true, embed: true,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
res.render('layouts/client/embed', data); res.render("layouts/client/embed", data);
}); });
router.route('/api/oauth').get(function(req, res, next) { router.route("/api/oauth").get(function(req, res, next) {
res.sendFile(path.join(pathThumbnails, '/public/assets/html/callback.html')); res.sendFile(path.join(pathThumbnails, "/public/assets/html/callback.html"));
}); });
router.route('/api/apply').get(function(req, res, next) { router.route("/api/apply").get(function(req, res, next) {
var data = { var data = {
year: year, year: year,
javascript_file: "token.min.js", javascript_file: "token.min.js",
@@ -95,17 +102,22 @@ router.route('/api/apply').get(function(req, res, next) {
correct: false, correct: false,
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
res.render('layouts/client/token', data); res.render("layouts/client/token", data);
}); });
router.route('/api/apply/:id').get(function(req, res) { router.route("/api/apply/:id").get(function(req, res) {
var id = req.params.id; var id = req.params.id;
token_db.collection('api_links').find({id: id}, function(err, result) { token_db.collection("api_links").find({ id: id }, function(err, result) {
if(result.length == 1) { if (result.length == 1) {
token_db.collection('api_links').remove({id: id}, function(e,d) { token_db.collection("api_links").remove({ id: id }, function(e, d) {
token_db.collection('api_token').update({token: result[0].token}, {$set: {active: true}}, function(e,d) { token_db
.collection("api_token")
.update(
{ token: result[0].token },
{ $set: { active: true } },
function(e, d) {
var data = { var data = {
year: year, year: year,
javascript_file: "token.min.js", javascript_file: "token.min.js",
@@ -119,10 +131,11 @@ router.route('/api/apply/:id').get(function(req, res) {
correct: true, correct: true,
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
};
res.render("layouts/client/token", data);
} }
res.render('layouts/client/token', data); );
});
}); });
} else { } else {
var data = { var data = {
@@ -133,28 +146,31 @@ router.route('/api/apply/:id').get(function(req, res) {
adsense: adsense, adsense: adsense,
adds: adds, adds: adds,
activated: false, activated: false,
token:"", token: "",
type: "website", type: "website",
correct: false, correct: false,
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
res.render('layouts/client/token', data); res.render("layouts/client/token", data);
} }
}); });
}); });
function root(req, res, next) { function root(req, res, next) {
try{ try {
var url = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'] : req.headers.host.split(":")[0]; var url = req.headers["x-forwarded-host"]
var subdomain = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'].split(".") : req.headers.host.split(":")[0].split("."); ? req.headers["x-forwarded-host"]
: req.headers.host.split(":")[0];
var subdomain = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"].split(".")
: req.headers.host.split(":")[0].split(".");
/*if(url != "zoff.me" && url != "admin.localhost" && url != "admin.zoff.me" && url != "remote.zoff.me" && url != "fb.zoff.me" && url != "remote.localhost" && url != "localhost") { /*if(url != "zoff.me" && url != "admin.localhost" && url != "admin.zoff.me" && url != "remote.zoff.me" && url != "fb.zoff.me" && url != "remote.localhost" && url != "localhost") {
res.redirect("https://zoff.me"); res.redirect("https://zoff.me");
return; return;
}*/ }*/
if(subdomain[0] == "remote") { if (subdomain[0] == "remote") {
var data = { var data = {
year: year, year: year,
javascript_file: "remote.min.js", javascript_file: "remote.min.js",
@@ -166,10 +182,10 @@ function root(req, res, next) {
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
client: false, client: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
res.render('layouts/client/remote', data); res.render("layouts/client/remote", data);
} else if(subdomain[0] == "www") { } else if (subdomain[0] == "www") {
res.redirect("https://zoff.me"); res.redirect("https://zoff.me");
} else { } else {
var data = { var data = {
@@ -184,14 +200,17 @@ function root(req, res, next) {
embed: false, embed: false,
client: false, client: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg",
channels: [], channels: []
} };
if(subdomain[0] == "client") { if (subdomain[0] == "client") {
data.client = true; data.client = true;
} }
Frontpage.get_frontpage_lists(function(err, docs){ Frontpage.get_frontpage_lists(function(err, docs) {
db.collection("connected_users").find({"_id": "total_users"}, function(err, tot) { db.collection("connected_users").find({ _id: "total_users" }, function(
if(docs.length > 0) { err,
tot
) {
if (docs.length > 0) {
data.channels_exist = true; data.channels_exist = true;
data.channels = docs.slice(0, 12); data.channels = docs.slice(0, 12);
data.channel_list = JSON.stringify(docs); data.channel_list = JSON.stringify(docs);
@@ -201,26 +220,29 @@ function root(req, res, next) {
data.channel_list = []; data.channel_list = [];
} }
data.viewers = tot[0].total_users.length; data.viewers = tot[0].total_users.length;
res.render('layouts/client/frontpage', data); res.render("layouts/client/frontpage", data);
}); });
}); });
} }
} catch(e) { } catch (e) {
console.log(e); console.log(e);
//res.redirect("https://zoff.me"); //res.redirect("https://zoff.me");
} }
} }
function channel(req, res, next) { function channel(req, res, next) {
try{ try {
var url = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'] : req.headers.host.split(":")[0]; var url = req.headers["x-forwarded-host"]
var subdomain = req.headers['x-forwarded-host'] ? req.headers['x-forwarded-host'].split(".") : req.headers.host.split(":")[0].split("."); ? req.headers["x-forwarded-host"]
: req.headers.host.split(":")[0];
var subdomain = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"].split(".")
: req.headers.host.split(":")[0].split(".");
/*if(url != "zoff.me" && url != "admin.localhost" && url != "admin.zoff.me" && url != "remote.zoff.me" && url != "fb.zoff.me" && url != "remote.localhost" && url != "localhost") { /*if(url != "zoff.me" && url != "admin.localhost" && url != "admin.zoff.me" && url != "remote.zoff.me" && url != "fb.zoff.me" && url != "remote.localhost" && url != "localhost") {
res.redirect("https://zoff.me"); res.redirect("https://zoff.me");
return; return;
}*/ }*/
if(subdomain[0] == "remote") { if (subdomain[0] == "remote") {
var data = { var data = {
year: year, year: year,
javascript_file: "remote.min.js", javascript_file: "remote.min.js",
@@ -232,13 +254,13 @@ function channel(req, res, next) {
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
client: false, client: false,
og_image: "https://zoff.me/assets/images/small-square.jpg", og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
res.render('layouts/client/remote', data); res.render("layouts/client/remote", data);
} else if(subdomain.length >= 2 && subdomain[0] == "www") { } else if (subdomain.length >= 2 && subdomain[0] == "www") {
res.redirect("https://zoff.me"); res.redirect("https://zoff.me");
} else { } else {
if(req.params.channel_name == "o_callback") { if (req.params.channel_name == "o_callback") {
res.redirect("/api/oauth"); res.redirect("/api/oauth");
//res.sendFile(path.join(pathThumbnails, '/public/assets/html/callback.html')); //res.sendFile(path.join(pathThumbnails, '/public/assets/html/callback.html'));
} else { } else {
@@ -266,20 +288,20 @@ function channel(req, res, next) {
type: "video", type: "video",
stylesheet: "style.css", stylesheet: "style.css",
embed: false, embed: false,
client:false, client: false,
og_image: "https://zoff.me/assets/images/small-square.jpg" og_image: "https://zoff.me/assets/images/small-square.jpg"
} };
if(subdomain[0] == "client") { if (subdomain[0] == "client") {
data.client = true; data.client = true;
} }
if(req.params.channel_name == "404") { if (req.params.channel_name == "404") {
res.status(404); res.status(404);
} }
res.render('layouts/client/channel', data); res.render("layouts/client/channel", data);
//}); //});
} }
} }
} catch(e) { } catch (e) {
res.redirect("https://zoff.me"); res.redirect("https://zoff.me");
} }
} }