Skip to content

Commit c53b098

Browse files
committed
fix(hosting): percent-encode spaces correctly in ClickHouse URL credentials
urlquery encodes spaces as plus signs, which URL userinfo decoding keeps literal. A shared urlencode helper rewrites them to %20 (a real plus already encodes as %2B), so passwords containing spaces now work.
1 parent 7302aa9 commit c53b098

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

hosting/k8s/helm/templates/_helpers.tpl

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,16 @@ http://{{ include "trigger-v4.fullname" . }}-s2:{{ .Values.s2.service.port }}/v1
408408
{{- end -}}
409409
{{- end }}
410410

411+
{{/*
412+
Percent-encode a string for the userinfo part of a URL. urlquery encodes
413+
spaces as `+` (query semantics), which userinfo decoding keeps literal; a
414+
real `+` becomes `%2B`, so any `+` left in the output is a space and can be
415+
rewritten to `%20`.
416+
*/}}
417+
{{- define "trigger-v4.urlencode" -}}
418+
{{- . | urlquery | replace "+" "%20" -}}
419+
{{- end }}
420+
411421
{{/*
412422
ClickHouse hostname
413423
*/}}
@@ -435,22 +445,21 @@ CLICKHOUSE_PASSWORD must contain only URL-userinfo-safe characters — the
435445
value is substituted verbatim, so `@ : / ? # [ ] %` break the URL. Use a
436446
hex-encoded password or percent-encode before storing in the Secret.
437447
438-
Inline credentials (auth.* and external.* values) are percent-encoded via
439-
urlquery, so special characters are safe there — except spaces, which
440-
urlquery encodes as `+` and userinfo decoding keeps literal.
448+
Inline credentials (auth.* and external.* values) are percent-encoded, so
449+
any special characters are safe there.
441450
*/}}
442451
{{- define "trigger-v4.clickhouse.url" -}}
443452
{{- if .Values.clickhouse.deploy -}}
444453
{{- $protocol := ternary "https" "http" .Values.clickhouse.secure -}}
445454
{{- $secure := ternary "true" "false" .Values.clickhouse.secure -}}
446-
{{ $protocol }}://{{ .Values.clickhouse.auth.username | urlquery }}:{{ .Values.clickhouse.auth.password | urlquery }}@{{ include "trigger-v4.clickhouse.hostname" . }}:{{ .Values.clickhouse.service.ports.http }}?secure={{ $secure }}
455+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.auth.username }}:{{ include "trigger-v4.urlencode" .Values.clickhouse.auth.password }}@{{ include "trigger-v4.clickhouse.hostname" . }}:{{ .Values.clickhouse.service.ports.http }}?secure={{ $secure }}
447456
{{- else if .Values.clickhouse.external.host -}}
448457
{{- $protocol := ternary "https" "http" .Values.clickhouse.external.secure -}}
449458
{{- $secure := ternary "true" "false" .Values.clickhouse.external.secure -}}
450459
{{- if .Values.clickhouse.external.existingSecret -}}
451-
{{ $protocol }}://{{ .Values.clickhouse.external.username | urlquery }}:$(CLICKHOUSE_PASSWORD)@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}?secure={{ $secure }}
460+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.external.username }}:$(CLICKHOUSE_PASSWORD)@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}?secure={{ $secure }}
452461
{{- else -}}
453-
{{ $protocol }}://{{ .Values.clickhouse.external.username | urlquery }}:{{ .Values.clickhouse.external.password | urlquery }}@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}?secure={{ $secure }}
462+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.external.username }}:{{ include "trigger-v4.urlencode" .Values.clickhouse.external.password }}@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}?secure={{ $secure }}
454463
{{- end -}}
455464
{{- end -}}
456465
{{- end }}
@@ -464,13 +473,13 @@ applies to the replication URL.
464473
{{- define "trigger-v4.clickhouse.replication.url" -}}
465474
{{- if .Values.clickhouse.deploy -}}
466475
{{- $protocol := ternary "https" "http" .Values.clickhouse.secure -}}
467-
{{ $protocol }}://{{ .Values.clickhouse.auth.username | urlquery }}:{{ .Values.clickhouse.auth.password | urlquery }}@{{ include "trigger-v4.clickhouse.hostname" . }}:{{ .Values.clickhouse.service.ports.http }}
476+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.auth.username }}:{{ include "trigger-v4.urlencode" .Values.clickhouse.auth.password }}@{{ include "trigger-v4.clickhouse.hostname" . }}:{{ .Values.clickhouse.service.ports.http }}
468477
{{- else if .Values.clickhouse.external.host -}}
469478
{{- $protocol := ternary "https" "http" .Values.clickhouse.external.secure -}}
470479
{{- if .Values.clickhouse.external.existingSecret -}}
471-
{{ $protocol }}://{{ .Values.clickhouse.external.username | urlquery }}:$(CLICKHOUSE_PASSWORD)@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}
480+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.external.username }}:$(CLICKHOUSE_PASSWORD)@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}
472481
{{- else -}}
473-
{{ $protocol }}://{{ .Values.clickhouse.external.username | urlquery }}:{{ .Values.clickhouse.external.password | urlquery }}@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}
482+
{{ $protocol }}://{{ include "trigger-v4.urlencode" .Values.clickhouse.external.username }}:{{ include "trigger-v4.urlencode" .Values.clickhouse.external.password }}@{{ .Values.clickhouse.external.host }}:{{ .Values.clickhouse.external.httpPort | default 8123 }}
474483
{{- end -}}
475484
{{- end -}}
476485
{{- end }}

0 commit comments

Comments
 (0)