mirror of
https://github.com/dockur/windows.git
synced 2026-08-03 12:37:20 +01:00
feat: Validate local and domain account settings (#1899)
This commit is contained in:
+1
-1
@@ -1761,7 +1761,7 @@ prepareInstall() {
|
|||||||
local regUsername regPassword
|
local regUsername regPassword
|
||||||
|
|
||||||
validateLegacyUsername "$username" "$desc" || return 1
|
validateLegacyUsername "$username" "$desc" || return 1
|
||||||
validateLegacyPassword "$password" "$desc" || return 1
|
validatePassword "$password" "$desc" || return 1
|
||||||
|
|
||||||
sifHost=$(escapeSIFValue "$HOST") || return 1
|
sifHost=$(escapeSIFValue "$HOST") || return 1
|
||||||
sifUsername=$(escapeSIFValue "$username") || return 1
|
sifUsername=$(escapeSIFValue "$username") || return 1
|
||||||
|
|||||||
+128
-40
@@ -1021,12 +1021,133 @@ updateDomain() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validateLocalUsername() {
|
||||||
|
|
||||||
|
local value="$1"
|
||||||
|
|
||||||
|
[ -z "$value" ] && return 0
|
||||||
|
|
||||||
|
if [ "${#value}" -gt 20 ]; then
|
||||||
|
error "The USERNAME variable cannot contain more than 20 characters!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" =~ [[:cntrl:]] ]]; then
|
||||||
|
error "The USERNAME variable cannot contain control characters!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$value" in
|
||||||
|
*'"'* | *'/'* | *\\* | *'['* | *']'* | *':'* | *';'* | *'|'* | *'='* | *','* | *'+'* | *'*'* | *'?'* | *'<'* | *'>'* | *'%'* | *'@'* )
|
||||||
|
error "The USERNAME variable contains characters that are not supported by Windows local accounts!"
|
||||||
|
return 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ "$value" == *"." ]]; then
|
||||||
|
error "The USERNAME variable cannot end with a period!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" =~ ^[.[:space:]]+$ ]]; then
|
||||||
|
error "The USERNAME variable cannot consist only of spaces or periods!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${value^^}" in
|
||||||
|
"NONE" )
|
||||||
|
error "The USERNAME value \"NONE\" is reserved by Windows!"
|
||||||
|
return 1 ;;
|
||||||
|
"ADMINISTRATOR" | "GUEST" )
|
||||||
|
error "The USERNAME value \"$value\" is reserved for a built-in Windows account!"
|
||||||
|
return 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
validateDomainName() {
|
||||||
|
|
||||||
|
local value="$1"
|
||||||
|
local name="${2:-DOMAIN}"
|
||||||
|
|
||||||
|
if [ -z "$value" ]; then
|
||||||
|
error "The $name variable must contain a valid domain name!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#value}" -gt 255 ]; then
|
||||||
|
error "The $name variable cannot contain more than 255 characters!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" == *"://"* ]]; then
|
||||||
|
error "The $name variable must contain a domain name, not a URL!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" =~ [[:cntrl:]] ]] || [[ "$value" =~ [[:space:]] ]]; then
|
||||||
|
error "The $name variable cannot contain whitespace or control characters!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$value" in
|
||||||
|
*'/'* | *\\* | *'@'* | *':'* )
|
||||||
|
error "The $name variable does not contain a valid domain name!"
|
||||||
|
return 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
validateDomainUsername() {
|
||||||
|
|
||||||
|
local value="$1"
|
||||||
|
|
||||||
|
if [ -z "$value" ]; then
|
||||||
|
error "The USERNAME variable does not contain a valid domain account name!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#value}" -gt 256 ]; then
|
||||||
|
error "The USERNAME variable cannot contain more than 256 characters for a domain account!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" =~ [[:cntrl:]] ]]; then
|
||||||
|
error "The USERNAME variable cannot contain control characters!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$value" in
|
||||||
|
*'"'* | *'/'* | *\\* | *'['* | *']'* | *':'* | *';'* | *'|'* | *'='* | *','* | *'+'* | *'*'* | *'?'* | *'<'* | *'>'* | *'%'* | *'@'* )
|
||||||
|
error "The domain account name contains characters that are not supported by Windows unattended setup!"
|
||||||
|
return 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ "$value" == *"." ]]; then
|
||||||
|
error "The USERNAME variable cannot end with a period!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$value" =~ ^[.[:space:]]+$ ]]; then
|
||||||
|
error "The USERNAME variable cannot consist only of spaces or periods!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${value^^}" == "NONE" ]]; then
|
||||||
|
error "The USERNAME value \"NONE\" is reserved by Windows!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
updateXML() {
|
updateXML() {
|
||||||
|
|
||||||
local asset="$1"
|
local asset="$1"
|
||||||
local language="$2"
|
local language="$2"
|
||||||
local app value culture region keyboard edition key
|
local app value culture region keyboard edition key
|
||||||
local user raw_user user_xml auth_user safe_user
|
local user user_xml auth_user
|
||||||
local admin pass pw domain qualifier host
|
local admin pass pw domain qualifier host
|
||||||
|
|
||||||
[ -z "$WIDTH" ] && WIDTH="1280"
|
[ -z "$WIDTH" ] && WIDTH="1280"
|
||||||
@@ -1089,10 +1210,7 @@ updateXML() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$domain" == *"://"* ]]; then
|
validateDomainName "$domain" || return 1
|
||||||
error "The DOMAIN variable must contain a domain name, not a URL!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
auth_user="$USERNAME"
|
auth_user="$USERNAME"
|
||||||
qualifier=""
|
qualifier=""
|
||||||
@@ -1126,14 +1244,10 @@ updateXML() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "${user^^}" == "NONE" ]]; then
|
validateDomainUsername "$user" || return 1
|
||||||
error "The USERNAME value \"NONE\" is reserved by Windows!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$user" =~ ^[.[:space:]]+$ ]]; then
|
if [ -n "$qualifier" ]; then
|
||||||
error "The USERNAME variable cannot consist only of spaces or periods!"
|
validateDomainName "$qualifier" "USERNAME" || return 1
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${user,,}" == "docker" ]]; then
|
if [[ "${user,,}" == "docker" ]]; then
|
||||||
@@ -1146,36 +1260,10 @@ updateXML() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
safe_user=$(printf '%s' "$user" | tr -d '"/\\[]:;|=,+*?<>%@') || return 1
|
|
||||||
|
|
||||||
if [[ "$safe_user" != "$user" ]]; then
|
|
||||||
error "The domain account name contains characters that are not supported by Windows unattended setup!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
raw_user="$USERNAME"
|
user="$USERNAME"
|
||||||
user=$(printf '%s' "$raw_user" | tr -d '"/\\[]:;|=,+*?<>%@') || return 1
|
validateLocalUsername "$user" || return 1
|
||||||
|
|
||||||
if [[ "$user" != "$raw_user" ]]; then
|
|
||||||
warn "Unsupported characters were removed from the USERNAME value: \"$raw_user\" became \"$user\"."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$raw_user" ] && [ -z "$user" ]; then
|
|
||||||
error "The USERNAME variable does not contain a valid local account name!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${user^^}" == "NONE" ]]; then
|
|
||||||
error "The USERNAME value \"NONE\" is reserved by Windows!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$user" =~ ^[.[:space:]]+$ ]]; then
|
|
||||||
error "The USERNAME variable cannot consist only of spaces or periods!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$user" ]; then
|
if [ -n "$user" ]; then
|
||||||
user_xml=$(escapeXMLSed "$user") || return 1
|
user_xml=$(escapeXMLSed "$user") || return 1
|
||||||
|
|||||||
Reference in New Issue
Block a user