Beispiel #1
0
var gulpDevTools = function () {
  var gulpFilePath = path.join(process.cwd(), "gulpfile");
  var gulpFile = require(gulpFilePath);
  var gulpTasks = Object.keys(gulpFile.tasks).sort();
  if (gulpTasks && gulpTasks.length > 0) {
    process.stdout.write("Gulp Tasks loaded, fire up your chrome devtools\n");
  } else {
    process.stdout.write("Could not load gulp tasks\n");
  }

  var server = http.createServer(function (request, response) {
      var requestPath = url.parse(request.url).pathname;
      var filePath = __dirname + '/../chrome-extension' + requestPath;
      var contentType = mime.lookup(filePath);
      fs.exists(filePath, function (exists) {
        if(exists){
          fs.readFile(filePath, function (error, data) {
            if (error) {
              response.writeHead(404);
              response.write("oops this doesn't exist - 404");
              response.end();
            }
            else {
              response.writeHead(200, {'Content-Type': contentType});
              response.write(data, "utf8");
              response.end();
            }
          });
        }else{
          response.writeHead(404);
          response.write("oops this doesn't exist - 404");
          response.end();
        }
      });
  });

  server.listen(8001);

  var sio = io.listen(server);
  var workers = [];

  //turn off debug
  sio.set('log level', 1);

  sio.sockets.on('connection', function (socket) {

    socket.emit('onGulpTasksLoaded', {
      'tasks': gulpTasks
    });

    //kill the task
    socket.on('killTask', function (data) {
      _.each(workers, function (worker) {
        if (worker.pid === data.pid) {
          worker.kill();
        }
      });
      workers = _.remove(workers, function (worker) {
        return worker.pid !== data.pid;
      });
    });

    //Run the task
    socket.on('runTask', function (data) {
      //log about the running task
      process.stdout.write("Running Task:" + data.taskName + "\n");

      //current task
      var currentTask = data.taskName;
      //spawn a new process      
      var spawnCmd = (process.platform === 'win32') ? 'gulp.cmd' : 'gulp';
      var worker = spawn(spawnCmd, [data.taskName]);
      workers.push(worker);

      //set the character encoding
      worker.stdout.setEncoding('utf-8');

      //when process is running log the output
      worker.stdout.on('data', function (data) {
        if (data) {
          var evtObj = {
            'message': data + '\n',
            'pid': worker.pid
          };
          if(currentTask && currentTask !== ""){
            evtObj.taskName = currentTask;
          }
          socket.emit('onProcessRunning', evtObj);
        }

      });

      //when the process ends
      worker.stdout.on('end', function (data) {
        socket.emit('onProcessFinish', {
          'message': worker.pid + " process completed",
          'pid': worker.pid
        });
      });

      //when there is an error
      worker.stderr.on('data', function (data) {
        if (data) {
          socket.emit('onProcessError', {
            'message': "",
            'pid': worker.pid
          });
        }
      });

      //when the process exits
      worker.on('exit', function (code) {
        if (code !== 0) {
          socket.emit('onProcessExit', {
            'message': worker.pid + '|' + 'Process Exited with code: ' + code,
            'pid': worker.pid
          });
        }
      });
    });
  });
};
Beispiel #2
0
  this.run = function() {

var DISABLE_CAS = process.env.DISABLE_CAS || false;
var CAS_HOST = process.env.CAS_HOST || "cas.littlevikinggames.com";
var CAS_URL = process.env.CAS_URL || "https://" + CAS_HOST + "/login";
var CAS_HOST_FALLBACK = process.env.CAS_HOST_FALLBACK;
var CAS_URL_FALLBACK = process.env.CAS_URL_FALLBACK || "https://" + CAS_HOST_FALLBACK + "/login";
var SERVICE_URL = process.env.SERVICE_URL;
var PORT = process.env.PORT || 3000;
var EGS_HOST = process.env.EGS_HOST || "globalecco.org";
var EGS_PORT = process.env.EGS_PORT || 443;
var EGS_PROTOCOL = process.env.EGS_PROTOCOL || (EGS_PORT == 443 ? 'https' : 'http')
var EGS_USERNAME = process.env.EGS_USERNAME;
var EGS_PASSWORD = process.env.EGS_PASSWORD;
var PREFIX = process.env.PREFIX || "";
var AIRBRAKE_API_KEY = process.env.AIRBRAKE_API_KEY;

var KEY_FILE = process.env.KEY_FILE;
var CERT_FILE = process.env.CERT_FILE;

var app;

var use_ssl = false;

if (KEY_FILE && CERT_FILE) {
  logger.info("Using SSL");
  use_ssl = true;

  var server_options = {};
  server_options.key = fs.readFileSync(KEY_FILE);
  server_options.cert = fs.readFileSync(CERT_FILE);

  app = express(server_options);
} else if ((KEY_FILE && !CERT_FILE) || (CERT_FILE && !KEY_FILE)) {
  throw "If one of KEY_FILE or CERT_FILE are specified, you must supply both of them, not just one";
} else {
  app = express();
}

var server = http.createServer(app);
var io = socketio.listen(server);

if (AIRBRAKE_API_KEY) {
  var client = airbrake.createClient(AIRBRAKE_API_KEY);
  client.handleExceptions();
  logger.info("Airbrake initialised.");
//  app.error(client.expressHandler()); SEE: https://github.com/felixge/node-airbrake/issues/25
}

// global variables
var connectedUsers = 0;

var metadata = Game.metadata;

// global types
var Schema = mongoose.Schema;

var userSchema = new Schema({
  gaming_id: {type: String, default: null },
  cas_handle: {type: String, default: null }
});
var User = mongoose.model('User', userSchema);

var sessionSchema = new Schema({
  session_id: { type: String, default: null },
  gaming_id: {type: String, default: null },
  game_id: {type: String, default: null}
});
var Session = mongoose.model('Session', sessionSchema);

var gameSchema = new Schema({
  is_in_progress: { type: Boolean, default: false },
  roles: function(roles){
    var results = {};
    for (var i = 0; i < roles.length; i++) {
      results[roles[i].slug] = { type: String, default: null };
    }
    return results;
  }(metadata.roles),
  gameState: String,
  chat_messages: [{time: Date, user: String, role: String, message: {type: String, trim: true}}]
});

var GameModel = mongoose.model('Game', gameSchema);

var find_or_create_session = function(gaming_id, session_id, next) {
  Session.findOne({ session_id: session_id }, function(err, session) {
    if (err) { throw err; }
    if (session) {
      next(session);
    } else {
      session = new Session({ session_id: session_id, gaming_id: gaming_id });
      session.save(function(err) {
        if (err) { throw err; }
        next(session);
      });
    }
  });
}
// next takes the found/created user as parameter
var find_or_create_user = function(profile, session_id, next) {
  var gaming_id = profile.gamingId;
  find_or_create_session(gaming_id, session_id, function(session) {
    User.findOne({ gaming_id: gaming_id }, function (err, user) {
      if (err) {
        throw err;
      }
      if (user) {
        next(user);
      } else {
        var user = new User({ gaming_id: gaming_id, cas_handle: profile.casId });
        user.save(function (err) {
          if (err) {
            throw err;
          }
          next(user);
        });
      }
    });
  });
};

function authenticate_with_cas(request, response, callback) {
  if (DISABLE_CAS) {
    var handle = request.query.handle;
    logger.debug("DISABLE_CAS is true. Skipping authentication for "+handle);
    callback(handle);
    return;
  }

  var serviceTicket = request.query.ticket;
  var hasServiceTicket = typeof serviceTicket !== 'undefined';

  var host = CAS_HOST;
  var cas_url = CAS_URL;

  if (request.query.cas == "test") {
    host = CAS_HOST_FALLBACK;
    cas_url = CAS_URL_FALLBACK;
  }

  var protocol = use_ssl ? "https://" : "http://";
  logger.debug("Request.url: " + request.url);
  var path = request.url.replace(/[&|\?]?ticket=[\w|-]+/i, "");
  logger.debug("Path: " + path);
  var serviceURL = SERVICE_URL || (protocol + request.headers.host);
  serviceURL += path;
  logger.debug("CAS service: "+serviceURL);
  var loginUrl = cas_url + '?service=' + encodeURIComponent(serviceURL);
  logger.debug("CAS Login URL: "+loginUrl);

  var base_url = "https://"+host;
  var casInstance = new cas({
    base_url: base_url,
    service: serviceURL,
    https: {
      rejectUnauthorized: false
    }
  });

  // initial visit
  if (!hasServiceTicket) {
    logger.info("Redirecting to CAS Login");
    response.redirect(loginUrl);
    return;
  } 

  logger.info("Got service ticket: " + serviceTicket);

  // validate service ticket
  casInstance.validate(serviceTicket, function(error, status, cas_handle) {
    logger.info("Validated ticket.");
    if (error) {
      logger.error("Error validating CAS: ", error);
    }
    if (error || !status) {
      response.redirect(loginUrl);
      return;
    }
    callback(cas_handle);
  });
}

function handleLogin(request, response, game_id, callback) {

  logger.info("Handling Login!");

  applyHeaders(response);

  authenticate_with_cas(request, response, function(cas_handle) {
    logger.info(cas_handle + " logged in! SessionID: " + request.cookies['express.sid']);
    getPlayerProfile(cas_handle, game_id, function(error, profile) {
      if (error) {
        respond_with_error(response, error);
        return;
      }
      if (!profile) {
        respond_with_error(response, "Unable to retrieve player profile.");
        return;
      }
      find_or_create_user(profile, request.cookies['express.sid'], function(user) {
        callback(user);
      });
    });
  });
}

applyHeaders = function(res) {
   res.header("Cache-Control", "max-age=600");
};

app.configure(function() {
  app.use(express.cookieParser());
  app.use(express.session({secret: 'secret', key: 'express.sid'}));
});

serve_path = function(req, res, path) {
  applyHeaders(res);
  logger.debug("Serving: " + path);
  me.send_asset(req, res, path);
}
serve_lib = function(req, res) {
  var path = req.originalUrl.replace(new RegExp(PREFIX, ""), "");
  serve_path(req, res, path);
}
serve_assets = function(req, res) {
  var path = "/assets" + req.originalUrl.replace(new RegExp(PREFIX, ""), "");
  serve_path(req, res, path);
}

authenticateAppServer = function(req, res, callback) {
  //TODO implement
  callback();
};

handleNew = function(req, res) {
  logger.debug("New game requested.");
  authenticateAppServer(req, res, function() {
    return createGame(req, res);
  });
};

handlePlay = function(req, res) {
  logger.debug("/play requested.");
  var game_id = req.param('gid');
  if (!game_id) {
    res.send("gid is a required parameter", 400);
    return;
  }
  handleLogin(req, res, game_id, function(user) {
    return playGame(req, res, game_id, user);
  });
};

var egs_response = function(req, res, params, next) {
  if (!params.stat) { throw "Params.stat is required"; }

  var format = "xml";
  if (req.param('fmt')) {
    format = req.param('fmt').toLowerCase();
  }

  var code = params.stat === "ERROR" ? 400 : 200;
  if (format === "xml") {
    var body = "<stat>"+params.stat+"</stat>";
    if (params.msg) {
      body = body + "<msg>"+params.msg+"</msg>";
    }
    if (params.game_id) {
      body = body + "<glst><cnt>1</cnt><game><gid>"+params.game_id+"</gid></game></glst>";
    }
    res.send(body, { 'Content-Type': 'application/xml' }, code);
  } else if (format === "json") {
    var json = { stat: params.stat };
    if (params.msg) {
      json.msg = params.msg;
    }
    if (params.game_id) {
      json.glst = {
        cnt: 1,
        game: { gid: params.game_id }
      };
    }
    res.json(json, code);
  } else if (format === "html" && req.param("dbg") === "1") {
    var role1 = metadata.roles[0];
    var role2 = metadata.roles[1];
    var html = "";
    if (!process.env.DISABLE_CAS) {
      html = html + "<b>With ECCO CAS server:</b><br>";
      html = html + "<a href='"+PREFIX+"/play?gid="+params.game_id+"&role="+role1.slug+"&handle="+req.param(role1.slug)+"&app=BRSR'>Join game '"+params.game_id+"' as "+role1.name+"</a> ("+req.param(role1.slug)+")<br>";
      html = html + "<a href='"+PREFIX+"/play?gid="+params.game_id+"&role="+role2.slug+"&handle="+req.param(role2.slug)+"&app=BRSR'>Join game '"+params.game_id+"' as "+role2.name+"</a> ("+req.param(role2.slug)+")<br>";
      html = html + "<hr><b>With test CAS server:</b><br>";
    }
    html = html + "<a href='"+PREFIX+"/play?gid="+params.game_id+"&cas=test&role="+role1.slug+"&handle="+req.param(role1.slug)+"&app=BRSR'>Join game '"+params.game_id+"' as "+role1.name+"</a> ("+req.param(role1.slug)+")<br>";
    html = html + "<a href='"+PREFIX+"/play?gid="+params.game_id+"&cas=test&role="+role2.slug+"&handle="+req.param(role2.slug)+"&app=BRSR'>Join game '"+params.game_id+"' as "+role2.name+"</a> ("+req.param(role2.slug)+")<br>";
    res.send(html, { 'Content-Type': 'text/html' }, code);
  } else {
    res.send("Invalid format: " + req.fmt+". Must be one of 'json' or 'xml'", 400);
  }
  if (typeof next === 'function') {
    next();
  }
};

var egs_error_response = function(req, res, message) {
  return egs_response(req, res, {
    stat: "ERROR",
    msg: message
  });
};

var egs_game_response = function(req, res, game_id, next) {
  egs_response(req, res, {
    stat: "OK",
    game_id: game_id
  }, next);
};

var getPlayerProfile = function(cas_handle, game_id, callback) {
  logger.debug("getPlayerProfile() called with cas_handle: "+cas_handle+", and gameid: " + game_id);
  var path = "/api/secure/jsonws/egs-portlet.gamingprofile/get?ver=1.0&title="+metadata.slug+"&gid="+encodeURIComponent(game_id)+"&email="+encodeURIComponent(cas_handle);

  var auth = (EGS_USERNAME && EGS_PASSWORD) ? (encodeURIComponent(EGS_USERNAME)+":"+EGS_PASSWORD+"@") : "";
  var url = EGS_PROTOCOL + "://"+auth+EGS_HOST+":"+EGS_PORT+path;
  var opts = {
    url: url,
    method: 'GET'
  };
  logger.debug("Opts for request:", opts);
  http_request(opts, function(error, response, body) {
    if (error) {
      logger.error("Error getting gaming profile from EGS. Error: " + error);
      callback("Unable to retrieve gaming profile for "+cas_handle);
      return;
    }
    if (response.statusCode !== 200) {
      logger.error("Error getting gaming profile from EGS. Response code: " + (response.statusCode || 'none') );
      logger.error(body);
      callback("Unable to retrieve gaming profile for "+cas_handle);
      return;
    }

    logger.debug("Response from EGS: " + body);
/*
     {
       "gameInstanceId": "xxx",
       "gamingId":"xxxxxxx",
       "casId": "some email address"
     }
*/
    var response = JSON.parse(body);
    if (response.exception) {
      callback(response.exception, null);
    } else {
      callback(null, response);
    }
    return;
  });
};

var respond_with_error = function(response, message) {
  logger.error("Error: " + message);
  response.send(message, 400);
};

var createGame = function(req, res) {
  logger.debug("Creating game.");
  var lang = req.lang;
  var debug = req.debug;
  var app = req.app;
  var role1 = metadata.roles[0];
  var role2 = metadata.roles[1];
  var player1 = req.param('role1') || req.param(role1.slug);
  var player2 = req.param('role2') || req.param(role2.slug);
  if (!player1 || !player2) {
    logger.error("Got invalid request for new game:");
    logger.error(req.query);
    return egs_error_response(req, res, "Both roles must be provided ("+role1.slug+" and "+role2.slug+")");
  }

  var roles = {}
  roles[role1.slug] = player1;
  roles[role2.slug] = player2;
  var dbgame = new GameModel({
    is_in_progress: true,
    roles: roles
  });
  dbgame.save(function (err, game) {
    if (err) { throw err; }

    logger.debug("Created game: "+game._id+". Roles: "+game.roles);
    egs_game_response(req, res, game._id, function() {
      var egs_notifier = new EGSNotifier.EGSNotifier({
        host: EGS_HOST,
        port: EGS_PORT,
        username: EGS_USERNAME,
        password: EGS_PASSWORD,
        game_id: dbgame._id,
        game_title: metadata.slug,
        game_version: '1.0',
        players: roles
      });
      egs_notifier.setPlayerState(Game.initialPlayerState());
    });
  });
};

var playGame = function(req, res, game_id, user) {
  logger.debug("Request to play game '"+game_id+"' from user:"******"role is a required parameter", 400);
    return;
  }
  if (role !== metadata.roles[0].slug && role !== metadata.roles[1].slug) {
    res.send("role must be one of '"+metadata.roles[0].slug+"' or '"+metadata.roles[1].slug+"'");
    return;
  }

  GameModel.findOne({_id: game_id}, function(err, game) {
    if (err || !game) {
      logger.error("Error looking up game '"+game_id+"'");
      res.send("Could not find game with id: " + game_id, 400);
      return;
    }
    logger.debug("Found game: " + game_id);
    logger.debug(game);

    logger.debug("User:"******"Requested game role ('"+requested_nickname+"') does not match the logged in user ('"+user.gaming_id+"').");
      logger.debug("Requested role: " + role + ", saved handle: " + requested_nickname + ", current handle: " + user.gaming_id);
      return;
    }

    // TODO HACK temporary hack to quickly lookup game_id after they connect with websockets
    Session.findOne({session_id: req.cookies['express.sid']}, function(err, session) {
      if (err) {
        logger.error("Error looking up session for: " + req.cookies['express.sid']);
        res.send("Could not find session. Try reconnecting.", 400);
        return;
      }

      session.game_id = game_id;
      logger.debug("Saved game_id to session.");
      session.save(function(err) {
        if (err) { throw err; }

        logger.debug("Playing game: "+game_id);
        me.send_index(req, res);
      });
    });
  });
};

