From 7fb00c8a3165f458cc0842c5b835b91059d8b9e5 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sun, 28 Jul 2013 09:14:19 +0300 Subject: [PATCH] Implemented HTTP authentication for connection requests --- api-functions.coffee | 45 ++++++++++++++++++++++++++++++++++---------- config.coffee | 3 +++ config/auth.js | 4 ++++ 3 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 config/auth.js diff --git a/api-functions.coffee b/api-functions.coffee index dbc838d..7bfc831 100644 --- a/api-functions.coffee +++ b/api-functions.coffee @@ -3,24 +3,26 @@ db = require './db' http = require 'http' common = require './common' util = require 'util' +URL = require 'url' +auth = require './auth' connectionRequest = (deviceId, callback) -> - db.devicesCollection.findOne({_id : deviceId}, {'InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value' : 1}, (err, device)-> - if err - callback(err) - return - connectionRequestUrl = device.InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value - # for testing - #connectionRequestUrl = connectionRequestUrl.replace(/^(http:\/\/)([0-9\.]+)(\:[0-9]+\/[a-zA-Z0-9]+\/?$)/, '$110.1.1.254$3') - request = http.get(connectionRequestUrl, (res) -> - callback() + conReq = (url, authString, callback) -> + if authString + url = URL.parse(url) + url.headers = {'Authorization' : authString} + + request = http.get(url, (res) -> + if res.statusCode == 401 + authHeader = auth.parseAuthHeader(res.headers['www-authenticate']) + callback(res.statusCode, authHeader) ) request.on('error', (err) -> # error event when request is aborted request.abort() - callback(err) + callback(0) ) request.on('socket', (socket) -> @@ -29,6 +31,29 @@ connectionRequest = (deviceId, callback) -> request.abort() ) ) + + db.devicesCollection.findOne({_id : deviceId}, {'InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value' : 1}, (err, device)-> + if err + callback(err) + return + connectionRequestUrl = device.InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value + # for testing + #connectionRequestUrl = connectionRequestUrl.replace(/^(http:\/\/)([0-9\.]+)(\:[0-9]+\/[a-zA-Z0-9]+\/?$)/, '$110.1.1.254$3') + conReq(connectionRequestUrl, null, (statusCode, authHeader) -> + if statusCode == 401 + [username, password] = config.auth.connectionRequest(deviceId) + if authHeader.method is 'Basic' + authString = auth.basic(username, password) + else if authHeader.method is 'Digest' + uri = URL.parse(connectionRequestUrl) + authString = auth.digest(username, password, uri.path, 'GET', null, authHeader) + + conReq(connectionRequestUrl, authString, (statusCode, authHeader) -> + callback() + ) + else + callback() + ) ) diff --git a/config.coffee b/config.coffee index 9c1a37c..8106cb2 100644 --- a/config.coffee +++ b/config.coffee @@ -36,3 +36,6 @@ for k, v of parameters exports.PARAMETERS = parameters exports.ALIASES = aliases + +# load authentication scripts +exports.auth = require('./config/auth') diff --git a/config/auth.js b/config/auth.js new file mode 100644 index 0000000..20356c0 --- /dev/null +++ b/config/auth.js @@ -0,0 +1,4 @@ +exports.connectionRequest = function(deviceId) { + // return username/password pair for a given device + return ["", ""]; +}