diff --git a/src/server/auth/auth.js b/src/server/auth/auth.js index 4ca726d..da40fb3 100644 --- a/src/server/auth/auth.js +++ b/src/server/auth/auth.js @@ -16,7 +16,6 @@ 'use strict'; -var util = require('util'); var logger = require('../common/log-manager'); var extend = require('../common/inherit').extend; var utils = require('../common/utils'); @@ -25,8 +24,6 @@ var baseSvc = require('../common/n-svc').Svc; var express = require('express'); var session = require('express-session'); -//var MongoStore = require('connect-mongo')(session); -var FileStore = require('session-file-store')(session); var SQLiteStore = require('connect-sqlite3')(session); var passport = require('passport'); var corser = require('corser'); @@ -42,22 +39,12 @@ var morgan = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); -var multipart = require('connect-multiparty'); -var multipartMiddleware = multipart(); - - var config = global.app.config; -function setXFrameOption (req, res, next) { - res.setHeader('X-Frame-Options', 'DENY'); - next(); -} - var register = function (auth, conf, unitName, svcType) { auth.set('views', __dirname + '/views'); auth.set('view engine', 'ejs'); - //auth.use(setXFrameOption); auth.use(compression()); auth.use(express.static(__dirname + '/views')); @@ -72,7 +59,14 @@ var register = function (auth, conf, unitName, svcType) { auth.use(corser.create( { methods: ['GET', 'POST', 'DELETE'], - requestHeaders: ['Authorization', 'Accept', 'Accept-Language', 'Content-Language', 'Content-Type', 'Last-Event-ID'], + requestHeaders: [ + 'Authorization', + 'Accept', + 'Accept-Language', + 'Content-Language', + 'Content-Type', + 'Last-Event-ID' + ], supportsCredentials: true, maxAge: 86400 // as 1 day } @@ -110,11 +104,9 @@ var register = function (auth, conf, unitName, svcType) { auth.use(user.router); auth.use(acl.router); auth.use(group.router); - auth.use(function(err, req, res, next) { + auth.use(function(err, req, res) { logger.debug('errorHandler middleware', err); - res.status(500).send('Internal server error'); - //res.send(500, 'Internal server error'); }); auth.disable('x-powered-by'); }; @@ -165,7 +157,7 @@ AuthSvr.prototype.start = function () { logger.info('authorization https server is started at port ' + conf.httpsPort); } -} +}; AuthSvr.prototype.stop = function () { var self = this; @@ -180,7 +172,7 @@ AuthSvr.prototype.stop = function () { } require('./lib/userdb').close(); -} +}; // // AuthSvc @@ -200,22 +192,20 @@ extend(AuthSvc, baseSvc); AuthSvc.prototype.start = function () { var self = this; self.authSvr.start(); -} +}; AuthSvc.prototype.stop = function () { var self = this; self.authSvr.stop(); -} +}; AuthSvc.prototype.started = function () { -} +}; AuthSvc.prototype.stopped = function () { -} - - -exports.Svc = AuthSvc +}; +exports.Svc = AuthSvc; diff --git a/src/server/auth/lib/oauth2-manager.js b/src/server/auth/lib/oauth2-manager.js index d5b8831..63680d8 100644 --- a/src/server/auth/lib/oauth2-manager.js +++ b/src/server/auth/lib/oauth2-manager.js @@ -138,6 +138,7 @@ router.get('/webida/api/oauth/authorize', }); }), function (req, res, next) { + /*jshint camelcase: false */ var allow = { uid: req.user.uid, client: req.oauth2.client.clientID, transaction_id: req.oauth2.transactionID }; @@ -153,11 +154,15 @@ router.get('/webida/api/oauth/authorize', client: req.oauth2.client, isDevClient: false /*isDevClient*/ }); } + /*jshint camelcase: true */ }, + /*jshint unused:false*/ + // Once `next` is removed, the action of this method is getting weired. function(err, req, res, next) { logger.error('authorization err: ', err); res.sendErrorPage(401, err); }, + /*jshint unused:true*/ server.decision() ); @@ -170,7 +175,9 @@ router.post('/oauth/decision', req.body.allow === 'on' ? true : false); */ + /*jshint camelcase: false */ req.body.transaction_id = req.session.allow.transaction_id; + /*jshint camelcase: true */ next(); }, @@ -226,7 +233,7 @@ router.get('/webida/api/oauth/verify', router.post('/webida/api/oauth/personaltoken', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:addNewPersonalToken', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:addNewPersonalToken', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (!err) { return next(); @@ -251,7 +258,7 @@ router.post('/webida/api/oauth/personaltoken', router['delete']('/webida/api/oauth/personaltoken/:personaltoken', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:deletePersonalToken', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:deletePersonalToken', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (!err) { return next(); @@ -278,7 +285,7 @@ router['delete']('/webida/api/oauth/personaltoken/:personaltoken', router.get('/webida/api/oauth/personaltoken', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:getPersonalTokens', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:getPersonalTokens', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (!err) { return next(); diff --git a/src/server/auth/lib/user-manager.js b/src/server/auth/lib/user-manager.js index 76b377e..b1db880 100644 --- a/src/server/auth/lib/user-manager.js +++ b/src/server/auth/lib/user-manager.js @@ -17,11 +17,9 @@ 'use strict'; var async = require('async'); -//var jquery = require('jquery'); var express = require('express'); var bodyParser = require('body-parser'); var passport = require('passport'); -//var login = require('connect-ensure-login'); var LocalStrategy = require('passport-local').Strategy; var ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy; var BearerStrategy = require('passport-http-bearer').Strategy; @@ -52,15 +50,8 @@ var router = express.Router(); router.use(bodyParser.urlencoded({ extended: true })); router.use(bodyParser.json()); -//var urlencodedParser = bodyParser.urlencoded({ extended: true }); -//var jsonParser = bodyParser.json(); - module.exports.router = router; -//var sqlConn = userdb.getSqlConn(); -//var sqlConn = userdb.sqlConn; - - function errLog(err, errMsg) { if (err === 'undefined') { logger.error('[userdb] ' + errMsg); @@ -69,68 +60,6 @@ function errLog(err, errMsg) { } } -function createDefaultPolicy(user, callback) { - var token; - async.waterfall([ - function (next) { - userdb.getPersonalTokens(100000, function (err, result) { - if (err) { - return next(err); - } - if (result.length === 0) { - return next(new ServerError(500, 'Creating default policy failed')); - } - token = result[0].data; - return next(null); - }); - }, function (next) { - userdb.createPolicy(user.uid, config.services.auth.defaultAuthPolicy, token, function (err, policy) { - if (err) { - return next(new ServerError(500, 'Set default auth policy failed')); - } - return next(null, policy.pid); - }); - }, function (pid, next) { - userdb.assignPolicy({pid: pid, user: user.uid}, function (err) { - if (err) { - return next(new ServerError(500, 'Assign default auth policy failed')); - } - return next(null); - }); - }, function (next) { - userdb.createPolicy(user.uid, config.services.auth.defaultAppPolicy, token, function (err, policy) { - if (err) { - return next(new ServerError(500, 'Set default app policy failed')); - } - return next(null, policy.pid); - }); - }, function (pid, next) { - userdb.assignPolicy({pid: pid, user: user.uid}, function (err) { - if (err) { - return next(new ServerError(500, 'Assign default app policy failed')); - } - return next(null); - }); - }, function (next) { - userdb.createPolicy(user.uid, config.services.auth.defaultFSSvcPolicy, token, function (err, policy) { - if (err) { - return next(new ServerError(500, 'Set default fssvc policy failed')); - } - return next(null, policy.pid); - }); - }, function (pid, next) { - userdb.assignPolicy({pid: pid, user: user.uid}, function (err) { - if (err) { - return next(new ServerError(500, 'Assign default fssvc policy failed')); - } - return next(null); - }); - } - ], function (err) { - return callback(err); - }); -} - exports.start = function (/*svc*/) { passport.serializeUser(function (user, done) { logger.debug('serializeUser', user.uid); @@ -259,7 +188,7 @@ exports.start = function (/*svc*/) { if (err || !user) { return next(new Error('Creating the account failed.' + err)); } - createDefaultPolicy(user, function (err) { + userdb.createDefaultPolicy(user, function (err) { if (err) { return next(new Error('Creating the default policy for ' + user.email + ' failed.' + err)); @@ -319,7 +248,7 @@ exports.start = function (/*svc*/) { return done(new Error('Creating the account failed.' + err)); } - createDefaultPolicy(user, function (err) { + userdb.createDefaultPolicy(user, function (err) { if (err) { return next(new Error('Creating the default policy for ' + user.email + ' failed.' + err)); @@ -360,35 +289,36 @@ exports.init = function (callback) { return next(err); } if (results.length > 0) { - return next(null, results[0].uid); + return next(null, results[0]); } else { userdb.addUser(config.services.auth.adminAccount, function (err, user) { if (err) { return next(new ServerError('Creating the Admin account failed.' + err)); } else { - return next(null, user.uid); + return next(null, user); } }); } }); - }, function (uid, next) { - userdb.updateUser({uid: uid}, {isAdmin: 1}, + }, function (user, next) { + userdb.updateUser({uid: user.uid}, {isAdmin: 1}, function (err/*, user*/) { if (err) { return next(new Error('Activating the admin account failed.' + err)); } - return next(null, uid); + user.isAdmin = 1; + return next(null, user); } ); - }, function (uid, next) { - userdb.addNewPersonalToken(uid, cuid(), function (err, token) { + }, function (user, next) { + userdb.addNewPersonalToken(user.uid, cuid(), function (err, token) { if (err) { return next(err); } logger.info('Admin token:', token); - return next(null, {uid: uid}); + return next(null, user); }); - }, createDefaultPolicy + }, userdb.createDefaultPolicy ], function (err) { callback(err); }); @@ -463,7 +393,7 @@ exports.createAdmin2 = function (callback) { return next(null, {uid: uid}); }); }, - createDefaultPolicy + userdb.createDefaultPolicy ], function (err) { return callback(err); }); @@ -575,7 +505,7 @@ router.get('/signup', function (req, res) { router.get('/webida/api/oauth/logout', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:logout', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:logout', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (err) { return res.sendfail(err); @@ -592,7 +522,7 @@ router.get('/webida/api/oauth/logout', router.get('/webida/api/oauth/myinfo', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:getMyInfo', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:getMyInfo', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (err) { return res.sendfail(err); @@ -613,7 +543,7 @@ router.get('/webida/api/oauth/myinfo', router['delete']('/webida/api/oauth/myinfo', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:deleteMyAccount', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:deleteMyAccount', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (err) { return res.sendfail(err); @@ -637,7 +567,7 @@ router.post('/webida/api/oauth/changepassword', multipartMiddleware, userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:changeMyPassword', rsc: 'auth:*'}; + var aclInfo = {uid: req.user.uid, action: 'auth:changeMyPassword', rsc: 'auth:' + req.user.userId}; userdb.checkAuthorize(aclInfo, function (err) { if (err) { return res.sendfail(err); @@ -668,32 +598,6 @@ router.post('/webida/api/oauth/changepassword', return res.sendok(); } }); - - /*var sqlConn = userdb.getSqlConn(); - sqlConn.beginTransaction(function (err) { - if (err) { - var errMsg = 'changepassword error in db'; - errLog(errMsg); - return res.sendfail(errMsg); - } - userdb.updateUser({uid:req.user.uid}, {password: newPW}, function (err, user) { - if (err || !user) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('changePassword failed(server internal error)'); - }); - } - - return res.sendok(); - }); - } - }); - });*/ } ); @@ -793,79 +697,6 @@ router.post('/activateaccount', loginHandler(req, res)(null, user); } }); - - /*var sqlConn = userdb.getSqlConn(); - sqlConn.beginTransaction(function (err) { - if (err) { - var errMsg = 'activateaccount error in db'; - errLog(errMsg, err); - return res.sendfail(errMsg); - } - - var password = new Buffer(req.body.password, 'base64').toString(); - var activationKey = req.body.activationKey; - var user; - - logger.info('activateaccount post', req.body); - - async.waterfall([ - function (next) { - if (password.length < 6) { - return next('password length must be longer than 5 chareacters.'); - } - return next(null); - }, function (next) { - userdb.findUser({activationKey: activationKey}, function (err, users) { - if (err) { - return next(new ServerError(503, 'Get userinfo failed')); - } - - if (users.length === 0) { - return next('Unknown user'); - } - - if (users[0].status === userdb.STATUS.APPROVED) { - return next('Your account is already activated.'); - } - - if (users[0].activationKey !== activationKey) { - return next('Invalid request.'); - } - - return next(null, users[0].uid); - }); - }, function (uid, next) { - userdb.updateUser({uid:uid}, {password: password, status: userdb.STATUS.APPROVED}, - function (err, result) { - if (err || !result) { - return next(new ServerError(503, 'Activating failed')); - } - - user = result; - return next(null); - }); - }, function (next) { - return createDefaultPolicy(user, next); - } - ], function (err) { - if (err || !user) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('activateAccount failed(server internal error)'); - }); - } - - req.session.opener = config.services.auth.signup.webidaSite; - loginHandler(req, res)(null, user); - }); - } - }); - });*/ } ); @@ -895,12 +726,21 @@ function (req, res) { router.get('/webida/api/oauth/deleteaccount', userdb.verifyToken, function (req, res, next) { - var aclInfo = {uid: req.user.uid, action: 'auth:deleteAccount', rsc: 'auth:*'}; - userdb.checkAuthorize(aclInfo, function (err) { + var uid = req.query.uid; + userdb.findUserByUid(uid, function (err, user) { if (err) { return res.sendfail(err); + } else if (user) { + var aclInfo = {uid: req.user.uid, action: 'auth:deleteAccount', rsc: 'auth:' + user.userId}; + userdb.checkAuthorize(aclInfo, function (err) { + if (err) { + return res.sendfail(err); + } + next(); + }); + } else { + return res.send(400, utils.fail('Unknown user by uid: ' + uid)); } - next(); }); }, function (req, res) { @@ -912,52 +752,6 @@ router.get('/webida/api/oauth/deleteaccount', return res.sendok(); } }); - /*var sqlConn = userdb.getSqlConn(); - sqlConn.beginTransaction(function (err) { - if (err) { - var errMsg = 'deleteaccount error in db'; - errLog(errMsg, err); - return res.sendfail(errMsg); - } - - var uid = req.query.uid; - - async.waterfall([ - function (next) { - userdb.deleteUser(uid, function (err) { - if (err) { - return next('deleteAccount deleteUser failed.'); - } - - return next(null); - }); - }, function (next) { - userdb.deleteAllPersonalTokens(uid, function (err) { - if (err) { - return next('deleteAccount deletePersonalToken failed.'); - } - return next(null); - }); - } - ], function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('deleteAccount failed(server internal error)'); - }); - } - - req.logout(); - return res.sendok(); - }); - } - }); - });*/ } ); @@ -991,31 +785,6 @@ function updateUser(req, res) { return res.sendok(updatedUser); } }); - /* var sqlConn = userdb.getSqlConn(); - sqlConn.beginTransaction(function (err) { - if (err) { - var errMsg = 'updateUser error in db'; - errLog(errMsg, err); - return res.sendfail(errMsg); - } - userdb.updateUser(field, updateInfo, function (err, updatedUser) { - if (err || !updatedUser) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('deleteAccount failed(server internal error)'); - }); - } - - return res.sendok(updatedUser); - }); - } - }); - });*/ } router.post('/webida/api/oauth/updateuser2', @@ -1034,16 +803,17 @@ router.post('/webida/api/oauth/updateuser', logger.info('[auth] updateUser', authInfo, user); async.waterfall([ function (cb) { - if (authInfo.uid) { + if (authInfo.userId) { return cb(); } userdb.findUser({email: authInfo.email}, function (err, users) { if (err || users.length === 0) { - return res.sendfail(new ClientError('Unknown user')); + return res.sendfail(new ClientError('Unknown user: ' + authInfo.email)); } authInfo.uid = users[0].uid; + authInfo.userId = users[0].userId; return cb(); }); }, function (cb) { @@ -1053,7 +823,7 @@ router.post('/webida/api/oauth/updateuser', return cb(); } - rsc = 'auth:' + authInfo.uid; + rsc = 'auth:' + authInfo.userId; aclInfo = {uid: req.user.uid, action: 'auth:updateUser', rsc: rsc}; userdb.checkAuthorize(aclInfo, function (err) { if (err) { @@ -1071,46 +841,6 @@ router.post('/webida/api/oauth/updateuser', }); }, updateUser - /* - function (req, res) { - var authInfo = req.body; - var user = req.user; - var field = {}; - - if (authInfo.email) { - field.email = authInfo.email; - } else { - authInfo.uid = parseInt(authInfo.uid); - field.uid = authInfo.uid; - } - - if (authInfo.isAdmin && !user.isAdmin) - return res.send(401, utils.fail('Cannot update the isAdmin field if you are not a admin user.')); - - sqlConn.beginTransaction(function (err) { - if (err) - return next(err); - - userdb.updateUser(field, authInfo, function (err, updatedUser) { - if (err || !updatedUser) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('deleteAccount failed(server internal error)'); - }); - } - - return res.sendok(updatedUser); - }); - } - }); - }); - } - */ ); router.post('/webida/api/oauth/signup', @@ -1127,61 +857,6 @@ router.post('/webida/api/oauth/signup', return res.sendok(); } }); - /*var sqlConn = userdb.getSqlConn(); - sqlConn.beginTransaction(function (err) { - if (err) { - var errMsg = 'signup error in db'; - errLog(errMsg, err); - return res.sendfail(errMsg); - } - - async.waterfall([ - function (next) { - var authinfo = {email: email, password: key, activationKey: key}; - userdb.findOrAddUser(authinfo, function (err, result) { - return next(err); - }); - }, - function (next) { - var redirect = config.services.auth.signup.activatingURL + key; - var emailBody = 'Welcome to Webida!!' - + 'This is the sign up validation email to webida.org of ' + email + ',' - + 'Please click belows.