app.post(PREFIX+'/new', function(req, res) {
  handleNew(req, res);
});
app.get(PREFIX+'/new', function(req,res) {
  handleNew(req, res);
});
app.post(PREFIX+'/play', function(req, res) {
  handlePlay(req, res);
});
app.get(PREFIX+'/play', function(req, res) {
  handlePlay(req, res);
});

app.get(PREFIX+'/credits', function (req, res) {
  var md = require("node-markdown").Markdown;
  fs.readFile('CREDITS.md', 'utf-8', function(err, credits) {
    if (err) {
      logger.err("Error reading CREDITS.md", err);
      res.send("Error!");
      return;
    }
    var html = md(credits);
    res.header("Content-Type", "text/html");
    res.send(html);
  });
});
app.get(PREFIX+'/status', function(req, res) {
  res.send("Okay!");
});
app.get(PREFIX+'/lib/*', serve_lib);
app.get(PREFIX+'/*', serve_assets);
var debug = function(req, res) {
  res.header("Content-Type", "text/html");
  var html = "";
  html += "<p>Hi! I'm a Raven instance running '"+metadata.name+"' at '"+req.headers.host+"'.</p>";
  html += "<p>req url: " + req.url +"</p><hr>";
  html += "<p>Query: <br><pre>"+JSON.stringify(req.query,null,'\t')+"</pre></p><hr>";
  html += "<p>ENV VARS: <br><pre>" + JSON.stringify(process.env,null,'\t')+"</pre></p>";

  res.send(html);
};
// app.get(PREFIX+'/', debug);
// app.get('/*', debug);

