Skip to content

Commit

Permalink
fix: urldecode of special character
Browse files Browse the repository at this point in the history
  • Loading branch information
fengkx committed Jan 16, 2021
1 parent e864040 commit c031403
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 9 deletions.
5 changes: 3 additions & 2 deletions source/controlers/rss.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import twoKeyReply from '../utils/two-key-reply';
import errors from '../utils/errors';
import { MContext, Next } from '../types/ctx';
import { isNone } from '../types/option';
import { decodeUrl } from '../utils/decodeUrl';

export async function sub(ctx: MContext, next: Next): Promise<void> {
const { feedUrl, chat, lang } = ctx.state;
Expand Down Expand Up @@ -84,7 +85,7 @@ export async function rss(ctx: MContext, next: Next): Promise<void> {
builder.push(
`${feed.feed_title.trim()}: <a href="${encodeURI(
feed.url.trim()
)}">${decodeURI(feed.url.trim())}</a>`
)}">${decodeUrl(feed.url.trim())}</a>`
);
});
} else {
Expand Down Expand Up @@ -154,7 +155,7 @@ export async function getUrlById(ctx: MContext, next: Next): Promise<void> {
const { text } = ctx.message;
const feed_id = text.match(/^\[(\d+)] (.+)/)[1];
const feed = await RSS.getFeedById(parseInt(feed_id));
ctx.state.feedUrl = decodeURI(feed.url);
ctx.state.feedUrl = decodeUrl(feed.url);
await next();
}

Expand Down
3 changes: 2 additions & 1 deletion source/middlewares/get-url-by-title.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { MContext, Next } from '../types/ctx';

import { getFeedsByTitle } from '../proxies/rss-feed';
import errors from '../utils/errors';
import { decodeUrl } from '../utils/decodeUrl';
export default async (ctx: MContext, next: Next): Promise<void> => {
const me = await ctx.telegram.getMe();
const myId = me.id;
Expand All @@ -14,6 +15,6 @@ export default async (ctx: MContext, next: Next): Promise<void> => {
if (feeds.length > 1) throw errors.newCtrlErr('SAME_NAME');
if (feeds.length === 0) throw errors.newCtrlErr('UNSUBTHIS_USAGE');
ctx.state.feed = feeds[0];
ctx.state.feedUrl = decodeURI(feeds[0].url);
ctx.state.feedUrl = decodeUrl(feeds[0].url);
await next();
};
3 changes: 2 additions & 1 deletion source/middlewares/get-url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import errors from '../utils/errors';
import { getSubscribedFeedsByUserId } from '../proxies/rss-feed';
import i18n from '../i18n';
import { MContext, Next } from '../types/ctx';
import { decodeUrl } from '../utils/decodeUrl';

export default async (ctx: MContext, next: Next): Promise<void> => {
const { lang } = ctx.state;
Expand Down Expand Up @@ -41,6 +42,6 @@ export default async (ctx: MContext, next: Next): Promise<void> => {
} else if (!url.startsWith('http') && !url.startsWith('https')) {
throw errors.newCtrlErr('FEED_URL_NOT_PARSE');
}
ctx.state.feedUrl = decodeURI(url);
ctx.state.feedUrl = decodeUrl(url);
await next();
};
3 changes: 2 additions & 1 deletion source/middlewares/sub-multi-url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { MContext, Next } from '../types/ctx';
import { isSome } from '../types/option';
import { Feed } from '../types/feed';
import { parseString } from '../parser/parse';
import { decodeUrl } from '../utils/decodeUrl';

export default async (ctx: MContext, next: Next): Promise<void> => {
const urls = ctx.message.text.match(
Expand All @@ -15,7 +16,7 @@ export default async (ctx: MContext, next: Next): Promise<void> => {
const feedsReady = await Promise.all(
urls.map(
async (url): Promise<Partial<Feed>> => {
url = decodeURI(url); // idempotent operation just do it first
url = decodeUrl(url); // decode first
const feed = await getFeedByUrl(url);
if (isSome(feed)) {
return feed.value;
Expand Down
5 changes: 3 additions & 2 deletions source/middlewares/test-url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getFeedByUrl } from '../proxies/rss-feed';
import { MContext, Next } from '../types/ctx';
import { isNone, isSome } from '../types/option';
import { parseString } from '../parser/parse';
import { decodeUrl } from '../utils/decodeUrl';

export default async (ctx: MContext, next: Next): Promise<void> => {
const url = encodeURI(ctx.state.feedUrl);
Expand All @@ -17,12 +18,12 @@ export default async (ctx: MContext, next: Next): Promise<void> => {
} else {
try {
const res = await got(url);
ctx.state.feedUrl = decodeURI(res.url); // handle redirect
ctx.state.feedUrl = decodeUrl(res.url); // handle redirect
const feedOption = await isFeedValid(res.body);
if (isNone(feedOption)) {
// feed is NOT valid, try to find feed by link tag with type contain rss/atom
ctx.state.feedUrls = await findFeed(res.body, res.url);
ctx.state.feedUrls = ctx.state.feedUrls.map(decodeURI);
ctx.state.feedUrls = ctx.state.feedUrls.map(decodeUrl);
/* eslint no-case-declarations: 0*/
switch (ctx.state.feedUrls.length) {
case 0:
Expand Down
4 changes: 3 additions & 1 deletion source/proxies/rss-feed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ import errors from '../utils/errors';
import { Feed } from '../types/feed';
import { Subscribe } from '../types/subscribe';
import { isSome, Option, Optional, Some } from '../types/option';
import { decodeUrl } from '../utils/decodeUrl';

export async function sub(
userId: number,
feedUrl: string,
feedTitle: string
): Promise<string> {
feedUrl = decodeURI(feedUrl);
feedUrl = decodeUrl(feedUrl);
const feed = await db<Feed>('rss_feed').where('url', feedUrl).first();
if (feed) {
const res = await db<Subscribe>('subscribes')
Expand Down Expand Up @@ -211,6 +212,7 @@ export async function handleRedirect(
realUrl: string
): Promise<void> {
try {
realUrl = decodeUrl(realUrl);
const oldFeed: Option<Feed> = Optional(
await db<Feed>('rss_feed').where('url', url).first()
);
Expand Down
6 changes: 6 additions & 0 deletions source/utils/decodeUrl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export function decodeUrl(url) {
while (url !== decodeURIComponent(url)) {
url = decodeURIComponent(url);
}
return url;
}
2 changes: 1 addition & 1 deletion source/utils/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ async function fetch(feedModal: Feed): Promise<Option<any[]>> {
logger.debug(`fetching ${feedUrl}`);
const res = await got.get(encodeURI(feedUrl));
if (encodeURI(feedUrl) !== res.url && Object.is(res.statusCode, 301)) {
await handleRedirect(feedUrl, decodeURI(res.url));
await handleRedirect(feedUrl, res.url);
}
const feed = await parseString(res.body);

Expand Down

0 comments on commit c031403

Please sign in to comment.