diff --git a/package.json b/package.json --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "showdown": "^1.9.1", "typeface-alegreya": "^1.1.13", "typeface-alegreya-sans": "^1.1.13", - "validate.js": "^0.13.1", "waypoints": "^4.0.1", "whatwg-fetch": "^3.5.0" }, 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 @@ -7,7 +7,6 @@ import {handleFetchError, csrfPost, isGitRepoUrl, htmlAlert, removeUrlFragment} from 'utils/functions'; import {swhSpinnerSrc} from 'utils/constants'; -import {validate} from 'validate.js'; let saveRequestsTable; @@ -238,38 +237,46 @@ } export function validateSaveOriginUrl(input) { - let originUrl = input.value.trim(); - let validUrl = validate({website: originUrl}, { - website: { - url: { - schemes: ['http', 'https', 'svn', 'git'] - } - } - }) === undefined; let originType = $('#swh-input-visit-type').val(); - if (originType === 'git' && validUrl) { + let originUrl = null; + let validUrl = true; + + try { + originUrl = new URL(input.value.trim()); + } catch (TypeError) { + validUrl = false; + } + + if (validUrl) { + let allowedProtocols = ['http:', 'https:', 'svn:', 'git:']; + validUrl = ( + allowedProtocols.find(protocol => protocol === originUrl.protocol) !== undefined + ); + } + + if (validUrl && originType === 'git') { // additional checks for well known code hosting providers - let githubIdx = originUrl.indexOf('://github.com'); - let gitlabIdx = originUrl.indexOf('://gitlab.'); - let gitSfIdx = originUrl.indexOf('://git.code.sf.net'); - let bitbucketIdx = originUrl.indexOf('://bitbucket.org'); - if (githubIdx !== -1 && githubIdx <= 5) { - validUrl = isGitRepoUrl(originUrl, 'github.com'); - } else if (gitlabIdx !== -1 && gitlabIdx <= 5) { - let startIdx = gitlabIdx + 3; - let idx = originUrl.indexOf('/', startIdx); - if (idx !== -1) { - let gitlabDomain = originUrl.substr(startIdx, idx - startIdx); - validUrl = isGitRepoUrl(originUrl, gitlabDomain); - } else { - validUrl = false; - } - } else if (gitSfIdx !== -1 && gitSfIdx <= 5) { - validUrl = isGitRepoUrl(originUrl, 'git.code.sf.net/p'); - } else if (bitbucketIdx !== -1 && bitbucketIdx <= 5) { - validUrl = isGitRepoUrl(originUrl, 'bitbucket.org'); + switch (originUrl.hostname) { + case 'github.com': + validUrl = isGitRepoUrl(originUrl.toString(), 'github.com'); + break; + + case 'git.code.sf.net': + validUrl = isGitRepoUrl(originUrl.toString(), 'git.code.sf.net/p'); + break; + + case 'bitbucket.org': + validUrl = isGitRepoUrl(originUrl.toString(), 'bitbucket.org'); + break; + + default: + if (originUrl.hostname.startsWith('gitlab.')) { + validUrl = isGitRepoUrl(originUrl.toString(), originUrl.hostname); + } + break; } } + if (validUrl) { input.setCustomValidity(''); } else { diff --git a/yarn.lock b/yarn.lock --- a/yarn.lock +++ b/yarn.lock @@ -12846,11 +12846,6 @@ spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate.js@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/validate.js/-/validate.js-0.13.1.tgz#b58bfac04a0f600a340f62e5227e70d95971e92a" - integrity sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g== - validator@^10.11.0: version "10.11.0" resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"