//Clients should set their resource to 'PREFIX/socket.io', minus the initial trailing slash
io.set('resource', PREFIX+"/socket.io");
io.set('authorization', function (data, accept) {
  // check if there's a cookie header
  if (data.headers.cookie) {
    // if there is, parse the cookie
    data.cookie = cookie.parse(data.headers.cookie);
    // note that you will need to use the same key to grad the
    // session id, as you specified in the Express setup.
    data.sessionID = data.cookie['express.sid'];
  } else {
   // if there isn't, turn down the connection with a message
   // and leave the function.
   return accept('No cookie transmitted.', false);
  }
  // accept the incoming connection
  accept(null, true);
});

var Table = function(dbgame) {
  var table = this;
  var game;
  var players = {}; //indexed by gaming_id
  var draw_offered_by = dbgame.draw_offered_by; //keeps track of whether a draw has been offered and by whom
  this.setDrawOfferedBy = function(val) {
    table.draw_offered_by = val;
    dbgame.draw_offered_by = val;
    dbgame.save(function(err) { if (err) throw err; });
  };

  var roles = {};
  _.each(metadata.roles, function(role) {
    roles[role.slug] = dbgame.roles[role.slug];
  });

  var egs_notifier = new EGSNotifier.EGSNotifier({
    host: EGS_HOST,
    port: EGS_PORT,
    username: EGS_USERNAME,
    password: EGS_PASSWORD,
    game_id: dbgame._id,
    game_title: metadata.slug,
    game_version: '1.0',
    players: roles
  });

  var raven = {
    broadcast: function(message, data) {
      _.each(players, function(player, gaming_id) {
        player.socket.emit(message, data);
      });
    },
    save: function(gameStateDTO) {
      dbgame.gameState = JSON.stringify(gameStateDTO);
      dbgame.save(function(err) { if (err) throw err; });
    },
    /*
     * Portal notification methods
     */

    /*
     * Sets the waiting state for each role specified in `state`.
     * `state` is an object which has roles for properties and their attention
     * state for values. Valid values are "ATTN" and "PEND".
     *
     * "ATTN" indicates that the game is waiting for this player to
     * provide input (for example, to take their turn). "PEND" means that
     * the game is not waiting on this player (for example, it is the other
     * player's turn).
     *
     * Example state:
     * {
     *   white: "ATTN",
     *   black: "PEND"
     * }
     *
     * As a short cut, one can call setPlayerState(role, state), which is the
     * equivalent of doing setPlayerState({ role: state })
     */
    setPlayerState: function(state) {
      if (arguments.length === 2) {
        var singleState = {}
        singleState[arguments[0]] = arguments[1];
        egs_notifier.setPlayerState(singleState);
      } else {
        egs_notifier.setPlayerState(state);
      }
    },
    ATTN: "ATTN", // Indicates that the game is waiting for the player
    PEND: "PEND", // Indicates that the game is not waiting for the player
    OVER: "OVER", // Indicates that this player is done with the game.
    /*
     * Indicate that the player in `role` has forfeit the game
     */
    forfeit: function(role) {
      egs_notifier.forfeit(role);
    },
    /*
     * Indicate that the game is over. The winner is specified by
     * `winning_role`. `scores` contains the final scores
     */
    gameover: function(winning_role, scores) {
      egs_notifier.gameover(winning_role, scores);
    }
  };

  if (_.isUndefined(dbgame.gameState) || dbgame.gameState === null) {
    logger.info("Creating new game: "+dbgame._id);
    game = Game(raven);
  } else {
    logger.debug("Restoring old game: "+dbgame._id);
    game = Game(raven, JSON.parse(dbgame.gameState));
  }

  var addPlayer = function(socket, user, role) {
    players[user.gaming_id] = { user: user, socket: socket, role: role};

    socket.emit('userdata', { username: user.gaming_id, role: role });

    game.addPlayer(socket, user, role);

    raven.broadcast('user_online', user.gaming_id);
    socket.emit('chat_history', dbgame.chat_messages);

    if (table.draw_offered_by && table.draw_offered_by !== user.gaming_id) {
      socket.emit('draw_offered', {by: table.draw_offered_by});
    }

    var handleError = function(callback, data) {
      try {
        var result = callback(data);
        return result;
      } catch (e) {
        socket.emit('error', e);
        console.log("Error: ", e);
        console.log(e.stack);
      }
    };

    var logAndHandle = function(message, callback) {
      socket.on(message, function(data) {
        console.log("["+user.gaming_id+"] " + message + ": ", data);

        return handleError(callback, data);
      });
    };

    logAndHandle('message', function(message) {
      message = {user: user.gaming_id, message: message.message, role: role, time: new Date()};
      dbgame.chat_messages.push(message);
      dbgame.save();
      raven.broadcast('message', message);
    });

    logAndHandle('offer_draw', function() {
      console.log(user.gaming_id + " is offering a draw.");
      if (!game.hasStarted()) {
        throw "Game has not started yet!";
      }
      if (table.draw_offered_by) {
        throw "Draw has already been offered!";
      }
      table.setDrawOfferedBy(user.gaming_id);

      raven.broadcast('draw_offered', {by: user.gaming_id});
    });

    logAndHandle('accept_draw', function() {
      console.log(user.gaming_id + " has accepted the draw offer");
      if (!table.draw_offered_by) {
        throw "No draw has been offered!";
      }
      if (user.gaming_id === table.draw_offered_by) {
        throw "You cannot accept your own draw!";
      }
      raven.broadcast('draw_accepted', null);
      game.draw();
      table.setDrawOfferedBy(null);
      egs_notifier.draw();
    });

    logAndHandle('reject_draw', function() {
      if (!table.draw_offered_by) {
        throw "No draw has been offered!";
      }
      if (user.gaming_id === table.draw_offered_by) {
        throw "You cannot reject your own draw!";
      }
      raven.broadcast('draw_rejected', null);
      console.log(user.gaming_id + " has rejected the draw offer");
      table.setDrawOfferedBy(null);
    });

    socket.on('disconnect', function(socket) {
      delete players[user.gaming_id];
      raven.broadcast('user_offline', user.gaming_id);
      logger.info(user.gaming_id + " disconnected.");
      logger.info('connected users: ', totalUsers());
    });

    logger.debug('joined table');
    logger.debug('active tables: ' + tables.length);
    logger.info('connected users: ' + totalUsers());
  }

  return {
    game: game,
    dbgame: dbgame,
    addPlayer: addPlayer
  };
};
// TODO tables are currently never unloaded. Should unload them after all players disconnect
var tables = [];

var totalUsers = function() {
  return _.reduce(tables, function(accum, table) {
    return accum + table.game.getPlayerCount();
  }, 0)
};

var findTable = function(dbgame) {
  var i = 0;
  for(i = 0; i < tables.length; i++) {
    tmp = tables[i].dbgame;
    if (tmp._id.equals(dbgame._id)) {
      return tables[i];
    }
  }
  return null;
}


var handleSessionError = function(socket) {
  socket.emit('session_error', "Invalid socket session. Please refresh your browser.");
};

