Example #1
0
module.exports= function(app,passport){
	app.use(bodyParser());
	app.use(busboy());


//Ruta para verificar si esta autenticado
	app.get('/loggedin', function(req, res) { 
		//Si esta autenticado devuelve el usuario
		res.send(req.isAuthenticated() ? req.user : '******'); 
	}); 

//Cierra la sesion actual del usuario
	app.get('/logout', function (req, res){
	  req.logout();
	  res.redirect('/');
	});
	
//
	app.post('/signup',function(req,res,next){
		console.log(req.body.username);
		console.log(req.body.password);
		passport.authenticate('local-signup',function(err, user, info) {
			console.log(user);
			res.json(user);
  		})(req, res, next);
	});

	app.post('/login',function(req,res,next){
		passport.authenticate('local-login',function(err, user, info) {

			

			if(user != false){
				req.login(user,function(err){
					if (err) { return next(err); }
				});
				console.log(user.local.role);
				res.json(user);
			}else{
				console.log(info);
				res.json(info);
			}
			
  		})(req, res, next);
	});

	app.post('/uploadxml', function (req, res){
		var fstream;
		req.pipe(req.busboy);
		req.busboy.on('file',function (fieldname,file,filename){
			console.log('Uploading: ' + filename);
			fstream = fs.createWriteStream('./xmls/'+filename);
			file.pipe(fstream);
			fstream.on('close',function(){
				console.log(filename);
				rxml.readXml(filename,function (doneXml){
					res.json(doneXml);
					console.log('ok' + doneXml);
				});
				
			});
		});
	});

	app.get('/getXml',function (req,res){
		var rfc = "zzxcasd";
		

		var builder = new xml2js.Builder();
		

		var stream = fs.createWriteStream("./xmls/my_file.xml");
		stream.on('open', function(fd) {
		  console.log("hola")
		  stream.write('<?xml version="1.0" encoding="utf-8"?>\n');
		  stream.write('<cfdi:comprobante rfc="'+ rfc + '" >\n');
		  stream.end();
		  
		});
	});

	app.get('*', function(req, res) {
		res.sendfile('./public/index.html');
	});
	
};
Example #2
0
_.extend(app.locals, {
  config: config,
  Loader: Loader,
  assets: assets
});

app.use(errorPageMiddleware.errorPage);
_.extend(app.locals, require('./common/render_helper'));
app.use(function(req, res, next) {
  res.locals.csrf = req.csrfToken ? req.csrfToken() : '';
  next();
});

app.use(busboy({
  limits: {
    fileSize: bytes(config.file_limit)
  }
}));

// routes
app.use('/api/v1', function(req, res, next) {
  if (req.headers.origin) {
    res.setHeader("Access-Control-Allow-Origin", req.headers.origin);
    res.setHeader('Access-Control-Allow-Credentials', 'true');
  }
  next();
}, apiRouterV1);

app.use('/', webRouter);

// error handler
Example #3
0
File: app.js Project: garnace/foam
});
*/
/* put above
http.createServer(app).listen(app.get('port'), function() {
		console.log('Express db server listening on port '+ app.get('port'));
		});
*/
	//app.listen(port);
	//console.log("listening to port");
app.use(function(req,res,next){
	req.db=db;
	next();

});
//app.locals.db = db;
app.use(busboy());



app.get('/api/v1/recipes', recipesModel.getRecipes);
app.get('/api/v1/recipesAll', recipesModel.getAllRecipes);
app.get('/', serveFirstPage);
//app.post('/upload',multipartMiddleware,uploadFile);
app.post('/upload',uploadFilebus);
//app.post('/upload',uploadFile);
//app.post('/upload',upStub);
//app.post('/upload',upFile);
app.get('/randomRecipe', serveRandomRecipe);
/*app.get('/listdb',function(req,res){

	db.driver.admin.listDatabases(function(e,dbs){
Example #4
0
		config.allowCORS);
	return true;
}

var server = restify.createServer();

server.use(restify.gzipResponse());

// Increase the form field size limit from the 2M default.
server.use(restify.queryParser());
//server.use(restify.bodyParser());

// form parsing
server.use(busboy({
	immediate: true,
	// Increase the form field size limit from the 1M default.
	limits: { fieldSize: 15 * 1024 * 1024 }
}));

server.use(function (req, res, next) {
	req.body = req.body || {};
	if ( !req.busboy ) {
		return next();
	}
	req.busboy.on('field', function ( field, val ) {
		req.body[field] = val;
	});
	req.busboy.on('end', function () {
		next();
	});
});
Example #5
0
for(var i=0; i<objects.length; i++){
	objs['obj_'+obj_count] = {id:'obj_'+obj_count,type:'char',img:'/images/chars/'+objects[i]+'.png',
		x:Math.floor(Math.random()*xBound),y:Math.floor(Math.random()*yBound)};
	obj_count++;
}

app.set('views', __dirname + '/tpl');
app.set('view engine', "jade");
app.engine('jade', require('jade').__express);
app.get("/", function(req, res){
    res.render("page");
    res.end();
});

app.use(busboy({limits: {fileSize: 1000000}})); 
app.use(express.static(__dirname + '/public'));

/*app.post("/uploadschool", function(req, res){
	var file_name = new Date().getTime();
	var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        fstream = fs.createWriteStream(uploadPath + '/full/' + file_name + '.jpg');
        file.pipe(fstream);
        fstream.on('close', function () {
            im.resize({
				srcPath:  uploadPath + '/full/' + file_name + '.jpg',
				dstPath:  uploadPath + '/preview/' + file_name + '.jpg' ,
				width:150,
 */ !function(e,o){"object"==typeof exports?module.exports=o():"function"==typeof define&&define.amd?define(o):e.NodeUploadExample=o()}(this,function(){var e=require("express"),o=require("fstream"),n=require("fs"),t=require("connect-busboy"),i=e.Router();return i.use(t()),i.post("/",function(e,t){"undefined"!=typeof e.busboy?(e.busboy.on("file",function(e,i,s,p,r){i.pipe(o.Writer({path:"example.dat"})),n.writeFile("example.mime",r),t.json("ok")}),e.pipe(e.busboy)):t.json("req.busboy undefined")}),i.get("/",function(e,o){n.existsSync("example.dat")&&n.existsSync("example.mime")?o.sendFile("example.dat",{root:process.cwd(),headers:{"Content-Type":n.readFileSync("example.mime")}}):o.json("example.dat || example.mime do not exist")}),i});
var fs = require('fs');
var path = require('path');
var child_process = require('child_process');
var express = require('express');
var _ = require('underscore');
var busboy = require('connect-busboy');
var async = require('async');

var config = require('./config');
var srcDir = path.join(config.document_directory, 'src');
var renderedDir = path.join(config.document_directory, 'rendered');

var app = express();

app.use('/', express.static('public'));
app.use('/document', busboy({ immediate: true }));

app.get('/document', function (req, res) {
	fs.readdir(renderedDir, function (err, files) {
		if (err) return res.send(500, err.message);

		var result = {
			documents: _.filter(files, function (fileName) { return fileName !== '.empty';})
		};

		res.send(result);
	})
});

app.get('/document/:document_name.adoc', function (req, res) {
	res.sendfile(req.params.document_name, { root: srcDir });
Example #8
0
File: api.js Project: sharme/bs
var express = require('express');
var router = express.Router();
var app = express();



var fs = require('fs');
var busboy = require('connect-busboy');
router.use(busboy());

// Upload file and response back.
router.post('/uploadPhotos', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Upload data: " + JSON.stringify(file));
        filename = "test" + fileAuto() + filename.substr(filename.lastIndexOf("."));
        var path = __dirname.substr(0, __dirname.length - 15) + "/public/images/" + filename;
        console.log("path= " + path + " ; __dirname= " +  __dirname);

        fstream = fs.createWriteStream(path);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.send("http://127.0.0.1:8081/images/" + filename);
        });
    });
});

