diff --git a/lib/connection.js b/lib/connection.js index a854817..a7448ba 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -75,24 +75,28 @@ ProtocolConnection.prototype.initStream = function() { }; ProtocolConnection.prototype.readStream = function () { - var stream = this.stream; - streamBuffer = stream.read(); - if (streamBuffer !== null) { - if (this.buffer === undefined) { - this.buffer = streamBuffer; - } else { - this.buffer = Buffer.concat([this.buffer, streamBuffer]); - } - var bigEndian = this.buffer.slice(0, 4); - var totalLength = new Buffer(bigEndian).readUIntBE(0); - var restOfBuffer = this.buffer.slice(4); - var currentLength = this.buffer.length; - logger.debug("endian length: ", totalLength); - logger.debug("current buffer length", currentLength); - if (this.buffer.length === totalLength || restOfBuffer.length === totalLength) { - this.clientResponse(restOfBuffer); - this.buffer = undefined; + try { + var stream = this.stream; + streamBuffer = stream.read(); + if (streamBuffer !== null) { + if (this.buffer === undefined) { + this.buffer = streamBuffer; + } else { + this.buffer = Buffer.concat([this.buffer, streamBuffer]); + } + var bigEndian = this.buffer.slice(0, 4); + var totalLength = bigEndian.readUInt32BE(0); + var restOfBuffer = this.buffer.slice(4); + var currentLength = this.buffer.length; + logger.debug("endian length: ", totalLength); + logger.debug("current buffer length", currentLength); + if (this.buffer.length === totalLength || restOfBuffer.length === totalLength) { + this.clientResponse(restOfBuffer); + this.buffer = undefined; + } } + } catch(e) { + logger.error(e); } }; diff --git a/lib/dispatcher.js b/lib/dispatcher.js index cabc2e0..d72cfd8 100644 --- a/lib/dispatcher.js +++ b/lib/dispatcher.js @@ -39,13 +39,17 @@ Dispatcher.prototype.processMessage = function processMessage(m) { transactionId = [command, new Date().getTime(), require('crypto').randomBytes(8).toString('hex')].join('-').toUpperCase(); } eppCommand = function() { - currentState.command(command, data, transactionId).then(function(responseData) { - process.send(responseData); - }, - function(error) { - logger.error("Command returned an error state:", error); - throw error; - }); + try { + currentState.command(command, data, transactionId).then(function(responseData) { + process.send(responseData); + }, + function(error) { + logger.error("Command returned an error state:", error); + throw error; + }); + } catch(e) { + logger.error(e); + } }; } } else { // Initialise a connection instance with registry configuration. diff --git a/lib/epp.js b/lib/epp.js index a147409..0b55fd3 100644 --- a/lib/epp.js +++ b/lib/epp.js @@ -391,13 +391,10 @@ EPP.prototype.checkDomain = function(data, transactionId) { if (!domain) domain = data.name; var checkData = { "domain:check": { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": domain } }; - var xml = this.eppCommand({ "check": checkData }, @@ -410,9 +407,7 @@ EPP.prototype.infoDomain = function(data, transactionId) { var domain = data.domain; if (!domain) domain = data.name; var domainData = { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": domain }; this.normaliseVariants('authInfo', data, ["authcode", "authCode", "auth_code", "password", "pw"]); @@ -433,16 +428,25 @@ EPP.prototype.createDomain = function(data, transactionId) { var nsHostObjects = this.processDomainNS(data.ns); this.normaliseVariants('period', data, ["interval"]); this.normaliseVariants('registrant', data, ["owner"]); - var createData = { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, - "domain:name": data.name, - "domain:period": this.processDomainPeriod(data.period), - "domain:ns": nsHostObjects, - "domain:registrant": data.registrant, - "domain:contact": contacts, - }; + // nameservers are optional + if (nsHostObjects) { + var createData = { + "_attr": domainNamespace, + "domain:name": data.name, + "domain:period": this.processDomainPeriod(data.period), + "domain:ns": nsHostObjects, + "domain:registrant": data.registrant, + "domain:contact": contacts + }; + } else { + var createData = { + "_attr": domainNamespace, + "domain:name": data.name, + "domain:period": this.processDomainPeriod(data.period), + "domain:registrant": data.registrant, + "domain:contact": contacts + }; + } this.normaliseVariants('authInfo', data, ["authcode", "authCode", "auth_code", "password", "pw"]); data.authInfo = data.authInfo || ''; createData['domain:authInfo'] = this.processAuthInfo(data.authInfo, 'domain'); @@ -462,9 +466,7 @@ EPP.prototype.updateDomain = function(data, transactionId) { var domainNamespace = config.namespaces.domain; this.normaliseVariants('name', data, ["domain"]); var updateDomainData = { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": data.name }; var actions = ["add", "rem"]; @@ -507,9 +509,7 @@ EPP.prototype.renewDomain = function(data, transactionId) { this.normaliseVariants('name', data, ["domain"]); var domain = data.name; var domainRenewData = { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": domain, "domain:curExpDate": data.curExpDate }; @@ -538,9 +538,7 @@ EPP.prototype.transferDomain = function(data, transactionId) { } var transferData = { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": data.name }; this.normaliseVariants('period', data, ["interval"]); @@ -565,9 +563,7 @@ EPP.prototype.deleteDomain = function(data, transactionId) { this.normaliseVariants('name', data, ["domain"]); var deleteData = { "domain:delete": { - "_attr": { - "xmlns:domain": domainNamespace.xmlns - }, + "_attr": domainNamespace, "domain:name": data.name } }; @@ -585,9 +581,7 @@ EPP.prototype.checkHost = function(data, transactionId) { } var checkData = { "host:check": { - "_attr": { - "xmlns:host": hostNamespace.xmlns - }, + "_attr": hostNamespace, "host:name": host } }; @@ -602,9 +596,7 @@ EPP.prototype.infoHost = function(data, transactionId) { var hostNamespace = config.namespaces.host; var infoData = { "host:info": { - "_attr": { - "xmlns:host": hostNamespace.xmlns - }, + "_attr": hostNamespace, "host:name": data.name } }; @@ -618,9 +610,7 @@ EPP.prototype.createHost = function(data, transactionId) { var config = this.config; var hostNamespace = config.namespaces.host; var createData = { - "_attr": { - "xmlns:host": hostNamespace.xmlns - }, + "_attr": hostNamespace, "host:name": data.name, }; if (data.addr) createData['host:addr'] = this.processIPAddrObjects(data.addr); @@ -637,9 +627,7 @@ EPP.prototype.updateHost = function(data, transactionId) { var config = this.config; var hostNamespace = config.namespaces.host; var updateHostData = { - "_attr": { - "xmlns:host": hostNamespace.xmlns - }, + "_attr": hostNmaespace, 'host:name': data.name }; var actions = ["add", "rem"]; @@ -677,9 +665,7 @@ EPP.prototype.deleteHost = function(data, transactionId) { var hostNamespace = config.namespaces.host; var deleteData = { "host:delete": { - "_attr": { - "xmlns:host": hostNamespace.xmlns - }, + "_attr": hostNamespace, "host:name": data.host } }; @@ -698,9 +684,7 @@ EPP.prototype.checkContact = function(data, transactionId) { } var checkData = { "contact:check": { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:id": contactId } }; @@ -719,9 +703,7 @@ EPP.prototype.infoContact = function(data, transactionId) { } var infoData = { "contact:info": { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:id": contactId } }; @@ -736,9 +718,7 @@ EPP.prototype.createContact = function(data, transactionId) { var contactNamespace = config.namespaces.contact; var processedContactData = this.processContactData(data); var createContact = { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:id": data.id, }; for (var key in processedContactData) { @@ -762,9 +742,7 @@ EPP.prototype.updateContact = function(data, transactionId) { } var updateContactData = { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:id": contactId }; if (data.add) { @@ -799,9 +777,7 @@ EPP.prototype.transferContact = function(data, transactionId) { } var transferData = { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:name": contact }; this.normaliseVariants('authInfo', data, ["authcode", "authCode", "auth_code", "password", "pw"]); @@ -825,9 +801,7 @@ EPP.prototype.deleteContact = function(data, transactionId) { var contactId = data.id; var deleteData = { "contact:delete": { - "_attr": { - "xmlns:contact": contactNamespace.xmlns - }, + "_attr": contactNamespace, "contact:id": contactId } }; diff --git a/lib/node-epp-server.js b/lib/node-epp-server.js index 98f10a2..3b6afba 100644 --- a/lib/node-epp-server.js +++ b/lib/node-epp-server.js @@ -25,8 +25,19 @@ function collectRegistries(val, registryArgs) { return registryArgs; } +// parseInt and commander do not play nice anymore +// https://github.com/tj/commander.js/issues/201 +function myParseInt(string, defaultValue) { + var int = parseInt(string, 10); + if (typeof int == 'number') { + return int; + } else { + return defaultValue; + } +} + // Read command-line arguments. -program.version('0.0.1').usage('[options]').option('-r, --registries ', 'Registry', collectRegistries, []).option('-l, --listen ', 'Listen on port', parseInt, 3000); +program.version('0.0.1').usage('[options]').option('-r, --registries ', 'Registry', collectRegistries, []).option('-l, --listen ', 'Listen on port', myParseInt, 3000); program.parse(process.argv); var registries = program.registries; @@ -71,32 +82,34 @@ var ips = nconf.get('whitelisted_ips'); app.use(ipfilter(ips, {"mode": "allow"})); app.post('/command/:registry/:command', function(req, res) { - var registry = req.params.registry; - if (! (registry in availableProcesses)) { - res.send(400, { - "error": "Unknown registry" - }); - return; + try { + var registry = req.params.registry; + if (! (registry in availableProcesses)) { + res.status(400).send({ + "error": "Unknown registry" + }); + return; + } + var queryData = req.body; + var a = moment(); + var processChild = function (childProcess) { + childProcess.once('message', function(m) { + var b = moment(); + var diff = b.diff(a, 'milliseconds'); + logger.info('Request elapsed time: '+ diff.toString() + ' ms'); + res.send(m); + eventDispatch.childFree(registry); + }); + childProcess.send({ + "command": req.params.command, + "data": queryData + }); + }; + listener.pushChildQueue(processChild); + eventDispatch.queueChild(registry); + } catch(e) { + logger.error(e); } - var queryData = req.body; - - var a = moment(); - var processChild = function (childProcess) { - childProcess.once('message', function(m) { - var b = moment(); - var diff = b.diff(a, 'milliseconds'); - logger.info('Request elapsed time: '+ diff.toString() + ' ms'); - res.send(m); - eventDispatch.childFree(registry); - }); - childProcess.send({ - "command": req.params.command, - "data": queryData - }); - }; - listener.pushChildQueue(processChild); - eventDispatch.queueChild(registry); }); app.listen(program.listen); - diff --git a/lib/protocol-state.js b/lib/protocol-state.js index 06bee45..88401c2 100644 --- a/lib/protocol-state.js +++ b/lib/protocol-state.js @@ -124,6 +124,9 @@ ProtocolState.prototype.command = function(command, data, transactionId) { self.last = moment(); if (command !== 'logout') { self.idle(); + if (command === 'login') { + self.loggedIn = true; + } } else { self.loggedIn = false; logger.info("Logged out.");