io.sockets.on('connection', function (socket) {
  if (!socket.handshake.sessionID) {
    // This occurs when a client reconnects after server restarts
    handleSessionError(socket);
    return;
  }
  Session.findOne({session_id: socket.handshake.sessionID}, function(err, session) {
    if (err) {
      throw "Error looking up session: " + err;
    }
    if (!session) {
      handleSessionError(socket);
      return;
    }
    var game_id = session.game_id;
    GameModel.findOne({_id: game_id}, function(err, dbgame) {
      if (err || !dbgame) {
        logger.error("Unable to lookup game: "+game_id);
        socket.emit('error', "Unable to lookup requested game. Try refreshing your browser.");
        return;
      }
      User.findOne({gaming_id: session.gaming_id}, function(err, user) {
        if (err || !user) {
          logger.error("Unable to look up user by user.gaming_id '"+user.gaming_id+"': "+err);
          socket.emit('error', "Unable to look up user. Try refreshing your browser.");
          return;
        }
        var role;
        _.find(dbgame.roles, function(gaming_id, role_slug) {
          role = role_slug;
          return gaming_id === user.gaming_id;
        });
        var table = findTable(dbgame);
        if (!table) {
          table = Table(dbgame);
          logger.debug("Stuffing game into tables: " + dbgame._id);
          tables.push(table);
        }
        table.addPlayer(socket, user, role);
      });
    });
  });
});

var options = { server: { socketOptions: { connectTimeoutMS: 10000 }}};
mongoose.connect('mongodb://localhost/lvg-'+metadata.slug, options, function(err) {
  if (err) {
    throw err;
  }
});

server.listen(PORT, function() {
  logger.info("["+new Date()+"] "+metadata.name+" listening on http://localhost:" + PORT + PREFIX);
});


  }; // function run()
Beispiel #3
0
// chokidar 
var chokidar = require('chokidar');

 // start server
var server = http.createServer(function(req, res) {
     res.writeHead(200, {"Content-Type":"text/html"});
     var output = fs.readFileSync("./index.html", "utf-8");
     res.end(output); }).listen(3000, "10.0.1.2" );

 //mkdir
 mkdirp('./uploads', function(err){
    if (err) console.error(err);
    else console.log('folder created');
});
var io = socketio.listen(server);

 
 var watcher = chokidar.watch('./uploads', {ignored: /[\/\\]\./, persistent:true});
watcher.on('add', function(path) {
    
    getImg = path; 
    console.log('File', getImg, 'has been added');
    io.sockets.emit("toImg",{src:getImg});
      /* Act on the event */
    });


io.sockets.on("connection", function (socket) {

Beispiel #4
0
		data.urls = docs;
		// render
		res.render('index', data );
	});
	
});

/**
* app start
*/
app.listen(port);

/**
* Socket.IO.JS Magic
*/
var io = io.listen(app);

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

	/**
	* Overview socket listener
	*/
	socket.on('overview-update', function() {
		console.log('overview Update')
	 	URLModel.find({}).exec(function(err, docs){
			data.urls = docs;
			data.overview = new Overview(data);
			socket.emit('overview-updated', data);
		});	

	});
Beispiel #5
0
var createChat = function(server) {
  var io = socket.listen(server);
  var guestNumber = 1;
  var nicknames = {};
  var currentRooms = {};

  io.sockets.on('connection', function (socket) {
    joinRoom('lobby', socket);
    socket.on('messageEvt', function (msg) {
      var data = { user: nicknames[socket.id], text: msg }
      io.sockets.in(currentRooms[socket.id]).emit('message', data);
    });

    socket.on('roomChangeRequest', function(room) {
      var oldRoom = currentRooms[socket.id];
      // io.sockets.in(currentRooms[socket.id]).emit('roomChangeResult', {
      //   message: 'Left Room',
      //   roomList: toNicknames(io.sockets.clients(room))
      // });
      joinRoom(room, socket);

      io.sockets.in(currentRooms[socket.id]).emit('roomChangeResult', {
        message: 'Joined Room',
        roomList: toNicknames(io.sockets.clients(room))
      });

      io.sockets.in(oldRoom).emit('roomChangeResult', {
        message: 'Joined Room',
        roomList: toNicknames(io.sockets.clients(oldRoom))
      });
    })

    socket.on('nicknameChangeRequest', function(nick) {
      if (!nick) {
        socket.emit('nicknameChangeResult', {
          success: false,
          message: 'Nickname cannot be blank.'
        });
      }
      else if (nick.slice(0, 5).toLowerCase() === 'guest') {
        socket.emit('nicknameChangeResult', {
          success: false,
          message: 'Names cannot begin with "guest".'
        });
      } else if (nameIsAlreadyTaken(nick)) {
        socket.emit('nicknameChangeResult', {
          success: false,
          message: 'Names is already taken.'
        });
      } else {
        nicknames[socket.id] = nick;
        socket.emit('nicknameChangeResult', {
          success: true,
          message: 'Names is successfully changed.'
        });
      }
    });

    nicknames[socket.id] = "guest_" + guestNumber;
    guestNumber += 1;
  });

  var nameIsAlreadyTaken = function(nick) {
    for (var key in nicknames) {
      if (nicknames[key] === nick) {
        return true
      }
    }
    return false
  };

  var joinRoom = function(room, socket) {
    if (currentRooms[socket.id]) {
      socket.leave(currentRooms[socket.id]);
    }
    currentRooms[socket.id] = room;
    socket.join(room);
  }

  var toNicknames = function(sockets) {
    var nickname_array = [];
    sockets.forEach(function(socket) {
      nickname_array.push(nicknames[socket.id]);
    })
    return nickname_array;
  }
};
Beispiel #6
0
 this.io.configure('development', function() {
   io.set('log level', 1);
   io.set('transports', ['websocket']);
 });
Beispiel #7
0
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function() {
  app.use(express.errorHandler());
});

var server = http.createServer(app).listen(app.get('port'), function() {
  console.log("Express server listening on port " + app.get('port'));
});


var sio = io.listen(server);
//User online user count variable
var users = 0;

var address_list = new Array();

sio.sockets.on('connection', function (socket) {
  var address = socket.handshake.address;

  if (address_list[address]) {
    var socketid = address_list[address].list;
    socketid.push(socket.id);
    address_list[address].list = socketid;
  } else {
    var socketid = new Array();
    socketid.push(socket.id);
Beispiel #8
0
  server.start(() => {
    server.log('info', `Server running at: ${server.info.uri}`);

    const io = SocketIO.listen(server.listener);
    server.app.options = options;
    server.app.io = io;

    server.plugins['hapi-shutdown'].register(
      {
        taskname: 'shutdown',
        task: () => {
          deleteSubscription((err) => {
            if (err) {
              throw err;
            }
          });
        },
        timeout: 2000
      }
    );

    io.on('connection', socket => {
      server.log('info', 'Client connected to local socket');

      socket.join('realtime');

      socket.on('flow:pause', (callback) => {
        socket.leave('realtime');

        return callback();
      });

      socket.on('flow:start', (callback) => {
        socket.join('realtime');

        return callback();
      });

      socket.on('disconnect', () => socket.leave('realtime'));
    });

    if (options.testData) {
      let counter = 1;
      setInterval (() => {
        let data = {
          caption: `description ${counter}`,
          id: counter,
          latLng: [Math.random() * 180 - 90, Math.random() * 360 - 180],
          user: {
            profile_picture: '/public/user.jpg',
            full_name: `User ${counter}`,
            username: `user ${counter}`,
          },
        };

        io.to('realtime').emit('data:add', [data], true);

        counter++;
      }, 1000);
    } else {
      const client = Redis.createClient();
      server.app.client = client;

      getTokens(client, (err, tokens) => {
        if (err) {
          throw err;
        }

        setValidTokens(tokens);
        addSubscription((err) => {
          if (err) {
            throw err;
          }
        });
      });

      client.on('connect', () => server.log('info', 'Redis connection established'));
      client.on('error', () => server.log('error', 'Redis connection error'));
      client.on('end', () => server.log('error', 'Redis not running'));
    }
  });
/**
 * Create app.
 */

app = express.createServer(
    express.bodyParser()
  , express.static('public')
);

/**
 * Listen.
 */

app.listen(3000);

var io = sio.listen(app)
  , apiKey = 'cc78b550effeea0edb929ada1e9d0729'
  , currentSong
  , dj

function elect (socket) {
  dj = socket;
  io.sockets.emit('announcement', socket.nickname + ' is the new dj');
  socket.emit('elected');
  socket.dj = true;
  socket.on('disconnect', function () {
    dj = null;
    io.sockets.emit('announcement', 'the dj left - next one to join becomes dj');
  });
}
Beispiel #10
0
 _.each(hosts, function (value, key) {
   io.to(value.id).emit("join_member", { members: secure_user });
 });
Beispiel #11
0
    }
    var result = checked_email_list[email].getAllMessages();
    console.log(result);
    res.render('mail', {
        locals: {
            title: email + " | Temporary Email",
            data: result,
            email: email
        }
    });
});

app.listen(8389);
console.log("Server listening on port %d", app.address().port);

