Artifact f5aa34dce5ccbc17067a2e6d90be71fbe420f0dda245ac2e6f7e894826a6971a:
- File
fossil_default_login_test.go
— part of check-in
[2237a3781a]
at
2026-10-25 21:08:25
on branch feat/carried-uuid-default-login
— fix: validate carried hashes and check FOSSIL_USER first
A carried file outside a sparse store's cone skips the held check, so any caller text of 40 bytes or more reached the F card verbatim, including a newline that writes a card of its own into the check-in. checkCarried now refuses a UUID that is not a lowercase SHA1 or SHA3-256 hash, which covers FileToCommit.UUID and the sparse checkout path alike (tracked in #486).
The default login follows fossil's db_create_default_users, which checks FOSSIL_USER before USER, LOGNAME and USERNAME (tracked in #487). (user: [email protected], size: 2317) [annotate] [blame] [check-ins using] [more...]
package libfossil import ( "path/filepath" "testing" ) func adminLogin(t *testing.T, r *Repo) string { t.Helper() var login string if err := r.DB().QueryRow("SELECT login FROM user WHERE uid=1").Scan(&login); err != nil { t.Fatalf("read seeded user: %v", err) } return login } // Create with no CreateOpts.User and no user in the environment must still // create a repository, seeding fossil's fallback login "root", not panic on // an empty login. func TestCreate_NoUserAnywhereSeedsRoot(t *testing.T) { for _, name := range []string{"FOSSIL_USER", "USER", "LOGNAME", "USERNAME"} { t.Setenv(name, "") } r, err := Create(filepath.Join(t.TempDir(), "r.fossil"), CreateOpts{}) if err != nil { t.Fatalf("Create: %v", err) } defer r.Close() if got := adminLogin(t, r); got != "root" { t.Errorf("seeded login = %q, want root", got) } } // The environment is consulted in fossil's order: FOSSIL_USER, then USER, // then LOGNAME, then USERNAME. func TestCreate_DefaultLoginEnvOrder(t *testing.T) { t.Setenv("FOSSIL_USER", "") t.Setenv("USER", "") t.Setenv("LOGNAME", "from-logname") t.Setenv("USERNAME", "from-username") r, err := Create(filepath.Join(t.TempDir(), "r.fossil"), CreateOpts{}) if err != nil { t.Fatalf("Create: %v", err) } defer r.Close() if got := adminLogin(t, r); got != "from-logname" { t.Errorf("seeded login = %q, want LOGNAME before USERNAME", got) } t.Setenv("USER", "from-user") r2, err := Create(filepath.Join(t.TempDir(), "r2.fossil"), CreateOpts{}) if err != nil { t.Fatalf("Create: %v", err) } defer r2.Close() if got := adminLogin(t, r2); got != "from-user" { t.Errorf("seeded login = %q, want USER before LOGNAME", got) } t.Setenv("FOSSIL_USER", "from-fossil-user") r4, err := Create(filepath.Join(t.TempDir(), "r4.fossil"), CreateOpts{}) if err != nil { t.Fatalf("Create: %v", err) } defer r4.Close() if got := adminLogin(t, r4); got != "from-fossil-user" { t.Errorf("seeded login = %q, want FOSSIL_USER first", got) } // An explicit user always wins. r3, err := Create(filepath.Join(t.TempDir(), "r3.fossil"), CreateOpts{User: "explicit"}) if err != nil { t.Fatalf("Create: %v", err) } defer r3.Close() if got := adminLogin(t, r3); got != "explicit" { t.Errorf("seeded login = %q, want the explicit user", got) } }