Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/webtorrent/webtorrent.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFeross Aboukhadijeh <feross@feross.org>2017-04-08 04:02:07 +0300
committerFeross Aboukhadijeh <feross@feross.org>2017-04-08 04:02:07 +0300
commit526ec9a44980e95274b29e66278ea488f2681728 (patch)
treea17f7e749fd366bdb20c94840289552af0b94040 /lib/server.js
parent873be1411054332d21b0e5b65f8508a243615a26 (diff)
Add `origin` option for torrent.createServer()
When the origin option is specified, only requests from the given origin will be allowed. This is useful to add additional security to any app that is starting a WebTorrent server but doesn't want it to be exposed to the entire Web.
Diffstat (limited to 'lib/server.js')
-rw-r--r--lib/server.js30
1 files changed, 24 insertions, 6 deletions
diff --git a/lib/server.js b/lib/server.js
index af1665d..be45ddc 100644
--- a/lib/server.js
+++ b/lib/server.js
@@ -7,8 +7,10 @@ var pump = require('pump')
var rangeParser = require('range-parser')
var url = require('url')
-function Server (torrent, requestListener) {
- var server = http.createServer(requestListener)
+function Server (torrent, opts) {
+ var server = http.createServer()
+ if (!opts) opts = {}
+ if (!opts.origin) opts.origin = '*' // allow all origins by default
var sockets = []
var pendingReady = []
@@ -41,6 +43,21 @@ function Server (torrent, requestListener) {
else server.close(cb)
}
+ function isOriginAllowed (req) {
+ // When `origin` option is `false`, deny all cross-origin requests
+ if (opts.origin === false) return false
+
+ // Requests without an 'Origin' header are not actually cross-origin, so just
+ // deny them
+ if (req.headers.origin == null) return false
+
+ // The user allowed all origins
+ if (opts.origin === '*') return true
+
+ // Allow requests where the 'Origin' header matches the `opts.origin` setting
+ return req.headers.origin === opts.origin
+ }
+
function onConnection (socket) {
socket.setTimeout(36000000)
sockets.push(socket)
@@ -56,9 +73,9 @@ function Server (torrent, requestListener) {
return serve404Page()
}
- // Allow CORS requests to read responses
- if (req.headers.origin) {
- res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*')
+ // Allow cross-origin requests (CORS)
+ if (isOriginAllowed(req)) {
+ res.setHeader('Access-Control-Allow-Origin', req.headers.origin)
}
// Prevent browser mime-type sniffing
@@ -68,7 +85,8 @@ function Server (torrent, requestListener) {
// by responding to the OPTIONS preflight request with the specified
// origin and requested headers.
if (req.method === 'OPTIONS') {
- return serveOptionsRequest()
+ if (isOriginAllowed(req)) return serveOptionsRequest()
+ else return serveMethodNotAllowed()
}
if (req.method === 'GET' || req.method === 'HEAD') {