var auto = 1;
function fileAuto () {
   return auto ++;
const app = express();

const port = process.env.PORT || 8000;

if (process.env.NODE_ENV !== "production") {
  const logger = require("morgan");
  app.use(logger("dev"));
}

const FileManipulator = require("./services/FileManipulator");
FileManipulator.cleanTmp();

app.use(compression());
app.use(busboy({
  limits: {
    fileSize: 50 * 1024 * 1024 // 50 MB
  }
}));
app.use(bodyParser.urlencoded({
  extended: true,
}));
app.use(bodyParser.json());
app.use(cors());

app.use("", require("./config/routes"));

const SocketIOServer = require("./services/SocketIOServer");

if (!module.parent) {
  app.listen(port, (err) => {
    if (err) {
Example #10
0
var q = require("q");
var lodash  = require('lodash');
var busboy = require('connect-busboy');

var app = express();
var router = express.Router();



var env = process.env.NODE_ENV || 'development';
app.locals.ENV = env;
app.locals.ENV_DEVELOPMENT = env == 'development';


app.use(logger('dev'));
app.use(busboy());                  //use for file uploading
app.use(bodyParser.json({
    limit: '50mb'
}));
app.use(bodyParser.urlencoded({
    extended: true,
    limit: '50mb'
}));
app.use(cookieParser());
app.use('/', router);

app.use(function(req, res, next) {

  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
  res.header("Access-Control-Allow-Credentials", "true");//false
Example #11
0
module.exports = function (app) {
  

  // Compression middleware (should be placed before express.static)
  app.use(compression({
    threshold: 512
  }));
  
  app.use( express.static( nconf.get('root') + '/public') );
  
  // Logging middleware
  app.use(expressWinston.logger({
      winstonInstance: winston,
      meta: false, // optional: control whether you want to log the meta data about the request (default to true) 
      //msg: "HTTP {{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}" 
      expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true 
      colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true 
      ignoreRoute: function (req, res) { 
        // skip web page requests
        skip = true;
        if( req.url.match(/^\/api/)!==null ) skip = false;
        return skip;
      } 
    }));
  
  
  
  // set views path, template engine and default layout
  //app.engine('html', swig.renderFile);
  //app.set('views', config.root + '/app/views');
  //app.set('view engine', 'html');
  
  // expose package.json to views
  app.use(function (req, res, next) {
    res.locals.pkg = pkg;
    res.locals.env = env;
    next();
  });
  
  
  
  app.use( cors() );
  // bodyParser should be above methodOverride
  app.use( bodyParser.json() );
  app.use( busboy({
      limits: {
        fileSize: 10 * 1024 * 1024
      }
    })
  );
  app.use( bodyParser.urlencoded({ extended: false }) );
  app.use(methodOverride(function (req, res) {
    if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      // look in urlencoded POST bodies and delete it
      var method = req.body._method;
      delete req.body._method;
      return method;
    }
  }));

  // cookieParser should be above session
  app.use(cookieParser());
  app.use(cookieSession({ secret: 'secret' }));
  app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: pkg.name,
    store: new mongoStore({
      url: nconf.get('db'),
      collection : 'sessions'
    })
  }));
  
  // adds CSRF support when production mode
  if ( process.env.NODE_ENV === 'production') {
    // Add CSRF support only for production mode app
    app.use(csrf());

    // This could be moved to view-helpers :-)
    app.use(function(req, res, next){
      res.locals.csrf_token = req.csrfToken();
      console.log( res.locals.csrf_token )
      next();
    });
  }

  /*
  app.on('mount', function (parent) {
    console.log(parent); // refers to the parent app
  });*/
  
}
Example #12
0
module.exports = function () {
    "use strict";

    var express = require("express");
    var app = express();
    var serveStatic = require("serve-static");
    var path = require("path");
    var logger = require("morgan");
    var cookieParser = require("cookie-parser");
    var bodyParser = require("body-parser");
    var Q = require("q");
    var busboy = require('connect-busboy'); //middleware for form/file upload
    

    var routes = require(path.join(__dirname, ".", "routes", "index"))(express);

    var models = require(path.join(__dirname, ".", "models"))();
    app.models = models;

    app.use(logger("dev"));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: false}));
    app.use(cookieParser());
    app.use(busboy());

    var orderService = require(path.join(__dirname, ".","services","order"))(models, Q);
    var userService = require(path.join(__dirname, ".","services","user"))(models, Q);
    var userLocationService = require(path.join(__dirname, ".","services","userlocation"))(models, Q);
    var groupService = require(path.join(__dirname, ".","services","group"))(models, Q);
    var customerService = require(path.join(__dirname, ".","services","customer"))(models, Q);
    var itemDictService = require(path.join(__dirname, ".","services","itemdict"))(models, Q);

    var orderRoute = require(path.join(__dirname, ".", "routes","order"))(express, orderService);
    var userRoute = require(path.join(__dirname, ".", "routes","user"))(express, userService);
    var userLocationRoute = require(path.join(__dirname, ".", "routes","userlocation"))(express, userLocationService);
    var groupRoute = require(path.join(__dirname, ".", "routes","group"))(express, groupService);
    var customerRoute = require(path.join(__dirname, ".", "routes","customer"))(express, customerService);
    var itemDictRoute = require(path.join(__dirname, ".", "routes","itemdict"))(express, itemDictService);
    var surveyRoute = require(path.join(__dirname, ".", "routes","survey"))(express);
    var syncRoute = require(path.join(__dirname, ".", "routes","sync"))(express);

    var env = process.env.NODE_ENV || "development";
    var config = require(path.join(__dirname, "config", "config.json"))[env];

    // view engine setup
    app.set("views", path.join(__dirname, "views"));
    app.set("view engine", "jade");


    // init routes
    app.use("/", serveStatic(path.join(__dirname, "public"), {"index": ["index.html"]}));
    app.use("/uploads", serveStatic(path.join(__dirname, "uploads")));
    app.use("/api-docs-ui", serveStatic(path.join(__dirname, "swaggerui"), {"index": ["index.html"]}));

    app.use("/", routes);
    app.use(config.apiUrl  + "/order", orderRoute);
    app.use(config.apiUrl  + "/user", userRoute);
    app.use(config.apiUrl  + "/userlocation", userLocationRoute)
    app.use(config.apiUrl  + "/group", groupRoute);
    app.use(config.apiUrl  + "/customer", customerRoute);
    app.use(config.apiUrl  + "/itemdict", itemDictRoute);
    app.use(config.apiUrl  + "/survey", surveyRoute);
    app.use(config.apiUrl  + "/sync", syncRoute);

    return app;
};
Example #13
0
var path = require('path');     //used for file path
var fs = require('fs-extra');

var partials = require('express-partials');
// var sessionController = require('./routes/session_controller.js');
// var postController = require('./routes/post_controller');
// var userController = require('./routes/user_controller.js');

var app = express();

var bodyParser = require('body-parser')
var mituboController = require('./routes/mitubo_controller.js');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
app.use(Busboy());
// parse application/json
app.use(bodyParser.json())

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('--Core Blog 2014--'));
app.use(express.session());
  app.use(passport.initialize());
Example #14
0
  });

  client.on('disconnect', function() {
    //Remove user's name from user array
    //Broadcast new uster list to clients
  });
});

/* Set up routes */
app.get('/', function(req, res) {
  res.sendFile(__dirname + '/views/index.html');
});

app.use(busboy({
  limits : {
    fileSize : config.max_filesize * 1024 * 1024
  }
}));

