eppface
Version:
epp api
618 lines (580 loc) • 25.7 kB
JavaScript
var cmd = require('epp/CMD');
var Value= require('nml/Value');
var pdns = require('pdns-mysql');
function users(epp, cookie, posts) {
this.login = function(clID, pass, cb) {
epp.debug(cmd.login(clID, pass), function(data, code) {
switch(code) {
case '1001':
cb('1000', 'admin');
break;
case '1000':
cb('1000', 'user');
break;
default:
cb(code);
}
}, cookie);
};
this.passwd = function(newPW, cb) {
epp.debug(cmd.login(cookie.clID, cookie.pass, newPW), function(data, code) {
if(code==='1000') cookie.pass = newPW;
cb(code);
});
};
this.check = function(obj, name, cb) {
if(typeof(cmd[obj])==='function') {
epp.debug(name.phase
? cmd[obj]('check', {name: [].concat(name.name), phase: name.phase}, name.type)
: cmd[obj]('check', {name: [].concat(name)}),
cb);
}
else cb();
};
this.info = function(obj, name, cb) {
if(typeof(cmd[obj])==='function') {
epp.debug(typeof(name)==='object'
? cmd[obj]('info', name, "true")
: cmd[obj]('info',{name: obj==='domain'
? new Value({hosts: "all"}, name)
: name}),
cb, cookie);
}
else cb();
};
this.delete = function(obj, name, cb) {
if(typeof(cmd[obj])==='function') {
epp.debug(typeof(name)==='object'
? cmd[obj]("delete", name)
: cmd[obj]("delete",{name: name}),
cb, cookie);
}
else cb();
};
this.renew = function(name, y, cb) {
epp.query("select DATE_FORMAT(ex_date,'%Y-%m-%d') as curExpDate from domain where name=?", [name], function(err, rows) {
if(!err && rows.length) {
epp.query("update autorenew_domain set ack='yes' where name=? and user=? and ack is null", [name, cookie.user]);
epp.debug(cmd.domain("renew", {
name: name,
curExpDate: rows[0].curExpDate,
y: y
}), cb, cookie);
}
else cb();
});
};
this.autorenew = function(id, ack, cb) {
switch(ack) {
case 'no':
epp.query("select name from autorenew_domain where id=? and user=?", [id, cookie.user], function(err, rows) {
if(!err && rows.length) {
epp.debug(cmd.domain("delete_autorenew", {name: rows[0].name}), function(data, code) {
cb(code, data);
}, cookie);
}
else cb();
});
break;
default:
epp.query("update autorenew_domain set ack='yes' where id=? and user=?", [id, cookie.user], function(err) {
err ? cb() : cb('1000');
});
}
};
this.transfer_request = function(json, cb) {
function _do(obj, name, pw) {
if(typeof(cmd[obj])==='function') {
epp.debug(cmd[obj]("transfer", {name: name, pw: pw}, "request"), cb, cookie);
}
else cb();
}
_do(json.obj, json.name, json.pw);
};
this.transfer_cancel = function(id, cb) {
function _do(obj, name, pw) {
if(typeof(cmd[obj])==='function') {
epp.debug(cmd[obj]("transfer", {name: name, pw: pw}, "cancel"), cb, cookie);
}
else cb();
}
epp.query("select obj,name,password from transfer where id=? and re_id=?", [id, cookie.user], function(err, rows) {
(!err && rows.length) ? _do(rows[0].obj, rows[0].name, rows[0].password) : cb();
});
};
this.transfer_approve = function(id, cb) {
function _do(obj, name) {
if(typeof(cmd[obj])==='function') {
epp.debug(cmd[obj]("transfer", {name: name}, "approve"), cb, cookie);
}
else cb();
}
epp.query("select obj,name from transfer where id=? and ac_id=?", [id, cookie.user], function(err, rows) {
(!err && rows.length) ? _do(rows[0].obj, rows[0].name) : cb();
});
};
this.transfer_reject = function(id, cb) {
function _do(obj, name) {
if(typeof(cmd[obj])==='function') {
epp.debug(cmd[obj]("transfer", {name: name}, "reject"), cb, cookie);
}
else cb();
}
epp.query("select obj,name from transfer where id=? and ac_id=?", [id, cookie.user], function(err, rows) {
(!err && rows.length) ? _do(rows[0].obj, rows[0].name) : cb();
});
};
this.create_domain = function(params, cb) {
var type = {
sunrise : "application",
landrush: "application",
claims : "registration",
open : "registration",
custom : "application"
};
params.phase ? epp.debug(cmd.domain("create", params, type[params.phase]), cb, cookie)
: epp.debug(cmd.domain("create", params), cb, cookie);
};
this.create_host = function(params, cb) {
epp.debug(cmd.host("create", params), cb, cookie);
};
this.create_contact = function(params, cb) {
epp.debug(cmd.contact("create", params), cb, cookie);
};
this.update_domain = function(params, cb) {
function cb_db(err, rows) {
if(!err && rows.length) {
var data = JSON.parse(rows[0].json);
if(!data.ns) data.ns = [];
if(!data.s) data.s = [];
var add = {}, rem = {}, chg = {};
var ns = [];
for(var i in params.ns) {
if(data.ns.indexOf(params.ns[i])<0) ns.push(params.ns[i]);
}
if(!Value.isEmpty(ns)) add.ns = ns;
var ns = [];
for(var i in data.ns) {
if(params.ns.indexOf(data.ns[i])<0) ns.push(data.ns[i]);
}
if(!Value.isEmpty(ns)) rem.ns = ns;
if(params.admin !== data.admin) {
add.admin = params.admin;
rem.admin = data.admin;
}
if(params.billing !== data.billing) {
add.billing = params.billing;
rem.billing = data.billing;
}
if(params.tech !== data.tech) {
add.tech = params.tech;
rem.tech = data.tech;
}
var s = [];
for(var i in params.s) {
if(data.s.indexOf(params.s[i])<0) s.push(params.s[i]);
}
if(!Value.isEmpty(s)) add.s = s;
var s = [];
for(var i in data.s) {
if(data.s[i].slice(0,6)!=='client') continue;
if(params.s.indexOf(data.s[i])<0) s.push(data.s[i]);
}
if(!Value.isEmpty(s)) rem.s = s;
if(params.registrant !== data.registrant) chg.registrant = params.registrant;
if(params.pw !== data.pw) chg.pw = params.pw;
var secDNS = data.secDNS;
if(secDNS) {
var dsData = [].concat(secDNS.dsData)[0];
if(Value.isEmpty(params.dsData)) rem.dsData = dsData;
else if(!Value.compare(dsData, params.dsData)) {
rem.dsData = dsData;
add.dsData = params.dsData;
}
}
else {
if(!Value.isEmpty(params.dsData)) add.dsData = params.dsData;
}
epp.debug(cmd.domain("update", {
name: params.name,
add: add,
rem: rem,
chg: chg,
phase: params.phase,
applicationID: params.applicationID}), cb, cookie);
}
else cb();
}
params.applicationID ? epp.query("select json from launch_domain where user=? and ap_id=?",
[cookie.user, params.applicationID], cb_db)
: epp.query("select json from domain where user=? and name=?",
[cookie.user, params.name], cb_db);
};
this.update_host = function(params, cb) {
function cb_db(err, rows) {
if(!err && rows.length) {
var data = JSON.parse(rows[0].json);
if(!data.ip) data.ip = [];
if(!data.s) data.s = [];
var add = {ip: [], s: []};
var rem = {ip: [], s: []};
var chg = (params.name === params.new_name) ? {} : {name: params.new_name};
for(var i in params.ip) {
if(data.ip.indexOf(params.ip[i])<0) add.ip.push(params.ip[i]);
}
for(var i in params.s) {
if(data.s.indexOf(params.s[i])<0) add.s.push(params.s[i]);
}
for(var i in data.ip) {
if(params.ip.indexOf(data.ip[i])<0) rem.ip.push(data.ip[i]);
}
for(var i in data.s) {
if(data.s[i].slice(0,6)!=='client') continue;
if(params.s.indexOf(data.s[i])<0) rem.s.push(data.s[i]);
}
epp.debug(cmd.host("update", {name: params.name, add: add, rem: rem, chg: chg}), cb, cookie);
}
else cb();
}
epp.query("select json from host where user=? and name=?", [cookie.user, params.name], cb_db);
};
this.update_contact = function(params, cb) {
function postal(p, d) {
var c = {};
if(p.name!==d.name) c.name = p.name;
if(p.org!==d.org) c.org = p.org;
if(!Value.compare(p.addr, d.addr)) c.addr = p.addr;
return c;
}
function cb_db(err, rows) {
if(!err && rows.length) {
var data = JSON.parse(rows[0].json);
if(!data.s) data.s = [];
var add = {s: []};
var rem = {s: []};
var chg = {};
for(var i in params.s) {
if(data.s.indexOf(params.s[i])<0) add.s.push(params.s[i]);
}
for(var i in data.s) {
if(data.s[i].slice(0,6)!=='client') continue;
if(params.s.indexOf(data.s[i])<0) rem.s.push(data.s[i]);
}
if(params.int) {
if(data.int) {
var cint = postal(params.int, data.int);
if(!Value.isEmpty(cint)) chg.int = cint;
}
else chg.int = params.int;
}
if(params.loc) {
if(data.loc) {
var cloc = postal(params.loc, data.loc);
if(!Value.isEmpty(cloc)) chg.loc = cloc;
}
else chg.loc = params.loc;
}
if(params.voice !== data.voice) chg.voice = params.voice;
if(params.fax !== data.fax) chg.fax = params.fax;
if(params.email !== data.email) chg.email = params.email;
if(params.pw !== data.pw) chg.pw = params.pw;
if(!Value.compare(params["0"], data["0"])) chg["0"] = params["0"];
if(!Value.compare(params["1"], data["1"])) chg["1"] = params["1"];
epp.debug(cmd.contact("update", {name: params.name, add: add, rem: rem, chg: chg}), cb, cookie);
}
else cb();
}
epp.query("select json from contact where user=? and name=?", [cookie.user, params.name], cb_db);
};
this.restore_request = function(id, cb) {
function cb_db(err, rows) {
if(!err && rows.length) {
epp.debug(cmd.domain("update", {name: rows[0].name, restore: ""}), cb, cookie);
}
else cb();
}
epp.query("select name from delete_domain where id=? and user=? and rgp in ('autoRenewPeriod','renewPeriod','transferPeriod','redemptionPeriod')",
[id, cookie.user], cb_db);
};
this.restore_report = function(params, cb) {
epp.debug(cmd.domain("update", {name: params.name, restore: params}), cb, cookie);
};
this.show_domain = function(name, cb) {
function cb_db(err, rows) {
(!err && rows.length) ? cb('1000', JSON.parse(rows[0].json)) : cb();
}
epp.query("select json from domain where user=? and name=?", [cookie.user, name], cb_db);
};
this.show_host = function(name, cb) {
function cb_db(err, rows) {
(!err && rows.length) ? cb('1000', JSON.parse(rows[0].json)) : cb();
}
epp.query("select json from host where user=? and name=?", [cookie.user, name], cb_db);
};
this.show_contact = function(name, cb) {
function cb_db(err, rows) {
(!err && rows.length) ? cb('1000', JSON.parse(rows[0].json)) : cb();
}
epp.query("select json from contact where user=? and name=?", [cookie.user, name], cb_db);
};
this.show_launch = function(ap_id, cb) {
function cb_db(err, rows) {
if(!err && rows.length) {
var data = JSON.parse(rows[0].json);
data.name = rows[0].name;
data.phase = rows[0].phase;
cb('1000', data);
}
else cb();
}
epp.query("select name,json,phase from launch_domain where user=? and ap_id=?", [cookie.user, ap_id], cb_db);
};
this.show_report = function(id, cb) {
function _data(rows) {
var _rows = {};
for(var n in rows) _rows[n] = (rows[n] instanceof Date) ? rows[n].toISOString() : rows[n];
return _rows;
}
epp.query("select * from delete_domain where id=? and user=? and rgp='pendingRestore'",
[id, cookie.user], function(err, rows) {
(!err && rows.length) ? cb('1000', _data(rows[0])) : cb();
});
};
this.list_domain = function(page, cb, where) {
var and = '';
if(where.name) and += epp.format(" and name like concat(?,'%')", where.name);
if(where.days) and += epp.format(" and DATE_SUB(ex_date,INTERVAL ? DAY)<now()", where.days);
function _data(rows) {
var _rows = [];
for(var i=0; i<rows.length; i++) {
var json = JSON.parse(rows[i].json);
_rows.push({
id : rows[i].name,
registrant: json.registrant,
ns : [].concat(json.ns).join(' '),
ex_date : rows[i].ex_date.toISOString(),
pw : json.pw
});
}
return _rows;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT name,json,ex_date FROM domain"
+ " WHERE user=?" + and + " ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: _data(rows)});
});
}
epp.query("select count(*) AS total from domain"
+ " where user=?" + and, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_host = function(page, cb) {
function _data(rows) {
var _rows = [];
for(var i=0; i<rows.length; i++) {
var ip = JSON.parse(rows[i].json).ip;
_rows.push({
id: rows[i].name,
ip: ip ? ip.join(' ') : ''
});
}
return _rows;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT name,json FROM host WHERE user=? ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: _data(rows)});
});
}
epp.query("select count(*) AS total from host where user=?", [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_contact = function(page, cb, where) {
var and = '';
if(where.contactId) and += epp.format(" and contactId like concat(?,'%')", where.contactId);
if(where.email) and += epp.format(" and email like concat(?,'%')", where.email);
if(where.emailOk !== undefined) and += epp.format(" and emailOk=? and dirty in (0,2)", where.emailOk);
if(where.uniIdOk !== undefined) and += epp.format(" and uniIdOk=? and dirty in (0)", where.uniIdOk);
function _data(rows) {
var _rows = [];
for(var i=0; i<rows.length; i++) {
var json = JSON.parse(rows[i].json);
_rows.push({
id : rows[i].name,
name : json.int.name,
org : json.int.org,
voice : json.voice,
email : json.email,
pw : json.pw,
emailOk: rows[i].dirty&1 ? null : rows[i].emailOk,
uniIdOk: rows[i].dirty&3 ? null : rows[i].uniIdOk
});
}
return _rows;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT name,json,dirty,emailOk,uniIdOk FROM contact"
+ " LEFT JOIN payment.audits ON name=contactId"
+ " WHERE user=?" + and + " ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: _data(rows)});
});
}
epp.query("SELECT count(*) AS total FROM contact"
+ " LEFT JOIN payment.audits ON name=contactId"
+ " WHERE user=?" + and, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_launch = function(page, cb) {
var from_launch_domain = "from launch_domain where user=? and status!='allocated' AND status!='rejected'";
function _data(rows) {
var _rows = [];
for(var i=0; i<rows.length; i++) {
var json = JSON.parse(rows[i].json);
_rows.push({
id : rows[i].ap_id,
name : rows[i].name,
registrant: json.registrant,
ex_date : rows[i].ex_date.toISOString(),
pw : json.pw,
phase : rows[i].phase
});
}
return _rows;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT * "+from_launch_domain+" ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: _data(rows)});
});
}
epp.query("select count(*) AS total "+from_launch_domain, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_autorenew = function(page, cb) {
var from_autorenew_domain = "FROM autorenew_domain WHERE user=? AND ack is null AND DATE_ADD(cr_date,INTERVAL 30 DAY)>now()";
function _data(r) {
r.cr_date = r.cr_date.toISOString();
r.ex_date = r.ex_date.toISOString();
return r;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT * "+from_autorenew_domain+" ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: rows.map(_data)});
});
}
epp.query("select count(*) AS total "+from_autorenew_domain, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_transfer = function(page, cb, target) {
var from_transfer = {
"in" : "FROM transfer WHERE re_id=? and status='pending'",
"out": "FROM transfer WHERE ac_id=? and status='pending'"
}[target.io];
switch(target.obj) {
case 'domain':
from_transfer += " and obj='domain'";
break;
case 'contact':
from_transfer += " and obj='contact'";
break;
}
function _data(r) {
r.re_date = r.re_date.toISOString();
r.ac_date = r.ac_date.toISOString();
if(r.obj==='domain') r.ex_date = r.ex_date.toISOString();
return r;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT * "+from_transfer+" ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: rows.map(_data)});
});
}
epp.query("SELECT count(*) AS total "+from_transfer, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_restore = function(page, cb) {
var from_delete_domain = "FROM delete_domain WHERE user=? and rgp in ('autoRenewPeriod','renewPeriod','transferPeriod','redemptionPeriod','pendingRestore')";
function _data(r) {
r.ex_date = r.ex_date.toISOString();
r.rm_date = r.rm_date.toISOString();
return r;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT * "+from_delete_domain+" ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: rows.map(_data)});
});
}
epp.query("select count(*) AS total "+from_delete_domain, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.list_bills = function(page, cb) {
var from_bills = "FROM bills WHERE user=?";
function _data(r) {
r.opName = r.op; delete r.op;
r.opDate = r.opDate.toISOString();
r.exDate = r.exDate.toISOString();
return r;
}
function lists(count) {
var pages = Math.floor((count+posts-1)/posts);
if(page > pages) page = pages;
if(page < 1) page = 1;
epp.query("SELECT * "+from_bills+" ORDER BY id DESC LIMIT ?,?",
[cookie.user, (page-1)*posts, posts], function(err, rows) {
err ? cb() : cb('1000', {page: page, pages: pages, rows: rows.map(_data)});
});
}
epp.query("select count(*) AS total "+from_bills, [cookie.user], function(err, rows) {
err ? cb() : rows[0].total ? lists(rows[0].total) : cb('1000', {page: 1, pages: 0, rows: []});
});
};
this.pdns_records = function(action, domain, record, cb) {
function cb_db(err, rows) {
if(!err && rows.length) {
var primary = pdns.domains.belong(JSON.parse(rows[0].json).ns || []);
if(primary) cb('2004', primary);
else {
pdns.records[action](domain, record, function(err, rows) {
err ? cb() : cb('1000', rows);
});
}
}
else cb();
}
epp.query("select json from domain where user=? and name=?", [cookie.user, domain], cb_db);
};
}
module.exports = users;