mounts: say nothing an entry of sources holds when it cannot be read
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate pass: builds mounts → shanks; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate pass: builds mounts → shanks; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
A password typed into an entry by mistake, in another scheme or split by a space or a comma, was quoted back in the problem and so reached the status and the health answer. An entry is now named by its source's name or its position only; a user with a control character or a second @ is refused (review of mesh-catalog#190, issue 386).
This commit is contained in:
@@ -468,6 +468,10 @@ func TestAnSMBSourcesUserIsInItsEntryAndAPasswordThereIsRefusedUnsaid(t *testing
|
||||
"a user with a space, encoded": "e=smb://a%20" + testPassword + "@nas/Media@/mnt/e",
|
||||
"a bad percent escape": "e=smb://%zz" + testPassword + "@nas/Media@/mnt/e",
|
||||
"no mount point, with a password": "smb://root:" + testPassword + "@nas/Media",
|
||||
"another scheme, upper case": "e=SMB://root:" + testPassword + "@nas/Media@/mnt/e",
|
||||
"a cifs URL": "e=cifs://root:" + testPassword + "@nas/Media@/mnt/e",
|
||||
"two @ before the host": "e=smb://me@example@nas/Media@/mnt/e" + testPassword,
|
||||
"a control character in the user": "e=smb://me%07" + testPassword + "@nas/Media@/mnt/e",
|
||||
} {
|
||||
got, problems := ParseSources(entry)
|
||||
said := strings.Join(problems, " ")
|
||||
@@ -478,6 +482,30 @@ func TestAnSMBSourcesUserIsInItsEntryAndAPasswordThereIsRefusedUnsaid(t *testing
|
||||
if _, problems := ParseSources("e=smb://root:" + testPassword + "@nas/Media@/mnt/e"); !strings.Contains(problems[0], "smb-password-<source>") {
|
||||
t.Errorf("a password in the URL is said with where it goes: %q", problems)
|
||||
}
|
||||
// A password with a space or a comma splits the entry: neither half, nor a name that is not one, is said.
|
||||
const secret = "SECRETPW"
|
||||
for _, v := range []string{
|
||||
"e=smb://root:SEC RETPW@nas/Media@/mnt/e",
|
||||
"e=smb://root:SEC,RETPW@nas/Media@/mnt/e",
|
||||
"e=SMB://root:" + secret + "@nas/Media@/mnt/e",
|
||||
"e=cifs://root:" + secret + "@nas/Media@/mnt/e",
|
||||
"SECRET" + "PW=smb://nas/Media@/mnt/e",
|
||||
} {
|
||||
_, problems := ParseSources(v)
|
||||
said := strings.Join(problems, " ")
|
||||
if len(problems) == 0 || strings.Contains(said, "RETPW") || strings.Contains(said, "SEC") {
|
||||
t.Errorf("%q says %q", strings.ReplaceAll(v, "RETPW", "<pw>"), said)
|
||||
}
|
||||
// And nothing of it reaches the status or the health answer.
|
||||
f := newSystem(t)
|
||||
f.write(ConfigFile, "sources="+v+"\npasswords=/var/lib/mesh/mounts\nstate=/var/lib/mesh/mounts\n")
|
||||
now := time.Now()
|
||||
f.applier(now).Look(context.Background())
|
||||
raw, _ := json.Marshal(f.machine().Health(now))
|
||||
if strings.Contains(string(raw), "RETPW") || strings.Contains(f.everything("mounts.conf"), "RETPW") {
|
||||
t.Errorf("%q leaked into the status or the health: %s", strings.ReplaceAll(v, "RETPW", "<pw>"), raw)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTheHealthGivesAShareFiveMinutesAndAnAbsentSourceNone(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user