mirror of https://github.com/Requarks/wiki.git
23 changed files with 437 additions and 120 deletions
Unified View
Diff Options
-
16.snyk
-
9README.md
-
4agent.js
-
2assets/css/app.css
-
2assets/css/libs.css
-
2assets/css/login.css
-
BINassets/images/bg_2.jpg
-
BINassets/images/bg_3.jpg
-
42assets/js/libs.js
-
1client/scss/components/_editor.scss
-
28client/scss/layout/_content.scss
-
2client/scss/libs/bulma/utilities/variables.sass
-
53client/scss/login.scss
-
20config.sample.yml
-
12controllers/auth.js
-
2controllers/ws.js
-
204libs/auth.js
-
25libs/config.js
-
2libs/winston.js
-
65models/user.js
-
4package.json
-
35server.js
-
27views/auth/login.pug
@ -1,16 +0,0 @@ |
|||||
failThreshold: high |
|
||||
version: v1.5.2 |
|
||||
ignore: |
|
||||
'npm:moment:20160126': |
|
||||
- express-brute-mongo > moment: |
|
||||
reason: None given |
|
||||
expires: '2016-11-16T22:23:46.921Z' |
|
||||
patch: |
|
||||
'npm:negotiator:20160616': |
|
||||
- socket.io > engine.io > accepts > negotiator: |
|
||||
patched: '2016-09-09T02:19:31.082Z' |
|
||||
'npm:ws:20160624': |
|
||||
- socket.io > engine.io > ws: |
|
||||
patched: '2016-09-09T02:19:31.082Z' |
|
||||
- socket.io > socket.io-client > engine.io-client > ws: |
|
||||
patched: '2016-09-09T02:19:31.082Z' |
|
2
assets/css/app.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
assets/css/libs.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1 +1 @@ |
|||||
#bg,#bg>div{width:100%;height:100%;top:0;left:0}#root,#root button,#root h1,a{color:#FFF}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}[v-cloak]{display:none}body{padding:0;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px}a{transition:color .4s ease;text-decoration:none}a:hover{color:#FB8C00;text-decoration:underline}#bg{position:fixed;z-index:1;background-color:#000}#bg>div{background-size:cover;background-position:center center;position:absolute;opacity:0;visibility:hidden;transition:opacity 3s ease,visibility 3s;animation:bg 30s linear infinite}#copyright,#root{display:flex;left:10vw;z-index:2}#bg>div:nth-child(1){animation-delay:10s}#bg>div:nth-child(2){animation-delay:20s}#root h1,#root h2{animation:headerIntro 3s ease;padding:0}#root{position:fixed;top:15vh;flex-direction:column}#root h1{font-size:4rem;margin:0}#root h2{font-size:1.5rem;font-weight:400;color:rgba(255,255,255,.7);margin:0 0 25px}#root input[type=password],#root input[type=text]{width:350px;max-width:80vw;border:1px solid rgba(255,255,255,.3);border-radius:3px;background-color:rgba(0,0,0,.2);padding:0 15px;height:40px;margin:0 0 10px;color:#FFF;font-weight:700;font-size:14px;transition:all .4s ease}#root input[type=password]:focus,#root input[type=text]:focus{outline:0;border-color:rgba(255,255,255,.8)}#root button{background-color:#FB8C00;border:1px solid #ffa32f;border-radius:3px;height:40px;width:125px;padding:0;font-weight:700;margin:15px 0 0;transition:all .4s ease;cursor:pointer}#root button:focus{outline:0;border-color:#FFF}#root button:hover{background-color:#c87000}#copyright{align-items:center;justify-content:flex-start;position:absolute;bottom:10vh;color:rgba(255,255,255,.5);font-weight:700}#copyright .icon{font-size:1.2rem;margin:0 8px}#copyright a{opacity:.75}@-webkit-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-moz-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-o-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-webkit-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@-moz-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@-o-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@keyframes headerIntro{0%{opacity:0}100%{opacity:1}} |
|
||||
|
#bg,#bg>div{width:100%;height:100%;top:0;left:0}#root,#root button,#root h1,a{color:#FFF}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}[v-cloak]{display:none}body{padding:0;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px}a{transition:color .4s ease;text-decoration:none}a:hover{color:#FB8C00;text-decoration:underline}#bg{position:fixed;z-index:1;background-color:#000}#bg>div{background-size:cover;background-position:center center;position:absolute;opacity:0;visibility:hidden;transition:opacity 3s ease,visibility 3s;animation:bg 30s linear infinite}#copyright,#root{left:10vw;z-index:2}#bg>div:nth-child(1){animation-delay:10s}#bg>div:nth-child(2){animation-delay:20s}#root h1,#root h2{animation:headerIntro 3s ease;padding:0}#root{position:fixed;top:15vh;display:flex;flex-direction:column}#root h1{font-size:4rem;margin:0}#root h2{font-size:1.5rem;font-weight:400;color:rgba(255,255,255,.7);margin:0 0 25px}#root input[type=password],#root input[type=text]{width:350px;max-width:80vw;border:1px solid rgba(255,255,255,.3);border-radius:3px;background-color:rgba(0,0,0,.2);padding:0 15px;height:40px;margin:0 0 10px;color:#FFF;font-weight:700;font-size:14px;transition:all .4s ease}#root input[type=password]:focus,#root input[type=text]:focus{outline:0;border-color:rgba(255,255,255,.8)}#root button{background-color:#FB8C00;border:1px solid #ffa32f;border-radius:3px;height:40px;width:125px;padding:0;font-weight:700;margin:15px 0 0;transition:all .4s ease;cursor:pointer}#root button:focus{outline:0;border-color:#FFF}#root button:hover{background-color:#c87000}#root #social{margin-top:25px}#root #social>span{display:block;font-weight:700;color:rgba(255,255,255,.7)}#root #social button{margin-right:5px;width:auto;padding:0 15px}#root #social button>i{margin-right:10px;font-size:16px}#root #social button.ms{background-color:#009688;border-color:#00c9b6}#root #social button.ms:hover{background-color:#00635a}#root #social button.google{background-color:#2196F3;border-color:#51adf6}#root #social button.google:hover{background-color:#0c7cd5}#root #social button.facebook{background-color:#673AB7;border-color:#8259cb}#root #social button.facebook:hover{background-color:#512e90}#copyright{display:flex;align-items:center;justify-content:flex-start;position:absolute;bottom:10vh;color:rgba(255,255,255,.5);font-weight:700}#copyright .icon{font-size:1.2rem;margin:0 8px}#copyright a{opacity:.75}@-webkit-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-moz-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-o-keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@keyframes bg{0%{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1);visibility:visible;opacity:0}33%,5%{opacity:.5}38%{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2);opacity:0}39%{visibility:hidden}100%{visibility:hidden;opacity:0}}@-webkit-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@-moz-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@-o-keyframes headerIntro{0%{opacity:0}100%{opacity:1}}@keyframes headerIntro{0%{opacity:0}100%{opacity:1}} |
42
assets/js/libs.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,66 +1,148 @@ |
|||||
var LocalStrategy = require('passport-local').Strategy; |
|
||||
|
"use strict"; |
||||
|
|
||||
|
const LocalStrategy = require('passport-local').Strategy; |
||||
|
const GoogleStrategy = require('passport-google-oauth20').Strategy; |
||||
|
const WindowsLiveStrategy = require('passport-windowslive').Strategy; |
||||
|
const FacebookStrategy = require('passport-facebook').Strategy; |
||||
|
const _ = require('lodash'); |
||||
|
|
||||
module.exports = function(passport, appconfig) { |
module.exports = function(passport, appconfig) { |
||||
|
|
||||
// Serialization user methods
|
|
||||
|
|
||||
passport.serializeUser(function(user, done) { |
|
||||
done(null, user._id); |
|
||||
}); |
|
||||
|
|
||||
passport.deserializeUser(function(id, done) { |
|
||||
let user = db.User.find({ id }); |
|
||||
if(user) { |
|
||||
done(null, user); |
|
||||
} else { |
|
||||
done(err, null); |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
// Setup local user authentication strategy
|
|
||||
|
|
||||
passport.use( |
|
||||
'local', |
|
||||
new LocalStrategy({ |
|
||||
usernameField : 'email', |
|
||||
passwordField : 'password', |
|
||||
passReqToCallback : true |
|
||||
}, |
|
||||
function(req, uEmail, uPassword, done) { |
|
||||
db.User.findOne({ 'email' : uEmail }).then((user) => { |
|
||||
if (user) { |
|
||||
user.validatePassword(uPassword).then((isValid) => { |
|
||||
return (isValid) ? done(null, user) : done(null, false); |
|
||||
}); |
|
||||
} else { |
|
||||
return done(null, false); |
|
||||
} |
|
||||
}).catch((err) => { |
|
||||
done(err); |
|
||||
}); |
|
||||
}) |
|
||||
); |
|
||||
|
|
||||
// Check for admin access
|
|
||||
|
|
||||
db.onReady.then(() => { |
|
||||
|
|
||||
/*if(db.User.count() < 1) { |
|
||||
winston.info('No administrator account found. Creating a new one...'); |
|
||||
if(db.User.insert({ |
|
||||
email: appconfig.admin, |
|
||||
firstName: "Admin", |
|
||||
lastName: "Admin", |
|
||||
password: "admin123" |
|
||||
})) { |
|
||||
winston.info('Administrator account created successfully!'); |
|
||||
} else { |
|
||||
winston.error('An error occured while creating administrator account: '); |
|
||||
} |
|
||||
}*/ |
|
||||
|
|
||||
return true; |
|
||||
|
|
||||
}); |
|
||||
|
// Serialization user methods
|
||||
|
|
||||
|
passport.serializeUser(function(user, done) { |
||||
|
done(null, user._id); |
||||
|
}); |
||||
|
|
||||
|
passport.deserializeUser(function(id, done) { |
||||
|
db.User.findById(id).then((user) => { |
||||
|
if(user) { |
||||
|
done(null, user); |
||||
|
} else { |
||||
|
done(new Error('User not found.'), null); |
||||
|
} |
||||
|
return true; |
||||
|
}).catch((err) => { |
||||
|
done(err, null); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
// Local Account
|
||||
|
|
||||
|
if(appconfig.auth.local && appconfig.auth.local.enabled) { |
||||
|
|
||||
|
passport.use('local', |
||||
|
new LocalStrategy({ |
||||
|
usernameField : 'email', |
||||
|
passwordField : 'password', |
||||
|
passReqToCallback : true |
||||
|
}, |
||||
|
function(req, uEmail, uPassword, done) { |
||||
|
db.User.findOne({ 'email' : uEmail }).then((user) => { |
||||
|
if (user) { |
||||
|
user.validatePassword(uPassword).then((isValid) => { |
||||
|
return (isValid) ? done(null, user) : done(null, false); |
||||
|
}); |
||||
|
} else { |
||||
|
return done(null, false); |
||||
|
} |
||||
|
}).catch((err) => { |
||||
|
done(err); |
||||
|
}); |
||||
|
}) |
||||
|
); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// Google ID
|
||||
|
|
||||
|
if(appconfig.auth.google && appconfig.auth.google.enabled) { |
||||
|
|
||||
|
passport.use('google', |
||||
|
new GoogleStrategy({ |
||||
|
clientID: appconfig.auth.google.clientId, |
||||
|
clientSecret: appconfig.auth.google.clientSecret, |
||||
|
callbackURL: appconfig.host + '/login/google/callback' |
||||
|
}, |
||||
|
(accessToken, refreshToken, profile, cb) => { |
||||
|
db.User.processProfile(profile).then((user) => { |
||||
|
return cb(null, user) || true; |
||||
|
}).catch((err) => { |
||||
|
return cb(err, null) || true; |
||||
|
}); |
||||
|
} |
||||
|
)); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// Microsoft Accounts
|
||||
|
|
||||
|
if(appconfig.auth.microsoft && appconfig.auth.microsoft.enabled) { |
||||
|
|
||||
|
passport.use('windowslive', |
||||
|
new WindowsLiveStrategy({ |
||||
|
clientID: appconfig.auth.microsoft.clientId, |
||||
|
clientSecret: appconfig.auth.microsoft.clientSecret, |
||||
|
callbackURL: appconfig.host + '/login/ms/callback' |
||||
|
}, |
||||
|
function(accessToken, refreshToken, profile, cb) { |
||||
|
db.User.processProfile(profile).then((user) => { |
||||
|
return cb(null, user) || true; |
||||
|
}).catch((err) => { |
||||
|
return cb(err, null) || true; |
||||
|
}); |
||||
|
} |
||||
|
)); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// Facebook
|
||||
|
|
||||
|
if(appconfig.auth.facebook && appconfig.auth.facebook.enabled) { |
||||
|
|
||||
|
passport.use('facebook', |
||||
|
new FacebookStrategy({ |
||||
|
clientID: appconfig.auth.facebook.clientId, |
||||
|
clientSecret: appconfig.auth.facebook.clientSecret, |
||||
|
callbackURL: appconfig.host + '/login/facebook/callback', |
||||
|
profileFields: ['id', 'displayName', 'email'] |
||||
|
}, |
||||
|
function(accessToken, refreshToken, profile, cb) { |
||||
|
db.User.processProfile(profile).then((user) => { |
||||
|
return cb(null, user) || true; |
||||
|
}).catch((err) => { |
||||
|
return cb(err, null) || true; |
||||
|
}); |
||||
|
} |
||||
|
)); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// Check for admin access
|
||||
|
|
||||
|
db.onReady.then(() => { |
||||
|
|
||||
|
db.User.count().then((c) => { |
||||
|
if(c < 1) { |
||||
|
winston.info('[' + PROCNAME + '][AUTH] No administrator account found. Creating a new one...'); |
||||
|
db.User.hashPassword('admin123').then((pwd) => { |
||||
|
return db.User.create({ |
||||
|
provider: 'local', |
||||
|
email: appconfig.admin, |
||||
|
name: "Administrator", |
||||
|
password: pwd |
||||
|
}); |
||||
|
}).then(() => { |
||||
|
winston.info('[' + PROCNAME + '][AUTH] Administrator account created successfully!'); |
||||
|
}).catch((err) => { |
||||
|
winston.error('[' + PROCNAME + '][AUTH] An error occured while creating administrator account:'); |
||||
|
winston.error(err); |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
return true; |
||||
|
|
||||
|
}); |
||||
|
|
||||
}; |
}; |
Write
Preview
Loading…
Cancel
Save