+185
-197
@@ -9,125 +9,118 @@ /** | ||
| var App = module.exports = Class(function(){ | ||
| //controller和action的校验正则 | ||
| var nameReg = /^[A-Za-z](\w)*$/; | ||
| //注释的正则 | ||
| var commentReg = /((\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s))/mg; | ||
| //获取形参的正则 | ||
| var parsReg = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; | ||
| //controller和action的校验正则 | ||
| var nameReg = /^[A-Za-z](\w)*$/; | ||
| //注释的正则 | ||
| var commentReg = /((\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s))/mg; | ||
| //获取形参的正则 | ||
| var parsReg = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; | ||
| return { | ||
| http: null, | ||
| init: function(http){ | ||
| this.http = http; | ||
| }, | ||
| dispatch: function(){ | ||
| //路径解析 | ||
| return thinkRequire('Dispatcher')(this.http).run(); | ||
| }, | ||
| exec: function(){ | ||
| var group = this.http.group; | ||
| var controller = ''; | ||
| var self = this; | ||
| //检测controller名 | ||
| if (!nameReg.test(this.http.controller)) { | ||
| controller = ''; | ||
| }else{ | ||
| controller = A(group + "/" + this.http.controller, this.http); | ||
| } | ||
| if (!controller) { | ||
| var event = C('empty_controller_event'); | ||
| if (event && E(event, true).length > 0) { | ||
| E(event, this.http.controller, group, this.http); | ||
| return true; | ||
| }; | ||
| return getPromise(this.http.controller + " controller not found", true); | ||
| }; | ||
| var action = this.http.action; | ||
| var oldAction = action; | ||
| //添加action后缀 | ||
| action += C('action_suffix') || ""; | ||
| //检测action名 | ||
| if (!nameReg.test(action)) { | ||
| return getPromise('action name error', true); | ||
| }; | ||
| var initReturnPromise = getPromise(controller.__initReturn); | ||
| //对应的action方法存在 | ||
| if (typeof controller[action] == 'function') { | ||
| //方法参数自动绑定,直接从形参里拿到对应的值 | ||
| if (C('url_params_bind')) { | ||
| var toString = controller[action].toString(); | ||
| toString = toString.replace(commentReg, ''); | ||
| var match = toString.match(parsReg)[1].split(/,/).filter(function(item){ | ||
| return item; | ||
| }); | ||
| //匹配到形参 | ||
| if (match && match.length) { | ||
| var data = []; | ||
| match.forEach(function(item){ | ||
| var value = self.http.post[item] || self.http.get[item] || ""; | ||
| data.push(value); | ||
| }); | ||
| return initReturnPromise.then(function(){ | ||
| return self.execAction(controller, action, oldAction, data); | ||
| }) | ||
| } | ||
| } | ||
| return initReturnPromise.then(function(){ | ||
| return self.execAction(controller, action, oldAction); | ||
| }) | ||
| }else{ | ||
| //当指定的方法不存在时,调用魔术方法 | ||
| //默认为__call方法 | ||
| if (C('call_method') && typeof controller[C('call_method')] == 'function') { | ||
| return initReturnPromise.then(function(){ | ||
| return controller[C('call_method')](action); | ||
| }); | ||
| }; | ||
| } | ||
| return getPromise("action: " + action + " not found", true); | ||
| }, | ||
| /** | ||
| * 执行一个action, 支持before和after的统一操作 | ||
| * 不对每个action都增加一个before和after,而是使用统一的策略 | ||
| * 默认before和after调用名__before和__after | ||
| * @param {[type]} controller [description] | ||
| * @param {[type]} action [description] | ||
| * @param {[type]} oldAction [description] | ||
| * @param {[type]} data [description] | ||
| * @return {[type]} [description] | ||
| */ | ||
| execAction: function(controller, action, oldAction, data){ | ||
| var promise = null; | ||
| //before action | ||
| var before = C('before_action_name'); | ||
| if (before && typeof controller[before] == 'function') { | ||
| var ret = controller[before].call(controller, oldAction, action); | ||
| promise = getPromise(ret); | ||
| }else{ | ||
| promise = getPromise(); | ||
| } | ||
| promise = promise.then(function(){ | ||
| var ret = null; | ||
| //绑定方法参数 | ||
| if (data) { | ||
| ret = controller[action].apply(controller, data); | ||
| }else{ | ||
| ret = controller[action](); | ||
| } | ||
| return getPromise(ret); | ||
| }).then(function(){ | ||
| //after action | ||
| var after = C('after_action_name'); | ||
| if (after && typeof controller[after] == 'function') { | ||
| return controller[after].call(controller, oldAction, action); | ||
| }; | ||
| }); | ||
| //debug模式下将错误信息打印出来 | ||
| if (APP_DEBUG) { | ||
| promise = promise.catch(function(err){ | ||
| console.log(err) | ||
| }); | ||
| }; | ||
| return promise; | ||
| } | ||
| } | ||
| return { | ||
| http: null, | ||
| init: function(http){ | ||
| this.http = http; | ||
| }, | ||
| dispatch: function(){ | ||
| //路径解析 | ||
| return thinkRequire('Dispatcher')(this.http).run(); | ||
| }, | ||
| exec: function(){ | ||
| var group = this.http.group; | ||
| var controller = ''; | ||
| var self = this; | ||
| //检测controller名 | ||
| if (!nameReg.test(this.http.controller)) { | ||
| controller = ''; | ||
| }else{ | ||
| controller = A(group + "/" + this.http.controller, this.http); | ||
| } | ||
| if (!controller) { | ||
| var event = C('empty_controller_event'); | ||
| if (event && E(event, true).length > 0) { | ||
| E(event, this.http.controller, group, this.http); | ||
| return true; | ||
| }; | ||
| return getPromise(this.http.controller + " controller not found", true); | ||
| }; | ||
| var action = this.http.action; | ||
| var oldAction = action; | ||
| //添加action后缀 | ||
| action += C('action_suffix') || ""; | ||
| //检测action名 | ||
| if (!nameReg.test(action)) { | ||
| return getPromise('action name error', true); | ||
| }; | ||
| var initReturnPromise = getPromise(controller.__initReturn); | ||
| //对应的action方法存在 | ||
| if (typeof controller[action] == 'function') { | ||
| //方法参数自动绑定,直接从形参里拿到对应的值 | ||
| if (C('url_params_bind')) { | ||
| var toString = controller[action].toString(); | ||
| toString = toString.replace(commentReg, ''); | ||
| var match = toString.match(parsReg)[1].split(/,/).filter(function(item){ | ||
| return item; | ||
| }); | ||
| //匹配到形参 | ||
| if (match && match.length) { | ||
| var data = []; | ||
| match.forEach(function(item){ | ||
| var value = self.http.post[item] || self.http.get[item] || ""; | ||
| data.push(value); | ||
| }); | ||
| return initReturnPromise.then(function(){ | ||
| return self.execAction(controller, action, oldAction, data); | ||
| }) | ||
| } | ||
| } | ||
| return initReturnPromise.then(function(){ | ||
| return self.execAction(controller, action, oldAction); | ||
| }) | ||
| }else{ | ||
| //当指定的方法不存在时,调用魔术方法 | ||
| //默认为__call方法 | ||
| if (C('call_method') && typeof controller[C('call_method')] == 'function') { | ||
| return initReturnPromise.then(function(){ | ||
| return controller[C('call_method')](action); | ||
| }); | ||
| }; | ||
| } | ||
| return getPromise("action: " + action + " not found", true); | ||
| }, | ||
| /** | ||
| * 执行一个action, 支持before和after的统一操作 | ||
| * 不对每个action都增加一个before和after,而是使用统一的策略 | ||
| * 默认before和after调用名__before和__after | ||
| * @param {[type]} controller [description] | ||
| * @param {[type]} action [description] | ||
| * @param {[type]} oldAction [description] | ||
| * @param {[type]} data [description] | ||
| * @return {[type]} [description] | ||
| */ | ||
| execAction: function(controller, action, oldAction, data){ | ||
| var promise = null; | ||
| //before action | ||
| var before = C('before_action_name'); | ||
| if (before && typeof controller[before] == 'function') { | ||
| var ret = controller[before].call(controller, oldAction, action); | ||
| promise = getPromise(ret); | ||
| }else{ | ||
| promise = getPromise(); | ||
| } | ||
| return promise.then(function(){ | ||
| var ret = null; | ||
| //绑定方法参数 | ||
| if (data) { | ||
| ret = controller[action].apply(controller, data); | ||
| }else{ | ||
| ret = controller[action](); | ||
| } | ||
| return getPromise(ret); | ||
| }).then(function(){ | ||
| //after action | ||
| var after = C('after_action_name'); | ||
| if (after && typeof controller[after] == 'function') { | ||
| return controller[after].call(controller, oldAction, action); | ||
| }; | ||
| }); | ||
| } | ||
| } | ||
| }); | ||
@@ -140,6 +133,6 @@ | ||
| App.run = function(){ | ||
| if (APP_MODE && App.mode[APP_MODE]) { | ||
| return App.mode[APP_MODE](); | ||
| }; | ||
| return App.mode._default(); | ||
| if (APP_MODE && App.mode[APP_MODE]) { | ||
| return App.mode[APP_MODE](); | ||
| }; | ||
| return App.mode._default(); | ||
| } | ||
@@ -151,29 +144,29 @@ /** | ||
| App.mode = { | ||
| cli: function(){ | ||
| var http = thinkRequire("Http")[APP_MODE](APP_MODE_DATA); | ||
| return App.listener(http); | ||
| }, | ||
| _default: function(){ | ||
| var clusterNums = C('use_cluster'); | ||
| //不使用cluster | ||
| if (clusterNums === false) { | ||
| return App.createServer(); | ||
| } | ||
| if (clusterNums === 0 || clusterNums === true) { | ||
| clusterNums = require('os').cpus().length; | ||
| }; | ||
| if (cluster.isMaster) { | ||
| for (var i = 0; i < clusterNums; i++) { | ||
| cluster.fork(); | ||
| } | ||
| cluster.on('exit', function(worker, code, signal) { | ||
| console.log('worker ' + worker.process.pid + ' died'); | ||
| process.nextTick(function(){ | ||
| cluster.fork(); | ||
| }); | ||
| }); | ||
| }else { | ||
| App.createServer(); | ||
| } | ||
| } | ||
| cli: function(){ | ||
| var http = thinkRequire("Http")[APP_MODE](APP_MODE_DATA); | ||
| return App.listener(http); | ||
| }, | ||
| _default: function(){ | ||
| var clusterNums = C('use_cluster'); | ||
| //不使用cluster | ||
| if (clusterNums === false) { | ||
| return App.createServer(); | ||
| } | ||
| if (clusterNums === 0 || clusterNums === true) { | ||
| clusterNums = require('os').cpus().length; | ||
| }; | ||
| if (cluster.isMaster) { | ||
| for (var i = 0; i < clusterNums; i++) { | ||
| cluster.fork(); | ||
| } | ||
| cluster.on('exit', function(worker, code, signal) { | ||
| console.log('worker ' + worker.process.pid + ' died'); | ||
| process.nextTick(function(){ | ||
| cluster.fork(); | ||
| }); | ||
| }); | ||
| }else { | ||
| App.createServer(); | ||
| } | ||
| } | ||
| } | ||
@@ -185,11 +178,11 @@ /** | ||
| App.createServer = function(){ | ||
| var server = require("http").createServer(function (req, res) { | ||
| thinkRequire("Http")(req, res).run(App.listener); | ||
| }); | ||
| var params = [C('port')]; | ||
| //禁止外网直接通过IP访问 | ||
| if (C('deny_remote_access_by_ip')) { | ||
| params.push("127.0.0.1"); | ||
| }; | ||
| server.listen.apply(server, params); | ||
| var server = require("http").createServer(function (req, res) { | ||
| thinkRequire("Http")(req, res).run(App.listener); | ||
| }); | ||
| var params = [C('port')]; | ||
| //禁止外网直接通过IP访问 | ||
| if (C('deny_remote_access_by_ip')) { | ||
| params.push("127.0.0.1"); | ||
| }; | ||
| server.listen.apply(server, params); | ||
| }; | ||
@@ -202,37 +195,32 @@ /** | ||
| App.listener = function(http){ | ||
| //自动发送thinkjs和版本的header | ||
| http.setHeader("X-Powered-By", "thinkjs-" + THINK_VERSION); | ||
| //初始化Session | ||
| if (C('session_auto_start')) { | ||
| thinkRequire('Session').start(http); | ||
| }; | ||
| var instance = App(http); | ||
| var promise = tag ('app_init', http).then(function(){ | ||
| return instance.dispatch(); | ||
| }).then(function(){ | ||
| return tag('app_begin', http); | ||
| }).then(function(){ | ||
| return tag('action_init', http); | ||
| }).then(function(){ | ||
| return instance.exec(); | ||
| }).then(function(){ | ||
| return tag('app_end', http); | ||
| }); | ||
| //debug模式下将错误信息打印出来 | ||
| if (APP_DEBUG) { | ||
| promise = promise.catch(function(err){ | ||
| console.log(err); | ||
| }) | ||
| }else if (http.res) { | ||
| //显示默认的错误页 | ||
| promise = promise.catch(function(err){ | ||
| http.setHeader('Content-Type', 'text/html; charset=' + C('encoding')); | ||
| var readStream = fs.createReadStream(C('error_tpl_path')); | ||
| readStream.pipe(http.res); | ||
| readStream.on("end", function(){ | ||
| http.res.end(); | ||
| }) | ||
| }) | ||
| } | ||
| return promise; | ||
| //自动发送thinkjs和版本的header | ||
| http.setHeader("X-Powered-By", "thinkjs-" + THINK_VERSION); | ||
| //初始化Session | ||
| if (C('session_auto_start')) { | ||
| thinkRequire('Session').start(http); | ||
| }; | ||
| var instance = App(http); | ||
| return tag ('app_init', http).then(function(){ | ||
| return instance.dispatch(); | ||
| }).then(function(){ | ||
| return tag('app_begin', http); | ||
| }).then(function(){ | ||
| return tag('action_init', http); | ||
| }).then(function(){ | ||
| return instance.exec(); | ||
| }).then(function(){ | ||
| return tag('app_end', http); | ||
| }).catch(function(err){ | ||
| console.log(isError(err) ? err.stack : err); | ||
| return err; | ||
| }).catch(function(err){ | ||
| if (http.res) { | ||
| http.setHeader('Content-Type', 'text/html; charset=' + C('encoding')); | ||
| var readStream = fs.createReadStream(C('error_tpl_path')); | ||
| readStream.pipe(http.res); | ||
| readStream.on("end", function(){ | ||
| http.res.end(); | ||
| }) | ||
| }; | ||
| }) | ||
| } |
@@ -114,3 +114,3 @@ /** | ||
| //输出模版解析异常 | ||
| console.log(err); | ||
| console.log(isError(err) ? err.stack : err); | ||
| }) | ||
@@ -117,0 +117,0 @@ } |
+1
-1
| { | ||
| "name": "thinkjs", | ||
| "description": "thinkphp web framework for nodejs", | ||
| "version": "0.3.15", | ||
| "version": "0.3.16", | ||
| "author": { | ||
@@ -6,0 +6,0 @@ "name": "welefen", |
Network access
Supply chain riskThis module accesses the network.
Found 3 instances in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 3 instances in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
189599
-1.03%5715
-0.21%