diff --git a/swh/web/assets/src/bundles/save/index.js b/swh/web/assets/src/bundles/save/index.js --- a/swh/web/assets/src/bundles/save/index.js +++ b/swh/web/assets/src/bundles/save/index.js @@ -258,20 +258,20 @@ // additional checks for well known code hosting providers switch (originUrl.hostname) { case 'github.com': - validUrl = isGitRepoUrl(originUrl.toString(), 'github.com'); + validUrl = isGitRepoUrl(originUrl); break; case 'git.code.sf.net': - validUrl = isGitRepoUrl(originUrl.toString(), 'git.code.sf.net/p'); + validUrl = isGitRepoUrl(originUrl, '/p/'); break; case 'bitbucket.org': - validUrl = isGitRepoUrl(originUrl.toString(), 'bitbucket.org'); + validUrl = isGitRepoUrl(originUrl); break; default: if (originUrl.hostname.startsWith('gitlab.')) { - validUrl = isGitRepoUrl(originUrl.toString(), originUrl.hostname); + validUrl = isGitRepoUrl(originUrl); } break; } diff --git a/swh/web/assets/src/utils/functions.js b/swh/web/assets/src/utils/functions.js --- a/swh/web/assets/src/utils/functions.js +++ b/swh/web/assets/src/utils/functions.js @@ -37,11 +37,16 @@ }); } -export function isGitRepoUrl(url, domain) { - let endOfPattern = '\\/[\\w\\.-]+\\/?(?!=.git)(?:\\.git\\/?)?$'; - let pattern = `(?:git|https?|git@)(?:\\:\\/\\/)?${domain}[/|:][\\w\\.\\-\\/]+?` + endOfPattern; - let re = new RegExp(pattern); - return re.test(url); +export function isGitRepoUrl(url, pathPrefix = '/') { + let allowedProtocols = ['http:', 'https:', 'git:']; + if (allowedProtocols.find(protocol => protocol === url.protocol) === undefined) { + return false; + } + if (!url.pathname.startsWith(pathPrefix)) { + return false; + } + let re = new RegExp('[\\w\\.-]+\\/?(?!=.git)(?:\\.git\\/?)?$'); + return re.test(url.pathname.slice(pathPrefix.length)); }; export function removeUrlFragment() {