' - + '' + redirect + ''; - - var mailOptions = { - from: config.services.auth.signup.emailSender, - to: email, - subject: 'Email validation check for webida.org signup', - html: emailBody - }; - - sendEmail(mailOptions, function (err, data) { - if (err) { - return res.status(503).send('Failed to send activating email.'); - } - return next(); - }); - } - ], - function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail(err); - }); - } else { - sqlConn.commit(function (err) { - if (err) { - sqlConn.rollback(function () { - return res.sendfail('deleteAccount failed(server internal error)'); - }); - } - - return res.sendok(); - }); - } - }); - });*/ } ); diff --git a/src/server/auth/lib/userdb.js b/src/server/auth/lib/userdb.js index 1a60746..7d81239 100644 --- a/src/server/auth/lib/userdb.js +++ b/src/server/auth/lib/userdb.js @@ -112,11 +112,12 @@ exports.createGuestSequence = function (callback) { }, context); } ], function (err, context) { - if (err) + if (err) { logger.error(err); + } callback(err, context.data('seq')); }); -} +}; function createSubject(type, callback) { db.transaction([ @@ -326,7 +327,9 @@ exports.getPersonalTokens = function (uid, callback, context) { }; exports.verifyToken = function (req, res, next) { + /* jshint camelcase: false */ var token = req.headers.authorization || url.parse(req.url, true).query.access_token; + /* jshint camelcase: true */ if (!token) { req.user = null; return next(); @@ -1360,7 +1363,7 @@ exports.setLastLogin = function (uid, callback) { exports.checkAuthorize = function (aclInfo, callback) { // if uid === owner then return true; var rscArr; - var idArr = [0, 1]; + var idArr = ['0', '1']; function makeRscArr(rsc) { var rscArr = [ @@ -1734,7 +1737,12 @@ exports.createDefaultPolicy = function (user, callback, context) { return next(null); }, context); }, function (next) { - exports.createPolicy(user.uid, config.services.auth.defaultAuthPolicy, token, function (err, policy) { + var userId = (user.isAdmin === 1) ? '*' : user.userId; + var defaultAuthPolicy = _.clone(config.services.auth.defaultAuthPolicy); + defaultAuthPolicy.resource = defaultAuthPolicy.resource.map(function (rsc) { + return _.template(rsc)({userId: userId}); + }); + exports.createPolicy(user.uid, defaultAuthPolicy, token, function (err, policy) { if (err) { return next(new ServerError(500, 'Set default auth policy failed')); } diff --git a/src/server/common/log-manager.js b/src/server/common/log-manager.js index 08509d0..8e7ddb0 100644 --- a/src/server/common/log-manager.js +++ b/src/server/common/log-manager.js @@ -19,16 +19,11 @@ var dateFormat = require('dateformat'); var confMgr = require('./conf-manager'); var config = confMgr.conf; -var email = require('emailjs/email'); var winston = require('winston'); var dateFormat = require('dateformat'); var cluster = require('cluster'); var path = require('path'); -var now = new Date(); -var nowStr = dateFormat(now, "yyyymmdd_HHMMss"); - - function getModuleFilename() { var mod = module; while (mod.parent) { @@ -38,10 +33,10 @@ function getModuleFilename() { } -var name = (typeof global.app !== 'undefined' && global.app.name) || getModuleFilename(); -name = path.basename(name, '.js'); +var moduleFileName = (typeof global.app !== 'undefined' && global.app.name) || getModuleFilename(); +moduleFileName = path.basename(moduleFileName, '.js'); -var logFileName = config.logPath + '/' + name + '.log'; +var logFileName = config.logPath + '/' + moduleFileName + '.log'; function curTime() { return dateFormat(new Date(), 'yyyy-mm-dd hh:MM:ss-l'); @@ -75,7 +70,7 @@ if (cluster.isMaster) { }); } else { - console.log('(console) logger %s in child proc ...', name); + console.log('(console) logger %s in child proc ...', moduleFileName); logger = new (winston.Logger) ({ transports: [ new (winston.transports.Console)({ @@ -93,7 +88,7 @@ if (cluster.isMaster) { module.exports = logger; module.exports.stream = { - write: function(msg, encoding) { + write: function(msg/*, encoding*/) { logger.info(msg); } }; @@ -106,30 +101,6 @@ module.exports.simpleLogger = function (tagMessage) { if (req.url) { loggingText = loggingText + ' : ' + req.url; } logger.debug(loggingText); next(); - } -} - -module.exports.sendEmail = function (username, password, host, isSecure, sender, receiver, subject, message, callback) { - var server = email.server.connect( { - user: username, - password: password, - host: host, - ssl: isSecure - }); - - server.send( { - text: message, - from: sender, - to: receiver, - //cc: , - subject: subject - }, function(error, response) { - if (error) { - logger.error('email send error:' + error); - } else { - logger.info('Email sent: ' + response); - callback(response); - } - }); -} + }; +}; diff --git a/src/server/common/server-base.js b/src/server/common/server-base.js deleted file mode 100644 index a0aeeb5..0000000 --- a/src/server/common/server-base.js +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (c) 2012-2015 S-Core Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var logger = require('./log-manager'); -var domain = require('domain'); - - -var serverDomain = domain.create(); -exports.serverDomain = serverDomain; - -serverDomain.on('error', function(err) { - logger.error('--- Server Domain Error ---', err.stack); - - logger.sendEmail('no-reply@webida.org', 'webidascore','dsmtp.naver.com', true, -'webida ', 'DaiYoung Kim , wooyoung cho , sangjin ', - '[webida-server-notice] Server encountered an critical error and will be shutdown', err.stack, function (message) { - logger.info('sent email: ', message); - logger.info('Exit server process after sent email'); - process.exit(); // TODO : need to process a graceful closing - }); - - // if SMPT server is not response until timeout, then exit process. - setTimeout(function() { - logger.info('Exit server process by timeout'); - process.exit(); // TODO : need - }, 1000 * 60); -}); - -var EventEmitter = require('events').EventEmitter; -var express = require('express'); -var connectDomain = require('connect-domain'); -var corser = require('corser'); -var fs = require('fs'); - -var utils = require('./utils'); -var config = require('./conf-manager').conf; -var authMgr = require('./auth-manager'); - - -// set logger format -express.logger.format('dev2', function (tokens, req, res) { - var status = res.statusCode; - var len = parseInt(res.getHeader('Content-Length'), 10); - var color = 32; - - if (status >= 500) { color = 31; } - else if (status >= 400) { color = 33; } - else if (status >= 300) { color = 36; } - - len = isNaN(len) ? '' : len = ' - ' + len; - - return '\u001b[90m' + - req.ip + ' ' + - req.method + ' ' + - req.originalUrl + ' ' + '\u001b[' + color + 'm' + res.statusCode + - ' \u001b[90m' + (new Date() - req._startTime) + 'ms' + len + '\u001b[0m'; -}); - -function gracefulExit() { - process.exit(); -} - -process.on('SIGINT', function () { - logger.info('gracefully shutting down from SIGINT (Crtl-C)'); - gracefulExit(); -}); - -process.on('SIGTERM', function () { - logger.info('gracefully shutting down from SIGTERM'); - gracefulExit(); -}); - - -// custom middlewares -function urlParser(req, res, next) { - req.parsedUrl = require('url').parse(req.url, true); - next(); -} - -/* - * http Svr class - */ - -var httpSvr = function(service, host, port, ioOptions) { - this.host = host; - this.port = port; - this.app = express(); - this.lsn = null; - this.service = service; - this.ioOptions = ioOptions; - //this.init(); -} - -httpSvr.prototype.init = function() { - var self = this; - - if (this.ioOptions) { - self.app.http(this.ioOptions).io(); - } else { - self.app.http().io(); - } - - self.setupMiddleware(self.app); - self.setupIo(self.app); - logger.info('httpSvr::init()'); -} - -function setXFrameOption (req, res, next) { - res.setHeader('X-Frame-Options', 'SAMEORIGIN'); - next(); -} - -httpSvr.prototype.setupMiddleware = function(app) { - logger.info('httpSvr::setupMiddleware'); - app.use(connectDomain()); - app.enable('trust proxy'); - app.use(express.compress()); - app.use(express.json()); - app.use(express.urlencoded()); - app.use(setXFrameOption); - app.use(corser.create( - { - methods: ['GET', 'POST', 'DELETE'], - requestHeaders: ['Authorization', 'Accept', 'Accept-Language', 'Content-Language', 'Content-Type', 'Last-Event-ID'], - supportsCredentials: true, - maxAge: 86400 // as 1 day - } - )); - app.options('/webida/api/*', function (req, res) { - // Just finish preflight request. - res.writeHead(204); - res.end(); - }); - app.use(express.logger({stream:logger.stream})); - app.use(urlParser); - app.use(utils.senders); - app.use(logger.simpleLogger('REQUEST')); - app.use(utils.onConnectError); - -} - -httpSvr.prototype.setupIo = function(app) { - app.io.configure(function() { - app.io.enable('browser client minification'); // send minified client - app.io.enable('browser client gzip'); // gzip the file - //app.io.set('log level', 1); // reduce logging - app.io.set('log level', 7); // reduce logging - app.io.set('authorization', function (handshake, accept) { - var accessToken = handshake.query.access_token; - if (accessToken) { - logger.debug('Socket.io auth', accessToken); - authMgr._verifyToken(accessToken, function (err, user) { - if (err) { - logger.debug('Verifying access token failed', arguments, accessToken); - accept('Verifying access token failed.', false); - } else { - accept(null, true); - logger.debug('Vefified access token', user); - handshake.user = user; - } - }); - } else { - logger.debug('Authorization failed.(No access_token)'); - accept('Authorization failed.(No access_token)', false); - } - }); - }); -} - -httpSvr.prototype.start = function () { - var self = this; - - self.init(); - self.lsn = self.app.listen(self.port, self.host, function () { - logger.info('Http server listening on port: %d', self.port); - }); - self.service.emit.emit('svrStarted', this); -} - -function closeServer(lsn) { - if (lsn) { - lsn.close(); - lsn = null; - } -} - -httpSvr.prototype.stop = function() { - closeServer(this.lsn); - this.service.emit.emit('svrStopped', this); -} - -exports.httpSvr = httpSvr; - -/* - * Service class is collection of servers - */ - -function Service(servername) { - this.name = servername; - this.config = config; - this.supportHttps = true; - this.serverList = new Array(); - this.emit = new EventEmitter(); - - var self = this; - this.emit.on('svrStarted', function(svr) { - self.svrStarted(svr); - }); - - this.emit.on('svrStopped', function() { - self.svrStopped(svr); - }); -} - -Service.prototype.addSvr = function(svr) { - this.serverList.push(svr); -} - -Service.prototype.getConfig = function () { - return this.config; -} -/* - * start service should start all servers - * if you want change default behavior of this function, then do overwride. - */ -Service.prototype.start = function () { - var self = this; - - var http = new httpSvr(self, config.httpHost, config.httpPort); - this.addSvr(http); - http.start(); - - if (self.config.httpsHost && self.config.httpsPort) { - // Set ssl keys for http server - var options = { - key: fs.readFileSync(config.sslKeyPath, 'utf8'), - cert: fs.readFileSync(config.sslCertPath, 'utf8') - }; - - var https = new httpSvr(self, config.httpsHost, config.httpsPort, options); - this.addSvr(https); - https.start(); - } -} - -Service.prototype.started = function() { - logger.info('started'); -} - -/* - * stop service that shutdowns all servers - */ -Service.prototype.stop = function() { - logger.info('stopping server'); - for (var i=0; i'] }, defaultAppPolicy: { diff --git a/src/server/conf/mapper/user-mapper.json5 b/src/server/conf/mapper/user-mapper.json5 index ac612ba..5c19ac4 100644 --- a/src/server/conf/mapper/user-mapper.json5 +++ b/src/server/conf/mapper/user-mapper.json5 @@ -61,7 +61,7 @@ {#where} \ {#if userId} AND user_id = {{userId}} {/if} \ {#if uid !== undefined} AND uid = {{uid}} {/if} \ - {#if email} AND email LIKE CONCAT('%', {{email}}, '%') {/if} \ + {#if email} AND email = {{email}} {/if} \ {#if name} AND name LIKE CONCAT('%', {{name}}, '%') {/if} \ {#if company} AND company LIKE CONCAT('%', {{company}}, '%') {/if} \ {#if telephone} AND telephone LIKE CONCAT('%', {{telephone}}, '%') {/if} \ diff --git a/src/server/fs/lib/console-manager.js b/src/server/fs/lib/console-manager.js index 9213e60..03a7c46 100644 --- a/src/server/fs/lib/console-manager.js +++ b/src/server/fs/lib/console-manager.js @@ -266,8 +266,7 @@ function handleNewEvent(socket, options, cb) { } /* find keyword */ - while ((state !== STATE.DONE) && - (pos = msg.indexOf(KEYWORD)) !== -1) { + while ((state !== STATE.DONE) && (pos = msg.indexOf(KEYWORD)) !== -1) { /* parse & get cpid */ if (state === STATE.CPID) { cpid = parseInt(msg.substr(0, pos)); diff --git a/src/server/package.json b/src/server/package.json index 2b2b517..ba43ad5 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -1,7 +1,11 @@ { "name": "webida-server", - "version": "0.0.41", + "version": "1.5.0", "main": "./unit-manager.js", + "repository": { + "type": "git", + "url": "git://github.com/webida/webida-server.git" + }, "dependencies": { "dateformat": "1.0.11", "connect-domain": "*", @@ -9,7 +13,6 @@ "express-session": "1.9.1", "http-proxy": "0.10.3", "http-master": "~1.0.18", - "session-file-store": "0.0.12", "connect-sqlite3": "0.9.5", "socket.io": "1.2.0", "hashmap": "1.0.1", @@ -18,10 +21,8 @@ "unzip": "0.1.9", "fstream": "0.1.25", "corser": "2.0.0", - "emailjs": "*", "optimist": "0.6.0", "underscore": "1.5.2", - "ncp": "0.4.2", "request": "*", "winston": "~1.1.2", "querystring": "*", @@ -37,7 +38,6 @@ "nexpect": "0.4.2", "connect-ensure-login": "0.1.x", "oauth2orize": "0.x.x", - "cryptojs": "*", "url": "*", "passport-local": "0.1.x", "passport-http": "0.2.x", @@ -46,7 +46,6 @@ "ejs": "0.7.x", "optimist": "*", "underscore": "*", - "ssh-keygen": "*", "async": "*", "jquery": "*", "passport-github": "*", @@ -61,8 +60,6 @@ "fs-extra": "0.8.1", "pty.js": "0.2.7-1", "q": "1.0.1", - "q-io": "1.11.0", - "ref": "0.1.3", "send": "0.2.0", "shortid": "2.2.2", "tmp": "0.0.23", @@ -72,7 +69,6 @@ "mkdirp": "0.5.0", "guid": "0.0.12", "replace": "0.2.9", - "terminal.js": "^1.0.3", "lodash": "3.9.3", "data-mapper": "*", "cron": "^1.0.9", @@ -80,6 +76,7 @@ "node-watch": "~0.3.4" }, "devDependencies": { + "q-io": "1.11.0", "connect": "~2.13.0" } }