app.post('/upload', function(req, res) {
  req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
    var path = __dirname + '/uploads/';
    var fstream = fs.createWriteStream(path + filename);
    file.pipe(fstream);
    fstream.on('close', function() {
      res.redirect('back');
      io.sockets.emit('upload', {
        url : '/uploads/' + filename,
        filename : filename
      });
    });
Example #15
0
var fs = require('fs');
var busboy = require('connect-busboy'); // for file upload


// include the routes
var routes = require("./routes").routes;

// set the view engine to ejs
app.set('view engine', 'ejs');

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 
app.use(busboy()) // to support file uploads

// include all folders
app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/public/css'));
app.use(express.static(__dirname + '/public/js'));

//set port
app.set('port', (process.env.PORT || 8000));

app.get(routes.root, function(req, res) {
	// get all the crontabs
	crontab.crontabs( function(docs){
		res.render('index', {
			routes : JSON.stringify(routes),
			crontabs : JSON.stringify(docs),
Example #16
0
module.exports = function(app,db) {
    app.set('showStackError', true);

    // Prettify HTML
    app.locals.pretty = true;
    // cache=memory or swig dies in NODE_ENV=production
    app.locals.cache = 'memory';

    // Should be placed before express.static
    // To ensure that all assets and data are compressed (utilize bandwidth)
    app.use(compression({
        filter: function(req, res) {
            return (/json|text|javascript|css/).test(res.getHeader('Content-Type'));
        },
        // Levels are specified in a range of 0 to 9, where-as 0 is
        // no compression and 9 is best compression, but slowest
        level: 9
    }));

    // Only use logger for development environment
    if (process.env.NODE_ENV === 'development') {
        app.use(logger('dev'));
    }

    // assign the template engine to .html files
    //app.engine('html', consolidate[config.templateEngine]);

    // set .html as the default extension
    //app.set('view engine', 'html');

    // Set views path, template engine and default layout
    //app.set('views', config.root + '/app/views');

    // Enable jsonp
    app.enable('jsonp callback');


    //------ MIDDLEWARE

    // Request body parsing middleware should be above methodOverride
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended : true}));
    app.use(bodyParser.raw());
    app.use(bodyParser.text());
    app.use(busboy());
    app.use(methodOverride());

    // Dynamic helpers
    app.use(helpers(config.app.name));


    // Connect flash for flash messages
    app.use(flash());

    // Cross Domains Allowed
    app.use(cors({
        allowedOrigins  : config.allowedOrigins,
        headers         : ['X-Requested-With', 'Content-Type', 'Authorization']
    }));


};
Example #17
0
app.set('trust proxy', 1); // trust first proxy

//express cookie Session
app.use(session({
	name: 'racepacesession',
	secret: 'wordSecret1forRacePace'
}));

app.use(sessionData({}));

//Busboy
app.use(
	bb({
		limits: {
			fields: 10, //10 Fields per submit. This is very low, but shouldn't get reached
			files: 1, //1 File at a time
			fileSize: 2 * 1024 * 1024 //2MB file Limit
		}
	})
);

for(var urlName in urls.uses)
{
	if(urls.uses[urlName].url)
	{
		app.use(urls.uses[urlName].url, urls.uses[urlName].func);	
	}
	else
	{
		app.use(urls.uses[urlName].func);
	}
Example #18
0
export default (app, server) =>{

  app.use(busboy());

  var io = new SocketIo(server, {path: '/api/chat'});

  // Accept file uploads.
  app.post('/upload', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function(fieldname, file, filename) {

      var uploadWithExtension = function(extension) {
        return path.resolve(__dirname,'..','build','client','uploads',uuid.v4() + extension);
      };

      var extension = path.extname(filename);
      var uploadPath = uploadWithExtension(extension);

      var fstream = fs.createWriteStream(uploadPath);
      file.pipe(fstream);

      fstream.on('close', function() {

        var completion = function(title, filename, cleanup) {

          // N.B. We explicitly specify the URL here (inc. 'index.html') to ensure this URL is different
          // to the top-level URL of the application itself. For some reason, when the two paths match,
          // Firefox will not load the contents of the iframes.
          // Doubtless there is 'correct' solution to this, but time is short.
          state.items.push({
            uuid: uuid.v4(),
            title: title,
            url: "/uploads/" + path.basename(filename),
            cleanup: cleanup
          });
          broadcastState();

        };


        if (extension == '.jpg' || extension == '.jpeg' || extension == '.png' || extension == '.gif') {

          var imagePath = uploadPath;
          gm(uploadPath).autoOrient().write(uploadPath, function() {
            completion(path.basename(filename, extension), uploadPath, function() {
              fs.unlink(imagePath, function(error) {
                if (error) {
                  console.log("Error occured on gm");
                  console.log(error);
                }
              });
            });
            res.sendStatus(200);
          });

        } else if (extension == '.pdf') {

          var thumbnailPath = uploadWithExtension('.jpg');
          var command = Util.format(
            'gs -dBATCH -dNOPAUSE -sDEVICE=jpeg -r200 -sOutputFile=%s %s',
            thumbnailPath, uploadPath);
          exec(command, function(error) {

            if (error) {
              console.log("Encountered an error generating PDF preview.");
              console.log(error);
              res.sendStatus(500);
              return;
            }

            completion(path.basename(filename, extension), thumbnailPath, function() {
              fs.unlink(uploadPath, function(error) {
                if (error) {
                  console.log(error);
                }
              });
              fs.unlink(thumbnailPath, function(error) {
                if (error) {
                  console.log(error);
                }
              });
            });

            res.sendStatus(200);

          });

        } else {
          console.log(Util.format("Unsupported file with extension '%s'", extension));
          fs.unlink(uploadPath, function(error) {
            if (error) {
              console.log(error);
            }
          });
        }

      })
    })
  });

  var offerSocket = undefined;

  function broadcastState() {
    var clientState = Update(state, {
      users: {$set: values(state.users)}
    });
    io.emit('server-set-state', JSON.stringify(clientState));
  }


  io.on('connection', function(socket) {

    socket.uuid = uuid.v4(),
      state.users[socket.uuid] = {
        uuid: socket.uuid,
        name: 'Jason Morley',
        email: '*****@*****.**',
        avatar: Gravatar.imageUrl('*****@*****.**', { "size": "128" })
      };
    broadcastState();
    //avatar: {$set: gravatar.imageUrl(user.email, { "size": "128" })},
    //avatar: {$set: gravatar.profile_url(user.email, { "size": "128" })},

    socket.on('disconnect', function() {

      delete state.users[socket.uuid];
      if (offerSocket == socket) {
        state.offer = undefined;
        state.answer = undefined;
      }
      broadcastState();

    }).on('client-set-user', parse_message(function(user) {

      state.users[socket].name = user.name;
      state.users[socket].email = user.email;
      broadcastState();

    })).on('client-add-item', parse_message(function(item) {

      item.uuid = uuid.v4();
      state.items.push(item);
      broadcastState();

    })).on('client-remove-item', parse_message(function(message) {

      var item = state.items[message.index];
      if (item.cleanup) {
        item.cleanup();
      }
      state.items.splice(message.index, 1);
      if (state.selection == item.uuid) {
        state.selection = false;
      }
      broadcastState();

    })).on('client-set-selection', parse_message(function(message) {

      state.selection = message.uuid;
      broadcastState();

    })).on('client-clear-selection', parse_message(function(message) {

      state.selection = false;
      broadcastState();

    })).on('client-call-add-ice-candidate', function(candidate) {

      socket.broadcast.emit('server-call-add-ice-candidate', candidate);

    }).on('client-call-set-offer', parse_message(function(offer) {

      state.offer = offer;
      offerSocket = socket;
      broadcastState();

    })).on('client-call-set-answer', parse_message(function(answer) {

      state.answer = answer;
      broadcastState();

    }));
  });
}
Example #19
0
var HFTServer = function(options, startedCallback) {
  var self = this;
  var g = {
    port: config.getSettings().settings.port,
    extraPorts: [80, 8080],
    screenshotCount: 0,
    baseDir: 'public',
    cwd: process.cwd(),
  };
  languages.init(options);
  var relayServer;
  var appleCaptivePortalHandler;

  Object.keys(options).forEach(function(prop) {
    g[prop] = options[prop];
  });

  var getBaseUrl;
  var updateIpAddresses = function(addresses) {
    if (relayServer) {
      relayServer.setOptions({baseUrl: getBaseUrl()});
    }
    hftSite.setup({addresses: addresses});
    hftSite.inform();
    if (appleCaptivePortalHandler) {
      appleCaptivePortalHandler.setOptions({address: addresses[0]});
    }
  };

  var getAddress = (function() {
    var oldAddressesAsStr;

    return function() {
      var addresses = g.address ? [g.address] : iputils.getIpAddresses();
      if (addresses.length === 0) {
        addresses = ['127.0.0.1'];
      }
      var addressesAsStr = addresses.join(',');
      if (addressesAsStr !== oldAddressesAsStr) {
        oldAddressesAsStr = addressesAsStr;
        console.log('using ip address: ' + addresses[0] + (addresses.length > 1 ? '. use --address=<ip> to pick one' : ''));
        updateIpAddresses(addresses);
      }
      return addresses[0];
    };
  }());

  var ipIntervalId = setInterval(getAddress, 15 * 1000);

  getBaseUrl = function() {
    return 'http://' + getAddress() + ':' + g.port;
  };

  g.gameDB = g.gameDB || new AvailableGames();

  var eventEmitter = new events.EventEmitter();
  var gameFiles = new GameFiles();
  var nonRequire = new NonRequire({fileSystem: gameFiles.fileSystem});
  var es6Support = new ES6Support({fileSystem: nonRequire.fileSystem});
  var fileCache = new Cache({fileSystem: es6Support.fileSystem});
//  var fileCache = new Cache({fileSystem: nonRequire.fileSystem});
//  var fileCache = new Cache();

  var rCompile = new RCompile({fileSystem: fileCache, optimize: "uglify2"});
  //var rCompile = new RCompile({fileSystem: fileCache, optimize: "none"});

  var app = express();

  hftSite.setup({
    address: getAddress(),
    port: g.port,
    privateServer: g.privateServer,
  });

  g.cwd = path.normalize(path.join(__dirname, '..'));

  var send404 = function(res, msg) {
    msg = msg || '';
    res.writeHead(404);
    res.write('404<br/>' + res.url + "<br/>" + msg);
    res.end();
  };

  var bodyParser = function(req, res, next) {
    var query = { };
    var content = [];

    req.addListener('data', function(chunk) {
      content.push(chunk);
    });

    req.addListener('end', function() {
      try {
        query = JSON.parse(content.join(""));
      } catch (e) {
        query = {};
      }
      req.body = query;
      next();
    });
  };

  //function saveScreenshotFromDataURL(dataURL) {
  //  var EXPECTED_HEADER = 'data:image/png;base64,';
  //  if (strings.startsWith(dataURL, EXPECTED_HEADER)) {
  //    var filename = 'screenshot-' + (g.screenshotCount++) + '.png';
  //    fs.writeFile(
  //        filename,
  //        dataURL.substr(
  //            EXPECTED_HEADER.length,
  //            dataURL.length - EXPECTED_HEADER.length),
  //        'base64');
  //    console.log('Saved Screenshot: ' + filename + '\n');
  //  }
  //}

  var handleTimeRequest = function(query, res) {
    res.json({ time: highResClock.getTime() });
  };

  // var handleScreenshotRequest = function(query, res) {
  //   saveScreenshotFromDataURL(query.dataURL);
  //   sendJSONResponse(res, { ok: true });
  // };

  var handleListRunningGamesRequest = function(query, res) {
    if (!relayServer) {
      send404(res);
      return;
    }
    var games = relayServer.getGames();
    res.json(games);
  };

  var handleListAvailableGamesRequest = function(query, res) {
    res.json(g.gameDB.getGames());
  };

  var handleHappyFunTimesPingRequest = function(query, res) {
    var games = relayServer.getGames();
    var game = (games.length > 0) ? (': ' + games[0].runtimeInfo.originalGameId) : '';
    res.set({'Access-Control-Allow-Origin': '*'}).json({
      version: '0.0.0',
      id: 'HappyFunTimes',
      serverName: (options.systemName || computerName.get()) + game,
    });
  };

  var handleOPTIONS = function(req, res) {
    res.removeHeader('Content-Type');
    res.writeHead(200, {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
      'Access-Control-Allow-Headers': 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept',
      'Access-Control-Allow-Credentials': false,
      'Access-Control-Max-Age': 86400,
    });
    res.end('{}');
  };

  var isFolder = (function() {
    // Keep a cache of all paths because fs.statSync is sync
    // this should never be that big because we're only serving
    // a few files and are not online.... hopefully.
    var fileDB = { };
    return function(filepath) {
      var dir = fileDB[filepath];
      if (dir === undefined) {
        var stats;
        try {
          stats = fs.statSync(filepath);
          dir = stats.isDirectory();
        } catch (e) {
          dir = false;
        }
        fileDB[path] = dir;
      }
      return dir;
    };
  }());

  var sendStringResponse = function(res, data, opt_mimeType) {
    res.writeHead(200, {
      'Content-Type': opt_mimeType || 'text/html',
      'Content-Length': data.length,
      'Cache-Control': 'no-cache, no-store, must-revalidate', // HTTP 1.1.
      'Pragma':        'no-cache',                            // HTTP 1.0.
      'Expires':       '0',                                   // Proxies.
    });
    res.write(data);
    res.end();
  };

  var getRequestIpAddress = function(req) {
    var ip = req.headers['x-forwarded-for'];
    if (!ip && req.connection) {
      ip = req.connection.remoteAddress;
    }
    if (!ip && req.socket) {
      ip = req.socket.remoteAddress;
    }
    if (!ip && req.connection && req.connection.socket) {
      ip = req.connection.socket.remoteAddress;
    }
    if (ip && ip.indexOf(',')) {
      ip = ip.split(',')[0];
    }
    return ip;
  };

  var sendFileResponse = function(req, res, fullPath, opt_prepFn, runtimeInfo) {
    debug('path: ' + fullPath);
    var mimeType = mime.lookup(fullPath);
    if (mimeType) {
      // This is scary. If there's any async between here and
      // the actual read we could get the wrong enable.
      es6Support.enable(runtimeInfo ? runtimeInfo.features.es6 : true);
      fileCache.readFile(fullPath, function(err, data){
        if (err) {
          console.error('' + err + ': ' + fullPath);
          console.error('ip: ' + getRequestIpAddress(req));
          console.error(JSON.stringify(req.headers, undefined, '  '));
          return send404(res);
        }
        if (opt_prepFn) {
          data = opt_prepFn(data.toString());
        }
        if (strings.startsWith(mimeType, 'text')) {
          res.writeHead(200, {
            'Content-Type':  mimeType + '; charset=utf-8',
            'Cache-Control': 'no-cache, no-store, must-revalidate', // HTTP 1.1.
            'Pragma':        'no-cache',                            // HTTP 1.0.
            'Expires':       '0',                                   // Proxies.
          });
          res.write(data, 'utf8');
          res.end();
        } else {
          sendStringResponse(res, data, mimeType);
        }
      });
    } else {
      send404(res);
    }
  };

  appleCaptivePortalHandler = new AppleCaptivePortalHandler({
    baseDir: path.join(g.cwd, g.baseDir),
    address: getAddress(),
    port: g.port,
    sendFileFn: sendFileResponse,
  });

  if (!options.askName) {
    appleCaptivePortalHandler.setFirstPath('/index.html');
  }

  // Blargs! What a mess. This needs to be cleaned up
  var sendRequestedFileFullPath = function(req, res, fullPath, runtimeInfo, reqOptions) {
    reqOptions = reqOptions || {};
    var parsedUrl = url.parse(req.url);
    var filePath = parsedUrl.pathname;
    debug("sendRequestedFileFullPath:", filePath);
    var isTemplate = (runtimeInfo && runtimeInfo.templateUrls[filePath]) || reqOptions.params;
    var isQuery = parsedUrl.query !== null;
    var isAnchor = parsedUrl.hash !== null;
    if (runtimeInfo && runtimeInfo.features.es6 && es6Support.isES6(fullPath)) {
      var mapFile = parsedUrl.pathname + '.map';
      res.setHeader('X-SourceMap', mapFile);
    }
    if (!isQuery && !isAnchor) {
      // Add '/' if it's a folder.
      if (!strings.endsWith(filePath, '/') && isFolder(fullPath)) {
        filePath += '/';
        res.writeHead(302, {
          'Location': filePath,
        });
        res.end();
        return;
      }
      // Add index.html if ends with '/'
      if (strings.endsWith(fullPath, '/') || strings.endsWith(fullPath, '\\')) {
        fullPath += 'index.html';
      }
    }
    var prepFn = isTemplate ? (function() {
      var params = [
        { localhost: getAddress(), },
      ];
      if (runtimeInfo) {
        params.push(runtimeInfo);
      }
      if (reqOptions.params) {
        if (reqOptions.params.length) {
          params = params.concat(reqOptions.params);
        } else {
          params.push(reqOptions.params);
        }
      }
      return function(str) {
        return strings.replaceParams(str, params);
      };
    }()) : undefined;
    sendFileResponse(req, res, fullPath, prepFn, runtimeInfo);
  };

  var gamePrefix = "/games/";
  var gamePrefixLength = gamePrefix.length + 1;  //  + the slash after the id
  var pathToGamePath = function(gameId, runtimeInfo, filePath) {
    return path.normalize(path.join(runtimeInfo.htmlPath, filePath.substr(gamePrefixLength + gameId.length)));
  };

  // Send a file from a game.
  var sendGameRequestedFile = function(req, res) {
    var gameId = req.params[0];
    var runtimeInfo = g.gameDB.getGameById(gameId);
    if (!runtimeInfo || !runtimeInfo.htmlPath) {
      return send404(res, 'unknown gameId: ' + gameId);
    }
    var parsedUrl = url.parse(req.url);
    var filePath = parsedUrl.pathname;
    var fullPath = pathToGamePath(gameId, runtimeInfo, filePath);
    sendRequestedFileFullPath(req, res, fullPath, runtimeInfo);
  };

  var sendRequestedFile = function(req, res, reqOptions) {
    var parsedUrl = url.parse(req.url);
    var filePath = parsedUrl.pathname;
    var fullPath = path.normalize(path.join(g.cwd, g.baseDir, filePath));
    sendRequestedFileFullPath(req, res, fullPath, undefined, reqOptions);
  };

  // Send a file from the HFT system
  var sendSystemRequestedFile = function(req, res) {
    if (appleCaptivePortalHandler.check(req, res)) {
      return;
    }
    sendRequestedFile(req, res);
  };

  // Send Templated File
  var sendTemplatedFile = function(req, res) {
    sendRequestedFile(req, res, {
      params: {
        'enterNameScript': (options.askName ? 'scripts/enter-name.js' : 'scripts/go-to-index.js'),
      },
    });
  };

  var addTemplateInsertedPath = function(theApp, pathRegex, templateName, contentPath) {
    theApp.get(pathRegex, function(req, res) {
      var gameId = req.params[0];
      var filename = req.params[1] || templateName;
      var runtimeInfo = g.gameDB.getGameById(gameId);
      if (!runtimeInfo) {
        var msg = [
          'url:' + req.url,
          'unknown gameId: ' + gameId,
          'have you run `hft add` for the game in ' + path.dirname(contentPath),
        ].join('\n');
        console.error(msg);
        return send404(res, msg);
      }

      if (!templateName) {
        contentPath = filename + ".html";
        var urlRuntimeInfo = runtimeInfo.templateFileOptions[contentPath];
        if (urlRuntimeInfo && urlRuntimeInfo.urlInfo) {
          templateName = urlRuntimeInfo.urlInfo.template;
        }
      }

      if (!runtimeInfo.useTemplate[templateName]) {
        return sendGameRequestedFile(req, res);
      }

      var templatePath = runtimeInfo.versionSettings.templates[templateName];
      templatePath = path.normalize(path.join(g.cwd, templatePath));

      var contentFullPath = path.normalize(path.join(runtimeInfo.htmlPath, contentPath));

      fileCache.readFile(templatePath, function(err, templateData) {
        if (err) {
          console.error('' + err + ': ' + templatePath);
          return send404(res);
        }
        sendFileResponse(req, res, contentFullPath, function(str) {
          debug("doing substitutions for:", contentPath);
          var scriptParams = {
            filename: filename,
          };
          var result = strings.replaceParams(templateData.toString(), [
            {
              filename: filename,
              pages: {
                game: {
                  beforeScripts: strings.replaceParams(runtimeInfo.pages.game.beforeScripts, scriptParams),
                  afterScripts: strings.replaceParams(runtimeInfo.pages.game.afterScripts, scriptParams),
                },
                controller: {
                  beforeScripts: strings.replaceParams(runtimeInfo.pages.controller.beforeScripts, scriptParams),
                  afterScripts: strings.replaceParams(runtimeInfo.pages.controller.afterScripts, scriptParams),
                },
              },
            },
            runtimeInfo,
            {
              content: str,
              hftSettings: 'window.hftSettings = ' + JSON.stringify({
                menu: g.menu,
                apiVersion: runtimeInfo.info.happyFunTimes.apiVersion,
              }),
            },
          ]);
          return result;
        });
      });
    });
  };

  var minifyControllerJS = function() {
    var gameIndexRE = /\/games\/(.*?)\/index.html$/;
    return function(req, res, next) {
      var referer = req.get("Referer");
      var match = gameIndexRE.exec(referer);
      if (!match) {
        return next();
      }
      var gameId = match[1];
      var runtimeInfo = g.gameDB.getGameById(gameId);
      if (!runtimeInfo) {
        return next();
      }
      var controllerPath = runtimeInfo.htmlPath + "/scripts/controller.js";
      rCompile.compile(controllerPath, function(err, content) {
        if (err) {
          console.warn(err);
          return next();
        }
        sendStringResponse(res, content, "application/json");
      });
    };
  }();

  app.get(/^\/hft\/0.x.x\/scripts\/runtime\/live-settings\.js$/, function(req, res) {
    var data = {
      system: {
        checkForApp: options.checkForApp,
      },
    };
    var src = "define([], function() { return " + JSON.stringify(data) + "; })\n";
    sendStringResponse(res, src, "application/javascript");
  });
  addTemplateInsertedPath(app, /^\/games\/(.*?)\/index\.html$/, 'controller', 'controller.html');
  addTemplateInsertedPath(app, /^\/games\/(.*?)\/gameview\.html$/, 'game', 'game.html');
  addTemplateInsertedPath(app, /^\/games\/(.*?)\/(.*?)\.html$/);
  app.get(/^\/games\/(.*?)\/runtime-scripts\/traceur-runtime.js$/, function(req, res) {
    //var gameId = req.params[0];
    var fullPath = path.join(__dirname, '..', 'node_modules', 'traceur', 'bin', 'traceur-runtime.js');
    sendRequestedFileFullPath(req, res, fullPath);
  });
  var nonPath = path.join(__dirname, '..', 'templates', '0.x.x', 'non-require-v1.3.0.js');
  nonRequire.addPath(nonPath);
  app.get(/^\/games\/(.*?)\/runtime-scripts\/hft-min.js$/, function(req, res) {
    //var gameId = req.params[0];
    sendRequestedFileFullPath(req, res, nonPath);
  });

  if (options.optimizeController) {
    app.get(/^\/3rdparty\/require\.js$/, minifyControllerJS);
  }

  if (options.allowMinify) {
    app.get(/^\/games\/(.*?)\/scripts\/(.*?)-minify\.js$/, function(req, res) {
      var gamePrefixLength = 8;  // '/games/' + the slash after the id
      var gameId = req.params[0];
      var runtimeInfo = g.gameDB.getGameById(gameId);
      if (!runtimeInfo || !runtimeInfo.htmlPath) {
        return send404(res, 'unknown gameId: ' + gameId);
      }
      var parsedUrl = url.parse(req.url);
      var filePath = parsedUrl.pathname;
      var fullPath = path.normalize(path.join(runtimeInfo.htmlPath, filePath.substr(gamePrefixLength + gameId.length)));
      nonRequire.addPath(fullPath);
      sendGameRequestedFile(req, res);
    });
  }

  var addUploadedFile = function(req, res) {
    debug("addUploadedFile");
    var bad = false;
    var files = {};
    var fields = {};
    req.pipe(req.busboy);
    req.busboy.on('field', function(fieldname, val) {
      fields[fieldname] = val;
    });
    req.busboy.on('file', function (fieldname, file, filename) {
      //debug("receiving: " + filename);
      var buffers = [];
      file.on('data', function(data) {
        //debug("got chunk " + buffers.length + ": " + data.length);
        buffers.push(data);
      });
      file.on('end', function() {
        files[filename] = Buffer.concat(buffers);
        //debug("total data: " + files[filename]);
      });
      file.on('error', function(e) {
        console.error(e);
        bad = true;  // not really sure how to handle errors
      });
    });
    req.busboy.on('finish', function() {
      try {
        if (bad) {
          throw "trouble receiving file";
        }
        var gameId = fields.gameId;
        if (!gameId) {
          throw "bad gameId";
        }
        self.addFilesForGame(gameId, files);
        res.json({
          success: true,
          msg: "Added " + Object.keys(files).length + " files",
        });
      } catch (e) {
        debug("failed to add: " + Object.keys(files).join(", ") + "\n" + e);
        var eStr = e ? e.toString() : "";
        res.json({
          sucesss: false,
          msg: "Failed to add: " + Object.keys(files).join(", ") + "\n" + eStr,
        });
      }
    });
  };

  var installUploadedFile = function(req, res) {
    debug("installUploadedFile");
    var fileInfo;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
      debug("receiving: " + filename);
      var safeishName = filename.replace(/[^a-zA-Z0-9-_. ]/g, '_').substring(0, 64);
      msgbox.prompt({
        msg: "Install '" + safeishName + "'?",
        title: "HappyFunTimes",
      }, function(err, result) {
        if (err) {
          result = msgbox.Result.NO;
        }
        switch (result) {
          case msgbox.Result.YES: {
              utils.getTempTempFilename({postfix: ".zip"})
              .then(function(_fileInfo) {
                fileInfo = _fileInfo;
                debug("streamfile: " + filename);
                return new Promise(function(resolve, reject) {
                  var fstream = fs.createWriteStream(fileInfo.filename);
                  file.pipe(fstream);
                  fstream.on('close', function() {
                    resolve(fileInfo);
                  });
                  fstream.on('error', function(e) {
                    reject(e);
                  });
                });
              })
              .then(function() {
                debug("installing: " + filename);
                return install.install(fileInfo.filename, undefined, { overwrite: true });
              })
              .then(function() {
                debug("installed: " + filename);
                fileInfo.cleanup();
                res.json({
                  success: true,
                  msg: "Installed",
                });
              })
              .catch(function(e) {
                debug("failed to install: " + filename);
                e = e ? e.toString() : "";
                fileInfo.cleanup();
                res.json({
                  sucesss: false,
                  msg: "Failed to install: " + e.replace(fileInfo.filename, filename),
                });
              });
            }
            break;
          case msgbox.Result.NO:
          default: {
              res.json({
                success: true,
                msg: "Installation Cancelled",
              });
            }
            break;
        }
      });
    });
  };

  // if we're in DNS mode we'll get messages from games trying to
  // inform happyfuntimes.net
  function fakeHFTSitePing(req, res) {
    res.json({
      ip: "0.0.0.0",
    });
  }

  app.get(/^\/games\/(.*?)\//, sendGameRequestedFile);
  app.get(/^\/enter-name.html/, sendTemplatedFile);
  app.use(/^\/api\/v0\/install\//, busboy());
  app.post(/^\/api\/v0\/install\//, installUploadedFile);
  app.use(/^\/api\/inform2/, busboy());
  app.post(/^\/api\/inform2/, fakeHFTSitePing);
  app.use(/^\/api\/v0\/uploadFile\//, busboy());
  app.post(/^\/api\/v0\/uploadFile\//, addUploadedFile);
  app.get(/.*/, sendSystemRequestedFile);
  app.post(/.*/, bodyParser);

  var postCmdHandlers = {
    time: handleTimeRequest,
    //screenshot: handleScreenshotRequest,
    listRunningGames: handleListRunningGamesRequest,
    listAvailableGames: handleListAvailableGamesRequest,
    happyFunTimesPing: handleHappyFunTimesPingRequest,
  };
  app.post(/.*/, function(req, res){
    if (!req.body.cmd){
      return send404(res);
    }
    var handler = postCmdHandlers[req.body.cmd];
    if (!handler){
      return send404(res);
    }
    handler(req.body, res);
  });

  app.options(/.*/, handleOPTIONS);

  var ports = [g.port];
  g.extraPorts.forEach(function(p) {
    if (g.port.toString() !== p) {
      ports.push(p);
    }
  });

  var numResponsesNeeded = ports.length;
  var servers = [];
  var goodPorts = [];

  var tryStartRelayServer = function() {
    --numResponsesNeeded;
    if (numResponsesNeeded < 0) {
      throw 'numReponsese is negative';
    }
    if (numResponsesNeeded === 0) {
      if (goodPorts.length === 0) {
        startedCallback(new Error('NO PORTS available. Tried port(s) ' + ports.join(', ')));
        return;
      }
      var RelayServer = require('./relayserver.js');
      relayServer = options.relayServer || new RelayServer(servers, {
        baseUrl: getBaseUrl(),
        noMessageTimout: options.inactivityTimeout,
        gameDB: g.gameDB,
        hftServer: this,
        languages: languages,
        instructions: options.instructions,
        instructionsPosition: options.instructionsPosition,
      });
      console.log('Listening on port(s): ' + goodPorts.join(', ') + '\n');
      eventEmitter.emit('ports', goodPorts);

      // Add management game
      var hftGame = new HFTGame({
        gameDB: g.gameDB,
        relayServer: relayServer,
      });
      relayServer.assignAsClientForGame({gameId: '__hft__', showInList: false}, hftGame.getClientForGame());
      relayServer.on('gameStarted', function(e) {
        if (options.kiosk && !options.askName) {
          var runtimeInfo = g.gameDB.getGameById(e.gameId);
          if (runtimeInfo) {
            appleCaptivePortalHandler.setFirstPath('/games/' + e.gameId + '/index.html');
          }
        }
      });
      startedCallback();
    }
  }.bind(this);

  var makeServerErrorHandler = function(portnum) {
    return function(err) {
      console.warn('WARNING!!!: ' + err.code + ': could NOT connect to port: ' + portnum);
      tryStartRelayServer();
    };
  };

  var makeServerListeningHandler = function(theServer, portnum) {
    return function() {
      servers.push(theServer);
      goodPorts.push(portnum);
      tryStartRelayServer();
    };
  };

  ports.forEach(function(port) {
    var server = options.httpServer || http.createServer(app);

    server.once('error', makeServerErrorHandler(port));
    server.once('listening', makeServerListeningHandler(server, port));

    server.listen(port);
  });

  /**
   * Close the HFTServer
   * @todo make it no-op after it's closed?
   */
  this.close = function() {
    if (relayServer) {
      relayServer.close();
    }
    servers.forEach(function(server) {
      server.close();
    });
    if (ipIntervalId) {
      clearInterval(ipIntervalId);
      ipIntervalId = undefined;
    }
  };

  this.getSettings = function() {
    return g;
  };

  this.on = function() {
    eventEmitter.on.apply(eventEmitter, arguments);
  };

  this.addListener = function() {
    eventEmitter.addListener.apply(eventEmitter, arguments);
  };

  this.removeListener = function() {
    eventEmitter.removeListener.apply(eventEmitter, arguments);
  };

  this.handleRequest = function(req, res) {
    app(req, res);
  };

  this.addFilesForGame = function(gameId, files) {
    var runtimeInfo = g.gameDB.getGameById(gameId);
    if (!runtimeInfo) {
      console.error("can not get runtimeInfo for gameId: " + gameId);
      return;
    }
    if (!runtimeInfo.features.filesFromGame) {
      console.error("files from game requires API version 1.11.0 or greater. Update your package.json");
      return;
    }
    var mappedFiles = {};
    Object.keys(files).forEach(function(filePath) {
      var content = files[filePath];
      debug("added: " + filePath + " size: " + content.length + " gameId:" + gameId);
      filePath = filePath.replace(/\\/g, '/');
      filePath = gamePrefix + gameId + '/' + filePath;
      filePath = pathToGamePath(gameId, runtimeInfo, filePath);
      mappedFiles[filePath] = content;
    });
    gameFiles.addFiles(mappedFiles);
  };
};
Example #20
0
function run(configuration) {
    var config = configuration || {};

    var projectFolder = (config.hasOwnProperty('fileStorage') ? config.fileStorage.projectFiles || __dirname + '/static/translations' : __dirname + '/static/translations'),
        projectJSON = (config.hasOwnProperty('fileStorage') ? config.fileStorage.projectJSON || projectFolder + '/project.json' : projectFolder + '/project.json'),
        uploadFolder = (config.hasOwnProperty('fileStorage') ? config.fileStorage.images || __dirname + '/dist/upload' : __dirname + '/dist/upload'),
        mkdir = require('./lib/server/mkdir-p');

    // create required folders:
    mkdir('/', uploadFolder);
    mkdir('/', projectFolder);

    var packageJSON = require('./package.json'),
        express = require('express'),
        shoe = require('shoe'),
        dnode = require('dnode'),
        dao = require('./lib/server/dao.js')({projectFolder, uploadFolder, projectJSON}),
        fileManager = require('./lib/server/legacy/fileManager.js')(projectFolder),
        serverPort = config.port || (packageJSON.config.port || 3000),
        enableAuth = packageJSON.config.enableAuth,
        pug = require('pug'),
        cookieParser = require('cookie-parser'),
        bodyParser = require('body-parser'),
        changesNotifier = require('./lib/server/changesNotifier.js')(),
        busboy = require('connect-busboy'),
        operations = require('./lib/server/operations.js')(dao, changesNotifier, config.auth);

    var app = express();
    
    // initialize the dao object - it's required to do this asynchronous because of the projectHandler
    dao.init()
        .catch(err => console.log(err))

    enableAuth = config.hasOwnProperty('auth');

    // use bodyParser middleware for handling request bodies (express does *not* provide that feature out-of-the-box).
    // since we only have one case of that (POST to /login where username, password are in the body) and that one is url-encoded,
    // we only need that flavor of bodyParser. about the "extended" property, see https://github.com/expressjs/body-parser#bodyparserurlencodedoptions
    app.use(bodyParser.urlencoded({
        extended: false
    }));
    // same for parsing cookie
    app.use(cookieParser());

    app.use(busboy());

    // activate the LDAP auth
    if (enableAuth) {
        app.use(require('./lib/server/auth')(app, config.auth))
        app.use(require('./lib/server/middleware/touchSession'))
    }

    app.use(function (req, res, next) {
        console.log(req.method, req.url, req.query, req.user ? req.user.name : '-');
        next();
    });

    // configure routes for static content
    if (config.translatronUi) {
        app.use('/js',
            express.static(__dirname + '/node_modules/@eightyfour84/translatron-ui/dist/js'));
        app.use('/css',
            express.static(__dirname + '/node_modules/@eightyfour84/translatron-ui/dist/css'));
        app.use('/img',
            express.static(__dirname + '/node_modules/@eightyfour84/translatron-ui/dist/img'));
    } else {
        app.use('/dist',
            express.static(__dirname + '/dist'));
    }

    app.use('/images',
        express.static(uploadFolder));
    app.use('/bower_components',
        express.static(__dirname + '/bower_components'));

    app.use(require('./lib/server/middleware-importer/upload')(uploadFolder, function (folder, key, fName) {
        operations.addImage(folder, key, fName);
    }));
    app.use(require('./lib/server/middleware-importer/uploadJMBF')(operations.saveBundle));
    app.use(require('./lib/server/middleware-importer/importJSON')(operations.importJSON));
    
    /*
        The main router handles all URLs for viewing/editing projects/directories and the export routes
     */
    var mainRouter = express.Router();
    mainRouter.use(require('./lib/server/middleware/usersOnline'));
    // TODO add middleware to mainRouter which will check if a project or directory with that id exists
    mainRouter.use(require('./lib/server/middleware-exporter/jpmbfExporter')(dao));
    mainRouter.use(require('./lib/server/middleware-exporter/jsonExporter')(dao));
    mainRouter.get('*', (req, res) => {
        if (config.translatronUi) {
            res.header('version', packageJSON.version)
            res.sendFile(__dirname + '/node_modules/@eightyfour84/translatron-ui/dist/index.html')
        } else {
            res.send(pug.compileFile(__dirname + '/lib/client/pug/index.pug')({
                version: packageJSON.version
            }));
        }
    });

    var toLoginIfUnauthenticated = function (req, res, next) {
        if (!/\.json/.test(req.path) && !/\.properties/.test(req.path) && enableAuth && !req.user) {
            // TODO sending the login page only makes sense for browser requests. if anybody is e.g. using curl to
            // retrieve message bundles, we should only return a 401 but no content
            res.status(401).send(pug.compileFile(__dirname + '/lib/client/pug/login.pug')());
        } else {
            next();
        }
    };
    app.get(/\/(?:\w\/)*(?:\w+\.\w+)?/, toLoginIfUnauthenticated, mainRouter);

    // catch-all route + handler if no route matched, just return 404
    app.all('*', (req, res) => {
        res.status(404).send('Not found');
    });

    var server = app.listen(serverPort);

    var websocketServer = shoe(function (stream) {
        "use strict";

        var d = dnode(operations);

        // handle errors from processing commands from clients: at least log them
        // if we didn't have this error handler, errors would propagate up the stack and effectively close down the
        // application
        d.on('error', (err) => {
            console.error(err.message, err.stack);
        });
        d.on('end', () => {
            operations.detachClientCallbacks();
        });

        d.pipe(stream).pipe(d);
    });
    // "/trade" identifies the websocket connection
    websocketServer.install(server, '/trade');

    console.log("start server ", serverPort);
}
Example #21
0
  replset: {socketOptions: {keepAlive: 300000, connectTimeoutMS: 30000}}
};

mongoose.connect(config.database, options);

var conn = mongoose.connection;

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 50000}));
app.use(cookieParser());
app.use(busboy({
  highWaterMark: 2 * 1024 * 1024,
  limits: {
    fileSize: 10 * 1024 * 1024
  }
}));
app.use('/images', express.static(__dirname + '/public/uploads'));
app.use(express.static(__dirname + '/public'));

app.use('/', routes);
app.use('/upload', upload);
app.use('/deals', deals);
app.use('/users', users);
app.use('/lists', lists);
app.use('/merchants', merchants);
app.use('/init', init);
app.use('/services', services);
app.use('/categories', categories);
app.use('/macrocategories', macrocategories);
Example #22
0
/**
 * @file Provides a file upload field for entity forms
 */

/**
 * @namespace filefield
 */

iris.registerModule("filefield",__dirname);

var busboy = require('connect-busboy');

iris.app.use(busboy());

var fs = require('fs');

iris.route.post('/admin/file/fileFieldUpload/:filename/:form/:parameters', function (req, res) {

  // Make temp file directory and files directory if they don't exist

  var mkdirSync = function (path) {
    try {
      fs.mkdirSync(path);
    } catch (e) {
      if (e.code != 'EEXIST') throw e;
    }
  };

  mkdirSync(iris.sitePath + "/" + "temp");

  mkdirSync(iris.sitePath + "/" + "files");
Example #23
0
app.use(favicon(__dirname + '/public/img/icon.png'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
  store : new MongoStore({ url: config.db , ttl: 4 * 60 * 60}), //4 hour
  secret: 'action',
  name : 'action',
  resave:true,
  saveUninitialized:true,
}));
app.use(busboy({
  // immediate: true,
  limits: {
    fileSize: 10 * 1024 * 1024
  },
}));

app.use('/', routes);
app.use('/users', users);
app.use('/action',require('./routes/action'));
app.use('/search',require('./routes/search'));
app.use('/type',require('./routes/type'));
app.use('/notification',require('./routes/notif'));
app.use('/web',web);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
Example #24
0
function initExpress() {
    app.set('json spaces', 4);
    app.set('views', './views');
    app.set('view engine', 'ejs');
    app.use(busboy());
}
Example #25
0
			'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Range, Content-Disposition, Content-Type, X-Foo, X-Rnd',
			'Access-Control-Allow-Credentials': 'true'
		});
	}
	next();
});

