Ver código fonte

Allow for basic drop-in auth upon UID. #15

XiZhao 12 anos atrás
pai
commit
97b6e71f3f
1 arquivos alterados com 15 adições e 7 exclusões
  1. 15 7
      lib/server.js

+ 15 - 7
lib/server.js

@@ -16,7 +16,8 @@ function PeerServer(options) {
     key: 'peerjs',
     ip_limit: 5000,
     concurrent_limit: 5000,
-    ssl: {}
+    ssl: {},
+    auth: function(id, context){ return true; }
   }, options);
 
   util.debug = this._options.debug;
@@ -66,6 +67,7 @@ PeerServer.prototype._initializeWSS = function() {
     var id = query.id;
     var token = query.token;
     var key = query.key;
+    var cxt = query.cxt;
     var ip = socket.upgradeReq.socket.remoteAddress;
 
     if (!id || !token || !key) {
@@ -73,9 +75,9 @@ PeerServer.prototype._initializeWSS = function() {
       socket.close();
       return;
     }
-    
+
     if (!self._clients[key] || !self._clients[key][id]) {
-      self._checkKey(key, ip, function(err) {
+      self._checkKey(id, key, ip, function(err) {
         if (!err) {
           if (!self._clients[key][id]) {
             self._clients[key][id] = { token: token, ip: ip };
@@ -157,7 +159,7 @@ PeerServer.prototype._configureWS = function(socket, key, id, token) {
 }
 
 
-PeerServer.prototype._checkKey = function(key, ip, cb) {
+PeerServer.prototype._checkKey = function(id, key, ip, cb) {
   if (key == this._options.key) {
     if (!this._clients[key]) {
       this._clients[key] = {};
@@ -177,6 +179,11 @@ PeerServer.prototype._checkKey = function(key, ip, cb) {
       cb(ip + ' has reached its concurrent user limit');
       return;
     }
+    if(!this._options.auth(id, util.extend({ token: token, ip: ip }, cxt)))
+    {
+      cb('Authentication Error');
+      return;
+    }
     cb(null);
   } else {
     cb('Invalid key provided');
@@ -203,10 +210,11 @@ PeerServer.prototype._initializeHTTP = function() {
     var id = req.params.id;
     var token = req.params.token;
     var key = req.params.key;
+    var cxt = req.params.cxt;
     var ip = req.ip;
 
     if (!self._clients[key] || !self._clients[key][id]) {
-      self._checkKey(key, ip, function(err) {
+      self._checkKey(id, key, ip, function(err) {
         if (!err && !self._clients[key][id]) {
           self._clients[key][id] = { token: token, ip: ip };
           self._ips[ip]++;
@@ -307,7 +315,7 @@ PeerServer.prototype._pruneOutstanding = function() {
   var keys = Object.keys(this._outstanding);
   for (var k = 0, kk = keys.length; k < kk; k += 1) {
     var key = keys[k];
-    var dsts = Object.keys(this._outstanding[key]);  
+    var dsts = Object.keys(this._outstanding[key]);
     for (var i = 0, ii = dsts.length; i < ii; i += 1) {
       var offers = this._outstanding[key][dsts[i]];
       var seen = {};
@@ -426,4 +434,4 @@ PeerServer.prototype._generateClientId = function(key) {
   return clientId;
 };
 
-exports.PeerServer = PeerServer;
+exports.PeerServer = PeerServer;