var io = io.listen(app);
io.on('connection', function(client){
    var email;
    client.on('message', function(message){
        if (message.command == "start_listen"){
            email = message.email;
            checked_email_list[message.email].clients.push(client);
        }
    });
    client.on('disconnect', function(){
        checked_email_list[email] && checked_email_list[email].delete_client(client);
    });
});

function strip_tags (input, allowed) {
    // *     example 1: strip_tags('<p>Kevin</p> <b>van</b> <i>Zonneveld</i>', '<i><b>');
Beispiel #12
0
 _.each(getUsers(), function (value, key, index) {
   if (peer === value.peer) {
     io.to(value.id).emit("stop_stream", { from: user.peer });
   }
 });
Beispiel #13
0
 _.each(users, function (value, key) {
   io.to(value.id).emit("join_member", { members: secure_user });
   io.to(value.id).emit("hosts_count", { count: _.size(hosts) });
 });
Beispiel #14
0
  var tmp_hosts = _users.filterById(function (id, value, index) {
    return value.host === true && value.connected === true;
  }),
  hosts = {};
  _.each(tmp_hosts, function (value, key, index) {
    hosts[_users.originalIdByToken(value)] = value.secure_parsed();
  });
  return hosts;
},

denyAccess = function (accept, args, ctx, token) {
  Log.i( chalk.red("Denegado acceso con token: " + token.substr(0, 50) + "…") );
  accept.apply(ctx, args);
};

io = io.listen(HttpsServer);

io.set("authorization", function (handshakeData, accept) {
  var token = url.parse(handshakeData.url, true).query.token;
  try {
    jsonwt.verify(token, app.get("secretPass"), function (err, data) {
      if (err) {
        denyAccess(accept, [err, false], this, token);
      } else {
        handshakeData.decoded_token = _.extend(data, { token: token, connected: false, peer: md5(token) });
        accept(err, true);
      }
    });
  } catch (e) {
    denyAccess(accept, [err, false], this, token);
  }
Beispiel #15
0
        if (status) {
          res.status(status);
        }
        res.send('<!doctype html>\n' +
          ReactDOM.renderToString(<Html assets={webpackIsomorphicTools.assets()} component={component} store={store}/>));
      }).catch((err) => {
        console.error('DATA FETCHING ERROR:', pretty.render(err));
        res.status(500);
        hydrateOnClient();
      });
    }
  }));
});

if (config.port) {
  if (config.isProduction) {
    const io = new SocketIo(server);
    io.path('/api/ws');
  }

  server.listen(config.port, (err) => {
    if (err) {
      console.error(err);
    }
    console.info('----\n==> ✅  %s is running, talking to API server on %s.', config.app.title, config.apiPort);
    console.info('==> 💻  Open http://localhost:%s in a browser to view the app.', config.port);
  });
} else {
  console.error('==>     ERROR: No PORT environment variable has been specified');
}
Beispiel #16
0
'use strict';

const express = require('express');
const socket = require('socket.io');

const server = express();
const serverSocket = socket.listen(server.listen(8080));
let msgLimit = 20,
messages =[],
users = [];

server.set('views', __dirname + '/tpl');
server.set('view engine', 'jade');
server.engine('jade', require('jade').__express);
server.use(express.static('public'));

server.get('/', function (req, res) {
	res.render('page');
})

serverSocket.sockets.on('connection', function (client) {
	client.emit('message', messages.join('<br>'));
	client.emit('users', users);

	client.on('send', function (data) {
		data = linkWrapper( removeTags(data) );
		client.get('nickname', function (err, nickname) {
			let message = '<span>' + nickname + ':</span> ' + data;
			if (messages.length == msgLimit) {
				messages.shift();
			}
Beispiel #17
0
            encoding: ext == 'swf' ? 'binary' : 'utf8'
          };
          self.sendCachedFile(req, res, localPath);
        }
      });
  } else {
    console.log("bad request for /swank-js/ path");
    this.notFound(res);
  }
};

var httpListener = new HttpListener(cfg);
var httpServer = http.createServer(httpListener.serveClient.bind(httpListener));

httpServer.listen(8009);
io = io.listen(httpServer);