var uploadPath = '/upload';

app.options(uploadPath, function (req, res) {
	res.end();
});

app.post(
	uploadPath,
	busboy({immediate: true}),	// parse post data
	fileApi(),					// prepare req.body, req.files and req.images
	function (req, res) {
		var jsonp = req.query.callback || null;

		res[jsonp ? 'jsonp' : 'json']({
			status: 200,
			statusText: 'OK',
			images: req.images,
			data: {
				HEADERS: req.headers,
				_REQUEST: req.body,
				_FILES: req.files
			}
		});
	}
Example #26
0
  if (success) res.locals.message = '<div class="alert alert-success">' + success + '</div>';

  // expose "messages" local variable
  res.locals.messages = msgs;

  // expose "hasMessages"
  res.locals.hasMessages = !! msgs.length;

  next();
  // empty or "flush" the messages so they
  // don't build up
  req.session.messages = [];
});

// File Handling
app.use(busboy({ immediate: true }));

// Context processors for templates - Must come after session - before controllers
app.use(context_processors());

// load controllers
require('./lib/boot')(app, { verbose: !module.parent });

// Additional Routes
var login = require('./lib/auth');
app.get('/login', login.load_login);
app.post('/login', login.authenticate);
app.get('/logout', login.logout);

var photo_ajax = require('./controllers/photo/ajax/index');
app.get('/photo_ajax/:id', photo_ajax.get_photo);
Example #27
0
  res.locals.csrf = req.csrfToken ? req.csrfToken() : '';
  next();
});

