1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.pagination = pagination;
|
7 | exports.makeSalt = makeSalt;
|
8 | exports.encrypt = encrypt;
|
9 | exports.checkURI = checkURI;
|
10 | exports.generateToken = generateToken;
|
11 | exports.buildURI = buildURI;
|
12 | exports.encodeKey = encodeKey;
|
13 | exports.totpURI = totpURI;
|
14 | exports.totpImage = totpImage;
|
15 |
|
16 | var _crypto = require('crypto');
|
17 |
|
18 | var _crypto2 = _interopRequireDefault(_crypto);
|
19 |
|
20 | var _thirtyTwo = require('thirty-two');
|
21 |
|
22 | var _thirtyTwo2 = _interopRequireDefault(_thirtyTwo);
|
23 |
|
24 | var _qrImage = require('qr-image');
|
25 |
|
26 | var _qrImage2 = _interopRequireDefault(_qrImage);
|
27 |
|
28 | var _url = require('url');
|
29 |
|
30 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
31 |
|
32 | function pagination(cur, total, link, half = 2) {
|
33 | if (total <= 1) return '';
|
34 |
|
35 | let left = Math.max(1, cur - half);
|
36 | let right = Math.min(left + half * 2, total);
|
37 |
|
38 | if (total - cur <= half) {
|
39 | left = Math.max(1, total - half * 2);
|
40 | }
|
41 | const temp = ['<ul class="pagination">'];
|
42 | if (cur > 1) {
|
43 | temp.push(`<li><a href="${link(cur - 1)}">«</a></li>`);
|
44 | }
|
45 |
|
46 | for (let i = left; i <= right; i++) {
|
47 | temp.push(`<li class="${cur === i ? 'active' : ''}"><a href="${link(i)}">${i}</a></li>`);
|
48 | }
|
49 | if (cur !== total) {
|
50 | temp.push(`<li><a href="${link(cur + 1)}">»</a></li>`);
|
51 | }
|
52 | temp.push('</ul>');
|
53 | return temp.join('');
|
54 | }
|
55 |
|
56 | function makeSalt() {
|
57 | return Math.round(new Date().valueOf() * Math.random()) + '';
|
58 | }
|
59 |
|
60 | function encrypt(pass, salt) {
|
61 | if (!pass) return null;
|
62 | return _crypto2.default.createHmac('sha1', salt).update(pass).digest('hex');
|
63 | }
|
64 |
|
65 | function checkURI(base, checked) {
|
66 | let url1 = (0, _url.parse)(base, false, true);
|
67 | let url2 = (0, _url.parse)(checked, false, true);
|
68 |
|
69 | url1.port = url1.port || 80;
|
70 | url2.port = url2.port || 80;
|
71 | url1.pathname = url1.pathname || '/';
|
72 | url2.pathname = url2.pathname || '/';
|
73 |
|
74 | return url1.hostname === url2.hostname && url1.port === url2.port && url2.pathname.indexOf(url1.pathname) === 0;
|
75 | }
|
76 |
|
77 | function generateToken() {
|
78 | let buffer = _crypto2.default.randomBytes(256);
|
79 | return _crypto2.default.createHash('sha1').update(buffer).digest('hex');
|
80 | }
|
81 |
|
82 | function buildURI(uri, query) {
|
83 | let obj = (0, _url.parse)(uri, true);
|
84 | Object.assign(obj.query, query);
|
85 | delete obj.search;
|
86 | return (0, _url.format)(obj);
|
87 | }
|
88 |
|
89 | function encodeKey(key) {
|
90 | return _thirtyTwo2.default.encode(key).toString().replace(/=/g, '');
|
91 | }
|
92 |
|
93 | function totpURI(user, key) {
|
94 | return `otpauth://totp/${user}?secret=${encodeKey(key)}`;
|
95 | }
|
96 |
|
97 | function totpImage(user, key) {
|
98 | return _qrImage2.default.imageSync(totpURI(user, key), 'H');
|
99 | } |
\ | No newline at end of file |