UNPKG

53.7 kBSource Map (JSON)View Raw
1{"version":3,"file":"server-opds-browse-v2.js","sourceRoot":"","sources":["../../../../src/http/server-opds-browse-v2.ts"],"names":[],"mappings":"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","sourcesContent":["// ==LICENSE-BEGIN==\n// Copyright 2017 European Digital Reading Lab. All rights reserved.\n// Licensed to the Readium Foundation under one or more contributor license agreements.\n// Use of this source code is governed by a BSD-style license\n// that can be found in the LICENSE file exposed on Github (readium) in the project repository.\n// ==LICENSE-END==\n\nimport * as crypto from \"crypto\";\nimport * as css2json from \"css2json\";\nimport * as debug_ from \"debug\";\nimport * as DotProp from \"dot-prop\";\nimport * as express from \"express\";\nimport * as jsonMarkup from \"json-markup\";\nimport * as morgan from \"morgan\";\nimport * as path from \"path\";\nimport * as request from \"request\";\nimport * as requestPromise from \"request-promise-native\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport { TaJsonDeserialize, TaJsonSerialize } from \"@r2-lcp-js/serializable\";\nimport { OPDSFeed } from \"@r2-opds-js/opds/opds2/opds2\";\nimport { OPDSAuthenticationDoc } from \"@r2-opds-js/opds/opds2/opds2-authentication-doc\";\nimport { OPDSPublication } from \"@r2-opds-js/opds/opds2/opds2-publication\";\nimport {\n encodeURIComponent_RFC3986, ensureAbsolute, isHTTP,\n} from \"@r2-utils-js/_utils/http/UrlUtils\";\nimport { traverseJsonObjects } from \"@r2-utils-js/_utils/JsonUtils\";\nimport { streamToBufferPromise } from \"@r2-utils-js/_utils/stream/BufferUtils\";\n\nimport { jsonSchemaValidate } from \"../utils/json-schema-validate\";\nimport {\n IRequestPayloadExtension, IRequestQueryParams, _authRefresh, _authRequest, _authResponse,\n _urlEncoded,\n} from \"./request-ext\";\nimport { Server } from \"./server\";\nimport { serverLCPLSD_show_PATH } from \"./server-lcp-lsd-show\";\nimport { serverOPDS_convert_v1_to_v2_PATH } from \"./server-opds-convert-v1-to-v2\";\nimport { trailingSlashRedirect } from \"./server-trailing-slash-redirect\";\n\nconst debug = debug_(\"r2:streamer#http/server-opds-browse-v2\");\n\n// tslint:disable-next-line:variable-name\nexport const serverOPDS_browse_v2_PATH = \"/opds-v2-browse\";\n\n// tslint:disable-next-line:variable-name\nexport const serverOPDS_dataUrl_PATH = \"/data-url\";\n\n// tslint:disable-next-line:variable-name\nexport const serverOPDS_auth_PATH = \"/opds-auth\";\n\nconst salt = crypto.randomBytes(16).toString(\"hex\");\nconst OPDS_AUTH_ENCRYPTION_KEY_BUFFER = crypto.pbkdf2Sync(uuidv4(), salt, 1000, 32, \"sha256\");\nconst OPDS_AUTH_ENCRYPTION_KEY_HEX = OPDS_AUTH_ENCRYPTION_KEY_BUFFER.toString(\"hex\");\n\nconst AES_BLOCK_SIZE = 16;\nconst OPDS_AUTH_ENCRYPTION_IV_BUFFER = Buffer.from(uuidv4()).slice(0, AES_BLOCK_SIZE);\nconst OPDS_AUTH_ENCRYPTION_IV_HEX = OPDS_AUTH_ENCRYPTION_IV_BUFFER.toString(\"hex\");\n\nexport function serverOPDS_browse_v2(_server: Server, topRouter: express.Application) {\n\n // https://github.com/mafintosh/json-markup/blob/master/style.css\n const jsonStyle = `\n.json-markup {\n line-height: 17px;\n font-size: 13px;\n font-family: monospace;\n white-space: pre;\n}\n.json-markup-key {\n font-weight: bold;\n}\n.json-markup-bool {\n color: firebrick;\n}\n.json-markup-string {\n color: green;\n}\n.json-markup-null {\n color: gray;\n}\n.json-markup-number {\n color: blue;\n}\n`;\n\n // tslint:disable-next-line:variable-name\n const routerOPDS_browse_v2 = express.Router({ strict: false });\n routerOPDS_browse_v2.use(morgan(\"combined\", { stream: { write: (msg: any) => debug(msg) } }));\n\n routerOPDS_browse_v2.use(trailingSlashRedirect);\n\n routerOPDS_browse_v2.get(\"/\", (_req: express.Request, res: express.Response) => {\n\n let html = \"<html><head>\";\n html += `<script type=\"text/javascript\">function encodeURIComponent_RFC3986(str) { ` +\n `return encodeURIComponent(str).replace(/[!'()*]/g, (c) => { ` +\n `return \"%\" + c.charCodeAt(0).toString(16); }); }` +\n `function go(evt) {` +\n `if (evt) { evt.preventDefault(); } var url = ` +\n `location.origin +` +\n // `location.protocol + '//' + location.hostname + ` +\n // `(location.port ? (':' + location.port) : '') + ` +\n ` '${serverOPDS_browse_v2_PATH}/' +` +\n ` encodeURIComponent_RFC3986(document.getElementById(\"url\").value);` +\n `location.href = url;}</script>`;\n html += \"</head>\";\n\n html += \"<body><h1>OPDS feed browser</h1>\";\n\n html += `<form onsubmit=\"go();return false;\">` +\n `<input type=\"text\" name=\"url\" id=\"url\" size=\"80\">` +\n `<input type=\"submit\" value=\"Go!\"></form>`;\n\n html += \"</body></html>\";\n\n res.status(200).send(html);\n });\n\n routerOPDS_browse_v2.param(\"urlEncoded\", (req, _res, next, value, _name) => {\n (req as IRequestPayloadExtension).urlEncoded = value;\n next();\n });\n\n routerOPDS_browse_v2.get(\"/:\" + _urlEncoded + \"(*)\", async (req: express.Request, res: express.Response) => {\n\n const reqparams = (req as IRequestPayloadExtension).params;\n\n if (!reqparams.urlEncoded) {\n reqparams.urlEncoded = (req as IRequestPayloadExtension).urlEncoded;\n }\n\n let authResponseJson: any | undefined;\n const authResponseBase64 = (req.query as IRequestQueryParams).authResponse;\n if (authResponseBase64) {\n try {\n const authResponseStr = Buffer.from(authResponseBase64, \"base64\").toString(\"utf8\");\n authResponseJson = JSON.parse(authResponseStr);\n } catch (err) {\n debug(err);\n }\n }\n const authRequestBase64 = (req.query as IRequestQueryParams).authRequest;\n\n const urlDecoded = reqparams.urlEncoded;\n // if (urlDecoded.substr(-1) === \"/\") {\n // urlDecoded = urlDecoded.substr(0, urlDecoded.length - 1);\n // }\n debug(urlDecoded);\n\n const isSecureHttp = req.secure ||\n req.protocol === \"https\" ||\n req.get(\"X-Forwarded-Proto\") === \"https\"\n ;\n const rootUrl = (isSecureHttp ? \"https://\" : \"http://\")\n + req.headers.host;\n\n const failure = (err: any) => {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n };\n\n const success = async (response: request.RequestResponse) => {\n\n // Object.keys(response.headers).forEach((header: string) => {\n // debug(header + \" => \" + response.headers[header]);\n // });\n\n const isAuthStatusCode = response.statusCode === 401;\n\n if (isAuthStatusCode && // comment this to test refresh_token\n authRequestBase64 && authResponseJson && authResponseJson.refresh_token) {\n\n const redirectUrl = rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_browse_v2_PATH + \"/\")) +\n serverOPDS_auth_PATH + \"/\" + encodeURIComponent_RFC3986(authRequestBase64) +\n \"?\" + _authRefresh + \"=\" + authResponseJson.refresh_token;\n\n debug(`REDIRECT: ${req.originalUrl} ==> ${redirectUrl}`);\n res.redirect(301, redirectUrl);\n return;\n }\n\n const isBadStatusCode = response.statusCode && (response.statusCode < 200 || response.statusCode >= 300);\n if (!isAuthStatusCode && isBadStatusCode) {\n failure(\"HTTP CODE \" + response.statusCode);\n return;\n }\n\n let responseData: Buffer;\n try {\n responseData = await streamToBufferPromise(response);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + (isAuthStatusCode ? \" (Auth 401)\" : \"\") + \"</p></body></html>\");\n return;\n }\n const responseStr = responseData.toString(\"utf8\");\n const responseJson = JSON.parse(responseStr);\n\n const isPublication = !responseJson.publications &&\n !responseJson.navigation &&\n !responseJson.groups &&\n !responseJson.catalogs &&\n responseJson.metadata;\n const isAuth = !isPublication && responseJson.authentication;\n\n const opds2Feed: OPDSPublication | OPDSFeed | OPDSAuthenticationDoc =\n // tslint:disable-next-line: max-line-length\n isPublication ? TaJsonDeserialize<OPDSPublication>(responseJson, OPDSPublication) : // \"application/opds-publication+json\"\n // tslint:disable-next-line: max-line-length\n (isAuth ? TaJsonDeserialize<OPDSAuthenticationDoc>(responseJson, OPDSAuthenticationDoc) : // \"application/vnd.opds.authentication.v1.0+json\"\n TaJsonDeserialize<OPDSFeed>(responseJson, OPDSFeed)); // \"application/opds+json\"\n\n const opds2FeedJson = TaJsonSerialize(opds2Feed);\n\n let validationStr: string | undefined;\n const doValidate = !reqparams.jsonPath || reqparams.jsonPath === \"all\";\n if (doValidate) {\n\n const jsonSchemasRootpath = path.join(process.cwd(), \"misc\", \"json-schema\");\n const jsonSchemasNames = [\n \"opds/publication\",\n \"opds/acquisition-object\",\n \"opds/catalog-entry\",\n \"opds/feed-metadata\",\n \"opds/properties\",\n \"webpub-manifest/publication\",\n \"webpub-manifest/contributor-object\",\n \"webpub-manifest/contributor\",\n \"webpub-manifest/link\",\n \"webpub-manifest/metadata\",\n \"webpub-manifest/subcollection\",\n \"webpub-manifest/properties\",\n \"webpub-manifest/subject\",\n \"webpub-manifest/subject-object\",\n \"webpub-manifest/extensions/epub/metadata\",\n \"webpub-manifest/extensions/epub/subcollections\",\n \"webpub-manifest/extensions/epub/properties\",\n \"webpub-manifest/extensions/presentation/metadata\",\n \"webpub-manifest/extensions/presentation/properties\",\n \"webpub-manifest/language-map\",\n ];\n if (isAuth) {\n jsonSchemasNames.unshift(\"opds/authentication\"); // must be first!\n } else if (!isPublication) {\n jsonSchemasNames.unshift(\"opds/feed\"); // must be first!\n }\n // debug(jsonSchemasNames);\n\n const validationErrors =\n jsonSchemaValidate(jsonSchemasRootpath, jsonSchemasNames, opds2FeedJson);\n if (validationErrors) {\n validationStr = \"\";\n\n for (const err of validationErrors) {\n\n debug(\"JSON Schema validation FAIL.\");\n debug(err);\n\n if (isPublication) {\n const val = DotProp.get(opds2FeedJson, err.jsonPath);\n const valueStr = (typeof val === \"string\") ?\n `${val}` :\n ((val instanceof Array || typeof val === \"object\") ?\n `${JSON.stringify(val)}` :\n \"\");\n debug(valueStr);\n\n const title = DotProp.get(opds2FeedJson, \"metadata.title\");\n debug(title);\n\n validationStr +=\n // tslint:disable-next-line:max-line-length\n `\\n\"${title}\"\\n\\n${err.ajvMessage}: ${valueStr}\\n\\n'${err.ajvDataPath.replace(/^\\./, \"\")}' (${err.ajvSchemaPath})\\n\\n`;\n } else {\n const val = DotProp.get(opds2FeedJson, err.jsonPath);\n const valueStr = (typeof val === \"string\") ?\n `${val}` :\n ((val instanceof Array || typeof val === \"object\") ?\n `${JSON.stringify(val)}` :\n \"\");\n debug(valueStr);\n\n let title = \"\";\n let pubIndex = \"\";\n if (/^publications\\.[0-9]+/.test(err.jsonPath)) {\n const jsonPubTitlePath =\n err.jsonPath.replace(/^(publications\\.[0-9]+).*/, \"$1.metadata.title\");\n debug(jsonPubTitlePath);\n title = DotProp.get(opds2FeedJson, jsonPubTitlePath);\n debug(title);\n\n pubIndex = err.jsonPath.replace(/^publications\\.([0-9]+).*/, \"$1\");\n debug(pubIndex);\n }\n\n validationStr +=\n // tslint:disable-next-line:max-line-length\n `\\n___________INDEX___________ #${pubIndex} \"${title}\"\\n\\n${err.ajvMessage}: ${valueStr}\\n\\n'${err.ajvDataPath.replace(/^\\./, \"\")}' (${err.ajvSchemaPath})\\n\\n`;\n }\n }\n }\n }\n\n const funk = (obj: any) => {\n if ((obj.href && typeof obj.href === \"string\") ||\n (obj.Href && typeof obj.Href === \"string\")) {\n\n let fullHref = obj.href ? obj.href as string : obj.Href as string;\n\n const isDataUrl = /^data:/.test(fullHref);\n const isMailUrl = /^mailto:/.test(fullHref);\n const notFull = !isDataUrl && !isMailUrl && !isHTTP(fullHref);\n if (notFull) {\n fullHref = ensureAbsolute(urlDecoded, fullHref);\n }\n\n if ((obj.type && obj.type.indexOf(\"opds\") >= 0 && obj.type.indexOf(\"json\") >= 0) ||\n (obj.Type && obj.Type.indexOf(\"opds\") >= 0 && obj.Type.indexOf(\"json\") >= 0)) {\n\n obj.__href__ = rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_browse_v2_PATH + \"/\")) +\n serverOPDS_browse_v2_PATH + \"/\" + encodeURIComponent_RFC3986(fullHref);\n\n if (authRequestBase64 && authResponseBase64) {\n obj.__href__AUTH = obj.__href__ +\n \"?\" +\n _authResponse + \"=\" + encodeURIComponent_RFC3986(authResponseBase64) +\n \"&\" +\n _authRequest + \"=\" + encodeURIComponent_RFC3986(authRequestBase64)\n ;\n }\n } else if (obj.type === \"application/vnd.readium.lcp.license.v1.0+json\"\n // && obj.rel === \"http://opds-spec.org/acquisition\"\n ) {\n\n obj.__href__ = rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_browse_v2_PATH + \"/\")) +\n serverLCPLSD_show_PATH + \"/\" + encodeURIComponent_RFC3986(fullHref);\n\n if (authRequestBase64 && authResponseBase64) {\n obj.__href__AUTH = obj.__href__ +\n \"?\" +\n _authResponse + \"=\" + encodeURIComponent_RFC3986(authResponseBase64) +\n \"&\" +\n _authRequest + \"=\" + encodeURIComponent_RFC3986(authRequestBase64)\n ;\n }\n } else if ((obj.type && obj.type.indexOf(\"application/atom+xml\") >= 0) ||\n (obj.Type && obj.Type.indexOf(\"application/atom+xml\") >= 0)) {\n\n obj.__href__ = rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_browse_v2_PATH + \"/\")) +\n serverOPDS_convert_v1_to_v2_PATH + \"/\" + encodeURIComponent_RFC3986(fullHref);\n\n } else if (isDataUrl) {\n // obj.href = obj.href.substr(0, 100) + \"(...)\";\n // obj.__href__ = rootUrl + req.originalUrl.substr(0,\n // req.originalUrl.indexOf(serverOPDS_browse_v2_PATH + \"/\")) +\n // serverOPDS_dataUrl_PATH + \"/\" + encodeURIComponent_RFC3986(fullHref);\n\n } else if (notFull && !isMailUrl) {\n obj.__href__ = fullHref;\n }\n }\n };\n traverseJsonObjects(opds2FeedJson, funk);\n\n const css = css2json(jsonStyle);\n let jsonPrettyOPDS2 = jsonMarkup(opds2FeedJson, css);\n // tslint:disable-next-line: max-line-length\n jsonPrettyOPDS2 = jsonPrettyOPDS2.replace(/>\"data:image\\/(.*)\"</g, \"><a href=\\\"data:image/$1\\\" target=\\\"_BLANK\\\"><img style=\\\"max-width: 100px;\\\" src=\\\"data:image/$1\\\"></a><\");\n\n const authDoc = isAuth ? opds2Feed as OPDSAuthenticationDoc : undefined;\n const authObj = (authDoc && authDoc.Authentication) ? authDoc.Authentication.find((auth) => {\n return auth.Type === \"http://opds-spec.org/auth/oauth/password\";\n }) : undefined;\n const authLink = authObj ? (authObj.Links && authObj.Links.find((link) => {\n return link.Rel && link.Rel.includes(\"authenticate\") && link.TypeLink === \"application/json\";\n })) : undefined;\n // const authLinkRefresh = authObj ? (authObj.Links && authObj.Links.find((link) => {\n // return link.Rel.includes(\"refresh\") && link.TypeLink === \"application/json\";\n // })) : undefined;\n\n const imageLink = authDoc ? (authDoc.Links && authDoc.Links.find((link) => {\n return link.Rel && link.Rel.includes(\"logo\") && link.TypeLink && link.TypeLink.startsWith(\"image/\");\n })) : undefined;\n const imageUrl = imageLink ? ensureAbsolute(urlDecoded, imageLink.Href) : undefined;\n\n const authHtmlForm = !authObj ? \"\" : `\n<hr>\n<form id=\"authForm\">\n <input type=\"text\" name=\"login\" id=\"login\" size=\"40\">\n <span>${authObj.Labels.Login}</span>\n<br><br>\n <input type=\"password\" name=\"password\" id=\"password\" size=\"40\">\n <span>${authObj.Labels.Password}</span>\n<br><br>\n <input type=\"submit\" value=\"Authenticate\">\n</form>\n${imageUrl ? `<img src=\"${imageUrl}\" />` : ``}\n<script type=\"text/javascript\">\n// document.addEventListener(\"DOMContentLoaded\", (event) => {\n// });\nconst formElement = document.getElementById(\"authForm\");\nformElement.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n doAuth();\n});\nfunction encodeURIComponent_RFC3986(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, (c) => {\n return \"%\" + c.charCodeAt(0).toString(16);\n });\n}\nfunction encodeFormData(json) {\n if (!json) {\n return \"\";\n }\n return Object.keys(json).map((key) => {\n return encodeURIComponent_RFC3986(key) + \"=\" + (json[key] ? encodeURIComponent_RFC3986(json[key]) : \"_\");\n }).join(\"&\");\n}\nfunction hexStrToArrayBuffer(hexStr) {\n return new Uint8Array(\n hexStr\n .match(/.{1,2}/g)\n .map((byte) => {\n return parseInt(byte, 16);\n })\n );\n}\nfunction doAuth() {\n ${authLink ? `\n const bodyJson = {\n targetUrl: \"${urlDecoded}\",\n authUrl: \"${authLink.Href}\",\n grant_type: \"password\",\n username: document.getElementById(\"login\").value,\n password: document.getElementById(\"password\").value\n };\n const bodyStr = JSON.stringify(bodyJson);\n\n const textEncoder = new TextEncoder(\"utf-8\");\n const bodyStrEncoded = textEncoder.encode(bodyStr); // Uint8Array\n\n const keyPromise = window.crypto.subtle.importKey(\n \"raw\",\n hexStrToArrayBuffer(\"${OPDS_AUTH_ENCRYPTION_KEY_HEX}\"),\n { \"name\": \"AES-CBC\" },\n false,\n [\"encrypt\", \"decrypt\"]\n );\n keyPromise.then((key) => { // CryptoKey\n\n const iv = hexStrToArrayBuffer(\"${OPDS_AUTH_ENCRYPTION_IV_HEX}\");\n const encryptedBodyPromise = window.crypto.subtle.encrypt(\n {\n name: \"AES-CBC\",\n iv\n },\n key,\n bodyStrEncoded\n );\n encryptedBodyPromise.then((encryptedBody) => { // ArrayBuffer\n // const arg = String.fromCharCode.apply(null, new Uint8Array(encryptedBody));\n const arg = new Uint8Array(encryptedBody).reduce((data, byte) => {\n return data + String.fromCharCode(byte);\n }, '');\n const encryptedBodyB64 = window.btoa(arg);\n\n const url = location.origin + \"${serverOPDS_auth_PATH}/\" + encodeURIComponent_RFC3986(encryptedBodyB64);\n location.href = url;\n }).catch((err) => {\n console.log(err);\n });\n }).catch((err) => {\n console.log(err);\n });\n\n/* does not work because of HTTP CORS, so we forward to NodeJS fetch/request via the serverOPDS_auth_PATH HTTP route\n window.fetch(\"${authLink.Href}\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-url-encoded\",\n \"Accept\": \"application/json\"\n },\n body: encodeFormData(bodyJson)\n })\n .then((response) => {\n const res = JSON.stringify(response, null, 4);\n console.log(res);\n })\n .catch((error) => {\n console.log(error);\n });\n*/\n ` :\n `window.alert(\"no auth link!\");`\n }\n}\n</script>`;\n\n res.status(200).send(\"<html><body>\" +\n \"<h1>OPDS2 JSON \" +\n (isPublication ? \"entry\" : (isAuth ? \"authentication\" : \"feed\")) +\n \" (OPDS2) \" + (isAuthStatusCode ? \" [HTTP 401]\" : \"\") + \"</h1>\" +\n \"<h2><a href=\\\"\" + urlDecoded + \"\\\">\" + urlDecoded + \"</a></h2>\" +\n \"<hr>\" +\n \"<div style=\\\"overflow-x: auto;margin:0;padding:0;width:100%;height:auto;\\\">\" +\n jsonPrettyOPDS2 + \"</div>\" +\n // tslint:disable-next-line:max-line-length\n (doValidate ? (validationStr ? (\"<hr><p><pre>\" + validationStr + \"</pre></p>\") : (\"<hr><p>JSON SCHEMA OK.</p>\")) : \"\") +\n authHtmlForm +\n // \"<p><pre>\" + jsonPretty + \"</pre></p>\" +\n // \"<hr><p><pre>\" + jsonStr + \"</pre></p>\" +\n // \"<p><pre>\" + dumpStr + \"</pre></p>\" +\n \"</body></html>\");\n };\n\n const headers = {\n \"Accept\": \"application/json,application/xml\",\n \"Accept-Language\": \"en-UK,en-US;q=0.7,en;q=0.5\",\n \"User-Agent\": \"READIUM2\",\n };\n\n if (authResponseJson && authResponseJson.access_token) {\n (headers as any).Authorization = `Bearer ${authResponseJson.access_token}`;\n }\n\n // No response streaming! :(\n // https://github.com/request/request-promise/issues/90\n const needsStreamingResponse = true;\n if (needsStreamingResponse) {\n request.get({\n headers,\n method: \"GET\",\n uri: urlDecoded,\n })\n .on(\"response\", success)\n .on(\"error\", failure);\n } else {\n let response: requestPromise.FullResponse;\n try {\n // tslint:disable-next-line:await-promise no-floating-promises\n response = await requestPromise({\n headers,\n method: \"GET\",\n resolveWithFullResponse: true,\n uri: urlDecoded,\n });\n } catch (err) {\n failure(err);\n return;\n }\n\n await success(response);\n }\n });\n\n topRouter.use(serverOPDS_browse_v2_PATH, routerOPDS_browse_v2);\n\n // -------------------------------------------------------\n\n // // tslint:disable-next-line:variable-name\n // const routerOPDS_dataUrl = express.Router({ strict: false });\n // routerOPDS_dataUrl.use(morgan(\"combined\", { stream: { write: (msg: any) => debug(msg) } }));\n\n // routerOPDS_dataUrl.use(trailingSlashRedirect);\n\n // routerOPDS_dataUrl.get(\"/\", (_req: express.Request, res: express.Response) => {\n\n // let html = \"<html><head>\";\n // html += `<script type=\"text/javascript\">function encodeURIComponent_RFC3986(str) { ` +\n // `return encodeURIComponent(str).replace(/[!'()*]/g, (c) => { ` +\n // `return \"%\" + c.charCodeAt(0).toString(16); }); }` +\n // `function go(evt) {` +\n // `if (evt) { evt.preventDefault(); } var url = ` +\n // `location.origin +` +\n // // `location.protocol + '//' + location.hostname + ` +\n // // `(location.port ? (':' + location.port) : '') + ` +\n // ` '${serverOPDS_dataUrl_PATH}/' +` +\n // ` encodeURIComponent_RFC3986(document.getElementById(\"url\").value);` +\n // `location.href = url;}</script>`;\n // html += \"</head>\";\n\n // html += \"<body><h1>data URL viewer</h1>\";\n\n // html += `<form onsubmit=\"go();return false;\">` +\n // `<input type=\"text\" name=\"url\" id=\"url\" size=\"80\">` +\n // `<input type=\"submit\" value=\"Go!\"></form>`;\n\n // html += \"</body></html>\";\n\n // res.status(200).send(html);\n // });\n\n // routerOPDS_dataUrl.param(\"urlEncoded\", (req, _res, next, value, _name) => {\n // (req as IRequestPayloadExtension).urlEncoded = value;\n // next();\n // });\n\n // routerOPDS_dataUrl.get(\"/:\" + _urlEncoded + \"(*)\", async (req: express.Request, res: express.Response) => {\n\n // const reqparams = (req as IRequestPayloadExtension).params;\n\n // if (!reqparams.urlEncoded) {\n // reqparams.urlEncoded = (req as IRequestPayloadExtension).urlEncoded;\n // }\n\n // const urlDecoded = reqparams.urlEncoded;\n // // if (urlDecoded.substr(-1) === \"/\") {\n // // urlDecoded = urlDecoded.substr(0, urlDecoded.length - 1);\n // // }\n // debug(urlDecoded);\n\n // res.status(200).send(\"<html><body>\" +\n // \"<h1>DATA URL</h1>\" +\n // \"<h2><a href=\\\"\" + urlDecoded + \"\\\">\" + urlDecoded + \"</a></h2>\" +\n // \"<hr>\" +\n // \"<img src=\\\"\" + urlDecoded + \"\\\" />\" +\n // \"</body></html>\");\n // });\n\n // topRouter.use(serverOPDS_dataUrl_PATH, routerOPDS_dataUrl);\n\n // -------------------------------------------------------\n\n // tslint:disable-next-line:variable-name\n const routerOPDS_auth = express.Router({ strict: false });\n routerOPDS_auth.use(morgan(\"combined\", { stream: { write: (msg: any) => debug(msg) } }));\n\n routerOPDS_auth.use(trailingSlashRedirect);\n\n routerOPDS_auth.get(\"/\", (_req: express.Request, res: express.Response) => {\n\n const html = \"<html><body><h1>NOPE</h1></body></html>\";\n res.status(200).send(html);\n });\n\n routerOPDS_auth.param(\"urlEncoded\", (req, _res, next, value, _name) => {\n (req as IRequestPayloadExtension).urlEncoded = value;\n next();\n });\n\n routerOPDS_auth.get(\"/:\" + _urlEncoded + \"(*)\", async (req: express.Request, res: express.Response) => {\n\n const reqparams = (req as IRequestPayloadExtension).params;\n\n if (!reqparams.urlEncoded) {\n reqparams.urlEncoded = (req as IRequestPayloadExtension).urlEncoded;\n }\n\n const base64Payload = reqparams.urlEncoded;\n\n const refreshToken = (req.query as IRequestQueryParams).authRefresh;\n\n const isSecureHttp = req.secure ||\n req.protocol === \"https\" ||\n req.get(\"X-Forwarded-Proto\") === \"https\"\n ;\n const rootUrl = (isSecureHttp ? \"https://\" : \"http://\")\n + req.headers.host;\n\n try {\n const encrypted = Buffer.from(base64Payload, \"base64\"); // .toString(\"utf8\");\n\n const decrypteds: Buffer[] = [];\n const decryptStream = crypto.createDecipheriv(\"aes-256-cbc\",\n OPDS_AUTH_ENCRYPTION_KEY_BUFFER,\n OPDS_AUTH_ENCRYPTION_IV_BUFFER);\n decryptStream.setAutoPadding(false);\n const buff1 = decryptStream.update(encrypted);\n if (buff1) {\n decrypteds.push(buff1);\n }\n const buff2 = decryptStream.final();\n if (buff2) {\n decrypteds.push(buff2);\n }\n const decrypted = Buffer.concat(decrypteds);\n const nPaddingBytes = decrypted[decrypted.length - 1];\n const size = encrypted.length - nPaddingBytes;\n const decryptedStr = decrypted.slice(0, size).toString(\"utf8\");\n const decryptedJson = JSON.parse(decryptedStr);\n\n const authUrl = decryptedJson.authUrl;\n delete decryptedJson.authUrl;\n\n const targetUrl = decryptedJson.targetUrl;\n delete decryptedJson.targetUrl;\n\n // https://www.oauth.com/oauth2-servers/making-authenticated-requests/refreshing-an-access-token/\n if (refreshToken) {\n decryptedJson.grant_type = \"refresh_token\";\n decryptedJson.refresh_token = refreshToken;\n }\n\n // const grantType = decryptedJson.grant_type;\n // const username = decryptedJson.username;\n // const password = decryptedJson.password;\n\n // function encodeFormData(json: any) {\n // return Object.keys(json).map((key) => {\n // return encodeURIComponent_RFC3986(key) +\n // \"=\" + (json[key] ? encodeURIComponent_RFC3986(json[key]) : \"_\");\n // }).join(\"&\");\n // }\n // const encodedFormData = encodeFormData(decryptedJson);\n\n const failure = (err: any) => {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n };\n\n const success = async (response: request.RequestResponse) => {\n\n // Object.keys(response.headers).forEach((header: string) => {\n // debug(header + \" => \" + response.headers[header]);\n // });\n\n if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) {\n failure(\"HTTP CODE \" + response.statusCode);\n return;\n }\n\n let responseData: Buffer;\n try {\n responseData = await streamToBufferPromise(response);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n return;\n }\n try {\n const responseStr = responseData.toString(\"utf8\");\n const responseJson = JSON.parse(responseStr);\n // {\n // \"access_token\": \"XXX\",\n // \"token_type\": \"Bearer\",\n // \"expires_in\": 3600,\n // \"refresh_token\": \"YYYY\",\n // \"created_at\": 1574940691\n // }\n const targetUrl_ = rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_auth_PATH + \"/\")) +\n serverOPDS_browse_v2_PATH + \"/\" + encodeURIComponent_RFC3986(targetUrl) +\n \"?\" + _authResponse + \"=\" +\n encodeURIComponent_RFC3986(Buffer.from(JSON.stringify(responseJson)).toString(\"base64\")) +\n \"&\" + _authRequest + \"=\" + encodeURIComponent_RFC3986(base64Payload);\n\n const refreshTokenUrl = responseJson.refresh_token ? rootUrl + req.originalUrl.substr(0,\n req.originalUrl.indexOf(serverOPDS_auth_PATH + \"/\")) +\n serverOPDS_auth_PATH + \"/\" + encodeURIComponent_RFC3986(base64Payload) +\n \"?\" + _authRefresh + \"=\" + encodeURIComponent_RFC3986(responseJson.refresh_token) : undefined;\n\n decryptedJson.password = \"***\";\n res.status(200).send(`\n <html><body>\n <hr>\n <a href=\"${targetUrl_}\">${targetUrl}</a>\n <hr>\n <pre>${JSON.stringify(decryptedJson, null, 4)}</pre>\n <hr>\n <pre>${JSON.stringify(responseJson, null, 4)}</pre>\n <hr>\n ${refreshTokenUrl ? `<a href=\"${refreshTokenUrl}\">FORCE REFRESH TOKEN</a>` : \"\"}\n <hr>\n </body></html>\n `);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n return;\n }\n };\n\n const headers = {\n \"Accept\": \"application/json,application/xml\",\n \"Accept-Language\": \"en-UK,en-US;q=0.7,en;q=0.5\",\n \"Content-Type\": \"application/x-www-form-url-encoded\",\n \"User-Agent\": \"READIUM2\",\n };\n\n // No response streaming! :(\n // https://github.com/request/request-promise/issues/90\n const needsStreamingResponse = true;\n if (needsStreamingResponse) {\n request.post({\n form: decryptedJson,\n headers,\n method: \"POST\",\n uri: authUrl,\n })\n .on(\"response\", success)\n .on(\"error\", failure);\n } else {\n let response: requestPromise.FullResponse;\n try {\n // tslint:disable-next-line:await-promise no-floating-promises\n response = await requestPromise({\n form: decryptedJson,\n headers,\n method: \"POST\",\n resolveWithFullResponse: true,\n uri: authUrl,\n });\n } catch (err) {\n failure(err);\n return;\n }\n\n await success(response);\n }\n } catch (err) {\n debug(err);\n\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + \"--\" + \"</p></body></html>\");\n }\n });\n\n topRouter.use(serverOPDS_auth_PATH, routerOPDS_auth);\n}\n"]}
\No newline at end of file