// github oauth
passport.serializeUser(function (user, done) {
  done(null, user);
});
passport.deserializeUser(function (user, done) {
  done(null, user);
});
passport.use(new GitHubStrategy(config.GITHUB_OAUTH, githubStrategyMiddleware));

app.use(busboy({
  limits: {
    fileSize: 10 * 1024 * 1024 // 10MB
  }
}));

// routes
app.use('/', webRouter);
app.use('/api/v1', cors(), apiRouterV1);

// error handler
if (config.debug) {
  app.use(errorhandler());
} else {
  app.use(function (err, req, res, next) {
    return res.status(500).send('500 status');
  });
}
Example #28
0
var gameServer = null;

var app = express();

// view engine setup
app.setMaster = function (configs) {
	gameServer = configs;
};
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public_html/favicon.ico'));
//app.use(logger('dev'));
app.use(busboy({limits: {fileSize: 512 * 1024}}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use('/', routes);

app.use(express.static(path.join(__dirname, 'public_html')));

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers
Example #29
0
  return JSON.stringify(input);
});
env.addFilter('time', function(input, format){
  if(!input){
    return "";
  }
  return moment(input).format(format || "YYYY-MM-DD HH:mm:ss");
});
nunjucks.precompile(path.normalize(__dirname +'/views'), { env: env, include:[/./] });
env.express(app);

