Files
RepoFoundry/src/lib/validate.sh
T
Tirsvad e960dd9da8 Set the project license in config.env; AGPL-3.0 default only for a public GitHub project
- PROJECT_LICENSE (a Gitea license key, or none) is read, checked and never asked
- Without it AGPL-3.0 applies only when GitHub is chosen and the project is public
- The license is applied on Gitea with or without GitHub, and checked against the server first
- Plan and summary name the license and where it came from
- MIL-006 accepted; README and config.env.example document the key
- Tests: new test-license.sh; existing tests use a public project where they expect AGPL-3.0

Task: MIL-006#1
Task: MIL-006#2
Task: MIL-006#3
Task: MIL-006#4
Refs #44
Refs #45
Refs #46
Refs #50
2026-10-07 13:08:49 +08:00

78 lines
2.3 KiB
Bash

# shellcheck shell=bash
# shellcheck disable=SC2004,SC2034,SC2154 # shared state and arrays are declared in constants.sh
# validate.sh - Validators for names, URLs, tokens, ports and intervals.
#
# Part of create-project.sh: sourced by it, never run on its own.
#
# Provides: is_valid_framework_repo, is_valid_repo_name, is_valid_gitea_owner, is_valid_github_owner, is_valid_description, is_valid_directory, is_valid_base_url, is_valid_request_url, is_valid_token, is_valid_port, is_valid_interval, normalize_url
is_valid_repo_name() {
local name="$1"
[[ $name =~ ^[A-Za-z0-9._-]{1,100}$ ]] || return 1
[[ $name != . && $name != .. && $name != *.git ]]
}
is_valid_gitea_owner() {
[[ $1 =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,38}$ ]]
}
is_valid_github_owner() {
[[ $1 =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,37}[A-Za-z0-9])?$ ]]
}
is_valid_description() {
((${#1} <= MAX_DESCRIPTION_LENGTH)) && ! has_control_character "$1"
}
is_valid_directory() {
local path="$1"
[[ -n $path && ${#path} -le 4096 && $path != -* ]] &&
! has_control_character "$path"
}
# https URL without user info, query or fragment, so it can never carry a
# credential.
is_valid_base_url() {
local pattern='^https://[A-Za-z0-9.-]+(:[0-9]{1,5})?(/[A-Za-z0-9._~%+/-]*)?$'
[[ $1 =~ $pattern ]]
}
# Like is_valid_base_url but a query string is allowed (for API requests).
is_valid_request_url() {
local pattern='^https://[A-Za-z0-9.-]+(:[0-9]{1,5})?(/[A-Za-z0-9._~%+/-]*)?(\?[A-Za-z0-9._~%+=&,-]*)?$'
[[ $1 =~ $pattern ]]
}
# Access tokens: no quotes, backslashes or whitespace, so a token cannot
# break out of the curl configuration it is written to.
is_valid_token() {
[[ $1 =~ ^[A-Za-z0-9_.~+/=-]{8,255}$ ]]
}
# OWNER/NAME of the framework repository on Gitea.
is_valid_framework_repo() {
[[ $1 =~ ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ && $1 != */.. && $1 != ../* && $1 != ./* && $1 != */. ]]
}
is_valid_port() {
[[ $1 =~ ^[0-9]{1,5}$ ]] && ((10#$1 >= 1 && 10#$1 <= 65535))
}
# A Gitea license key such as AGPL-3.0 or MIT, or the word none.
is_valid_license() {
[[ -n $1 && ${#1} -le 64 && $1 =~ ^[A-Za-z0-9.+-]+$ ]]
}
# A Go duration such as 10m0s or 8h0m0s, the form Gitea expects.
is_valid_interval() {
[[ -n $1 && $1 =~ ^([0-9]+h)?([0-9]+m)?([0-9]+s)?$ ]]
}
normalize_url() {
local url="$1"
while [[ $url == */ ]]; do
url="${url%/}"
done
printf '%s' "$url"
}