next-password
Version:
Use password to protect your Next.js application.
251 lines (203 loc) ⢠11.9 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var server = require('next/server');
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
return target;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
var lib = {exports: {}};
(function (module, exports) {
!function(r,n){module.exports=n();}("undefined"!=typeof self?self:commonjsGlobal,function(){return function(r){var n={};function e(t){if(n[t])return n[t].exports;var o=n[t]={i:t,l:!1,exports:{}};return r[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=r,e.c=n,e.d=function(r,n,t){e.o(r,n)||Object.defineProperty(r,n,{enumerable:!0,get:t});},e.r=function(r){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0});},e.t=function(r,n){if(1&n&&(r=e(r)),8&n)return r;if(4&n&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(e.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&n&&"string"!=typeof r)for(var o in r)e.d(t,o,function(n){return r[n]}.bind(null,o));return t},e.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(n,"a",n),n},e.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},e.p="",e(e.s=0)}([function(r,n,e){e.r(n);var t="0123456789abcdef".split("");var o=function(r){for(var n="",e=0;e<4;e++)n+=t[r>>8*e+4&15]+t[r>>8*e&15];return n};var u=function(r){for(var n=r.length,e=0;e<n;e++)r[e]=o(r[e]);return r.join("")};var f=function(r,n){return r+n&4294967295};var i=function(r,n,e,t,o,u,i){return function(r,n,e){return f(r<<n|r>>>32-n,e)}(n=function(r,n,e,t){return n=f(f(n,r),f(e,t))}(r,n,t,u),o,e)};var a=function(r,n,e,t,o,u,f,a){return i(e&t|~e&o,n,e,u,f,a)};var c=function(r,n,e,t,o,u,f,a){return i(e&o|t&~o,n,e,u,f,a)};var l=function(r,n,e,t,o,u,f,a){return i(e^t^o,n,e,u,f,a)};var d=function(r,n,e,t,o,u,f,a){return i(t^(e|~o),n,e,u,f,a)};var v=function(r,n,e){void 0===e&&(e=f);var t=r[0],o=r[1],u=r[2],i=r[3],v=a.bind(null,e);t=v(t,o,u,i,n[0],7,-680876936),i=v(i,t,o,u,n[1],12,-389564586),u=v(u,i,t,o,n[2],17,606105819),o=v(o,u,i,t,n[3],22,-1044525330),t=v(t,o,u,i,n[4],7,-176418897),i=v(i,t,o,u,n[5],12,1200080426),u=v(u,i,t,o,n[6],17,-1473231341),o=v(o,u,i,t,n[7],22,-45705983),t=v(t,o,u,i,n[8],7,1770035416),i=v(i,t,o,u,n[9],12,-1958414417),u=v(u,i,t,o,n[10],17,-42063),o=v(o,u,i,t,n[11],22,-1990404162),t=v(t,o,u,i,n[12],7,1804603682),i=v(i,t,o,u,n[13],12,-40341101),u=v(u,i,t,o,n[14],17,-1502002290),o=v(o,u,i,t,n[15],22,1236535329);var s=c.bind(null,e);t=s(t,o,u,i,n[1],5,-165796510),i=s(i,t,o,u,n[6],9,-1069501632),u=s(u,i,t,o,n[11],14,643717713),o=s(o,u,i,t,n[0],20,-373897302),t=s(t,o,u,i,n[5],5,-701558691),i=s(i,t,o,u,n[10],9,38016083),u=s(u,i,t,o,n[15],14,-660478335),o=s(o,u,i,t,n[4],20,-405537848),t=s(t,o,u,i,n[9],5,568446438),i=s(i,t,o,u,n[14],9,-1019803690),u=s(u,i,t,o,n[3],14,-187363961),o=s(o,u,i,t,n[8],20,1163531501),t=s(t,o,u,i,n[13],5,-1444681467),i=s(i,t,o,u,n[2],9,-51403784),u=s(u,i,t,o,n[7],14,1735328473),o=s(o,u,i,t,n[12],20,-1926607734);var b=l.bind(null,e);t=b(t,o,u,i,n[5],4,-378558),i=b(i,t,o,u,n[8],11,-2022574463),u=b(u,i,t,o,n[11],16,1839030562),o=b(o,u,i,t,n[14],23,-35309556),t=b(t,o,u,i,n[1],4,-1530992060),i=b(i,t,o,u,n[4],11,1272893353),u=b(u,i,t,o,n[7],16,-155497632),o=b(o,u,i,t,n[10],23,-1094730640),t=b(t,o,u,i,n[13],4,681279174),i=b(i,t,o,u,n[0],11,-358537222),u=b(u,i,t,o,n[3],16,-722521979),o=b(o,u,i,t,n[6],23,76029189),t=b(t,o,u,i,n[9],4,-640364487),i=b(i,t,o,u,n[12],11,-421815835),u=b(u,i,t,o,n[15],16,530742520),o=b(o,u,i,t,n[2],23,-995338651);var p=d.bind(null,e);t=p(t,o,u,i,n[0],6,-198630844),i=p(i,t,o,u,n[7],10,1126891415),u=p(u,i,t,o,n[14],15,-1416354905),o=p(o,u,i,t,n[5],21,-57434055),t=p(t,o,u,i,n[12],6,1700485571),i=p(i,t,o,u,n[3],10,-1894986606),u=p(u,i,t,o,n[10],15,-1051523),o=p(o,u,i,t,n[1],21,-2054922799),t=p(t,o,u,i,n[8],6,1873313359),i=p(i,t,o,u,n[15],10,-30611744),u=p(u,i,t,o,n[6],15,-1560198380),o=p(o,u,i,t,n[13],21,1309151649),t=p(t,o,u,i,n[4],6,-145523070),i=p(i,t,o,u,n[11],10,-1120210379),u=p(u,i,t,o,n[2],15,718787259),o=p(o,u,i,t,n[9],21,-343485551),r[0]=e(t,r[0]),r[1]=e(o,r[1]),r[2]=e(u,r[2]),r[3]=e(i,r[3]);};var s=function(r){for(var n=[],e=0;e<64;e+=4)n[e>>2]=r.charCodeAt(e)+(r.charCodeAt(e+1)<<8)+(r.charCodeAt(e+2)<<16)+(r.charCodeAt(e+3)<<24);return n};var b=function(r,n){var e,t=r.length,o=[1732584193,-271733879,-1732584194,271733878];for(e=64;e<=t;e+=64)v(o,s(r.substring(e-64,e)),n);var u=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],f=(r=r.substring(e-64)).length;for(e=0;e<f;e++)u[e>>2]|=r.charCodeAt(e)<<(e%4<<3);if(u[e>>2]|=128<<(e%4<<3),e>55)for(v(o,u,n),e=16;e--;)u[e]=0;return u[14]=8*t,v(o,u,n),o};function p(r){var n;return "5d41402abc4b2a76b9719d911017c592"!==u(b("hello"))&&(n=function(r,n){var e=(65535&r)+(65535&n);return (r>>16)+(n>>16)+(e>>16)<<16|65535&e}),u(b(r,n))}e.d(n,"md5",function(){return p});}])});
}(lib));
var CONSTANTS = {
COOKIE_NAME: 'NEXT_PASSWORD',
HEADER_KEY: 'Authorization',
MISSING_PD: '\nš You are using "next-password", but didn\'t set any password.\nš Refer here to fix -> https://pd.unix.bio/missing'
};
var mergeOptions = function mergeOptions(userOptions, defaultOptions) {
return Object.keys(defaultOptions).reduce(function (pre, key) {
var userValue = userOptions[key];
var defaultValue = defaultOptions[key];
var value = typeof userValue !== 'undefined' ? userValue : defaultValue;
return _objectSpread2(_objectSpread2({}, pre), {}, _defineProperty({}, key, value));
}, {});
};
var defaultOptions = {
password: '',
maxAge: 1000 * 60 * 60,
authComponentName: 'auth',
exactMatch: false,
logoutPath: '/logout',
salt: 'NEXT_PASSWORD'
};
var toRelative = function toRelative(req, pathname) {
var url = req.nextUrl.clone();
url.pathname = pathname;
return url;
};
var clearCookie = function clearCookie(req, res) {
return res.clearCookie(CONSTANTS.COOKIE_NAME, {
domain: req.nextUrl.hostname,
path: '/',
httpOnly: true
});
};
var initPasswordMiddleware = function initPasswordMiddleware() {
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/';
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var paths = Array.isArray(path) ? path : [path];
var op = mergeOptions(options, defaultOptions);
var rewrite = function rewrite(req) {
var res = server.NextResponse.rewrite(toRelative(req, "/".concat(op.authComponentName.toLowerCase())));
return clearCookie(req, res);
};
var password = op.password || function () {
return process.env.PASSWORD;
}();
var ignored = function () {
return process.env.IGNORE_PASSWORD;
}();
if (!ignored && typeof password === 'undefined') {
throw new Error(CONSTANTS.MISSING_PD);
}
var saltHash = lib.exports.md5(op.salt);
var validateHash = lib.exports.md5("".concat(password));
var passwordHash = lib.exports.md5("".concat(password).concat(saltHash));
return /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(req) {
var pathname, requestHash, clientHash, _res, hasPath, isRequiredAuth, res;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!ignored) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
pathname = req.nextUrl.pathname;
requestHash = req.headers.get(CONSTANTS.HEADER_KEY);
clientHash = req.cookies[CONSTANTS.COOKIE_NAME]; // return authenticated users ASAP
if (!(pathname === op.logoutPath)) {
_context.next = 8;
break;
}
_res = server.NextResponse.redirect(toRelative(req, path[0]));
return _context.abrupt("return", clearCookie(req, _res));
case 8:
if (!(clientHash === passwordHash)) {
_context.next = 10;
break;
}
return _context.abrupt("return");
case 10:
hasPath = op.exactMatch ? paths.find(function (p) {
return p === pathname;
}) : paths.find(function (p) {
return pathname.startsWith(p);
});
isRequiredAuth = hasPath && !!password;
if (isRequiredAuth) {
_context.next = 14;
break;
}
return _context.abrupt("return");
case 14:
if (requestHash) {
_context.next = 16;
break;
}
return _context.abrupt("return", rewrite(req));
case 16:
if (!(requestHash !== validateHash)) {
_context.next = 18;
break;
}
return _context.abrupt("return", server.NextResponse.json(null));
case 18:
res = server.NextResponse.json(null);
res.cookie(CONSTANTS.COOKIE_NAME, passwordHash, {
domain: req.nextUrl.hostname,
path: '/',
httpOnly: true,
sameSite: 'strict',
maxAge: op.maxAge
});
res.headers.set(CONSTANTS.HEADER_KEY, CONSTANTS.HEADER_KEY);
return _context.abrupt("return", res);
case 22:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x) {
return _ref.apply(this, arguments);
};
}();
};
exports.defaultOptions = defaultOptions;
exports.initPasswordMiddleware = initPasswordMiddleware;
;