io.sockets.on(
  "connection", function (client) {
    // new client is here!
    console.log("client connected");
    function handleHandshake (message) {
      message = JSON.parse(message);
      client.removeListener("message", handleHandshake);
      if (!message.hasOwnProperty("op") || message.op != "handshake")
        console.warn("WARNING: skipping pre-handshake message: %j", message);
      else {
        var address = null;
        if (client.connection && client.connection.remoteAddress)
          address = client.connection.remoteAddress || "noaddress";
        var remote = new BrowserRemote({ address: address, userAgent: message.userAgent || "" }, client);
Beispiel #18
0
module.exports = function(db) {
	// Initialize express app
	var app = express();
    
	// Globbing model files
	config.getGlobbedFiles('./app/models/**/*.js').forEach(function(modelPath) {
		require(path.resolve(modelPath));
	});

	// Setting application local variables
	app.locals.title = config.app.title;
	app.locals.description = config.app.description;
	app.locals.keywords = config.app.keywords;
	app.locals.facebookAppId = config.facebook.clientID;
	app.locals.jsFiles = config.getJavaScriptAssets();
	app.locals.cssFiles = config.getCSSAssets();

	// Passing the request url to environment locals
	app.use(function(req, res, next) {
		res.locals.url = req.protocol + '://' + req.headers.host + req.url;
		next();
	});

	// Should be placed before express.static
	app.use(compress({
		filter: function(req, res) {
			return (/json|text|javascript|css/).test(res.getHeader('Content-Type'));
		},
		level: 9
	}));

	// Showing stack errors
	app.set('showStackError', true);

	// Set swig as the template engine
	app.engine('server.view.html', consolidate[config.templateEngine]);

	// Set views path and view engine
	app.set('view engine', 'server.view.html');
	app.set('views', './app/views');

	// Environment dependent middleware
	if (process.env.NODE_ENV === 'development') {
		// Enable logger (morgan)
		app.use(morgan('dev'));

		// Disable views cache
		app.set('view cache', false);
	} else if (process.env.NODE_ENV === 'production') {
		app.locals.cache = 'memory';
	}

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

	// CookieParser should be above session
	app.use(cookieParser());

	// Express MongoDB session storage
	app.use(session({
		saveUninitialized: true,
		resave: true,
		secret: config.sessionSecret,
		store: new mongoStore({
			db: db.connection.db,
			collection: config.sessionCollection
		})
	}));

	// use passport session
	app.use(passport.initialize());
	app.use(passport.session());

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

	// Use helmet to secure Express headers
	app.use(helmet.xframe());
	app.use(helmet.xssFilter());
	app.use(helmet.nosniff());
	app.use(helmet.ienoopen());
	app.disable('x-powered-by');

	// Setting the app router and static folder
	app.use(express.static(path.resolve('./public')));

	// Globbing routing files
	config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) {
		require(path.resolve(routePath))(app);
	});

	// Assume 'not found' in the error msgs is a 404. this is somewhat silly, but valid, you can do whatever you like, set properties, use instanceof etc.
	app.use(function(err, req, res, next) {
		// If the error object doesn't exists
		if (!err) return next();

		// Log it
		console.error(err.stack);

		// Error page
		res.status(500).render('500', {
			error: err.stack
		});
	});

	// Assume 404 since no middleware responded
	app.use(function(req, res) {
		res.status(404).render('404', {
			url: req.originalUrl,
			error: 'Not Found'
		});
	});

	if (process.env.NODE_ENV === 'secure') {
		// Log SSL usage
		console.log('Securely using https protocol');

		// Load SSL key and certificate
		var privateKey = fs.readFileSync('./config/sslcerts/key.pem', 'utf8');
		var certificate = fs.readFileSync('./config/sslcerts/cert.pem', 'utf8');

		// Create HTTPS Server
		var httpsServer = https.createServer({
			key: privateKey,
			cert: certificate
		}, app);

		// Return HTTPS server instance
		return httpsServer;
	}
	// Attach Socket.io
    var server = http.createServer(app);
    var io = socketio.listen(server);
    app.set('socketio', io);
    app.set('server', server);
    
    var QueueManager = require('../app/modules/queue.js')(app);
	


	// Return Express server instance
	return app;
};
Beispiel #19
0
    , http = require('http')
    , socketio = require('socket.io')
    , qs = require('querystring')
    , ft = require('./db_functions.js')
    , db = require('./lib_db.js');

var server = http.createServer(function(req, res){
    if(req.url === '/api/obter-mensagens'){
        if(req.method === 'GET'){            
            res.writeHead(200, {'Content-type': 'application/json'});
            db.all("SELECT * from mensagens", function(err, rows){
                res.end(JSON.stringify(rows));
            }); 
        }
    }else{
        res.writeHead(200, {'Content-type': 'text/html'});
        res.end(fs.readFileSync(__dirname + '/index.html')); 
    }
}).listen(3000, function(){
    console.log('Rodando porta em http://localhost:3000');
});

socketio.listen(server).on('connection', function(socket){
    socket.on('message', function(usuario, mensagem){
        console.log('Message Received: ' + mensagem + ' from '+ usuario);
        ft.submeter_mensagem(usuario, mensagem);
        socket.broadcast.emit('message', (usuario, mensagem));
    });
});

Beispiel #20
0
module.exports = function (server, config) {
    var io = socketIO.listen(server);

    io.sockets.on('connection', function (client) {
        client.resources = {
            screen: false,
            video: true,
            audio: false
        };

        // pass a message to another id
        client.on('message', function (details) {
            if (!details) return;

            var otherClient = io.to(details.to);
            if (!otherClient) return;

            details.from = client.id;
            otherClient.emit('message', details);
        });

        client.on('shareScreen', function () {
            client.resources.screen = true;
        });

        client.on('unshareScreen', function (type) {
            client.resources.screen = false;
            removeFeed('screen');
        });

        client.on('join', join);

        function removeFeed(type) {
            if (client.room) {
                io.sockets.in(client.room).emit('remove', {
                    id: client.id,
                    type: type
                });
                if (!type) {
                    client.leave(client.room);
                    client.room = undefined;
                }
            }
        }

        function join(name, cb) {
            // sanity check
            if (typeof name !== 'string') return;
            // check if maximum number of clients reached
            if (config.rooms && config.rooms.maxClients > 0 &&
                clientsInRoom(name) >= config.rooms.maxClients) {
                safeCb(cb)('full');
                return;
            }
            // leave any existing rooms
            removeFeed();
            safeCb(cb)(null, describeRoom(name));
            client.join(name);
            client.room = name;
        }

        // we don't want to pass "leave" directly because the
        // event type string of "socket end" gets passed too.
        client.on('disconnect', function () {
            removeFeed();
        });
        client.on('leave', function () {
            removeFeed();
        });

        client.on('create', function (name, cb) {
            if (arguments.length == 2) {
                cb = (typeof cb == 'function') ? cb : function () {};
                name = name || uuid();
            } else {
                cb = name;
                name = uuid();
            }
            // check if exists
            var room = io.nsps['/'].adapter.rooms[name];
            if (room && room.length) {
                safeCb(cb)('taken');
            } else {
                join(name);
                safeCb(cb)(null, name);
            }
        });

        // support for logging full webrtc traces to stdout
        // useful for large-scale error monitoring
        client.on('trace', function (data) {
            console.log('trace', JSON.stringify(
            [data.type, data.session, data.prefix, data.peer, data.time, data.value]
            ));
        });


        // tell client about stun and turn servers and generate nonces
        client.emit('stunservers', config.stunservers || []);

        // create shared secret nonces for TURN authentication
        // the process is described in draft-uberti-behave-turn-rest
        var credentials = [];
        // allow selectively vending turn credentials based on origin.
        var origin = client.handshake.headers.origin;
        if (!config.turnorigins || config.turnorigins.indexOf(origin) !== -1) {
            config.turnservers.forEach(function (server) {
                var hmac = crypto.createHmac('sha1', server.secret);
                // default to 86400 seconds timeout unless specified
                var username = Math.floor(new Date().getTime() / 1000) + (server.expiry || 86400) + "";
                hmac.update(username);
                credentials.push({
                    username: username,
                    credential: hmac.digest('base64'),
                    urls: server.urls || server.url
                });
            });
        }
        client.emit('turnservers', credentials);
    });


    function describeRoom(name) {
        var adapter = io.nsps['/'].adapter;
        var clients = adapter.rooms[name] || {};
        var result = {
            clients: {}
        };
        Object.keys(clients).forEach(function (id) {
            result.clients[id] = adapter.nsp.connected[id].resources;
        });
        return result;
    }

    function clientsInRoom(name) {
        return io.sockets.clients(name).length;
    }

};
Beispiel #21
0
function broadcastInfo ( ip, referer ) {
  var options = {
    host: 'api.ipinfodb.com',
    port: 80,
    path: '/v3/ip-city/?key=afbce595eb8f0b56719f748ed0c9e7dc84f67dc09a244f340624aa21c958f89a&ip=' + ip
  };
  http.get(options, function(res) {
    var data = '';
    res.on('data', function (chunk) {
      data += chunk;
    });
    res.on('end', function () {
      data = data.split(';');
      socket.broadcast({ data: data[6], referer: referer });
    });
  })
}

// Only listen on $ node app.js
if (!module.parent) {
  app.listen( PORT );
  console.log("Express server listening on port %d", app.address().port);
}

var socket = io.listen( app ); 

(function fakeData () {
  socket.broadcast({ data: 'fake' });
  setTimeout( fakeData, Math.random() * 10000 );
})();
Beispiel #22
0
  init: function(){
    //set up web server
    this.httpServer = express.createServer();
    this.httpServer.use(express.bodyParser());

    this.httpServer.post("/connect_to_channel", function(req, res) {
        var channel_str = req.body.channel;
        var credential_str = req.body.credentials;
        var secret = req.body.secret;

        //check that server's secret string matches configuation's secret
        if( secret != config.secret ) {
            res.send("FAIL");
            return false;
        }

        Events.subscribe({
          channel: channel_str,
          credential_str: credential_str,
          meta: '',
          server_id: 0
        });
        
        //store the user's subscription to the channel in the redis datastore, in the event that the the client is not connected to any servers
        //when the message is sent; if the user is, this command will be duplicated (harmlessly)
        Clients.channel_store.add(credential_str, channel_str);

        if( config.debug )
            console.log("server-side connectToChannel", channel_str, credential_str);
            
        res.send("OK")
    });

    this.httpServer.post("/disconnect_from_channel", function(req, res) {
        var channel_str = req.body.channel;
        var credential_str = req.body.credentials;
        var secret = req.body.secret;

        //check that server's secret string matches configuation's secret
        if( secret != config.secret ) {
            res.send("FAIL");
            return false;
        }

        if( channel_str == "__all__") {
            //TODO: not really sure how to disconnect from all channels ATM
        } else {
          Events.unsubscribe({
            channel: channel_str,
            credential_str: credential_str,
            meta: '',
            server_id: 0
          });          
        }
        
        //store the user's removal from channel in the redis datastore, in the event that the the client is not connected to any servers
        //when the message is sent; if the user is, this command will be duplicated (harmlessly)
        Clients.channel_store.remove(credential_str, channel_str);

        res.send("OK")

        if( config.debug )
            console.log("server-side disconnectFromChannel", channel_str, credential_str);
    });

    this.httpServer.post("/message", function(req, res) {
        var channel_str = req.body.channel;
        var message_str = req.body.message;
        var secret = req.body.secret;

        //check that server's secret string matches configuation's secret
        if( secret != config.secret ) {
            res.send("FAIL");
            return false;
        }

        if( config.debug ) {
            var console_msg_str = ( message_str.length > 250 ) ? message_str.substr(0,250) + "..." : message_str;
            console.log("server-side message", channel_str, console_msg_str);
        }
        
        Events.message([channel_str], message_str);

        res.send("OK")        
    });

    //set up static file server
    this.httpServer.use(express.static("./public"));
    
    //set up socket server
    this.socket = io.listen(this.httpServer);
    this.socket.on("connection", function(stream){ new Connection(stream) });
  },
Beispiel #23
0
/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes');
  
// socket io
var io = require('socket.io');
 
var app = module.exports = express.createServer();

// socket io setup
io = io.listen(app);

// Configuration
// configure socket.io
io.configure(function () {
  
  // recommended production testing
  //io.enable('browser client minification');  // send minified client
  //io.enable('browser client etag');          // apply etag caching logic based on version number
  //io.enable('browser client gzip');          // gzip the file
  
  io.set('log level', 1); // reduce level of logging to warning only
  
  io.set('transports', [
      'websocket'
    , 'flashsocket'
    , 'htmlfile'
var http  = require('http'),
    io    = require('socket.io'),
    util  = require('util'),
    path  = require('path'),
    spawn = require('child_process').exec,
    ansi  = require('ansi-html-stream');
 
var server = http.createServer(function(req, res){
  res.writeHead(200);
  res.end("OK");
}).listen(8002);
 
var io_app  = io.listen(server),
    cwd = process.cwd(),
    currentProcess;

function getUserHome() {
  return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}

io_app.sockets.on('connection', function(socket){
  socket.on('exec', function(cmd){

    socket.emit("exec_init");

    cmd = cmd.trim();

    var cdm;
    if(cdm = cmd.match(/^\s*cd (.*)/)){
      cdm[1] = cdm[1].replace("~", getUserHome());
      var cwdt = path.resolve(cwd, cdm[1]);
Beispiel #25
0
exports.listen = function(abs_path, port) {
    op.chdir(abs_path);
    var cwd = process.cwd();

    server.configure(function() {
        server.use(express.bodyParser());
        server.use(express.methodOverride());
        server.use(server.router);
        server.use(express.static(__dirname + '/../public'));
    });

    staticServer.configure(function() {
        staticServer.use(express.bodyParser());
        staticServer.use(express.methodOverride());
        staticServer.use(server.router);
        staticServer.use(express.static(cwd));
    });

    var io = sockeio.listen(httpServer, {
        'log level': 1
    })

    io.configure(function() {
        io.set('transports', ['xhr-polling', 'jsonp-polling']);
    });

    httpServer.listen(port, function() {
        httpStaticServer.listen(port + 1, function() {});
    });

    var serverErrorHandler = function(err) {
        if (err.code == 'EADDRINUSE') {
            console.error('Error: Address already in use. use another port');
            process.exit(-1);
        } else {
            console.error('Error: ', err);
            process.exit(-1);
        }
    }

    server.on('error', serverErrorHandler);
    staticServer.on('error', serverErrorHandler);

    io.sockets.on('connection', function(socket) {
        op.list(cwd, function(nodes) {
            socket.emit('cwd', cwd, cwd.substring(cwd.lastIndexOf(separator) + 1), nodes);
        });

        socket.on('openfolder', function(folder) {
            op.list(folder, function(nodes) {
                socket.emit('openfolder', folder, nodes);
            });
        });


        //显示文件内容事件
        socket.on('load', function(path, isMarkdown) {
            op.load(path, function(result, file) {
                if (result) {
                    socket.emit('file', {
                        path: path,
                        error: null,
                        file: file
                    });
                } else {
                    socket.emit('file', {
                        path: path,
                        error: file,
                        file: null
                    });
                }
            });
        });

        socket.on('save', function(data, fn) {
            var index = data.index;
            op.save(data.path, data.content, function(result, desc) {
                if (result) {
                    fn({
                        result: true,
                        index: index,
                        path: data.path
                    })

                } else {
                    fn({
                        result: false,
                        index: index,
                        path: data.path,
                        error: desc
                    });
                }
            });
        });

    });
}
var socket=require("socket.io"),os=require("os"),childProcess=require("child_process"),path=require("path"),thread={Global:{MaxThreads:16,LogLevel:5,Port:85498,NodeExecutable:"node"},WorkerPool:[],Queue:[],Events:{OnFinish:function(){}},Server:void 0,Initialize:function(a){a.Port&&(thread.Global.Port=a.Port),a.MaxThreads&&(thread.Global.MaxThreads=a.MaxThreads),a.NodeExecutable&&(thread.Global.NodeExecutable=a.NodeExecutable),a.LogLevel&&(thread.Global.LogLevel=a.LogLevel),thread.Server=socket.listen(thread.Global.Port),thread.Server.set("log level",1),thread.Server.sockets.on("connection",function(a){a.on("Boot",function(b){thread.Work(a,b)}),a.on("Result",function(b){console.log("Worker "+b.id+": "+b.result),thread.Work(a,b)})})},Work:function(a,b){if(thread.Queue.length>0)a.emit("Work",{task:thread.Queue[0].Task,index:b.id}),thread.Queue=thread.Queue.slice(1),console.log("Worker "+b.id+": Grabbed Task from Queue, "+thread.Queue.length+" remaining"),0===thread.Queue.length&&console.log("Queue empty");else{console.log("Queue empty"),thread.WorkerPool[b.id].state=0;var c=0;thread.WorkerPool.forEach(function(a){c+=a.state}),0===c&&thread.Events.OnFinish()}},CreateThread:function(a){if(!a)return!1;thread.Queue.push(a),thread.Server.emit("Add",{});var b=thread.WorkerPool.length;if(b<thread.Global.MaxThreads){var c=path.join(__dirname,"..","lib","ThreadBase.js"),d=["node",c,thread.Global.Port,b],e=childProcess.exec(d.join(" "),function(a,c,d){console.log("Worker "+b+": stdout: "+c),console.log("Worker "+b+": stderr: "+d)});e.on("exit",function(a){console.log("Worker "+b+": Finished or exited with code "+a)}),thread.WorkerPool.push({state:1}),console.log("Created Worker Thread "+b)}return!0},End:function(){thread.Server.emit("End",{})},BaseTask:function(a){this.Task=""+a,this.OnExit=function(){}}};module.exports=thread;
Beispiel #27
0
function initialize(server, options, fn) {
    "use strict";

    if (process.env.WEBT_LOGIN) {
        if (process.getuid && process.setuid) {
            if (process.getuid() === 0) {
                try {
                    pam = require("authenticate-pam");
                } catch (err) {
                    console.log(errs.loginNoPam);
                    process.exit(1);
                }
            } else {
                console.log(errs.loginNotRoot);
                process.exit(1);
            }
        } else {
            console.log(errs.loginNotPosix);
            process.exit(1);
        }
    }

    var port, sPort, protocol;

    if ("function" === typeof options) {
        fn = options;
        options = {};
    }

    if (undefined === server) {
        if (process.env.PORT) {
            server = (+process.env.PORT);
        } else {
            server = (+config.port) || 8088;
        }
    }

    if ("string" === typeof server) {
        server = (+server);
    }

    if ("number" === typeof server) {
        // if a port number is passed
        port = server;

        if (options && options.key) {
            protocol = "https";
            http = require(protocol);
            sPort = (port !== 443) ? ":" + port : "";
        } else {
            protocol = "http";
            http = require(protocol);
            sPort = (port !== 80) ? ":" + port : "";
        }

        server = http.createServer(options);
        server.listen(port, fn);
        standalone = true;

        console.log(util.format("Web-Terminal running at %s://localhost%s/terminal", protocol, sPort));
    }

    if (options) {
        autoClose = options.autoClose;
    }

    if (!config.root) {
        config.root = "/terminal";
    }

    server.on("request", function (req, res) {
        if (req.url.indexOf(config.root) === 0) {

            send(req, req.url.substr(config.root.length))
                .root(path.normalize(__dirname + "/../web"))
                .on('error', function (err) {
                    res.statusCode = err.status || 500;
                    res.end(err.message);
                })
                .on('directory', function () {
                    redirect(res, req.url + "/");
                })
                .pipe(res);
        } else if (standalone) {
            redirect(res, config.root);
        }
    });

    io = io.listen(server, { log: false });
    io.sockets.on("connection", function (socket) {

        var cwd         = process.cwd(),
            env         = _.clone(process.env),
            home        = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE,
            linebreak   = "\n", // check if we need to add \r\n for windows
            promptChar  = process.platform === "win32" ? ">" : "$",
            stdin,
            args,
            cmd,
            proc,
            dir,
            replSrv,
            user,
            username;

        function execCmd(command, shell) {
            if (env.WEBT_LOGIN && !user) {
                socket.emit("exit", "login required");
                return;
            }

            var opts = { cwd: cwd, env: env };
            if (user) {
                opts.uid = user;
            }

            if (env.WEB_SHELL || shell) {
                proc = spawn(env.WEB_SHELL || shell, null, opts);
                stdin = proc.stdin;
                stdin.write(command);
                stdin.end();
            } else {
                proc = spawn(cmd, args, opts);
                stdin = proc.stdin;
            }

            proc.on("error", function (err) {
                if (err.code === "ENOENT") {
                    err.message = cmd + ": command not found";
                }
                socket.emit("console", err.message);
            });

            proc.stdout.setEncoding("utf8");
            proc.stdout.on("data", function (data) {
                socket.emit("console", data);
            });

            proc.stderr.setEncoding("utf8");
            proc.stderr.on("data", function (data) {
                if (data.indexOf("execvp():") === 0) {
                    data = cmd + ": command not found";
                }
                socket.emit("console", data);
            });

            proc.on("close", function () {
                stdin = null;
                socket.emit("exit", "");
            });
        }

        function startRepl() {
            var input   = streams.ReplStream(),
                output  = streams.ReplStream();

            input.setEncoding("utf8");
            output.setEncoding("utf8");

            stdin = input;
            output.on("data", function (data) {
                socket.emit("console", data);
            });

            replSrv = repl.start({
                prompt: "> ",
                input: input,
                output: output,
                terminal: false,
                useColors: true
            });

            replSrv.on("exit", function () {
                stdin = null;
                socket.emit("configure", {
                    prompt      : cwd,
                    promptChar  : promptChar
                });
                socket.emit("exit");
                replSrv = null;
            });

            socket.emit("configure", {
                prompt      : "",
                promptChar  : ">"
            });
        }

        socket.on("disconnect", function () {
            if (autoClose && io.sockets.clients().length === 0) {
                server.close();
            }
        });

        socket.on("signal", function (signal) {
            var cmd;

            if (replSrv) {
                switch (signal) {
                case "SIGINT":
                    cmd = ".break";
                    break;
                case "SIGQUIT":
                    cmd = ".exit";
                    break;
                }
                stdin.write(cmd + linebreak);
            } else if (proc) {
                proc.kill(signal);
            }
        });

        socket.on("console", function (command) {
            var i, arg, basePath;

            if (stdin) {
                stdin.write(command + linebreak);
            } else {
                args    = cmdLine.parse(command);
                cmd     = args.splice(0, 1)[0];

                switch (cmd) {
                case "cd":
                    arg = args[0];
                    if (arg[0] === "~") {
                        basePath = home;
                        arg = arg.substring(2);
                    } else {
                        basePath = cwd;
                    }
                    dir = path.resolve(basePath, arg);
                    fs.exists(dir, function (exists) {
                        var msg;
                        if (exists) {
                            cwd = dir;
                            msg = "cwd: " + cwd;
                        } else {
                            msg = "No such file or directory";
                        }
                        socket.emit("exit", msg);
                    });

                    break;
                case "export":
                    for (i = 0; i < args.length; i++) {
                        arg = args[i].split("=");
                        env[arg[0]] = arg[1];
                    }
                    socket.emit("exit");
                    break;
                case "unset":
                    for (i = 0; i < args.length; i++) {
                        delete env[args[i]];
                    }
                    socket.emit("exit");
                    break;
                case "env":
// TODO: handle env command to manage environment variables
                    args.length = 0;
                    command = "env";
                    execCmd(command);
                    break;
                case "ls":
                    if (env.WEB_SHELL) {
                        if (command.length === 2) {
                            command += " --color -C";
                        }
                    } else {
                        if (args.length === 0) {
                            args.push("--color");
                            args.push("-C");
                        }
                    }
                    execCmd(command);
                    break;
                case "node":
                    if (args.length === 0) {
                        startRepl();
                    } else {
                        execCmd(command);
                    }
                    break;
                case "echo":
                    execCmd(command, process.platform === "win32" ? "cmd" : "bash");
                    break;
                case "login":
                case "logout":
                    user = undefined;
                    username = undefined;
                    env.WEBT_LOGIN = "******";
                    socket.emit("configure", { prompt: "", promptChar: ">" });
                    socket.emit("username");
                default:
                    execCmd(command);
                }
            }
        });

        function begin() {
            socket.emit("configure", {
                srvOS       : process.platform,
                prompt      : cwd,
                promptChar  : promptChar
            });
            socket.emit("exit");
        }

        socket.on("username", function (input) {
            username = input;
            socket.emit("password");
        });

        socket.on("password", function (input) {
            pam.authenticate(username, input, function (err) {
                if (err) {
                    console.log("Authentication failed: " + err);
                    socket.emit("exit", errs.wrongCrdtls);
                    socket.emit("username");
                } else {
                    console.log("Authenticated: " + username);
                    require("uid-number")(username, function (err, uid, gid) {
                        if (err) {
                            console.log(err);
                            socket.emit("exit", err);
                        } else {
                            user = uid;
                            exec("echo ~" + username, function (err, stdout, stderr) {
                                if (err) {
                                    console.log(err);
                                    socket.emit("exit", err);
                                } else {
                                    cwd = home = env.HOME = stdout.toString().trim();
                                    begin();
                                }
                            });
                        }
                    });
                }
            });
        });

        if (process.env.WEBT_LOGIN) {
            socket.emit("username");
        } else {
            begin();
        }
    });

    return server;
}
Beispiel #28
0
	res.type('text');
	res.send(500, err.message);
});
app.use(lessMiddleware({ src: publicDir, force: true }));
app.use('/scripts/lib/', express.static(path.join(__dirname, '../bower_components'), { maxAge: 24*60*60*1000 }));
app.use(express.static(publicDir, { maxAge: 60*60*1000 }));
app.use(function(req, res, next){
	res.send(404);
	accessLog.debug({ method: req.method, url: req.url, status: res.statusCode })
});


var server = http.createServer(app);

var io = server.io = socketio.listen(server, {
    'log level': 1, // 0 - error, 1 - warn, 2 - info, 3 - debug
    //'transports': ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']
});
io.enable('browser client minification');
io.enable('browser client etag');
io.enable('browser client gzip');

server.listen(app.get('port'), function(){
	logger.info("Listening on http://*:" + app.get('port'));
});

//test broadcasting upload progress
// setInterval(function(){
// 	logger.debug("sending fake broadcast event");
// 	io.sockets.emit('deploy', { topic: 'deploy:catalyst:_all:start', body: { test: true, componentId: 'storm', step: 'upload', state: 'progress', progress: Math.random() }});
// }, 3000);
Beispiel #29
0
Hub.prototype.listen = function(callback) {
    var self = this,
        app = express(),
        server = http.Server(app),
        io = new Server(server);

    this.server = server;

    app.use(cors());

    // require a valid session token for all api calls
    var validateSession =  function(req, res, next) {
        session.find(req.query.token, function(err, data) {
            if (err || ! data) {
                res.sendStatus(401);
            } else {
                next();
            }
        });
    };

    // allow cross origin requests
    io.set('origins', '*:*');
    io.sockets.on('connection', function (socket) {
        var disconnectTimer = setTimeout(function() {
            socket.disconnect();
        }, 10000);

        socket.on('auth', function (creds, callback) {
 
            function succeed (record) {

                //AJF: set the groupID on the socket to be used in further local calls

                //AJF: set the groupID on the socket to be used in further calls

                socket.groupID = record._groupID;
                addApiCalls(self, io, socket);
                clearTimeout(disconnectTimer);
                callback(null, record._id.toString(), socket.id, record._groupID.toString());//AJF: try to return the groupID...
            }

            function fail (msg) {
                callback(msg);
                socket.disconnect();
            }

            if (creds.hasOwnProperty('password') && creds.password && creds.password !== '') {
                //AJF: Compares the passwords and determines what group the user logging into belongs to
                if ( bcrypt.compareSync(creds.password, self.config.secret) ) {
                    session.create(0, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_1)) {
                    session.create(1, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_2)) {
                    session.create(2, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_101)) {
                    session.create(101, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_102)) {
                    session.create(102, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_103)) {
                    session.create(103, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_104)) {
                    session.create(104, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_105)) {
                    session.create(105, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_106)) {
                    session.create(106, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_107)) {
                    session.create(107, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_108)) {
                    session.create(108, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_109)) {
                    session.create(109, throwErr(succeed));
                } else if (bcrypt.compareSync(creds.password, self.config.secret_110)) {
                    session.create(110, throwErr(succeed));
                } else {
                    fail('Invalid Password');
                }

            } else if (creds.hasOwnProperty('token') && creds.token && creds.token !== '') {
                console.log("Finding session via token");
                session.find(creds.token, function(err, data) {
                        if (data) {
                            succeed(data);
                        } else {
                            fail('Invalid Token');
                        }
                    });
            } else {
                fail('Password must be provided');
            }  
        });
        
    });

    server.listen(self.config.port, callback);
};
Beispiel #30
0
module.exports = function (app, models) {
    var io = require('socket.io');
    var utils = require('connect').utils;
    var cookie = require('cookie');
    var Session = require('connect').middleware.session.Session;

    var sio = io.listen(app.server)

    sio.configure(function () {
        app.isAccountOnline = function (accountId) {
            var clients = sio.sockets.clients(accountId);
            return (clients.length > 0);
        };

        sio.set('authorization', function (data, accept) {
            var signedCookies = cookie.parse(data.headers.cookie);
            var cookies = utils.parseSignedCookies(signedCookies, app.sessionSecret);
            data.sessionID = cookies['express.sid'];
            data.sessionStore = app.sessionStore;
            data.sessionStore.get(data.sessionID, function (err, session) {
                if (err || !session) {
                    return accept('Invalid session', false);
                } else {
                    data.session = new Session(data, session);
                    accept(null, true);
                }
            });
        });

        sio.sockets.on('connection', function (socket) {
            var session = socket.handshake.session;
            var accountId = session.accountId;
            var sAccount = null;
            socket.join(accountId);

            app.triggerEvent('event:' + accountId, {
                from: accountId,
                action: 'login'
            });

            var handleContactEvent = function (eventMessage) {
                socket.emit('contactEvent', eventMessage);
            };

            var subscribeToAccount = function (accountId) {
                var eventName = 'event:' + accountId;
                app.addEventListener(eventName, handleContactEvent);
                console.log('Subscribing to ' + eventName);
            };

            models.Account.findById(accountId, function subscribeToFriendFeeds(account) {
                var subscribedAccounts = {};
                sAccount = account;
                account.contacts.forEach(function (contact) {
                    if (!subscribedAccounts[contact.accountId]) {
                        subscribeToAccount(contact.accountId);
                        subscribedAccounts[contact.accountId] = true;
                    }
                });

                if (!subscribedAccounts[accountId]) {
                    // Subscribe to my own updates
                    subscribeToAccount(accountId);
                }
            });

            socket.on('disconnect', function () {
                sAccount.contacts.forEach(function (contact) {
                    var eventName = 'event:' + contact.accountId;
                    app.removeEventListener(eventName, handleContactEvent);
                    console.log('Unsubscribing from ' + eventName);
                });
                app.triggerEvent('event:' + accountId, {
                    from: accountId,
                    action: 'logout'
                });
            });

            socket.on('chatclient', function (data) {
                sio.sockets.in(data.to).emit('chatserver', {
                    from: accountId,
                    text: data.text
                });
            });
        });
    });
}