eppgate
Version:
Domain Registrar
1,153 lines (1,126 loc) • 52.5 kB
JavaScript
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(),?)",