turn-admin-client
Advanced tools
Comparing version 0.1.4 to 0.1.5
'use strict'; | ||
var ipRegexString = '(?:[0-9]{1,3}\\.){3}[0-9]{1,3}'; | ||
var regex = /(\d)\)\s+id=(\d+), user <([a-zA-Z0-9\-\=\.]+)>:\n\s+started\s(\d+)\s(secs|mins|hours|days)\sago\n\s+expiring\sin\s(\d+)\s(secs|mins|hours|days)\n\s+client\sprotocol\s(UDP|TCP),\srelay\sprotocol\s(UDP|TCP)\n\s+client\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+),\sserver\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+)\n\s+relay\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+)\n\s+fingerprints\senforced:\s(OFF|ON)\n\s+mobile:\s(OFF|ON)\n\s+SHA256:\s(OFF|ON)\n\s+SHA\stype:\s(SHA1)\s+usage:\srp=(\d+),\srb=(\d+),\ssp=(\d+),\ssb=(\d+)\n\s+rate:\sr=(\d+),\ss=(\d),\stotal=(\d+)\s\(bytes\sper\ssec\)\n\s+peers:\n\s+([\s\.\d\n]+)$/; | ||
var parseData = { | ||
header: { | ||
regex: /(\d)\)\s+id=(\d+), user <([a-zA-Z0-9\-\=\.]+)>:\n/, | ||
captureKeys: [ 'recordNumber', 'id', 'user' ] | ||
}, | ||
timing: { | ||
regex: /\n\s+started\s(\d+)\s(secs|mins|hours|days)\sago\n\s+expiring\sin\s(\d+)\s(secs|mins|hours|days)\n/, | ||
captureKeys: [ 'started', 'startedTimeFormat', 'expires', 'expiresTimeFormat' ] | ||
}, | ||
protocol: { | ||
regex: /\n\s+client\sprotocol\s(UDP|TCP),\srelay\sprotocol\s(UDP|TCP)\n/, | ||
captureKeys: [ 'clientProtocol', 'relayProtocol' ] | ||
}, | ||
addresses: { | ||
regex: /\n\s+client\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+),\sserver\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+)\n\s+relay\saddr\s((?:[0-9]{1,3}\.){3}[0-9]{1,3}:\d+)\n/, | ||
captureKeys: [ 'clientAddress', 'serverAddress', 'relayAddress' ] | ||
}, | ||
properties: { | ||
regex: /\n\s+fingerprints\senforced:\s(OFF|ON)\n\s+mobile:\s(OFF|ON)\n\s+SHA256:\s(OFF|ON)\n\s+SHA\stype:\s(SHA1)\n/, | ||
captureKeys: [ 'fingerprints', 'mobile', 'SHA256', 'SHAType' ] | ||
}, | ||
usage: { | ||
regex: /\n\s+usage:\srp=(\d+),\srb=(\d+),\ssp=(\d+),\ssb=(\d+)\n/, | ||
captureKeys: [ 'usageRP', 'usageRB', 'usageSP', 'usageSB' ] | ||
}, | ||
rate: { | ||
regex: /\n\s+rate:\sr=(\d+),\ss=(\d+),\stotal=(\d+)\s\(bytes\sper\ssec\)\n/, | ||
captureKeys: [ 'rateR', 'rateS', 'rateTotal' ] | ||
}, | ||
peers: { | ||
regex: /\n\s+peers:\n\s+([\s\.\d\n:]+)$/, | ||
captureKeys: [ 'peers' ] | ||
} | ||
}; | ||
var ipRegexString = '(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(?::\\d+){0,1}'; | ||
var ipAddressRegex = new RegExp(ipRegexString); | ||
var captureKeys = [ | ||
'recordNumber', | ||
'id', | ||
'user', | ||
'started', | ||
'startedTimeFormat', | ||
'expires', | ||
'expiresTimeFormat', | ||
'clientProtocol', | ||
'relayProtocol', | ||
'clientAddress', | ||
'serverAddress', | ||
'relayAddress', | ||
'fingerprints', | ||
'mobile', | ||
'SHA256', | ||
'SHAType', | ||
'usageRP', | ||
'usageRB', | ||
'usageSP', | ||
'usageSB', | ||
'rateR', | ||
'rateS', | ||
'rateTotal', | ||
'peers'//special case, going to be an array | ||
]; | ||
module.exports = function parseResult(string) { | ||
module.exports = function parseResult(source) { | ||
var results = {}; | ||
var parsed = regex.exec(string); | ||
var clean = source.replace(/\r\n/g, '\n'); | ||
if (!parsed) { | ||
throw new Error('No Turn Session Data'); | ||
} | ||
Object.keys(parseData).forEach(function (dataPoint) { | ||
var parseCriteria = parseData[dataPoint]; | ||
var parsed = parseCriteria.regex.exec(clean); | ||
parsed.shift(); | ||
if (!parsed) { | ||
throw new Error("unable to parse '" + dataPoint + "' from data."); | ||
} | ||
captureKeys.forEach(function (capture, index) { | ||
parsed.shift(); | ||
if (capture === 'peers') { | ||
//if we're at peers we've still got some work to do | ||
results[capture] = []; | ||
parseCriteria.captureKeys.forEach(function (captureKey, index) { | ||
if (captureKey !== 'peers') { | ||
results[captureKey] = parsed[index]; | ||
return; | ||
} | ||
var ipAddresses = parsed[index].split('\n'); | ||
ipAddresses.forEach(function getIpAddresses(line) { | ||
var ipAddress = ipAddressRegex.exec(line); | ||
if (ipAddress && ipAddress[0]) { | ||
results[capture].push(ipAddress[0]); | ||
} | ||
// 'peers' capture needs special treatment | ||
results[captureKey] = []; | ||
var ipAddresses = parsed[index].split('\n'); | ||
ipAddresses.forEach(function getIpAddresses(line) { | ||
var ipAddress = ipAddressRegex.exec(line); | ||
if (ipAddress && ipAddress[0]) { | ||
results[captureKey].push(ipAddress[0]); | ||
} | ||
}); | ||
}); | ||
return; | ||
} | ||
results[capture] = parsed[index]; | ||
}); | ||
@@ -66,0 +73,0 @@ |
@@ -50,3 +50,3 @@ 'use strict'; | ||
}, this.encoding, '\n\n'); | ||
}, this.encoding, '\r\n\r\n'); | ||
@@ -57,5 +57,5 @@ }; | ||
TurnAdminClient.prototype.disconnect = function () { | ||
this.conn.end(); | ||
this.conn.destroy(); | ||
}; | ||
module.exports = TurnAdminClient; |
{ | ||
"name": "turn-admin-client", | ||
"version": "0.1.4", | ||
"version": "0.1.5", | ||
"description": "A tool to access live TURN administrative information", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -10,2 +10,3 @@ 'use strict'; | ||
describe('run a mock turn interface server', function () { | ||
before(function () { | ||
@@ -47,9 +48,9 @@ mockServer = mockTurnServer(); | ||
sessions[0].SHAType.should.be.equal('SHA1'); | ||
sessions[0].usageRP.should.be.equal('6'); | ||
sessions[0].usageRB.should.be.equal('1204'); | ||
sessions[0].usageSP.should.be.equal('5'); | ||
sessions[0].usageSB.should.be.equal('508'); | ||
sessions[0].rateR.should.be.equal('0'); | ||
sessions[0].rateS.should.be.equal('0'); | ||
sessions[0].rateTotal.should.be.equal('0'); | ||
sessions[0].usageRP.should.be.equal('485803'); | ||
sessions[0].usageRB.should.be.equal('419430588'); | ||
sessions[0].usageSP.should.be.equal('398933'); | ||
sessions[0].usageSB.should.be.equal('325623225'); | ||
sessions[0].rateR.should.be.equal('255750'); | ||
sessions[0].rateS.should.be.equal('198550'); | ||
sessions[0].rateTotal.should.be.equal('454300'); | ||
sessions[0].peers.should.be.instanceof(Array); | ||
@@ -59,3 +60,3 @@ sessions[0].peers.should.be.deep.equal([ | ||
'216.207.245.1', | ||
'10.24.250.86', | ||
'10.24.250.86:12345', | ||
'54.200.182.167' | ||
@@ -82,14 +83,14 @@ ]); | ||
sessions[1].SHAType.should.be.equal('SHA1'); | ||
sessions[1].usageRP.should.be.equal('6'); | ||
sessions[1].usageRB.should.be.equal('1184'); | ||
sessions[1].usageSP.should.be.equal('5'); | ||
sessions[1].usageSB.should.be.equal('508'); | ||
sessions[1].rateR.should.be.equal('0'); | ||
sessions[1].rateS.should.be.equal('0'); | ||
sessions[1].rateTotal.should.be.equal('0'); | ||
sessions[1].usageRP.should.be.equal('398934'); | ||
sessions[1].usageRB.should.be.equal('325625221'); | ||
sessions[1].usageSP.should.be.equal('485802'); | ||
sessions[1].usageSB.should.be.equal('419428548'); | ||
sessions[1].rateR.should.be.equal('199525'); | ||
sessions[1].rateS.should.be.equal('257002'); | ||
sessions[1].rateTotal.should.be.equal('456527'); | ||
sessions[1].peers.should.be.instanceof(Array); | ||
sessions[1].peers.should.be.deep.equal([ | ||
'10.24.65.91', | ||
'216.207.245.1', | ||
'10.24.250.86', | ||
'216.207.245.1:12345', | ||
'10.24.250.86:12345', | ||
'54.200.182.167' | ||
@@ -96,0 +97,0 @@ ]); |
'use strict'; | ||
var net = require('net'); | ||
var fs = require('fs'); | ||
var testData = fs.readFileSync(__dirname + '/testData.txt'); | ||
var fixtures = require('../fixtures'); | ||
@@ -18,13 +17,7 @@ module.exports = function () { | ||
if (data.indexOf('ps') !== -1) { | ||
conn.write('\n' + testData + '\n>'); | ||
conn.write(fixtures.fullSessionData + fixtures.prompt); | ||
} | ||
}); | ||
conn.write( | ||
'TURN Server\n' + | ||
'rfc5766-turn-server\n' + | ||
'Citrix-3.2.2.8 \'Marshal West\'\n\n' + | ||
'Type \'?\' for help\n' + | ||
'>' | ||
); | ||
conn.write(fixtures.welcomeMessageData + fixtures.prompt); | ||
}); | ||
@@ -31,0 +24,0 @@ |
'use strict'; | ||
var parse = require('../../lib/parser'); | ||
var fs = require('fs'); | ||
var sampleSessionRecord = require('../fixtures').singleSessionEntry; | ||
var chai = require('chai'); | ||
var should = chai.should(); | ||
var testString = fs.readFileSync(__dirname + '/lib/testString.txt'); | ||
describe('Parse some test admin TURN data', function () { | ||
it('should return an object', function () { | ||
var results = parse(testString); | ||
var results = parse(sampleSessionRecord); | ||
should.exist(results); | ||
@@ -28,9 +26,9 @@ | ||
results.SHAType.should.be.equal('SHA1'); | ||
results.usageRP.should.be.equal('6'); | ||
results.usageRB.should.be.equal('1204'); | ||
results.usageSP.should.be.equal('5'); | ||
results.usageSB.should.be.equal('508'); | ||
results.rateR.should.be.equal('0'); | ||
results.rateS.should.be.equal('0'); | ||
results.rateTotal.should.be.equal('0'); | ||
results.usageRP.should.be.equal('485803'); | ||
results.usageRB.should.be.equal('419430588'); | ||
results.usageSP.should.be.equal('398933'); | ||
results.usageSB.should.be.equal('325623225'); | ||
results.rateR.should.be.equal('255750'); | ||
results.rateS.should.be.equal('198550'); | ||
results.rateTotal.should.be.equal('454300'); | ||
results.peers.should.be.instanceof(Array); | ||
@@ -40,3 +38,3 @@ results.peers.should.be.deep.equal([ | ||
'216.207.245.1', | ||
'10.24.250.86', | ||
'10.24.250.86:12345', | ||
'54.200.182.167' | ||
@@ -43,0 +41,0 @@ ]); |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
16857
338
0
2
17