UNPKG

eppgate

Version:

Domain Registrar

1,153 lines (1,126 loc) 52.5 kB
module.exports = RunACC; var RunDB= require('./RunDB.js'); var cmd = require('epp/CMD'); var msg = require('epp/MSG'); var e2u = require('epp/e2u'); var nml = require('nml'); var Value= require('nml/Value'); function RunACC(option) { var epp = new RunDB(option); var pay = epp.payment; setInterval(request_poll, option.epp.timeout); function request(req, cb, acc) { function response(req, res, acc) { var r = res.epp.value.response; if(r && r.result.attrs.code.slice(0, 1)==='1') { var command = req.epp.value.command; if(command && command.poll) response_poll(req, res, acc); if(command && command.create) response_create(req, res, acc); if(command && command.delete) response_delete(req, res, acc); if(command && command.renew) response_renew(req, res, acc); if(command && command.transfer) response_transfer(req, res, acc); if(command && command.update) response_update(req, res, acc); } if(typeof(cb)==="function") cb(req, res, acc); } epp.submit(req, response, acc); } function authorization(kind, req, cb, acc) { function exec(func, req, cb, acc, u, clTRID, ap_id) { function cb_db(err, rows) { if(!err && rows.length) { acc.json = rows[0].json; acc.ex_date = rows[0].ex_date; func(req, cb, acc, u, clTRID); } else cb(req, msg.response('2303', clTRID)); } ap_id ? epp.query("SELECT * FROM launch_domain WHERE ap_id=? AND user=?" +" AND status!='allocated' AND status!='rejected'", [ap_id, acc.user], cb_db) : epp.query("SELECT * FROM ?? WHERE name=? AND user=?", [u.obj, u.name, acc.user], cb_db); } var func = { 'login' : request_login, 'logout' : request_logout, 'check' : epp.submit, 'info' : epp.submit, 'poll' : request, 'create' : request_create, 'delete_autorenew': request_delete_autorenew, 'delete' : request_delete, 'renew' : request_renew, 'transfer': request_transfer, 'update' : request_update }; var command = req.epp.value.command; var clTRID = command.clTRID; var op = Object.keys(command)[0]; switch(op) { case 'login': case 'logout': case 'check': func[op](req, cb, acc); break; case 'info': switch(kind) { case 'admin': var u = e2u.parse(command, op); func[op](req, cb, acc, u, clTRID); break; case 'user': var u = e2u.parse(command, op); var ap_id = e2u.ap_id(command, op); exec(func[op], req, cb, acc, u, clTRID, ap_id); break; default: cb(req, msg.response('2201', clTRID)); } break; case 'poll': if(kind==='admin') func[op](req, cb); else cb(req, msg.response('2101', clTRID)); break; case 'transfer': case 'create': if(kind==='user') { var u = e2u.parse(command, op); func[op](req, cb, acc, u, clTRID); } else cb(req, msg.response('2201', clTRID)); break; case 'delete_autorenew': case 'delete': case 'renew': case 'update': if(kind==='user') { var u = e2u.parse(command, op); var ap_id = e2u.ap_id(command, op); exec(func[op], req, cb, acc, u, clTRID, ap_id); } else cb(req, msg.response('2201', clTRID)); break; default: cb(req, msg.response('2101', clTRID)); } } function verify(req, cb, cookie) { if(!cookie) cookie = {}; var command = req.epp.value.command; if(!command) { epp.submit(req, cb); return; } var clTRID = command.clTRID; switch(cookie.kind) { case 'admin': if((cookie.clID===option.epp.clID) && (cookie.pass===option.epp.pw)) authorization('admin', req, cb); else cb(req, msg.response('2201', clTRID)); break; case 'user': pay.getACC(cookie.clID, cookie.pass, function(user, acl) { authorization('user', req, cb, {user:user, acl:acl}); }, function() { cb(req, msg.response('2201', clTRID)); }); break; default: authorization('', req, cb, cookie); } } function request_login(req, cb, cookie) { var command = req.epp.value.command; var clTRID = command.clTRID; var login = command.login; if((login.clID===option.epp.clID) && (login.pw===option.epp.pw)) cb(req, msg.response('1001', clTRID)); else { pay.getACC(login.clID, login.pw, function(user, acl) { if(login.newPW) pay.passwd(login.clID, login.newPW); cookie.user= user; cookie.acl = acl; cb(req, msg.response('1000', clTRID)); }, function() { cb(req, msg.response('2200', clTRID)); }); } } function request_logout(req, cb) { var command = req.epp.value.command; var clTRID = command.clTRID; cb(req, msg.response('1500', clTRID)); } function request_poll() { request(cmd.poll()); epp.query("SELECT x.name as name,x.user as user,y.json as json,y.ex_date as ex_date" + " FROM autorenew_domain as x,domain as y" + " WHERE x.name=y.name AND x.ack is null AND DATE_ADD(x.cr_date,INTERVAL 10 DAY)<now()", function(err, rows) { if(err || !rows.length) return; for(var i in rows) request(cmd.domain("delete", {name: rows[i].name}), undefined, { user: rows[i].user, json: rows[i].json, ex_date: rows[i].ex_date, rgp: 'autoRenewPeriod' }); }); } function response_poll(req, res, acc) { function infData(launch) { switch(launch.s) { case "allocated": epp.query("select * from launch_domain where ap_id=?", [launch.applicationID], function(err, rows) { if(err || !rows.length) return; epp.loadjson('domain', rows[0].name, rows[0].user, function(json, exDate) { pay.done({ user: rows[0].user, op: 'create', domain: rows[0].name, appID: rows[0].ap_id, registrant: JSON.parse(json).registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: 0, exDate: exDate, oldID: 'launch-'+rows[0].id, uniID: 'launch-'+rows[0].id+'-allocated' }); }); }); break; case "rejected": epp.query("select * from launch_domain where ap_id=?", [launch.applicationID], function(err, rows) { if(err || !rows.length) return; pay.done({ user: rows[0].user, op: 'create', domain: rows[0].name, appID: rows[0].ap_id, registrant: JSON.parse(rows[0].json).registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: -rows[0].period, exDate: rows[0].ex_date.toISOString(), oldID: 'launch-'+rows[0].id, uniID: 'launch-'+rows[0].id+'-rejected' }); }); break; } epp.query("update launch_domain set status=? where ap_id=?", [launch.s, launch.applicationID]); } function trnData(value) { var v = e2u.create(value); switch(v.trStatus) { case 'clientCancelled': case 'serverCancelled': case 'clientRejected': if(v.reID===option.epp.clID && v.obj==='domain') { epp.query("select * from transfer where obj=? and name=?", [v.obj, v.name], function(err, rows) { if(err || !rows.length) return; pay.done({ user: rows[0].re_id, op: 'transferIn', domain: rows[0].name, appID: '', registrant: '', opDate: (new Date()).toISOString(), price: rows[0].price, period: -1, exDate: rows[0].ex_date.toISOString(), oldID: 'transferIn-'+rows[0].id, uniID: 'transferIn-'+rows[0].id+'-rejected' }); }); } break; case 'clientApproved': case 'serverApproved': epp.query("select * from transfer where obj=? and name=?", [v.obj, v.name], function(err, rows) { if(err || !rows.length) return; if(v.reID===option.epp.clID) { epp.loadjson(v.obj, v.name, rows[0].re_id, function(json, exDate) { pay.done({ user: rows[0].re_id, op: 'transferIn', domain: rows[0].name, appID: '', registrant: JSON.parse(json).registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: 0, exDate: exDate, oldID: 'transferIn-'+rows[0].id, uniID: 'transferIn-'+rows[0].id+'-approved' }); }); } else { epp.query("delete from ?? where name=?", [v.obj, v.name]); if(v.obj==='domain') { epp.query("delete from host where name=? or name like ?", [v.name, '%.'+v.name]); pay.done({ user: rows[0].ac_id, op: 'transferOut', domain: rows[0].name, appID: '', registrant: '', opDate: (new Date()).toISOString(), price: 0, period: 0, exDate: rows[0].ex_date.toISOString(), oldID: '', uniID: 'transferOut-'+rows[0].id }); } } }); break; case 'pending': epp.query("replace into transfer select 0,?,?,'',?,?,?,user,?,0,?,'no','registrar' from ?? where name=?", [v.obj, v.name, v.trStatus, v.reID, v.reDate, v.acDate, v.exDate || null, v.obj, v.name]); return; } epp.query("update transfer set status=?,ac_date=?,ex_date=?,ack='no' where obj=? and name=?", [v.trStatus, v.acDate, v.exDate || null, v.obj, v.name]); } function panData(name) { epp.query("select * from create_domain where name=? order by id desc limit 1", [name], function(err, rows) { if(err || !rows.length) return; epp.query("insert into delete_domain select 0,name,json,user,ex_date,now(),now(),'addPeriod',?" + " from domain where name=?", [rows[0].id, rows[0].name]); epp.query("delete from domain where name=?", [rows[0].name]); epp.query("delete from host where name=? or name like ?", [rows[0].name, '%.'+rows[0].name]); pay.done({ user: rows[0].user, op: 'delete', domain: rows[0].name, appID: '', registrant: '', opDate: (new Date()).toISOString(), price: rows[0].price, period: -rows[0].period, exDate: rows[0].ex_date.toISOString(), oldID: 'create-'+rows[0].id, uniID: 'create-'+rows[0].id+'-deleted' }); }); } function panData_1_3_4(name) { epp.query("select * from domain where name=?", [name], function(err, rows) { if(err || !rows.length) return; epp.query("delete from domain where name=?", [rows[0].name]); epp.query("delete from host where name=? or name like ?", [rows[0].name, '%.'+rows[0].name]); pay.done({ user: rows[0].user, op: 'delete', domain: rows[0].name, appID: '', registrant: JSON.parse(rows[0].json).registrant, opDate: (new Date()).toISOString(), price: 0, period: 0, exDate: rows[0].ex_date.toISOString(), oldID: '', uniID: 'delete-'+rows[0].id+'-forced' }); }); } function panData_1_3_6(name, paResult) { epp.query("select * from restore_domain where name=? order by id desc limit 1", [name], function(err, rows) { if(err || !rows.length) return; epp.submit(cmd.domain('info', {name: name}), function(_req, _res) { var r = _res.epp.value.response; var code = r.result.attrs.code; if(code!=='1000') return; var v = e2u.create( r.resData["domain:infData"] instanceof Value ? r.resData["domain:infData"].value : r.resData["domain:infData"] ); if(paResult) { epp.query("update delete_domain set rs_date=now(),rgp=null" +" where name=? and rgp='pendingRestore'", [name]); epp.query("update domain set ex_date=? where name=?", [v.exDate, name]); pay.done({ user: rows[0].user, op: 'restore', domain: rows[0].name, appID: '', registrant: v.registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: 0, exDate: v.exDate, oldID: 'restore-'+rows[0].id, uniID: 'restore-'+rows[0].id+'-approved' }); } else { epp.query("update delete_domain set rs_date=now(),rgp='redemptionPeriod'" +" where name=? and rgp='pendingRestore'", [name]); pay.done({ user: rows[0].user, op: 'restore', domain: rows[0].name, appID: '', registrant: v.registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: -1, exDate: v.exDate, oldID: 'restore-'+rows[0].id, uniID: 'restore-'+rows[0].id+'-rejected' }); } }); }); } var r = res.epp.value.response; if(r.result.attrs.code==='1301') { var ext = r.extension; if(ext && ext["launch:infData"]) infData(e2u.launch_domain( ext["launch:infData"] instanceof Value ? ext["launch:infData"].value : ext["launch:infData"] )); else if(r.resData) { if(r.resData["domain:trnData"]) trnData( r.resData["domain:trnData"] instanceof Value ? r.resData["domain:trnData"].value : r.resData["domain:trnData"] ); if(r.resData["contact:trnData"]) trnData( r.resData["contact:trnData"] instanceof Value ? r.resData["contact:trnData"].value : r.resData["contact:trnData"] ); if(r.resData["domain:panData"]) { var n = r.resData["domain:panData"] instanceof Value ? r.resData["domain:panData"].value : r.resData["domain:panData"]; switch(r.msgQ.value.msg) { case 'Domain Auditing Refused': // 1.3.2.1 (n["domain:name"].attrs.paResult==='0') panData(e2u.create(n).name); case 'Domain Auditing Passed': // 1.3.2.2 (n["domain:name"].attrs.paResult==='1') break; case 'Domain was forced to delete': panData_1_3_4(e2u.create(n).name); break; case 'Redemption domain auditing refused': panData_1_3_6(e2u.create(n).name, false); break; case 'Redemption domain auditing pass': case 'Redemption domain is successful': panData_1_3_6(e2u.create(n).name, true); break; } } } epp.submit(cmd.poll(r.msgQ.attrs.id)); } } function request_create(req, cb, acc, u, clTRID) { switch(u.obj) { case 'domain': if(epp.deny(acc.acl.CreateDomain, u.name)) { cb(req, msg.response('2202', clTRID)); return; } pay.cando(acc.user, 'create', u.name, u.y || u.m, function(price) { acc.create_price = price; request(req, cb, acc); }, function() { cb(req, msg.response('2104', clTRID)); }); break; default: request(req, cb, acc); } } function response_create(req, res, acc) { var command = req.epp.value.command; var u = e2u.parse(command, 'create'); switch(u.obj) { case 'domain': var ext = command.extension; if(ext) { var secDNS = ext["secDNS:create"]; if(secDNS) u.secDNS = e2u.create_secDNS( secDNS instanceof Value ? secDNS.value : secDNS ); } var r = res.epp.value.response; var exDate = r.resData['domain:creData'] instanceof Value ? r.resData['domain:creData'].value['domain:exDate'] : r.resData['domain:creData']['domain:exDate']; var ext = r.extension; if(ext && ext["launch:creData"]) { var launch = e2u.launch_domain( ext["launch:creData"] instanceof Value ? ext["launch:creData"].value : ext["launch:creData"] ); epp.query("replace into launch_domain values (0,?,?,?,?,?,now(),?,?,?,'pendingValidation')", [u.name, JSON.stringify(u), acc.user, acc.create_price, u.y || u.m, exDate, launch.phase, launch.applicationID], function(err, result) { if(err) return; pay.done({ user: acc.user, op: 'create', domain: u.name, appID: launch.applicationID, registrant: u.registrant, opDate: (new Date()).toISOString(), price: acc.create_price, period: u.y || u.m, exDate: exDate, oldID: '', uniID: 'launch-'+result.insertId }); }); } else { epp.query("replace into domain values (0,?,?,?,?)", [u.name, JSON.stringify(u), acc.user, exDate]); epp.query("insert into create_domain values (0,?,?,?,?,now(),?)", [u.name, acc.user, acc.create_price, u.y || u.m, exDate], function(err, result) { if(err) return; pay.done({ user: acc.user, op: 'create', domain: u.name, appID: '', registrant: u.registrant, opDate: (new Date()).toISOString(), price: acc.create_price, period: u.y || u.m, exDate: exDate, oldID: '', uniID: 'create-'+result.insertId }); }); } break; case 'contact': epp.query("delete from payment.audits where contactId=? and uniId!=?", [ u.name, epp.MD5({ name : u.int.name, org : u.int.org, email: u.email }) ]); default: epp.query("replace into ?? values (0,?,?,?)", [u.obj, u.name, JSON.stringify(u), acc.user]); } } function request_delete_autorenew(req, cb, acc, u, clTRID) { epp.submit(cmd.domain('info', {name: u.name}), function(_req, _res) { var r = _res.epp.value.response; var code = r.result.attrs.code; if(code==='1000') { acc.rgp = e2u.rgpStatus(r) || "redemptionPeriod"; request(cmd.domain("delete", {name: u.name}), cb, acc); } else cb(req, msg.response(code, clTRID)); }); } function request_delete(req, cb, acc, u, clTRID) { switch(u.obj) { case 'domain': if(epp.deny(acc.acl.DeleteDomain, u.name)) { cb(req, msg.response('2202', clTRID)); return; } if(!e2u.ap_id(req.epp.value.command, 'delete')) { epp.submit(cmd.domain('info', {name: u.name}), function(_req, _res) { var r = _res.epp.value.response; var code = r.result.attrs.code; if(code==='1000') { acc.rgp = e2u.rgpStatus(r) || "redemptionPeriod"; request(req, cb, acc); } else cb(req, msg.response(code, clTRID)); }); } else { acc.rgp = 'launchPeriod'; request(req, cb, acc); } break; default: request(req, cb, acc); } } function response_delete(req, res, acc) { var command = req.epp.value.command; var u = e2u.parse(command, 'delete'); var ap_id = e2u.ap_id(command, 'delete'); switch(u.obj) { case 'domain': function delete_domain() { epp.query("insert into delete_domain values (0,?,?,?,?,now(),now(),?,0)", [u.name, acc.json, acc.user, acc.ex_date, acc.rgp], function(err, result) { if(err) return; pay.done({ user: acc.user, op: 'delete', domain: u.name, appID: '', registrant: JSON.parse(acc.json).registrant, opDate: (new Date()).toISOString(), price: 0, period: 0, exDate: acc.ex_date.toISOString(), oldID: '', uniID: 'delete-'+result.insertId }); }); } var map = { addPeriod : 'create', autoRenewPeriod: 'autorenew', renewPeriod : 'renew', transferPeriod : 'transfer', launchPeriod : 'launch' }; var sql = { create : "select * from create_domain where name=? and user=?", autorenew: "select * from autorenew_domain where name=? and user=?", renew : "select * from renew_domain where name=? and user=?", transfer : "select * from transfer where obj='domain' and name=? and re_id=? and side='registrar'", launch : "select * from launch_domain where name=? and user=? and ap_id=?" }; if(map[acc.rgp]) { epp.query(sql[map[acc.rgp]]+" order by id desc limit 1", [u.name, acc.user, ap_id], function(err, rows) { if(!err && rows.length) { switch(acc.rgp) { case 'addPeriod': case 'autoRenewPeriod': case 'renewPeriod': case 'transferPeriod': epp.query("insert into delete_domain values (0,?,?,?,?,now(),now(),?,?)", [u.name, acc.json, acc.user, acc.ex_date, acc.rgp, rows[0].id]); switch(acc.rgp) { case 'addPeriod': epp.query("delete from domain where name=?", [u.name]); epp.query("delete from host where name=? or name like ?", [u.name, '%.'+u.name]); break; case 'autoRenewPeriod': epp.query("update autorenew_domain set ack='no' where id=?", [rows[0].id]); break; } pay.done({ user: acc.user, op: 'delete', domain: u.name, appID: '', registrant: JSON.parse(acc.json).registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: -(rows[0].period || 1), exDate: acc.ex_date.toISOString(), oldID: map[acc.rgp]+'-'+rows[0].id, uniID: map[acc.rgp]+'-'+rows[0].id+'-deleted' }); break; case 'launchPeriod': epp.query("update launch_domain set status='rejected' where ap_id=?", [ap_id]); pay.done({ user: acc.user, op: 'delete', domain: u.name, appID: ap_id, registrant: JSON.parse(acc.json).registrant, opDate: (new Date()).toISOString(), price: rows[0].price, period: -(rows[0].period || 1), exDate: acc.ex_date.toISOString(), oldID: map[acc.rgp]+'-'+rows[0].id, uniID: map[acc.rgp]+'-'+rows[0].id+'-deleted' }); break; } } else if(acc.rgp!=='launchPeriod') delete_domain(); }); } else delete_domain(); break; default: epp.query("delete from ?? where name=?", [u.obj, u.name]); } } function request_renew(req, cb, acc, u, clTRID) { if(epp.deny(acc.acl.RenewDomain, u.name)) { cb(req, msg.response('2202', clTRID)); return; } pay.cando(acc.user, 'renew', u.name, u.y || u.m, function(price) { acc.renew_price = price; request(req, cb, acc); }, function() { cb(req, msg.response('2104', clTRID)); }); } function response_renew(req, res, acc) { var command = req.epp.value.command; var u = e2u.parse(command, 'renew'); var v = e2u.create( res.epp.value.response.resData["domain:renData"] instanceof Value ? res.epp.value.response.resData["domain:renData"].value : res.epp.value.response.resData["domain:renData"] ); epp.query("update domain set ex_date=? where name=?", [v.exDate, v.name]); epp.query("insert into renew_domain values (0,?,?,?,?,now(),?)", [v.name, acc.user, acc.renew_price, u.y || u.m, v.exDate], function(err, result) { if(err) return; pay.done({ user: acc.user, op: 'renew', domain: v.name, appID: '', registrant: JSON.parse(acc.json).registrant, opDate: (new Date()).toISOString(), price: acc.renew_price, period: u.y || u.m, exDate: v.exDate, oldID: '', uniID: 'renew-'+result.insertId }); }); } function request_transfer_query(req, cb, acc, u, clTRID) { function trnData(r) { var data = { name: r.name, trStatus: r.status, reID: r.re_id, reDate: r.re_date.toISOString(), acID: r.ac_id, acDate: r.ac_date.toISOString(), exDate: (r.obj==='domain') ? r.ex_date.toISOString() : undefined }; var resData = msg.resData(r.obj, {trnData: data}); cb(req, msg.response_data('1000', resData, clTRID)); } epp.query("select * from transfer where obj=? and name=? and password=?", [u.obj, u.name, u.pw], function(err, rows) { if(!err && rows.length) { (rows[0].side==='agent') ? trnData(rows[0]) : epp.submit(req, cb, acc); } else cb(req, msg.response('2303', clTRID)); }); } function request_transfer_request(req, cb, acc, u, clTRID) { function trnData(user, ex_date) { var now = (new Date()).toISOString(); var data = { name: u.name, trStatus: 'pending', reID: acc.user, reDate: now, acID: user, acDate: now, exDate: (u.obj==='domain') ? ex_date.toISOString() : undefined }; var resData = msg.resData(u.obj, {trnData: data}); epp.query("replace into transfer values (0,?,?,?,'pending',?,?,?,?,0,?,'no','agent')", [u.obj, u.name, u.pw, acc.user, now, user, now, ex_date]); cb(req, msg.response_data('1001', resData, clTRID)); } epp.query("select * from ?? where name=?", [u.obj, u.name], function(err, rows) { function exec(req, cb, u, clTRID, func) { epp.query("select id from transfer where obj=? and name=? and status='pending'", [u.obj, u.name], function(err, rows) { (!err && rows.length) ? cb(req, msg.response('2300', clTRID)) : func(); }); } if(!err && rows.length) { var json = JSON.parse(rows[0].json); var user = rows[0].user; var ex_date = rows[0].ex_date || null; if(acc.user===user) { cb(req, msg.response('2106', clTRID)); } else if(u.pw!==json.pw) { cb(req, msg.response('2201', clTRID)); } else if([].concat(json.s).indexOf('clientTransferProhibited')>=0) { cb(req, msg.response('2304', clTRID)); } else exec(req, cb, u, clTRID, function() { trnData(user, ex_date); }); } else exec(req, cb, u, clTRID, function() { switch(u.obj) { case 'domain': if(epp.deny(acc.acl.TransferDomain, u.name)) { cb(req, msg.response('2202', clTRID)); return; } pay.cando(acc.user, 'transfer', u.name, 1, function(price) { acc.transfer_price = price; request(req, cb, acc); }, function() { cb(req, msg.response('2104', clTRID)); }); break; default: request(req, cb, acc); } }); }); } function request_transfer_cancel(req, cb, acc, u, clTRID) { function trnData(r) { var now = (new Date()).toISOString(); var data = { name: r.name, trStatus: 'clientCancelled', reID: r.re_id, reDate: r.re_date.toISOString(), acID: r.ac_id, acDate: now, exDate: (r.obj==='domain') ? r.ex_date.toISOString() : undefined }; var resData = msg.resData(r.obj, {trnData: data}); epp.query("update transfer set status='clientCancelled',ac_date=?,ack='no' where id=?", [now, r.id]); cb(req, msg.response_data('1000', resData, clTRID)); } epp.query("select * from transfer where obj=? and name=? and password=? and re_id=? and status='pending'", [u.obj, u.name, u.pw, acc.user], function(err, rows) { if(!err && rows.length) { if(rows[0].side==='agent') trnData(rows[0]); else { acc.transfer_price = rows[0].price; acc.id = rows[0].id; request(req, cb, acc); } } else cb(req, msg.response('2301', clTRID)); }); } function request_transfer_approve(req, cb, acc, u, clTRID) { function trnData(r) { var now = (new Date()).toISOString(); var data = { name: r.name, trStatus: 'clientApproved', reID: r.re_id, reDate: r.re_date.toISOString(), acID: r.ac_id, acDate: now, exDate: (r.obj==='domain') ? r.ex_date.toISOString() : undefined }; var resData = msg.resData(r.obj, {trnData: data}); epp.query("update transfer set status='clientApproved',ac_date=?,ack='no' where id=?", [now, r.id]); epp.query("update ?? set user=? where name=?", [r.obj, r.re_id, r.name]); if(r.obj==='domain') { epp.query("update host set user=? where name=? or name like ?", [r.re_id, r.name, '%.'+r.name]); pay.done({ user: r.ac_id, op: 'transferOut', domain: r.name, appID: '', registrant: '', opDate: now, price: 0, period: 0, exDate: r.ex_date.toISOString(), oldID: '', uniID: 'transferOut-'+r.id }); pay.done({ user: r.re_id, op: 'transferIn', domain: r.name, appID: '', registrant: '', opDate: now, price: 0, period: 0, exDate: r.ex_date.toISOString(), oldID: '', uniID: 'transferIn-'+r.id }); } cb(req, msg.response_data('1000', resData, clTRID)); } epp.query("select * from transfer where obj=? and name=? and ac_id=? and status='pending'", [u.obj, u.name, acc.user], function(err, rows) { if(!err && rows.length) { if(rows[0].side==='agent') trnData(rows[0]); else { acc.id = rows[0].id; request(req, cb, acc); } } else cb(req, msg.response('2301', clTRID)); }); } function request_transfer_reject(req, cb, acc, u, clTRID) { function trnData(r) { var now = (new Date()).toISOString(); var data = { name: r.name, trStatus: 'clientRejected', reID: r.re_id, reDate: r.re_date.toISOString(), acID: r.ac_id, acDate: now, exDate: (r.obj==='domain') ? r.ex_date.toISOString() : undefined }; var resData = msg.resData(r.obj, {trnData: data}); epp.query("update transfer set status='clientRejected',ac_date=?,ack='no' where id=?", [now, r.id]); cb(req, msg.response_data('1000', resData, clTRID)); } epp.query("select * from transfer where obj=? and name=? and ac_id=? and status='pending'", [u.obj, u.name, acc.user], function(err, rows) { if(!err && rows.length) { if(rows[0].side==='agent') trnData(rows[0]); else { acc.id = rows[0].id; request(req, cb, acc); } } else cb(req, msg.response('2301', clTRID)); }); } function request_transfer(req, cb, acc, u, clTRID) { switch(req.epp.value.command.transfer.attrs.op) { case 'query': request_transfer_query(req, cb, acc, u, clTRID); break; case 'request': request_transfer_request(req, cb, acc, u, clTRID); break; case 'cancel': request_transfer_cancel(req, cb, acc, u, clTRID); break; case 'approve': request_transfer_approve(req, cb, acc, u, clTRID); break; case 'reject': request_transfer_reject(req, cb, acc, u, clTRID); break; default: cb(req, msg.response('2004', clTRID)); } } function response_transfer(req, res, acc) { var command = req.epp.value.command; var u = e2u.parse(command, 'transfer'); var v = e2u.create( res.epp.value.response.resData[u.obj+":trnData"] instanceof Value ? res.epp.value.response.resData[u.obj+":trnData"].value : res.epp.value.response.resData[u.obj+":trnData"] ); switch(command.transfer.attrs.op) { case 'request': epp.query("replace into transfer values (0,?,?,?,?,?,?,?,?,?,?,'no','registrar')", [u.obj, u.name, u.pw, v.trStatus, acc.user, v.reDate, v.acID, v.acDate, acc.transfer_price, v.exDate || null], function(err, result) { if(err || u.obj!=='domain') return; pay.done({ user: acc.user, op: 'transferIn', domain: u.name, appID: '', registrant: '', opDate: v.reDate, price: acc.transfer_price, period: 1, exDate: v.exDate, oldID: '', uniID: 'transferIn-'+result.insertId }); }); break; case 'cancel': epp.query("update transfer set status=?,ac_date=?,ack='no' where obj=? and name=?", [v.trStatus, v.acDate, u.obj, u.name]); if(u.obj==='domain') { pay.done({ user: acc.user, op: 'transferIn', domain: u.name, appID: '', registrant: '', opDate: (new Date()).toISOString(), price: acc.transfer_price, period: -1, exDate: v.exDate, oldID: 'transferIn-'+acc.id, uniID: 'transferIn-'+acc.id+'-canceled' }); } break; case 'approve': epp.query("update transfer set status=?,ac_date=?,ex_date=?,ack='no' where obj=? and name=?", [v.trStatus, v.acDate, v.exDate || null, u.obj, u.name]); epp.query("delete from ?? where name=?", [u.obj, u.name]); if(u.obj==='domain') { epp.query("delete from host where name=? or name like ?", [u.name, '%.'+u.name]); pay.done({ user: acc.user, op: 'transferOut', domain: u.name, appID: '', registrant: '', opDate: v.acDate, price: 0, period: 0, exDate: v.exDate, oldID: '', uniID: 'transferOut-'+acc.id+'-approved' }); } break; case 'reject': epp.query("update transfer set status=?,ac_date=?,ack='no' where obj=? and name=?", [v.trStatus, v.acDate, u.obj, u.name]); break; } } function request_update(req, cb, acc, u, clTRID) { switch(u.obj) { case 'domain': if(e2u.restoreOp(req.epp.value.command)==="request") { if(epp.deny(acc.acl.RestoreDomain, u.name)) { cb(req, msg.response('2202', clTRID)); return; } pay.cando(acc.user, 'restore', u.name, 1, function(price) { acc.restore_price = price; request(req, cb, acc); }, function() { cb(req, msg.response('2104', clTRID)); }); } else { request(req, cb, acc); } break; default: request(req, cb, acc); } } function response_update(req, res, acc) { var command = req.epp.value.command; var u = e2u.parse(command, 'update'); var ap_id = e2u.ap_id(command, 'update'); function cb_db(err, rows) { if(err || !rows.length) return; var json = JSON.parse(rows[0].json); switch(u.obj) { case 'contact': if(u.rem && u.rem.s) json.s = json.s.filter(function(s) {return u.rem.s.indexOf(s)<0;}); if(u.add && u.add.s) json.s = json.s ? json.s.concat(u.add.s) : u.add.s; if(u.chg && u.chg.int) { if(u.chg.int.name) json.int.name = u.chg.int.name; if(u.chg.int.org) json.int.org = u.chg.int.org; if(!Value.isEmpty(u.chg.int.addr)) json.int.addr = u.chg.int.addr; } if(u.chg && u.chg.loc) { if(u.chg.loc.name) json.loc.name = u.chg.loc.name; if(u.chg.loc.org) json.loc.org = u.chg.loc.org; if(!Value.isEmpty(u.chg.loc.addr)) json.loc.addr = u.chg.loc.addr; } if(u.chg && typeof(u.chg.voice)==='string') json.voice = u.chg.voice; if(u.chg && typeof(u.chg.fax)==='string') json.fax = u.chg.fax; if(u.chg && u.chg.email) json.email = u.chg.email; if(u.chg && u.chg.pw) json.pw = u.chg.pw; if(u.chg && u.chg["0"]) json["0"] = u.chg["0"]; if(u.chg && u.chg["1"]) json["1"] = u.chg["1"]; epp.query("update payment.audits set dirty=1 where contactId=? and uniId!=?", [ u.name, epp.MD5({ name : json.int.name, org : json.int.org, email: json.email }) ]); epp.query("update contact set json=? where name=?", [JSON.stringify(json), u.name]); break; case 'domain': if(u.rem && u.rem.ns) json.ns = json.ns.filter(function(ns) {return u.rem.ns.indexOf(ns)<0;}); if(u.add && u.add.ns) json.ns = json.ns ? json.ns.concat(u.add.ns) : u.add.ns; if(u.rem && u.rem.admin===json.admin) delete json.admin; if(u.add && u.add.admin) json.admin = u.add.admin; if(u.rem && u.rem.billing===json.billing) delete json.billing; if(u.add && u.add.billing) json.billing = u.add.billing; if(u.rem && u.rem.tech===json.tech) delete json.tech; if(u.add && u.add.tech) json.tech = u.add.tech; if(u.rem && u.rem.s) json.s = json.s.filter(function(s) {return u.rem.s.indexOf(s)<0;}); if(u.add && u.add.s) json.s = json.s ? json.s.concat(u.add.s) : u.add.s; if(u.chg && u.chg.registrant) json.registrant = u.chg.registrant; if(u.chg && u.chg.pw) json.pw = u.chg.pw; if(command.extension) { var secDNS = command.extension["secDNS:update"]; if(secDNS) { var eu = e2u.update_secDNS( secDNS instanceof Value ? secDNS.value : secDNS ); if(eu.rem && eu.rem.all) { delete json.secDNS.dsData; delete json.secDNS.keyData; } if(eu.rem && eu.rem.dsData) { json.secDNS.dsData = [].concat(json.secDNS.dsData).filter(function(d) { return !eu.rem.dsData.filter(function(r) {return Value.compare(d, r);}).length; }); } if(eu.add && eu.add.dsData) { json.secDNS.dsData = [].concat(json.secDNS.dsData, eu.add.dsData); } if(eu.rem && eu.rem.keyData) { json.secDNS.keyData = [].concat(json.secDNS.keyData).filter(function(d) { return !eu.rem.keyData.filter(function(r) {return Value.compare(d, r);}).length; }); } if(eu.add && eu.add.keyData) { json.secDNS.keyData = [].concat(json.secDNS.keyData, eu.add.keyData); } if(eu.chg && eu.chg.maxSigLife) json.maxSigLife = eu.chg.maxSigLife; } if(e2u.restoreOp(command)==="request") { epp.query("update delete_domain set rs_date=now(),rgp=? where name=?", [e2u.rgpStatus(res.epp.value.response), u.name]); epp.query("insert into restore_domain values (0,?,?,?,now(),?)",