Skip to content

User playlists #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 33 additions & 27 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,27 @@ var basicAuth = require('basic-auth-connect');
var passport = require('passport');
var Strategy = require('passport-local').Strategy;

var passportSocketio = require('passport.socketio');
var NedbStore = require('nedb-session-store')(require('express-session'));

var app = express().http().io();

// fetch the config directory
app.set('configDir', process.env.configDir || __dirname);

//set the session options
var sessionStore = new NedbStore({
filename: app.get('configDir')+'/dbs/persistance.db'
});
var sessionOpts = {
key: 'express.sid',
secret: 'keyboard cat',
store: sessionStore,
resave: true,
saveUninitialized: true,
};
app.io.session(sessionOpts);

app.io.set('authorization', function handleAuth(handshakeData, accept) {
// accept all requests
accept(null, true);
});

// fetch the config directory
app.set('configDir', process.env.configDir || __dirname);

// all variables to be shared throughout the app
app.set('port', process.env.PORT || 2000);
app.set('views', path.join(__dirname, 'views'));
Expand All @@ -43,7 +47,10 @@ app.set('started', Date.now());
app.engine('html', require('swig').renderFile);

async.series([function createDatabaseDirectory(next) {
// make sure the dbs directory is present
// make sure the dbs, users and covers directory is present
mkdirp(app.get('configDir') + '/dbs/users', function (err) {
if (err) { console.error(err); }
});
mkdirp(app.get('configDir') + '/dbs/covers', next);
}, function databaseDirectoryCreated(next) {
// attach the db to the app
Expand All @@ -68,26 +75,25 @@ async.series([function createDatabaseDirectory(next) {
}
next();
}, function setupPassport(next) {

passport.use(new Strategy(
function(username, password, cb) {
app.db.users.findOne({username: username}, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false, {message:"Invalid credentials"}); }
if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); }
return cb(null, user);
});
//Configure passport
require(__dirname + '/passport_config.js')(app, passport);

//set auth sessionopts for passportSocketio
app.io.set('authorization', passportSocketio.authorize({
cookieParser: cookieParser,
key: 'express.sid',
secret: 'keyboard cat',
store: sessionStore,
passport: passport,
success: function (data, accept) {
accept(null, true);
},
fail: function (data, message, error, accept) {
//accept whether or not user is authorized
accept(null, true);
}
}));

// Configure Passport persistence.
passport.serializeUser(function(user, cb) {
var sessionUser = user;
cb(null, sessionUser);
});

passport.deserializeUser(function(user, cb) {
cb(null, user);
});
next();
}, function setupEverythingElse(next) {
// middleware to use in the app
Expand Down
4 changes: 2 additions & 2 deletions config.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@ function Config(app) {
},

function (cb) {
app.db.users.findOne({username:'admin'}, function (err, item) {
app.db.admins.findOne({username:'admin'}, function (err, item) {
if(!item)
app.db.users.insert({username:'admin',password:'admin'});
app.db.admins.insert({username:'admin',password:'admin',isAdmin:true});
});

cb();
Expand Down
8 changes: 8 additions & 0 deletions db.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
var Datastore = require('nedb');

function getUserPlaylist(userId) {
var db = new Datastore({ filename: app.get('configDir') + '/dbs/users/'+ userId +'.db' , autoload: true });
return db;
}

module.exports = function(app) {
app.db = {};
app.db.connected_users = {};
app.db.songs = new Datastore({ filename: app.get('configDir') + '/dbs/songs.db', autoload: true });
app.db.playlists = new Datastore({ filename: app.get('configDir') + '/dbs/playlists.db', autoload: true });
app.db.settings = new Datastore({ filename: app.get('configDir') + '/dbs/settings.db', autoload: true });
app.db.users = new Datastore({ filename: app.get('configDir') + '/dbs/users.db', autoload: true });
app.db.admins = new Datastore({ filename: app.get('configDir') + '/dbs/admins.db', autoload: true });
app.db.getUserPlaylist = getUserPlaylist;
};
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,18 @@
"mobile-detect": "^0.4.3",
"musicmetadata": "*",
"nedb": "*",
"nedb-session-store": "^1.1.1",
"opener": "*",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"passport.socketio": "^3.7.0",
"request": "*",
"serve-favicon": "^2.3.0",
"similar-songs": "^0.1.3",
"song-search": "^0.1.0",
"soundcloud-resolver": "*",
"swig": "*",
"validator": "^6.2.1",
"youtube-playlist-info": "^0.1.0",
"ytdl-core": "*"
},
Expand Down
105 changes: 105 additions & 0 deletions passport_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
// Configuration file for passportJS

var LocalStrategy = require('passport-local').Strategy;
var validate = require('validator');

module.exports = function(app, passport){

// Specify a local strategy for passport normal user login
passport.use('user-login', new LocalStrategy(
function(username, password, cb){

// Validate user data
var error = 0;
username = validate.trim(username);
// Users may have caps in usernames; username = username.toLowerCase();
error += validate.isEmpty(username);
error += validate.isEmpty(password);

if (!error) {
app.db.users.findOne({username: username}, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false, {message:"Invalid credentials"}); }
if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); }
return cb(null, user);
});

}
else
return cb(null, false);
}
));

// Specify a local strategy for passport normal user signup
passport.use('user-signup', new LocalStrategy(
function(username, password, cb){

// Validate user data
var error = 0;
username = validate.trim(username);
// username = username.toLowerCase();
error += validate.isEmpty(username);
error += validate.isEmpty(password);

if (!error) {
app.db.users.findOne({username: username}, function(err, user) {
if (err) {
return cb(err);
}
if (user) {
return cb(null, false, {message:"User already registered"});
}
else{
// Must not be the same as admins
app.db.admins.findOne({username: username}, function(err, user) {
if (err) {
return cb(err);
}
if (user) {
return cb(null, false, {message:"User already registered"});
}
else{
app.db.users.insert({username: username, password:password});
return cb(null,{username:username, password:password});
}
});
}
});
}else
return cb(null, false);
}
));

// Specify a local strategy for passport admin login
passport.use('admin-login', new LocalStrategy(
function(username, password, cb){

// Validate user data
var error = 0;
username = validate.trim(username);
error += validate.isEmpty(username);
error += validate.isEmpty(password);

if (!error) {
app.db.admins.findOne({username: username}, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false, {message:"Invalid credentials"}); }
if (user.password != password) { return cb(null, false, {message:"Invalid credentials"}); }
return cb(null, user);
});

}
else
return cb(null, false);
}
));

// Specify serialize and deserialize methods for passport
passport.serializeUser(function(user, cb){
var sessionUser = user;
cb(null, sessionUser);
});
passport.deserializeUser(function(user, cb){
cb(null, user);
});
};
Loading