eppgate
Version:
Domain Registrar
174 lines (163 loc) • 6.46 kB
JavaScript
var mysql = require('mysql');
var Run = require('epp/Run');
var cmd = require('epp/CMD');
var e2u = require('epp/e2u');
var Value = require('nml/Value');
var pay = require('./payment.js');
var crypto= require('crypto');
function RunDB(option) {
var dbh;
function nocb(err, rows) {}
function connect_mysql() {
dbh = mysql.createConnection(option.mysql);
dbh.connect();
pay.init(option.epp.clID+'@'+option.epp.host, dbh, option.pay);
dbh.on('error', connect_mysql);
}
connect_mysql();
var epp = new Run(option.epp/*, function() {
dbh.end();
process.exit();
}*/);
setInterval(infoname, 24*3600*1000);
function infoname() {
function _info1(row) {
epp.submit(cmd.domain('info', {name: row.name}), function(_req, _res) {
var r = _res.epp.value.response;
var code = r.result.attrs.code;
if(code!=='1000') return;
var rgp = e2u.rgpStatus(r);
dbh.query("update delete_domain set rs_date=now(),rgp=? where id=?", [rgp, row.id], nocb);
if(rgp==='pendingDelete') {
dbh.query("delete from domain where name=?", [row.name], nocb);
dbh.query("delete from host where name=? or name like ?", [row.name, '%.'+row.name], nocb);
}
});
}
function _info3(row) {
epp.submit(cmd.domain('info', {name: row.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"]
);
switch(e2u.rgpStatus(r)) {
case 'autoRenewPeriod':
pay.cando(row.user, 'autorenew', row.name, 1, function(price) {
dbh.query("insert into autorenew_domain values (0,?,?,?,now(),?,null)",
[row.name, row.user, price, v.exDate],
function(err, result) {
if(err) return;
dbh.query("update domain set ex_date=? where name=?", [v.exDate, row.name], nocb);
pay.done({
user: row.user,
op: 'autorenew',
domain: row.name,
appID: '',
registrant: JSON.parse(row.json).registrant,
opDate: (new Date()).toISOString(),
price: price,
period: 1,
exDate: v.exDate,
oldID: '',
uniID: 'autorenew-'+result.insertId
});
});
}, nocb);
}
});
}
dbh.query("select * from delete_domain where rgp in ('autoRenewPeriod','renewPeriod','transferPeriod','redemptionPeriod')", function(err, rows) {
if(err || !rows.length) return;
for(var i in rows) _info1(rows[i]);
});
dbh.query("select * from domain where now()>ex_date", function(err, rows) {
if(err || !rows.length) return;
for(var i in rows) _info3(rows[i]);
});
}
function MD5(json) {
var hash = crypto.createHash('md5');
hash.update(json.name || '');
hash.update(json.org || '');
hash.update(json.email || '');
return hash.digest('hex');
}
function loadjson(obj, name, reID, cb) {
var _name = name;
if(reID) {
switch(obj) {
case 'domain':
dbh.query("replace into domain values (0,?,'',?,now())", [name, reID], nocb);
_name = new Value({hosts: "all"}, name);
break;
default:
dbh.query("replace into ?? values (0,?,'',?)", [obj, name, reID], nocb);
}
}
epp.submit(cmd[obj]('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[obj+":infData"] instanceof Value ?
r.resData[obj+":infData"].value :
r.resData[obj+":infData"]
);
var e = r.extension;
if(e && e["secDNS:infData"]) {
v.secDNS = e2u.create_secDNS(
e["secDNS:infData"] instanceof Value ?
e["secDNS:infData"].value :
e["secDNS:infData"]
);
}
var json = JSON.stringify(v);
switch(obj) {
case 'domain':
dbh.query("update domain set json=?,ex_date=? where name=?",
[json, v.exDate, name],
function(err, result) {
cb && cb(json, v.exDate);
});
for(var i in v.host) loadjson('host', v.host[i], reID);
break;
case 'contact':
dbh.query("delete from payment.audits where contactId=? and uniId!=?", [
name,
MD5({
name : v.int.name,
org : v.int.org,
email: v.email
})
], nocb);
default:
dbh.query("update ?? set json=? where name=?", [obj, json, name], nocb);
}
});
}
this.deny = function(tlds, domain) {
try {
return tlds.indexOf(domain.split('.').pop())>=0;
}
catch(e) {
return true;
}
};
this.payment = pay;
this.format = function(s, a) {
return dbh.format(s, a);
};
this.query = function(s, a, cb) {
dbh.query(s, a, cb || nocb);
};
this.submit = function(req, cb, acc) {
epp.submit(req, cb, acc);
};
this.MD5 = MD5;
this.loadjson= loadjson;
}
module.exports = RunDB;