diff options
-rw-r--r-- | package-lock.json | 31 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | src/client/views/nodes/WebBox.tsx | 34 | ||||
-rw-r--r-- | src/server/DashUploadUtils.ts | 1 | ||||
-rw-r--r-- | src/server/RouteManager.ts | 32 | ||||
-rw-r--r-- | src/server/index.ts | 5 |
6 files changed, 84 insertions, 21 deletions
diff --git a/package-lock.json b/package-lock.json index ef3ecc9f3..045e9ce3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6728,6 +6728,29 @@ "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-0.1.1.tgz", "integrity": "sha512-UAjpXmokENeOyzfLwL0+zQ502lXyg6pkzVUmRjtljOH9dR/YdEYQhWrQ/O14hmH5/1L7jv1aOupU4Zi3Y8+iow==" }, + "html-to-text": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", + "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", + "requires": { + "he": "^1.2.0", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0" + }, + "dependencies": { + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -17409,6 +17432,14 @@ "minimalistic-assert": "^1.0.0" } }, + "web-request": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/web-request/-/web-request-1.0.7.tgz", + "integrity": "sha1-twxCs81FV3noLbaIYlOySR8r1Wk=", + "requires": { + "request": "^2.69.0" + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", diff --git a/package.json b/package.json index 7ae3cb0d7..cb5a70f3c 100644 --- a/package.json +++ b/package.json @@ -167,6 +167,7 @@ "googlephotos": "^0.2.5", "howler": "^2.1.3", "html-to-image": "^0.1.0", + "html-to-text": "^5.1.1", "i": "^0.3.6", "ibm-watson": "^5.3.1", "image-data-uri": "^2.0.1", @@ -250,6 +251,7 @@ "typescript-collections": "^1.3.3", "url-loader": "^1.1.2", "uuid": "^3.4.0", + "web-request": "^1.0.7", "webrtc-adapter": "^7.3.0", "wikijs": "^6.0.1", "word-extractor": "^0.3.0", diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx index 2f8b6167f..24cb08c4c 100644 --- a/src/client/views/nodes/WebBox.tsx +++ b/src/client/views/nodes/WebBox.tsx @@ -1,30 +1,31 @@ import { library } from "@fortawesome/fontawesome-svg-core"; import { faStickyNote } from '@fortawesome/free-solid-svg-icons'; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { action, computed, observable } from "mobx"; import { observer } from "mobx-react"; import { Doc, FieldResult } from "../../../new_fields/Doc"; +import { documentSchema } from "../../../new_fields/documentSchemas"; import { HtmlField } from "../../../new_fields/HtmlField"; import { InkTool } from "../../../new_fields/InkField"; import { makeInterface } from "../../../new_fields/Schema"; import { Cast, NumCast } from "../../../new_fields/Types"; import { WebField } from "../../../new_fields/URLField"; -import { emptyFunction, returnOne, Utils } from "../../../Utils"; +import { Utils, returnOne, emptyFunction } from "../../../Utils"; import { Docs } from "../../documents/Documents"; +import { DragManager } from "../../util/DragManager"; +import { ImageUtils } from "../../util/Import & Export/ImageUtils"; import { SelectionManager } from "../../util/SelectionManager"; -import { CollectionFreeFormView } from "../collections/collectionFreeForm/CollectionFreeFormView"; +import { DocAnnotatableComponent } from "../DocComponent"; import { DocumentDecorations } from "../DocumentDecorations"; import { InkingControl } from "../InkingControl"; import { FieldView, FieldViewProps } from './FieldView'; import { KeyValueBox } from "./KeyValueBox"; import "./WebBox.scss"; import React = require("react"); -import { DocAnnotatableComponent } from "../DocComponent"; -import { documentSchema } from "../../../new_fields/documentSchemas"; -import { Id } from "../../../new_fields/FieldSymbols"; -import { DragManager } from "../../util/DragManager"; -import { ImageUtils } from "../../util/Import & Export/ImageUtils"; -import { select } from "async"; +import * as WebRequest from 'web-request'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CollectionFreeFormView } from "../collections/collectionFreeForm/CollectionFreeFormView"; +const htmlToText = require("html-to-text"); + library.add(faStickyNote); @@ -45,10 +46,14 @@ export class WebBox extends DocAnnotatableComponent<FieldViewProps, WebDocument> @observable private _pressX: number = 0; @observable private _pressY: number = 0; - componentDidMount() { + async componentDidMount() { + this.setURL(); + + document.addEventListener("pointerup", this.onLongPressUp); + document.addEventListener("pointermove", this.onLongPressMove); const field = Cast(this.props.Document[this.props.fieldKey], WebField); - if (field && field.url.href.indexOf("youtube") !== -1) { + if (field?.url.href.indexOf("youtube") !== -1) { const youtubeaspect = 400 / 315; const nativeWidth = NumCast(this.layoutDoc._nativeWidth); const nativeHeight = NumCast(this.layoutDoc._nativeHeight); @@ -57,12 +62,11 @@ export class WebBox extends DocAnnotatableComponent<FieldViewProps, WebDocument> this.layoutDoc._nativeHeight = NumCast(this.layoutDoc._nativeWidth) / youtubeaspect; this.layoutDoc._height = NumCast(this.layoutDoc._width) / youtubeaspect; } + } else if (field?.url) { + var result = await WebRequest.get(Utils.CorsProxy(field.url.href)); + this.dataDoc.text = htmlToText.fromString(result.content); } - this.setURL(); - - document.addEventListener("pointerup", this.onLongPressUp); - document.addEventListener("pointermove", this.onLongPressMove); } componentWillUnmount() { diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts index cf78af60a..bc5d1d95b 100644 --- a/src/server/DashUploadUtils.ts +++ b/src/server/DashUploadUtils.ts @@ -102,7 +102,6 @@ export namespace DashUploadUtils { const writeStream = createWriteStream(serverPathToFile(Directory.text, textFilename)); writeStream.write(result.text, error => error ? reject(error) : resolve()); }); - console.log(MoveParsedFile(file, Directory.pdfs)); return MoveParsedFile(file, Directory.pdfs); } diff --git a/src/server/RouteManager.ts b/src/server/RouteManager.ts index 63e957cd1..d8265582e 100644 --- a/src/server/RouteManager.ts +++ b/src/server/RouteManager.ts @@ -2,6 +2,7 @@ import RouteSubscriber from "./RouteSubscriber"; import { DashUserModel } from "./authentication/models/user_model"; import { Request, Response, Express } from 'express'; import { cyan, red, green } from 'colors'; +import { Utils } from "../client/northstar/utils/Utils"; export enum Method { GET, @@ -86,6 +87,7 @@ export default class RouteManager { const { method, subscription, secureHandler, publicHandler, errorHandler } = initializer; const isRelease = this._isRelease; + let redirected = ""; const supervised = async (req: Request, res: Response) => { let { user } = req; const { originalUrl: target } = req; @@ -118,13 +120,33 @@ export default class RouteManager { res.redirect("/login"); } } - setTimeout(() => { - if (!res.headersSent) { - console.log(red(`Initiating fallback for ${target}. Please remove dangling promise from route handler`)); + if (!res.headersSent && req.headers.referer?.includes("corsProxy")) { + const url = decodeURIComponent(req.headers.referer!); + const start = url.match(/.*corsProxy\//)![0]; + const original = url.replace(start, ""); + const theurl = original.match(/http[s]?:\/\/[^\/]*/)![0]; + const newdirect = start + encodeURIComponent(theurl + target); + if (newdirect !== redirected) { + redirected = newdirect; + console.log("redirect relative path: " + (theurl + target)); + res.redirect(redirected); + } + } + else { + if (target.startsWith("/doc/")) { + !res.headersSent && setTimeout(() => { + if (!res.headersSent) { + res.redirect("/login"); + console.log(red(`Initiating fallback for ${target}. Please remove dangling promise from route handler`)); + const warning = `request to ${target} fell through - this is a fallback response`; + res.send({ warning }); + } + }, 1000); + } else { const warning = `request to ${target} fell through - this is a fallback response`; res.send({ warning }); } - }, 1000); + } }; const subscribe = (subscriber: RouteSubscriber | string) => { let route: string; @@ -133,7 +155,7 @@ export default class RouteManager { } else { route = subscriber.build; } - if (!/^\/$|^\/[A-Za-z]+(\/\:[A-Za-z?_]+)*$/g.test(route)) { + if (!/^\/$|^\/[A-Za-z\*]+(\/\:[A-Za-z?_\*]+)*$/g.test(route)) { this.failedRegistrations.push({ reason: RegistrationError.Malformed, route diff --git a/src/server/index.ts b/src/server/index.ts index 10205314a..c4c05157a 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -114,6 +114,11 @@ function routeSetter({ isRelease, addSupervisedRoute, logRegistrationOutcome }: } }); + addSupervisedRoute({ + method: Method.GET, + subscription: "/*", + secureHandler: ({ res }) => { } + }); logRegistrationOutcome(); // initialize the web socket (bidirectional communication: if a user changes |