Add support for SSH-style git repo addresses (#835)

This allows nodes to be pulled from git repositories that:
1. Require authentication
2. Are located on a computer that does not have any special software
   beyond an SSH server to serve up git repos
3. Are hosted on sites that exclusively allow SSH access

I have also cleaned up the JavaScript regex for identifying valid HTTP
addresses. Due to an unescaped '.' and the lack of a count on the first
group, it wasn't doing a whole lot anyway -- just checking that the very
first character wasn't invalid.
This commit is contained in:
guill 2024-07-04 05:29:40 -07:00 committed by GitHub
parent cac3fde2aa
commit 7e84de1ba0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 6 deletions

View File

@ -201,7 +201,7 @@ cm_ctx = Ctx()
def install_node(node_name, is_all=False, cnt_msg=''): def install_node(node_name, is_all=False, cnt_msg=''):
if '://' in node_name: if core.is_valid_url(node_name):
# install via urls # install via urls
res = core.gitclone_install([node_name]) res = core.gitclone_install([node_name])
if not res: if not res:

View File

@ -515,10 +515,16 @@ class GitProgress(RemoteProgress):
def is_valid_url(url): def is_valid_url(url):
try: try:
# Check for HTTP/HTTPS URL format
result = urlparse(url) result = urlparse(url)
return all([result.scheme, result.netloc]) if all([result.scheme, result.netloc]):
except ValueError: return True
return False finally:
# Check for SSH git URL format
pattern = re.compile(r"^(.+@|ssh:\/\/).+:.+$")
if pattern.match(url):
return True
return False
def gitclone_install(files, instant_execution=False, msg_prefix=''): def gitclone_install(files, instant_execution=False, msg_prefix=''):

View File

@ -34,8 +34,9 @@ function isValidURL(url) {
if(url.includes('&')) if(url.includes('&'))
return false; return false;
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/; const http_pattern = /^(https?|ftp):\/\/[^\s$?#]+$/;
return pattern.test(url); const ssh_pattern = /^(.+@|ssh:\/\/).+:.+$/;
return http_pattern.test(url) || ssh_pattern.test(url);
} }
export async function install_pip(packages) { export async function install_pip(packages) {