aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package-lock.json31
-rw-r--r--package.json2
-rw-r--r--src/client/views/nodes/WebBox.tsx34
-rw-r--r--src/server/DashUploadUtils.ts1
-rw-r--r--src/server/RouteManager.ts32
-rw-r--r--src/server/index.ts5
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