mirror of
https://github.com/matrix-org/matrix-hookshot.git
synced 2025-03-10 21:19:13 +00:00
Make sure our feed accountData is valid
This commit is contained in:
parent
9217112c3e
commit
428ca02456
@ -41,6 +41,7 @@
|
|||||||
"@octokit/rest": "^18.10.0",
|
"@octokit/rest": "^18.10.0",
|
||||||
"@octokit/webhooks": "^9.1.2",
|
"@octokit/webhooks": "^9.1.2",
|
||||||
"@uiw/react-codemirror": "^4.5.3",
|
"@uiw/react-codemirror": "^4.5.3",
|
||||||
|
"ajv": "^8.11.0",
|
||||||
"axios": "^0.24.0",
|
"axios": "^0.24.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
@ -70,6 +71,7 @@
|
|||||||
"@prefresh/snowpack": "^3.1.2",
|
"@prefresh/snowpack": "^3.1.2",
|
||||||
"@snowpack/plugin-sass": "^1.4.0",
|
"@snowpack/plugin-sass": "^1.4.0",
|
||||||
"@snowpack/plugin-typescript": "^1.2.1",
|
"@snowpack/plugin-typescript": "^1.2.1",
|
||||||
|
"@types/ajv": "^1.0.0",
|
||||||
"@types/chai": "^4.2.22",
|
"@types/chai": "^4.2.22",
|
||||||
"@types/cors": "^2.8.12",
|
"@types/cors": "^2.8.12",
|
||||||
"@types/express": "^4.17.13",
|
"@types/express": "^4.17.13",
|
||||||
|
@ -5,6 +5,7 @@ import { FeedConnection } from "../Connections";
|
|||||||
import LogWrapper from "../LogWrapper";
|
import LogWrapper from "../LogWrapper";
|
||||||
import { MessageQueue } from "../MessageQueue";
|
import { MessageQueue } from "../MessageQueue";
|
||||||
|
|
||||||
|
import Ajv from "ajv";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Parser from "rss-parser";
|
import Parser from "rss-parser";
|
||||||
|
|
||||||
@ -32,6 +33,19 @@ interface AccountData {
|
|||||||
[url: string]: string[],
|
[url: string]: string[],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const accountDataSchema = {
|
||||||
|
type: 'object',
|
||||||
|
patternProperties: {
|
||||||
|
"https?://.+": {
|
||||||
|
type: 'array',
|
||||||
|
items: { type: 'string' },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
additionalProperties: false,
|
||||||
|
};
|
||||||
|
const ajv = new Ajv();
|
||||||
|
const validateAccountData = ajv.compile<AccountData>(accountDataSchema);
|
||||||
|
|
||||||
function stripHtml(input: string): string {
|
function stripHtml(input: string): string {
|
||||||
return input.replace(/<[^>]*?>/g, '');
|
return input.replace(/<[^>]*?>/g, '');
|
||||||
}
|
}
|
||||||
@ -64,16 +78,25 @@ export class FeedReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async loadSeenEntries(): Promise<void> {
|
private async loadSeenEntries(): Promise<void> {
|
||||||
const accountData = await this.matrixClient.getAccountData<AccountData>(FeedReader.seenEntriesEventType).catch((err: any) => {
|
try {
|
||||||
|
const accountData = await this.matrixClient.getAccountData<any>(FeedReader.seenEntriesEventType).catch((err: any) => {
|
||||||
if (err.statusCode === 404) {
|
if (err.statusCode === 404) {
|
||||||
return {} as AccountData;
|
return {};
|
||||||
} else {
|
} else {
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (!validateAccountData(accountData)) {
|
||||||
|
const errors = validateAccountData.errors!.map(e => `${e.instancePath} ${e.message}`);
|
||||||
|
throw new Error(`Invalid account data: ${errors.join(', ')}`);
|
||||||
|
}
|
||||||
for (const url in accountData) {
|
for (const url in accountData) {
|
||||||
this.seenEntries.set(url, accountData[url]);
|
this.seenEntries.set(url, accountData[url]);
|
||||||
}
|
}
|
||||||
|
} catch (err: unknown) {
|
||||||
|
log.error(`Failed to load seen feed entries from accountData: ${err}. This may result in skipped entries`);
|
||||||
|
// no need to wipe it manually, next saveSeenEntries() will make it right
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async saveSeenEntries(): Promise<void> {
|
private async saveSeenEntries(): Promise<void> {
|
||||||
|
27
yarn.lock
27
yarn.lock
@ -1288,6 +1288,13 @@
|
|||||||
"@napi-rs/cli" "^2.2.0"
|
"@napi-rs/cli" "^2.2.0"
|
||||||
shelljs "^0.8.4"
|
shelljs "^0.8.4"
|
||||||
|
|
||||||
|
"@types/ajv@^1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/ajv/-/ajv-1.0.0.tgz#4fb2440742f2f6c30e7fb0797b839fc6f696682a"
|
||||||
|
integrity sha1-T7JEB0Ly9sMOf7B5e4OfxvaWaCo=
|
||||||
|
dependencies:
|
||||||
|
ajv "*"
|
||||||
|
|
||||||
"@types/body-parser@*":
|
"@types/body-parser@*":
|
||||||
version "1.19.2"
|
version "1.19.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
|
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
|
||||||
@ -1737,6 +1744,16 @@ aggregate-error@^3.0.0, aggregate-error@^3.1.0:
|
|||||||
clean-stack "^2.0.0"
|
clean-stack "^2.0.0"
|
||||||
indent-string "^4.0.0"
|
indent-string "^4.0.0"
|
||||||
|
|
||||||
|
ajv@*, ajv@^8.11.0:
|
||||||
|
version "8.11.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
|
||||||
|
integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
|
||||||
|
dependencies:
|
||||||
|
fast-deep-equal "^3.1.1"
|
||||||
|
json-schema-traverse "^1.0.0"
|
||||||
|
require-from-string "^2.0.2"
|
||||||
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
|
ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
|
||||||
version "6.12.6"
|
version "6.12.6"
|
||||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
|
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
|
||||||
@ -4331,6 +4348,11 @@ json-schema-traverse@^0.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||||
|
|
||||||
|
json-schema-traverse@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
|
||||||
|
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
|
||||||
|
|
||||||
json-schema@0.4.0:
|
json-schema@0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
|
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
|
||||||
@ -6055,6 +6077,11 @@ require-directory@^2.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||||
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
|
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
|
||||||
|
|
||||||
|
require-from-string@^2.0.2:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
||||||
|
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
||||||
|
|
||||||
resolve-alpn@^1.0.0:
|
resolve-alpn@^1.0.0:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
|
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user