Skip to content

Commit 629c5b8

Browse files
fix: add stricter checks in link for profile (#422)
Co-authored-by: Roshan Jossy <roshanjossey@gmail.com>
1 parent deef897 commit 629c5b8

3 files changed

Lines changed: 74 additions & 20 deletions

File tree

lib/get-user-details.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module.exports = getUserDetails;
22

33
const { UserNotFoundError } = require("./modules/errors");
4-
const { generateValidLink } = require("./modules/helpers");
4+
const { generateValidProfileLink } = require("./modules/helpers");
55

66
async function getUserDetails({ octokit, username }) {
77
// TODO: optimization, if commenting user is the user we're adding we can avoid an api call
@@ -33,6 +33,6 @@ async function getUserDetails({ octokit, username }) {
3333
login,
3434
name: name || username,
3535
avatar_url,
36-
profile: generateValidLink(blog || html_url, username),
36+
profile: generateValidProfileLink(blog, html_url),
3737
};
3838
}

lib/modules/helpers.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
function generateValidLink(url, username = '') {
2-
let validLink = url
3-
const validRegex = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$/
4-
5-
if (!validLink.startsWith("http")) validLink = `http://${url}/`
6-
if (!validLink.match(validRegex)) validLink = `https://github.com/${username}/`
7-
8-
return validLink
1+
function generateValidProfileLink(blog, githubProfileURL) {
2+
const validRegexWithScheme = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/
3+
const validRegexWithoutScheme = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/
4+
if (validRegexWithScheme.test(blog)) return blog;
5+
if (validRegexWithoutScheme.test(blog)) return `http://${blog}`;
6+
return githubProfileURL || ''
97
}
108

119
module.exports = {
12-
generateValidLink
10+
generateValidProfileLink
1311
}

test/unit/helpers.test.js

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,75 @@
1-
const { generateValidLink } = require('../../lib/modules/helpers');
1+
const { generateValidProfileLink } = require('../../lib/modules/helpers');
22

3-
describe('generateValidLink', () => {
4-
const username = 'tenshiAMD'
3+
describe('generateValidProfileLink', () => {
4+
const githubProfileUrl = 'https://github.com/tenshiAMD'
55

6-
test('return valid link - no protocol', async () => {
6+
test('returns valid link - valid URL format having `https` protocol', async () => {
7+
let url = 'https://tenshiamd.com';
8+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
9+
10+
expect(validUrl).toEqual(url);
11+
});
12+
13+
test('returns valid link - valid URL format having `http` protocol', async () => {
14+
let url = 'http://tenshiamd.com';
15+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
16+
17+
expect(validUrl).toEqual(url);
18+
});
19+
20+
test('returns valid link - valid URL format with `null` githubProfileUrl', async () => {
21+
let url = 'https://tenshiamd.com';
22+
let validUrl = generateValidProfileLink(url, null);
23+
24+
expect(validUrl).toEqual(url);
25+
});
26+
27+
test('returns valid link - valid URL format with `http` in between', async () => {
28+
let url = 'tenshhttpiamd.com';
29+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
30+
31+
expect(validUrl).toEqual(url);
32+
});
33+
34+
test('returns valid link - valid URL format with `https` in between', async () => {
35+
let url = 'tenshhttpsiamd.com';
36+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
37+
38+
expect(validUrl).toEqual(url);
39+
});
40+
41+
test('returns valid link - no protocol', async () => {
742
let url = 'tenshiamd.com';
8-
let validUrl = generateValidLink(url, username);
43+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
44+
45+
expect(validUrl).toEqual(url);
46+
});
47+
48+
test('returns valid link - no protocol and starting with `http`', async () => {
49+
let url = 'httptenshiamd.com';
50+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
51+
52+
expect(validUrl).toEqual(url);
53+
});
54+
55+
test('returns valid link - no protocol and starting with `https`', async () => {
56+
let url = 'httpstenshiamd.com';
57+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
58+
59+
expect(validUrl).toEqual(url);
60+
});
61+
62+
test('returns valid link - incomplete URL format', async () => {
63+
let url = 'contributor';
64+
let validUrl = generateValidProfileLink(url, githubProfileUrl);
965

10-
expect(validUrl).toEqual(`http://${url}/`);
66+
expect(validUrl).toEqual(githubProfileUrl);
1167
});
1268

13-
test('return valid link - incomplete URL format', async () => {
69+
test('returns valid link - incomplete URL format with `null` githubProfileUrl', async () => {
1470
let url = 'contributor';
15-
let validUrl = generateValidLink(url, username);
71+
let validUrl = generateValidProfileLink(url, null);
1672

17-
expect(validUrl).toEqual(`https://github.com/${username}/`);
73+
expect(validUrl).toEqual('');
1874
});
1975
});

0 commit comments

Comments
 (0)