auth-center
Version:
auth center with TOTP
118 lines (93 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isURL = isURL;
exports.pagination = pagination;
exports.makeSalt = makeSalt;
exports.encrypt = encrypt;
exports.checkURI = checkURI;
exports.generateId = generateId;
exports.getCaptcha = getCaptcha;
exports.buildURI = buildURI;
exports.encodeKey = encodeKey;
exports.totpURI = totpURI;
exports.totpImage = totpImage;
Object.defineProperty(exports, "totp", {
enumerable: true,
get: function () {
return _otplib.totp;
}
});
var _crypto = _interopRequireDefault(require("crypto"));
var _otplib = require("otplib");
var _qrImage = _interopRequireDefault(require("qr-image"));
var _nanoid = require("nanoid");
var _url = require("url");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_otplib.totp.options = {
window: 10
};
function isURL(str) {
return /^(https?:|)(\/\/)/i.test(str);
}
function pagination(cur, total, link, half = 2) {
if (total <= 1) return '';
let left = Math.max(1, cur - half);
const right = Math.min(left + half * 2, total);
if (total - cur <= half) {
left = Math.max(1, total - half * 2);
}
const temp = ['<ul class="pagination justify-content-center">'];
if (cur > 1) {
temp.push(`<li class="page-item"><a class="page-link" href="${link(cur - 1)}">«</a></li>`);
}
for (let i = left; i <= right; i++) {
temp.push(`<li class="page-item ${cur === i ? 'active' : ''}"><a class="page-link" href="${link(i)}">${i}</a></li>`);
}
if (cur !== total) {
temp.push(`<li class="page-item"><a class="page-link" href="${link(cur + 1)}">»</a></li>`);
}
temp.push('</ul>');
return temp.join('');
}
function makeSalt() {
return Math.round(Date.now() * Math.random()).toString();
}
function encrypt(pass, salt) {
if (!pass) return null;
return _crypto.default.createHmac('sha1', salt).update(pass).digest('hex');
}
function checkURI(base, checked) {
const url1 = (0, _url.parse)(base, false, true);
const url2 = (0, _url.parse)(checked, false, true);
url1.port = url1.port || 80;
url2.port = url2.port || 80;
url1.pathname = url1.pathname || '/';
url2.pathname = url2.pathname || '/';
return url1.hostname === url2.hostname && url1.port === url2.port && url2.pathname.indexOf(url1.pathname) === 0;
}
function generateId() {
return (0, _nanoid.nanoid)(40);
}
function getCaptcha(len) {
return (0, _nanoid.customAlphabet)('1234567890', len)();
}
function buildURI(uri, query) {
const obj = (0, _url.parse)(uri, true);
Object.assign(obj.query, query);
delete obj.search;
return (0, _url.format)(obj);
}
function encodeKey(key) {
_otplib.authenticator.options = {
encoding: 'ascii'
};
return _otplib.authenticator.encode(key);
}
function totpURI(user, key) {
return `otpauth://totp/${user}?secret=${encodeKey(key)}`;
}
function totpImage(user, key) {
return _qrImage.default.imageSync(totpURI(user, key), 'H');
}