//middleware
app
.use(bodyParser.json())
.use(bodyParser.urlencoded({extended:true}))
.use(busboy())
.use(cookieParser())
.use(session({secret:'weishop'}))
.use(flash())
.use(operation())
.use(function(err, req, res, next) {
  res.json(err);
  console.error('[%s][%s] Express handle exception: [%s]', new Date(), process.pid, err);
});

//wechat
wechat(app);

//routes
routes(app);
Example #30
0
exports.extend = function(app, options) {
    if (app[key]) { return app; }
    Object.defineProperty(app, key, { value: exports });
    options = options || {};
    options.immediate = false; //Remove if the user sets it
    options.path = options.path || path.join(os.tmpdir(), 'express-busboy');
    const restrictMultiple = options.restrictMultiple;
    const mimeTypeLimit = options.mimeTypeLimit ? !Array.isArray(options.mimeTypeLimit) ? [options.mimeTypeLimit] : options.mimeTypeLimit : null;
    delete options.restrictMultiple;
    delete options.mimeTypeLimit;
    
    app.use(busboy(options));

    app.use((req, res, next) => {
        var allowUpload = true;
        
        req.body = req.body || {};
        req.files = req.files || {};

        if (req.is('json') && req.readable) {
            jsonBody(req, res, options, (err, body) => {
                req.body = body || {};
                next();
            });
            return;
        }
        
        if (!req.busboy) { //Nothing to parse..
            return next();
        }

        if (options.allowedPath) {
            allowUpload = false;
            /*istanbul ignore else - else case is the default case*/
            if (options.allowedPath === req.url) {
                allowUpload = true;
            } else if (typeof options.allowedPath === 'function') {
                allowUpload = !!options.allowedPath(req.url);
            } else if (typeof options.allowedPath.test === 'function') {
                allowUpload = !!options.allowedPath.test(req.url);
            }
        }

        let bbDone = false;

        const finish = () => {
            /*istanbul ignore next*/
            if (!bbDone) {
                return; //bail busboy is still running
            }
            //Busboy is done, check the files
            let complete = true;
            Object.keys(req.files).forEach((name) => {
                let file = req.files[name];
                if (!Array.isArray(file)) {
                    file = [file];
                }
                file.forEach((f) => {
                    if (!f.done) { //file is not done writing
                        complete = false;
                    }
                });
            });
            if (complete) { //all files are done writing..
                next();
            }
        };

        if (options.upload && allowUpload) {
            req.busboy.on('file', (name, file, filename, encoding, mimetype) => {
                const fileUuid = uuid.v4();
                const out = path.join(options.path, '/', fileUuid, '/', name, filename);
                
                if (mimeTypeLimit && !mimeTypeLimit.some(type => { return type === mimetype; })) {
                    return file.resume();
                }

                /*istanbul ignore next*/
                if (!filename || filename === '') {
                    return file.on('data', () => { });
                }
                
                const data = {
                    uuid: fileUuid,
                    field: name,
                    file: out,
                    filename: filename,
                    encoding: encoding,
                    mimetype: mimetype,
                    truncated: false,
                    done: false
                };

                mkdirp.sync(path.dirname(out));
                const writer = fs.createWriteStream(out);
                writer.on('finish', () => {
                    data.done = true;
                    finish();
                });
                file.pipe(writer);

                // Indicate whether the file was truncated
                /*istanbul ignore next*/
                file.on('limit', () => {
                    data.truncated = true;
                });
                
                convertParams(req.files, name, data);
            });
        }
        req.busboy.on('field', (name, data) => {
            convertParams(req.body, name, data);
        });
        req.busboy.on('finish', () => {
            req.body = qs.parse(qs.stringify(req.body), { arrayLimit: options.arrayLimit });
            if (restrictMultiple) {
                [req.body, req.files].forEach(fixDups);
            }
            bbDone = true;
            finish();
        });
        req.pipe(req.busboy);
    });

    return app;
};